summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authorlulf <lulf@FreeBSD.org>2008-10-19 08:41:10 +0000
committerlulf <lulf@FreeBSD.org>2008-10-19 08:41:10 +0000
commitcf5320822f93810742e3d4a1ac8202db8482e633 (patch)
tree1f7a175cbd3543fa94c2b9bbe959edd73e4a8ad2 /usr.bin
parentf0bd6304a2f45313e77bf94ca25c84270c3d4c8d (diff)
downloadFreeBSD-src-cf5320822f93810742e3d4a1ac8202db8482e633.zip
FreeBSD-src-cf5320822f93810742e3d4a1ac8202db8482e633.tar.gz
- Import the HEAD csup code which is the basis for the cvsmode work.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/Makefile386
-rw-r--r--usr.bin/Makefile.inc8
-rw-r--r--usr.bin/alias/Makefile19
-rw-r--r--usr.bin/alias/generic.sh4
-rw-r--r--usr.bin/apply/Makefile7
-rw-r--r--usr.bin/apply/apply.1144
-rw-r--r--usr.bin/apply/apply.c267
-rw-r--r--usr.bin/ar/Makefile17
-rw-r--r--usr.bin/ar/acplex.l78
-rw-r--r--usr.bin/ar/acpyacc.y662
-rw-r--r--usr.bin/ar/ar.1406
-rw-r--r--usr.bin/ar/ar.c387
-rw-r--r--usr.bin/ar/ar.h125
-rw-r--r--usr.bin/ar/read.c204
-rw-r--r--usr.bin/ar/util.c86
-rw-r--r--usr.bin/ar/write.c879
-rw-r--r--usr.bin/asa/Makefile6
-rw-r--r--usr.bin/asa/asa.198
-rw-r--r--usr.bin/asa/asa.c141
-rw-r--r--usr.bin/at/LEGAL29
-rw-r--r--usr.bin/at/Makefile30
-rw-r--r--usr.bin/at/Makefile.inc19
-rw-r--r--usr.bin/at/at.c889
-rw-r--r--usr.bin/at/at.h31
-rw-r--r--usr.bin/at/at.man361
-rw-r--r--usr.bin/at/panic.c92
-rw-r--r--usr.bin/at/panic.h32
-rw-r--r--usr.bin/at/parsetime.c634
-rw-r--r--usr.bin/at/parsetime.h26
-rw-r--r--usr.bin/at/perm.c124
-rw-r--r--usr.bin/at/perm.h28
-rw-r--r--usr.bin/at/privs.h108
-rw-r--r--usr.bin/atm/Makefile5
-rw-r--r--usr.bin/atm/Makefile.inc3
-rw-r--r--usr.bin/atm/sscop/Makefile15
-rw-r--r--usr.bin/awk/Makefile34
-rw-r--r--usr.bin/awk/b.c.diff53
-rw-r--r--usr.bin/awk/main.c.diff69
-rw-r--r--usr.bin/awk/run.c.diff18
-rw-r--r--usr.bin/banner/Makefile7
-rw-r--r--usr.bin/banner/banner.682
-rw-r--r--usr.bin/banner/banner.c1185
-rw-r--r--usr.bin/basename/Makefile7
-rw-r--r--usr.bin/basename/basename.1116
-rw-r--r--usr.bin/basename/basename.c147
-rw-r--r--usr.bin/biff/Makefile6
-rw-r--r--usr.bin/biff/biff.1127
-rw-r--r--usr.bin/biff/biff.c117
-rw-r--r--usr.bin/bluetooth/Makefile10
-rw-r--r--usr.bin/bluetooth/Makefile.inc4
-rw-r--r--usr.bin/bluetooth/bthost/Makefile10
-rw-r--r--usr.bin/bluetooth/bthost/bthost.1115
-rw-r--r--usr.bin/bluetooth/bthost/bthost.c142
-rw-r--r--usr.bin/bluetooth/btsockstat/Makefile12
-rw-r--r--usr.bin/bluetooth/btsockstat/btsockstat.183
-rw-r--r--usr.bin/bluetooth/btsockstat/btsockstat.c645
-rw-r--r--usr.bin/bluetooth/rfcomm_sppd/Makefile11
-rw-r--r--usr.bin/bluetooth/rfcomm_sppd/rfcomm_sdp.c266
-rw-r--r--usr.bin/bluetooth/rfcomm_sppd/rfcomm_sppd.1186
-rw-r--r--usr.bin/bluetooth/rfcomm_sppd/rfcomm_sppd.c518
-rw-r--r--usr.bin/brandelf/Makefile5
-rw-r--r--usr.bin/brandelf/brandelf.1108
-rw-r--r--usr.bin/brandelf/brandelf.c210
-rw-r--r--usr.bin/bsdiff/Makefile5
-rw-r--r--usr.bin/bsdiff/Makefile.inc6
-rw-r--r--usr.bin/bsdiff/bsdiff/Makefile8
-rw-r--r--usr.bin/bsdiff/bsdiff/bsdiff.169
-rw-r--r--usr.bin/bsdiff/bsdiff/bsdiff.c407
-rw-r--r--usr.bin/bsdiff/bspatch/Makefile8
-rw-r--r--usr.bin/bsdiff/bspatch/bspatch.165
-rw-r--r--usr.bin/bsdiff/bspatch/bspatch.c207
-rw-r--r--usr.bin/bzip2/Makefile49
-rw-r--r--usr.bin/bzip2recover/Makefile9
-rw-r--r--usr.bin/c89/Makefile5
-rw-r--r--usr.bin/c89/c89.1184
-rw-r--r--usr.bin/c89/c89.c111
-rw-r--r--usr.bin/c99/Makefile5
-rw-r--r--usr.bin/c99/c99.1198
-rw-r--r--usr.bin/c99/c99.c133
-rw-r--r--usr.bin/calendar/Makefile30
-rw-r--r--usr.bin/calendar/calendar.1265
-rw-r--r--usr.bin/calendar/calendar.c154
-rw-r--r--usr.bin/calendar/calendar.h78
-rw-r--r--usr.bin/calendar/calendars/calendar.all20
-rw-r--r--usr.bin/calendar/calendars/calendar.australia58
-rw-r--r--usr.bin/calendar/calendars/calendar.birthday299
-rw-r--r--usr.bin/calendar/calendars/calendar.christian32
-rw-r--r--usr.bin/calendar/calendars/calendar.computer76
-rw-r--r--usr.bin/calendar/calendars/calendar.croatian12
-rw-r--r--usr.bin/calendar/calendars/calendar.dutch78
-rw-r--r--usr.bin/calendar/calendars/calendar.freebsd302
-rw-r--r--usr.bin/calendar/calendars/calendar.french12
-rw-r--r--usr.bin/calendar/calendars/calendar.german12
-rw-r--r--usr.bin/calendar/calendars/calendar.history476
-rw-r--r--usr.bin/calendar/calendars/calendar.holiday563
-rw-r--r--usr.bin/calendar/calendars/calendar.hungarian12
-rw-r--r--usr.bin/calendar/calendars/calendar.judaic227
-rw-r--r--usr.bin/calendar/calendars/calendar.lotr48
-rw-r--r--usr.bin/calendar/calendars/calendar.music240
-rw-r--r--usr.bin/calendar/calendars/calendar.newzealand25
-rw-r--r--usr.bin/calendar/calendars/calendar.russian12
-rw-r--r--usr.bin/calendar/calendars/calendar.southafrica23
-rw-r--r--usr.bin/calendar/calendars/calendar.ukrainian12
-rw-r--r--usr.bin/calendar/calendars/calendar.usholiday42
-rw-r--r--usr.bin/calendar/calendars/calendar.world19
-rw-r--r--usr.bin/calendar/calendars/de_AT.ISO_8859-15/calendar.feiertag62
-rw-r--r--usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.all17
-rw-r--r--usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.feiertag56
-rw-r--r--usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.geschichte198
-rw-r--r--usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.kirche32
-rw-r--r--usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.literatur54
-rw-r--r--usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.musik66
-rw-r--r--usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.wissenschaft19
-rw-r--r--usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.all14
-rw-r--r--usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.fetes630
-rw-r--r--usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.french12
-rw-r--r--usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.jferies46
-rw-r--r--usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.proverbes354
-rw-r--r--usr.bin/calendar/calendars/hr_HR.ISO8859-2/calendar.all12
-rw-r--r--usr.bin/calendar/calendars/hr_HR.ISO8859-2/calendar.praznici44
-rw-r--r--usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.all13
-rw-r--r--usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.nevnapok386
-rw-r--r--usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.unnepek53
-rw-r--r--usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.all17
-rw-r--r--usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.common90
-rw-r--r--usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.holiday25
-rw-r--r--usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.military27
-rw-r--r--usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.msk16
-rw-r--r--usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.orthodox34
-rw-r--r--usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.pagan42
-rw-r--r--usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.all14
-rw-r--r--usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.holiday22
-rw-r--r--usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.misc18
-rw-r--r--usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.orthodox35
-rw-r--r--usr.bin/calendar/day.c486
-rw-r--r--usr.bin/calendar/io.c517
-rw-r--r--usr.bin/calendar/ostern.c110
-rw-r--r--usr.bin/calendar/paskha.c91
-rw-r--r--usr.bin/calendar/pathnames.h40
-rw-r--r--usr.bin/cap_mkdb/Makefile6
-rw-r--r--usr.bin/cap_mkdb/cap_mkdb.1109
-rw-r--r--usr.bin/cap_mkdb/cap_mkdb.c272
-rw-r--r--usr.bin/catman/Makefile6
-rw-r--r--usr.bin/catman/catman.1109
-rw-r--r--usr.bin/catman/catman.c823
-rw-r--r--usr.bin/chat/Makefile9
-rw-r--r--usr.bin/chat/chat.8576
-rw-r--r--usr.bin/chat/chat.c1535
-rw-r--r--usr.bin/checknr/Makefile6
-rw-r--r--usr.bin/checknr/checknr.1167
-rw-r--r--usr.bin/checknr/checknr.c607
-rw-r--r--usr.bin/chkey/Makefile16
-rw-r--r--usr.bin/chkey/chkey.125
-rw-r--r--usr.bin/chkey/chkey.c269
-rw-r--r--usr.bin/chpass/Makefile49
-rw-r--r--usr.bin/chpass/chpass.1492
-rw-r--r--usr.bin/chpass/chpass.c302
-rw-r--r--usr.bin/chpass/chpass.h79
-rw-r--r--usr.bin/chpass/edit.c296
-rw-r--r--usr.bin/chpass/field.c261
-rw-r--r--usr.bin/chpass/table.c69
-rw-r--r--usr.bin/chpass/util.c182
-rw-r--r--usr.bin/cksum/Makefile9
-rw-r--r--usr.bin/cksum/cksum.1182
-rw-r--r--usr.bin/cksum/cksum.c140
-rw-r--r--usr.bin/cksum/crc.c147
-rw-r--r--usr.bin/cksum/crc32.c122
-rw-r--r--usr.bin/cksum/extern.h47
-rw-r--r--usr.bin/cksum/print.c75
-rw-r--r--usr.bin/cksum/sum1.c76
-rw-r--r--usr.bin/cksum/sum2.c78
-rw-r--r--usr.bin/cmp/Makefile7
-rw-r--r--usr.bin/cmp/cmp.1126
-rw-r--r--usr.bin/cmp/cmp.c196
-rw-r--r--usr.bin/cmp/extern.h49
-rw-r--r--usr.bin/cmp/link.c93
-rw-r--r--usr.bin/cmp/misc.c66
-rw-r--r--usr.bin/cmp/regular.c178
-rw-r--r--usr.bin/cmp/special.c109
-rw-r--r--usr.bin/col/Makefile6
-rw-r--r--usr.bin/col/README48
-rw-r--r--usr.bin/col/col.1156
-rw-r--r--usr.bin/col/col.c552
-rw-r--r--usr.bin/colcrt/Makefile6
-rw-r--r--usr.bin/colcrt/colcrt.1124
-rw-r--r--usr.bin/colcrt/colcrt.c287
-rw-r--r--usr.bin/colldef/Makefile11
-rw-r--r--usr.bin/colldef/colldef.1274
-rw-r--r--usr.bin/colldef/common.h11
-rw-r--r--usr.bin/colldef/parse.y384
-rw-r--r--usr.bin/colldef/scan.l287
-rw-r--r--usr.bin/colrm/Makefile6
-rw-r--r--usr.bin/colrm/colrm.191
-rw-r--r--usr.bin/colrm/colrm.c146
-rw-r--r--usr.bin/column/Makefile6
-rw-r--r--usr.bin/column/column.1105
-rw-r--r--usr.bin/column/column.c338
-rw-r--r--usr.bin/comm/Makefile6
-rw-r--r--usr.bin/comm/comm.1124
-rw-r--r--usr.bin/comm/comm.c288
-rw-r--r--usr.bin/compile_et/Makefile9
-rw-r--r--usr.bin/compress/Makefile13
-rw-r--r--usr.bin/compress/compress.1257
-rw-r--r--usr.bin/compress/compress.c440
-rw-r--r--usr.bin/compress/doc/NOTES142
-rw-r--r--usr.bin/compress/doc/README284
-rw-r--r--usr.bin/compress/doc/revision.log118
-rw-r--r--usr.bin/compress/zopen.3141
-rw-r--r--usr.bin/compress/zopen.c731
-rw-r--r--usr.bin/compress/zopen.h34
-rw-r--r--usr.bin/cpio/Makefile24
-rw-r--r--usr.bin/cpio/bsdcpio.1367
-rw-r--r--usr.bin/cpio/cmdline.c257
-rw-r--r--usr.bin/cpio/config_freebsd.h108
-rw-r--r--usr.bin/cpio/cpio.c1042
-rw-r--r--usr.bin/cpio/cpio.h111
-rw-r--r--usr.bin/cpio/cpio_platform.h84
-rw-r--r--usr.bin/cpio/err.c73
-rw-r--r--usr.bin/cpio/matching.c259
-rw-r--r--usr.bin/cpio/matching.h40
-rw-r--r--usr.bin/cpio/pathmatch.c250
-rw-r--r--usr.bin/cpio/pathmatch.h37
-rw-r--r--usr.bin/cpio/test/Makefile70
-rw-r--r--usr.bin/cpio/test/main.c1015
-rw-r--r--usr.bin/cpio/test/test.h150
-rw-r--r--usr.bin/cpio/test/test_0.c62
-rw-r--r--usr.bin/cpio/test/test_basic.c227
-rw-r--r--usr.bin/cpio/test/test_format_newc.c260
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat.c129
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat_ref.bin.uu16
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat_ref.crc.uu27
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat_ref.newc.uu27
-rw-r--r--usr.bin/cpio/test/test_gcpio_compat_ref.ustar.uu84
-rw-r--r--usr.bin/cpio/test/test_option_B.c54
-rw-r--r--usr.bin/cpio/test/test_option_L.c84
-rw-r--r--usr.bin/cpio/test/test_option_a.c159
-rw-r--r--usr.bin/cpio/test/test_option_c.c198
-rw-r--r--usr.bin/cpio/test/test_option_d.c68
-rw-r--r--usr.bin/cpio/test/test_option_ell.c66
-rw-r--r--usr.bin/cpio/test/test_option_f.c66
-rw-r--r--usr.bin/cpio/test/test_option_f.cpio.uu16
-rw-r--r--usr.bin/cpio/test/test_option_help.c81
-rw-r--r--usr.bin/cpio/test/test_option_m.c70
-rw-r--r--usr.bin/cpio/test/test_option_m.cpio.uu16
-rw-r--r--usr.bin/cpio/test/test_option_t.c47
-rw-r--r--usr.bin/cpio/test/test_option_t.cpio.uu16
-rw-r--r--usr.bin/cpio/test/test_option_t.stdout.uu5
-rw-r--r--usr.bin/cpio/test/test_option_tv.stdout.uu5
-rw-r--r--usr.bin/cpio/test/test_option_u.c84
-rw-r--r--usr.bin/cpio/test/test_option_version.c105
-rw-r--r--usr.bin/cpio/test/test_option_y.c52
-rw-r--r--usr.bin/cpio/test/test_option_z.c52
-rw-r--r--usr.bin/cpio/test/test_owner_parse.c68
-rw-r--r--usr.bin/cpio/test/test_passthrough_dotdot.c89
-rw-r--r--usr.bin/cpio/test/test_passthrough_reverse.c104
-rw-r--r--usr.bin/cpio/test/test_pathmatch.c165
-rw-r--r--usr.bin/cpuset/Makefile6
-rw-r--r--usr.bin/cpuset/cpuset.1175
-rw-r--r--usr.bin/cpuset/cpuset.c332
-rw-r--r--usr.bin/csplit/Makefile5
-rw-r--r--usr.bin/csplit/csplit.1157
-rw-r--r--usr.bin/csplit/csplit.c467
-rw-r--r--usr.bin/csup/Makefile36
-rw-r--r--usr.bin/ctags/C.c536
-rw-r--r--usr.bin/ctags/Makefile8
-rw-r--r--usr.bin/ctags/ctags.1255
-rw-r--r--usr.bin/ctags/ctags.c326
-rw-r--r--usr.bin/ctags/ctags.h100
-rw-r--r--usr.bin/ctags/fortran.c172
-rw-r--r--usr.bin/ctags/lisp.c110
-rw-r--r--usr.bin/ctags/print.c117
-rw-r--r--usr.bin/ctags/test/ctags.test67
-rw-r--r--usr.bin/ctags/tree.c137
-rw-r--r--usr.bin/ctags/yacc.c155
-rw-r--r--usr.bin/cut/Makefile6
-rw-r--r--usr.bin/cut/cut.1164
-rw-r--r--usr.bin/cut/cut.c461
-rw-r--r--usr.bin/dig/Makefile21
-rw-r--r--usr.bin/dirname/Makefile7
-rw-r--r--usr.bin/dirname/dirname.c84
-rw-r--r--usr.bin/du/Makefile9
-rw-r--r--usr.bin/du/du.1158
-rw-r--r--usr.bin/du/du.c499
-rw-r--r--usr.bin/ee/Artistic117
-rw-r--r--usr.bin/ee/FREEBSD-upgrade28
-rw-r--r--usr.bin/ee/Makefile27
-rw-r--r--usr.bin/ee/README116
-rw-r--r--usr.bin/ee/ee.1623
-rw-r--r--usr.bin/ee/ee.c5313
-rw-r--r--usr.bin/ee/ee.i18n.guide158
-rw-r--r--usr.bin/ee/new_curse.c3728
-rw-r--r--usr.bin/ee/new_curse.h261
-rw-r--r--usr.bin/ee/nls/de_DE.ISO8859-1/ee.msg185
-rw-r--r--usr.bin/ee/nls/en_US.US-ASCII/ee.msg185
-rw-r--r--usr.bin/ee/nls/fr_FR.ISO8859-1/ee.msg185
-rw-r--r--usr.bin/ee/nls/pl_PL.ISO8859-2/ee.msg185
-rw-r--r--usr.bin/ee/nls/ru_RU.KOI8-R/ee.msg187
-rw-r--r--usr.bin/ee/nls/uk_UA.KOI8-U/ee.msg185
-rw-r--r--usr.bin/elf2aout/Makefile8
-rw-r--r--usr.bin/elf2aout/elf2aout.c159
-rw-r--r--usr.bin/elfdump/Makefile6
-rw-r--r--usr.bin/elfdump/elfdump.1112
-rw-r--r--usr.bin/elfdump/elfdump.c1110
-rw-r--r--usr.bin/enigma/Makefile11
-rw-r--r--usr.bin/enigma/enigma.1132
-rw-r--r--usr.bin/enigma/enigma.c147
-rw-r--r--usr.bin/env/Makefile8
-rw-r--r--usr.bin/env/env.1486
-rw-r--r--usr.bin/env/env.c148
-rw-r--r--usr.bin/env/envopts.c468
-rw-r--r--usr.bin/env/envopts.h37
-rw-r--r--usr.bin/expand/Makefile7
-rw-r--r--usr.bin/expand/expand.1118
-rw-r--r--usr.bin/expand/expand.c200
-rw-r--r--usr.bin/false/Makefile6
-rw-r--r--usr.bin/false/false.167
-rw-r--r--usr.bin/false/false.c50
-rw-r--r--usr.bin/fetch/Makefile15
-rw-r--r--usr.bin/fetch/fetch.1283
-rw-r--r--usr.bin/fetch/fetch.c985
-rw-r--r--usr.bin/file/Makefile48
-rw-r--r--usr.bin/file/config.h240
-rw-r--r--usr.bin/file2c/Makefile5
-rw-r--r--usr.bin/file2c/file2c.175
-rw-r--r--usr.bin/file2c/file2c.c92
-rw-r--r--usr.bin/find/Makefile11
-rw-r--r--usr.bin/find/extern.h124
-rw-r--r--usr.bin/find/find.11075
-rw-r--r--usr.bin/find/find.c238
-rw-r--r--usr.bin/find/find.h149
-rw-r--r--usr.bin/find/function.c1696
-rw-r--r--usr.bin/find/getdate.y970
-rw-r--r--usr.bin/find/ls.c124
-rw-r--r--usr.bin/find/main.c170
-rw-r--r--usr.bin/find/misc.c109
-rw-r--r--usr.bin/find/operator.c277
-rw-r--r--usr.bin/find/option.c201
-rw-r--r--usr.bin/finger/Makefile8
-rw-r--r--usr.bin/finger/extern.h65
-rw-r--r--usr.bin/finger/finger.1250
-rw-r--r--usr.bin/finger/finger.c407
-rw-r--r--usr.bin/finger/finger.conf.591
-rw-r--r--usr.bin/finger/finger.h76
-rw-r--r--usr.bin/finger/lprint.c367
-rw-r--r--usr.bin/finger/net.c240
-rw-r--r--usr.bin/finger/pathnames.h41
-rw-r--r--usr.bin/finger/sprint.c187
-rw-r--r--usr.bin/finger/util.c429
-rw-r--r--usr.bin/fmt/Makefile6
-rw-r--r--usr.bin/fmt/fmt.1196
-rw-r--r--usr.bin/fmt/fmt.c670
-rw-r--r--usr.bin/fold/Makefile6
-rw-r--r--usr.bin/fold/fold.194
-rw-r--r--usr.bin/fold/fold.c223
-rw-r--r--usr.bin/from/Makefile6
-rw-r--r--usr.bin/from/from.1100
-rw-r--r--usr.bin/from/from.c173
-rw-r--r--usr.bin/fstat/Makefile25
-rw-r--r--usr.bin/fstat/cd9660.c79
-rw-r--r--usr.bin/fstat/fstat.1236
-rw-r--r--usr.bin/fstat/fstat.c1019
-rw-r--r--usr.bin/fstat/fstat.h80
-rw-r--r--usr.bin/fstat/msdosfs.c150
-rw-r--r--usr.bin/fstat/zfs.c134
-rw-r--r--usr.bin/fstat/zfs/Makefile22
-rw-r--r--usr.bin/fsync/Makefile6
-rw-r--r--usr.bin/fsync/fsync.163
-rw-r--r--usr.bin/fsync/fsync.c80
-rw-r--r--usr.bin/ftp/Makefile31
-rw-r--r--usr.bin/ftp/config.h285
-rw-r--r--usr.bin/gcore/Makefile7
-rw-r--r--usr.bin/gcore/elfcore.c535
-rw-r--r--usr.bin/gcore/extern.h40
-rw-r--r--usr.bin/gcore/gcore.1103
-rw-r--r--usr.bin/gcore/gcore.c180
-rw-r--r--usr.bin/gencat/Makefile6
-rw-r--r--usr.bin/gencat/gencat.1192
-rw-r--r--usr.bin/gencat/gencat.c784
-rw-r--r--usr.bin/getconf/Makefile37
-rw-r--r--usr.bin/getconf/confstr.gperf70
-rw-r--r--usr.bin/getconf/fake-gperf.awk66
-rw-r--r--usr.bin/getconf/getconf.1207
-rw-r--r--usr.bin/getconf/getconf.c190
-rw-r--r--usr.bin/getconf/getconf.h43
-rw-r--r--usr.bin/getconf/limits.gperf118
-rw-r--r--usr.bin/getconf/pathconf.gperf62
-rw-r--r--usr.bin/getconf/progenv.gperf67
-rw-r--r--usr.bin/getconf/sysconf.gperf149
-rw-r--r--usr.bin/getent/Makefile6
-rw-r--r--usr.bin/getent/getent.1132
-rw-r--r--usr.bin/getent/getent.c564
-rw-r--r--usr.bin/getopt/Makefile6
-rw-r--r--usr.bin/getopt/getopt.1136
-rw-r--r--usr.bin/getopt/getopt.c37
-rw-r--r--usr.bin/gprof/Makefile10
-rw-r--r--usr.bin/gprof/PSD.doc/abstract.me66
-rw-r--r--usr.bin/gprof/PSD.doc/gathering.me231
-rw-r--r--usr.bin/gprof/PSD.doc/header.me38
-rw-r--r--usr.bin/gprof/PSD.doc/intro.me81
-rw-r--r--usr.bin/gprof/PSD.doc/postp.me190
-rw-r--r--usr.bin/gprof/PSD.doc/postp1.pic54
-rw-r--r--usr.bin/gprof/PSD.doc/postp2.pic56
-rw-r--r--usr.bin/gprof/PSD.doc/postp3.pic51
-rw-r--r--usr.bin/gprof/PSD.doc/pres1.pic56
-rw-r--r--usr.bin/gprof/PSD.doc/pres2.pic52
-rw-r--r--usr.bin/gprof/PSD.doc/present.me306
-rw-r--r--usr.bin/gprof/PSD.doc/profiling.me115
-rw-r--r--usr.bin/gprof/PSD.doc/refs.me63
-rw-r--r--usr.bin/gprof/amd64.h44
-rw-r--r--usr.bin/gprof/aout.c233
-rw-r--r--usr.bin/gprof/arcs.c965
-rw-r--r--usr.bin/gprof/arm.h44
-rw-r--r--usr.bin/gprof/dfn.c332
-rw-r--r--usr.bin/gprof/elf.c148
-rw-r--r--usr.bin/gprof/gprof.1335
-rw-r--r--usr.bin/gprof/gprof.c610
-rw-r--r--usr.bin/gprof/gprof.callg108
-rw-r--r--usr.bin/gprof/gprof.flat32
-rw-r--r--usr.bin/gprof/gprof.h343
-rw-r--r--usr.bin/gprof/hertz.c65
-rw-r--r--usr.bin/gprof/i386.h44
-rw-r--r--usr.bin/gprof/ia64.h44
-rw-r--r--usr.bin/gprof/kernel.c64
-rw-r--r--usr.bin/gprof/lookup.c120
-rw-r--r--usr.bin/gprof/mips.h46
-rw-r--r--usr.bin/gprof/pathnames.h39
-rw-r--r--usr.bin/gprof/powerpc.h44
-rw-r--r--usr.bin/gprof/printgprof.c760
-rw-r--r--usr.bin/gprof/printlist.c98
-rw-r--r--usr.bin/gprof/sparc64.h44
-rw-r--r--usr.bin/gzip/Makefile32
-rw-r--r--usr.bin/gzip/gzexe179
-rw-r--r--usr.bin/gzip/gzexe.173
-rw-r--r--usr.bin/gzip/gzip.1223
-rw-r--r--usr.bin/gzip/gzip.c2060
-rw-r--r--usr.bin/gzip/unbzip2.c121
-rw-r--r--usr.bin/gzip/zdiff111
-rw-r--r--usr.bin/gzip/zdiff.1109
-rw-r--r--usr.bin/gzip/zforce55
-rw-r--r--usr.bin/gzip/zforce.153
-rw-r--r--usr.bin/gzip/zmore75
-rw-r--r--usr.bin/gzip/zmore.194
-rw-r--r--usr.bin/gzip/znew137
-rw-r--r--usr.bin/gzip/znew.171
-rw-r--r--usr.bin/gzip/zuncompress.c390
-rw-r--r--usr.bin/head/Makefile7
-rw-r--r--usr.bin/head/head.169
-rw-r--r--usr.bin/head/head.c186
-rw-r--r--usr.bin/hesinfo/Makefile5
-rw-r--r--usr.bin/hesinfo/hesinfo.1198
-rw-r--r--usr.bin/hesinfo/hesinfo.c108
-rw-r--r--usr.bin/hexdump/Makefile12
-rw-r--r--usr.bin/hexdump/conv.c182
-rw-r--r--usr.bin/hexdump/display.c399
-rw-r--r--usr.bin/hexdump/hexdump.1351
-rw-r--r--usr.bin/hexdump/hexdump.c86
-rw-r--r--usr.bin/hexdump/hexdump.h108
-rw-r--r--usr.bin/hexdump/hexsyntax.c144
-rw-r--r--usr.bin/hexdump/od.1268
-rw-r--r--usr.bin/hexdump/odsyntax.c442
-rw-r--r--usr.bin/hexdump/parse.c515
-rw-r--r--usr.bin/host/Makefile21
-rw-r--r--usr.bin/id/Makefile18
-rw-r--r--usr.bin/id/groups.163
-rw-r--r--usr.bin/id/id.1162
-rw-r--r--usr.bin/id/id.c477
-rw-r--r--usr.bin/id/whoami.160
-rw-r--r--usr.bin/indent/Makefile6
-rw-r--r--usr.bin/indent/README100
-rw-r--r--usr.bin/indent/args.c326
-rw-r--r--usr.bin/indent/indent.1539
-rw-r--r--usr.bin/indent/indent.c1234
-rw-r--r--usr.bin/indent/indent.h47
-rw-r--r--usr.bin/indent/indent_codes.h70
-rw-r--r--usr.bin/indent/indent_globs.h327
-rw-r--r--usr.bin/indent/io.c667
-rw-r--r--usr.bin/indent/lexi.c595
-rw-r--r--usr.bin/indent/parse.c332
-rw-r--r--usr.bin/indent/pr_comment.c429
-rw-r--r--usr.bin/ipcrm/Makefile10
-rw-r--r--usr.bin/ipcrm/ipcrm.1119
-rw-r--r--usr.bin/ipcrm/ipcrm.c304
-rw-r--r--usr.bin/ipcs/Makefile8
-rw-r--r--usr.bin/ipcs/ipc.c207
-rw-r--r--usr.bin/ipcs/ipc.h71
-rw-r--r--usr.bin/ipcs/ipcs.1176
-rw-r--r--usr.bin/ipcs/ipcs.c571
-rw-r--r--usr.bin/join/Makefile5
-rw-r--r--usr.bin/join/join.1229
-rw-r--r--usr.bin/join/join.c669
-rw-r--r--usr.bin/jot/Makefile6
-rw-r--r--usr.bin/jot/jot.1250
-rw-r--r--usr.bin/jot/jot.c490
-rw-r--r--usr.bin/kdump/Makefile18
-rw-r--r--usr.bin/kdump/kdump.1182
-rw-r--r--usr.bin/kdump/kdump.c1364
-rw-r--r--usr.bin/kdump/kdump_subr.h47
-rw-r--r--usr.bin/kdump/mkioctls89
-rw-r--r--usr.bin/kdump/mksubr445
-rw-r--r--usr.bin/keylogin/Makefile8
-rw-r--r--usr.bin/keylogin/keylogin.130
-rw-r--r--usr.bin/keylogin/keylogin.c83
-rw-r--r--usr.bin/keylogout/Makefile5
-rw-r--r--usr.bin/keylogout/keylogout.142
-rw-r--r--usr.bin/keylogout/keylogout.c71
-rw-r--r--usr.bin/killall/Makefile5
-rw-r--r--usr.bin/killall/killall.1161
-rw-r--r--usr.bin/killall/killall.c422
-rw-r--r--usr.bin/ktrace/Makefile8
-rw-r--r--usr.bin/ktrace/ktrace.1181
-rw-r--r--usr.bin/ktrace/ktrace.c208
-rw-r--r--usr.bin/ktrace/ktrace.h44
-rw-r--r--usr.bin/ktrace/subr.c124
-rw-r--r--usr.bin/ktrdump/Makefile8
-rw-r--r--usr.bin/ktrdump/ktrdump.890
-rw-r--r--usr.bin/ktrdump/ktrdump.c298
-rw-r--r--usr.bin/lam/Makefile6
-rw-r--r--usr.bin/lam/lam.1146
-rw-r--r--usr.bin/lam/lam.c230
-rw-r--r--usr.bin/last/Makefile6
-rw-r--r--usr.bin/last/last.1219
-rw-r--r--usr.bin/last/last.c576
-rw-r--r--usr.bin/lastcomm/Makefile8
-rw-r--r--usr.bin/lastcomm/lastcomm.1178
-rw-r--r--usr.bin/lastcomm/lastcomm.c262
-rw-r--r--usr.bin/lastcomm/pathnames.h38
-rw-r--r--usr.bin/lastcomm/readrec.c231
-rw-r--r--usr.bin/ldd/Makefile10
-rw-r--r--usr.bin/ldd/extern.h30
-rw-r--r--usr.bin/ldd/ldd.180
-rw-r--r--usr.bin/ldd/ldd.c389
-rw-r--r--usr.bin/ldd/sods.c550
-rw-r--r--usr.bin/leave/Makefile6
-rw-r--r--usr.bin/leave/leave.1100
-rw-r--r--usr.bin/leave/leave.c196
-rw-r--r--usr.bin/less/Makefile18
-rw-r--r--usr.bin/less/Makefile.common11
-rw-r--r--usr.bin/less/defines.h422
-rw-r--r--usr.bin/less/lesspipe.sh16
-rw-r--r--usr.bin/less/zless.sh7
-rw-r--r--usr.bin/lessecho/Makefile8
-rw-r--r--usr.bin/lesskey/Makefile8
-rw-r--r--usr.bin/lex/COPYING38
-rw-r--r--usr.bin/lex/FlexLexer.h186
-rw-r--r--usr.bin/lex/Makefile48
-rw-r--r--usr.bin/lex/NEWS1233
-rw-r--r--usr.bin/lex/README60
-rw-r--r--usr.bin/lex/ccl.c151
-rw-r--r--usr.bin/lex/config.h26
-rw-r--r--usr.bin/lex/dfa.c1097
-rw-r--r--usr.bin/lex/ecs.c227
-rw-r--r--usr.bin/lex/flex.skl1550
-rw-r--r--usr.bin/lex/flexdef.h1049
-rw-r--r--usr.bin/lex/gen.c1629
-rw-r--r--usr.bin/lex/initscan.c3704
-rw-r--r--usr.bin/lex/lex.14068
-rw-r--r--usr.bin/lex/lib/Makefile20
-rw-r--r--usr.bin/lex/lib/libmain.c16
-rw-r--r--usr.bin/lex/lib/libyywrap.c9
-rw-r--r--usr.bin/lex/main.c1179
-rw-r--r--usr.bin/lex/misc.c888
-rwxr-xr-xusr.bin/lex/mkskel.sh16
-rw-r--r--usr.bin/lex/nfa.c711
-rw-r--r--usr.bin/lex/parse.y914
-rw-r--r--usr.bin/lex/scan.l711
-rw-r--r--usr.bin/lex/sym.c264
-rw-r--r--usr.bin/lex/tblcmp.c889
-rw-r--r--usr.bin/lex/version.h3
-rw-r--r--usr.bin/lex/yylex.c218
-rw-r--r--usr.bin/limits/Makefile8
-rw-r--r--usr.bin/limits/limits.1404
-rw-r--r--usr.bin/limits/limits.c669
-rw-r--r--usr.bin/locale/Makefile7
-rw-r--r--usr.bin/locale/locale.197
-rw-r--r--usr.bin/locale/locale.c658
-rw-r--r--usr.bin/locate/Makefile7
-rw-r--r--usr.bin/locate/Makefile.inc3
-rw-r--r--usr.bin/locate/bigram/Makefile9
-rw-r--r--usr.bin/locate/bigram/locate.bigram.c110
-rw-r--r--usr.bin/locate/code/Makefile9
-rw-r--r--usr.bin/locate/code/locate.code.c279
-rw-r--r--usr.bin/locate/locate/Makefile21
-rw-r--r--usr.bin/locate/locate/concatdb.sh70
-rw-r--r--usr.bin/locate/locate/fastfind.c330
-rw-r--r--usr.bin/locate/locate/locate.1276
-rw-r--r--usr.bin/locate/locate/locate.c364
-rw-r--r--usr.bin/locate/locate/locate.h72
-rw-r--r--usr.bin/locate/locate/locate.rc30
-rw-r--r--usr.bin/locate/locate/locate.updatedb.875
-rw-r--r--usr.bin/locate/locate/mklocatedb.sh92
-rw-r--r--usr.bin/locate/locate/pathnames.h36
-rw-r--r--usr.bin/locate/locate/updatedb.sh95
-rw-r--r--usr.bin/locate/locate/util.c278
-rw-r--r--usr.bin/lock/Makefile10
-rw-r--r--usr.bin/lock/lock.185
-rw-r--r--usr.bin/lock/lock.c287
-rw-r--r--usr.bin/lockf/Makefile5
-rw-r--r--usr.bin/lockf/lockf.1156
-rw-r--r--usr.bin/lockf/lockf.c237
-rw-r--r--usr.bin/logger/Makefile13
-rw-r--r--usr.bin/logger/logger.1132
-rw-r--r--usr.bin/logger/logger.c294
-rw-r--r--usr.bin/login/Makefile25
-rw-r--r--usr.bin/login/README12
-rw-r--r--usr.bin/login/login.1170
-rw-r--r--usr.bin/login/login.c979
-rw-r--r--usr.bin/login/login.h37
-rw-r--r--usr.bin/login/login_audit.c204
-rw-r--r--usr.bin/login/login_fbtab.c151
-rw-r--r--usr.bin/login/pathnames.h42
-rw-r--r--usr.bin/logins/Makefile6
-rw-r--r--usr.bin/logins/logins.1104
-rw-r--r--usr.bin/logins/logins.c408
-rw-r--r--usr.bin/logname/Makefile7
-rw-r--r--usr.bin/logname/logname.175
-rw-r--r--usr.bin/logname/logname.c71
-rw-r--r--usr.bin/look/Makefile5
-rw-r--r--usr.bin/look/look.1124
-rw-r--r--usr.bin/look/look.c348
-rw-r--r--usr.bin/look/pathnames.h36
-rw-r--r--usr.bin/lorder/Makefile7
-rw-r--r--usr.bin/lorder/lorder.191
-rw-r--r--usr.bin/lorder/lorder.sh94
-rw-r--r--usr.bin/lsvfs/Makefile6
-rw-r--r--usr.bin/lsvfs/lsvfs.152
-rw-r--r--usr.bin/lsvfs/lsvfs.c114
-rw-r--r--usr.bin/m4/Makefile12
-rw-r--r--usr.bin/m4/NOTES64
-rw-r--r--usr.bin/m4/TEST/ack.m442
-rw-r--r--usr.bin/m4/TEST/hanoi.m447
-rw-r--r--usr.bin/m4/TEST/hash.m457
-rw-r--r--usr.bin/m4/TEST/math.m4181
-rw-r--r--usr.bin/m4/TEST/sqroot.m447
-rw-r--r--usr.bin/m4/TEST/string.m447
-rw-r--r--usr.bin/m4/TEST/test.m4245
-rw-r--r--usr.bin/m4/eval.c1063
-rw-r--r--usr.bin/m4/expr.c645
-rw-r--r--usr.bin/m4/extern.h174
-rw-r--r--usr.bin/m4/gnum4.c520
-rw-r--r--usr.bin/m4/look.c150
-rw-r--r--usr.bin/m4/m4.1421
-rw-r--r--usr.bin/m4/main.c661
-rw-r--r--usr.bin/m4/mdef.h223
-rw-r--r--usr.bin/m4/misc.c367
-rw-r--r--usr.bin/m4/pathnames.h62
-rw-r--r--usr.bin/m4/stdd.h60
-rw-r--r--usr.bin/m4/trace.c264
-rw-r--r--usr.bin/mail/Makefile20
-rw-r--r--usr.bin/mail/USD.doc/mail0.nr72
-rw-r--r--usr.bin/mail/USD.doc/mail1.nr92
-rw-r--r--usr.bin/mail/USD.doc/mail2.nr617
-rw-r--r--usr.bin/mail/USD.doc/mail3.nr133
-rw-r--r--usr.bin/mail/USD.doc/mail4.nr437
-rw-r--r--usr.bin/mail/USD.doc/mail5.nr1042
-rw-r--r--usr.bin/mail/USD.doc/mail6.nr125
-rw-r--r--usr.bin/mail/USD.doc/mail7.nr107
-rw-r--r--usr.bin/mail/USD.doc/mail8.nr75
-rw-r--r--usr.bin/mail/USD.doc/mail9.nr203
-rw-r--r--usr.bin/mail/USD.doc/maila.nr33
-rw-r--r--usr.bin/mail/aux.c632
-rw-r--r--usr.bin/mail/cmd1.c485
-rw-r--r--usr.bin/mail/cmd2.c534
-rw-r--r--usr.bin/mail/cmd3.c741
-rw-r--r--usr.bin/mail/cmdtab.c125
-rw-r--r--usr.bin/mail/collect.c753
-rw-r--r--usr.bin/mail/def.h278
-rw-r--r--usr.bin/mail/edit.c225
-rw-r--r--usr.bin/mail/extern.h256
-rw-r--r--usr.bin/mail/fio.c473
-rw-r--r--usr.bin/mail/getname.c75
-rw-r--r--usr.bin/mail/glob.h102
-rw-r--r--usr.bin/mail/head.c289
-rw-r--r--usr.bin/mail/lex.c718
-rw-r--r--usr.bin/mail/list.c841
-rw-r--r--usr.bin/mail/mail.11284
-rw-r--r--usr.bin/mail/main.c354
-rw-r--r--usr.bin/mail/misc/mail.help23
-rw-r--r--usr.bin/mail/misc/mail.rc2
-rw-r--r--usr.bin/mail/misc/mail.tildehelp36
-rw-r--r--usr.bin/mail/names.c791
-rw-r--r--usr.bin/mail/pathnames.h42
-rw-r--r--usr.bin/mail/popen.c400
-rw-r--r--usr.bin/mail/quit.c499
-rw-r--r--usr.bin/mail/rcv.h46
-rw-r--r--usr.bin/mail/send.c612
-rw-r--r--usr.bin/mail/strings.c129
-rw-r--r--usr.bin/mail/temp.c92
-rw-r--r--usr.bin/mail/tty.c300
-rw-r--r--usr.bin/mail/v7.local.c99
-rw-r--r--usr.bin/mail/vars.c194
-rw-r--r--usr.bin/mail/version.c46
-rw-r--r--usr.bin/make/GNode.h224
-rw-r--r--usr.bin/make/Makefile110
-rw-r--r--usr.bin/make/Makefile.dist10
-rw-r--r--usr.bin/make/PSD.doc/stubs9
-rw-r--r--usr.bin/make/PSD.doc/tutorial.ms3747
-rw-r--r--usr.bin/make/arch.c1228
-rw-r--r--usr.bin/make/arch.h61
-rw-r--r--usr.bin/make/buf.c291
-rw-r--r--usr.bin/make/buf.h92
-rw-r--r--usr.bin/make/cond.c1221
-rw-r--r--usr.bin/make/cond.h73
-rw-r--r--usr.bin/make/config.h111
-rw-r--r--usr.bin/make/dir.c1154
-rw-r--r--usr.bin/make/dir.h71
-rw-r--r--usr.bin/make/for.c269
-rw-r--r--usr.bin/make/for.h50
-rw-r--r--usr.bin/make/globals.h115
-rw-r--r--usr.bin/make/hash.c398
-rw-r--r--usr.bin/make/hash.h103
-rw-r--r--usr.bin/make/hash_tables.c130
-rw-r--r--usr.bin/make/hash_tables.h36
-rw-r--r--usr.bin/make/job.c3387
-rw-r--r--usr.bin/make/job.h79
-rw-r--r--usr.bin/make/lst.c345
-rw-r--r--usr.bin/make/lst.h177
-rw-r--r--usr.bin/make/main.c1319
-rw-r--r--usr.bin/make/make.11754
-rw-r--r--usr.bin/make/make.c807
-rw-r--r--usr.bin/make/make.h73
-rw-r--r--usr.bin/make/parse.c2539
-rw-r--r--usr.bin/make/parse.h86
-rw-r--r--usr.bin/make/pathnames.h56
-rw-r--r--usr.bin/make/proc.c134
-rw-r--r--usr.bin/make/proc.h53
-rw-r--r--usr.bin/make/shell.c472
-rw-r--r--usr.bin/make/shell.h110
-rw-r--r--usr.bin/make/str.c561
-rw-r--r--usr.bin/make/str.h81
-rw-r--r--usr.bin/make/suff.c2204
-rw-r--r--usr.bin/make/suff.h61
-rw-r--r--usr.bin/make/targ.c474
-rw-r--r--usr.bin/make/targ.h73
-rw-r--r--usr.bin/make/util.c316
-rw-r--r--usr.bin/make/util.h116
-rw-r--r--usr.bin/make/var.c2611
-rw-r--r--usr.bin/make/var.h85
-rw-r--r--usr.bin/makewhatis/Makefile12
-rw-r--r--usr.bin/makewhatis/makewhatis.1136
-rw-r--r--usr.bin/makewhatis/makewhatis.c1048
-rw-r--r--usr.bin/makewhatis/makewhatis.local.883
-rw-r--r--usr.bin/makewhatis/makewhatis.local.sh58
-rw-r--r--usr.bin/mesg/Makefile6
-rw-r--r--usr.bin/mesg/mesg.1112
-rw-r--r--usr.bin/mesg/mesg.c116
-rw-r--r--usr.bin/minigzip/Makefile8
-rw-r--r--usr.bin/minigzip/minigzip.183
-rw-r--r--usr.bin/ministat/Makefile14
-rw-r--r--usr.bin/ministat/README50
-rw-r--r--usr.bin/ministat/chameleon6
-rw-r--r--usr.bin/ministat/iguana8
-rw-r--r--usr.bin/ministat/ministat.1130
-rw-r--r--usr.bin/ministat/ministat.c631
-rw-r--r--usr.bin/mkdep/Makefile8
-rw-r--r--usr.bin/mkdep/mkdep.1129
-rw-r--r--usr.bin/mkdep/mkdep.gcc.sh100
-rw-r--r--usr.bin/mkdep/mkdep.sh111
-rw-r--r--usr.bin/mkfifo/Makefile7
-rw-r--r--usr.bin/mkfifo/mkfifo.1102
-rw-r--r--usr.bin/mkfifo/mkfifo.c114
-rw-r--r--usr.bin/mklocale/Makefile9
-rw-r--r--usr.bin/mklocale/extern.h40
-rw-r--r--usr.bin/mklocale/ldef.h57
-rw-r--r--usr.bin/mklocale/lex.l177
-rw-r--r--usr.bin/mklocale/mklocale.1308
-rw-r--r--usr.bin/mklocale/yacc.y886
-rw-r--r--usr.bin/mkstr/Makefile6
-rw-r--r--usr.bin/mkstr/mkstr.1134
-rw-r--r--usr.bin/mkstr/mkstr.c337
-rw-r--r--usr.bin/mktemp/Makefile5
-rw-r--r--usr.bin/mktemp/mktemp.1206
-rw-r--r--usr.bin/mktemp/mktemp.c153
-rw-r--r--usr.bin/mkuzip/Makefile11
-rw-r--r--usr.bin/mkuzip/mkuzip.8106
-rw-r--r--usr.bin/mkuzip/mkuzip.c274
-rw-r--r--usr.bin/msgs/Makefile9
-rw-r--r--usr.bin/msgs/msgs.1236
-rw-r--r--usr.bin/msgs/msgs.c914
-rw-r--r--usr.bin/msgs/pathnames.h40
-rw-r--r--usr.bin/mt/Makefile6
-rw-r--r--usr.bin/mt/mt.1404
-rw-r--r--usr.bin/mt/mt.c650
-rw-r--r--usr.bin/nc/Makefile12
-rw-r--r--usr.bin/ncal/Makefile12
-rw-r--r--usr.bin/ncal/ncal.1140
-rw-r--r--usr.bin/ncal/ncal.c876
-rw-r--r--usr.bin/ncplist/Makefile8
-rw-r--r--usr.bin/ncplist/ncplist.188
-rw-r--r--usr.bin/ncplist/ncplist.c477
-rw-r--r--usr.bin/ncplogin/Makefile11
-rw-r--r--usr.bin/ncplogin/ncplogin.1262
-rw-r--r--usr.bin/ncplogin/ncplogin.c207
-rw-r--r--usr.bin/ncplogin/ncplogout.156
-rw-r--r--usr.bin/netstat/Makefile40
-rw-r--r--usr.bin/netstat/atalk.c289
-rw-r--r--usr.bin/netstat/bpf.c135
-rw-r--r--usr.bin/netstat/if.c701
-rw-r--r--usr.bin/netstat/inet.c1156
-rw-r--r--usr.bin/netstat/inet6.c1156
-rw-r--r--usr.bin/netstat/ipsec.c464
-rw-r--r--usr.bin/netstat/ipx.c350
-rw-r--r--usr.bin/netstat/main.c788
-rw-r--r--usr.bin/netstat/mbuf.c313
-rw-r--r--usr.bin/netstat/mcast.c219
-rw-r--r--usr.bin/netstat/mroute.c304
-rw-r--r--usr.bin/netstat/mroute6.c260
-rw-r--r--usr.bin/netstat/netgraph.c191
-rw-r--r--usr.bin/netstat/netstat.1506
-rw-r--r--usr.bin/netstat/netstat.h166
-rw-r--r--usr.bin/netstat/pfkey.c180
-rw-r--r--usr.bin/netstat/route.c1142
-rw-r--r--usr.bin/netstat/sctp.c690
-rw-r--r--usr.bin/netstat/unix.c275
-rw-r--r--usr.bin/newgrp/Makefile12
-rw-r--r--usr.bin/newgrp/newgrp.195
-rw-r--r--usr.bin/newgrp/newgrp.c304
-rw-r--r--usr.bin/newkey/Makefile14
-rw-r--r--usr.bin/newkey/extern.h47
-rw-r--r--usr.bin/newkey/generic.c132
-rw-r--r--usr.bin/newkey/newkey.859
-rw-r--r--usr.bin/newkey/newkey.c235
-rw-r--r--usr.bin/newkey/update.c336
-rw-r--r--usr.bin/nfsstat/Makefile9
-rw-r--r--usr.bin/nfsstat/nfsstat.1106
-rw-r--r--usr.bin/nfsstat/nfsstat.c519
-rw-r--r--usr.bin/nice/Makefile6
-rw-r--r--usr.bin/nice/nice.1124
-rw-r--r--usr.bin/nice/nice.c115
-rw-r--r--usr.bin/nl/Makefile5
-rw-r--r--usr.bin/nl/nl.1253
-rw-r--r--usr.bin/nl/nl.c425
-rw-r--r--usr.bin/nohup/Makefile7
-rw-r--r--usr.bin/nohup/nohup.1124
-rw-r--r--usr.bin/nohup/nohup.c137
-rw-r--r--usr.bin/nslookup/Makefile23
-rw-r--r--usr.bin/nsupdate/Makefile26
-rw-r--r--usr.bin/objformat/Makefile7
-rw-r--r--usr.bin/objformat/objformat.sh26
-rw-r--r--usr.bin/opieinfo/Makefile20
-rw-r--r--usr.bin/opiekey/Makefile22
-rw-r--r--usr.bin/opiepasswd/Makefile20
-rw-r--r--usr.bin/pagesize/Makefile7
-rw-r--r--usr.bin/pagesize/pagesize.158
-rw-r--r--usr.bin/pagesize/pagesize.sh40
-rw-r--r--usr.bin/passwd/Makefile26
-rw-r--r--usr.bin/passwd/passwd.1256
-rw-r--r--usr.bin/passwd/passwd.c164
-rw-r--r--usr.bin/paste/Makefile5
-rw-r--r--usr.bin/paste/paste.1150
-rw-r--r--usr.bin/paste/paste.c276
-rw-r--r--usr.bin/pathchk/Makefile5
-rw-r--r--usr.bin/pathchk/pathchk.1121
-rw-r--r--usr.bin/pathchk/pathchk.c193
-rw-r--r--usr.bin/pr/Makefile6
-rw-r--r--usr.bin/pr/egetopt.c218
-rw-r--r--usr.bin/pr/extern.h61
-rw-r--r--usr.bin/pr/pr.1395
-rw-r--r--usr.bin/pr/pr.c1833
-rw-r--r--usr.bin/pr/pr.h74
-rw-r--r--usr.bin/printenv/Makefile6
-rw-r--r--usr.bin/printenv/printenv.188
-rw-r--r--usr.bin/printenv/printenv.c103
-rw-r--r--usr.bin/printf/Makefile7
-rw-r--r--usr.bin/printf/printf.1351
-rw-r--r--usr.bin/printf/printf.c558
-rw-r--r--usr.bin/procstat/Makefile15
-rw-r--r--usr.bin/procstat/procstat.1361
-rw-r--r--usr.bin/procstat/procstat.c253
-rw-r--r--usr.bin/procstat/procstat.h46
-rw-r--r--usr.bin/procstat/procstat_args.c76
-rw-r--r--usr.bin/procstat/procstat_basic.c64
-rw-r--r--usr.bin/procstat/procstat_bin.c70
-rw-r--r--usr.bin/procstat/procstat_cred.c59
-rw-r--r--usr.bin/procstat/procstat_files.c342
-rw-r--r--usr.bin/procstat/procstat_kstack.c246
-rw-r--r--usr.bin/procstat/procstat_threads.c142
-rw-r--r--usr.bin/procstat/procstat_vm.c131
-rw-r--r--usr.bin/quota/Makefile10
-rw-r--r--usr.bin/quota/quota.1180
-rw-r--r--usr.bin/quota/quota.c764
-rw-r--r--usr.bin/renice/Makefile7
-rw-r--r--usr.bin/renice/renice.8140
-rw-r--r--usr.bin/renice/renice.c186
-rw-r--r--usr.bin/rev/Makefile6
-rw-r--r--usr.bin/rev/rev.149
-rw-r--r--usr.bin/rev/rev.c118
-rw-r--r--usr.bin/rlogin/Makefile10
-rw-r--r--usr.bin/rlogin/rlogin.1164
-rw-r--r--usr.bin/rlogin/rlogin.c723
-rw-r--r--usr.bin/rpcgen/Makefile9
-rw-r--r--usr.bin/rpcgen/rpc_clntout.c278
-rw-r--r--usr.bin/rpcgen/rpc_cout.c718
-rw-r--r--usr.bin/rpcgen/rpc_hout.c527
-rw-r--r--usr.bin/rpcgen/rpc_main.c1258
-rw-r--r--usr.bin/rpcgen/rpc_parse.c639
-rw-r--r--usr.bin/rpcgen/rpc_parse.h200
-rw-r--r--usr.bin/rpcgen/rpc_sample.c293
-rw-r--r--usr.bin/rpcgen/rpc_scan.c501
-rw-r--r--usr.bin/rpcgen/rpc_scan.h136
-rw-r--r--usr.bin/rpcgen/rpc_svcout.c1020
-rw-r--r--usr.bin/rpcgen/rpc_tblout.c172
-rw-r--r--usr.bin/rpcgen/rpc_util.c511
-rw-r--r--usr.bin/rpcgen/rpc_util.h230
-rw-r--r--usr.bin/rpcgen/rpcgen.1532
-rw-r--r--usr.bin/rpcinfo/Makefile10
-rw-r--r--usr.bin/rpcinfo/rpcinfo.8341
-rw-r--r--usr.bin/rpcinfo/rpcinfo.c1667
-rw-r--r--usr.bin/rs/Makefile5
-rw-r--r--usr.bin/rs/rs.1244
-rw-r--r--usr.bin/rs/rs.c548
-rw-r--r--usr.bin/rsh/Makefile11
-rw-r--r--usr.bin/rsh/rsh.1178
-rw-r--r--usr.bin/rsh/rsh.c376
-rw-r--r--usr.bin/rup/Makefile8
-rw-r--r--usr.bin/rup/rup.199
-rw-r--r--usr.bin/rup/rup.c254
-rw-r--r--usr.bin/ruptime/Makefile5
-rw-r--r--usr.bin/ruptime/ruptime.194
-rw-r--r--usr.bin/ruptime/ruptime.c303
-rw-r--r--usr.bin/rusers/Makefile9
-rw-r--r--usr.bin/rusers/rusers.1108
-rw-r--r--usr.bin/rusers/rusers.c251
-rw-r--r--usr.bin/rwall/Makefile5
-rw-r--r--usr.bin/rwall/rwall.183
-rw-r--r--usr.bin/rwall/rwall.c183
-rw-r--r--usr.bin/rwho/Makefile5
-rw-r--r--usr.bin/rwho/rwho.184
-rw-r--r--usr.bin/rwho/rwho.c223
-rw-r--r--usr.bin/script/Makefile8
-rw-r--r--usr.bin/script/script.1159
-rw-r--r--usr.bin/script/script.c284
-rw-r--r--usr.bin/sed/Makefile7
-rw-r--r--usr.bin/sed/POSIX204
-rw-r--r--usr.bin/sed/compile.c929
-rw-r--r--usr.bin/sed/defs.h147
-rw-r--r--usr.bin/sed/extern.h56
-rw-r--r--usr.bin/sed/main.c469
-rw-r--r--usr.bin/sed/misc.c71
-rw-r--r--usr.bin/sed/process.c756
-rw-r--r--usr.bin/sed/sed.1626
-rw-r--r--usr.bin/setchannel/Makefile5
-rw-r--r--usr.bin/setchannel/setchannel.1104
-rw-r--r--usr.bin/setchannel/setchannel.c291
-rw-r--r--usr.bin/shar/Makefile7
-rw-r--r--usr.bin/shar/shar.1111
-rw-r--r--usr.bin/shar/shar.sh84
-rw-r--r--usr.bin/showmount/Makefile7
-rw-r--r--usr.bin/showmount/showmount.8104
-rw-r--r--usr.bin/showmount/showmount.c404
-rw-r--r--usr.bin/smbutil/Makefile14
-rw-r--r--usr.bin/sockstat/Makefile6
-rw-r--r--usr.bin/sockstat/sockstat.1168
-rw-r--r--usr.bin/sockstat/sockstat.c754
-rw-r--r--usr.bin/split/Makefile6
-rw-r--r--usr.bin/split/split.1179
-rw-r--r--usr.bin/split/split.c401
-rw-r--r--usr.bin/stat/Makefile9
-rw-r--r--usr.bin/stat/stat.1549
-rw-r--r--usr.bin/stat/stat.c988
-rw-r--r--usr.bin/su/Makefile21
-rw-r--r--usr.bin/su/su.1246
-rw-r--r--usr.bin/su/su.c643
-rw-r--r--usr.bin/systat/Makefile20
-rw-r--r--usr.bin/systat/cmds.c197
-rw-r--r--usr.bin/systat/cmdtab.c87
-rw-r--r--usr.bin/systat/convtbl.c150
-rw-r--r--usr.bin/systat/convtbl.h59
-rw-r--r--usr.bin/systat/devs.c325
-rw-r--r--usr.bin/systat/devs.h30
-rw-r--r--usr.bin/systat/extern.h174
-rw-r--r--usr.bin/systat/fetch.c142
-rw-r--r--usr.bin/systat/icmp.c284
-rw-r--r--usr.bin/systat/icmp6.c282
-rw-r--r--usr.bin/systat/ifcmds.c53
-rw-r--r--usr.bin/systat/ifstat.c405
-rw-r--r--usr.bin/systat/iostat.c402
-rw-r--r--usr.bin/systat/ip.c344
-rw-r--r--usr.bin/systat/ip6.c304
-rw-r--r--usr.bin/systat/keyboard.c123
-rw-r--r--usr.bin/systat/main.c295
-rw-r--r--usr.bin/systat/mbufs.c197
-rw-r--r--usr.bin/systat/mode.c99
-rw-r--r--usr.bin/systat/mode.h44
-rw-r--r--usr.bin/systat/netcmds.c313
-rw-r--r--usr.bin/systat/netstat.c664
-rw-r--r--usr.bin/systat/pigs.c198
-rw-r--r--usr.bin/systat/swap.c222
-rw-r--r--usr.bin/systat/systat.1641
-rw-r--r--usr.bin/systat/systat.h71
-rw-r--r--usr.bin/systat/tcp.c331
-rw-r--r--usr.bin/systat/vmstat.c884
-rw-r--r--usr.bin/tabs/Makefile7
-rw-r--r--usr.bin/tabs/tabs.1160
-rw-r--r--usr.bin/tabs/tabs.c237
-rw-r--r--usr.bin/tail/Makefile8
-rw-r--r--usr.bin/tail/extern.h76
-rw-r--r--usr.bin/tail/forward.c397
-rw-r--r--usr.bin/tail/misc.c119
-rw-r--r--usr.bin/tail/read.c214
-rw-r--r--usr.bin/tail/reverse.c288
-rw-r--r--usr.bin/tail/tail.1188
-rw-r--r--usr.bin/tail/tail.c339
-rw-r--r--usr.bin/talk/Makefile10
-rw-r--r--usr.bin/talk/ctl.c125
-rw-r--r--usr.bin/talk/ctl_transact.c116
-rw-r--r--usr.bin/talk/display.c189
-rw-r--r--usr.bin/talk/get_addrs.c68
-rw-r--r--usr.bin/talk/get_iface.c99
-rw-r--r--usr.bin/talk/get_names.c122
-rw-r--r--usr.bin/talk/init_disp.c239
-rw-r--r--usr.bin/talk/invite.c199
-rw-r--r--usr.bin/talk/io.c181
-rw-r--r--usr.bin/talk/look_up.c124
-rw-r--r--usr.bin/talk/msgs.c84
-rw-r--r--usr.bin/talk/talk.1163
-rw-r--r--usr.bin/talk/talk.c85
-rw-r--r--usr.bin/talk/talk.h97
-rw-r--r--usr.bin/talk/talk_ctl.h43
-rw-r--r--usr.bin/tar/COPYING62
-rw-r--r--usr.bin/tar/Makefile19
-rw-r--r--usr.bin/tar/bsdtar.1829
-rw-r--r--usr.bin/tar/bsdtar.c959
-rw-r--r--usr.bin/tar/bsdtar.h140
-rw-r--r--usr.bin/tar/bsdtar_platform.h150
-rw-r--r--usr.bin/tar/config_freebsd.h108
-rw-r--r--usr.bin/tar/getdate.y811
-rw-r--r--usr.bin/tar/matching.c478
-rw-r--r--usr.bin/tar/read.c401
-rw-r--r--usr.bin/tar/siginfo.c147
-rw-r--r--usr.bin/tar/subst.c287
-rw-r--r--usr.bin/tar/test/Makefile64
-rw-r--r--usr.bin/tar/test/main.c1046
-rw-r--r--usr.bin/tar/test/test.h154
-rw-r--r--usr.bin/tar/test/test_0.c62
-rw-r--r--usr.bin/tar/test/test_basic.c158
-rw-r--r--usr.bin/tar/test/test_copy.c329
-rw-r--r--usr.bin/tar/test/test_getdate.c38
-rw-r--r--usr.bin/tar/test/test_help.c81
-rw-r--r--usr.bin/tar/test/test_option_T.c145
-rw-r--r--usr.bin/tar/test/test_option_q.c125
-rw-r--r--usr.bin/tar/test/test_patterns.c100
-rw-r--r--usr.bin/tar/test/test_patterns_2.tgz.uu9
-rw-r--r--usr.bin/tar/test/test_patterns_3.tgz.uu8
-rw-r--r--usr.bin/tar/test/test_stdio.c124
-rw-r--r--usr.bin/tar/test/test_symlink_dir.c172
-rw-r--r--usr.bin/tar/test/test_version.c93
-rw-r--r--usr.bin/tar/tree.c542
-rw-r--r--usr.bin/tar/tree.h115
-rw-r--r--usr.bin/tar/util.c489
-rw-r--r--usr.bin/tar/write.c1434
-rw-r--r--usr.bin/tcopy/Makefile6
-rw-r--r--usr.bin/tcopy/tcopy.1129
-rw-r--r--usr.bin/tcopy/tcopy.c345
-rw-r--r--usr.bin/tee/Makefile6
-rw-r--r--usr.bin/tee/tee.186
-rw-r--r--usr.bin/tee/tee.c143
-rw-r--r--usr.bin/telnet/Makefile50
-rw-r--r--usr.bin/tftp/Makefile9
-rw-r--r--usr.bin/tftp/extern.h38
-rw-r--r--usr.bin/tftp/main.c755
-rw-r--r--usr.bin/tftp/tftp.1194
-rw-r--r--usr.bin/tftp/tftp.c486
-rw-r--r--usr.bin/tftp/tftpsubs.c268
-rw-r--r--usr.bin/tftp/tftpsubs.h49
-rw-r--r--usr.bin/time/Makefile7
-rw-r--r--usr.bin/time/time.1149
-rw-r--r--usr.bin/time/time.c307
-rw-r--r--usr.bin/tip/Makefile5
-rw-r--r--usr.bin/tip/Makefile.inc3
-rw-r--r--usr.bin/tip/README63
-rw-r--r--usr.bin/tip/TODO20
-rw-r--r--usr.bin/tip/libacu/biz22.c187
-rw-r--r--usr.bin/tip/libacu/biz31.c254
-rw-r--r--usr.bin/tip/libacu/courier.c354
-rw-r--r--usr.bin/tip/libacu/df.c137
-rw-r--r--usr.bin/tip/libacu/dn11.c149
-rw-r--r--usr.bin/tip/libacu/hayes.c320
-rw-r--r--usr.bin/tip/libacu/t3000.c372
-rw-r--r--usr.bin/tip/libacu/v3451.c212
-rw-r--r--usr.bin/tip/libacu/v831.c263
-rw-r--r--usr.bin/tip/libacu/ventel.c259
-rw-r--r--usr.bin/tip/tip/Makefile57
-rw-r--r--usr.bin/tip/tip/acu.c195
-rw-r--r--usr.bin/tip/tip/acutab.c89
-rw-r--r--usr.bin/tip/tip/cmds.c999
-rw-r--r--usr.bin/tip/tip/cmdtab.c66
-rw-r--r--usr.bin/tip/tip/cu.1506
-rw-r--r--usr.bin/tip/tip/cu.c210
-rw-r--r--usr.bin/tip/tip/hunt.c109
-rw-r--r--usr.bin/tip/tip/log.c92
-rw-r--r--usr.bin/tip/tip/partab.c63
-rw-r--r--usr.bin/tip/tip/pathnames.h41
-rw-r--r--usr.bin/tip/tip/remote.c242
-rw-r--r--usr.bin/tip/tip/tip.1603
-rw-r--r--usr.bin/tip/tip/tip.c627
-rw-r--r--usr.bin/tip/tip/tip.h354
-rw-r--r--usr.bin/tip/tip/tipout.c181
-rw-r--r--usr.bin/tip/tip/uucplock.c131
-rw-r--r--usr.bin/tip/tip/value.c349
-rw-r--r--usr.bin/tip/tip/vars.c124
-rw-r--r--usr.bin/top/Makefile47
-rw-r--r--usr.bin/top/machine.c1427
-rw-r--r--usr.bin/top/top.local.153
-rw-r--r--usr.bin/touch/Makefile6
-rw-r--r--usr.bin/touch/touch.1221
-rw-r--r--usr.bin/touch/touch.c423
-rw-r--r--usr.bin/tput/Makefile10
-rw-r--r--usr.bin/tput/clear.sh37
-rw-r--r--usr.bin/tput/tput.1158
-rw-r--r--usr.bin/tput/tput.c216
-rw-r--r--usr.bin/tr/Makefile7
-rw-r--r--usr.bin/tr/cmap.c212
-rw-r--r--usr.bin/tr/cmap.h83
-rw-r--r--usr.bin/tr/cset.c290
-rw-r--r--usr.bin/tr/cset.h74
-rw-r--r--usr.bin/tr/extern.h55
-rw-r--r--usr.bin/tr/str.c396
-rw-r--r--usr.bin/tr/tr.1427
-rw-r--r--usr.bin/tr/tr.c376
-rw-r--r--usr.bin/true/Makefile6
-rw-r--r--usr.bin/true/true.167
-rw-r--r--usr.bin/true/true.c50
-rw-r--r--usr.bin/truncate/Makefile5
-rw-r--r--usr.bin/truncate/truncate.1153
-rw-r--r--usr.bin/truncate/truncate.c217
-rw-r--r--usr.bin/truss/Makefile57
-rw-r--r--usr.bin/truss/amd64-fbsd.c330
-rw-r--r--usr.bin/truss/amd64-fbsd32.c346
-rw-r--r--usr.bin/truss/amd64-linux32.c316
-rw-r--r--usr.bin/truss/amd64linux32.conf13
-rw-r--r--usr.bin/truss/extern.h66
-rw-r--r--usr.bin/truss/fbsd32.conf13
-rw-r--r--usr.bin/truss/i386-fbsd.c336
-rw-r--r--usr.bin/truss/i386-linux.c316
-rw-r--r--usr.bin/truss/i386.conf13
-rw-r--r--usr.bin/truss/i386linux.conf13
-rw-r--r--usr.bin/truss/ia64-fbsd.c301
-rw-r--r--usr.bin/truss/main.c360
-rw-r--r--usr.bin/truss/powerpc-fbsd.c338
-rw-r--r--usr.bin/truss/setup.c221
-rw-r--r--usr.bin/truss/sparc64-fbsd.c343
-rw-r--r--usr.bin/truss/syscall.h66
-rw-r--r--usr.bin/truss/syscalls.c1090
-rw-r--r--usr.bin/truss/truss.1101
-rw-r--r--usr.bin/truss/truss.h78
-rw-r--r--usr.bin/tset/Makefile11
-rw-r--r--usr.bin/tset/extern.h52
-rw-r--r--usr.bin/tset/map.c260
-rw-r--r--usr.bin/tset/misc.c74
-rw-r--r--usr.bin/tset/set.c326
-rw-r--r--usr.bin/tset/term.c161
-rw-r--r--usr.bin/tset/tset.1408
-rw-r--r--usr.bin/tset/tset.c300
-rw-r--r--usr.bin/tset/wrterm.c119
-rw-r--r--usr.bin/tsort/Makefile6
-rw-r--r--usr.bin/tsort/tsort.197
-rw-r--r--usr.bin/tsort/tsort.c432
-rw-r--r--usr.bin/tty/Makefile6
-rw-r--r--usr.bin/tty/tty.187
-rw-r--r--usr.bin/tty/tty.c83
-rw-r--r--usr.bin/ul/Makefile9
-rw-r--r--usr.bin/ul/ul.1106
-rw-r--r--usr.bin/ul/ul.c569
-rw-r--r--usr.bin/uname/Makefile5
-rw-r--r--usr.bin/uname/uname.1106
-rw-r--r--usr.bin/uname/uname.c249
-rw-r--r--usr.bin/unexpand/Makefile7
-rw-r--r--usr.bin/unexpand/unexpand.c231
-rw-r--r--usr.bin/unifdef/Makefile9
-rw-r--r--usr.bin/unifdef/unifdef.1335
-rw-r--r--usr.bin/unifdef/unifdef.c1012
-rw-r--r--usr.bin/unifdef/unifdefall.sh29
-rw-r--r--usr.bin/uniq/Makefile6
-rw-r--r--usr.bin/uniq/uniq.1159
-rw-r--r--usr.bin/uniq/uniq.c339
-rw-r--r--usr.bin/units/Makefile7
-rw-r--r--usr.bin/units/README18
-rw-r--r--usr.bin/units/pathnames.h33
-rw-r--r--usr.bin/units/units.1181
-rw-r--r--usr.bin/units/units.c749
-rw-r--r--usr.bin/units/units.lib732
-rw-r--r--usr.bin/unvis/Makefile6
-rw-r--r--usr.bin/unvis/unvis.159
-rw-r--r--usr.bin/unvis/unvis.c122
-rw-r--r--usr.bin/unzip/Makefile9
-rw-r--r--usr.bin/unzip/unzip.1158
-rw-r--r--usr.bin/unzip/unzip.c794
-rw-r--r--usr.bin/usbhidaction/Makefile9
-rw-r--r--usr.bin/usbhidaction/usbhidaction.1182
-rw-r--r--usr.bin/usbhidaction/usbhidaction.c500
-rw-r--r--usr.bin/usbhidctl/Makefile9
-rw-r--r--usr.bin/usbhidctl/usbhid.c345
-rw-r--r--usr.bin/usbhidctl/usbhidctl.197
-rw-r--r--usr.bin/users/Makefile6
-rw-r--r--usr.bin/users/users.161
-rw-r--r--usr.bin/users/users.c118
-rw-r--r--usr.bin/uudecode/Makefile9
-rw-r--r--usr.bin/uudecode/uudecode.c438
-rw-r--r--usr.bin/uuencode/Makefile13
-rw-r--r--usr.bin/uuencode/uuencode.1221
-rw-r--r--usr.bin/uuencode/uuencode.c226
-rw-r--r--usr.bin/uuencode/uuencode.format.5106
-rw-r--r--usr.bin/vacation/Makefile36
-rw-r--r--usr.bin/vgrind/Makefile31
-rw-r--r--usr.bin/vgrind/RETEST/Makefile11
-rw-r--r--usr.bin/vgrind/RETEST/retest.c105
-rw-r--r--usr.bin/vgrind/extern.h66
-rw-r--r--usr.bin/vgrind/pathnames.h36
-rw-r--r--usr.bin/vgrind/regexp.c603
-rw-r--r--usr.bin/vgrind/tmac.vgrind72
-rw-r--r--usr.bin/vgrind/vfontedpr.c727
-rw-r--r--usr.bin/vgrind/vgrind.1246
-rw-r--r--usr.bin/vgrind/vgrind.sh135
-rw-r--r--usr.bin/vgrind/vgrindefs.5175
-rw-r--r--usr.bin/vgrind/vgrindefs.c328
-rw-r--r--usr.bin/vgrind/vgrindefs.src159
-rw-r--r--usr.bin/vi/Makefile110
-rw-r--r--usr.bin/vi/config.h195
-rw-r--r--usr.bin/vi/pathnames.h49
-rw-r--r--usr.bin/vi/port.h170
-rw-r--r--usr.bin/vis/Makefile6
-rw-r--r--usr.bin/vis/extern.h36
-rw-r--r--usr.bin/vis/foldit.c82
-rw-r--r--usr.bin/vis/vis.1142
-rw-r--r--usr.bin/vis/vis.c190
-rw-r--r--usr.bin/vmstat/Makefile9
-rw-r--r--usr.bin/vmstat/vmstat.8359
-rw-r--r--usr.bin/vmstat/vmstat.c1222
-rw-r--r--usr.bin/w/Makefile15
-rw-r--r--usr.bin/w/extern.h43
-rw-r--r--usr.bin/w/pr_time.c120
-rw-r--r--usr.bin/w/proc_compare.c125
-rw-r--r--usr.bin/w/uptime.161
-rw-r--r--usr.bin/w/w.1148
-rw-r--r--usr.bin/w/w.c513
-rw-r--r--usr.bin/wall/Makefile8
-rw-r--r--usr.bin/wall/ttymsg.c171
-rw-r--r--usr.bin/wall/ttymsg.h3
-rw-r--r--usr.bin/wall/wall.183
-rw-r--r--usr.bin/wall/wall.c316
-rw-r--r--usr.bin/wc/Makefile6
-rw-r--r--usr.bin/wc/wc.1168
-rw-r--r--usr.bin/wc/wc.c268
-rw-r--r--usr.bin/what/Makefile6
-rw-r--r--usr.bin/what/what.193
-rw-r--r--usr.bin/what/what.c141
-rw-r--r--usr.bin/whereis/Makefile6
-rw-r--r--usr.bin/whereis/pathnames.h56
-rw-r--r--usr.bin/whereis/whereis.1190
-rw-r--r--usr.bin/whereis/whereis.c692
-rw-r--r--usr.bin/which/Makefile6
-rw-r--r--usr.bin/which/which.185
-rw-r--r--usr.bin/which/which.c146
-rw-r--r--usr.bin/who/Makefile5
-rw-r--r--usr.bin/who/who.1154
-rw-r--r--usr.bin/who/who.c312
-rw-r--r--usr.bin/whois/Makefile13
-rw-r--r--usr.bin/whois/whois.1289
-rw-r--r--usr.bin/whois/whois.c369
-rw-r--r--usr.bin/window/Makefile21
-rw-r--r--usr.bin/window/README199
-rw-r--r--usr.bin/window/alias.h53
-rw-r--r--usr.bin/window/char.c78
-rw-r--r--usr.bin/window/char.h62
-rw-r--r--usr.bin/window/cmd.c302
-rw-r--r--usr.bin/window/cmd1.c174
-rw-r--r--usr.bin/window/cmd2.c156
-rw-r--r--usr.bin/window/cmd3.c67
-rw-r--r--usr.bin/window/cmd4.c58
-rw-r--r--usr.bin/window/cmd5.c131
-rw-r--r--usr.bin/window/cmd6.c112
-rw-r--r--usr.bin/window/cmd7.c274
-rw-r--r--usr.bin/window/compress.c902
-rw-r--r--usr.bin/window/context.c131
-rw-r--r--usr.bin/window/context.h84
-rw-r--r--usr.bin/window/defs.h72
-rw-r--r--usr.bin/window/error.c97
-rw-r--r--usr.bin/window/lcmd.c156
-rw-r--r--usr.bin/window/lcmd.h62
-rw-r--r--usr.bin/window/lcmd1.c432
-rw-r--r--usr.bin/window/lcmd2.c403
-rw-r--r--usr.bin/window/local.h52
-rw-r--r--usr.bin/window/main.c207
-rw-r--r--usr.bin/window/mloop.c86
-rw-r--r--usr.bin/window/mystring.h66
-rw-r--r--usr.bin/window/parser.h48
-rw-r--r--usr.bin/window/parser1.c224
-rw-r--r--usr.bin/window/parser2.c233
-rw-r--r--usr.bin/window/parser3.c193
-rw-r--r--usr.bin/window/parser4.c299
-rw-r--r--usr.bin/window/parser5.c203
-rw-r--r--usr.bin/window/scanner.c552
-rw-r--r--usr.bin/window/startup.c94
-rw-r--r--usr.bin/window/string.c154
-rw-r--r--usr.bin/window/token.h84
-rw-r--r--usr.bin/window/tt.h154
-rw-r--r--usr.bin/window/ttf100.c71
-rw-r--r--usr.bin/window/ttgeneric.c549
-rw-r--r--usr.bin/window/tth19.c280
-rw-r--r--usr.bin/window/tth29.c96
-rw-r--r--usr.bin/window/ttinit.c122
-rw-r--r--usr.bin/window/ttoutput.c148
-rw-r--r--usr.bin/window/tttermcap.c118
-rw-r--r--usr.bin/window/tttvi925.c66
-rw-r--r--usr.bin/window/ttwyse60.c78
-rw-r--r--usr.bin/window/ttwyse75.c78
-rw-r--r--usr.bin/window/ttzapple.c485
-rw-r--r--usr.bin/window/ttzentec.c68
-rw-r--r--usr.bin/window/value.h54
-rw-r--r--usr.bin/window/var.c158
-rw-r--r--usr.bin/window/var.h59
-rw-r--r--usr.bin/window/win.c372
-rw-r--r--usr.bin/window/window.11072
-rw-r--r--usr.bin/window/windowrc85
-rw-r--r--usr.bin/window/ww.h322
-rw-r--r--usr.bin/window/wwadd.c90
-rw-r--r--usr.bin/window/wwalloc.c74
-rw-r--r--usr.bin/window/wwbox.c68
-rw-r--r--usr.bin/window/wwchild.c72
-rw-r--r--usr.bin/window/wwclose.c61
-rw-r--r--usr.bin/window/wwclreol.c97
-rw-r--r--usr.bin/window/wwclreos.c57
-rw-r--r--usr.bin/window/wwcursor.c94
-rw-r--r--usr.bin/window/wwdata.c41
-rw-r--r--usr.bin/window/wwdelchar.c125
-rw-r--r--usr.bin/window/wwdelete.c141
-rw-r--r--usr.bin/window/wwdelline.c90
-rw-r--r--usr.bin/window/wwdump.c117
-rw-r--r--usr.bin/window/wwend.c68
-rw-r--r--usr.bin/window/wwenviron.c105
-rw-r--r--usr.bin/window/wwerror.c71
-rw-r--r--usr.bin/window/wwflush.c110
-rw-r--r--usr.bin/window/wwframe.c251
-rw-r--r--usr.bin/window/wwgets.c110
-rw-r--r--usr.bin/window/wwinit.c429
-rw-r--r--usr.bin/window/wwinschar.c132
-rw-r--r--usr.bin/window/wwinsline.c90
-rw-r--r--usr.bin/window/wwiomux.c205
-rw-r--r--usr.bin/window/wwlabel.c106
-rw-r--r--usr.bin/window/wwmisc.c69
-rw-r--r--usr.bin/window/wwmove.c100
-rw-r--r--usr.bin/window/wwopen.c191
-rw-r--r--usr.bin/window/wwprintf.c56
-rw-r--r--usr.bin/window/wwpty.c77
-rw-r--r--usr.bin/window/wwputc.c50
-rw-r--r--usr.bin/window/wwputs.c54
-rw-r--r--usr.bin/window/wwredraw.c58
-rw-r--r--usr.bin/window/wwredrawwin.c75
-rw-r--r--usr.bin/window/wwrint.c94
-rw-r--r--usr.bin/window/wwscroll.c236
-rw-r--r--usr.bin/window/wwsize.c194
-rw-r--r--usr.bin/window/wwspawn.c87
-rw-r--r--usr.bin/window/wwsuspend.c58
-rw-r--r--usr.bin/window/wwterminfo.c113
-rw-r--r--usr.bin/window/wwtty.c182
-rw-r--r--usr.bin/window/wwunframe.c78
-rw-r--r--usr.bin/window/wwupdate.c273
-rw-r--r--usr.bin/window/wwwrite.c300
-rw-r--r--usr.bin/window/xx.c255
-rw-r--r--usr.bin/window/xx.h59
-rw-r--r--usr.bin/window/xxflush.c198
-rw-r--r--usr.bin/write/Makefile7
-rw-r--r--usr.bin/write/write.1117
-rw-r--r--usr.bin/write/write.c328
-rw-r--r--usr.bin/xargs/Makefile8
-rw-r--r--usr.bin/xargs/pathnames.h36
-rw-r--r--usr.bin/xargs/strnsubst.c109
-rw-r--r--usr.bin/xargs/xargs.1365
-rw-r--r--usr.bin/xargs/xargs.c626
-rw-r--r--usr.bin/xinstall/Makefile9
-rw-r--r--usr.bin/xinstall/install.1264
-rw-r--r--usr.bin/xinstall/xinstall.c807
-rw-r--r--usr.bin/xlint/Makefile12
-rw-r--r--usr.bin/xlint/Makefile.inc12
-rw-r--r--usr.bin/xlint/arch/amd64/targparam.h53
-rw-r--r--usr.bin/xlint/arch/arm/targparam.h63
-rw-r--r--usr.bin/xlint/arch/i386/targparam.h53
-rw-r--r--usr.bin/xlint/arch/ia64/targparam.h54
-rw-r--r--usr.bin/xlint/arch/m68000/targparam.h53
-rw-r--r--usr.bin/xlint/arch/m68k/targparam.h53
-rw-r--r--usr.bin/xlint/arch/mips/targparam.h53
-rw-r--r--usr.bin/xlint/arch/ns32k/targparam.h53
-rw-r--r--usr.bin/xlint/arch/powerpc/targparam.h53
-rw-r--r--usr.bin/xlint/arch/sh3/targparam.h53
-rw-r--r--usr.bin/xlint/arch/sparc/targparam.h53
-rw-r--r--usr.bin/xlint/arch/sparc64/targparam.h53
-rw-r--r--usr.bin/xlint/arch/vax/targparam.h53
-rw-r--r--usr.bin/xlint/arch/x86_64/targparam.h53
-rw-r--r--usr.bin/xlint/common/emit.c234
-rw-r--r--usr.bin/xlint/common/externs.h66
-rw-r--r--usr.bin/xlint/common/ilp32.h59
-rw-r--r--usr.bin/xlint/common/inittyp.c133
-rw-r--r--usr.bin/xlint/common/lint.h126
-rw-r--r--usr.bin/xlint/common/lp64.h59
-rw-r--r--usr.bin/xlint/common/mem.c88
-rw-r--r--usr.bin/xlint/common/param.h81
-rw-r--r--usr.bin/xlint/lint1/Makefile22
-rw-r--r--usr.bin/xlint/lint1/cgram.y1783
-rw-r--r--usr.bin/xlint/lint1/decl.c3053
-rw-r--r--usr.bin/xlint/lint1/emit.c243
-rw-r--r--usr.bin/xlint/lint1/emit1.c601
-rw-r--r--usr.bin/xlint/lint1/err.c514
-rw-r--r--usr.bin/xlint/lint1/externs1.h285
-rw-r--r--usr.bin/xlint/lint1/func.c1288
-rw-r--r--usr.bin/xlint/lint1/init.c515
-rw-r--r--usr.bin/xlint/lint1/lint.h118
-rw-r--r--usr.bin/xlint/lint1/lint1.h416
-rw-r--r--usr.bin/xlint/lint1/main1.c222
-rw-r--r--usr.bin/xlint/lint1/makeman94
-rw-r--r--usr.bin/xlint/lint1/mem1.c365
-rw-r--r--usr.bin/xlint/lint1/op.h120
-rw-r--r--usr.bin/xlint/lint1/param.h140
-rw-r--r--usr.bin/xlint/lint1/scan.l1478
-rw-r--r--usr.bin/xlint/lint1/tree.c3928
-rw-r--r--usr.bin/xlint/lint2/Makefile14
-rw-r--r--usr.bin/xlint/lint2/chk.c1350
-rw-r--r--usr.bin/xlint/lint2/emit2.c300
-rw-r--r--usr.bin/xlint/lint2/externs2.h93
-rw-r--r--usr.bin/xlint/lint2/hash.c166
-rw-r--r--usr.bin/xlint/lint2/lint2.h188
-rw-r--r--usr.bin/xlint/lint2/main2.c191
-rw-r--r--usr.bin/xlint/lint2/mem2.c97
-rw-r--r--usr.bin/xlint/lint2/msg.c137
-rw-r--r--usr.bin/xlint/lint2/read.c1246
-rw-r--r--usr.bin/xlint/llib/Makefile17
-rw-r--r--usr.bin/xlint/llib/llib-lposix314
-rw-r--r--usr.bin/xlint/llib/llib-lstdc254
-rw-r--r--usr.bin/xlint/xlint/Makefile15
-rw-r--r--usr.bin/xlint/xlint/lint.1617
-rw-r--r--usr.bin/xlint/xlint/pathnames.h45
-rw-r--r--usr.bin/xlint/xlint/xlint.c872
-rw-r--r--usr.bin/xstr/Makefile5
-rw-r--r--usr.bin/xstr/pathnames.h36
-rw-r--r--usr.bin/xstr/xstr.1167
-rw-r--r--usr.bin/xstr/xstr.c495
-rw-r--r--usr.bin/yacc/ACKNOWLEDGEMENTS25
-rw-r--r--usr.bin/yacc/Makefile12
-rw-r--r--usr.bin/yacc/NEW_FEATURES46
-rw-r--r--usr.bin/yacc/NOTES9
-rw-r--r--usr.bin/yacc/README23
-rw-r--r--usr.bin/yacc/closure.c313
-rw-r--r--usr.bin/yacc/defs.h357
-rw-r--r--usr.bin/yacc/error.c389
-rw-r--r--usr.bin/yacc/lalr.c713
-rw-r--r--usr.bin/yacc/lr0.c677
-rw-r--r--usr.bin/yacc/main.c443
-rw-r--r--usr.bin/yacc/mkpar.c416
-rw-r--r--usr.bin/yacc/output.c1352
-rw-r--r--usr.bin/yacc/reader.c1935
-rw-r--r--usr.bin/yacc/skeleton.c427
-rw-r--r--usr.bin/yacc/symtab.c169
-rw-r--r--usr.bin/yacc/test/error.output27
-rw-r--r--usr.bin/yacc/test/error.tab.c317
-rw-r--r--usr.bin/yacc/test/error.tab.h0
-rw-r--r--usr.bin/yacc/test/error.y6
-rw-r--r--usr.bin/yacc/test/ftp.output1625
-rw-r--r--usr.bin/yacc/test/ftp.tab.c1785
-rw-r--r--usr.bin/yacc/test/ftp.tab.h63
-rw-r--r--usr.bin/yacc/test/ftp.y1180
-rw-r--r--usr.bin/yacc/verbose.c394
-rw-r--r--usr.bin/yacc/warshall.c131
-rw-r--r--usr.bin/yacc/yacc.1169
-rw-r--r--usr.bin/yacc/yyfix.1114
-rw-r--r--usr.bin/yacc/yyfix.sh76
-rw-r--r--usr.bin/yes/Makefile6
-rw-r--r--usr.bin/yes/yes.156
-rw-r--r--usr.bin/yes/yes.c62
-rw-r--r--usr.bin/ypcat/Makefile6
-rw-r--r--usr.bin/ypcat/ypcat.174
-rw-r--r--usr.bin/ypcat/ypcat.c142
-rw-r--r--usr.bin/ypmatch/Makefile6
-rw-r--r--usr.bin/ypmatch/ypmatch.175
-rw-r--r--usr.bin/ypmatch/ypmatch.c134
-rw-r--r--usr.bin/ypwhich/Makefile6
-rw-r--r--usr.bin/ypwhich/ypwhich.1103
-rw-r--r--usr.bin/ypwhich/ypwhich.c254
1476 files changed, 0 insertions, 351849 deletions
diff --git a/usr.bin/Makefile b/usr.bin/Makefile
deleted file mode 100644
index 3688533..0000000
--- a/usr.bin/Makefile
+++ /dev/null
@@ -1,386 +0,0 @@
-# From: @(#)Makefile 8.3 (Berkeley) 1/7/94
-# $FreeBSD$
-
-.include <bsd.own.mk>
-
-# XXX MISSING: deroff diction graph learn plot
-# spell spline struct xsend
-# XXX Use GNU versions: apropos bc dc diff grep ld man patch whatis
-# Moved to secure: bdes
-#
-
-SUBDIR= alias \
- apply \
- ${_ar} \
- asa \
- ${_at} \
- ${_atm} \
- awk \
- banner \
- basename \
- ${_biff} \
- ${_bluetooth} \
- brandelf \
- bsdiff \
- bzip2 \
- bzip2recover \
- ${_c89} \
- ${_c99} \
- ${_calendar} \
- cap_mkdb \
- ${_catman} \
- chat \
- ${_checknr} \
- ${_chkey} \
- chpass \
- cksum \
- cmp \
- col \
- ${_colcrt} \
- colldef \
- colrm \
- column \
- comm \
- ${_compile_et} \
- compress \
- ${_cpio} \
- cpuset \
- csplit \
- ${_csup} \
- ${_ctags} \
- cut \
- ${_dig} \
- dirname \
- du \
- ee \
- elf2aout \
- elfdump \
- enigma \
- env \
- expand \
- false \
- fetch \
- file \
- ${_file2c} \
- find \
- finger \
- ${_fmt} \
- fold \
- ${_from} \
- fstat \
- fsync \
- ftp \
- gcore \
- gencat \
- getconf \
- getent \
- getopt \
- ${_gprof} \
- gzip \
- head \
- ${_hesinfo} \
- hexdump \
- ${_host} \
- id \
- ${_indent} \
- ipcrm \
- ipcs \
- join \
- jot \
- kdump \
- keylogin \
- keylogout \
- killall \
- ktrace \
- ktrdump \
- lam \
- last \
- lastcomm \
- ldd \
- leave \
- less \
- lessecho \
- lesskey \
- ${_lex} \
- limits \
- locale \
- ${_locate} \
- lock \
- lockf \
- logger \
- login \
- logins \
- logname \
- look \
- lorder \
- lsvfs \
- m4 \
- ${_mail} \
- ${_make} \
- makewhatis \
- mesg \
- minigzip \
- ministat \
- mkdep \
- mkfifo \
- mklocale \
- ${_mkstr} \
- mktemp \
- mkuzip \
- ${_msgs} \
- mt \
- ${_nc} \
- ncal \
- ${_ncplist} \
- ${_ncplogin} \
- netstat \
- newgrp \
- ${_newkey} \
- nfsstat \
- nice \
- nl \
- nohup \
- ${_nslookup} \
- ${_nsupdate} \
- opieinfo \
- opiekey \
- opiepasswd \
- pagesize \
- passwd \
- paste \
- pathchk \
- pr \
- printenv \
- printf \
- procstat \
- ${_quota} \
- renice \
- rev \
- ${_rlogin} \
- ${_rpcgen} \
- rpcinfo \
- rs \
- ${_rsh} \
- rup \
- ${_ruptime} \
- rusers \
- rwall \
- ${_rwho} \
- script \
- sed \
- shar \
- showmount \
- ${_smbutil} \
- sockstat \
- split \
- stat \
- su \
- systat \
- tabs \
- tail \
- talk \
- tar \
- tcopy \
- tee \
- ${_telnet} \
- tftp \
- time \
- tip \
- top \
- touch \
- tput \
- tr \
- true \
- truncate \
- ${_truss} \
- tset \
- tsort \
- tty \
- ${_ul} \
- uname \
- unexpand \
- ${_unifdef} \
- uniq \
- units \
- unvis \
- ${_usbhidaction} \
- ${_usbhidctl} \
- users \
- uudecode \
- uuencode \
- ${_vacation} \
- ${_vgrind} \
- vi \
- vis \
- vmstat \
- w \
- wall \
- wc \
- what \
- whereis \
- which \
- who \
- whois \
- window \
- write \
- xargs \
- xinstall \
- ${_xlint} \
- ${_xstr} \
- ${_yacc} \
- yes \
- ${_ypcat} \
- ${_ypmatch} \
- ${_ypwhich}
-
-.if ${MACHINE_ARCH} != "arm" && ${MACHINE_ARCH} != "mips"
-_truss= truss
-.endif
-
-# NB: keep these sorted by MK_* knobs
-
-.if ${MK_AT} != "no"
-_at= at
-.endif
-
-.if ${MK_ATM} != "no"
-_atm= atm
-.endif
-
-.if ${MK_MAN} != "no"
-_catman= catman
-.endif
-
-.if ${MK_BIND_UTILS} != "no"
-_dig= dig
-_host= host
-_nslookup= nslookup
-_nsupdate= nsupdate
-.endif
-
-.if ${MK_BLUETOOTH} != "no"
-_bluetooth= bluetooth
-.endif
-
-.if ${MK_BSD_CPIO} != "no"
-_cpio= cpio
-.endif
-
-.if ${MK_CALENDAR} != "no"
-_calendar= calendar
-.endif
-
-.if ${MK_HESIOD} != "no"
-_hesinfo= hesinfo
-.endif
-
-.if ${MK_OPENSSL} != "no"
-_chkey= chkey
-_newkey= newkey
-.if ${MK_LIBTHR} != "no"
-_csup= csup
-.endif
-.endif
-
-.if ${MK_LOCATE} != "no"
-_locate= locate
-.endif
-
-# XXX msgs?
-.if ${MK_MAIL} != "no"
-_biff= biff
-_fmt= fmt
-_from= from
-_mail= mail
-_msgs= msgs
-.endif
-
-.if ${MK_MAKE} != "no"
-_make= make
-.endif
-
-.if ${MK_NETCAT} != "no"
-_nc= nc
-.endif
-
-.if ${MK_NIS} != "no"
-_ypcat= ypcat
-_ypmatch= ypmatch
-_ypwhich= ypwhich
-.endif
-
-.if ${MK_QUOTAS} != "no"
-_quota= quota
-.endif
-
-.if ${MK_RCMDS} != "no"
-_rlogin= rlogin
-_rsh= rsh
-_ruptime= ruptime
-_rwho= rwho
-.endif
-
-.if ${MK_SENDMAIL} != "no"
-_vacation= vacation
-.endif
-
-.if ${MK_TELNET} != "no"
-_telnet= telnet
-.endif
-
-.if ${MK_TEXTPROC} != "no"
-_checknr= checknr
-_colcrt= colcrt
-_ul= ul
-.endif
-
-.if ${MK_TOOLCHAIN} != "no"
-_ar= ar
-_c89= c89
-_c99= c99
-_compile_et= compile_et
-_ctags= ctags
-_file2c= file2c
-_gprof= gprof
-_indent= indent
-_lex= lex
-_mkstr= mkstr
-_rpcgen= rpcgen
-_unifdef= unifdef
-_xlint= xlint
-_xstr= xstr
-# XXX maybe under textproc?
-_vgrind= vgrind
-_yacc= yacc
-.endif
-
-.if ${MK_USB} != "no"
-_usbhidaction= usbhidaction
-_usbhidctl= usbhidctl
-.endif
-
-.if ${MACHINE_ARCH} == "i386"
-.if ${MK_NCP} != "no"
-_ncplist= ncplist
-_ncplogin= ncplogin
-.endif
-_smbutil= smbutil
-.endif
-
-.if ${MACHINE_ARCH} == "ia64"
-_smbutil= smbutil
-.endif
-
-.if ${MACHINE_ARCH} == "amd64"
-.if ${MK_NCP} != "no"
-_ncplist= ncplist
-_ncplogin= ncplogin
-.endif
-_smbutil= smbutil
-.endif
-
-.if ${MACHINE_ARCH} == "powerpc"
-_smbutil= smbutil
-.endif
-
-.include <bsd.subdir.mk>
diff --git a/usr.bin/Makefile.inc b/usr.bin/Makefile.inc
deleted file mode 100644
index 2ee98c3..0000000
--- a/usr.bin/Makefile.inc
+++ /dev/null
@@ -1,8 +0,0 @@
-# @(#)Makefile.inc 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-BINDIR?= /usr/bin
-
-# Commented out for the time being.
-# I intend to make this default at some stage.
-#WARNS?= 2
diff --git a/usr.bin/alias/Makefile b/usr.bin/alias/Makefile
deleted file mode 100644
index 53df717..0000000
--- a/usr.bin/alias/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
-# $FreeBSD$
-
-SCRIPTS=generic.sh
-SCRIPTSNAME=alias
-NO_OBJ=
-
-LINKS= ${BINDIR}/alias ${BINDIR}/bg \
- ${BINDIR}/alias ${BINDIR}/cd \
- ${BINDIR}/alias ${BINDIR}/command \
- ${BINDIR}/alias ${BINDIR}/fc \
- ${BINDIR}/alias ${BINDIR}/fg \
- ${BINDIR}/alias ${BINDIR}/getopts \
- ${BINDIR}/alias ${BINDIR}/jobs \
- ${BINDIR}/alias ${BINDIR}/read \
- ${BINDIR}/alias ${BINDIR}/umask \
- ${BINDIR}/alias ${BINDIR}/unalias \
- ${BINDIR}/alias ${BINDIR}/wait
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/alias/generic.sh b/usr.bin/alias/generic.sh
deleted file mode 100644
index d9c3127..0000000
--- a/usr.bin/alias/generic.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-# $FreeBSD$
-# This file is in the public domain.
-builtin ${0##*/} ${1+"$@"}
diff --git a/usr.bin/apply/Makefile b/usr.bin/apply/Makefile
deleted file mode 100644
index 0355588..0000000
--- a/usr.bin/apply/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= apply
-WARNS?= 4
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/apply/apply.1 b/usr.bin/apply/apply.1
deleted file mode 100644
index 60ba84f..0000000
--- a/usr.bin/apply/apply.1
+++ /dev/null
@@ -1,144 +0,0 @@
-.\" Copyright (c) 1983, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)apply.1 8.2 (Berkeley) 4/4/94
-.\" $FreeBSD$
-.\"
-.Dd December 13, 2006
-.Dt APPLY 1
-.Os
-.Sh NAME
-.Nm apply
-.Nd apply a command to a set of arguments
-.Sh SYNOPSIS
-.Nm
-.Op Fl a Ar c
-.Op Fl d
-.Op Fl #
-.Ar command argument ...
-.Sh DESCRIPTION
-The
-.Nm
-utility runs the named
-.Ar command
-on each
-argument
-.Ar argument
-in turn.
-.Pp
-Character sequences of the form
-.Dq Li \&%d
-in
-.Ar command ,
-where
-.Sq Li d
-is a digit from 1 to 9, are replaced by the
-.Li d Ns \'th
-following unused
-.Ar argument .
-In this case, the largest digit number of arguments are discarded for
-each execution of
-.Ar command .
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl #
-Normally arguments are taken singly; the optional number
-.Fl #
-specifies the number of arguments to be passed to
-.Ar command .
-If the number is zero,
-.Ar command
-is run, without arguments, once for each
-.Ar argument .
-.Pp
-If any sequences of
-.Dq Li \&%d
-occur in
-.Ar command ,
-the
-.Fl #
-option is ignored.
-.It Fl a Ar c
-The use of the character
-.Sq Li %
-as a magic character may be changed with the
-.Fl a
-option.
-.It Fl d
-Display the commands that would have been executed, but do not actually
-execute them.
-.El
-.Sh ENVIRONMENT
-The following environment variable affects the execution of
-.Nm :
-.Bl -tag -width SHELL
-.It Ev SHELL
-Pathname of shell to use.
-If this variable is not defined, the Bourne shell is used.
-.El
-.Sh FILES
-.Bl -tag -width /bin/sh -compact
-.It Pa /bin/sh
-default shell
-.El
-.Sh EXAMPLES
-.Bl -tag -width apply -compact
-.It Li "apply echo *"
-is similar to
-.Xr ls 1 ;
-.It Li "apply \-2 cmp a1 b1 a2 b2 a3 b3"
-compares the `a' files to the `b' files;
-.It Li "apply \-0 who 1 2 3 4 5"
-runs
-.Xr who 1
-5 times; and
-.It Li "apply \'ln %1 /usr/joe\'" *
-links all files in the current directory to the directory
-.Pa /usr/joe .
-.El
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.2 .
-.Sh AUTHORS
-.An Rob Pike
-.Sh BUGS
-Shell metacharacters in
-.Ar command
-may have bizarre effects; it is best to enclose complicated
-commands in single quotes
-.Pq '' .
-.Pp
-The
-.Nm
-utility does not recognize multibyte characters.
diff --git a/usr.bin/apply/apply.c b/usr.bin/apply/apply.c
deleted file mode 100644
index 25ba374..0000000
--- a/usr.bin/apply/apply.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/*-
- * Copyright (c) 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)apply.c 8.4 (Berkeley) 4/4/94";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/wait.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <paths.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#define EXEC "exec "
-
-static int exec_shell(const char *, char *, char *);
-static void usage(void);
-
-int
-main(int argc, char *argv[]) {
- int ch, debug, i, magic, n, nargs, offset, rval;
- size_t clen, cmdsize, l;
- char *c, *cmd, *name, *p, *q, *shell, *slashp, *tmpshell;
-
- debug = 0;
- magic = '%'; /* Default magic char is `%'. */
- nargs = -1;
- while ((ch = getopt(argc, argv, "a:d0123456789")) != -1)
- switch (ch) {
- case 'a':
- if (optarg[1] != '\0')
- errx(1,
- "illegal magic character specification");
- magic = optarg[0];
- break;
- case 'd':
- debug = 1;
- break;
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- if (nargs != -1)
- errx(1,
- "only one -# argument may be specified");
- nargs = optopt - '0';
- break;
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (argc < 2)
- usage();
-
- /*
- * The command to run is argv[0], and the args are argv[1..].
- * Look for %digit references in the command, remembering the
- * largest one.
- */
- for (n = 0, p = argv[0]; *p != '\0'; ++p)
- if (p[0] == magic && isdigit(p[1]) && p[1] != '0') {
- ++p;
- if (p[0] - '0' > n)
- n = p[0] - '0';
- }
-
- /*
- * Figure out the shell and name arguments to pass to execl()
- * in exec_shell(). Always malloc() shell and just set name
- * to point at the last part of shell if there are any backslashes,
- * otherwise just set it to point at the space malloc()'d. If
- * SHELL environment variable exists, replace contents of
- * shell with it.
- */
- shell = name = NULL;
- tmpshell = getenv("SHELL");
- shell = (tmpshell != NULL) ? strdup(tmpshell) : strdup(_PATH_BSHELL);
- if (shell == NULL)
- err(1, "strdup() failed");
- slashp = strrchr(shell, '/');
- name = (slashp != NULL) ? slashp + 1 : shell;
-
- /*
- * If there were any %digit references, then use those, otherwise
- * build a new command string with sufficient %digit references at
- * the end to consume (nargs) arguments each time round the loop.
- * Allocate enough space to hold the maximum command. Save the
- * size to pass to snprintf().
- */
- cmdsize = sizeof(EXEC) - 1 + strlen(argv[0])
- + 9 * (sizeof(" %1") - 1) + 1;
- if ((cmd = malloc(cmdsize)) == NULL)
- err(1, NULL);
-
- if (n == 0) {
- /* If nargs not set, default to a single argument. */
- if (nargs == -1)
- nargs = 1;
-
- p = cmd;
- offset = snprintf(cmd, cmdsize, EXEC "%s", argv[0]);
- if ((size_t)offset >= cmdsize)
- err(1, "snprintf() failed");
- p += offset;
- cmdsize -= offset;
- for (i = 1; i <= nargs; i++) {
- offset = snprintf(p, cmdsize, " %c%d", magic, i);
- if ((size_t)offset >= cmdsize)
- err(1, "snprintf() failed");
- p += offset;
- cmdsize -= offset;
- }
-
- /*
- * If nargs set to the special value 0, eat a single
- * argument for each command execution.
- */
- if (nargs == 0)
- nargs = 1;
- } else {
- offset = snprintf(cmd, cmdsize, EXEC "%s", argv[0]);
- if ((size_t)offset >= cmdsize)
- err(1, "snprintf() failed");
- nargs = n;
- }
-
- /*
- * Grab some space in which to build the command. Allocate
- * as necessary later, but no reason to build it up slowly
- * for the normal case.
- */
- if ((c = malloc(clen = 1024)) == NULL)
- err(1, NULL);
-
- /*
- * (argc) and (argv) are still offset by one to make it simpler to
- * expand %digit references. At the end of the loop check for (argc)
- * equals 1 means that all the (argv) has been consumed.
- */
- for (rval = 0; argc > nargs; argc -= nargs, argv += nargs) {
- /*
- * Find a max value for the command length, and ensure
- * there's enough space to build it.
- */
- for (l = strlen(cmd), i = 0; i < nargs; i++)
- l += strlen(argv[i+1]);
- if (l > clen && (c = realloc(c, clen = l)) == NULL)
- err(1, NULL);
-
- /* Expand command argv references. */
- for (p = cmd, q = c; *p != '\0'; ++p)
- if (p[0] == magic && isdigit(p[1]) && p[1] != '0') {
- offset = snprintf(q, l, "%s",
- argv[(++p)[0] - '0']);
- if ((size_t)offset >= l)
- err(1, "snprintf() failed");
- q += offset;
- l -= offset;
- } else
- *q++ = *p;
-
- /* Terminate the command string. */
- *q = '\0';
-
- /* Run the command. */
- if (debug)
- (void)printf("%s\n", c);
- else
- if (exec_shell(c, shell, name))
- rval = 1;
- }
-
- if (argc != 1)
- errx(1, "expecting additional argument%s after \"%s\"",
- (nargs - argc) ? "s" : "", argv[argc - 1]);
- free(cmd);
- free(c);
- free(shell);
- exit(rval);
-}
-
-/*
- * exec_shell --
- * Execute a shell command using passed use_shell and use_name
- * arguments.
- */
-static int
-exec_shell(const char *command, char *use_shell, char *use_name)
-{
- pid_t pid;
- int omask, pstat;
- sig_t intsave, quitsave;
-
- if (!command) /* just checking... */
- return(1);
-
- omask = sigblock(sigmask(SIGCHLD));
- switch(pid = vfork()) {
- case -1: /* error */
- err(1, "vfork");
- case 0: /* child */
- (void)sigsetmask(omask);
- execl(use_shell, use_name, "-c", command, (char *)NULL);
- warn("%s", use_shell);
- _exit(1);
- }
- intsave = signal(SIGINT, SIG_IGN);
- quitsave = signal(SIGQUIT, SIG_IGN);
- pid = waitpid(pid, &pstat, 0);
- (void)sigsetmask(omask);
- (void)signal(SIGINT, intsave);
- (void)signal(SIGQUIT, quitsave);
- return(pid == -1 ? -1 : pstat);
-}
-
-void
-usage(void)
-{
-
- (void)fprintf(stderr,
- "usage: apply [-a magic] [-d] [-0123456789] command arguments ...\n");
- exit(1);
-}
diff --git a/usr.bin/ar/Makefile b/usr.bin/ar/Makefile
deleted file mode 100644
index 533f931..0000000
--- a/usr.bin/ar/Makefile
+++ /dev/null
@@ -1,17 +0,0 @@
-# $FreeBSD$
-
-PROG= ar
-SRCS= ar.c acplex.l acpyacc.y read.c util.c write.c y.tab.h
-
-WARNS?= 5
-
-DPADD= ${LIBARCHIVE} ${LIBBZ2} ${LIBZ} ${LIBELF}
-LDADD= -larchive -lbz2 -lz -lelf
-
-CFLAGS+=-I. -I${.CURDIR}
-
-NO_SHARED?= yes
-LINKS= ${BINDIR}/ar ${BINDIR}/ranlib
-MLINKS= ar.1 ranlib.1
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ar/acplex.l b/usr.bin/ar/acplex.l
deleted file mode 100644
index 3186d17..0000000
--- a/usr.bin/ar/acplex.l
+++ /dev/null
@@ -1,78 +0,0 @@
-%{
-/*-
- * Copyright (c) 2008 Kai Wang
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <sysexits.h>
-
-#include "y.tab.h"
-
-#define YY_NO_UNPUT
-int lineno = 1;
-
-int yylex(void);
-
-%}
-
-%option noyywrap
-
-%%
-
-ADDLIB|addlib { return (ADDLIB); }
-ADDMOD|addmod { return (ADDMOD); }
-CLEAR|clear { return (CLEAR); }
-CREATE|create { return (CREATE); }
-DELETE|delete { return (DELETE); }
-DIRECTORY|directory { return (DIRECTORY); }
-END|end { return (END); }
-EXTRACT|extract { return (EXTRACT); }
-LIST|list { return (LIST); }
-OPEN|open { return (OPEN); }
-REPLACE|replace { return (REPLACE); }
-VERBOSE|verbose { return (VERBOSE); }
-SAVE|save { return (SAVE); }
-"(" { return (LP); }
-")" { return (RP); }
-"," { return (COMMA); }
-
-[-_A-Za-z0-9/:$.\\]+ {
- yylval.str = strdup(yytext);
- if (yylval.str == NULL)
- errc(EX_SOFTWARE, errno, "strdup failed");
- return (FNAME);
-}
-
-[ \t] /* whitespace */
-"*".* /* comment */
-";".* /* comment */
-"+\n" { lineno++; /* '+' is line continuation char */ }
-"\n" { lineno++; return (EOL); }
diff --git a/usr.bin/ar/acpyacc.y b/usr.bin/ar/acpyacc.y
deleted file mode 100644
index bc25b62..0000000
--- a/usr.bin/ar/acpyacc.y
+++ /dev/null
@@ -1,662 +0,0 @@
-%{
-/*-
- * Copyright (c) 2008 Kai Wang
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/stat.h>
-#include <archive.h>
-#include <archive_entry.h>
-#include <dirent.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysexits.h>
-#include <unistd.h>
-
-#include "ar.h"
-
-#define TEMPLATE "arscp.XXXXXXXX"
-
-struct list {
- char *str;
- struct list *next;
-};
-
-
-extern int yylex(void);
-extern int yyparse(void);
-
-static void yyerror(const char *);
-static void arscp_addlib(char *archive, struct list *list);
-static void arscp_addmod(struct list *list);
-static void arscp_clear(void);
-static int arscp_copy(int ifd, int ofd);
-static void arscp_create(char *in, char *out);
-static void arscp_delete(struct list *list);
-static void arscp_dir(char *archive, struct list *list, char *rlt);
-static void arscp_end(int eval);
-static void arscp_extract(struct list *list);
-static void arscp_free_argv(void);
-static void arscp_free_mlist(struct list *list);
-static void arscp_list(void);
-static struct list *arscp_mlist(struct list *list, char *str);
-static void arscp_mlist2argv(struct list *list);
-static int arscp_mlist_len(struct list *list);
-static void arscp_open(char *fname);
-static void arscp_prompt(void);
-static void arscp_replace(struct list *list);
-static void arscp_save(void);
-static int arscp_target_exist(void);
-
-extern int lineno;
-
-static struct bsdar *bsdar;
-static char *target;
-static char *tmpac;
-static int interactive;
-static int verbose;
-
-%}
-
-%token ADDLIB
-%token ADDMOD
-%token CLEAR
-%token CREATE
-%token DELETE
-%token DIRECTORY
-%token END
-%token EXTRACT
-%token LIST
-%token OPEN
-%token REPLACE
-%token VERBOSE
-%token SAVE
-%token LP
-%token RP
-%token COMMA
-%token EOL
-%token <str> FNAME
-%type <list> mod_list
-
-%union {
- char *str;
- struct list *list;
-}
-
-%%
-
-begin
- : { arscp_prompt(); } ar_script
- ;
-
-ar_script
- : cmd_list
- |
- ;
-
-mod_list
- : FNAME { $$ = arscp_mlist(NULL, $1); }
- | mod_list separator FNAME { $$ = arscp_mlist($1, $3); }
- ;
-
-separator
- : COMMA
- |
- ;
-
-cmd_list
- : rawcmd
- | cmd_list rawcmd
- ;
-
-rawcmd
- : cmd EOL { arscp_prompt(); }
- ;
-
-cmd
- : addlib_cmd
- | addmod_cmd
- | clear_cmd
- | create_cmd
- | delete_cmd
- | directory_cmd
- | end_cmd
- | extract_cmd
- | list_cmd
- | open_cmd
- | replace_cmd
- | verbose_cmd
- | save_cmd
- | invalid_cmd
- | empty_cmd
- | error
- ;
-
-addlib_cmd
- : ADDLIB FNAME LP mod_list RP { arscp_addlib($2, $4); }
- | ADDLIB FNAME { arscp_addlib($2, NULL); }
- ;
-
-addmod_cmd
- : ADDMOD mod_list { arscp_addmod($2); }
- ;
-
-clear_cmd
- : CLEAR { arscp_clear(); }
- ;
-
-create_cmd
- : CREATE FNAME { arscp_create(NULL, $2); }
- ;
-
-delete_cmd
- : DELETE mod_list { arscp_delete($2); }
- ;
-
-directory_cmd
- : DIRECTORY FNAME { arscp_dir($2, NULL, NULL); }
- | DIRECTORY FNAME LP mod_list RP { arscp_dir($2, $4, NULL); }
- | DIRECTORY FNAME LP mod_list RP FNAME { arscp_dir($2, $4, $6); }
- ;
-
-end_cmd
- : END { arscp_end(EX_OK); }
- ;
-
-extract_cmd
- : EXTRACT mod_list { arscp_extract($2); }
- ;
-
-list_cmd
- : LIST { arscp_list(); }
- ;
-
-open_cmd
- : OPEN FNAME { arscp_open($2); }
- ;
-
-replace_cmd
- : REPLACE mod_list { arscp_replace($2); }
- ;
-
-save_cmd
- : SAVE { arscp_save(); }
- ;
-
-verbose_cmd
- : VERBOSE { verbose = !verbose; }
- ;
-
-empty_cmd
- :
- ;
-
-invalid_cmd
- : FNAME { yyerror(NULL); }
- ;
-
-%%
-
-/* ARGSUSED */
-static void
-yyerror(const char *s)
-{
-
- (void) s;
- printf("Syntax error in archive script, line %d\n", lineno);
-}
-
-/*
- * arscp_open first open an archive and check its validity. If the archive
- * format is valid, it calls arscp_create to create a temporary copy of
- * the archive.
- */
-static void
-arscp_open(char *fname)
-{
- struct archive *a;
- struct archive_entry *entry;
- int r;
-
- if ((a = archive_read_new()) == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, 0, "archive_read_new failed");
- archive_read_support_compression_all(a);
- archive_read_support_format_all(a);
- AC(archive_read_open_file(a, fname, DEF_BLKSZ));
- if ((r = archive_read_next_header(a, &entry)))
- bsdar_warnc(bsdar, 0, "%s", archive_error_string(a));
- AC(archive_read_close(a));
- AC(archive_read_finish(a));
- if (r != ARCHIVE_OK)
- return;
- arscp_create(fname, fname);
-}
-
-/*
- * Create archive. in != NULL indicate it's a OPEN cmd, and resulting
- * archive is based on modification of an existing one. If in == NULL,
- * we are in CREATE cmd and a new empty archive will be created.
- */
-static void
-arscp_create(char *in, char *out)
-{
- struct archive *a;
- int ifd, ofd;
-
- /* Delete previously created temporary archive, if any. */
- if (tmpac) {
- if (unlink(tmpac) < 0)
- bsdar_errc(bsdar, EX_IOERR, errno, "unlink failed");
- free(tmpac);
- }
-
- tmpac = strdup(TEMPLATE);
- if (tmpac == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "strdup failed");
- if ((ofd = mkstemp(tmpac)) < 0)
- bsdar_errc(bsdar, EX_IOERR, errno, "mkstemp failed");
-
- if (in) {
- /*
- * Command OPEN creates a temporary copy of the
- * input archive.
- */
- if ((ifd = open(in, O_RDONLY)) < 0) {
- bsdar_warnc(bsdar, errno, "open failed");
- return;
- }
- if (arscp_copy(ifd, ofd)) {
- bsdar_warnc(bsdar, 0, "arscp_copy failed");
- return;
- }
- close(ifd);
- close(ofd);
- } else {
- /*
- * Command CREATE creates an "empty" archive.
- * (archive with only global header)
- */
- if ((a = archive_write_new()) == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, 0,
- "archive_write_new failed");
- archive_write_set_format_ar_svr4(a);
- AC(archive_write_open_fd(a, ofd));
- AC(archive_write_close(a));
- AC(archive_write_finish(a));
- }
-
- /* Override previous target, if any. */
- if (target)
- free(target);
-
- target = out;
- bsdar->filename = tmpac;
-}
-
-/* A file copying implementation using mmap. */
-static int
-arscp_copy(int ifd, int ofd)
-{
- struct stat sb;
- char *buf, *p;
- ssize_t w;
- size_t bytes;
-
- if (fstat(ifd, &sb) < 0) {
- bsdar_warnc(bsdar, errno, "fstate failed");
- return (1);
- }
- if ((p = mmap(NULL, sb.st_size, PROT_READ, MAP_SHARED, ifd,
- (off_t)0)) == MAP_FAILED) {
- bsdar_warnc(bsdar, errno, "mmap failed");
- return (1);
- }
- for (buf = p, bytes = sb.st_size; bytes > 0; bytes -= w) {
- w = write(ofd, buf, bytes);
- if (w <= 0) {
- bsdar_warnc(bsdar, errno, "write failed");
- break;
- }
- }
- if (munmap(p, sb.st_size) < 0)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "munmap failed");
- if (bytes > 0)
- return (1);
-
- return (0);
-}
-
-/*
- * Add all modules of archive to current archive, if list != NULL,
- * only those modules speicifed in 'list' will be added.
- */
-static void
-arscp_addlib(char *archive, struct list *list)
-{
-
- if (!arscp_target_exist())
- return;
- arscp_mlist2argv(list);
- bsdar->addlib = archive;
- ar_mode_A(bsdar);
- arscp_free_argv();
- arscp_free_mlist(list);
-}
-
-/* Add modules into current archive. */
-static void
-arscp_addmod(struct list *list)
-{
-
- if (!arscp_target_exist())
- return;
- arscp_mlist2argv(list);
- ar_mode_q(bsdar);
- arscp_free_argv();
- arscp_free_mlist(list);
-}
-
-/* Delete modules from current archive. */
-static void
-arscp_delete(struct list *list)
-{
-
- if (!arscp_target_exist())
- return;
- arscp_mlist2argv(list);
- ar_mode_d(bsdar);
- arscp_free_argv();
- arscp_free_mlist(list);
-}
-
-/* Extract modules from current archive. */
-static void
-arscp_extract(struct list *list)
-{
-
- if (!arscp_target_exist())
- return;
- arscp_mlist2argv(list);
- ar_mode_x(bsdar);
- arscp_free_argv();
- arscp_free_mlist(list);
-}
-
-/* List modules of archive. (Simple Mode) */
-static void
-arscp_list()
-{
-
- if (!arscp_target_exist())
- return;
- bsdar->argc = 0;
- bsdar->argv = NULL;
- /* Always verbose. */
- bsdar->options |= AR_V;
- ar_mode_t(bsdar);
- bsdar->options &= ~AR_V;
-}
-
-/* List modules of archive. (Advance Mode) */
-static void
-arscp_dir(char *archive, struct list *list, char *rlt)
-{
- FILE *out;
-
- /* If rlt != NULL, redirect output to it */
- out = NULL;
- if (rlt) {
- out = stdout;
- if ((stdout = fopen(rlt, "w")) == NULL)
- bsdar_errc(bsdar, EX_IOERR, errno,
- "fopen %s failed", rlt);
- }
-
- bsdar->filename = archive;
- if (list)
- arscp_mlist2argv(list);
- else {
- bsdar->argc = 0;
- bsdar->argv = NULL;
- }
- if (verbose)
- bsdar->options |= AR_V;
- ar_mode_t(bsdar);
- bsdar->options &= ~AR_V;
-
- if (rlt) {
- if (fclose(stdout) == EOF)
- bsdar_errc(bsdar, EX_IOERR, errno,
- "fclose %s failed", rlt);
- stdout = out;
- free(rlt);
- }
- free(archive);
- bsdar->filename = tmpac;
- arscp_free_argv();
- arscp_free_mlist(list);
-}
-
-
-/* Replace modules of current archive. */
-static void
-arscp_replace(struct list *list)
-{
-
- if (!arscp_target_exist())
- return;
- arscp_mlist2argv(list);
- ar_mode_r(bsdar);
- arscp_free_argv();
- arscp_free_mlist(list);
-}
-
-/* Rename the temporary archive to the target archive. */
-static void
-arscp_save()
-{
- mode_t mask;
-
- if (target) {
- if (rename(tmpac, target) < 0)
- bsdar_errc(bsdar, EX_IOERR, errno, "rename failed");
- /*
- * mkstemp creates temp files with mode 0600, here we
- * set target archive mode per process umask.
- */
- mask = umask(0);
- umask(mask);
- if (chmod(target, 0666 & ~mask) < 0)
- bsdar_errc(bsdar, EX_IOERR, errno, "chmod failed");
- free(tmpac);
- free(target);
- tmpac = NULL;
- target= NULL;
- bsdar->filename = NULL;
- } else
- bsdar_warnc(bsdar, 0, "no open output archive");
-}
-
-/*
- * Discard all the contents of current archive. This is achieved by
- * invoking CREATE cmd on current archive.
- */
-static void
-arscp_clear()
-{
- char *new_target;
-
- if (target) {
- new_target = strdup(target);
- if (new_target == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "strdup failed");
- arscp_create(NULL, new_target);
- }
-}
-
-/*
- * Quit ar(1). Note that END cmd will not SAVE current archive
- * before exit.
- */
-static void
-arscp_end(int eval)
-{
-
- if (target)
- free(target);
- if (tmpac) {
- if (unlink(tmpac) == -1)
- bsdar_errc(bsdar, EX_IOERR, errno, "unlink %s failed",
- tmpac);
- free(tmpac);
- }
-
- exit(eval);
-}
-
-/*
- * Check if target spcified, i.e, whether OPEN or CREATE has been
- * issued by user.
- */
-static int
-arscp_target_exist()
-{
-
- if (target)
- return (1);
-
- bsdar_warnc(bsdar, 0, "no open output archive");
- return (0);
-}
-
-/* Construct module list. */
-static struct list *
-arscp_mlist(struct list *list, char *str)
-{
- struct list *l;
-
- l = malloc(sizeof(*l));
- if (l == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "malloc failed");
- l->str = str;
- l->next = list;
-
- return (l);
-}
-
-/* Calculate the length of a mlist. */
-static int
-arscp_mlist_len(struct list *list)
-{
- int len;
-
- for(len = 0; list; list = list->next)
- len++;
-
- return (len);
-}
-
-/* Free the space allocated for mod_list. */
-static void
-arscp_free_mlist(struct list *list)
-{
- struct list *l;
-
- /* Note that list->str was freed in arscp_free_argv. */
- for(; list; list = l) {
- l = list->next;
- free(list);
- }
-}
-
-/* Convert mlist to argv array. */
-static void
-arscp_mlist2argv(struct list *list)
-{
- char **argv;
- int i, n;
-
- n = arscp_mlist_len(list);
- argv = malloc(n * sizeof(*argv));
- if (argv == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "malloc failed");
-
- /* Note that module names are stored in reverse order in mlist. */
- for(i = n - 1; i >= 0; i--, list = list->next) {
- if (list == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "invalid mlist");
- argv[i] = list->str;
- }
-
- bsdar->argc = n;
- bsdar->argv = argv;
-}
-
-/* Free space allocated for argv array and its elements. */
-static void
-arscp_free_argv()
-{
- int i;
-
- for(i = 0; i < bsdar->argc; i++)
- free(bsdar->argv[i]);
-
- free(bsdar->argv);
-}
-
-/* Show a prompt if we are in interactive mode */
-static void
-arscp_prompt()
-{
-
- if (interactive) {
- printf("AR >");
- fflush(stdout);
- }
-}
-
-/* Main function for ar script mode. */
-void
-ar_mode_script(struct bsdar *ar)
-{
-
- bsdar = ar;
- interactive = isatty(fileno(stdin));
- while(yyparse()) {
- if (!interactive)
- arscp_end(1);
- }
-
- /* Script ends without END */
- arscp_end(EX_OK);
-}
diff --git a/usr.bin/ar/ar.1 b/usr.bin/ar/ar.1
deleted file mode 100644
index cb9414e..0000000
--- a/usr.bin/ar/ar.1
+++ /dev/null
@@ -1,406 +0,0 @@
-.\" Copyright (c) 2007 Joseph Koshy. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" This software is provided by Joseph Koshy ``as is'' and
-.\" any express or implied warranties, including, but not limited to, the
-.\" implied warranties of merchantability and fitness for a particular purpose
-.\" are disclaimed. in no event shall Joseph Koshy be liable
-.\" for any direct, indirect, incidental, special, exemplary, or consequential
-.\" damages (including, but not limited to, procurement of substitute goods
-.\" or services; loss of use, data, or profits; or business interruption)
-.\" however caused and on any theory of liability, whether in contract, strict
-.\" liability, or tort (including negligence or otherwise) arising in any way
-.\" out of the use of this software, even if advised of the possibility of
-.\" such damage.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd August 31, 2007
-.Os
-.Dt AR 1
-.Sh NAME
-.Nm ar ,
-.Nm ranlib
-.Nd manage archives
-.Sh SYNOPSIS
-.Nm
-.Fl d
-.Op Fl T
-.Op Fl j
-.Op Fl v
-.Op Fl z
-.Ar archive
-.Ar files ...
-.Nm
-.Fl m
-.Op Fl T
-.Op Fl a Ar position-after
-.Op Fl b Ar position-before
-.Op Fl i Ar position-before
-.Op Fl j
-.Op Fl s
-.Op Fl z
-.Ar archive
-.Ar files ...
-.Nm
-.Fl p
-.Op Fl T
-.Op Fl v
-.Ar archive
-.Op Ar files ...
-.Nm
-.Fl r
-.Op Fl T
-.Op Fl a Ar position-after
-.Op Fl b Ar position-before
-.Op Fl c
-.Op Fl i Ar position-before
-.Op Fl j
-.Op Fl s
-.Op Fl u
-.Op Fl v
-.Op Fl z
-.Ar archive
-.Ar files ...
-.Nm
-.Fl s
-.Op Fl j
-.Op Fl z
-.Ar archive
-.Nm
-.Fl t
-.Op Fl T
-.Op Fl v
-.Ar archive
-.Op Ar files ...
-.Nm
-.Fl x
-.Op Fl C
-.Op Fl T
-.Op Fl o
-.Op Fl u
-.Op Fl v
-.Ar archive
-.Op Ar files ...
-.Nm ranlib
-.Ar archive ...
-.Sh DESCRIPTION
-The
-.Nm
-utility creates and maintains groups of files combined into an
-archive.
-Once an archive has been created, new files can be added to it, and
-existing files can be extracted, deleted or replaced.
-.Pp
-Files are named in the archive by their last file name component,
-so if a file referenced by a path containing a
-.Dq /
-is archived, it will be named by the last component of the path.
-Similarly when matching paths listed on the command line against
-file names stored in the archive, only the last component of the
-path will be compared.
-.Pp
-The normal use of
-.Nm
-is for the creation and maintenance of libraries suitable for use
-with the link editor
-.Xr ld 1 ,
-although it is not restricted to this purpose.
-The
-.Nm
-utility can create and manage an archive symbol table (see
-.Xr ar 5 )
-used to speed up link editing operations.
-If a symbol table is present in an archive, it will be
-kept up-to-date by subsequent operations on the archive (excepting
-the quick update specified by the
-.Fl q
-option).
-.Pp
-The
-.Nm ranlib
-utility is used to add an archive symbol table
-to an existing archive.
-.Sh OPTIONS
-The
-.Nm
-utility supports the following options:
-.Bl -tag -width indent
-.It Fl a Ar member-after
-When used with option
-.Fl m
-this option specifies that the archive members specified by
-arguments
-.Ar files ...
-are moved to after the archive member named by argument
-.Ar member-after .
-When used with option
-.Fl r
-this option specifies that the files specified by arguments
-.Ar files ...
-are added after the archive member named by argument
-.Ar member-after .
-.It Fl b Ar member-before
-When used with option
-.Fl m
-this option specifies that the archive members specified by
-arguments
-.Ar files ...
-are moved to before the archive member named by argument
-.Ar member-before .
-When used with option
-.Fl r
-this option specifies that the files specified by arguments
-.Ar files ...
-are added before the archive member named by argument
-.Ar member-before .
-.It Fl c
-Suppress the informational message printed when a new archive is
-created using the
-.Fl r
-and
-.Fl q
-options.
-.It Fl C
-Prevent extracted files from replacing like-named files
-in the file system.
-.It Fl d
-Delete the members named by arguments
-.Ar files ...
-from the archive specified by argument
-.Ar archive .
-The archive's symbol table, if present, is updated to reflect
-the new contents of the archive.
-.It Fl f
-Synonymous with option
-.Fl T .
-.It Fl i Ar member-before
-Synonymous with option
-.Fl b .
-.It Fl j
-Compress the resulting archive with
-.Xr bzip2 1 .
-.It Fl m
-Move archive members specified by arguments
-.Ar files ...
-within the archive.
-If a position has been specified by one of the
-.Fl a ,
-.Fl b
-or
-.Fl i
-options, the members are moved to before or after the specified
-position.
-If no position has been specified, the specified members are moved
-to the end of the archive.
-If the archive has a symbol table, it is updated to reflect the
-new contents of the archive.
-.It Fl o
-Preserve the original modification times of members when extracting
-them.
-.It Fl p
-Write the contents of the specified archive members named by
-arguments
-.Ar files ...
-to standard output.
-If no members were specified, the contents of all the files in the
-archive are written in the order they appear in the archive.
-.It Fl q
-Append the files specified by arguments
-.Ar files ...
-to the archive specified by argument
-.Ar archive
-without checking if the files already exist in the archive and
-without updating the archive's symbol table.
-If the archive file
-.Ar archive
-does not already exist, a new archive is created.
-However, to be compatible with GNU
-.Nm ,
-option
-.Fl q
-will update the archive's symbol table.
-.It Fl r
-Replace (add) the files specified by arguments
-.Ar files ...
-in the archive specified by argument
-.Ar archive ,
-creating the archive if necessary.
-Files that replace existing files do not change the order of files
-within the archive.
-If a file named in arguments
-.Ar files ...
-does not exist, existing members in the archive that match that
-name are not changed.
-New files are added to the end of the archive unless one of the
-positioning options
-.Fl a ,
-.Fl b
-or
-.Fl i
-is specified.
-The archive symbol table, if it exists, is updated to reflect the
-new state of the archive.
-.It Fl s
-Add an archive symbol table (see
-.Xr ar 5 )
-to the archive specified by argument
-.Ar archive .
-Invoking
-.Nm
-with the
-.Fl s
-option alone is equivalent to invoking
-.Nm ranlib .
-.It Fl t
-List the files specified by arguments
-.Ar files ...
-in the order in which they appear in the archive, one per line.
-If no files are specified, all files in the archive are listed.
-.It Fl T
-Use only the first fifteen characters of the archive member name or
-command line file name argument when naming archive members.
-.It Fl u
-Conditionally update the archive or extract members.
-When used with the
-.Fl r
-option, files named by arguments
-.Ar files ...
-will be replaced in the archive if they are newer than their
-archived versions.
-When used with the
-.Fl x
-option, the members specified by arguments
-.Ar files ...
-will be extracted only if they are newer than the corresponding
-files in the file system.
-.It Fl v
-Provide verbose output.
-When used with the
-.Fl d ,
-.Fl m ,
-.Fl q
-or
-.Fl x
-options,
-.Nm
-gives a file-by-file description of the archive modification being
-performed, which consists of three white-space seperated fields:
-the option letter, a dash
-.Dq "-" ,
-and the file name.
-When used with the
-.Fl r
-option,
-.Nm
-displays the description as above, but the initial letter is an
-.Dq a
-if the file is added to the archive, or an
-.Dq r
-if the file replaces a file already in the archive.
-When used with the
-.Fl p
-option, the name of the file enclosed in
-.Dq <
-and
-.Dq >
-characters is written to standard output preceded by a single newline
-character and followed by two newline characters.
-The contents of the named file follow the file name.
-When used with the
-.Fl t
-option,
-.Nm
-displays eight whitespace separated fields:
-the file permissions as displayed by
-.Xr strmode 3 ,
-decimal user and group IDs separated by a slash (
-.Dq / Ns ) ,
-the file size in bytes, the file modification time in
-.Xr strftime 3
-format
-.Dq "%b %e %H:%M %Y" ,
-and the name of the file.
-.It Fl x
-Extract archive members specified by arguments
-.Ar files ...
-into the current directory.
-If no members have been specified, extract all members of the archive.
-If the file corresponding to an extracted member does not exist it
-will be created.
-If the file corresponding to an extracted member does exist, its owner
-and group will not be changed while its contents will be overwritten
-and its permissions will set to that entered in the archive.
-The file's access and modification time would be that of the time
-of extraction unless the
-.Fl o
-option was specified.
-.It Fl z
-Compress the resulting archive with
-.Xr gzip 1 .
-.El
-.Sh EXAMPLES
-To create a new archive
-.Pa ex.a
-containing three files
-.Pa ex1.o ,
-.Pa ex2.o
-and
-.Pa ex3.o ,
-use:
-.Dl "ar -rc ex.a ex1.o ex2.o ex3.o"
-.Pp
-To add an archive symbol table to an existing archive
-.Pa ex.a ,
-use:
-.Dl "ar -s ex.a"
-.Pp
-To delete file
-.Pa ex1.o
-from archive
-.Pa ex.a ,
-use:
-.D1 "ar -d ex.a ex1.o"
-.Pp
-To verbosely list the contents of archive
-.Pa ex.a ,
-use:
-.D1 "ar -tv ex.a"
-.Sh DIAGNOSTICS
-.Ex -std
-.Sh SEE ALSO
-.Xr ld 1 ,
-.Xr archive 3 ,
-.Xr elf 3 ,
-.Xr strftime 3 ,
-.Xr strmode 3 ,
-.Xr ar 5
-.\" .Sh COMPATIBILITY
-.\" .Nm
-.\" is expected to be compatible with GNU and SVR4
-.\" .Nm .
-.\" .Sh STANDARDS
-.\" Do the POSIX/SuSv3 standards have anything to say about AR(1)?
-.Sh HISTORY
-An
-.Nm
-command first appeared in AT&T UNIX Version 1.
-In
-.Fx 8.0 ,
-.An "Kai Wang" Aq kaiw@FreeBSD.org
-reimplemented
-.Nm
-and
-.Nm ranlib
-using the
-.Lb libarchive
-and the
-.Lb libelf .
diff --git a/usr.bin/ar/ar.c b/usr.bin/ar/ar.c
deleted file mode 100644
index e910e30..0000000
--- a/usr.bin/ar/ar.c
+++ /dev/null
@@ -1,387 +0,0 @@
-/*-
- * Copyright (c) 2007 Kai Wang
- * Copyright (c) 2007 Tim Kientzle
- * Copyright (c) 2007 Joseph Koshy
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Hugh Smith at The University of Guelph.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/queue.h>
-#include <sys/types.h>
-#include <archive.h>
-#include <errno.h>
-#include <getopt.h>
-#include <libgen.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysexits.h>
-
-#include "ar.h"
-
-enum options
-{
- OPTION_HELP
-};
-
-static struct option longopts[] =
-{
- {"help", no_argument, NULL, OPTION_HELP},
- {"version", no_argument, NULL, 'V'},
- {NULL, 0, NULL, 0}
-};
-
-static void bsdar_usage(void);
-static void ranlib_usage(void);
-static void set_mode(struct bsdar *bsdar, char opt);
-static void only_mode(struct bsdar *bsdar, const char *opt,
- const char *valid_modes);
-static void bsdar_version(void);
-static void ranlib_version(void);
-
-int
-main(int argc, char **argv)
-{
- struct bsdar *bsdar, bsdar_storage;
- char *p;
- size_t len;
- int i, opt;
-
- bsdar = &bsdar_storage;
- memset(bsdar, 0, sizeof(*bsdar));
-
- if ((bsdar->progname = getprogname()) == NULL)
- bsdar->progname = "ar";
-
- if (strcmp(bsdar->progname, "ranlib") == 0 ||
- strcmp(bsdar->progname, "bsdranlib") == 0) {
- while ((opt = getopt_long(argc, argv, "tV", longopts,
- NULL)) != -1) {
- switch(opt) {
- case 't':
- /* Ignored. */
- break;
- case 'V':
- ranlib_version();
- break;
- case OPTION_HELP:
- ranlib_usage();
- default:
- ranlib_usage();
- }
- }
- argv += optind;
- argc -= optind;
-
- if (*argv == NULL)
- ranlib_usage();
-
- bsdar->options |= AR_S;
- for (;(bsdar->filename = *argv++) != NULL;)
- ar_mode_s(bsdar);
-
- exit(EX_OK);
- } else {
- if (argc < 2)
- bsdar_usage();
-
- if (*argv[1] != '-') {
- len = strlen(argv[1]) + 2;
- if ((p = malloc(len)) == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno,
- "malloc failed");
- *p = '-';
- (void)strlcpy(p + 1, argv[1], len - 1);
- argv[1] = p;
- }
- }
-
- while ((opt = getopt_long(argc, argv, "abCcdfijlMmopqrSsTtuVvxz",
- longopts, NULL)) != -1) {
- switch(opt) {
- case 'a':
- bsdar->options |= AR_A;
- break;
- case 'b':
- case 'i':
- bsdar->options |= AR_B;
- break;
- case 'C':
- bsdar->options |= AR_CC;
- break;
- case 'c':
- bsdar->options |= AR_C;
- break;
- case 'd':
- set_mode(bsdar, opt);
- break;
- case 'f':
- case 'T':
- bsdar->options |= AR_TR;
- break;
- case 'j':
- bsdar->options |= AR_J;
- break;
- case 'l':
- /* ignored, for GNU ar comptibility */
- break;
- case 'M':
- set_mode(bsdar, opt);
- break;
- case 'm':
- set_mode(bsdar, opt);
- break;
- case 'o':
- bsdar->options |= AR_O;
- break;
- case 'p':
- set_mode(bsdar, opt);
- break;
- case 'q':
- set_mode(bsdar, opt);
- break;
- case 'r':
- set_mode(bsdar, opt);
- break;
- case 'S':
- bsdar->options |= AR_SS;
- break;
- case 's':
- bsdar->options |= AR_S;
- break;
- case 't':
- set_mode(bsdar, opt);
- break;
- case 'u':
- bsdar->options |= AR_U;
- break;
- case 'V':
- bsdar_version();
- break;
- case 'v':
- bsdar->options |= AR_V;
- break;
- case 'x':
- set_mode(bsdar, opt);
- break;
- case 'z':
- bsdar->options |= AR_Z;
- break;
- case OPTION_HELP:
- bsdar_usage();
- default:
- bsdar_usage();
- }
- }
-
- argv += optind;
- argc -= optind;
-
- if (*argv == NULL && bsdar->mode != 'M')
- bsdar_usage();
-
- if (bsdar->options & AR_A && bsdar->options & AR_B)
- bsdar_errc(bsdar, EX_USAGE, 0,
- "only one of -a and -[bi] options allowed");
-
- if (bsdar->options & AR_J && bsdar->options & AR_Z)
- bsdar_errc(bsdar, EX_USAGE, 0,
- "only one of -j and -z options allowed");
-
- if (bsdar->options & AR_S && bsdar->options & AR_SS)
- bsdar_errc(bsdar, EX_USAGE, 0,
- "only one of -s and -S options allowed");
-
- if (bsdar->options & (AR_A | AR_B)) {
- if ((bsdar->posarg = *argv) == NULL)
- bsdar_errc(bsdar, EX_USAGE, 0,
- "no position operand specified");
- if ((bsdar->posarg = basename(bsdar->posarg)) == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno,
- "basename failed");
- argc--;
- argv++;
- }
-
- if (bsdar->options & AR_A)
- only_mode(bsdar, "-a", "mqr");
- if (bsdar->options & AR_B)
- only_mode(bsdar, "-b", "mqr");
- if (bsdar->options & AR_C)
- only_mode(bsdar, "-c", "qr");
- if (bsdar->options & AR_CC)
- only_mode(bsdar, "-C", "x");
- if (bsdar->options & AR_O)
- only_mode(bsdar, "-o", "x");
- if (bsdar->options & AR_SS)
- only_mode(bsdar, "-S", "mqr");
- if (bsdar->options & AR_U)
- only_mode(bsdar, "-u", "qrx");
-
- if (bsdar->mode == 'M') {
- ar_mode_script(bsdar);
- exit(EX_OK);
- }
-
- if ((bsdar->filename = *argv) == NULL)
- bsdar_usage();
-
- bsdar->argc = --argc;
- bsdar->argv = ++argv;
-
- if ((!bsdar->mode || strchr("ptx", bsdar->mode)) &&
- bsdar->options & AR_S) {
- ar_mode_s(bsdar);
- if (!bsdar->mode)
- exit(EX_OK);
- }
-
- switch(bsdar->mode) {
- case 'd':
- ar_mode_d(bsdar);
- break;
- case 'm':
- ar_mode_m(bsdar);
- break;
- case 'p':
- ar_mode_p(bsdar);
- break;
- case 'q':
- ar_mode_q(bsdar);
- break;
- case 'r':
- ar_mode_r(bsdar);
- break;
- case 't':
- ar_mode_t(bsdar);
- break;
- case 'x':
- ar_mode_x(bsdar);
- break;
- default:
- bsdar_usage();
- /* NOTREACHED */
- }
-
- for (i = 0; i < bsdar->argc; i++)
- if (bsdar->argv[i] != NULL)
- bsdar_warnc(bsdar, 0, "%s: not found in archive",
- bsdar->argv[i]);
-
- exit(EX_OK);
-}
-
-static void
-set_mode(struct bsdar *bsdar, char opt)
-{
-
- if (bsdar->mode != '\0' && bsdar->mode != opt)
- bsdar_errc(bsdar, EX_USAGE, 0,
- "Can't specify both -%c and -%c", opt, bsdar->mode);
- bsdar->mode = opt;
-}
-
-static void
-only_mode(struct bsdar *bsdar, const char *opt, const char *valid_modes)
-{
-
- if (strchr(valid_modes, bsdar->mode) == NULL)
- bsdar_errc(bsdar, EX_USAGE, 0,
- "Option %s is not permitted in mode -%c", opt, bsdar->mode);
-}
-
-static void
-bsdar_usage()
-{
-
- (void)fprintf(stderr, "usage: ar -d [-Tjsvz] archive file ...\n");
- (void)fprintf(stderr, "\tar -m [-Tjsvz] archive file ...\n");
- (void)fprintf(stderr, "\tar -m [-Tabijsvz] position archive file ...\n");
- (void)fprintf(stderr, "\tar -p [-Tv] archive [file ...]\n");
- (void)fprintf(stderr, "\tar -q [-Tcjsvz] archive file ...\n");
- (void)fprintf(stderr, "\tar -r [-Tcjsuvz] archive file ...\n");
- (void)fprintf(stderr, "\tar -r [-Tabcijsuvz] position archive file ...\n");
- (void)fprintf(stderr, "\tar -s [-jz] archive\n");
- (void)fprintf(stderr, "\tar -t [-Tv] archive [file ...]\n");
- (void)fprintf(stderr, "\tar -x [-CTouv] archive [file ...]\n");
- (void)fprintf(stderr, "\tar -V\n");
- exit(EX_USAGE);
-}
-
-static void
-ranlib_usage()
-{
-
- (void)fprintf(stderr, "usage: ranlib [-t] archive ...\n");
- (void)fprintf(stderr, "\tranlib -V\n");
- exit(EX_USAGE);
-}
-
-static void
-bsdar_version()
-{
- (void)printf("BSD ar %s - %s\n", BSDAR_VERSION, archive_version());
- exit(EX_OK);
-}
-
-static void
-ranlib_version()
-{
- (void)printf("ranlib %s - %s\n", BSDAR_VERSION, archive_version());
- exit(EX_OK);
-}
diff --git a/usr.bin/ar/ar.h b/usr.bin/ar/ar.h
deleted file mode 100644
index 111f944..0000000
--- a/usr.bin/ar/ar.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/*-
- * Copyright (c) 2007 Kai Wang
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#define BSDAR_VERSION "1.1.0"
-
-/*
- * ar(1) options.
- */
-#define AR_A 0x0001 /* position-after */
-#define AR_B 0x0002 /* position-before */
-#define AR_C 0x0004 /* creating new archive */
-#define AR_CC 0x0008 /* do not overwrite when extracting */
-#define AR_J 0x0010 /* bzip2 compression */
-#define AR_O 0x0020 /* preserve original mtime when extracting */
-#define AR_S 0x0040 /* write archive symbol table */
-#define AR_SS 0x0080 /* do not write archive symbol table */
-#define AR_TR 0x0100 /* only keep first 15 chars for member name */
-#define AR_U 0x0200 /* only extract or update newer members.*/
-#define AR_V 0x0400 /* verbose mode */
-#define AR_Z 0x0800 /* gzip compression */
-
-#define DEF_BLKSZ 10240 /* default block size */
-
-/*
- * Convenient wrapper for general libarchive error handling.
- */
-#define AC(CALL) do { \
- if ((CALL)) \
- bsdar_errc(bsdar, EX_SOFTWARE, 0, "%s", \
- archive_error_string(a)); \
-} while (0)
-
-/*
- * In-memory representation of archive member(object).
- */
-struct ar_obj {
- char *name; /* member name */
- void *maddr; /* mmap start address */
- uid_t uid; /* user id */
- gid_t gid; /* group id */
- mode_t md; /* octal file permissions */
- size_t size; /* member size */
- time_t mtime; /* modification time */
- int fd; /* file descriptor */
- dev_t dev; /* inode's device */
- ino_t ino; /* inode's number */
-
- TAILQ_ENTRY(ar_obj) objs;
-};
-
-/*
- * Structure encapsulates the "global" data for "ar" program.
- */
-struct bsdar {
- const char *filename; /* archive name. */
- const char *addlib; /* target of ADDLIB. */
- const char *posarg; /* position arg for modifiers -a, -b. */
- char mode; /* program mode */
- char compression; /* compression mode */
- int options; /* command line options */
-
- const char *progname; /* program name */
- int argc;
- char **argv;
-
- /*
- * Fields for the archive string table.
- */
- char *as; /* buffer for archive string table. */
- size_t as_sz; /* current size of as table. */
- size_t as_cap; /* capacity of as table buffer. */
-
- /*
- * Fields for the archive symbol table.
- */
- uint32_t s_cnt; /* current number of symbols. */
- uint32_t *s_so; /* symbol offset table. */
- size_t s_so_cap; /* capacity of so table buffer. */
- char *s_sn; /* symbol name table */
- size_t s_sn_cap; /* capacity of sn table buffer. */
- size_t s_sn_sz; /* current size of sn table. */
- /* Current member's offset (relative to the end of pseudo members.) */
- off_t rela_off;
-
- TAILQ_HEAD(, ar_obj) v_obj; /* object(member) list */
-};
-
-void bsdar_errc(struct bsdar *, int _eval, int _code,
- const char *fmt, ...);
-void bsdar_warnc(struct bsdar *, int _code, const char *fmt, ...);
-void ar_mode_d(struct bsdar *bsdar);
-void ar_mode_m(struct bsdar *bsdar);
-void ar_mode_p(struct bsdar *bsdar);
-void ar_mode_q(struct bsdar *bsdar);
-void ar_mode_r(struct bsdar *bsdar);
-void ar_mode_s(struct bsdar *bsdar);
-void ar_mode_t(struct bsdar *bsdar);
-void ar_mode_x(struct bsdar *bsdar);
-void ar_mode_A(struct bsdar *bsdar);
-void ar_mode_script(struct bsdar *ar);
diff --git a/usr.bin/ar/read.c b/usr.bin/ar/read.c
deleted file mode 100644
index a9e2ed1..0000000
--- a/usr.bin/ar/read.c
+++ /dev/null
@@ -1,204 +0,0 @@
-/*-
- * Copyright (c) 2007 Kai Wang
- * Copyright (c) 2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/queue.h>
-#include <sys/stat.h>
-#include <archive.h>
-#include <archive_entry.h>
-#include <errno.h>
-#include <libgen.h>
-#include <stdio.h>
-#include <string.h>
-#include <sysexits.h>
-
-#include "ar.h"
-
-static void read_archive(struct bsdar *bsdar, char mode);
-
-void
-ar_mode_p(struct bsdar *bsdar)
-{
-
- read_archive(bsdar, 'p');
-}
-
-void
-ar_mode_t(struct bsdar *bsdar)
-{
-
- read_archive(bsdar, 't');
-}
-
-void
-ar_mode_x(struct bsdar *bsdar)
-{
-
- read_archive(bsdar, 'x');
-}
-
-/*
- * Handle read modes: 'x', 't' and 'p'.
- */
-static void
-read_archive(struct bsdar *bsdar, char mode)
-{
- struct archive *a;
- struct archive_entry *entry;
- struct stat sb;
- struct tm *tp;
- const char *bname;
- const char *name;
- mode_t md;
- size_t size;
- time_t mtime;
- uid_t uid;
- gid_t gid;
- char **av;
- char buf[25];
- char find;
- int flags, r, i;
-
- if ((a = archive_read_new()) == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, 0, "archive_read_new failed");
- archive_read_support_compression_all(a);
- archive_read_support_format_all(a);
- AC(archive_read_open_file(a, bsdar->filename, DEF_BLKSZ));
-
- for (;;) {
- r = archive_read_next_header(a, &entry);
- if (r == ARCHIVE_WARN || r == ARCHIVE_RETRY ||
- r == ARCHIVE_FATAL)
- bsdar_warnc(bsdar, 0, "%s", archive_error_string(a));
- if (r == ARCHIVE_EOF || r == ARCHIVE_FATAL)
- break;
- if (r == ARCHIVE_RETRY) {
- bsdar_warnc(bsdar, 0, "Retrying...");
- continue;
- }
-
- name = archive_entry_pathname(entry);
-
- /* Skip pseudo members. */
- if (strcmp(name, "/") == 0 || strcmp(name, "//") == 0)
- continue;
-
- if (bsdar->argc > 0) {
- find = 0;
- for(i = 0; i < bsdar->argc; i++) {
- av = &bsdar->argv[i];
- if (*av == NULL)
- continue;
- if ((bname = basename(*av)) == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno,
- "basename failed");
- if (strcmp(bname, name) != 0)
- continue;
-
- *av = NULL;
- find = 1;
- break;
- }
- if (!find)
- continue;
- }
-
- if (mode == 't') {
- if (bsdar->options & AR_V) {
- md = archive_entry_mode(entry);
- uid = archive_entry_uid(entry);
- gid = archive_entry_gid(entry);
- size = archive_entry_size(entry);
- mtime = archive_entry_mtime(entry);
- (void)strmode(md, buf);
- (void)fprintf(stdout, "%s %6d/%-6d %8ju ",
- buf + 1, uid, gid, (uintmax_t)size);
- tp = localtime(&mtime);
- (void)strftime(buf, sizeof(buf),
- "%b %e %H:%M %Y", tp);
- (void)fprintf(stdout, "%s %s", buf, name);
- } else
- (void)fprintf(stdout, "%s", name);
- r = archive_read_data_skip(a);
- if (r == ARCHIVE_WARN || r == ARCHIVE_RETRY ||
- r == ARCHIVE_FATAL) {
- (void)fprintf(stdout, "\n");
- bsdar_warnc(bsdar, 0, "%s",
- archive_error_string(a));
- }
-
- if (r == ARCHIVE_FATAL)
- break;
-
- (void)fprintf(stdout, "\n");
- } else {
- /* mode == 'x' || mode = 'p' */
- if (mode == 'p') {
- if (bsdar->options & AR_V) {
- (void)fprintf(stdout, "\n<%s>\n\n",
- name);
- fflush(stdout);
- }
- r = archive_read_data_into_fd(a, 1);
- } else {
- /* mode == 'x' */
- if (stat(name, &sb) != 0) {
- if (errno != ENOENT) {
- bsdar_warnc(bsdar, 0,
- "stat %s failed",
- bsdar->filename);
- continue;
- }
- } else {
- /* stat success, file exist */
- if (bsdar->options & AR_CC)
- continue;
- if (bsdar->options & AR_U &&
- archive_entry_mtime(entry) <=
- sb.st_mtime)
- continue;
- }
-
- if (bsdar->options & AR_V)
- (void)fprintf(stdout, "x - %s\n", name);
- flags = 0;
- if (bsdar->options & AR_O)
- flags |= ARCHIVE_EXTRACT_TIME;
-
- r = archive_read_extract(a, entry, flags);
- }
-
- if (r)
- bsdar_warnc(bsdar, 0, "%s",
- archive_error_string(a));
- }
- }
- AC(archive_read_close(a));
- AC(archive_read_finish(a));
-}
diff --git a/usr.bin/ar/util.c b/usr.bin/ar/util.c
deleted file mode 100644
index e1230e3..0000000
--- a/usr.bin/ar/util.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/queue.h>
-#include <sys/types.h>
-#include <errno.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "ar.h"
-
-static void bsdar_vwarnc(struct bsdar *, int code,
- const char *fmt, va_list ap);
-static void bsdar_verrc(struct bsdar *bsdar, int code,
- const char *fmt, va_list ap);
-
-static void
-bsdar_vwarnc(struct bsdar *bsdar, int code, const char *fmt, va_list ap)
-{
-
- fprintf(stderr, "%s: warning: ", bsdar->progname);
- vfprintf(stderr, fmt, ap);
- if (code != 0)
- fprintf(stderr, ": %s", strerror(code));
- fprintf(stderr, "\n");
-}
-
-void
-bsdar_warnc(struct bsdar *bsdar, int code, const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- bsdar_vwarnc(bsdar, code, fmt, ap);
- va_end(ap);
-}
-
-static void
-bsdar_verrc(struct bsdar *bsdar, int code, const char *fmt, va_list ap)
-{
-
- fprintf(stderr, "%s: fatal: ", bsdar->progname);
- vfprintf(stderr, fmt, ap);
- if (code != 0)
- fprintf(stderr, ": %s", strerror(code));
- fprintf(stderr, "\n");
-}
-
-void
-bsdar_errc(struct bsdar *bsdar, int eval, int code, const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- bsdar_verrc(bsdar, code, fmt, ap);
- va_end(ap);
- exit(eval);
-}
diff --git a/usr.bin/ar/write.c b/usr.bin/ar/write.c
deleted file mode 100644
index 3d4f93d..0000000
--- a/usr.bin/ar/write.c
+++ /dev/null
@@ -1,879 +0,0 @@
-/*-
- * Copyright (c) 2007 Kai Wang
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/endian.h>
-#include <sys/mman.h>
-#include <sys/queue.h>
-#include <sys/stat.h>
-#include <archive.h>
-#include <archive_entry.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <gelf.h>
-#include <libgen.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysexits.h>
-
-#include "ar.h"
-
-#define _ARMAG_LEN 8 /* length of ar magic string */
-#define _ARHDR_LEN 60 /* length of ar header */
-#define _INIT_AS_CAP 128 /* initial archive string table size */
-#define _INIT_SYMOFF_CAP (256*(sizeof(uint32_t))) /* initial so table size */
-#define _INIT_SYMNAME_CAP 1024 /* initial sn table size */
-#define _MAXNAMELEN_SVR4 15 /* max member name length in svr4 variant */
-#define _TRUNCATE_LEN 15 /* number of bytes to keep for member name */
-
-static void add_to_ar_str_table(struct bsdar *bsdar, const char *name);
-static void add_to_ar_sym_table(struct bsdar *bsdar, const char *name);
-static struct ar_obj *create_obj_from_file(struct bsdar *bsdar,
- const char *name, time_t mtime);
-static void create_symtab_entry(struct bsdar *bsdar, void *maddr,
- size_t size);
-static void insert_obj(struct bsdar *bsdar, struct ar_obj *obj,
- struct ar_obj *pos);
-static void read_objs(struct bsdar *bsdar, const char *archive,
- int checkargv);
-static void write_archive(struct bsdar *bsdar, char mode);
-static void write_cleanup(struct bsdar *bsdar);
-static void write_data(struct bsdar *bsdar, struct archive *a,
- const void *buf, size_t s);
-static void write_objs(struct bsdar *bsdar);
-
-void
-ar_mode_d(struct bsdar *bsdar)
-{
-
- write_archive(bsdar, 'd');
-}
-
-void
-ar_mode_m(struct bsdar *bsdar)
-{
-
- write_archive(bsdar, 'm');
-}
-
-void
-ar_mode_q(struct bsdar *bsdar)
-{
-
- write_archive(bsdar, 'q');
-}
-
-void
-ar_mode_r(struct bsdar *bsdar)
-{
-
- write_archive(bsdar, 'r');
-}
-
-void
-ar_mode_s(struct bsdar *bsdar)
-{
-
- write_archive(bsdar, 's');
-}
-
-void
-ar_mode_A(struct bsdar *bsdar)
-{
-
- write_archive(bsdar, 'A');
-}
-
-/*
- * Create object from file, return created obj upon success, or NULL
- * when an error occurs or the member is not newer than existing
- * one while -u is specifed.
- */
-static struct ar_obj *
-create_obj_from_file(struct bsdar *bsdar, const char *name, time_t mtime)
-{
- struct ar_obj *obj;
- struct stat sb;
- const char *bname;
-
- if (name == NULL)
- return (NULL);
-
- obj = malloc(sizeof(struct ar_obj));
- if (obj == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "malloc failed");
- if ((obj->fd = open(name, O_RDONLY, 0)) < 0) {
- bsdar_warnc(bsdar, errno, "can't open file: %s", name);
- free(obj);
- return (NULL);
- }
-
- if ((bname = basename(name)) == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "basename failed");
- if (bsdar->options & AR_TR && strlen(bname) > _TRUNCATE_LEN) {
- if ((obj->name = malloc(_TRUNCATE_LEN + 1)) == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "malloc failed");
- (void)strncpy(obj->name, bname, _TRUNCATE_LEN);
- obj->name[_TRUNCATE_LEN] = '\0';
- } else
- if ((obj->name = strdup(bname)) == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "strdup failed");
-
- if (fstat(obj->fd, &sb) < 0) {
- bsdar_warnc(bsdar, errno, "can't fstat file: %s", obj->name);
- goto giveup;
- }
- if (!S_ISREG(sb.st_mode)) {
- bsdar_warnc(bsdar, 0, "%s is not an ordinary file", obj->name);
- goto giveup;
- }
-
- /*
- * When option '-u' is specified and member is not newer than the
- * existing one, the replace will not happen. While if mtime == 0,
- * which indicates that this is to "replace a none exist member",
- * the replace will proceed regardless of '-u'.
- */
- if (mtime != 0 && bsdar->options & AR_U && sb.st_mtime <= mtime)
- goto giveup;
-
- obj->uid = sb.st_uid;
- obj->gid = sb.st_gid;
- obj->md = sb.st_mode;
- obj->size = sb.st_size;
- obj->mtime = sb.st_mtime;
- obj->dev = sb.st_dev;
- obj->ino = sb.st_ino;
-
- if (obj->size == 0) {
- obj->maddr = NULL;
- return (obj);
- }
-
- if ((obj->maddr = mmap(NULL, obj->size, PROT_READ,
- MAP_PRIVATE, obj->fd, (off_t)0)) == MAP_FAILED) {
- bsdar_warnc(bsdar, errno, "can't mmap file: %s", obj->name);
- goto giveup;
- }
- if (close(obj->fd) < 0)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "close failed: %s",
- obj->name);
-
- return (obj);
-
-giveup:
- if (close(obj->fd) < 0)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "close failed: %s",
- obj->name);
- free(obj->name);
- free(obj);
- return (NULL);
-}
-
-/*
- * Insert obj to the tail, or before/after the pos obj.
- */
-static void
-insert_obj(struct bsdar *bsdar, struct ar_obj *obj, struct ar_obj *pos)
-{
- if (obj == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, 0, "try to insert a null obj");
-
- if (pos == NULL || obj == pos)
- /*
- * If the object to move happens to be the posistion obj,
- * or if there is not a pos obj, move it to tail.
- */
- goto tail;
-
- if (bsdar->options & AR_B) {
- TAILQ_INSERT_BEFORE(pos, obj, objs);
- return;
- }
- if (bsdar->options & AR_A) {
- TAILQ_INSERT_AFTER(&bsdar->v_obj, pos, obj, objs);
- return;
- }
-
-tail:
- TAILQ_INSERT_TAIL(&bsdar->v_obj, obj, objs);
-
-}
-
-/*
- * Read objects from archive into v_obj list. Note that checkargv is
- * set when read_objs is used to read objects from the target of
- * ADDLIB command (ar script mode), in this case argv array possibly
- * specifies the members ADDLIB want.
- */
-static void
-read_objs(struct bsdar *bsdar, const char *archive, int checkargv)
-{
- struct archive *a;
- struct archive_entry *entry;
- struct ar_obj *obj;
- const char *name;
- const char *bname;
- char *buff;
- char **av;
- size_t size;
- int i, r, find;
-
- if ((a = archive_read_new()) == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, 0, "archive_read_new failed");
- archive_read_support_compression_all(a);
- archive_read_support_format_ar(a);
- AC(archive_read_open_filename(a, archive, DEF_BLKSZ));
- for (;;) {
- r = archive_read_next_header(a, &entry);
- if (r == ARCHIVE_FATAL)
- bsdar_errc(bsdar, EX_DATAERR, 0, "%s",
- archive_error_string(a));
- if (r == ARCHIVE_EOF)
- break;
- if (r == ARCHIVE_WARN || r == ARCHIVE_RETRY)
- bsdar_warnc(bsdar, 0, "%s", archive_error_string(a));
- if (r == ARCHIVE_RETRY) {
- bsdar_warnc(bsdar, 0, "Retrying...");
- continue;
- }
-
- /*
- * Remember the compression mode of existing archive.
- * If neither -j nor -z is specified, this mode will
- * be used for resulting archive.
- */
- bsdar->compression = archive_compression(a);
-
- name = archive_entry_pathname(entry);
-
- /*
- * skip pseudo members.
- */
- if (strcmp(name, "/") == 0 || strcmp(name, "//") == 0)
- continue;
-
- /*
- * If checkargv is set, only read those members specified
- * in argv.
- */
- if (checkargv && bsdar->argc > 0) {
- find = 0;
- for(i = 0; i < bsdar->argc; i++) {
- av = &bsdar->argv[i];
- if (*av == NULL)
- continue;
- if ((bname = basename(*av)) == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno,
- "basename failed");
- if (strcmp(bname, name) != 0)
- continue;
-
- *av = NULL;
- find = 1;
- break;
- }
- if (!find)
- continue;
- }
-
- size = archive_entry_size(entry);
-
- if (size > 0) {
- if ((buff = malloc(size)) == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno,
- "malloc failed");
- if (archive_read_data(a, buff, size) != (ssize_t)size) {
- bsdar_warnc(bsdar, 0, "%s",
- archive_error_string(a));
- free(buff);
- continue;
- }
- } else
- buff = NULL;
-
- obj = malloc(sizeof(struct ar_obj));
- if (obj == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "malloc failed");
- obj->maddr = buff;
- if ((obj->name = strdup(name)) == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "strdup failed");
- obj->size = size;
- obj->uid = archive_entry_uid(entry);
- obj->gid = archive_entry_gid(entry);
- obj->md = archive_entry_mode(entry);
- obj->mtime = archive_entry_mtime(entry);
- obj->dev = 0;
- obj->ino = 0;
-
- /*
- * Objects from archive have obj->fd set to -1,
- * for the ease of cleaning up.
- */
- obj->fd = -1;
- TAILQ_INSERT_TAIL(&bsdar->v_obj, obj, objs);
- }
- AC(archive_read_close(a));
- AC(archive_read_finish(a));
-}
-
-/*
- * Determine the constitution of resulting archive.
- */
-static void
-write_archive(struct bsdar *bsdar, char mode)
-{
- struct ar_obj *nobj, *obj, *obj_temp, *pos;
- struct stat sb;
- const char *bname;
- char **av;
- int i;
-
- TAILQ_INIT(&bsdar->v_obj);
- nobj = NULL;
- pos = NULL;
- memset(&sb, 0, sizeof(sb));
-
- /* By default, no compression is assumed. */
- bsdar->compression = ARCHIVE_COMPRESSION_NONE;
-
- /*
- * Test if the specified archive exists, to figure out
- * whether we are creating one here.
- */
- if (stat(bsdar->filename, &sb) != 0) {
- if (errno != ENOENT) {
- bsdar_warnc(bsdar, 0, "stat %s failed",
- bsdar->filename);
- return;
- }
-
- /* We do not create archive in mode 'd', 'm' and 's'. */
- if (mode != 'r' && mode != 'q') {
- bsdar_warnc(bsdar, 0, "%s: no such file",
- bsdar->filename);
- return;
- }
-
- /* Issue a warning if -c is not specified when creating. */
- if (!(bsdar->options & AR_C))
- bsdar_warnc(bsdar, 0, "creating %s", bsdar->filename);
- goto new_archive;
- }
-
- /*
- * First read members from existing archive.
- */
- read_objs(bsdar, bsdar->filename, 0);
-
- /*
- * For mode 's', no member will be moved, deleted or replaced.
- */
- if (mode == 's')
- goto write_objs;
-
- /*
- * For mode 'q', we don't need to adjust existing members either.
- * Also, -a, -b and -i are ignored in this mode. New members are
- * always inserted at tail.
- */
- if (mode == 'q')
- goto new_archive;
-
- /*
- * Mode 'A' adds the contents of another archive to the tail of
- * current archive. Note that mode 'A' is a special mode for the
- * ADDLIB command of the ar script mode. Currently there is no
- * access to this function from the ar command line mode.
- */
- if (mode == 'A') {
- /*
- * Read objects from the target archive of ADDLIB command.
- * If there are members spcified in argv, read those members
- * only, otherwise the entire archive will be read.
- */
- read_objs(bsdar, bsdar->addlib, 1);
- goto write_objs;
- }
-
- /*
- * Try to find the position member specified by user.
- */
- if (bsdar->options & AR_A || bsdar->options & AR_B) {
- TAILQ_FOREACH(obj, &bsdar->v_obj, objs) {
- if (strcmp(obj->name, bsdar->posarg) == 0) {
- pos = obj;
- break;
- }
- }
-
- /*
- * If can't find `pos' specified by user,
- * sliently insert objects at tail.
- */
- if (pos == NULL)
- bsdar->options &= ~(AR_A | AR_B);
- }
-
- for (i = 0; i < bsdar->argc; i++) {
- av = &bsdar->argv[i];
-
- TAILQ_FOREACH_SAFE(obj, &bsdar->v_obj, objs, obj_temp) {
- if ((bname = basename(*av)) == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno,
- "basename failed");
- if (bsdar->options & AR_TR) {
- if (strncmp(bname, obj->name, _TRUNCATE_LEN))
- continue;
- } else
- if (strcmp(bname, obj->name) != 0)
- continue;
-
- if (mode == 'r') {
- /*
- * if the new member is not qualified
- * to replace the old one, skip it.
- */
- nobj = create_obj_from_file(bsdar, *av,
- obj->mtime);
- if (nobj == NULL)
- goto skip_obj;
- }
-
- if (bsdar->options & AR_V)
- (void)fprintf(stdout, "%c - %s\n", mode,
- *av);
-
- TAILQ_REMOVE(&bsdar->v_obj, obj, objs);
- if (mode == 'd' || mode == 'r') {
- free(obj->maddr);
- free(obj->name);
- free(obj);
- }
-
- if (mode == 'm')
- insert_obj(bsdar, obj, pos);
- if (mode == 'r')
- insert_obj(bsdar, nobj, pos);
-
- skip_obj:
- *av = NULL;
- break;
- }
-
- }
-
-new_archive:
- /*
- * When operating in mode 'r', directly add those user specified
- * objects which do not exist in current archive. When operating
- * in mode 'q', all objects specified in command line args are
- * appended to the archive, without comparing with existing ones.
- */
- for (i = 0; i < bsdar->argc; i++) {
- av = &bsdar->argv[i];
- if (*av != NULL && (mode == 'r' || mode == 'q')) {
- nobj = create_obj_from_file(bsdar, *av, 0);
- if (nobj != NULL)
- insert_obj(bsdar, nobj, pos);
- if (bsdar->options & AR_V && nobj != NULL)
- (void)fprintf(stdout, "a - %s\n", *av);
- *av = NULL;
- }
- }
-
-write_objs:
- write_objs(bsdar);
- write_cleanup(bsdar);
-}
-
-/*
- * Memory cleaning up.
- */
-static void
-write_cleanup(struct bsdar *bsdar)
-{
- struct ar_obj *obj, *obj_temp;
-
- TAILQ_FOREACH_SAFE(obj, &bsdar->v_obj, objs, obj_temp) {
- if (obj->fd == -1)
- free(obj->maddr);
- else
- if (obj->maddr != NULL && munmap(obj->maddr, obj->size))
- bsdar_warnc(bsdar, errno,
- "can't munmap file: %s", obj->name);
- TAILQ_REMOVE(&bsdar->v_obj, obj, objs);
- free(obj->name);
- free(obj);
- }
-
- free(bsdar->as);
- free(bsdar->s_so);
- free(bsdar->s_sn);
- bsdar->as = NULL;
- bsdar->s_so = NULL;
- bsdar->s_sn = NULL;
-}
-
-/*
- * Wrapper for archive_write_data().
- */
-static void
-write_data(struct bsdar *bsdar, struct archive *a, const void *buf, size_t s)
-{
- if (archive_write_data(a, buf, s) != (ssize_t)s)
- bsdar_errc(bsdar, EX_SOFTWARE, 0, "%s",
- archive_error_string(a));
-}
-
-/*
- * Write the resulting archive members.
- */
-static void
-write_objs(struct bsdar *bsdar)
-{
- struct ar_obj *obj;
- struct archive *a;
- struct archive_entry *entry;
- size_t s_sz; /* size of archive symbol table. */
- size_t pm_sz; /* size of pseudo members */
- int i, nr;
-
- if (elf_version(EV_CURRENT) == EV_NONE)
- bsdar_errc(bsdar, EX_SOFTWARE, 0,
- "ELF library initialization failed: %s", elf_errmsg(-1));
-
- bsdar->rela_off = 0;
-
- /* Create archive symbol table and archive string table, if need. */
- TAILQ_FOREACH(obj, &bsdar->v_obj, objs) {
- if (!(bsdar->options & AR_SS) && obj->maddr != NULL)
- create_symtab_entry(bsdar, obj->maddr, obj->size);
- if (strlen(obj->name) > _MAXNAMELEN_SVR4)
- add_to_ar_str_table(bsdar, obj->name);
- bsdar->rela_off += _ARHDR_LEN + obj->size + obj->size % 2;
- }
-
- /*
- * Pad the symbol name string table. It is treated specially because
- * symbol name table should be padded by a '\0', not the common '\n'
- * for other members. The size of sn table includes the pad bit.
- */
- if (bsdar->s_cnt != 0 && bsdar->s_sn_sz % 2 != 0)
- bsdar->s_sn[bsdar->s_sn_sz++] = '\0';
-
- /*
- * Archive string table is padded by a "\n" as the normal members.
- * The difference is that the size of archive string table counts
- * in the pad bit, while normal members' size fileds do not.
- */
- if (bsdar->as != NULL && bsdar->as_sz % 2 != 0)
- bsdar->as[bsdar->as_sz++] = '\n';
-
- /*
- * If there is a symbol table, calculate the size of pseudo members,
- * convert previously stored relative offsets to absolute ones, and
- * then make them Big Endian.
- *
- * absolute_offset = htobe32(relative_offset + size_of_pseudo_members)
- */
-
- if (bsdar->s_cnt != 0) {
- s_sz = (bsdar->s_cnt + 1) * sizeof(uint32_t) + bsdar->s_sn_sz;
- pm_sz = _ARMAG_LEN + (_ARHDR_LEN + s_sz);
- if (bsdar->as != NULL)
- pm_sz += _ARHDR_LEN + bsdar->as_sz;
- for (i = 0; (size_t)i < bsdar->s_cnt; i++)
- *(bsdar->s_so + i) = htobe32(*(bsdar->s_so + i) +
- pm_sz);
- }
-
- if ((a = archive_write_new()) == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, 0, "archive_write_new failed");
-
- archive_write_set_format_ar_svr4(a);
-
- /* The compression mode of the existing archive is used
- * for the result archive or if creating a new archive, we
- * do not compress archive by default. This default behavior can
- * be overrided by compression mode specified explicitly
- * through command line option `-j' or `-z'.
- */
- if (bsdar->options & AR_J)
- bsdar->compression = ARCHIVE_COMPRESSION_BZIP2;
- if (bsdar->options & AR_Z)
- bsdar->compression = ARCHIVE_COMPRESSION_GZIP;
- if (bsdar->compression == ARCHIVE_COMPRESSION_BZIP2)
- archive_write_set_compression_bzip2(a);
- else if (bsdar->compression == ARCHIVE_COMPRESSION_GZIP)
- archive_write_set_compression_gzip(a);
- else
- archive_write_set_compression_none(a);
-
- AC(archive_write_open_filename(a, bsdar->filename));
-
- /*
- * write the archive symbol table, if there is one.
- * If options -s is explicitly specified or we are invoked
- * as ranlib, write the symbol table even if it is empty.
- */
- if ((bsdar->s_cnt != 0 && !(bsdar->options & AR_SS)) ||
- bsdar->options & AR_S) {
- entry = archive_entry_new();
- archive_entry_copy_pathname(entry, "/");
- archive_entry_set_mtime(entry, time(NULL), 0);
- archive_entry_set_size(entry, (bsdar->s_cnt + 1) *
- sizeof(uint32_t) + bsdar->s_sn_sz);
- AC(archive_write_header(a, entry));
- nr = htobe32(bsdar->s_cnt);
- write_data(bsdar, a, &nr, sizeof(uint32_t));
- write_data(bsdar, a, bsdar->s_so, sizeof(uint32_t) *
- bsdar->s_cnt);
- write_data(bsdar, a, bsdar->s_sn, bsdar->s_sn_sz);
- archive_entry_free(entry);
- }
-
- /* write the archive string table, if any. */
- if (bsdar->as != NULL) {
- entry = archive_entry_new();
- archive_entry_copy_pathname(entry, "//");
- archive_entry_set_size(entry, bsdar->as_sz);
- AC(archive_write_header(a, entry));
- write_data(bsdar, a, bsdar->as, bsdar->as_sz);
- archive_entry_free(entry);
- }
-
- /* write normal members. */
- TAILQ_FOREACH(obj, &bsdar->v_obj, objs) {
- entry = archive_entry_new();
- archive_entry_copy_pathname(entry, obj->name);
- archive_entry_set_uid(entry, obj->uid);
- archive_entry_set_gid(entry, obj->gid);
- archive_entry_set_mode(entry, obj->md);
- archive_entry_set_size(entry, obj->size);
- archive_entry_set_mtime(entry, obj->mtime, 0);
- archive_entry_set_dev(entry, obj->dev);
- archive_entry_set_ino(entry, obj->ino);
- archive_entry_set_filetype(entry, AE_IFREG);
- AC(archive_write_header(a, entry));
- write_data(bsdar, a, obj->maddr, obj->size);
- archive_entry_free(entry);
- }
-
- AC(archive_write_close(a));
- AC(archive_write_finish(a));
-}
-
-/*
- * Extract global symbols from ELF binary members.
- */
-static void
-create_symtab_entry(struct bsdar *bsdar, void *maddr, size_t size)
-{
- Elf *e;
- Elf_Scn *scn;
- GElf_Shdr shdr;
- GElf_Sym sym;
- Elf_Data *data;
- char *name;
- size_t n, shstrndx;
- int elferr, tabndx, len, i;
-
- if ((e = elf_memory(maddr, size)) == NULL) {
- bsdar_warnc(bsdar, 0, "elf_memory() failed: %s",
- elf_errmsg(-1));
- return;
- }
- if (elf_kind(e) != ELF_K_ELF) {
- /* Sliently ignore non-elf member. */
- elf_end(e);
- return;
- }
- if (elf_getshstrndx(e, &shstrndx) == 0) {
- bsdar_warnc(bsdar, EX_SOFTWARE, 0, "elf_getshstrndx failed: %s",
- elf_errmsg(-1));
- elf_end(e);
- return;
- }
-
- tabndx = -1;
- scn = NULL;
- while ((scn = elf_nextscn(e, scn)) != NULL) {
- if (gelf_getshdr(scn, &shdr) != &shdr) {
- bsdar_warnc(bsdar, 0,
- "elf_getshdr failed: %s", elf_errmsg(-1));
- continue;
- }
- if ((name = elf_strptr(e, shstrndx, shdr.sh_name)) == NULL) {
- bsdar_warnc(bsdar, 0,
- "elf_strptr failed: %s", elf_errmsg(-1));
- continue;
- }
- if (strcmp(name, ".strtab") == 0) {
- tabndx = elf_ndxscn(scn);
- break;
- }
- }
- elferr = elf_errno();
- if (elferr != 0)
- bsdar_warnc(bsdar, 0, "elf_nextscn failed: %s",
- elf_errmsg(elferr));
- if (tabndx == -1) {
- bsdar_warnc(bsdar, 0, "can't find .strtab section");
- elf_end(e);
- return;
- }
-
- scn = NULL;
- while ((scn = elf_nextscn(e, scn)) != NULL) {
- if (gelf_getshdr(scn, &shdr) != &shdr) {
- bsdar_warnc(bsdar, EX_SOFTWARE, 0,
- "elf_getshdr failed: %s", elf_errmsg(-1));
- continue;
- }
- if (shdr.sh_type != SHT_SYMTAB)
- continue;
-
- data = NULL;
- n = 0;
- while (n < shdr.sh_size &&
- (data = elf_getdata(scn, data)) != NULL) {
- len = data->d_size / shdr.sh_entsize;
- for (i = 0; i < len; i++) {
- if (gelf_getsym(data, i, &sym) != &sym) {
- bsdar_warnc(bsdar, EX_SOFTWARE, 0,
- "gelf_getsym failed: %s",
- elf_errmsg(-1));
- continue;
- }
-
- /* keep only global or weak symbols */
- if (GELF_ST_BIND(sym.st_info) != STB_GLOBAL &&
- GELF_ST_BIND(sym.st_info) != STB_WEAK)
- continue;
-
- /* keep only defined symbols */
- if (sym.st_shndx == SHN_UNDEF)
- continue;
-
- if ((name = elf_strptr(e, tabndx,
- sym.st_name)) == NULL) {
- bsdar_warnc(bsdar, EX_SOFTWARE, 0,
- "elf_strptr failed: %s",
- elf_errmsg(-1));
- continue;
- }
-
- add_to_ar_sym_table(bsdar, name);
- }
- }
- }
- elferr = elf_errno();
- if (elferr != 0)
- bsdar_warnc(bsdar, EX_SOFTWARE, 0, "elf_nextscn failed: %s",
- elf_errmsg(elferr));
-
- elf_end(e);
-}
-
-/*
- * Append to the archive string table buffer.
- */
-static void
-add_to_ar_str_table(struct bsdar *bsdar, const char *name)
-{
-
- if (bsdar->as == NULL) {
- bsdar->as_cap = _INIT_AS_CAP;
- bsdar->as_sz = 0;
- if ((bsdar->as = malloc(bsdar->as_cap)) == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "malloc failed");
- }
-
- /*
- * The space required for holding one member name in as table includes:
- * strlen(name) + (1 for '/') + (1 for '\n') + (possibly 1 for padding).
- */
- while (bsdar->as_sz + strlen(name) + 3 > bsdar->as_cap) {
- bsdar->as_cap *= 2;
- bsdar->as = realloc(bsdar->as, bsdar->as_cap);
- if (bsdar->as == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "realloc failed");
- }
- strncpy(&bsdar->as[bsdar->as_sz], name, strlen(name));
- bsdar->as_sz += strlen(name);
- bsdar->as[bsdar->as_sz++] = '/';
- bsdar->as[bsdar->as_sz++] = '\n';
-}
-
-/*
- * Append to the archive symbol table buffer.
- */
-static void
-add_to_ar_sym_table(struct bsdar *bsdar, const char *name)
-{
-
- if (bsdar->s_so == NULL) {
- if ((bsdar->s_so = malloc(_INIT_SYMOFF_CAP)) ==
- NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "malloc failed");
- bsdar->s_so_cap = _INIT_SYMOFF_CAP;
- bsdar->s_cnt = 0;
- }
-
- if (bsdar->s_sn == NULL) {
- if ((bsdar->s_sn = malloc(_INIT_SYMNAME_CAP)) == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "malloc failed");
- bsdar->s_sn_cap = _INIT_SYMNAME_CAP;
- bsdar->s_sn_sz = 0;
- }
-
- if (bsdar->s_cnt * sizeof(uint32_t) >= bsdar->s_so_cap) {
- bsdar->s_so_cap *= 2;
- bsdar->s_so = realloc(bsdar->s_so, bsdar->s_so_cap);
- if (bsdar->s_so == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "realloc failed");
- }
- bsdar->s_so[bsdar->s_cnt] = bsdar->rela_off;
- bsdar->s_cnt++;
-
- /*
- * The space required for holding one symbol name in sn table includes:
- * strlen(name) + (1 for '\n') + (possibly 1 for padding).
- */
- while (bsdar->s_sn_sz + strlen(name) + 2 > bsdar->s_sn_cap) {
- bsdar->s_sn_cap *= 2;
- bsdar->s_sn = realloc(bsdar->s_sn, bsdar->s_sn_cap);
- if (bsdar->s_sn == NULL)
- bsdar_errc(bsdar, EX_SOFTWARE, errno, "realloc failed");
- }
- strncpy(&bsdar->s_sn[bsdar->s_sn_sz], name, strlen(name));
- bsdar->s_sn_sz += strlen(name);
- bsdar->s_sn[bsdar->s_sn_sz++] = '\0';
-}
diff --git a/usr.bin/asa/Makefile b/usr.bin/asa/Makefile
deleted file mode 100644
index c2a221a..0000000
--- a/usr.bin/asa/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# $NetBSD: Makefile,v 1.2 1995/03/25 18:04:51 glass Exp $
-# $FreeBSD$
-
-PROG= asa
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/asa/asa.1 b/usr.bin/asa/asa.1
deleted file mode 100644
index 5f5c236..0000000
--- a/usr.bin/asa/asa.1
+++ /dev/null
@@ -1,98 +0,0 @@
-.\" $NetBSD: asa.1,v 1.11 2002/02/08 01:36:18 ross Exp $
-.\"
-.\" Copyright (c) 1993 Winning Strategies, Inc.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by Winning Strategies, Inc.
-.\" 4. The name of the author may not be used to endorse or promote products
-.\" derived from this software without specific prior written permission
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd May 9, 2002
-.Dt ASA 1
-.Os
-.Sh NAME
-.Nm asa
-.Nd interpret carriage-control characters
-.Sh SYNOPSIS
-.Nm
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility reads files sequentially, mapping
-.Tn FORTRAN
-carriage-control characters to line-printer control sequences,
-and writes them to the standard output.
-.Pp
-The first character of each line is interpreted as a carriage-control
-character.
-The following characters are interpreted as follows:
-.Bl -tag -width ".Aq space"
-.It Aq space
-Output the rest of the line without change.
-.It 0
-Output a
-.Aq newline
-character before printing the rest of the line.
-.It 1
-Output a
-.Aq formfeed
-character before printing the rest of the line.
-.It \&+
-The trailing
-.Aq newline
-of the previous line is replaced by a
-.Aq carriage-return
-before printing the rest of the line.
-.El
-.Pp
-Lines beginning with characters other than the above are treated as if they
-begin with
-.Aq space .
-.Sh EXIT STATUS
-.Ex -std
-.Sh EXAMPLES
-To view a file containing the output of a
-.Tn FORTRAN
-program:
-.Pp
-.Dl "asa file"
-.Pp
-To format the output of a
-.Tn FORTRAN
-program and redirect it to a line-printer:
-.Pp
-.Dl "a.out | asa | lpr"
-.Sh SEE ALSO
-.Xr f77 1
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-.Sh AUTHORS
-.An J.T. Conklin ,
-Winning Strategies, Inc.
diff --git a/usr.bin/asa/asa.c b/usr.bin/asa/asa.c
deleted file mode 100644
index 692b8375..0000000
--- a/usr.bin/asa/asa.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $NetBSD: asa.c,v 1.11 1997/09/20 14:55:00 lukem Exp $ */
-
-/*
- * Copyright (c) 1993,94 Winning Strategies, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Winning Strategies, Inc.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if 0
-#ifndef lint
-__RCSID("$NetBSD: asa.c,v 1.11 1997/09/20 14:55:00 lukem Exp $");
-#endif
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-static void asa(FILE *);
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- int ch, exval;
- FILE *fp;
- const char *fn;
-
- while ((ch = getopt(argc, argv, "")) != -1) {
- switch (ch) {
- case '?':
- default:
- usage();
- /*NOTREACHED*/
- }
- }
- argc -= optind;
- argv += optind;
-
- exval = 0;
- if (argc == 0)
- asa(stdin);
- else {
- while ((fn = *argv++) != NULL) {
- if ((fp = fopen(fn, "r")) == NULL) {
- warn("%s", fn);
- exval = 1;
- continue;
- }
- asa(fp);
- fclose(fp);
- }
- }
-
- exit(exval);
-}
-
-static void
-usage(void)
-{
-
- fprintf(stderr, "usage: asa [file ...]\n");
- exit(1);
-}
-
-static void
-asa(FILE *f)
-{
- size_t len;
- char *buf;
-
- if ((buf = fgetln(f, &len)) != NULL) {
- if (buf[len - 1] == '\n')
- buf[--len] = '\0';
- /* special case the first line */
- switch (buf[0]) {
- case '0':
- putchar('\n');
- break;
- case '1':
- putchar('\f');
- break;
- }
-
- if (len > 1 && buf[0] && buf[1])
- printf("%.*s", (int)(len - 1), buf + 1);
-
- while ((buf = fgetln(f, &len)) != NULL) {
- if (buf[len - 1] == '\n')
- buf[--len] = '\0';
- switch (buf[0]) {
- default:
- case ' ':
- putchar('\n');
- break;
- case '0':
- putchar('\n');
- putchar('\n');
- break;
- case '1':
- putchar('\f');
- break;
- case '+':
- putchar('\r');
- break;
- }
-
- if (len > 1 && buf[0] && buf[1])
- printf("%.*s", (int)(len - 1), buf + 1);
- }
-
- putchar('\n');
- }
-}
diff --git a/usr.bin/at/LEGAL b/usr.bin/at/LEGAL
deleted file mode 100644
index 92b1b49..0000000
--- a/usr.bin/at/LEGAL
+++ /dev/null
@@ -1,29 +0,0 @@
------BEGIN PGP SIGNED MESSAGE-----
-
-Sorry for the long wait, but there still were a few things to
-be ironed out in at, which I've finally done :-)
-
-The FreeBSD team does have my permission to use at, version 2.9,
-under the BSD license.
-
-You'll find it on sunsite.unc.edu's Incoming, hopefully; the
-md5 checksum is
-
-3ba2ca3c0e87e1a04feae2c6c1376b0d at-2.9.tgz
-
-Best regards
- Thomas
-- --
-Thomas Koenig, Thomas.Koenig@ciw.uni-karlsruhe.de, ig25@dkauni2.bitnet.
-The joy of engineering is to find a straight line on a double
-logarithmic diagram.
-
------BEGIN PGP SIGNATURE-----
-Version: 2.6.2i
-
-iQCVAwUBMCjVrPBu+cbJcKCVAQFNiQP/dpWP57s/E8plVGUD3zfgOXDmKUvg8U7a
-VwRzJrIMuSgnSJs0wkpvcomc3NLicipfX7hhWLh/xatPM2YbF7O5HZoNdvWvexD2
-1Y67zJ+0HFb1mPnSBOrS5RFiQAe3KqmGec6E14Rih/qNoFQZBVRFXZ4xxuwP+0Rs
-e2U+TVTUz6A=
-=TvyW
------END PGP SIGNATURE-----
diff --git a/usr.bin/at/Makefile b/usr.bin/at/Makefile
deleted file mode 100644
index 47d2574..0000000
--- a/usr.bin/at/Makefile
+++ /dev/null
@@ -1,30 +0,0 @@
-# $FreeBSD$
-
-.include "${.CURDIR}/Makefile.inc"
-
-PROG= at
-SRCS= at.c panic.c parsetime.c perm.c
-LINKS= ${BINDIR}/at ${BINDIR}/atq \
- ${BINDIR}/at ${BINDIR}/atrm \
- ${BINDIR}/at ${BINDIR}/batch
-MLINKS= at.1 batch.1 \
- at.1 atq.1 \
- at.1 atrm.1
-
-BINOWN= root
-BINMODE= 4555
-CLEANFILES+= at.1
-
-at.1: at.man
- @${ECHO} Making ${.TARGET:T} from ${.ALLSRC:T}; \
- sed -e \
- "s@_ATSPOOL_DIR@$(ATSPOOL_DIR)@g; \
- s@_ATJOB_DIR@$(ATJOB_DIR)@g; \
- s@_DEFAULT_BATCH_QUEUE@$(DEFAULT_BATCH_QUEUE)@g; \
- s@_DEFAULT_AT_QUEUE@$(DEFAULT_AT_QUEUE)@g; \
- s@_LOADAVG_MX@$(LOADAVG_MX)@g; \
- s@_PERM_PATH@$(PERM_PATH)@g; \
- s@_LOCKFILE@$(LOCKFILE)@g" \
- < ${.ALLSRC} > ${.TARGET}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/at/Makefile.inc b/usr.bin/at/Makefile.inc
deleted file mode 100644
index ec44e1f..0000000
--- a/usr.bin/at/Makefile.inc
+++ /dev/null
@@ -1,19 +0,0 @@
-VERSION= 2.9
-LOCKFILE = .lockfile
-ATSPOOL_DIR=/var/at/spool
-ATJOB_DIR=/var/at/jobs
-ATLIB_DIR=/usr/libexec
-LOADAVG_MX=1.5
-DAEMON_GID=1
-DAEMON_UID=1
-DEFAULT_BATCH_QUEUE=E
-DEFAULT_AT_QUEUE=c
-PERM_PATH=/var/at
-
-CFLAGS += -DATJOB_DIR=\"$(ATJOB_DIR)/\" \
- -DLFILE=\"$(ATJOB_DIR)/$(LOCKFILE)\" \
- -DLOADAVG_MX=$(LOADAVG_MX) -DATSPOOL_DIR=\"$(ATSPOOL_DIR)\" \
- -DVERSION=\"$(VERSION)\" -DDAEMON_UID=$(DAEMON_UID) -DDAEMON_GID=$(DAEMON_GID) \
- -DDEFAULT_BATCH_QUEUE=\'$(DEFAULT_BATCH_QUEUE)\' \
- -DDEFAULT_AT_QUEUE=\'$(DEFAULT_AT_QUEUE)\' -DPERM_PATH=\"$(PERM_PATH)/\"
-
diff --git a/usr.bin/at/at.c b/usr.bin/at/at.c
deleted file mode 100644
index 71d8e60..0000000
--- a/usr.bin/at/at.c
+++ /dev/null
@@ -1,889 +0,0 @@
-/*
- * at.c : Put file into atrun queue
- * Copyright (C) 1993, 1994 Thomas Koenig
- *
- * Atrun & Atq modifications
- * Copyright (C) 1993 David Parsons
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. The name of the author(s) may not be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#define _USE_BSD 1
-
-/* System Headers */
-
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/wait.h>
-#include <ctype.h>
-#include <dirent.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#ifndef __FreeBSD__
-#include <getopt.h>
-#endif
-#ifdef __FreeBSD__
-#include <locale.h>
-#endif
-#include <pwd.h>
-#include <signal.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-/* Local headers */
-
-#include "at.h"
-#include "panic.h"
-#include "parsetime.h"
-#include "perm.h"
-
-#define MAIN
-#include "privs.h"
-
-/* Macros */
-
-#ifndef ATJOB_DIR
-#define ATJOB_DIR "/usr/spool/atjobs/"
-#endif
-
-#ifndef LFILE
-#define LFILE ATJOB_DIR ".lockfile"
-#endif
-
-#ifndef ATJOB_MX
-#define ATJOB_MX 255
-#endif
-
-#define ALARMC 10 /* Number of seconds to wait for timeout */
-
-#define SIZE 255
-#define TIMESIZE 50
-
-enum { ATQ, ATRM, AT, BATCH, CAT }; /* what program we want to run */
-
-/* File scope variables */
-
-const char *no_export[] =
-{
- "TERM", "TERMCAP", "DISPLAY", "_"
-} ;
-static int send_mail = 0;
-
-/* External variables */
-
-extern char **environ;
-int fcreated;
-char atfile[] = ATJOB_DIR "12345678901234";
-
-char *atinput = (char*)0; /* where to get input from */
-char atqueue = 0; /* which queue to examine for jobs (atq) */
-char atverify = 0; /* verify time instead of queuing job */
-char *namep;
-
-/* Function declarations */
-
-static void sigc(int signo);
-static void alarmc(int signo);
-static char *cwdname(void);
-static void writefile(time_t runtimer, char queue);
-static void list_jobs(long *, int);
-static long nextjob(void);
-static time_t ttime(const char *arg);
-static int in_job_list(long, long *, int);
-static long *get_job_list(int, char *[], int *);
-
-/* Signal catching functions */
-
-static void sigc(int signo __unused)
-{
-/* If the user presses ^C, remove the spool file and exit
- */
- if (fcreated)
- {
- PRIV_START
- unlink(atfile);
- PRIV_END
- }
-
- _exit(EXIT_FAILURE);
-}
-
-static void alarmc(int signo __unused)
-{
- char buf[1024];
-
- /* Time out after some seconds. */
- strlcpy(buf, namep, sizeof(buf));
- strlcat(buf, ": file locking timed out\n", sizeof(buf));
- write(STDERR_FILENO, buf, strlen(buf));
- sigc(0);
-}
-
-/* Local functions */
-
-static char *cwdname(void)
-{
-/* Read in the current directory; the name will be overwritten on
- * subsequent calls.
- */
- static char *ptr = NULL;
- static size_t size = SIZE;
-
- if (ptr == NULL)
- if ((ptr = malloc(size)) == NULL)
- errx(EXIT_FAILURE, "virtual memory exhausted");
-
- while (1)
- {
- if (ptr == NULL)
- panic("out of memory");
-
- if (getcwd(ptr, size-1) != NULL)
- return ptr;
-
- if (errno != ERANGE)
- perr("cannot get directory");
-
- free (ptr);
- size += SIZE;
- if ((ptr = malloc(size)) == NULL)
- errx(EXIT_FAILURE, "virtual memory exhausted");
- }
-}
-
-static long
-nextjob()
-{
- long jobno;
- FILE *fid;
-
- if ((fid = fopen(ATJOB_DIR ".SEQ", "r+")) != NULL) {
- if (fscanf(fid, "%5lx", &jobno) == 1) {
- rewind(fid);
- jobno = (1+jobno) % 0xfffff; /* 2^20 jobs enough? */
- fprintf(fid, "%05lx\n", jobno);
- }
- else
- jobno = EOF;
- fclose(fid);
- return jobno;
- }
- else if ((fid = fopen(ATJOB_DIR ".SEQ", "w")) != NULL) {
- fprintf(fid, "%05lx\n", jobno = 1);
- fclose(fid);
- return 1;
- }
- return EOF;
-}
-
-static void
-writefile(time_t runtimer, char queue)
-{
-/* This does most of the work if at or batch are invoked for writing a job.
- */
- long jobno;
- char *ap, *ppos, *mailname;
- struct passwd *pass_entry;
- struct stat statbuf;
- int fdes, lockdes, fd2;
- FILE *fp, *fpin;
- struct sigaction act;
- char **atenv;
- int ch;
- mode_t cmask;
- struct flock lock;
-
-#ifdef __FreeBSD__
- (void) setlocale(LC_TIME, "");
-#endif
-
-/* Install the signal handler for SIGINT; terminate after removing the
- * spool file if necessary
- */
- act.sa_handler = sigc;
- sigemptyset(&(act.sa_mask));
- act.sa_flags = 0;
-
- sigaction(SIGINT, &act, NULL);
-
- ppos = atfile + strlen(ATJOB_DIR);
-
- /* Loop over all possible file names for running something at this
- * particular time, see if a file is there; the first empty slot at any
- * particular time is used. Lock the file LFILE first to make sure
- * we're alone when doing this.
- */
-
- PRIV_START
-
- if ((lockdes = open(LFILE, O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR)) < 0)
- perr("cannot open lockfile " LFILE);
-
- lock.l_type = F_WRLCK; lock.l_whence = SEEK_SET; lock.l_start = 0;
- lock.l_len = 0;
-
- act.sa_handler = alarmc;
- sigemptyset(&(act.sa_mask));
- act.sa_flags = 0;
-
- /* Set an alarm so a timeout occurs after ALARMC seconds, in case
- * something is seriously broken.
- */
- sigaction(SIGALRM, &act, NULL);
- alarm(ALARMC);
- fcntl(lockdes, F_SETLKW, &lock);
- alarm(0);
-
- if ((jobno = nextjob()) == EOF)
- perr("cannot generate job number");
-
- sprintf(ppos, "%c%5lx%8lx", queue,
- jobno, (unsigned long) (runtimer/60));
-
- for(ap=ppos; *ap != '\0'; ap ++)
- if (*ap == ' ')
- *ap = '0';
-
- if (stat(atfile, &statbuf) != 0)
- if (errno != ENOENT)
- perr("cannot access " ATJOB_DIR);
-
- /* Create the file. The x bit is only going to be set after it has
- * been completely written out, to make sure it is not executed in the
- * meantime. To make sure they do not get deleted, turn off their r
- * bit. Yes, this is a kluge.
- */
- cmask = umask(S_IRUSR | S_IWUSR | S_IXUSR);
- if ((fdes = creat(atfile, O_WRONLY)) == -1)
- perr("cannot create atjob file");
-
- if ((fd2 = dup(fdes)) <0)
- perr("error in dup() of job file");
-
- if(fchown(fd2, real_uid, real_gid) != 0)
- perr("cannot give away file");
-
- PRIV_END
-
- /* We no longer need suid root; now we just need to be able to write
- * to the directory, if necessary.
- */
-
- REDUCE_PRIV(DAEMON_UID, DAEMON_GID)
-
- /* We've successfully created the file; let's set the flag so it
- * gets removed in case of an interrupt or error.
- */
- fcreated = 1;
-
- /* Now we can release the lock, so other people can access it
- */
- lock.l_type = F_UNLCK; lock.l_whence = SEEK_SET; lock.l_start = 0;
- lock.l_len = 0;
- fcntl(lockdes, F_SETLKW, &lock);
- close(lockdes);
-
- if((fp = fdopen(fdes, "w")) == NULL)
- panic("cannot reopen atjob file");
-
- /* Get the userid to mail to, first by trying getlogin(),
- * then from LOGNAME, finally from getpwuid().
- */
- mailname = getlogin();
- if (mailname == NULL)
- mailname = getenv("LOGNAME");
-
- if ((mailname == NULL) || (mailname[0] == '\0')
- || (strlen(mailname) >= MAXLOGNAME) || (getpwnam(mailname)==NULL))
- {
- pass_entry = getpwuid(real_uid);
- if (pass_entry != NULL)
- mailname = pass_entry->pw_name;
- }
-
- if (atinput != (char *) NULL)
- {
- fpin = freopen(atinput, "r", stdin);
- if (fpin == NULL)
- perr("cannot open input file");
- }
- fprintf(fp, "#!/bin/sh\n# atrun uid=%ld gid=%ld\n# mail %*s %d\n",
- (long) real_uid, (long) real_gid, MAXLOGNAME - 1, mailname,
- send_mail);
-
- /* Write out the umask at the time of invocation
- */
- fprintf(fp, "umask %lo\n", (unsigned long) cmask);
-
- /* Write out the environment. Anything that may look like a
- * special character to the shell is quoted, except for \n, which is
- * done with a pair of "'s. Don't export the no_export list (such
- * as TERM or DISPLAY) because we don't want these.
- */
- for (atenv= environ; *atenv != NULL; atenv++)
- {
- int export = 1;
- char *eqp;
-
- eqp = strchr(*atenv, '=');
- if (ap == NULL)
- eqp = *atenv;
- else
- {
- size_t i;
- for (i=0; i<sizeof(no_export)/sizeof(no_export[0]); i++)
- {
- export = export
- && (strncmp(*atenv, no_export[i],
- (size_t) (eqp-*atenv)) != 0);
- }
- eqp++;
- }
-
- if (export)
- {
- fwrite(*atenv, sizeof(char), eqp-*atenv, fp);
- for(ap = eqp;*ap != '\0'; ap++)
- {
- if (*ap == '\n')
- fprintf(fp, "\"\n\"");
- else
- {
- if (!isalnum(*ap)) {
- switch (*ap) {
- case '%': case '/': case '{': case '[':
- case ']': case '=': case '}': case '@':
- case '+': case '#': case ',': case '.':
- case ':': case '-': case '_':
- break;
- default:
- fputc('\\', fp);
- break;
- }
- }
- fputc(*ap, fp);
- }
- }
- fputs("; export ", fp);
- fwrite(*atenv, sizeof(char), eqp-*atenv -1, fp);
- fputc('\n', fp);
-
- }
- }
- /* Cd to the directory at the time and write out all the
- * commands the user supplies from stdin.
- */
- fprintf(fp, "cd ");
- for (ap = cwdname(); *ap != '\0'; ap++)
- {
- if (*ap == '\n')
- fprintf(fp, "\"\n\"");
- else
- {
- if (*ap != '/' && !isalnum(*ap))
- fputc('\\', fp);
-
- fputc(*ap, fp);
- }
- }
- /* Test cd's exit status: die if the original directory has been
- * removed, become unreadable or whatever
- */
- fprintf(fp, " || {\n\t echo 'Execution directory "
- "inaccessible' >&2\n\t exit 1\n}\n");
-
- while((ch = getchar()) != EOF)
- fputc(ch, fp);
-
- fprintf(fp, "\n");
- if (ferror(fp))
- panic("output error");
-
- if (ferror(stdin))
- panic("input error");
-
- fclose(fp);
-
- /* Set the x bit so that we're ready to start executing
- */
-
- if (fchmod(fd2, S_IRUSR | S_IWUSR | S_IXUSR) < 0)
- perr("cannot give away file");
-
- close(fd2);
- fprintf(stderr, "Job %ld will be executed using /bin/sh\n", jobno);
-}
-
-static int
-in_job_list(long job, long *joblist, int len)
-{
- int i;
-
- for (i = 0; i < len; i++)
- if (job == joblist[i])
- return 1;
-
- return 0;
-}
-
-static void
-list_jobs(long *joblist, int len)
-{
- /* List all a user's jobs in the queue, by looping through ATJOB_DIR,
- * or everybody's if we are root
- */
- struct passwd *pw;
- DIR *spool;
- struct dirent *dirent;
- struct stat buf;
- struct tm runtime;
- unsigned long ctm;
- char queue;
- long jobno;
- time_t runtimer;
- char timestr[TIMESIZE];
- int first=1;
-
-#ifdef __FreeBSD__
- (void) setlocale(LC_TIME, "");
-#endif
-
- PRIV_START
-
- if (chdir(ATJOB_DIR) != 0)
- perr("cannot change to " ATJOB_DIR);
-
- if ((spool = opendir(".")) == NULL)
- perr("cannot open " ATJOB_DIR);
-
- /* Loop over every file in the directory
- */
- while((dirent = readdir(spool)) != NULL) {
- if (stat(dirent->d_name, &buf) != 0)
- perr("cannot stat in " ATJOB_DIR);
-
- /* See it's a regular file and has its x bit turned on and
- * is the user's
- */
- if (!S_ISREG(buf.st_mode)
- || ((buf.st_uid != real_uid) && ! (real_uid == 0))
- || !(S_IXUSR & buf.st_mode || atverify))
- continue;
-
- if(sscanf(dirent->d_name, "%c%5lx%8lx", &queue, &jobno, &ctm)!=3)
- continue;
-
- /* If jobs are given, only list those jobs */
- if (joblist && !in_job_list(jobno, joblist, len))
- continue;
-
- if (atqueue && (queue != atqueue))
- continue;
-
- runtimer = 60*(time_t) ctm;
- runtime = *localtime(&runtimer);
- strftime(timestr, TIMESIZE, "%+", &runtime);
- if (first) {
- printf("Date\t\t\t\tOwner\t\tQueue\tJob#\n");
- first=0;
- }
- pw = getpwuid(buf.st_uid);
-
- printf("%s\t%-16s%c%s\t%ld\n",
- timestr,
- pw ? pw->pw_name : "???",
- queue,
- (S_IXUSR & buf.st_mode) ? "":"(done)",
- jobno);
- }
- PRIV_END
-}
-
-static void
-process_jobs(int argc, char **argv, int what)
-{
- /* Delete every argument (job - ID) given
- */
- int i;
- struct stat buf;
- DIR *spool;
- struct dirent *dirent;
- unsigned long ctm;
- char queue;
- long jobno;
-
- PRIV_START
-
- if (chdir(ATJOB_DIR) != 0)
- perr("cannot change to " ATJOB_DIR);
-
- if ((spool = opendir(".")) == NULL)
- perr("cannot open " ATJOB_DIR);
-
- PRIV_END
-
- /* Loop over every file in the directory
- */
- while((dirent = readdir(spool)) != NULL) {
-
- PRIV_START
- if (stat(dirent->d_name, &buf) != 0)
- perr("cannot stat in " ATJOB_DIR);
- PRIV_END
-
- if(sscanf(dirent->d_name, "%c%5lx%8lx", &queue, &jobno, &ctm)!=3)
- continue;
-
- for (i=optind; i < argc; i++) {
- if (atoi(argv[i]) == jobno) {
- if ((buf.st_uid != real_uid) && !(real_uid == 0))
- errx(EXIT_FAILURE, "%s: not owner", argv[i]);
- switch (what) {
- case ATRM:
-
- PRIV_START
-
- if (unlink(dirent->d_name) != 0)
- perr(dirent->d_name);
-
- PRIV_END
-
- break;
-
- case CAT:
- {
- FILE *fp;
- int ch;
-
- PRIV_START
-
- fp = fopen(dirent->d_name,"r");
-
- PRIV_END
-
- if (!fp) {
- perr("cannot open file");
- }
- while((ch = getc(fp)) != EOF) {
- putchar(ch);
- }
- }
- break;
-
- default:
- errx(EXIT_FAILURE, "internal error, process_jobs = %d",
- what);
- }
- }
- }
- }
-} /* delete_jobs */
-
-#define ATOI2(ar) ((ar)[0] - '0') * 10 + ((ar)[1] - '0'); (ar) += 2;
-
-static time_t
-ttime(const char *arg)
-{
- /*
- * This is pretty much a copy of stime_arg1() from touch.c. I changed
- * the return value and the argument list because it's more convenient
- * (IMO) to do everything in one place. - Joe Halpin
- */
- struct timeval tv[2];
- time_t now;
- struct tm *t;
- int yearset;
- char *p;
-
- if (gettimeofday(&tv[0], NULL))
- panic("Cannot get current time");
-
- /* Start with the current time. */
- now = tv[0].tv_sec;
- if ((t = localtime(&now)) == NULL)
- panic("localtime");
- /* [[CC]YY]MMDDhhmm[.SS] */
- if ((p = strchr(arg, '.')) == NULL)
- t->tm_sec = 0; /* Seconds defaults to 0. */
- else {
- if (strlen(p + 1) != 2)
- goto terr;
- *p++ = '\0';
- t->tm_sec = ATOI2(p);
- }
-
- yearset = 0;
- switch(strlen(arg)) {
- case 12: /* CCYYMMDDhhmm */
- t->tm_year = ATOI2(arg);
- t->tm_year *= 100;
- yearset = 1;
- /* FALLTHROUGH */
- case 10: /* YYMMDDhhmm */
- if (yearset) {
- yearset = ATOI2(arg);
- t->tm_year += yearset;
- } else {
- yearset = ATOI2(arg);
- t->tm_year = yearset + 2000;
- }
- t->tm_year -= 1900; /* Convert to UNIX time. */
- /* FALLTHROUGH */
- case 8: /* MMDDhhmm */
- t->tm_mon = ATOI2(arg);
- --t->tm_mon; /* Convert from 01-12 to 00-11 */
- t->tm_mday = ATOI2(arg);
- t->tm_hour = ATOI2(arg);
- t->tm_min = ATOI2(arg);
- break;
- default:
- goto terr;
- }
-
- t->tm_isdst = -1; /* Figure out DST. */
- tv[0].tv_sec = tv[1].tv_sec = mktime(t);
- if (tv[0].tv_sec != -1)
- return tv[0].tv_sec;
- else
-terr:
- panic(
- "out of range or illegal time specification: [[CC]YY]MMDDhhmm[.SS]");
-}
-
-static long *
-get_job_list(int argc, char *argv[], int *joblen)
-{
- int i, len;
- long *joblist;
- char *ep;
-
- joblist = NULL;
- len = argc;
- if (len > 0) {
- if ((joblist = malloc(len * sizeof(*joblist))) == NULL)
- panic("out of memory");
-
- for (i = 0; i < argc; i++) {
- errno = 0;
- if ((joblist[i] = strtol(argv[i], &ep, 10)) < 0 ||
- ep == argv[i] || *ep != '\0' || errno)
- panic("invalid job number");
- }
- }
-
- *joblen = len;
- return joblist;
-}
-
-int
-main(int argc, char **argv)
-{
- int c;
- char queue = DEFAULT_AT_QUEUE;
- char queue_set = 0;
- char *pgm;
-
- int program = AT; /* our default program */
- const char *options = "q:f:t:rmvldbc"; /* default options for at */
- time_t timer;
- long *joblist;
- int joblen;
-
- joblist = NULL;
- joblen = 0;
- timer = -1;
- RELINQUISH_PRIVS
-
- /* Eat any leading paths
- */
- if ((pgm = strrchr(argv[0], '/')) == NULL)
- pgm = argv[0];
- else
- pgm++;
-
- namep = pgm;
-
- /* find out what this program is supposed to do
- */
- if (strcmp(pgm, "atq") == 0) {
- program = ATQ;
- options = "q:v";
- }
- else if (strcmp(pgm, "atrm") == 0) {
- program = ATRM;
- options = "";
- }
- else if (strcmp(pgm, "batch") == 0) {
- program = BATCH;
- options = "f:q:mv";
- }
-
- /* process whatever options we can process
- */
- opterr=1;
- while ((c=getopt(argc, argv, options)) != -1)
- switch (c) {
- case 'v': /* verify time settings */
- atverify = 1;
- break;
-
- case 'm': /* send mail when job is complete */
- send_mail = 1;
- break;
-
- case 'f':
- atinput = optarg;
- break;
-
- case 'q': /* specify queue */
- if (strlen(optarg) > 1)
- usage();
-
- atqueue = queue = *optarg;
- if (!(islower(queue)||isupper(queue)))
- usage();
-
- queue_set = 1;
- break;
-
- case 'd':
- warnx("-d is deprecated; use -r instead");
- /* fall through to 'r' */
-
- case 'r':
- if (program != AT)
- usage();
-
- program = ATRM;
- options = "";
- break;
-
- case 't':
- if (program != AT)
- usage();
- timer = ttime(optarg);
- break;
-
- case 'l':
- if (program != AT)
- usage();
-
- program = ATQ;
- options = "q:";
- break;
-
- case 'b':
- if (program != AT)
- usage();
-
- program = BATCH;
- options = "f:q:mv";
- break;
-
- case 'c':
- program = CAT;
- options = "";
- break;
-
- default:
- usage();
- break;
- }
- /* end of options eating
- */
-
- /* select our program
- */
- if(!check_permission())
- errx(EXIT_FAILURE, "you do not have permission to use this program");
- switch (program) {
- case ATQ:
-
- REDUCE_PRIV(DAEMON_UID, DAEMON_GID)
-
- if (queue_set == 0)
- joblist = get_job_list(argc - optind, argv + optind, &joblen);
- list_jobs(joblist, joblen);
- break;
-
- case ATRM:
-
- REDUCE_PRIV(DAEMON_UID, DAEMON_GID)
-
- process_jobs(argc, argv, ATRM);
- break;
-
- case CAT:
-
- process_jobs(argc, argv, CAT);
- break;
-
- case AT:
- /*
- * If timer is > -1, then the user gave the time with -t. In that
- * case, it's already been set. If not, set it now.
- */
- if (timer == -1)
- timer = parsetime(argc, argv);
-
- if (atverify)
- {
- struct tm *tm = localtime(&timer);
- fprintf(stderr, "%s\n", asctime(tm));
- }
- writefile(timer, queue);
- break;
-
- case BATCH:
- if (queue_set)
- queue = toupper(queue);
- else
- queue = DEFAULT_BATCH_QUEUE;
-
- if (argc > optind)
- timer = parsetime(argc, argv);
- else
- timer = time(NULL);
-
- if (atverify)
- {
- struct tm *tm = localtime(&timer);
- fprintf(stderr, "%s\n", asctime(tm));
- }
-
- writefile(timer, queue);
- break;
-
- default:
- panic("internal error");
- break;
- }
- exit(EXIT_SUCCESS);
-}
diff --git a/usr.bin/at/at.h b/usr.bin/at/at.h
deleted file mode 100644
index 3d72bbb..0000000
--- a/usr.bin/at/at.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * at.h - header for at(1)
- * Copyright (C) 1993 Thomas Koenig
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. The name of the author(s) may not be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-extern int fcreated;
-extern char *namep;
-extern char atfile[];
-extern char atverify;
diff --git a/usr.bin/at/at.man b/usr.bin/at/at.man
deleted file mode 100644
index bca1051..0000000
--- a/usr.bin/at/at.man
+++ /dev/null
@@ -1,361 +0,0 @@
-.\" $FreeBSD$
-.Dd January 13, 2002
-.Dt "AT" 1
-.Os
-.Sh NAME
-.Nm at ,
-.Nm batch ,
-.Nm atq ,
-.Nm atrm
-.Nd queue, examine or delete jobs for later execution
-.Sh SYNOPSIS
-.Nm at
-.Op Fl q Ar queue
-.Op Fl f Ar file
-.Op Fl mldbv
-.Ar time
-.Nm at
-.Op Fl q Ar queue
-.Op Fl f Ar file
-.Op Fl mldbv
-.Fl t
-.Sm off
-.Op Oo Ar CC Oc Ar YY
-.Ar MM DD hh mm Op . Ar SS
-.Sm on
-.Nm at
-.Fl c Ar job Op Ar job ...
-.Nm at
-.Fl l Op Ar job ...
-.Nm at
-.Fl l
-.Fl q Ar queue
-.Nm at
-.Fl r Ar job Op Ar job ...
-.Pp
-.Nm atq
-.Op Fl q Ar queue
-.Op Fl v
-.Pp
-.Nm atrm
-.Ar job
-.Op Ar job ...
-.Pp
-.Nm batch
-.Op Fl q Ar queue
-.Op Fl f Ar file
-.Op Fl mv
-.Op Ar time
-.Sh DESCRIPTION
-The
-.Nm at
-and
-.Nm batch
-utilities
-read commands from standard input or a specified file which are to
-be executed at a later time, using
-.Xr sh 1 .
-.Bl -tag -width indent
-.It Nm at
-executes commands at a specified time;
-.It Nm atq
-lists the user's pending jobs, unless the user is the superuser; in that
-case, everybody's jobs are listed;
-.It Nm atrm
-deletes jobs;
-.It Nm batch
-executes commands when system load levels permit; in other words, when the load average
-drops below _LOADAVG_MX, or the value specified in the invocation of
-.Nm atrun .
-.El
-.Pp
-The
-.Nm at
-utility allows some moderately complex
-.Ar time
-specifications.
-It accepts times of the form
-.Ar HHMM
-or
-.Ar HH:MM
-to run a job at a specific time of day.
-(If that time is already past, the next day is assumed.)
-As an alternative, the following keywords may be specified:
-.Em midnight ,
-.Em noon ,
-or
-.Em teatime
-(4pm)
-and time-of-day may be suffixed with
-.Em AM
-or
-.Em PM
-for running in the morning or the evening.
-The day on which the job is to be run may also be specified
-by giving a date in the form
-.Ar \%month-name day
-with an optional
-.Ar year ,
-or giving a date of the forms
-.Ar DD.MM.YYYY ,
-.Ar DD.MM.YY ,
-.Ar MM/DD/YYYY ,
-.Ar MM/DD/YY ,
-.Ar MMDDYYYY , or
-.Ar MMDDYY .
-The specification of a date must follow the specification of
-the time of day.
-Time can also be specified as:
-.Op Em now
-.Em + Ar count \%time-units ,
-where the time-units can be
-.Em minutes ,
-.Em hours ,
-.Em days ,
-.Em weeks ,
-.Em months
-or
-.Em years
-and
-.Nm
-may be told to run the job today by suffixing the time with
-.Em today
-and to run the job tomorrow by suffixing the time with
-.Em tomorrow .
-.Pp
-For example, to run a job at 4pm three days from now, use
-.Nm at Ar 4pm + 3 days ,
-to run a job at 10:00am on July 31, use
-.Nm at Ar 10am Jul 31
-and to run a job at 1am tomorrow, use
-.Nm at Ar 1am tomorrow .
-.Pp
-The
-.Nm at
-utility also supports the
-.Tn POSIX
-time format (see
-.Fl t
-option).
-.Pp
-For both
-.Nm
-and
-.Nm batch ,
-commands are read from standard input or the file specified
-with the
-.Fl f
-option and executed.
-The working directory, the environment (except for the variables
-.Ev TERM ,
-.Ev TERMCAP ,
-.Ev DISPLAY
-and
-.Em _ )
-and the
-.Ar umask
-are retained from the time of invocation.
-An
-.Nm
-or
-.Nm batch
-command invoked from a
-.Xr su 1
-shell will retain the current userid.
-The user will be mailed standard error and standard output from his
-commands, if any.
-Mail will be sent using the command
-.Xr sendmail 8 .
-If
-.Nm
-is executed from a
-.Xr su 1
-shell, the owner of the login shell will receive the mail.
-.Pp
-The superuser may use these commands in any case.
-For other users, permission to use
-.Nm
-is determined by the files
-.Pa _PERM_PATH/at.allow
-and
-.Pa _PERM_PATH/at.deny .
-.Pp
-If the file
-.Pa _PERM_PATH/at.allow
-exists, only usernames mentioned in it are allowed to use
-.Nm .
-In these two files, a user is considered to be listed only if the user
-name has no blank or other characters before it on its line and a
-newline character immediately after the name, even at the end of
-the file.
-Other lines are ignored and may be used for comments.
-.Pp
-If
-.Pa _PERM_PATH/at.allow
-does not exist,
-.Pa _PERM_PATH/at.deny
-is checked, every username not mentioned in it is then allowed
-to use
-.Nm .
-.Pp
-If neither exists, only the superuser is allowed use of
-.Nm .
-This is the default configuration.
-.Sh IMPLEMENTATION NOTES
-Note that
-.Nm
-is implemented through the
-.Xr cron 8
-daemon by calling
-.Xr atrun 8
-every five minutes.
-This implies that the granularity of
-.Nm
-might not be optimal for every deployment.
-If a finer granularity is needed, the system crontab at
-.Pa /etc/crontab
-needs to be changed.
-.Sh OPTIONS
-.Bl -tag -width indent
-.It Fl q Ar queue
-Use the specified queue.
-A queue designation consists of a single letter; valid queue designations
-range from
-.Ar a
-to
-.Ar z
-and
-.Ar A
-to
-.Ar Z .
-The
-.Ar _DEFAULT_AT_QUEUE
-queue is the default for
-.Nm
-and the
-.Ar _DEFAULT_BATCH_QUEUE
-queue for
-.Nm batch .
-Queues with higher letters run with increased niceness.
-If a job is submitted to a queue designated with an uppercase letter, it
-is treated as if it had been submitted to batch at that time.
-If
-.Nm atq
-is given a specific queue, it will only show jobs pending in that queue.
-.It Fl m
-Send mail to the user when the job has completed even if there was no
-output.
-.It Fl f Ar file
-Read the job from
-.Ar file
-rather than standard input.
-.It Fl l
-With no arguments, list all jobs for the invoking user.
-If one or more
-job numbers are given, list only those jobs.
-.It Fl d
-Is an alias for
-.Nm atrm
-(this option is deprecated; use
-.Fl r
-instead).
-.It Fl b
-Is an alias for
-.Nm batch .
-.It Fl v
-For
-.Nm atq ,
-shows completed but not yet deleted jobs in the queue; otherwise
-shows the time the job will be executed.
-.It Fl c
-Cat the jobs listed on the command line to standard output.
-.It Fl r
-Remove the specified jobs.
-.It Fl t
-Specify the job time using the \*[Px] time format.
-The argument should be in the form
-.Sm off
-.Op Oo Ar CC Oc Ar YY
-.Ar MM DD hh mm Op . Ar SS
-.Sm on
-where each pair of letters represents the following:
-.Pp
-.Bl -tag -width indent -compact -offset indent
-.It Ar CC
-The first two digits of the year (the century).
-.It Ar YY
-The second two digits of the year.
-.It Ar MM
-The month of the year, from 1 to 12.
-.It Ar DD
-the day of the month, from 1 to 31.
-.It Ar hh
-The hour of the day, from 0 to 23.
-.It Ar mm
-The minute of the hour, from 0 to 59.
-.It Ar SS
-The second of the minute, from 0 to 61.
-.El
-.Pp
-If the
-.Ar CC
-and
-.Ar YY
-letter pairs are not specified, the values default to the current
-year.
-If the
-.Ar SS
-letter pair is not specified, the value defaults to 0.
-.El
-.Sh FILES
-.Bl -tag -width _ATJOB_DIR/_LOCKFILE -compact
-.It Pa _ATJOB_DIR
-directory containing job files
-.It Pa _ATSPOOL_DIR
-directory containing output spool files
-.It Pa /var/run/utmp
-login records
-.It Pa _PERM_PATH/at.allow
-allow permission control
-.It Pa _PERM_PATH/at.deny
-deny permission control
-.It Pa _ATJOB_DIR/_LOCKFILE
-job-creation lock file
-.El
-.Sh SEE ALSO
-.Xr nice 1 ,
-.Xr sh 1 ,
-.Xr umask 2 ,
-.Xr atrun 8 ,
-.Xr cron 8 ,
-.Xr sendmail 8
-.Sh AUTHORS
-At was mostly written by
-.An Thomas Koenig Aq ig25@rz.uni-karlsruhe.de .
-The time parsing routines are by
-.An David Parsons Aq orc@pell.chi.il.us ,
-with minor enhancements by
-.An Joe Halpin Aq joe.halpin@attbi.com .
-.Sh BUGS
-If the file
-.Pa /var/run/utmp
-is not available or corrupted, or if the user is not logged on at the
-time
-.Nm
-is invoked, the mail is sent to the userid found
-in the environment variable
-.Ev LOGNAME .
-If that is undefined or empty, the current userid is assumed.
-.Pp
-The
-.Nm at
-and
-.Nm batch
-utilities
-as presently implemented are not suitable when users are competing for
-resources.
-If this is the case, another batch system such as
-.Em nqs
-may be more suitable.
-.Pp
-Specifying a date past 2038 may not work on some systems.
diff --git a/usr.bin/at/panic.c b/usr.bin/at/panic.c
deleted file mode 100644
index ef5265b..0000000
--- a/usr.bin/at/panic.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * panic.c - terminate fast in case of error
- * Copyright (C) 1993 Thomas Koenig
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. The name of the author(s) may not be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/* System Headers */
-
-#include <err.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-/* Local headers */
-
-#include "panic.h"
-#include "privs.h"
-#include "at.h"
-
-/* External variables */
-
-/* Global functions */
-
-void
-panic(const char *a)
-{
-/* Something fatal has happened, print error message and exit.
- */
- if (fcreated) {
- PRIV_START
- unlink(atfile);
- PRIV_END
- }
-
- errx(EXIT_FAILURE, "%s", a);
-}
-
-void
-perr(const char *a)
-{
-/* Some operating system error; print error message and exit.
- */
- int serrno = errno;
-
- if (fcreated) {
- PRIV_START
- unlink(atfile);
- PRIV_END
- }
-
- errno = serrno;
- err(EXIT_FAILURE, "%s", a);
-}
-
-void
-usage(void)
-{
- /* Print usage and exit. */
- fprintf(stderr, "usage: at [-q x] [-f file] [-m] time\n"
- " at -c job [job ...]\n"
- " at [-f file] -t [[CC]YY]MMDDhhmm[.SS]\n"
- " at -r job [job ...]\n"
- " at -l -q queuename\n"
- " at -l [job ...]\n"
- " atq [-q x] [-v]\n"
- " atrm job [job ...]\n"
- " batch [-f file] [-m]\n");
- exit(EXIT_FAILURE);
-}
diff --git a/usr.bin/at/panic.h b/usr.bin/at/panic.h
deleted file mode 100644
index 832de83..0000000
--- a/usr.bin/at/panic.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * panic.h - header for at(1)
- * Copyright (C) 1993 Thomas Koenig
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. The name of the author(s) may not be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/cdefs.h>
-
-void panic(const char *a) __dead2;
-void perr(const char *a) __dead2;
-void usage(void) __dead2;
diff --git a/usr.bin/at/parsetime.c b/usr.bin/at/parsetime.c
deleted file mode 100644
index 195a38d..0000000
--- a/usr.bin/at/parsetime.c
+++ /dev/null
@@ -1,634 +0,0 @@
-/*
- * parsetime.c - parse time for at(1)
- * Copyright (C) 1993, 1994 Thomas Koenig
- *
- * modifications for English-language times
- * Copyright (C) 1993 David Parsons
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. The name of the author(s) may not be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * at [NOW] PLUS NUMBER MINUTES|HOURS|DAYS|WEEKS
- * /NUMBER [DOT NUMBER] [AM|PM]\ /[MONTH NUMBER [NUMBER]] \
- * |NOON | |[TOMORROW] |
- * |MIDNIGHT | |[DAY OF WEEK] |
- * \TEATIME / |NUMBER [SLASH NUMBER [SLASH NUMBER]]|
- * \PLUS NUMBER MINUTES|HOURS|DAYS|WEEKS/
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/* System Headers */
-
-#include <sys/types.h>
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-#ifndef __FreeBSD__
-#include <getopt.h>
-#endif
-
-/* Local headers */
-
-#include "at.h"
-#include "panic.h"
-#include "parsetime.h"
-
-
-/* Structures and unions */
-
-enum { /* symbols */
- MIDNIGHT, NOON, TEATIME,
- PM, AM, TOMORROW, TODAY, NOW,
- MINUTES, HOURS, DAYS, WEEKS, MONTHS, YEARS,
- NUMBER, PLUS, DOT, SLASH, ID, JUNK,
- JAN, FEB, MAR, APR, MAY, JUN,
- JUL, AUG, SEP, OCT, NOV, DEC,
- SUN, MON, TUE, WED, THU, FRI, SAT
- };
-
-/* parse translation table - table driven parsers can be your FRIEND!
- */
-struct {
- const char *name; /* token name */
- int value; /* token id */
- int plural; /* is this plural? */
-} Specials[] = {
- { "midnight", MIDNIGHT,0 }, /* 00:00:00 of today or tomorrow */
- { "noon", NOON,0 }, /* 12:00:00 of today or tomorrow */
- { "teatime", TEATIME,0 }, /* 16:00:00 of today or tomorrow */
- { "am", AM,0 }, /* morning times for 0-12 clock */
- { "pm", PM,0 }, /* evening times for 0-12 clock */
- { "tomorrow", TOMORROW,0 }, /* execute 24 hours from time */
- { "today", TODAY, 0 }, /* execute today - don't advance time */
- { "now", NOW,0 }, /* opt prefix for PLUS */
-
- { "minute", MINUTES,0 }, /* minutes multiplier */
- { "minutes", MINUTES,1 }, /* (pluralized) */
- { "hour", HOURS,0 }, /* hours ... */
- { "hours", HOURS,1 }, /* (pluralized) */
- { "day", DAYS,0 }, /* days ... */
- { "days", DAYS,1 }, /* (pluralized) */
- { "week", WEEKS,0 }, /* week ... */
- { "weeks", WEEKS,1 }, /* (pluralized) */
- { "month", MONTHS,0 }, /* month ... */
- { "months", MONTHS,1 }, /* (pluralized) */
- { "year", YEARS,0 }, /* year ... */
- { "years", YEARS,1 }, /* (pluralized) */
- { "jan", JAN,0 },
- { "feb", FEB,0 },
- { "mar", MAR,0 },
- { "apr", APR,0 },
- { "may", MAY,0 },
- { "jun", JUN,0 },
- { "jul", JUL,0 },
- { "aug", AUG,0 },
- { "sep", SEP,0 },
- { "oct", OCT,0 },
- { "nov", NOV,0 },
- { "dec", DEC,0 },
- { "january", JAN,0 },
- { "february", FEB,0 },
- { "march", MAR,0 },
- { "april", APR,0 },
- { "may", MAY,0 },
- { "june", JUN,0 },
- { "july", JUL,0 },
- { "august", AUG,0 },
- { "september", SEP,0 },
- { "october", OCT,0 },
- { "november", NOV,0 },
- { "december", DEC,0 },
- { "sunday", SUN, 0 },
- { "sun", SUN, 0 },
- { "monday", MON, 0 },
- { "mon", MON, 0 },
- { "tuesday", TUE, 0 },
- { "tue", TUE, 0 },
- { "wednesday", WED, 0 },
- { "wed", WED, 0 },
- { "thursday", THU, 0 },
- { "thu", THU, 0 },
- { "friday", FRI, 0 },
- { "fri", FRI, 0 },
- { "saturday", SAT, 0 },
- { "sat", SAT, 0 },
-} ;
-
-/* File scope variables */
-
-static char **scp; /* scanner - pointer at arglist */
-static char scc; /* scanner - count of remaining arguments */
-static char *sct; /* scanner - next char pointer in current argument */
-static int need; /* scanner - need to advance to next argument */
-
-static char *sc_token; /* scanner - token buffer */
-static size_t sc_len; /* scanner - length of token buffer */
-static int sc_tokid; /* scanner - token id */
-static int sc_tokplur; /* scanner - is token plural? */
-
-/* Local functions */
-
-/*
- * parse a token, checking if it's something special to us
- */
-static int
-parse_token(char *arg)
-{
- size_t i;
-
- for (i=0; i<(sizeof Specials/sizeof Specials[0]); i++)
- if (strcasecmp(Specials[i].name, arg) == 0) {
- sc_tokplur = Specials[i].plural;
- return sc_tokid = Specials[i].value;
- }
-
- /* not special - must be some random id */
- return ID;
-} /* parse_token */
-
-
-/*
- * init_scanner() sets up the scanner to eat arguments
- */
-static void
-init_scanner(int argc, char **argv)
-{
- scp = argv;
- scc = argc;
- need = 1;
- sc_len = 1;
- while (argc-- > 0)
- sc_len += strlen(*argv++);
-
- if ((sc_token = malloc(sc_len)) == NULL)
- errx(EXIT_FAILURE, "virtual memory exhausted");
-} /* init_scanner */
-
-/*
- * token() fetches a token from the input stream
- */
-static int
-token(void)
-{
- int idx;
-
- while (1) {
- memset(sc_token, 0, sc_len);
- sc_tokid = EOF;
- sc_tokplur = 0;
- idx = 0;
-
- /* if we need to read another argument, walk along the argument list;
- * when we fall off the arglist, we'll just return EOF forever
- */
- if (need) {
- if (scc < 1)
- return sc_tokid;
- sct = *scp;
- scp++;
- scc--;
- need = 0;
- }
- /* eat whitespace now - if we walk off the end of the argument,
- * we'll continue, which puts us up at the top of the while loop
- * to fetch the next argument in
- */
- while (isspace(*sct))
- ++sct;
- if (!*sct) {
- need = 1;
- continue;
- }
-
- /* preserve the first character of the new token
- */
- sc_token[0] = *sct++;
-
- /* then see what it is
- */
- if (isdigit(sc_token[0])) {
- while (isdigit(*sct))
- sc_token[++idx] = *sct++;
- sc_token[++idx] = 0;
- return sc_tokid = NUMBER;
- }
- else if (isalpha(sc_token[0])) {
- while (isalpha(*sct))
- sc_token[++idx] = *sct++;
- sc_token[++idx] = 0;
- return parse_token(sc_token);
- }
- else if (sc_token[0] == ':' || sc_token[0] == '.')
- return sc_tokid = DOT;
- else if (sc_token[0] == '+')
- return sc_tokid = PLUS;
- else if (sc_token[0] == '/')
- return sc_tokid = SLASH;
- else
- return sc_tokid = JUNK;
- } /* while (1) */
-} /* token */
-
-
-/*
- * plonk() gives an appropriate error message if a token is incorrect
- */
-static void
-plonk(int tok)
-{
- panic((tok == EOF) ? "incomplete time"
- : "garbled time");
-} /* plonk */
-
-
-/*
- * expect() gets a token and dies most horribly if it's not the token we want
- */
-static void
-expect(int desired)
-{
- if (token() != desired)
- plonk(sc_tokid); /* and we die here... */
-} /* expect */
-
-
-/*
- * plus() parses a now + time
- *
- * at [NOW] PLUS NUMBER [MINUTES|HOURS|DAYS|WEEKS|MONTHS|YEARS]
- *
- */
-
-static void
-plus(struct tm *tm)
-{
- int delay;
- int expectplur;
-
- expect(NUMBER);
-
- delay = atoi(sc_token);
- expectplur = (delay != 1) ? 1 : 0;
-
- switch (token()) {
- case YEARS:
- tm->tm_year += delay;
- break;
- case MONTHS:
- tm->tm_mon += delay;
- break;
- case WEEKS:
- delay *= 7;
- case DAYS:
- tm->tm_mday += delay;
- break;
- case HOURS:
- tm->tm_hour += delay;
- break;
- case MINUTES:
- tm->tm_min += delay;
- break;
- default:
- plonk(sc_tokid);
- break;
- }
-
- if (expectplur != sc_tokplur)
- warnx("pluralization is wrong");
-
- tm->tm_isdst = -1;
- if (mktime(tm) < 0)
- plonk(sc_tokid);
-
-} /* plus */
-
-
-/*
- * tod() computes the time of day
- * [NUMBER [DOT NUMBER] [AM|PM]]
- */
-static void
-tod(struct tm *tm)
-{
- int hour, minute = 0;
- int tlen;
-
- hour = atoi(sc_token);
- tlen = strlen(sc_token);
-
- /* first pick out the time of day - if it's 4 digits, we assume
- * a HHMM time, otherwise it's HH DOT MM time
- */
- if (token() == DOT) {
- expect(NUMBER);
- minute = atoi(sc_token);
- if (minute > 59)
- panic("garbled time");
- token();
- }
- else if (tlen == 4) {
- minute = hour%100;
- if (minute > 59)
- panic("garbled time");
- hour = hour/100;
- }
-
- /* check if an AM or PM specifier was given
- */
- if (sc_tokid == AM || sc_tokid == PM) {
- if (hour > 12)
- panic("garbled time");
-
- if (sc_tokid == PM) {
- if (hour != 12) /* 12:xx PM is 12:xx, not 24:xx */
- hour += 12;
- } else {
- if (hour == 12) /* 12:xx AM is 00:xx, not 12:xx */
- hour = 0;
- }
- token();
- }
- else if (hour > 23)
- panic("garbled time");
-
- /* if we specify an absolute time, we don't want to bump the day even
- * if we've gone past that time - but if we're specifying a time plus
- * a relative offset, it's okay to bump things
- */
- if ((sc_tokid == EOF || sc_tokid == PLUS) && tm->tm_hour > hour) {
- tm->tm_mday++;
- tm->tm_wday++;
- }
-
- tm->tm_hour = hour;
- tm->tm_min = minute;
- if (tm->tm_hour == 24) {
- tm->tm_hour = 0;
- tm->tm_mday++;
- }
-} /* tod */
-
-
-/*
- * assign_date() assigns a date, wrapping to next year if needed
- */
-static void
-assign_date(struct tm *tm, long mday, long mon, long year)
-{
-
- /*
- * Convert year into tm_year format (year - 1900).
- * We may be given the year in 2 digit, 4 digit, or tm_year format.
- */
- if (year != -1) {
- if (year >= 1900)
- year -= 1900; /* convert from 4 digit year */
- else if (year < 100) {
- /* convert from 2 digit year */
- struct tm *lt;
- time_t now;
-
- time(&now);
- lt = localtime(&now);
-
- /* Convert to tm_year assuming current century */
- year += (lt->tm_year / 100) * 100;
-
- if (year == lt->tm_year - 1) year++;
- else if (year < lt->tm_year)
- year += 100; /* must be in next century */
- }
- }
-
- if (year < 0 &&
- (tm->tm_mon > mon ||(tm->tm_mon == mon && tm->tm_mday > mday)))
- year = tm->tm_year + 1;
-
- tm->tm_mday = mday;
- tm->tm_mon = mon;
-
- if (year >= 0)
- tm->tm_year = year;
-} /* assign_date */
-
-
-/*
- * month() picks apart a month specification
- *
- * /[<month> NUMBER [NUMBER]] \
- * |[TOMORROW] |
- * |[DAY OF WEEK] |
- * |NUMBER [SLASH NUMBER [SLASH NUMBER]]|
- * \PLUS NUMBER MINUTES|HOURS|DAYS|WEEKS/
- */
-static void
-month(struct tm *tm)
-{
- long year= (-1);
- long mday = 0, wday, mon;
- int tlen;
-
- switch (sc_tokid) {
- case PLUS:
- plus(tm);
- break;
-
- case TOMORROW:
- /* do something tomorrow */
- tm->tm_mday ++;
- tm->tm_wday ++;
- case TODAY: /* force ourselves to stay in today - no further processing */
- token();
- break;
-
- case JAN: case FEB: case MAR: case APR: case MAY: case JUN:
- case JUL: case AUG: case SEP: case OCT: case NOV: case DEC:
- /* do month mday [year]
- */
- mon = (sc_tokid-JAN);
- expect(NUMBER);
- mday = atol(sc_token);
- if (token() == NUMBER) {
- year = atol(sc_token);
- token();
- }
- assign_date(tm, mday, mon, year);
- break;
-
- case SUN: case MON: case TUE:
- case WED: case THU: case FRI:
- case SAT:
- /* do a particular day of the week
- */
- wday = (sc_tokid-SUN);
-
- mday = tm->tm_mday;
-
- /* if this day is < today, then roll to next week
- */
- if (wday < tm->tm_wday)
- mday += 7 - (tm->tm_wday - wday);
- else
- mday += (wday - tm->tm_wday);
-
- tm->tm_wday = wday;
-
- assign_date(tm, mday, tm->tm_mon, tm->tm_year);
- break;
-
- case NUMBER:
- /* get numeric MMDDYY, mm/dd/yy, or dd.mm.yy
- */
- tlen = strlen(sc_token);
- mon = atol(sc_token);
- token();
-
- if (sc_tokid == SLASH || sc_tokid == DOT) {
- int sep;
-
- sep = sc_tokid;
- expect(NUMBER);
- mday = atol(sc_token);
- if (token() == sep) {
- expect(NUMBER);
- year = atol(sc_token);
- token();
- }
-
- /* flip months and days for European timing
- */
- if (sep == DOT) {
- int x = mday;
- mday = mon;
- mon = x;
- }
- }
- else if (tlen == 6 || tlen == 8) {
- if (tlen == 8) {
- year = (mon % 10000) - 1900;
- mon /= 10000;
- }
- else {
- year = mon % 100;
- mon /= 100;
- }
- mday = mon % 100;
- mon /= 100;
- }
- else
- panic("garbled time");
-
- mon--;
- if (mon < 0 || mon > 11 || mday < 1 || mday > 31)
- panic("garbled time");
-
- assign_date(tm, mday, mon, year);
- break;
- } /* case */
-} /* month */
-
-
-/* Global functions */
-
-time_t
-parsetime(int argc, char **argv)
-{
-/* Do the argument parsing, die if necessary, and return the time the job
- * should be run.
- */
- time_t nowtimer, runtimer;
- struct tm nowtime, runtime;
- int hr = 0;
- /* this MUST be initialized to zero for midnight/noon/teatime */
-
- nowtimer = time(NULL);
- nowtime = *localtime(&nowtimer);
-
- runtime = nowtime;
- runtime.tm_sec = 0;
- runtime.tm_isdst = 0;
-
- if (argc <= optind)
- usage();
-
- init_scanner(argc-optind, argv+optind);
-
- switch (token()) {
- case NOW:
- if (scc < 1) {
- return nowtimer;
- }
- /* now is optional prefix for PLUS tree */
- expect(PLUS);
- case PLUS:
- plus(&runtime);
- break;
-
- case NUMBER:
- tod(&runtime);
- month(&runtime);
- break;
-
- /* evil coding for TEATIME|NOON|MIDNIGHT - we've initialised
- * hr to zero up above, then fall into this case in such a
- * way so we add +12 +4 hours to it for teatime, +12 hours
- * to it for noon, and nothing at all for midnight, then
- * set our runtime to that hour before leaping into the
- * month scanner
- */
- case TEATIME:
- hr += 4;
- case NOON:
- hr += 12;
- case MIDNIGHT:
- if (runtime.tm_hour >= hr) {
- runtime.tm_mday++;
- runtime.tm_wday++;
- }
- runtime.tm_hour = hr;
- runtime.tm_min = 0;
- token();
- /* FALLTHROUGH to month setting */
- default:
- month(&runtime);
- break;
- } /* ugly case statement */
- expect(EOF);
-
- /* convert back to time_t
- */
- runtime.tm_isdst = -1;
- runtimer = mktime(&runtime);
-
- if (runtimer < 0)
- panic("garbled time");
-
- if (nowtimer > runtimer)
- panic("trying to travel back in time");
-
- return runtimer;
-} /* parsetime */
diff --git a/usr.bin/at/parsetime.h b/usr.bin/at/parsetime.h
deleted file mode 100644
index 30c3f20..0000000
--- a/usr.bin/at/parsetime.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * at.h - header for at(1)
- * Copyright (C) 1993 Thomas Koenig
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. The name of the author(s) may not be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-time_t parsetime(int argc, char **argv);
diff --git a/usr.bin/at/perm.c b/usr.bin/at/perm.c
deleted file mode 100644
index 91176b4..0000000
--- a/usr.bin/at/perm.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * perm.c - check user permission for at(1)
- * Copyright (C) 1994 Thomas Koenig
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. The name of the author(s) may not be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/* System Headers */
-
-#include <sys/types.h>
-#include <err.h>
-#include <errno.h>
-#include <pwd.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-/* Local headers */
-
-#include "at.h"
-#include "perm.h"
-#include "privs.h"
-
-/* Macros */
-
-#define MAXUSERID 10
-
-/* Structures and unions */
-
-/* Function declarations */
-
-static int check_for_user(FILE *fp,const char *name);
-
-/* Local functions */
-
-static int check_for_user(FILE *fp,const char *name)
-{
- char *buffer;
- size_t len;
- int found = 0;
-
- len = strlen(name);
- if ((buffer = malloc(len+2)) == NULL)
- errx(EXIT_FAILURE, "virtual memory exhausted");
-
- while(fgets(buffer, len+2, fp) != NULL)
- {
- if ((strncmp(name, buffer, len) == 0) &&
- (buffer[len] == '\n'))
- {
- found = 1;
- break;
- }
- }
- fclose(fp);
- free(buffer);
- return found;
-}
-/* Global functions */
-int check_permission(void)
-{
- FILE *fp;
- uid_t uid = geteuid();
- struct passwd *pentry;
-
- if (uid==0)
- return 1;
-
- if ((pentry = getpwuid(uid)) == NULL)
- err(EXIT_FAILURE, "cannot access user database");
-
- PRIV_START
-
- fp=fopen(PERM_PATH "at.allow","r");
-
- PRIV_END
-
- if (fp != NULL)
- {
- return check_for_user(fp, pentry->pw_name);
- }
- else if (errno == ENOENT)
- {
-
- PRIV_START
-
- fp=fopen(PERM_PATH "at.deny", "r");
-
- PRIV_END
-
- if (fp != NULL)
- {
- return !check_for_user(fp, pentry->pw_name);
- }
- else if (errno != ENOENT)
- warn("at.deny");
- }
- else
- warn("at.allow");
- return 0;
-}
diff --git a/usr.bin/at/perm.h b/usr.bin/at/perm.h
deleted file mode 100644
index b55b5fb..0000000
--- a/usr.bin/at/perm.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * perm.h - header for at(1)
- * Copyright (C) 1994 Thomas Koenig
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. The name of the author(s) may not be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-int check_permission(void);
diff --git a/usr.bin/at/privs.h b/usr.bin/at/privs.h
deleted file mode 100644
index 50dd6b1..0000000
--- a/usr.bin/at/privs.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * privs.h - header for privileged operations
- * Copyright (C) 1993 Thomas Koenig
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. The name of the author(s) may not be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef _PRIVS_H
-#define _PRIVS_H
-
-#include <unistd.h>
-
-/* Relinquish privileges temporarily for a setuid or setgid program
- * with the option of getting them back later. This is done by
- * utilizing POSIX saved user and group IDs. Call RELINQUISH_PRIVS once
- * at the beginning of the main program. This will cause all operations
- * to be executed with the real userid. When you need the privileges
- * of the setuid/setgid invocation, call PRIV_START; when you no longer
- * need it, call PRIV_END. Note that it is an error to call PRIV_START
- * and not PRIV_END within the same function.
- *
- * Use RELINQUISH_PRIVS_ROOT(a,b) if your program started out running
- * as root, and you want to drop back the effective userid to a
- * and the effective group id to b, with the option to get them back
- * later.
- *
- * If you no longer need root privileges, but those of some other
- * userid/groupid, you can call REDUCE_PRIV(a,b) when your effective
- * is the user's.
- *
- * Problems: Do not use return between PRIV_START and PRIV_END; this
- * will cause the program to continue running in an unprivileged
- * state.
- *
- * It is NOT safe to call exec(), system() or popen() with a user-
- * supplied program (i.e. without carefully checking PATH and any
- * library load paths) with relinquished privileges; the called program
- * can acquire them just as easily. Set both effective and real userid
- * to the real userid before calling any of them.
- */
-
-#ifndef MAIN
-extern
-#endif
-uid_t real_uid, effective_uid;
-
-#ifndef MAIN
-extern
-#endif
-gid_t real_gid, effective_gid;
-
-#define RELINQUISH_PRIVS { \
- real_uid = getuid(); \
- effective_uid = geteuid(); \
- real_gid = getgid(); \
- effective_gid = getegid(); \
- seteuid(real_uid); \
- setegid(real_gid); \
-}
-
-#define RELINQUISH_PRIVS_ROOT(a, b) { \
- real_uid = (a); \
- effective_uid = geteuid(); \
- real_gid = (b); \
- effective_gid = getegid(); \
- setegid(real_gid); \
- seteuid(real_uid); \
-}
-
-#define PRIV_START { \
- seteuid(effective_uid); \
- setegid(effective_gid); \
-}
-
-#define PRIV_END { \
- setegid(real_gid); \
- seteuid(real_uid); \
-}
-
-#define REDUCE_PRIV(a, b) { \
- PRIV_START \
- effective_uid = (a); \
- effective_gid = (b); \
- setreuid((uid_t)-1, effective_uid); \
- setregid((gid_t)-1, effective_gid); \
- PRIV_END \
-}
-#endif
diff --git a/usr.bin/atm/Makefile b/usr.bin/atm/Makefile
deleted file mode 100644
index 9ed46ef..0000000
--- a/usr.bin/atm/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-SUBDIR= sscop
-
-.include <bsd.subdir.mk>
diff --git a/usr.bin/atm/Makefile.inc b/usr.bin/atm/Makefile.inc
deleted file mode 100644
index 265f86d..0000000
--- a/usr.bin/atm/Makefile.inc
+++ /dev/null
@@ -1,3 +0,0 @@
-# $FreeBSD$
-
-.include "../Makefile.inc"
diff --git a/usr.bin/atm/sscop/Makefile b/usr.bin/atm/sscop/Makefile
deleted file mode 100644
index 16703bb..0000000
--- a/usr.bin/atm/sscop/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-# $FreeBSD$
-
-CONTRIB= ${.CURDIR}/../../../contrib/ngatm/sscop
-
-.PATH: ${CONTRIB}
-
-PROG= sscop
-SRCS= common.c sscop_main.c
-WARNS?= 6
-CFLAGS+= -I${CONTRIB} -DUSE_LIBBEGEMOT
-
-DPADD= ${LIBBEGEMOT} ${LIBNETGRAPH} ${LIBNGATM}
-LDADD= -lbegemot -lnetgraph -lngatm
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/awk/Makefile b/usr.bin/awk/Makefile
deleted file mode 100644
index 7ec2e57..0000000
--- a/usr.bin/awk/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-# $FreeBSD$
-
-AWKSRC= ${.CURDIR}/../../contrib/one-true-awk
-.PATH: ${AWKSRC}
-
-PROG= awk
-SRCS= awkgram.y b.c lex.c lib.c main.c parse.c proctab.c run.c tran.c ytab.h
-
-CFLAGS+= -DHAS_ISBLANK -I. -I${AWKSRC} -DFOPEN_MAX=64
-
-DPADD= ${LIBM}
-LDADD= -lm
-
-LINKS= ${BINDIR}/awk ${BINDIR}/nawk
-MLINKS= awk.1 nawk.1
-
-CLEANFILES= maketab proctab.c ytab.h
-
-ytab.h: awkgram.h
- ln -sf ${.ALLSRC} ${.TARGET}
-
-proctab.c: maketab
- ./maketab > proctab.c
-
-build-tools: maketab
-maketab: ytab.h ${AWKSRC}/maketab.c
-
-.for f in b.c main.c run.c
-${f}: ${AWKSRC}/${f} ${.CURDIR}/${f}.diff
- patch -s -b .orig -o ${.TARGET} < ${.CURDIR}/${f}.diff ${AWKSRC}/${f}
-CLEANFILES+= ${f}
-.endfor
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/awk/b.c.diff b/usr.bin/awk/b.c.diff
deleted file mode 100644
index 525fcbc..0000000
--- a/usr.bin/awk/b.c.diff
+++ /dev/null
@@ -1,53 +0,0 @@
-$FreeBSD$
-
-Index: b.c
-===================================================================
-RCS file: /home/ncvs/src/contrib/one-true-awk/b.c,v
-retrieving revision 1.1.1.8
-diff -u -p -r1.1.1.8 b.c
---- b.c 16 May 2005 19:11:31 -0000 1.1.1.8
-+++ b.c 16 May 2005 19:12:40 -0000
-@@ -282,9 +282,21 @@ int quoted(char **pp) /* pick up next th
- return c;
- }
-
-+static int collate_range_cmp(int a, int b)
-+{
-+ static char s[2][2];
-+
-+ if ((uschar)a == (uschar)b)
-+ return 0;
-+ s[0][0] = a;
-+ s[1][0] = b;
-+ return (strcoll(s[0], s[1]));
-+}
-+
- char *cclenter(const char *argp) /* add a character class */
- {
- int i, c, c2;
-+ int j;
- uschar *p = (uschar *) argp;
- uschar *op, *bp;
- static uschar *buf = 0;
-@@ -303,15 +315,18 @@ char *cclenter(const char *argp) /* add
- c2 = *p++;
- if (c2 == '\\')
- c2 = quoted((char **) &p);
-- if (c > c2) { /* empty; ignore */
-+ if (collate_range_cmp(c, c2) > 0) {
- bp--;
- i--;
- continue;
- }
-- while (c < c2) {
-+ for (j = 0; j < NCHARS; j++) {
-+ if ((collate_range_cmp(c, j) > 0) ||
-+ collate_range_cmp(j, c2) > 0)
-+ continue;
- if (!adjbuf((char **) &buf, &bufsz, bp-buf+2, 100, (char **) &bp, "cclenter1"))
- FATAL("out of space for character class [%.10s...] 2", p);
-- *bp++ = ++c;
-+ *bp++ = j;
- i++;
- }
- continue;
diff --git a/usr.bin/awk/main.c.diff b/usr.bin/awk/main.c.diff
deleted file mode 100644
index 252cd5a..0000000
--- a/usr.bin/awk/main.c.diff
+++ /dev/null
@@ -1,69 +0,0 @@
-$FreeBSD$
-
-Index: main.c
-===================================================================
-RCS file: /home/ncvs/src/contrib/one-true-awk/main.c,v
-retrieving revision 1.1.1.10
-diff -u -p -r1.1.1.10 main.c
---- main.c 16 May 2005 19:11:31 -0000 1.1.1.10
-+++ main.c 15 Sep 2006 13:21:30 -0000
-@@ -22,7 +22,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE
- THIS SOFTWARE.
- ****************************************************************/
-
--const char *version = "version 20070501";
-+const char *version = "version 20070501 (FreeBSD)";
-
- #define DEBUG
- #include <stdio.h>
-@@ -58,6 +58,7 @@ int main(int argc, char *argv[])
- const char *fs = NULL;
-
- setlocale(LC_CTYPE, "");
-+ setlocale(LC_COLLATE, "");
- setlocale(LC_NUMERIC, "C"); /* for parsing cmdline & prog */
- cmdname = argv[0];
- if (argc == 1) {
-@@ -79,13 +80,18 @@ int main(int argc, char *argv[])
- safe = 1;
- break;
- case 'f': /* next argument is program filename */
-- argc--;
-- argv++;
-- if (argc <= 1)
-- FATAL("no program filename");
-- if (npfile >= MAX_PFILE - 1)
-- FATAL("too many -f options");
-- pfile[npfile++] = argv[1];
-+ if (argv[1][2] != 0) { /* arg is -fsomething */
-+ if (npfile >= MAX_PFILE - 1)
-+ FATAL("too many -f options");
-+ pfile[npfile++] = &argv[1][2];
-+ } else { /* arg is -f something */
-+ argc--; argv++;
-+ if (argc <= 1)
-+ FATAL("no program filename");
-+ if (npfile >= MAX_PFILE - 1)
-+ FATAL("too many -f options");
-+ pfile[npfile++] = argv[1];
-+ }
- break;
- case 'F': /* set field separator */
- if (argv[1][2] != 0) { /* arg is -Fsomething */
-@@ -104,8 +110,14 @@ int main(int argc, char *argv[])
- WARNING("field separator FS is empty");
- break;
- case 'v': /* -v a=1 to be done NOW. one -v for each */
-- if (argv[1][2] == '\0' && --argc > 1 && isclvar((++argv)[1]))
-- setclvar(argv[1]);
-+ if (argv[1][2] != 0) { /* arg is -vsomething */
-+ if (argv[1][2] != 0)
-+ setclvar(&argv[1][2]);
-+ } else { /* arg is -v something */
-+ argc--; argv++;
-+ if (argc > 1 && isclvar(argv[1]))
-+ setclvar(argv[1]);
-+ }
- break;
- case 'm': /* more memory: -mr=record, -mf=fields */
- /* no longer supported */
diff --git a/usr.bin/awk/run.c.diff b/usr.bin/awk/run.c.diff
deleted file mode 100644
index d491250..0000000
--- a/usr.bin/awk/run.c.diff
+++ /dev/null
@@ -1,18 +0,0 @@
-$FreeBSD$
-
-Index: run.c
-===================================================================
-RCS file: /home/ncvs/src/contrib/one-true-awk/run.c,v
-retrieving revision 1.1.1.8
-diff -u -p -r1.1.1.8 run.c
---- run.c 16 May 2005 19:11:35 -0000 1.1.1.8
-+++ run.c 16 May 2005 19:12:47 -0000
-@@ -651,7 +651,7 @@ Cell *relop(Node **a, int n) /* a[0 < a[
- j = x->fval - y->fval;
- i = j<0? -1: (j>0? 1: 0);
- } else {
-- i = strcmp(getsval(x), getsval(y));
-+ i = strcoll(getsval(x), getsval(y));
- }
- tempfree(x);
- tempfree(y);
diff --git a/usr.bin/banner/Makefile b/usr.bin/banner/Makefile
deleted file mode 100644
index 67d4ba7..0000000
--- a/usr.bin/banner/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= banner
-MAN= banner.6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/banner/banner.6 b/usr.bin/banner/banner.6
deleted file mode 100644
index febfa3d..0000000
--- a/usr.bin/banner/banner.6
+++ /dev/null
@@ -1,82 +0,0 @@
-.\" Copyright (c) 1980, 1993, 1995
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" From: @(#)banner.6 8.2 (Berkeley) 4/29/95
-.\" $FreeBSD$
-.\"
-.Dd January 26, 2005
-.Dt BANNER 6
-.Os
-.Sh NAME
-.Nm banner
-.Nd print large banner on printer
-.Sh SYNOPSIS
-.Nm
-.Op Fl d
-.Op Fl t
-.Op Fl w Ar width
-.Ar message ...
-.Sh DESCRIPTION
-.Nm Banner
-prints a large, high quality banner on the standard output.
-If the message is omitted, it prompts for and reads one line of its
-standard input.
-.Pp
-The output should be printed on paper of the appropriate width,
-with no breaks between the pages.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl d
-Enable debug.
-.It Fl t
-Enable trace.
-.It Fl w Ar width
-Change the output from a width of 132 to
-.Ar width ,
-suitable for a narrow terminal.
-.El
-.Sh AUTHORS
-.An Mark Horton
-.Sh BUGS
-Several
-.Tn ASCII
-characters are not defined, notably <, >, [, ], \\,
-^, _, {, }, |, and ~.
-Also, the characters ", ', and & are funny looking (but in a useful way.)
-.Pp
-The
-.Fl w
-option is implemented by skipping some rows and columns.
-The smaller it gets, the grainier the output.
-Sometimes it runs letters together.
-.Pp
-Messages are limited to 1024 characters in length.
diff --git a/usr.bin/banner/banner.c b/usr.bin/banner/banner.c
deleted file mode 100644
index eb96a15..0000000
--- a/usr.bin/banner/banner.c
+++ /dev/null
@@ -1,1185 +0,0 @@
-/*
- * Copyright (c) 1980, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)banner.c 8.4 (Berkeley) 4/29/95";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * banner - prints large signs
- * banner [-w#] [-d] [-t] message ...
- */
-
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#define MAXMSG 1024
-#define DWIDTH 132
-#define NCHARS 128
-#define NBYTES 9271
-
-/* Pointers into data_table for each ASCII char */
-const int asc_ptr[NCHARS] = {
-/* ^@ */ 0, 0, 0, 0, 0, 0, 0, 0,
-/* ^H */ 0, 0, 0, 0, 0, 0, 0, 0,
-/* ^P */ 0, 0, 0, 0, 0, 0, 0, 0,
-/* ^X */ 0, 0, 0, 0, 0, 0, 0, 0,
-/* */ 1, 3, 50, 81, 104, 281, 483, 590,
-/* ( */ 621, 685, 749, 851, 862, 893, 898, 921,
-/* 0 */1019, 1150, 1200, 1419, 1599, 1744, 1934, 2111,
-/* 8 */2235, 2445, 2622, 2659, 0, 2708, 0, 2715,
-/* @ */2857, 3072, 3273, 3403, 3560, 3662, 3730, 3785,
-/* H */3965, 4000, 4015, 4115, 4281, 4314, 4432, 4548,
-/* P */4709, 4790, 4999, 5188, 5397, 5448, 5576, 5710,
-/* X */5892, 6106, 6257, 0, 0, 0, 0, 0,
-/* ` */ 50, 6503, 6642, 6733, 6837, 6930, 7073, 7157,
-/* h */7380, 7452, 7499, 7584, 7689, 7702, 7797, 7869,
-/* p */7978, 8069, 8160, 8222, 8381, 8442, 8508, 8605,
-/* x */8732, 8888, 9016, 0, 0, 0, 0, 0
-};
-
-/*
- * Table of stuff to print. Format:
- * 128+n -> print current line n times.
- * 64+n -> this is last byte of char.
- * else, put m chars at position n (where m
- * is the next elt in array) and goto second
- * next element in array.
- */
-const unsigned char data_table[NBYTES] = {
-/* 0 1 2 3 4 5 6 7 8 9 */
-/* 0 */ 129, 227, 130, 34, 6, 90, 19, 129, 32, 10,
-/* 10 */ 74, 40, 129, 31, 12, 64, 53, 129, 30, 14,
-/* 20 */ 54, 65, 129, 30, 14, 53, 67, 129, 30, 14,
-/* 30 */ 54, 65, 129, 31, 12, 64, 53, 129, 32, 10,
-/* 40 */ 74, 40, 129, 34, 6, 90, 19, 129, 194, 130,
-/* 50 */ 99, 9, 129, 97, 14, 129, 96, 18, 129, 95,
-/* 60 */ 22, 129, 95, 16, 117, 2, 129, 95, 14, 129,
-/* 70 */ 96, 11, 129, 97, 9, 129, 99, 6, 129, 194,
-/* 80 */ 129, 87, 4, 101, 4, 131, 82, 28, 131, 87,
-/* 90 */ 4, 101, 4, 133, 82, 28, 131, 87, 4, 101,
-/* 100 */ 4, 131, 193, 129, 39, 1, 84, 27, 129, 38,
-/* 110 */ 3, 81, 32, 129, 37, 5, 79, 35, 129, 36,
-/* 120 */ 5, 77, 38, 129, 35, 5, 76, 40, 129, 34,
-/* 130 */ 5, 75, 21, 103, 14, 129, 33, 5, 74, 19,
-/* 140 */ 107, 11, 129, 32, 5, 73, 17, 110, 9, 129,
-/* 150 */ 32, 4, 73, 16, 112, 7, 129, 31, 4, 72,
-/* 160 */ 15, 114, 6, 129, 31, 4, 72, 14, 115, 5,
-/* 170 */ 129, 30, 4, 71, 15, 116, 5, 129, 27, 97,
-/* 180 */ 131, 30, 4, 69, 14, 117, 4, 129, 30, 4,
-/* 190 */ 68, 15, 117, 4, 132, 30, 4, 68, 14, 117,
-/* 200 */ 4, 129, 27, 97, 131, 30, 5, 65, 15, 116,
-/* 210 */ 5, 129, 31, 4, 65, 14, 116, 4, 129, 31,
-/* 220 */ 6, 64, 15, 116, 4, 129, 32, 7, 62, 16,
-/* 230 */ 115, 4, 129, 32, 9, 61, 17, 114, 5, 129,
-/* 240 */ 33, 11, 58, 19, 113, 5, 129, 34, 14, 55,
-/* 250 */ 21, 112, 5, 129, 35, 40, 111, 5, 129, 36,
-/* 260 */ 38, 110, 5, 129, 37, 35, 109, 5, 129, 38,
-/* 270 */ 32, 110, 3, 129, 40, 27, 111, 1, 129, 193,
-/* 280 */ 129, 30, 4, 103, 9, 129, 30, 7, 100, 15,
-/* 290 */ 129, 30, 10, 99, 17, 129, 33, 10, 97, 6,
-/* 300 */ 112, 6, 129, 36, 10, 96, 5, 114, 5, 129,
-/* 310 */ 39, 10, 96, 4, 115, 4, 129, 42, 10, 95,
-/* 320 */ 4, 116, 4, 129, 45, 10, 95, 3, 117, 3,
-/* 330 */ 129, 48, 10, 95, 3, 117, 3, 129, 51, 10,
-/* 340 */ 95, 4, 116, 4, 129, 54, 10, 96, 4, 115,
-/* 350 */ 4, 129, 57, 10, 96, 5, 114, 5, 129, 60,
-/* 360 */ 10, 97, 6, 112, 6, 129, 63, 10, 99, 17,
-/* 370 */ 129, 66, 10, 100, 15, 129, 69, 10, 103, 9,
-/* 380 */ 129, 39, 9, 72, 10, 129, 36, 15, 75, 10,
-/* 390 */ 129, 35, 17, 78, 10, 129, 33, 6, 48, 6,
-/* 400 */ 81, 10, 129, 32, 5, 50, 5, 84, 10, 129,
-/* 410 */ 32, 4, 51, 4, 87, 10, 129, 31, 4, 52,
-/* 420 */ 4, 90, 10, 129, 31, 3, 53, 3, 93, 10,
-/* 430 */ 129, 31, 3, 53, 3, 96, 10, 129, 31, 4,
-/* 440 */ 52, 4, 99, 10, 129, 32, 4, 51, 4, 102,
-/* 450 */ 10, 129, 32, 5, 50, 5, 105, 10, 129, 33,
-/* 460 */ 6, 48, 6, 108, 10, 129, 35, 17, 111, 10,
-/* 470 */ 129, 36, 15, 114, 7, 129, 40, 9, 118, 4,
-/* 480 */ 129, 193, 129, 48, 18, 129, 43, 28, 129, 41,
-/* 490 */ 32, 129, 39, 36, 129, 37, 40, 129, 35, 44,
-/* 500 */ 129, 34, 46, 129, 33, 13, 68, 13, 129, 32,
-/* 510 */ 9, 73, 9, 129, 32, 7, 75, 7, 129, 31,
-/* 520 */ 6, 77, 6, 129, 31, 5, 78, 5, 129, 30,
-/* 530 */ 5, 79, 5, 129, 20, 74, 132, 30, 4, 80,
-/* 540 */ 4, 129, 31, 3, 79, 4, 129, 31, 4, 79,
-/* 550 */ 4, 129, 32, 3, 78, 4, 129, 32, 4, 76,
-/* 560 */ 6, 129, 33, 4, 74, 7, 129, 34, 4, 72,
-/* 570 */ 8, 129, 35, 5, 72, 7, 129, 37, 5, 73,
-/* 580 */ 4, 129, 39, 4, 74, 1, 129, 129, 193, 130,
-/* 590 */ 111, 6, 129, 109, 10, 129, 108, 12, 129, 107,
-/* 600 */ 14, 129, 97, 2, 105, 16, 129, 99, 22, 129,
-/* 610 */ 102, 18, 129, 105, 14, 129, 108, 9, 129, 194,
-/* 620 */ 130, 63, 25, 129, 57, 37, 129, 52, 47, 129,
-/* 630 */ 48, 55, 129, 44, 63, 129, 41, 69, 129, 38,
-/* 640 */ 75, 129, 36, 79, 129, 34, 83, 129, 33, 28,
-/* 650 */ 90, 28, 129, 32, 23, 96, 23, 129, 32, 17,
-/* 660 */ 102, 17, 129, 31, 13, 107, 13, 129, 30, 9,
-/* 670 */ 112, 9, 129, 30, 5, 116, 5, 129, 30, 1,
-/* 680 */ 120, 1, 129, 194, 130, 30, 1, 120, 1, 129,
-/* 690 */ 30, 5, 116, 5, 129, 30, 9, 112, 9, 129,
-/* 700 */ 31, 13, 107, 13, 129, 32, 17, 102, 17, 129,
-/* 710 */ 32, 23, 96, 23, 129, 33, 28, 90, 28, 129,
-/* 720 */ 34, 83, 129, 36, 79, 129, 38, 75, 129, 41,
-/* 730 */ 69, 129, 44, 63, 129, 48, 55, 129, 52, 47,
-/* 740 */ 129, 57, 37, 129, 63, 25, 129, 194, 129, 80,
-/* 750 */ 4, 130, 80, 4, 129, 68, 2, 80, 4, 94,
-/* 760 */ 2, 129, 66, 6, 80, 4, 92, 6, 129, 67,
-/* 770 */ 7, 80, 4, 90, 7, 129, 69, 7, 80, 4,
-/* 780 */ 88, 7, 129, 71, 6, 80, 4, 87, 6, 129,
-/* 790 */ 72, 20, 129, 74, 16, 129, 76, 12, 129, 62,
-/* 800 */ 40, 131, 76, 12, 129, 74, 16, 129, 72, 20,
-/* 810 */ 129, 71, 6, 80, 4, 87, 6, 129, 69, 7,
-/* 820 */ 80, 4, 88, 7, 129, 67, 7, 80, 4, 90,
-/* 830 */ 7, 129, 66, 6, 80, 4, 92, 6, 129, 68,
-/* 840 */ 2, 80, 4, 94, 2, 129, 80, 4, 130, 193,
-/* 850 */ 129, 60, 4, 139, 41, 42, 131, 60, 4, 139,
-/* 860 */ 193, 130, 34, 6, 129, 32, 10, 129, 31, 12,
-/* 870 */ 129, 30, 14, 129, 20, 2, 28, 16, 129, 22,
-/* 880 */ 22, 129, 24, 19, 129, 27, 15, 129, 31, 9,
-/* 890 */ 129, 194, 129, 60, 4, 152, 193, 130, 34, 6,
-/* 900 */ 129, 32, 10, 129, 31, 12, 129, 30, 14, 131,
-/* 910 */ 31, 12, 129, 32, 10, 129, 34, 6, 129, 194,
-/* 920 */ 129, 30, 4, 129, 30, 7, 129, 30, 10, 129,
-/* 930 */ 33, 10, 129, 36, 10, 129, 39, 10, 129, 42,
-/* 940 */ 10, 129, 45, 10, 129, 48, 10, 129, 51, 10,
-/* 950 */ 129, 54, 10, 129, 57, 10, 129, 60, 10, 129,
-/* 960 */ 63, 10, 129, 66, 10, 129, 69, 10, 129, 72,
-/* 970 */ 10, 129, 75, 10, 129, 78, 10, 129, 81, 10,
-/* 980 */ 129, 84, 10, 129, 87, 10, 129, 90, 10, 129,
-/* 990 */ 93, 10, 129, 96, 10, 129, 99, 10, 129, 102,
-/* 1000 */ 10, 129, 105, 10, 129, 108, 10, 129, 111, 10,
-/* 1010 */ 129, 114, 7, 129, 117, 4, 129, 193, 129, 60,
-/* 1020 */ 31, 129, 53, 45, 129, 49, 53, 129, 46, 59,
-/* 1030 */ 129, 43, 65, 129, 41, 69, 129, 39, 73, 129,
-/* 1040 */ 37, 77, 129, 36, 79, 129, 35, 15, 101, 15,
-/* 1050 */ 129, 34, 11, 106, 11, 129, 33, 9, 109, 9,
-/* 1060 */ 129, 32, 7, 112, 7, 129, 31, 6, 114, 6,
-/* 1070 */ 129, 31, 5, 115, 5, 129, 30, 5, 116, 5,
-/* 1080 */ 129, 30, 4, 117, 4, 132, 30, 5, 116, 5,
-/* 1090 */ 129, 31, 5, 115, 5, 129, 31, 6, 114, 6,
-/* 1100 */ 129, 32, 7, 112, 7, 129, 33, 9, 109, 9,
-/* 1110 */ 129, 34, 11, 106, 11, 129, 35, 15, 101, 15,
-/* 1120 */ 129, 36, 79, 129, 37, 77, 129, 39, 73, 129,
-/* 1130 */ 41, 69, 129, 43, 65, 129, 46, 59, 129, 49,
-/* 1140 */ 53, 129, 53, 45, 129, 60, 31, 129, 193, 129,
-/* 1150 */ 30, 4, 129, 30, 4, 100, 1, 129, 30, 4,
-/* 1160 */ 100, 3, 129, 30, 4, 100, 5, 129, 30, 76,
-/* 1170 */ 129, 30, 78, 129, 30, 80, 129, 30, 82, 129,
-/* 1180 */ 30, 83, 129, 30, 85, 129, 30, 87, 129, 30,
-/* 1190 */ 89, 129, 30, 91, 129, 30, 4, 132, 193, 129,
-/* 1200 */ 30, 3, 129, 30, 7, 129, 30, 10, 112, 1,
-/* 1210 */ 129, 30, 13, 112, 2, 129, 30, 16, 112, 3,
-/* 1220 */ 129, 30, 18, 111, 5, 129, 30, 21, 111, 6,
-/* 1230 */ 129, 30, 23, 112, 6, 129, 30, 14, 47, 8,
-/* 1240 */ 113, 6, 129, 30, 14, 49, 8, 114, 5, 129,
-/* 1250 */ 30, 14, 51, 8, 115, 5, 129, 30, 14, 53,
-/* 1260 */ 8, 116, 4, 129, 30, 14, 55, 8, 116, 5,
-/* 1270 */ 129, 30, 14, 56, 9, 117, 4, 129, 30, 14,
-/* 1280 */ 57, 9, 117, 4, 129, 30, 14, 58, 10, 117,
-/* 1290 */ 4, 129, 30, 14, 59, 10, 117, 4, 129, 30,
-/* 1300 */ 14, 60, 11, 117, 4, 129, 30, 14, 61, 11,
-/* 1310 */ 116, 5, 129, 30, 14, 62, 11, 116, 5, 129,
-/* 1320 */ 30, 14, 63, 12, 115, 6, 129, 30, 14, 64,
-/* 1330 */ 13, 114, 7, 129, 30, 14, 65, 13, 113, 8,
-/* 1340 */ 129, 30, 14, 65, 15, 111, 9, 129, 30, 14,
-/* 1350 */ 66, 16, 109, 11, 129, 30, 14, 67, 17, 107,
-/* 1360 */ 12, 129, 30, 14, 68, 20, 103, 16, 129, 30,
-/* 1370 */ 14, 69, 49, 129, 30, 14, 70, 47, 129, 30,
-/* 1380 */ 14, 71, 45, 129, 30, 14, 73, 42, 129, 30,
-/* 1390 */ 15, 75, 38, 129, 33, 12, 77, 34, 129, 36,
-/* 1400 */ 10, 79, 30, 129, 40, 6, 82, 23, 129, 44,
-/* 1410 */ 3, 86, 15, 129, 47, 1, 129, 193, 129, 129,
-/* 1420 */ 38, 3, 129, 37, 5, 111, 1, 129, 36, 7,
-/* 1430 */ 111, 2, 129, 35, 9, 110, 5, 129, 34, 8,
-/* 1440 */ 110, 6, 129, 33, 7, 109, 8, 129, 32, 7,
-/* 1450 */ 110, 8, 129, 32, 6, 112, 7, 129, 31, 6,
-/* 1460 */ 113, 6, 129, 31, 5, 114, 6, 129, 30, 5,
-/* 1470 */ 115, 5, 129, 30, 5, 116, 4, 129, 30, 4,
-/* 1480 */ 117, 4, 131, 30, 4, 117, 4, 129, 30, 4,
-/* 1490 */ 79, 2, 117, 4, 129, 30, 5, 78, 4, 117,
-/* 1500 */ 4, 129, 30, 5, 77, 6, 116, 5, 129, 30,
-/* 1510 */ 6, 76, 8, 115, 6, 129, 30, 7, 75, 11,
-/* 1520 */ 114, 6, 129, 30, 8, 73, 15, 112, 8, 129,
-/* 1530 */ 31, 9, 71, 19, 110, 9, 129, 31, 11, 68,
-/* 1540 */ 26, 107, 12, 129, 32, 13, 65, 14, 82, 36,
-/* 1550 */ 129, 32, 16, 61, 17, 83, 34, 129, 33, 44,
-/* 1560 */ 84, 32, 129, 34, 42, 85, 30, 129, 35, 40,
-/* 1570 */ 87, 27, 129, 36, 38, 89, 23, 129, 38, 34,
-/* 1580 */ 92, 17, 129, 40, 30, 95, 11, 129, 42, 26,
-/* 1590 */ 129, 45, 20, 129, 49, 11, 129, 193, 129, 49,
-/* 1600 */ 1, 129, 49, 4, 129, 49, 6, 129, 49, 8,
-/* 1610 */ 129, 49, 10, 129, 49, 12, 129, 49, 14, 129,
-/* 1620 */ 49, 17, 129, 49, 19, 129, 49, 21, 129, 49,
-/* 1630 */ 23, 129, 49, 14, 65, 9, 129, 49, 14, 67,
-/* 1640 */ 9, 129, 49, 14, 69, 9, 129, 49, 14, 71,
-/* 1650 */ 10, 129, 49, 14, 74, 9, 129, 49, 14, 76,
-/* 1660 */ 9, 129, 49, 14, 78, 9, 129, 49, 14, 80,
-/* 1670 */ 9, 129, 49, 14, 82, 9, 129, 49, 14, 84,
-/* 1680 */ 9, 129, 30, 4, 49, 14, 86, 10, 129, 30,
-/* 1690 */ 4, 49, 14, 89, 9, 129, 30, 4, 49, 14,
-/* 1700 */ 91, 9, 129, 30, 4, 49, 14, 93, 9, 129,
-/* 1710 */ 30, 74, 129, 30, 76, 129, 30, 78, 129, 30,
-/* 1720 */ 81, 129, 30, 83, 129, 30, 85, 129, 30, 87,
-/* 1730 */ 129, 30, 89, 129, 30, 91, 129, 30, 4, 49,
-/* 1740 */ 14, 132, 193, 129, 37, 1, 129, 36, 3, 77,
-/* 1750 */ 3, 129, 35, 5, 78, 11, 129, 34, 7, 78,
-/* 1760 */ 21, 129, 33, 7, 79, 29, 129, 32, 7, 79,
-/* 1770 */ 38, 129, 32, 6, 80, 4, 92, 29, 129, 31,
-/* 1780 */ 6, 80, 5, 102, 19, 129, 31, 5, 80, 6,
-/* 1790 */ 107, 14, 129, 31, 4, 81, 5, 107, 14, 129,
-/* 1800 */ 30, 5, 81, 6, 107, 14, 129, 30, 4, 81,
-/* 1810 */ 6, 107, 14, 130, 30, 4, 81, 7, 107, 14,
-/* 1820 */ 129, 30, 4, 80, 8, 107, 14, 130, 30, 5,
-/* 1830 */ 80, 8, 107, 14, 129, 30, 5, 79, 9, 107,
-/* 1840 */ 14, 129, 31, 5, 79, 9, 107, 14, 129, 31,
-/* 1850 */ 6, 78, 10, 107, 14, 129, 32, 6, 76, 11,
-/* 1860 */ 107, 14, 129, 32, 8, 74, 13, 107, 14, 129,
-/* 1870 */ 33, 10, 71, 16, 107, 14, 129, 33, 15, 67,
-/* 1880 */ 19, 107, 14, 129, 34, 51, 107, 14, 129, 35,
-/* 1890 */ 49, 107, 14, 129, 36, 47, 107, 14, 129, 37,
-/* 1900 */ 45, 107, 14, 129, 39, 41, 107, 14, 129, 41,
-/* 1910 */ 37, 107, 14, 129, 44, 32, 107, 14, 129, 47,
-/* 1920 */ 25, 111, 10, 129, 51, 16, 115, 6, 129, 119,
-/* 1930 */ 2, 129, 193, 129, 56, 39, 129, 51, 49, 129,
-/* 1940 */ 47, 57, 129, 44, 63, 129, 42, 67, 129, 40,
-/* 1950 */ 71, 129, 38, 75, 129, 37, 77, 129, 35, 81,
-/* 1960 */ 129, 34, 16, 74, 5, 101, 16, 129, 33, 11,
-/* 1970 */ 76, 5, 107, 11, 129, 32, 9, 77, 5, 110,
-/* 1980 */ 9, 129, 32, 7, 79, 4, 112, 7, 129, 31,
-/* 1990 */ 6, 80, 4, 114, 6, 129, 31, 5, 81, 4,
-/* 2000 */ 115, 5, 129, 30, 5, 82, 4, 116, 5, 129,
-/* 2010 */ 30, 4, 82, 4, 116, 5, 129, 30, 4, 82,
-/* 2020 */ 5, 117, 4, 131, 30, 5, 82, 5, 117, 4,
-/* 2030 */ 129, 31, 5, 81, 6, 117, 4, 129, 31, 6,
-/* 2040 */ 80, 7, 117, 4, 129, 32, 7, 79, 8, 117,
-/* 2050 */ 4, 129, 32, 9, 77, 9, 116, 5, 129, 33,
-/* 2060 */ 11, 75, 11, 116, 4, 129, 34, 16, 69, 16,
-/* 2070 */ 115, 5, 129, 35, 49, 114, 5, 129, 37, 46,
-/* 2080 */ 113, 5, 129, 38, 44, 112, 6, 129, 40, 41,
-/* 2090 */ 112, 5, 129, 42, 37, 113, 3, 129, 44, 33,
-/* 2100 */ 114, 1, 129, 47, 27, 129, 51, 17, 129, 193,
-/* 2110 */ 129, 103, 2, 129, 103, 6, 129, 104, 9, 129,
-/* 2120 */ 105, 12, 129, 106, 15, 129, 107, 14, 135, 30,
-/* 2130 */ 10, 107, 14, 129, 30, 17, 107, 14, 129, 30,
-/* 2140 */ 25, 107, 14, 129, 30, 31, 107, 14, 129, 30,
-/* 2150 */ 37, 107, 14, 129, 30, 42, 107, 14, 129, 30,
-/* 2160 */ 46, 107, 14, 129, 30, 50, 107, 14, 129, 30,
-/* 2170 */ 54, 107, 14, 129, 30, 58, 107, 14, 129, 59,
-/* 2180 */ 32, 107, 14, 129, 64, 30, 107, 14, 129, 74,
-/* 2190 */ 23, 107, 14, 129, 81, 18, 107, 14, 129, 86,
-/* 2200 */ 16, 107, 14, 129, 91, 14, 107, 14, 129, 96,
-/* 2210 */ 25, 129, 100, 21, 129, 104, 17, 129, 107, 14,
-/* 2220 */ 129, 111, 10, 129, 114, 7, 129, 117, 4, 129,
-/* 2230 */ 120, 1, 129, 193, 129, 48, 13, 129, 44, 21,
-/* 2240 */ 129, 42, 26, 129, 40, 30, 92, 12, 129, 38,
-/* 2250 */ 34, 88, 20, 129, 36, 37, 86, 25, 129, 35,
-/* 2260 */ 39, 84, 29, 129, 34, 13, 63, 12, 82, 33,
-/* 2270 */ 129, 33, 11, 67, 9, 80, 36, 129, 32, 9,
-/* 2280 */ 70, 7, 79, 38, 129, 31, 8, 72, 46, 129,
-/* 2290 */ 30, 7, 74, 22, 108, 11, 129, 30, 6, 75,
-/* 2300 */ 19, 111, 9, 129, 30, 5, 75, 17, 113, 7,
-/* 2310 */ 129, 30, 5, 74, 16, 114, 6, 129, 30, 4,
-/* 2320 */ 73, 16, 115, 6, 129, 30, 4, 72, 16, 116,
-/* 2330 */ 5, 129, 30, 4, 72, 15, 117, 4, 129, 30,
-/* 2340 */ 4, 71, 16, 117, 4, 129, 30, 5, 70, 16,
-/* 2350 */ 117, 4, 129, 30, 5, 70, 15, 117, 4, 129,
-/* 2360 */ 30, 6, 69, 15, 116, 5, 129, 30, 7, 68,
-/* 2370 */ 17, 115, 5, 129, 30, 9, 67, 19, 114, 6,
-/* 2380 */ 129, 30, 10, 65, 22, 113, 6, 129, 31, 12,
-/* 2390 */ 63, 27, 110, 9, 129, 32, 14, 60, 21, 84,
-/* 2400 */ 9, 106, 12, 129, 33, 47, 85, 32, 129, 34,
-/* 2410 */ 45, 86, 30, 129, 35, 43, 88, 26, 129, 36,
-/* 2420 */ 40, 90, 22, 129, 38, 36, 93, 17, 129, 40,
-/* 2430 */ 32, 96, 10, 129, 42, 28, 129, 44, 23, 129,
-/* 2440 */ 48, 15, 129, 193, 129, 83, 17, 129, 77, 27,
-/* 2450 */ 129, 36, 1, 74, 33, 129, 35, 3, 72, 37,
-/* 2460 */ 129, 34, 5, 70, 41, 129, 33, 6, 69, 44,
-/* 2470 */ 129, 33, 5, 68, 46, 129, 32, 5, 67, 49,
-/* 2480 */ 129, 31, 5, 66, 17, 101, 16, 129, 31, 5,
-/* 2490 */ 66, 11, 108, 10, 129, 30, 4, 65, 9, 110,
-/* 2500 */ 9, 129, 30, 4, 64, 8, 112, 7, 129, 30,
-/* 2510 */ 4, 64, 7, 114, 6, 129, 30, 4, 64, 6,
-/* 2520 */ 115, 5, 129, 30, 4, 64, 5, 116, 5, 129,
-/* 2530 */ 30, 4, 64, 5, 117, 4, 131, 30, 4, 65,
-/* 2540 */ 4, 117, 4, 129, 30, 5, 65, 4, 116, 5,
-/* 2550 */ 129, 31, 5, 66, 4, 115, 5, 129, 31, 6,
-/* 2560 */ 67, 4, 114, 6, 129, 32, 7, 68, 4, 112,
-/* 2570 */ 7, 129, 32, 9, 69, 5, 110, 9, 129, 33,
-/* 2580 */ 11, 70, 5, 107, 11, 129, 34, 16, 72, 5,
-/* 2590 */ 101, 16, 129, 35, 81, 129, 37, 77, 129, 38,
-/* 2600 */ 75, 129, 40, 71, 129, 42, 67, 129, 44, 63,
-/* 2610 */ 129, 47, 57, 129, 51, 49, 129, 56, 39, 129,
-/* 2620 */ 193, 130, 34, 6, 74, 6, 129, 32, 10, 72,
-/* 2630 */ 10, 129, 31, 12, 71, 12, 129, 30, 14, 70,
-/* 2640 */ 14, 131, 31, 12, 71, 12, 129, 32, 10, 72,
-/* 2650 */ 10, 129, 34, 6, 74, 6, 129, 194, 130, 34,
-/* 2660 */ 6, 74, 6, 129, 32, 10, 72, 10, 129, 31,
-/* 2670 */ 12, 71, 12, 129, 30, 14, 70, 14, 129, 20,
-/* 2680 */ 2, 28, 16, 70, 14, 129, 22, 22, 70, 14,
-/* 2690 */ 129, 24, 19, 71, 12, 129, 27, 15, 72, 10,
-/* 2700 */ 129, 31, 9, 74, 6, 129, 194, 129, 53, 4,
-/* 2710 */ 63, 4, 152, 193, 130, 99, 7, 129, 97, 13,
-/* 2720 */ 129, 96, 16, 129, 96, 18, 129, 96, 19, 129,
-/* 2730 */ 97, 19, 129, 99, 6, 110, 7, 129, 112, 6,
-/* 2740 */ 129, 114, 5, 129, 34, 6, 57, 5, 115, 4,
-/* 2750 */ 129, 32, 10, 54, 12, 116, 4, 129, 31, 12,
-/* 2760 */ 53, 16, 117, 3, 129, 30, 14, 52, 20, 117,
-/* 2770 */ 4, 129, 30, 14, 52, 23, 117, 4, 129, 30,
-/* 2780 */ 14, 52, 25, 117, 4, 129, 31, 12, 52, 27,
-/* 2790 */ 117, 4, 129, 32, 10, 53, 10, 70, 11, 116,
-/* 2800 */ 5, 129, 34, 6, 55, 5, 73, 10, 115, 6,
-/* 2810 */ 129, 74, 11, 114, 7, 129, 75, 12, 112, 9,
-/* 2820 */ 129, 76, 13, 110, 10, 129, 77, 16, 106, 14,
-/* 2830 */ 129, 78, 41, 129, 80, 38, 129, 81, 36, 129,
-/* 2840 */ 82, 34, 129, 84, 30, 129, 86, 26, 129, 88,
-/* 2850 */ 22, 129, 92, 14, 129, 194, 129, 55, 15, 129,
-/* 2860 */ 50, 25, 129, 47, 32, 129, 45, 13, 70, 12,
-/* 2870 */ 129, 43, 9, 76, 10, 129, 42, 6, 79, 8,
-/* 2880 */ 129, 41, 5, 81, 7, 129, 40, 4, 84, 6,
-/* 2890 */ 129, 39, 4, 59, 12, 85, 6, 129, 38, 4,
-/* 2900 */ 55, 19, 87, 5, 129, 37, 4, 53, 23, 88,
-/* 2910 */ 4, 129, 36, 4, 51, 8, 71, 6, 89, 4,
-/* 2920 */ 129, 36, 4, 51, 6, 73, 4, 89, 4, 129,
-/* 2930 */ 36, 4, 50, 6, 74, 4, 90, 3, 129, 35,
-/* 2940 */ 4, 50, 5, 75, 3, 90, 4, 129, 35, 4,
-/* 2950 */ 50, 4, 75, 4, 90, 4, 131, 35, 4, 50,
-/* 2960 */ 5, 75, 4, 90, 4, 129, 36, 4, 51, 5,
-/* 2970 */ 75, 4, 90, 4, 129, 36, 4, 51, 6, 75,
-/* 2980 */ 4, 90, 4, 129, 36, 4, 53, 26, 90, 4,
-/* 2990 */ 129, 37, 4, 54, 25, 90, 4, 129, 37, 4,
-/* 3000 */ 52, 27, 90, 3, 129, 38, 4, 52, 4, 89,
-/* 3010 */ 4, 129, 39, 4, 51, 4, 88, 4, 129, 40,
-/* 3020 */ 4, 50, 4, 87, 5, 129, 41, 4, 50, 4,
-/* 3030 */ 86, 5, 129, 42, 4, 50, 4, 85, 5, 129,
-/* 3040 */ 43, 3, 50, 4, 83, 6, 129, 44, 2, 51,
-/* 3050 */ 5, 80, 7, 129, 46, 1, 52, 6, 76, 9,
-/* 3060 */ 129, 54, 28, 129, 56, 23, 129, 60, 16, 129,
-/* 3070 */ 193, 129, 30, 4, 132, 30, 5, 129, 30, 8,
-/* 3080 */ 129, 30, 12, 129, 30, 16, 129, 30, 4, 37,
-/* 3090 */ 12, 129, 30, 4, 41, 12, 129, 30, 4, 44,
-/* 3100 */ 13, 129, 30, 4, 48, 13, 129, 52, 13, 129,
-/* 3110 */ 56, 12, 129, 58, 14, 129, 58, 4, 64, 12,
-/* 3120 */ 129, 58, 4, 68, 12, 129, 58, 4, 72, 12,
-/* 3130 */ 129, 58, 4, 75, 13, 129, 58, 4, 79, 13,
-/* 3140 */ 129, 58, 4, 83, 13, 129, 58, 4, 87, 13,
-/* 3150 */ 129, 58, 4, 91, 12, 129, 58, 4, 95, 12,
-/* 3160 */ 129, 58, 4, 96, 15, 129, 58, 4, 93, 22,
-/* 3170 */ 129, 58, 4, 89, 30, 129, 58, 4, 85, 36,
-/* 3180 */ 129, 58, 4, 81, 38, 129, 58, 4, 77, 38,
-/* 3190 */ 129, 58, 4, 73, 38, 129, 58, 4, 70, 37,
-/* 3200 */ 129, 58, 4, 66, 37, 129, 58, 41, 129, 58,
-/* 3210 */ 37, 129, 54, 38, 129, 30, 4, 50, 38, 129,
-/* 3220 */ 30, 4, 46, 38, 129, 30, 4, 42, 38, 129,
-/* 3230 */ 30, 4, 38, 39, 129, 30, 43, 129, 30, 39,
-/* 3240 */ 129, 30, 35, 129, 30, 31, 129, 30, 27, 129,
-/* 3250 */ 30, 24, 129, 30, 20, 129, 30, 16, 129, 30,
-/* 3260 */ 12, 129, 30, 8, 129, 30, 5, 129, 30, 4,
-/* 3270 */ 132, 193, 129, 30, 4, 117, 4, 132, 30, 91,
-/* 3280 */ 137, 30, 4, 80, 4, 117, 4, 138, 30, 4,
-/* 3290 */ 80, 5, 116, 5, 129, 30, 5, 79, 6, 116,
-/* 3300 */ 5, 130, 30, 6, 78, 8, 115, 6, 129, 31,
-/* 3310 */ 6, 77, 9, 115, 6, 129, 31, 7, 76, 11,
-/* 3320 */ 114, 6, 129, 31, 8, 75, 14, 112, 8, 129,
-/* 3330 */ 32, 8, 74, 16, 111, 9, 129, 32, 9, 73,
-/* 3340 */ 19, 109, 10, 129, 33, 10, 71, 24, 106, 13,
-/* 3350 */ 129, 33, 13, 68, 12, 83, 35, 129, 34, 16,
-/* 3360 */ 64, 15, 84, 33, 129, 35, 43, 85, 31, 129,
-/* 3370 */ 36, 41, 86, 29, 129, 37, 39, 88, 25, 129,
-/* 3380 */ 38, 37, 90, 21, 129, 40, 33, 93, 15, 129,
-/* 3390 */ 42, 29, 96, 9, 129, 45, 24, 129, 49, 16,
-/* 3400 */ 129, 193, 129, 63, 25, 129, 57, 37, 129, 53,
-/* 3410 */ 45, 129, 50, 51, 129, 47, 57, 129, 45, 61,
-/* 3420 */ 129, 43, 65, 129, 41, 69, 129, 39, 73, 129,
-/* 3430 */ 38, 25, 92, 21, 129, 36, 21, 97, 18, 129,
-/* 3440 */ 35, 18, 102, 14, 129, 34, 16, 106, 11, 129,
-/* 3450 */ 33, 14, 108, 10, 129, 32, 12, 111, 8, 129,
-/* 3460 */ 32, 10, 113, 6, 129, 31, 10, 114, 6, 129,
-/* 3470 */ 31, 8, 115, 5, 129, 30, 8, 116, 5, 129,
-/* 3480 */ 30, 7, 116, 5, 129, 30, 6, 117, 4, 130,
-/* 3490 */ 30, 5, 117, 4, 131, 31, 4, 116, 5, 129,
-/* 3500 */ 32, 4, 116, 4, 129, 32, 5, 115, 5, 129,
-/* 3510 */ 33, 4, 114, 5, 129, 34, 4, 112, 6, 129,
-/* 3520 */ 35, 4, 110, 7, 129, 37, 4, 107, 9, 129,
-/* 3530 */ 39, 4, 103, 12, 129, 41, 4, 103, 18, 129,
-/* 3540 */ 43, 4, 103, 18, 129, 45, 5, 103, 18, 129,
-/* 3550 */ 48, 5, 103, 18, 129, 51, 1, 129, 193, 129,
-/* 3560 */ 30, 4, 117, 4, 132, 30, 91, 137, 30, 4,
-/* 3570 */ 117, 4, 135, 30, 5, 116, 5, 130, 30, 6,
-/* 3580 */ 115, 6, 130, 31, 6, 114, 6, 129, 31, 7,
-/* 3590 */ 113, 7, 129, 32, 7, 112, 7, 129, 32, 8,
-/* 3600 */ 111, 8, 129, 33, 9, 109, 9, 129, 33, 12,
-/* 3610 */ 106, 12, 129, 34, 13, 104, 13, 129, 35, 15,
-/* 3620 */ 101, 15, 129, 36, 19, 96, 19, 129, 37, 24,
-/* 3630 */ 90, 24, 129, 39, 73, 129, 40, 71, 129, 42,
-/* 3640 */ 67, 129, 44, 63, 129, 46, 59, 129, 49, 53,
-/* 3650 */ 129, 52, 47, 129, 56, 39, 129, 61, 29, 129,
-/* 3660 */ 193, 129, 30, 4, 117, 4, 132, 30, 91, 137,
-/* 3670 */ 30, 4, 80, 4, 117, 4, 140, 30, 4, 79,
-/* 3680 */ 6, 117, 4, 129, 30, 4, 77, 10, 117, 4,
-/* 3690 */ 129, 30, 4, 73, 18, 117, 4, 132, 30, 4,
-/* 3700 */ 117, 4, 130, 30, 5, 116, 5, 130, 30, 7,
-/* 3710 */ 114, 7, 129, 30, 8, 113, 8, 129, 30, 11,
-/* 3720 */ 110, 11, 129, 30, 18, 103, 18, 132, 193, 129,
-/* 3730 */ 30, 4, 117, 4, 132, 30, 91, 137, 30, 4,
-/* 3740 */ 80, 4, 117, 4, 132, 80, 4, 117, 4, 136,
-/* 3750 */ 79, 6, 117, 4, 129, 77, 10, 117, 4, 129,
-/* 3760 */ 73, 18, 117, 4, 132, 117, 4, 130, 116, 5,
-/* 3770 */ 130, 114, 7, 129, 113, 8, 129, 110, 11, 129,
-/* 3780 */ 103, 18, 132, 193, 129, 63, 25, 129, 57, 37,
-/* 3790 */ 129, 53, 45, 129, 50, 51, 129, 47, 57, 129,
-/* 3800 */ 45, 61, 129, 43, 65, 129, 41, 69, 129, 39,
-/* 3810 */ 73, 129, 38, 25, 92, 21, 129, 36, 21, 97,
-/* 3820 */ 18, 129, 35, 18, 102, 14, 129, 34, 16, 106,
-/* 3830 */ 11, 129, 33, 14, 108, 10, 129, 32, 12, 111,
-/* 3840 */ 8, 129, 32, 10, 113, 6, 129, 31, 10, 114,
-/* 3850 */ 6, 129, 31, 8, 115, 5, 129, 30, 8, 116,
-/* 3860 */ 5, 129, 30, 7, 116, 5, 129, 30, 6, 117,
-/* 3870 */ 4, 130, 30, 5, 117, 4, 131, 30, 5, 75,
-/* 3880 */ 4, 116, 5, 129, 31, 5, 75, 4, 116, 4,
-/* 3890 */ 129, 31, 6, 75, 4, 115, 5, 129, 32, 7,
-/* 3900 */ 75, 4, 114, 5, 129, 32, 9, 75, 4, 112,
-/* 3910 */ 6, 129, 33, 11, 75, 4, 110, 7, 129, 34,
-/* 3920 */ 15, 75, 4, 107, 9, 129, 35, 44, 103, 12,
-/* 3930 */ 129, 36, 43, 103, 18, 129, 38, 41, 103, 18,
-/* 3940 */ 129, 39, 40, 103, 18, 129, 41, 38, 103, 18,
-/* 3950 */ 129, 44, 35, 129, 48, 31, 129, 52, 27, 129,
-/* 3960 */ 61, 18, 129, 193, 129, 30, 4, 117, 4, 132,
-/* 3970 */ 30, 91, 137, 30, 4, 80, 4, 117, 4, 132,
-/* 3980 */ 80, 4, 140, 30, 4, 80, 4, 117, 4, 132,
-/* 3990 */ 30, 91, 137, 30, 4, 117, 4, 132, 193, 129,
-/* 4000 */ 30, 4, 117, 4, 132, 30, 91, 137, 30, 4,
-/* 4010 */ 117, 4, 132, 193, 129, 44, 7, 129, 40, 13,
-/* 4020 */ 129, 37, 17, 129, 35, 20, 129, 34, 22, 129,
-/* 4030 */ 33, 23, 129, 32, 24, 129, 32, 23, 129, 31,
-/* 4040 */ 6, 41, 13, 129, 31, 5, 42, 11, 129, 30,
-/* 4050 */ 5, 44, 7, 129, 30, 4, 132, 30, 5, 130,
-/* 4060 */ 31, 5, 129, 31, 6, 117, 4, 129, 31, 8,
-/* 4070 */ 117, 4, 129, 32, 9, 117, 4, 129, 33, 11,
-/* 4080 */ 117, 4, 129, 34, 87, 129, 35, 86, 129, 36,
-/* 4090 */ 85, 129, 37, 84, 129, 38, 83, 129, 40, 81,
-/* 4100 */ 129, 42, 79, 129, 45, 76, 129, 50, 71, 129,
-/* 4110 */ 117, 4, 132, 193, 129, 30, 4, 117, 4, 132,
-/* 4120 */ 30, 91, 137, 30, 4, 76, 8, 117, 4, 129,
-/* 4130 */ 30, 4, 73, 13, 117, 4, 129, 30, 4, 70,
-/* 4140 */ 18, 117, 4, 129, 30, 4, 67, 23, 117, 4,
-/* 4150 */ 129, 65, 26, 129, 62, 31, 129, 59, 35, 129,
-/* 4160 */ 56, 29, 89, 7, 129, 53, 29, 91, 7, 129,
-/* 4170 */ 50, 29, 93, 7, 129, 47, 29, 95, 6, 129,
-/* 4180 */ 30, 4, 45, 29, 96, 7, 129, 30, 4, 42,
-/* 4190 */ 29, 98, 7, 129, 30, 4, 39, 30, 100, 6,
-/* 4200 */ 129, 30, 4, 36, 30, 101, 7, 129, 30, 33,
-/* 4210 */ 103, 7, 117, 4, 129, 30, 30, 105, 6, 117,
-/* 4220 */ 4, 129, 30, 27, 106, 7, 117, 4, 129, 30,
-/* 4230 */ 25, 108, 7, 117, 4, 129, 30, 22, 110, 11,
-/* 4240 */ 129, 30, 19, 111, 10, 129, 30, 16, 113, 8,
-/* 4250 */ 129, 30, 13, 115, 6, 129, 30, 11, 116, 5,
-/* 4260 */ 129, 30, 8, 117, 4, 129, 30, 5, 117, 4,
-/* 4270 */ 129, 30, 4, 117, 4, 130, 30, 4, 130, 193,
-/* 4280 */ 129, 30, 4, 117, 4, 132, 30, 91, 137, 30,
-/* 4290 */ 4, 117, 4, 132, 30, 4, 144, 30, 5, 130,
-/* 4300 */ 30, 7, 129, 30, 8, 129, 30, 11, 129, 30,
-/* 4310 */ 18, 132, 193, 129, 30, 4, 117, 4, 132, 30,
-/* 4320 */ 91, 132, 30, 4, 103, 18, 129, 30, 4, 97,
-/* 4330 */ 24, 129, 30, 4, 92, 29, 129, 30, 4, 87,
-/* 4340 */ 34, 129, 81, 40, 129, 76, 45, 129, 70, 49,
-/* 4350 */ 129, 65, 49, 129, 60, 49, 129, 55, 49, 129,
-/* 4360 */ 50, 48, 129, 44, 49, 129, 39, 48, 129, 33,
-/* 4370 */ 49, 129, 30, 47, 129, 34, 37, 129, 40, 26,
-/* 4380 */ 129, 46, 19, 129, 52, 19, 129, 58, 19, 129,
-/* 4390 */ 64, 19, 129, 70, 19, 129, 76, 19, 129, 82,
-/* 4400 */ 19, 129, 30, 4, 88, 18, 129, 30, 4, 94,
-/* 4410 */ 18, 129, 30, 4, 100, 18, 129, 30, 4, 106,
-/* 4420 */ 15, 129, 30, 91, 137, 30, 4, 117, 4, 132,
-/* 4430 */ 193, 129, 30, 4, 117, 4, 132, 30, 91, 132,
-/* 4440 */ 30, 4, 107, 14, 129, 30, 4, 104, 17, 129,
-/* 4450 */ 30, 4, 101, 20, 129, 30, 4, 99, 22, 129,
-/* 4460 */ 96, 25, 129, 93, 28, 129, 91, 28, 129, 88,
-/* 4470 */ 29, 129, 85, 29, 129, 82, 29, 129, 79, 29,
-/* 4480 */ 129, 76, 29, 129, 74, 29, 129, 71, 29, 129,
-/* 4490 */ 68, 29, 129, 65, 29, 129, 62, 29, 129, 60,
-/* 4500 */ 29, 129, 57, 29, 129, 54, 29, 129, 51, 29,
-/* 4510 */ 129, 49, 28, 129, 46, 29, 129, 43, 29, 129,
-/* 4520 */ 40, 29, 117, 4, 129, 37, 29, 117, 4, 129,
-/* 4530 */ 35, 29, 117, 4, 129, 32, 29, 117, 4, 129,
-/* 4540 */ 30, 91, 132, 117, 4, 132, 193, 129, 63, 25,
-/* 4550 */ 129, 57, 37, 129, 53, 45, 129, 50, 51, 129,
-/* 4560 */ 47, 57, 129, 45, 61, 129, 43, 65, 129, 41,
-/* 4570 */ 69, 129, 39, 73, 129, 38, 21, 92, 21, 129,
-/* 4580 */ 36, 18, 97, 18, 129, 35, 14, 102, 14, 129,
-/* 4590 */ 34, 11, 106, 11, 129, 33, 10, 108, 10, 129,
-/* 4600 */ 32, 8, 111, 8, 129, 32, 6, 113, 6, 129,
-/* 4610 */ 31, 6, 114, 6, 129, 31, 5, 115, 5, 129,
-/* 4620 */ 30, 5, 116, 5, 130, 30, 4, 117, 4, 132,
-/* 4630 */ 30, 5, 116, 5, 130, 31, 5, 115, 5, 129,
-/* 4640 */ 31, 6, 114, 6, 129, 32, 6, 113, 6, 129,
-/* 4650 */ 32, 8, 111, 8, 129, 33, 10, 108, 10, 129,
-/* 4660 */ 34, 11, 106, 11, 129, 35, 14, 102, 14, 129,
-/* 4670 */ 36, 18, 97, 18, 129, 38, 21, 92, 21, 129,
-/* 4680 */ 39, 73, 129, 41, 69, 129, 43, 65, 129, 45,
-/* 4690 */ 61, 129, 47, 57, 129, 50, 51, 129, 53, 45,
-/* 4700 */ 129, 57, 37, 129, 63, 25, 129, 193, 129, 30,
-/* 4710 */ 4, 117, 4, 132, 30, 91, 137, 30, 4, 80,
-/* 4720 */ 4, 117, 4, 132, 80, 4, 117, 4, 134, 80,
-/* 4730 */ 5, 116, 5, 131, 80, 6, 115, 6, 130, 81,
-/* 4740 */ 6, 114, 6, 129, 81, 8, 112, 8, 129, 81,
-/* 4750 */ 9, 111, 9, 129, 82, 10, 109, 10, 129, 82,
-/* 4760 */ 13, 106, 13, 129, 83, 35, 129, 84, 33, 129,
-/* 4770 */ 85, 31, 129, 86, 29, 129, 88, 25, 129, 90,
-/* 4780 */ 21, 129, 93, 15, 129, 96, 9, 129, 193, 129,
-/* 4790 */ 63, 25, 129, 57, 37, 129, 53, 45, 129, 50,
-/* 4800 */ 51, 129, 47, 57, 129, 45, 61, 129, 43, 65,
-/* 4810 */ 129, 41, 69, 129, 39, 73, 129, 38, 21, 92,
-/* 4820 */ 21, 129, 36, 18, 97, 18, 129, 35, 14, 102,
-/* 4830 */ 14, 129, 34, 11, 106, 11, 129, 33, 10, 108,
-/* 4840 */ 10, 129, 32, 8, 111, 8, 129, 32, 6, 113,
-/* 4850 */ 6, 129, 31, 6, 114, 6, 129, 31, 5, 115,
-/* 4860 */ 5, 129, 30, 5, 116, 5, 130, 30, 4, 39,
-/* 4870 */ 2, 117, 4, 129, 30, 4, 40, 4, 117, 4,
-/* 4880 */ 129, 30, 4, 41, 5, 117, 4, 129, 30, 4,
-/* 4890 */ 41, 6, 117, 4, 129, 30, 5, 40, 8, 116,
-/* 4900 */ 5, 129, 30, 5, 39, 10, 116, 5, 129, 31,
-/* 4910 */ 5, 38, 11, 115, 5, 129, 31, 18, 114, 6,
-/* 4920 */ 129, 32, 17, 113, 6, 129, 32, 16, 111, 8,
-/* 4930 */ 129, 33, 15, 108, 10, 129, 33, 14, 106, 11,
-/* 4940 */ 129, 32, 17, 102, 14, 129, 31, 23, 97, 18,
-/* 4950 */ 129, 31, 28, 92, 21, 129, 30, 82, 129, 30,
-/* 4960 */ 80, 129, 30, 11, 43, 65, 129, 30, 10, 45,
-/* 4970 */ 61, 129, 31, 8, 47, 57, 129, 32, 6, 50,
-/* 4980 */ 51, 129, 33, 5, 53, 45, 129, 35, 4, 57,
-/* 4990 */ 37, 129, 38, 2, 63, 25, 129, 193, 129, 30,
-/* 5000 */ 4, 117, 4, 132, 30, 91, 137, 30, 4, 76,
-/* 5010 */ 8, 117, 4, 129, 30, 4, 73, 11, 117, 4,
-/* 5020 */ 129, 30, 4, 70, 14, 117, 4, 129, 30, 4,
-/* 5030 */ 67, 17, 117, 4, 129, 65, 19, 117, 4, 129,
-/* 5040 */ 62, 22, 117, 4, 129, 59, 25, 117, 4, 129,
-/* 5050 */ 56, 28, 117, 4, 129, 53, 31, 117, 4, 129,
-/* 5060 */ 50, 34, 117, 4, 129, 47, 29, 80, 5, 116,
-/* 5070 */ 5, 129, 30, 4, 45, 29, 80, 5, 116, 5,
-/* 5080 */ 129, 30, 4, 42, 29, 80, 5, 116, 5, 129,
-/* 5090 */ 30, 4, 39, 30, 80, 6, 115, 6, 129, 30,
-/* 5100 */ 4, 36, 30, 80, 6, 115, 6, 129, 30, 33,
-/* 5110 */ 81, 6, 114, 6, 129, 30, 30, 81, 8, 112,
-/* 5120 */ 8, 129, 30, 27, 81, 9, 111, 9, 129, 30,
-/* 5130 */ 25, 82, 10, 109, 10, 129, 30, 22, 82, 13,
-/* 5140 */ 106, 13, 129, 30, 19, 83, 35, 129, 30, 16,
-/* 5150 */ 84, 33, 129, 30, 13, 85, 31, 129, 30, 11,
-/* 5160 */ 86, 29, 129, 30, 8, 88, 25, 129, 30, 5,
-/* 5170 */ 90, 21, 129, 30, 4, 93, 15, 129, 30, 4,
-/* 5180 */ 96, 9, 129, 30, 4, 130, 193, 129, 30, 18,
-/* 5190 */ 130, 30, 18, 89, 15, 129, 30, 18, 85, 23,
-/* 5200 */ 129, 34, 11, 83, 27, 129, 34, 9, 81, 31,
-/* 5210 */ 129, 33, 8, 79, 35, 129, 33, 6, 78, 16,
-/* 5220 */ 106, 9, 129, 32, 6, 77, 15, 109, 7, 129,
-/* 5230 */ 32, 5, 76, 14, 111, 6, 129, 31, 5, 75,
-/* 5240 */ 14, 113, 5, 129, 31, 4, 74, 15, 114, 5,
-/* 5250 */ 129, 31, 4, 74, 14, 115, 4, 129, 30, 4,
-/* 5260 */ 73, 15, 116, 4, 129, 30, 4, 73, 14, 116,
-/* 5270 */ 4, 129, 30, 4, 73, 14, 117, 4, 129, 30,
-/* 5280 */ 4, 72, 15, 117, 4, 130, 30, 4, 71, 15,
-/* 5290 */ 117, 4, 130, 30, 4, 70, 15, 117, 4, 129,
-/* 5300 */ 30, 5, 70, 15, 117, 4, 129, 30, 5, 69,
-/* 5310 */ 15, 116, 5, 129, 30, 6, 68, 16, 115, 5,
-/* 5320 */ 129, 31, 6, 67, 16, 114, 6, 129, 31, 7,
-/* 5330 */ 66, 17, 113, 6, 129, 32, 7, 64, 18, 111,
-/* 5340 */ 8, 129, 32, 8, 62, 19, 109, 9, 129, 33,
-/* 5350 */ 9, 60, 20, 107, 10, 129, 34, 11, 57, 22,
-/* 5360 */ 103, 13, 129, 35, 43, 103, 18, 129, 36, 41,
-/* 5370 */ 103, 18, 129, 38, 38, 103, 18, 129, 39, 35,
-/* 5380 */ 103, 18, 129, 41, 31, 129, 43, 27, 129, 46,
-/* 5390 */ 22, 129, 49, 14, 129, 193, 129, 103, 18, 132,
-/* 5400 */ 110, 11, 129, 113, 8, 129, 114, 7, 129, 116,
-/* 5410 */ 5, 130, 117, 4, 132, 30, 4, 117, 4, 132,
-/* 5420 */ 30, 91, 137, 30, 4, 117, 4, 132, 117, 4,
-/* 5430 */ 132, 116, 5, 130, 114, 7, 129, 113, 8, 129,
-/* 5440 */ 110, 11, 129, 103, 18, 132, 193, 129, 117, 4,
-/* 5450 */ 132, 56, 65, 129, 50, 71, 129, 46, 75, 129,
-/* 5460 */ 44, 77, 129, 42, 79, 129, 40, 81, 129, 38,
-/* 5470 */ 83, 129, 36, 85, 129, 35, 86, 129, 34, 20,
-/* 5480 */ 117, 4, 129, 33, 17, 117, 4, 129, 32, 15,
-/* 5490 */ 117, 4, 129, 32, 13, 117, 4, 129, 31, 12,
-/* 5500 */ 129, 31, 10, 129, 31, 9, 129, 30, 9, 129,
-/* 5510 */ 30, 8, 130, 30, 7, 132, 31, 6, 130, 31,
-/* 5520 */ 7, 129, 32, 6, 129, 32, 7, 129, 33, 7,
-/* 5530 */ 129, 34, 7, 129, 35, 8, 129, 36, 9, 117,
-/* 5540 */ 4, 129, 38, 9, 117, 4, 129, 40, 10, 117,
-/* 5550 */ 4, 129, 42, 12, 117, 4, 129, 44, 77, 129,
-/* 5560 */ 46, 75, 129, 50, 71, 129, 56, 43, 100, 21,
-/* 5570 */ 129, 117, 4, 132, 193, 129, 117, 4, 132, 115,
-/* 5580 */ 6, 129, 110, 11, 129, 105, 16, 129, 101, 20,
-/* 5590 */ 129, 96, 25, 129, 92, 29, 129, 87, 34, 129,
-/* 5600 */ 83, 38, 129, 78, 43, 129, 74, 47, 129, 70,
-/* 5610 */ 42, 117, 4, 129, 65, 42, 117, 4, 129, 60,
-/* 5620 */ 43, 117, 4, 129, 56, 42, 129, 51, 42, 129,
-/* 5630 */ 46, 43, 129, 42, 43, 129, 37, 44, 129, 33,
-/* 5640 */ 43, 129, 30, 42, 129, 33, 34, 129, 38, 25,
-/* 5650 */ 129, 42, 16, 129, 47, 15, 129, 52, 15, 129,
-/* 5660 */ 57, 15, 129, 61, 16, 129, 66, 16, 129, 71,
-/* 5670 */ 16, 129, 76, 16, 129, 80, 16, 129, 85, 16,
-/* 5680 */ 117, 4, 129, 90, 16, 117, 4, 129, 95, 16,
-/* 5690 */ 117, 4, 129, 100, 21, 129, 105, 16, 129, 110,
-/* 5700 */ 11, 129, 114, 7, 129, 117, 4, 132, 193, 129,
-/* 5710 */ 117, 4, 132, 115, 6, 129, 110, 11, 129, 105,
-/* 5720 */ 16, 129, 101, 20, 129, 96, 25, 129, 92, 29,
-/* 5730 */ 129, 87, 34, 129, 83, 38, 129, 78, 43, 129,
-/* 5740 */ 74, 47, 129, 70, 42, 117, 4, 129, 65, 42,
-/* 5750 */ 117, 4, 129, 60, 43, 117, 4, 129, 56, 42,
-/* 5760 */ 129, 51, 42, 129, 46, 43, 129, 42, 43, 129,
-/* 5770 */ 37, 44, 129, 33, 43, 129, 30, 42, 129, 33,
-/* 5780 */ 34, 129, 38, 25, 129, 42, 16, 129, 47, 15,
-/* 5790 */ 129, 52, 15, 129, 57, 15, 129, 61, 16, 129,
-/* 5800 */ 65, 17, 129, 60, 27, 129, 56, 36, 129, 51,
-/* 5810 */ 42, 129, 46, 43, 129, 42, 43, 129, 37, 44,
-/* 5820 */ 129, 33, 43, 129, 30, 42, 129, 33, 34, 129,
-/* 5830 */ 38, 25, 129, 42, 16, 129, 47, 15, 129, 52,
-/* 5840 */ 15, 129, 57, 15, 129, 61, 16, 129, 66, 16,
-/* 5850 */ 129, 71, 16, 129, 76, 16, 129, 80, 16, 129,
-/* 5860 */ 85, 16, 117, 4, 129, 90, 16, 117, 4, 129,
-/* 5870 */ 95, 16, 117, 4, 129, 100, 21, 129, 105, 16,
-/* 5880 */ 129, 110, 11, 129, 114, 7, 129, 117, 4, 132,
-/* 5890 */ 193, 129, 30, 4, 117, 4, 132, 30, 4, 115,
-/* 5900 */ 6, 129, 30, 4, 112, 9, 129, 30, 6, 109,
-/* 5910 */ 12, 129, 30, 9, 106, 15, 129, 30, 11, 103,
-/* 5920 */ 18, 129, 30, 14, 100, 21, 129, 30, 4, 38,
-/* 5930 */ 9, 98, 23, 129, 30, 4, 40, 10, 95, 26,
-/* 5940 */ 129, 30, 4, 43, 9, 92, 29, 129, 46, 9,
-/* 5950 */ 89, 32, 129, 49, 8, 86, 28, 117, 4, 129,
-/* 5960 */ 51, 9, 83, 28, 117, 4, 129, 54, 9, 80,
-/* 5970 */ 28, 117, 4, 129, 57, 8, 77, 28, 117, 4,
-/* 5980 */ 129, 59, 9, 74, 28, 129, 62, 37, 129, 64,
-/* 5990 */ 33, 129, 66, 28, 129, 63, 28, 129, 60, 28,
-/* 6000 */ 129, 57, 28, 129, 54, 33, 129, 51, 39, 129,
-/* 6010 */ 48, 29, 83, 9, 129, 30, 4, 45, 29, 86,
-/* 6020 */ 9, 129, 30, 4, 42, 29, 89, 9, 129, 30,
-/* 6030 */ 4, 39, 29, 92, 8, 129, 30, 4, 36, 29,
-/* 6040 */ 94, 9, 129, 30, 32, 97, 9, 129, 30, 29,
-/* 6050 */ 100, 8, 117, 4, 129, 30, 26, 103, 8, 117,
-/* 6060 */ 4, 129, 30, 23, 105, 9, 117, 4, 129, 30,
-/* 6070 */ 20, 108, 13, 129, 30, 18, 111, 10, 129, 30,
-/* 6080 */ 15, 113, 8, 129, 30, 12, 116, 5, 129, 30,
-/* 6090 */ 9, 117, 4, 129, 30, 6, 117, 4, 129, 30,
-/* 6100 */ 4, 117, 4, 132, 193, 129, 117, 4, 132, 114,
-/* 6110 */ 7, 129, 111, 10, 129, 108, 13, 129, 105, 16,
-/* 6120 */ 129, 102, 19, 129, 100, 21, 129, 96, 25, 129,
-/* 6130 */ 93, 28, 129, 90, 31, 129, 87, 34, 129, 84,
-/* 6140 */ 30, 117, 4, 129, 30, 4, 81, 30, 117, 4,
-/* 6150 */ 129, 30, 4, 78, 30, 117, 4, 129, 30, 4,
-/* 6160 */ 75, 30, 117, 4, 129, 30, 4, 72, 30, 129,
-/* 6170 */ 30, 69, 129, 30, 66, 129, 30, 63, 129, 30,
-/* 6180 */ 60, 129, 30, 57, 129, 30, 54, 129, 30, 51,
-/* 6190 */ 129, 30, 48, 129, 30, 51, 129, 30, 4, 73,
-/* 6200 */ 12, 129, 30, 4, 76, 12, 129, 30, 4, 80,
-/* 6210 */ 12, 129, 30, 4, 83, 12, 129, 87, 12, 129,
-/* 6220 */ 90, 12, 117, 4, 129, 94, 11, 117, 4, 129,
-/* 6230 */ 97, 12, 117, 4, 129, 101, 12, 117, 4, 129,
-/* 6240 */ 104, 17, 129, 108, 13, 129, 111, 10, 129, 115,
-/* 6250 */ 6, 129, 117, 4, 134, 193, 129, 30, 1, 103,
-/* 6260 */ 18, 129, 30, 4, 103, 18, 129, 30, 7, 103,
-/* 6270 */ 18, 129, 30, 9, 103, 18, 129, 30, 12, 110,
-/* 6280 */ 11, 129, 30, 15, 113, 8, 129, 30, 18, 114,
-/* 6290 */ 7, 129, 30, 21, 116, 5, 129, 30, 24, 116,
-/* 6300 */ 5, 129, 30, 27, 117, 4, 129, 30, 30, 117,
-/* 6310 */ 4, 129, 30, 33, 117, 4, 129, 30, 4, 37,
-/* 6320 */ 28, 117, 4, 129, 30, 4, 40, 28, 117, 4,
-/* 6330 */ 129, 30, 4, 42, 29, 117, 4, 129, 30, 4,
-/* 6340 */ 45, 29, 117, 4, 129, 30, 4, 48, 29, 117,
-/* 6350 */ 4, 129, 30, 4, 51, 29, 117, 4, 129, 30,
-/* 6360 */ 4, 54, 29, 117, 4, 129, 30, 4, 57, 29,
-/* 6370 */ 117, 4, 129, 30, 4, 59, 30, 117, 4, 129,
-/* 6380 */ 30, 4, 62, 30, 117, 4, 129, 30, 4, 65,
-/* 6390 */ 30, 117, 4, 129, 30, 4, 68, 30, 117, 4,
-/* 6400 */ 129, 30, 4, 71, 30, 117, 4, 129, 30, 4,
-/* 6410 */ 74, 30, 117, 4, 129, 30, 4, 77, 30, 117,
-/* 6420 */ 4, 129, 30, 4, 80, 30, 117, 4, 129, 30,
-/* 6430 */ 4, 83, 30, 117, 4, 129, 30, 4, 86, 35,
-/* 6440 */ 129, 30, 4, 89, 32, 129, 30, 4, 91, 30,
-/* 6450 */ 129, 30, 4, 94, 27, 129, 30, 5, 97, 24,
-/* 6460 */ 129, 30, 5, 100, 21, 129, 30, 7, 103, 18,
-/* 6470 */ 129, 30, 8, 106, 15, 129, 30, 11, 109, 12,
-/* 6480 */ 129, 30, 18, 112, 9, 129, 30, 18, 115, 6,
-/* 6490 */ 129, 30, 18, 117, 4, 129, 30, 18, 120, 1,
-/* 6500 */ 129, 193, 129, 42, 8, 129, 38, 16, 129, 36,
-/* 6510 */ 20, 129, 34, 24, 71, 5, 129, 33, 26, 69,
-/* 6520 */ 10, 129, 32, 28, 68, 13, 129, 31, 30, 68,
-/* 6530 */ 14, 129, 31, 9, 52, 9, 68, 15, 129, 30,
-/* 6540 */ 8, 54, 8, 69, 14, 129, 30, 7, 55, 7,
-/* 6550 */ 71, 4, 78, 6, 129, 30, 6, 56, 6, 79,
-/* 6560 */ 5, 129, 30, 6, 56, 6, 80, 4, 130, 31,
-/* 6570 */ 5, 56, 5, 80, 4, 129, 31, 5, 56, 5,
-/* 6580 */ 79, 5, 129, 32, 5, 55, 5, 78, 6, 129,
-/* 6590 */ 33, 5, 54, 5, 77, 7, 129, 34, 6, 52,
-/* 6600 */ 6, 74, 9, 129, 35, 48, 129, 33, 49, 129,
-/* 6610 */ 32, 49, 129, 31, 49, 129, 30, 49, 129, 30,
-/* 6620 */ 47, 129, 30, 45, 129, 30, 41, 129, 30, 6,
-/* 6630 */ 129, 30, 4, 129, 30, 3, 129, 30, 2, 129,
-/* 6640 */ 193, 129, 30, 4, 117, 4, 130, 31, 90, 136,
-/* 6650 */ 37, 5, 72, 5, 129, 35, 5, 74, 5, 129,
-/* 6660 */ 33, 5, 76, 5, 129, 32, 5, 77, 5, 129,
-/* 6670 */ 31, 5, 78, 5, 129, 31, 4, 79, 4, 129,
-/* 6680 */ 30, 5, 79, 5, 131, 30, 6, 78, 6, 129,
-/* 6690 */ 30, 7, 77, 7, 129, 31, 8, 75, 8, 129,
-/* 6700 */ 31, 11, 72, 11, 129, 32, 15, 67, 15, 129,
-/* 6710 */ 33, 48, 129, 34, 46, 129, 35, 44, 129, 37,
-/* 6720 */ 40, 129, 39, 36, 129, 42, 30, 129, 46, 22,
-/* 6730 */ 129, 193, 129, 48, 18, 129, 43, 28, 129, 41,
-/* 6740 */ 32, 129, 39, 36, 129, 37, 40, 129, 35, 44,
-/* 6750 */ 129, 34, 46, 129, 33, 13, 68, 13, 129, 32,
-/* 6760 */ 9, 73, 9, 129, 32, 7, 75, 7, 129, 31,
-/* 6770 */ 6, 77, 6, 129, 31, 5, 78, 5, 129, 30,
-/* 6780 */ 5, 79, 5, 129, 30, 4, 80, 4, 133, 31,
-/* 6790 */ 3, 79, 4, 129, 31, 4, 79, 4, 129, 32,
-/* 6800 */ 3, 78, 4, 129, 32, 4, 76, 6, 129, 33,
-/* 6810 */ 4, 74, 7, 129, 34, 4, 72, 8, 129, 35,
-/* 6820 */ 5, 72, 7, 129, 37, 5, 73, 4, 129, 39,
-/* 6830 */ 4, 74, 1, 129, 129, 193, 129, 46, 22, 129,
-/* 6840 */ 42, 30, 129, 39, 36, 129, 37, 40, 129, 35,
-/* 6850 */ 44, 129, 34, 46, 129, 33, 48, 129, 32, 15,
-/* 6860 */ 67, 15, 129, 31, 11, 72, 11, 129, 31, 8,
-/* 6870 */ 75, 8, 129, 30, 7, 77, 7, 129, 30, 6,
-/* 6880 */ 78, 6, 129, 30, 5, 79, 5, 131, 31, 4,
-/* 6890 */ 79, 4, 129, 31, 5, 78, 5, 129, 32, 5,
-/* 6900 */ 77, 5, 129, 33, 5, 76, 5, 129, 35, 5,
-/* 6910 */ 74, 5, 117, 4, 129, 37, 5, 72, 5, 117,
-/* 6920 */ 4, 129, 30, 91, 136, 30, 4, 130, 193, 129,
-/* 6930 */ 48, 18, 129, 43, 28, 129, 41, 32, 129, 39,
-/* 6940 */ 36, 129, 37, 40, 129, 35, 44, 129, 34, 46,
-/* 6950 */ 129, 33, 13, 55, 4, 68, 13, 129, 32, 9,
-/* 6960 */ 55, 4, 73, 9, 129, 32, 7, 55, 4, 75,
-/* 6970 */ 7, 129, 31, 6, 55, 4, 77, 6, 129, 31,
-/* 6980 */ 5, 55, 4, 78, 5, 129, 30, 5, 55, 4,
-/* 6990 */ 79, 5, 129, 30, 4, 55, 4, 80, 4, 132,
-/* 7000 */ 30, 4, 55, 4, 79, 5, 129, 31, 3, 55,
-/* 7010 */ 4, 78, 5, 129, 31, 4, 55, 4, 77, 6,
-/* 7020 */ 129, 32, 3, 55, 4, 75, 7, 129, 32, 4,
-/* 7030 */ 55, 4, 73, 9, 129, 33, 4, 55, 4, 68,
-/* 7040 */ 13, 129, 34, 4, 55, 25, 129, 35, 5, 55,
-/* 7050 */ 24, 129, 37, 5, 55, 22, 129, 39, 4, 55,
-/* 7060 */ 20, 129, 55, 18, 129, 55, 16, 129, 55, 11,
-/* 7070 */ 129, 193, 129, 80, 4, 129, 30, 4, 80, 4,
-/* 7080 */ 130, 30, 78, 129, 30, 82, 129, 30, 85, 129,
-/* 7090 */ 30, 87, 129, 30, 88, 129, 30, 89, 129, 30,
-/* 7100 */ 90, 130, 30, 4, 80, 4, 115, 6, 129, 30,
-/* 7110 */ 4, 80, 4, 117, 4, 129, 80, 4, 105, 6,
-/* 7120 */ 117, 4, 129, 80, 4, 103, 10, 116, 5, 129,
-/* 7130 */ 80, 4, 102, 19, 129, 80, 4, 101, 19, 129,
-/* 7140 */ 101, 19, 129, 101, 18, 129, 102, 16, 129, 103,
-/* 7150 */ 12, 129, 105, 6, 129, 193, 129, 12, 10, 59,
-/* 7160 */ 11, 129, 9, 16, 55, 19, 129, 7, 20, 53,
-/* 7170 */ 23, 129, 6, 7, 23, 5, 32, 6, 51, 27,
-/* 7180 */ 129, 4, 7, 25, 16, 50, 29, 129, 3, 6,
-/* 7190 */ 27, 16, 49, 31, 129, 2, 6, 28, 16, 48,
-/* 7200 */ 33, 129, 1, 6, 27, 18, 47, 35, 129, 1,
-/* 7210 */ 6, 27, 31, 71, 12, 129, 1, 5, 26, 15,
-/* 7220 */ 44, 10, 75, 8, 129, 1, 5, 25, 14, 45,
-/* 7230 */ 7, 77, 7, 129, 1, 5, 25, 13, 45, 5,
-/* 7240 */ 79, 5, 129, 1, 5, 24, 14, 45, 4, 80,
-/* 7250 */ 4, 129, 1, 5, 24, 13, 45, 4, 80, 4,
-/* 7260 */ 129, 1, 5, 23, 14, 45, 4, 80, 4, 129,
-/* 7270 */ 1, 5, 23, 13, 45, 4, 80, 4, 129, 1,
-/* 7280 */ 6, 22, 13, 45, 5, 79, 5, 129, 1, 6,
-/* 7290 */ 21, 14, 45, 7, 77, 7, 129, 1, 7, 21,
-/* 7300 */ 13, 46, 8, 75, 8, 129, 1, 8, 20, 13,
-/* 7310 */ 46, 12, 71, 12, 129, 1, 10, 18, 15, 47,
-/* 7320 */ 35, 129, 2, 30, 48, 33, 129, 3, 29, 49,
-/* 7330 */ 32, 129, 4, 27, 50, 31, 129, 5, 25, 51,
-/* 7340 */ 27, 80, 2, 86, 4, 129, 7, 21, 53, 23,
-/* 7350 */ 80, 3, 85, 6, 129, 9, 17, 55, 19, 80,
-/* 7360 */ 12, 129, 12, 12, 59, 11, 81, 11, 129, 82,
-/* 7370 */ 10, 129, 84, 7, 129, 86, 4, 129, 193, 129,
-/* 7380 */ 30, 4, 117, 4, 130, 30, 91, 136, 30, 4,
-/* 7390 */ 72, 5, 129, 30, 4, 74, 5, 129, 75, 5,
-/* 7400 */ 129, 76, 5, 129, 76, 6, 129, 77, 6, 130,
-/* 7410 */ 77, 7, 130, 76, 8, 129, 30, 4, 75, 9,
-/* 7420 */ 129, 30, 4, 72, 12, 129, 30, 54, 129, 30,
-/* 7430 */ 53, 130, 30, 52, 129, 30, 51, 129, 30, 49,
-/* 7440 */ 129, 30, 46, 129, 30, 42, 129, 30, 4, 130,
-/* 7450 */ 193, 129, 30, 4, 80, 4, 129, 30, 4, 80,
-/* 7460 */ 4, 100, 6, 129, 30, 54, 98, 10, 129, 30,
-/* 7470 */ 54, 97, 12, 129, 30, 54, 96, 14, 131, 30,
-/* 7480 */ 54, 97, 12, 129, 30, 54, 98, 10, 129, 30,
-/* 7490 */ 54, 100, 6, 129, 30, 4, 130, 193, 129, 7,
-/* 7500 */ 6, 129, 4, 11, 129, 3, 13, 129, 2, 14,
-/* 7510 */ 129, 1, 15, 130, 1, 3, 6, 9, 129, 1,
-/* 7520 */ 3, 7, 6, 129, 1, 3, 130, 1, 4, 129,
-/* 7530 */ 1, 5, 80, 4, 129, 1, 7, 80, 4, 100,
-/* 7540 */ 6, 129, 2, 82, 98, 10, 129, 3, 81, 97,
-/* 7550 */ 12, 129, 4, 80, 96, 14, 129, 5, 79, 96,
-/* 7560 */ 14, 129, 7, 77, 96, 14, 129, 10, 74, 97,
-/* 7570 */ 12, 129, 14, 70, 98, 10, 129, 19, 65, 100,
-/* 7580 */ 6, 129, 193, 129, 30, 4, 117, 4, 130, 30,
-/* 7590 */ 91, 136, 30, 4, 57, 9, 129, 30, 4, 55,
-/* 7600 */ 12, 129, 52, 17, 129, 50, 20, 129, 48, 24,
-/* 7610 */ 129, 46, 27, 129, 44, 21, 69, 6, 129, 41,
-/* 7620 */ 22, 70, 6, 80, 4, 129, 30, 4, 39, 21,
-/* 7630 */ 72, 6, 80, 4, 129, 30, 4, 36, 22, 73,
-/* 7640 */ 11, 129, 30, 26, 75, 9, 129, 30, 23, 76,
-/* 7650 */ 8, 129, 30, 21, 78, 6, 129, 30, 19, 79,
-/* 7660 */ 5, 129, 30, 16, 80, 4, 129, 30, 14, 80,
-/* 7670 */ 4, 129, 30, 12, 129, 30, 10, 129, 30, 7,
-/* 7680 */ 129, 30, 5, 129, 30, 4, 130, 193, 129, 30,
-/* 7690 */ 4, 117, 4, 130, 30, 91, 136, 30, 4, 130,
-/* 7700 */ 193, 129, 30, 4, 80, 4, 130, 30, 54, 136,
-/* 7710 */ 30, 4, 72, 5, 129, 30, 4, 74, 5, 129,
-/* 7720 */ 75, 5, 129, 76, 5, 129, 30, 4, 75, 7,
-/* 7730 */ 129, 30, 4, 74, 9, 129, 30, 54, 132, 30,
-/* 7740 */ 53, 129, 30, 52, 129, 30, 51, 129, 30, 48,
-/* 7750 */ 129, 30, 4, 72, 5, 129, 30, 4, 74, 5,
-/* 7760 */ 129, 75, 5, 129, 76, 5, 129, 30, 4, 75,
-/* 7770 */ 7, 129, 30, 4, 74, 9, 129, 30, 54, 132,
-/* 7780 */ 30, 53, 129, 30, 52, 129, 30, 51, 129, 30,
-/* 7790 */ 48, 129, 30, 4, 130, 193, 129, 30, 4, 80,
-/* 7800 */ 4, 130, 30, 54, 136, 30, 4, 72, 5, 129,
-/* 7810 */ 30, 4, 74, 5, 129, 75, 5, 129, 76, 5,
-/* 7820 */ 129, 76, 6, 129, 77, 6, 130, 77, 7, 130,
-/* 7830 */ 76, 8, 129, 30, 4, 75, 9, 129, 30, 4,
-/* 7840 */ 72, 12, 129, 30, 54, 129, 30, 53, 130, 30,
-/* 7850 */ 52, 129, 30, 51, 129, 30, 49, 129, 30, 46,
-/* 7860 */ 129, 30, 42, 129, 30, 4, 130, 193, 129, 48,
-/* 7870 */ 18, 129, 43, 28, 129, 41, 32, 129, 39, 36,
-/* 7880 */ 129, 37, 40, 129, 35, 44, 129, 34, 46, 129,
-/* 7890 */ 33, 13, 68, 13, 129, 32, 9, 73, 9, 129,
-/* 7900 */ 32, 7, 75, 7, 129, 31, 6, 77, 6, 129,
-/* 7910 */ 31, 5, 78, 5, 129, 30, 5, 79, 5, 129,
-/* 7920 */ 30, 4, 80, 4, 132, 30, 5, 79, 5, 130,
-/* 7930 */ 31, 5, 78, 5, 129, 31, 6, 77, 6, 129,
-/* 7940 */ 32, 7, 75, 7, 129, 32, 9, 73, 9, 129,
-/* 7950 */ 33, 13, 68, 13, 129, 34, 46, 129, 35, 44,
-/* 7960 */ 129, 37, 40, 129, 39, 36, 129, 41, 32, 129,
-/* 7970 */ 43, 28, 129, 48, 18, 129, 193, 129, 1, 3,
-/* 7980 */ 80, 4, 130, 1, 83, 137, 37, 5, 72, 5,
-/* 7990 */ 129, 35, 5, 74, 5, 129, 33, 5, 76, 5,
-/* 8000 */ 129, 32, 5, 77, 5, 129, 31, 5, 78, 5,
-/* 8010 */ 129, 31, 4, 79, 4, 129, 30, 5, 79, 5,
-/* 8020 */ 131, 30, 6, 78, 6, 129, 30, 7, 77, 7,
-/* 8030 */ 129, 31, 8, 75, 8, 129, 31, 11, 72, 11,
-/* 8040 */ 129, 32, 15, 67, 15, 129, 33, 48, 129, 34,
-/* 8050 */ 46, 129, 35, 44, 129, 37, 40, 129, 39, 36,
-/* 8060 */ 129, 42, 30, 129, 46, 22, 129, 193, 129, 46,
-/* 8070 */ 22, 129, 42, 30, 129, 39, 36, 129, 37, 40,
-/* 8080 */ 129, 35, 44, 129, 34, 46, 129, 33, 48, 129,
-/* 8090 */ 32, 15, 67, 15, 129, 31, 11, 72, 11, 129,
-/* 8100 */ 31, 8, 75, 8, 129, 30, 7, 77, 7, 129,
-/* 8110 */ 30, 6, 78, 6, 129, 30, 5, 79, 5, 131,
-/* 8120 */ 31, 4, 79, 4, 129, 31, 5, 78, 5, 129,
-/* 8130 */ 32, 5, 77, 5, 129, 33, 5, 76, 5, 129,
-/* 8140 */ 35, 5, 74, 5, 129, 37, 5, 72, 5, 129,
-/* 8150 */ 1, 83, 136, 1, 3, 80, 4, 130, 193, 129,
-/* 8160 */ 30, 4, 80, 4, 130, 30, 54, 136, 30, 4,
-/* 8170 */ 68, 6, 129, 30, 4, 70, 6, 129, 71, 7,
-/* 8180 */ 129, 72, 7, 129, 73, 7, 129, 74, 7, 129,
-/* 8190 */ 74, 8, 129, 75, 8, 130, 69, 15, 129, 67,
-/* 8200 */ 17, 129, 66, 18, 129, 65, 19, 130, 65, 18,
-/* 8210 */ 130, 66, 16, 129, 67, 13, 129, 69, 8, 129,
-/* 8220 */ 193, 129, 30, 13, 64, 8, 129, 30, 13, 61,
-/* 8230 */ 14, 129, 30, 13, 59, 18, 129, 30, 13, 57,
-/* 8240 */ 22, 129, 33, 8, 56, 24, 129, 32, 7, 55,
-/* 8250 */ 26, 129, 32, 6, 54, 28, 129, 31, 6, 53,
-/* 8260 */ 16, 77, 6, 129, 31, 5, 53, 14, 79, 4,
-/* 8270 */ 129, 30, 5, 52, 14, 80, 4, 129, 30, 5,
-/* 8280 */ 52, 13, 80, 4, 129, 30, 4, 52, 13, 80,
-/* 8290 */ 4, 129, 30, 4, 52, 12, 80, 4, 129, 30,
-/* 8300 */ 4, 51, 13, 80, 4, 130, 30, 4, 50, 13,
-/* 8310 */ 79, 5, 129, 30, 4, 50, 13, 78, 5, 129,
-/* 8320 */ 30, 5, 49, 14, 77, 6, 129, 31, 4, 49,
-/* 8330 */ 13, 76, 6, 129, 31, 5, 48, 14, 75, 7,
-/* 8340 */ 129, 32, 5, 47, 14, 73, 8, 129, 32, 6,
-/* 8350 */ 45, 16, 71, 13, 129, 33, 27, 71, 13, 129,
-/* 8360 */ 34, 26, 71, 13, 129, 35, 24, 71, 13, 129,
-/* 8370 */ 37, 20, 129, 39, 16, 129, 43, 9, 129, 193,
-/* 8380 */ 129, 80, 4, 131, 41, 56, 129, 37, 60, 129,
-/* 8390 */ 35, 62, 129, 33, 64, 129, 32, 65, 129, 31,
-/* 8400 */ 66, 129, 30, 67, 130, 30, 11, 80, 4, 129,
-/* 8410 */ 30, 9, 80, 4, 129, 30, 8, 80, 4, 129,
-/* 8420 */ 31, 7, 80, 4, 129, 31, 6, 129, 32, 5,
-/* 8430 */ 129, 33, 5, 129, 35, 4, 129, 38, 3, 129,
-/* 8440 */ 193, 129, 80, 4, 130, 42, 42, 129, 38, 46,
-/* 8450 */ 129, 35, 49, 129, 33, 51, 129, 32, 52, 129,
-/* 8460 */ 31, 53, 130, 30, 54, 129, 30, 12, 129, 30,
-/* 8470 */ 9, 129, 30, 8, 129, 30, 7, 130, 31, 6,
-/* 8480 */ 130, 32, 6, 129, 33, 5, 129, 34, 5, 129,
-/* 8490 */ 35, 5, 80, 4, 129, 37, 5, 80, 4, 129,
-/* 8500 */ 30, 54, 136, 30, 4, 130, 193, 129, 80, 4,
-/* 8510 */ 130, 77, 7, 129, 74, 10, 129, 70, 14, 129,
-/* 8520 */ 66, 18, 129, 62, 22, 129, 59, 25, 129, 55,
-/* 8530 */ 29, 129, 51, 33, 129, 47, 37, 129, 44, 32,
-/* 8540 */ 80, 4, 129, 40, 32, 80, 4, 129, 36, 32,
-/* 8550 */ 129, 32, 33, 129, 30, 31, 129, 33, 24, 129,
-/* 8560 */ 36, 17, 129, 40, 12, 129, 44, 12, 129, 48,
-/* 8570 */ 12, 129, 51, 13, 129, 55, 13, 129, 59, 13,
-/* 8580 */ 80, 4, 129, 63, 13, 80, 4, 129, 67, 17,
-/* 8590 */ 129, 71, 13, 129, 74, 10, 129, 78, 6, 129,
-/* 8600 */ 80, 4, 131, 193, 129, 80, 4, 130, 77, 7,
-/* 8610 */ 129, 74, 10, 129, 70, 14, 129, 66, 18, 129,
-/* 8620 */ 62, 22, 129, 59, 25, 129, 55, 29, 129, 51,
-/* 8630 */ 33, 129, 47, 37, 129, 44, 32, 80, 4, 129,
-/* 8640 */ 40, 32, 80, 4, 129, 36, 32, 129, 32, 33,
-/* 8650 */ 129, 30, 31, 129, 33, 24, 129, 36, 17, 129,
-/* 8660 */ 40, 12, 129, 44, 12, 129, 47, 13, 129, 44,
-/* 8670 */ 20, 129, 40, 28, 129, 36, 31, 129, 32, 32,
-/* 8680 */ 129, 30, 30, 129, 33, 24, 129, 36, 17, 129,
-/* 8690 */ 40, 12, 129, 44, 12, 129, 48, 12, 129, 51,
-/* 8700 */ 13, 129, 55, 13, 129, 59, 13, 80, 4, 129,
-/* 8710 */ 63, 13, 80, 4, 129, 67, 17, 129, 71, 13,
-/* 8720 */ 129, 74, 10, 129, 78, 6, 129, 80, 4, 131,
-/* 8730 */ 193, 129, 30, 4, 80, 4, 130, 30, 4, 79,
-/* 8740 */ 5, 129, 30, 5, 77, 7, 129, 30, 6, 74,
-/* 8750 */ 10, 129, 30, 8, 72, 12, 129, 30, 11, 69,
-/* 8760 */ 15, 129, 30, 13, 67, 17, 129, 30, 4, 37,
-/* 8770 */ 8, 64, 20, 129, 30, 4, 39, 8, 62, 22,
-/* 8780 */ 129, 41, 8, 59, 25, 129, 43, 8, 57, 27,
-/* 8790 */ 129, 45, 8, 55, 22, 80, 4, 129, 47, 27,
-/* 8800 */ 80, 4, 129, 49, 23, 129, 47, 22, 129, 44,
-/* 8810 */ 23, 129, 42, 22, 129, 30, 4, 39, 27, 129,
-/* 8820 */ 30, 4, 37, 31, 129, 30, 27, 62, 8, 129,
-/* 8830 */ 30, 25, 64, 8, 129, 30, 22, 66, 8, 80,
-/* 8840 */ 4, 129, 30, 20, 68, 8, 80, 4, 129, 30,
-/* 8850 */ 17, 70, 8, 80, 4, 129, 30, 15, 73, 11,
-/* 8860 */ 129, 30, 12, 75, 9, 129, 30, 10, 77, 7,
-/* 8870 */ 129, 30, 7, 79, 5, 129, 30, 5, 80, 4,
-/* 8880 */ 129, 30, 4, 80, 4, 130, 193, 129, 4, 5,
-/* 8890 */ 80, 4, 129, 2, 9, 80, 4, 129, 1, 11,
-/* 8900 */ 77, 7, 129, 1, 12, 74, 10, 129, 1, 12,
-/* 8910 */ 70, 14, 129, 1, 12, 66, 18, 129, 1, 11,
-/* 8920 */ 62, 22, 129, 2, 9, 59, 25, 129, 4, 11,
-/* 8930 */ 55, 29, 129, 7, 12, 51, 33, 129, 10, 12,
-/* 8940 */ 47, 37, 129, 14, 12, 44, 32, 80, 4, 129,
-/* 8950 */ 17, 13, 40, 32, 80, 4, 129, 21, 13, 36,
-/* 8960 */ 32, 129, 25, 40, 129, 29, 32, 129, 33, 24,
-/* 8970 */ 129, 36, 17, 129, 40, 12, 129, 44, 12, 129,
-/* 8980 */ 48, 12, 129, 51, 13, 129, 55, 13, 129, 59,
-/* 8990 */ 13, 80, 4, 129, 63, 13, 80, 4, 129, 67,
-/* 9000 */ 17, 129, 71, 13, 129, 74, 10, 129, 78, 6,
-/* 9010 */ 129, 80, 4, 131, 193, 129, 30, 1, 71, 13,
-/* 9020 */ 129, 30, 3, 71, 13, 129, 30, 6, 71, 13,
-/* 9030 */ 129, 30, 9, 75, 9, 129, 30, 11, 77, 7,
-/* 9040 */ 129, 30, 14, 79, 5, 129, 30, 17, 79, 5,
-/* 9050 */ 129, 30, 19, 80, 4, 129, 30, 22, 80, 4,
-/* 9060 */ 129, 30, 25, 80, 4, 129, 30, 27, 80, 4,
-/* 9070 */ 129, 30, 4, 36, 24, 80, 4, 129, 30, 4,
-/* 9080 */ 38, 25, 80, 4, 129, 30, 4, 41, 24, 80,
-/* 9090 */ 4, 129, 30, 4, 44, 24, 80, 4, 129, 30,
-/* 9100 */ 4, 46, 25, 80, 4, 129, 30, 4, 49, 25,
-/* 9110 */ 80, 4, 129, 30, 4, 52, 24, 80, 4, 129,
-/* 9120 */ 30, 4, 54, 30, 129, 30, 4, 57, 27, 129,
-/* 9130 */ 30, 4, 59, 25, 129, 30, 4, 62, 22, 129,
-/* 9140 */ 30, 4, 65, 19, 129, 30, 5, 67, 17, 129,
-/* 9150 */ 30, 5, 70, 14, 129, 30, 7, 73, 11, 129,
-/* 9160 */ 30, 9, 76, 8, 129, 30, 13, 78, 6, 129,
-/* 9170 */ 30, 13, 81, 3, 129, 30, 13, 129, 193, 2,
-/* 9180 */ 9, 59, 25, 129, 4, 11, 55, 29, 129, 7,
-/* 9190 */ 12, 51, 33, 129, 10, 12, 47, 37, 129, 14,
-/* 9200 */ 12, 44, 32, 80, 4, 129, 17, 13, 40, 32,
-/* 9210 */ 80, 4, 129, 21, 13, 36, 32, 129, 25, 40,
-/* 9220 */ 129, 29, 32, 129, 33, 24, 129, 36, 17, 129,
-/* 9230 */ 40, 12, 129, 44, 12, 129, 48, 12, 129, 51,
-/* 9240 */ 13, 129, 55, 13, 129, 59, 13, 80, 4, 129,
-/* 9250 */ 63, 13, 80, 4, 129, 67, 17, 129, 71, 13,
-/* 9260 */ 129, 74, 10, 129, 78, 6, 129, 80, 4, 131,
-/* 9270 */ 193
-};
-
-char line[DWIDTH];
-char *message;
-char print[DWIDTH];
-int debug, i, j, linen, max, nchars, pc, term, trace, x, y;
-int width = DWIDTH; /* -w option: scrunch letters to 80 columns */
-
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- int ch;
-
- while ((ch = getopt(argc, argv, "w:td")) != -1)
- switch (ch) {
- case 'd':
- debug = 1;
- break;
- case 't':
- trace = 1;
- break;
- case 'w':
- width = atoi(optarg);
- if (width <= 0 || width > DWIDTH)
- errx(1, "illegal argument for -w option");
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- for (i = 0; i < width; i++) {
- j = i * DWIDTH / width;
- print[j] = 1;
- }
-
- /* Have now read in the data. Next get the message to be printed. */
- if (*argv) {
- for(i=0, j=0; i < argc; i++)
- j += strlen(argv[i]) + 1;
- if ((message = malloc((size_t)j)) == NULL)
- err(1, "malloc");
- strcpy(message, *argv);
- while (*++argv) {
- strcat(message, " ");
- strcat(message, *argv);
- }
- nchars = strlen(message);
- } else {
- if ((message = malloc((size_t)MAXMSG)) == NULL)
- err(1, "malloc");
- fprintf(stderr,"Message: ");
- if (fgets(message, MAXMSG, stdin) == NULL) {
- nchars = 0;
- message[0] = '\0';
- } else {
- nchars = strlen(message);
-
- /* Get rid of newline. */
- if (message[nchars - 1] == '\n')
- message[--nchars] = '\0';
- }
- }
-
- /* some debugging print statements */
- if (debug) {
- printf("const int asc_ptr[NCHARS] = {\n");
- for (i = 0; i < 128; i++) {
- printf("%4d, ",asc_ptr[i]);
- if ((i+1) % 8 == 0)
- printf("\n");
- }
- printf("};\nconst unsigned char data_table[NBYTES] = {\n");
- printf("/* ");
- for (i = 0; i < 10; i++) printf(" %3d ",i);
- printf("*/\n");
- for (i = 0; i < NBYTES; i += 10) {
- printf("/* %4d */ ",i);
- for (j = i; j < i+10; j++) {
- x = data_table[j] & 0377;
- printf(" %3d, ",x);
- }
- putchar('\n');
- }
- printf("};\n");
- }
-
- /* check message to make sure it's legal */
- j = 0;
- for (i = 0; i < nchars; i++)
- if ((u_char) message[i] >= NCHARS ||
- asc_ptr[(u_char) message[i]] == 0) {
- warnx("the character '%c' is not in my character set",
- message[i]);
- j++;
- }
- if (j)
- exit(1);
-
- if (trace)
- printf("Message '%s' is OK\n",message);
- /* Now have message. Print it one character at a time. */
-
- for (i = 0; i < nchars; i++) {
- if (trace)
- printf("Char #%d: %c\n", i, message[i]);
- for (j = 0; j < DWIDTH; j++) line[j] = ' ';
- pc = asc_ptr[(u_char) message[i]];
- term = 0;
- max = 0;
- linen = 0;
- while (!term) {
- if (pc < 0 || pc > NBYTES) {
- printf("bad pc: %d\n",pc);
- exit(1);
- }
- x = data_table[pc] & 0377;
- if (trace)
- printf("pc=%d, term=%d, max=%d, linen=%d, x=%d\n",pc,term,max,linen,x);
- if (x >= 128) {
- if (x>192) term++;
- x = x & 63;
- while (x--) {
- if (print[linen++]) {
- for (j=0; j <= max; j++)
- if (print[j])
- putchar(line[j]);
- putchar('\n');
- }
- }
- for (j = 0; j < DWIDTH; j++) line[j] = ' ';
- pc++;
- }
- else {
- y = data_table[pc+1];
- /* compensate for narrow teminals */
-#ifdef notdef
- x = (x*width + (DWIDTH/2)) / DWIDTH;
- y = (y*width + (DWIDTH/2)) / DWIDTH;
-#endif
- max = x+y;
- while (x < max) line[x++] = '#';
- pc += 2;
- if (trace)
- printf("x=%d, y=%d, max=%d\n",x,y,max);
- }
- }
- }
-
- free(message);
- exit(0);
-}
-
-static void
-usage()
-{
- fprintf(stderr, "usage: banner [-d] [-t] [-w width] message ...\n");
- exit(1);
-}
diff --git a/usr.bin/basename/Makefile b/usr.bin/basename/Makefile
deleted file mode 100644
index d647395..0000000
--- a/usr.bin/basename/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= basename
-MLINKS= basename.1 dirname.1
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/basename/basename.1 b/usr.bin/basename/basename.1
deleted file mode 100644
index b2ad95d..0000000
--- a/usr.bin/basename/basename.1
+++ /dev/null
@@ -1,116 +0,0 @@
-.\" Copyright (c) 1990, 1993, 1994
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)basename.1 8.2 (Berkeley) 4/18/94
-.\" $FreeBSD$
-.\"
-.Dd April 18, 1994
-.Dt BASENAME 1
-.Os
-.Sh NAME
-.Nm basename , dirname
-.Nd return filename or directory portion of pathname
-.Sh SYNOPSIS
-.Nm
-.Ar string
-.Op Ar suffix
-.Nm
-.Op Fl a
-.Op Fl s Ar suffix
-.Ar string
-.Op Ar ...
-.Nm dirname
-.Ar string
-.Sh DESCRIPTION
-The
-.Nm
-utility deletes any prefix ending with the last slash
-.Ql \&/
-character present in
-.Ar string
-(after first stripping trailing slashes),
-and a
-.Ar suffix ,
-if given.
-The
-.Ar suffix
-is not stripped if it is identical to the remaining characters in
-.Ar string .
-The resulting filename is written to the standard output.
-A non-existent suffix is ignored.
-If
-.Fl a
-is specified, then every argument is treated as a
-.Ar string
-as if
-.Nm
-were invoked with just one argument.
-If
-.Fl s
-is specified, then the
-.Ar suffix
-is taken as its argument, and all other arguments are treated as a
-.Ar string .
-.Pp
-The
-.Nm dirname
-utility deletes the filename portion, beginning
-with the last slash
-.Ql \&/
-character to the end of
-.Ar string
-(after first stripping trailing slashes),
-and writes the result to the standard output.
-.Sh EXIT STATUS
-.Ex -std basename dirname
-.Sh EXAMPLES
-The following line sets the shell variable
-.Ev FOO
-to
-.Pa /usr/bin .
-.Pp
-.Dl FOO=`dirname /usr/bin/trail`
-.Sh SEE ALSO
-.Xr csh 1 ,
-.Xr sh 1 ,
-.Xr basename 3 ,
-.Xr dirname 3
-.Sh STANDARDS
-The
-.Nm
-and
-.Nm dirname
-utilities are expected to be
-.St -p1003.2
-compatible.
diff --git a/usr.bin/basename/basename.c b/usr.bin/basename/basename.c
deleted file mode 100644
index d94ee67..0000000
--- a/usr.bin/basename/basename.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1991, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)basename.c 8.4 (Berkeley) 5/4/95";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <libgen.h>
-#include <limits.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-
-void stripsuffix(char *, const char *, size_t);
-void usage(void);
-
-int
-main(int argc, char **argv)
-{
- char *p, *suffix;
- size_t suffixlen;
- int aflag, ch;
-
- setlocale(LC_ALL, "");
-
- aflag = 0;
- suffix = NULL;
- suffixlen = 0;
-
- while ((ch = getopt(argc, argv, "as:")) != -1)
- switch(ch) {
- case 'a':
- aflag = 1;
- break;
- case 's':
- suffix = optarg;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (argc < 1)
- usage();
-
- if (!*argv[0]) {
- printf("\n");
- exit(0);
- }
- if ((p = basename(argv[0])) == NULL)
- err(1, "%s", argv[0]);
- if ((suffix == NULL && !aflag) && argc == 2) {
- suffix = argv[1];
- argc--;
- }
- if (suffix != NULL)
- suffixlen = strlen(suffix);
- while (argc--) {
- if ((p = basename(*argv)) == NULL)
- err(1, "%s", argv[0]);
- stripsuffix(p, suffix, suffixlen);
- argv++;
- (void)printf("%s\n", p);
- }
- exit(0);
-}
-
-void
-stripsuffix(char *p, const char *suffix, size_t suffixlen)
-{
- char *q, *r;
- mbstate_t mbs;
- size_t n;
-
- if (suffixlen && (q = strchr(p, '\0') - suffixlen) > p &&
- strcmp(suffix, q) == 0) {
- /* Ensure that the match occurred on a character boundary. */
- memset(&mbs, 0, sizeof(mbs));
- for (r = p; r < q; r += n) {
- n = mbrlen(r, MB_LEN_MAX, &mbs);
- if (n == (size_t)-1 || n == (size_t)-2) {
- memset(&mbs, 0, sizeof(mbs));
- n = 1;
- }
- }
- /* Chop off the suffix. */
- if (q == r)
- *q = '\0';
- }
-}
-
-void
-usage(void)
-{
-
- (void)fprintf(stderr,
-"usage: basename string [suffix]\n"
-" basename [-a] [-s suffix] string [...]\n");
- exit(1);
-}
diff --git a/usr.bin/biff/Makefile b/usr.bin/biff/Makefile
deleted file mode 100644
index 1510943..0000000
--- a/usr.bin/biff/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= biff
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/biff/biff.1 b/usr.bin/biff/biff.1
deleted file mode 100644
index 8484faa..0000000
--- a/usr.bin/biff/biff.1
+++ /dev/null
@@ -1,127 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)biff.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd July 9, 2002
-.Dt BIFF 1
-.Os
-.Sh NAME
-.Nm biff
-.Nd "be notified if mail arrives and who it is from"
-.Sh SYNOPSIS
-.Nm
-.Op Cm n | y | b
-.Sh DESCRIPTION
-The
-.Nm
-utility informs the system whether you want to be notified on your terminal
-when mail arrives.
-.Pp
-Affected is the first terminal associated with the standard input,
-standard output or standard error file descriptor, in that order.
-Thus, it is possible to use the redirection facilities of a shell to
-toggle the notification for other terminals than the one
-.Nm
-runs on.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Cm n
-Disable notification.
-.It Cm y
-Enable header notification.
-.It Cm b
-Enable bell notification.
-.El
-.Pp
-When header notification is enabled, the header and first few lines of
-the message will be printed on your terminal whenever mail arrives.
-A
-.Dq "Li biff y"
-command is often included in the file
-.Pa .login
-or
-.Pa .profile
-to be executed at each login.
-.Pp
-When bell notification is enabled, only two bell characters
-.Tn ( ASCII
-\\007)
-will be printed on your terminal whenever mail arrives.
-.Pp
-If no arguments are given,
-.Nm
-displays the present notification status of the terminal to the
-standard output.
-.Pp
-The
-.Nm
-utility operates asynchronously.
-For synchronous notification use the
-.Ev MAIL
-variable of
-.Xr sh 1
-or the
-.Va mail
-variable of
-.Xr csh 1 .
-.Sh EXIT STATUS
-The
-.Nm
-utility exits with one of the following values:
-.Bl -tag -width indent
-.It 0
-Notification is enabled.
-.It 1
-Notification is disabled.
-.It >1
-An error occurred.
-.El
-.Sh COMPATIBILITY
-Previous versions of the
-.Nm
-utility affected the terminal attached to standard error without first
-trying the standard input or output devices.
-.Sh SEE ALSO
-.Xr csh 1 ,
-.Xr mail 1 ,
-.Xr sh 1 ,
-.Xr comsat 8
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.0 .
-It was named after the dog of Heidi Stettner.
-He died
-in August 1993, at 15.
diff --git a/usr.bin/biff/biff.c b/usr.bin/biff/biff.c
deleted file mode 100644
index c04c8d3..0000000
--- a/usr.bin/biff/biff.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)biff.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/stat.h>
-
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- struct stat sb;
- int ch;
- char *name;
-
-
- while ((ch = getopt(argc, argv, "")) != -1)
- switch(ch) {
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if ((name = ttyname(STDIN_FILENO)) == NULL &&
- (name = ttyname(STDOUT_FILENO)) == NULL &&
- (name = ttyname(STDERR_FILENO)) == NULL)
- err(2, "unknown tty");
-
- if (stat(name, &sb))
- err(2, "stat");
-
- if (*argv == NULL) {
- (void)printf("is %s\n",
- sb.st_mode & S_IXUSR ? "y" :
- sb.st_mode & S_IXGRP ? "b" : "n");
- return (sb.st_mode & (S_IXUSR | S_IXGRP) ? 0 : 1);
-
- }
-
- switch (argv[0][0]) {
- case 'n':
- if (chmod(name, sb.st_mode & ~(S_IXUSR | S_IXGRP)) < 0)
- err(2, "%s", name);
- break;
- case 'y':
- if (chmod(name, (sb.st_mode & ~(S_IXUSR | S_IXGRP)) | S_IXUSR)
- < 0)
- err(2, "%s", name);
- break;
- case 'b':
- if (chmod(name, (sb.st_mode & ~(S_IXUSR | S_IXGRP)) | S_IXGRP)
- < 0)
- err(2, "%s", name);
- break;
- default:
- usage();
- }
- return (sb.st_mode & (S_IXUSR | S_IXGRP) ? 0 : 1);
-}
-
-static void
-usage()
-{
- (void)fprintf(stderr, "usage: biff [n | y | b]\n");
- exit(2);
-}
diff --git a/usr.bin/bluetooth/Makefile b/usr.bin/bluetooth/Makefile
deleted file mode 100644
index 9ef16cc..0000000
--- a/usr.bin/bluetooth/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-# $Id $
-# $FreeBSD$
-
-SUBDIR= \
- bthost \
- btsockstat \
- rfcomm_sppd
-
-.include <bsd.subdir.mk>
-
diff --git a/usr.bin/bluetooth/Makefile.inc b/usr.bin/bluetooth/Makefile.inc
deleted file mode 100644
index c0e05cf..0000000
--- a/usr.bin/bluetooth/Makefile.inc
+++ /dev/null
@@ -1,4 +0,0 @@
-# $FreeBSD$
-
-.include "${.CURDIR}/../../Makefile.inc"
-
diff --git a/usr.bin/bluetooth/bthost/Makefile b/usr.bin/bluetooth/bthost/Makefile
deleted file mode 100644
index fe2c479..0000000
--- a/usr.bin/bluetooth/bthost/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-# $Id: Makefile,v 1.4 2003/08/14 20:07:13 max Exp $
-# $FreeBSD$
-
-PROG= bthost
-WARNS?= 2
-
-DPADD= ${LIBBLUETOOTH}
-LDADD= -lbluetooth
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/bluetooth/bthost/bthost.1 b/usr.bin/bluetooth/bthost/bthost.1
deleted file mode 100644
index e4a4abc..0000000
--- a/usr.bin/bluetooth/bthost/bthost.1
+++ /dev/null
@@ -1,115 +0,0 @@
-.\" Copyright (c) 2003 Maksim Yevmenkin <m_evmenkin@yahoo.com>
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $Id: bthost.1,v 1.7 2003/05/21 22:19:00 max Exp $
-.\" $FreeBSD$
-.\"
-.Dd May 8, 2003
-.Dt BTHOST 1
-.Os
-.Sh NAME
-.Nm bthost
-.Nd look up Bluetooth host names and Protocol Service Multiplexor values
-.Sh SYNOPSIS
-.Nm
-.Op Fl bhp
-.Ar host_or_protocol
-.Sh DESCRIPTION
-The
-.Nm
-utility looks for information about Bluetooth hosts and
-Protocol Service Multiplexor (PSM) values.
-It gets this information from the
-.Pa /etc/bluetooth/hosts
-and
-.Pa /etc/bluetooth/protocols
-files.
-.Pp
-In host mode, it simply converts between the host names and Bluetooth addresses.
-The argument can be either a host name or a Bluetooth address.
-The program first attempts to interpret it as a Bluetooth address.
-If this fails, it will treat it as a host name.
-A Bluetooth address consists of six hex bytes separated by a colon,
-e.g.,
-.Dq Li 01:02:03:04:05:06 .
-A host name consists of names separated by dots, e.g.,
-.Dq Li my.cell.phone .
-.Pp
-In protocol mode, it simply converts between the Protocol Service Multiplexor
-names and assigned numbers.
-The argument can be either a Protocol Service Multiplexor name or
-an assigned number.
-The program first attempts to interpret it as an assigned number.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl b
-Produce brief output.
-.It Fl h
-Display usage message and exit.
-.It Fl p
-Activate protocol mode.
-.El
-.Pp
-The
-.Nm
-utility will print results to the standard output, and error messages to the
-standard error.
-An output can be quite different,
-here is an example that demonstrates all of the possibilities:
-.Bd -literal -offset indent
-% bthost localhost
-Host localhost has address FF:FF:FF:00:00:00
-% bthost ff:ff:ff:00:00:00
-Host FF:FF:FF:00:00:00 has name localhost
-% bthost -b localhost
-FF:FF:FF:00:00:00
-% bthost -b ff:ff:ff:00:00:00
-localhost
-% bthost do.not.exists
-do.not.exists: Unknown host
-% bthost 0:0:0:0:0:0
-00:00:00:00:00:00: Unknown host
-% bthost -p sdp
-Protocol/Service Multiplexor sdp has number 1
-% bthost -p 3
-Protocol/Service Multiplexor rfcomm has number 3
-% bthost -bp HID-Control
-17
-% bthost -p foo
-foo: Unknown Protocol/Service Multiplexor
-.Ed
-.Sh FILES
-.Bl -tag -width ".Pa /etc/bluetooth/hosts" -compact
-.It Pa /etc/bluetooth/hosts
-.It Pa /etc/bluetooth/protocols
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr bluetooth 3 ,
-.Xr bluetooth.hosts 5 ,
-.Xr bluetooth.protocols 5
-.Sh AUTHORS
-.An Maksim Yevmenkin Aq m_evmenkin@yahoo.com
diff --git a/usr.bin/bluetooth/bthost/bthost.c b/usr.bin/bluetooth/bthost/bthost.c
deleted file mode 100644
index 2dd5635..0000000
--- a/usr.bin/bluetooth/bthost/bthost.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * bthost.c
- *
- * Copyright (c) 2003 Maksim Yevmenkin <m_evmenkin@yahoo.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $Id: bthost.c,v 1.5 2003/05/21 20:30:01 max Exp $
- * $FreeBSD$
- */
-
-#include <bluetooth.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-static int hostmode (char const *arg, int brief);
-static int protomode (char const *arg, int brief);
-static void usage (void);
-
-int
-main(int argc, char **argv)
-{
- int opt, brief = 0, proto = 0;
-
- while ((opt = getopt(argc, argv, "bhp")) != -1) {
- switch (opt) {
- case 'b':
- brief = 1;
- break;
-
- case 'p':
- proto = 1;
- break;
-
- case 'h':
- default:
- usage();
- /* NOT REACHED */
- }
- }
-
- argc -= optind;
- argv += optind;
-
- if (argc < 1)
- usage();
-
- exit(proto? protomode(*argv, brief) : hostmode(*argv, brief));
-}
-
-static int
-hostmode(char const *arg, int brief)
-{
- struct hostent *he = NULL;
- bdaddr_t ba;
- char bastr[32];
- int reverse;
-
- if (bt_aton(arg, &ba) == 1) {
- reverse = 1;
- he = bt_gethostbyaddr((char const *) &ba, sizeof(ba),
- AF_BLUETOOTH);
- } else {
- reverse = 0;
- he = bt_gethostbyname(arg);
- }
-
- if (he == NULL) {
- herror(reverse? bt_ntoa(&ba, bastr) : arg);
- return (1);
- }
-
- if (brief)
- printf("%s", reverse? he->h_name :
- bt_ntoa((bdaddr_t *)(he->h_addr), bastr));
- else
- printf("Host %s has %s %s\n",
- reverse? bt_ntoa(&ba, bastr) : arg,
- reverse? "name" : "address",
- reverse? he->h_name :
- bt_ntoa((bdaddr_t *)(he->h_addr), bastr));
-
- return (0);
-}
-
-static int
-protomode(char const *arg, int brief)
-{
- struct protoent *pe = NULL;
- int proto;
-
- if ((proto = atoi(arg)) != 0)
- pe = bt_getprotobynumber(proto);
- else
- pe = bt_getprotobyname(arg);
-
- if (pe == NULL) {
- fprintf(stderr, "%s: Unknown Protocol/Service Multiplexor\n", arg);
- return (1);
- }
-
- if (brief) {
- if (proto)
- printf("%s", pe->p_name);
- else
- printf("%d", pe->p_proto);
- } else {
- printf("Protocol/Service Multiplexor %s has number %d\n",
- pe->p_name, pe->p_proto);
- }
-
- return (0);
-}
-
-static void
-usage(void)
-{
- fprintf(stdout, "Usage: bthost [-b -h -p] host_or_protocol\n");
- exit(255);
-}
-
diff --git a/usr.bin/bluetooth/btsockstat/Makefile b/usr.bin/bluetooth/btsockstat/Makefile
deleted file mode 100644
index cdec9f7..0000000
--- a/usr.bin/bluetooth/btsockstat/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-# $Id: Makefile,v 1.7 2003/08/14 20:07:14 max Exp $
-# $FreeBSD$
-
-PROG= btsockstat
-WARNS?= 2
-BINGRP= kmem
-BINMODE= 2555
-
-DPADD= ${LIBBLUETOOTH} ${LIBKVM}
-LDADD= -lbluetooth -lkvm
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/bluetooth/btsockstat/btsockstat.1 b/usr.bin/bluetooth/btsockstat/btsockstat.1
deleted file mode 100644
index ad5063d..0000000
--- a/usr.bin/bluetooth/btsockstat/btsockstat.1
+++ /dev/null
@@ -1,83 +0,0 @@
-.\" Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com>
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $Id: btsockstat.1,v 1.6 2003/05/21 00:09:45 max Exp $
-.\" $FreeBSD$
-.\"
-.Dd October 12, 2003
-.Dt BTSOCKSTAT 1
-.Os
-.Sh NAME
-.Nm btsockstat
-.Nd show Bluetooth sockets information
-.Sh SYNOPSIS
-.Nm
-.Op Fl nrh
-.Op Fl M Ar core
-.Op Fl p Ar protocol
-.Sh DESCRIPTION
-The
-.Nm
-utility symbolically displays the contents of various Bluetooth sockets
-related data structures.
-There are few output formats, depending on the
-options for the information presented.
-The
-.Nm
-utility
-will print results to the standard output and error messages to the
-standard error.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl h
-Display usage message and exit.
-.It Fl M Ar core
-Extract values associated with the name list from the specified core
-instead of the default
-.Pa /dev/kmem .
-.It Fl n
-Show Bluetooth addresses as numbers.
-Normally,
-.Nm
-attempts to resolve Bluetooth addresses, and display them symbolically.
-.It Fl p Ar protocol
-Display a list of active sockets (protocol control blocks) for each
-specified protocol.
-Supported protocols are:
-.Cm hci_raw , l2cap_raw , l2cap, rfcomm
-and
-.Cm rfcomm_s .
-.It Fl r
-Display a list of active routing entries (if any) for specified protocol.
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr ng_btsocket 4
-.Sh AUTHORS
-.An Maksim Yevmenkin Aq m_evmenkin@yahoo.com
-.Sh BUGS
-Most likely.
-Please report if found.
diff --git a/usr.bin/bluetooth/btsockstat/btsockstat.c b/usr.bin/bluetooth/btsockstat/btsockstat.c
deleted file mode 100644
index f63ee1f..0000000
--- a/usr.bin/bluetooth/btsockstat/btsockstat.c
+++ /dev/null
@@ -1,645 +0,0 @@
-/*
- * btsockstat.c
- *
- * Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $Id: btsockstat.c,v 1.8 2003/05/21 22:40:25 max Exp $
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-#include <sys/callout.h>
-#include <sys/param.h>
-#include <sys/protosw.h>
-#include <sys/queue.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-
-#include <net/if.h>
-#include <net/if_var.h>
-
-#include <bluetooth.h>
-#include <err.h>
-#include <fcntl.h>
-#include <kvm.h>
-#include <limits.h>
-#include <nlist.h>
-
-#include <netgraph/bluetooth/include/ng_bluetooth.h>
-#include <netgraph/bluetooth/include/ng_btsocket_hci_raw.h>
-#include <netgraph/bluetooth/include/ng_btsocket_l2cap.h>
-#include <netgraph/bluetooth/include/ng_btsocket_rfcomm.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-static void hcirawpr (kvm_t *kvmd, u_long addr);
-static void l2caprawpr (kvm_t *kvmd, u_long addr);
-static void l2cappr (kvm_t *kvmd, u_long addr);
-static void l2caprtpr (kvm_t *kvmd, u_long addr);
-static void rfcommpr (kvm_t *kvmd, u_long addr);
-static void rfcommpr_s (kvm_t *kvmd, u_long addr);
-
-static char * bdaddrpr (bdaddr_p const ba, char *str, int len);
-
-static kvm_t * kopen (char const *memf);
-static int kread (kvm_t *kvmd, u_long addr, char *buffer, int size);
-
-static void usage (void);
-
-/*
- * List of symbols
- */
-
-static struct nlist nl[] = {
-#define N_HCI_RAW 0
- { "_ng_btsocket_hci_raw_sockets" },
-#define N_L2CAP_RAW 1
- { "_ng_btsocket_l2cap_raw_sockets" },
-#define N_L2CAP 2
- { "_ng_btsocket_l2cap_sockets" },
-#define N_L2CAP_RAW_RT 3
- { "_ng_btsocket_l2cap_raw_rt" },
-#define N_L2CAP_RT 4
- { "_ng_btsocket_l2cap_rt" },
-#define N_RFCOMM 5
- { "_ng_btsocket_rfcomm_sockets" },
-#define N_RFCOMM_S 6
- { "_ng_btsocket_rfcomm_sessions" },
- { "" },
-};
-
-#define state2str(x) \
- (((x) >= sizeof(states)/sizeof(states[0]))? "UNKNOWN" : states[(x)])
-
-/*
- * Main
- */
-
-static int numeric_bdaddr = 0;
-
-int
-main(int argc, char *argv[])
-{
- int opt, proto = -1, route = 0;
- kvm_t *kvmd = NULL;
- char *memf = NULL;
-
- while ((opt = getopt(argc, argv, "hnM:p:r")) != -1) {
- switch (opt) {
- case 'n':
- numeric_bdaddr = 1;
- break;
-
- case 'M':
- memf = optarg;
- break;
-
- case 'p':
- if (strcasecmp(optarg, "hci_raw") == 0)
- proto = N_HCI_RAW;
- else if (strcasecmp(optarg, "l2cap_raw") == 0)
- proto = N_L2CAP_RAW;
- else if (strcasecmp(optarg, "l2cap") == 0)
- proto = N_L2CAP;
- else if (strcasecmp(optarg, "rfcomm") == 0)
- proto = N_RFCOMM;
- else if (strcasecmp(optarg, "rfcomm_s") == 0)
- proto = N_RFCOMM_S;
- else
- usage();
- /* NOT REACHED */
- break;
-
- case 'r':
- route = 1;
- break;
-
- case 'h':
- default:
- usage();
- /* NOT REACHED */
- }
- }
-
- if ((proto == N_HCI_RAW || proto == N_RFCOMM || proto == N_RFCOMM_S) && route)
- usage();
- /* NOT REACHED */
-
- /*
- * Discard setgid privileges if not the running kernel so that
- * bad guys can't print interesting stuff from kernel memory.
- */
-
- if (memf != NULL)
- setgid(getgid());
-
- kvmd = kopen(memf);
- if (kvmd == NULL)
- return (1);
-
- switch (proto) {
- case N_HCI_RAW:
- hcirawpr(kvmd, nl[N_HCI_RAW].n_value);
- break;
-
- case N_L2CAP_RAW:
- if (route)
- l2caprtpr(kvmd, nl[N_L2CAP_RAW_RT].n_value);
- else
- l2caprawpr(kvmd, nl[N_L2CAP_RAW].n_value);
- break;
-
- case N_L2CAP:
- if (route)
- l2caprtpr(kvmd, nl[N_L2CAP_RT].n_value);
- else
- l2cappr(kvmd, nl[N_L2CAP].n_value);
- break;
-
- case N_RFCOMM:
- rfcommpr(kvmd, nl[N_RFCOMM].n_value);
- break;
-
- case N_RFCOMM_S:
- rfcommpr_s(kvmd, nl[N_RFCOMM_S].n_value);
- break;
-
- default:
- if (route) {
- l2caprtpr(kvmd, nl[N_L2CAP_RAW_RT].n_value);
- l2caprtpr(kvmd, nl[N_L2CAP_RT].n_value);
- } else {
- hcirawpr(kvmd, nl[N_HCI_RAW].n_value);
- l2caprawpr(kvmd, nl[N_L2CAP_RAW].n_value);
- l2cappr(kvmd, nl[N_L2CAP].n_value);
- rfcommpr_s(kvmd, nl[N_RFCOMM_S].n_value);
- rfcommpr(kvmd, nl[N_RFCOMM].n_value);
- }
- break;
- }
-
- return (kvm_close(kvmd));
-} /* main */
-
-/*
- * Print raw HCI sockets
- */
-
-static void
-hcirawpr(kvm_t *kvmd, u_long addr)
-{
- ng_btsocket_hci_raw_pcb_p this = NULL, next = NULL;
- ng_btsocket_hci_raw_pcb_t pcb;
- struct socket so;
- int first = 1;
-
- if (addr == 0)
- return;
-
- if (kread(kvmd, addr, (char *) &this, sizeof(this)) < 0)
- return;
-
- for ( ; this != NULL; this = next) {
- if (kread(kvmd, (u_long) this, (char *) &pcb, sizeof(pcb)) < 0)
- return;
- if (kread(kvmd, (u_long) pcb.so, (char *) &so, sizeof(so)) < 0)
- return;
-
- next = LIST_NEXT(&pcb, next);
-
- if (first) {
- first = 0;
- fprintf(stdout,
-"Active raw HCI sockets\n" \
-"%-8.8s %-8.8s %-6.6s %-6.6s %-6.6s %-16.16s\n",
- "Socket",
- "PCB",
- "Flags",
- "Recv-Q",
- "Send-Q",
- "Local address");
- }
-
- if (pcb.addr.hci_node[0] == 0) {
- pcb.addr.hci_node[0] = '*';
- pcb.addr.hci_node[1] = 0;
- }
-
- fprintf(stdout,
-"%-8lx %-8lx %-6.6x %6d %6d %-16.16s\n",
- (unsigned long) pcb.so,
- (unsigned long) this,
- pcb.flags,
- so.so_rcv.sb_cc,
- so.so_snd.sb_cc,
- pcb.addr.hci_node);
- }
-} /* hcirawpr */
-
-/*
- * Print raw L2CAP sockets
- */
-
-static void
-l2caprawpr(kvm_t *kvmd, u_long addr)
-{
- ng_btsocket_l2cap_raw_pcb_p this = NULL, next = NULL;
- ng_btsocket_l2cap_raw_pcb_t pcb;
- struct socket so;
- int first = 1;
-
- if (addr == 0)
- return;
-
- if (kread(kvmd, addr, (char *) &this, sizeof(this)) < 0)
- return;
-
- for ( ; this != NULL; this = next) {
- if (kread(kvmd, (u_long) this, (char *) &pcb, sizeof(pcb)) < 0)
- return;
- if (kread(kvmd, (u_long) pcb.so, (char *) &so, sizeof(so)) < 0)
- return;
-
- next = LIST_NEXT(&pcb, next);
-
- if (first) {
- first = 0;
- fprintf(stdout,
-"Active raw L2CAP sockets\n" \
-"%-8.8s %-8.8s %-6.6s %-6.6s %-17.17s\n",
- "Socket",
- "PCB",
- "Recv-Q",
- "Send-Q",
- "Local address");
- }
-
- fprintf(stdout,
-"%-8lx %-8lx %6d %6d %-17.17s\n",
- (unsigned long) pcb.so,
- (unsigned long) this,
- so.so_rcv.sb_cc,
- so.so_snd.sb_cc,
- bdaddrpr(&pcb.src, NULL, 0));
- }
-} /* l2caprawpr */
-
-/*
- * Print L2CAP sockets
- */
-
-static void
-l2cappr(kvm_t *kvmd, u_long addr)
-{
- static char const * const states[] = {
- /* NG_BTSOCKET_L2CAP_CLOSED */ "CLOSED",
- /* NG_BTSOCKET_L2CAP_CONNECTING */ "CON",
- /* NG_BTSOCKET_L2CAP_CONFIGURING */ "CONFIG",
- /* NG_BTSOCKET_L2CAP_OPEN */ "OPEN",
- /* NG_BTSOCKET_L2CAP_DISCONNECTING */ "DISCON"
- };
-
- ng_btsocket_l2cap_pcb_p this = NULL, next = NULL;
- ng_btsocket_l2cap_pcb_t pcb;
- struct socket so;
- int first = 1;
- char local[24], remote[24];
-
- if (addr == 0)
- return;
-
- if (kread(kvmd, addr, (char *) &this, sizeof(this)) < 0)
- return;
-
- for ( ; this != NULL; this = next) {
- if (kread(kvmd, (u_long) this, (char *) &pcb, sizeof(pcb)) < 0)
- return;
- if (kread(kvmd, (u_long) pcb.so, (char *) &so, sizeof(so)) < 0)
- return;
-
- next = LIST_NEXT(&pcb, next);
-
- if (first) {
- first = 0;
- fprintf(stdout,
-"Active L2CAP sockets\n" \
-"%-8.8s %-6.6s %-6.6s %-23.23s %-17.17s %-5.5s %s\n",
- "PCB",
- "Recv-Q",
- "Send-Q",
- "Local address/PSM",
- "Foreign address",
- "CID",
- "State");
- }
-
- fprintf(stdout,
-"%-8lx %6d %6d %-17.17s/%-5d %-17.17s %-5d %s\n",
- (unsigned long) this,
- so.so_rcv.sb_cc,
- so.so_snd.sb_cc,
- bdaddrpr(&pcb.src, local, sizeof(local)),
- pcb.psm,
- bdaddrpr(&pcb.dst, remote, sizeof(remote)),
- pcb.cid,
- (so.so_options & SO_ACCEPTCONN)?
- "LISTEN" : state2str(pcb.state));
- }
-} /* l2cappr */
-
-/*
- * Print L2CAP routing table
- */
-
-static void
-l2caprtpr(kvm_t *kvmd, u_long addr)
-{
- ng_btsocket_l2cap_rtentry_p this = NULL, next = NULL;
- ng_btsocket_l2cap_rtentry_t rt;
- int first = 1;
-
- if (addr == 0)
- return;
-
- if (kread(kvmd, addr, (char *) &this, sizeof(this)) < 0)
- return;
-
- for ( ; this != NULL; this = next) {
- if (kread(kvmd, (u_long) this, (char *) &rt, sizeof(rt)) < 0)
- return;
-
- next = LIST_NEXT(&rt, next);
-
- if (first) {
- first = 0;
- fprintf(stdout,
-"Known %sL2CAP routes\n", (addr == nl[N_L2CAP_RAW_RT].n_value)? "raw " : "");
- fprintf(stdout,
-"%-8.8s %-8.8s %-17.17s\n", "RTentry",
- "Hook",
- "BD_ADDR");
- }
-
- fprintf(stdout,
-"%-8lx %-8lx %-17.17s\n",
- (unsigned long) this,
- (unsigned long) rt.hook,
- bdaddrpr(&rt.src, NULL, 0));
- }
-} /* l2caprtpr */
-
-/*
- * Print RFCOMM sockets
- */
-
-static void
-rfcommpr(kvm_t *kvmd, u_long addr)
-{
- static char const * const states[] = {
- /* NG_BTSOCKET_RFCOMM_DLC_CLOSED */ "CLOSED",
- /* NG_BTSOCKET_RFCOMM_DLC_W4_CONNECT */ "W4CON",
- /* NG_BTSOCKET_RFCOMM_DLC_CONFIGURING */ "CONFIG",
- /* NG_BTSOCKET_RFCOMM_DLC_CONNECTING */ "CONN",
- /* NG_BTSOCKET_RFCOMM_DLC_CONNECTED */ "OPEN",
- /* NG_BTSOCKET_RFCOMM_DLC_DISCONNECTING */ "DISCON"
- };
-
- ng_btsocket_rfcomm_pcb_p this = NULL, next = NULL;
- ng_btsocket_rfcomm_pcb_t pcb;
- struct socket so;
- int first = 1;
- char local[24], remote[24];
-
- if (addr == 0)
- return;
-
- if (kread(kvmd, addr, (char *) &this, sizeof(this)) < 0)
- return;
-
- for ( ; this != NULL; this = next) {
- if (kread(kvmd, (u_long) this, (char *) &pcb, sizeof(pcb)) < 0)
- return;
- if (kread(kvmd, (u_long) pcb.so, (char *) &so, sizeof(so)) < 0)
- return;
-
- next = LIST_NEXT(&pcb, next);
-
- if (first) {
- first = 0;
- fprintf(stdout,
-"Active RFCOMM sockets\n" \
-"%-8.8s %-6.6s %-6.6s %-17.17s %-17.17s %-4.4s %-4.4s %s\n",
- "PCB",
- "Recv-Q",
- "Send-Q",
- "Local address",
- "Foreign address",
- "Chan",
- "DLCI",
- "State");
- }
-
- fprintf(stdout,
-"%-8lx %6d %6d %-17.17s %-17.17s %-4d %-4d %s\n",
- (unsigned long) this,
- so.so_rcv.sb_cc,
- so.so_snd.sb_cc,
- bdaddrpr(&pcb.src, local, sizeof(local)),
- bdaddrpr(&pcb.dst, remote, sizeof(remote)),
- pcb.channel,
- pcb.dlci,
- (so.so_options & SO_ACCEPTCONN)?
- "LISTEN" : state2str(pcb.state));
- }
-} /* rfcommpr */
-
-/*
- * Print RFCOMM sessions
- */
-
-static void
-rfcommpr_s(kvm_t *kvmd, u_long addr)
-{
- static char const * const states[] = {
- /* NG_BTSOCKET_RFCOMM_SESSION_CLOSED */ "CLOSED",
- /* NG_BTSOCKET_RFCOMM_SESSION_LISTENING */ "LISTEN",
- /* NG_BTSOCKET_RFCOMM_SESSION_CONNECTING */ "CONNECTING",
- /* NG_BTSOCKET_RFCOMM_SESSION_CONNECTED */ "CONNECTED",
- /* NG_BTSOCKET_RFCOMM_SESSION_OPEN */ "OPEN",
- /* NG_BTSOCKET_RFCOMM_SESSION_DISCONNECTING */ "DISCONNECTING"
- };
-
- ng_btsocket_rfcomm_session_p this = NULL, next = NULL;
- ng_btsocket_rfcomm_session_t s;
- struct socket so;
- int first = 1;
-
- if (addr == 0)
- return;
-
- if (kread(kvmd, addr, (char *) &this, sizeof(this)) < 0)
- return;
-
- for ( ; this != NULL; this = next) {
- if (kread(kvmd, (u_long) this, (char *) &s, sizeof(s)) < 0)
- return;
- if (kread(kvmd, (u_long) s.l2so, (char *) &so, sizeof(so)) < 0)
- return;
-
- next = LIST_NEXT(&s, next);
-
- if (first) {
- first = 0;
- fprintf(stdout,
-"Active RFCOMM sessions\n" \
-"%-8.8s %-8.8s %-4.4s %-5.5s %-5.5s %-4.4s %s\n",
- "L2PCB",
- "PCB",
- "Flags",
- "MTU",
- "Out-Q",
- "DLCs",
- "State");
- }
-
- fprintf(stdout,
-"%-8lx %-8lx %-4x %-5d %-5d %-4s %s\n",
- (unsigned long) so.so_pcb,
- (unsigned long) this,
- s.flags,
- s.mtu,
- s.outq.len,
- LIST_EMPTY(&s.dlcs)? "No" : "Yes",
- state2str(s.state));
- }
-} /* rfcommpr_s */
-
-/*
- * Return BD_ADDR as string
- */
-
-static char *
-bdaddrpr(bdaddr_p const ba, char *str, int len)
-{
- static char buffer[MAXHOSTNAMELEN];
- struct hostent *he = NULL;
-
- if (str == NULL) {
- str = buffer;
- len = sizeof(buffer);
- }
-
- if (memcmp(ba, NG_HCI_BDADDR_ANY, sizeof(*ba)) == 0) {
- str[0] = '*';
- str[1] = 0;
-
- return (str);
- }
-
- if (!numeric_bdaddr &&
- (he = bt_gethostbyaddr((char *)ba, sizeof(*ba), AF_BLUETOOTH)) != NULL) {
- strlcpy(str, he->h_name, len);
-
- return (str);
- }
-
- bt_ntoa(ba, str);
-
- return (str);
-} /* bdaddrpr */
-
-/*
- * Open kvm
- */
-
-static kvm_t *
-kopen(char const *memf)
-{
- kvm_t *kvmd = NULL;
- char errbuf[_POSIX2_LINE_MAX];
-
- /*
- * Discard setgid privileges if not the running kernel so that
- * bad guys can't print interesting stuff from kernel memory.
- */
-
- if (memf != NULL)
- setgid(getgid());
-
- kvmd = kvm_openfiles(NULL, memf, NULL, O_RDONLY, errbuf);
- if (kvmd == NULL) {
- warnx("kvm_openfiles: %s", errbuf);
- return (NULL);
- }
-
- if (kvm_nlist(kvmd, nl) < 0) {
- warnx("kvm_nlist: %s", kvm_geterr(kvmd));
- goto fail;
- }
-
- if (nl[0].n_type == 0) {
- warnx("kvm_nlist: no namelist");
- goto fail;
- }
-
- return (kvmd);
-fail:
- kvm_close(kvmd);
-
- return (NULL);
-} /* kopen */
-
-/*
- * Read kvm
- */
-
-static int
-kread(kvm_t *kvmd, u_long addr, char *buffer, int size)
-{
- if (kvmd == NULL || buffer == NULL)
- return (-1);
-
- if (kvm_read(kvmd, addr, buffer, size) != size) {
- warnx("kvm_read: %s", kvm_geterr(kvmd));
- return (-1);
- }
-
- return (0);
-} /* kread */
-
-/*
- * Print usage and exit
- */
-
-static void
-usage(void)
-{
- fprintf(stdout, "Usage: btsockstat [-M core ] [-n] [-p proto] [-r]\n");
- exit(255);
-} /* usage */
-
diff --git a/usr.bin/bluetooth/rfcomm_sppd/Makefile b/usr.bin/bluetooth/rfcomm_sppd/Makefile
deleted file mode 100644
index 9018f6e..0000000
--- a/usr.bin/bluetooth/rfcomm_sppd/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-# $Id: Makefile,v 1.7 2003/09/07 18:15:55 max Exp $
-# $FreeBSD$
-
-PROG= rfcomm_sppd
-SRCS= rfcomm_sppd.c rfcomm_sdp.c
-WARNS?= 2
-
-DPADD= ${LIBBLUETOOTH} ${LIBSDP}
-LDADD= -lbluetooth -lsdp
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/bluetooth/rfcomm_sppd/rfcomm_sdp.c b/usr.bin/bluetooth/rfcomm_sppd/rfcomm_sdp.c
deleted file mode 100644
index 5873071..0000000
--- a/usr.bin/bluetooth/rfcomm_sppd/rfcomm_sdp.c
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * rfcomm_sdp.c
- *
- * Copyright (c) 2003 Maksim Yevmenkin <m_evmenkin@yahoo.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $Id: rfcomm_sdp.c,v 1.1 2003/09/07 18:15:55 max Exp $
- * $FreeBSD$
- */
-
-#include <bluetooth.h>
-#include <errno.h>
-#include <sdp.h>
-#include <stdio.h>
-
-#undef PROTOCOL_DESCRIPTOR_LIST_BUFFER_SIZE
-#define PROTOCOL_DESCRIPTOR_LIST_BUFFER_SIZE 256
-
-#undef PROTOCOL_DESCRIPTOR_LIST_MINIMAL_SIZE
-#define PROTOCOL_DESCRIPTOR_LIST_MINIMAL_SIZE 12
-
-static int rfcomm_proto_list_parse (uint8_t const *start, uint8_t const *end,
- int *channel, int *error);
-
-/*
- * Lookup RFCOMM channel number in the Protocol Descriptor List
- */
-
-#undef rfcomm_channel_lookup_exit
-#define rfcomm_channel_lookup_exit(e) { \
- if (error != NULL) \
- *error = (e); \
- if (ss != NULL) { \
- sdp_close(ss); \
- ss = NULL; \
- } \
- return (((e) == 0)? 0 : -1); \
-}
-
-int
-rfcomm_channel_lookup(bdaddr_t const *local, bdaddr_t const *remote,
- int service, int *channel, int *error)
-{
- uint8_t buffer[PROTOCOL_DESCRIPTOR_LIST_BUFFER_SIZE];
- void *ss = NULL;
- uint16_t serv = (uint16_t) service;
- uint32_t attr = SDP_ATTR_RANGE(
- SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST,
- SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST);
- sdp_attr_t proto = { SDP_ATTR_INVALID,0,sizeof(buffer),buffer };
- uint32_t type, len;
-
- if (local == NULL)
- local = NG_HCI_BDADDR_ANY;
- if (remote == NULL || channel == NULL)
- rfcomm_channel_lookup_exit(EINVAL);
-
- if ((ss = sdp_open(local, remote)) == NULL)
- rfcomm_channel_lookup_exit(ENOMEM);
- if (sdp_error(ss) != 0)
- rfcomm_channel_lookup_exit(sdp_error(ss));
-
- if (sdp_search(ss, 1, &serv, 1, &attr, 1, &proto) != 0)
- rfcomm_channel_lookup_exit(sdp_error(ss));
- if (proto.flags != SDP_ATTR_OK)
- rfcomm_channel_lookup_exit(ENOATTR);
-
- sdp_close(ss);
- ss = NULL;
-
- /*
- * If it is possible for more than one kind of protocol stack to be
- * used to gain access to the service, the ProtocolDescriptorList
- * takes the form of a data element alternative. We always use the
- * first protocol stack.
- *
- * A minimal Protocol Descriptor List for RFCOMM based service would
- * look like
- *
- * seq8 len8 - 2 bytes
- * seq8 len8 - 2 bytes
- * uuid16 value16 - 3 bytes L2CAP
- * seq8 len8 - 2 bytes
- * uuid16 value16 - 3 bytes RFCOMM
- * uint8 value8 - 2 bytes RFCOMM param #1
- * =========
- * 14 bytes
- *
- * Lets not count first [seq8 len8] wrapper, so the minimal size of
- * the Protocol Descriptor List (the data we are actually interested
- * in) for RFCOMM based service would be 12 bytes.
- */
-
- if (proto.vlen < PROTOCOL_DESCRIPTOR_LIST_MINIMAL_SIZE)
- rfcomm_channel_lookup_exit(EINVAL);
-
- SDP_GET8(type, proto.value);
-
- if (type == SDP_DATA_ALT8) {
- SDP_GET8(len, proto.value);
- } else if (type == SDP_DATA_ALT16) {
- SDP_GET16(len, proto.value);
- } else if (type == SDP_DATA_ALT32) {
- SDP_GET32(len, proto.value);
- } else
- len = 0;
-
- if (len > 0)
- SDP_GET8(type, proto.value);
-
- switch (type) {
- case SDP_DATA_SEQ8:
- SDP_GET8(len, proto.value);
- break;
-
- case SDP_DATA_SEQ16:
- SDP_GET16(len, proto.value);
- break;
-
- case SDP_DATA_SEQ32:
- SDP_GET32(len, proto.value);
- break;
-
- default:
- rfcomm_channel_lookup_exit(ENOATTR);
- /* NOT REACHED */
- }
-
- if (len < PROTOCOL_DESCRIPTOR_LIST_MINIMAL_SIZE)
- rfcomm_channel_lookup_exit(EINVAL);
-
- return (rfcomm_proto_list_parse(proto.value,
- buffer + proto.vlen, channel, error));
-}
-
-/*
- * Parse protocol descriptor list
- *
- * The ProtocolDescriptorList attribute describes one or more protocol
- * stacks that may be used to gain access to the service described by
- * the service record. If the ProtocolDescriptorList describes a single
- * stack, it takes the form of a data element sequence in which each
- * element of the sequence is a protocol descriptor.
- */
-
-#undef rfcomm_proto_list_parse_exit
-#define rfcomm_proto_list_parse_exit(e) { \
- if (error != NULL) \
- *error = (e); \
- return (((e) == 0)? 0 : -1); \
-}
-
-static int
-rfcomm_proto_list_parse(uint8_t const *start, uint8_t const *end,
- int *channel, int *error)
-{
- int type, len, value;
-
- while (start < end) {
-
- /*
- * Parse protocol descriptor
- *
- * A protocol descriptor identifies a communications protocol
- * and provides protocol specific parameters. A protocol
- * descriptor is represented as a data element sequence. The
- * first data element in the sequence must be the UUID that
- * identifies the protocol. Additional data elements optionally
- * provide protocol specific information, such as the L2CAP
- * protocol/service multiplexer (PSM) and the RFCOMM server
- * channel number (CN).
- */
-
- /* We must have at least one byte (type) */
- if (end - start < 1)
- rfcomm_proto_list_parse_exit(EINVAL)
-
- SDP_GET8(type, start);
- switch (type) {
- case SDP_DATA_SEQ8:
- SDP_GET8(len, start);
- break;
-
- case SDP_DATA_SEQ16:
- SDP_GET16(len, start);
- break;
-
- case SDP_DATA_SEQ32:
- SDP_GET32(len, start);
- break;
-
- default:
- rfcomm_proto_list_parse_exit(ENOATTR)
- /* NOT REACHED */
- }
-
- /* We must have at least 3 bytes (type + UUID16) */
- if (end - start < 3)
- rfcomm_proto_list_parse_exit(EINVAL);
-
- /* Get protocol UUID */
- SDP_GET8(type, start); len -= sizeof(uint8_t);
- switch (type) {
- case SDP_DATA_UUID16:
- SDP_GET16(value, start); len -= sizeof(uint16_t);
- if (value != SDP_UUID_PROTOCOL_RFCOMM)
- goto next_protocol;
- break;
-
- case SDP_DATA_UUID32: /* XXX FIXME can we have 32-bit UUID */
- case SDP_DATA_UUID128: /* XXX FIXME can we have 128-bit UUID */
- default:
- rfcomm_proto_list_parse_exit(ENOATTR);
- /* NOT REACHED */
- }
-
- /*
- * First protocol specific parameter for RFCOMM procotol must
- * be uint8 that represents RFCOMM channel number. So we must
- * have at least two bytes.
- */
-
- if (end - start < 2)
- rfcomm_proto_list_parse_exit(EINVAL);
-
- SDP_GET8(type, start);
- if (type != SDP_DATA_UINT8)
- rfcomm_proto_list_parse_exit(ENOATTR);
-
- SDP_GET8(*channel, start);
-
- rfcomm_proto_list_parse_exit(0);
- /* NOT REACHED */
-next_protocol:
- start += len;
- }
-
- /*
- * If we got here then it means we could not find RFCOMM protocol
- * descriptor, but the reply format was actually valid.
- */
-
- rfcomm_proto_list_parse_exit(ENOATTR);
-}
-
diff --git a/usr.bin/bluetooth/rfcomm_sppd/rfcomm_sppd.1 b/usr.bin/bluetooth/rfcomm_sppd/rfcomm_sppd.1
deleted file mode 100644
index 92c7d45..0000000
--- a/usr.bin/bluetooth/rfcomm_sppd/rfcomm_sppd.1
+++ /dev/null
@@ -1,186 +0,0 @@
-.\" Copyright (c) 2001-2003 Maksim Yevmenkin <m_evmenkin@yahoo.com>
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $Id: rfcomm_sppd.1,v 1.3 2003/09/07 18:15:55 max Exp $
-.\" $FreeBSD$
-.\"
-.Dd April 21, 2008
-.Dt RFCOMM_SPPD 1
-.Os
-.Sh NAME
-.Nm rfcomm_sppd
-.Nd RFCOMM Serial Port Profile daemon
-.Sh SYNOPSIS
-.Nm
-.Op Fl bhS
-.Fl a Ar address
-.Fl c Ar channel
-.Op Fl t Ar tty
-.Sh DESCRIPTION
-The
-.Nm
-utility is a Serial Port Profile daemon.
-It can operate in two modes: client and server.
-.Pp
-In client mode,
-.Nm
-opens RFCOMM connection to the specified
-.Ar address
-server and
-.Ar channel .
-Once connection is established, the
-.Nm
-utility provides access to the server's remote serial port via stdin/stdout
-or via
-.Xr pty 4
-interface if
-.Fl t
-option was specified.
-.Pp
-If the
-.Fl S
-option is specified,
-.Nm
-will operate in server mode and act as RFCOMM server,
-listening on
-.Dv ANY
-address and advertising a virtual serial port
-via the
-.Xr sdpd 8
-daemon.
-If
-.Fl t
-options was specified,
-the server side of the virtual serial port is attached to the pseudo-terminal
-.Ar tty .
-Otherwise the virtual serial port is attached to the stdin/stdout.
-.Nm
-should be run as root in order to communicate with
-.Xr sdpd 8
-in this case.
-.Pp
-The
-.Nm
-utility opens both master and slave pseudo terminals.
-This is done to ensure that RFCOMM connection stays open until
-.Nm
-is terminated.
-The data received from the master pseudo terminal are sent over
-the RFCOMM connection.
-The data received from the RFCOMM connection are written
-into master pseudo terminal.
-The application in its turn opens the slave pseudo
-terminal and operates on it just like it would operate over the standard serial
-port.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl a Ar address
-In client mode,
-this required option specifies the address of the remote RFCOMM server.
-If this option is specified in server mode,
-.Nm
-will only accept connections from the
-.Tn Bluetooth
-device with address
-.Ar address .
-The address can be specified as BD_ADDR or name.
-If name was specified then
-.Nm
-utility will attempt to resolve the name via
-.Xr bt_gethostbyname 3 .
-.It Fl b
-Detach from the controlling terminal, i.e., run in background.
-.It Fl c Ar channel
-In both client and server mode,
-this option specifies the RFCOMM channel to connect to or listen on.
-In server mode,
-the channel should be a number between 1 and 30.
-If not specified,
-.Nm
-will try to bind to
-.Dq wildcard
-RFCOMM channel number.
-The actual RFCOMM channel will be obtained via
-.Xr getsockname 2
-call and will be used to register Serial Port service with
-.Xr sdpd 8 .
-In client mode,
-the channel could either be a number between 1 and 30 or a service name.
-Supported service names are:
-.Cm DUN
-(for DialUp Networking service),
-.Cm FAX
-(for Fax service),
-.Cm LAN
-(for LAN Access Using PPP service) and
-.Cm SP
-(for Serial Port service).
-If channel was not specified then
-.Nm
-utility will try to obtain RFCOMM channel for Serial Port service via Service
-Discovery Protocol from the server.
-.It Fl h
-Display usage message and exit.
-.It Fl S
-Server mode; see
-.Sx DESCRIPTION .
-.It Fl t Ar tty
-Slave pseudo tty name.
-If not set stdin/stdout will be used.
-This option is required if
-.Fl b
-option was specified.
-.El
-.Sh FILES
-.Bl -tag -width ".Pa /dev/tty[p-sP-S][0-9a-v]" -compact
-.It Pa /dev/pty[p-sP-S][0-9a-v]
-master pseudo terminals
-.It Pa /dev/tty[p-sP-S][0-9a-v]
-slave pseudo terminals
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh EXAMPLES
-.Dl "rfcomm_sppd -a 00:01:02:03:04:05 -c 1 -t /dev/ttyp1"
-.Pp
-Will start the
-.Nm
-utility and open RFCOMM connection to the server at
-.Li 00:01:02:03:04:05
-and channel
-.Li 1 .
-Once the connection has been established,
-.Pa /dev/ttyp1
-can be used to talk to the remote serial port on the server.
-.Sh SEE ALSO
-.Xr bluetooth 3 ,
-.Xr ng_btsocket 4 ,
-.Xr pty 4 ,
-.Xr rfcomm_pppd 8 ,
-.Xr sdpd 8
-.Sh AUTHORS
-.An Maksim Yevmenkin Aq m_evmenkin@yahoo.com
-.Sh BUGS
-Please report if found.
diff --git a/usr.bin/bluetooth/rfcomm_sppd/rfcomm_sppd.c b/usr.bin/bluetooth/rfcomm_sppd/rfcomm_sppd.c
deleted file mode 100644
index 314149e..0000000
--- a/usr.bin/bluetooth/rfcomm_sppd/rfcomm_sppd.c
+++ /dev/null
@@ -1,518 +0,0 @@
-/*
- * rfcomm_sppd.c
- */
-
-/*-
- * Copyright (c) 2003 Maksim Yevmenkin <m_evmenkin@yahoo.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $Id: rfcomm_sppd.c,v 1.4 2003/09/07 18:15:55 max Exp $
- * $FreeBSD$
- */
-
-#include <sys/stat.h>
-#include <bluetooth.h>
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <grp.h>
-#include <limits.h>
-#include <paths.h>
-#include <sdp.h>
-#include <signal.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-#include <termios.h>
-#include <unistd.h>
-
-#define SPPD_IDENT "rfcomm_sppd"
-#define SPPD_BUFFER_SIZE 1024
-#define max(a, b) (((a) > (b))? (a) : (b))
-
-int rfcomm_channel_lookup (bdaddr_t const *local,
- bdaddr_t const *remote,
- int service, int *channel, int *error);
-
-static int sppd_ttys_open (char const *tty, int *amaster, int *aslave);
-static int sppd_read (int fd, char *buffer, int size);
-static int sppd_write (int fd, char *buffer, int size);
-static void sppd_sighandler (int s);
-static void usage (void);
-
-static int done; /* are we done? */
-
-/* Main */
-int
-main(int argc, char *argv[])
-{
- struct sigaction sa;
- struct sockaddr_rfcomm ra;
- bdaddr_t addr;
- int n, background, channel, service,
- s, amaster, aslave, fd, doserver;
- fd_set rfd;
- char *tty = NULL, *ep = NULL, buf[SPPD_BUFFER_SIZE];
-
- memcpy(&addr, NG_HCI_BDADDR_ANY, sizeof(addr));
- background = channel = 0;
- service = SDP_SERVICE_CLASS_SERIAL_PORT;
- doserver = 0;
-
- /* Parse command line options */
- while ((n = getopt(argc, argv, "a:bc:t:hS")) != -1) {
- switch (n) {
- case 'a': /* BDADDR */
- if (!bt_aton(optarg, &addr)) {
- struct hostent *he = NULL;
-
- if ((he = bt_gethostbyname(optarg)) == NULL)
- errx(1, "%s: %s", optarg, hstrerror(h_errno));
-
- memcpy(&addr, he->h_addr, sizeof(addr));
- }
- break;
-
- case 'c': /* RFCOMM channel */
- channel = strtoul(optarg, &ep, 10);
- if (*ep != '\0') {
- channel = 0;
- switch (tolower(optarg[0])) {
- case 'd': /* DialUp Networking */
- service = SDP_SERVICE_CLASS_DIALUP_NETWORKING;
- break;
-
- case 'f': /* Fax */
- service = SDP_SERVICE_CLASS_FAX;
- break;
-
- case 'l': /* LAN */
- service = SDP_SERVICE_CLASS_LAN_ACCESS_USING_PPP;
- break;
-
- case 's': /* Serial Port */
- service = SDP_SERVICE_CLASS_SERIAL_PORT;
- break;
-
- default:
- errx(1, "Unknown service name: %s",
- optarg);
- /* NOT REACHED */
- }
- }
- break;
-
- case 'b': /* Run in background */
- background = 1;
- break;
-
- case 't': /* Slave TTY name */
- if (optarg[0] != '/')
- asprintf(&tty, "%s%s", _PATH_DEV, optarg);
- else
- tty = optarg;
- break;
-
- case 'S':
- doserver = 1;
- break;
-
- case 'h':
- default:
- usage();
- /* NOT REACHED */
- }
- }
-
- /* Check if we have everything we need */
- if (!doserver && memcmp(&addr, NG_HCI_BDADDR_ANY, sizeof(addr)) == 0)
- usage();
- /* NOT REACHED */
-
- /* Set signal handlers */
- memset(&sa, 0, sizeof(sa));
- sa.sa_handler = sppd_sighandler;
-
- if (sigaction(SIGTERM, &sa, NULL) < 0)
- err(1, "Could not sigaction(SIGTERM)");
-
- if (sigaction(SIGHUP, &sa, NULL) < 0)
- err(1, "Could not sigaction(SIGHUP)");
-
- if (sigaction(SIGINT, &sa, NULL) < 0)
- err(1, "Could not sigaction(SIGINT)");
-
- sa.sa_handler = SIG_IGN;
- sa.sa_flags = SA_NOCLDWAIT;
-
- if (sigaction(SIGCHLD, &sa, NULL) < 0)
- err(1, "Could not sigaction(SIGCHLD)");
-
- /* Open TTYs */
- if (tty == NULL) {
- if (background)
- usage();
-
- amaster = STDIN_FILENO;
- fd = STDOUT_FILENO;
- } else {
- if (sppd_ttys_open(tty, &amaster, &aslave) < 0)
- exit(1);
-
- fd = amaster;
- }
-
- /* Open RFCOMM connection */
-
- if (doserver) {
- struct sockaddr_rfcomm ma;
- bdaddr_t bt_addr_any;
- sdp_sp_profile_t sp;
- void *ss;
- uint32_t sdp_handle;
- int acceptsock, aaddrlen;
-
- acceptsock = socket(PF_BLUETOOTH, SOCK_STREAM,
- BLUETOOTH_PROTO_RFCOMM);
- if (acceptsock < 0)
- err(1, "Could not create socket");
-
- memcpy(&bt_addr_any, NG_HCI_BDADDR_ANY, sizeof(bt_addr_any));
-
- memset(&ma, 0, sizeof(ma));
- ma.rfcomm_len = sizeof(ma);
- ma.rfcomm_family = AF_BLUETOOTH;
- memcpy(&ma.rfcomm_bdaddr, &bt_addr_any, sizeof(bt_addr_any));
- ma.rfcomm_channel = channel;
-
- if (bind(acceptsock, (struct sockaddr *)&ma, sizeof(ma)) < 0)
- err(1, "Could not bind socket on channel %d", channel);
- if (listen(acceptsock, 10) != 0)
- err(1, "Could not listen on socket");
-
- aaddrlen = sizeof(ma);
- if (getsockname(acceptsock, (struct sockaddr *)&ma, &aaddrlen) < 0)
- err(1, "Could not get socket name");
- channel = ma.rfcomm_channel;
-
- ss = sdp_open_local(NULL);
- if (ss == NULL)
- errx(1, "Unable to create local SDP session");
- if (sdp_error(ss) != 0)
- errx(1, "Unable to open local SDP session. %s (%d)",
- strerror(sdp_error(ss)), sdp_error(ss));
- memset(&sp, 0, sizeof(sp));
- sp.server_channel = channel;
-
- if (sdp_register_service(ss, SDP_SERVICE_CLASS_SERIAL_PORT,
- &bt_addr_any, (void *)&sp, sizeof(sp),
- &sdp_handle) != 0) {
- errx(1, "Unable to register LAN service with "
- "local SDP daemon. %s (%d)",
- strerror(sdp_error(ss)), sdp_error(ss));
- }
-
- s = -1;
- while (s < 0) {
- aaddrlen = sizeof(ra);
- s = accept(acceptsock, (struct sockaddr *)&ra,
- &aaddrlen);
- if (s < 0)
- err(1, "Unable to accept()");
- if (memcmp(&addr, NG_HCI_BDADDR_ANY, sizeof(addr)) &&
- memcmp(&addr, &ra.rfcomm_bdaddr, sizeof(addr))) {
- warnx("Connect from wrong client");
- close(s);
- s = -1;
- }
- }
- sdp_unregister_service(ss, sdp_handle);
- sdp_close(ss);
- close(acceptsock);
- } else {
- /* Check channel, if was not set then obtain it via SDP */
- if (channel == 0 && service != 0)
- if (rfcomm_channel_lookup(NULL, &addr,
- service, &channel, &n) != 0)
- errc(1, n, "Could not obtain RFCOMM channel");
- if (channel <= 0 || channel > 30)
- errx(1, "Invalid RFCOMM channel number %d", channel);
-
- s = socket(PF_BLUETOOTH, SOCK_STREAM, BLUETOOTH_PROTO_RFCOMM);
- if (s < 0)
- err(1, "Could not create socket");
-
- memset(&ra, 0, sizeof(ra));
- ra.rfcomm_len = sizeof(ra);
- ra.rfcomm_family = AF_BLUETOOTH;
-
- if (bind(s, (struct sockaddr *) &ra, sizeof(ra)) < 0)
- err(1, "Could not bind socket");
-
- memcpy(&ra.rfcomm_bdaddr, &addr, sizeof(ra.rfcomm_bdaddr));
- ra.rfcomm_channel = channel;
-
- if (connect(s, (struct sockaddr *) &ra, sizeof(ra)) < 0)
- err(1, "Could not connect socket");
- }
-
- /* Became daemon if required */
- if (background) {
- switch (fork()) {
- case -1:
- err(1, "Could not fork()");
- /* NOT REACHED */
-
- case 0:
- exit(0);
- /* NOT REACHED */
-
- default:
- if (daemon(0, 0) < 0)
- err(1, "Could not daemon()");
- break;
- }
- }
-
- openlog(SPPD_IDENT, LOG_NDELAY|LOG_PERROR|LOG_PID, LOG_DAEMON);
- syslog(LOG_INFO, "Starting on %s...", (tty != NULL)? tty : "stdin/stdout");
-
- for (done = 0; !done; ) {
- FD_ZERO(&rfd);
- FD_SET(amaster, &rfd);
- FD_SET(s, &rfd);
-
- n = select(max(amaster, s) + 1, &rfd, NULL, NULL, NULL);
- if (n < 0) {
- if (errno == EINTR)
- continue;
-
- syslog(LOG_ERR, "Could not select(). %s",
- strerror(errno));
- exit(1);
- }
-
- if (n == 0)
- continue;
-
- if (FD_ISSET(amaster, &rfd)) {
- n = sppd_read(amaster, buf, sizeof(buf));
- if (n < 0) {
- syslog(LOG_ERR, "Could not read master pty, " \
- "fd=%d. %s", amaster, strerror(errno));
- exit(1);
- }
-
- if (n == 0)
- break; /* XXX */
-
- if (sppd_write(s, buf, n) < 0) {
- syslog(LOG_ERR, "Could not write to socket, " \
- "fd=%d, size=%d. %s",
- s, n, strerror(errno));
- exit(1);
- }
- }
-
- if (FD_ISSET(s, &rfd)) {
- n = sppd_read(s, buf, sizeof(buf));
- if (n < 0) {
- syslog(LOG_ERR, "Could not read socket, " \
- "fd=%d. %s", s, strerror(errno));
- exit(1);
- }
-
- if (n == 0)
- break;
-
- if (sppd_write(fd, buf, n) < 0) {
- syslog(LOG_ERR, "Could not write to master " \
- "pty, fd=%d, size=%d. %s",
- fd, n, strerror(errno));
- exit(1);
- }
- }
- }
-
- syslog(LOG_INFO, "Completed on %s", (tty != NULL)? tty : "stdin/stdout");
- closelog();
-
- close(s);
-
- if (tty != NULL) {
- close(aslave);
- close(amaster);
- }
-
- return (0);
-}
-
-/* Open TTYs */
-static int
-sppd_ttys_open(char const *tty, int *amaster, int *aslave)
-{
- char pty[PATH_MAX], *slash;
- struct group *gr = NULL;
- gid_t ttygid;
- struct termios tio;
-
- /*
- * Construct master PTY name. The slave tty name must be less then
- * PATH_MAX characters in length, must contain '/' character and
- * must not end with '/'.
- */
-
- if (strlen(tty) >= sizeof(pty)) {
- syslog(LOG_ERR, "Slave tty name is too long");
- return (-1);
- }
-
- strlcpy(pty, tty, sizeof(pty));
- slash = strrchr(pty, '/');
- if (slash == NULL || slash[1] == '\0') {
- syslog(LOG_ERR, "Invalid slave tty name (%s)", tty);
- return (-1);
- }
-
- slash[1] = 'p';
-
- if (strcmp(pty, tty) == 0) {
- syslog(LOG_ERR, "Master and slave tty are the same (%s)", tty);
- return (-1);
- }
-
- if ((*amaster = open(pty, O_RDWR, 0)) < 0) {
- syslog(LOG_ERR, "Could not open(%s). %s", pty, strerror(errno));
- return (-1);
- }
-
- /*
- * Slave TTY
- */
-
- if ((gr = getgrnam("tty")) != NULL)
- ttygid = gr->gr_gid;
- else
- ttygid = -1;
-
- (void) chown(tty, getuid(), ttygid);
- (void) chmod(tty, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);
- (void) revoke(tty);
-
- if ((*aslave = open(tty, O_RDWR, 0)) < 0) {
- syslog(LOG_ERR, "Could not open(%s). %s", tty, strerror(errno));
- close(*amaster);
- return (-1);
- }
-
- /*
- * Make slave TTY raw
- */
-
- cfmakeraw(&tio);
-
- if (tcsetattr(*aslave, TCSANOW, &tio) < 0) {
- syslog(LOG_ERR, "Could not tcsetattr(). %s", strerror(errno));
- close(*aslave);
- close(*amaster);
- return (-1);
- }
-
- return (0);
-} /* sppd_ttys_open */
-
-/* Read data */
-static int
-sppd_read(int fd, char *buffer, int size)
-{
- int n;
-
-again:
- n = read(fd, buffer, size);
- if (n < 0) {
- if (errno == EINTR)
- goto again;
-
- return (-1);
- }
-
- return (n);
-} /* sppd_read */
-
-/* Write data */
-static int
-sppd_write(int fd, char *buffer, int size)
-{
- int n, wrote;
-
- for (wrote = 0; size > 0; ) {
- n = write(fd, buffer, size);
- switch (n) {
- case -1:
- if (errno != EINTR)
- return (-1);
- break;
-
- case 0:
- /* XXX can happen? */
- break;
-
- default:
- wrote += n;
- buffer += n;
- size -= n;
- break;
- }
- }
-
- return (wrote);
-} /* sppd_write */
-
-/* Signal handler */
-static void
-sppd_sighandler(int s)
-{
- syslog(LOG_INFO, "Signal %d received. Total %d signals received\n",
- s, ++ done);
-} /* sppd_sighandler */
-
-/* Display usage and exit */
-static void
-usage(void)
-{
- fprintf(stdout,
-"Usage: %s options\n" \
-"Where options are:\n" \
-"\t-a address Peer address (required in client mode)\n" \
-"\t-b Run in background\n" \
-"\t-c channel RFCOMM channel to connect to or listen on\n" \
-"\t-t tty TTY name (required in background mode)\n" \
-"\t-S Server mode\n" \
-"\t-h Display this message\n", SPPD_IDENT);
- exit(255);
-} /* usage */
-
diff --git a/usr.bin/brandelf/Makefile b/usr.bin/brandelf/Makefile
deleted file mode 100644
index 2c4859f..0000000
--- a/usr.bin/brandelf/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-PROG= brandelf
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/brandelf/brandelf.1 b/usr.bin/brandelf/brandelf.1
deleted file mode 100644
index 9c7439e..0000000
--- a/usr.bin/brandelf/brandelf.1
+++ /dev/null
@@ -1,108 +0,0 @@
-.\" Copyright (c) 1997
-.\" John-Mark Gurney. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of the author nor the names of any co-contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY John-Mark Gurney AND CONTRIBUTORS ``AS IS''
-.\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd February 6, 1997
-.Dt BRANDELF 1
-.Os
-.Sh NAME
-.Nm brandelf
-.Nd mark an ELF binary for a specific ABI
-.Sh SYNOPSIS
-.Nm
-.Op Fl lv
-.Op Fl f Ar ELF_ABI_number
-.Op Fl t Ar string
-.Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility marks an ELF binary to be run under a certain ABI for
-.Fx .
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl f Ar ELF_ABI_number
-Forces branding with the supplied ELF ABI number.
-Incompatible with the
-.Fl t
-option.
-These values are assigned by SCO/USL.
-.It Fl l
-Writes the list of all known ELF types to the standard error.
-.It Fl v
-Turns on verbose output.
-.It Fl t Ar string
-Brands the given ELF binaries to be of the
-.Ar string
-ABI type.
-Currently supported ABIs are
-.Dq Li FreeBSD ,
-.Dq Li Linux ,
-and
-.Dq Li SVR4 .
-.It Ar file
-If
-.Fl t Ar string
-is given it will brand
-.Ar file
-to be of type
-.Ar string ,
-otherwise it will simply display the branding of
-.Ar file .
-.El
-.Sh EXIT STATUS
-Exit status is 0 on success, and 1 if the command
-fails if a file does not exist, is too short, fails to brand properly,
-or the brand requested is not one of the known types and the
-.Fl f
-option is not set.
-.Sh EXAMPLES
-The following is an example of a typical usage
-of the
-.Nm
-command:
-.Bd -literal -offset indent
-brandelf file
-brandelf -t Linux file
-.Ed
-.Sh SEE ALSO
-.Rs
-.%A The Santa Cruz Operation, Inc.
-.%T System V Application Binary Interface
-.%D April 29, 1998 (DRAFT)
-.%O http://www.sco.com/developer/devspecs/
-.Re
-.Sh HISTORY
-The
-.Nm
-manual page first appeared in
-.Fx 2.2 .
-.Sh AUTHORS
-This manual page was written by
-.An John-Mark Gurney Aq gurney_j@efn.org .
diff --git a/usr.bin/brandelf/brandelf.c b/usr.bin/brandelf/brandelf.c
deleted file mode 100644
index 9cd391e..0000000
--- a/usr.bin/brandelf/brandelf.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*-
- * Copyright (c) 2000, 2001 David O'Brien
- * Copyright (c) 1996 Søren Schmidt
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/elf_common.h>
-#include <sys/errno.h>
-#include <err.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-static int elftype(const char *);
-static const char *iselftype(int);
-static void printelftypes(void);
-static void usage(void);
-
-struct ELFtypes {
- const char *str;
- int value;
-};
-/* XXX - any more types? */
-static struct ELFtypes elftypes[] = {
- { "FreeBSD", ELFOSABI_FREEBSD },
- { "Linux", ELFOSABI_LINUX },
- { "Solaris", ELFOSABI_SOLARIS },
- { "SVR4", ELFOSABI_SYSV }
-};
-
-int
-main(int argc, char **argv)
-{
-
- const char *strtype = "FreeBSD";
- int type = ELFOSABI_FREEBSD;
- int retval = 0;
- int ch, change = 0, verbose = 0, force = 0, listed = 0;
-
- while ((ch = getopt(argc, argv, "f:lt:v")) != -1)
- switch (ch) {
- case 'f':
- if (change)
- errx(1, "f option incompatible with t option");
- force = 1;
- type = atoi(optarg);
- if (errno == ERANGE || type < 0 || type > 255) {
- warnx("invalid argument to option f: %s",
- optarg);
- usage();
- }
- break;
- case 'l':
- printelftypes();
- listed = 1;
- break;
- case 'v':
- verbose = 1;
- break;
- case 't':
- if (force)
- errx(1, "t option incompatible with f option");
- change = 1;
- strtype = optarg;
- break;
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
- if (!argc) {
- if (listed)
- exit(0);
- else {
- warnx("no file(s) specified");
- usage();
- }
- }
-
- if (!force && (type = elftype(strtype)) == -1) {
- warnx("invalid ELF type '%s'", strtype);
- printelftypes();
- usage();
- }
-
- while (argc) {
- int fd;
- char buffer[EI_NIDENT];
-
- if ((fd = open(argv[0], change || force ? O_RDWR : O_RDONLY, 0)) < 0) {
- warn("error opening file %s", argv[0]);
- retval = 1;
- goto fail;
- }
- if (read(fd, buffer, EI_NIDENT) < EI_NIDENT) {
- warnx("file '%s' too short", argv[0]);
- retval = 1;
- goto fail;
- }
- if (buffer[0] != ELFMAG0 || buffer[1] != ELFMAG1 ||
- buffer[2] != ELFMAG2 || buffer[3] != ELFMAG3) {
- warnx("file '%s' is not ELF format", argv[0]);
- retval = 1;
- goto fail;
- }
- if (!change && !force) {
- fprintf(stdout,
- "File '%s' is of brand '%s' (%u).\n",
- argv[0], iselftype(buffer[EI_OSABI]),
- buffer[EI_OSABI]);
- if (!iselftype(type)) {
- warnx("ELF ABI Brand '%u' is unknown",
- type);
- printelftypes();
- }
- }
- else {
- buffer[EI_OSABI] = type;
- lseek(fd, 0, SEEK_SET);
- if (write(fd, buffer, EI_NIDENT) != EI_NIDENT) {
- warn("error writing %s %d", argv[0], fd);
- retval = 1;
- goto fail;
- }
- }
-fail:
- close(fd);
- argc--;
- argv++;
- }
-
- return retval;
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr,
- "usage: brandelf [-lv] [-f ELF_ABI_number] [-t string] file ...\n");
- exit(1);
-}
-
-static const char *
-iselftype(int etype)
-{
- size_t elfwalk;
-
- for (elfwalk = 0;
- elfwalk < sizeof(elftypes)/sizeof(elftypes[0]);
- elfwalk++)
- if (etype == elftypes[elfwalk].value)
- return elftypes[elfwalk].str;
- return 0;
-}
-
-static int
-elftype(const char *elfstrtype)
-{
- size_t elfwalk;
-
- for (elfwalk = 0;
- elfwalk < sizeof(elftypes)/sizeof(elftypes[0]);
- elfwalk++)
- if (strcasecmp(elfstrtype, elftypes[elfwalk].str) == 0)
- return elftypes[elfwalk].value;
- return -1;
-}
-
-static void
-printelftypes(void)
-{
- size_t elfwalk;
-
- fprintf(stderr, "known ELF types are: ");
- for (elfwalk = 0;
- elfwalk < sizeof(elftypes)/sizeof(elftypes[0]);
- elfwalk++)
- fprintf(stderr, "%s(%u) ", elftypes[elfwalk].str,
- elftypes[elfwalk].value);
- fprintf(stderr, "\n");
-}
diff --git a/usr.bin/bsdiff/Makefile b/usr.bin/bsdiff/Makefile
deleted file mode 100644
index 8a8bc31..0000000
--- a/usr.bin/bsdiff/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-SUBDIR= bsdiff bspatch
-
-.include <bsd.subdir.mk>
diff --git a/usr.bin/bsdiff/Makefile.inc b/usr.bin/bsdiff/Makefile.inc
deleted file mode 100644
index 198d906..0000000
--- a/usr.bin/bsdiff/Makefile.inc
+++ /dev/null
@@ -1,6 +0,0 @@
-# $FreeBSD$
-
-WARNS?= 6
-
-.include "../Makefile.inc"
-
diff --git a/usr.bin/bsdiff/bsdiff/Makefile b/usr.bin/bsdiff/bsdiff/Makefile
deleted file mode 100644
index 0e8498f..0000000
--- a/usr.bin/bsdiff/bsdiff/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# $FreeBSD$
-
-PROG= bsdiff
-
-DPADD= ${LIBBZ2}
-LDADD= -lbz2
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/bsdiff/bsdiff/bsdiff.1 b/usr.bin/bsdiff/bsdiff/bsdiff.1
deleted file mode 100644
index 5c608b4..0000000
--- a/usr.bin/bsdiff/bsdiff/bsdiff.1
+++ /dev/null
@@ -1,69 +0,0 @@
-.\"-
-.\" Copyright 2003-2005 Colin Percival
-.\" All rights reserved
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted providing that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
-.\" IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-.\" POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd May 18, 2003
-.Dt BSDIFF 1
-.Os
-.Sh NAME
-.Nm bsdiff
-.Nd "generate a patch between two binary files"
-.Sh SYNOPSIS
-.Nm
-.Ar oldfile newfile patchfile
-.Sh DESCRIPTION
-The
-.Nm
-utility
-compares
-.Ar oldfile
-to
-.Ar newfile
-and writes to
-.Ar patchfile
-a binary patch suitable for use by
-.Xr bspatch 1 .
-When
-.Ar oldfile
-and
-.Ar newfile
-are two versions of an executable program, the
-patches produced are on average a factor of five smaller
-than those produced by any other binary patch tool known
-to the author.
-.Pp
-The
-.Nm
-utility
-uses memory equal to 17 times the size of
-.Ar oldfile ,
-and requires
-an absolute minimum working set size of 8 times the size of
-.Ar oldfile .
-.Sh SEE ALSO
-.Xr bspatch 1
-.Sh AUTHORS
-.An Colin Percival Aq cperciva@FreeBSD.org
diff --git a/usr.bin/bsdiff/bsdiff/bsdiff.c b/usr.bin/bsdiff/bsdiff/bsdiff.c
deleted file mode 100644
index 005ad4d..0000000
--- a/usr.bin/bsdiff/bsdiff/bsdiff.c
+++ /dev/null
@@ -1,407 +0,0 @@
-/*-
- * Copyright 2003-2005 Colin Percival
- * All rights reserved
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted providing that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <bzlib.h>
-#include <err.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifndef O_BINARY
-#define O_BINARY 0
-#endif
-
-#define MIN(x,y) (((x)<(y)) ? (x) : (y))
-
-static void split(off_t *I,off_t *V,off_t start,off_t len,off_t h)
-{
- off_t i,j,k,x,tmp,jj,kk;
-
- if(len<16) {
- for(k=start;k<start+len;k+=j) {
- j=1;x=V[I[k]+h];
- for(i=1;k+i<start+len;i++) {
- if(V[I[k+i]+h]<x) {
- x=V[I[k+i]+h];
- j=0;
- };
- if(V[I[k+i]+h]==x) {
- tmp=I[k+j];I[k+j]=I[k+i];I[k+i]=tmp;
- j++;
- };
- };
- for(i=0;i<j;i++) V[I[k+i]]=k+j-1;
- if(j==1) I[k]=-1;
- };
- return;
- };
-
- x=V[I[start+len/2]+h];
- jj=0;kk=0;
- for(i=start;i<start+len;i++) {
- if(V[I[i]+h]<x) jj++;
- if(V[I[i]+h]==x) kk++;
- };
- jj+=start;kk+=jj;
-
- i=start;j=0;k=0;
- while(i<jj) {
- if(V[I[i]+h]<x) {
- i++;
- } else if(V[I[i]+h]==x) {
- tmp=I[i];I[i]=I[jj+j];I[jj+j]=tmp;
- j++;
- } else {
- tmp=I[i];I[i]=I[kk+k];I[kk+k]=tmp;
- k++;
- };
- };
-
- while(jj+j<kk) {
- if(V[I[jj+j]+h]==x) {
- j++;
- } else {
- tmp=I[jj+j];I[jj+j]=I[kk+k];I[kk+k]=tmp;
- k++;
- };
- };
-
- if(jj>start) split(I,V,start,jj-start,h);
-
- for(i=0;i<kk-jj;i++) V[I[jj+i]]=kk-1;
- if(jj==kk-1) I[jj]=-1;
-
- if(start+len>kk) split(I,V,kk,start+len-kk,h);
-}
-
-static void qsufsort(off_t *I,off_t *V,u_char *old,off_t oldsize)
-{
- off_t buckets[256];
- off_t i,h,len;
-
- for(i=0;i<256;i++) buckets[i]=0;
- for(i=0;i<oldsize;i++) buckets[old[i]]++;
- for(i=1;i<256;i++) buckets[i]+=buckets[i-1];
- for(i=255;i>0;i--) buckets[i]=buckets[i-1];
- buckets[0]=0;
-
- for(i=0;i<oldsize;i++) I[++buckets[old[i]]]=i;
- I[0]=oldsize;
- for(i=0;i<oldsize;i++) V[i]=buckets[old[i]];
- V[oldsize]=0;
- for(i=1;i<256;i++) if(buckets[i]==buckets[i-1]+1) I[buckets[i]]=-1;
- I[0]=-1;
-
- for(h=1;I[0]!=-(oldsize+1);h+=h) {
- len=0;
- for(i=0;i<oldsize+1;) {
- if(I[i]<0) {
- len-=I[i];
- i-=I[i];
- } else {
- if(len) I[i-len]=-len;
- len=V[I[i]]+1-i;
- split(I,V,i,len,h);
- i+=len;
- len=0;
- };
- };
- if(len) I[i-len]=-len;
- };
-
- for(i=0;i<oldsize+1;i++) I[V[i]]=i;
-}
-
-static off_t matchlen(u_char *old,off_t oldsize,u_char *new,off_t newsize)
-{
- off_t i;
-
- for(i=0;(i<oldsize)&&(i<newsize);i++)
- if(old[i]!=new[i]) break;
-
- return i;
-}
-
-static off_t search(off_t *I,u_char *old,off_t oldsize,
- u_char *new,off_t newsize,off_t st,off_t en,off_t *pos)
-{
- off_t x,y;
-
- if(en-st<2) {
- x=matchlen(old+I[st],oldsize-I[st],new,newsize);
- y=matchlen(old+I[en],oldsize-I[en],new,newsize);
-
- if(x>y) {
- *pos=I[st];
- return x;
- } else {
- *pos=I[en];
- return y;
- }
- };
-
- x=st+(en-st)/2;
- if(memcmp(old+I[x],new,MIN(oldsize-I[x],newsize))<0) {
- return search(I,old,oldsize,new,newsize,x,en,pos);
- } else {
- return search(I,old,oldsize,new,newsize,st,x,pos);
- };
-}
-
-static void offtout(off_t x,u_char *buf)
-{
- off_t y;
-
- if(x<0) y=-x; else y=x;
-
- buf[0]=y%256;y-=buf[0];
- y=y/256;buf[1]=y%256;y-=buf[1];
- y=y/256;buf[2]=y%256;y-=buf[2];
- y=y/256;buf[3]=y%256;y-=buf[3];
- y=y/256;buf[4]=y%256;y-=buf[4];
- y=y/256;buf[5]=y%256;y-=buf[5];
- y=y/256;buf[6]=y%256;y-=buf[6];
- y=y/256;buf[7]=y%256;
-
- if(x<0) buf[7]|=0x80;
-}
-
-int main(int argc,char *argv[])
-{
- int fd;
- u_char *old,*new;
- off_t oldsize,newsize;
- off_t *I,*V;
- off_t scan,pos,len;
- off_t lastscan,lastpos,lastoffset;
- off_t oldscore,scsc;
- off_t s,Sf,lenf,Sb,lenb;
- off_t overlap,Ss,lens;
- off_t i;
- off_t dblen,eblen;
- u_char *db,*eb;
- u_char buf[8];
- u_char header[32];
- FILE * pf;
- BZFILE * pfbz2;
- int bz2err;
-
- if(argc!=4) errx(1,"usage: %s oldfile newfile patchfile\n",argv[0]);
-
- /* Allocate oldsize+1 bytes instead of oldsize bytes to ensure
- that we never try to malloc(0) and get a NULL pointer */
- if(((fd=open(argv[1],O_RDONLY|O_BINARY,0))<0) ||
- ((oldsize=lseek(fd,0,SEEK_END))==-1) ||
- ((old=malloc(oldsize+1))==NULL) ||
- (lseek(fd,0,SEEK_SET)!=0) ||
- (read(fd,old,oldsize)!=oldsize) ||
- (close(fd)==-1)) err(1,"%s",argv[1]);
-
- if(((I=malloc((oldsize+1)*sizeof(off_t)))==NULL) ||
- ((V=malloc((oldsize+1)*sizeof(off_t)))==NULL)) err(1,NULL);
-
- qsufsort(I,V,old,oldsize);
-
- free(V);
-
- /* Allocate newsize+1 bytes instead of newsize bytes to ensure
- that we never try to malloc(0) and get a NULL pointer */
- if(((fd=open(argv[2],O_RDONLY|O_BINARY,0))<0) ||
- ((newsize=lseek(fd,0,SEEK_END))==-1) ||
- ((new=malloc(newsize+1))==NULL) ||
- (lseek(fd,0,SEEK_SET)!=0) ||
- (read(fd,new,newsize)!=newsize) ||
- (close(fd)==-1)) err(1,"%s",argv[2]);
-
- if(((db=malloc(newsize+1))==NULL) ||
- ((eb=malloc(newsize+1))==NULL)) err(1,NULL);
- dblen=0;
- eblen=0;
-
- /* Create the patch file */
- if ((pf = fopen(argv[3], "wb")) == NULL)
- err(1, "%s", argv[3]);
-
- /* Header is
- 0 8 "BSDIFF40"
- 8 8 length of bzip2ed ctrl block
- 16 8 length of bzip2ed diff block
- 24 8 length of new file */
- /* File is
- 0 32 Header
- 32 ?? Bzip2ed ctrl block
- ?? ?? Bzip2ed diff block
- ?? ?? Bzip2ed extra block */
- memcpy(header,"BSDIFF40",8);
- offtout(0, header + 8);
- offtout(0, header + 16);
- offtout(newsize, header + 24);
- if (fwrite(header, 32, 1, pf) != 1)
- err(1, "fwrite(%s)", argv[3]);
-
- /* Compute the differences, writing ctrl as we go */
- if ((pfbz2 = BZ2_bzWriteOpen(&bz2err, pf, 9, 0, 0)) == NULL)
- errx(1, "BZ2_bzWriteOpen, bz2err = %d", bz2err);
- scan=0;len=0;
- lastscan=0;lastpos=0;lastoffset=0;
- while(scan<newsize) {
- oldscore=0;
-
- for(scsc=scan+=len;scan<newsize;scan++) {
- len=search(I,old,oldsize,new+scan,newsize-scan,
- 0,oldsize,&pos);
-
- for(;scsc<scan+len;scsc++)
- if((scsc+lastoffset<oldsize) &&
- (old[scsc+lastoffset] == new[scsc]))
- oldscore++;
-
- if(((len==oldscore) && (len!=0)) ||
- (len>oldscore+8)) break;
-
- if((scan+lastoffset<oldsize) &&
- (old[scan+lastoffset] == new[scan]))
- oldscore--;
- };
-
- if((len!=oldscore) || (scan==newsize)) {
- s=0;Sf=0;lenf=0;
- for(i=0;(lastscan+i<scan)&&(lastpos+i<oldsize);) {
- if(old[lastpos+i]==new[lastscan+i]) s++;
- i++;
- if(s*2-i>Sf*2-lenf) { Sf=s; lenf=i; };
- };
-
- lenb=0;
- if(scan<newsize) {
- s=0;Sb=0;
- for(i=1;(scan>=lastscan+i)&&(pos>=i);i++) {
- if(old[pos-i]==new[scan-i]) s++;
- if(s*2-i>Sb*2-lenb) { Sb=s; lenb=i; };
- };
- };
-
- if(lastscan+lenf>scan-lenb) {
- overlap=(lastscan+lenf)-(scan-lenb);
- s=0;Ss=0;lens=0;
- for(i=0;i<overlap;i++) {
- if(new[lastscan+lenf-overlap+i]==
- old[lastpos+lenf-overlap+i]) s++;
- if(new[scan-lenb+i]==
- old[pos-lenb+i]) s--;
- if(s>Ss) { Ss=s; lens=i+1; };
- };
-
- lenf+=lens-overlap;
- lenb-=lens;
- };
-
- for(i=0;i<lenf;i++)
- db[dblen+i]=new[lastscan+i]-old[lastpos+i];
- for(i=0;i<(scan-lenb)-(lastscan+lenf);i++)
- eb[eblen+i]=new[lastscan+lenf+i];
-
- dblen+=lenf;
- eblen+=(scan-lenb)-(lastscan+lenf);
-
- offtout(lenf,buf);
- BZ2_bzWrite(&bz2err, pfbz2, buf, 8);
- if (bz2err != BZ_OK)
- errx(1, "BZ2_bzWrite, bz2err = %d", bz2err);
-
- offtout((scan-lenb)-(lastscan+lenf),buf);
- BZ2_bzWrite(&bz2err, pfbz2, buf, 8);
- if (bz2err != BZ_OK)
- errx(1, "BZ2_bzWrite, bz2err = %d", bz2err);
-
- offtout((pos-lenb)-(lastpos+lenf),buf);
- BZ2_bzWrite(&bz2err, pfbz2, buf, 8);
- if (bz2err != BZ_OK)
- errx(1, "BZ2_bzWrite, bz2err = %d", bz2err);
-
- lastscan=scan-lenb;
- lastpos=pos-lenb;
- lastoffset=pos-scan;
- };
- };
- BZ2_bzWriteClose(&bz2err, pfbz2, 0, NULL, NULL);
- if (bz2err != BZ_OK)
- errx(1, "BZ2_bzWriteClose, bz2err = %d", bz2err);
-
- /* Compute size of compressed ctrl data */
- if ((len = ftello(pf)) == -1)
- err(1, "ftello");
- offtout(len-32, header + 8);
-
- /* Write compressed diff data */
- if ((pfbz2 = BZ2_bzWriteOpen(&bz2err, pf, 9, 0, 0)) == NULL)
- errx(1, "BZ2_bzWriteOpen, bz2err = %d", bz2err);
- BZ2_bzWrite(&bz2err, pfbz2, db, dblen);
- if (bz2err != BZ_OK)
- errx(1, "BZ2_bzWrite, bz2err = %d", bz2err);
- BZ2_bzWriteClose(&bz2err, pfbz2, 0, NULL, NULL);
- if (bz2err != BZ_OK)
- errx(1, "BZ2_bzWriteClose, bz2err = %d", bz2err);
-
- /* Compute size of compressed diff data */
- if ((newsize = ftello(pf)) == -1)
- err(1, "ftello");
- offtout(newsize - len, header + 16);
-
- /* Write compressed extra data */
- if ((pfbz2 = BZ2_bzWriteOpen(&bz2err, pf, 9, 0, 0)) == NULL)
- errx(1, "BZ2_bzWriteOpen, bz2err = %d", bz2err);
- BZ2_bzWrite(&bz2err, pfbz2, eb, eblen);
- if (bz2err != BZ_OK)
- errx(1, "BZ2_bzWrite, bz2err = %d", bz2err);
- BZ2_bzWriteClose(&bz2err, pfbz2, 0, NULL, NULL);
- if (bz2err != BZ_OK)
- errx(1, "BZ2_bzWriteClose, bz2err = %d", bz2err);
-
- /* Seek to the beginning, write the header, and close the file */
- if (fseeko(pf, 0, SEEK_SET))
- err(1, "fseeko");
- if (fwrite(header, 32, 1, pf) != 1)
- err(1, "fwrite(%s)", argv[3]);
- if (fclose(pf))
- err(1, "fclose");
-
- /* Free the memory we used */
- free(db);
- free(eb);
- free(I);
- free(old);
- free(new);
-
- return 0;
-}
diff --git a/usr.bin/bsdiff/bspatch/Makefile b/usr.bin/bsdiff/bspatch/Makefile
deleted file mode 100644
index c0ed521..0000000
--- a/usr.bin/bsdiff/bspatch/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# $FreeBSD$
-
-PROG= bspatch
-
-DPADD= ${LIBBZ2}
-LDADD= -lbz2
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/bsdiff/bspatch/bspatch.1 b/usr.bin/bsdiff/bspatch/bspatch.1
deleted file mode 100644
index 894bc50..0000000
--- a/usr.bin/bsdiff/bspatch/bspatch.1
+++ /dev/null
@@ -1,65 +0,0 @@
-.\"-
-.\" Copyright 2003-2005 Colin Percival
-.\" All rights reserved
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted providing that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
-.\" IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-.\" POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd May 18, 2003
-.Dt BSPATCH 1
-.Os
-.Sh NAME
-.Nm bspatch
-.Nd apply a patch built with
-.Xr bsdiff 1
-.Sh SYNOPSIS
-.Nm
-.Ar oldfile newfile patchfile
-.Sh DESCRIPTION
-The
-.Nm
-utility
-generates
-.Ar newfile
-from
-.Ar oldfile
-and
-.Ar patchfile
-where
-.Ar patchfile
-is a binary patch built by
-.Xr bsdiff 1 .
-.Pp
-The
-.Nm
-utility
-uses memory equal to the size of
-.Ar oldfile
-plus the size of
-.Ar newfile ,
-but can tolerate a very small working set without a dramatic loss
-of performance.
-.Sh SEE ALSO
-.Xr bsdiff 1
-.Sh AUTHORS
-.An Colin Percival Aq cperciva@FreeBSD.org
diff --git a/usr.bin/bsdiff/bspatch/bspatch.c b/usr.bin/bsdiff/bspatch/bspatch.c
deleted file mode 100644
index d2af3ca..0000000
--- a/usr.bin/bsdiff/bspatch/bspatch.c
+++ /dev/null
@@ -1,207 +0,0 @@
-/*-
- * Copyright 2003-2005 Colin Percival
- * All rights reserved
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted providing that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <bzlib.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <err.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-#ifndef O_BINARY
-#define O_BINARY 0
-#endif
-
-static off_t offtin(u_char *buf)
-{
- off_t y;
-
- y=buf[7]&0x7F;
- y=y*256;y+=buf[6];
- y=y*256;y+=buf[5];
- y=y*256;y+=buf[4];
- y=y*256;y+=buf[3];
- y=y*256;y+=buf[2];
- y=y*256;y+=buf[1];
- y=y*256;y+=buf[0];
-
- if(buf[7]&0x80) y=-y;
-
- return y;
-}
-
-int main(int argc,char * argv[])
-{
- FILE * f, * cpf, * dpf, * epf;
- BZFILE * cpfbz2, * dpfbz2, * epfbz2;
- int cbz2err, dbz2err, ebz2err;
- int fd;
- ssize_t oldsize,newsize;
- ssize_t bzctrllen,bzdatalen;
- u_char header[32],buf[8];
- u_char *old, *new;
- off_t oldpos,newpos;
- off_t ctrl[3];
- off_t lenread;
- off_t i;
-
- if(argc!=4) errx(1,"usage: %s oldfile newfile patchfile\n",argv[0]);
-
- /* Open patch file */
- if ((f = fopen(argv[3], "rb")) == NULL)
- err(1, "fopen(%s)", argv[3]);
-
- /*
- File format:
- 0 8 "BSDIFF40"
- 8 8 X
- 16 8 Y
- 24 8 sizeof(newfile)
- 32 X bzip2(control block)
- 32+X Y bzip2(diff block)
- 32+X+Y ??? bzip2(extra block)
- with control block a set of triples (x,y,z) meaning "add x bytes
- from oldfile to x bytes from the diff block; copy y bytes from the
- extra block; seek forwards in oldfile by z bytes".
- */
-
- /* Read header */
- if (fread(header, 1, 32, f) < 32) {
- if (feof(f))
- errx(1, "Corrupt patch\n");
- err(1, "fread(%s)", argv[3]);
- }
-
- /* Check for appropriate magic */
- if (memcmp(header, "BSDIFF40", 8) != 0)
- errx(1, "Corrupt patch\n");
-
- /* Read lengths from header */
- bzctrllen=offtin(header+8);
- bzdatalen=offtin(header+16);
- newsize=offtin(header+24);
- if((bzctrllen<0) || (bzdatalen<0) || (newsize<0))
- errx(1,"Corrupt patch\n");
-
- /* Close patch file and re-open it via libbzip2 at the right places */
- if (fclose(f))
- err(1, "fclose(%s)", argv[3]);
- if ((cpf = fopen(argv[3], "rb")) == NULL)
- err(1, "fopen(%s)", argv[3]);
- if (fseeko(cpf, 32, SEEK_SET))
- err(1, "fseeko(%s, %lld)", argv[3],
- (long long)32);
- if ((cpfbz2 = BZ2_bzReadOpen(&cbz2err, cpf, 0, 0, NULL, 0)) == NULL)
- errx(1, "BZ2_bzReadOpen, bz2err = %d", cbz2err);
- if ((dpf = fopen(argv[3], "rb")) == NULL)
- err(1, "fopen(%s)", argv[3]);
- if (fseeko(dpf, 32 + bzctrllen, SEEK_SET))
- err(1, "fseeko(%s, %lld)", argv[3],
- (long long)(32 + bzctrllen));
- if ((dpfbz2 = BZ2_bzReadOpen(&dbz2err, dpf, 0, 0, NULL, 0)) == NULL)
- errx(1, "BZ2_bzReadOpen, bz2err = %d", dbz2err);
- if ((epf = fopen(argv[3], "rb")) == NULL)
- err(1, "fopen(%s)", argv[3]);
- if (fseeko(epf, 32 + bzctrllen + bzdatalen, SEEK_SET))
- err(1, "fseeko(%s, %lld)", argv[3],
- (long long)(32 + bzctrllen + bzdatalen));
- if ((epfbz2 = BZ2_bzReadOpen(&ebz2err, epf, 0, 0, NULL, 0)) == NULL)
- errx(1, "BZ2_bzReadOpen, bz2err = %d", ebz2err);
-
- if(((fd=open(argv[1],O_RDONLY|O_BINARY,0))<0) ||
- ((oldsize=lseek(fd,0,SEEK_END))==-1) ||
- ((old=malloc(oldsize+1))==NULL) ||
- (lseek(fd,0,SEEK_SET)!=0) ||
- (read(fd,old,oldsize)!=oldsize) ||
- (close(fd)==-1)) err(1,"%s",argv[1]);
- if((new=malloc(newsize+1))==NULL) err(1,NULL);
-
- oldpos=0;newpos=0;
- while(newpos<newsize) {
- /* Read control data */
- for(i=0;i<=2;i++) {
- lenread = BZ2_bzRead(&cbz2err, cpfbz2, buf, 8);
- if ((lenread < 8) || ((cbz2err != BZ_OK) &&
- (cbz2err != BZ_STREAM_END)))
- errx(1, "Corrupt patch\n");
- ctrl[i]=offtin(buf);
- };
-
- /* Sanity-check */
- if(newpos+ctrl[0]>newsize)
- errx(1,"Corrupt patch\n");
-
- /* Read diff string */
- lenread = BZ2_bzRead(&dbz2err, dpfbz2, new + newpos, ctrl[0]);
- if ((lenread < ctrl[0]) ||
- ((dbz2err != BZ_OK) && (dbz2err != BZ_STREAM_END)))
- errx(1, "Corrupt patch\n");
-
- /* Add old data to diff string */
- for(i=0;i<ctrl[0];i++)
- if((oldpos+i>=0) && (oldpos+i<oldsize))
- new[newpos+i]+=old[oldpos+i];
-
- /* Adjust pointers */
- newpos+=ctrl[0];
- oldpos+=ctrl[0];
-
- /* Sanity-check */
- if(newpos+ctrl[1]>newsize)
- errx(1,"Corrupt patch\n");
-
- /* Read extra string */
- lenread = BZ2_bzRead(&ebz2err, epfbz2, new + newpos, ctrl[1]);
- if ((lenread < ctrl[1]) ||
- ((ebz2err != BZ_OK) && (ebz2err != BZ_STREAM_END)))
- errx(1, "Corrupt patch\n");
-
- /* Adjust pointers */
- newpos+=ctrl[1];
- oldpos+=ctrl[2];
- };
-
- /* Clean up the bzip2 reads */
- BZ2_bzReadClose(&cbz2err, cpfbz2);
- BZ2_bzReadClose(&dbz2err, dpfbz2);
- BZ2_bzReadClose(&ebz2err, epfbz2);
- if (fclose(cpf) || fclose(dpf) || fclose(epf))
- err(1, "fclose(%s)", argv[3]);
-
- /* Write the new file */
- if(((fd=open(argv[2],O_CREAT|O_TRUNC|O_WRONLY|O_BINARY,0666))<0) ||
- (write(fd,new,newsize)!=newsize) || (close(fd)==-1))
- err(1,"%s",argv[2]);
-
- free(new);
- free(old);
-
- return 0;
-}
diff --git a/usr.bin/bzip2/Makefile b/usr.bin/bzip2/Makefile
deleted file mode 100644
index 0460fff..0000000
--- a/usr.bin/bzip2/Makefile
+++ /dev/null
@@ -1,49 +0,0 @@
-# $FreeBSD$
-
-BZ2DIR= ${.CURDIR}/../../contrib/bzip2
-.PATH: ${BZ2DIR}
-
-PROG= bzip2
-CFLAGS+= -D_FILE_OFFSET_BITS=64
-
-DPADD= ${LIBBZ2}
-LDADD= -lbz2
-
-LINKS= ${BINDIR}/bzip2 ${BINDIR}/bunzip2
-LINKS+= ${BINDIR}/bzip2 ${BINDIR}/bzcat
-MLINKS= bzip2.1 bunzip2.1 bzip2.1 bzcat.1
-
-REFFILES= sample1.ref sample2.ref sample3.ref
-DREFFILES= sample1.bz2 sample2.bz2 sample3.bz2
-TESTFILES= ${REFFILES} ${DREFFILES}
-
-CLEANFILES+= ${TESTFILES} \
- sample1.rb2 sample2.rb2 sample3.rb2 \
- sample1.tst sample2.tst sample3.tst
-
-.for f in ${REFFILES}
-${f}: ${f}.gz.uu
- uudecode -p ${BZ2DIR}/${f}.gz.uu | gunzip > ${f}
-.endfor
-.for f in ${DREFFILES}
-${f}: ${f}.uu
- uudecode ${BZ2DIR}/${f}.uu
-.endfor
-
-test: bzip2 ${TESTFILES}
- @cat ${BZ2DIR}/words1
- ./bzip2 -1 < sample1.ref > sample1.rb2
- ./bzip2 -2 < sample2.ref > sample2.rb2
- ./bzip2 -3 < sample3.ref > sample3.rb2
- ./bzip2 -d < sample1.bz2 > sample1.tst
- ./bzip2 -d < sample2.bz2 > sample2.tst
- ./bzip2 -ds < sample3.bz2 > sample3.tst
- cmp sample1.bz2 sample1.rb2
- cmp sample2.bz2 sample2.rb2
- cmp sample3.bz2 sample3.rb2
- cmp sample1.tst sample1.ref
- cmp sample2.tst sample2.ref
- cmp sample3.tst sample3.ref
- @cat ${BZ2DIR}/words3
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/bzip2recover/Makefile b/usr.bin/bzip2recover/Makefile
deleted file mode 100644
index 7f61946..0000000
--- a/usr.bin/bzip2recover/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# $FreeBSD$
-
-BZ2DIR= ${.CURDIR}/../../contrib/bzip2
-.PATH: ${BZ2DIR}
-
-PROG= bzip2recover
-NO_MAN=
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/c89/Makefile b/usr.bin/c89/Makefile
deleted file mode 100644
index 1d9551c..0000000
--- a/usr.bin/c89/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-PROG= c89
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/c89/c89.1 b/usr.bin/c89/c89.1
deleted file mode 100644
index 302aa32..0000000
--- a/usr.bin/c89/c89.1
+++ /dev/null
@@ -1,184 +0,0 @@
-.\"
-.\" Copyright (c) 1997 Joerg Wunsch
-.\"
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd September 17, 1997
-.Os
-.Dt C89 1
-.Sh NAME
-.Nm c89
-.Nd POSIX.2 C language compiler
-.Sh SYNOPSIS
-.Nm
-.Op Fl cEgOs
-.Oo Fl D Ar name Ns Oo = Ns Ar value Oc Oc ...
-.Oo Fl I Ar directory Oc ...
-.Oo Fl L Ar directory Oc ...
-.Op Fl o Ar outfile
-.Oo Fl U Ar name Oc ...
-.Ar operand ...
-.Sh DESCRIPTION
-This is the name of the C language compiler as required by the
-.St -p1003.2
-standard.
-.Pp
-The
-.Nm
-compiler accepts the following options:
-.Bl -tag -width indent
-.It Fl c
-Suppress the link-edit phase of the compilation, and do not remove any
-object files that are produced.
-.It Fl D Ar name Ns Op = Ns Ar value
-Define name as if by a C-language
-.Ic #define
-directive.
-If no
-.Dq = Ns Ar value
-is given, a value of 1 will be used.
-Note that in order to request a
-translation as specified by
-.St -p1003.2
-you need to define
-.Dv _POSIX_SOURCE
-either in the source or using this option.
-The
-.Fl D
-option has lower precedence than the
-.Fl U
-option.
-That is, if
-.Ar name
-is used in both a
-.Fl U
-and a
-.Fl D
-option,
-.Ar name
-will be undefined regardless of the order of the options.
-The
-.Fl D
-option may be specified more than once.
-.It Fl E
-Copy C-language source files to the standard output, expanding all
-preprocessor directives; no compilation will be performed.
-.It Fl g
-Produce symbolic information in the object or executable files.
-.It Fl I Ar directory
-Change the algorithm for searching for headers whose names are not
-absolute pathnames to look in the directory named by the
-.Ar directory
-pathname before looking in the usual places.
-Thus, headers whose
-names are enclosed in double-quotes
-.Pq Qq
-will be searched for first
-in the directory of the file with the
-.Ic #include
-line, then in
-directories named in
-.Fl I
-options, and last in the usual places.
-For headers whose names are enclosed in angle brackets
-.Pq Aq ,
-the header
-will be searched for only in directories named in
-.Fl I
-options and then in the usual places.
-Directories named in
-.Fl I
-options shall be searched in the order specified.
-The
-.Fl I
-option may be specified more than once.
-.It Fl L Ar directory
-Change the algorithm of searching for the libraries named in the
-.Fl l
-objects to look in the directory named by the
-.Ar directory
-pathname before looking in the usual places.
-Directories named in
-.Fl L
-options will be searched in the order specified.
-The
-.Fl L
-option may be specified more than once.
-.It Fl o Ar outfile
-Use the pathname
-.Ar outfile ,
-instead of the default
-.Pa a.out ,
-for the executable file produced.
-.It Fl O
-Optimize the compilation.
-.It Fl s
-Produce object and/or executable files from which symbolic and other
-information not required for proper execution has been removed
-(stripped).
-.It Fl U Ar name
-Remove any initial definition of
-.Ar name .
-The
-.Fl U
-option may be specified more than once.
-.El
-.Pp
-An operand is either in the form of a pathname or the form
-.Fl l
-library.
-At least one operand of the pathname form needs to be specified.
-Supported operands are of the form:
-.Bl -tag -offset indent -width ".Fl l Ar library"
-.It Ar file Ns Pa .c
-A C-language source file to be compiled and optionally linked.
-The operand must be of this form if the
-.Fl c
-option is used.
-.It Ar file Ns Pa .a
-A library of object files, as produced by
-.Xr ar 1 ,
-passed directly to the link editor.
-.It Ar file Ns Pa .o
-An object file produced by
-.Nm Fl c ,
-and passed directly to the link editor.
-.It Fl l Ar library
-Search the library named
-.Pa lib Ns Ar library Ns Pa .a .
-A library will be searched when its name is encountered, so the
-placement of a
-.Fl l
-operand is significant.
-.El
-.Sh SEE ALSO
-.Xr ar 1 ,
-.Xr c99 1 ,
-.Xr cc 1
-.Sh STANDARDS
-The
-.Nm
-utility is believed to comply with
-.St -p1003.2 .
diff --git a/usr.bin/c89/c89.c b/usr.bin/c89/c89.c
deleted file mode 100644
index a1dc9b2..0000000
--- a/usr.bin/c89/c89.c
+++ /dev/null
@@ -1,111 +0,0 @@
-/*-
- * This is the Posix.2 mandated C compiler. Basically, a hook to the
- * cc(1) command.
- *
- * Copyright (c) 2001 by Jens Schweikhardt
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <unistd.h>
-
-#define CC "/usr/bin/cc" /* The big kahuna doing the actual work. */
-#define N_ARGS_PREPENDED (sizeof(args_prepended) / sizeof(args_prepended[0]))
-
-/*
- * We do not add -D_POSIX_SOURCE here because any POSIX source is supposed to
- * define it before inclusion of POSIX headers. This has the additional
- * benefit of making c89 -D_ANSI_SOURCE do the right thing (or any other
- * -D_FOO_SOURCE feature test macro we support.)
- */
-static const char *args_prepended[] = {
- "-std=iso9899:199409",
- "-pedantic"
-};
-
-static void usage(void);
-
-/*
- * Prepend the strings from args_prepended[] to the arg list; parse options,
- * accepting only the POSIX c89 mandated options. Then exec cc to do the
- * actual work.
- */
-int
-main(int argc, char **argv)
-{
- int Argc, i;
- size_t j;
- union {
- const char **a;
- char * const *b;
- } Argv;
-
- Argc = 0;
- Argv.a = malloc((argc + 1 + N_ARGS_PREPENDED) * sizeof *Argv.a);
- if (Argv.a == NULL)
- err(1, "malloc");
- Argv.a[Argc++] = argv[0];
- for (j = 0; j < N_ARGS_PREPENDED; ++j)
- Argv.a[Argc++] = args_prepended[j];
- while ((i = getopt(argc, argv, "cD:EgI:l:L:o:OsU:")) != -1) {
- if (i == '?')
- usage();
- if (i == 'l') {
- if (argv[optind - 1][0] == '-') /* -llib */
- optind -= 1;
- else /* -l lib */
- optind -= 2;
- break; /* -llib or -l lib starts the operands. */
- }
- }
- if (argc == optind) {
- warnx("missing operand");
- usage();
- }
-
- /* Append argv[1..] at the end of Argv[].a. */
- for (i = 1; i <= argc; ++i)
- Argv.a[Argc++] = argv[i];
- (void)execv(CC, Argv.b);
- err(1, "execv(" CC ")");
-}
-
-static void
-usage(void)
-{
- fprintf(stderr,
-"usage: c89 [-cEgOs] [-D name[=value]] ... [-I directory] ... [-L directory] ...\n"
-" [-o outfile] [-U name] ... operand ...\n"
-"\n"
-" where operand is one or more of file.c, file.o, file.a\n"
-" or -llibrary\n");
- exit(1);
-}
diff --git a/usr.bin/c99/Makefile b/usr.bin/c99/Makefile
deleted file mode 100644
index 580065f..0000000
--- a/usr.bin/c99/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-PROG= c99
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/c99/c99.1 b/usr.bin/c99/c99.1
deleted file mode 100644
index c56e585..0000000
--- a/usr.bin/c99/c99.1
+++ /dev/null
@@ -1,198 +0,0 @@
-.\"
-.\" Copyright (c) 1997 Joerg Wunsch
-.\"
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" From FreeBSD: src/usr.bin/c89/c89.1,v 1.11 2007/03/10 07:10:01 ru Exp
-.\" $FreeBSD$
-.\"
-.Dd October 7, 2002
-.Os
-.Dt C99 1
-.Sh NAME
-.Nm c99
-.Nd standard C language compiler
-.Sh SYNOPSIS
-.Nm
-.Op Fl cEgs
-.Oo Fl D Ar name Ns Oo = Ns Ar value Oc Oc ...
-.Oo Fl I Ar directory Oc ...
-.Oo Fl L Ar directory Oc ...
-.Op Fl o Ar outfile
-.Op Fl O Ar optlevel
-.Oo Fl U Ar name Oc ...
-.Ar operand ...
-.Sh DESCRIPTION
-This is the name of the C language compiler as required by the
-.St -p1003.1-2001
-standard.
-.Pp
-The
-.Nm
-compiler accepts the following options:
-.Bl -tag -width indent
-.It Fl c
-Suppress the link-edit phase of the compilation, and do not remove any
-object files that are produced.
-.It Fl D Ar name Ns Op = Ns Ar value
-Define name as if by a C-language
-.Ic #define
-directive.
-If no
-.Dq = Ns Ar value
-is given, a value of 1 will be used.
-Note that in order to request a
-translation as specified by
-.St -p1003.1-2001 ,
-you need to define
-.Dv _POSIX_C_SOURCE=200112L
-either in the source or using this option.
-The
-.Fl D
-option has lower precedence than the
-.Fl U
-option.
-That is, if
-.Ar name
-is used in both a
-.Fl U
-and a
-.Fl D
-option,
-.Ar name
-will be undefined regardless of the order of the options.
-The
-.Fl D
-option may be specified more than once.
-.It Fl E
-Copy C-language source files to the standard output, expanding all
-preprocessor directives; no compilation will be performed.
-.It Fl g
-Produce symbolic information in the object or executable files.
-.It Fl I Ar directory
-Change the algorithm for searching for headers whose names are not
-absolute pathnames to look in the directory named by the
-.Ar directory
-pathname before looking in the usual places.
-Thus, headers whose
-names are enclosed in double-quotes
-.Pq Qq
-will be searched for first
-in the directory of the file with the
-.Ic #include
-line, then in
-directories named in
-.Fl I
-options, and last in the usual places.
-For headers whose names are enclosed in angle brackets
-.Pq Aq ,
-the header
-will be searched for only in directories named in
-.Fl I
-options and then in the usual places.
-Directories named in
-.Fl I
-options shall be searched in the order specified.
-The
-.Fl I
-option may be specified more than once.
-.It Fl L Ar directory
-Change the algorithm of searching for the libraries named in the
-.Fl l
-objects to look in the directory named by the
-.Ar directory
-pathname before looking in the usual places.
-Directories named in
-.Fl L
-options will be searched in the order specified.
-The
-.Fl L
-option may be specified more than once.
-.It Fl o Ar outfile
-Use the pathname
-.Ar outfile ,
-instead of the default
-.Pa a.out ,
-for the executable file produced.
-.It Fl O Ar optlevel
-If
-.Ar optlevel
-is zero, disable all optimizations.
-Otherwise, enable optimizations at the specified level.
-.It Fl s
-Produce object and/or executable files from which symbolic and other
-information not required for proper execution has been removed
-(stripped).
-.It Fl U Ar name
-Remove any initial definition of
-.Ar name .
-The
-.Fl U
-option may be specified more than once.
-.El
-.Pp
-An operand is either in the form of a pathname or the form
-.Fl l
-library.
-At least one operand of the pathname form needs to be specified.
-Supported operands are of the form:
-.Bl -tag -offset indent -width ".Fl l Ar library"
-.It Ar file Ns Pa .c
-A C-language source file to be compiled and optionally linked.
-The operand must be of this form if the
-.Fl c
-option is used.
-.It Ar file Ns Pa .a
-A library of object files, as produced by
-.Xr ar 1 ,
-passed directly to the link editor.
-.It Ar file Ns Pa .o
-An object file produced by
-.Nm Fl c ,
-and passed directly to the link editor.
-.It Fl l Ar library
-Search the library named
-.Pa lib Ns Ar library Ns Pa .a .
-A library will be searched when its name is encountered, so the
-placement of a
-.Fl l
-operand is significant.
-.El
-.Sh SEE ALSO
-.Xr ar 1 ,
-.Xr c89 1 ,
-.Xr cc 1
-.Sh STANDARDS
-The
-.Nm
-utility interface conforms to
-.St -p1003.1-2001 .
-Since it is a wrapper around
-.Tn GCC ,
-it is limited to the
-.Tn C99
-features that
-.Tn GCC
-actually implements.
-See
-.Pa http://gcc.gnu.org/gcc-3.3/c99status.html .
diff --git a/usr.bin/c99/c99.c b/usr.bin/c99/c99.c
deleted file mode 100644
index 553099f..0000000
--- a/usr.bin/c99/c99.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*-
- * Copyright (c) 2002 Tim J. Robbins.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * c99 -- compile standard C programs
- *
- * This is essentially a wrapper around the system C compiler that forces
- * the compiler into C99 mode and handles some of the standard libraries
- * specially.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-char **args;
-u_int cargs, nargs;
-
-void addarg(const char *);
-void addlib(const char *);
-void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- int ch, i;
-
- args = NULL;
- cargs = nargs = 0;
-
- while ((ch = getopt(argc, argv, "cD:EgI:L:o:O:sU:l:")) != -1) {
- if (ch == 'l') {
- /* Gone too far. Back up and get out. */
- if (argv[optind - 1][0] == '-')
- optind -= 1;
- else
- optind -= 2;
- break;
- } else if (ch == '?')
- usage();
- }
-
- addarg("cc");
- addarg("-std=iso9899:1999");
- addarg("-pedantic");
- for (i = 1; i < optind; i++)
- addarg(argv[i]);
- while (i < argc) {
- if (strncmp(argv[i], "-l", 2) == 0) {
- if (argv[i][2] != '\0')
- addlib(argv[i++] + 2);
- else {
- if (argv[++i] == NULL)
- usage();
- addlib(argv[i++]);
- }
- } else
- addarg(argv[i++]);
- }
- execv("/usr/bin/cc", args);
- err(1, "/usr/bin/cc");
-}
-
-void
-addarg(const char *item)
-{
- if (nargs + 1 >= cargs) {
- cargs += 16;
- if ((args = realloc(args, sizeof(*args) * cargs)) == NULL)
- err(1, "malloc");
- }
- if ((args[nargs++] = strdup(item)) == NULL)
- err(1, "strdup");
- args[nargs] = NULL;
-}
-
-void
-addlib(const char *lib)
-{
-
- if (strcmp(lib, "pthread") == 0)
- /* FreeBSD's gcc uses -pthread instead of -lpthread. */
- addarg("-pthread");
- else if (strcmp(lib, "rt") == 0)
- /* librt functionality is in libc or unimplemented. */
- ;
- else if (strcmp(lib, "xnet") == 0)
- /* xnet functionality is in libc. */
- ;
- else {
- addarg("-l");
- addarg(lib);
- }
-}
-
-void
-usage(void)
-{
- (void)fprintf(stderr, "%s\n%s\n",
-"usage: c99 [-cEgs] [-D name[=value]] ... [-I directory] ... [-L directory] ...",
-" [-o outfile] [-O optlevel] [-U name] ... operand ...");
- exit(1);
-}
diff --git a/usr.bin/calendar/Makefile b/usr.bin/calendar/Makefile
deleted file mode 100644
index 481713a..0000000
--- a/usr.bin/calendar/Makefile
+++ /dev/null
@@ -1,30 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= calendar
-SRCS= calendar.c io.c day.c ostern.c paskha.c
-INTER= de_AT.ISO_8859-15 de_DE.ISO8859-1 fr_FR.ISO8859-1 \
- hr_HR.ISO8859-2 hu_HU.ISO8859-2 ru_RU.KOI8-R uk_UA.KOI8-U
-DE_LINKS= de_DE.ISO8859-15
-FR_LINKS= fr_FR.ISO8859-15
-TEXTMODE?= 444
-
-beforeinstall:
- ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${TEXTMODE} \
- ${.CURDIR}/calendars/calendar.* ${DESTDIR}${SHAREDIR}/calendar
-.for lang in ${INTER}
- mkdir -p ${DESTDIR}${SHAREDIR}/calendar/${lang}
- ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${TEXTMODE} \
- ${.CURDIR}/calendars/${lang}/calendar.* \
- ${DESTDIR}${SHAREDIR}/calendar/${lang}
-.endfor
-.for link in ${DE_LINKS}
- rm -rf ${DESTDIR}${SHAREDIR}/calendar/${link}
- ln -s de_DE.ISO8859-1 ${DESTDIR}${SHAREDIR}/calendar/${link}
-.endfor
-.for link in ${FR_LINKS}
- rm -rf ${DESTDIR}${SHAREDIR}/calendar/${link}
- ln -s fr_FR.ISO8859-1 ${DESTDIR}${SHAREDIR}/calendar/${link}
-.endfor
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/calendar/calendar.1 b/usr.bin/calendar/calendar.1
deleted file mode 100644
index 404f44c..0000000
--- a/usr.bin/calendar/calendar.1
+++ /dev/null
@@ -1,265 +0,0 @@
-.\" Copyright (c) 1989, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)calendar.1 8.1 (Berkeley) 6/29/93
-.\" $FreeBSD$
-.\"
-.Dd June 13, 2002
-.Dt CALENDAR 1
-.Os
-.Sh NAME
-.Nm calendar
-.Nd reminder service
-.Sh SYNOPSIS
-.Nm
-.Op Fl a
-.Op Fl A Ar num
-.Op Fl B Ar num
-.Op Fl F Ar friday
-.Op Fl f Ar calendarfile
-.Oo
-.Bk -words
-.Fl t Ar dd Ns
-.Sm off
-.Op . Ar mm Op . Ar year
-.Sm on
-.Ek
-.Oc
-.Op Fl W Ar num
-.Sh DESCRIPTION
-The
-.Nm
-utility checks the current directory for a file named
-.Pa calendar
-and displays lines that begin with either today's date
-or tomorrow's.
-On the day before a weekend (normally Friday), events for the next
-three days are displayed.
-.Pp
-The following options are available:
-.Bl -tag -width Ds
-.It Fl A Ar num
-Print lines from today and the next
-.Ar num
-days (forward, future).
-.It Fl a
-Process the ``calendar'' files of all users and mail the results
-to them.
-This requires super-user privileges.
-.It Fl B Ar num
-Print lines from today and the previous
-.Ar num
-days (backward, past).
-.It Fl F Ar friday
-Specify which day of the week is ``Friday'' (the day before the
-weekend begins).
-Default is 5.
-.It Fl f Pa calendarfile
-Use
-.Pa calendarfile
-as the default calendar file.
-.It Xo Fl t
-.Sm off
-.Ar dd
-.Op . Ar mm Op . Ar year
-.Sm on
-.Xc
-For test purposes only: set date directly to argument values.
-.It Fl W Ar num
-Print lines from today and the next
-.Ar num
-days (forward, future).
-Ignore weekends when calculating the number of days.
-.El
-.Pp
-To handle calendars in your national code table you can specify
-.Dq LANG=<locale_name>
-in the calendar file as early as possible.
-To handle national Easter
-names in the calendars
-.Dq Easter=<national_name>
-(for Catholic Easter) or
-.Dq Paskha=<national_name>
-(for Orthodox Easter) can be used.
-.Pp
-Other lines should begin with a month and day.
-They may be entered in almost any format, either numeric or as character
-strings.
-If the proper locale is set, national month and weekday
-names can be used.
-A single asterisk (``*'') matches every month.
-A day without a month matches that day of every week.
-A month without a day matches the first of that month.
-Two numbers default to the month followed by the day.
-Lines with leading tabs default to the last entered date, allowing
-multiple line specifications for a single date.
-.Pp
-``Easter'', is Easter for this year, and may be followed by a positive
-or negative integer.
-.Pp
-``Paskha'', is Orthodox Easter for this year, and may be followed by a
-positive or negative integer.
-.Pp
-Weekdays may be followed by ``-4'' ...\& ``+5'' (aliases for
-last, first, second, third, fourth) for moving events like
-``the last Monday in April''.
-.Pp
-By convention, dates followed by an asterisk are not fixed, i.e., change
-from year to year.
-.Pp
-Day descriptions start after the first <tab> character in the line;
-if the line does not contain a <tab> character, it is not displayed.
-If the first character in the line is a <tab> character, it is treated as
-a continuation of the previous line.
-.Pp
-The ``calendar'' file is preprocessed by
-.Xr cpp 1 ,
-allowing the inclusion of shared files such as lists of company holidays or
-meetings.
-If the shared file is not referenced by a full pathname,
-.Xr cpp 1
-searches in the current (or home) directory first, and then in the
-directory
-.Pa /usr/share/calendar .
-Empty lines and lines protected by the C commenting syntax
-.Pq Li /* ... */
-are ignored.
-.Pp
-Some possible calendar entries (<tab> characters highlighted by
-\fB\et\fR sequence)
-.Bd -unfilled -offset indent
-LANG=C
-Easter=Ostern
-
-#include <calendar.usholiday>
-#include <calendar.birthday>
-
-6/15\fB\et\fRJune 15 (if ambiguous, will default to month/day).
-Jun. 15\fB\et\fRJune 15.
-15 June\fB\et\fRJune 15.
-Thursday\fB\et\fREvery Thursday.
-June\fB\et\fREvery June 1st.
-15 *\fB\et\fR15th of every month.
-
-May Sun+2\fB\et\fRsecond Sunday in May (Muttertag)
-04/SunLast\fB\et\fRlast Sunday in April,
-\fB\et\fRsummer time in Europe
-Easter\fB\et\fREaster
-Ostern-2\fB\et\fRGood Friday (2 days before Easter)
-Paskha\fB\et\fROrthodox Easter
-
-.Ed
-.Sh FILES
-.Bl -tag -width calendar.christian -compact
-.It Pa calendar
-file in current directory
-.It Pa ~/.calendar
-.Pa calendar
-HOME directory.
-A chdir is done into this directory if it exists.
-.It Pa ~/.calendar/calendar
-calendar file to use if no calendar file exists in the current directory.
-.It Pa ~/.calendar/nomail
-do not send mail if this file exists.
-.El
-.Pp
-The following default calendar files are provided:
-.Pp
-.Bl -tag -width calendar.southafrica -compact
-.It Pa calendar.all
-File which includes all the default files.
-.It Pa calendar.australia
-Calendar of events in Australia.
-.It Pa calendar.birthday
-Births and deaths of famous (and not-so-famous) people.
-.It Pa calendar.christian
-Christian holidays.
-This calendar should be updated yearly by the local system administrator
-so that roving holidays are set correctly for the current year.
-.It Pa calendar.computer
-Days of special significance to computer people.
-.It Pa calendar.croatian
-Calendar of events in Croatia.
-.It Pa calendar.freebsd
-Birthdays of
-.Fx
-committers.
-.It Pa calendar.french
-Calendar of events in France.
-.It Pa calendar.german
-Calendar of events in Germany.
-.It Pa calendar.history
-Everything else, mostly U.S.\& historical events.
-.It Pa calendar.holiday
-Other holidays, including the not-well-known, obscure, and
-.Em really
-obscure.
-.It Pa calendar.judaic
-Jewish holidays.
-This calendar should be updated yearly by the local system administrator
-so that roving holidays are set correctly for the current year.
-.It Pa calendar.music
-Musical events, births, and deaths.
-Strongly oriented toward rock 'n' roll.
-.It Pa calendar.newzealand
-Calendar of events in New Zealand.
-.It Pa calendar.russian
-Russian calendar.
-.It Pa calendar.southafrica
-Calendar of events in South Africa.
-.It Pa calendar.usholiday
-U.S.\& holidays.
-This calendar should be updated yearly by the local system administrator
-so that roving holidays are set correctly for the current year.
-.It Pa calendar.world
-Includes all calendar files except for national files.
-.El
-.Sh COMPATIBILITY
-The
-.Nm
-program previously selected lines which had the correct date anywhere
-in the line.
-This is no longer true, the date is only recognized when it occurs
-at the beginning of a line.
-.Sh SEE ALSO
-.Xr at 1 ,
-.Xr cpp 1 ,
-.Xr mail 1 ,
-.Xr cron 8
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v7 .
-.Sh BUGS
-The
-.Nm
-utility does not handle Jewish holidays and moon phases.
diff --git a/usr.bin/calendar/calendar.c b/usr.bin/calendar/calendar.c
deleted file mode 100644
index d1bb745..0000000
--- a/usr.bin/calendar/calendar.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (c) 1989, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1989, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)calendar.c 8.3 (Berkeley) 3/25/94";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <errno.h>
-#include <locale.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "pathnames.h"
-#include "calendar.h"
-
-struct passwd *pw;
-int doall = 0;
-time_t f_time = 0;
-
-int f_dayAfter = 0; /* days after current date */
-int f_dayBefore = 0; /* days before current date */
-int Friday = 5; /* day before weekend */
-
-static void usage(void) __dead2;
-
-int
-main(int argc, char *argv[])
-{
- int ch;
-
- (void)setlocale(LC_ALL, "");
-
- while ((ch = getopt(argc, argv, "-A:aB:F:f:t:W:")) != -1)
- switch (ch) {
- case '-': /* backward contemptible */
- case 'a':
- if (getuid()) {
- errno = EPERM;
- err(1, NULL);
- }
- doall = 1;
- break;
-
- case 'f': /* other calendar file */
- calendarFile = optarg;
- break;
-
- case 't': /* other date, undocumented, for tests */
- f_time = Mktime(optarg);
- break;
-
- case 'W': /* we don't need no steenking Fridays */
- Friday = -1;
-
- /* FALLTHROUGH */
- case 'A': /* days after current date */
- f_dayAfter = atoi(optarg);
- break;
-
- case 'B': /* days before current date */
- f_dayBefore = atoi(optarg);
- break;
-
- case 'F':
- Friday = atoi(optarg);
- break;
-
- case '?':
- default:
- usage();
- }
-
- argc -= optind;
- argv += optind;
-
- if (argc)
- usage();
-
- /* use current time */
- if (f_time <= 0)
- (void)time(&f_time);
-
- settime(f_time);
-
- if (doall)
- while ((pw = getpwent()) != NULL) {
- (void)setegid(pw->pw_gid);
- (void)initgroups(pw->pw_name, pw->pw_gid);
- (void)seteuid(pw->pw_uid);
- if (!chdir(pw->pw_dir))
- cal();
- (void)seteuid(0);
- }
- else
- cal();
- exit(0);
-}
-
-
-static void __dead2
-usage(void)
-{
-
- fprintf(stderr, "%s\n%s\n",
- "usage: calendar [-a] [-A days] [-B days] [-F friday] "
- "[-f calendarfile]",
- " [-t dd[.mm[.year]]] [-W days]");
- exit(1);
-}
diff --git a/usr.bin/calendar/calendar.h b/usr.bin/calendar/calendar.h
deleted file mode 100644
index ff67ca6..0000000
--- a/usr.bin/calendar/calendar.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 1989, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-#include <sys/uio.h>
-
-extern struct passwd *pw;
-extern int doall;
-extern struct iovec header[];
-extern struct tm *tp;
-extern const char *calendarFile;
-extern int *cumdays;
-extern int yrdays;
-extern struct fixs neaster, npaskha;
-
-void cal(void);
-void closecal(FILE *);
-int getday(char *);
-int getdayvar(char *);
-int getfield(char *, char **, int *);
-int getmonth(char *);
-int geteaster(char *, int);
-int getpaskha(char *, int);
-int easter(int);
-int isnow(char *, int *, int *, int *);
-FILE *opencal(void);
-void settime(time_t);
-time_t Mktime(char *);
-void setnnames(void);
-
-#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0)
-
-/* some flags */
-#define F_ISMONTH 0x01 /* month (January ...) */
-#define F_ISDAY 0x02 /* day of week (Sun, Mon, ...) */
-#define F_ISDAYVAR 0x04 /* variables day of week, like SundayLast */
-#define F_EASTER 0x08 /* Easter or easter depending days */
-
-extern int f_dayAfter; /* days after current date */
-extern int f_dayBefore; /* days before current date */
-extern int Friday; /* day before weekend */
-
-struct fixs {
- char *name;
- int len;
-};
diff --git a/usr.bin/calendar/calendars/calendar.all b/usr.bin/calendar/calendars/calendar.all
deleted file mode 100644
index b46dcb4..0000000
--- a/usr.bin/calendar/calendars/calendar.all
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * International and national calendar files
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_all_
-#define _calendar_all_
-
-#include <calendar.world>
-#include <calendar.croatian>
-#include <calendar.dutch>
-#include <calendar.french>
-#include <calendar.german>
-#include <calendar.hungarian>
-#include <calendar.southafrica>
-#include <calendar.russian>
-#include <calendar.usholiday>
-
-#endif /* !_calendar_all_ */
diff --git a/usr.bin/calendar/calendars/calendar.australia b/usr.bin/calendar/calendars/calendar.australia
deleted file mode 100644
index 323e7ee..0000000
--- a/usr.bin/calendar/calendars/calendar.australia
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Australian holidays
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_australia_
-#define _calendar_australia_
-
-LANG=en_AU.ISO8859-1
-
-/* Australia */
-Jan 26 Australia Day
-Mar/SunLast Daylight Savings Time ends in ACT, NSW, SA, TAS and VIC.
-Apr 25 Anzac Day
-Jun/MonSecond Queen's Birthday Holiday (Australia, except WA)
-Oct/SunLast Daylight Savings Time starts in ACT, NSW, SA and VIC.
-
-/* ACT, NSW, common */
-Mar 18 Canberra Day (ACT)
-8/MonFirst Bank Holiday (ACT, NSW)
-10/MonFirst Labour Day (ACT, NSW, SA)
-
-/* Victoria */
-3/MonSecond Labour Day (Vic)
-Nov/TueFirst Melbourne Cup (Vic)
-
-/* Tasmania */
-Feb 11 Regatta Day (Tas)
-Feb 27 Launceston Cup (Tas)
-Mar 11 Eight Hours Day (Tas)
-Oct/SunFirst Daylight Savings Time starts in TAS.
-Oct 10 Launceston Show Day (Tas)
-Oct 24 Hobart Show Day (Tas)
-Nov 04 Recreation Day (N Tas)
-
-/* South Australia */
-May/MonThird Adelaide Cup (SA)
-Dec 26 Proclamation Day holiday (SA)
-
-/* Western Australia */
-3/MonFirst Labour Day (WA)
-6/MonFirst Foundation Day (WA)
-Sep 30 Queen's Birthday (WA)
-
-/* Northern Territory */
-5/MonFirst May Day (NT)
-7/FriFirst Alice Springs Show Day (NT)
-7/FriSecond Tennant Creek Show Day (NT)
-7/FriThird Katherine Show Day (NT)
-7/FriLast Darwin Show Day (NT)
-8/MonFirst Picnic Day (NT)
-
-/* Queensland */
-5/MonFirst Labour Day (Qld)
-Aug 14 RNA Show Day (Brisbane metro)
-
-#endif
diff --git a/usr.bin/calendar/calendars/calendar.birthday b/usr.bin/calendar/calendars/calendar.birthday
deleted file mode 100644
index e8749bf..0000000
--- a/usr.bin/calendar/calendars/calendar.birthday
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Birthday
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_birthday_
-#define _calendar_birthday_
-
-01/01 J.D. Salinger born, 1919
-01/01 Paul Revere born in Boston, 1735
-01/02 Isaac Asimov born in Petrovichi, Russian SFSR, 1920
-01/04 George Washington Carver born in Missouri, 1864
-01/04 Jakob Grimm born, 1785
-01/04 Wilhelm Beer born, 1797, first astronomer to map Mars
-01/05 DeWitt B. Brace born, 1859, inventor of spectrophotometer
-01/10 Ethan Allen born, 1738
-01/11 Alexander Hamilton born in Nevis, British West Indies, 1757?
-01/12 "Long" John Baldry is born in London, 1941
-01/13 Horatio Alger born, 1834
-01/13 Sophie Tucker born, 1884
-01/13 Wilhelm Wien born, 1864, Nobel prize for blackbody radiation laws
-01/14 Albert Schweitzer born, 1875
-01/15 Martin Luther King, Jr. born
-01/17 Benjamin Franklin born in Boston, 1706
-01/19 Edgar Allan Poe born in Boston, 1809
-01/19 Robert Edward Lee born in Stratford Estate, Virginia, 1807
-01/20 George Burns born, 1898
-01/21 Lenin died, 1924
-01/21 Thomas Jonathan "Stonewall" Jackson born in Clarksburg, VA, 1824
-01/22 Sir Francis Bacon born, 1561
-01/23 Ernst Abbe born, 1840, formulated diffraction theory
-01/23 Humphrey Bogart born in New York City, 1899
-01/23 John Hancock born, 1737
-01/23 Joseph Hewes born, 1730
-01/23 Samuel Barber died, 1981
-01/24 John Belushi is born in Chicago, 1949
-01/25 Robert Burns born, 1759
-01/25 Virginia Woolf born, 1882
-01/25 W. Somerset Maugham born, 1874
-01/27 Samuel Gompers born, 1850
-01/30 Franklin Delano Roosevelt born in Hyde Park, New York, 1882
-01/31 Jackie Robinson born, 1919
-02/03 Gertrude Stein born, 1874
-02/05 Alex Harvey (SAHB) is born in Glasgow, Scotland, 1935
-02/06 King George VI of UK dies; his daughter becomes Elizabeth II, 1952
-02/07 Sinclair Lewis born, 1885
-02/08 Friedleib F. Runge born, 1795, father of paper chromatography
-02/08 Jules Verne born in Nantes, France, 1828
-02/09 George Hartmann born, 1489, designed astrolabes, timepieces, etc.
-02/10 Charles Lamb born, 1775
-02/10 William Allen White born, 1868
-02/11 Thos. Edison born, 1847
-02/11 William Henry Fox Talbot (photographic pioneer) born, 1800
-02/12 Abraham Lincoln born, 1809
-02/12 Charles Darwin born in Shrewsbury, England, 1809
-02/15 Galileo Galilei born in Pisa, Italy, 1564
-02/15 Susan B. Anthony born, 1820
-02/16 Pierre Bouguer born, 1698, founder of photometry
-02/17 Federick Eugene Ives born, 1856, pioneer of halftone
-02/17 Marion Anderson born, 1902
-02/17 T. J. Watson, Sr. born, 1874
-02/18 Ernst Mach born, 1838, philosopher & optics pioneer
-02/19 Nicolas Copernicus born in Thorn, Poland, 1473
-02/20 Ludwig Boltzmann born, 1838, atomic physics pioneer
-02/21 Alexis De Rochon born, 1838, developed the spyglass
-02/22 George Washington born, 1732
-02/22 Pierre Jules Cesar Janssen born, 1838, found hydrogen in the sun
-02/23 W.E.B. DuBois born, 1868
-02/24 Winslow Homer born, 1836
-02/25 George Harrison born in Liverpool, England, 1943
-02/25 Renoir born, 1841
-02/26 Dominique Francois Jean Arago born, 1786;
- observed "Poisson's spot" cf June 21
-02/28 Michel de Mantaigne born, 1533
-02/29 Herman Hollerith born, 1860
-03/01 David Niven born, 1910
-03/02 Dr. Seuss born, 1904
-03/04 Casimir Pulaski born, 1747
-03/05 John Belushi dies in Los Angeles, 1982
-03/07 Sir John Frederick William Herschel born, 1792, astronomer
-03/08 Alvan Clark born, 1804, astronomer & lens manufacturer
-03/08 Howard Aiken born, 1900
-03/11 Robert Treat Paine born, 1737
-03/11 Vannevar Bush born, 1890
-03/12 Gustav Robert Kirchhoff born, 1824, physicist
-03/14 Albert Einstein born, 1879
-03/14 Casey Jones born, 1864
-03/14 Giovanni Virginia Schiaparelli born, 1835, astronomer;
- named Mars "canals"
-03/14 Jean Baptiste Joseph Fourier born, 1768, mathematician & physicist
-03/15 Andrew "Old Hickory" Jackson, 7th President of the United States,
- born in Waxhaw, South Carolina, 1767
-03/15 J.J. Robert's Birthday in Liberia
-03/16 George Clymer born, 1739
-03/16 James Madison, 4th President of the United States, born in King George
- County, Virginia, 1751
-03/21 NetBSD project born, 1993
-03/24 Harry Houdini born, 1874
-03/26 Benjamin Thompson born, 1753, Count Rumford; physicist
-03/26 David Packard died, 1996; age of 83
-03/27 Wilhelm Conrad Roentgen born, 1845, discoverer of X-rays
-03/28 Pierre Simon de Laplace born, 1749, mathematician & astronomer
-03/30 Francisco Jose de Goya born, 1746
-03/30 Sean O'Casey born, 1880
-03/30 Vincent Van Gogh born, 1853
-03/31 Rene Descartes born, 1596, mathematician & philosopher
-04/02 Hans Christian Andersen born, 1805, fairy tale author
-04/02 Pope John Paul II (Karol Wojtyla) died in Vatican, 2005
-04/03 Washington Irving born, 1783
-04/05 Thomas Hobbes born, 1588, philosopher
-04/08 Buddha born, 563 BC
-04/08 David Rittenhouse born, 1732, astronomer & mathematician
-04/09 Edward Muybridge born, 1830, motion-picture pioneer
-04/09 J. Presper Eckert born, 1919
-04/10 Commodore Matthew Calbraith Perry born, 1794
-04/10 William Booth born, 1829, founder of the Salvation Army
-04/13 Thomas Jefferson, 3rd President of the United States, born Shadwell
- Plantation, Albemarle County, Virginia, 1743
-04/14 Christian Huygen born, 1629, physicist & astronomer;
- discovered Saturn's rings
-04/15 Leonardo da Vinci born, 1452
-04/16 Charles (Charlie) Chaplin (Sir) born in London, 1889
-04/22 Kant born, 1724
-04/27 Louis Victor de Broglie born, 1774, physicist
-04/28 James Monroe, 5th President of the United States, born in Westmoreland
- County, Viriginia, 1758
-04/29 Jules Henri Poincare born, 1854, founder of topology
-04/29 William Randolph Hearst born in San Francisco, 1863
-04/30 Karl Friedrich Gauss born, 1777, mathematician & astronomer
-05/01 Little Walter (Marion Walter Jacobs) is born in Alexandria,
- Louisiana, 1930
-05/02 Dr. Benjamin Spock born, 1903
-05/04 Alice Liddell born, 1852, Alice's Adventures in Wonderland
- & Through the Looking-Glass
-05/09 Pinza died, 1957
-05/10 Fred Astaire (Frederick Austerlitz) born in Omaha, Nebraska, 1899
-05/11 Johnny Appleseed born, 1768
-05/12 Florence Nightingale born in Florence, Italy, 1820
-05/13 Arthur S. Sullivan born, 1842
-05/15 Mike Oldfield is born in Essex, England, 1953
-05/18 Pope John Paul II (Karol Wojtyla) born in Wadowice, Poland, 1920
-05/19 Ho Chi Minh born, 1890
-05/21 Plato (Aristocles) born in Athens(?), 427BC
-05/27 Hubert H. Humphrey born, 1911
-05/28 Dionne quintuplets born, 1934
-05/29 Gilbert Keith Chesterton born, 1874
-05/29 John Fitzgerald Kennedy, 35th President of the United States, born in
- Brookline, Massachusetts, 1917
-05/29 Patrick Henry born, 1736
-05/30 Mel (Melvin Jerome) Blanc born in San Francisco, 1908
-06/01 Brigham Young born, 1801
-06/01 Marilyn Monroe born, 1928
-06/02 Edward Elgar (Sir) born in Worcester, England, 1857
-06/03 Henry James born, 1811
-06/07 (Eugene Henri) Paul Gaugin born, 1848
-06/07 George Bryan "Beau" Brummel born, 1778
-06/07 Alan Mathison Turing died, 1954
-06/08 Frank Lloyd Wright born in Richland Center, Wisconsin, 1867
-06/13 Alexander the Great dies (323BC)
-06/15 Edward (Edvard Hagerup) Grieg born in Bergen, Norway, 1843
-06/16 Hammurabi the Great dies, Babylon, 1686 BC
-06/18 M.C. Escher born, 1898
-06/19 FreeBSD project born, 1993
-06/22 Carl Hubbell born, 1903
-06/22 Meryl Streep born in Summit, New Jersey, 1949
-06/22 Konrad Zuse born in Berlin, 1919
-06/23 Alan Mathison Turing born, 1912
-06/25 Eric Arthur Blair (a.k.a. George Orwell) born, 1903
-06/27 Helen Keller born, 1880
-07/03 Franz Kafka born, 1883
-07/04 Nathaniel Hawthorne born in Salem, Massachusetts, 1804
-07/04 John Adams and Thomas Jefferson die on same day, 1826
-07/06 (Helen) Beatrix Potter born, 1866
-07/06 John Paul Jones born, 1747
-07/07 P.T. Barnum dies, 1891
-07/08 Count Ferdinand von Zeppelin born, 1838
-07/10 John Calvin born, 1509
-07/11 John Quincy Adams, 6th President of the United States, born in
- Braintree, Massachusetts, 1767
-07/12 Henry David Thoreau born, 1817
-07/15 Clement Clarke Moore born, 1779, author of "A Visit from
- Saint Nicholas"
-07/18 Brian Auger is born in London, 1939
-07/25 Steve Goodman is born in Chicago, 1948
-07/29 Mussolini born, 1883
-07/30 Emily Bronte born, 1818
-07/30 Henry Ford born, 1863
-08/01 Herman Melville born, 1819
-08/03 Lenny Bruce dies of a morphine overdose, 1966
-08/06 Jonathan B. Postel is born in Altadena, California, 1943
-08/08 Dustin Hoffman born in Los Angeles, 1937
-08/12 Thomas Mann's Death, 1955
-08/13 Alfred Hitchcock born, 1899
-08/13 Annie Oakley born, 1860
-08/13 Fidel Castro born, 1927
-08/17 Mae West born, 1892
-08/18 Meriwether Lewis born, 1774
-08/20 Leon Trotsky assassinated, 1940
-08/21 Christopher Robin Milne born, 1920
-08/21 Winnie-the-Pooh (Edward Bear) born (given to Christopher Robin
- Milne), 1921
-08/23 Gene Kelly born, 1912
-08/27 Lyndon B. Johnson born, 1908
-08/29 Oliver Wendell Holmes born, 1809, physician & father of the jurist
-08/30 John W. Mauchly born, 1907
-09/05 King Louis XIV of France born, 1638
-09/05 Raquel Welch born, 1942
-09/06 Word is received that Perry has reached the North Pole and died, 1909
-09/07 James Fenimore Cooper born in Burlington, NJ, 1789
-09/07 Queen Elizabeth I of England born, 1533
-09/08 Richard ``the Lionheart'', king of England born in Oxford, 1157
-09/08 Peter Sellers born in Southsea, England, 1925
-09/09 Chinese Communist Party Chairman Mao Tse-Tung dies at age 82, 1976
-09/09 Dennis Ritchie born, 1941
-09/12 Jesse Owens born, 1913
-09/13 Walter Reed born, 1851
-09/15 Agatha Christie born in Torquay, England, 1890
-09/16 Allen Funt born in Brooklyn, NY, 1914
-09/18 Greta Garbo born, 1905
-09/18 Jimi Hendrix dies from an overdose, 1970
-09/20 Upton (Beall) Sinclair born, 1878
-09/21 H.G. (Herbert George) Wells born in Bromley, England, 1866
-09/21 Louis Joliet born, 1645
-09/22 President Garfield dies of wounds in Baltimore, 1881
-09/23 Augustus (Gaius Octavius) Caesar born in Rome, 63 BC
-09/23 Euripides born in Salamis, Greece, 480 BC
-09/24 F. Scott Fitzgerald born, 1896
-09/26 Johnny Appleseed born, 1774
-09/26 T.S. (Thomas Stearns) Eliot born in St. Louis, 1888
-09/27 Thomas Nast born, 1840
-09/28 Michelangelo Buonarroti born in Caprese, Italy, 1573
-09/28 Pompey (Gnaeus Pompeius Magnus) born in Rome, 106BC
-09/28 Seymour Cray born, 1925
-09/29 Gene Autry born, 1907
-10/01 Jimmy Carter, 39th President of United States, born in Plains, Georgia,
- 1924
-10/02 Aristotle dies of indigestion, 322 BC
-10/02 Mohandas K. Gandhi born at Porbandar, Kathiawad, India, 1869
-10/04 John V. Atanasoff born, 1903
-10/05 Ray Kroc (founder of McDonald's) born, 1902
-10/13 Lenny Bruce is born in New York City, 1925
-10/13 Virgil (Publius Vergilius Maro) born near Mantua, Italy, 70 BC
-10/14 Dwight David Eisenhower, 34th President of the United States, born in
- Denison, Texas, 1890
-10/14 William Penn born in London, 1644
-10/15 Pelham Grenville Wodehouse born, 1881
-10/16 Noah Webster born, 1758
-10/16 Oscar (Fingal O'Flahertie Wills) Wilde born in Dublin, 1854
-10/16 Dr. Jonathan B. Postel dies at age 55, 1998
-10/17 Richard Mentor Johnson born, 1780, 9th V.P. of U.S.
-10/21 Alfred Nobel born in Stockholm, 1833
-10/25 Pablo Picasso born in Malaga, Spain, 1881
-10/27 James Cook is born, 1728
-10/27 Theodore (Teddy) Roosevelt, 26th President of the United States, born
- New York, New York, 1858
-10/27 Gerald M. Weinberg born, 1933
-10/30 John Adams, 2nd President of the United States, born Quincy,
- Massachusetts 1735.
-10/31 Chiang Kai-Shek born, 1887
-10/31 Dale Evans born, 1912
-11/02 Daniel Boone born near Reading, PA, 1734
-11/04 King William III of Orange born, 1650
-11/05 Roy Rogers born, 1912
-11/09 Carl Sagan born, 1934
-11/10 Martin Luther born in Eisleben, Germany, 1483
-11/10 Soviet President Leonid Brezhnev dies at age 75, 1982
-11/11 Kurt Vonnegut, Jr, born in Indianapolis, 1922
-11/13 Robert Louis Stevenson born, 1850
-11/13 St. Augustine of Hippo born in Numidia, Algeria, 354
-11/18 Imogene Coca born, 1908
-11/18 William S. Gilbert born, 1836
-11/20 Robert Francis Kennedy (RFK) born in Boston, Massachusetts, 1925
-11/26 Charles Schulz born in Minneapolis, 1922
-11/26 Norbert Wiener born in Columbia, Missouri, 1894
-11/29 John Mayall is born in Cheshire, England, 1933
-11/30 Cleopatra died, 30 BC
-11/30 Mark Twain (Samuel Clemmens) born in Florida, Missouri, 1835
-12/01 Woody Allen (Allen Stuart Konigsberg) born in Brooklyn, NY, 1935
-12/04 Tommy Bolin dies of a heroin overdose in Miami, 1976
-12/05 Martin Van Buren, 8th President of the United States, born in
- Kinderhook, New York, 1837
-12/05 Walt (Walter Elias) Disney born in Chicago, 1901
-12/08 Horace (Quintus Horatius Flaccus) born in Venosa (Italy), 65BC
-12/08 James (Grover) Thurber born in Columbus, Ohio, 1894
-12/10 Emily Dickenson born, 1830
-12/12 E.G. Robinson born, 1893
-12/14 George Washington dies, 1799
-12/17 William Safire (Safir) born, 1929
-12/18 Konrad Zuse died in Hünfeld, 1995
-12/20 Carl Sagan died, 1996
-12/21 Benjamin Disraeli born, 1804
-12/22 Giacomo Puccini born, 1858
-12/23 Joseph Smith born, 1805
-12/25 Isaac Newton (Sir) born in Grantham, England, 1642
-12/26 Chas. Babbage born, 1791
-12/28 John von Neumann born, 1903
-
-#endif /* !_calendar_birthday_ */
diff --git a/usr.bin/calendar/calendars/calendar.christian b/usr.bin/calendar/calendars/calendar.christian
deleted file mode 100644
index 3365b07..0000000
--- a/usr.bin/calendar/calendars/calendar.christian
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Christian
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_christian_
-#define _calendar_christian_
-
-01/05 Last (twelfth) day of Christmastide
-01/06 Epiphany
-Easter-47 Shrove Tuesday / Mardi Gras (day before Ash Wednesday)
-Easter-46 Ash Wednesday (First day of Lent)
-Easter-7 Palm Sunday (7 days before Easter)
-Easter-3 Maundy Thursday (3 days before Easter)
-Easter-2 Good Friday (2 days before Easter)
-Easter Easter Sunday
-Easter+39 Ascension Day (10 days before Pentecost)
-Easter+49 Pentecost (Whitsunday)
-Easter+50 Whitmonday
-Easter+56 Trinity Sunday (7 days after Pentecost)
-Easter+60 Corpus Christi (11 days after Pentecost)
-05/28* Rogation Sunday
-10/18 Feast Day of St. Luke
-11/SunLast First Sunday of Advent (4th Sunday before Christmas)
-12/SunFirst First Sunday of Advent (4th Sunday before Christmas)
-12/06 St. Nicholas' Day
-12/24 Christmas Eve
-12/25 Christmastide begins: First day of Christmas
-12/26 Second day of Christmas (Boxing Day)
-
-#endif /* !_calendar_christian_ */
diff --git a/usr.bin/calendar/calendars/calendar.computer b/usr.bin/calendar/calendars/calendar.computer
deleted file mode 100644
index e8b22b4..0000000
--- a/usr.bin/calendar/calendars/calendar.computer
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Computer
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_computer_
-#define _calendar_computer_
-
-01/01 AT&T officially divests its local Bell companies, 1984
-01/01 The Epoch (Time 0 for UNIX systems, Midnight GMT, 1970)
-01/03 Apple Computer founded, 1977
-01/08 American Telephone and Telegraph loses antitrust case, 1982
-01/08 Herman Hollerith patents first data processing computer, 1889
-01/08 Justice Dept. drops IBM suit, 1982
-01/10 First CDC 1604 delivered to Navy, 1960
-01/16 Set uid bit patent issued, to Dennis Ritchie, 1979
-01/17 Justice Dept. begins IBM anti-trust suit, 1969 (drops it, January 8, 1982)
-01/24 DG Nova introduced, 1969
-01/25 First U.S. meeting of ALGOL definition committee, 1958
-01/26 EDVAC demonstrated, 1952
-01/31 Hewlett-Packard founded, 1939
-02/11 Last day of JOSS service at RAND Corp., 1966
-02/14 First micro-on-a-chip patented (TI), 1978
-02/15 ENIAC demonstrated, 1946
-03/01 First NPL (later PL/I) report published, 1964
-03/04 First Cray-1 shipped to Los Alamos
-03/09 "GOTO considered harmful" (E.J. Dijkstra) published in CACM, 1968
-03/14 LISP introduced, 1960
-03/28 DEC announces PDP-11, 1970
-03/31 Eckert-Mauchly Computer Corp. founded, Phila, 1946
-04/01 Yourdon, Inc. founded, 1974 (It figures.)
-04/03 IBM 701 introduced, 1953
-04/04 Tandy Corp. acquires Radio Shack, 1963 (9 stores)
-04/07 IBM announces System/360, 1964
-04/09 ENIAC Project begun, 1943
-04/28 Zilog Z-80 introduced, 1976
-05/06 EDSAC demonstrated, 1949
-05/01 First BASIC program run at Dartmouth, 1964
-05/16 First report on SNOBOL distributed (within BTL), 1963
-05/19 UNIX is 10000 days old, 1997
-05/21 DEC announces PDP-8, 1965
-05/22 Ethernet first described, 1973
-05/27 First joint meeting of U.S. and European ALGOL definition cte., 1958
-05/28 First meeting of COBOL definition cte. (eventually CODASYL), 1959
-05/30 Colossus Mark II, 1944
-06/02 First issue of Computerworld, 1967
-06/07 Alan Mathison Turing died, 1954
-06/10 First Apple II shipped, 1977
-06/15 UNIVAC I delivered to the Census Bureau, 1951
-06/16 First publicized programming error at Census Bureau, 1951
-06/23 IBM unbundles software, 1969
-06/23 Alan Mathison Turing born, 1912
-06/30 First advanced degree on computer related topic: to H. Karamanian,
- Temple Univ., Phila, 1948, for symbolic differentiation on the ENIAC
-07/08 Bell Telephone Co. formed (predecessor of AT&T), 1877
-07/08 CDC incorporated, 1957
-07/FriLast System Administrator Appreciation Day
-08/14 First Unix-based mallet created, 1954
-08/14 IBM PC announced, 1981
-08/22 CDC 6600 introduced, 1963
-08/23 DEC founded, 1957
-09/15 ACM founded, 1947
-09/20 Harlan Herrick runs first FORTRAN program, 1954
-10/02 First robotics-based CAM, 1939
-10/06 First GPSS manual published, 1961
-10/08 First VisiCalc prototype, 1978
-10/12 Univac gives contract for SIMULA compiler to Nygaard and Dahl, 1962
-10/14 British Computer Society founded, 1957
-10/15 First FORTRAN Programmer's Reference Manual published, 1956
-10/20 Zurich ALGOL report published, 1958
-10/25 DEC announces VAX-11/780
-11/04 UNIVAC I program predicts Eisenhower victory based on 7% of votes, 1952
-12/08 First Ph.D. awarded by Computer Science Dept, Univ. of Penna, 1965
-
-#endif /* !_calendar_computer_ */
diff --git a/usr.bin/calendar/calendars/calendar.croatian b/usr.bin/calendar/calendars/calendar.croatian
deleted file mode 100644
index 4431227..0000000
--- a/usr.bin/calendar/calendars/calendar.croatian
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * Croatian calendar files
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_croatian_
-#define _calendar_croatian_
-
-#include <hr_HR.ISO8859-2/calendar.all>
-
-#endif /* !_calendar_croatian_ */
diff --git a/usr.bin/calendar/calendars/calendar.dutch b/usr.bin/calendar/calendars/calendar.dutch
deleted file mode 100644
index 3094ddd..0000000
--- a/usr.bin/calendar/calendars/calendar.dutch
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * $FreeBSD$
- *
- * Originally submitted by Edwin Groothuis <edwin@FreeBSD.org>
- */
-
-LANG=nl_NL.ISO8859-15
-
-/*
- * Feestdagen
- */
-01/01 Nieuwjaar
-01/06 Driekoningen
-04/01 Een April
-04/30 Koninginendag
-05/01 Dag van de Arbeid
-05/04 Dodenherdenking
-05/05 Bevrijdingsdag
-10/04 Dierendag
-11/01 Allerheilingen
-11/02 Allerzielen
-11/11 Sint Maarten
-11/11 Elfde-van-de-elfde
-12/05 Sinterklaas avond
-12/15 Koninkrijksdag
-12/24 Kerstavond
-12/25 Eerste kerstdag
-12/26 Tweede kerstdag
-12/28 Feest der Onnozele Kinderen
-12/31 Oudjaar
-
-/*
- * Pasen gerelateerd
- */
-Easter-50 Carnaval
-Easter-49 Carnaval
-Easter-48 Carnaval
-Easter-47 Carnaval (Vastenavond)
-Easter-46 Aswoensdag
-Easter-7 Palmzondag
-Easter-3 Witte Donderdag
-Easter-2 Goede vrijdag
-Easter-1 Stille zaterdag
-Easter Eerste paasdag
-Easter+1 Tweede paasdag
-Easter+39 Hemelvaartsdag
-Easter+49 Eerste Pinksterdag
-Easter+50 Tweede Pinksterdag
-Easter+56 Trinitatis
-
-/*
- * Misc
- */
-05/SunSecond Moederdag
-06/SunThird Vaderdag
-09/TueThird Prinsjesdag
-
-/*
- * Het koningshuis
- */
-01/19 Prinses Margriet (1943)
-01/31 Koningin Beatrix (1938)
-02/17 Prins Willem III (1817 - 1890)
-02/18 Prinses Christina (1947)
-04/10 Prinses Ariane (2007)
-04/19 Prins Hendrik (1876 - 1934)
-04/27 Kroonprins Willem Alexander (1967)
-04/30 Koningin Juliana (1909 - 2004)
-04/30 Mr. Pieter van Vollenhoven (1939)
-05/17 Prinses Maxima (1971)
-06/26 Prinses Alexia (2005)
-06/29 Prins Bernhard (1911 - 2004)
-08/05 Prinses Irene (1939)
-08/31 Prinses Wilhelmina (1880 - 1962)
-09/06 Prins Claus (1925 - 2002)
-09/25 Prins Johan Friso (1968)
-10/11 Prins Constantijn (1969)
-12/07 Prinses Catharina-Amalia (2003)
diff --git a/usr.bin/calendar/calendars/calendar.freebsd b/usr.bin/calendar/calendars/calendar.freebsd
deleted file mode 100644
index 784cbd1..0000000
--- a/usr.bin/calendar/calendars/calendar.freebsd
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * FreeBSD
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_freebsd_
-#define _calendar_freebsd_
-
-01/01 Alexander Langer <alex@FreeBSD.org> born in Duesseldorf, Nordrhein-Westfalen, Germany, 1981
-01/02 Ion-Mihai "IOnut" Tetcu <itetcu@FreeBSD.org> born in Bucharest, Romania, 1980
-01/02 Patrick Li <pat@FreeBSD.org> born in Beijing, People's Republic of China, 1985
-01/03 Tetsurou Okazaki <okazaki@FreeBSD.org> born in Mobara, Chiba, Japan, 1972
-01/04 Hiroyuki Hanai <hanai@FreeBSD.org> born in Kagawa pre., Japan, 1969
-01/06 Philippe Audeoud <jadawin@FreeBSD.org> born in Bretigny-Sur-Orge, France, 1980
-01/08 Michael L. Hostbaek <mich@FreeBSD.org> born in Copenhagen, Denmark, 1977
-01/10 Jean-Yves Lefort <jylefort@FreeBSD.org> born in Charleroi, Belgium, 1980
-01/12 Yen-Ming Lee <leeym@FreeBSD.org> born in Taipei, Taiwan, Republic of China, 1977
-01/12 Ying-Chieh Liao <ijliao@FreeBSD.org> born in Taipei, Taiwan, Republic of China, 1979
-01/16 Ariff Abdullah <ariff@FreeBSD.org> born in Kuala Lumpur, Malaysia, 1978
-01/16 Dmitry Sivachenko <demon@FreeBSD.org> born in Moscow, USSR, 1978
-01/16 Vanilla I. Shu <vanilla@FreeBSD.org> born in Taipei, Taiwan, Republic of China, 1978
-01/18 Dejan Lesjak <lesi@FreeBSD.org> born in Ljubljana, Slovenia, Yugoslavia, 1977
-01/19 Marshall Kirk McKusick <mckusick@FreeBSD.org> born in Wilmington, Delaware, United States, 1954
-01/19 Marcelo S. Araujo <araujo@FreeBSD.org> born in Joinville, Santa Catarina, Brazil, 1981
-01/19 Ruslan Ermilov <ru@FreeBSD.org> born in Simferopol, USSR, 1974
-01/20 Poul-Henning Kamp <phk@FreeBSD.org> born in Korsoer, Denmark, 1966
-01/22 Johann Visagie <wjv@FreeBSD.org> born in Cape Town, South Africa, 1970
-01/23 Hideyuki KURASHINA <rushani@FreeBSD.org> born in Niigata, Japan, 1982
-01/24 Matteo Riondato <matteo@FreeBSD.org> born in Padova, Italy, 1986
-01/25 Bernd Walter <ticso@FreeBSD.org> born in Moers, Nordrhein-Westfalen, Germany, 1974
-01/26 Andrew Gallatin <gallatin@FreeBSD.org> born in Buffalo, New York, United States, 1970
-01/27 Nick Sayer <nsayer@FreeBSD.org> born in San Diego, California, United States, 1968
-01/27 Jacques Anthony Vidrine <nectar@FreeBSD.org> born in Baton Rouge, Louisiana, United States, 1971
-01/31 Hidetoshi Shimokawa <simokawa@FreeBSD.org> born in Yokohama, Kanagawa, Japan, 1970
-02/01 Doug Rabson <dfr@FreeBSD.org> born in London, England, 1966
-02/01 Nicola Vitale <nivit@FreeBSD.org> born in Busto Arsizio, Varese, Italy, 1976
-02/01 Paul Saab <ps@FreeBSD.org> born in Champaign-Urbana, Illinois, United States, 1978
-02/01 Martin Wilke <miwi@FreeBSD.org> born in Ludwigsfelde, Brandenburg, Germany, 1980
-02/01 Christian Brueffer <brueffer@FreeBSD.org> born in Gronau, Nordrhein-Westfalen, Germany, 1982
-02/01 Juli Mallett <jmallett@FreeBSD.org> born in Washington, Pennsylvania, United States, 1985
-02/02 Michael W Lucas <mwlucas@FreeBSD.org> born in Detroit, Michigan, United States, 1967
-02/02 Diomidis D. Spinellis <dds@FreeBSD.org> born in Athens, Greece, 1967
-02/02 Yoichi Nakayama <yoichi@FreeBSD.org> born in Tsu, Mie, Japan, 1976
-02/05 Frank Laszlo <laszlof@FreeBSD.org> born in Howell, Michigan, United States, 1983
-02/10 David Greenman <dg@FreeBSD.org> born in Portland, Oregon, United States, 1968
-02/10 Paul Richards <paul@FreeBSD.org> born in Ammanford, Carmarthenshire, United Kingdom, 1968
-02/10 Simon Barner <barner@FreeBSD.org> born in Rosenheim, Bayern, Germany, 1980
-02/13 Jesper Skriver <jesper@FreeBSD.org> born in Aarhus, Denmark, 1975
-02/13 Andrey Slusar <anray@FreeBSD.org> born in Odessa, USSR, 1979
-02/13 David W. Chapman Jr. <dwcjr@FreeBSD.org> born in Bethel, Connecticut, United States, 1981
-02/14 Erwin Lansing <erwin@FreeBSD.org> born in 's-Hertogenbosch, the Netherlands, 1975
-02/14 Manolis Kiagias <manolis@FreeBSD.org> born in Chania, Greece, 1970
-02/14 Martin Blapp <mbr@FreeBSD.org> born in Olten, Switzerland, 1976
-02/19 Murray Stokely <murray@FreeBSD.org> born in Jacksonville, Florida, United States, 1979
-02/20 Anders Nordby <anders@FreeBSD.org> born in Oslo, Norway, 1976
-02/21 Alexey Zelkin <phantom@FreeBSD.org> born in Simferopol, Ukraine, 1978
-02/22 Brooks Davis <brooks@FreeBSD.org> born in Longview, Washington, United States, 1976
-02/22 Jake Burkholder <jake@FreeBSD.org> born in Maynooth, Ontario, Canada, 1979
-02/23 Peter Wemm <peter@FreeBSD.org> born in Perth, Western Australia, Australia, 1971
-02/23 Mathieu Arnold <mat@FreeBSD.org> born in Champigny sur Marne, Val de Marne, France, 1978
-02/24 Johan Karlsson <johan@FreeBSD.org> born in Mariannelund, Sweden, 1974
-02/24 Colin Percival <cperciva@FreeBSD.org> born in Burnaby, Canada, 1981
-02/26 Pietro Cerutti <gahr@FreeBSD.org> born in Faido, Switzerland, 1984
-02/28 Daichi GOTO <daichi@FreeBSD.org> born in Shimizu Suntou, Shizuoka, Japan, 1980
-03/01 Hye-Shik Chang <perky@FreeBSD.org> born in Daejeon, Republic of Korea, 1980
-03/02 Cy Schubert <cy@FreeBSD.org> born in Edmonton, Alberta, Canada, 1956
-03/03 Sergey Matveychuk <sem@FreeBSD.org> born in Moscow, Russian Federation, 1973
-03/03 Doug White <dwhite@FreeBSD.org> born in Eugene, Oregon, United States, 1977
-03/03 Gordon Tetlow <gordon@FreeBSD.org> born in Reno, Nevada, United States, 1978
-03/04 Oleksandr Tymoshenko <gonzo@FreeBSD.org> born in Chernihiv, Ukraine, 1980
-03/05 Philip Paeps <philip@FreeBSD.org> born in Leuven, Belgium, 1983
-03/05 Ulf Lilleengen <lulf@FreeBSD.org> born in Hamar, Norway, 1985
-03/06 Christopher Piazza <cpiazza@FreeBSD.org> born in Kamloops, British Columbia, Canada, 1981
-03/07 Michael P. Pritchard <mpp@FreeBSD.org> born in Los Angeles, California, United States, 1964
-03/07 Giorgos Keramidas <keramida@FreeBSD.org> born in Athens, Greece, 1976
-03/10 Andreas Klemm <andreas@FreeBSD.org> born in Duesseldorf, Nordrhein-Westfalen, Germany, 1963
-03/11 Soeren Straarup <xride@FreeBSD.org> born in Andst, Denmark, 1978
-03/12 Greg Lewis <glewis@FreeBSD.org> born in Adelaide, South Australia, Australia, 1969
-03/13 Alexander Leidinger <netchild@FreeBSD.org> born in Neunkirchen, Saarland, Germany, 1976
-03/13 Will Andrews <will@FreeBSD.org> born in Pontiac, Michigan, United States, 1982
-03/15 Paolo Pisati <piso@FreeBSD.org> born in Lodi, Italy, 1977
-03/15 Brian Fundakowski Feldman <green@FreeBSD.org> born in Alexandria, Virginia, United States, 1983
-03/17 Michael Smith <msmith@FreeBSD.org> born in Bankstown, New South Wales, Australia, 1971
-03/17 Alexander Motin <mav@FreeBSD.org> born in Simferopol, Ukraine, 1979
-03/18 Koop Mast <kwm@FreeBSD.org> born in Dokkum, the Netherlands, 1981
-03/19 Mikhail Teterin <mi@FreeBSD.org> born in Kyiv, Ukraine, 1972
-03/20 MANTANI Nobutaka <nobutaka@FreeBSD.org> born in Hiroshima, Japan, 1978
-03/20 Cameron Grant <cg@FreeBSD.org> died in Hemel Hempstead, United Kingdom, 2005
-03/20 Henrik Brix Andersen <brix@FreeBSD.org> born in Aarhus, Denmark, 1978
-03/22 Brad Davis <brd@FreeBSD.org> born in Farmington, New Mexico, United States, 1983
-03/23 Daniel C. Sobral <dcs@FreeBSD.org> born in Brasilia, Distrito Federal, Brazil, 1971
-03/23 Benno Rice <benno@FreeBSD.org> born in Adelaide, South Australia, Australia, 1977
-03/24 Marcel Moolenaar <marcel@FreeBSD.org> born in Hilversum, the Netherlands, 1968
-03/24 Emanuel Haupt <ehaupt@FreeBSD.org> born in Zurich, Switzerland, 1979
-03/25 Andrew R. Reiter <arr@FreeBSD.org> born in Springfield, Massachusetts, United States, 1980
-03/27 Josef El-Rayes <josef@FreeBSD.org> born in Linz, Austria, 1982
-03/28 Sean C. Farley <scf@FreeBSD.org> born in Indianapolis, Indiana, United States, 1970
-03/29 Thierry Thomas <thierry@FreeBSD.org> born in Luxeuil les Bains, France, 1961
-04/01 Matthew Jacob <mjacob@FreeBSD.org> born in San Francisco, California, United States, 1958
-04/01 Bill Fenner <fenner@FreeBSD.org> born in Bellefonte, Pennsylvania, United States, 1971
-04/01 Peter Edwards <peadar@FreeBSD.org> born in Dublin, Ireland, 1973
-04/03 Hellmuth Michaelis <hm@FreeBSD.org> born in Kiel, Schleswig-Holstein, Germany, 1958
-04/03 Tong Liu <nemoliu@FreeBSD.org> born in Beijing, People's Republic of China, 1981
-04/03 Gabor Pali <pgj@FreeBSD.org> born in Kunhegyes, Hungary, 1982
-04/05 Stacey Son <sson@FreeBSD.org> born in Burley, Idaho, United States. 1967
-04/08 Jordan K. Hubbard <jkh@FreeBSD.org> born in Honolulu, Hawaii, United States, 1963
-04/09 Ceri Davies <ceri@FreeBSD.org> born in Haverfordwest, Pembrokeshire, United Kingdom, 1976
-04/11 Bruce A. Mah <bmah@FreeBSD.org> born in Fresno, California, United States, 1969
-04/12 Patrick Gardella <patrick@FreeBSD.org> born in Columbus, Ohio, United States, 1967
-04/12 Ed Schouten <ed@FreeBSD.org> born in Oss, the Netherlands, 1986
-04/13 Oliver Braun <obraun@FreeBSD.org> born in Nuremberg, Bavaria, Germany, 1972
-04/14 Crist J. Clark <cjc@FreeBSD.org> born in Milwaukee, Wisconsin, United States, 1970
-04/15 David Malone <dwmalone@FreeBSD.org> born in Dublin, Ireland, 1973
-04/17 Dryice Liu <dryice@FreeBSD.org> born in Jinan, Shandong, China, 1975
-04/22 Joerg Wunsch <joerg@FreeBSD.org> born in Dresden, Sachsen, Germany, 1962
-04/22 Jun Kuriyama <kuriyama@FreeBSD.org> born in Matsue, Shimane, Japan, 1973
-04/29 Adam Weinberger <adamw@FreeBSD.org> born in Berkeley, California, United States, 1980
-04/29 Eric Anholt <anholt@FreeBSD.org> born in Portland, Oregon, United States, 1983
-05/01 Randall Stewart <rrs@FreeBSD.org> born in Spokane, Washington, United States, 1959
-05/02 Wojciech A. Koszek <wkoszek@FreeBSD.org> born in Czestochowa, Poland, 1987
-05/03 Brian Dean <bsd@FreeBSD.org> born in Elkins, West Virginia, United States, 1966
-05/03 Robert Nicholas Maxwell Watson <rwatson@FreeBSD.org> born in Harrow, Middlesex, United Kingdom, 1977
-05/04 Denis Peplin <den@FreeBSD.org> born in Nizhniy Novgorod, Russian Federation, 1977
-05/08 Kirill Ponomarew <krion@FreeBSD.org> born in Volgograd, Russian Federation, 1977
-05/08 Sean Kelly <smkelly@FreeBSD.org> born in Walnut Creek, California, United States, 1982
-05/09 Daniel Eischen <deischen@FreeBSD.org> born in Syracuse, New York, United States, 1963
-05/09 Aaron Dalton <aaron@FreeBSD.org> born in Boise, Idaho, United States, 1973
-05/10 Markus Brueffer <markus@FreeBSD.org> born in Gronau, Nordrhein-Westfalen, Germany, 1977
-05/11 Jesus Rodriguez <jesusr@FreeBSD.org> born in Barcelona, Spain, 1972
-05/11 Roman Kurakin <rik@FreeBSD.org> born in Moscow, USSR, 1979
-05/13 Pete Fritchman <petef@FreeBSD.org> born in Lansdale, Pennsylvania, United States, 1983
-05/14 Tatsumi Hosokawa <hosokawa@FreeBSD.org> born in Tokyo, Japan, 1968
-05/14 Shigeyuku Fukushima <shige@FreeBSD.org> born in Osaka, Japan, 1974
-05/16 Johann Kois <jkois@FreeBSD.org> born in Wolfsberg, Austria, 1975
-05/16 Marcus Alves Grando <mnag@FreeBSD.org> born in Florianopolis, Santa Catarina, Brazil, 1979
-05/17 Thomas Abthorpe <tabthorpe@FreeBSD.org> born in Port Arthur, Ontario, Canada, 1968
-05/19 Philippe Charnier <charnier@FreeBSD.org> born in Fontainebleau, France, 1966
-05/19 Ian Dowse <iedowse@FreeBSD.org> born in Dublin, Ireland, 1975
-05/21 Kris Kennaway <kris@FreeBSD.org> born in Winnipeg, Manitoba, Canada, 1978
-05/22 Clive Tong-I Lin <clive@FreeBSD.org> born in Changhua, Taiwan, Republic of China, 1978
-05/22 Michael Bushkov <bushman@FreeBSD.org> born in Rostov-on-Don, Russia, 1985
-05/22 Rui Paulo <rpaulo@FreeBSD.org>, born in Evora, Portugal, 1986
-05/23 Munechika Sumikawa <sumikawa@FreeBSD.org> born in Osaka, Osaka, Japan, 1972
-05/24 Duncan McLennan Barclay <dmlb@FreeBSD.org> born in London, Middlesex, United Kingdom, 1970
-05/24 Oliver Lehmann <oliver@FreeBSD.org> born in Karlsburg, Germany, 1981
-05/25 Tom Rhodes <trhodes@FreeBSD.org> born in Ellwood City, Pennsylvania, United States, 1981
-05/26 Jim Pirzyk <pirzyk@FreeBSD.org> born in Chicago, Illinois, United States, 1968
-05/27 Ollivier Robert <roberto@FreeBSD.org> born in Paris, France, 1967
-05/29 Wilko Bulte <wilko@FreeBSD.org> born in Arnhem, the Netherlands, 1965
-05/29 Seigo Tanimura <tanimura@FreeBSD.org> born in Kitakyushu, Fukuoka, Japan, 1976
-05/31 Ville Skytta <scop@FreeBSD.org> born in Helsinki, Finland, 1974
-06/02 Jean-Marc Zucconi <jmz@FreeBSD.org> born in Pontarlier, France, 1954
-06/02 Alexander Botero-Lowry <alexbl@FreeBSD.org> born in Austin, TX, USA, 1986
-06/03 CHOI Junho <cjh@FreeBSD.org> born in Seoul, Korea, 1974
-06/04 Julian Elischer <julian@FreeBSD.org> born in Perth, Australia, 1959
-06/04 Jason Evans <jasone@FreeBSD.org> born in Greeley, Colorado, United States, 1973
-06/04 Justin Gibbs <gibbs@FreeBSD.org> born in San Pedro, California, United States, 1973
-06/04 Thomas Moestl <tmm@FreeBSD.org> born in Braunschweig, Niedersachsen, Germany, 1980
-06/06 Sergei Kolobov <sergei@FreeBSD.org> born in Karpinsk, Russian Federation, 1972
-06/06 Alan Eldridge <alane@FreeBSD.org> died in Denver, Colorado, 2003
-06/07 Benjamin Close <benjsc@FreeBSD.org> born in Adelaide, Australia, 1978
-06/07 Jimmy Olgeni <olgeni@FreeBSD.org> born in Milano, Italy, 1976
-06/17 Tilman Linneweh <arved@FreeBSD.org> born in Weinheim, Baden-Wuertemberg, Germany, 1978
-06/18 Li-Wen Hsu <lwhsu@FreeBSD.org> born in Taipei, Taiwan, Republic of China, 1984
-06/18 Roman Bogorodskiy <novel@FreeBSD.org> born in Saratov, Russian Federation, 1986
-06/19 Charlie Root <root@FreeBSD.org> born in Portland, Oregon, United States, 1993
-06/21 Ganbold Tsagaankhuu <ganbold@FreeBSD.org> born in Ulaanbaatar, Mongolia, 1971
-06/21 Niels Heinen <niels@FreeBSD.org> born in Markelo, the Netherlands, 1978
-06/24 Chris Faulhaber <jedgar@FreeBSD.org> born in Springfield, Illinois, United States, 1971
-06/26 Brian Somers <brian@FreeBSD.org> born in Dundrum, Dublin, Ireland, 1967
-06/28 Mark Santcroos <marks@FreeBSD.org> born in Rotterdam, the Netherlands, 1979
-06/28 Xin Li <delphij@FreeBSD.org> born in Beijing, People's Republic of China, 1982
-06/29 Wilfredo Sanchez Vega <wsanchez@FreeBSD.org> born in Majaguez, Puerto Rico, United States, 1972
-06/29 Daniel Harris <dannyboy@FreeBSD.org> born in Lubbock, Texas, United States, 1985
-06/29 Andrew Pantyukhin <sat@FreeBSD.org> born in Moscow, Russian Federation, 1985
-06/30 Guido van Rooij <guido@FreeBSD.org> born in Best, Noord-Brabant, the Netherlands, 1965
-07/01 Matthew Dillon <dillon@apollo.backplane.net> born in San Francisco, California, United States, 1966
-07/02 Mark Christopher Ovens <marko@FreeBSD.org> born in Preston, Lancashire, United Kingdom, 1958
-07/02 Vasil Venelinov Dimov <vd@FreeBSD.org> born in Shumen, Bulgaria, 1982
-07/04 Motoyuki Konno <motoyuki@FreeBSD.org> born in Musashino, Tokyo, Japan, 1969
-07/04 Florent Thoumie <flz@FreeBSD.org> born in Montmorency, Val d'Oise, France, 1982
-07/07 Andrew Thompson <thompsa@FreeBSD.org> born in Lower Hutt, Wellington, New Zealand, 1979
-07/07 Maxime Henrion <mux@FreeBSD.org> born in Metz, France, 1981
-07/07 George Reid <greid@FreeBSD.org> born in Frimley, Hampshire, United Kingdom, 1983
-07/10 Jung-uk Kim <jkim@FreeBSD.org> born in Seoul, Korea, 1971
-07/10 Justin Seger <jseger@FreeBSD.org> born in Harvard, Massachusetts, United States, 1981
-07/10 David Schultz <das@FreeBSD.org> born in Oakland, California, United States, 1982
-07/11 Jesus R. Camou <jcamou@FreeBSD.org> born in Hermosillo, Sonora, Mexico, 1983
-07/15 Gary Jennejohn <gj@FreeBSD.org> born in Rochester, New York, United States, 1950
-07/16 Suleiman Souhlal <ssouhlal@FreeBSD.org> born in Roma, Italy, 1983
-07/17 Michael Chin-Yuan Wu <keichii@FreeBSD.org> born in Taipei, Taiwan, Republic of China, 1980
-07/19 Masafumi NAKANE <max@FreeBSD.org> born in Okazaki, Aichi, Japan, 1972
-07/19 Simon L. Nielsen <simon@FreeBSD.org> born in Copenhagen, Denmark, 1980
-07/19 Gleb Smirnoff <glebius@FreeBSD.org> born in Kharkov, USSR, 1981
-07/22 James Housley <jeh@FreeBSD.org> born in Chicago, Illinois, United States, 1965
-07/22 Jens Schweikhardt <schweikh@FreeBSD.org> born in Waiblingen, Baden-Wuerttemberg, Germany, 1967
-07/22 Lukas Ertl <le@FreeBSD.org> born in Weissenbach/Enns, Steiermark, Austria, 1976
-07/23 Sergey A. Osokin <osa@FreeBSD.org> born in Krasnogorsky, Stepnogorsk, Akmolinskaya region, Kazakhstan, 1972
-07/24 Alexander Nedotsukov <bland@FreeBSD.org> born in Ulyanovsk, Russian Federation, 1974
-07/28 Jim Mock <jim@FreeBSD.org> born in Bethlehem, Pennsylvania, United States, 1974
-07/28 Tom Hukins <tom@FreeBSD.org> born in Manchester, United Kingdom, 1976
-07/29 Dirk Meyer <dinoex@FreeBSD.org> born in Kassel, Hessen, Germany, 1965
-07/29 Felippe M. Motta <lippe@FreeBSD.org> born in Maceio, Alagoas, Brazil, 1988
-08/02 Gabor Kovesdan <gabor@FreeBSD.org> born in Budapest, Hungary, 1987
-08/05 Alfred Perlstein <alfred@FreeBSD.org> born in Brooklyn, New York, United States, 1978
-08/06 Anton Berezin <tobez@FreeBSD.org> born in Dnepropetrovsk, Ukraine, 1970
-08/06 John-Mark Gurney <jmg@FreeBSD.org> born in Detroit, Michigan, United States, 1978
-08/07 Jonathan Mini <mini@FreeBSD.org> born in San Mateo, California, United States, 1979
-08/10 Peter Pentchev <roam@FreeBSD.org> born in Sofia, Bulgaria, 1977
-08/12 Joe Marcus Clarke <marcus@FreeBSD.org> born in Lakeland, Florida, United States, 1976
-08/14 Stefan Esser <se@FreeBSD.org> born in Cologne, Nordrhein-Westfalen, Germany, 1961
-08/17 Olivier Houchard <cognet@FreeBSD.org> born in Nancy, France, 1980
-08/19 Pav Lucistnik <pav@FreeBSD.org> born in Kutna Hora, Czech Republic, 1980
-08/19 Chin-San Huang <chinsan@FreeBSD.org> born in Yi-Lan, Taiwan, Republic of China, 1979
-08/20 Michael Heffner <mikeh@FreeBSD.org> born in Cleona, Pennsylvania, United States, 1981
-08/24 Mark Linimon <linimon@FreeBSD.org> born in Houston, Texas, United States, 1955
-08/25 Jean Milanez Melo <jmelo@FreeBSD.org> born in Divinopolis, Minas Gerais, Brazil, 1982
-08/25 Beech Rintoul <beech@FreeBSD.org> born in Oakland, California, United States, 1952
-08/26 Dima Ruban <dima@FreeBSD.org> born in Nalchik, USSR, 1970
-08/26 Marc Fonvieille <blackend@FreeBSD.org> born in Avignon, France, 1972
-08/26 Herve Quiroz <hq@FreeBSD.org> born in Aix-en-Provence, France, 1977
-08/27 Andrey Chernov <ache@FreeBSD.org> born in Moscow, USSR, 1966
-08/27 Tony Finch <fanf@FreeBSD.org> born in London, United Kingdom, 1974
-08/27 Michael Johnson <ahze@FreeBSD.org> born in Morganton, North Carolina, United States, 1980
-08/28 Norikatsu Shigemura <nork@FreeBSD.org> born in Fujisawa, Kanagawa, Japan, 1974
-08/29 Thomas Gellekum <tg@FreeBSD.org> born in Moenchengladbach, Nordrhein-Westfalen, Germany, 1967
-08/29 Max Laier <mlaier@FreeBSD.org> born in Karlsruhe, Germany, 1981
-09/01 Pyun YongHyeon <yongari@FreeBSD.org> born in Kimcheon, Korea, 1968
-09/03 Max Khon <fjoe@FreeBSD.org> born in Novosibirsk, USSR, 1976
-09/03 Cheng-Lung Sung <clsung@FreeBSD.org> born in Taipei, Taiwan, Republic of China, 1977
-09/05 Mark Robert Vaughan Murray <markm@FreeBSD.org> born in Harare, Mashonaland, Zimbabwe, 1961
-09/05 Adrian Harold Chadd <adrian@FreeBSD.org> born in Perth, Western Australia, Australia, 1979
-09/07 Tim Bishop <tdb@FreeBSD.org> born in Cornwall, United Kingdom, 1978
-09/08 Boris Samorodov <bsam@FreeBSD.org> born in Krasnodar, Russian Federation, 1963
-09/09 Yoshio Mita <mita@FreeBSD.org> born in Hiroshima, Japan, 1972
-09/10 Wesley R. Peters <wes@FreeBSD.org> born in Hartford, Alabama, United States, 1961
-09/12 Weongyo Jeong <weongyo@FreeBSD.org> born in Haman, Korea, 1980
-09/12 William C. Fumerola II <billf@FreeBSD.org> born in Detroit, Michigan, United States, 1981
-09/17 Maxim Bolotin <mb@FreeBSD.org> born in Rostov-on-Don, Russian Federation, 1976
-09/20 Kevin Lo <kevlo@FreeBSD.org> born in Taipei, Taiwan, Republic of China, 1972
-09/27 Neil Blakey-Milner <nbm@FreeBSD.org> born in Port Elizabeth, South Africa, 1978
-09/27 Renato Botelho <garga@FreeBSD.org> born in Araras, Sao Paulo, Brazil, 1979
-09/28 Greg Lehey <grog@FreeBSD.org> born in Melbourne, Victoria, Australia, 1948
-09/28 Alex Dupre <ale@FreeBSD.org> born in Milano, Italy, 1980
-09/29 Matthew Hunt <mph@FreeBSD.org> born in Johnstown, Pennsylvania, United States, 1976
-09/30 Hiten M. Pandya <hmp@FreeBSD.org> born in Dar-es-Salaam, Tanzania, East Africa, 1986
-10/05 Hiroki Sato <hrs@FreeBSD.org> born in Yamagata, Japan, 1977
-10/05 Chris Costello <chris@FreeBSD.org> born in Houston, Texas, United States, 1985
-10/09 Stefan Walter <stefan@FreeBSD.org> born in Werne, Nordrhein-Westfalen, 1978
-10/12 Pawel Jakub Dawidek <pjd@FreeBSD.org> born in Radzyn Podlaski, Poland, 1980
-10/15 Maxim Konovalov <maxim@FreeBSD.org> born in Khabarovsk, USSR, 1973
-10/16 Remko Lodder <remko@FreeBSD.org> born in Rotterdam, the Netherlands, 1983
-10/17 Maho NAKATA <maho@FreeBSD.org> born in Osaka, Japan, 1974
-10/18 Sheldon Hearn <sheldonh@FreeBSD.org> born in Cape Town, Western Cape, South Africa, 1974
-10/19 Nicholas Souchu <nsouch@FreeBSD.org> born in Suresnes, Hauts-de-Seine, France, 1972
-10/20 Joel Dahl <joel@FreeBSD.org> born in Lidkoping, Sweden, 1983
-10/20 Dmitry Marakasov <amdmi3@FreeBSD.org> born in Moscow, Russian Federation, 1984
-10/21 Dan Moschuk <dan@FreeBSD.org> born in Halifax, Nova Scotia, Canada, 1980
-10/21 Ben Smithurst <ben@FreeBSD.org> born in Sheffield, South Yorkshire, United Kingdom, 1981
-10/22 Jean-Sebastien Pedron <dumbbell@FreeBSD.org> born in Redon, Ille-et-Vilaine, France, 1980
-10/23 Mario Sergio Fujikawa Ferreira <lioux@FreeBSD.org> born in Brasilia, Distrito Federal, Brazil, 1976
-10/25 Eric Melville <eric@FreeBSD.org> born in Los Gatos, California, United States, 1980
-10/26 Philip M. Gollucci <pgollucci@FreeBSD.org> born in Silver Spring, Maryland, United States, 1979
-10/27 Takanori Watanabe <takawata@FreeBSD.org> born in Numazu, Shizuoka, Japan, 1972
-11/05 M. Warner Losh <imp@FreeBSD.org> born in Kansas City, Kansas, United States, 1966
-11/09 Coleman Kane <cokane@FreeBSD.org> born in Cincinnati, OH, United States, 1980
-11/09 Antoine Brodin <antoine@FreeBSD.org> born in Bagnolet, France, 1981
-11/10 Gregory Neil Shapiro <gshapiro@FreeBSD.org> born in Providence, Rhode Island, United States, 1970
-11/13 John Baldwin <jhb@FreeBSD.org> born in Stuart, Virginia, United States, 1977
-11/15 Lars Engels <lme@FreeBSD.org> born in Hilden, Nordrhein-Westfalen, Germany, 1980
-11/16 Jose Maria Alcaide Salinas <jmas@FreeBSD.org> born in Madrid, Spain, 1962
-11/17 Ralf S. Engelschall <rse@FreeBSD.org> born in Dachau, Bavaria, Germany, 1972
-11/18 Thomas Quinot <thomas@FreeBSD.org> born in Paris, France, 1977
-11/19 Konstantin Belousov <kib@FreeBSD.org> born in Kiev, USSR, 1972
-11/20 Dmitry Morozovsky <marck@FreeBSD.org> born in Moscow, USSR, 1968
-11/23 Josef Lawrence Karthauser <joe@FreeBSD.org> born in Pembury, Kent, United Kingdom, 1972
-11/24 Andrey Zakhvatov <andy@FreeBSD.org> born in Chelyabinsk, Russian Federation, 1974
-11/24 Daniel Gerzo <danger@FreeBSD.org> born in Bratislava, Slovakia, 1986
-11/28 Nik Clayton <nik@FreeBSD.org> born in Peterborough, United Kingdom, 1973
-11/28 Stanislav Sedov <stas@FreeBSD.org> born in Chelyabinsk, USSR, 1985
-12/01 Hajimu Umemoto <ume@FreeBSD.org> born in Nara, Japan, 1961
-12/01 Alexey Dokuchaev <danfe@FreeBSD.org> born in Magadan, USSR, 1980
-12/02 Ermal Luçi <eri@FreeBSD.org> born in Tirane, Albania, 1980
-12/03 Diane Bruce <db@FreeBSD.org> born in Ottawa, Ontario, Canada, 1952
-12/05 Ivan Voras <ivoras@FreeBSD.org> born in Slavonski Brod, Croatia, 1981
-12/06 Stefan Farfeleder <stefanf@FreeBSD.org> born in Wien, Austria, 1980
-12/15 James FitzGibbon <jfitz@FreeBSD.org> born in Amersham, Buckinghamshire, United Kingdom, 1974
-12/15 Timur I. Bakeyev <timur@FreeBSD.org> born in Kazan, Republic of Tatarstan, USSR, 1974
-12/18 Chris Timmons <cwt@FreeBSD.org> born in Ellensburg, Washington, United States, 1964
-12/18 Dag-Erling Smorgrav <des@FreeBSD.org> born in Brussels, Belgium, 1977
-12/18 Semen Ustimenko <semenu@FreeBSD.org> born in Novosibirsk, Russian Federation, 1979
-12/21 Rong-En Fan <rafan@FreeBSD.org> born in Taipei, Taiwan, Republic of China, 1982
-12/22 Maxim Sobolev <sobomax@FreeBSD.org> born in Dnepropetrovsk, Ukraine, 1976
-12/23 Sean Chittenden <seanc@FreeBSD.org> born in Seattle, Washington, United States, 1979
-12/23 Alejandro Pulver <alepulver@FreeBSD.org> born in Buenos Aires, Argentina, 1989
-12/28 Soren Schmidt <sos@FreeBSD.org> born in Maribo, Denmark, 1960
-12/28 Ade Lovett <ade@FreeBSD.org> born in London, England, 1969
-12/28 Marius Strobl <marius@FreeBSD.org> born in Cham, Bavaria, Germany, 1978
-12/31 Edwin Groothuis <edwin@FreeBSD.org> born in Geldrop, the Netherlands, 1970
-
-#endif /* !_calendar_freebsd_ */
diff --git a/usr.bin/calendar/calendars/calendar.french b/usr.bin/calendar/calendars/calendar.french
deleted file mode 100644
index 18b4d8a..0000000
--- a/usr.bin/calendar/calendars/calendar.french
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * French calendar file(s)
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_french_
-#define _calendar_french_
-
-#include <fr_FR.ISO8859-1/calendar.all>
-
-#endif /* !_calendar_french_ */
diff --git a/usr.bin/calendar/calendars/calendar.german b/usr.bin/calendar/calendars/calendar.german
deleted file mode 100644
index 635aef1..0000000
--- a/usr.bin/calendar/calendars/calendar.german
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * German calendar file(s)
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_german_
-#define _calendar_german_
-
-#include <de_DE.ISO8859-1/calendar.all>
-
-#endif /* !_calendar_german_ */
diff --git a/usr.bin/calendar/calendars/calendar.history b/usr.bin/calendar/calendars/calendar.history
deleted file mode 100644
index 80b5173..0000000
--- a/usr.bin/calendar/calendars/calendar.history
+++ /dev/null
@@ -1,476 +0,0 @@
-/*
- * History
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_history_
-#define _calendar_history_
-
-01/01 Anniversary of the Triumph of the Revolution in Cuba
-01/01 Castro expels Cuban President Batista, 1959
-01/01 Churchill delivers his "Iron Curtain" speech, 1947
-01/01 First Rose Bowl; Michigan 49 - Stanford 0, 1902
-01/04 Quadrantid meteor shower (look north)
-01/05 -50 degrees F, Strawberry UT, 1913
-01/05 The FCC hears the first demonstration of FM radio, 1940
-01/05 Twelfth night
-01/06 Millard Fillmore's birthday (let's party!)
-01/08 Battle of New Orleans
-01/09 Plough Monday
-01/10 First meeting of United Nations General Assembly in London, 1946
-01/10 Thomas Paine's Common Sense published, 1776
-01/11 Anniversary of the Peoples Republic of Albania
-01/11 De Hostos' Birthday in Puerto Rico
-01/11 Milk delivered in bottles for first time, 1878
-01/11 Prithvi Jayanti in Nepal
-01/11 Surgeon General condemned cigarettes, 1964
-01/11 The Whiskey-A-Go-Go opens on Sunset Boulevard in Los Angeles, 1963
-01/14 The first "Be-In" is held in Golden Gate Park, 1967
-01/16 Prohibition begins, 1920
-01/18 Grey whale migration, California
-01/20 St. Agnes Eve (Ah, bitter chill it was...)
-01/24 Eskimo Pie patented by Christian Nelson, 1922
-01/24 Gold discovered in California at Sutter's Mill, 1848
-01/26 Sydney, New South Wales settled, 1788
-01/27 Grissom, White and Chaffe burned to death in Apollo 1, 1967
-01/27 Vietnam War cease-fire signed, 1973
-01/28 First ski tow, Woodstock VT, 1914
-01/28 Space Shuttle Challenger (51-L) explodes 74 seconds after liftoff
- killing Scobee, Smith, McNair, Resnick, Jarvis, Onizuka and McAuliffe,
- 1986
-01/30 Mohandas Gandhi assassinated in New Delhi by Hindu fanatic, 1948
-01/30 Tet Offensive, 1968
-01/31 "Ham" the chimpanzee soars into space aboard Mercury-Redstone 2, 1961
-01/31 Explorer I launched, 1958. Van Allen Belt discovered
-01/31 Irving Langmuir, 1881, invented tungsten filament lamp
-02/01 First TV soap: Secret Storm, 1954
-02/01 Forces led by Khomeini take over Iran, 1979
-02/01 Space Shuttle Columbia (STS-107) disintegrates 15 minutes before landing
- killing Husband, McCool, Chawla, Clark, Ramon, Brown, and Anderson, 2003
-02/04 Cybernet inaugurated, 1969
-02/04 Patricia Hearst kidnapped by Symbionese Liberation Army, 1974
-02/08 1963 Revolution Anniversary in Iraq
-02/09 -51 degrees F, Vanderbilt MI, 1934
-02/12 US President Abraham Lincoln's real birthday
-02/12 Santa Barbara oil leak, 1969
-02/14 Bombing of Dresden, 1945
-02/15 Chicago Seven convicted, 1970
-02/16 Nylon patented, 1937
-02/16 Stephen Decatur burns US frigate in Tripoli, 1804
-02/18 Pluto discovered by Clyde Tombaugh, Lowell Observatory, AZ, 1930
-02/19 US Marines land on Iwo Jima, 1945
-02/20 John Glenn orbits the Earth 3 times, 1962
-02/21 Battle of Verdun begins, 1916 1M casualties
-02/21 First telephone directory, New Haven, Connecticut, 1878
-02/21 Malcom X shot to death in Harlem, 1965
-02/23 Lt. Calley confesses, implicates Cpt. Medina, 1971
-02/24 Impeachment proceedings against Andrew Johnson begin, 1868
-02/28 The "French Connection" drug bust occurs in Marseilles, 1972
-02/29 French and Indian raid on Deerfield MA, 1704
-03/01 Sarah Goode, Sarah Osborne, and Tituba arrested for witchcraft
- in Salem, Massachusetts, 1692
-03/02 Blackthorn winds (New England) (Does anyone know what this is?)
-03/04 First meeting of Congress, 1789, in N.Y.C.
-03/13 "Striptease" introduced, Paris, 1894
-03/14 Teddy Roosevelt excludes Japanese laborers from continental US, 1907
-03/15 Day of the 1848 revolution in Hungary
-03/15 Buzzards return to Hinckley OH
-03/15 France assumes protectorate over Vietnam, 1874
-03/15 Watts, Los Angeles, riots kill two, injure 25, 1966
-03/15 Ides of March. Gaius Julius Caesar assassinated by senators,
- including adoptive son Marcus Junius Brutus Caepio, 44BC
-03/16 First liquid-fuel-powered rocket flight, 1926
-03/16 MyLai Massacre; 300 non-combatant villagers killed by US infantrymen
-03/16 Robert Goddard launches first liquid-fueled rocket, Auburn MA, 1926
-03/17 Vanguard I launched, 1958. Earth proved pear-shaped
-03/18 Aleksei Leonov performs first spacewalk, 1965
-03/19 Swallows return to Capistrano
-03/20 Radio Caroline, the original British pirate radio station, sinks, 1980
-03/24 Construction of New York subway system begins, 1900
-03/25 Triangle Shirt Waist Fire, 1911
-03/26 Popeye statue unveiled, Crystal City TX Spinach Festival, 1937
-03/27 Khrushchev becomes Premier of Soviet Union, 1958
-03/28 Three Mile Island releases radioactive gas, 1979
-03/29 Swedish settled Christiana (Wilmington) DE, 1638
-03/30 Alaska purchased from Russia for $7.2 million, 1867
-03/30 Five rings around Uranus discovered, 1977
-03/30 Pencil with eraser patented, 1858
-04/01 People of superb intelligence, savoir-faire, etc. born this day.
-04/04 Martin Luther King assassinated in Memphis, Tennessee, 1968
-04/04 NATO Established, 1949
-04/06 Joseph Smith founds Mormon Church, 1830
-04/07 Albert Hofmann synthesizes LSD in Switzerland, 1943
-04/07 Alewives run, Cape Cod
-04/08 Matthew Flinders and Nicolas Baudin meet in Encounter Bay, 1802
-04/09 Lee surrenders to Grant at Appomattox Courthouse, 1865
-04/12 Confederate troops fire first shots of Civil War at Ft Sumter, 1861
-04/12 Space Shuttle Columbia launched, 1981
-04/12 Yuri Gagarin becomes the first man in space, 1961
-04/13 Laotian New Year (3 days) in Laos
-04/14 US President Abraham Lincoln shot in Ford's Theatre by John Wilkes Booth, 1865
-04/14 Titanic hits iceberg and sinks, 1912
-04/15 US President Abraham Lincoln dies, 1865
-04/15 Ray Kroc opens first McDonalds in Des Plaines, IL, 1955
-04/17 Bay of Pigs invasion crushed by Castro forces, 1961
-04/18 Einstein's Death, 1955
-04/18 First Laundromat opens, Fort Worth Texas, 1934
-04/18 San Francisco earthquake, 1906
-04/19 Landing of the "33" in Uruguay
-04/19 Warsaw Ghetto uprising, 1943
-04/20 Supreme Court unanimously rules in favor of busing, 1971
-04/21 Lyrid meteor shower
-04/22 Vladimir Ilich Ulyanov, called Lenin, Russian political leader, born in Simbirsk, 1870
-04/23 Hank Aaron hits his first home run, 1954
-04/26 William Shakespeare baptized in Stratford-on-Avon, England, 1564,
- birthdate unknown
-04/27 Magellan killed in Philippines, 1521
-04/29 Zipper patented by Gideon Sindback, 1913
-05/01 Beltaine; Feast of the god Bel, sun god
-05/03 Anti-war protest disrupts business in Washington, 1971
-05/04 Four Kent State students are shot down by the National Guard, 1970
-05/05 John Scopes arrested for teaching evolution, Dayton, TN, 1925
-05/06 Hindenburg explodes and burns upon landing at Lakehurst, NJ, 1937
-05/07 Germany surrenders after WWII, 1945
-05/08 Beginning of ostrich mating season
-05/08 US institutes mining of Haiphong Harbor, 1972
-05/09 94 degrees, New York, 1979
-05/10 Germany invades Low Countries, 1940
-05/10 Nazi bookburning, 1933
-05/14 Beginning of Lewis and Clark Expedition, 1804
-05/14 Nation of Israel proclaimed, 1948
-05/15 Asylum for Inebriates founded, Binghamton NY, 1854
-05/17 24" rain in 11 hours, Pearl River, S. China, 1982
-05/17 Six SLA members killed in televised gun fight, 1974
-05/18 Battle of Las Piedras in Uruguay
-05/18 Napoleon crowned Emperor, 1804
-05/21 Battle of Iquique in Chile
-05/21 US explodes first hydrogen bomb, 1956
-05/22 US Civil War ends, 1865
-05/23 Israeli raid into Argentina to capture Adolf Eichmann, 1960
-05/23 Two Yetis sighted, Mt. Everest, 1953
-05/23 Federal Republic of Germany founded, 1949
-05/24 Battle of Pinchincha in Ecuador
-05/25 Oral Roberts sees 900 foot tall Jesus Christ, Tulsa OK, 1980
-05/25 Successful test of the limelight in Purfleet, England, 1830
-05/26 Congress sets first immigration quotas, 1924
-05/27 Golden Gate Bridge opens, 1937
-05/29 Edmund Hillary and Tenzing Norkay climb Mt. Everest, 1953
-05/29 First food stamps issued, 1961
-05/30 US Marines sent to Nicaragua, 1912
-06/02 Native Americans "granted" citizenship, 1924
-06/04 Roquefort cheese developed, 1070
-06/05 Robert Kennedy assassinated, 1968
-06/05 US leaves the Gold Standard, 1933
-06/06 First drive-in movie, 1933
-06/06 Normandy landing, 1944
-06/10 Death of Alexander the Great, 323 B.C.
-06/10 Denver police tear gas Jethro Tull and 2000 fans at Red Rocks, 1971
-06/11 Greeks seize Troy, 1184BC
-06/13 Pioneer flies past Neptune, and therefore out of the Solar System
-06/14 Sandpaper invented by I. Fischer, Jr., 1834
-06/15 Ben Franklin's kite experiment, 1752
-06/15 Magna Carta signed, 1215
-06/15 Series of photographs by Edward Muggeridge prove to Leland Stanford
- that all the hooves of a horse are off the ground during the gallop,
- 1878
-06/16 "The Blues Brothers" premieres in Chicago, 1980
-06/17 China explodes its first Hydrogen bomb, 1967
-06/17 Watergate Democratic National Committee break-in, 1972
-06/19 Julius and Ethel Rosenberg are executed in Sing-Sing prison, 1953
-06/19 Lizzie Bordon acquitted, 1893
-06/20 Victoria crowned, 1837
-06/21 Berlin airlift begins, 1948
-06/21 Sun rises over Heelstone at Stonehenge
-06/22 Civil rights workers disappear in Mississippi, 1964
-06/23 Slavery abolished in England, 1772
-06/24 Senate repeals Gulf of Tonkin resolution, 1970
-06/25 Custer's Last Stand at Little Big Horn, 1876
-06/25 North Korea invades South Korea, 1950
-06/26 Battle of Gettysburg, 1863
-06/26 St. Lawrence Seaway dedicated by Eisenhower & Queen Elizabeth II, 1959
-06/26 Toothbrush invented, 1498
-06/27 100 degrees, Fort Yukon, 1915
-06/27 Bill Graham closes the Fillmore East, 1971
-06/28 Supreme Court decides in favor of Alan Bakke, 1978
-06/30 "That" explosion in Siberia, 1908
-06/30 China and Soviet Union announce split over ideology, 1960
-07/01 Battle of Gettysburg begins, 1863
-07/03 Dog days begin
-07/04 Battles of Vicksburg and Gettysburg won by Union forces, 1863
-07/04 Cloudy, 76 degrees, Philadelphia PA, 1776
-07/04 New York abstains on Declaration of Independence vote, 1776
-07/04 Thoreau enters woods, 1845
-07/06 First `talkie' (talking motion picture) premiere in New York, 1928
-07/06 Lawrence of Arabia captures Aqaba, 1917
-07/07 First radio broadcast of "Dragnet", 1949
-07/07 Terrorists detonate four bombs on London public transport, 2005
-07/08 First public reading of the Declaration of Independence, 1776
-07/08 Liberty Bell cracks while being rung at funeral of John Marshall, 1835
-07/09 10-hour working day set by law, NH, 1847
-07/10 134 degrees in Death Valley, 1913
-07/12 Minimum wages established: 40 cents/hour, 1933
-07/13 Women first compete in Olympic games, 1908
-07/16 Detonation of the first atomic bomb at Alamagordo, NM, 1945
-07/17 Disneyland opens, 1955
-07/18 Ty Cobb gets 4000th base hit, 1927
-07/19 Five Massachusetts women executed for witchcraft, 1692
-07/20 Armstrong and Aldrin land on moon, 1969
-07/21 First Train Robbery, Jesse James gets $3000 near Adair, Iowa, 1873
-07/21 Vietnam divided at 17th parallel, 1954
-07/23 Ice cream cone introduced, St. Louis MO, 1904
-07/24 Scopes Monkey Trial, 1925
-07/30 "In God We Trust" made US motto, 1956
-07/31 Harry S. Truman dedicates N.Y. Int'l Airport @ Idlewild Field, 1948,
- later JFK
-08/01 Lughnasa; Feast of the god Lugh, a 30 day Celtic feast centers on
- this day
-08/03 Columbus sets sail for Cathay, 1492
-08/03 USS Nautilus crosses under north polar ice cap, 1958
-08/04 Axe murder of Andrew and Abbey Borden, 1892
-08/04 Bombing of N. Vietnam begins, 1964
-08/04 Britain declares war on Germany starting World War I, 1914
-08/06 Atomic bomb dropped on Hiroshima, 1945
-08/06 Caricom in Barbados
-08/06 Cy Young pitches first game, 1890
-08/08 Montenegro declares war on Germany, 1914
-08/08 Richard Nixon resigns the US presidency, 1974
-08/08 The Great Train Robbery -- $7,368,000, 1963
-08/09 Helter Skelter... the Charles Manson murders take place, 1969
-08/09 Persia defeats Spartan King Leonidas at Thermopylae, 480 BC
-08/09 US/Canada border defined in the Webster-Ashburton Treaty, 1842
-08/09 Atomic bomb dropped on Nagasaki, 1945
-08/09 Singapore secedes from Malaysia, 1965
-08/10 Chicago incorporated as a village of 300 people, 1833
-08/10 US and Panama agree to transfer the canal in the year 2000, 1977
-08/11 Dog days end
-08/11 France Ends War in Indochina, 1954
-08/11 Perseid meteor shower (look north; three days)
-08/12 First test flight of Space Shuttle "Enterprise" from 747, 1977
-08/12 Last US ground troops out of Vietnam, 1972
-08/13 Berlin wall erected, 1961
-08/13 Li'l Abner debut, 1934
-08/14 Social Security begins in US, 1935
-08/15 Gandhi's movement obtains independence for Pakistan and India, 1947
-08/15 Hurricane hits Plymouth Plantation, 1635
-08/16 Roller Coaster patented, 1898
-08/17 First public bath opened in N.Y., 1891
-08/18 Anti-Cigarette League of America formed
-08/19 Air Force cargo plane snares payload from Discoverer 14 spy satellite,
- marking start of practical military reconnaissance from space, 1960
-08/19 Gail Borden patents condensed milk, 1856
-08/22 Death of King Richard III, 1485, Last of the Plantagenets
-08/22 Joe Walker sets X-15 all time altitude mark (67 miles), 1963
-08/22 St. Columbia reports seeing monster in Loch Ness, 565
-08/23 Sacco and Vanzetti executed, 1927
-08/24 "Alice's Restaurant" premieres in New York and Los Angeles, 1969
-08/24 -126.9 F at Vostok, Antarctica, 1960
-08/24 British troops burn Washington, 1814
-08/25 Gen. De Gaulle leads French forces into Paris, 1944
-08/26 19th amendment of US constitution gives women the vote, 1920
-08/27 "Tarzan of the Apes" published, 1912
-08/27 Krakatoa, Java explodes with a force of 1,300 megatons, 1883
-08/28 Martin Luther King leads over 200,000 in civil rights rally in Washington, DC, 1963
-08/29 Star in Cygnus goes nova and becomes 4th brightest in sky, 1975;
- Nova Cygni 1975.
-08/30 75 cents a pound tariff set on opium, 1842
-08/30 Japan Stationery Co. sells first felt-tipped pen, 1960
-08/30 St. Rose of Lima in Peru
-08/30 Washington-to-Moscow hot line connected, 1963
-08/31 269 people killed after Korean Airlines 747 shot down by USSR, 1983
-08/31 Mary Anne Nichols becomes Jack the Ripper's first victim, 1888
-08/31 Non-aggression pact signed by USSR and Afghanistan, 1926
-08/31 Federation of Malaya gains independence from Great Britain, 1957
-09/01 Bobby Fischer defeats Boris Spassky in World Chess Match, 1972
-09/01 Joshua A. Norton proclaims himself 'Emperor Norton I', 1859
-09/02 Great Britain adopts Gregorian Calendar, 1752
-09/02 Japan signs unconditional surrender on US battleship `Missouri', 1945
-09/03 Richard ``the Lionheart'' crowned king of England, 1189
-09/03 Anniversary of the Founding of the Republic in San Marino
-09/05 US President Kennedy orders resumption of underground nuclear tests, 1961
-09/05 The first Continental Congress was convened in Philadelphia, 1774
-09/06 149 Pilgrims set forth from England aboard the Mayflower, 1620
-09/06 First Star Trek episode (The Man Trap) aired 1966
-09/06 US President McKinley shot, 1901
-09/06 Somhlolo in Swaziland
-09/08 "Star Trek" debuts on NBC (1966)
-09/08 Jack the Ripper kills again, Annie Chapman is second victim, 1888
-09/08 US President Ford pardons Richard M. Nixon, 1974
-09/09 California becomes the 31st state of the USA, 1850
-09/09 United Colonies is renamed the United States, 1776
-09/10 Mountain Meadows Massacre. Mormons kill Gentile wagon train, 1857
-09/11 CIA-sponsored terrorists overthrow Chilean government, murder President Allende, 1973
-09/11 Terrorists destroy World Trade Center in New York, 2001
-09/12 German paratroopers rescue Mussolini from captivity in Rome, 1943
-09/12 Germany annexes Sudetenland, 1938
-09/13 58° C (136.4° F) measured at el Azizia, Libya, 1922
-09/13 British defeat the French at Abraham near Quebec City, 1788
-09/13 Building of Hadrian's Wall begun, 122
-09/13 Chiang Kai-Shek becomes president of China, 1943
-09/14 Benjamin Franklin is sent to France as an American minister, 1778
-09/14 Salem, Massachusetts, is founded, 1629
-09/14 The US Selective Service Act establishes the first peacetime draft, 1940
-09/15 Soviet Premier Nikita Khrushchev begins his 13 day tour of the US, 1959
-09/15 The US Foreign Affairs Dept. becomes the US State Department, 1789
-09/16 The village of Shawmut, Massachusetts, becomes the city of Boston, 1630
-09/16 Malaya, Sabah, Sarawak and Singapore unite to become Malaysia, 1963
-09/17 Battle of Antietam, 1862
-09/18 Victory of Uprona in Burundi
-09/19 New Zealand women get the right to vote, 1893
-09/20 Equal Rights Party nominates Belva Lockwood for US President, 1884
-09/20 First meeting of the American Association for the Advancement of
- Science, 1848
-09/20 First meeting of the US National Research Council, 1916
-09/20 Magellan leaves Spain on the first Round the World passage, 1519
-09/20 The Roxy Theater opens in Hollywood, 1973
-09/22 US President Lincoln issues the Emancipation Proclamation, 1862
-09/22 Special prosecutor Leon Jeworski subpoenas US President Nixon, 1974
-09/22 The first Soviet atomic bomb explodes, 1949
-09/23 Philippine President Ferdinand Marcos declares martial law, 1972
-09/23 The New York Knickerbockers becomes the first US Baseball club, 1845
-09/23 US Vice President Nixon denies campaign fund fraud with his "Checkers" speech, 1952
-09/25 Sandra Day O'Connor becomes first woman on US Supreme Court, 1981
-09/27 The first passenger was hauled in a locomotive in England, 1825
-09/28 "Pilgrim's Progress" published, 1678
-09/28 A Greek soldier runs 26+ miles after the Persian defeat at Marathon,
- 490BC
-09/30 Red Jack kills 2, Elizabeth Stride (#3) and Catherine Eddowes (#4),
- 1888
-09/30 The first tooth is extracted under anesthesia in Charleston, Mass, 1846
-09/30 The verdicts of the Nuremberg trials are announced, 1946
-10/01 NASA officially begins operations, 1958
-10/02 Thurgood Marshall sworn as the first black Supreme Court Justice, 1967
-10/04 Crimean war begins, 1853
-10/04 First space vehicle, Sputnik I, launched, 1957
-10/06 Antioch College is the first public school to admit men and women, 1853
-10/06 Egyptian President Anwar es-Sadat is assassinated in Cairo, 1981
-10/06 Israel is attacked by the alliance of Egypt and Syria, 1973
-10/07 Foundation of the German Democratic Republic (GDR or DDR), 1949
-10/07 Georgia Tech. beats Cumberland Univ. 222-0, 1916
-10/07 Maryland Governor Marvin Mandel sent to prison on fraud charges, 1977
-10/07 Mother Teresa of Calcutta awarded the Nobel Peace Prize, 1979
-10/07 Police stop Wilbur Mills car, Fanne Fox jumps into water, 1974
-10/08 Great Chicago Fire, 1871
-10/09 First two-way telephone conversation, 1876
-10/10 Beginning of the Wars for Independence in Cuba
-10/10 Foundation of the Workers Party in North Korea
-10/10 Mercury at Superior Conjunction with Sun. Moves into night sky. (1984)
-10/10 Spiro T. Agnew resigns as Vice-President due to income tax fraud, 1973
-10/11 "Saturday Night Live" premiers on NBC-TV, 1975
-10/11 The Gang of Four are arrested in Peking, 1976
-10/11 The first steam powered ferry ran between New York and Hoboken, 1811
-10/11 The second Vatican Ecumenical Council opens in Rome, 1962
-10/11 First broadcast of Saturday Night Live, 1975
-10/12 Bahama Natives discover Columbus of Europe lost on their shores, 1492
-10/12 Khrushchev pounds his desk with shoe during a speech to the UN, 1960
-10/12 Man O'War's last race, 1920
-10/12 Native Americans discover Columbus of Europe lost on their shores, 1492
-10/13 Italy declares war on Germany, 1943
-10/13 US Navy born, 1775, authorized by the Second Continental Congress
-10/14 Battle of Hastings won by William the Conqueror and the Normans, 1066
-10/14 Chuck Yeager breaks sound barrier, 1947
-10/15 First draft card burned, 1965
-10/18 Boston Shoemakers form first US labor org., 1648
-10/18 Soviets announce their probe took photos of the Moon's far side, 1959
-10/19 Mao Tse-tung establishes the People's Republic of China, 1949
-10/19 Napoleon's beaten army begins the long retreat from Moscow, 1812
-10/20 "Saturday Night Massacre", 1973
-10/20 OPEC embargo, 1973
-10/21 Edison makes the first practical incandescent lamp, 1879
-10/21 Guggenheim Museum opens, 1959
-10/23 Battle of Leyte Gulf begins, 1944
-10/23 Day of the 1956 revolution in Hungary
-10/23 Earth created at 6:30 AM, 4004BC.
-10/23 Swallows leave Capistrano
-10/25 The UN removes Taiwan and admits the People's Republic of China, 1971
-10/26 UN's World Health Organization declares smallpox eradicated, 1978
-10/27 New York's Boss Tweed is arrested on fraud charges, 1871
-10/27 The first New York Subway is opened, 1904
-10/28 Columbus discovers Cuba, 1492
-10/28 Constantine's army defeats forces of Maxentius at Mulvian Bridge, 312
-10/28 Harvard was founded in Massachusetts, 1636
-10/28 Statue of Liberty was dedicated on Bedloe's Island, 1886
-10/29 Stock Market Crash, 1929
-10/30 Orson Welles' "War of the Worlds" broadcast, 1938
-10/31 Luther nails 95 Theses to door of Castle Church, Wittenberg, 1517
-11/01 Austria-Hungary become two separate nations, 1918
-11/01 Puerto Rican nationalists try to kill Truman at the Blair House, 1950
-11/02 Luftwaffe completes 57 consecutive nights of bombing of London, 1940
-11/02 Two Frenchmen make the first free hot air balloon flight, 1783
-11/03 Beef rises to 3 cents a pound, IL, 1837
-11/03 Linus Pauling wins Nobel Chemistry Prize, 1954
-11/03 Sputnik II launched, 1957, bearing space dog Laika
-11/04 Iranian militants seize US embassy personnel in Teheran, 1979
-11/04 Soviet forces crush the anti-communist revolt in Hungary, 1956
-11/05 Guy Fawkes' Plot, 1605
-11/07 Abolitionist newspaperman Elijah P. Lovejoy murdered by mob, 1837
-11/07 Lewis and Clark Expedition in sight of the Pacific Ocean, 1805
-11/09 Blackout of New York, New England, and Eastern Canada, 1965
-11/09 Giant panda discovered (?!), China, 1927
-11/09 Jack the Ripper kills fifth and final victim, Jane Kelly, 1888
-11/09 Margaret Sanger forms American Birth Control League, 1921
-11/09 Roosevelt establishes the Civil Works Administration, 1933
-11/10 41 Women arrested in suffragette demonstrations near White House, 1917
-11/10 Cpt. Wirz, commandant of Andersonville Prison hanged, 1865
-11/10 Henry Stanley asks David Livingston, "Dr. Livingston, I presume?", 1871
-11/11 Washington becomes the 42nd state, 1889
-11/12 Dr. Sun Yat-sen's Birthday in Taiwan
-11/12 USA first exports oil to Europe, 1861
-11/14 Quarter Pounder price raised from $0.53 to $0.55 in violation of Nixon
- price controls (but okayed by Price Commission after formal request
- from McDonald's), 1971
-11/15 Niagara Falls power plant startup, 1896
-11/16 Opening of the Suez Canal, 1869
-11/17 46,000 meteoroids fall over AZ in 20 minutes, 1966
-11/17 Richard Nixon says "I am not a crook.", 1973
-11/18 First hydrogen bomb blasts Enewetok, 1952
-11/18 Local standard time zones established for US, 1883
-11/19 Gettysburg Address delivered, 1863
-11/21 Announcement of 18 1/2 minute gap on Watergate tape, 1973
-11/22 Kennedy shot in Dallas, Texas by Lee Harvey Oswald, 1963
-11/23 First broadcast of Dr. Who (longest running TV series), 1963
-11/24 Lee Harvey Oswald killed by Jack Ruby, 1963
-11/25 Alfred Nobel invents dynamite, 1867
-11/27 Alfred Nobel establishes Nobel Prize, 1895
-11/27 Friction match invented, England, 1826
-11/27 Hoosac Railroad Tunnel completed, 1873, in NW Massachusetts
-11/29 King Tut's tomb opened, 1922
-12/01 First national corn-husking championship, Alleman IA, 1924
-12/01 Martin Luther King Jr., leads black boycott of Montgomery buses, 1955
-12/01 Rosa Parks refuses to move to back of the bus (Montgomery, AL), 1953
-12/03 First neon light display, Paris, 1910
-12/03 First successful human heart transplant led by Dr. Barnard, 1967
-12/03 The Montreux Casino burns down during a Frank Zappa concert, 1971
-12/04 Washington takes leave of his officers at Fraunce's Tavern, NYC, 1783
-12/05 End of Prohibition, 1933 (at least the alcohol part)
-12/05 Phi Beta Kappa founded, 1776
-12/05 The Eighteenth Amendment repealed, ending Prohibition, 1933
-12/07 Japan bombs Pearl Harbor, 1941
-12/08 Japan enters Second World War with invasion of Pantai Sabak, Kelantan, 1941
-12/09 Ball-bearing roller skates patented, 1884
-12/10 Metric system established in France, 1799
-12/10 Nobel Peace Prize awarded each year
-12/12 First wireless message sent across Atlantic by Marconi, 1901
-12/13 Apollo 17 leaves the moon, with "last" men to walk on moon aboard, 1972
-12/13 Dartmouth College chartered, 1769
-12/13 Geminid meteor shower (look south)
-12/15 Argo Merchant oil spill, 1976
-12/15 Bill of Rights adopted, 1791
-12/15 James Naismith invents basketball, Canada, 1891
-12/15 Sitting Bull shot in head while submitting to arrest, 1890
-12/20 US buys ~1,000,000 sq. miles of Louisiana for ~$20/sq.mi.
-12/21 Phileas Fogg completes his trip around the world in less than 80 days
-12/21 Women gain the right to vote in South Australia, 1894
-12/21 Women gain the right to hold political office in South Australia, 1894
-12/24 KKK formed in Pulaski, Tenn, 1865
-12/26 DPMA founded, 1951
-12/27 APT report published, 1956
-12/27 Ether first used as anesthetic in childbirth, 1845
-12/28 Comet Kohoutek at perihelion, 1973
-12/28 Proclamation of the Province of South Australia, 1836
-12/29 Battle of Wounded knee, 1890
-12/30 First Los Angeles freeway dedicated, 1940
-12/31 St. Sylvester in Switzerland
-12/31 Winterland closes its doors, 1978
-
-#endif /* !_calendar_history_ */
diff --git a/usr.bin/calendar/calendars/calendar.holiday b/usr.bin/calendar/calendars/calendar.holiday
deleted file mode 100644
index d2dcd5a..0000000
--- a/usr.bin/calendar/calendars/calendar.holiday
+++ /dev/null
@@ -1,563 +0,0 @@
-/*
- * Holiday
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_holiday_
-#define _calendar_holiday_
-
-01/01 Beginning of the Year in Japan
-01/01 Independence Day in Haiti and Sudan
-01/01 Universal Fraternity Day in Mozambique
-01/02 Ancestry Day in Haiti
-01/02 St. Berchtold's Day in Switzerland
-01/03 New Year's Holiday in Scotland
-01/03 Revolution Day in Upper Volta
-01/04 Independence Day in Burma
-01/04 Martyrs Day in Zaire
-01/06 Children's Day in Uruguay
-01/06 Three Kings' Day in Puerto Rico
-01/07 Christmas in Ethiopia
-01/07 Pioneer's Day in Liberia
-01/09 Day of the Martyrs in Panama
-01/11 Armed Forces Day in Liberia
-01/12 Zanzibar Revolution Day in Tanzania
-01/13 National Liberation Day in Togo
-01/15 Arbor Day in Jordan
-01/16 Martyrs Day in Benin
-01/18 Revolution Day in Tunisia
-01/19 Confederate Heroes Day in Texas
-01/19 Ethiopian Epiphany in Ethiopia
-01/19 Nameday of Archbishop Makarios in Cyprus
-01/20 Army Day in Mali
-01/20 National Heroes Day in Guinea-Bissau
-01/21 Our Lady of Altagracia in Dominican Republic
-01/23 Feast of St. Ildefonsus
-01/23 US National Handwriting Day
-01/24 Economic Liberation Day in Togo
-01/26 Republic Day in India
-01/MonSecond Adults Day in Japan
-01/MonThird Lee-Jackson Day in Virginia (3rd Monday)
-01/MonThird Robert E. Lee's Birthday in Alabama & Mississippi (3rd Monday)
-01/MonThird Martin Luther King Day in New York (3rd Monday)
-02/01 Chinese New Year Holiday (3 days) in Taiwan
-02/02 Candlemas
-02/04 Independence Commemoration Day in Sri Lanka
-02/05 Constitution Day in Mexico
-02/06 New Zealand Day
-02/07 Independence Day in Grenada
-02/09 St. Maron's Day in Lebanon
-02/10 Feast of St. Paul's Shipwreck, AD 60
-02/11 National Foundation Day in Japan
-02/12 Pyidaungsa Day in Burma
-02/16 Makha Bucha Day in Thailand
-02/18 Democracy Day in Nepal
-02/18 Independence Day in The Gambia
-02/23 Republic Day in Guyana
-02/24 Gregorian Calendar Day
-02/25 National Day in Kuwait
-02/27 Independence Day in Dominican Republic
-03/01 Samil Independence Movement Day in South Korea
-03/01 St. David's Day - Patron Saint of Wales
-03/02 Peasants Day in Burma
-03/02 Texas Independence day
-03/02 Victory of Adowa in Ethiopia
-03/03 Throne Day in Morocco
-03/03 Independence day (Treaty of San Stefano) in Bulgaria
-03/04 Vermont Admission Day (admitted as 14th US state in 1791)
-03/05 Independence Day in Equatorial Guinea
-03/06 Lantern Day, Bejing
-03/08 First Annual International Women's Day, 1909
-03/08 International Women's Day in former USSR
-03/08 Syrian National Day in Libyan Arab Republic
-03/08 Women's Day in Guinea-Bissau, Taiwan and Yemen Democratic Republic
-03/08 Youth Day in Zambia
-03/09 Decoration Day in Liberia
-03/09 Falgun Purnima Day in Nepal
-03/10 Labor Day in South Korea
-03/11 Johnny Appleseed Day; anniversary of the death of John Chapman
-03/12 Commonwealth Day in Swaziland
-03/12 Independence Day in Mauritius
-03/12 Moshoeshoe's Birthday in Lesotho
-03/12 Renovation Day in Gabon
-03/13 National Day in Grenada
-03/16 Black Press Day; first US Black newspaper founded in 1827
-03/17 Evacuation Day in Suffolk County, Massachusetts
-03/17 St. Patrick's Day - one of the Patron Saints of Ireland
-03/19 St. Joseph's Day, observed in Colombia, Costa Rica, Holy See,
- Liechtenstein, San Marino, Spain, Venezuela
-03/19 Tree Planting Day in Lestho
-03/20 Independence Day in Tunisia
-03/20 Youth Day in Oklahoma
-03/20* Vernal Equinox in Japan
-03/21 Afghan New Year in Afghanistan
-03/21 Juarez' Birthday in Mexico
-03/21* Vernal Equinox in Japan
-03/22 Abolition Day in Puerto Rico
-03/23 Pakistan Day in Pakistan
-03/25 Greek Independence Day in Cyprus
-03/25 Lady Day (a.k.a. the Feast of the Annunciation)
-03/25 Maryland Day in Maryland
-03/25 National Holiday in Greece
-03/26 Independence Day in Bangladesh
-03/26 Prince Jonah Kuhio Kalanianaole Day in Hawaii
-03/27 Armed Forces Day in Burma
-03/29 Death of President Barthelemy Boganda in Central African Republic
-03/29 Memorial Day in Madagascar
-03/31 National Day in Malta
-03/MonLast Seward's Day in Alaska (last Monday)
-04/01 Youth Day in Benin
-04/02 Malvinas Day in Argentina
-04/02 Pascua Florida Day in Florida
-04/04 Ching Ming Festival in Hong Kong
-04/04 Liberation Day in Hungary
-04/04 National Day in Senegal
-04/05 Arbor Day in South Korea
-04/05 Tomb Sweeping Day in Taiwan
-04/06 Chakri Memorial Day in Thailand
-04/06 Victory Day in Ethiopia
-04/08 Fast and Prayer Day in Liberia
-04/09 Martyrs Day in Tunisia
-04/11 National Heroes Day in Costa Rica
-04/13 National Day in Chad
-04/13 Songkron Day in Thailand
-04/14 Day of the Americas in Honduras
-04/15 Bengali New Year in Bangladesh
-04/16 De Diego's Birthday celebrated in Puerto Rico
-04/16 Holy Week (5 days) in Venezuela
-04/16 Tourist Week (5 days) in Uruguay
-04/17 Burmese New Year in Burma
-04/18 Independence Day in Chile and Zimbabwe
-04/19 Declaration of Independence in Venezuela
-04/19 Republic Day in Sierra Leone
-04/21 San Jacinto Day in Texas
-04/21 Tiradentes in Brazil
-04/22 Arbor Day in Nebraska & Delaware
-04/22 Oklahoma Day in Oklahoma
-04/23 St. George's Day - Patron Saint of England
-04/24 Victory Day in Togo
-04/25 Anniversary of the Revolution in Portugal
-04/25 Anzac Day, observed in Australia, New Zealand, Tonga and Western Samoa
-04/25 Liberation Day in Italy
-04/25 National Flag Day in Swaziland
-04/26 Confederate Memorial Day in Florida & Georgia
-04/26 Union Day in Tanzania
-04/27 Independence Day in Togo
-04/29 Showa Day in Japan
-04/30 Queen's Birthday in the Netherlands, the Netherlands Antilles
-04/30 The Workers Day in Uruguay
-04/MonLast Arbor Day in Wyoming (last Monday)
-04/MonLast Confederate Memorial Day in Alabama & Mississippi (last Monday)
-04/MonThird Patriot's Day in Maine & Massachusetts (3rd Monday)
-05/01 Labor Day in many places in the USA
-05/01 May Day in many places
-05/01 US Law Day (decl. by Eisenhower)
-05/02 King's Birthday in Lesotho
-05/03 Constitution Memorial Day in Japan
-05/04 Greenery Day in Japan
-05/04 Rhode Island Independence Day
-05/05 Battle of Puebla in Mexico
-05/05 Children's Day in Japan and South Korea
-05/05 Coronation Day in Thailand
-05/05 Liberation Day in the Netherlands
-05/06 Bataan Day in Philippines
-05/06* Bank Holiday in UK
-05/07 May Day in United Kingdom
-05/08 Buddha's Birthday in South Korea
-05/08 Elections for the National Assembly in Philippines
-05/08 Truman Day in Missouri
-05/09 VE day, end of Second World War, celebrated in many countries
-05/10 Confederate Memorial Day in South Carolina
-05/10 Mothers Day in Guatemala
-05/11 Minnesota Day in Minnesota
-05/14 Anniversary of the Founding of Guinean Democratic Party in Guinea
-05/14 Buddhist Holiday (Waisak 2528) in Indonesia
-05/14 Independence Day (2 days) in Paraguay
-05/14 Unification Day in Liberia
-05/15 Kamuzu Day in Malawi
-05/15 Vesak Day, observed in Singapore and Malaysia
-05/15 Visakha Bucha Day in Thailand
-05/16 Discovery Day in Cayman Islands
-05/17 Constitution Day in Nauru and Norway
-05/18 Flag Day in Haiti
-05/18 Prayer Day in Denmark
-05/19 Youth and Sports Day in Turkey
-05/20 Mecklenburg Independence Day in North Carolina
-05/20 National Day in Cameroon
-05/20 Victoria Day in Canada
-05/22 National Heroes Day in Sri Lanka
-05/23 Commonwealth Day in Jamaica and Belize
-05/23 National Labor Day in Jamaica
-05/24 Bermuda Day in Bermuda
-05/24 Day of Slav Letters in Bulgaria
-05/25 African Freedom Day in Zimbabwe
-05/25 African Liberation Day in Chad, Mauritania and Zambia
-05/25 Anniversary of the Revolution of 1810 in Argentina
-05/25 Independence Day in Jordan
-05/25 Memorial Day in New Mexico & Puerto Rico
-05/25 Revolution in the Sudan in Libyan Arab Republic
-05/27 Afghanistan attains sovereignty, 1921
-05/27* Bank Holiday in UK
-05/28 Mothers Day in Central African Republic
-05/31 Pya Martyrs Day in Togo
-05/MonThird Memorial Day in Michigan (3rd Monday)
-06/01 Independence Days (3 days) in Western Samoa
-06/01 Madaraka Day in Kenya
-06/01 Victory Day in Tunisia
-06/02 Corpus Christi in Paraguay
-06/03 Confederate Memorial Day in Kentucky & Louisiana
-06/03 Labor Day in Bahamas
-06/03* Bank Holiday in Rep. of Ireland
-06/04 Emancipation Day in Tonga
-06/04 Queen's Birthday in New Zealand
-06/05 Constitution Day in Denmark
-06/05 Liberation Day in Seychelles
-06/06 His Majesty, Yang Di-Pertuan Agong's Birthday in Malaysia
-06/06 Memorial Day in South Korea
-06/09 Senior Citizen's Day in Oklahoma
-06/10 Camoes Day in Portugal
-06/11 King Kamehameha I Day in Hawaii
-06/11 Queen's Birthday
-06/12 Independence Day in Philippines
-06/12 Peace with Bolivia in Paraguay
-06/13 Corrective Movement in Yemen Arab Republic
-06/14 Flag Day, USA
-06/16 Bloomsday - Anniversary of Dublin events, 1904, in "Ulysses"
-06/17 Bunker Hill Day in Suffolk County, Massachusetts
-06/17 Independence Day in Iceland
-06/18 Evacuation Day in Egypt
-06/18 Queen's Birthday in Fiji
-06/19 Artigas Birthday in Uruguay
-06/19 Emancipation Day in Texas
-06/19 Labor Day in Trinidad and Tobago
-06/19 Revolution Day in Algeria
-06/20 Flag Day in Argentina
-06/20 West Virginia Day in West Virginia
-06/22 Corrective Movement in Yemen Democratic Republic
-06/22 Midsummer Eve in Finland, Sweden
-06/22 National Sovereignty Day in Haiti
-06/23 National Holiday in Luxembourg
-06/24 Battle of Carabobob in Venezuela
-06/24 Fisherman's Day in Madagascar, Mozambique and Somalia
-06/24 Kings Day in Spain
-06/24 Peasants Day in Peru
-06/24 St. Jean-Baptiste Day in Quebec
-06/28 Mothers Day in Central African Republic
-06/29 Independence Day in Seychelles
-06/30 Day of the Army in Guatemala
-06/MonFirst Jefferson Davis's Birthday in Alabama & Mississippi (1st Monday)
-06/MonFirst Jefferson Davis's Birthday in Florida, Georgia, & S. Carolina
-07/01 Dominion Day in Canada
-07/01 Freedom Day in Suriname
-07/01 Independence Day in Burundi
-07/01 National Day in Rwanda
-07/01 Republic Day in Ghana
-07/01 Union of the Somalia Republic in Somalia
-07/02 National Day in Kiribati
-07/04 Caribbean Day in Guyana
-07/04 Constitution Day in Cayman Islands
-07/04 Family Day in Lesotho
-07/04 Heroes Day in Zambia
-07/04 Kadooment Day in Barbados
-07/04 Philippine-American Friendship Day in the Philippines
-07/04 Warriors Day (2 days) in Yugoslavia
-07/05 Day of Peace and Unity in Rwanda
-07/05 Independence Day in Algeria and Venezuela
-07/07 Anniversary of the P.U.N. in Equatorial Guinea
-07/07 National Day in Malawi
-07/07 Saba Saba Day in Tanzania
-07/09 Independence Day in Argentina
-07/10 Independence Day in Bahamas
-07/11 National Holiday in the Mongolian People's Republic
-07/12 Battle of Boyne celebrated in Northern Ireland
-07/13 Buddhist Lent in Thailand
-07/14 Anniversary of the Revolution in Iraq
-07/14 French National Festival
-07/14 National Holiday in Monaco
-07/15 St. Swithin's Day
-07/16 Presidents Day in Botswana
-07/17 Constitution Day in South Korea
-07/17 July Revolution in Iraq
-07/17 Munoz Rivera's Birthday (celebrated in Puerto Rico)
-07/17 Public Holiday in Botswana
-07/18 Constitution Day in Uruguay
-07/18 Liberation Day in Nicaragua
-07/19 Martyrs Day in Burma
-07/20 Independence Day in Colombia
-07/21 National Holiday in Belgium
-07/22 King's Birthday in Swaziland
-07/22 National Day in Poland
-07/23 Anniversary of the Revolution in Egypt
-07/23 Egyptian National Day in Syrian Arab Republic
-07/23 Remembrance Day in Papua New Guinea
-07/24 Pioneer Day in Utah
-07/24 Simon Bolivar's Day in Ecuador and Venezuela
-07/25 Constitution Day in Puerto Rico
-07/25 National Rebellion Day (3 days) in Cuba
-07/25 Republic Day in Tunisia
-07/25 St. James, Patron Saint in Spain
-07/26 Independence Day in Liberia
-07/26 National Day in Maldives
-07/27 Barbosa's Birthday (celebrated in Puerto Rico)
-07/28 Independence Days (2 days) in Peru
-07/29 Olsok Eve in Norway to commemorate Norway's Viking King St. Olav
-07/29 Rain Day in Waynesburg, PA
-07/31 Revolution Day in Congo
-07/MonThird Day of Sea in Japan
-08/01 Discovery Day in Trinidad and Tobago
-08/01 Emancipation Day in Granada
-08/01 Founding of Asuncion in Paraguay
-08/01 Freedom Day in Guyana
-08/01 National Day in Switzerland
-08/01 National Holidays (5 days) in El Salvador
-08/01 Parent's Day in Zaire
-08/02 Our Lady of Los Angeles in Costa Rica
-08/03 Independence Day in Jamaica and Niger
-08/03 Massacre of the Pidjiguiti in Guinea-Bissau
-08/03 Memorial Day of Archbishop Makarios in Cyprus
-08/04 Freedom Day in Guyana
-08/05* Bank Holiday in Scotland and Northern Ireland
-08/06 Bank Holiday in British Columbia, Fiji, Iceland, Ireland, Ontario
-08/06 Emancipation Day in Bahamas
-08/06 Independence Day in Bolivia
-08/07 Battle of Boyaca in Colombia
-08/09 National Day in Singapore
-08/10 Independence Day in Ecuador
-08/11 Heroes Day (2 days) in Zimbabwe
-08/11 Independence Day in Chad
-08/11 King Hussein's Accession to the Throne in Jordan
-08/12 Queen's Birthday in Thailand
-08/13 Proclamation of Independence in Central African Republic
-08/13 Women's Day in Tunisia
-08/14 Independence Day in Pakistan
-08/14 VJ Day, 1945
-08/14 Waddi Dhahab in Morocco
-08/15 Founding of Ascuncion in Paraguay
-08/15 Independence Day in India
-08/15 Liberation Day in South Korea
-08/15 National Day in Congo
-08/15 Santa Maria in Malta
-08/16 Bennington Battle Day in Vermont
-08/16 Independence Days (3 days) in Gabon
-08/16 Restoration Day in Dominican Republic
-08/17 Anniversary of the Death of General San Martin in Argentina
-08/17 Independence Day in Indonesia
-08/19 Independence Day in Afghanistan
-08/20 Constitution Day in Hungary
-08/24 National Flag Day in Liberia
-08/25 Constitution Day in Paraguay
-08/25 Independence Day in Uruguay
-08/26 Susan B. Anthony Day in Massachusetts
-08/26* Bank Holiday in England and Wales
-08/27 Liberation Day in Hong Kong
-08/28 Heroes Day in Philippines
-08/30 Huey P. Long Day in Louisiana
-08/30 Victory Day in Turkey
-08/31 Independence Day (Merdeka) in Malaysia
-08/31 Independence Day in Trinidad and Tobago
-08/31 Pashtoonian Day in Afghanistan
-08/FriThird Admission Day in Hawaii, 1984 (3rd Friday)
-09/01 Army Day in Chile
-09/03 Independence Day in Qatar
-09/03 Memorial Day in Tunisia
-09/06 Defense of Pakistan Day in Pakistan
-09/06 Unification of Bulgaria
-09/07 Independence Day in Brazil
-09/09 Admission Day in California
-09/09 National Day in North Korea
-09/10 Korean Thanksgiving Day (Chusuk) in South Korea
-09/10 Moon Festival in Taiwan
-09/10 National Day in Belize
-09/11 Anniversary of military coup in Chile
-09/11 Ethiopian New Year in Ethiopia
-09/11 National Holiday in Chile
-09/12 Amilcar Cabral's Birthday in Guinea-Bissau
-09/12 Defender's Day in Maryland
-09/12 Revolution Day in Ethiopia
-09/13 Barry Day commemorates the death of Commodore John Barry, USA
-09/14 Battle of San Jacinto in Nicaragua
-09/15 Foundation of Panama in Panama
-09/16 Cherokee Strip Day in Oklahoma
-09/16 Independence Days in Mexico and Papua New Guinea
-09/17 National Heroes Day in Angola
-09/18 Independence Day in Chile and Zimbabwe
-09/19 Army Day in Chile
-09/21 Independence Day in Belize
-09/22 Independence Day in Mali
-09/22 National Sovereignty Day in Haiti
-09/22* Autumnal Equinox in Japan
-09/23 Grito de Lares in Puerto Rico
-09/23* Autumnal Equinox in Japan
-09/24 Anniversary of the Third Republic in Ghana
-09/24 Independence Day in Guinea-Bissau
-09/24 National Day in Saudi Arabia
-09/24 Our Lady of Mercedes in Dominican Republic
-09/24 Republic Day in Trinidad and Tobago
-09/25 Army Day in Mozambique
-09/25 Referendum Day in Rwanda
-09/26 National Day in Maldives
-09/26 Revolution Anniversary Day in Yemen
-09/27 Feast of Finding the True Cross in Ethiopia
-09/28 Confucius' Day in Taiwan
-09/29 Michaelmas
-09/29 Battle of Boqueron in Paraguay
-09/30 Botswana Day in Botswana
-09/MonThird Respect for the Aged Day in Japan
-10/01 Armed Forces Day in South Korea
-10/01 Independence Day in Nigeria
-10/01 National Liberation Day (2 days) in China
-10/01 Public Holiday in Botswana
-10/02 Anniversary of Guinean Independence in Guinea
-10/03 Chung Yeung Festival in Hong Kong
-10/03 Francisco Morazan's Birthday in Honduras
-10/03 German Reunification Day
-10/03 National Foundation Day in South Korea
-10/03 U.N. Day in Barbados
-10/04 Independence Day in Lesotho
-10/05 Anniversary of Proclamation of the Republic in Portugal
-10/06 National Sports Day in Lesotho
-10/07 National Heroes Day in Jamaica
-10/08 Battle of Agamos in Peru
-10/08 Constitution Day in former USSR
-10/08 Thanksgiving Day in Canada
-10/08* Fiji Day
-10/09 Independence Day in Uganda
-10/09 Independence of Guayaquil in Ecuador
-10/09 Korean Alphabet Day in South Korea
-10/09 Leif Erikson Day commemorates the discovery of North America in AD 1000
-10/09 Republic Day in Khmer Republic
-10/10 National Day in Taiwan
-10/10 Oklahoma Historical Day in Oklahoma
-10/11 Day of the Revolution in Panama
-10/12 Day of the Race in Argentina
-10/12 Discovery Day in Bahamas
-10/12 National Day in Equatorial Guinea and Spain
-10/12 Our Lady Aparecida Day in Brazil
-10/12 Pan American Day in Belize
-10/14 National Day in Yemen Arab Republic
-10/14 Young People's Day in Zaire
-10/14* Thanksgiving Day in Canada
-10/15 Evacuation Day in Tunisia
-10/16 National Boss Day, USA
-10/17 Dessaline's Death Anniversary in Haiti
-10/17 Heroes Day in Jamaica
-10/17 Mother's Day in Malawi
-10/20 Anniversary of the 1944 Revolution in Guatemala
-10/20 Kenyatta Day in Kenya
-10/21 Armed Forces Day in Honduras
-10/21 Revolution Days (2 days) in Somalia
-10/23 Chulalongkron's Day in Thailand
-10/24 Independence Day in Zambia
-10/24 United Nations Day
-10/25 Taiwan Restoration Day in Taiwan
-10/25 St. Crispin's day, patron saint of shoemakers
-10/26 Agam Day in Nauru
-10/26 Armed Forces Day in Benin and Rwanda
-10/26 National Day in Austria
-10/28 National Holiday in Greece
-10/28 OHI Day in Cyprus
-10/28* Bank Holiday in Republic of Ireland
-10/29 Republic Day in Turkey
-10/31 All Hallows Eve ("Halloween")
-10/31 Nevada Day in Nevada
-10/MonFourth Labour Day in New Zealand
-10/MonSecond Health Sports Day in Japan
-11/01 All Saints Day
-11/01 Samhain; Beginning of the Celtic year and most important holiday.
-11/02 All Souls Day
-11/02 Memorial Day in Ecuador
-11/03 Culture Day in Japan
-11/03 Independence from Columbia in Panama
-11/03 Independence of Cuenca in Ecuador
-11/03 Thanksgiving Day in Liberia
-11/04 Flag Day in Panama
-11/04 Will Rogers Day, USA
-11/06 Green March Day in Morocco
-11/07 October Revolution Day in Hungary
-11/08 Her Majesty, the Queen's Birthday in Nepal
-11/10 King's Birthday in Bhutan
-11/11 Angola gains independence from Portugal, 1975
-11/11 Independence Day in Angola
-11/11 Independence of Cartagena in Colombia
-11/11 Remembrance Day in Canada
-11/11 Republic Day in Maldives
-11/14 King Hussein's Birthday in Jordan
-11/15 Dynasty Day in Belgium
-11/15 Proclamation of the Republic in Brazil
-11/15 Thatlouang Festival in Laos
-11/16 Oklahoma Heritage Week in Oklahoma
-11/17 Army Day in Zaire
-11/17 Corrective Movement in Syrian Arab Republic
-11/18 Battle of Viertieres in Haiti
-11/18 Independence Day in Morocco
-11/18 National Days (4 days) in Oman
-11/19 Anniversary of the 1968 Coup by the Army in Mali
-11/19 Discovery Day in Puerto Rico
-11/19 Feast Day of S.A.S. Prince Rainier in Monaco
-11/19 Garifuna Settlement in Belize
-11/20 Revolution Day in Mexico
-11/22 Anniversary of Portuguese Aggression in Guinea
-11/22 Independence Day in Lebanon
-11/23 Labor Thanksgiving Day in Japan
-11/24 Anniversary of the New Regime in Zaire
-11/25 Independence Day in Suriname
-11/28 Independence Day in Albania and Mauritania
-11/28 Independence from Spain in Panama
-11/28 Proclamation of the Republic in Chad
-11/29 Day of the Republic (2 days) in Yugoslavia
-11/29 Goodwill Day in Liberia
-11/29 Liberation Day in Albania
-11/29 National Day in Burma
-11/30 Independence Day in Barbados and Yemen Democratic Republic
-11/30 National Day in Benin
-11/30 National Heroes Day in Philippines
-11/30 St. Andrew's Day - Patron Saint of Scotland
-11/Wed+3 Day of Prayer and Repentance (Buss- und Bettag) in Federal Republic of Germany
-12/01 Anniversary of the Restoration of Independence in Portugal
-12/01 Union Day in Romania
-12/01 Independence Day in Central African Republic
-12/01 World AIDS Day
-12/02 National Holiday in United Arab Emirates
-12/03 National Holiday in Laos
-12/05 King's Birthday in Thailand
-12/06 Independence Day in Finland
-12/07 Delaware Day in Delaware
-12/07 Independence Day in Ivory Coast
-12/07 Independence Day in Panama
-12/08 Blessing of the Water in Uruguay
-12/08 Mother's Day in Panama
-12/08 Our Lady of the Cacupe in Paraguay
-12/09 Independence Day in Tanzania
-12/10 Foundation of Worker's Party in Angola
-12/10 Human Rights Day
-12/10 Thai Constitution Day in Thailand
-12/10 Wyoming Day in Wyoming
-12/11 Independence Day in Upper Volta
-12/12 Independence Day in Kenya
-12/13 Republic Day in Malta
-12/15 Statue Day in the Netherlands Antilles
-12/16 Constitution Day in Nepal
-12/16 National Day in Bahrain
-12/16 Victory Day in Bangladesh
-12/17 National Day in Bhutan
-12/18 Republic Day in Niger
-12/23 Emperor's Birthday in Japan
-12/23 Victory Day in Egypt
-12/25 Birthday of Quaid-i-Azam in Pakistan
-12/25 Children's Day in Congo
-12/26 Boxing Day
-12/26 Feast of Our Theotokos in Greece
-12/26 St. Stephen's Day
-12/26 Bank Holiday in Canada, Rep. of Ireland, and UK
-12/27 Bank Holiday in Cayman Islands
-12/27 Constitution Day in North Korea
-12/27 Public Holiday in Lesotho, Zimbabwe
-12/29 Civic Holidays (3 days) in Costa Rica
-12/29 His Majesty, the King's Birthday in Nepal
-12/30 Anniversary of the Democratic Republic of Madagascar in Madagascar
-12/31 Bank Holiday in El Salvador, Honduras, Pakistan
-12/31 Feed Yourself Day in Benin
-12/31 Proclamation of the Republic in Congo
-
-#endif /* !_calendar_holiday_ */
diff --git a/usr.bin/calendar/calendars/calendar.hungarian b/usr.bin/calendar/calendars/calendar.hungarian
deleted file mode 100644
index 1b29dfa..0000000
--- a/usr.bin/calendar/calendars/calendar.hungarian
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * Hungarian calendar file(s)
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_hungarian_
-#define _calendar_hungarian_
-
-#include <hu_HU.ISO8859-2/calendar.all>
-
-#endif /* !_calendar_hungarian_ */
diff --git a/usr.bin/calendar/calendars/calendar.judaic b/usr.bin/calendar/calendars/calendar.judaic
deleted file mode 100644
index 33e8033..0000000
--- a/usr.bin/calendar/calendars/calendar.judaic
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Judaic Calendar. Maintained by Josef Grosch <jgrosch@mooseriver.com>.
- *
- * $FreeBSD$
- *
- */
-
-/*
- * $Id: calendar.judaic,v 1.45 2007/01/01 22:24:53 jgrosch Exp $
- */
-
-#ifndef _calendar_judaic_
-#define _calendar_judaic_
-
-/*
- * Jewish calendar for the CE year 2007
- * 11 Tevet 5767 - 22 tevet 5768
- */
-
-
-01/06* Parshas Vayechi
-01/13* Parshas Shemos
-01/20* Parshas Vaera
-01/20* Rosh Chodesh Shevat (Beginning of the month of Shevat)
-01/27* Parshas Bo
-02/03* Parshas Beshalach
-02/03* Shabbos Shira
-02/03* Tu B'Shevat (Feast of Trees)
-02/10* Parshas Yisro
-02/17* Parshas Mishpatim
-02/17* Shabbos Shekalim
-02/18* Rosh Chodesh Adar (Beginning of the month of Adar)
-02/18* Be Happy! It's Adar
-02/19* Rosh Chodesh Adar (Beginning of the month of Adar)
-02/19* Be Happy! It's Adar
-02/24* Parshas Terumah
-03/01* Ta'anis Esther (Fast of Esther, Battle of Purim)
-03/03* Parshas Tetzaveh
-03/03* Shabbos Zachor
-03/04* Purim (Feast of Lots)
-03/05* Shushan Purim
-03/10* Parshas Ki Sisa
-03/10* Shabbos Parah
-03/17* Parshas Vayakhel-Pekudei
-03/17* Shabbos HaChodesh
-03/20* Rosh Chodesh Nissan (Beginning of the month of Nissan)
-03/24* Parshas Vayikra
-03/31* Parshas Tzav
-03/31* Shabbos Haggadol
-04/02* Erev Pesach
-04/02* Ta'anis Bechoros (Fast of the First Born)
-04/02* First Seder night
-04/03* Pesach (First Day of Passover; sabbatical)
-04/03* Second Sedar night
-04/04* Pesach (Second Day of Passover; sabbatical)
-04/04* Sefirat ha-Omer begins (Counting of the Omer)
-04/05* Omer 2nd day
-04/05* Pesach (Third Day of Passover; sabbatical)
-04/05* Hol Hamoed
-04/06* Omer 3rd day
-04/06* Pesach (Fourth Day of Passover)
-04/06* Hol Hamoed
-04/07* Omer 4th day
-04/07* Pesach (Fifth Day of Passover)
-04/07* Hol Hamoed
-04/08* Omer 5th day
-04/08* Pesach (Sixth Day of Passover)
-04/08* Hol Hamoed
-04/09* Omer 6th day
-04/09* Pesach (Seventh Day of Passover)
-04/10* Omer 7th day
-04/10* Pesach (Last Day of Passover; 8th day of Pesach; sabbatical)
-04/10* Yizkor
-04/11* Omer 8th day
-04/12* Omer 9th day
-04/13* Omer 10th day
-04/14* Omer 11th day
-04/14* Parshas Shmini
-04/15* Omer 12th day
-04/15* Yom HaShoah (Holocaust Memorial Day)
-04/16* Omer 13th day
-04/17* Omer 14th day
-04/18* Omer 15th day
-04/18* Rosh Chodesh Iyar (Beginning of the month of Iyar)
-04/19* Omer 16th day
-04/19* Rosh Chodesh Iyar (Beginning of the month of Iyar)
-04/20* Omer 17th day
-04/21* Omer 18th day
-04/21* Parshas Tazria-Metzora
-04/22* Omer 19th day
-04/23* Omer 20th day
-04/23* Yom HaZikaron
-04/24* Omer 21th day
-04/24* Yom HaAtzma'ut (Israel Independence Day)
-04/25* Omer 22th day
-04/26* Omer 23th day
-04/27* Omer 24th day
-04/28* Omer 25th day
-04/28* Parshas Achrei Kedoshim
-04/29* Omer 26th day
-04/30* Omer 27th day
-05/01* Omer 28th day
-05/02* Omer 29th day
-05/03* Omer 30th day
-05/04* Omer 31th day
-05/05* Omer 32th day
-05/05* Parshas Emor
-05/06* Lag B'Omer (Commemoration of the Great Rebellion)
-05/06* Omer 33th day
-05/07* Omer 34th day
-05/08* Omer 35th day
-05/09* Omer 36th day
-05/10* Omer 37th day
-05/11* Omer 38th day
-05/12* Omer 39th day
-05/12* Parshas Behar-Bechukosai
-05/13* Omer 40th day
-05/14* Omer 41th day
-05/15* Omer 42th day
-05/16* Omer 43th day
-05/16* Yom Yerushalayim (Reunification of Jerusalem)
-05/17* Omer 44th day
-05/18* Omer 45th day
-05/18* Rosh Chodesh Sivan (Beginning of the month of Sivan)
-05/19* Omer 46th day
-05/19* Parshas Bamidbar
-05/20* Omer 47th day
-05/21* Omer 48th day
-05/22* Erev Shavuos
-05/22* Omer 49th day
-05/23* Shavuos (Festival of Weeks; sabbatical)
-05/24* Shavuos (Festival of Weeks; sabbatical)
-05/24* Yizkor
-05/26* Parshas Nasso
-06/02* Parshas Beha'aloscha
-06/09* Parshas Shelach Lecha
-06/16* Parshas Korach
-06/16* Rosh Chodesh Tammuz (Beginning of the month of Tammuz)
-06/17* Rosh Chodesh Tammuz (Beginning of the month of Tammuz)
-06/23* Parshas Chukas
-06/30* Parshas Balak
-07/03* Fast of Shiv'a Asar B'Tammuz (Romans breach Wall of Jerusalem; fast day)
-07/03* Tzom Tammuz
-07/07* Parshas Pinchas
-07/14* Parshas Matos-Masei
-07/16* Rosh Chodesh Av (Beginning of the month of Av)
-07/21* Parshas Devarim
-07/21* Shabbos Hazon
-07/24* Fast of Tish'a B'Av (Babylon/Rome destroys Holy Temple; fast day)
-07/28* Parshas Vaeschanan
-07/28* Shabbos Nachamu
-07/30* Tu B'Av
-08/04* Parshas Eikev
-08/11* Parshas Re'eh
-08/14* Rosh Chodesh Elul (Beginning of the month of Elul)
-08/15* Rosh Chodesh Elul (Beginning of the month of Elul)
-08/18* Parshas Shoftim
-08/25* Parshas Ki Tetze
-09/01* Parshas Ki Savo
-09/08* Parshas Nitzavim-Vayeilech
-09/12* Erev Rosh Hashana
-09/13* First Day of Rosh Hashanah (Jewish New Year; 5768; sabbatical)
-09/13* Rosh Chodesh Tishrei (Beginning of the month of Tishrei)
-09/14* Rosh Hashanah (sabbatical)
-09/15* Parshas Ha'Azinu
-09/15* Shabbos Shuvah
-09/16* Fast of Gedalya (Murder of Gedalya and subsequent Exile; fast day)
-09/16* Tzom Gedaliah
-09/21* Erev Yom Kippur
-09/22* Yom Kippur (Day of Atonement; sabbatical, fast day)
-09/22* Yizkor
-09/26* Erev Sukkos
-09/27* Succos (Festival of Tabernacles; sabbatical)
-09/28* Succos (sabbatical)
-09/28* Sukkos (Second day of Sukkos)
-09/29* Sukkos (Third day of Sukkos)
-09/29* Hol Hamoed
-09/30* Sukkos (Fourth day of Sukkos)
-09/30* Hol Hamoed
-10/01* Sukkos (Fifth day of Sukkos)
-10/01* Hol Hamoed
-10/02* Sukkos (Sixth day of Sukkos)
-10/02* Hol Hamoed
-10/03* Hoshanah Rabba (Seventh day of Succos)
-10/03* Sukkos (Seventh day of Sukkos)
-10/04* Shmini Atzeres (8th Day of Gathering; sabbatical)
-10/04* Yizkor
-10/05* Simchas Torah (Rejoicing of the Law; sabbatical)
-10/06* Parshas Bereshis
-10/12* Rosh Chodesh Heshvan (Beginning of the month of Heshvan)
-10/13* Parshas Noach
-10/13* Rosh Chodesh Heshvan (Beginning of the month of Heshvan)
-10/20* Parshas Lech-Lecha
-10/27* Parshas Vayera
-11/03* Parshas Chayei Sara
-11/10* Parshas Toldos
-11/11* Rosh Chodesh Kislev (Beginning of the month of Kislev)
-11/17* Parshas Vayetzei
-11/24* Parshas Vayishlach
-12/01* Parshas Vayeshev
-12/04* Erev Chanukah
-12/04* Light 1st candle
-12/05* Chanukah (First Day)
-12/05* Light 2nd candle
-12/06* Chanukah (Second Day)
-12/06* Light 3rd candle
-12/07* Chanukah (Third Day)
-12/07* Light 4th candle
-12/08* Chanukah (Fourth Day)
-12/08* Parshas Miketz
-12/08* Light 5th candle
-12/09* Chanukah (Fifth Day)
-12/09* Light 6th candle
-12/10* Chanukah (Sixth Day)
-12/10* Rosh Chodesh Tevet (Beginning of the month of Tevet)
-12/10* Light 7th candle
-12/11* Chanukah (Seventh Day)
-12/11* Light 8th candle
-12/12* Chanukah (Eight Day)
-12/15* Parshas Vayigash
-12/19* Asara B'Tevet
-12/19* Fast of Asara B'Tevet (Babylonians put siege on Jerusalem; fast day)
-12/22* Parshas Vayechi
-12/29* Parshas Shemos
-
-
-#endif /* !_calendar_judaic_ */
diff --git a/usr.bin/calendar/calendars/calendar.lotr b/usr.bin/calendar/calendars/calendar.lotr
deleted file mode 100644
index 2450e36..0000000
--- a/usr.bin/calendar/calendars/calendar.lotr
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Lord Of The Rings
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_lotr_
-#define _calendar_lotr_
-
-01/05 Fellowship enters Moria
-01/09 Fellowship reaches Lorien
-01/17 Passing of Gandalf
-02/07 Fellowship leaves Lorien
-02/17 Death of Boromir
-02/20 Meriadoc & Pippin meet Treebeard
-02/22 Passing of King Ellesar
-02/24 Ents destroy Isengard
-02/26 Aragorn takes the Paths of the Dead
-03/05 Frodo & Samwise encounter Shelob
-03/08 Deaths of Denethor & Theoden
-03/18 Destruction of the Ring
-03/29 Flowering of the Mallorn
-04/04 Gandalf visits Bilbo
-04/17 An unexpected party
-04/23 Crowning of King Ellesar
-05/19 Arwen leaves Lorian to wed King Ellesar
-06/11 Sauron attacks Osgilliath
-06/13 Bilbo returns to Bag End
-06/23 Wedding of Ellesar & Arwen
-07/04 Gandalf imprisoned by Saruman
-07/24 The ring comes to Bilbo
-07/26 Bilbo rescued from Wargs by Eagles
-08/03 Funeral of King Theoden
-08/29 Saruman enters the Shire
-09/10 Gandalf escapes from Orthanc
-09/14 Frodo & Bilbo's birthday
-09/15 Black riders enter the Shire
-09/18 Frodo and company rescued by Bombadil
-09/28 Frodo wounded at Weathertop
-10/05 Frodo crosses bridge of Mitheithel
-10/16 Boromir reaches Rivendell
-10/17 Council of Elrond
-10/25 End of War of the Ring
-11/16 Bilbo reaches the Lonely Mountain
-12/05 Death of Smaug
-12/16 Fellowship begins Quest
-
-#endif /* !_calendar_lotr_ */
diff --git a/usr.bin/calendar/calendars/calendar.music b/usr.bin/calendar/calendars/calendar.music
deleted file mode 100644
index c738492..0000000
--- a/usr.bin/calendar/calendars/calendar.music
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Music
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_music_
-#define _calendar_music_
-
-01/01 Country Joe McDonald is born in El Monte, California, 1942
-01/03 Steven Stills is born in Dallas, 1945
-01/04 Jazz great Charlie Mingus dies at 57 in Cuernavaca, Mexico, 1979
-01/08 David Bowie (then David Robert Jones) is born in London, 1947
-01/08 Elvis Presley born, 1935
-01/09 James Patrick Page (Led Zeppelin) is born in Middlesex, England, 1945
-01/10 Blues guitarist Howlin' Wolf dies in Chicago, 1976
-01/10 Jim Croce is born in Philadelphia, 1943
-01/10 Pat Benatar is born in Long Island, 1952
-01/10 Rod Stewart is born in Glasgow, Scotland, 1945
-01/13 Eric Clapton plays the "Rainbow Concert" in London, 1973
-01/17 Led Zeppelin's first album is released, 1969
-01/19 Janis Joplin is born in Port Arthur, Texas, 1943
-01/22 Sam Cooke is born in Chicago, 1935
-01/24 Warren Zevon is born in Chicago, 1947
-01/25 Bob Dylan plays the second "Hurricane" benefit, in the Astrodome, 1978
-01/27 Bobby "Blue" Bland (Robert Calvin Bland) is born in Tennessee, 1930
-01/27 Wolfgang Amadeus Mozart is born in Salzburg, Austria, 1756
-01/28 Jimi Hendrix headlines Madison Square Garden, 1970
-01/30 Lightnin' Hopkins, the most-recorded blues artist ever, dies, 1982
-01/31 Franz Schubert is born in Lichtenthal, Vienna, Austria, 1797
-01/31 The Grateful Dead are busted in New Orleans, 1970
-02/01 RCA Victor unveils the 45 rpm record playing system, 1949
-02/02 Graham Nash is born in Lancashire, England, 1942
-02/03 Felix Mendelssohn Bartholdy is born in Hamburg, Germany, 1809
-02/03 The Day The Music Died; Buddy Holly, Richie Valens, and the Big
- Bopper are killed in a plane crash outside Mason City, Iowa, 1959
-02/07 Beatles land at JFK airport to begin first U.S. tour, 1964
-02/07 Steven Stills makes the first digitally recorded rock album, 1979
-02/09 Carole King (Carole Klein) is born in Brooklyn, 1941
-02/12 The Beatles play Carnegie Hall in New York City, 1964
-02/13 Richard Wagner dies in Venice, Italy, 1883
-02/17 Jazz great Thelonius Monk dies in Englewood, New Jersey, 1982
-02/18 Yoko Ono Lennon is born in Tokyo, 1933
-02/19 Paul McCartney's "Give Ireland Back to the Irish" is banned in
- Britain, 1972
-02/19 William "Smokey" Robinson is born in Detroit, 1940
-02/20 J. Geils (J. Geils Band) is born, 1946
-02/20 Yes sells out Madison Square Garden...without advertising, 1974
-02/23 George Friedrich Handel is born in Halle on the Saale, Germany, 1685
-02/23 Johnny Winter is born in Leland, Mississippi, 1944
-02/25 George Harrison born in Liverpool, England, 1943
-02/29 Jimmy Dorsey born, 1904
-03/01 Frederic Chopin is born in Zelazowa Wola, Warsaw, Poland, 1810
-03/01 Jim Morrison is busted for obscenity in Miami, 1969
-03/02 Blues guitarist Rory Gallagher is born in Ballyshannon, Ireland, 1949
-03/03 Buffalo Springfield is formed in Los Angeles, 1966
-03/04 Antonio Vivaldi born in Venice, Italy, 1678
-03/07 Last Gilbert & Sullivan opera produced, 1896
-03/08 Ron "Pigpen" McKernan (Grateful Dead) dies in California, 1973
-03/08 (Louis) Hector Berlioz dies in Paris, 1869
-03/09 Robin Trower is born in London, 1945
-03/13 The Allman Brothers record their live album at the Fillmore East, 1971
-03/15 Sly Stone born, 1944
-03/17 Paul Kantner (Jefferson Airplane) is born in San Francisco, 1942
-03/21 Johann Sebastian Bach is born in Eisenach, Germany, 1685
-03/22 Ten Years After plays their last concert, 1974
-03/25 Aretha Franklin is born in Detroit, 1943
-03/25 Bela Bartok is born in Nagyszentmiklos, Hungary, 1881
-03/26 Emerson, Lake, and Palmer record "Pictures at an Exhibition" live, 1971
-03/26 Ludwig van Beethoven dies in Vienna, Austria, 1827
-03/28 Sergej Rachmaninow dies in Beverley Hills, 1943
-03/29 Carl Orff dies in Munich, Germany, 1982
-03/29 Dr. Hook gets a group picture on the cover of "Rolling Stone", 1973
-03/30 Eric Clapton is born in Surrey, England, 1945
-03/31 Joseph Haydn is born in Rohrau, Austria, 1732
-04/01 Sergej Rachmaninow is born in Oneg, Russia, 1873
-04/02 Marvin Gaye is born in Washington, D.C., 1939
-04/04 Muddy Waters (McKinley Morganfield) is born in Rolling Fork,
- Mississippi, 1915
-04/09 Paul Robeson born, 1898
-04/10 Paul McCartney announces that he's quitting the Beatles, 1970
-04/14 George Friedrich Handel dies in London, England, 1759
-04/14 Ritchie Blackmore (Deep Purple, Rainbow) is born, 1945
-04/18 Yes breaks up after 13 years, 1981
-04/25 Blues guitarist Albert King is born, 1925
-04/25 Ella Fitzgerald born, 1918
-04/26 Carol Burnett born in San Antonio, Texas, 1933
-04/29 "Hair" premiers on Broadway, 1968
-05/01 Kate Smith born, 1909
-05/01 Antonin Dvorak dies in Prague, 1904
-05/03 Bob Seger is born in Ann Arbor, Michigan, 1945
-05/07 Johannes Brahms is born in Hamburg, Germany, 1833
-05/07 Tchaikowsky born, 1840
-05/10 Dave Mason is born in Worcester, England, 1945
-05/11 Bob Marley dies in his sleep in Miami, 1981
-05/12 Pink Floyd performs the first quadrophonic concert, 1977
-05/18 Gustav Mahler dies in Vienna, Austria, 1911
-05/18 Rick Wakeman is born in West London, England, 1949
-05/19 Pete Townshend is born in London, 1945
-05/20 The Jimi Hendrix Experience is signed by Reprise Records, 1967
-05/22 Richard Wagner is born in Leipzig, Germany, 1813
-05/23 Blues great Elmore James dies, 1963
-05/24 Bob Dylan (Robert Zimmerman) is born in Duluth, 1941
-05/26 Al Jolson born, 1886
-05/31 Joseph Haydn dies in Vienna, Austria, 1809
-05/31 The Who perform the loudest concert ever -- 76,000 watts of PA, 1976
-06/01 The Beatles release "Sgt. Pepper", 1967
-06/03 Georges Bizet dies in Bougival, Paris, France, 1875
-06/05 Carl Maria von Weber dies in London, England, 1826
-06/06 "Rock Around The Clock" makes Billboard's #1 slot, 1955
-06/06 Dee Dee Ramone dies, 2002
-06/07 Blind Faith debuts in concert at London's Hyde Park, 1969
-06/08 Robert Schumann is born in Zwickau, Germany, 1810
-06/09 Les Paul (Lester Polfus) is born in Waukesha, Wisconsin, 1923
-06/10 Howlin' Wolf (Chester Burnett) is born in West Point, Mississippi, 1910
-06/10 Judy Garland born, 1922
-06/11 Richard Strauss is born in Munich, Germany, 1864
-06/15 Edvard Grieg is born in Bergen, Norway, 1843
-06/15 Harry Nilsson is born in Brooklyn, 1941
-06/16 The Monterey Pop festival opens, 1967
-06/18 Paul McCartney born in Liverpool, England, 1942
-06/21 Columbia records announces the first mass production of LP's, 1948
-06/22 Todd Rundgren is born in Upper Darby, Pennsylvania, 1948
-06/24 Jeff Beck is born in Surrey, England, 1944
-06/27 John Entwistle dies in Las Vegas, 2002
-07/02 Felix Pappalardi and Leslie West form Mountain, 1969
-07/03 Jim Morrison dies in Paris, 1971
-07/06 The Jefferson Airplane is formed in San Francisco, 1965
-07/07 Gustav Mahler is born in Kalischt, Bohemia, 1860
-07/07 Ringo Starr (Richard Starkey) born in Liverpool, England, 1940
-07/10 Carl Orff is born in Munich, Germany, 1895
-07/12 Chicago DJ Steve Dahl holds "Disco Demolition" at Kamisky Park, 1979
-07/14 Woodie Guthrie born, 1912
-07/16 Cream forms in the U.K., 1966
-07/16 Harry Chapin dies on Long Island Expressway, 1981
-07/17 "Yellow Submarine" premieres at the London Pavilion, 1968
-07/20 Carlos Santana is born in Autlan, Mexico, 1947
-07/25 Bob Dylan goes electric at the Newport Folk Festival, 1965
-07/25 Crosby, Stills, Nash & Young debut at the Fillmore East, 1969
-07/26 Mick Jagger is born in Kent, England, 1943
-07/28 Antonio Vivaldi dies in Vienna, 1741
-07/28 Johann Sebastian Bach dies in Leipzig, 1750
-07/28 The Watkins Glen "Summer Jam" opens, 1973
-07/29 Robert Schumann dies in Endenich, Bonn, Germany, 1856
-08/01 The Concert for Bangla Desh takes place at Madison Square Garden, 1971
-08/04 John Lennon points out that "the Beatles are more popular than Jesus", 1966
-08/10 Ian Anderson (Jethro Tull) is born in Edinburgh, Scotland, 1947
-08/13 Dan Fogelberg is born in Peoria, Illinois, 1951
-08/15 Beatles replace drummer Pete Best with Richard Starkey, 1962
-08/15 The Beatles play Shea Stadium in New York, 1965
-08/15 Woodstock Festival, Max Yasgur's farm, 1969
-08/16 Elvis Presley dies, 1977
-08/16 Madonna Louise Ciccone born in Bay City, Michigan, 1958
-08/21 Joe Strummer (The Clash), born John Mellor in Ankara, Turkey, 1952
-08/23 Keith Moon is born in London, England, 1946
-08/26 Jimi Hendrix gives his last performance at the Isle of Wight, 1970
-08/26 Jimi Hendrix's Electric Ladyland Studios opens in New York, 1970
-09/04 Edvard Grieg dies in Bergen, Norway, 1907
-09/07 Keith Moon (The Who) dies in London of a drug overdose, 1978
-09/07 Warren Zevon dies in Los Angeles of lung cancer (mesothelioma), 2003
-09/08 Antonin Dvorak born in Nelahozeves, Bohemia, 1841
-09/08 Richard Strauss dies in Garmisch-Partenkirchen, Germany, 1949
-09/08 Ron "Pigpen" McKernan (Grateful Dead) is born in San Bruno, California, 1945
-09/14 Francis Scott Key writes words to "Star Spangled Banner", 1814
-09/16 B.B. King is born in Itta Bena, Mississippi, 1925
-09/18 Dee Dee Ramone (Douglas Colvin) born in Fort Lee, Virginia, 1952
-09/19 Simon & Garfunkel reunite to play New York's Central Park, 1981
-09/20 Jim Croce dies in a plane crash, 1973
-09/23 "Paul is dead" rumors sweep the country, 1969
-09/23 Bruce "The Boss" Springsteen is born in Freehold, New Jersey, 1949
-09/25 John Bonham (Led Zeppelin) dies of alcohol poisoning, 1980
-09/26 Bela Bartok dies in New York, 1945
-09/26 George Gershwin is born in Brooklyn, NY, 1898
-10/04 Janis Joplin dies of a heroin overdose in Hollywood, 1970
-10/05 Steve Miller is born in Dallas, 1943
-10/07 First Bandstand (later, American Bandstand) broadcast, 1957
-10/09 John Entwistle is born in London, England, 1944
-10/09 John Lennon born in Liverpool, England, 1940
-10/10 John Prine is born in Maywood, Illinois, 1946
-10/12 Ray Conniff dies after falling down and hitting his head, 2002
-10/12 The Jimi Hendrix Experience is formed in London, 1966
-10/16 Bob Weir (Grateful Dead) is born in San Francisco, 1947
-10/17 "Hair" opens at New York's Public Theater, 1967
-10/17 Frederic Chopin dies in Paris, France, 1849
-10/18 Chuck Berry is born in San Jose, California, 1926
-10/20 Three members of Lynyrd Skynyrd die in a plane crash, 1977
-10/21 Jesus Christ Super Star debuted on Broadway, 1971
-10/22 Franz Liszt born, 1811
-10/22 Pablo Casals dies in Puerto Rico, 1973
-10/25 Georges Bizet is born in Paris, France, 1838
-10/25 Jon Anderson (Yes) is born in Lancashire, England, 1944
-10/25 The Rolling Stones appear on The Ed Sullivan Show, 1964
-10/29 Duane Allman dies in motorcycle crash near Macon, Georgia, 1971
-10/30 Grace Slick is born in Chicago, 1939
-11/02 Jimi Hendrix's "Electric Ladyland" enters US charts at #1, 1968
-11/02 Keith Emerson is born, 1944
-11/03 James Taylor and Carly Simon are married in Manhattan, 1972
-11/04 Felix Mendelssohn Bartholdy dies in Leipzig, Germany, 1847
-11/06 Ray Conniff born in Attleboro, Massachusetts, 1916
-11/07 Joni Mitchell (Roberta Joan Anderson) is born in Alberta, Canada, 1943
-11/08 Patti Page born, 1927
-11/09 The first issue of "Rolling Stone" is published, 1967
-11/10 Greg Lake is born in Bournemouth, England, 1948
-11/12 Neil Young is born in Toronto, 1945
-11/13 Paul Simon born, 1942
-11/16 Bill Ham first demonstrates his psychedelic "Light Show", 1965
-11/18 Carl Maria von Weber is born in Eutin, Germany, 1786
-11/19 Franz Schubert dies in Vienna, Austria, 1828
-11/20 Duane Allman is born in Nashville, Tennessee, 1946
-11/20 Joe Walsh is born in Cleveland, 1947
-11/22 Saint Cecilia's day (patron saint of music)
-11/24 Scott Joplin born, 1868
-11/25 "The Last Waltz" concert is played by The Band at Winterland, 1976
-11/25 Johann Strauss, Jr., writes `On the Beautiful Blue Danube', 1867
-11/26 Cream performs their farewell concert at Royal Albert Hall, 1968
-11/26 Paul Hindemith is born in Hanau, Germany, 1895
-11/27 Jimi Hendrix (Johnny Allen Hendrix) is born in Seattle, 1942
-11/29 Pau Casals born in Vendrell, 1876
-11/30 George Harrison dies at 13:30 in L.A., 2001
-12/04 Frank Zappa dies in his Laurel Canyon home shortly before 18:00, 1993
-12/05 Wolfgang Amadeus Mozart dies in Vienna, Austria, 1791
-12/06 First sound recording made by Thomas Edison, 1877
-12/06 The Rolling Stones play Altamont Speedway near San Francisco, 1969
-12/07 Harry Chapin is born in New York City, 1942
-12/08 Jim Morrison is born in Melbourne, Florida, 1943
-12/08 John Lennon is shot and killed in New York City, 1980
-12/09 The Who's "Tommy" premieres in London, 1973
-12/11 (Louis) Hector Berlioz born in La-Côte-Saint-André, 1803
-12/13 Ted Nugent, the motor city madman, born in Detroit, 1949
-12/15 Thomas Edison receives patent on the phonograph, 1877
-12/16 Don McLean's "American Pie" is released, 1971
-12/17 Ludwig van Beethoven is christened in Bonn, 1770
-12/21 Frank Zappa is born in Baltimore, 1940
-12/23 First G&S collaboration, Thespis, 1871
-12/23 Joe Strummer (born John Mellor) dies in Broomfield, England, 2002
-12/28 Edgar Winter is born in Beaumont, Texas, 1946
-12/28 Paul Hindemith dies in Frankfurt/Main, Germany, 1963
-12/31 Jimi Hendrix introduces the Band of Gypsies at the Fillmore East, 1969
-
-#endif /* !_calendar_music_ */
diff --git a/usr.bin/calendar/calendars/calendar.newzealand b/usr.bin/calendar/calendars/calendar.newzealand
deleted file mode 100644
index be069df..0000000
--- a/usr.bin/calendar/calendars/calendar.newzealand
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * New Zealand holidays
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_newzealand_
-#define _calendar_newzealand_
-
-Jan 02 New Year Holiday (NZ)
-Jan 14 Anniversary Day (Southland)
-Jan 21 Anniversary Day (Wellington)
-Jan 28 Anniversary Day (Auckland)
-Feb 06 Waitangi Day (NZ)
-Mar 11 Anniversary Day (Taranaki)
-Mar 25 Anniversary Day (Otago)
-Jun 03 Queen's Birthday (NZ)
-Sep 23 Anniversary Day (South Canterbury)
-Oct 25 Anniversary Day (Hawke's Bay)
-Oct 28 Labour Day (NZ)
-Nov 04 Anniversary Day (Marlborough)
-Nov 15 Anniversary Day (Canterbury)
-Dec 02 Anniversary Day (Chatham Islands)
-
-#endif
diff --git a/usr.bin/calendar/calendars/calendar.russian b/usr.bin/calendar/calendars/calendar.russian
deleted file mode 100644
index 0701876..0000000
--- a/usr.bin/calendar/calendars/calendar.russian
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * Russian calendar files
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_russian_
-#define _calendar_russian_
-
-#include <ru_RU.KOI8-R/calendar.all>
-
-#endif /* !_calendar_russian_ */
diff --git a/usr.bin/calendar/calendars/calendar.southafrica b/usr.bin/calendar/calendars/calendar.southafrica
deleted file mode 100644
index ae683b0..0000000
--- a/usr.bin/calendar/calendars/calendar.southafrica
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * South African holidays
- * Note: The Public Holidays Act (Act No 36 of 1994) determines whenever
- * any public holiday falls on a Sunday, the Monday following on it shall
- * be an unnamed public holiday in addition to the named holiday the day
- * before. This file format is not complex enough to reflect this, but
- * if it ever is, the change should be made.
- * $FreeBSD$
- */
-
-#ifndef _calendar_southafrica_
-#define _calendar_southafrica_
-
-03/01 Human Rights Day in South Africa
-04/27 Freedom Day in South Africa
-05/01 Workers Day in South Africa
-06/16 Youth Day in South Africa
-08/09 National Women's Day in South Africa
-09/24 Heritage Day in South Africa
-12/16 Day of Reconciliation in South Africa
-12/26 Day of Goodwill in South Africa
-
-#endif
diff --git a/usr.bin/calendar/calendars/calendar.ukrainian b/usr.bin/calendar/calendars/calendar.ukrainian
deleted file mode 100644
index 3cff8c5..0000000
--- a/usr.bin/calendar/calendars/calendar.ukrainian
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * Ukrainian calendar files
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_ukrainian_
-#define _calendar_ukrainian_
-
-#include <uk_UA.KOI8-U/calendar.all>
-
-#endif /* !_calendar_ukrainian_ */
diff --git a/usr.bin/calendar/calendars/calendar.usholiday b/usr.bin/calendar/calendars/calendar.usholiday
deleted file mode 100644
index 8ae0bc0..0000000
--- a/usr.bin/calendar/calendars/calendar.usholiday
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * USA holiday
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_usholiday_
-#define _calendar_usholiday_
-
-01/01 New Year's Day
-01/14 Julian Calendar New Year's Day
-02/02 Groundhog Day
-02/14 St. Valentine's Day
-02/MonThird President's Day (3rd Monday of February)
-03/05 Mother-in-Law Day, USA
-03/SunSecond Daylight Savings Time begins in USA; clocks move forward (2nd Sunday of March)
-03/17 St. Patrick's Day
-03/20* Vernal Equinox
-04/01 April Fool's Day
-04/15 Income Tax Day, USA.
-04/28* Arbor Day, USA (varies from state to state)
-05/SunSecond Mother's Day (2nd Sunday of May)
-05/SatThird Armed Forces in USA Day (3rd Saturday of May)
-05/MonLast Memorial Day in USA (Last Monday of May)
-06/SunThird Father's Day (3rd Sunday of June)
-06/21* Summer Solstice
-07/04 US Independence Day
-09/MonFirst Labor Day in USA (1st Monday of September)
-09/SunSecond Grandparent's Day in USA (2nd Sunday of September; varies from state to state)
-09/22* Autumnal Equinox
-10/MonSecond Columbus Day in USA (2nd Monday of October)
-10/31 All Hallows Eve (Halloween)
-11/05* Election Day in USA (1st Tuesday after 1st Monday for even years)
-11/SunFirst Daylight Savings Time ends in USA; clocks move back (1st Sunday of November)
-11/11 Veterans' Day
-11/ThuFourth Thanksgiving Day (4th Thursday in November)
-12/21* Winter Solstice
-12/24 Christmas Eve
-12/25 Christmas
-12/31 New Year's Eve
-
-#endif /* !_calendar_usholiday_ */
diff --git a/usr.bin/calendar/calendars/calendar.world b/usr.bin/calendar/calendars/calendar.world
deleted file mode 100644
index 2b65f1a..0000000
--- a/usr.bin/calendar/calendars/calendar.world
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * World wide calendar files, except national calendars
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_world_
-#define _calendar_world_
-
-#include <calendar.birthday>
-#include <calendar.christian>
-#include <calendar.computer>
-#include <calendar.history>
-#include <calendar.lotr>
-#include <calendar.holiday>
-#include <calendar.judaic>
-#include <calendar.music>
-
-#endif /* !_calendar_world_ */
diff --git a/usr.bin/calendar/calendars/de_AT.ISO_8859-15/calendar.feiertag b/usr.bin/calendar/calendars/de_AT.ISO_8859-15/calendar.feiertag
deleted file mode 100644
index 751c001..0000000
--- a/usr.bin/calendar/calendars/de_AT.ISO_8859-15/calendar.feiertag
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Feiertage
- *
- * $FreeBSD$
- */
-
-#ifndef _de_AT_ISO8859_15_feiertag_
-#define _de_AT_ISO8859_15_feiertag_
-
-LANG=de_AT.ISO8859-15
-
-/* arbeitsfreie staatliche Feiertage */
-01/01 Neujahr
-05/01 Staatsfeiertag
-10/26 Nationalfeiertag
-
-/* christliche Feiertage, meist irgendwo arbeitsfrei */
-01/06 Heilige 3 Könige
-Easter-2 Karfreitag
-Easter Ostersonntag
-Easter+1 Ostermontag
-Easter+49 Pfingstsonntag
-Easter+50 Pfingstmontag
-Easter+39 Christi Himmelfahrt
-Easter+60 Fronleichnam
-
-08/15 Mariä Himmelfahrt
-
-11/01 Allerheiligen
-11/02 Allerseelen
-
-12/08 Mariä Empfängnis
-12/24 Heiligabend
-12/25 Weihnachten
-12/26 Stephanstag
-12/31 Silvester
-
-/* Gedenktage - nicht arbeitsfreie Feiertage */
-02/14 Valentinstag
-02/WednesdayLast Aschermittwoch
-Easter-7 Palmsonntag
-Nov Sun+3 Totensonntag
-Nov Sun+4 1. Advent
-Dec Sun+1 2. Advent
-12/06 Nikolaus
-Dec Sun+2 3. Advent
-Dec Sun+3 4. Advent
-
-/* Jahreszeiten */
-03/20* Frühlingsanfang
-06/21* Sommeranfang
-09/23* Herbstanfang
-12/21* Winteranfang
-
-/* Sommer- und Winterzeit */
-03/SundayLast Anfang der Sommerzeit
-10/SundayLast Ende der Sommerzeit
-
-/* Blumenverkäufer */
-May Sun+2 Muttertag
-
-#endif /*! _de_AT_ISO8859_15_feiertag_ */
diff --git a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.all b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.all
deleted file mode 100644
index f2a33cc..0000000
--- a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.all
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * deutscher Kalender
- *
- * $FreeBSD$
- */
-
-#ifndef _de_DE_ISO8859_1_all_
-#define _de_DE_ISO8859_1_all_
-
-#include <de_DE.ISO8859-1/calendar.feiertag>
-#include <de_DE.ISO8859-1/calendar.geschichte>
-#include <de_DE.ISO8859-1/calendar.kirche>
-#include <de_DE.ISO8859-1/calendar.literatur>
-#include <de_DE.ISO8859-1/calendar.musik>
-#include <de_DE.ISO8859-1/calendar.wissenschaft>
-
-#endif /* !_de_DE.ISO8859-1_all_ */
diff --git a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.feiertag b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.feiertag
deleted file mode 100644
index f966c0d..0000000
--- a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.feiertag
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Feiertage
- *
- * $FreeBSD$
- */
-
-#ifndef _de_DE_ISO8859_1_feiertag_
-#define _de_DE_ISO8859_1_feiertag_
-
-LANG=de_DE.ISO8859-1
-
-/* arbeitsfreie staatliche Feiertage */
-01/01 Neujahr
-05/01 Maifeiertag
-10/03 Tag der deutschen Einheit
-
-/* christliche Feiertage, meist irgendwo arbeitsfrei */
-Easter-2 Karfreitag
-Easter Ostersonntag
-Easter+1 Ostermontag
-Easter+49 Pfingstsonntag
-Easter+50 Pfingstmontag
-Easter+39 Christi Himmelfahrt
-Easter+60 Fronleichnam
-
-08/08 Friedensfest (Augsburg)
-08/15 Mariä Himmelfahrt
-
-10/31 Reformationstag
-11/01 Allerheiligen
-11/02 Allerseelen
-11/Wed+4 Buß- und Bettag
-
-12/24 Heiligabend
-12/25 Erster Weihnachtstag
-12/26 Zweiter Weihnachtstag
-12/31 Silvester
-
-/* Gedenktage - nicht arbeitsfreie Feiertage :-( */
-06/17 Arbeiteraufstand am 17. Juni 1953
-01/27 Gedenktag für die Opfer des Nationalsozialismus
-
-/* Jahreszeiten */
-03/20* Frühlingsanfang
-06/21* Sommeranfang
-09/23* Herbstanfang
-12/21* Winteranfang
-
-/* Sommer- und Winterzeit */
-03/SundayLast Anfang der Sommerzeit
-10/SundayLast Ende der Sommerzeit
-
-/* Blumenverkäufer */
-May Sun+2 Muttertag
-
-#endif /*! _de_DE_ISO8859_1_feiertag_ */
diff --git a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.geschichte b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.geschichte
deleted file mode 100644
index 4ca78bb..0000000
--- a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.geschichte
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * deutsche Geschichte
- *
- *
- * Die Angaben wurden überwiegend entnommen aus dem Buch:
- *
- * Fragen an die deutsche Geschichte, Ideen, Kräfte, Entscheidungen von
- * 1800 bis zur Gegenwart; historische Ausstellung im Reichstagsgebäude
- * in Berlin; Katalog, 16. Auflage, Sonderausgabe - Bonn: Deutscher
- * Bundestag, Referat Öffentlichkeitsarbeit, 1990
- *
- * English Title: Questions on German history
- *
- * ISBN 3-924521-59-X
- *
- * $FreeBSD$
- */
-
-#ifndef _de_DE_ISO8859_1_geschichte_
-#define _de_DE_ISO8859_1_geschichte_
-
-LANG=de_DE.ISO8859-1
-
-/* 1800-1933 */
-07/11 Gründung des Rheinbundes, 1806
-10/14 Doppelschlacht bei Jena und Auerstedt, 1806
-10/16 Völkerschlacht bei Leipzig, 1813
-06/18 Niederlage Napoleons bei Waterloo, 1815
-10/18 Wartburgfest der Deutschen Burschenschaften, 1817
-01/01 Inkrafttreten des Vertrages über den deutschen Zollverein, 1834
-12/07 Erste deutsche Eisenbahn zwischen Nürnberg und Fürth, 1835
-06 Aufstand der schlesischen Weber, 1844
-12/21 Verabschiedung des Gesetzes über die Grundrechte des deutschen
- Volkes durch die Frankfurter Nationalversammlung, 1848
-03/27 Annahme der deutschen Reichsverfassung in der Frankfurter
- Paulskirche, Wahl von Friedrich Wilhelm IV von Preußen zum
- deutschen Kaiser, 1849
-04/28 Ablehnung der deutschen Kaiserkrone durch den preußischen König, 1849
-07/03 Schlacht von Königgrätz
-07/13 Emser Depesche, 1870
-07/18 Verkündung des Dogmas von der päpstlichen Unfehlbarkeit
- durch das I. Vatikanische Konzil
-01/18 Proklamation des deutschen Kaiserreiches in Versailles, 1871
-10/18 Verabschiedung des Sozialistengesetzes durch den Reichstag, 1878
-03/20 Entlassung von Bismarck als Reichskanzler und
- preußischer Ministerpräsident, 1890
-06/21 Eröffnung des Nord-Ostsee-Kanals, 1895
-01/07 Billigung des Bürgerlichen Gesetzbuches (BGB) durch den Reichstag, 1896
-01/01 Bürgerliches Gesetzbuch tritt in Kraft, 1900
-06/28 Ermordung des österreichischen Thronfolgers Erzherzog Franz
- Ferdinand durch serbische Nationalisten in Sarajewo, 1914
-07/28 Kriegserklärung Österreich-Ungarns an Serbien, 1914
-08/01 Deutsche Mobilmachung und Kriegserklärung an Rußland, 1914
-08/03 Deutsche Kriegserklärung an Frankreich, 1914
-08/04 Kriegserklärung Großbritanniens an Deutschland, 1914
-08/04 Bewilligung der Kriegskredite im Reichstag, 1914
-08/26 Schlacht bei Tannenberg, 1914
-02/21 Schlacht um Verdun, 1916
-03/08 Ausbruch der Revolution in Rußland, Abdankung von Zar Nikolaus II, 1917
-04/06 Kriegserklärung der USA an Deutschland, 1917
-12/15 Waffenstillstand zwisch Rußland und Deutschland, 1917
-03/03 Frieden von Brest-Litowsk, 1918
-11/03 Matrosenaufstand in Kiel, 1918
-11/09 Ausrufung der Republik durch Scheidemann (SPD), 1918
-02/11 Friedrich Ebert wird Reichspräsident, Weimar 1919
-06/28 Unterzeichnung des Versailler Vertrages, 1919
-03/21 Volksabstimmung in Oberschlesien, 1921
-04/16 Vertrag von Rapallo, 1922
-06/24 Ermordung von Reichsaußenminister Rathenau, 1922
-01/11 Besetzung des Ruhrgebietes durch Frankreich und Belgien, 1923
-09/10 Eintritt Deutschlands in den Völkerbund, 1926
-10/25 Schwarzer Freitag in New York, Beginn der Weltwirtschaftskrise, 1929
-
-
-/* II. Weltkrieg */
-10/14 Austritt Deutschlands aus dem Völkerbund, 1933
-03/16 Wiedereinführung der allgemeinen Wehrpflicht in Deutschland, 1935
-10/25 Deutsch-italienischer Vertrag, Achse Berlin-Rom, 1936
-11/25 Antikominternpakt zwischen Deutschland und Japan, 1936
-01/13 Volksabstimmung im Saargebiet über die Rückführung
- ins deutsche Reich, 1935
-03/12 Einmarsch deutscher Truppen in Österreich, 1938
-09/29 Münchner Abkommen, 1938
-03/15 Einmarsch deutscher Truppen in die Tschechoslowakei, 1939
-03/23 Rückgabe des Memelgebietes an Deutschland, 1939
-08/23 Abschluß des Hitler-Stalin-Paktes, 1939
-09/03 Kriegserklärung Großbritaniens und Frankreichs an Deutschland, 1939
-04/09 Deutsche Besetzung Dänemarks, Invasion in Norwegen, 1940
-05/10 Deutscher Angriff auf Belgien, die Niederlande, Luxemburg
- und Frankreich, 1940
-06/22 Deutscher Angriff gegen die Sowjetunion, 1941
-12/11 Kriegserklärung Deutschlands an die USA, 1941
-01/14 Konferenz von Casablanca, 1943
-01/31 Kapitulation der 6. deutschen Armee in Stalingrad, 1943
-06/06 Alliierte Landung in Nordwestfrankreich, 1944
-02/04 Konferenz von Jalta, 4.-11.2. 1945
-04/25 Zusammentreffen von amerikanischen und sowjetischen Truppen
- bei Torgau an der Elbe, 1945
-05/08 Bedingungslose Kapitulation von Deutschland, 1945
-07/01 Rückzug britischer und amerikanischer Truppen aus Sachsen, Thüringen und
- Mecklenburg, Einmarsch westlicher Truppen in Berlin, 1945
-07/17 Potsdamer Konferenz, 1945
-09/01 Deutscher Überfall auf Polen, Beginn des 2. Weltkrieges, 1939
-10/01 Verkündigung der Urteile im Nürnberger Hauptkriegsverbrecherprozeß, 1946
-02/25 Auflösung der Landes Preußen durch den Kontrollrat, 1947
-08/06 Erster Atombombenabwurf auf Hiroshima, 1945
-08/08 Atombombenabwurf auf Nagasaki, 1945
-04/19 Aufstand im Warschauer Ghetto, 1943
-12/07 Japan bombardiert Pearl Harbor, 1941
-
-/* Deutschland nach dem 2. Weltkrieg */
-04/11 Attentat auf Dutschke, Studentenunruhen, 1968
-04/26 GAU in Tschernobyl, 1986
-05/05 Natobeitritt, Wiederbewaffnung, Souveränität der Bundesrepublik, 1955
-05/06 Rücktritt von Brandt, 1974
-05/16 Wahl von Schmidt (SPD) zum Bundeskanzler, 1974
-05/23 Verkündung des Grundgesetzes, 1949
-05/23 Wahl von Richard von Weizsäcker zum Bundespräsidenten, 1984
-06/05 Marshallplan, 1947
-06/20 Währungsreform in den Westzonen, 1948
-06/24 Beginn der Berliner Blockade, 1948
-07/01 Wahl von Heinrich Lübke zum Bundespräsidenten, 1959
-07/01 Wirtschafts- und Währungsunion, 1990
-08/12 Deutsch-sowjetischer Gewaltverzichtsvertrag, Moskau 1970
-08/14 Wahl zum ersten deutschen Bundestag, 1949
-09/03 Vier-Mächte-Abkommen über Berlin, 1971
-09/05 Entführung und Ermordung von Arbeitgeberpräsident Schleyer,
- Entführung einer Lufthansa-Maschine nach Mogadischu, 1977
-09/07 DDR-Staatsratsvorsitzender Honecker in der Bundesrepublik, 1987
-09/12 Wahl von Theodor Heuss (FDP) zum Bundespräsidenten, 1949
-09/15 Wahl von Konrad Adenauer (CDU) zum Bundeskanzler, 1949
-09/17 Bruch der Sozialliberalen Koalition, 1982
-09/18 Aufnahme von Bundesrepublik und DDR in die UNO, 1973
-10/01 Ablösung von Bundeskanzler Schmidt durch Kohl, 1982
-10/23 Volksabstimmung im Saargebiet, 1955
-12/02 Washingtoner Abkommen über Bi-Zone, 1946
-12/07 Deutsch-polnischer Vertrag, Warschau 1970
-12/10 Friedensnobelpreis für Brandt, 1971
-12/12 Nachrüstungsbeschluß des NATO-Ministerates, 1979
-12/21 Grundlagenvertrag zwischen DDR und Bundesrepublik, 1972
-
-
-/* Nationalsozialismus */
-11/09 Hitler-Putsch in München/Marsch auf die Feldherrenhalle, 1923
-11/09 Reichskristallnacht, 1938
-09/14 Reichstagswahl: Erdrutsch zugunsten der NSDAP, 1930
-07/31 Reichstagswahl: NSDAP wird stärkste Fraktion, 1932
-11/06 Reichstagswahl: Rückgang der NSDAP, 1932
-01/30 Ernennung von Hitler zum Reichskanzler, 1933
-02/27 Reichstagsbrand, 1933
-03/05 Reichstagswahl: Mehrheit für NSDAP+DNVP, 1933
-03/23 Annahme des Ermächtigungsgesetzes, 1933
-03/31 Erstes Gesetz zur Gleichschaltung der Länder, 1933
-04/01 Organisierter Boykott jüdischer Geschäfte, 1933
-04/07 Zweites Gesetz zur Gleichschaltung der Länder, 1933
-05/02 Auflösung der Gewerkschaften, 1933
-06 Auflösung aller Parteien außer NSDAP, 1933
-07/20 Konkordat zwischen Deutschland und dem Vatikan, 1933
-06/30 Röhm-Putsch, Ausschaltung der SA-Führung, 1934
-09/15 Nürnberger Gesetze, 1935
-01/08 Eröffnung der olympischen Spiele in Berlin, 1936
-01/20 Wannseekonferenz, 1942
-04/30 Selbstmord Hitlers, 1945
-07/29 Mussolini geboren, 1883
-
-/* Sozialismus */
-01/21 Lenin gestorben, 1924
-06 Gründung des Bundes der Kommunisten in London
- durch Marx und Engels, 1847
-05/23 Gründung des Allgemeinen Deutschen Arbeitervereins in Leipzig
- unter Führung von Ferdinand Lassalles, 1863
-08/07 Gründung der Sozialdemokratischen Arbeiterpartei in Eisenach
- unter der Führung von August Bebel und Wilhelm Liebknecht, 1869
-04/06 Gründung der Unabhängigen Sozialdemokratischen Partei, Gotha 1917
-11/07 Oktoberrevolution in Rußland, Putsch der Bolschewisten, 1917
-12/31 Gründung der KPD, 1918
-01/15 Ermordung von Rosa Luxemburg und Karl Liebknecht, 1919
-03/05 Tod Stalins, 1953
-03/18 Erste demokratische Volkskammerwahl, 1990
-04/21 Zwangsvereinigung von KPD und SPD zur SED, 1946
-05/14 Gründung der Warschauer Paktes, 1955
-06/17 Arbeiteraufstand am 17. Juni 1953
-06/25 Begin der Korea-Krieges, 1950
-08/13 Bau der Berliner Mauer, 1961
-08/21 Einmarsch des Warschauer Pakts in die Tschechoslowakei, 1968
-10/03 Offizielles Ende der DDR :-), 1990
-10/07 Gründung der DDR, 1949
-10/09 Massendemonstration in Leipzig, 1989
-10/14 Kuba-Krise, 1962
-10/18 Ablösung von Erich Honecker als SED-Generalsekretär, 1989
-11/09 Fall der Berliner Mauer, 1989
-09/09 Mao Tse-Tung gestorben im Alter von 82 Jahren, 1976
-11/10 Sowjetischer Präsident Leonid Breschnew gestorben, Alter 75, 1982
-03/27 Chruschtschow wird sowjetischer Präsident, 1958
-10/12 Chruschtschow schlägt während einer Rede in der UNO mit den
- Schuhen auf den Tisch, 1960
-
-#endif /* _de_DE_ISO8859_1_geschichte_ */
diff --git a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.kirche b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.kirche
deleted file mode 100644
index 02640b1..0000000
--- a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.kirche
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Kirche in Deutschland
- *
- * $FreeBSD$
- */
-
-#ifndef _de_DE_ISO8859_1_kirche_
-#define _de_DE_ISO8859_1_kirche_
-
-LANG=de_DE.ISO8859-1
-
-Easter-46 Aschermittwoch
-Easter-48 Rosenmontag
-Easter-7 Palmsonntag
-
-11/Sun-3 Volkstrauertag (maybe)
-11/Sun-2 Volkstrauertag oder Totensonntag
-11/Sun-1 1. Advent oder Totensonntag
-12/Sun+1 1. oder 2. Advent
-12/Sun+2 2. oder 3. Advent
-12/Sun+3 3. oder 4. Advent
-12/Sun+4 4. Advent (maybe)
-
-12/06 Nikolaus
-12/25 1. Weihnachtstag
-12/26 2. Weihnachtstag
-
-/* Evangelische Kirche */
-11/10 Martin Luther geboren in Eisleben, 1483
-10/31 95 Thesen von Luther, Wittenberg, 1517
-
-#endif /* !_de_DE_ISO8859_1_kirche_ */
diff --git a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.literatur b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.literatur
deleted file mode 100644
index bfa33e6..0000000
--- a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.literatur
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Literatur
- *
- * $FreeBSD$
- */
-
-#ifndef _de_DE_ISO8859_1_literatur_
-#define _de_DE_ISO8859_1_literatur_
-
-LANG=de_DE.ISO8859-1
-
-/* Schriftsteller
-
- Fontane
- Goethe
- Grass
- Hegel
- Heine
- Schiller
- */
-
-01/04 Jakob Grimm geboren, 1785
-01/18 Arno Schmidt in Hamburg geboren, 1914
-02/09 Thomas Bernhard in Heerlen geboren, 1931
-02/12 Immanuel Kant in Königsberg gestorben, 1804
-02/12 Thomas Bernhard in Gmunden gestorben, 1989
-02/17 Heinrich Heine in Paris gestorben, 1856
-03/22 Johann Wolfgang von Goethe in Weimar gestorben, 1832
-04/22 Kant geboren, 1724
-05/09 Friedrich von Schiller in Weimar gestorben, 1805
-06/03 Arno Schmidt in Celle gestorben, 1979
-06/03 Franz Kafka in Prag gestorben, 1924
-06/06 Thomas Mann in Lübeck geboren, 1875
-07/03 Franz Kafka geboren, 1883
-08/12 Thomas Mann gestorben, 1955
-08/27 Georg Wilhelm Friedrich Hegel in Stuttgart geboren, 1770
-08/28 Johann Wolfgang von Goethe in Frankfurt am Main geboren, 1749
-09/20 Theodor Fontane in Berlin gestorben, 1898
-10/16 Günter Grass in Danzig geboren, 1927
-11/10 Friedrich von Schiller in Marbach geboren, 1759
-11/14 Georg Wilhelm Friedrich Hegel in Berlin gestorben, 1831
-12/13 Heinrich Heine in Düsseldorf geboren, 1797
-12/30 Theodor Fontane in Neuruppin geboren, 1819
-
-
-/* Verlage */
-03/09 "die tageszeitung" als erste täglich aktualisierte deutsche
- Tageszeitung im WWW, 1995, Betatest, vollständige Ausgabe
-05/05 Schweriner Volkszeitung als erste deutsche Tageszeitung im WWW, 1995
-05/12 "die tageszeitung" offiziell im WWW, 1995
-08/31 Hitler stellt Frankfurter Zeitung ein, 1943
-11/01 Frankfurter Allgemeine Zeitung in Leben gerufen, 1949
-
-#endif /* !_de_DE_ISO8859_1_literatur_ */
diff --git a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.musik b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.musik
deleted file mode 100644
index 318969c..0000000
--- a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.musik
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Musik
- *
- * $FreeBSD$
- */
-
-#ifndef _de_DE_ISO8859_1_musik_
-#define _de_DE_ISO8859_1_musik_
-
-LANG=de_DE.ISO8859-1
-
-/* Barock */
-02/23 Georg Friedrich Händel in Halle an der Saale geboren, 1685
-03/14 Georg Philipp Telemann in Magdeburg geboren, 1681
-03/21 Johann Sebastian Bach in Eisenach geboren, 1685
-04/14 Georg Friedrich Händel in London gestorben, 1759
-06/25 Georg Philipp Telemann in Hamburg gestorben, 1767
-07/17 Diderich Buxtehude in Lübeck gestorben, 1707
-07/28 Johann Sebastian Bach in Leipzig gestorben, 1750
-
-/* Klassik */
-01/27 Wolfgang Amadeus Mozart in Salzburg geboren, 1756
-01/31 Franz Schubert in Lichtenthal bei Wien geboren, 1797
-02/03 Felix Mendelssohn Bartholdy in Hamburg geboren, 1809
-02/13 Richard Wagner in Venedig gestorben, 1883
-03/01 Frederic Chopin in Zelazowa-Wola bei Warschau geboren, 1810
-03/08 (Louis) Hector Berlioz in Paris gestorben, 1869
-03/25 Bela Bartok in Nagyszentmiklos geboren, 1881
-03/26 Ludwig van Beethoven in Wien gestorben, 1827
-03/28 Sergej Rachmaninow in Beverley Hills gestorben, 1943
-03/29 Carl Orff in München gestorben, 1982
-03/31 Joseph Haydn in Rohrau geboren, 1732
-04/01 Sergej Rachmaninow in Oneg geboren, 1873
-04/03 Johannes Brahms in Wien gestorben, 1897
-05/07 Johannes Brahms in Hamburg geboren, 1833
-05/18 Gustav Mahler in Wien gestorben, 1911
-05/22 Richard Wagner in Leipzig geboren, 1813
-05/31 Joseph Haydn in Wien gestorben, 1809
-06/03 Georges Bizet in Bougival bei Paris gestorben, 1875
-06/05 Carl Maria von Weber in London gestorben, 1826
-06/08 Robert Schumann in Zwickau geboren, 1810
-06/11 Richard Strauss in München geboren, 1864
-06/15 Edvard Grieg in Bergen geboren, 1843
-07/07 Gustav Mahler in Kalischt geboren, 1860
-07/10 Carl Orff in München geboren, 1895
-07/29 Robert Schumann in Endenich bei Bonn gestorben, 1856
-07/31 Franz Liszt in Bayreuth gestorben, 1886
-09/04 Edvard Grieg in Bergen gestorben, 1907
-09/08 Richard Strauss in Garmisch-Partenkirchen gestorben, 1949
-09/26 Bela Bartok in New York gestorben, 1945
-10/17 Frederic Chopin in Paris gestorben, 1849
-10/22 Franz Liszt in Raiding (Ungarn) geboren, 1811
-10/25 Georges Bizet in Paris geboren, 1838
-11/04 Felix Mendelssohn Bartholdy in Leipzig gestorben, 1847
-11/18 Carl Maria von Weber in Eutin geboren, 1786
-11/19 Franz Schubert in Wien gestorben, 1828
-11/26 Paul Hindemith in Hanau geboren, 1895
-12/05 Wolfgang Amadeus Mozart in Wien gestorben, 1791
-12/11 (Louis) Hector Berlioz in La-Côte-Saint-André geboren, 1803
-12/17 Ludwig van Beethoven in Bonn getauft, 1770
-12/28 Paul Hindemith in Frankfurt am Main gestorben, 1963
-
-/* Pop */
-09/18 Jimi Hendrix in Paris gestorben, 1970
-
-#endif /* !_de_DE_ISO8859_1_musik_ */
diff --git a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.wissenschaft b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.wissenschaft
deleted file mode 100644
index 2c76392..0000000
--- a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.wissenschaft
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Wissenschaft
- *
- * $FreeBSD$
- */
-
-#ifndef _de_DE_ISO8859_1_wissenschaft_
-#define _de_DE_ISO8859_1_wissenschaft_
-
-LANG=de_DE.ISO8859-1
-
-04/12 Erster Mann im All, Juri Gagarin, 1961
-04/18 Einstein gestorben, 1955
-06/22 Konrad Zuse geboren in Berlin, 1919
-10/04 Sputnik 1, erster Satellit im Weltraum, 1957
-12/18 Konrad Zuse gestorben in Hünfeld, 1995
-
-
-#endif /* ! _de_DE_ISO8859_1_wissenschaft_ */
diff --git a/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.all b/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.all
deleted file mode 100644
index 785512e..0000000
--- a/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.all
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * Calendrier français
- *
- * $FreeBSD$
- */
-
-#ifndef _fr_FR_ISO8859_1_all_
-#define _fr_FR_ISO8859_1_all_
-
-#include <fr_FR.ISO8859-1/calendar.jferies>
-#include <fr_FR.ISO8859-1/calendar.fetes>
-#include <fr_FR.ISO8859-1/calendar.proverbes>
-
-#endif /* !_fr_FR.ISO8859-1_all_ */
diff --git a/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.fetes b/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.fetes
deleted file mode 100644
index 7ee3b92..0000000
--- a/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.fetes
+++ /dev/null
@@ -1,630 +0,0 @@
-/*
- * Fêtes à souhaiter
- *
- * $FreeBSD$
- */
-
-#ifndef _fr_FR_ISO8859_1_fetes_
-#define _fr_FR_ISO8859_1_fetes_
-
-LANG=fr_FR.ISO8859-1
-
-/*
- * N.B.: ceci n'est pas un calendrier liturgique !
- * Il a seulement été réalisé pour me faire payer à boire
- * par mes collègues de travail ; on n'y trouve donc que
- * des prénoms seuls.
- *
- * Par ex. « St Antoine de Padoue » se retrouve abrégé en
- * Antoine, et si Antoine est fêté plusieurs jours par an,
- * tant mieux pour lui, c'est voulu.
- */
-
-01/01 Aujourd'hui, c'est la St(e) Almaque.
-01/01 N'oubliez pas les Télémaque !
-01/02 Bonne fête aux Basile !
-01/02 Aujourd'hui, c'est la St(e) Vassili.
-01/02 N'oubliez pas les Grégoire !
-01/03 Bonne fête aux Geneviève !
-01/03 Aujourd'hui, c'est la St(e) Ginette.
-01/04 N'oubliez pas les Odilon !
-01/04 Bonne fête aux Angèle !
-01/04 Aujourd'hui, c'est la St(e) Robert.
-01/05 N'oubliez pas les Édouard !
-01/05 Bonne fête aux Gerlac !
-01/06 Aujourd'hui, c'est la St(e) Mélaine.
-01/06 N'oubliez pas les André !
-01/07 Galette des rois
-01/07 Aujourd'hui, c'est la St(e) Raymond.
-01/07 N'oubliez pas les Raymonde !
-01/07 Bonne fête aux Virginie !
-01/08 Aujourd'hui, c'est la St(e) Lucien.
-01/08 N'oubliez pas les Lucienne !
-01/08 Bonne fête aux Peggy !
-01/08 Aujourd'hui, c'est la St(e) Gudule.
-01/09 N'oubliez pas les Adrien !
-01/09 Bonne fête aux Alix !
-01/10 Aujourd'hui, c'est la St(e) Guillaume.
-01/10 N'oubliez pas les Guillemette !
-01/11 Bonne fête aux Paulin !
-01/11 Aujourd'hui, c'est la St(e) Pauline.
-01/12 N'oubliez pas les Tatiana !
-01/12 Bonne fête aux Alfred !
-01/12 Aujourd'hui, c'est la St(e) Ailred (Aelred, Eilred, Elred).
-01/13 N'oubliez pas les Vivant !
-01/13 Bonne fête aux Vivence !
-01/13 Aujourd'hui, c'est la St(e) Hilaire.
-01/13 N'oubliez pas les Yvette !
-01/14 Bonne fête aux Nina !
-01/14 Aujourd'hui, c'est la St(e) Séraphin.
-01/15 N'oubliez pas les Rémi !
-01/16 Bonne fête aux Marcel !
-01/16 Aujourd'hui, c'est la St(e) Marcelle.
-01/16 N'oubliez pas les Marceau !
-01/16 Bonne fête aux Honorat !
-01/17 Aujourd'hui, c'est la St(e) Roseline.
-01/17 N'oubliez pas les Antoine !
-01/17 Bonne fête aux Anthony !
-01/18 Aujourd'hui, c'est la St(e) Prisca.
-01/18 N'oubliez pas les Libert !
-01/19 Bonne fête aux Marius !
-01/19 Aujourd'hui, c'est la St(e) Canut.
-01/20 N'oubliez pas les Fabienne !
-01/20 Bonne fête aux Sébastien !
-01/20 Aujourd'hui, c'est la St(e) Bastien.
-01/21 N'oubliez pas les Agnès !
-01/21 Bonne fête aux Fructueux !
-01/21 Aujourd'hui, c'est la St(e) Augure.
-01/21 N'oubliez pas les Euloge !
-01/21 Bonne fête aux Avit !
-01/22 Aujourd'hui, c'est la St(e) Vincent.
-01/22 N'oubliez pas les Blésille !
-01/23 Bonne fête aux Barnard !
-01/24 Aujourd'hui, c'est la St(e) François.
-01/25 N'oubliez pas les Morgane !
-01/26 Bonne fête aux Paule !
-01/26 Aujourd'hui, c'est la St(e) Timothée.
-01/26 N'oubliez pas les Tite !
-01/27 Bonne fête aux Angèle !
-01/28 Aujourd'hui, c'est la St(e) Thomas.
-01/29 N'oubliez pas les Gildas !
-01/29 Bonne fête aux Sulpice !
-01/30 Aujourd'hui, c'est la St(e) Martine.
-01/31 N'oubliez pas les Marcelle !
-01/31 Bonne fête aux Jean !
-02/01 Aujourd'hui, c'est la St(e) Ella.
-02/01 N'oubliez pas les Viridiane !
-02/02 Bonne fête aux Théophane !
-02/03 Aujourd'hui, c'est la St(e) Blaise.
-02/03 N'oubliez pas les Anschaire !
-02/04 Bonne fête aux Véronique !
-02/04 Aujourd'hui, c'est la St(e) Jeanne.
-02/04 N'oubliez pas les Gilbert !
-02/05 Bonne fête aux Agathe !
-02/06 Aujourd'hui, c'est la St(e) Gaston.
-02/06 N'oubliez pas les Armand !
-02/07 Bonne fête aux Eugénie !
-02/07 Aujourd'hui, c'est la St(e) Partène.
-02/08 N'oubliez pas les Jacqueline !
-02/08 Bonne fête aux Jérôme !
-02/09 Aujourd'hui, c'est la St(e) Apolline.
-02/09 N'oubliez pas les Appollonie !
-02/10 Bonne fête aux Arnaud !
-02/10 Aujourd'hui, c'est la St(e) Scholastique.
-02/11 N'oubliez pas les Séverin !
-02/11 Bonne fête aux Séverine !
-02/12 Aujourd'hui, c'est la St(e) Félix.
-02/12 N'oubliez pas les Eulalie !
-02/13 Bonne fête aux Béatrice !
-02/13 Aujourd'hui, c'est la St(e) Polyeucte.
-02/14 N'oubliez pas les Valentin !
-02/14 Bonne fête aux Méthode !
-02/14 Aujourd'hui, c'est la St(e) Cyrille.
-02/15 N'oubliez pas les Claude !
-02/15 Bonne fête aux Georgette !
-02/16 Aujourd'hui, c'est la St(e) Julienne.
-02/17 N'oubliez pas les Alexis !
-02/18 Bonne fête aux Bernadette et aux Nadine !
-02/19 Aujourd'hui, c'est la St(e) Gabin.
-02/20 N'oubliez pas les Aimée !
-02/20 Bonne fête aux Aimé !
-02/20 Aujourd'hui, c'est la St(e) Amata.
-02/21 N'oubliez pas les Pierre-Damien !
-02/22 Bonne fête aux Isabelle !
-02/23 Aujourd'hui, c'est la St(e) Lazare.
-02/23 N'oubliez pas les Polycarpe !
-02/24 Bonne fête aux Modeste !
-02/25 Aujourd'hui, c'est la St(e) Roméo.
-02/25 N'oubliez pas les Avertan !
-02/26 Bonne fête aux Nestor !
-02/27 Aujourd'hui, c'est la St(e) Honorine.
-02/27 N'oubliez pas les Gabriel !
-02/28 Bonne fête aux Romain !
-02/28 Aujourd'hui, c'est la St(e) Lupicin.
-02/29 N'oubliez pas les Auguste !
-03/01 Bonne fête aux Aubin !
-03/01 Aujourd'hui, c'est la St(e) Albin.
-03/02 N'oubliez pas les Charles !
-03/03 Bonne fête aux Guénolé (Gwénolé) !
-03/04 Aujourd'hui, c'est la St(e) Casimir.
-03/05 N'oubliez pas les Olive !
-03/05 Bonne fête aux Olivia !
-03/06 Aujourd'hui, c'est la St(e) Colette.
-03/06 N'oubliez pas les Nicole !
-03/07 Bonne fête aux Félicité !
-03/07 Aujourd'hui, c'est la St(e) Félicie.
-03/07 N'oubliez pas les Perpétue !
-03/08 Bonne fête aux Jean !
-03/09 Aujourd'hui, c'est la St(e) Françoise.
-03/10 N'oubliez pas les Vivien !
-03/10 Bonne fête aux Dominique !
-03/11 Aujourd'hui, c'est la St(e) Rosine.
-03/12 N'oubliez pas les Justine !
-03/12 Bonne fête aux Maximilien !
-03/13 Aujourd'hui, c'est la St(e) Rodrigue.
-03/13 N'oubliez pas les Salomon !
-03/13 Bonne fête aux Euphrasie !
-03/14 Aujourd'hui, c'est la St(e) Mathilde.
-03/15 N'oubliez pas les Louise !
-03/16 Bonne fête aux Bénédicte !
-03/16 Aujourd'hui, c'est la St(e) Benoîte.
-03/16 N'oubliez pas les Julien !
-03/17 C'est la St Patrick !
-03/17 Aujourd'hui, c'est la St(e) Patrice.
-03/18 N'oubliez pas les Cyrille !
-03/19 Bonne fête aux Joseph !
-03/20 Aujourd'hui, c'est la St(e) Herbert.
-03/20 N'oubliez pas les Wulfran !
-03/21 Bonne fête aux Clémence !
-03/22 Aujourd'hui, c'est la St(e) Léa.
-03/23 N'oubliez pas les Victorien !
-03/23 Bonne fête aux Turibio !
-03/24 Aujourd'hui, c'est la St(e) Catherine.
-03/24 N'oubliez pas les Karine !
-03/26 Bonne fête aux Lara !
-03/26 Aujourd'hui, c'est la St(e) Ludger.
-03/26 N'oubliez pas les Larissa !
-03/27 Bonne fête aux Habib !
-03/28 Aujourd'hui, c'est la St(e) Gontran.
-03/29 N'oubliez pas les Gwladys !
-03/29 Bonne fête aux Eustase !
-03/30 Aujourd'hui, c'est la St(e) Amédée.
-03/31 N'oubliez pas les Benjamin !
-03/31 Bonne fête aux Benjamine !
-04/01 Votre fichier calendar est corrompu.
-04/01 N'oubliez pas les Hugues !
-04/02 Bonne fête aux Sandrine !
-04/03 Aujourd'hui, c'est la St(e) Richard.
-04/04 N'oubliez pas les Isidore !
-04/04 Bonne fête aux Benoît !
-04/05 Aujourd'hui, c'est la St(e) Irène.
-04/05 N'oubliez pas les Vincent !
-04/06 Bonne fête aux Marcellin !
-04/06 Aujourd'hui, c'est la St(e) Célestin.
-04/06 N'oubliez pas les Guillaume !
-04/07 Bonne fête aux Jean-Baptiste !
-04/07 Aujourd'hui, c'est la St(e) Julienne.
-04/08 N'oubliez pas les Perpet !
-04/08 Bonne fête aux Perpetuus !
-04/09 Aujourd'hui, c'est la St(e) Gautier.
-04/09 N'oubliez pas les Jean !
-04/10 Bonne fête aux Fulbert !
-04/10 Aujourd'hui, c'est la St(e) Michel.
-04/11 N'oubliez pas les Stanislas !
-04/11 Bonne fête aux Gemma !
-04/11 Aujourd'hui, c'est la St(e) Léon.
-04/12 N'oubliez pas les Jules !
-04/12 Bonne fête aux Sabas !
-04/13 Aujourd'hui, c'est la St(e) Ida.
-04/13 N'oubliez pas les Herménégilde !
-04/14 Bonne fête aux Maxime !
-04/14 Aujourd'hui, c'est la St(e) Lydwine.
-04/14 N'oubliez pas les Bénézet !
-04/15 Bonne fête aux Pierre !
-04/16 Aujourd'hui, c'est la St(e) Benoît.
-04/17 N'oubliez pas les Anicet !
-04/17 Bonne fête aux Kateri !
-04/18 Aujourd'hui, c'est la St(e) Parfait.
-04/19 N'oubliez pas les Emma !
-04/19 Bonne fête aux Elphège !
-04/20 Aujourd'hui, c'est la St(e) Odette.
-04/20 N'oubliez pas les Agnès !
-04/21 Bonne fête aux Anselme !
-04/22 Aujourd'hui, c'est la St(e) Alexandre.
-04/22 N'oubliez pas les Soter !
-04/22 Bonne fête aux Caïus !
-04/22 Aujourd'hui, c'est la St(e) Léonide.
-04/23 N'oubliez pas les Georges !
-04/23 Bonne fête aux Pierre !
-04/24 Aujourd'hui, c'est la St(e) Fidèle.
-04/24 N'oubliez pas les Marie-Euphrasie !
-04/25 Bonne fête aux Marc !
-04/26 Aujourd'hui, c'est la St(e) Alida.
-04/27 N'oubliez pas les Zita !
-04/27 Bonne fête aux Pierre !
-04/28 Aujourd'hui, c'est la St(e) Valérie.
-04/28 N'oubliez pas les Louis-Marie !
-04/28 Bonne fête aux Paul !
-04/29 Aujourd'hui, c'est la St(e) Joseph-Benoît.
-04/29 N'oubliez pas les Hugues !
-04/30 Bonne fête aux Robert !
-04/30 Aujourd'hui, c'est la St(e) Catherine.
-05/02 N'oubliez pas les Boris !
-05/03 Bonne fête aux Jacques !
-05/03 Aujourd'hui, c'est la St(e) Philippe.
-05/04 N'oubliez pas les Sylvain !
-05/05 Bonne fête aux Judith !
-05/06 Aujourd'hui, c'est la St(e) Prudence.
-05/07 N'oubliez pas les Gisèle !
-05/09 Bonne fête aux Pacôme !
-05/10 Aujourd'hui, c'est la St(e) Solange.
-05/11 N'oubliez pas les Estelle !
-05/12 Bonne fête aux Achille !
-05/14 Aujourd'hui, c'est la St(e) Matthias.
-05/15 N'oubliez pas les Denise !
-05/16 Bonne fête aux Honoré !
-05/17 Aujourd'hui, c'est la St(e) Pascal.
-05/18 N'oubliez pas les Éric !
-05/19 Bonne fête aux Yves !
-05/19 Aujourd'hui, c'est la St(e) Yvonne.
-05/20 N'oubliez pas les Bernardin !
-05/21 Bonne fête aux Constantin !
-05/22 Aujourd'hui, c'est la St(e) Émile.
-05/23 N'oubliez pas les Didier !
-05/24 Bonne fête aux Donatien !
-05/25 Aujourd'hui, c'est la St(e) Sophie.
-05/26 N'oubliez pas les Bérenger !
-05/28 Bonne fête aux Germain !
-05/29 Aujourd'hui, c'est la St(e) Aymard.
-05/30 N'oubliez pas les Ferdinand !
-06/01 Bonne fête aux Justin !
-06/02 Aujourd'hui, c'est la St(e) Blandine.
-06/03 N'oubliez pas les Kévin !
-06/04 Bonne fête aux Clotilde !
-06/05 Aujourd'hui, c'est la St(e) Igor.
-06/06 N'oubliez pas les Norbert !
-06/07 Bonne fête aux Gilbert !
-06/08 Aujourd'hui, c'est la St(e) Médard.
-06/09 N'oubliez pas les Diane !
-06/11 Bonne fête aux Barnabé !
-06/11 Aujourd'hui, c'est la St(e) Yolande.
-06/12 N'oubliez pas les Guy !
-06/13 Bonne fête aux Antoine !
-06/14 Aujourd'hui, c'est la St(e) Élisée.
-06/15 N'oubliez pas les Germaine !
-06/16 Bonne fête aux Jean-François !
-06/17 Aujourd'hui, c'est la St(e) Hervé.
-06/18 N'oubliez pas les Léonce !
-06/19 Bonne fête aux Romuald !
-06/20 Aujourd'hui, c'est la St(e) Silvère.
-06/21 N'oubliez pas les Rodolphe !
-06/22 Bonne fête aux Alban !
-06/23 Aujourd'hui, c'est la St(e) Audrey.
-06/24 N'oubliez pas les Jean-Baptiste !
-06/25 Bonne fête aux Prosper !
-06/26 Aujourd'hui, c'est la St(e) Anthelme.
-06/27 N'oubliez pas les Fernand !
-06/28 Bonne fête aux Irénée !
-06/29 Aujourd'hui, c'est la St(e) Paul.
-06/29 N'oubliez pas les Pierre !
-06/30 Bonne fête aux Martial !
-07/01 Aujourd'hui, c'est la St(e) Thierry.
-07/02 N'oubliez pas les Martinien !
-07/03 Bonne fête aux Thomas !
-07/04 Aujourd'hui, c'est la St(e) Florent.
-07/05 N'oubliez pas les Antoine !
-07/06 Bonne fête aux Mariette !
-07/07 Aujourd'hui, c'est la St(e) Raoul.
-07/08 N'oubliez pas les Thibaut !
-07/09 Bonne fête aux Amandine !
-07/10 Aujourd'hui, c'est la St(e) Ulrich.
-07/11 N'oubliez pas les Benoît !
-07/12 Bonne fête aux Olivier !
-07/13 Aujourd'hui, c'est la St(e) Henri.
-07/13 N'oubliez pas les Joël !
-07/14 Bonne fête aux Camille !
-07/15 Aujourd'hui, c'est la St(e) Donald.
-07/17 N'oubliez pas les Caroline !
-07/17 Bonne fête aux Charlotte !
-07/18 Aujourd'hui, c'est la St(e) Frédéric.
-07/19 N'oubliez pas les Arsène !
-07/20 Bonne fête aux Marina !
-07/21 Aujourd'hui, c'est la St(e) Victor.
-07/22 N'oubliez pas les Marie-Madeleine !
-07/23 Bonne fête aux Brigitte !
-07/24 Aujourd'hui, c'est la St(e) Christine.
-07/25 N'oubliez pas les Jacques !
-07/26 Bonne fête aux Anne !
-07/26 Aujourd'hui, c'est la St(e) Joachim.
-07/27 N'oubliez pas les Nathalie !
-07/28 Bonne fête aux Samson !
-07/29 Aujourd'hui, c'est la St(e) Marthe.
-07/30 N'oubliez pas les Juliette !
-07/31 Bonne fête aux Ignace !
-08/01 Aujourd'hui, c'est la St(e) Alphonse.
-08/01 N'oubliez pas les Pierre !
-08/02 Bonne fête aux Julien !
-08/03 Aujourd'hui, c'est la St(e) Lydie.
-08/03 N'oubliez pas les Pierre-Julien !
-08/04 Bonne fête aux Jean-Marie !
-08/04 Aujourd'hui, c'est la St(e) Dominique.
-08/05 N'oubliez pas les Abel !
-08/05 Bonne fête aux Oswald !
-08/07 Aujourd'hui, c'est la St(e) Gaëtan.
-08/08 N'oubliez pas les Dominique !
-08/08 Bonne fête aux Cyriaque !
-08/09 Aujourd'hui, c'est la St(e) Amour.
-08/10 N'oubliez pas les Laurent !
-08/11 Bonne fête aux Claire !
-08/11 Aujourd'hui, c'est la St(e) Philomène.
-08/12 N'oubliez pas les Clarisse !
-08/13 Bonne fête aux Hyppolite !
-08/13 Aujourd'hui, c'est la St(e) Radegonde.
-08/14 N'oubliez pas les Évrard !
-08/14 Bonne fête aux Maximilien !
-08/15 Aujourd'hui, c'est la St(e) Marie.
-08/16 N'oubliez pas les Armel !
-08/16 Bonne fête aux Roch !
-08/17 Aujourd'hui, c'est la St(e) Hyacinthe.
-08/18 N'oubliez pas les Hélène !
-08/19 Bonne fête aux Jean-Eudes !
-08/19 Aujourd'hui, c'est la St(e) Louis.
-08/20 N'oubliez pas les Bernard !
-08/21 Bonne fête aux Christophe !
-08/21 Aujourd'hui, c'est la St(e) Jeanne.
-08/22 N'oubliez pas les Fabrice !
-08/22 Bonne fête aux Symphorien !
-08/23 Aujourd'hui, c'est la St(e) Rose.
-08/23 N'oubliez pas les Philippe !
-08/24 Bonne fête aux Barthélémy !
-08/25 Aujourd'hui, c'est la St(e) Louis.
-08/26 N'oubliez pas les Natacha !
-08/26 Bonne fête aux Zéphirin !
-08/26 Aujourd'hui, c'est la St(e) Eulade.
-08/27 N'oubliez pas les Edwige !
-08/27 Bonne fête aux Joseph !
-08/28 Aujourd'hui, c'est la St(e) Augustin.
-08/29 N'oubliez pas les Sabine !
-08/30 Bonne fête aux Fiacre !
-08/30 Aujourd'hui, c'est la St(e) Rose.
-08/31 N'oubliez pas les Aristide !
-08/31 Bonne fête aux Raymond !
-09/01 Aujourd'hui, c'est la St(e) Gilles.
-09/02 N'oubliez pas les Ingrid !
-09/03 Bonne fête aux Grégoire !
-09/04 Aujourd'hui, c'est la St(e) Rosalie.
-09/05 N'oubliez pas les Raïssa !
-09/06 Bonne fête aux Bertrand !
-09/07 Aujourd'hui, c'est la St(e) Reine.
-09/09 N'oubliez pas les Alain !
-09/10 Bonne fête aux Inès !
-09/11 Aujourd'hui, c'est la St(e) Adelphe.
-09/12 N'oubliez pas les Apollinaire !
-09/13 Bonne fête aux Aimé !
-09/15 Aujourd'hui, c'est la St(e) Roland.
-09/16 N'oubliez pas les Édith !
-09/17 Bonne fête aux Renaud !
-09/18 Aujourd'hui, c'est la St(e) Nadège.
-09/19 N'oubliez pas les Émilie !
-09/20 Bonne fête aux Davy !
-09/21 Aujourd'hui, c'est la St(e) Matthieu.
-09/22 N'oubliez pas les Maurice !
-09/23 Bonne fête aux Constant !
-09/24 Aujourd'hui, c'est la St(e) Thècle.
-09/25 N'oubliez pas les Hermann !
-09/26 Bonne fête aux Côme !
-09/26 Aujourd'hui, c'est la St(e) Damien.
-09/27 N'oubliez pas les Vincent !
-09/28 Bonne fête aux Venceslas !
-09/29 Aujourd'hui, c'est la St(e) Michel.
-09/29 N'oubliez pas les Raphaël !
-09/30 Bonne fête aux Jérôme !
-10/01 Aujourd'hui, c'est la St(e) Thérèse.
-10/02 N'oubliez pas les Léger !
-10/03 Bonne fête aux Gérard !
-10/04 Aujourd'hui, c'est la St(e) François.
-10/05 N'oubliez pas les Placide !
-10/05 Bonne fête aux Fleur !
-10/05 Aujourd'hui, c'est la St(e) Flore.
-10/05 N'oubliez pas les Pâquerette !
-10/05 Bonne fête aux Violette !
-10/05 Aujourd'hui, c'est la St(e) Pervenche.
-10/05 N'oubliez pas les Anémone !
-10/05 Bonne fête aux Bluette !
-10/05 Aujourd'hui, c'est la St(e) Capucine.
-10/05 N'oubliez pas les Dahlia !
-10/05 Bonne fête aux Myrtille !
-10/05 Aujourd'hui, c'est la St(e) Hortense.
-10/05 N'oubliez pas les Violaine !
-10/05 Bonne fête aux Anne-Aymone !
-10/05 Aujourd'hui, c'est la St(e) Dalie.
-10/06 N'oubliez pas les Bruno !
-10/06 Bonne fête aux Foy !
-10/07 Aujourd'hui, c'est la St(e) Serge.
-10/08 N'oubliez pas les Pélagie !
-10/26 Bonne fête aux Démétrius !
-10/09 Aujourd'hui, c'est la St(e) Denis.
-10/09 N'oubliez pas les Denys !
-10/10 Bonne fête aux Ghislain !
-10/10 Aujourd'hui, c'est la St(e) Ghislaine.
-10/10 N'oubliez pas les Guislain !
-10/10 Bonne fête aux Guislaine !
-10/11 Aujourd'hui, c'est la St(e) Firmin.
-10/11 N'oubliez pas les Gausbert !
-10/12 Bonne fête aux Wilfried !
-10/12 Aujourd'hui, c'est la St(e) Séraphin.
-10/13 N'oubliez pas les Géraud !
-10/14 Bonne fête aux Juste !
-10/14 Aujourd'hui, c'est la St(e) Calliste.
-10/15 N'oubliez pas les Thérèse !
-10/16 Bonne fête aux Edwige !
-10/16 Aujourd'hui, c'est la St(e) Marie-Marguerite.
-10/17 N'oubliez pas les Baudoin !
-10/17 Bonne fête aux Ignace !
-10/18 Aujourd'hui, c'est la St(e) Luc.
-10/19 N'oubliez pas les René !
-10/20 Bonne fête aux Adeline !
-10/20 Aujourd'hui, c'est la St(e) Aline.
-10/20 N'oubliez pas les Line !
-10/21 Bonne fête aux Céline !
-10/21 Aujourd'hui, c'est la St(e) Hilarion.
-10/22 N'oubliez pas les Élodie !
-10/22 Bonne fête aux Nunillon !
-10/22 Aujourd'hui, c'est la St(e) Salomé.
-10/23 N'oubliez pas les Jean !
-10/24 Bonne fête aux Florentin !
-10/25 Aujourd'hui, c'est la St(e) Crépin.
-10/25 N'oubliez pas les Crépinien !
-10/25 Bonne fête aux Chrysanthe !
-10/25 Aujourd'hui, c'est la St(e) Darie.
-10/25 N'oubliez pas les Enguerran !
-10/26 Bonne fête aux Dimitri !
-10/26 Aujourd'hui, c'est la St(e) Évariste.
-10/27 N'oubliez pas les Émeline !
-10/27 Bonne fête aux Didier !
-10/27 Aujourd'hui, c'est la St(e) Frumence.
-10/28 N'oubliez pas les Jude !
-10/28 Bonne fête aux Judas !
-10/28 Aujourd'hui, c'est la St(e) Thaddée.
-10/28 N'oubliez pas les Simon !
-10/28 Bonne fête aux Simone (Simonne) !
-10/29 Aujourd'hui, c'est la St(e) Narcisse.
-10/30 N'oubliez pas les Bienvenue !
-10/30 Bonne fête aux Dorothée !
-10/31 Aujourd'hui, c'est la St(e) Quentin.
-10/31 N'oubliez pas les Alphonse !
-10/31 Bonne fête aux Wolfgang !
-11/03 Aujourd'hui, c'est la St(e) Hubert.
-11/04 N'oubliez pas les Charles !
-11/04 Bonne fête aux Amans !
-11/05 Aujourd'hui, c'est la St(e) Sylvie.
-11/05 N'oubliez pas les Sylvette !
-11/05 Bonne fête aux Sylviane !
-11/05 Aujourd'hui, c'est la St(e) Zacharie.
-11/05 N'oubliez pas les Élisabeth !
-11/06 Bonne fête aux Bertille !
-11/06 Aujourd'hui, c'est la St(e) Léonard.
-11/06 N'oubliez pas les Winnoc !
-11/07 Bonne fête aux Carine !
-11/07 Aujourd'hui, c'est la St(e) Karine.
-11/07 N'oubliez pas les Ernest !
-11/07 Bonne fête aux Ernst !
-11/07 Aujourd'hui, c'est la St(e) Willibrord.
-11/08 N'oubliez pas les Geoffroy !
-11/09 Bonne fête aux Théodore !
-11/10 Aujourd'hui, c'est la St(e) Léon.
-11/10 N'oubliez pas les Léontine !
-11/10 Bonne fête aux Lionel !
-11/11 Aujourd'hui, c'est la St(e) Martin.
-11/12 N'oubliez pas les Christian !
-11/12 Bonne fête aux Josaphat !
-11/13 Aujourd'hui, c'est la St(e) Brice.
-11/13 N'oubliez pas les Diégo !
-11/13 Bonne fête aux Didace !
-11/14 Aujourd'hui, c'est la St(e) Sidoine.
-11/14 N'oubliez pas les Sidonie !
-11/14 Bonne fête aux Sérapion !
-11/15 Aujourd'hui, c'est la St(e) Albert.
-11/16 N'oubliez pas les Marguerite !
-11/16 Bonne fête aux Gertrude !
-11/17 Aujourd'hui, c'est la St(e) Élisabeth.
-11/17 N'oubliez pas les Élise !
-11/17 Bonne fête aux Lise !
-11/18 Aujourd'hui, c'est la St(e) Aude.
-11/19 N'oubliez pas les Tanguy !
-11/19 Bonne fête aux Tanneguy !
-11/19 Aujourd'hui, c'est la St(e) Mechtilde.
-11/19 N'oubliez pas les Mathilde !
-11/19 Bonne fête aux Patrocle !
-11/20 Aujourd'hui, c'est la St(e) Edmond.
-11/20 N'oubliez pas les Octave !
-11/20 Bonne fête aux Adventor !
-11/20 Aujourd'hui, c'est la St(e) Solutor.
-11/20 N'oubliez pas les Ambroise !
-11/20 Bonne fête aux Rutus !
-11/22 Aujourd'hui, c'est la St(e) Cécile.
-11/22 N'oubliez pas les Célia !
-11/23 Bonne fête aux Clément !
-11/23 Aujourd'hui, c'est la St(e) Clémentine.
-11/23 N'oubliez pas les Colomban !
-11/24 Bonne fête aux Augusta !
-11/24 Aujourd'hui, c'est la St(e) Flora.
-11/25 N'oubliez pas les Catherine !
-11/24 Bonne fête aux Maria !
-11/26 Aujourd'hui, c'est la St(e) Delphine.
-11/26 N'oubliez pas les Elzéar !
-11/27 Bonne fête aux Séverin !
-11/27 Aujourd'hui, c'est la St(e) Séverine.
-11/27 N'oubliez pas les Maxime !
-11/28 Bonne fête aux Jacques !
-11/29 Aujourd'hui, c'est la St(e) Saturnin.
-11/29 N'oubliez pas les Sernin (Cernin) !
-11/29 Bonne fête aux Savourin !
-11/29 Aujourd'hui, c'est la St(e) Sornin.
-11/30 N'oubliez pas les André !
-11/30 Bonne fête aux Andréa !
-12/01 Aujourd'hui, c'est la St(e) Florence.
-12/01 N'oubliez pas les Éloi !
-12/01 Bonne fête aux Airy !
-12/02 Aujourd'hui, c'est la St(e) Viviane.
-12/03 N'oubliez pas les François-Xavier !
-12/03 Bonne fête aux Xavier !
-12/03 Aujourd'hui, c'est la St(e) Eugène.
-12/04 N'oubliez pas les Barbara !
-12/04 Bonne fête aux Barbe !
-12/05 Aujourd'hui, c'est la St(e) Gérald.
-12/05 N'oubliez pas les Géraldine !
-12/05 Bonne fête aux Géraud !
-12/05 Aujourd'hui, c'est la St(e) Sabas.
-12/06 N'oubliez pas les Nicolas !
-12/07 Bonne fête aux Ambroise !
-12/09 Aujourd'hui, c'est la St(e) Pierre.
-12/10 N'oubliez pas les Romaric !
-12/10 Bonne fête aux Eulalie !
-12/10 Aujourd'hui, c'est la St(e) Melchaide.
-12/10 N'oubliez pas les Miltiade !
-12/11 Bonne fête aux Daniel !
-12/11 Aujourd'hui, c'est la St(e) Damase.
-12/12 N'oubliez pas les Chantal !
-12/13 Bonne fête aux Lucie !
-12/13 Aujourd'hui, c'est la St(e) Rolande.
-12/13 N'oubliez pas les Aurore !
-12/14 Bonne fête aux Odile !
-12/15 Aujourd'hui, c'est la St(e) Ninon.
-12/15 N'oubliez pas les Nina !
-12/15 Bonne fête aux Christiane !
-12/15 Aujourd'hui, c'est la St(e) Christina.
-12/16 N'oubliez pas les Alice !
-12/16 Bonne fête aux Adélaïde !
-12/16 Aujourd'hui, c'est la St(e) Évrard.
-12/16 N'oubliez pas les Éberhard !
-12/17 Bonne fête aux Gaël !
-12/17 Aujourd'hui, c'est la St(e) Lazare.
-12/17 N'oubliez pas les Olympe !
-12/17 Bonne fête aux Olympias !
-12/17 Aujourd'hui, c'est la St(e) Judicaël.
-12/18 N'oubliez pas les Gatien !
-12/18 Bonne fête aux Winebald !
-12/19 Aujourd'hui, c'est la St(e) Urbain.
-12/20 N'oubliez pas les Abraham !
-12/20 Bonne fête aux Théophile !
-12/21 Aujourd'hui, c'est la St(e) Pierre.
-12/22 N'oubliez pas les Françoise-Xavière !
-12/22 Bonne fête aux Flavien !
-12/23 Aujourd'hui, c'est la St(e) Armand.
-12/24 N'oubliez pas les Adèle !
-12/24 Bonne fête aux Charbel !
-12/25 Aujourd'hui, c'est la St(e) Emmanuel.
-12/25 N'oubliez pas les Emmanuelle !
-12/25 Bonne fête aux Noël !
-12/26 Aujourd'hui, c'est la St(e) Étienne.
-12/26 N'oubliez pas les Stéphane !
-12/26 Bonne fête aux Stéphanie !
-12/27 Aujourd'hui, c'est la St(e) Jean.
-12/27 N'oubliez pas les Yann !
-12/28 Bonne fête aux Innocents !
-12/29 Aujourd'hui, c'est la St(e) David.
-12/30 N'oubliez pas les Roger !
-12/31 Bonne fête aux Sylvestre !
-
-#endif /*! _fr_FR_ISO8859_1_fetes */
diff --git a/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.french b/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.french
deleted file mode 100644
index 18b4d8a..0000000
--- a/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.french
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * French calendar file(s)
- *
- * $FreeBSD$
- */
-
-#ifndef _calendar_french_
-#define _calendar_french_
-
-#include <fr_FR.ISO8859-1/calendar.all>
-
-#endif /* !_calendar_french_ */
diff --git a/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.jferies b/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.jferies
deleted file mode 100644
index 48867ac..0000000
--- a/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.jferies
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Jours fériés
- *
- * $FreeBSD$
- */
-
-#ifndef _fr_FR_ISO8859_1_jferies_
-#define _fr_FR_ISO8859_1_jferies_
-
-LANG=fr_FR.ISO8859-1
-
-/* Jours chômés */
-01/01 Nouvel an
-05/01 Fête du travail
-05/08 Armistice 1945
-07/14 Fête nationale française
-11/11 Armistice 1918
-
-/* Jours fériés religieux */
-Easter Pâques
-Easter+1 Lundi de Pâques
-Easter+39 Ascension
-Easter+49 Pentecôte
-Easter+50 Lundi de Pentecôte
-08/15 Assomption
-11/01 Toussaint
-12/25 Noël
-
-/* Les dates suivantes ne sont malheureusement pas fériées... */
-
-/* Saisons */
-03/21* Printemps
-06/21* Été
-09/21* Automne
-12/21* Hiver
-
-/* Changements d'heure */
-03/SundayLast Passage à l'heure d'été
-10/SundayLast Passage à l'heure d'hiver
-
-/* Divers */
-/* BUG : si Penteco^te = 05/SunLast, fe^te des me`res repousse'e d'une semaine */
-05/SundayLast Fêtes des mères
-June Sun+3 Fêtes des pères
-
-#endif /*! _fr_FR_ISO8859_1_jferies_ */
diff --git a/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.proverbes b/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.proverbes
deleted file mode 100644
index 5a9f0ea..0000000
--- a/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.proverbes
+++ /dev/null
@@ -1,354 +0,0 @@
-/*
- * Proverbes liés au calendrier
- *
- * $FreeBSD$
- */
-
-#ifndef _fr_FR_ISO8859_1_proverbes_
-#define _fr_FR_ISO8859_1_proverbes_
-
-LANG=fr_FR.ISO8859-1
-
-/* Janvier */
-01/01 Calme et claire nuit de l'an
- À bonne année donne l'élan.
-01/02 Janvier d'eau chiche
- Fait le paysan riche.
-01/04 Un mois de janvier sans gelée
- N'amène jamais une bonne année.
-01/06 Pluie aux Rois,
- Blé jusqu'au toit.
-01/08 Janvier sec et sage
- Est un bon présage.
-01/09 Saint Julien brise la glace ;
- S'il ne la brise, c'est qu'il l'embrasse.
-01/10 Beau temps à la saint Guillaume
- Donne plus de blé que de chaume.
-01/13 Soleil au jour de saint Hilaire,
- Fends du bois pour ton hiver.
-01/14 Pingouin dans les champs,
- Hiver méchant.
-01/15 S'il gèle à la saint Maur,
- La moitié de l'hiver est dehors.
-01/18 À la saint Pierre,
- L'hiver s'en va ou se resserre.
-01/20 S'il gèle à la saint Sébastien,
- L'hiver s'en va ou revient.
-01/22 Pour saint Vincent,
- L'hiver perd ses dents
- Ou les retrouve pour longtemps.
-01/24 S'il tonne en janvier,
- Monte les barriques au grenier.
-01/25 Le jour de saint Paul,
- L'hiver se rompt le col.
-01/31 Janvier fait le péché,
- Mars en est accusé.
-
-/* Février */
-02/01 À la saint Ignace,
- L'eau est de glace.
-02/02 Chandeleur claire, hiver derrière ;
- Chandeleur trouble, hiver redouble.
-02/03 À la saint Blaise,
- L'hiver s'apaise,
- Mais s'il redouble et s'il reprend,
- Longtemps après on s'en ressent.
-02/05 Pour la sainte Agathe, sème ton oignon,
- Fût-il dans la glace, il deviendra bon.
-02/09 À la sainte Apolline
- Bien souvent l'hiver nous quitte.
-02/12 Si le soleil rit à la sainte Eulalie,
- Pommes et cidre à la folie.
-02/14 À la saint Valentin,
- Tous les vents sont marins.
-02/16 Pluie de février
- À la terre vaut du fumier.
-02/18 Février trop doux,
- Printemps en courroux.
-02/20 La neige de février
- Brûle le blé.
-02/22 Neige à la sainte Isabelle
- Fait la fleur plus belle.
-02/24 Saint Mathias
- Casse la glace ;
- S'il n'y en a pas,
- Il en fera.
-02/27 Gelée de la sainte Honorine
- Rend toute la vallée chagrine.
-02/28 Fleur de février
- Va mal au pommier.
-
-/* Mars */
-03/01 Taille à la saint Aubin
- Donnera de gros raisins.
-03/02 Quand mars mouillera,
- Bien du vin tu auras.
-03/03 Soit au début, soit à la fin,
- Mars nous montre son venin.
-03/06 À la sainte Colette
- Commence à chanter l'alouette.
-03/08 Quand en mars il tonne,
- L'année sera bonne.
-03/10 Mars venteux,
- Vergers pommeux.
-03/12 À la saint Grégoire,
- Il faut tailler la vigne pour boire.
-03/13 Poussière de mars
- Est poussière d'or...
-03/15 Pluie de mars grandit l'herbette
- Et souvent annonce disette.
-03/17 S'il fait doux à la saint Patrice,
- De leurs trous sortent les écrevisses.
-03/19 Pour saint Joseph,
- L'hirondelle va et vient.
-03/21 S'il pleut à la saint Benoît,
- Il pleut trente-sept jours plus trois.
-03/23 Quand à glace il gèle à la saint Victorien,
- En pêches et en abricots il n'y a rien.
-03/25 Quand fleurs en mars il y aura,
- Guère de fruits ne mangeras.
-03/28 À la saint Gontran, si la température est belle,
- Arrivent les premières hirondelles.
-03/30 Quand mars se déguise en été,
- Avril prend ses habits fourrés.
-03/31 À la saint Benjamin,
- Le mauvais temps prend fin.
-
-/* Mobiles */
-Easter-7 Le propre jour des Rameaux
- Sème oignons et poireaux.
-Easter-3 La gelée du jeudi saint
- Gèle le sarrasin.
-Easter-2 Gelée du vendredi saint
- Gèle le pain et le vin.
-Easter S'il pleut à Pâques,
- Il pleut pendant quarante jours.
-Easter Pâques en mars,
- Pestes, guerres ou famines.
-Easter+36 Haricots de rogations
- Rendent à foison.
-Easter+37 Belles rogations,
- Belles moissons.
-Easter+39 S'il pleut à l'Ascension,
- Tout va en perdition.
-Easter+49 La Pentecôte
- Donne les fruits, ou les ôte.
-Easter+56 S'il pleut à la Trinité,
- Il pleut tous les jours de l'année.
-
-/* Avril */
-04/01 Avril entrant,
- Coucou chantant,
- Sonnailles tintant.
-04/05 Avril fait la fleur,
- Mai en a l'honneur.
-04/10 Il n'est point d'avril si beau
- Qu'il n'ait de neige à son chapeau.
-04/15 En avril, ne te découvre pas d'un fil ;
- En mai, fais ce qu'il te plaît ;
- En juin, de trois habits n'en garde qu'un.
-04/17 Orage en avril,
- Prépare tes barrils.
-04/19 À la sainte Léonide
- Chaque blé pousse rapide.
-04/22 Pluie à la sainte Opportune,
- Ni cerises ni prunes.
-04/23 À la saint Georges,
- Sème ton orge,
- À la saint Marc,
- Il est trop tard.
-04/25 À la saint Marc, s'il tombe de l'eau,
- Il n'y aura pas de fruits à couteau.
-04/28 Avril pluvieux et mai venteux
- Ne rendent pas le paysan disetteux.
-04/30 La pluie à la saint Robert
- De bon vin emplira ton verre.
-
-/* Mai */
-05/03 Les trois saints au sang de navet,
- Pancrace, Mamert et Servais,
- Sont bien nommés les saints de glace,
- Mamert, Servais et Pancrace.
-05/15 À la sainte Denise,
- Le froid n'en fait plus à sa guise.
-05/16 À la saint Honoré,
- S'il fait gelée,
- Le vin diminue de moitié.
-05/18 Bon fermier à sainte Juliette
- Doit vendre ses poulettes.
-05/22 Beau temps à la sainte Émilie
- Donne du fruit à la folie.
-05/23 Qui sème haricots à la saint Didier
- Les arrachera à poignées.
-
-/* Juin */
-06/08 S'il pleut à la saint Médard,
- Il pleut quarante jours plus tard,
- À moins que saint Barnabé
- Ne vienne l'arrêter.
-06/11 À la saint Barnabé,
- Fauche ton pré.
-06/16 Si le jour de saint Fargeau
- La lune se fait dans l'eau,
- Le reste du mois est beau.
-06/19 S'il pleut à la saint Gervais,
- Il pleut quarante jours après.
-06/20 Pluie d'orage à la saint Sylvère,
- C'est beaucoup de vin dans le verre.
-06/24 S'il pleut à la saint Jean,
- Guère de vin ni de pain.
-06/25 Après la saint Jean, si le coucou chante,
- L'année sera rude et méchante.
-06/29 S'il pleut la veille de la saint Pierre,
- La vigne est réduite du tiers.
-
-/* Juillet */
-07/02 S'il pleut à la Visitation,
- Pluie à discrétion.
-07/03 À la saint Anatole,
- Confiture dans la casserole.
-07/06 Juillet sans orage,
- Famine au village.
-07/10 Petite pluie de juillet ensoleillé
- Emplit caves et greniers.
-07/13 Quand reviendra la saint Henri,
- Tu planteras ton céleri.
-07/16 Qui veut des beaux navets
- Les sème en juillet.
-07/20 À la sainte Marguerite, pluie
- Jamais au paysan ne souris ;
- Mais pluie à la sainte Anne,
- Pour lui c'est de la manne.
-07/21 S'il pleut à la saint Victor,
- La récolte n'est pas d'or.
-07/22 S'il pleut à la sainte Madeleine,
- Il pleuvra durant six semaines.
-07/25 Si saint jacques est serein,
- L'hiver sera dû et serein.
-07/26 Pour la sainte Anne, s'il pleut,
- Trente jours seront pluvieux.
-
-/* Août */
-August Sun+2 En août et vendanges, il n'y a ni fêtes ni dimanches.
-08/02 S'il pleut au mois d'août,
- Les truffes sont au bout.
-08/04 Août donne goût.
-08/06 Soleil rouge en août,
- C'est de la pluie partout.
-08/10 Qui sème à la saint Laurent
- Y perd la graine et puis le temps.
-08/13 S'il pleut à la sainte Radegonde,
- Misère abonde sur le monde.
-08/15 Pluie de l'Assomption,
- Huit jours de mouillon.
-08/16 De saint Roch la grande chaleur
- Prépare du vin la couleur.
-08/18 Temps trop beau en août
- Annonce hiver en courroux.
-08/20 Brumes d'août font passer les châtaignes.
-08/22 Jamais d'août la sécheresse
- N'amènera la richesse.
-08/24 À la saint Barthélémy,
- Paie to dû.
-08/28 Fine pluie à la saint Augustin,
- C'est comme s'il pleuvait du vin.
-08/29 Quand les hirondelles voient la saint Michel,
- L'hiver ne vient qu'à Noël.
-
-/* Septembre */
-09/01 Pluie de la saint Gilles ruine les glands.
-09/05 Septembre humide,
- Pas de tonneau vide.
-09/11 Tu peux semer sans crainte
- Quand arrive la saint Hyacinthe.
-09/15 La rosée de saint Albin
- est, dit-on, rosée de vin.
-09/19 Qui sème à la saint Janvier
- De l'an récolte le premier.
-09/21 Si Matthieu pleure au lieu de rire,
- Le vin en vinaigre vire.
-09/22 Semis de saint Maurice,
- Récolte à ton caprice.
-09/23 Septembre se nomme
- Le mai de l'automne.
-09/25 À la saint Firmin
- L'hiver est en chemin.
-09/29 Pluie de saint Michel sans orage
- D'un hiver doux est le présage.
-09/30 À la saint Jérôme,
- Hoche tes pommes.
-
-/* Octobre */
-10/02 À la saint Léger,
- Faut s'purger !
-10/04 Sème à la saint François,
- Ton blé aura plus de poids.
-10/09 Beau temps à la saint Denis,
- Hiver pourri.
-10/13 En octobre, qui ne fume rien
- Ne récolte rien.
-10/16 Coupe ton chou à la saint Gall,
- En hiver c'est un régal.
-10/18 À la saint Luc, sème dru,
- Ou ne sème plus.
-10/23 Gelée d'octobre
- Rend le vigneron sobre.
-10/25 Pour saint Crépin, mort aux mouches.
-10/28 À la sainte Simone,
- Il faut avoir rentré ses pommes.
-10/31 Quand octobre prend sa fin,
- Dans la cave est le vin.
-
-/* Novembre */
-11/01 À la Toussaint commence l'été de la saint Martin.
-11/02 Telle Toussaint, tel Noël,
- Et Pâques pareil.
-11/04 À la saint Charles,
- La gelée parle.
-11/08 En novembre, s'il tonne,
- L'année sera bonne.
-11/11 Si l'hiver va droit son chemin,
- Vous l'aurez à la saint Martin,
- Mais s'il trouve quelque encombrée,
- Vous l'aurez à la saint André.
-11/11 Tue ton cochon à la saint Martin
- Et invite ton voisin.
-11/19 Sainte Élisabeth nous montre quel bonhomme sera l'hiver.
-11/22 Pour sainte Cécile,
- Chaque haricot en fait mille.
-11/23 Quand l'hiver vient doucement,
- Il est là à la saint Clément.
-11/25 Sainte Catherine, toute fille veut la fêter,
- Mais aucune ne veut la coiffer.
-11/25 Quand sainte Catherine au ciel fait la moue,
- Il faut patauger longtemps dans la boue.
-11/30 Quand l'hiver n'est pas pressé,
- Il arrive à la saint André.
-
-/* Décembre */
-12/SundayFirst Tel avent,
- Tel printemps.
-12/06 Neige de saint Nicolas
- Donne froid pour trois mois.
-12/07 À la saint Ambroise,
- Du froid pour huit jours.
-12/10 À la sainte Julie,
- Le soleil ne quitte pas son lit.
-12/13 À la sainte Luce,
- Le jour croît du saut d'une puce.
-12/16 Décembre de froid trop chiche
- Ne fait pas le paysan riche.
-12/21 S'il gèle à la saint Thomas,
- Il gèlera encore trois mois.
-12/23 Le tonnerre en décembre
- Annonce pour l'an qui vient
- Aux bêtes et aux gens
- Abondance de biens.
-12/25 Noël au balcon,
- Pâques au tison.
-12/26 À la saint Étienne,
- Chacun trouve la sienne.
-12/28 Les jours entre Noël et les Rois
- Indiquent le temps des douze mois.
-
-#endif /*! _fr_FR_ISO8859_1_proverbes_ */
diff --git a/usr.bin/calendar/calendars/hr_HR.ISO8859-2/calendar.all b/usr.bin/calendar/calendars/hr_HR.ISO8859-2/calendar.all
deleted file mode 100644
index 326571a..0000000
--- a/usr.bin/calendar/calendars/hr_HR.ISO8859-2/calendar.all
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * hrvatski calendar
- *
- * $FreeBSD$
- */
-
-#ifndef _hr_HR_ISO8859_2_all
-#define _hr_HR_ISO8859_2_all
-
-#include <hr_HR.ISO8859-2/calendar.praznici>
-
-#endif /* !_hr_HR_ISO8859_2_all */
diff --git a/usr.bin/calendar/calendars/hr_HR.ISO8859-2/calendar.praznici b/usr.bin/calendar/calendars/hr_HR.ISO8859-2/calendar.praznici
deleted file mode 100644
index a1e93fb..0000000
--- a/usr.bin/calendar/calendars/hr_HR.ISO8859-2/calendar.praznici
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * hrvatski praznici
- *
- * $FreeBSD$
- */
-
-#ifndef _hr_HR_ISO8859_2_praznici
-#define _hr_HR_ISO8859_2_praznici
-
-LANG=hr_HR.ISO8859-2
-
-/* dr¾avni praznici */
-01/01 Nova godina
-05/01 Praznik rada
-05/30 Tjelovo
-06/22 Dan antifa¹istièke borbe
-06/25 Dan dr¾avnosti
-08/05 Dan domovinske zahvalnosti
-10/08 Dan neovisnosti
-
-/* katolièki blagdani */
-01/06 Sveta tri kralja
-Easter-2 Veliki petak
-Easter Uskrs
-Easter+1 Uskrsni ponedjeljak
-Easter+49 Duhovi
-Easter+50 Duhovni ponedjeljak
-Easter+39 Uza¹a¹æe
-08/15 Velika Gospa
-11/01 Svi sveti
-12/25 Bo¾iæ
-12/26 Stjepandan
-
-/* godi¹nja doba */
-03/21* Poèetak proljeæa
-06/21* Poèetak ljeta
-09/21* Poèetak jesena
-12/21* Poèetak zime
-
-/* ljetno vrijeme */
-03/NedjeljaLast Poèetak ljetnog vremena
-10/NedjeljaLast Kraj ljetnog vremena
-
-#endif /* !_hr_HR_ISO8859_2_praznici */
diff --git a/usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.all b/usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.all
deleted file mode 100644
index 5084dc7..0000000
--- a/usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.all
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * Magyar kalendárium
- *
- * $FreeBSD$
- */
-
-#ifndef _hu_HU_ISO8859_2_all_
-#define _hu_HU_ISO8859_2_all_
-
-#include <hu_HU.ISO8859-2/calendar.unnepek>
-#include <hu_HU.ISO8859-2/calendar.nevnapok>
-
-#endif /* !_hu_HU.ISO8859-2_all_ */
diff --git a/usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.nevnapok b/usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.nevnapok
deleted file mode 100644
index f85c084..0000000
--- a/usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.nevnapok
+++ /dev/null
@@ -1,386 +0,0 @@
-/*
- * Névnapok
- *
- * $FreeBSD$
- */
-
-#ifndef _hu_HU_ISO8859_2_nevnapok_
-#define _hu_HU_ISO8859_2_nevnapok_
-
-LANG=hu_HU.ISO8859-2
-
-/*
- * N.B.: A névnapok Magyarországon a szentek napjai alapján szerepelnek
- * a naptárban. Néhány név többször is szerepel, de mindenki
- * csak egyszer tart névnapot egy évben. A választott nap
- * ebben az esetben a hagyományokon és az illetõn múlik.
- *
- */
-
-01/01 Fruzsina
-01/02 Ábel, Gergely
-01/03 Genovéva, Benjámin
-01/04 Titusz, Leona
-01/05 Simon
-01/06 Boldizsár, Menyhárt
-01/07 Attila, Ramóna
-01/08 Gyöngyvér
-01/09 Marcell
-01/10 Melánia
-01/11 Ágota, Baltazár
-01/12 Ernõ, Cézár
-01/13 Veronika
-01/14 Bódog, Félix
-01/15 Lóránt, Loránd
-01/16 Gusztáv
-01/17 Antal, Antónia
-01/18 Piroska
-01/19 Sára, Márió
-01/20 Fábián, Sebestyén
-01/21 Ágnes
-01/22 Vince, Artúr
-01/23 Zelma, Rajmund
-01/24 Timót, Xénia
-01/25 Pál
-01/26 Vanda, Paula
-01/27 Angelika, Angéla
-01/28 Károly, Karola
-01/29 Adél
-01/30 Gerda, Martina
-01/31 Marcella
-02/01 Ignác
-02/02 Karolina, Aida
-02/03 Balázs
-02/04 Ráhel, Csenge
-02/05 Ágota, Ingrid
-02/06 Dóra, Dorottya
-02/07 Rómeó, Tódor
-02/08 Aranka
-02/09 Abigél, Alex
-02/10 Elvira
-02/11 Bertold, Marietta
-02/12 Lívia, Lídia
-02/13 Ella, Linda
-02/14 Bálint, Valentin
-02/15 Kolos
-02/16 Julianna, Lilla
-02/17 Donát
-02/18 Bernadett
-02/19 Zsuzsanna
-02/20 Aladár, Álmos
-02/21 Eleonóra
-02/22 Gerzson
-02/23 Alfréd
-02/24 Mátyás
-02/25 Géza
-02/26 Edina
-02/27 Ákos, Bátor
-02/28 Elemér
-03/01 Albin
-03/02 Lujza
-03/03 Kornélia
-03/04 Kázmér
-03/05 Adorján, Adrián
-03/06 Leonóra, Inez
-03/07 Tamás
-03/08 Zoltán
-03/09 Franciska, Fanni
-03/10 Ildikó
-03/11 Szilárd
-03/12 Gergely
-03/13 Krisztián, Ajtony
-03/14 Matild
-03/15 Kristóf
-03/16 Henrietta
-03/17 Gertrúd, Patrik
-03/18 Sándor, Ede
-03/19 József, Bánk
-03/20 Klaudia
-03/21 Benedek
-03/22 Beáta, Izolda
-03/23 Emõke
-03/24 Gábor, Karina
-03/25 Irén, Irisz
-03/26 Emánuel
-03/27 Hajnalka
-03/28 Gedeon, Johanna
-03/29 Aguszta
-03/30 Zalán
-03/31 Árpád
-04/01 Hugó
-04/02 Áron
-04/03 Buda, Richárd
-04/04 Izidor
-04/05 Vince
-04/06 Vilmos, Bíborka
-04/07 Herman
-04/08 Dénes
-04/09 Erhard
-04/10 Zsolt
-04/11 Leó, Szaniszló
-04/12 Gyula
-04/13 Ida
-04/14 Tibor
-04/15 Anasztázia, Tas
-04/16 Csongor
-04/17 Rudolf
-04/18 Andrea, Ilma
-04/19 Emma
-04/20 Tivadar
-04/21 Konrád
-04/22 Csilla, Noémi
-04/23 Béla
-04/24 György
-04/25 Márk
-04/26 Ervin
-04/27 Zita
-04/28 Valéria
-04/29 Péter
-04/30 Katalin, Kitti
-05/01 Fülöp, Jakab
-05/02 Zsigmond
-05/03 Tímea, Irma
-05/04 Mónika, Flórián
-05/05 Györgyi
-05/06 Ivett, Frida
-05/07 Gizella
-05/08 Mihály
-05/09 Gergely
-05/10 Ármin, Pálma
-05/11 Ferenc
-05/12 Pongrác
-05/13 Szervác, Imola
-05/14 Bonifác
-05/15 Zsófia, Szonja
-05/16 Mózes, Botond
-05/17 Paszkál
-05/18 Erik, Alexandra
-05/19 Ivó, Milán
-05/20 Bernát, Felícia
-05/21 Konstantin
-05/22 Júlia, Rita
-05/23 Dezsõ
-05/24 Eszter, Eliza
-05/25 Orbán
-05/26 Fülöp, Evelin
-05/27 Hella
-05/28 Emil, Csanád
-05/29 Magdolna
-05/30 Janka, Zsanett
-05/31 Angéla, Petronella
-06/01 Tünde
-06/02 Kármen, Anita
-06/03 Klotild
-06/04 Bulcsú
-06/05 Fatime
-06/06 Norbert, Cintia
-06/07 Róbert
-06/08 Medárd
-06/09 Félix
-06/10 Margit, Gitta, Gréta
-06/11 Barnabás
-06/12 Villõ
-06/13 Antal, Anett
-06/14 Vazul
-06/15 Jolán, Vid
-06/16 Jusztin
-06/17 Laura, Alida
-06/18 Arnold, Levente
-06/19 Gyárfás
-06/20 Rafael
-06/21 Alajos, Leila
-06/22 Paulina
-06/23 Zoltán, Szidonia
-06/24 Iván
-06/25 Vilmos, Viola
-06/26 János, Pál
-06/27 László
-06/28 Levente, Irén
-06/29 Péter, Pál
-06/30 Pál
-07/01 Annamária, Tihamér
-07/02 Ottó
-07/03 Kornél, Soma
-07/04 Ulrik
-07/05 Emese, Sarolta
-07/06 Csaba
-07/07 Apollónia
-07/08 Ellák
-07/09 Lukrécia
-07/10 Amália
-07/11 Nóra, Lili
-07/12 Izabella, Dalma
-07/13 Jenõ
-07/14 Örs, Stella
-07/15 Henrik, Roland
-07/16 Valter
-07/17 Endre, Elek
-07/18 Frigyes
-07/19 Emília
-07/20 Illés
-07/21 Daniella, Dániel
-07/22 Magdolna
-07/23 Lenke
-07/24 Kinga, Kincsõ
-07/25 Kristóf, Jakab
-07/26 Anna, Anikó
-07/27 Olga, Liliána
-07/28 Szabolcs
-07/29 Márta, Flóra
-07/30 Judit, Xénia
-07/31 Oszkár
-08/01 Boglárka
-08/02 Lehel
-08/03 Hermina
-08/04 Domonkos, Dominika
-08/05 Krisztina
-08/06 Berta, Bettina
-08/07 Ibolya
-08/08 László
-08/09 Emõd
-08/10 Lõrinc
-08/11 Zsuzsanna, Tiborc
-08/12 Klára
-08/13 Ipoly
-08/14 Marcell
-08/15 Mária
-08/16 Ábrahám
-08/17 Jácint
-08/18 Ilona
-08/19 Huba
-08/20 István
-08/21 Sámuel, Hajna
-08/22 Menyhért, Mirjam
-08/23 Bence
-08/24 Bertalan
-08/25 Lajos, Patrícia
-08/26 Izsó
-08/27 Gáspár
-08/28 Ágoston
-08/29 Beatrix, Erna
-08/30 Rózsa
-08/31 Erika, Bella
-09/01 Egyed, Egon
-09/02 Rebeka, Dorina
-09/03 Hilda
-09/04 Rozália
-09/05 Viktor, Lõrinc
-09/06 Zakariás
-09/07 Regina
-09/08 Mária, Adrienn
-09/09 Ádám
-09/10 Nikolett, Hunor
-09/11 Teodóra
-09/12 Mária
-09/13 Kornél
-09/14 Szeréna, Roxána
-09/15 Enikõ, Melitta
-09/16 Edit
-09/17 Zsófia
-09/18 Diána
-09/19 Vilhelmina
-09/20 Friderika
-09/21 Máté, Mirella
-09/22 Móric
-09/23 Tekla
-09/24 Gellért, Mercédesz
-09/25 Eufrozina, Kende
-09/26 Jusztina
-09/27 Adalbert
-09/28 Vencel
-09/29 Mihály
-09/30 Jeromos
-10/01 Malvin
-10/02 Petra
-10/03 Helga
-10/04 Ferenc
-10/05 Aurél
-10/06 Brúnó, Renáta
-10/07 Amália
-10/08 Koppány
-10/09 Dénes
-10/10 Gedeon
-10/11 Brigitta
-10/12 Miksa
-10/13 Kálmán, Ede
-10/14 Helén
-10/15 Teréz
-10/16 Gál
-10/17 Hedvig
-10/18 Lukács
-10/19 Nándor
-10/20 Vendel
-10/21 Orsolya
-10/22 Elõd
-10/23 Gyöngyi
-10/24 Salamon
-10/25 Blanka, Bianka
-10/26 Dömötör
-10/27 Szabina
-10/28 Simon, Szimonetta
-10/29 Nárcisz
-10/30 Alfonz
-10/31 Farkas
-11/01 Marianna
-11/02 Achilles
-11/03 Gyõzõ
-11/04 Károly
-11/05 Imre
-11/06 Lénárd
-11/07 Rezsõ
-11/08 Zsombor
-11/09 Tivadar
-11/10 Réka
-11/11 Márton
-11/12 Jónás, Renátó
-11/13 Szilvia
-11/14 Aliz
-11/15 Albert, Lipót
-11/16 Ödön
-11/17 Hortenzia, Gergõ
-11/18 Jenõ
-11/19 Erzsébet
-11/20 Jolán
-11/21 Olivér
-11/22 Cecília
-11/23 Kelemen, Klementina
-11/24 Emma
-11/25 Katalin
-11/26 Virág
-11/27 Virgil
-11/28 Stefánia
-11/29 Taksony
-11/30 András, Andor
-12/01 Elza
-12/02 Melinda, Vivien
-12/03 Ferenc, Olívia
-12/04 Borbála, Barbara
-12/05 Vilma
-12/06 Miklós
-12/07 Ambrus
-12/08 Mária
-12/09 Natália
-12/10 Judit
-12/11 Árpád
-12/12 Gabriella
-12/13 Luca, Otília
-12/14 Szilárda
-12/15 Valér
-12/16 Etelka, Aletta
-12/17 Lázár, Olimpia
-12/18 Auguszta
-12/19 Viola
-12/20 Teofil
-12/21 Tamás
-12/22 Zénó
-12/23 Viktória
-12/24 Ádám, Éva
-12/25 Eugénia
-12/26 István
-12/27 János
-12/28 Kamilla
-12/29 Tamás, Tamara
-12/30 Dávid
-12/31 Szilveszter
-
-#endif /*! _hu_HU_ISO8859_2_nevnapok_ */
diff --git a/usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.unnepek b/usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.unnepek
deleted file mode 100644
index dab8ead..0000000
--- a/usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.unnepek
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Ünnepnapok
- *
- * $FreeBSD$
- */
-
-#ifndef _hu_HU_ISO8859_2_unnepek_
-#define _hu_HU_ISO8859_2_unnepek_
-
-LANG=hu_HU.ISO8859-2
-
-/* Munkaszüneti napok */
-01/01 Újév
-03/15 1848-as szabadságharc és forradalom ünnepe
-05/01 Munka ünnepe
-10/23 1956-os forradalom ünnepe
-
-/* Vallási munkaszüneti napok */
-Easter Húsvét
-Easter+1 Húsvét hétfõ
-Easter+42 Virágvasárnap
-Easter+49 Pünkösd
-Easter+50 Pünkösd hétfõ
-08/20 Szent István nap, Államalapítás ünnepe
-11/01 Halottak napja
-12/25 Karácsony elsõ napja
-12/26 Karácsony második napja
-
-/* Az itt következõ dátumok nem munkaszüneti napok csak ünnepnapok */
-
-/* Csillagászati évszakok */
-03/21* Tavaszi napéjegyenlõség
-06/21* Nyári napforduló
-09/21* Õszi napéjegyenlõség
-12/21* Téli napforduló
-
-/* Téli és nyári idõszámítás közötti váltás */
-03/SundayLast Váltás a nyári idõszámításra
-10/SundayLast Váltás a téli idõszámításra
-
-/* Egyéb vallási ünnepek amelyek nem munkaszüneti napok */
-Easter-2 Nagy péntek ("a harangok Romába mennek")
-
-/* Egyéb ünnepnapok és emléknapok*/
-02/14 Valentin nap - a szerelmesek ünnepe
-03/08 Nõ nap - egy-egy szál virág a nõknek
-May Sun+2 Anyák napja
-10/06 Az 1848-as aradi vértanuk napja
-12/06 Mikulás napja - gyerekek csokit kapnak
-12/24 Karácsony elõestéje
-12/31 Szilveszter napja
-
-#endif /*! _hu_HU_ISO8859_2_unnepek_ */
diff --git a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.all b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.all
deleted file mode 100644
index b2de01e..0000000
--- a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.all
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * òÕÓÓËÉÊ ËÁÌÅÎÄÁÒØ
- *
- * $FreeBSD$
- */
-
-#ifndef _ru_RU_KOI8_R_all
-#define _ru_RU_KOI8_R_all
-
-#include <ru_RU.KOI8-R/calendar.common>
-#include <ru_RU.KOI8-R/calendar.holiday>
-#include <ru_RU.KOI8-R/calendar.military>
-#include <ru_RU.KOI8-R/calendar.msk>
-#include <ru_RU.KOI8-R/calendar.orthodox>
-#include <ru_RU.KOI8-R/calendar.pagan>
-
-#endif /* !_ru_RU_KOI8_R_all */
diff --git a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.common b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.common
deleted file mode 100644
index ae9db45..0000000
--- a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.common
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * òÏÓÓÉÊÓËÉÅ ÐÒÁÚÄÎÉËÉ
- *
- * $FreeBSD$
- */
-
-#ifndef _ru_RU_KOI8_R_common_
-#define _ru_RU_KOI8_R_common_
-
-LANG=ru_RU.KOI8-R
-
-12 ÑÎ× äÅÎØ ÒÁÂÏÔÎÉËÁ ÐÒÏËÕÒÁÔÕÒÙ
-13 ÑÎ× äÅÎØ ÒÏÓÓÉÊÓËÏÊ ÐÅÞÁÔÉ
-14 ÑÎ× óÔÁÒÙÊ îÏ×ÙÊ ÇÏÄ
-21 ÑÎ× äÅÎØ ÉÎÖÅÎÅÒÎÙÈ ×ÏÊÓË
-25 ÑÎ× ôÁÔØÑÎÉÎ ÄÅÎØ. óÔÕÄÅÎÞÅÓËÉÊ ÐÒÁÚÄÎÉË
- 8 ÆÅ× äÅÎØ ÒÏÓÓÉÊÓËÏÊ ÎÁÕËÉ
-10 ÆÅ× äÅÎØ ÄÉÐÌÏÍÁÔÉÞÅÓËÏÇÏ ÒÁÂÏÔÎÉËÁ
- 1 ÍÁÒ ÷ÓÅÍÉÒÎÙÊ ÄÅÎØ ÇÒÁÖÄÁÎÓËÏÊ ÏÂÏÒÏÎÙ
-03/SunSecond äÅÎØ ÒÁÂÏÔÎÉËÏ× ÇÅÏÄÅÚÉÉ É ËÁÒÔÏÇÒÁÆÉÉ
-18 ÍÁÒ äÅÎØ ÎÁÌÏÇÏ×ÏÊ ÐÏÌÉÃÉÉ
-03/SunThird äÅÎØ ÒÁÂÏÔÎÉËÏ× ÔÏÒÇÏ×ÌÉ, ÂÙÔÏ×ÏÇÏ ÏÂÓÌÕÖÉ×ÁÎÉÑ ÎÁÓÅÌÅÎÉÑ É ÖÉÌÉÝÎÏ-ËÏÍÍÕÎÁÌØÎÏÇÏ ÈÏÚÑÊÓÔ×Á
-27 ÍÁÒ íÅÖÄÕÎÁÒÏÄÎÙÊ ÄÅÎØ ÔÅÁÔÒÁ
-27 ÍÁÒ äÅÎØ ×ÎÕÔÒÅÎÎÉÈ ×ÏÊÓË
- 1 ÁÐÒ äÅÎØ ÓÍÅÈÁ
- 2 ÁÐÒ äÅÎØ ÅÄÉÎÅÎÉÑ ÎÁÒÏÄÏ×
-04/SunFirst äÅÎØ ÇÅÏÌÏÇÁ
-12 ÁÐÒ äÅÎØ ËÏÓÍÏÎÁ×ÔÉËÉ
-04/SunSecond äÅÎØ ×ÏÊÓË ÐÒÏÔÉ×Ï×ÏÚÄÕÛÎÏÊ ÏÂÏÒÏÎÙ
-26 ÁÐÒ äÅÎØ ÐÁÍÑÔÉ ÐÏÇÉÂÛÉÈ × ÒÁÄÉÁÃÉÏÎÎÙÈ Á×ÁÒÉÑÈ É ËÁÔÁÓÔÒÏÆÁÈ
-30 ÁÐÒ äÅÎØ ÐÏÖÁÒÎÏÊ ÏÈÒÁÎÙ
- 7 ÍÁÊ äÅÎØ ÒÁÄÉÏ
-17 ÍÁÊ íÅÖÄÕÎÁÒÏÄÎÙÊ ÄÅÎØ ÔÅÌÅËÏÍÍÕÎÉËÁÃÉÊ
-18 ÍÁÊ íÅÖÄÕÎÁÒÏÄÎÙÊ ÄÅÎØ ÍÕÚÅÅ×
-24 ÍÁÊ äÅÎØ ÓÌÁ×ÑÎÓËÏÊ ÐÉÓØÍÅÎÎÏÓÔÉ É ËÕÌØÔÕÒÙ
-27 ÍÁÊ ïÂÝÅÒÏÓÓÉÊÓËÉÊ ÄÅÎØ ÂÉÂÌÉÏÔÅË
-28 ÍÁÊ äÅÎØ ÐÏÇÒÁÎÉÞÎÉËÁ
-05/SunLast äÅÎØ ÈÉÍÉËÁ
- 1 ÉÀÎ äÅÎØ ÚÁÝÉÔÙ ÄÅÔÅÊ
- 6 ÉÀÎ ðÕÛËÉÎÓËÉÊ ÄÅÎØ
- 8 ÉÀÎ äÅÎØ ÓÏÃÉÁÌØÎÏÇÏ ÒÁÂÏÔÎÉËÁ
-06/SunSecond äÅÎØ ÒÁÂÏÔÎÉËÏ× ÌÅÇËÏÊ ÐÒÏÍÙÛÌÅÎÎÏÓÔÉ
-06/SunThird äÅÎØ ÍÅÄÉÃÉÎÓËÏÇÏ ÒÁÂÏÔÎÉËÁ
-22 ÉÀÎ äÅÎØ ÐÁÍÑÔÉ É ÓËÏÒÂÉ (îÁÞÁÌÏ ÷ÅÌÉËÏÊ ïÔÅÞÅÓÔ×ÅÎÎÏÊ ÷ÏÊÎÙ, 1941 ÇÏÄ)
-27 ÉÀÎ äÅÎØ ÍÏÌÏÄÅÖÉ
-06/SatLast äÅÎØ ÉÚÏÂÒÅÔÁÔÅÌÑ É ÒÁÃÉÏÎÁÌÉÚÁÔÏÒÁ
-07/SunFirst äÅÎØ ÒÁÂÏÔÎÉËÏ× ÍÏÒÓËÏÇÏ É ÒÅÞÎÏÇÏ ÆÌÏÔÁ
-07/SunSecond äÅÎØ ÒÙÂÁËÁ
-07/SunSecond äÅÎØ ÒÏÓÓÉÊÓËÏÊ ÐÏÞÔÙ
-07/SunThird äÅÎØ ÍÅÔÁÌÌÕÒÇÁ
-07/SunLast äÅÎØ ÷ÏÅÎÎÏ-íÏÒÓËÏÇÏ æÌÏÔÁ
- 6 Á×Ç äÅÎØ ÖÅÌÅÚÎÏÄÏÒÏÖÎÙÈ ×ÏÊÓË
-08/SunFirst äÅÎØ ÖÅÌÅÚÎÏÄÏÒÏÖÎÉËÁ
-12 Á×Ç äÅÎØ ×ÏÅÎÎÏ-×ÏÚÄÕÛÎÙÈ ÓÉÌ
-08/SunSecond äÅÎØ ÓÔÒÏÉÔÅÌÑ
-08/SunThird äÅÎØ ÷ÏÚÄÕÛÎÏÇÏ æÌÏÔÁ
-22 Á×Ç äÅÎØ ÇÏÓÕÄÁÒÓÔ×ÅÎÎÏÇÏ ÆÌÁÇÁ
-27 Á×Ç äÅÎØ ËÉÎÏ
-08/SunLast äÅÎØ ÛÁÈÔÅÒÁ
- 1 ÓÅÎ äÅÎØ ÚÎÁÎÉÊ
- 2 ÓÅÎ äÅÎØ ÒÏÓÓÉÊÓËÏÊ Ç×ÁÒÄÉÉ
-09/SunFirst äÅÎØ ÒÁÂÏÔÎÉËÏ× ÎÅÆÔÑÎÏÊ É ÇÁÚÏ×ÏÊ ÐÒÏÍÙÛÌÅÎÎÏÓÔÉ
-09/SunSecond äÅÎØ ÔÁÎËÉÓÔÁ
-09/SunThird äÅÎØ ÒÁÂÏÔÎÉËÏ× ÌÅÓÁ
-09/SunLast äÅÎØ ÍÁÛÉÎÏÓÔÒÏÉÔÅÌÑ
- 1 ÏËÔ äÅÎØ ÐÏÖÉÌÙÈ ÌÀÄÅÊ
- 4 ÏËÔ äÅÎØ ×ÏÅÎÎÏ-ËÏÓÍÉÞÅÓËÉÈ ÓÉÌ
- 5 ÏËÔ äÅÎØ ÕÞÉÔÅÌÑ
-14 ÏËÔ íÅÖÄÕÎÁÒÏÄÎÙÊ ÄÅÎØ ÓÔÁÎÄÁÒÔÉÚÁÃÉÉ
-10/SunSecond äÅÎØ ÒÁÂÏÔÎÉËÏ× ÓÅÌØÓËÏÇÏ ÈÏÚÑÊÓÔ×Á É ÐÅÒÅÒÁÂÁÔÙ×ÁÀÝÅÊ ÐÒÏÍÙÛÌÅÎÎÏÓÔÉ
-10/SunThird äÅÎØ ÒÁÂÏÔÎÉËÏ× ÄÏÒÏÖÎÏÇÏ ÈÏÚÑÊÓÔ×Á
-24 ÏËÔ íÅÖÄÕÎÁÒÏÄÎÙÊ ÄÅÎØ ïïî
-25 ÏËÔ äÅÎØ ÔÁÍÏÖÅÎÎÉËÁ
-30 ÏËÔ äÅÎØ ÐÁÍÑÔÉ ÖÅÒÔ× ÐÏÌÉÔÉÞÅÓËÉÈ ÒÅÐÒÅÓÓÉÊ
-10/SunLast äÅÎØ ÒÁÂÏÔÎÉËÏ× Á×ÔÏÍÏÂÉÌØÎÏÇÏ ÔÒÁÎÓÐÏÒÔÁ
- 9 ÎÏÑ ÷ÓÅÍÉÒÎÙÊ ÄÅÎØ ËÁÞÅÓÔ×Á
-10 ÎÏÑ äÅÎØ ÍÉÌÉÃÉÉ
-16 ÎÏÑ äÅÎØ ÍÏÒÓËÏÊ ÐÅÈÏÔÙ
-17 ÎÏÑ íÅÖÄÕÎÁÒÏÄÎÙÊ ÄÅÎØ ÓÔÕÄÅÎÔÏ×
-11/SunThird äÅÎØ ÒÁËÅÔÎÙÈ ×ÏÊÓË É ÁÒÔÉÌÌÅÒÉÉ
-21 ÎÏÑ äÅÎØ ÒÁÂÏÔÎÉËÏ× ÎÁÌÏÇÏ×ÙÈ ÏÒÇÁÎÏ×
-26 ÎÏÑ ÷ÓÅÍÉÒÎÙÊ ÄÅÎØ ÉÎÆÏÒÍÁÃÉÉ
-11/SunLast äÅÎØ ÍÁÔÅÒÉ
- 1 ÄÅË ÷ÓÅÍÉÒÎÙÊ ÄÅÎØ ÂÏÒØÂÙ ÓÏ óðéäÏÍ
-17 ÄÅË äÅÎØ ÒÁËÅÔÎÙÈ ×ÏÊÓË ÓÔÒÁÔÅÇÉÞÅÓËÏÇÏ ÎÁÚÎÁÞÅÎÉÑ
-20 ÄÅË äÅÎØ ÒÁÂÏÔÎÉËÁ ÏÒÇÁÎÏ× ÂÅÚÏÐÁÓÎÏÓÔÉ
-22 ÄÅË äÅÎØ ÜÎÅÒÇÅÔÉËÁ
-27 ÄÅË äÅÎØ ÓÐÁÓÁÔÅÌÑ
-
-#endif /* !_ru_RU_KOI8_R_common_ */
diff --git a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.holiday b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.holiday
deleted file mode 100644
index c062b57..0000000
--- a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.holiday
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * òÏÓÓÉÊÓËÉÅ ÐÒÁÚÄÎÉËÉ (ÎÅÒÁÂÏÞÉÅ "ËÒÁÓÎÙÅ" ÄÎÉ)
- *
- * $FreeBSD$
- */
-
-#ifndef _ru_RU_KOI8_R_holiday_
-#define _ru_RU_KOI8_R_holiday_
-
-LANG=ru_RU.KOI8-R
-
- 1 ÑÎ× îÏ×ÙÊ ÇÏÄ
- 2 ÑÎ× îÏ×ÏÇÏÄÎÉÅ ËÁÎÉËÕÌÙ
- 3 ÑÎ× îÏ×ÏÇÏÄÎÉÅ ËÁÎÉËÕÌÙ
- 4 ÑÎ× îÏ×ÏÇÏÄÎÉÅ ËÁÎÉËÕÌÙ
- 5 ÑÎ× îÏ×ÏÇÏÄÎÉÅ ËÁÎÉËÕÌÙ
- 7 ÑÎ× òÏÖÄÅÓÔ×Ï èÒÉÓÔÏ×Ï
-23 ÆÅ× äÅÎØ ÚÁÝÉÔÎÉËÁ ïÔÅÞÅÓÔ×Á
- 8 ÍÁÒ íÅÖÄÕÎÁÒÏÄÎÙÊ ÖÅÎÓËÉÊ ÄÅÎØ
- 1 ÍÁÊ ðÒÁÚÄÎÉË ÷ÅÓÎÙ É ôÒÕÄÁ
- 9 ÍÁÊ äÅÎØ ðÏÂÅÄÙ
-12 ÉÀÎ äÅÎØ òÏÓÓÉÉ
- 4 ÎÏÑ äÅÎØ ÎÁÒÏÄÎÏÇÏ ÅÄÉÎÓÔ×Á
-
-#endif /* !_ru_RU_KOI8_R_holiday_ */
diff --git a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.military b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.military
deleted file mode 100644
index 1b4e9c8..0000000
--- a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.military
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * äÎÉ ×ÏÉÎÓËÏÊ ÓÌÁ×Ù òÏÓÓÉÉ
- *
- * $FreeBSD$
- */
-
-#ifndef _ru_RU_KOI8_R_military_
-#define _ru_RU_KOI8_R_military_
-
-LANG=ru_RU.KOI8-R
-
-27 ÑÎ× äÅÎØ ÓÎÑÔÉÑ ÂÌÏËÁÄÙ ÇÏÒÏÄÁ ìÅÎÉÎÇÒÁÄÁ (1944 ÇÏÄ)
- 2 ÆÅ× äÅÎØ ÒÁÚÇÒÏÍÁ ÓÏ×ÅÔÓËÉÍÉ ×ÏÊÓËÁÍÉ ÎÅÍÅÃËÏ-ÆÁÛÉÓÔÓËÉÈ ×ÏÊÓË × óÔÁÌÉÎÇÒÁÄÓËÏÊ ÂÉÔ×Å (1943 ÇÏÄ)
-23 ÆÅ× äÅÎØ ÐÏÂÅÄÙ ëÒÁÓÎÏÊ áÒÍÉÉ ÎÁÄ ËÁÊÚÅÒÏ×ÓËÉÍÉ ×ÏÊÓËÁÍÉ çÅÒÍÁÎÉÉ (1918 ÇÏÄ)
-18 ÁÐÒ äÅÎØ ÐÏÂÅÄÙ ÒÕÓÓËÉÈ ×ÏÉÎÏ× ËÎÑÚÑ áÌÅËÓÁÎÄÒÁ îÅ×ÓËÏÇÏ ÎÁÄ ÎÅÍÅÃËÉÍÉ ÒÙÃÁÒÑÍÉ ÎÁ þÕÄÓËÏÍ ÏÚÅÒÅ (ìÅÄÏ×ÏÅ ÐÏÂÏÉÝÅ, 1242 ÇÏÄ)
-10 ÉÀÌ äÅÎØ ÐÏÂÅÄÙ ÒÕÓÓËÏÊ ÁÒÍÉÉ ÐÏÄ ËÏÍÁÎÄÏ×ÁÎÉÅÍ ðÅÔÒÁ ðÅÒ×ÏÇÏ ÎÁÄ Û×ÅÄÁÍÉ × ðÏÌÔÁ×ÓËÏÍ ÓÒÁÖÅÎÉÉ (1709 ÇÏÄ)
- 9 Á×Ç äÅÎØ ÐÅÒ×ÏÊ × ÒÏÓÓÉÊÓËÏÊ ÉÓÔÏÒÉÉ ÍÏÒÓËÏÊ ÐÏÂÅÄÙ ÒÕÓÓËÏÇÏ ÆÌÏÔÁ ÐÏÄ ËÏÍÁÎÄÏ×ÁÎÉÅÍ ðÅÔÒÁ ðÅÒ×ÏÇÏ ÎÁÄ Û×ÅÄÁÍÉ Õ ÍÙÓÁ çÁÎÇÕÔ (1714 ÇÏÄ)
-23 Á×Ç äÅÎØ ÒÁÚÇÒÏÍÁ ÓÏ×ÅÔÓËÉÍÉ ×ÏÊÓËÁÍÉ ÎÅÍÅÃËÏ-ÆÁÛÉÓÔÓËÉÈ ×ÏÊÓË × ëÕÒÓËÏÊ ÂÉÔ×Å (1943 ÇÏÄ)
- 8 ÓÅÎ äÅÎØ âÏÒÏÄÉÎÓËÏÇÏ ÓÒÁÖÅÎÉÑ ÒÕÓÓËÏÊ ÁÒÍÉÉ ÐÏÄ ËÏÍÁÎÄÏ×ÁÎÉÅÍ í.é. ëÕÔÕÚÏ×Á Ó ÆÒÁÎÃÕÚÓËÏÊ ÁÒÍÉÅÊ (1812 ÇÏÄ)
-11 ÓÅÎ äÅÎØ ÐÏÂÅÄÙ ÒÕÓÓËÏÊ ÜÓËÁÄÒÙ ÐÏÄ ËÏÍÁÎÄÏ×ÁÎÉÅÍ æ.æ. õÛÁËÏ×Á ÎÁÄ ÔÕÒÅÃËÏÊ ÜÓËÁÄÒÏÊ Õ ÍÙÓÁ ôÅÎÄÒÁ (1790 ÇÏÄ)
-21 ÓÅÎ äÅÎØ ÐÏÂÅÄÙ ÒÕÓÓËÉÈ ÐÏÌËÏ× ×Ï ÇÌÁ×Å Ó ×ÅÌÉËÉÍ ËÎÑÚÅÍ äÍÉÔÒÉÅÍ äÏÎÓËÉÍ ÎÁÄ ÍÏÎÇÏÌÏ-ÔÁÔÁÒÓËÉÍÉ ×ÏÊÓËÁÍÉ × ëÕÌÉËÏ×ÓËÏÊ ÂÉÔ×Å (1380 ÇÏÄ)
- 7 ÎÏÑ äÅÎØ ÏÓ×ÏÂÏÖÄÅÎÉÑ íÏÓË×Ù ÓÉÌÁÍÉ ÎÁÒÏÄÎÏÇÏ ÏÐÏÌÞÅÎÉÑ ÐÏÄ ÒÕËÏ×ÏÄÓÔ×ÏÍ ëÕÚØÍÙ íÉÎÉÎÁ É äÍÉÔÒÉÑ ðÏÖÁÒÓËÏÇÏ ÏÔ ÐÏÌØÓËÉÈ ÉÎÔÅÒ×ÅÎÔÏ× (1612 ÇÏÄ)
- 1 ÄÅË äÅÎØ ÐÏÂÅÄÙ ÒÕÓÓËÏÊ ÜÓËÁÄÒÙ ÐÏÄ ËÏÍÁÎÄÏ×ÁÎÉÅÍ ð.ó. îÁÈÉÍÏ×Á ÎÁÄ ÔÕÒÅÃËÏÊ ÜÓËÁÄÒÏÊ Õ ÍÙÓÁ óÉÎÏÐ (1853 ÇÏÄ)
- 5 ÄÅË äÅÎØ ÎÁÞÁÌÁ ËÏÎÔÒÎÁÓÔÕÐÌÅÎÉÑ ÓÏ×ÅÔÓËÉÈ ×ÏÊÓË ÐÒÏÔÉ× ÎÅÍÅÃËÏ-ÆÁÛÉÓÔÓËÉÈ ×ÏÊÓË × ÂÉÔ×Å ÐÏÄ íÏÓË×ÏÊ (1941 ÇÏÄ)
-24 ÄÅË äÅÎØ ×ÚÑÔÉÑ ÔÕÒÅÃËÏÊ ËÒÅÐÏÓÔÉ éÚÍÁÉÌ ÒÕÓÓËÉÍÉ ×ÏÊÓËÁÍÉ ÐÏÄ ËÏÍÁÎÄÏ×ÁÎÉÅÍ á.÷. óÕ×ÏÒÏ×Á (1790 ÇÏÄ)
-
-#endif /* !_ru_RU_KOI8_R_military_ */
diff --git a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.msk b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.msk
deleted file mode 100644
index 5e27985..0000000
--- a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.msk
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * ðÅÒÅ×ÏÄ ÞÁÓÏ× ÄÌÑ ÍÏÓËÏ×ÓËÏÊ ×ÒÅÍÅÎÎÏÊ ÚÏÎÙ
- *
- * $FreeBSD$
- */
-
-#ifndef _ru_RU_KOI8_R_msk_
-#define _ru_RU_KOI8_R_msk_
-
-LANG=ru_RU.KOI8-R
-
-03/SunLast îÁÞÁÌÏ ÍÏÓËÏ×ÓËÏÇÏ ÌÅÔÎÅÇÏ ×ÒÅÍÅÎÉ; ÞÁÓÙ ÐÅÒÅ×ÏÄÑÔÓÑ ×ÐÅÒÅÄ
-10/SunLast ëÏÎÅà ÍÏÓËÏ×ÓËÏÇÏ ÌÅÔÎÅÇÏ ×ÒÅÍÅÎÉ; ÞÁÓÙ ÐÅÒÅ×ÏÄÑÔÓÑ ÎÁÚÁÄ
-
-#endif /* !_ru_RU_KOI8_R_msk_ */
-
diff --git a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.orthodox b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.orthodox
deleted file mode 100644
index ac38458..0000000
--- a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.orthodox
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * ðÒÁ×ÏÓÌÁ×ÎÙÅ ÐÒÁÚÄÎÉËÉ
- *
- * $FreeBSD$
- */
-
-#ifndef _ru_RU_KOI8_R_orthodox_
-#define _ru_RU_KOI8_R_orthodox_
-
-LANG=ru_RU.KOI8-R
-Paskha=ðÁÓÈÁ
-
-21 ÓÅÎ òÏÖÄÅÓÔ×Ï ðÒÅÓ×ÑÔÏÊ âÏÇÏÒÏÄÉÃÙ
-28 ÓÅÎ ÷ÏÚÄ×ÉÖÅÎÉÅ ëÒÅÓÔÁ çÏÓÐÏÄÎÑ
-14 ÏËÔ ðÏËÒÏ× ðÒÅÓ×ÑÔÏÊ âÏÇÏÒÏÄÉÃÙ
- 4 ÄÅË ÷×ÅÄÅÎÉÅ ×Ï ÈÒÁÍ ðÒÅÓ×ÑÔÏÊ âÏÇÏÒÏÄÉÃÙ
- 7 ÑÎ× òÏÖÄÅÓÔ×Ï èÒÉÓÔÏ×Ï
-19 ÑÎ× âÏÇÏÑ×ÌÅÎÉÅ ÉÌÉ ëÒÅÝÅÎÉÅ çÏÓÐÏÄÎÅ
-15 ÆÅ× óÒÅÔÅÎÉÅ çÏÓÐÏÄÎÅ
-ðÁÓÈÁ-46 ÷ÅÌÉËÉÊ ðÏÓÔ
-ðÁÓÈÁ-7 ÷ÅÒÂÎÏÅ ÷ÏÓËÒÅÓÅÎØÅ
-ðÁÓÈÁ-3 ÷ÅÌÉËÉÊ þÅÔ×ÅÒÇ
-ðÁÓÈÁ-2 óÔÒÁÓÔÎÁÑ ðÑÔÎÉÃÁ
-ðÁÓÈÁ ÷ÏÓËÒÅÓÅÎÉÅ èÒÉÓÔÏ×Ï
-ðÁÓÈÁ+39 ÷ÏÚÎÅÓÅÎÉÅ
-ðÁÓÈÁ+49 ðÑÔÉÄÅÓÑÔÎÉÃÁ
-ðÁÓÈÁ+56 ôÒÏÉÃÉÎ äÅÎØ
-ðÁÓÈÁ+60 ðÒÁÚÄÎÉË ôÅÌÁ èÒÉÓÔÏ×Á
- 7 ÁÐÒ âÌÁÇÏ×ÅÝÅÎÉÅ ðÒÅÓ×ÑÔÏÊ âÏÇÏÒÏÄÉÃÙ
-19 Á×Ç ðÒÅÏÂÒÁÖÅÎÉÅ çÏÓÐÏÄÎÅ
-28 Á×Ç õÓÐÅÎÉÅ ðÒÅÓ×ÑÔÏÊ âÏÇÏÒÏÄÉÃÙ
-
-#endif /* !_ru_RU_KOI8_R_orthodox_ */
-
diff --git a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.pagan b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.pagan
deleted file mode 100644
index 2fb6bc0..0000000
--- a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.pagan
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * ñÚÙÞÅÓËÉÅ ÐÒÁÚÄÎÉËÉ
- *
- * $FreeBSD$
- */
-
-#ifndef _ru_RU_KOI8_R_pagan_
-#define _ru_RU_KOI8_R_pagan_
-
-LANG=ru_RU.KOI8-R
-Paskha=ðÁÓÈÁ
-
-21 ÄÅË* úÉÍÎÅÅ ÓÏÌÎÃÅÓÔÏÑÎÉÅ
-25 ÄÅË ëÏÌÑÄÁ (ÓÄ×ÉÎÕÔÏÅ ÚÉÍÎÅÅ ÓÏÌÎÃÅÓÔÏÑÎÉÅ)
- 6 ÑÎ× äÅÎØ ëÁÝÅÑ É ÷ÅÌÅÓÁ
-24 ÆÅ× äÅÎØ ÷ÅÌÅÓÁ
-29 ÆÅ× äÅÎØ ëÁÝÅÑ
- 1 ÍÁÒ äÅÎØ íÁÒÅÎÙ
-14 ÍÁÒ îÏ×ÙÊ çÏÄ, ï×ÓÅÎØ ÍÁÌÙÊ
-ðÁÓÈÁ-47 íÁÓÌÅÎÉÃÁ
-ðÁÓÈÁ+7 ëÒÁÓÎÁÑ çÏÒËÁ
-ðÁÓÈÁ+16 òÁÄÕÎÉÃÁ
-20 ÍÁÒ* ÷ÅÓÅÎÎÉÅ ÒÁ×ÎÏÄÅÎÓÔ×ÉÅ
- 7 ÁÐÒ äÅÎØ íÁÒÅÎÙ (ÓÄ×ÉÎÕÔÏÅ ×ÅÓÅÎÎÅÅ ÒÁ×ÎÏÄÅÎÓÔ×ÉÅ)
- 6 ÍÁÊ äÅÎØ äÁÖØÂÏÇÁ, ï×ÓÅÎØ ÂÏÌØÛÏÊ
-22 ÍÁÊ ñÒÉÌÉÎ äÅÎØ
-15 ÉÀÎ äÅÎØ ôÒÉÇÌÁ×Á
-21 ÉÀÎ* ìÅÔÎÅÅ ÓÏÌÎÃÅÓÔÏÑÎÉÅ
- 1 ÉÀÌ òÕÓÁÌØÎÁÑ îÅÄÅÌÑ
- 7 ÉÀÌ ëÕÐÁÌÁ (ÓÄ×ÉÎÕÔÏÅ ÌÅÔÎÅÅ ÓÏÌÎÃÅÓÔÏÑÎÉÅ)
-27 ÉÀÌ ïÔÂÏÒ ÖÅÒÔ× ðÅÒÕÎÕ, ÒÕÓÁÌÉÉ
- 2 Á×Ç ðÅÒÕÎÏ× äÅÎØ
-21 Á×Ç äÅÎØ óÔÒÉÂÏÇÁ
-28 Á×Ç õÓÐÅÎÉÅ úÌÁÔÏÇÏÒËÉ
-14 ÓÅÎ äÅÎØ ÷ÏÌÈÁ úÍÅÅ×ÉÞÁ
-22 ÓÅÎ* ðÏ×ÏÒÏÔ Ë ÚÉÍÅ (ÏÓÅÎÎÅÅ ÒÁ×ÎÏÄÅÎÓÔ×ÉÅ)
-10 ÎÏÑ äÅÎØ íÁËÏÛÉ
-21 ÎÏÑ äÅÎØ ó×ÁÒÏÇÁ É óÅÍÁÒÇÌÁ
- 9 ÄÅË äÅÎØ äÁÖØÂÏÇÁ É íÁÒÅÎÙ
-
-#endif /* !_ru_RU_KOI8_R_pagan_ */
-
diff --git a/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.all b/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.all
deleted file mode 100644
index 1dfa262..0000000
--- a/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.all
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * õËÒÁ§ÎÓØËÉÊ ËÁÌÅÎÄÁÒ
- *
- * $FreeBSD$
- */
-
-#ifndef _uk_UA_KOI8_U_all_
-#define _uk_UA_KOI8_U_all_
-
-#include <uk_UA.KOI8-U/calendar.holiday>
-#include <uk_UA.KOI8-U/calendar.orthodox>
-#include <uk_UA.KOI8-U/calendar.misc>
-
-#endif /* !_uk_UA_KOI8_U_all_ */
diff --git a/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.holiday b/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.holiday
deleted file mode 100644
index 08559d8..0000000
--- a/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.holiday
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * õËÒÁ§ÎÓØ˦ ÄÅÒÖÁ×Φ Ó×ÑÔÁ
- *
- * $FreeBSD$
- */
-
-#ifndef _uk_UA_KOI8_U_holiday_
-#define _uk_UA_KOI8_U_holiday_
-
-LANG=uk_UA.KOI8-U
-Paskha=÷ÅÌÉËÄÅÎØ
-
-ó¦Þ 01 îÏ×ÉÊ ò¦Ë
-ó¦Þ 07 ò¦ÚÄ×Ï èÒÉÓÔÏ×Å
-âÅÒ 08 8 âÅÒÅÚÎÑ - í¦ÖÎÁÒÏÄÎÉÊ ö¦ÎÏÞÉÊ äÅÎØ
-ôÒÁ 01 1 ôÒÁ×ÎÑ - äÅÎØ ðÒÁæ
-ôÒÁ 09 äÅÎØ ðÅÒÅÍÏÇÉ
-÷ÅÌÉËÄÅÎØ+49 ôÒ¦ÊÃÑ
-þÅÒ 28 äÅÎØ ëÏÎÓÔÉÔÕæ§ õËÒÁ§ÎÉ
-óÅÒ 24 äÅÎØ îÅÚÁÌÅÖÎÏÓÔ¦ õËÒÁ§ÎÉ
-
-#endif /* !_uk_UA_KOI8_U_holiday_ */
diff --git a/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.misc b/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.misc
deleted file mode 100644
index b49769d..0000000
--- a/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.misc
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * ¶ÎÛ¦ æËÁצ ÄÁÔÉ
- *
- * $FreeBSD$
- */
-
-#ifndef _uk_UA_KOI8_U_misc_
-#define _uk_UA_KOI8_U_misc_
-
-LANG=uk_UA.KOI8-U
-
-/* ðÏÓÔÁÎÏ×Á ëÁ¦ÎÅÔÕ í¦Î¦ÓÔÒ¦× õËÒÁ§ÎÉ ×¦Ä 13 ÔÒÁ×ÎÑ 1996 Ò. N 509
- * "ðÒÏ ÐÏÒÑÄÏË ÏÂÞÉÓÌÅÎÎÑ ÞÁÓÕ ÎÁ ÔÅÒÉÔÏÒ¦§ õËÒÁ§ÎÉ"
- */
-âÅÒ îÄ-1 ðÅÒÅÈ¦Ä ÎÁ ̦ÔÎ¦Ê ÞÁÓ (ÏÓÔÁÎÎÑ ÎÅĦÌÑ ÂÅÒÅÚÎÑ)
-öÏ× îÄ-1 ðÅÒÅÈ¦Ä ÎÁ ÚÉÍÏ×ÉÊ ÞÁÓ (ÏÓÔÁÎÎÑ ÎÅĦÌÑ ÖÏ×ÔÎÑ)
-
-#endif /* !_uk_UA_KOI8_U_misc_ */
diff --git a/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.orthodox b/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.orthodox
deleted file mode 100644
index 797c8c1..0000000
--- a/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.orthodox
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * ðÒÁ×ÏÓÌÁ×Φ Ó×ÑÔÁ
- *
- * $FreeBSD$
- */
-
-#ifndef _uk_UA_KOI8_U_orthodox_
-#define _uk_UA_KOI8_U_orthodox_
-
-LANG=uk_UA.KOI8-U
-Paskha=÷ÅÌÉËÄÅÎØ
-
- 7 ó¦Þ ò¦ÚÄ×Ï èÒÉÓÔÏ×Å
-19 ó¦Þ âÏÇÏÑ×ÌÅÎÎÑ ÁÂÏ èÒÅÝÅÎÎÑ çÏÓÐÏÄΤ
-15 ìÀÔ óÔÒ¦ÔÅÎÎÑ çÏÓÐÏÄΤ
-÷ÅÌÉËÄÅÎØ-46 ÷ÅÌÉËÉÊ ð¦ÓÔ
-÷ÅÌÉËÄÅÎØ-7 ÷ÅÒÂÎÁ îÅĦÌÑ
-÷ÅÌÉËÄÅÎØ-3 ÷ÅÌÉËÉÊ þÅÔ×ÅÒ
-÷ÅÌÉËÄÅÎØ-2 óÔÒÁÓÎÁ ð'ÑÔÎÉÃÑ
-÷ÅÌÉËÄÅÎØ ÷ÏÓËÒÅÓ¦ÎÎÑ èÒÉÓÔÏ×Å
-÷ÅÌÉËÄÅÎØ+39 ÷ÏÚÎÅÓ¦ÎÎÑ çÏÓÐÏÄΤ
-÷ÅÌÉËÄÅÎØ+49 äÅÎØ ó×ÑÔϧ ôÒ¦Êæ, ð'ÑÔÉÄÅÓÑÔÎÉÃÑ
-÷ÅÌÉËÄÅÎØ+60 ó×ÑÔÏ Ô¦ÌÁ èÒÉÓÔÏ×ÏÇÏ
- 7 ëצ âÌÁÇÏצÝÅÎÎÑ ðÒÅÓ×ÑÔϧ ä¦×É íÁÒ¦§
- 7 ìÉÐ ò¦ÚÄ×Ï Ó×ÑÔÏÇÏ ¶×ÁÎÁ èÒÅÓÔÉÔÅÌÑ
-12 ìÉÐ ó×ÑÔÉÈ ÷ÅÒÈÏ×ÎÉÈ ÁÐÏÓÔÏÌ¦× ðÅÔÒÁ ¦ ðÁ×ÌÁ
-19 óÅÒ ðÒÅÏÂÒÁÖÅÎÎÑ çÏÓÐÏÄΤ
-28 óÅÒ õÓÐÅÎÎÑ ðÒÅÓ×ÑÔϧ âÏÇÏÒÏÄÉæ
-11 ÷ÅÒ õÓ¦ËÎÏ×ÅÎÎÑ ÞÅÓÎϧ ÇÏÌÏ×É Ó×ÑÔÏÇÏ ¶×ÁÎÁ èÒÅÓÔÉÔÅÌÑ
-21 ÷ÅÒ ò¦ÚÄ×Ï ðÒÅÓ×ÑÔϧ âÏÇÏÒÏÄÉæ
-27 ÷ÅÒ ÷ÏÚÄ×ÉÖÅÎÎÑ þÅÓÎÏÇÏ èÒÅÓÔÁ
-14 öÏ× ðÏËÒÏ×Á ðÒÅÓ×ÑÔϧ âÏÇÏÒÏÄÉæ
- 4 çÒÕ ÷×ÅÄÅÎÎÑ ÄÏ ÈÒÁÍÕ ðÒÅÓ×ÑÔϧ âÏÇÏÒÏÄÉæ
-
-#endif /* !_uk_UA_KOI8_U_orthodox_ */
diff --git a/usr.bin/calendar/day.c b/usr.bin/calendar/day.c
deleted file mode 100644
index d3f3c1e..0000000
--- a/usr.bin/calendar/day.c
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright (c) 1989, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/uio.h>
-#include <ctype.h>
-#include <err.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#include "pathnames.h"
-#include "calendar.h"
-
-struct tm *tp;
-static const struct tm tm0;
-int *cumdays, yrdays;
-char dayname[10];
-
-
-/* 1-based month, 0-based days, cumulative */
-int daytab[][14] = {
- {0, -1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364},
- {0, -1, 30, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365},
-};
-
-static char const *days[] = {
- "sun", "mon", "tue", "wed", "thu", "fri", "sat", NULL,
-};
-
-static const char *months[] = {
- "jan", "feb", "mar", "apr", "may", "jun",
- "jul", "aug", "sep", "oct", "nov", "dec", NULL,
-};
-
-static struct fixs fndays[8]; /* full national days names */
-static struct fixs ndays[8]; /* short national days names */
-
-static struct fixs fnmonths[13]; /* full national months names */
-static struct fixs nmonths[13]; /* short national month names */
-
-
-void
-setnnames(void)
-{
- char buf[80];
- int i, l;
- struct tm tm;
-
- for (i = 0; i < 7; i++) {
- tm.tm_wday = i;
- strftime(buf, sizeof(buf), "%a", &tm);
- for (l = strlen(buf);
- l > 0 && isspace((unsigned char)buf[l - 1]);
- l--)
- ;
- buf[l] = '\0';
- if (ndays[i].name != NULL)
- free(ndays[i].name);
- if ((ndays[i].name = strdup(buf)) == NULL)
- errx(1, "cannot allocate memory");
- ndays[i].len = strlen(buf);
-
- strftime(buf, sizeof(buf), "%A", &tm);
- for (l = strlen(buf);
- l > 0 && isspace((unsigned char)buf[l - 1]);
- l--)
- ;
- buf[l] = '\0';
- if (fndays[i].name != NULL)
- free(fndays[i].name);
- if ((fndays[i].name = strdup(buf)) == NULL)
- errx(1, "cannot allocate memory");
- fndays[i].len = strlen(buf);
- }
-
- for (i = 0; i < 12; i++) {
- tm.tm_mon = i;
- strftime(buf, sizeof(buf), "%b", &tm);
- for (l = strlen(buf);
- l > 0 && isspace((unsigned char)buf[l - 1]);
- l--)
- ;
- buf[l] = '\0';
- if (nmonths[i].name != NULL)
- free(nmonths[i].name);
- if ((nmonths[i].name = strdup(buf)) == NULL)
- errx(1, "cannot allocate memory");
- nmonths[i].len = strlen(buf);
-
- strftime(buf, sizeof(buf), "%B", &tm);
- for (l = strlen(buf);
- l > 0 && isspace((unsigned char)buf[l - 1]);
- l--)
- ;
- buf[l] = '\0';
- if (fnmonths[i].name != NULL)
- free(fnmonths[i].name);
- if ((fnmonths[i].name = strdup(buf)) == NULL)
- errx(1, "cannot allocate memory");
- fnmonths[i].len = strlen(buf);
- }
-}
-
-void
-settime(time_t now)
-{
- char *oldl, *lbufp;
-
- tp = localtime(&now);
- if (isleap(tp->tm_year + 1900)) {
- yrdays = 366;
- cumdays = daytab[1];
- } else {
- yrdays = 365;
- cumdays = daytab[0];
- }
- /* Friday displays Monday's events */
- if (f_dayAfter == 0 && f_dayBefore == 0 && Friday != -1)
- f_dayAfter = tp->tm_wday == Friday ? 3 : 1;
- header[5].iov_base = dayname;
-
- oldl = NULL;
- lbufp = setlocale(LC_TIME, NULL);
- if (lbufp != NULL && (oldl = strdup(lbufp)) == NULL)
- errx(1, "cannot allocate memory");
- (void)setlocale(LC_TIME, "C");
- header[5].iov_len = strftime(dayname, sizeof(dayname), "%A", tp);
- (void)setlocale(LC_TIME, (oldl != NULL ? oldl : ""));
- if (oldl != NULL)
- free(oldl);
-
- setnnames();
-}
-
-/* convert Day[/Month][/Year] into unix time (since 1970)
- * Day: two digits, Month: two digits, Year: digits
- */
-time_t
-Mktime(char *dp)
-{
- time_t t;
- int d, m, y;
- struct tm tm;
-
- (void)time(&t);
- tp = localtime(&t);
-
- tm = tm0;
- tm.tm_mday = tp->tm_mday;
- tm.tm_mon = tp->tm_mon;
- tm.tm_year = tp->tm_year;
-
- switch (sscanf(dp, "%d.%d.%d", &d, &m, &y)) {
- case 3:
- if (y > 1900)
- y -= 1900;
- tm.tm_year = y;
- /* FALLTHROUGH */
- case 2:
- tm.tm_mon = m - 1;
- /* FALLTHROUGH */
- case 1:
- tm.tm_mday = d;
- }
-
-#ifdef DEBUG
- fprintf(stderr, "Mktime: %d %d %s\n",
- (int)mktime(&tm), (int)t, asctime(&tm));
-#endif
- return (mktime(&tm));
-}
-
-/*
- * Possible date formats include any combination of:
- * 3-charmonth (January, Jan, Jan)
- * 3-charweekday (Friday, Monday, mon.)
- * numeric month or day (1, 2, 04)
- *
- * Any character may separate them, or they may not be separated. Any line,
- * following a line that is matched, that starts with "whitespace", is shown
- * along with the matched line.
- */
-int
-isnow(char *endp, int *monthp, int *dayp, int *varp)
-{
- int day, flags, month = 0, v1, v2;
-
- /*
- * CONVENTION
- *
- * Month: 1-12
- * Monthname: Jan .. Dec
- * Day: 1-31
- * Weekday: Mon-Sun
- *
- */
-
- flags = 0;
-
- /* read first field */
- /* didn't recognize anything, skip it */
- if (!(v1 = getfield(endp, &endp, &flags)))
- return (0);
-
- /* Easter or Easter depending days */
- if (flags & F_EASTER)
- day = v1 - 1; /* days since January 1 [0-365] */
-
- /*
- * 1. {Weekday,Day} XYZ ...
- *
- * where Day is > 12
- */
- else if (flags & F_ISDAY || v1 > 12) {
-
- /* found a day; day: 1-31 or weekday: 1-7 */
- day = v1;
-
- /* {Day,Weekday} {Month,Monthname} ... */
- /* if no recognizable month, assume just a day alone
- * in other words, find month or use current month */
- if (!(month = getfield(endp, &endp, &flags)))
- month = tp->tm_mon + 1;
- }
-
- /* 2. {Monthname} XYZ ... */
- else if (flags & F_ISMONTH) {
- month = v1;
-
- /* Monthname {day,weekday} */
- /* if no recognizable day, assume the first day in month */
- if (!(day = getfield(endp, &endp, &flags)))
- day = 1;
- }
-
- /* Hm ... */
- else {
- v2 = getfield(endp, &endp, &flags);
-
- /*
- * {Day} {Monthname} ...
- * where Day <= 12
- */
- if (flags & F_ISMONTH) {
- day = v1;
- month = v2;
- *varp = 0;
- }
-
- /* {Month} {Weekday,Day} ... */
- else {
- /* F_ISDAY set, v2 > 12, or no way to tell */
- month = v1;
- /* if no recognizable day, assume the first */
- day = v2 ? v2 : 1;
- *varp = 0;
- }
- }
-
- /* convert Weekday into *next* Day,
- * e.g.: 'Sunday' -> 22
- * 'SundayLast' -> ??
- */
- if (flags & F_ISDAY) {
-#ifdef DEBUG
- fprintf(stderr, "\nday: %d %s month %d\n", day, endp, month);
-#endif
-
- *varp = 1;
- /* variable weekday, SundayLast, MondayFirst ... */
- if (day < 0 || day >= 10) {
-
- /* negative offset; last, -4 .. -1 */
- if (day < 0) {
- v1 = day / 10 - 1; /* offset -4 ... -1 */
- day = 10 + (day % 10); /* day 1 ... 7 */
-
- /* day, eg '22nd' */
- v2 = tp->tm_mday +
- (((day - 1) - tp->tm_wday + 7) % 7);
-
- /* (month length - day) / 7 + 1 */
- if (cumdays[month + 1] - cumdays[month] >= v2
- && ((int)((cumdays[month + 1] -
- cumdays[month] - v2) / 7) + 1) == -v1)
- day = v2; /* bingo ! */
-
- /* set to yesterday */
- else {
- day = tp->tm_mday - 1;
- if (day == 0)
- return (0);
- }
- }
-
- /* first, second ... +1 ... +5 */
- else {
- /* offset: +1 (first Sunday) ... */
- v1 = day / 10;
- day = day % 10;
-
- /* day, eg '22th' */
- v2 = tp->tm_mday +
- (((day - 1) - tp->tm_wday + 7) % 7);
-
- /* Hurrah! matched */
- if (((v2 - 1 + 7) / 7) == v1 )
- day = v2;
-
- else {
- /* set to yesterday */
- day = tp->tm_mday - 1;
- if (day == 0)
- return (0);
- }
- }
- } else {
- /* wired */
- day = tp->tm_mday + (((day - 1) - tp->tm_wday + 7) % 7);
- *varp = 1;
- }
- }
-
- if (!(flags & F_EASTER)) {
- if (day + cumdays[month] > cumdays[month + 1]) {
- /* off end of month, adjust */
- day -= (cumdays[month + 1] - cumdays[month]);
- /* next year */
- if (++month > 12)
- month = 1;
- }
- *monthp = month;
- *dayp = day;
- day = cumdays[month] + day;
- } else {
- for (v1 = 0; day > cumdays[v1]; v1++)
- ;
- *monthp = v1 - 1;
- *dayp = day - cumdays[v1 - 1];
- *varp = 1;
- }
-
-#ifdef DEBUG
- fprintf(stderr, "day2: day %d(%d-%d) yday %d\n",
- *dayp, day, cumdays[month], tp->tm_yday);
-#endif
-
- /* When days before or days after is specified */
- /* no year rollover */
- if (day >= tp->tm_yday - f_dayBefore &&
- day <= tp->tm_yday + f_dayAfter)
- return (1);
-
- /* next year */
- if (tp->tm_yday + f_dayAfter >= yrdays) {
- int end = tp->tm_yday + f_dayAfter - yrdays;
- if (day <= end)
- return (1);
- }
-
- /* previous year */
- if (tp->tm_yday - f_dayBefore < 0) {
- int before = yrdays + (tp->tm_yday - f_dayBefore);
- if (day >= before)
- return (1);
- }
-
- return (0);
-}
-
-
-int
-getmonth(char *s)
-{
- const char **p;
- struct fixs *n;
-
- for (n = fnmonths; n->name; ++n)
- if (!strncasecmp(s, n->name, n->len))
- return ((n - fnmonths) + 1);
- for (n = nmonths; n->name; ++n)
- if (!strncasecmp(s, n->name, n->len))
- return ((n - nmonths) + 1);
- for (p = months; *p; ++p)
- if (!strncasecmp(s, *p, 3))
- return ((p - months) + 1);
- return (0);
-}
-
-
-int
-getday(char *s)
-{
- const char **p;
- struct fixs *n;
-
- for (n = fndays; n->name; ++n)
- if (!strncasecmp(s, n->name, n->len))
- return ((n - fndays) + 1);
- for (n = ndays; n->name; ++n)
- if (!strncasecmp(s, n->name, n->len))
- return ((n - ndays) + 1);
- for (p = days; *p; ++p)
- if (!strncasecmp(s, *p, 3))
- return ((p - days) + 1);
- return (0);
-}
-
-/* return offset for variable weekdays
- * -1 -> last weekday in month
- * +1 -> first weekday in month
- * ... etc ...
- */
-int
-getdayvar(char *s)
-{
- int offs;
-
- offs = strlen(s);
-
- /* Sun+1 or Wednesday-2
- * ^ ^ */
-
- /* fprintf(stderr, "x: %s %s %d\n", s, s + offs - 2, offs); */
- switch (*(s + offs - 2)) {
- case '-':
- return (-(atoi(s + offs - 1)));
- case '+':
- return (atoi(s + offs - 1));
- }
-
- /*
- * some aliases: last, first, second, third, fourth
- */
-
- /* last */
- if (offs > 4 && !strcasecmp(s + offs - 4, "last"))
- return (-1);
- else if (offs > 5 && !strcasecmp(s + offs - 5, "first"))
- return (+1);
- else if (offs > 6 && !strcasecmp(s + offs - 6, "second"))
- return (+2);
- else if (offs > 5 && !strcasecmp(s + offs - 5, "third"))
- return (+3);
- else if (offs > 6 && !strcasecmp(s + offs - 6, "fourth"))
- return (+4);
-
- /* no offset detected */
- return (0);
-}
diff --git a/usr.bin/calendar/io.c b/usr.bin/calendar/io.c
deleted file mode 100644
index 92df7be..0000000
--- a/usr.bin/calendar/io.c
+++ /dev/null
@@ -1,517 +0,0 @@
-/*
- * Copyright (c) 1989, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1989, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)calendar.c 8.3 (Berkeley) 3/25/94";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/uio.h>
-#include <sys/wait.h>
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <langinfo.h>
-#include <locale.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "pathnames.h"
-#include "calendar.h"
-
-/*
- * Event sorting related functions:
- * - Use event_add() to create a new event
- * - Use event_continue() to add more text to the last added event
- * - Use event_print_all() to display them in time chronological order
- */
-static struct event *event_add(struct event *, int, int, char *, int, char *);
-static void event_continue(struct event *events, char *txt);
-static void event_print_all(FILE *fp, struct event *events);
-struct event {
- int month;
- int day;
- int var;
- char *date;
- char *text;
- struct event *next;
-};
-
-const char *calendarFile = "calendar"; /* default calendar file */
-const char *calendarHomes[] = {".calendar", _PATH_INCLUDE}; /* HOME */
-const char *calendarNoMail = "nomail"; /* don't sent mail if this file exist */
-
-char path[MAXPATHLEN];
-
-struct fixs neaster, npaskha;
-
-struct iovec header[] = {
- {"From: ", 6},
- {NULL, 0},
- {" (Reminder Service)\nTo: ", 24},
- {NULL, 0},
- {"\nSubject: ", 10},
- {NULL, 0},
- {"'s Calendar\nPrecedence: bulk\n\n", 30},
-};
-
-void
-cal(void)
-{
- int printing;
- char *p;
- FILE *fp;
- int ch, l;
- int month;
- int day;
- int var;
- static int d_first = -1;
- char buf[2048 + 1];
- struct event *events = NULL;
-
- if ((fp = opencal()) == NULL)
- return;
- for (printing = 0; fgets(buf, sizeof(buf), stdin) != NULL;) {
- if ((p = strchr(buf, '\n')) != NULL)
- *p = '\0';
- else
- while ((ch = getchar()) != '\n' && ch != EOF);
- for (l = strlen(buf);
- l > 0 && isspace((unsigned char)buf[l - 1]);
- l--)
- ;
- buf[l] = '\0';
- if (buf[0] == '\0')
- continue;
- if (strncmp(buf, "LANG=", 5) == 0) {
- (void)setlocale(LC_ALL, buf + 5);
- d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
- setnnames();
- continue;
- }
- if (strncasecmp(buf, "Easter=", 7) == 0 && buf[7]) {
- if (neaster.name != NULL)
- free(neaster.name);
- if ((neaster.name = strdup(buf + 7)) == NULL)
- errx(1, "cannot allocate memory");
- neaster.len = strlen(buf + 7);
- continue;
- }
- if (strncasecmp(buf, "Paskha=", 7) == 0 && buf[7]) {
- if (npaskha.name != NULL)
- free(npaskha.name);
- if ((npaskha.name = strdup(buf + 7)) == NULL)
- errx(1, "cannot allocate memory");
- npaskha.len = strlen(buf + 7);
- continue;
- }
- if (buf[0] != '\t') {
- printing = isnow(buf, &month, &day, &var) ? 1 : 0;
- if ((p = strchr(buf, '\t')) == NULL)
- continue;
- if (p > buf && p[-1] == '*')
- var = 1;
- if (printing) {
- struct tm tm;
- char dbuf[80];
-
- if (d_first < 0)
- d_first =
- (*nl_langinfo(D_MD_ORDER) == 'd');
- tm.tm_sec = 0; /* unused */
- tm.tm_min = 0; /* unused */
- tm.tm_hour = 0; /* unused */
- tm.tm_wday = 0; /* unused */
- tm.tm_mon = month - 1;
- tm.tm_mday = day;
- tm.tm_year = tp->tm_year; /* unused */
- (void)strftime(dbuf, sizeof(dbuf),
- d_first ? "%e %b" : "%b %e", &tm);
- events = event_add(events, month, day, dbuf,
- var, p);
- }
- } else {
- if (printing)
- event_continue(events, buf);
- }
- }
-
- event_print_all(fp, events);
- closecal(fp);
-}
-
-static struct event *
-event_add(struct event *events, int month, int day,
- char *date, int var, char *txt)
-{
- struct event *e;
-
- /*
- * Creating a new event:
- * - Create a new event
- * - Copy the machine readable day and month
- * - Copy the human readable and language specific date
- * - Copy the text of the event
- */
- e = (struct event *)calloc(1, sizeof(struct event));
- if (e == NULL)
- errx(1, "event_add: cannot allocate memory");
- e->month = month;
- e->day = day;
- e->var = var;
- e->date = strdup(date);
- if (e->date == NULL)
- errx(1, "event_add: cannot allocate memory");
- e->text = strdup(txt);
- if (e->text == NULL)
- errx(1, "event_add: cannot allocate memory");
- e->next = events;
-
- return e;
-}
-
-static void
-event_continue(struct event *e, char *txt)
-{
- char *text;
-
- /*
- * Adding text to the event:
- * - Save a copy of the old text (unknown length, so strdup())
- * - Allocate enough space for old text + \n + new text + 0
- * - Store the old text + \n + new text
- * - Destroy the saved copy.
- */
- text = strdup(e->text);
- if (text == NULL)
- errx(1, "event_continue: cannot allocate memory");
-
- free(e->text);
- e->text = (char *)malloc(strlen(text) + strlen(txt) + 3);
- if (e->text == NULL)
- errx(1, "event_continue: cannot allocate memory");
- strcpy(e->text, text);
- strcat(e->text, "\n");
- strcat(e->text, txt);
- free(text);
-
- return;
-}
-
-static void
-event_print_all(FILE *fp, struct event *events)
-{
- struct event *e, *e_next;
- int daycounter;
- int day, month;
-
- /*
- * Print all events:
- * - We know the number of days to be counted (f_dayAfter + f_dayBefore)
- * - We know the current day of the year ("now" - f_dayBefore + counter)
- * - We know the number of days in the year (yrdays, set in settime())
- * - So we know the date on which the current daycounter is on the
- * calendar in days and months.
- * - Go through the list of events, and print all matching dates
- */
- for (daycounter = 0; daycounter <= f_dayAfter + f_dayBefore;
- daycounter++) {
- day = tp->tm_yday - f_dayBefore + daycounter;
- if (day < 0)
- day += yrdays;
- if (day >= yrdays)
- day -= yrdays;
-
- /*
- * When we know the day of the year, we can determine the day
- * of the month and the month.
- */
- month = 1;
- while (month <= 12) {
- if (day <= cumdays[month])
- break;
- month++;
- }
- month--;
- day -= cumdays[month];
-
-#ifdef DEBUG
- fprintf(stderr, "event_print_allmonth: %d, day: %d\n",
- month, day);
-#endif
-
- /*
- * Go through all events and print the text of the matching
- * dates
- */
- for (e = events; e != NULL; e = e_next) {
- e_next = e->next;
-
- if (month != e->month || day != e->day)
- continue;
-
- (void)fprintf(fp, "%s%c%s\n", e->date,
- e->var ? '*' : ' ', e->text);
- }
- }
-}
-
-int
-getfield(char *p, char **endp, int *flags)
-{
- int val, var;
- char *start, savech;
-
- for (; !isdigit((unsigned char)*p) && !isalpha((unsigned char)*p)
- && *p != '*'; ++p)
- ;
- if (*p == '*') { /* `*' is current month */
- *flags |= F_ISMONTH;
- *endp = p + 1;
- return (tp->tm_mon + 1);
- }
- if (isdigit((unsigned char)*p)) {
- val = strtol(p, &p, 10); /* if 0, it's failure */
- for (; !isdigit((unsigned char)*p)
- && !isalpha((unsigned char)*p) && *p != '*'; ++p);
- *endp = p;
- return (val);
- }
- for (start = p; isalpha((unsigned char)*++p););
-
- /* Sunday-1 */
- if (*p == '+' || *p == '-')
- for(; isdigit((unsigned char)*++p);)
- ;
-
- savech = *p;
- *p = '\0';
-
- /* Month */
- if ((val = getmonth(start)) != 0)
- *flags |= F_ISMONTH;
-
- /* Day */
- else if ((val = getday(start)) != 0) {
- *flags |= F_ISDAY;
-
- /* variable weekday */
- if ((var = getdayvar(start)) != 0) {
- if (var <= 5 && var >= -4)
- val += var * 10;
-#ifdef DEBUG
- printf("var: %d\n", var);
-#endif
- }
- }
-
- /* Easter */
- else if ((val = geteaster(start, tp->tm_year + 1900)) != 0)
- *flags |= F_EASTER;
-
- /* Paskha */
- else if ((val = getpaskha(start, tp->tm_year + 1900)) != 0)
- *flags |= F_EASTER;
-
- /* undefined rest */
- else {
- *p = savech;
- return (0);
- }
- for (*p = savech; !isdigit((unsigned char)*p)
- && !isalpha((unsigned char)*p) && *p != '*'; ++p)
- ;
- *endp = p;
- return (val);
-}
-
-FILE *
-opencal(void)
-{
- uid_t uid;
- size_t i;
- int fd, found, pdes[2];
- struct stat sbuf;
-
- /* open up calendar file as stdin */
- if (!freopen(calendarFile, "r", stdin)) {
- if (doall) {
- if (chdir(calendarHomes[0]) != 0)
- return (NULL);
- if (stat(calendarNoMail, &sbuf) == 0)
- return (NULL);
- if (!freopen(calendarFile, "r", stdin))
- return (NULL);
- } else {
- char *home = getenv("HOME");
- if (home == NULL || *home == '\0')
- errx(1, "cannot get home directory");
- chdir(home);
- for (found = i = 0; i < sizeof(calendarHomes) /
- sizeof(calendarHomes[0]); i++)
- if (chdir(calendarHomes[i]) == 0 &&
- freopen(calendarFile, "r", stdin)) {
- found = 1;
- break;
- }
- if (!found)
- errx(1,
- "can't open calendar file \"%s\": %s (%d)",
- calendarFile, strerror(errno), errno);
- }
- }
- if (pipe(pdes) < 0)
- return (NULL);
- switch (fork()) {
- case -1: /* error */
- (void)close(pdes[0]);
- (void)close(pdes[1]);
- return (NULL);
- case 0:
- /* child -- stdin already setup, set stdout to pipe input */
- if (pdes[1] != STDOUT_FILENO) {
- (void)dup2(pdes[1], STDOUT_FILENO);
- (void)close(pdes[1]);
- }
- (void)close(pdes[0]);
- uid = geteuid();
- if (setuid(getuid()) < 0) {
- warnx("first setuid failed");
- _exit(1);
- };
- if (setgid(getegid()) < 0) {
- warnx("setgid failed");
- _exit(1);
- }
- if (setuid(uid) < 0) {
- warnx("setuid failed");
- _exit(1);
- }
- execl(_PATH_CPP, "cpp", "-P",
- "-traditional", "-nostdinc", /* GCC specific opts */
- "-I.", "-I", _PATH_INCLUDE, (char *)NULL);
- warn(_PATH_CPP);
- _exit(1);
- }
- /* parent -- set stdin to pipe output */
- (void)dup2(pdes[0], STDIN_FILENO);
- (void)close(pdes[0]);
- (void)close(pdes[1]);
-
- /* not reading all calendar files, just set output to stdout */
- if (!doall)
- return (stdout);
-
- /* set output to a temporary file, so if no output don't send mail */
- (void)snprintf(path, sizeof(path), "%s/_calXXXXXX", _PATH_TMP);
- if ((fd = mkstemp(path)) < 0)
- return (NULL);
- return (fdopen(fd, "w+"));
-}
-
-void
-closecal(FILE *fp)
-{
- uid_t uid;
- struct stat sbuf;
- int nread, pdes[2], status;
- char buf[1024];
-
- if (!doall)
- return;
-
- (void)rewind(fp);
- if (fstat(fileno(fp), &sbuf) || !sbuf.st_size)
- goto done;
- if (pipe(pdes) < 0)
- goto done;
- switch (fork()) {
- case -1: /* error */
- (void)close(pdes[0]);
- (void)close(pdes[1]);
- goto done;
- case 0:
- /* child -- set stdin to pipe output */
- if (pdes[0] != STDIN_FILENO) {
- (void)dup2(pdes[0], STDIN_FILENO);
- (void)close(pdes[0]);
- }
- (void)close(pdes[1]);
- uid = geteuid();
- if (setuid(getuid()) < 0) {
- warnx("setuid failed");
- _exit(1);
- };
- if (setgid(getegid()) < 0) {
- warnx("setgid failed");
- _exit(1);
- }
- if (setuid(uid) < 0) {
- warnx("setuid failed");
- _exit(1);
- }
- execl(_PATH_SENDMAIL, "sendmail", "-i", "-t", "-F",
- "\"Reminder Service\"", (char *)NULL);
- warn(_PATH_SENDMAIL);
- _exit(1);
- }
- /* parent -- write to pipe input */
- (void)close(pdes[0]);
-
- header[1].iov_base = header[3].iov_base = pw->pw_name;
- header[1].iov_len = header[3].iov_len = strlen(pw->pw_name);
- writev(pdes[1], header, 7);
- while ((nread = read(fileno(fp), buf, sizeof(buf))) > 0)
- (void)write(pdes[1], buf, nread);
- (void)close(pdes[1]);
-done: (void)fclose(fp);
- (void)unlink(path);
- while (wait(&status) >= 0);
-}
diff --git a/usr.bin/calendar/ostern.c b/usr.bin/calendar/ostern.c
deleted file mode 100644
index 76e5933..0000000
--- a/usr.bin/calendar/ostern.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (c) 1996 Wolfram Schneider <wosch@FreeBSD.org>. Berlin.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#include "calendar.h"
-
-/* return year day for Easter */
-
-/*
- * This code is based on the Calendar FAQ's code for how to calculate
- * easter is. This is the Gregorian calendar version. They refer to
- * the Algorithm of Oudin in the "Explanatory Supplement to the
- * Astronomical Almanac".
- */
-
-int
-easter(int year) /* 0 ... abcd, NOT since 1900 */
-{
- int G, /* Golden number - 1 */
- C, /* Century */
- H, /* 23 - epact % 30 */
- I, /* days from 21 March to Paschal full moon */
- J, /* weekday of full moon */
- L; /* days from 21 March to Sunday on of before full moon */
-
- G = year % 19;
- C = year / 100;
- H = (C - C / 4 - (8 * C + 13) / 25 + 19 * G + 15) % 30;
- I = H - (H / 28) * (1 - (H / 28) * (29 / (H + 1)) * ((21 - G) / 11));
- J = (year + year / 4 + I + 2 - C + C / 4) % 7;
-
- L = I - J;
-
- if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
- return 31 + 29 + 21 + L + 7;
- else
- return 31 + 28 + 21 + L + 7;
-}
-
-/* return year day for Easter or easter depending days
- * Match: Easter([+-][0-9]+)?
- * e.g: Easter-2 is Good Friday (2 days before Easter)
- */
-
-int
-geteaster(char *s, int year)
-{
- int offset = 0;
-
-#define EASTER "easter"
-#define EASTERNAMELEN (sizeof(EASTER) - 1)
-
- if (strncasecmp(s, EASTER, EASTERNAMELEN) == 0)
- s += EASTERNAMELEN;
- else if (neaster.name != NULL
- && strncasecmp(s, neaster.name, neaster.len) == 0)
- s += neaster.len;
- else
- return (0);
-
-#if DEBUG
- printf("%s %d %d\n", s, year, EASTERNAMELEN);
-#endif
-
- /* Easter+1 or Easter-2
- * ^ ^ */
-
- switch (*s) {
-
- case '-':
- case '+':
- offset = atoi(s);
- break;
-
- default:
- offset = 0;
- }
-
- return (easter(year) + offset);
-}
diff --git a/usr.bin/calendar/paskha.c b/usr.bin/calendar/paskha.c
deleted file mode 100644
index d96ffc2..0000000
--- a/usr.bin/calendar/paskha.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 1993-1996 by Andrey A. Chernov, Moscow, Russia.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#include "calendar.h"
-
-#define PASKHA "paskha"
-#define PASKHALEN (sizeof(PASKHA) - 1)
-
-static int paskha(int);
-
-/* return year day for Orthodox Easter using Gauss formula */
-/* (old style result) */
-
-static int
-paskha(int R) /*year*/
-{
- int a, b, c, d, e;
- static int x = 15;
- static int y = 6;
-
- a = R % 19;
- b = R % 4;
- c = R % 7;
- d = (19 * a + x) % 30;
- e = (2 * b + 4 * c + 6 * d + y) % 7;
- return (((cumdays[3] + 1) + 22) + (d + e));
-}
-
-/* return year day for Orthodox Easter depending days */
-
-int
-getpaskha(char *s, int year)
-{
- int offset;
-
- if (strncasecmp(s, PASKHA, PASKHALEN) == 0)
- s += PASKHALEN;
- else if (npaskha.name != NULL
- && strncasecmp(s, npaskha.name, npaskha.len) == 0)
- s += npaskha.len;
- else
- return 0;
-
- /* Paskha+1 or Paskha-2
- * ^ ^ */
-
- switch (*s) {
-
- case '-':
- case '+':
- offset = atoi(s);
- break;
-
- default:
- offset = 0;
- break;
- }
-
- return (paskha(year) + offset + 13 /* new style */);
-}
diff --git a/usr.bin/calendar/pathnames.h b/usr.bin/calendar/pathnames.h
deleted file mode 100644
index cacbd25..0000000
--- a/usr.bin/calendar/pathnames.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)pathnames.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#include <paths.h>
-
-#define _PATH_CPP "/usr/bin/cpp"
-#define _PATH_INCLUDE "/usr/share/calendar"
diff --git a/usr.bin/cap_mkdb/Makefile b/usr.bin/cap_mkdb/Makefile
deleted file mode 100644
index 408790c..0000000
--- a/usr.bin/cap_mkdb/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= cap_mkdb
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/cap_mkdb/cap_mkdb.1 b/usr.bin/cap_mkdb/cap_mkdb.1
deleted file mode 100644
index 2ac09e3..0000000
--- a/usr.bin/cap_mkdb/cap_mkdb.1
+++ /dev/null
@@ -1,109 +0,0 @@
-.\" Copyright (c) 1992, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)cap_mkdb.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd February 22, 2005
-.Dt CAP_MKDB 1
-.Os
-.Sh NAME
-.Nm cap_mkdb
-.Nd create capability database
-.Sh SYNOPSIS
-.Nm
-.Op Fl b | l
-.Op Fl v
-.Op Fl f Ar outfile
-.Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility builds a hashed database out of the
-.Xr getcap 3
-logical database constructed by the concatenation of the specified
-files.
-.Pp
-The database is named by the basename of the first file argument and
-the string
-.Dq .db .
-The
-.Xr getcap 3
-routines can access the database in this form much more quickly
-than they can the original text file(s).
-.Pp
-The ``tc'' capabilities of the records are expanded before the
-record is stored into the database.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl b
-Use big-endian byte order for database metadata.
-.It Fl f Ar outfile
-Specify a different database basename.
-.It Fl l
-Use little-endian byte order for database metadata.
-.It Fl v
-Print out the number of capability records in the database.
-.El
-.Pp
-The
-.Fl b
-and
-.Fl l
-flags are mutually exclusive.
-The default byte ordering is the current host order.
-.Sh FORMAT
-Each record is stored in the database using two different types of keys.
-.Pp
-The first type is a key which consists of the first capability of
-the record (not including the trailing colon (``:'')) with a data
-field consisting of a special byte followed by the rest of the record.
-The special byte is either a 0 or 1, where a 0 means that the record
-is okay, and a 1 means that there was a ``tc'' capability in the record
-that could not be expanded.
-.Pp
-The second type is a key which consists of one of the names from the
-first capability of the record with a data field consisting a special
-byte followed by the first capability of the record.
-The special byte is a 2.
-.Pp
-In normal operation names are looked up in the database, resulting
-in a key/data pair of the second type.
-The data field of this key/data pair is used to look up a key/data
-pair of the first type which has the real data associated with the
-name.
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr dbopen 3 ,
-.Xr getcap 3 ,
-.Xr termcap 5
diff --git a/usr.bin/cap_mkdb/cap_mkdb.c b/usr.bin/cap_mkdb/cap_mkdb.c
deleted file mode 100644
index 32413c8..0000000
--- a/usr.bin/cap_mkdb/cap_mkdb.c
+++ /dev/null
@@ -1,272 +0,0 @@
-/*-
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1992, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)cap_mkdb.c 8.2 (Berkeley) 4/27/95";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/stat.h>
-
-#include <db.h>
-#include <err.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-void db_build(char **);
-void dounlink(void);
-void usage(void);
-
-DB *capdbp;
-int verbose;
-char *capdb, *capname, buf[8 * 1024];
-
-HASHINFO openinfo = {
- 4096, /* bsize */
- 0, /* ffactor */
- 0, /* nelem */
- 0, /* cachesize */
- NULL, /* hash() */
- 0 /* lorder */
-};
-
-/*
- * Mkcapdb creates a capability hash database for quick retrieval of capability
- * records. The database contains 2 types of entries: records and references
- * marked by the first byte in the data. A record entry contains the actual
- * capability record whereas a reference contains the name (key) under which
- * the correct record is stored.
- */
-int
-main(int argc, char *argv[])
-{
- int byteorder, c;
-
- capname = NULL;
- byteorder = 0;
- while ((c = getopt(argc, argv, "bf:lv")) != -1) {
- switch(c) {
- case 'b':
- case 'l':
- if (byteorder != 0)
- usage();
- byteorder = c == 'b' ? 4321 : 1234;
- break;
- case 'f':
- capname = optarg;
- break;
- case 'v':
- verbose = 1;
- break;
- case '?':
- default:
- usage();
- }
- }
- argc -= optind;
- argv += optind;
-
- if (*argv == NULL)
- usage();
-
- /* Set byte order. */
- openinfo.lorder = byteorder;
-
- /*
- * The database file is the first argument if no name is specified.
- * Make arrangements to unlink it if exit badly.
- */
- (void)snprintf(buf, sizeof(buf), "%s.db", capname ? capname : *argv);
- if ((capname = strdup(buf)) == NULL)
- errx(1, "strdup failed");
- if ((capdbp = dbopen(capname, O_CREAT | O_TRUNC | O_RDWR,
- DEFFILEMODE, DB_HASH, &openinfo)) == NULL)
- err(1, "%s", buf);
-
- if (atexit(dounlink))
- err(1, "atexit");
-
- db_build(argv);
-
- if (capdbp->close(capdbp) < 0)
- err(1, "%s", capname);
- capname = NULL;
- exit(0);
-}
-
-void
-dounlink(void)
-{
- if (capname != NULL)
- (void)unlink(capname);
-}
-
-/*
- * Any changes to these definitions should be made also in the getcap(3)
- * library routines.
- */
-#define RECOK (char)0
-#define TCERR (char)1
-#define SHADOW (char)2
-
-/*
- * Db_build() builds the name and capability databases according to the
- * details above.
- */
-void
-db_build(char **ifiles)
-{
- DBT key, data;
- recno_t reccnt;
- size_t len, bplen;
- int st;
- char *bp, *p, *t;
-
- data.data = NULL;
- key.data = NULL;
- for (reccnt = 0, bplen = 0; (st = cgetnext(&bp, ifiles)) > 0;) {
-
- /*
- * Allocate enough memory to store record, terminating
- * NULL and one extra byte.
- */
- len = strlen(bp);
- if (bplen <= len + 2) {
- bplen += MAX(256, len + 2);
- if ((data.data = realloc(data.data, bplen)) == NULL)
- errx(1, "malloc failed");
- }
-
- /* Find the end of the name field. */
- if ((p = strchr(bp, ':')) == NULL) {
- warnx("no name field: %.*s", (int)MIN(len, 20), bp);
- continue;
- }
-
- /* First byte of stored record indicates status. */
- switch(st) {
- case 1:
- ((char *)(data.data))[0] = RECOK;
- break;
- case 2:
- ((char *)(data.data))[0] = TCERR;
- warnx("record not tc expanded: %.*s", (int)(p - bp),
- bp);
- break;
- }
-
- /* Create the stored record. */
- memmove(&((u_char *)(data.data))[1], bp, len + 1);
- data.size = len + 2;
-
- /* Store the record under the name field. */
- key.data = bp;
- key.size = p - bp;
-
- switch(capdbp->put(capdbp, &key, &data, R_NOOVERWRITE)) {
- case -1:
- err(1, "put");
- /* NOTREACHED */
- case 1:
- warnx("ignored duplicate: %.*s",
- (int)key.size, (char *)key.data);
- continue;
- }
- ++reccnt;
-
- /* If only one name, ignore the rest. */
- *p = '\0';
- if (strchr(bp, '|') == NULL)
- continue;
- *p = ':';
-
- /* The rest of the names reference the entire name. */
- ((char *)(data.data))[0] = SHADOW;
- memmove(&((u_char *)(data.data))[1], key.data, key.size);
- data.size = key.size + 1;
-
- /* Store references for other names. */
- for (p = t = bp;; ++p) {
- if (p > t && (*p == ':' || *p == '|')) {
- key.size = p - t;
- key.data = t;
- switch(capdbp->put(capdbp,
- &key, &data, R_NOOVERWRITE)) {
- case -1:
- err(1, "put");
- /* NOTREACHED */
- case 1:
- warnx("ignored duplicate: %.*s",
- (int)key.size, (char *)key.data);
- }
- t = p + 1;
- }
- if (*p == ':')
- break;
- }
- }
-
- switch(st) {
- case -1:
- err(1, "file argument");
- /* NOTREACHED */
- case -2:
- errx(1, "potential reference loop detected");
- /* NOTREACHED */
- }
-
- if (verbose)
- (void)printf("cap_mkdb: %d capability records\n", reccnt);
-}
-
-void
-usage(void)
-{
- (void)fprintf(stderr,
- "usage: cap_mkdb [-b | -l] [-v] [-f outfile] file ...\n");
- exit(1);
-}
diff --git a/usr.bin/catman/Makefile b/usr.bin/catman/Makefile
deleted file mode 100644
index d80a5fd..0000000
--- a/usr.bin/catman/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# $FreeBSD$
-
-PROG= catman
-WARNS?= 6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/catman/catman.1 b/usr.bin/catman/catman.1
deleted file mode 100644
index fe85587..0000000
--- a/usr.bin/catman/catman.1
+++ /dev/null
@@ -1,109 +0,0 @@
-.\" Copyright (c) 2002 John Rochester
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd December 3, 2005
-.Dt CATMAN 1
-.Os
-.Sh NAME
-.Nm catman
-.Nd "preformat man pages"
-.Sh SYNOPSIS
-.Nm
-.Op Fl fLnrv
-.Op Ar directories ...
-.Sh DESCRIPTION
-The
-.Nm
-utility preformats all the man pages in
-.Ar directories
-using the
-.Nm nroff Fl man
-command.
-Directories may be separated by colons instead of spaces.
-If no
-.Ar directories
-are specified, the contents of the
-.Ev MANPATH
-environment variable is used, or if that is not set, the default directory
-.Pa /usr/share/man
-is processed.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl f
-Force all man pages to be reformatted even if the corresponding cat page
-is newer.
-.It Fl L
-Process only localized subdirectories corresponding to the locale specified
-in the standard environment variables.
-.It Fl n
-Print out what would be done instead of performing any formatting.
-.It Fl r
-Scan for and remove
-.Dq junk
-files that are neither man pages nor their
-corresponding formatted cat pages.
-.It Fl v
-Cause
-.Nm
-to be more verbose about what it is doing.
-.El
-.Sh ENVIRONMENT
-.Bl -tag -width ".Ev MANPATH"
-.It Ev LC_ALL , LC_CTYPE , LANG
-These variables control what subdirectories will be processed if the
-.Fl L
-option is used.
-.It Ev MACHINE
-If set, overrides the current machine type when searching for
-machine specific man page subdirectories.
-.It Ev MACHINE_ARCH
-If set, overrides the current architecture when searching for
-architecture specific man page subdirectories.
-.It Ev MANPATH
-Determines the set of directories to be processed if none are given on
-the command line.
-.El
-.Sh FILES
-.Bl -tag -width ".Pa /usr/share/man" -compact
-.It Pa /usr/share/man
-Default directory to process if the
-.Ev MANPATH
-environment variable is not set.
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr makewhatis 1 ,
-.Xr man 1 ,
-.Xr nroff 1
-.Sh HISTORY
-A previous version of the
-.Nm
-command appeared in
-.Fx 2.1 .
-.Sh AUTHORS
-.An John Rochester
diff --git a/usr.bin/catman/catman.c b/usr.bin/catman/catman.c
deleted file mode 100644
index ced6ae6..0000000
--- a/usr.bin/catman/catman.c
+++ /dev/null
@@ -1,823 +0,0 @@
-/*-
- * Copyright (c) 2002 John Rochester
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer,
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/param.h>
-#include <sys/utsname.h>
-
-#include <ctype.h>
-#include <dirent.h>
-#include <err.h>
-#include <fcntl.h>
-#include <locale.h>
-#include <langinfo.h>
-#include <libgen.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#define DEFAULT_MANPATH "/usr/share/man"
-
-#define TOP_LEVEL_DIR 0 /* signifies a top-level man directory */
-#define MAN_SECTION_DIR 1 /* signifies a man section directory */
-#define UNKNOWN 2 /* signifies an unclassifiable directory */
-
-#define TEST_EXISTS 0x01
-#define TEST_DIR 0x02
-#define TEST_FILE 0x04
-#define TEST_READABLE 0x08
-#define TEST_WRITABLE 0x10
-#define TEST_EXECUTABLE 0x20
-
-static int verbose; /* -v flag: be verbose with warnings */
-static int pretend; /* -n, -p flags: print out what would be done
- instead of actually doing it */
-static int force; /* -f flag: force overwriting all cat pages */
-static int rm_junk; /* -r flag: remove garbage pages */
-static char *locale; /* user's locale if -L is used */
-static char *lang_locale; /* short form of locale */
-static const char *machine, *machine_arch;
-static int exit_code; /* exit code to use when finished */
-
-/*
- * -T argument for nroff
- */
-static const char *nroff_device = "ascii";
-
-/*
- * Mapping from locale to nroff device
- */
-static const char *locale_device[] = {
- "KOI8-R", "koi8-r",
- "ISO8859-1", "latin1",
- "ISO8859-15", "latin1",
- NULL
-};
-
-#define BZ2_CMD "bzip2"
-#define BZ2_EXT ".bz2"
-#define BZ2CAT_CMD "bz"
-#define GZ_CMD "gzip"
-#define GZ_EXT ".gz"
-#define GZCAT_CMD "z"
-enum Ziptype {NONE, BZIP, GZIP};
-
-static uid_t uid;
-static gid_t gids[NGROUPS_MAX];
-static int ngids;
-static int starting_dir;
-static char tmp_file[MAXPATHLEN];
-struct stat test_st;
-
-/*
- * A hashtable is an array of chains composed of this entry structure.
- */
-struct hash_entry {
- ino_t inode_number;
- dev_t device_number;
- const char *data;
- struct hash_entry *next;
-};
-
-#define HASHTABLE_ALLOC 16384 /* allocation for hashtable (power of 2) */
-#define HASH_MASK (HASHTABLE_ALLOC - 1)
-
-static struct hash_entry *visited[HASHTABLE_ALLOC];
-static struct hash_entry *links[HASHTABLE_ALLOC];
-
-/*
- * Inserts a string into a hashtable keyed by inode & device number.
- */
-static void
-insert_hashtable(struct hash_entry **table,
- ino_t inode_number,
- dev_t device_number,
- const char *data)
-{
- struct hash_entry *new_entry;
- struct hash_entry **chain;
-
- new_entry = (struct hash_entry *) malloc(sizeof(struct hash_entry));
- if (new_entry == NULL)
- err(1, "can't insert into hashtable");
- chain = &table[inode_number & HASH_MASK];
- new_entry->inode_number = inode_number;
- new_entry->device_number = device_number;
- new_entry->data = data;
- new_entry->next = *chain;
- *chain = new_entry;
-}
-
-/*
- * Finds a string in a hashtable keyed by inode & device number.
- */
-static const char *
-find_hashtable(struct hash_entry **table,
- ino_t inode_number,
- dev_t device_number)
-{
- struct hash_entry *chain;
-
- chain = table[inode_number & HASH_MASK];
- while (chain != NULL) {
- if (chain->inode_number == inode_number &&
- chain->device_number == device_number)
- return chain->data;
- chain = chain->next;
- }
- return NULL;
-}
-
-static void
-trap_signal(int sig __unused)
-{
- if (tmp_file[0] != '\0')
- unlink(tmp_file);
- exit(1);
-}
-
-/*
- * Deals with junk files in the man or cat section directories.
- */
-static void
-junk(const char *mandir, const char *name, const char *reason)
-{
- if (verbose)
- fprintf(stderr, "%s/%s: %s\n", mandir, name, reason);
- if (rm_junk) {
- fprintf(stderr, "rm %s/%s\n", mandir, name);
- if (!pretend && unlink(name) < 0)
- warn("%s/%s", mandir, name);
- }
-}
-
-/*
- * Returns TOP_LEVEL_DIR for .../man, MAN_SECTION_DIR for .../manXXX,
- * and UNKNOWN for everything else.
- */
-static int
-directory_type(char *dir)
-{
- char *p;
-
- for (;;) {
- p = strrchr(dir, '/');
- if (p == NULL || p[1] != '\0')
- break;
- *p = '\0';
- }
- if (p == NULL)
- p = dir;
- else
- p++;
- if (strncmp(p, "man", 3) == 0) {
- p += 3;
- if (*p == '\0')
- return TOP_LEVEL_DIR;
- while (isalnum((unsigned char)*p) || *p == '_') {
- if (*++p == '\0')
- return MAN_SECTION_DIR;
- }
- }
- return UNKNOWN;
-}
-
-/*
- * Tests whether the given file name (without a preceding path)
- * is a proper man page name (like "mk-amd-map.8.gz").
- * Only alphanumerics and '_' are allowed after the last '.' and
- * the last '.' can't be the first or last characters.
- */
-static int
-is_manpage_name(char *name)
-{
- char *lastdot = NULL;
- char *n = name;
-
- while (*n != '\0') {
- if (!isalnum((unsigned char)*n)) {
- switch (*n) {
- case '_':
- break;
- case '-':
- case '+':
- case '[':
- case ':':
- lastdot = NULL;
- break;
- case '.':
- lastdot = n;
- break;
- default:
- return 0;
- }
- }
- n++;
- }
- return lastdot > name && lastdot + 1 < n;
-}
-
-static int
-is_bzipped(char *name)
-{
- int len = strlen(name);
- return len >= 5 && strcmp(&name[len - 4], BZ2_EXT) == 0;
-}
-
-static int
-is_gzipped(char *name)
-{
- int len = strlen(name);
- return len >= 4 && strcmp(&name[len - 3], GZ_EXT) == 0;
-}
-
-/*
- * Converts manXXX to catXXX.
- */
-static char *
-get_cat_section(char *section)
-{
- char *cat_section;
-
- cat_section = strdup(section);
- strncpy(cat_section, "cat", 3);
- return cat_section;
-}
-
-/*
- * Tests to see if the given directory has already been visited.
- */
-static int
-already_visited(char *mandir, char *dir, int count_visit)
-{
- struct stat st;
-
- if (stat(dir, &st) < 0) {
- if (mandir != NULL)
- warn("%s/%s", mandir, dir);
- else
- warn("%s", dir);
- exit_code = 1;
- return 1;
- }
- if (find_hashtable(visited, st.st_ino, st.st_dev) != NULL) {
- if (mandir != NULL)
- warnx("already visited %s/%s", mandir, dir);
- else
- warnx("already visited %s", dir);
- return 1;
- }
- if (count_visit)
- insert_hashtable(visited, st.st_ino, st.st_dev, "");
- return 0;
-}
-
-/*
- * Returns a set of TEST_* bits describing a file's type and permissions.
- * If mod_time isn't NULL, it will contain the file's modification time.
- */
-static int
-test_path(char *name, time_t *mod_time)
-{
- int result;
-
- if (stat(name, &test_st) < 0)
- return 0;
- result = TEST_EXISTS;
- if (mod_time != NULL)
- *mod_time = test_st.st_mtime;
- if (S_ISDIR(test_st.st_mode))
- result |= TEST_DIR;
- else if (S_ISREG(test_st.st_mode))
- result |= TEST_FILE;
- if (test_st.st_uid == uid) {
- test_st.st_mode >>= 6;
- } else {
- int i;
- for (i = 0; i < ngids; i++) {
- if (test_st.st_gid == gids[i]) {
- test_st.st_mode >>= 3;
- break;
- }
- }
- }
- if (test_st.st_mode & S_IROTH)
- result |= TEST_READABLE;
- if (test_st.st_mode & S_IWOTH)
- result |= TEST_WRITABLE;
- if (test_st.st_mode & S_IXOTH)
- result |= TEST_EXECUTABLE;
- return result;
-}
-
-/*
- * Checks whether a file is a symbolic link.
- */
-static int
-is_symlink(char *path)
-{
- struct stat st;
-
- return lstat(path, &st) >= 0 && S_ISLNK(st.st_mode);
-}
-
-/*
- * Tests to see if the given directory can be written to.
- */
-static void
-check_writable(char *mandir)
-{
- if (verbose && !(test_path(mandir, NULL) & TEST_WRITABLE))
- fprintf(stderr, "%s: not writable - will only be able to write to existing cat directories\n", mandir);
-}
-
-/*
- * If the directory exists, attempt to make it writable, otherwise
- * attempt to create it.
- */
-static int
-make_writable_dir(char *mandir, char *dir)
-{
- int test;
-
- if ((test = test_path(dir, NULL)) != 0) {
- if (!(test & TEST_WRITABLE) && chmod(dir, 0755) < 0) {
- warn("%s/%s: chmod", mandir, dir);
- exit_code = 1;
- return 0;
- }
- } else {
- if (verbose || pretend)
- fprintf(stderr, "mkdir %s\n", dir);
- if (!pretend) {
- unlink(dir);
- if (mkdir(dir, 0755) < 0) {
- warn("%s/%s: mkdir", mandir, dir);
- exit_code = 1;
- return 0;
- }
- }
- }
- return 1;
-}
-
-/*
- * Processes a single man page source by using nroff to create
- * the preformatted cat page.
- */
-static void
-process_page(char *mandir, char *src, char *cat, enum Ziptype zipped)
-{
- int src_test, cat_test;
- time_t src_mtime, cat_mtime;
- char cmd[MAXPATHLEN];
- dev_t src_dev;
- ino_t src_ino;
- const char *link_name;
-
- src_test = test_path(src, &src_mtime);
- if (!(src_test & (TEST_FILE|TEST_READABLE))) {
- if (!(src_test & TEST_DIR)) {
- warnx("%s/%s: unreadable", mandir, src);
- exit_code = 1;
- if (rm_junk && is_symlink(src))
- junk(mandir, src, "bogus symlink");
- }
- return;
- }
- src_dev = test_st.st_dev;
- src_ino = test_st.st_ino;
- cat_test = test_path(cat, &cat_mtime);
- if (cat_test & (TEST_FILE|TEST_READABLE)) {
- if (!force && cat_mtime >= src_mtime) {
- if (verbose) {
- fprintf(stderr, "\t%s/%s: up to date\n",
- mandir, src);
- }
- return;
- }
- }
- /*
- * Is the man page a link to one we've already processed?
- */
- if ((link_name = find_hashtable(links, src_ino, src_dev)) != NULL) {
- if (verbose || pretend) {
- fprintf(stderr, "%slink %s -> %s\n",
- verbose ? "\t" : "", cat, link_name);
- }
- if (!pretend)
- link(link_name, cat);
- return;
- }
- insert_hashtable(links, src_ino, src_dev, strdup(cat));
- if (verbose || pretend) {
- fprintf(stderr, "%sformat %s -> %s\n",
- verbose ? "\t" : "", src, cat);
- if (pretend)
- return;
- }
- snprintf(tmp_file, sizeof tmp_file, "%s.tmp", cat);
- snprintf(cmd, sizeof cmd,
- "%scat %s | tbl | nroff -T%s -man | col | %s > %s.tmp",
- zipped == BZIP ? BZ2CAT_CMD : zipped == GZIP ? GZCAT_CMD : "",
- src, nroff_device,
- zipped == BZIP ? BZ2_CMD : zipped == GZIP ? GZ_CMD : "cat",
- cat);
- if (system(cmd) != 0)
- err(1, "formatting pipeline");
- if (rename(tmp_file, cat) < 0)
- warn("%s", cat);
- tmp_file[0] = '\0';
-}
-
-/*
- * Scan the man section directory for pages and process each one,
- * then check for junk in the corresponding cat section.
- */
-static void
-scan_section(char *mandir, char *section, char *cat_section)
-{
- struct dirent **entries;
- char **expected = NULL;
- int npages;
- int nexpected = 0;
- int i, e;
- enum Ziptype zipped;
- char *page_name;
- char page_path[MAXPATHLEN];
- char cat_path[MAXPATHLEN];
- char zip_path[MAXPATHLEN];
-
- /*
- * scan the man section directory for pages
- */
- npages = scandir(section, &entries, NULL, alphasort);
- if (npages < 0) {
- warn("%s/%s", mandir, section);
- exit_code = 1;
- return;
- }
- if (verbose || rm_junk) {
- /*
- * Maintain a list of all cat pages that should exist,
- * corresponding to existing man pages.
- */
- expected = (char **) calloc(npages, sizeof(char *));
- }
- for (i = 0; i < npages; free(entries[i++])) {
- page_name = entries[i]->d_name;
- snprintf(page_path, sizeof page_path, "%s/%s", section,
- page_name);
- if (!is_manpage_name(page_name)) {
- if (!(test_path(page_path, NULL) & TEST_DIR)) {
- junk(mandir, page_path,
- "invalid man page name");
- }
- continue;
- }
- zipped = is_bzipped(page_name) ? BZIP :
- is_gzipped(page_name) ? GZIP : NONE;
- if (zipped != NONE) {
- snprintf(cat_path, sizeof cat_path, "%s/%s",
- cat_section, page_name);
- if (expected != NULL)
- expected[nexpected++] = strdup(page_name);
- process_page(mandir, page_path, cat_path, zipped);
- } else {
- /*
- * We've got an uncompressed man page,
- * check to see if there's a (preferred)
- * compressed one.
- */
- snprintf(zip_path, sizeof zip_path, "%s%s",
- page_path, GZ_EXT);
- if (test_path(zip_path, NULL) != 0) {
- junk(mandir, page_path,
- "man page unused due to existing " GZ_EXT);
- } else {
- if (verbose) {
- fprintf(stderr,
- "warning, %s is uncompressed\n",
- page_path);
- }
- snprintf(cat_path, sizeof cat_path, "%s/%s",
- cat_section, page_name);
- if (expected != NULL) {
- asprintf(&expected[nexpected++],
- "%s", page_name);
- }
- process_page(mandir, page_path, cat_path, NONE);
- }
- }
- }
- free(entries);
- if (expected == NULL)
- return;
- /*
- * scan cat sections for junk
- */
- npages = scandir(cat_section, &entries, NULL, alphasort);
- e = 0;
- for (i = 0; i < npages; free(entries[i++])) {
- const char *junk_reason;
- int cmp = 1;
-
- page_name = entries[i]->d_name;
- if (strcmp(page_name, ".") == 0 || strcmp(page_name, "..") == 0)
- continue;
- /*
- * Keep the index into the expected cat page list
- * ahead of the name we've found.
- */
- while (e < nexpected &&
- (cmp = strcmp(page_name, expected[e])) > 0)
- free(expected[e++]);
- if (cmp == 0)
- continue;
- /* we have an unexpected page */
- snprintf(cat_path, sizeof cat_path, "%s/%s", cat_section,
- page_name);
- if (!is_manpage_name(page_name)) {
- if (test_path(cat_path, NULL) & TEST_DIR)
- continue;
- junk_reason = "invalid cat page name";
- } else if (!is_gzipped(page_name) && e + 1 < nexpected &&
- strncmp(page_name, expected[e + 1], strlen(page_name)) == 0 &&
- strlen(expected[e + 1]) == strlen(page_name) + 3) {
- junk_reason = "cat page unused due to existing " GZ_EXT;
- } else
- junk_reason = "cat page without man page";
- junk(mandir, cat_path, junk_reason);
- }
- free(entries);
- while (e < nexpected)
- free(expected[e++]);
- free(expected);
-}
-
-
-/*
- * Processes a single man section.
- */
-static void
-process_section(char *mandir, char *section)
-{
- char *cat_section;
-
- if (already_visited(mandir, section, 1))
- return;
- if (verbose)
- fprintf(stderr, " section %s\n", section);
- cat_section = get_cat_section(section);
- if (make_writable_dir(mandir, cat_section))
- scan_section(mandir, section, cat_section);
- free(cat_section);
-}
-
-static int
-select_sections(struct dirent *entry)
-{
- return directory_type(entry->d_name) == MAN_SECTION_DIR;
-}
-
-/*
- * Processes a single top-level man directory. If section isn't NULL,
- * it will only process that section sub-directory, otherwise it will
- * process all of them.
- */
-static void
-process_mandir(char *dir_name, char *section)
-{
- fchdir(starting_dir);
- if (already_visited(NULL, dir_name, section == NULL))
- return;
- check_writable(dir_name);
- if (verbose)
- fprintf(stderr, "man directory %s\n", dir_name);
- if (pretend)
- fprintf(stderr, "cd %s\n", dir_name);
- if (chdir(dir_name) < 0) {
- warn("%s: chdir", dir_name);
- exit_code = 1;
- return;
- }
- if (section != NULL) {
- process_section(dir_name, section);
- } else {
- struct dirent **entries;
- char *machine_dir, *arch_dir;
- int nsections;
- int i;
-
- nsections = scandir(".", &entries, select_sections, alphasort);
- if (nsections < 0) {
- warn("%s", dir_name);
- exit_code = 1;
- return;
- }
- for (i = 0; i < nsections; i++) {
- process_section(dir_name, entries[i]->d_name);
- asprintf(&machine_dir, "%s/%s", entries[i]->d_name,
- machine);
- if (test_path(machine_dir, NULL) & TEST_DIR)
- process_section(dir_name, machine_dir);
- free(machine_dir);
- if (strcmp(machine_arch, machine) != 0) {
- asprintf(&arch_dir, "%s/%s", entries[i]->d_name,
- machine_arch);
- if (test_path(arch_dir, NULL) & TEST_DIR)
- process_section(dir_name, arch_dir);
- free(arch_dir);
- }
- free(entries[i]);
- }
- free(entries);
- }
-}
-
-/*
- * Processes one argument, which may be a colon-separated list of
- * directories.
- */
-static void
-process_argument(const char *arg)
-{
- char *dir;
- char *mandir;
- char *section;
- char *parg;
-
- parg = strdup(arg);
- if (parg == NULL)
- err(1, "out of memory");
- while ((dir = strsep(&parg, ":")) != NULL) {
- switch (directory_type(dir)) {
- case TOP_LEVEL_DIR:
- if (locale != NULL) {
- asprintf(&mandir, "%s/%s", dir, locale);
- process_mandir(mandir, NULL);
- free(mandir);
- if (lang_locale != NULL) {
- asprintf(&mandir, "%s/%s", dir,
- lang_locale);
- process_mandir(mandir, NULL);
- free(mandir);
- }
- } else {
- process_mandir(dir, NULL);
- }
- break;
- case MAN_SECTION_DIR: {
- mandir = strdup(dirname(dir));
- section = strdup(basename(dir));
- process_mandir(mandir, section);
- free(mandir);
- free(section);
- break;
- }
- default:
- warnx("%s: directory name not in proper man form", dir);
- exit_code = 1;
- }
- }
- free(parg);
-}
-
-static void
-determine_locale(void)
-{
- char *sep;
-
- if ((locale = setlocale(LC_CTYPE, "")) == NULL) {
- warnx("-L option used, but no locale found\n");
- return;
- }
- sep = strchr(locale, '_');
- if (sep != NULL && isupper((unsigned char)sep[1])
- && isupper((unsigned char)sep[2])) {
- asprintf(&lang_locale, "%.*s%s", (int)(sep - locale),
- locale, &sep[3]);
- }
- sep = nl_langinfo(CODESET);
- if (sep != NULL && *sep != '\0' && strcmp(sep, "US-ASCII") != 0) {
- int i;
-
- for (i = 0; locale_device[i] != NULL; i += 2) {
- if (strcmp(sep, locale_device[i]) == 0) {
- nroff_device = locale_device[i + 1];
- break;
- }
- }
- }
- if (verbose) {
- if (lang_locale != NULL)
- fprintf(stderr, "short locale is %s\n", lang_locale);
- fprintf(stderr, "nroff device is %s\n", nroff_device);
- }
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: %s [-fLnrv] [directories ...]\n",
- getprogname());
- exit(1);
-}
-
-int
-main(int argc, char **argv)
-{
- int opt;
-
- if ((uid = getuid()) == 0) {
- fprintf(stderr, "don't run %s as root, use:\n echo", argv[0]);
- for (optind = 0; optind < argc; optind++) {
- fprintf(stderr, " %s", argv[optind]);
- }
- fprintf(stderr, " | nice -5 su -m man\n");
- exit(1);
- }
- while ((opt = getopt(argc, argv, "vnfLrh")) != -1) {
- switch (opt) {
- case 'f':
- force++;
- break;
- case 'L':
- determine_locale();
- break;
- case 'n':
- pretend++;
- break;
- case 'r':
- rm_junk++;
- break;
- case 'v':
- verbose++;
- break;
- default:
- usage();
- /* NOTREACHED */
- }
- }
- ngids = getgroups(NGROUPS_MAX, gids);
- if ((starting_dir = open(".", 0)) < 0) {
- err(1, ".");
- }
- umask(022);
- signal(SIGINT, trap_signal);
- signal(SIGHUP, trap_signal);
- signal(SIGQUIT, trap_signal);
- signal(SIGTERM, trap_signal);
-
- if ((machine = getenv("MACHINE")) == NULL) {
- static struct utsname utsname;
-
- if (uname(&utsname) == -1)
- err(1, "uname");
- machine = utsname.machine;
- }
-
- if ((machine_arch = getenv("MACHINE_ARCH")) == NULL)
- machine_arch = MACHINE_ARCH;
-
- if (optind == argc) {
- const char *manpath = getenv("MANPATH");
- if (manpath == NULL)
- manpath = DEFAULT_MANPATH;
- process_argument(manpath);
- } else {
- while (optind < argc)
- process_argument(argv[optind++]);
- }
- exit(exit_code);
-}
diff --git a/usr.bin/chat/Makefile b/usr.bin/chat/Makefile
deleted file mode 100644
index 8aa23eb..0000000
--- a/usr.bin/chat/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# $FreeBSD$
-
-# I once used this extensively, but no longer have a modem. Feel free
-# to ask me questions about it, but I disclaim ownership now. -Peter
-
-PROG= chat
-MAN= chat.8
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/chat/chat.8 b/usr.bin/chat/chat.8
deleted file mode 100644
index ecc733d..0000000
--- a/usr.bin/chat/chat.8
+++ /dev/null
@@ -1,576 +0,0 @@
-.\" -*- nroff -*-
-.\" manual page [] for chat 1.8
-.\" $FreeBSD$
-.\" SH section heading
-.\" SS subsection heading
-.\" LP paragraph
-.\" IP indented paragraph
-.\" TP hanging label
-.TH CHAT 8 "27 Sep 1997" "Chat Version 1.17"
-.SH NAME
-chat \- Automated conversational script with a modem
-.SH SYNOPSIS
-.B chat
-[
-.I options
-]
-.I script
-.SH DESCRIPTION
-.LP
-The \fIchat\fR program defines a conversational exchange between the
-computer and the modem.
-Its primary purpose is to establish the
-connection between the Point-to-Point Protocol Daemon (\fIpppd\fR) and
-the remote's \fIpppd\fR process.
-.SH OPTIONS
-.TP
-.B -f \fI<chat file>
-Read the chat script from the chat \fIfile\fR.
-The use of this option
-is mutually exclusive with the chat script parameters.
-The user must
-have read access to the file.
-Multiple lines are permitted in the
-file.
-Space or horizontal tab characters should be used to separate
-the strings.
-.TP
-.B -t \fI<timeout>
-Set the timeout for the expected string to be received.
-If the string
-is not received within the time limit then the reply string is not
-sent.
-An alternate reply may be sent or the script will fail if there
-is no alternate reply string.
-A failed script will cause the
-\fIchat\fR program to terminate with a non-zero error code.
-.TP
-.B -r \fI<report file>
-Set the file for output of the report strings.
-If you use the keyword
-\fIREPORT\fR, the resulting strings are written to this file.
-If this
-option is not used and you still use \fIREPORT\fR keywords, the
-\fIstderr\fR file is used for the report strings.
-.TP
-.B -e
-Start with the echo option turned on.
-Echoing may also be turned on
-or off at specific points in the chat script by using the \fIECHO\fR
-keyword.
-When echoing is enabled, all output from the modem is echoed
-to \fIstderr\fR.
-.TP
-.B -v
-Request that the \fIchat\fR script be executed in a verbose mode.
-The
-\fIchat\fR program will then log the execution state of the chat
-script as well as all text received from the modem and the output
-strings sent to the modem. The default is to log through
-.IR syslog (3);
-the logging method may be altered with the -S and -s flags.
-Logging is
-done to the \fIlocal2\fR facility at level \fIinfo\fR for verbose tracing
-and level \fIerr\fR for some errors.
-.TP
-.B -V
-Request that the \fIchat\fR script be executed in a stderr verbose
-mode.
-The \fIchat\fR program will then log all text received from the
-modem and the output strings sent to the modem to the stderr device.
-This
-device is usually the local console at the station running the chat or
-pppd program.
-.TP
-.B -s
-Use stderr. All log messages from '-v' and all error messages will be
-sent to stderr.
-.TP
-.B -S
-Do not use
-.IR syslog (3).
-By default, error messages are sent to
-.IR syslog (3).
-The use of -S will prevent both log messages from '-v' and
-error messages from being sent to
-.IR syslog (3).
-.TP
-.B -T \fI<phone number>
-Pass in an arbitrary string, usually a phone number, that will be
-substituted for the \\T substitution metacharacter in a send string.
-.TP
-.B -U \fI<phone number 2>
-Pass in a second string, usually a phone number, that will be
-substituted for the \\U substitution metacharacter in a send string.
-This is useful when dialing an ISDN terminal adapter that requires two
-numbers.
-.TP
-.B script
-If the script is not specified in a file with the \fI-f\fR option then
-the script is included as parameters to the \fIchat\fR program.
-.SH CHAT SCRIPT
-.LP
-The \fIchat\fR script defines the communications.
-.LP
-A script consists of one or more "expect-send" pairs of strings,
-separated by spaces, with an optional "subexpect-subsend" string pair,
-separated by a dash as in the following example:
-.IP
-ogin:-BREAK-ogin: ppp ssword: hello2u2
-.LP
-This line indicates that the \fIchat\fR program should expect the string
-"ogin:". If it fails to receive a login prompt within the time interval
-allotted, it is to send a break sequence to the remote and then expect the
-string "ogin:". If the first "ogin:" is received then the break sequence is
-not generated.
-.LP
-Once it received the login prompt the \fIchat\fR program will send the
-string ppp and then expect the prompt "ssword:". When it receives the
-prompt for the password, it will send the password hello2u2.
-.LP
-A carriage return is normally sent following the reply string.
-It is not
-expected in the "expect" string unless it is specifically requested by using
-the \\r character sequence.
-.LP
-The expect sequence should contain only what is needed to identify the
-string.
-Since it is normally stored on a disk file, it should not contain
-variable information.
-It is generally not acceptable to look for time
-strings, network identification strings, or other variable pieces of data as
-an expect string.
-.LP
-To help correct for characters which may be corrupted during the initial
-sequence, look for the string "ogin:" rather than "login:". It is possible
-that the leading "l" character may be received in error and you may never
-find the string even though it was sent by the system.
-For this reason,
-scripts look for "ogin:" rather than "login:" and "ssword:" rather than
-"password:".
-.LP
-A very simple script might look like this:
-.IP
-ogin: ppp ssword: hello2u2
-.LP
-In other words, expect ....ogin:, send ppp, expect ...ssword:, send hello2u2.
-.LP
-In actual practice, simple scripts are rare.
-At the vary least, you
-should include sub-expect sequences should the original string not be
-received.
-For example, consider the following script:
-.IP
-ogin:--ogin: ppp ssword: hello2u2
-.LP
-This would be a better script than the simple one used earlier.
-This would look
-for the same login: prompt, however, if one was not received, a single
-return sequence is sent and then it will look for login: again.
-Should line
-noise obscure the first login prompt then sending the empty line will
-usually generate a login prompt again.
-.SH COMMENTS
-Comments can be embedded in the chat script.
-A comment is a line which
-starts with the \fB#\fR (hash) character in column 1. Such comment
-lines are just ignored by the chat program.
-If a '#' character is to
-be expected as the first character of the expect sequence, you should
-quote the expect string.
-If you want to wait for a prompt that starts with a # (hash)
-character, you would have to write something like this:
-.IP
-# Now wait for the prompt and send logout string
-.br
-\&'# ' logout
-.LP
-
-.SH ABORT STRINGS
-Many modems will report the status of the call as a string.
-These
-strings may be \fBCONNECTED\fR or \fBNO CARRIER\fR or \fBBUSY\fR.
-It
-is often desirable to terminate the script should the modem fail to
-connect to the remote.
-The difficulty is that a script would not know
-exactly which modem string it may receive.
-On one attempt, it may
-receive \fBBUSY\fR while the next time it may receive \fBNO CARRIER\fR.
-.LP
-These "abort" strings may be specified in the script using the \fIABORT\fR
-sequence.
-It is written in the script as in the following example:
-.IP
-ABORT BUSY ABORT 'NO CARRIER' '' ATZ OK ATDT5551212 CONNECT
-.LP
-This sequence will expect nothing; and then send the string ATZ.
-The
-expected response to this is the string \fIOK\fR.
-When it receives \fIOK\fR,
-the string ATDT5551212 to dial the telephone.
-The expected string is
-\fICONNECT\fR.
-If the string \fICONNECT\fR is received the remainder of the
-script is executed.
-However, should the modem find a busy telephone, it will
-send the string \fIBUSY\fR.
-This will cause the string to match the abort
-character sequence.
-The script will then fail because it found a match to
-the abort string.
-If it received the string \fINO CARRIER\fR, it will abort
-for the same reason.
-Either string may be received.
-Either string will
-terminate the \fIchat\fR script.
-.SH CLR_ABORT STRINGS
-This sequence allows for clearing previously set \fBABORT\fR strings.
-\fBABORT\fR strings are kept in an array of a pre-determined size (at
-compilation time); \fBCLR_ABORT\fR will reclaim the space for cleared
-entries so that new strings can use that space.
-.SH SAY STRINGS
-The \fBSAY\fR directive allows the script to send strings to the user
-at the terminal via standard error. If \fBchat\fR is being run by
-pppd, and pppd is running as a daemon (detached from its controlling
-terminal), standard error will normally be redirected to the file
-/etc/ppp/connect-errors.
-.LP
-\fBSAY\fR strings must be enclosed in single or double quotes.
-If
-carriage return and line feed are needed in the string to be output,
-you must explicitly add them to your string.
-.LP
-The SAY strings could be used to give progress messages in sections of
-the script where you want to have 'ECHO OFF' but still let the user
-know what is happening. An example is:
-.IP
-ABORT BUSY
-.br
-ECHO OFF
-.br
-SAY "Dialling your ISP...\\n"
-.br
-\&'' ATDT5551212
-.br
-TIMEOUT 120
-.br
-SAY "Waiting up to 2 minutes for connection ... "
-.br
-CONNECT ''
-.br
-SAY "Connected, now logging in ...\\n"
-.br
-ogin: account
-.br
-ssword: pass
-.br
-$ \c
-SAY "Logged in OK ...\\n"
-\fIetc ...\fR
-.LP
-This sequence will only present the SAY strings to the user and all
-the details of the script will remain hidden.
-For example, if the
-above script works, the user will see:
-.IP
-Dialling your ISP...
-.br
-Waiting up to 2 minutes for connection ... Connected, now logging in ...
-.br
-Logged in OK ...
-.LP
-
-.SH REPORT STRINGS
-A \fBreport\fR string is similar to the ABORT string.
-The difference
-is that the strings, and all characters to the next control character
-such as a carriage return, are written to the report file.
-.LP
-The report strings may be used to isolate the transmission rate of the
-modem's connect string and return the value to the chat user.
-The
-analysis of the report string logic occurs in conjunction with the
-other string processing such as looking for the expect string.
-The use
-of the same string for a report and abort sequence is probably not
-very useful, however, it is possible.
-.LP
-The report strings to no change the completion code of the program.
-.LP
-These "report" strings may be specified in the script using the \fIREPORT\fR
-sequence.
-It is written in the script as in the following example:
-.IP
-REPORT CONNECT ABORT BUSY '' ATDT5551212 CONNECT '' ogin: account
-.LP
-This sequence will expect nothing; and then send the string
-ATDT5551212 to dial the telephone.
-The expected string is
-\fICONNECT\fR.
-If the string \fICONNECT\fR is received the remainder
-of the script is executed.
-In addition the program will write to the
-expect-file the string "CONNECT" plus any characters which follow it
-such as the connection rate.
-.SH CLR_REPORT STRINGS
-This sequence allows for clearing previously set \fBREPORT\fR strings.
-\fBREPORT\fR strings are kept in an array of a pre-determined size (at
-compilation time); \fBCLR_REPORT\fR will reclaim the space for cleared
-entries so that new strings can use that space.
-.SH ECHO
-The echo options controls whether the output from the modem is echoed
-to \fIstderr\fR.
-This option may be set with the \fI-e\fR option, but
-it can also be controlled by the \fIECHO\fR keyword.
-The "expect-send"
-pair \fIECHO\fR \fION\fR enables echoing, and \fIECHO\fR \fIOFF\fR
-disables it.
-With this keyword you can select which parts of the
-conversation should be visible.
-For instance, with the following
-script:
-.IP
-ABORT 'BUSY'
-.br
-ABORT 'NO CARRIER'
-.br
-\&'' ATZ
-.br
-OK\\r\\n ATD1234567
-.br
-\\r\\n \\c
-.br
-ECHO ON
-.br
-CONNECT \\c
-.br
-ogin: account
-.LP
-all output resulting from modem configuration and dialing is not visible,
-but starting with the \fICONNECT\fR (or \fIBUSY\fR) message, everything
-will be echoed.
-.SH HANGUP
-The HANGUP options control whether a modem hangup should be considered
-as an error or not. This option is useful in scripts for dialling
-systems which will hang up and call your system back. The HANGUP
-options can be \fBON\fR or \fBOFF\fR.
-.br
-When HANGUP is set OFF and the modem hangs up (e.g., after the first
-stage of logging in to a callback system), \fBchat\fR will continue
-running the script (e.g., waiting for the incoming call and second
-stage login prompt). As soon as the incoming call is connected, you
-should use the \fBHANGUP ON\fR directive to reinstall normal hang up
-signal behavior. Here is a (simple) example script:
-.IP
-ABORT 'BUSY'
-.br
-\&'' ATZ
-.br
-OK\\r\\n ATD1234567
-.br
-\\r\\n \\c
-.br
-CONNECT \\c
-.br
-\&'Callback login:' call_back_ID
-.br
-HANGUP OFF
-.br
-ABORT "Bad Login"
-.br
-\&'Callback Password:' Call_back_password
-.br
-TIMEOUT 120
-.br
-CONNECT \\c
-.br
-HANGUP ON
-.br
-ABORT "NO CARRIER"
-.br
-ogin:--BREAK--ogin: real_account
-.br
-\fIetc ...\fR
-.LP
-.SH TIMEOUT
-The initial timeout value is 45 seconds.
-This may be changed using the \fB-t\fR
-parameter.
-.LP
-To change the timeout value for the next expect string, the following
-example may be used:
-.IP
-ATZ OK ATDT5551212 CONNECT TIMEOUT 10 ogin:--ogin: TIMEOUT 5 assword: hello2u2
-.LP
-This will change the timeout to 10 seconds when it expects the login:
-prompt.
-The timeout is then changed to 5 seconds when it looks for the
-password prompt.
-.LP
-The timeout, once changed, remains in effect until it is changed again.
-.SH SENDING EOT
-The special reply string of \fIEOT\fR indicates that the chat program
-should send an EOT character to the remote.
-This is normally the
-End-of-file character sequence.
-A return character is not sent
-following the EOT.
-.LP
-The EOT sequence may be embedded into the send string using the
-sequence \fI^D\fR.
-.SH GENERATING BREAK
-The special reply string of \fIBREAK\fR will cause a break condition
-to be sent.
-The break is a special signal on the transmitter.
-The
-normal processing on the receiver is to change the transmission rate.
-It may be used to cycle through the available transmission rates on
-the remote until you are able to receive a valid login prompt.
-.LP
-The break sequence may be embedded into the send string using the
-\fI\\K\fR sequence.
-.SH ESCAPE SEQUENCES
-The expect and reply strings may contain escape sequences.
-All of the
-sequences are legal in the reply string.
-Many are legal in the expect.
-Those which are not valid in the expect sequence are so indicated.
-.TP
-.B ''
-Expects or sends a null string.
-If you send a null string then it will still
-send the return character.
-This sequence may either be a pair of apostrophe
-or quote characters.
-.TP
-.B \\\\b
-represents a backspace character.
-.TP
-.B \\\\c
-Suppresses the newline at the end of the reply string.
-This is the only
-method to send a string without a trailing return character.
-It must
-be at the end of the send string.
-For example,
-the sequence hello\\c will simply send the characters h, e, l, l, o.
-.I (not valid in expect.)
-.TP
-.B \\\\d
-Delay for one second.
-The program uses sleep(1) which will delay to a
-maximum of one second.
-.I (not valid in expect.)
-.TP
-.B \\\\K
-Insert a BREAK
-.I (not valid in expect.)
-.TP
-.B \\\\n
-Send a newline or linefeed character.
-.TP
-.B \\\\N
-Send a null character.
-The same sequence may be represented by \\0.
-.I (not valid in expect.)
-.TP
-.B \\\\p
-Pause for a fraction of a second.
-The delay is 1/10th of a second.
-.I (not valid in expect.)
-.TP
-.B \\\\q
-Suppress writing the string to
-.IR syslogd (8).
-The string ?????? is
-written to the log in its place.
-.I (not valid in expect.)
-.TP
-.B \\\\r
-Send or expect a carriage return.
-.TP
-.B \\\\s
-Represents a space character in the string.
-This may be used when it
-is not desirable to quote the strings which contains spaces.
-The
-sequence 'HI TIM' and HI\\sTIM are the same.
-.TP
-.B \\\\t
-Send or expect a tab character.
-.TP
-.B \\\\\\\\
-Send or expect a backslash character.
-.TP
-.B \\\\ddd
-Collapse the octal digits (ddd) into a single ASCII character and send that
-character.
-.I (some characters are not valid in expect.)
-.TP
-.B \^^C
-Substitute the sequence with the control character represented by C.
-For example, the character DC1 (17) is shown as \^^Q.
-.I (some characters are not valid in expect.)
-.SH TERMINATION CODES
-The \fIchat\fR program will terminate with the following completion
-codes.
-.TP
-.B 0
-The normal termination of the program.
-This indicates that the script
-was executed without error to the normal conclusion.
-.TP
-.B 1
-One or more of the parameters are invalid or an expect string was too
-large for the internal buffers.
-This indicates that the program as not
-properly executed.
-.TP
-.B 2
-An error occurred during the execution of the program.
-This may be due
-to a read or write operation failing for some reason or chat receiving
-a signal such as SIGINT.
-.TP
-.B 3
-A timeout event occurred when there was an \fIexpect\fR string without
-having a "-subsend" string.
-This may mean that you did not program the
-script correctly for the condition or that some unexpected event has
-occurred and the expected string could not be found.
-.TP
-.B 4
-The first string marked as an \fIABORT\fR condition occurred.
-.TP
-.B 5
-The second string marked as an \fIABORT\fR condition occurred.
-.TP
-.B 6
-The third string marked as an \fIABORT\fR condition occurred.
-.TP
-.B 7
-The fourth string marked as an \fIABORT\fR condition occurred.
-.TP
-.B ...
-The other termination codes are also strings marked as an \fIABORT\fR
-condition.
-.LP
-Using the termination code, it is possible to determine which event
-terminated the script.
-It is possible to decide if the string "BUSY"
-was received from the modem as opposed to "NO DIAL TONE". While the
-first event may be retried, the second will probably have little
-chance of succeeding during a retry.
-.SH SEE ALSO
-Additional information about \fIchat\fR scripts may be found with UUCP
-documentation.
-The \fIchat\fR script was taken from the ideas proposed
-by the scripts used by the \fIuucico\fR program.
-.LP
-uucico(1), uucp(1), syslog(3), syslogd(8).
-.SH COPYRIGHT
-The \fIchat\fR program is in public domain.
-This is not the GNU public
-license.
-If it breaks then you get to keep both pieces.
diff --git a/usr.bin/chat/chat.c b/usr.bin/chat/chat.c
deleted file mode 100644
index 056af37..0000000
--- a/usr.bin/chat/chat.c
+++ /dev/null
@@ -1,1535 +0,0 @@
-/*
- * Chat -- a program for automatic session establishment (i.e. dial
- * the phone and log in).
- *
- * Standard termination codes:
- * 0 - successful completion of the script
- * 1 - invalid argument, expect string too large, etc.
- * 2 - error on an I/O operation or fatal error condition.
- * 3 - timeout waiting for a simple string.
- * 4 - the first string declared as "ABORT"
- * 5 - the second string declared as "ABORT"
- * 6 - ... and so on for successive ABORT strings.
- *
- * This software is in the public domain.
- *
- * -----------------
- * added -T and -U option and \T and \U substitution to pass a phone
- * number into chat script. Two are needed for some ISDN TA applications.
- * Keith Dart <kdart@cisco.com>
- *
- *
- * Added SAY keyword to send output to stderr.
- * This allows to turn ECHO OFF and to output specific, user selected,
- * text to give progress messages. This best works when stderr
- * exists (i.e.: pppd in nodetach mode).
- *
- * Added HANGUP directives to allow for us to be called
- * back. When HANGUP is set to NO, chat will not hangup at HUP signal.
- * We rely on timeouts in that case.
- *
- * Added CLR_ABORT to clear previously set ABORT string. This has been
- * dictated by the HANGUP above as "NO CARRIER" (for example) must be
- * an ABORT condition until we know the other host is going to close
- * the connection for call back. As soon as we have completed the
- * first stage of the call back sequence, "NO CARRIER" is a valid, non
- * fatal string. As soon as we got called back (probably get "CONNECT"),
- * we should re-arm the ABORT "NO CARRIER". Hence the CLR_ABORT command.
- * Note that CLR_ABORT packs the abort_strings[] array so that we do not
- * have unused entries not being reclaimed.
- *
- * In the same vein as above, added CLR_REPORT keyword.
- *
- * Allow for comments. Line starting with '#' are comments and are
- * ignored. If a '#' is to be expected as the first character, the
- * expect string must be quoted.
- *
- *
- * Francis Demierre <Francis@SwissMail.Com>
- * Thu May 15 17:15:40 MET DST 1997
- *
- *
- * Added -r "report file" switch & REPORT keyword.
- * Robert Geer <bgeer@xmission.com>
- *
- * Added -s "use stderr" and -S "don't use syslog" switches.
- * June 18, 1997
- * Karl O. Pinc <kop@meme.com>
- *
- *
- * Added -e "echo" switch & ECHO keyword
- * Dick Streefland <dicks@tasking.nl>
- *
- *
- * Considerable updates and modifications by
- * Al Longyear <longyear@pobox.com>
- * Paul Mackerras <paulus@cs.anu.edu.au>
- *
- *
- * The original author is:
- *
- * Karl Fox <karl@MorningStar.Com>
- * Morning Star Technologies, Inc.
- * 1760 Zollinger Road
- * Columbus, OH 43221
- * (614)451-1883
- *
- *
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-#include <termios.h>
-#include <time.h>
-#include <unistd.h>
-
-#define STR_LEN 1024
-
-#ifndef SIGTYPE
-#define SIGTYPE void
-#endif
-
-#ifndef O_NONBLOCK
-#define O_NONBLOCK O_NDELAY
-#endif
-
-#define MAX_ABORTS 50
-#define MAX_REPORTS 50
-#define DEFAULT_CHAT_TIMEOUT 45
-
-int echo = 0;
-int verbose = 0;
-int to_log = 1;
-int to_stderr = 0;
-int Verbose = 0;
-int quiet = 0;
-int exit_code = 0;
-FILE* report_fp = (FILE *) 0;
-char *report_file = (char *) 0;
-char *chat_file = (char *) 0;
-char *phone_num = (char *) 0;
-char *phone_num2 = (char *) 0;
-int timeout = DEFAULT_CHAT_TIMEOUT;
-
-static char blank[] = "";
-
-int have_tty_parameters = 0;
-
-#define term_parms struct termios
-#define get_term_param(param) tcgetattr(0, param)
-#define set_term_param(param) tcsetattr(0, TCSANOW, param)
-struct termios saved_tty_parameters;
-
-char *abort_string[MAX_ABORTS], *fail_reason = (char *)0,
- fail_buffer[50];
-int n_aborts = 0, abort_next = 0, timeout_next = 0, echo_next = 0;
-int clear_abort_next = 0;
-
-char *report_string[MAX_REPORTS] ;
-char report_buffer[50] ;
-int n_reports = 0, report_next = 0, report_gathering = 0 ;
-int clear_report_next = 0;
-
-int say_next = 0, hup_next = 0;
-
-void *dup_mem(void *b, size_t c);
-void *copy_of(char *s);
-static void usage(void);
-void chat_logf(const char *fmt, ...);
-void fatal(int code, const char *fmt, ...);
-SIGTYPE sigalrm(int signo);
-SIGTYPE sigint(int signo);
-SIGTYPE sigterm(int signo);
-SIGTYPE sighup(int signo);
-void init(void);
-void set_tty_parameters(void);
-void echo_stderr(int);
-void break_sequence(void);
-void terminate(int status);
-void do_file(char *chatfile);
-int get_string(char *string);
-int put_string(char *s);
-int write_char(int c);
-int put_char(int c);
-int get_char(void);
-void chat_send(char *s);
-char *character(int c);
-void chat_expect(char *s);
-char *clean(char *s, int sending);
-void pack_array(char **array, int end);
-char *expect_strtok(char *, const char *);
-int vfmtmsg(char *, int, const char *, va_list); /* vsprintf++ */
-
-void *
-dup_mem(void *b, size_t c)
-{
- void *ans = malloc (c);
- if (!ans)
- fatal(2, "memory error!");
-
- memcpy (ans, b, c);
- return ans;
-}
-
-void *
-copy_of(char *s)
-{
- return dup_mem (s, strlen (s) + 1);
-}
-
-/*
- * chat [-esSvV] [-f chat-file] [-r report-file] [-t timeout]
- * [-T phone-number] [-U phone-number2] [chat-script]
- * where chat-script has the form:
- * [...[[expect[-send[-expect...]] send expect[-send[-expect]] ...]]]
- *
- * Perform a UUCP-dialer-like chat script on stdin and stdout.
- */
-int
-main(int argc, char *argv[])
-{
- int option;
-
- tzset();
-
- while ((option = getopt(argc, argv, "ef:r:sSt:T:U:vV")) != -1) {
- switch (option) {
- case 'e':
- ++echo;
- break;
-
- case 'f':
- if (chat_file != NULL)
- free(chat_file);
- chat_file = copy_of(optarg);
- break;
-
- case 'r':
- if (report_fp != NULL)
- fclose(report_fp);
- if (report_file != NULL)
- free(report_file);
- report_file = copy_of(optarg);
- report_fp = fopen(report_file, "a");
- if (report_fp != NULL) {
- if (verbose)
- fprintf(report_fp, "Opening \"%s\"...\n", report_file);
- } else
- fatal(2, "cannot open \"%s\" for appending", report_file);
- break;
-
- case 's':
- ++to_stderr;
- break;
-
- case 'S':
- to_log = 0;
- break;
-
- case 't':
- timeout = atoi(optarg);
- break;
-
- case 'T':
- if (phone_num != NULL)
- free(phone_num);
- phone_num = copy_of(optarg);
- break;
-
- case 'U':
- if (phone_num2 != NULL)
- free(phone_num2);
- phone_num2 = copy_of(optarg);
- break;
-
- case 'v':
- ++verbose;
- break;
-
- case 'V':
- ++Verbose;
- break;
-
- default:
- usage();
- break;
- }
- }
-
- argc -= optind;
- argv += optind;
-
-/*
- * Default the report file to the stderr location
- */
- if (report_fp == NULL)
- report_fp = stderr;
-
- if (to_log) {
- openlog("chat", LOG_PID | LOG_NDELAY, LOG_LOCAL2);
-
- if (verbose)
- setlogmask(LOG_UPTO(LOG_INFO));
- else
- setlogmask(LOG_UPTO(LOG_WARNING));
- }
-
- if (chat_file != NULL) {
- if (*argv != NULL)
- usage();
- else {
- init();
- do_file(chat_file);
- }
- } else {
- init();
- while (*argv != NULL && argc > 0) {
- chat_expect(*argv);
- argv++;
- argc--;
-
- if (*argv != NULL && argc > 0) {
- chat_send(*argv);
- argv++;
- argc--;
- }
- }
- }
-
- terminate(0);
- return 0;
-}
-
-/*
- * Process a chat script when read from a file.
- */
-
-void
-do_file(char *chatfile)
-{
- int linect, sendflg;
- char *sp, *arg, quote;
- char buf [STR_LEN];
- FILE *cfp;
-
- cfp = fopen (chatfile, "r");
- if (cfp == NULL)
- fatal(1, "%s -- open failed: %m", chatfile);
-
- linect = 0;
- sendflg = 0;
-
- while (fgets(buf, STR_LEN, cfp) != NULL) {
- sp = strchr (buf, '\n');
- if (sp)
- *sp = '\0';
-
- linect++;
- sp = buf;
-
- /* lines starting with '#' are comments. If a real '#'
- is to be expected, it should be quoted .... */
- if ( *sp == '#' )
- continue;
-
- while (*sp != '\0') {
- if (*sp == ' ' || *sp == '\t') {
- ++sp;
- continue;
- }
-
- if (*sp == '"' || *sp == '\'') {
- quote = *sp++;
- arg = sp;
- while (*sp != quote) {
- if (*sp == '\0')
- fatal(1, "unterminated quote (line %d)", linect);
-
- if (*sp++ == '\\') {
- if (*sp != '\0')
- ++sp;
- }
- }
- }
- else {
- arg = sp;
- while (*sp != '\0' && *sp != ' ' && *sp != '\t')
- ++sp;
- }
-
- if (*sp != '\0')
- *sp++ = '\0';
-
- if (sendflg)
- chat_send (arg);
- else
- chat_expect (arg);
- sendflg = !sendflg;
- }
- }
- fclose (cfp);
-}
-
-/*
- * We got an error parsing the command line.
- */
-static void
-usage(void)
-{
- fprintf(stderr,
- "Usage: chat [-esSvV] [-f chat-file] [-r report-file] [-t timeout]\n"
- " [-T phone-number] [-U phone-number2] [chat-script]\n"
- "where chat-script has the form:\n"
- " [...[[expect[-send[-expect...]] send expect[-send[-expect]] ...]]]\n");
- exit(1);
-}
-
-char line[1024];
-
-/*
- * Send a message to syslog and/or stderr.
- */
-void
-chat_logf(const char *fmt, ...)
-{
- va_list args;
-
- va_start(args, fmt);
- vfmtmsg(line, sizeof(line), fmt, args);
- if (to_log)
- syslog(LOG_INFO, "%s", line);
- if (to_stderr)
- fprintf(stderr, "%s\n", line);
-}
-
-/*
- * Print an error message and terminate.
- */
-
-void
-fatal(int code, const char *fmt, ...)
-{
- va_list args;
-
- va_start(args, fmt);
- vfmtmsg(line, sizeof(line), fmt, args);
- if (to_log)
- syslog(LOG_ERR, "%s", line);
- if (to_stderr)
- fprintf(stderr, "%s\n", line);
- terminate(code);
-}
-
-int alarmed = 0;
-
-SIGTYPE sigalrm(int signo __unused)
-{
- int flags;
-
- alarm(1);
- alarmed = 1; /* Reset alarm to avoid race window */
- signal(SIGALRM, sigalrm); /* that can cause hanging in read() */
-
- if ((flags = fcntl(0, F_GETFL, 0)) == -1)
- fatal(2, "Can't get file mode flags on stdin: %m");
-
- if (fcntl(0, F_SETFL, flags | O_NONBLOCK) == -1)
- fatal(2, "Can't set file mode flags on stdin: %m");
-
- if (verbose)
- chat_logf("alarm");
-}
-
-SIGTYPE sigint(int signo __unused)
-{
- fatal(2, "SIGINT");
-}
-
-SIGTYPE sigterm(int signo __unused)
-{
- fatal(2, "SIGTERM");
-}
-
-SIGTYPE sighup(int signo __unused)
-{
- fatal(2, "SIGHUP");
-}
-
-void init(void)
-{
- signal(SIGINT, sigint);
- signal(SIGTERM, sigterm);
- signal(SIGHUP, sighup);
-
- set_tty_parameters();
- signal(SIGALRM, sigalrm);
- alarm(0);
- alarmed = 0;
-}
-
-void set_tty_parameters(void)
-{
-#if defined(get_term_param)
- term_parms t;
-
- if (get_term_param (&t) < 0)
- fatal(2, "Can't get terminal parameters: %m");
-
- saved_tty_parameters = t;
- have_tty_parameters = 1;
-
- t.c_iflag |= IGNBRK | ISTRIP | IGNPAR;
- t.c_oflag = 0;
- t.c_lflag = 0;
- t.c_cc[VERASE] =
- t.c_cc[VKILL] = 0;
- t.c_cc[VMIN] = 1;
- t.c_cc[VTIME] = 0;
-
- if (set_term_param (&t) < 0)
- fatal(2, "Can't set terminal parameters: %m");
-#endif
-}
-
-void break_sequence(void)
-{
- tcsendbreak (0, 0);
-}
-
-void terminate(int status)
-{
- echo_stderr(-1);
- if (report_file != (char *) 0 && report_fp != (FILE *) NULL) {
-/*
- * Allow the last of the report string to be gathered before we terminate.
- */
- if (report_gathering) {
- int c;
- size_t rep_len;
-
- rep_len = strlen(report_buffer);
- while (rep_len + 1 <= sizeof(report_buffer)) {
- alarm(1);
- c = get_char();
- alarm(0);
- if (c < 0 || iscntrl(c))
- break;
- report_buffer[rep_len] = c;
- ++rep_len;
- }
- report_buffer[rep_len] = 0;
- fprintf (report_fp, "chat: %s\n", report_buffer);
- }
- if (verbose)
- fprintf (report_fp, "Closing \"%s\".\n", report_file);
- fclose (report_fp);
- report_fp = (FILE *) NULL;
- }
-
-#if defined(get_term_param)
- if (have_tty_parameters) {
- if (set_term_param (&saved_tty_parameters) < 0)
- fatal(2, "Can't restore terminal parameters: %m");
- }
-#endif
-
- exit(status);
-}
-
-/*
- * 'Clean up' this string.
- */
-char *
-clean(char *s, int sending)
-{
- char temp[STR_LEN], cur_chr;
- char *s1, *phchar;
- int add_return = sending;
-#define isoctal(chr) (((chr) >= '0') && ((chr) <= '7'))
-
- s1 = temp;
- /* Don't overflow buffer, leave room for chars we append later */
- while (*s && s1 - temp < (off_t)(sizeof(temp) - 2 - add_return)) {
- cur_chr = *s++;
- if (cur_chr == '^') {
- cur_chr = *s++;
- if (cur_chr == '\0') {
- *s1++ = '^';
- break;
- }
- cur_chr &= 0x1F;
- if (cur_chr != 0) {
- *s1++ = cur_chr;
- }
- continue;
- }
-
- if (cur_chr != '\\') {
- *s1++ = cur_chr;
- continue;
- }
-
- cur_chr = *s++;
- if (cur_chr == '\0') {
- if (sending) {
- *s1++ = '\\';
- *s1++ = '\\';
- }
- break;
- }
-
- switch (cur_chr) {
- case 'b':
- *s1++ = '\b';
- break;
-
- case 'c':
- if (sending && *s == '\0')
- add_return = 0;
- else
- *s1++ = cur_chr;
- break;
-
- case '\\':
- case 'K':
- case 'p':
- case 'd':
- if (sending)
- *s1++ = '\\';
-
- *s1++ = cur_chr;
- break;
-
- case 'T':
- if (sending && phone_num) {
- for ( phchar = phone_num; *phchar != '\0'; phchar++)
- *s1++ = *phchar;
- }
- else {
- *s1++ = '\\';
- *s1++ = 'T';
- }
- break;
-
- case 'U':
- if (sending && phone_num2) {
- for ( phchar = phone_num2; *phchar != '\0'; phchar++)
- *s1++ = *phchar;
- }
- else {
- *s1++ = '\\';
- *s1++ = 'U';
- }
- break;
-
- case 'q':
- quiet = 1;
- break;
-
- case 'r':
- *s1++ = '\r';
- break;
-
- case 'n':
- *s1++ = '\n';
- break;
-
- case 's':
- *s1++ = ' ';
- break;
-
- case 't':
- *s1++ = '\t';
- break;
-
- case 'N':
- if (sending) {
- *s1++ = '\\';
- *s1++ = '\0';
- }
- else
- *s1++ = 'N';
- break;
-
- default:
- if (isoctal (cur_chr)) {
- cur_chr &= 0x07;
- if (isoctal (*s)) {
- cur_chr <<= 3;
- cur_chr |= *s++ - '0';
- if (isoctal (*s)) {
- cur_chr <<= 3;
- cur_chr |= *s++ - '0';
- }
- }
-
- if (cur_chr != 0 || sending) {
- if (sending && (cur_chr == '\\' || cur_chr == 0))
- *s1++ = '\\';
- *s1++ = cur_chr;
- }
- break;
- }
-
- if (sending)
- *s1++ = '\\';
- *s1++ = cur_chr;
- break;
- }
- }
-
- if (add_return)
- *s1++ = '\r';
-
- *s1++ = '\0'; /* guarantee closure */
- *s1++ = '\0'; /* terminate the string */
- return dup_mem (temp, (size_t) (s1 - temp)); /* may have embedded nuls */
-}
-
-/*
- * A modified version of 'strtok'. This version skips \ sequences.
- */
-
-char *
-expect_strtok (char *s, const char *term)
-{
- static char *str = blank;
- int escape_flag = 0;
- char *result;
-
-/*
- * If a string was specified then do initial processing.
- */
- if (s)
- str = s;
-
-/*
- * If this is the escape flag then reset it and ignore the character.
- */
- if (*str)
- result = str;
- else
- result = (char *) 0;
-
- while (*str) {
- if (escape_flag) {
- escape_flag = 0;
- ++str;
- continue;
- }
-
- if (*str == '\\') {
- ++str;
- escape_flag = 1;
- continue;
- }
-
-/*
- * If this is not in the termination string, continue.
- */
- if (strchr (term, *str) == (char *) 0) {
- ++str;
- continue;
- }
-
-/*
- * This is the terminator. Mark the end of the string and stop.
- */
- *str++ = '\0';
- break;
- }
- return (result);
-}
-
-/*
- * Process the expect string
- */
-
-void
-chat_expect(char *s)
-{
- char *expect;
- char *reply;
-
- if (strcmp(s, "HANGUP") == 0) {
- ++hup_next;
- return;
- }
-
- if (strcmp(s, "ABORT") == 0) {
- ++abort_next;
- return;
- }
-
- if (strcmp(s, "CLR_ABORT") == 0) {
- ++clear_abort_next;
- return;
- }
-
- if (strcmp(s, "REPORT") == 0) {
- ++report_next;
- return;
- }
-
- if (strcmp(s, "CLR_REPORT") == 0) {
- ++clear_report_next;
- return;
- }
-
- if (strcmp(s, "TIMEOUT") == 0) {
- ++timeout_next;
- return;
- }
-
- if (strcmp(s, "ECHO") == 0) {
- ++echo_next;
- return;
- }
-
- if (strcmp(s, "SAY") == 0) {
- ++say_next;
- return;
- }
-
-/*
- * Fetch the expect and reply string.
- */
- for (;;) {
- expect = expect_strtok (s, "-");
- s = (char *) 0;
-
- if (expect == (char *) 0)
- return;
-
- reply = expect_strtok (s, "-");
-
-/*
- * Handle the expect string. If successful then exit.
- */
- if (get_string (expect))
- return;
-
-/*
- * If there is a sub-reply string then send it. Otherwise any condition
- * is terminal.
- */
- if (reply == (char *) 0 || exit_code != 3)
- break;
-
- chat_send (reply);
- }
-
-/*
- * The expectation did not occur. This is terminal.
- */
- if (fail_reason)
- chat_logf("Failed (%s)", fail_reason);
- else
- chat_logf("Failed");
- terminate(exit_code);
-}
-
-/*
- * Translate the input character to the appropriate string for printing
- * the data.
- */
-
-char *
-character(int c)
-{
- static char string[10];
- const char *meta;
-
- meta = (c & 0x80) ? "M-" : "";
- c &= 0x7F;
-
- if (c < 32)
- sprintf(string, "%s^%c", meta, (int)c + '@');
- else if (c == 127)
- sprintf(string, "%s^?", meta);
- else
- sprintf(string, "%s%c", meta, c);
-
- return (string);
-}
-
-/*
- * process the reply string
- */
-void
-chat_send(char *s)
-{
- if (say_next) {
- say_next = 0;
- s = clean(s,0);
- write(STDERR_FILENO, s, strlen(s));
- free(s);
- return;
- }
-
- if (hup_next) {
- hup_next = 0;
- if (strcmp(s, "OFF") == 0)
- signal(SIGHUP, SIG_IGN);
- else
- signal(SIGHUP, sighup);
- return;
- }
-
- if (echo_next) {
- echo_next = 0;
- echo = (strcmp(s, "ON") == 0);
- return;
- }
-
- if (abort_next) {
- char *s1;
-
- abort_next = 0;
-
- if (n_aborts >= MAX_ABORTS)
- fatal(2, "Too many ABORT strings");
-
- s1 = clean(s, 0);
-
- if (strlen(s1) > strlen(s)
- || strlen(s1) + 1 > sizeof(fail_buffer))
- fatal(1, "Illegal or too-long ABORT string ('%v')", s);
-
- abort_string[n_aborts++] = s1;
-
- if (verbose)
- chat_logf("abort on (%v)", s);
- return;
- }
-
- if (clear_abort_next) {
- char *s1;
- int i;
- int old_max;
- int pack = 0;
-
- clear_abort_next = 0;
-
- s1 = clean(s, 0);
-
- if (strlen(s1) > strlen(s)
- || strlen(s1) + 1 > sizeof(fail_buffer))
- fatal(1, "Illegal or too-long CLR_ABORT string ('%v')", s);
-
- old_max = n_aborts;
- for (i=0; i < n_aborts; i++) {
- if ( strcmp(s1,abort_string[i]) == 0 ) {
- free(abort_string[i]);
- abort_string[i] = NULL;
- pack++;
- n_aborts--;
- if (verbose)
- chat_logf("clear abort on (%v)", s);
- }
- }
- free(s1);
- if (pack)
- pack_array(abort_string,old_max);
- return;
- }
-
- if (report_next) {
- char *s1;
-
- report_next = 0;
- if (n_reports >= MAX_REPORTS)
- fatal(2, "Too many REPORT strings");
-
- s1 = clean(s, 0);
-
- if (strlen(s1) > strlen(s) || strlen(s1) > sizeof fail_buffer - 1)
- fatal(1, "Illegal or too-long REPORT string ('%v')", s);
-
- report_string[n_reports++] = s1;
-
- if (verbose)
- chat_logf("report (%v)", s);
- return;
- }
-
- if (clear_report_next) {
- char *s1;
- int i;
- int old_max;
- int pack = 0;
-
- clear_report_next = 0;
-
- s1 = clean(s, 0);
-
- if (strlen(s1) > strlen(s) || strlen(s1) > sizeof fail_buffer - 1)
- fatal(1, "Illegal or too-long REPORT string ('%v')", s);
-
- old_max = n_reports;
- for (i=0; i < n_reports; i++) {
- if ( strcmp(s1,report_string[i]) == 0 ) {
- free(report_string[i]);
- report_string[i] = NULL;
- pack++;
- n_reports--;
- if (verbose)
- chat_logf("clear report (%v)", s);
- }
- }
- free(s1);
- if (pack)
- pack_array(report_string,old_max);
-
- return;
- }
-
- if (timeout_next) {
- timeout_next = 0;
- timeout = atoi(s);
-
- if (timeout <= 0)
- timeout = DEFAULT_CHAT_TIMEOUT;
-
- if (verbose)
- chat_logf("timeout set to %d seconds", timeout);
-
- return;
- }
-
- if (strcmp(s, "EOT") == 0)
- s = strdup("^D\\c");
- else if (strcmp(s, "BREAK") == 0)
- s = strdup("\\K\\c");
-
- if (!put_string(s))
- fatal(1, "Failed");
-}
-
-int
-get_char(void)
-{
- int status;
- char c;
-
- status = read(STDIN_FILENO, &c, 1);
-
- switch (status) {
- case 1:
- return ((int)c & 0x7F);
-
- default:
- chat_logf("warning: read() on stdin returned %d", status);
-
- case -1:
- if ((status = fcntl(0, F_GETFL, 0)) == -1)
- fatal(2, "Can't get file mode flags on stdin: %m");
-
- if (fcntl(0, F_SETFL, status & ~O_NONBLOCK) == -1)
- fatal(2, "Can't set file mode flags on stdin: %m");
-
- return (-1);
- }
-}
-
-int put_char(int c)
-{
- int status;
- char ch = c;
-
- usleep(10000); /* inter-character typing delay (?) */
-
- status = write(STDOUT_FILENO, &ch, 1);
-
- switch (status) {
- case 1:
- return (0);
-
- default:
- chat_logf("warning: write() on stdout returned %d", status);
-
- case -1:
- if ((status = fcntl(0, F_GETFL, 0)) == -1)
- fatal(2, "Can't get file mode flags on stdin, %m");
-
- if (fcntl(0, F_SETFL, status & ~O_NONBLOCK) == -1)
- fatal(2, "Can't set file mode flags on stdin: %m");
-
- return (-1);
- }
-}
-
-int
-write_char(int c)
-{
- if (alarmed || put_char(c) < 0) {
- alarm(0);
- alarmed = 0;
-
- if (verbose) {
- if (errno == EINTR || errno == EWOULDBLOCK)
- chat_logf(" -- write timed out");
- else
- chat_logf(" -- write failed: %m");
- }
- return (0);
- }
- return (1);
-}
-
-int
-put_string(char *s)
-{
- quiet = 0;
- s = clean(s, 1);
-
- if (verbose)
- chat_logf("send (%v)", quiet ? "??????" : s);
-
- alarm(timeout); alarmed = 0;
-
- while (*s) {
- char c = *s++;
-
- if (c != '\\') {
- if (!write_char (c))
- return 0;
- continue;
- }
-
- c = *s++;
- switch (c) {
- case 'd':
- sleep(1);
- break;
-
- case 'K':
- break_sequence();
- break;
-
- case 'p':
- usleep(10000); /* 1/100th of a second (arg is microseconds) */
- break;
-
- default:
- if (!write_char (c))
- return 0;
- break;
- }
- }
-
- alarm(0);
- alarmed = 0;
- return (1);
-}
-
-/*
- * Echo a character to stderr.
- * When called with -1, a '\n' character is generated when
- * the cursor is not at the beginning of a line.
- */
-void
-echo_stderr(int n)
-{
- static int need_lf;
- char *s;
-
- switch (n) {
- case '\r': /* ignore '\r' */
- break;
- case -1:
- if (need_lf == 0)
- break;
- /* FALLTHROUGH */
- case '\n':
- write(STDERR_FILENO, "\n", 1);
- need_lf = 0;
- break;
- default:
- s = character(n);
- write(STDERR_FILENO, s, strlen(s));
- need_lf = 1;
- break;
- }
-}
-
-/*
- * 'Wait for' this string to appear on this file descriptor.
- */
-int
-get_string(char *string)
-{
- char temp[STR_LEN];
- int c, printed = 0;
- size_t len, minlen;
- char *s = temp, *end = s + STR_LEN;
- char *logged = temp;
-
- fail_reason = (char *)0;
-
- if (strlen(string) > STR_LEN) {
- chat_logf("expect string is too long");
- exit_code = 1;
- return 0;
- }
-
- string = clean(string, 0);
- len = strlen(string);
- minlen = (len > sizeof(fail_buffer)? len: sizeof(fail_buffer)) - 1;
-
- if (verbose)
- chat_logf("expect (%v)", string);
-
- if (len == 0) {
- if (verbose)
- chat_logf("got it");
- return (1);
- }
-
- alarm(timeout);
- alarmed = 0;
-
- while ( ! alarmed && (c = get_char()) >= 0) {
- int n, abort_len, report_len;
-
- if (echo)
- echo_stderr(c);
- if (verbose && c == '\n') {
- if (s == logged)
- chat_logf(""); /* blank line */
- else
- chat_logf("%0.*v", s - logged, logged);
- logged = s + 1;
- }
-
- *s++ = c;
-
- if (verbose && s >= logged + 80) {
- chat_logf("%0.*v", s - logged, logged);
- logged = s;
- }
-
- if (Verbose) {
- if (c == '\n')
- fputc( '\n', stderr );
- else if (c != '\r')
- fprintf( stderr, "%s", character(c) );
- }
-
- if (!report_gathering) {
- for (n = 0; n < n_reports; ++n) {
- if ((report_string[n] != (char*) NULL) &&
- s - temp >= (report_len = strlen(report_string[n])) &&
- strncmp(s - report_len, report_string[n], report_len) == 0) {
- time_t time_now = time ((time_t*) NULL);
- struct tm* tm_now = localtime (&time_now);
-
- strftime (report_buffer, 20, "%b %d %H:%M:%S ", tm_now);
- strcat (report_buffer, report_string[n]);
-
- report_string[n] = (char *) NULL;
- report_gathering = 1;
- break;
- }
- }
- }
- else {
- if (!iscntrl (c)) {
- int rep_len = strlen (report_buffer);
- report_buffer[rep_len] = c;
- report_buffer[rep_len + 1] = '\0';
- }
- else {
- report_gathering = 0;
- fprintf (report_fp, "chat: %s\n", report_buffer);
- }
- }
-
- if ((size_t)(s - temp) >= len &&
- c == string[len - 1] &&
- strncmp(s - len, string, len) == 0) {
- if (verbose) {
- if (s > logged)
- chat_logf("%0.*v", s - logged, logged);
- chat_logf(" -- got it\n");
- }
-
- alarm(0);
- alarmed = 0;
- return (1);
- }
-
- for (n = 0; n < n_aborts; ++n) {
- if (s - temp >= (abort_len = strlen(abort_string[n])) &&
- strncmp(s - abort_len, abort_string[n], abort_len) == 0) {
- if (verbose) {
- if (s > logged)
- chat_logf("%0.*v", s - logged, logged);
- chat_logf(" -- failed");
- }
-
- alarm(0);
- alarmed = 0;
- exit_code = n + 4;
- strcpy(fail_reason = fail_buffer, abort_string[n]);
- return (0);
- }
- }
-
- if (s >= end) {
- if (logged < s - minlen) {
- chat_logf("%0.*v", s - logged, logged);
- logged = s;
- }
- s -= minlen;
- memmove(temp, s, minlen);
- logged = temp + (logged - s);
- s = temp + minlen;
- }
-
- if (alarmed && verbose)
- chat_logf("warning: alarm synchronization problem");
- }
-
- alarm(0);
-
- if (verbose && printed) {
- if (alarmed)
- chat_logf(" -- read timed out");
- else
- chat_logf(" -- read failed: %m");
- }
-
- exit_code = 3;
- alarmed = 0;
- return (0);
-}
-
-void
-pack_array(char **array, int end)
-{
- int i, j;
-
- for (i = 0; i < end; i++) {
- if (array[i] == NULL) {
- for (j = i+1; j < end; ++j)
- if (array[j] != NULL)
- array[i++] = array[j];
- for (; i < end; ++i)
- array[i] = NULL;
- break;
- }
- }
-}
-
-/*
- * vfmtmsg - format a message into a buffer. Like vsprintf except we
- * also specify the length of the output buffer, and we handle the
- * %m (error message) format.
- * Doesn't do floating-point formats.
- * Returns the number of chars put into buf.
- */
-#define OUTCHAR(c) (buflen > 0? (--buflen, *buf++ = (c)): 0)
-
-int
-vfmtmsg(char *buf, int buflen, const char *fmt, va_list args)
-{
- int c, i, n;
- int width, prec, fillch;
- int base, len, neg, quoted;
- unsigned long val = 0;
- char *str, *buf0;
- const char *f;
- unsigned char *p;
- char num[32];
- static char hexchars[] = "0123456789abcdef";
-
- buf0 = buf;
- --buflen;
- while (buflen > 0) {
- for (f = fmt; *f != '%' && *f != 0; ++f)
- ;
- if (f > fmt) {
- len = f - fmt;
- if (len > buflen)
- len = buflen;
- memcpy(buf, fmt, len);
- buf += len;
- buflen -= len;
- fmt = f;
- }
- if (*fmt == 0)
- break;
- c = *++fmt;
- width = prec = 0;
- fillch = ' ';
- if (c == '0') {
- fillch = '0';
- c = *++fmt;
- }
- if (c == '*') {
- width = va_arg(args, int);
- c = *++fmt;
- } else {
- while (isdigit(c)) {
- width = width * 10 + c - '0';
- c = *++fmt;
- }
- }
- if (c == '.') {
- c = *++fmt;
- if (c == '*') {
- prec = va_arg(args, int);
- c = *++fmt;
- } else {
- while (isdigit(c)) {
- prec = prec * 10 + c - '0';
- c = *++fmt;
- }
- }
- }
- str = 0;
- base = 0;
- neg = 0;
- ++fmt;
- switch (c) {
- case 'd':
- i = va_arg(args, int);
- if (i < 0) {
- neg = 1;
- val = -i;
- } else
- val = i;
- base = 10;
- break;
- case 'o':
- val = va_arg(args, unsigned int);
- base = 8;
- break;
- case 'x':
- val = va_arg(args, unsigned int);
- base = 16;
- break;
- case 'p':
- val = (unsigned long) va_arg(args, void *);
- base = 16;
- neg = 2;
- break;
- case 's':
- str = va_arg(args, char *);
- break;
- case 'c':
- num[0] = va_arg(args, int);
- num[1] = 0;
- str = num;
- break;
- case 'm':
- str = strerror(errno);
- break;
- case 'v': /* "visible" string */
- case 'q': /* quoted string */
- quoted = c == 'q';
- p = va_arg(args, unsigned char *);
- if (fillch == '0' && prec > 0) {
- n = prec;
- } else {
- n = strlen((char *)p);
- if (prec > 0 && prec < n)
- n = prec;
- }
- while (n > 0 && buflen > 0) {
- c = *p++;
- --n;
- if (!quoted && c >= 0x80) {
- OUTCHAR('M');
- OUTCHAR('-');
- c -= 0x80;
- }
- if (quoted && (c == '"' || c == '\\'))
- OUTCHAR('\\');
- if (c < 0x20 || (0x7f <= c && c < 0xa0)) {
- if (quoted) {
- OUTCHAR('\\');
- switch (c) {
- case '\t': OUTCHAR('t'); break;
- case '\n': OUTCHAR('n'); break;
- case '\b': OUTCHAR('b'); break;
- case '\f': OUTCHAR('f'); break;
- default:
- OUTCHAR('x');
- OUTCHAR(hexchars[c >> 4]);
- OUTCHAR(hexchars[c & 0xf]);
- }
- } else {
- if (c == '\t')
- OUTCHAR(c);
- else {
- OUTCHAR('^');
- OUTCHAR(c ^ 0x40);
- }
- }
- } else
- OUTCHAR(c);
- }
- continue;
- default:
- *buf++ = '%';
- if (c != '%')
- --fmt; /* so %z outputs %z etc. */
- --buflen;
- continue;
- }
- if (base != 0) {
- str = num + sizeof(num);
- *--str = 0;
- while (str > num + neg) {
- *--str = hexchars[val % base];
- val = val / base;
- if (--prec <= 0 && val == 0)
- break;
- }
- switch (neg) {
- case 1:
- *--str = '-';
- break;
- case 2:
- *--str = 'x';
- *--str = '0';
- break;
- }
- len = num + sizeof(num) - 1 - str;
- } else {
- len = strlen(str);
- if (prec > 0 && len > prec)
- len = prec;
- }
- if (width > 0) {
- if (width > buflen)
- width = buflen;
- if ((n = width - len) > 0) {
- buflen -= n;
- for (; n > 0; --n)
- *buf++ = fillch;
- }
- }
- if (len > buflen)
- len = buflen;
- memcpy(buf, str, len);
- buf += len;
- buflen -= len;
- }
- *buf = 0;
- return buf - buf0;
-}
diff --git a/usr.bin/checknr/Makefile b/usr.bin/checknr/Makefile
deleted file mode 100644
index 8a47b59..0000000
--- a/usr.bin/checknr/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= checknr
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/checknr/checknr.1 b/usr.bin/checknr/checknr.1
deleted file mode 100644
index 713c88c..0000000
--- a/usr.bin/checknr/checknr.1
+++ /dev/null
@@ -1,167 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)checknr.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd January 26, 2005
-.Dt CHECKNR 1
-.Os
-.Sh NAME
-.Nm checknr
-.Nd check nroff/troff files
-.Sh SYNOPSIS
-.Nm
-.Op Fl a Ns Ar \&.x1.y1.x2.y2. ... \&.xn.yn
-.Op Fl c Ns Ar \&.x1.x2.x3 ... \&.xn
-.Op Fl s
-.Op Fl f
-.Ar file
-.Sh DESCRIPTION
-The
-.Nm
-utility checks a list of
-.Xr nroff 1
-or
-.Xr troff 1
-input files for certain kinds of errors
-involving mismatched opening and closing delimiters
-and unknown commands.
-If no files are specified,
-.Nm
-checks the standard input.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl a
-Add additional pairs of macros to the list of known macros.
-This must be followed by groups of six characters, each group defining
-a pair of macros.
-The six characters are
-a period,
-the first macro name,
-another period,
-and the second macro name.
-For example, to define a pair .BS and .ES, use
-.Sq Li \-a.BS.ES
-.It Fl c
-Define commands which would otherwise be complained about
-as undefined.
-.It Fl f
-Request
-.Nm
-to ignore
-.Ql \ef
-font changes.
-.It Fl s
-Ignore
-.Ql \es
-size changes.
-.El
-.Pp
-Delimiters checked are:
-.Bl -enum
-.It
-Font changes using \efx ...\& \efP.
-.It
-Size changes using \esx ...\& \es0.
-.It
-Macros that come in open ...\& close forms, for example,
-the .TS and .TE macros which must always come in pairs.
-.El
-.Pp
-The
-.Nm
-utility is intended for use on documents that are prepared with
-.Nm
-in mind, much the same as
-.Xr lint 1 .
-It expects a certain document writing style for
-.Ql \ef
-and
-.Ql \es
-commands,
-in that each
-.Ql \efx
-must be terminated with
-.Ql \efP
-and
-each
-.Ql \esx
-must be terminated with
-.Ql \es0 .
-While it will work to directly go into the next font or explicitly
-specify the original font or point size,
-and many existing documents actually do this,
-such a practice will produce complaints from
-.Nm .
-Since it is probably better to use the
-.Ql \efP
-and
-.Ql \es0
-forms anyway,
-you should think of this as a contribution to your document
-preparation style.
-.Pp
-The
-.Nm
-utility knows about the
-.Xr ms 7
-and
-.Xr me 7
-macro packages.
-.Sh DIAGNOSTICS
-.Bd -ragged -compact
-Complaints about unmatched delimiters.
-Complaints about unrecognized commands.
-Various complaints about the syntax of commands.
-.Ed
-.Sh SEE ALSO
-.Xr nroff 1 ,
-.Xr troff 1 ,
-.Xr me 7 ,
-.Xr ms 7
-.\" .Xr checkeq 1 ,
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.0 .
-.Sh BUGS
-There is no way to define a 1 character macro name using
-.Fl a .
-.Pp
-Does not correctly recognize certain reasonable constructs,
-such as conditionals.
-.Pp
-Input lines are limited to
-.Dv LINE_MAX
-(2048) bytes in length.
diff --git a/usr.bin/checknr/checknr.c b/usr.bin/checknr/checknr.c
deleted file mode 100644
index dd4c726..0000000
--- a/usr.bin/checknr/checknr.c
+++ /dev/null
@@ -1,607 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)checknr.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * checknr: check an nroff/troff input file for matching macro calls.
- * we also attempt to match size and font changes, but only the embedded
- * kind. These must end in \s0 and \fP resp. Maybe more sophistication
- * later but for now think of these restrictions as contributions to
- * structured typesetting.
- */
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-#define MAXSTK 100 /* Stack size */
-#define MAXBR 100 /* Max number of bracket pairs known */
-#define MAXCMDS 500 /* Max number of commands known */
-
-void addcmd(char *);
-void addmac(const char *);
-int binsrch(const char *);
-void checkknown(const char *);
-void chkcmd(const char *, const char *);
-void complain(int);
-int eq(const char *, const char *);
-void nomatch(const char *);
-void pe(int);
-void process(FILE *);
-void prop(int);
-static void usage(void);
-
-/*
- * The stack on which we remember what we've seen so far.
- */
-struct stkstr {
- int opno; /* number of opening bracket */
- int pl; /* '+', '-', ' ' for \s, 1 for \f, 0 for .ft */
- int parm; /* parm to size, font, etc */
- int lno; /* line number the thing came in */
-} stk[MAXSTK];
-int stktop;
-
-/*
- * The kinds of opening and closing brackets.
- */
-struct brstr {
- const char *opbr;
- const char *clbr;
-} br[MAXBR] = {
- /* A few bare bones troff commands */
-#define SZ 0
- {"sz", "sz"}, /* also \s */
-#define FT 1
- {"ft", "ft"}, /* also \f */
- /* the -mm package */
- {"AL", "LE"},
- {"AS", "AE"},
- {"BL", "LE"},
- {"BS", "BE"},
- {"DF", "DE"},
- {"DL", "LE"},
- {"DS", "DE"},
- {"FS", "FE"},
- {"ML", "LE"},
- {"NS", "NE"},
- {"RL", "LE"},
- {"VL", "LE"},
- /* the -ms package */
- {"AB", "AE"},
- {"BD", "DE"},
- {"CD", "DE"},
- {"DS", "DE"},
- {"FS", "FE"},
- {"ID", "DE"},
- {"KF", "KE"},
- {"KS", "KE"},
- {"LD", "DE"},
- {"LG", "NL"},
- {"QS", "QE"},
- {"RS", "RE"},
- {"SM", "NL"},
- {"XA", "XE"},
- {"XS", "XE"},
- /* The -me package */
- {"(b", ")b"},
- {"(c", ")c"},
- {"(d", ")d"},
- {"(f", ")f"},
- {"(l", ")l"},
- {"(q", ")q"},
- {"(x", ")x"},
- {"(z", ")z"},
- /* Things needed by preprocessors */
- {"EQ", "EN"},
- {"TS", "TE"},
- /* Refer */
- {"[", "]"},
- {0, 0}
-};
-
-/*
- * All commands known to nroff, plus macro packages.
- * Used so we can complain about unrecognized commands.
- */
-const char *knowncmds[MAXCMDS] = {
-"$c", "$f", "$h", "$p", "$s", "(b", "(c", "(d", "(f", "(l", "(q", "(t",
-"(x", "(z", ")b", ")c", ")d", ")f", ")l", ")q", ")t", ")x", ")z", "++",
-"+c", "1C", "1c", "2C", "2c", "@(", "@)", "@C", "@D", "@F", "@I", "@M",
-"@c", "@e", "@f", "@h", "@m", "@n", "@o", "@p", "@r", "@t", "@z", "AB",
-"AE", "AF", "AI", "AL", "AM", "AS", "AT", "AU", "AX", "B", "B1", "B2",
-"BD", "BE", "BG", "BL", "BS", "BT", "BX", "C1", "C2", "CD", "CM", "CT",
-"D", "DA", "DE", "DF", "DL", "DS", "DT", "EC", "EF", "EG", "EH", "EM",
-"EN", "EQ", "EX", "FA", "FD", "FE", "FG", "FJ", "FK", "FL", "FN", "FO",
-"FQ", "FS", "FV", "FX", "H", "HC", "HD", "HM", "HO", "HU", "I", "ID",
-"IE", "IH", "IM", "IP", "IX", "IZ", "KD", "KE", "KF", "KQ", "KS", "LB",
-"LC", "LD", "LE", "LG", "LI", "LP", "MC", "ME", "MF", "MH", "ML", "MR",
-"MT", "ND", "NE", "NH", "NL", "NP", "NS", "OF", "OH", "OK", "OP", "P",
-"P1", "PF", "PH", "PP", "PT", "PX", "PY", "QE", "QP", "QS", "R", "RA",
-"RC", "RE", "RL", "RP", "RQ", "RS", "RT", "S", "S0", "S2", "S3", "SA",
-"SG", "SH", "SK", "SM", "SP", "SY", "T&", "TA", "TB", "TC", "TD", "TE",
-"TH", "TL", "TM", "TP", "TQ", "TR", "TS", "TX", "UL", "US", "UX", "VL",
-"WC", "WH", "XA", "XD", "XE", "XF", "XK", "XP", "XS", "[", "[-", "[0",
-"[1", "[2", "[3", "[4", "[5", "[<", "[>", "[]", "]", "]-", "]<", "]>",
-"][", "ab", "ac", "ad", "af", "am", "ar", "as", "b", "ba", "bc", "bd",
-"bi", "bl", "bp", "br", "bx", "c.", "c2", "cc", "ce", "cf", "ch", "cs",
-"ct", "cu", "da", "de", "di", "dl", "dn", "ds", "dt", "dw", "dy", "ec",
-"ef", "eh", "el", "em", "eo", "ep", "ev", "ex", "fc", "fi", "fl", "fo",
-"fp", "ft", "fz", "hc", "he", "hl", "hp", "ht", "hw", "hx", "hy", "i",
-"ie", "if", "ig", "in", "ip", "it", "ix", "lc", "lg", "li", "ll", "ln",
-"lo", "lp", "ls", "lt", "m1", "m2", "m3", "m4", "mc", "mk", "mo", "n1",
-"n2", "na", "ne", "nf", "nh", "nl", "nm", "nn", "np", "nr", "ns", "nx",
-"of", "oh", "os", "pa", "pc", "pi", "pl", "pm", "pn", "po", "pp", "ps",
-"q", "r", "rb", "rd", "re", "rm", "rn", "ro", "rr", "rs", "rt", "sb",
-"sc", "sh", "sk", "so", "sp", "ss", "st", "sv", "sz", "ta", "tc", "th",
-"ti", "tl", "tm", "tp", "tr", "u", "uf", "uh", "ul", "vs", "wh", "xp",
-"yr", 0
-};
-
-int lineno; /* current line number in input file */
-const char *cfilename; /* name of current file */
-int nfiles; /* number of files to process */
-int fflag; /* -f: ignore \f */
-int sflag; /* -s: ignore \s */
-int ncmds; /* size of knowncmds */
-int slot; /* slot in knowncmds found by binsrch */
-
-int
-main(int argc, char **argv)
-{
- FILE *f;
- int i;
- char *cp;
- char b1[4];
-
- /* Figure out how many known commands there are */
- while (knowncmds[ncmds])
- ncmds++;
- while (argc > 1 && argv[1][0] == '-') {
- switch(argv[1][1]) {
-
- /* -a: add pairs of macros */
- case 'a':
- i = strlen(argv[1]) - 2;
- if (i % 6 != 0)
- usage();
- /* look for empty macro slots */
- for (i=0; br[i].opbr; i++)
- ;
- for (cp=argv[1]+3; cp[-1]; cp += 6) {
- br[i].opbr = strncpy(malloc(3), cp, 2);
- br[i].clbr = strncpy(malloc(3), cp+3, 2);
- addmac(br[i].opbr); /* knows pairs are also known cmds */
- addmac(br[i].clbr);
- i++;
- }
- break;
-
- /* -c: add known commands */
- case 'c':
- i = strlen(argv[1]) - 2;
- if (i % 3 != 0)
- usage();
- for (cp=argv[1]+3; cp[-1]; cp += 3) {
- if (cp[2] && cp[2] != '.')
- usage();
- strncpy(b1, cp, 2);
- b1[2] = '\0';
- addmac(b1);
- }
- break;
-
- /* -f: ignore font changes */
- case 'f':
- fflag = 1;
- break;
-
- /* -s: ignore size changes */
- case 's':
- sflag = 1;
- break;
- default:
- usage();
- }
- argc--; argv++;
- }
-
- nfiles = argc - 1;
-
- if (nfiles > 0) {
- for (i=1; i<argc; i++) {
- cfilename = argv[i];
- f = fopen(cfilename, "r");
- if (f == NULL)
- warn("%s", cfilename);
- else {
- process(f);
- fclose(f);
- }
- }
- } else {
- cfilename = "stdin";
- process(stdin);
- }
- exit(0);
-}
-
-static void
-usage(void)
-{
- fprintf(stderr,
- "usage: checknr [-a.xx.yy.xx.yy...] [-c.xx.xx.xx...] [-s] [-f] file\n");
- exit(1);
-}
-
-void
-process(FILE *f)
-{
- int i, n;
- char mac[5]; /* The current macro or nroff command */
- int pl;
- static char line[256]; /* the current line */
-
- stktop = -1;
- for (lineno = 1; fgets(line, sizeof line, f); lineno++) {
- if (line[0] == '.') {
- /*
- * find and isolate the macro/command name.
- */
- strncpy(mac, line+1, 4);
- if (isspace(mac[0])) {
- pe(lineno);
- printf("Empty command\n");
- } else if (isspace(mac[1])) {
- mac[1] = 0;
- } else if (isspace(mac[2])) {
- mac[2] = 0;
- } else if (mac[0] != '\\' || mac[1] != '\"') {
- pe(lineno);
- printf("Command too long\n");
- }
-
- /*
- * Is it a known command?
- */
- checkknown(mac);
-
- /*
- * Should we add it?
- */
- if (eq(mac, "de"))
- addcmd(line);
-
- chkcmd(line, mac);
- }
-
- /*
- * At this point we process the line looking
- * for \s and \f.
- */
- for (i=0; line[i]; i++)
- if (line[i]=='\\' && (i==0 || line[i-1]!='\\')) {
- if (!sflag && line[++i]=='s') {
- pl = line[++i];
- if (isdigit(pl)) {
- n = pl - '0';
- pl = ' ';
- } else
- n = 0;
- while (isdigit(line[++i]))
- n = 10 * n + line[i] - '0';
- i--;
- if (n == 0) {
- if (stk[stktop].opno == SZ) {
- stktop--;
- } else {
- pe(lineno);
- printf("unmatched \\s0\n");
- }
- } else {
- stk[++stktop].opno = SZ;
- stk[stktop].pl = pl;
- stk[stktop].parm = n;
- stk[stktop].lno = lineno;
- }
- } else if (!fflag && line[i]=='f') {
- n = line[++i];
- if (n == 'P') {
- if (stk[stktop].opno == FT) {
- stktop--;
- } else {
- pe(lineno);
- printf("unmatched \\fP\n");
- }
- } else {
- stk[++stktop].opno = FT;
- stk[stktop].pl = 1;
- stk[stktop].parm = n;
- stk[stktop].lno = lineno;
- }
- }
- }
- }
- /*
- * We've hit the end and look at all this stuff that hasn't been
- * matched yet! Complain, complain.
- */
- for (i=stktop; i>=0; i--) {
- complain(i);
- }
-}
-
-void
-complain(int i)
-{
- pe(stk[i].lno);
- printf("Unmatched ");
- prop(i);
- printf("\n");
-}
-
-void
-prop(int i)
-{
- if (stk[i].pl == 0)
- printf(".%s", br[stk[i].opno].opbr);
- else switch(stk[i].opno) {
- case SZ:
- printf("\\s%c%d", stk[i].pl, stk[i].parm);
- break;
- case FT:
- printf("\\f%c", stk[i].parm);
- break;
- default:
- printf("Bug: stk[%d].opno = %d = .%s, .%s",
- i, stk[i].opno, br[stk[i].opno].opbr, br[stk[i].opno].clbr);
- }
-}
-
-void
-chkcmd(const char *line __unused, const char *mac)
-{
- int i;
-
- /*
- * Check to see if it matches top of stack.
- */
- if (stktop >= 0 && eq(mac, br[stk[stktop].opno].clbr))
- stktop--; /* OK. Pop & forget */
- else {
- /* No. Maybe it's an opener */
- for (i=0; br[i].opbr; i++) {
- if (eq(mac, br[i].opbr)) {
- /* Found. Push it. */
- stktop++;
- stk[stktop].opno = i;
- stk[stktop].pl = 0;
- stk[stktop].parm = 0;
- stk[stktop].lno = lineno;
- break;
- }
- /*
- * Maybe it's an unmatched closer.
- * NOTE: this depends on the fact
- * that none of the closers can be
- * openers too.
- */
- if (eq(mac, br[i].clbr)) {
- nomatch(mac);
- break;
- }
- }
- }
-}
-
-void
-nomatch(const char *mac)
-{
- int i, j;
-
- /*
- * Look for a match further down on stack
- * If we find one, it suggests that the stuff in
- * between is supposed to match itself.
- */
- for (j=stktop; j>=0; j--)
- if (eq(mac,br[stk[j].opno].clbr)) {
- /* Found. Make a good diagnostic. */
- if (j == stktop-2) {
- /*
- * Check for special case \fx..\fR and don't
- * complain.
- */
- if (stk[j+1].opno==FT && stk[j+1].parm!='R'
- && stk[j+2].opno==FT && stk[j+2].parm=='R') {
- stktop = j -1;
- return;
- }
- /*
- * We have two unmatched frobs. Chances are
- * they were intended to match, so we mention
- * them together.
- */
- pe(stk[j+1].lno);
- prop(j+1);
- printf(" does not match %d: ", stk[j+2].lno);
- prop(j+2);
- printf("\n");
- } else for (i=j+1; i <= stktop; i++) {
- complain(i);
- }
- stktop = j-1;
- return;
- }
- /* Didn't find one. Throw this away. */
- pe(lineno);
- printf("Unmatched .%s\n", mac);
-}
-
-/* eq: are two strings equal? */
-int
-eq(const char *s1, const char *s2)
-{
- return (strcmp(s1, s2) == 0);
-}
-
-/* print the first part of an error message, given the line number */
-void
-pe(int linen)
-{
- if (nfiles > 1)
- printf("%s: ", cfilename);
- printf("%d: ", linen);
-}
-
-void
-checkknown(const char *mac)
-{
-
- if (eq(mac, "."))
- return;
- if (binsrch(mac) >= 0)
- return;
- if (mac[0] == '\\' && mac[1] == '"') /* comments */
- return;
-
- pe(lineno);
- printf("Unknown command: .%s\n", mac);
-}
-
-/*
- * We have a .de xx line in "line". Add xx to the list of known commands.
- */
-void
-addcmd(char *line)
-{
- char *mac;
-
- /* grab the macro being defined */
- mac = line+4;
- while (isspace(*mac))
- mac++;
- if (*mac == 0) {
- pe(lineno);
- printf("illegal define: %s\n", line);
- return;
- }
- mac[2] = 0;
- if (isspace(mac[1]) || mac[1] == '\\')
- mac[1] = 0;
- if (ncmds >= MAXCMDS) {
- printf("Only %d known commands allowed\n", MAXCMDS);
- exit(1);
- }
- addmac(mac);
-}
-
-/*
- * Add mac to the list. We should really have some kind of tree
- * structure here but this is a quick-and-dirty job and I just don't
- * have time to mess with it. (I wonder if this will come back to haunt
- * me someday?) Anyway, I claim that .de is fairly rare in user
- * nroff programs, and the register loop below is pretty fast.
- */
-void
-addmac(const char *mac)
-{
- const char **src, **dest, **loc;
-
- if (binsrch(mac) >= 0){ /* it's OK to redefine something */
-#ifdef DEBUG
- printf("binsrch(%s) -> already in table\n", mac);
-#endif
- return;
- }
- /* binsrch sets slot as a side effect */
-#ifdef DEBUG
-printf("binsrch(%s) -> %d\n", mac, slot);
-#endif
- loc = &knowncmds[slot];
- src = &knowncmds[ncmds-1];
- dest = src+1;
- while (dest > loc)
- *dest-- = *src--;
- *loc = strcpy(malloc(3), mac);
- ncmds++;
-#ifdef DEBUG
-printf("after: %s %s %s %s %s, %d cmds\n", knowncmds[slot-2], knowncmds[slot-1], knowncmds[slot], knowncmds[slot+1], knowncmds[slot+2], ncmds);
-#endif
-}
-
-/*
- * Do a binary search in knowncmds for mac.
- * If found, return the index. If not, return -1.
- */
-int
-binsrch(const char *mac)
-{
- const char *p; /* pointer to current cmd in list */
- int d; /* difference if any */
- int mid; /* mid point in binary search */
- int top, bot; /* boundaries of bin search, inclusive */
-
- top = ncmds-1;
- bot = 0;
- while (top >= bot) {
- mid = (top+bot)/2;
- p = knowncmds[mid];
- d = p[0] - mac[0];
- if (d == 0)
- d = p[1] - mac[1];
- if (d == 0)
- return mid;
- if (d < 0)
- bot = mid + 1;
- else
- top = mid - 1;
- }
- slot = bot; /* place it would have gone */
- return -1;
-}
diff --git a/usr.bin/chkey/Makefile b/usr.bin/chkey/Makefile
deleted file mode 100644
index 847e5c9..0000000
--- a/usr.bin/chkey/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
-# $FreeBSD$
-
-.include <bsd.own.mk>
-
-.PATH: ${.CURDIR}/../newkey
-
-PROG= chkey
-SRCS= chkey.c generic.c update.c
-CFLAGS+= -I${.CURDIR}/../newkey
-.if ${MK_NIS} != "no"
-CFLAGS+= -DYP
-.endif
-DPADD= ${LIBRPCSVC} ${LIBMP} ${LIBCRYPTO}
-LDADD= -lrpcsvc -lmp -lcrypto
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/chkey/chkey.1 b/usr.bin/chkey/chkey.1
deleted file mode 100644
index a4467c8..0000000
--- a/usr.bin/chkey/chkey.1
+++ /dev/null
@@ -1,25 +0,0 @@
-.\" @(#)chkey.1 1.5 91/03/11 TIRPC 1.0;
-.\" Copyright (c) 1988 Sun Microsystems, Inc. - All Rights Reserved.
-.\" $FreeBSD$
-.\"
-.Dd July 5, 1989
-.Dt CHKEY 1
-.Os
-.Sh NAME
-.Nm chkey
-.Nd change your encryption key
-.Sh SYNOPSIS
-.Nm
-.Sh DESCRIPTION
-The
-.Nm
-utility prompts the user for their login password,
-and uses it to encrypt a new encryption key
-for the user to be stored in the
-.Xr publickey 5
-database.
-.Sh "SEE ALSO"
-.Xr keylogin 1 ,
-.Xr publickey 5 ,
-.Xr keyserv 8 ,
-.Xr newkey 8
diff --git a/usr.bin/chkey/chkey.c b/usr.bin/chkey/chkey.c
deleted file mode 100644
index db0b743..0000000
--- a/usr.bin/chkey/chkey.c
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user or with the express written consent of
- * Sun Microsystems, Inc.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)chkey.c 1.7 91/03/11 Copyr 1986 Sun Micro";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Copyright (C) 1986, Sun Microsystems, Inc.
- */
-
-/*
- * Command to change one's public key in the public key database
- */
-#include <rpc/rpc.h>
-#include <rpc/key_prot.h>
-#ifdef YP
-#include <rpcsvc/yp_prot.h>
-#include <rpcsvc/ypclnt.h>
-#else
-#define YPOP_STORE 4
-#endif
-#include <sys/fcntl.h>
-#include <err.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-#ifdef YPPASSWD
-struct passwd *ypgetpwuid(uid_t);
-#endif
-
-#ifdef YP
-static char *domain;
-static char PKMAP[] = "publickey.byname";
-#else
-static char PKFILE[] = "/etc/publickey";
-#endif /* YP */
-static char ROOTKEY[] = "/etc/.rootkey";
-
-static void usage(void);
-extern int yp_update(char *, char *, int, char *, size_t, char *, size_t);
-
-int
-main(int argc, char **argv)
-{
- char name[MAXNETNAMELEN+1];
- char public[HEXKEYBYTES + 1];
- char secret[HEXKEYBYTES + 1];
- char crypt1[HEXKEYBYTES + KEYCHECKSUMSIZE + 1];
- char crypt2[HEXKEYBYTES + KEYCHECKSUMSIZE + 1];
- int status;
- char *pass;
- struct passwd *pw;
- uid_t uid;
- int force = 0;
- int ch;
-#ifdef YP
- char *master;
-#endif
-
- while ((ch = getopt(argc, argv, "f")) != -1)
- switch(ch) {
- case 'f':
- force = 1;
- break;
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (argc != 0)
- usage();
-
-#ifdef YP
- (void)yp_get_default_domain(&domain);
- if (yp_master(domain, PKMAP, &master) != 0)
- errx(1, "can't find master of publickey database");
-#endif
- uid = getuid() /*geteuid()*/;
- if (uid == 0) {
- if (host2netname(name, NULL, NULL) == 0)
- errx(1, "cannot convert hostname to netname");
- } else {
- if (user2netname(name, uid, NULL) == 0)
- errx(1, "cannot convert username to netname");
- }
- (void)printf("Generating new key for %s.\n", name);
-
- if (!force) {
- if (uid != 0) {
-#ifdef YPPASSWD
- pw = ypgetpwuid(uid);
-#else
- pw = getpwuid(uid);
-#endif
- if (pw == NULL) {
-#ifdef YPPASSWD
- errx(1,
- "no NIS password entry found: can't change key");
-#else
- errx(1,
- "no password entry found: can't change key");
-#endif
- }
- } else {
- pw = getpwuid(0);
- if (pw == NULL)
- errx(1, "no password entry found: can't change key");
- }
- }
- pass = getpass("Password:");
-#ifdef YPPASSWD
- if (!force) {
- if (strcmp(crypt(pass, pw->pw_passwd), pw->pw_passwd) != 0)
- errx(1, "invalid password");
- }
-#else
- force = 1; /* Make this mandatory */
-#endif
- genkeys(public, secret, pass);
-
- memcpy(crypt1, secret, HEXKEYBYTES);
- memcpy(crypt1 + HEXKEYBYTES, secret, KEYCHECKSUMSIZE);
- crypt1[HEXKEYBYTES + KEYCHECKSUMSIZE] = 0;
- xencrypt(crypt1, pass);
-
- if (force) {
- memcpy(crypt2, crypt1, HEXKEYBYTES + KEYCHECKSUMSIZE + 1);
- xdecrypt(crypt2, getpass("Retype password:"));
- if (memcmp(crypt2, crypt2 + HEXKEYBYTES, KEYCHECKSUMSIZE) != 0
- || memcmp(crypt2, secret, HEXKEYBYTES) != 0)
- errx(1, "password incorrect");
- }
-
-#ifdef YP
- (void)printf("Sending key change request to %s...\n", master);
-#endif
- status = setpublicmap(name, public, crypt1);
- if (status != 0) {
-#ifdef YP
- errx(1, "unable to update NIS database (%u): %s",
- status, yperr_string(status));
-#else
- errx(1, "unable to update publickey database");
-#endif
- }
-
- if (uid == 0) {
- /*
- * Root users store their key in /etc/$ROOTKEY so
- * that they can auto reboot without having to be
- * around to type a password. Storing this in a file
- * is rather dubious: it should really be in the EEPROM
- * so it does not go over the net.
- */
- int fd;
-
- fd = open(ROOTKEY, O_WRONLY|O_TRUNC|O_CREAT, 0);
- if (fd < 0) {
- warn("%s", ROOTKEY);
- } else {
- char newline = '\n';
-
- if (write(fd, secret, strlen(secret)) < 0 ||
- write(fd, &newline, sizeof(newline)) < 0)
- warn("%s: write", ROOTKEY);
- }
- }
-
- if (key_setsecret(secret) < 0)
- errx(1, "unable to login with new secret key");
- (void)printf("Done.\n");
- exit(0);
- /* NOTREACHED */
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "usage: chkey [-f]\n");
- exit(1);
- /* NOTREACHED */
-}
-
-
-/*
- * Set the entry in the public key file
- */
-int
-setpublicmap(char *name, char *public, char *secret)
-{
- char pkent[1024];
-
- (void)sprintf(pkent,"%s:%s", public, secret);
-#ifdef YP
- return (yp_update(domain, PKMAP, YPOP_STORE,
- name, strlen(name), pkent, strlen(pkent)));
-#else
- return (localupdate(name, PKFILE, YPOP_STORE,
- strlen(name), name, strlen(pkent), pkent));
-#endif
-}
-
-#ifdef YPPASSWD
-struct passwd *
-ypgetpwuid(uid_t uid)
-{
- char uidstr[10];
- char *val;
- int vallen;
- static struct passwd pw;
- char *p;
-
- (void)sprintf(uidstr, "%d", uid);
- if (yp_match(domain, "passwd.byuid", uidstr, strlen(uidstr),
- &val, &vallen) != 0) {
- return (NULL);
- }
- p = strchr(val, ':');
- if (p == NULL) {
- return (NULL);
- }
- pw.pw_passwd = p + 1;
- p = strchr(pw.pw_passwd, ':');
- if (p == NULL) {
- return (NULL);
- }
- *p = 0;
- return (&pw);
-}
-#endif /* YPPASSWD */
diff --git a/usr.bin/chpass/Makefile b/usr.bin/chpass/Makefile
deleted file mode 100644
index 2bbdc08..0000000
--- a/usr.bin/chpass/Makefile
+++ /dev/null
@@ -1,49 +0,0 @@
-# @(#)Makefile 8.2 (Berkeley) 4/2/94
-# $FreeBSD$
-
-.include <bsd.own.mk>
-
-.PATH: ${.CURDIR}/../../usr.sbin/pwd_mkdb ${.CURDIR}/../../lib/libc/gen
-
-PROG= chpass
-SRCS= chpass.c edit.c field.c pw_scan.c table.c util.c
-BINOWN= root
-BINMODE=4555
-WARNS?= 5
-.if ${MK_NIS} != "no"
-CFLAGS+= -DYP
-.endif
-#Some people need this, uncomment to activate
-#CFLAGS+=-DRESTRICT_FULLNAME_CHANGE
-CFLAGS+=-I${.CURDIR}/../../usr.sbin/pwd_mkdb -I${.CURDIR}/../../lib/libc/gen -I.
-
-DPADD= ${LIBCRYPT} ${LIBUTIL}
-LDADD= -lcrypt -lutil
-.if ${MK_NIS} != "no"
-DPADD+= ${LIBYPCLNT}
-LDADD+= -lypclnt
-.endif
-
-LINKS= ${BINDIR}/chpass ${BINDIR}/chfn
-LINKS+= ${BINDIR}/chpass ${BINDIR}/chsh
-.if ${MK_NIS} != "no"
-LINKS+= ${BINDIR}/chpass ${BINDIR}/ypchpass
-LINKS+= ${BINDIR}/chpass ${BINDIR}/ypchfn
-LINKS+= ${BINDIR}/chpass ${BINDIR}/ypchsh
-.endif
-
-MLINKS= chpass.1 chfn.1 chpass.1 chsh.1
-.if ${MK_NIS} != "no"
-MLINKS+= chpass.1 ypchpass.1 chpass.1 ypchfn.1 chpass.1 ypchsh.1
-.endif
-
-beforeinstall:
-.for i in chpass chfn chsh ypchpass ypchfn ypchsh
- [ ! -e ${DESTDIR}${BINDIR}/$i ] || \
- chflags noschg ${DESTDIR}${BINDIR}/$i || true
-.endfor
-
-afterinstall:
- -chflags schg ${DESTDIR}${BINDIR}/chpass
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/chpass/chpass.1 b/usr.bin/chpass/chpass.1
deleted file mode 100644
index 24b1759..0000000
--- a/usr.bin/chpass/chpass.1
+++ /dev/null
@@ -1,492 +0,0 @@
-.\" Copyright (c) 1988, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)chpass.1 8.2 (Berkeley) 12/30/93
-.\" $FreeBSD$
-.\"
-.Dd December 30, 1993
-.Dt CHPASS 1
-.Os
-.Sh NAME
-.Nm chpass ,
-.Nm chfn ,
-.Nm chsh ,
-.Nm ypchpass ,
-.Nm ypchfn ,
-.Nm ypchsh
-.Nd add or change user database information
-.Sh SYNOPSIS
-.Nm
-.Op Fl a Ar list
-.Op Fl p Ar encpass
-.Op Fl e Ar expiretime
-.Op Fl s Ar newshell
-.Op user
-.Nm
-.Op Fl oly
-.Op Fl a Ar list
-.Op Fl p Ar encpass
-.Op Fl e Ar expiretime
-.Op Fl s Ar newshell
-.Op Fl d Ar domain
-.Op Fl h Ar host
-.Op user
-.Sh DESCRIPTION
-The
-.Nm
-utility
-allows editing of the user database information associated
-with
-.Ar user
-or, by default, the current user.
-.Pp
-The
-.Nm chfn ,
-.Nm chsh ,
-.Nm ypchpass ,
-.Nm ypchfn
-and
-.Nm ypchsh
-utilities behave identically to
-.Nm .
-(There is only one program.)
-.Pp
-The information is formatted and supplied to an editor for changes.
-.Pp
-Only the information that the user is allowed to change is displayed.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl a
-The super-user is allowed to directly supply a user database
-entry, in the format specified by
-.Xr passwd 5 ,
-as an argument.
-This argument must be a colon
-.Pq Dq \&:
-separated list of all the
-user database fields, although they may be empty.
-.It Fl p
-The super-user is allowed to directly supply an encrypted password field,
-in the format used by
-.Xr crypt 3 ,
-as an argument.
-.It Fl e Ar expiretime
-Change the account expire time.
-This option is used to set the expire time
-from a script as if it was done in the interactive editor.
-.It Fl s Ar newshell
-Attempt to change the user's shell to
-.Ar newshell .
-.El
-.Pp
-Possible display items are as follows:
-.Pp
-.Bl -tag -width "Other Information:" -compact -offset indent
-.It Login:
-user's login name
-.It Password:
-user's encrypted password
-.It Uid:
-user's login
-.It Gid:
-user's login group
-.It Class:
-user's general classification
-.It Change:
-password change time
-.It Expire:
-account expiration time
-.It Full Name:
-user's real name
-.It Office Location:
-user's office location (1)
-.It Office Phone:
-user's office phone (1)
-.It Home Phone:
-user's home phone (1)
-.It Other Information:
-any locally defined parameters for user (1)
-.It Home Directory:
-user's home directory
-.It Shell:
-user's login shell
-.Pp
-.It NOTE(1) -
-In the actual master.passwd file, these fields are comma-delimited
-fields embedded in the FullName field.
-.El
-.Pp
-The
-.Ar login
-field is the user name used to access the computer account.
-.Pp
-The
-.Ar password
-field contains the encrypted form of the user's password.
-.Pp
-The
-.Ar uid
-field is the number associated with the
-.Ar login
-field.
-Both of these fields should be unique across the system (and often
-across a group of systems) as they control file access.
-.Pp
-While it is possible to have multiple entries with identical login names
-and/or identical user id's, it is usually a mistake to do so.
-Routines
-that manipulate these files will often return only one of the multiple
-entries, and that one by random selection.
-.Pp
-The
-.Ar group
-field is the group that the user will be placed in at login.
-Since
-.Bx
-supports multiple groups (see
-.Xr groups 1 )
-this field currently has little special meaning.
-This field may be filled in with either a number or a group name (see
-.Xr group 5 ) .
-.Pp
-The
-.Ar class
-field references class descriptions in
-.Pa /etc/login.conf
-and is typically used to initialize the user's system resource limits
-when they login.
-.Pp
-The
-.Ar change
-field is the date by which the password must be changed.
-.Pp
-The
-.Ar expire
-field is the date on which the account expires.
-.Pp
-Both the
-.Ar change
-and
-.Ar expire
-fields should be entered in the form
-.Dq month day year
-where
-.Ar month
-is the month name (the first three characters are sufficient),
-.Ar day
-is the day of the month, and
-.Ar year
-is the year.
-.Pp
-Five fields are available for storing the user's
-.Ar full name , office location ,
-.Ar work
-and
-.Ar home telephone
-numbers and finally
-.Ar other information
-which is a single comma delimited string to represent any additional
-gecos fields (typically used for site specific user information).
-Note that
-.Xr finger 1
-will display the office location and office phone together under the
-heading
-.Ar Office: .
-.Pp
-The user's
-.Ar home directory
-is the full
-.Ux
-path name where the user
-will be placed at login.
-.Pp
-The
-.Ar shell
-field is the command interpreter the user prefers.
-If the
-.Ar shell
-field is empty, the Bourne shell,
-.Pa /bin/sh ,
-is assumed.
-When altering a login shell, and not the super-user, the user
-may not change from a non-standard shell or to a non-standard
-shell.
-Non-standard is defined as a shell not found in
-.Pa /etc/shells .
-.Pp
-Once the information has been verified,
-.Nm
-uses
-.Xr pwd_mkdb 8
-to update the user database.
-.Sh ENVIRONMENT
-The
-.Xr vi 1
-editor will be used unless the environment variable
-.Ev EDITOR
-is set to
-an alternate editor.
-When the editor terminates, the information is re-read and used to
-update the user database itself.
-Only the user, or the super-user, may edit the information associated
-with the user.
-.Pp
-See
-.Xr pwd_mkdb 8
-for an explanation of the impact of setting the
-.Ev PW_SCAN_BIG_IDS
-environment variable.
-.Sh NIS INTERACTION
-The
-.Nm
-utility can also be used in conjunction with NIS, however some restrictions
-apply.
-Currently,
-.Nm
-can only make changes to the NIS passwd maps through
-.Xr rpc.yppasswdd 8 ,
-which normally only permits changes to a user's password, shell and GECOS
-fields.
-Except when invoked by the super-user on the NIS master server,
-.Nm
-(and, similarly,
-.Xr passwd 1 )
-cannot use the
-.Xr rpc.yppasswdd 8
-server to change other user information or
-add new records to the NIS passwd maps.
-Furthermore,
-.Xr rpc.yppasswdd 8
-requires password authentication before it will make any
-changes.
-The only user allowed to submit changes without supplying
-a password is the super-user on the NIS master server; all other users,
-including those with root privileges on NIS clients (and NIS slave
-servers) must enter a password.
-(The super-user on the NIS master is allowed to bypass these restrictions
-largely for convenience: a user with root access
-to the NIS master server already has the privileges required to make
-updates to the NIS maps, but editing the map source files by hand can
-be cumbersome.
-.Pp
-Note: these exceptions only apply when the NIS master server is a
-.Fx
-system).
-.Pp
-Consequently, except where noted, the following restrictions apply when
-.Nm
-is used with NIS:
-.Bl -enum -offset indent
-.It
-.Em "Only the shell and GECOS information may be changed" .
-All other
-fields are restricted, even when
-.Nm
-is invoked by the super-user.
-While support for
-changing other fields could be added, this would lead to
-compatibility problems with other NIS-capable systems.
-Even though the super-user may supply data for other fields
-while editing an entry, the extra information (other than the
-password -- see below) will be silently discarded.
-.Pp
-Exception: the super-user on the NIS master server is permitted to
-change any field.
-.Pp
-.It
-.Em "Password authentication is required" .
-The
-.Nm
-utility will prompt for the user's NIS password before effecting
-any changes.
-If the password is invalid, all changes will be
-discarded.
-.Pp
-Exception: the super-user on the NIS master server is allowed to
-submit changes without supplying a password.
-(The super-user may
-choose to turn off this feature using the
-.Fl o
-flag, described below.)
-.It
-.Em "Adding new records to the local password database is discouraged" .
-The
-.Nm
-utility will allow the administrator to add new records to the
-local password database while NIS is enabled, but this can lead to
-some confusion since the new records are appended to the end of
-the master password file, usually after the special NIS '+' entries.
-The administrator should use
-.Xr vipw 8
-to modify the local password
-file when NIS is running.
-.Pp
-The super-user on the NIS master server is permitted to add new records
-to the NIS password maps, provided the
-.Xr rpc.yppasswdd 8
-server has been started with the
-.Fl a
-flag to permitted additions (it refuses them by default).
-The
-.Nm
-utility tries to update the local password database by default; to update the
-NIS maps instead, invoke chpass with the
-.Fl y
-flag.
-.It
-.Em "Password changes are not permitted".
-Users should use
-.Xr passwd 1
-or
-.Xr yppasswd 1
-to change their NIS passwords.
-The super-user is allowed to specify
-a new password (even though the
-.Dq Password:
-field does not show
-up in the editor template, the super-user may add it back by hand),
-but even the super-user must supply the user's original password
-otherwise
-.Xr rpc.yppasswdd 8
-will refuse to update the NIS maps.
-.Pp
-Exception: the super-user on the NIS master server is permitted to
-change a user's NIS password with
-.Nm .
-.El
-.Pp
-There are also a few extra option flags that are available when
-.Nm
-is compiled with NIS support:
-.Bl -tag -width indent
-.It Fl l
-Force
-.Nm
-to modify the local copy of a user's password
-information in the event that a user exists in both
-the local and NIS databases.
-.It Fl y
-Opposite effect of
-.Fl l .
-This flag is largely redundant since
-.Nm
-operates on NIS entries by default if NIS is enabled.
-.It Fl d Ar domain
-Specify a particular NIS domain.
-The
-.Nm
-utility uses the system domain name by default, as set by the
-.Xr domainname 1
-utility.
-The
-.Fl d
-option can be used to override a default, or to specify a domain
-when the system domain name is not set.
-.It Fl h Ar host
-Specify the name or address of an NIS server to query.
-Normally,
-.Nm
-will communicate with the NIS master host specified in the
-.Pa master.passwd
-or
-.Pa passwd
-maps.
-On hosts that have not been configured as NIS clients, there is
-no way for the program to determine this information unless the user
-provides the hostname of a server.
-Note that the specified hostname need
-not be that of the NIS master server; the name of any server, master or
-slave, in a given NIS domain will do.
-.Pp
-When using the
-.Fl d
-option, the hostname defaults to
-.Dq localhost .
-The
-.Fl h
-option can be used in conjunction with the
-.Fl d
-option, in which case the user-specified hostname will override
-the default.
-.Pp
-.It Fl o
-Force the use of RPC-based updates when communicating with
-.Xr rpc.yppasswdd 8
-.Pq Dq old-mode .
-When invoked by the super-user on the NIS master server,
-.Nm
-allows unrestricted changes to the NIS passwd maps using dedicated,
-non-RPC-based mechanism (in this case, a
-.Ux
-domain socket).
-The
-.Fl o
-flag can be used to force
-.Nm
-to use the standard update mechanism instead.
-This option is provided
-mainly for testing purposes.
-.El
-.Sh FILES
-.Bl -tag -width /etc/master.passwd -compact
-.It Pa /etc/master.passwd
-the user database
-.It Pa /etc/passwd
-a Version 7 format password file
-.It Pa /etc/chpass.XXXXXX
-temporary copy of the password file
-.It Pa /etc/shells
-the list of approved shells
-.El
-.Sh SEE ALSO
-.Xr finger 1 ,
-.Xr login 1 ,
-.Xr passwd 1 ,
-.Xr getusershell 3 ,
-.Xr login.conf 5 ,
-.Xr passwd 5 ,
-.Xr pw 8 ,
-.Xr pwd_mkdb 8 ,
-.Xr vipw 8
-.Rs
-.%A Robert Morris
-and
-.%A Ken Thompson
-.%T "UNIX Password security"
-.Re
-.Sh HISTORY
-The
-.Nm
-utility appeared in
-.Bx 4.3 Reno .
-.Sh BUGS
-User information should (and eventually will) be stored elsewhere.
diff --git a/usr.bin/chpass/chpass.c b/usr.bin/chpass/chpass.c
deleted file mode 100644
index 2504e68..0000000
--- a/usr.bin/chpass/chpass.c
+++ /dev/null
@@ -1,302 +0,0 @@
-/*-
- * Copyright (c) 1988, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 2002 Networks Associates Technology, Inc.
- * All rights reserved.
- *
- * Portions of this software were developed for the FreeBSD Project by
- * ThinkSec AS and NAI Labs, the Security Research Division of Network
- * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
- * ("CBOSS"), as part of the DARPA CHATS research program.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1988, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static char sccsid[] = "@(#)chpass.c 8.4 (Berkeley) 4/2/94";
-#endif /* not lint */
-#endif
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-
-#include <err.h>
-#include <errno.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#ifdef YP
-#include <ypclnt.h>
-#endif
-
-#include <pw_scan.h>
-#include <libutil.h>
-
-#include "chpass.h"
-
-int master_mode;
-
-static void baduser(void);
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- enum { NEWSH, LOADENTRY, EDITENTRY, NEWPW, NEWEXP } op;
- struct passwd lpw, *old_pw, *pw;
- int ch, pfd, tfd;
- const char *password;
- char *arg = NULL;
- uid_t uid;
-#ifdef YP
- struct ypclnt *ypclnt;
- const char *yp_domain = NULL, *yp_host = NULL;
-#endif
-
- pw = old_pw = NULL;
- op = EDITENTRY;
-#ifdef YP
- while ((ch = getopt(argc, argv, "a:p:s:e:d:h:loy")) != -1)
-#else
- while ((ch = getopt(argc, argv, "a:p:s:e:")) != -1)
-#endif
- switch (ch) {
- case 'a':
- op = LOADENTRY;
- arg = optarg;
- break;
- case 's':
- op = NEWSH;
- arg = optarg;
- break;
- case 'p':
- op = NEWPW;
- arg = optarg;
- break;
- case 'e':
- op = NEWEXP;
- arg = optarg;
- break;
-#ifdef YP
- case 'd':
- yp_domain = optarg;
- break;
- case 'h':
- yp_host = optarg;
- break;
- case 'l':
- case 'o':
- case 'y':
- /* compatibility */
- break;
-#endif
- case '?':
- default:
- usage();
- }
-
- argc -= optind;
- argv += optind;
-
- if (argc > 1)
- usage();
-
- uid = getuid();
-
- if (op == EDITENTRY || op == NEWSH || op == NEWPW || op == NEWEXP) {
- if (argc == 0) {
- if ((pw = getpwuid(uid)) == NULL)
- errx(1, "unknown user: uid %lu",
- (unsigned long)uid);
- } else {
- if ((pw = getpwnam(*argv)) == NULL)
- errx(1, "unknown user: %s", *argv);
- if (uid != 0 && uid != pw->pw_uid)
- baduser();
- }
-
- /* Make a copy for later verification */
- if ((pw = pw_dup(pw)) == NULL ||
- (old_pw = pw_dup(pw)) == NULL)
- err(1, "pw_dup");
- }
-
-#ifdef YP
- if (pw != NULL && (pw->pw_fields & _PWF_SOURCE) == _PWF_NIS) {
- ypclnt = ypclnt_new(yp_domain, "passwd.byname", yp_host);
- master_mode = (ypclnt != NULL &&
- ypclnt_connect(ypclnt) != -1 &&
- ypclnt_havepasswdd(ypclnt) == 1);
- ypclnt_free(ypclnt);
- } else
-#endif
- master_mode = (uid == 0);
-
- if (op == NEWSH) {
- /* protect p_shell -- it thinks NULL is /bin/sh */
- if (!arg[0])
- usage();
- if (p_shell(arg, pw, (ENTRY *)NULL) == -1)
- exit(1);
- }
-
- if (op == NEWEXP) {
- if (uid) /* only root can change expire */
- baduser();
- if (p_expire(arg, pw, (ENTRY *)NULL) == -1)
- exit(1);
- }
-
- if (op == LOADENTRY) {
- if (uid)
- baduser();
- pw = &lpw;
- old_pw = NULL;
- if (!__pw_scan(arg, pw, _PWSCAN_WARN|_PWSCAN_MASTER))
- exit(1);
- }
-
- if (op == NEWPW) {
- if (uid)
- baduser();
-
- if (strchr(arg, ':'))
- errx(1, "invalid format for password");
- pw->pw_passwd = arg;
- }
-
- if (op == EDITENTRY) {
- /*
- * We don't really need pw_*() here, but pw_edit() (used
- * by edit()) is just too useful...
- */
- if (pw_init(NULL, NULL))
- err(1, "pw_init()");
- if ((tfd = pw_tmp(-1)) == -1) {
- pw_fini();
- err(1, "pw_tmp()");
- }
- free(pw);
- pw = edit(pw_tempname(), old_pw);
- pw_fini();
- if (pw == NULL)
- err(1, "edit()");
- /*
- * pw_equal does not check for crypted passwords, so we
- * should do it explicitly
- */
- if (pw_equal(old_pw, pw) &&
- strcmp(old_pw->pw_passwd, pw->pw_passwd) == 0)
- errx(0, "user information unchanged");
- }
-
- if (old_pw && !master_mode) {
- password = getpass("Password: ");
- if (strcmp(crypt(password, old_pw->pw_passwd),
- old_pw->pw_passwd) != 0)
- baduser();
- } else {
- password = "";
- }
-
- if (old_pw != NULL)
- pw->pw_fields |= (old_pw->pw_fields & _PWF_SOURCE);
- switch (pw->pw_fields & _PWF_SOURCE) {
-#ifdef YP
- case _PWF_NIS:
- ypclnt = ypclnt_new(yp_domain, "passwd.byname", yp_host);
- if (ypclnt == NULL ||
- ypclnt_connect(ypclnt) == -1 ||
- ypclnt_passwd(ypclnt, pw, password) == -1) {
- warnx("%s", ypclnt->error);
- ypclnt_free(ypclnt);
- exit(1);
- }
- ypclnt_free(ypclnt);
- errx(0, "NIS user information updated");
-#endif /* YP */
- case 0:
- case _PWF_FILES:
- if (pw_init(NULL, NULL))
- err(1, "pw_init()");
- if ((pfd = pw_lock()) == -1) {
- pw_fini();
- err(1, "pw_lock()");
- }
- if ((tfd = pw_tmp(-1)) == -1) {
- pw_fini();
- err(1, "pw_tmp()");
- }
- if (pw_copy(pfd, tfd, pw, old_pw) == -1) {
- pw_fini();
- err(1, "pw_copy");
- }
- if (pw_mkdb(pw->pw_name) == -1) {
- pw_fini();
- err(1, "pw_mkdb()");
- }
- pw_fini();
- errx(0, "user information updated");
- break;
- default:
- errx(1, "unsupported passwd source");
- }
-}
-
-static void
-baduser(void)
-{
-
- errx(1, "%s", strerror(EACCES));
-}
-
-static void
-usage(void)
-{
-
- (void)fprintf(stderr,
- "usage: chpass%s %s [user]\n",
-#ifdef YP
- " [-d domain] [-h host]",
-#else
- "",
-#endif
- "[-a list] [-p encpass] [-s shell] [-e mmm dd yy]");
- exit(1);
-}
diff --git a/usr.bin/chpass/chpass.h b/usr.bin/chpass/chpass.h
deleted file mode 100644
index ed1a586..0000000
--- a/usr.bin/chpass/chpass.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 1988, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 2002 Networks Associates Technology, Inc.
- * All rights reserved.
- *
- * Portions of this software were developed for the FreeBSD Project by
- * ThinkSec AS and NAI Labs, the Security Research Division of Network
- * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
- * ("CBOSS"), as part of the DARPA CHATS research program.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)chpass.h 8.4 (Berkeley) 4/2/94
- * $FreeBSD$
- */
-
-struct passwd;
-
-typedef struct _entry {
- const char *prompt;
- int (*func)(char *, struct passwd *, struct _entry *);
- int restricted;
- size_t len;
- char *except, *save;
-} ENTRY;
-
-/* Field numbers. */
-#define E_BPHONE 8
-#define E_HPHONE 9
-#define E_LOCATE 10
-#define E_NAME 7
-#define E_OTHER 11
-#define E_SHELL 13
-
-extern ENTRY list[];
-extern int master_mode;
-
-int atot(char *, time_t *);
-struct passwd *edit(const char *, struct passwd *);
-int ok_shell(char *);
-char *dup_shell(char *);
-int p_change(char *, struct passwd *, ENTRY *);
-int p_class(char *, struct passwd *, ENTRY *);
-int p_expire(char *, struct passwd *, ENTRY *);
-int p_gecos(char *, struct passwd *, ENTRY *);
-int p_gid(char *, struct passwd *, ENTRY *);
-int p_hdir(char *, struct passwd *, ENTRY *);
-int p_login(char *, struct passwd *, ENTRY *);
-int p_passwd(char *, struct passwd *, ENTRY *);
-int p_shell(char *, struct passwd *, ENTRY *);
-int p_uid(char *, struct passwd *, ENTRY *);
-char *ttoa(time_t);
diff --git a/usr.bin/chpass/edit.c b/usr.bin/chpass/edit.c
deleted file mode 100644
index ce82f8e..0000000
--- a/usr.bin/chpass/edit.c
+++ /dev/null
@@ -1,296 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 2002 Networks Associates Technology, Inc.
- * All rights reserved.
- *
- * Portions of this software were developed for the FreeBSD Project by
- * ThinkSec AS and NAI Labs, the Security Research Division of Network
- * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
- * ("CBOSS"), as part of the DARPA CHATS research program.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)edit.c 8.3 (Berkeley) 4/2/94";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/stat.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <paths.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <pw_scan.h>
-#include <libutil.h>
-
-#include "chpass.h"
-
-static int display(const char *tfn, struct passwd *pw);
-static struct passwd *verify(const char *tfn, struct passwd *pw);
-
-struct passwd *
-edit(const char *tfn, struct passwd *pw)
-{
- struct passwd *npw;
- char *line;
- size_t len;
-
- if (display(tfn, pw) == -1)
- return (NULL);
- for (;;) {
- switch (pw_edit(1)) {
- case -1:
- return (NULL);
- case 0:
- return (pw_dup(pw));
- default:
- break;
- }
- if ((npw = verify(tfn, pw)) != NULL)
- return (npw);
- free(npw);
- printf("re-edit the password file? ");
- fflush(stdout);
- if ((line = fgetln(stdin, &len)) == NULL) {
- warn("fgetln()");
- return (NULL);
- }
- if (len > 0 && (*line == 'N' || *line == 'n'))
- return (NULL);
- }
-}
-
-/*
- * display --
- * print out the file for the user to edit; strange side-effect:
- * set conditional flag if the user gets to edit the shell.
- */
-static int
-display(const char *tfn, struct passwd *pw)
-{
- FILE *fp;
- char *bp, *gecos, *p;
-
- if ((fp = fopen(tfn, "w")) == NULL) {
- warn("%s", tfn);
- return (-1);
- }
-
- (void)fprintf(fp,
- "#Changing user information for %s.\n", pw->pw_name);
- if (master_mode) {
- (void)fprintf(fp, "Login: %s\n", pw->pw_name);
- (void)fprintf(fp, "Password: %s\n", pw->pw_passwd);
- (void)fprintf(fp, "Uid [#]: %lu\n", (unsigned long)pw->pw_uid);
- (void)fprintf(fp, "Gid [# or name]: %lu\n",
- (unsigned long)pw->pw_gid);
- (void)fprintf(fp, "Change [month day year]: %s\n",
- ttoa(pw->pw_change));
- (void)fprintf(fp, "Expire [month day year]: %s\n",
- ttoa(pw->pw_expire));
- (void)fprintf(fp, "Class: %s\n", pw->pw_class);
- (void)fprintf(fp, "Home directory: %s\n", pw->pw_dir);
- (void)fprintf(fp, "Shell: %s\n",
- *pw->pw_shell ? pw->pw_shell : _PATH_BSHELL);
- }
- /* Only admin can change "restricted" shells. */
-#if 0
- else if (ok_shell(pw->pw_shell))
- /*
- * Make shell a restricted field. Ugly with a
- * necklace, but there's not much else to do.
- */
-#else
- else if ((!list[E_SHELL].restricted && ok_shell(pw->pw_shell)) ||
- master_mode)
- /*
- * If change not restrict (table.c) and standard shell
- * OR if root, then allow editing of shell.
- */
-#endif
- (void)fprintf(fp, "Shell: %s\n",
- *pw->pw_shell ? pw->pw_shell : _PATH_BSHELL);
- else
- list[E_SHELL].restricted = 1;
-
- if ((bp = gecos = strdup(pw->pw_gecos)) == NULL) {
- warn(NULL);
- fclose(fp);
- return (-1);
- }
-
- p = strsep(&bp, ",");
- p = strdup(p ? p : "");
- list[E_NAME].save = p;
- if (!list[E_NAME].restricted || master_mode)
- (void)fprintf(fp, "Full Name: %s\n", p);
-
- p = strsep(&bp, ",");
- p = strdup(p ? p : "");
- list[E_LOCATE].save = p;
- if (!list[E_LOCATE].restricted || master_mode)
- (void)fprintf(fp, "Office Location: %s\n", p);
-
- p = strsep(&bp, ",");
- p = strdup(p ? p : "");
- list[E_BPHONE].save = p;
- if (!list[E_BPHONE].restricted || master_mode)
- (void)fprintf(fp, "Office Phone: %s\n", p);
-
- p = strsep(&bp, ",");
- p = strdup(p ? p : "");
- list[E_HPHONE].save = p;
- if (!list[E_HPHONE].restricted || master_mode)
- (void)fprintf(fp, "Home Phone: %s\n", p);
-
- bp = strdup(bp ? bp : "");
- list[E_OTHER].save = bp;
- if (!list[E_OTHER].restricted || master_mode)
- (void)fprintf(fp, "Other information: %s\n", bp);
-
- free(gecos);
-
- (void)fchown(fileno(fp), getuid(), getgid());
- (void)fclose(fp);
- return (0);
-}
-
-static struct passwd *
-verify(const char *tfn, struct passwd *pw)
-{
- struct passwd *npw;
- ENTRY *ep;
- char *buf, *p, *val;
- struct stat sb;
- FILE *fp;
- int line;
- size_t len;
-
- if ((pw = pw_dup(pw)) == NULL)
- return (NULL);
- if ((fp = fopen(tfn, "r")) == NULL ||
- fstat(fileno(fp), &sb) == -1) {
- warn("%s", tfn);
- free(pw);
- return (NULL);
- }
- if (sb.st_size == 0) {
- warnx("corrupted temporary file");
- fclose(fp);
- free(pw);
- return (NULL);
- }
- val = NULL;
- for (line = 1; (buf = fgetln(fp, &len)) != NULL; ++line) {
- if (*buf == '\0' || *buf == '#')
- continue;
- while (len > 0 && isspace(buf[len - 1]))
- --len;
- for (ep = list;; ++ep) {
- if (!ep->prompt) {
- warnx("%s: unrecognized field on line %d",
- tfn, line);
- goto bad;
- }
- if (ep->len > len)
- continue;
- if (strncasecmp(buf, ep->prompt, ep->len) != 0)
- continue;
- if (ep->restricted && !master_mode) {
- warnx("%s: you may not change the %s field",
- tfn, ep->prompt);
- goto bad;
- }
- for (p = buf; p < buf + len && *p != ':'; ++p)
- /* nothing */ ;
- if (*p != ':') {
- warnx("%s: line %d corrupted", tfn, line);
- goto bad;
- }
- while (++p < buf + len && isspace(*p))
- /* nothing */ ;
- free(val);
- asprintf(&val, "%.*s", (int)(buf + len - p), p);
- if (val == NULL)
- goto bad;
- if (ep->except && strpbrk(val, ep->except)) {
- warnx("%s: invalid character in \"%s\" field '%s'",
- tfn, ep->prompt, val);
- goto bad;
- }
- if ((ep->func)(val, pw, ep))
- goto bad;
- break;
- }
- }
- free(val);
- fclose(fp);
-
- /* Build the gecos field. */
- len = asprintf(&p, "%s,%s,%s,%s,%s", list[E_NAME].save,
- list[E_LOCATE].save, list[E_BPHONE].save,
- list[E_HPHONE].save, list[E_OTHER].save);
- if (p == NULL) {
- warn("asprintf()");
- free(pw);
- return (NULL);
- }
- while (len > 0 && p[len - 1] == ',')
- p[--len] = '\0';
- pw->pw_gecos = p;
- buf = pw_make(pw);
- free(pw);
- free(p);
- if (buf == NULL) {
- warn("pw_make()");
- return (NULL);
- }
- npw = pw_scan(buf, PWSCAN_WARN|PWSCAN_MASTER);
- free(buf);
- return (npw);
-bad:
- free(pw);
- free(val);
- fclose(fp);
- return (NULL);
-}
diff --git a/usr.bin/chpass/field.c b/usr.bin/chpass/field.c
deleted file mode 100644
index eac5561..0000000
--- a/usr.bin/chpass/field.c
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright (c) 1988, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 2002 Networks Associates Technology, Inc.
- * All rights reserved.
- *
- * Portions of this software were developed for the FreeBSD Project by
- * ThinkSec AS and NAI Labs, the Security Research Division of Network
- * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
- * ("CBOSS"), as part of the DARPA CHATS research program.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)field.c 8.4 (Berkeley) 4/2/94";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/stat.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <grp.h>
-#include <paths.h>
-#include <pwd.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "chpass.h"
-
-/* ARGSUSED */
-int
-p_login(char *p, struct passwd *pw, ENTRY *ep __unused)
-{
- if (!*p) {
- warnx("empty login field");
- return (-1);
- }
- if (*p == '-') {
- warnx("login names may not begin with a hyphen");
- return (-1);
- }
- if (!(pw->pw_name = strdup(p))) {
- warnx("can't save entry");
- return (-1);
- }
- if (strchr(p, '.'))
- warnx("\'.\' is dangerous in a login name");
- for (; *p; ++p)
- if (isupper(*p)) {
- warnx("upper-case letters are dangerous in a login name");
- break;
- }
- return (0);
-}
-
-/* ARGSUSED */
-int
-p_passwd(char *p, struct passwd *pw, ENTRY *ep __unused)
-{
- if (!(pw->pw_passwd = strdup(p))) {
- warnx("can't save password entry");
- return (-1);
- }
-
- return (0);
-}
-
-/* ARGSUSED */
-int
-p_uid(char *p, struct passwd *pw, ENTRY *ep __unused)
-{
- uid_t id;
- char *np;
-
- if (!*p) {
- warnx("empty uid field");
- return (-1);
- }
- if (!isdigit(*p)) {
- warnx("illegal uid");
- return (-1);
- }
- errno = 0;
- id = strtoul(p, &np, 10);
- if (*np || (id == (uid_t)ULONG_MAX && errno == ERANGE)) {
- warnx("illegal uid");
- return (-1);
- }
- pw->pw_uid = id;
- return (0);
-}
-
-/* ARGSUSED */
-int
-p_gid(char *p, struct passwd *pw, ENTRY *ep __unused)
-{
- struct group *gr;
- gid_t id;
- char *np;
-
- if (!*p) {
- warnx("empty gid field");
- return (-1);
- }
- if (!isdigit(*p)) {
- if (!(gr = getgrnam(p))) {
- warnx("unknown group %s", p);
- return (-1);
- }
- pw->pw_gid = gr->gr_gid;
- return (0);
- }
- errno = 0;
- id = strtoul(p, &np, 10);
- if (*np || (id == (uid_t)ULONG_MAX && errno == ERANGE)) {
- warnx("illegal gid");
- return (-1);
- }
- pw->pw_gid = id;
- return (0);
-}
-
-/* ARGSUSED */
-int
-p_class(char *p, struct passwd *pw, ENTRY *ep __unused)
-{
- if (!(pw->pw_class = strdup(p))) {
- warnx("can't save entry");
- return (-1);
- }
-
- return (0);
-}
-
-/* ARGSUSED */
-int
-p_change(char *p, struct passwd *pw, ENTRY *ep __unused)
-{
- if (!atot(p, &pw->pw_change))
- return (0);
- warnx("illegal date for change field");
- return (-1);
-}
-
-/* ARGSUSED */
-int
-p_expire(char *p, struct passwd *pw, ENTRY *ep __unused)
-{
- if (!atot(p, &pw->pw_expire))
- return (0);
- warnx("illegal date for expire field");
- return (-1);
-}
-
-/* ARGSUSED */
-int
-p_gecos(char *p, struct passwd *pw __unused, ENTRY *ep)
-{
- if (!(ep->save = strdup(p))) {
- warnx("can't save entry");
- return (-1);
- }
- return (0);
-}
-
-/* ARGSUSED */
-int
-p_hdir(char *p, struct passwd *pw, ENTRY *ep __unused)
-{
- if (!*p) {
- warnx("empty home directory field");
- return (-1);
- }
- if (!(pw->pw_dir = strdup(p))) {
- warnx("can't save entry");
- return (-1);
- }
- return (0);
-}
-
-/* ARGSUSED */
-int
-p_shell(char *p, struct passwd *pw, ENTRY *ep __unused)
-{
- struct stat sbuf;
-
- if (!*p) {
- pw->pw_shell = strdup(_PATH_BSHELL);
- return (0);
- }
- /* only admin can change from or to "restricted" shells */
- if (!master_mode && pw->pw_shell && !ok_shell(pw->pw_shell)) {
- warnx("%s: current shell non-standard", pw->pw_shell);
- return (-1);
- }
- if (!ok_shell(p)) {
- if (!master_mode) {
- warnx("%s: non-standard shell", p);
- return (-1);
- }
- pw->pw_shell = strdup(p);
- }
- else
- pw->pw_shell = dup_shell(p);
- if (!pw->pw_shell) {
- warnx("can't save entry");
- return (-1);
- }
- if (stat(pw->pw_shell, &sbuf) < 0) {
- if (errno == ENOENT)
- warnx("WARNING: shell '%s' does not exist",
- pw->pw_shell);
- else
- warn("WARNING: can't stat shell '%s'", pw->pw_shell);
- return (0);
- }
- if (!S_ISREG(sbuf.st_mode)) {
- warnx("WARNING: shell '%s' is not a regular file",
- pw->pw_shell);
- return (0);
- }
- if ((sbuf.st_mode & (S_IXOTH | S_IXGRP | S_IXUSR)) == 0) {
- warnx("WARNING: shell '%s' is not executable", pw->pw_shell);
- return (0);
- }
- return (0);
-}
diff --git a/usr.bin/chpass/table.c b/usr.bin/chpass/table.c
deleted file mode 100644
index 19f1a99..0000000
--- a/usr.bin/chpass/table.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static const char sccsid[] = "@(#)table.c 8.3 (Berkeley) 4/2/94";
-#endif /* not lint */
-#endif
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <stddef.h>
-#include "chpass.h"
-
-char e1[] = ": ";
-char e2[] = ":,";
-
-ENTRY list[] = {
- { "login", p_login, 1, 5, e1, NULL },
- { "password", p_passwd, 1, 8, e1, NULL },
- { "uid", p_uid, 1, 3, e1, NULL },
- { "gid", p_gid, 1, 3, e1, NULL },
- { "class", p_class, 1, 5, e1, NULL },
- { "change", p_change, 1, 6, NULL, NULL },
- { "expire", p_expire, 1, 6, NULL, NULL },
-#ifdef RESTRICT_FULLNAME_CHANGE /* do not allow fullname changes */
- { "full name", p_gecos, 1, 9, e2, NULL },
-#else
- { "full name", p_gecos, 0, 9, e2, NULL },
-#endif
- { "office phone", p_gecos, 0, 12, e2, NULL },
- { "home phone", p_gecos, 0, 10, e2, NULL },
- { "office location", p_gecos, 0, 15, e2, NULL },
- { "other information", p_gecos, 0, 11, e1, NULL },
- { "home directory", p_hdir, 1, 14, e1, NULL },
- { "shell", p_shell, 0, 5, e1, NULL },
- { NULL, NULL, 0, 0, NULL, NULL },
-};
diff --git a/usr.bin/chpass/util.c b/usr.bin/chpass/util.c
deleted file mode 100644
index 07d96e2..0000000
--- a/usr.bin/chpass/util.c
+++ /dev/null
@@ -1,182 +0,0 @@
-/*-
- * Copyright (c) 1988, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 2002 Networks Associates Technology, Inc.
- * All rights reserved.
- *
- * Portions of this software were developed for the FreeBSD Project by
- * ThinkSec AS and NAI Labs, the Security Research Division of Network
- * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
- * ("CBOSS"), as part of the DARPA CHATS research program.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)util.c 8.4 (Berkeley) 4/2/94";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "chpass.h"
-
-static const char *months[] =
- { "January", "February", "March", "April", "May", "June",
- "July", "August", "September", "October", "November",
- "December", NULL };
-
-char *
-ttoa(time_t tval)
-{
- struct tm *tp;
- static char tbuf[50];
-
- if (tval) {
- tp = localtime(&tval);
- (void)sprintf(tbuf, "%s %d, %d", months[tp->tm_mon],
- tp->tm_mday, tp->tm_year + 1900);
- }
- else
- *tbuf = '\0';
- return (tbuf);
-}
-
-int
-atot(char *p, time_t *store)
-{
- static struct tm *lt;
- char *t;
- const char **mp;
- time_t tval;
- int day, month, year;
-
- if (!*p) {
- *store = 0;
- return (0);
- }
- if (!lt) {
- unsetenv("TZ");
- (void)time(&tval);
- lt = localtime(&tval);
- }
- if (!(t = strtok(p, " \t")))
- goto bad;
- if (isdigit(*t)) {
- month = atoi(t);
- } else {
- for (mp = months;; ++mp) {
- if (!*mp)
- goto bad;
- if (!strncasecmp(*mp, t, 3)) {
- month = mp - months + 1;
- break;
- }
- }
- }
- if (!(t = strtok((char *)NULL, " \t,")) || !isdigit(*t))
- goto bad;
- day = atoi(t);
- if (!(t = strtok((char *)NULL, " \t,")) || !isdigit(*t))
- goto bad;
- year = atoi(t);
- if (day < 1 || day > 31 || month < 1 || month > 12)
- goto bad;
- /* Allow two digit years 1969-2068 */
- if (year < 69)
- year += 2000;
- else if (year < 100)
- year += 1900;
- if (year < 1969)
-bad: return (1);
- lt->tm_year = year - 1900;
- lt->tm_mon = month - 1;
- lt->tm_mday = day;
- lt->tm_hour = 0;
- lt->tm_min = 0;
- lt->tm_sec = 0;
- lt->tm_isdst = -1;
- if ((tval = mktime(lt)) < 0)
- return (1);
- *store = tval;
- return (0);
-}
-
-int
-ok_shell(char *name)
-{
- char *p, *sh;
-
- setusershell();
- while ((sh = getusershell())) {
- if (!strcmp(name, sh)) {
- endusershell();
- return (1);
- }
- /* allow just shell name, but use "real" path */
- if ((p = strrchr(sh, '/')) && strcmp(name, p + 1) == 0) {
- endusershell();
- return (1);
- }
- }
- endusershell();
- return (0);
-}
-
-char *
-dup_shell(char *name)
-{
- char *p, *sh, *ret;
-
- setusershell();
- while ((sh = getusershell())) {
- if (!strcmp(name, sh)) {
- endusershell();
- return (strdup(name));
- }
- /* allow just shell name, but use "real" path */
- if ((p = strrchr(sh, '/')) && strcmp(name, p + 1) == 0) {
- ret = strdup(sh);
- endusershell();
- return (ret);
- }
- }
- endusershell();
- return (NULL);
-}
diff --git a/usr.bin/cksum/Makefile b/usr.bin/cksum/Makefile
deleted file mode 100644
index 828900a..0000000
--- a/usr.bin/cksum/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# @(#)Makefile 8.2 (Berkeley) 4/28/95
-# $FreeBSD$
-
-PROG= cksum
-SRCS= cksum.c crc.c print.c sum1.c sum2.c crc32.c
-LINKS= ${BINDIR}/cksum ${BINDIR}/sum
-MLINKS= cksum.1 sum.1
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/cksum/cksum.1 b/usr.bin/cksum/cksum.1
deleted file mode 100644
index d4a0ee7..0000000
--- a/usr.bin/cksum/cksum.1
+++ /dev/null
@@ -1,182 +0,0 @@
-.\" Copyright (c) 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)cksum.1 8.2 (Berkeley) 4/28/95
-.\" $FreeBSD$
-.\"
-.Dd April 28, 1995
-.Dt CKSUM 1
-.Os
-.Sh NAME
-.Nm cksum ,
-.Nm sum
-.Nd display file checksums and block counts
-.Sh SYNOPSIS
-.Nm
-.Op Fl o Ar 1 | 2 | 3
-.Op Ar
-.Nm sum
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility writes to the standard output three whitespace separated
-fields for each input file.
-These fields are a checksum
-.Tn CRC ,
-the total number of octets in the file and the file name.
-If no file name is specified, the standard input is used and no file name
-is written.
-.Pp
-The
-.Nm sum
-utility is identical to the
-.Nm
-utility, except that it defaults to using historic algorithm 1, as
-described below.
-It is provided for compatibility only.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl o
-Use historic algorithms instead of the (superior) default one.
-.Pp
-Algorithm 1 is the algorithm used by historic
-.Bx
-systems as the
-.Xr sum 1
-algorithm and by historic
-.At V
-systems as the
-.Xr sum 1
-algorithm when using the
-.Fl r
-option.
-This is a 16-bit checksum, with a right rotation before each addition;
-overflow is discarded.
-.Pp
-Algorithm 2 is the algorithm used by historic
-.At V
-systems as the
-default
-.Xr sum 1
-algorithm.
-This is a 32-bit checksum, and is defined as follows:
-.Bd -unfilled -offset indent
-s = sum of all bytes;
-r = s % 2^16 + (s % 2^32) / 2^16;
-cksum = (r % 2^16) + r / 2^16;
-.Ed
-.Pp
-Algorithm 3 is what is commonly called the
-.Ql 32bit CRC
-algorithm.
-This is a 32-bit checksum.
-.Pp
-Both algorithm 1 and 2 write to the standard output the same fields as
-the default algorithm except that the size of the file in bytes is
-replaced with the size of the file in blocks.
-For historic reasons, the block size is 1024 for algorithm 1 and 512
-for algorithm 2.
-Partial blocks are rounded up.
-.El
-.Pp
-The default
-.Tn CRC
-used is based on the polynomial used for
-.Tn CRC
-error checking
-in the networking standard
-.St -iso8802-3 .
-The
-.Tn CRC
-checksum encoding is defined by the generating polynomial:
-.Pp
-.Bd -unfilled -offset indent
-G(x) = x^32 + x^26 + x^23 + x^22 + x^16 + x^12 +
- x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1
-.Ed
-.Pp
-Mathematically, the
-.Tn CRC
-value corresponding to a given file is defined by
-the following procedure:
-.Bd -ragged -offset indent
-The
-.Ar n
-bits to be evaluated are considered to be the coefficients of a mod 2
-polynomial M(x) of degree
-.Ar n Ns \-1 .
-These
-.Ar n
-bits are the bits from the file, with the most significant bit being the most
-significant bit of the first octet of the file and the last bit being the least
-significant bit of the last octet, padded with zero bits (if necessary) to
-achieve an integral number of octets, followed by one or more octets
-representing the length of the file as a binary value, least significant octet
-first.
-The smallest number of octets capable of representing this integer are used.
-.Pp
-M(x) is multiplied by x^32 (i.e., shifted left 32 bits) and divided by
-G(x) using mod 2 division, producing a remainder R(x) of degree <= 31.
-.Pp
-The coefficients of R(x) are considered to be a 32-bit sequence.
-.Pp
-The bit sequence is complemented and the result is the CRC.
-.Ed
-.Sh EXIT STATUS
-.Ex -std cksum sum
-.Sh SEE ALSO
-.Xr md5 1
-.Pp
-The default calculation is identical to that given in pseudo-code
-in the following
-.Tn ACM
-article.
-.Rs
-.%T "Computation of Cyclic Redundancy Checks Via Table Lookup"
-.%A Dilip V. Sarwate
-.%J "Communications of the" Tn ACM
-.%D "August 1988"
-.Re
-.Sh STANDARDS
-The
-.Nm
-utility is expected to conform to
-.St -p1003.2-92 .
-.Sh HISTORY
-The
-.Nm
-utility appeared in
-.Bx 4.4 .
diff --git a/usr.bin/cksum/cksum.c b/usr.bin/cksum/cksum.c
deleted file mode 100644
index 67253c1..0000000
--- a/usr.bin/cksum/cksum.c
+++ /dev/null
@@ -1,140 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * James W. Williams of NASA Goddard Space Flight Center.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1991, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)cksum.c 8.2 (Berkeley) 4/28/95";
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <err.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-static void usage(void);
-
-int
-main(int argc, char **argv)
-{
- uint32_t val;
- int ch, fd, rval;
- off_t len;
- char *fn, *p;
- int (*cfncn)(int, uint32_t *, off_t *);
- void (*pfncn)(char *, uint32_t, off_t);
-
- if ((p = rindex(argv[0], '/')) == NULL)
- p = argv[0];
- else
- ++p;
- if (!strcmp(p, "sum")) {
- cfncn = csum1;
- pfncn = psum1;
- ++argv;
- } else {
- cfncn = crc;
- pfncn = pcrc;
-
- while ((ch = getopt(argc, argv, "o:")) != -1)
- switch (ch) {
- case 'o':
- if (!strcmp(optarg, "1")) {
- cfncn = csum1;
- pfncn = psum1;
- } else if (!strcmp(optarg, "2")) {
- cfncn = csum2;
- pfncn = psum2;
- } else if (!strcmp(optarg, "3")) {
- cfncn = crc32;
- pfncn = pcrc;
- } else {
- warnx("illegal argument to -o option");
- usage();
- }
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
- }
-
- fd = STDIN_FILENO;
- fn = NULL;
- rval = 0;
- do {
- if (*argv) {
- fn = *argv++;
- if ((fd = open(fn, O_RDONLY, 0)) < 0) {
- warn("%s", fn);
- rval = 1;
- continue;
- }
- }
- if (cfncn(fd, &val, &len)) {
- warn("%s", fn ? fn : "stdin");
- rval = 1;
- } else
- pfncn(fn, val, len);
- (void)close(fd);
- } while (*argv);
- exit(rval);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "usage: cksum [-o 1 | 2 | 3] [file ...]\n");
- (void)fprintf(stderr, " sum [file ...]\n");
- exit(1);
-}
diff --git a/usr.bin/cksum/crc.c b/usr.bin/cksum/crc.c
deleted file mode 100644
index d1f42f2..0000000
--- a/usr.bin/cksum/crc.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * James W. Williams of NASA Goddard Space Flight Center.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)crc.c 8.1 (Berkeley) 6/17/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <stdint.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-static const uint32_t crctab[] = {
- 0x0,
- 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
- 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6,
- 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
- 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac,
- 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f,
- 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a,
- 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
- 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58,
- 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033,
- 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe,
- 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
- 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4,
- 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
- 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5,
- 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
- 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07,
- 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c,
- 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1,
- 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
- 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b,
- 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698,
- 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d,
- 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
- 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f,
- 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
- 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80,
- 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
- 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a,
- 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629,
- 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c,
- 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
- 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e,
- 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65,
- 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8,
- 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
- 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2,
- 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
- 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74,
- 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
- 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21,
- 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a,
- 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087,
- 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
- 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d,
- 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce,
- 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb,
- 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
- 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09,
- 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
- 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf,
- 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
-};
-
-/*
- * Compute a POSIX 1003.2 checksum. This routine has been broken out so that
- * other programs can use it. It takes a file descriptor to read from and
- * locations to store the crc and the number of bytes read. It returns 0 on
- * success and 1 on failure. Errno is set on failure.
- */
-uint32_t crc_total = ~0; /* The crc over a number of files. */
-
-int
-crc(int fd, uint32_t *cval, off_t *clen)
-{
- uint32_t lcrc;
- int nr;
- off_t len;
- u_char *p;
- u_char buf[16 * 1024];
-
-#define COMPUTE(var, ch) (var) = (var) << 8 ^ crctab[(var) >> 24 ^ (ch)]
-
- lcrc = len = 0;
- crc_total = ~crc_total;
- while ((nr = read(fd, buf, sizeof(buf))) > 0)
- for (len += nr, p = buf; nr--; ++p) {
- COMPUTE(lcrc, *p);
- COMPUTE(crc_total, *p);
- }
- if (nr < 0)
- return (1);
-
- *clen = len;
-
- /* Include the length of the file. */
- for (; len != 0; len >>= 8) {
- COMPUTE(lcrc, len & 0xff);
- COMPUTE(crc_total, len & 0xff);
- }
-
- *cval = ~lcrc;
- crc_total = ~crc_total;
- return (0);
-}
diff --git a/usr.bin/cksum/crc32.c b/usr.bin/cksum/crc32.c
deleted file mode 100644
index cadbc17..0000000
--- a/usr.bin/cksum/crc32.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * This code implements the AUTODIN II polynomial used by Ethernet,
- * and can be used to calculate multicast address hash indices.
- * It assumes that the low order bits will be transmitted first,
- * and consequently the low byte should be sent first when
- * the crc computation is finished. The crc should be complemented
- * before transmission.
- * The variable corresponding to the macro argument "crc" should
- * be an unsigned long and should be preset to all ones for Ethernet
- * use. An error-free packet will leave 0xDEBB20E3 in the crc.
- * Spencer Garrett <srg@quick.com>
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <stdio.h>
-#include <stdint.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-#define CRC(crc, ch) (crc = (crc >> 8) ^ crctab[(crc ^ (ch)) & 0xff])
-
-/* generated using the AUTODIN II polynomial
- * x^32 + x^26 + x^23 + x^22 + x^16 +
- * x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + 1
- */
-static const uint32_t crctab[256] = {
- 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
- 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
- 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
- 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
- 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
- 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
- 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
- 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
- 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
- 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
- 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
- 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
- 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
- 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
- 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
- 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
- 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
- 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
- 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
- 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
- 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
- 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
- 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
- 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
- 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
- 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
- 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
- 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
- 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
- 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
- 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
- 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
- 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
- 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
- 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
- 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
- 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
- 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
- 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
- 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
- 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
- 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
- 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
- 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
- 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
- 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
- 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
- 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
- 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
- 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
- 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
- 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
- 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
- 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
- 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
- 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
- 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
- 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
- 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
- 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
- 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
- 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
- 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
- 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
-};
-
-uint32_t crc32_total = 0;
-
-int
-crc32(int fd, uint32_t *cval, off_t *clen)
-{
- uint32_t lcrc = ~0;
- int nr ;
- off_t len ;
- char buf[BUFSIZ], *p ;
-
- len = 0 ;
- crc32_total = ~crc32_total ;
- while ((nr = read(fd, buf, sizeof(buf))) > 0)
- for (len += nr, p = buf; nr--; ++p) {
- CRC(lcrc, *p) ;
- CRC(crc32_total, *p) ;
- }
- if (nr < 0)
- return 1 ;
-
- *clen = len ;
- *cval = ~lcrc ;
- crc32_total = ~crc32_total ;
- return 0 ;
-}
diff --git a/usr.bin/cksum/extern.h b/usr.bin/cksum/extern.h
deleted file mode 100644
index f2d75de..0000000
--- a/usr.bin/cksum/extern.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#include <sys/cdefs.h>
-
-__BEGIN_DECLS
-int crc(int, uint32_t *, off_t *);
-void pcrc(char *, uint32_t, off_t);
-void psum1(char *, uint32_t, off_t);
-void psum2(char *, uint32_t, off_t);
-int csum1(int, uint32_t *, off_t *);
-int csum2(int, uint32_t *, off_t *);
-int crc32(int, uint32_t *, off_t *);
-__END_DECLS
diff --git a/usr.bin/cksum/print.c b/usr.bin/cksum/print.c
deleted file mode 100644
index 1cc27646..0000000
--- a/usr.bin/cksum/print.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)print.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <stdio.h>
-#include <stdint.h>
-
-#include "extern.h"
-
-void
-pcrc(char *fn, uint32_t val, off_t len)
-{
- (void)printf("%lu %jd", (u_long)val, (intmax_t)len);
- if (fn != NULL)
- (void)printf(" %s", fn);
- (void)printf("\n");
-}
-
-void
-psum1(char *fn, uint32_t val, off_t len)
-{
- (void)printf("%lu %jd", (u_long)val, (intmax_t)(len + 1023) / 1024);
- if (fn != NULL)
- (void)printf(" %s", fn);
- (void)printf("\n");
-}
-
-void
-psum2(char *fn, uint32_t val, off_t len)
-{
- (void)printf("%lu %jd", (u_long)val, (intmax_t)(len + 511) / 512);
- if (fn != NULL)
- (void)printf(" %s", fn);
- (void)printf("\n");
-}
diff --git a/usr.bin/cksum/sum1.c b/usr.bin/cksum/sum1.c
deleted file mode 100644
index 406b40e..0000000
--- a/usr.bin/cksum/sum1.c
+++ /dev/null
@@ -1,76 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)sum1.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <unistd.h>
-#include <stdint.h>
-
-#include "extern.h"
-
-int
-csum1(int fd, uint32_t *cval, off_t *clen)
-{
- int nr;
- u_int lcrc;
- off_t total;
- u_char *p;
- u_char buf[8192];
-
- /*
- * 16-bit checksum, rotating right before each addition;
- * overflow is discarded.
- */
- lcrc = total = 0;
- while ((nr = read(fd, buf, sizeof(buf))) > 0)
- for (total += nr, p = buf; nr--; ++p) {
- if (lcrc & 1)
- lcrc |= 0x10000;
- lcrc = ((lcrc >> 1) + *p) & 0xffff;
- }
- if (nr < 0)
- return (1);
-
- *cval = lcrc;
- *clen = total;
- return (0);
-}
diff --git a/usr.bin/cksum/sum2.c b/usr.bin/cksum/sum2.c
deleted file mode 100644
index c179c62..0000000
--- a/usr.bin/cksum/sum2.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)sum2.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <unistd.h>
-#include <stdint.h>
-
-#include "extern.h"
-
-int
-csum2(int fd, uint32_t *cval, off_t *clen)
-{
- uint32_t lcrc;
- int nr;
- off_t total;
- u_char *p;
- u_char buf[8192];
-
- /*
- * Draft 8 POSIX 1003.2:
- *
- * s = sum of all bytes
- * r = s % 2^16 + (s % 2^32) / 2^16
- * lcrc = (r % 2^16) + r / 2^16
- */
- lcrc = total = 0;
- while ((nr = read(fd, buf, sizeof(buf))) > 0)
- for (total += nr, p = buf; nr--; ++p)
- lcrc += *p;
- if (nr < 0)
- return (1);
-
- lcrc = (lcrc & 0xffff) + (lcrc >> 16);
- lcrc = (lcrc & 0xffff) + (lcrc >> 16);
-
- *cval = lcrc;
- *clen = total;
- return (0);
-}
diff --git a/usr.bin/cmp/Makefile b/usr.bin/cmp/Makefile
deleted file mode 100644
index d93f54b..0000000
--- a/usr.bin/cmp/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= cmp
-SRCS= cmp.c link.c misc.c regular.c special.c
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/cmp/cmp.1 b/usr.bin/cmp/cmp.1
deleted file mode 100644
index 29088aa..0000000
--- a/usr.bin/cmp/cmp.1
+++ /dev/null
@@ -1,126 +0,0 @@
-.\" Copyright (c) 1987, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)cmp.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd December 19, 2006
-.Dt CMP 1
-.Os
-.Sh NAME
-.Nm cmp
-.Nd compare two files
-.Sh SYNOPSIS
-.Nm
-.Op Fl l | s | x
-.Op Fl hz
-.Ar file1 file2
-.Op Ar skip1 Op Ar skip2
-.Sh DESCRIPTION
-The
-.Nm
-utility compares two files of any type and writes the results
-to the standard output.
-By default,
-.Nm
-is silent if the files are the same; if they differ, the byte
-and line number at which the first difference occurred is reported.
-.Pp
-Bytes and lines are numbered beginning with one.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl h
-Do not follow symbolic links.
-.It Fl l
-Print the byte number (decimal) and the differing
-byte values (octal) for each difference.
-.It Fl s
-Print nothing for differing files; return exit
-status only.
-.It Fl x
-Like
-.Fl l
-but prints in hexadecimal and using zero as index
-for the first byte in the files.
-.It Fl z
-For regular files compare file sizes first, and fail the comparison if they
-are not equal.
-.El
-.Pp
-The optional arguments
-.Ar skip1
-and
-.Ar skip2
-are the byte offsets from the beginning of
-.Ar file1
-and
-.Ar file2 ,
-respectively, where the comparison will begin.
-The offset is decimal by default, but may be expressed as a hexadecimal
-or octal value by preceding it with a leading ``0x'' or ``0''.
-.Sh EXIT STATUS
-The
-.Nm
-utility exits with one of the following values:
-.Bl -tag -width 4n
-.It 0
-The files are identical.
-.It 1
-The files are different; this includes the case
-where one file is identical to the first part of
-the other.
-In the latter case, if the
-.Fl s
-option has not been specified,
-.Nm
-writes to standard error that EOF was reached in the shorter
-file (before any differences were found).
-.It >1
-An error occurred.
-.El
-.Sh SEE ALSO
-.Xr diff 1 ,
-.Xr diff3 1
-.Sh STANDARDS
-The
-.Nm
-utility is expected to be
-.St -p1003.2
-compatible.
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v1 .
diff --git a/usr.bin/cmp/cmp.c b/usr.bin/cmp/cmp.c
deleted file mode 100644
index 304aa7de..0000000
--- a/usr.bin/cmp/cmp.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (c) 1987, 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1987, 1990, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)cmp.c 8.3 (Berkeley) 4/2/94";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-int lflag, sflag, xflag, zflag;
-
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- struct stat sb1, sb2;
- off_t skip1, skip2;
- int ch, fd1, fd2, oflag, special;
- const char *file1, *file2;
-
- oflag = O_RDONLY;
- while ((ch = getopt(argc, argv, "hlsxz")) != -1)
- switch (ch) {
- case 'h': /* Don't follow symlinks */
- oflag |= O_NOFOLLOW;
- break;
- case 'l': /* print all differences */
- lflag = 1;
- break;
- case 's': /* silent run */
- sflag = 1;
- zflag = 1;
- break;
- case 'x': /* hex output */
- lflag = 1;
- xflag = 1;
- break;
- case 'z': /* compare size first */
- zflag = 1;
- break;
- case '?':
- default:
- usage();
- }
- argv += optind;
- argc -= optind;
-
- if (lflag && sflag)
- errx(ERR_EXIT, "specifying -s with -l or -x is not permitted");
-
- if (argc < 2 || argc > 4)
- usage();
-
- /* Backward compatibility -- handle "-" meaning stdin. */
- special = 0;
- if (strcmp(file1 = argv[0], "-") == 0) {
- special = 1;
- fd1 = 0;
- file1 = "stdin";
- }
- else if ((fd1 = open(file1, oflag, 0)) < 0 && errno != EMLINK) {
- if (!sflag)
- err(ERR_EXIT, "%s", file1);
- else
- exit(ERR_EXIT);
- }
- if (strcmp(file2 = argv[1], "-") == 0) {
- if (special)
- errx(ERR_EXIT,
- "standard input may only be specified once");
- special = 1;
- fd2 = 0;
- file2 = "stdin";
- }
- else if ((fd2 = open(file2, oflag, 0)) < 0 && errno != EMLINK) {
- if (!sflag)
- err(ERR_EXIT, "%s", file2);
- else
- exit(ERR_EXIT);
- }
-
- skip1 = argc > 2 ? strtol(argv[2], NULL, 0) : 0;
- skip2 = argc == 4 ? strtol(argv[3], NULL, 0) : 0;
-
- if (fd1 == -1) {
- if (fd2 == -1) {
- c_link(file1, skip1, file2, skip2);
- exit(0);
- } else if (!sflag)
- errx(ERR_EXIT, "%s: Not a symbolic link", file2);
- else
- exit(ERR_EXIT);
- } else if (fd2 == -1) {
- if (!sflag)
- errx(ERR_EXIT, "%s: Not a symbolic link", file1);
- else
- exit(ERR_EXIT);
- }
-
- if (!special) {
- if (fstat(fd1, &sb1)) {
- if (!sflag)
- err(ERR_EXIT, "%s", file1);
- else
- exit(ERR_EXIT);
- }
- if (!S_ISREG(sb1.st_mode))
- special = 1;
- else {
- if (fstat(fd2, &sb2)) {
- if (!sflag)
- err(ERR_EXIT, "%s", file2);
- else
- exit(ERR_EXIT);
- }
- if (!S_ISREG(sb2.st_mode))
- special = 1;
- }
- }
-
- if (special)
- c_special(fd1, file1, skip1, fd2, file2, skip2);
- else {
- if (zflag && sb1.st_size != sb2.st_size) {
- if (!sflag)
- (void) printf("%s %s differ: size\n",
- file1, file2);
- exit(DIFF_EXIT);
- }
- c_regular(fd1, file1, skip1, sb1.st_size,
- fd2, file2, skip2, sb2.st_size);
- }
- exit(0);
-}
-
-static void
-usage(void)
-{
-
- (void)fprintf(stderr,
- "usage: cmp [-l | -s | -x] [-hz] file1 file2 [skip1 [skip2]]\n");
- exit(ERR_EXIT);
-}
diff --git a/usr.bin/cmp/extern.h b/usr.bin/cmp/extern.h
deleted file mode 100644
index 1dd1c82..0000000
--- a/usr.bin/cmp/extern.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.3 (Berkeley) 4/2/94
- *
- * $FreeBSD$
- *
- */
-
-#define OK_EXIT 0
-#define DIFF_EXIT 1
-#define ERR_EXIT 2 /* error exit code */
-
-void c_link(const char *, off_t, const char *, off_t);
-void c_regular(int, const char *, off_t, off_t, int, const char *, off_t, off_t);
-void c_special(int, const char *, off_t, int, const char *, off_t);
-void diffmsg(const char *, const char *, off_t, off_t);
-void eofmsg(const char *);
-
-extern int lflag, sflag, xflag;
diff --git a/usr.bin/cmp/link.c b/usr.bin/cmp/link.c
deleted file mode 100644
index fe45def..0000000
--- a/usr.bin/cmp/link.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*-
- * Copyright (c) 2005 Brian Somers <brian@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <err.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-void
-c_link(const char *file1, off_t skip1, const char *file2, off_t skip2)
-{
- char buf1[PATH_MAX], *p1;
- char buf2[PATH_MAX], *p2;
- int dfound, len1, len2;
- off_t byte;
- u_char ch;
-
- if ((len1 = readlink(file1, buf1, sizeof(buf1) - 1)) < 0) {
- if (!sflag)
- err(ERR_EXIT, "%s", file1);
- else
- exit(ERR_EXIT);
- }
-
- if ((len2 = readlink(file2, buf2, sizeof(buf2) - 1)) < 0) {
- if (!sflag)
- err(ERR_EXIT, "%s", file2);
- else
- exit(ERR_EXIT);
- }
-
- if (skip1 > len1)
- skip1 = len1;
- buf1[len1] = '\0';
-
- if (skip2 > len2)
- skip2 = len2;
- buf2[len2] = '\0';
-
- dfound = 0;
- byte = 1;
- for (p1 = buf1 + skip1, p2 = buf2 + skip2; *p1 && *p2; p1++, p2++) {
- if ((ch = *p1) != *p2) {
- if (xflag) {
- dfound = 1;
- (void)printf("%08llx %02x %02x\n",
- (long long)byte - 1, ch, *p2);
- } else if (lflag) {
- dfound = 1;
- (void)printf("%6lld %3o %3o\n",
- (long long)byte, ch, *p2);
- } else
- diffmsg(file1, file2, byte, 1);
- /* NOTREACHED */
- }
- byte++;
- }
-
- if (*p1 || *p2)
- eofmsg (*p1 ? file2 : file1);
- if (dfound)
- exit(DIFF_EXIT);
-}
diff --git a/usr.bin/cmp/misc.c b/usr.bin/cmp/misc.c
deleted file mode 100644
index 53c6a9b..0000000
--- a/usr.bin/cmp/misc.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)misc.c 8.3 (Berkeley) 4/2/94";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "extern.h"
-
-void
-eofmsg(const char *file)
-{
- if (!sflag)
- warnx("EOF on %s", file);
- exit(DIFF_EXIT);
-}
-
-void
-diffmsg(const char *file1, const char *file2, off_t byte, off_t line)
-{
- if (!sflag)
- (void)printf("%s %s differ: char %lld, line %lld\n",
- file1, file2, (long long)byte, (long long)line);
- exit(DIFF_EXIT);
-}
diff --git a/usr.bin/cmp/regular.c b/usr.bin/cmp/regular.c
deleted file mode 100644
index 814d933..0000000
--- a/usr.bin/cmp/regular.c
+++ /dev/null
@@ -1,178 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)regular.c 8.3 (Berkeley) 4/2/94";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <errno.h>
-#include <limits.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-static u_char *remmap(u_char *, int, off_t);
-static void segv_handler(int);
-#define MMAP_CHUNK (8*1024*1024)
-
-#define ROUNDPAGE(i) ((i) & ~pagemask)
-
-void
-c_regular(int fd1, const char *file1, off_t skip1, off_t len1,
- int fd2, const char *file2, off_t skip2, off_t len2)
-{
- u_char ch, *p1, *p2, *m1, *m2, *e1, *e2;
- off_t byte, length, line;
- int dfound;
- off_t pagemask, off1, off2;
- size_t pagesize;
- struct sigaction act, oact;
-
- if (skip1 > len1)
- eofmsg(file1);
- len1 -= skip1;
- if (skip2 > len2)
- eofmsg(file2);
- len2 -= skip2;
-
- if (sflag && len1 != len2)
- exit(DIFF_EXIT);
-
- sigemptyset(&act.sa_mask);
- act.sa_flags = SA_NODEFER;
- act.sa_handler = segv_handler;
- if (sigaction(SIGSEGV, &act, &oact))
- err(ERR_EXIT, "sigaction()");
-
- pagesize = getpagesize();
- pagemask = (off_t)pagesize - 1;
- off1 = ROUNDPAGE(skip1);
- off2 = ROUNDPAGE(skip2);
-
- length = MIN(len1, len2);
-
- if ((m1 = remmap(NULL, fd1, off1)) == NULL) {
- c_special(fd1, file1, skip1, fd2, file2, skip2);
- return;
- }
-
- if ((m2 = remmap(NULL, fd2, off2)) == NULL) {
- munmap(m1, MMAP_CHUNK);
- c_special(fd1, file1, skip1, fd2, file2, skip2);
- return;
- }
-
- dfound = 0;
- e1 = m1 + MMAP_CHUNK;
- e2 = m2 + MMAP_CHUNK;
- p1 = m1 + (skip1 - off1);
- p2 = m2 + (skip2 - off2);
-
- for (byte = line = 1; length--; ++byte) {
- if ((ch = *p1) != *p2) {
- if (xflag) {
- dfound = 1;
- (void)printf("%08llx %02x %02x\n",
- (long long)byte - 1, ch, *p2);
- } else if (lflag) {
- dfound = 1;
- (void)printf("%6lld %3o %3o\n",
- (long long)byte, ch, *p2);
- } else
- diffmsg(file1, file2, byte, line);
- /* NOTREACHED */
- }
- if (ch == '\n')
- ++line;
- if (++p1 == e1) {
- off1 += MMAP_CHUNK;
- if ((p1 = m1 = remmap(m1, fd1, off1)) == NULL) {
- munmap(m2, MMAP_CHUNK);
- err(ERR_EXIT, "remmap %s", file1);
- }
- e1 = m1 + MMAP_CHUNK;
- }
- if (++p2 == e2) {
- off2 += MMAP_CHUNK;
- if ((p2 = m2 = remmap(m2, fd2, off2)) == NULL) {
- munmap(m1, MMAP_CHUNK);
- err(ERR_EXIT, "remmap %s", file2);
- }
- e2 = m2 + MMAP_CHUNK;
- }
- }
- munmap(m1, MMAP_CHUNK);
- munmap(m2, MMAP_CHUNK);
-
- if (sigaction(SIGSEGV, &oact, NULL))
- err(ERR_EXIT, "sigaction()");
-
- if (len1 != len2)
- eofmsg (len1 > len2 ? file2 : file1);
- if (dfound)
- exit(DIFF_EXIT);
-}
-
-static u_char *
-remmap(u_char *mem, int fd, off_t offset)
-{
- if (mem != NULL)
- munmap(mem, MMAP_CHUNK);
- mem = mmap(NULL, MMAP_CHUNK, PROT_READ, MAP_SHARED, fd, offset);
- if (mem == MAP_FAILED)
- return (NULL);
- madvise(mem, MMAP_CHUNK, MADV_SEQUENTIAL);
- return (mem);
-}
-
-static void
-segv_handler(int sig __unused) {
- static const char msg[] = "cmp: Input/output error (caught SIGSEGV)\n";
-
- write(STDERR_FILENO, msg, sizeof(msg));
- _exit(EXIT_FAILURE);
-}
diff --git a/usr.bin/cmp/special.c b/usr.bin/cmp/special.c
deleted file mode 100644
index bbe3cb1..0000000
--- a/usr.bin/cmp/special.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)special.c 8.3 (Berkeley) 4/2/94";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <err.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "extern.h"
-
-void
-c_special(int fd1, const char *file1, off_t skip1,
- int fd2, const char *file2, off_t skip2)
-{
- int ch1, ch2;
- off_t byte, line;
- FILE *fp1, *fp2;
- int dfound;
-
- if ((fp1 = fdopen(fd1, "r")) == NULL)
- err(ERR_EXIT, "%s", file1);
- if ((fp2 = fdopen(fd2, "r")) == NULL)
- err(ERR_EXIT, "%s", file2);
-
- dfound = 0;
- while (skip1--)
- if (getc(fp1) == EOF)
- goto eof;
- while (skip2--)
- if (getc(fp2) == EOF)
- goto eof;
-
- for (byte = line = 1;; ++byte) {
- ch1 = getc(fp1);
- ch2 = getc(fp2);
- if (ch1 == EOF || ch2 == EOF)
- break;
- if (ch1 != ch2) {
- if (xflag) {
- dfound = 1;
- (void)printf("%08llx %02x %02x\n",
- (long long)byte - 1, ch1, ch2);
- } else if (lflag) {
- dfound = 1;
- (void)printf("%6lld %3o %3o\n",
- (long long)byte, ch1, ch2);
- } else {
- diffmsg(file1, file2, byte, line);
- /* NOTREACHED */
- }
- }
- if (ch1 == '\n')
- ++line;
- }
-
-eof: if (ferror(fp1))
- err(ERR_EXIT, "%s", file1);
- if (ferror(fp2))
- err(ERR_EXIT, "%s", file2);
- if (feof(fp1)) {
- if (!feof(fp2))
- eofmsg(file1);
- } else
- if (feof(fp2))
- eofmsg(file2);
- if (dfound)
- exit(DIFF_EXIT);
-}
diff --git a/usr.bin/col/Makefile b/usr.bin/col/Makefile
deleted file mode 100644
index 8e3a959..0000000
--- a/usr.bin/col/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= col
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/col/README b/usr.bin/col/README
deleted file mode 100644
index 116a044..0000000
--- a/usr.bin/col/README
+++ /dev/null
@@ -1,48 +0,0 @@
-# @(#)README 8.1 (Berkeley) 6/6/93
-#
-# $FreeBSD$
-
-col - filter out reverse line feeds.
-
-Options are:
- -b do not print any backspaces (last character written is printed)
- -f allow half line feeds in output, by default characters between
- lines are pushed to the line below
- -p force unknown control sequences to be passed through unchanged
- -x do not compress spaces into tabs.
- -l num keep (at least) num lines in memory, 128 are kept by default
-
-In the 32V source code to col(1) the default behavior was to NOT compress
-spaces into tabs. There was a -h option which caused it to compress spaces
-into tabs. There was no -x flag.
-
-The 32V documentation, however, was consistent with the SVID (actually, V7
-at the time) and documented a -x flag (as defined above) while making no
-mention of a -h flag. Just before 4.3BSD went out, CSRG updated the manual
-page to reflect the way the code worked. Suspecting that this was probably
-the wrong way to go, this version adopts the SVID defaults, and no longer
-documents the -h option.
-
-Known differences between AT&T's col and this one (# is delimiter):
- Input AT&T col this col
- #\nabc\E7def\n# # def\nabc\r# # def\nabc\n#
- #a# ## #a\n#
- - last line always ends with at least one \n (or \E9)
- #1234567 8\n# #1234567\t8\n# #1234567 8\n#
- - single space not expanded to tab
- -f #a\E8b\n# #ab\n# # b\E9\ra\n#
- - can back up past first line (as far as you want) so you
- *can* have a super script on the first line
- #\E9_\ba\E8\nb\n# #\n_\bb\ba\n# #\n_\ba\bb\n#
- - always print last character written to a position,
- AT&T col claims to do this but doesn't.
-
-If a character is to be placed on a line that has been flushed, a warning
-is produced (the AT&T col is silent). The -l flag (not in AT&T col) can
-be used to increase the number of lines buffered to avoid the problem.
-
-General algorithm: a limited number of lines are buffered in a linked
-list. When a printable character is read, it is put in the buffer of
-the current line along with the column it's supposed to be in. When
-a line is flushed, the characters in the line are sorted according to
-column and then printed.
diff --git a/usr.bin/col/col.1 b/usr.bin/col/col.1
deleted file mode 100644
index 3197c02..0000000
--- a/usr.bin/col/col.1
+++ /dev/null
@@ -1,156 +0,0 @@
-.\" Copyright (c) 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Michael Rendell.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)col.1 8.1 (Berkeley) 6/29/93
-.\" $FreeBSD$
-.\"
-.Dd August 4, 2004
-.Dt COL 1
-.Os
-.Sh NAME
-.Nm col
-.Nd filter reverse line feeds from input
-.Sh SYNOPSIS
-.Nm
-.Op Fl bfhpx
-.Op Fl l Ar num
-.Sh DESCRIPTION
-The
-.Nm
-utility filters out reverse (and half reverse) line feeds so that the output is
-in the correct order with only forward and half forward line
-feeds, and replaces white-space characters with tabs where possible.
-This can be useful in processing the output of
-.Xr nroff 1
-and
-.Xr tbl 1 .
-.Pp
-The
-.Nm
-utility reads from the standard input and writes to the standard output.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl b
-Do not output any backspaces, printing only the last character
-written to each column position.
-.It Fl f
-Forward half line feeds are permitted (``fine'' mode).
-Normally characters printed on a half line boundary are printed
-on the following line.
-.It Fl h
-Do not output multiple spaces instead of tabs (default).
-.It Fl l Ar num
-Buffer at least
-.Ar num
-lines in memory.
-By default, 128 lines are buffered.
-.It Fl p
-Force unknown control sequences to be passed through unchanged.
-Normally,
-.Nm
-will filter out any control sequences from the input other than those
-recognized and interpreted by itself, which are listed below.
-.It Fl x
-Output multiple spaces instead of tabs.
-.El
-.Pp
-The control sequences for carriage motion that
-.Nm
-understands and their decimal values are listed in the following
-table:
-.Pp
-.Bl -tag -width "carriage return" -compact
-.It ESC\-7
-reverse line feed (escape then 7)
-.It ESC\-8
-half reverse line feed (escape then 8)
-.It ESC\-9
-half forward line feed (escape then 9)
-.It backspace
-moves back one column (8); ignored in the first column
-.It carriage return
-(13)
-.It newline
-forward line feed (10); also does carriage return
-.It shift in
-shift to normal character set (15)
-.It shift out
-shift to alternate character set (14)
-.It space
-moves forward one column (32)
-.It tab
-moves forward to next tab stop (9)
-.It vertical tab
-reverse line feed (11)
-.El
-.Pp
-All unrecognized control characters and escape sequences are
-discarded.
-.Pp
-The
-.Nm
-utility keeps track of the character set as characters are read and makes
-sure the character set is correct when they are output.
-.Pp
-If the input attempts to back up to the last flushed line,
-.Nm
-will display a warning message.
-.Sh ENVIRONMENT
-The
-.Ev LANG , LC_ALL
-and
-.Ev LC_CTYPE
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr colcrt 1 ,
-.Xr expand 1 ,
-.Xr nroff 1 ,
-.Xr tbl 1
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -susv2 .
-.Sh HISTORY
-A
-.Nm
-command
-appeared in
-.At v6 .
diff --git a/usr.bin/col/col.c b/usr.bin/col/col.c
deleted file mode 100644
index 8b45ba6..0000000
--- a/usr.bin/col/col.c
+++ /dev/null
@@ -1,552 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Michael Rendell of the Memorial University of Newfoundland.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1990, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)col.c 8.5 (Berkeley) 5/4/95";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-#include <wctype.h>
-
-#define BS '\b' /* backspace */
-#define TAB '\t' /* tab */
-#define SPACE ' ' /* space */
-#define NL '\n' /* newline */
-#define CR '\r' /* carriage return */
-#define ESC '\033' /* escape */
-#define SI '\017' /* shift in to normal character set */
-#define SO '\016' /* shift out to alternate character set */
-#define VT '\013' /* vertical tab (aka reverse line feed) */
-#define RLF '\007' /* ESC-07 reverse line feed */
-#define RHLF '\010' /* ESC-010 reverse half-line feed */
-#define FHLF '\011' /* ESC-011 forward half-line feed */
-
-/* build up at least this many lines before flushing them out */
-#define BUFFER_MARGIN 32
-
-typedef char CSET;
-
-typedef struct char_str {
-#define CS_NORMAL 1
-#define CS_ALTERNATE 2
- short c_column; /* column character is in */
- CSET c_set; /* character set (currently only 2) */
- wchar_t c_char; /* character in question */
- int c_width; /* character width */
-} CHAR;
-
-typedef struct line_str LINE;
-struct line_str {
- CHAR *l_line; /* characters on the line */
- LINE *l_prev; /* previous line */
- LINE *l_next; /* next line */
- int l_lsize; /* allocated sizeof l_line */
- int l_line_len; /* strlen(l_line) */
- int l_needs_sort; /* set if chars went in out of order */
- int l_max_col; /* max column in the line */
-};
-
-LINE *alloc_line(void);
-void dowarn(int);
-void flush_line(LINE *);
-void flush_lines(int);
-void flush_blanks(void);
-void free_line(LINE *);
-void usage(void);
-
-CSET last_set; /* char_set of last char printed */
-LINE *lines;
-int compress_spaces; /* if doing space -> tab conversion */
-int fine; /* if `fine' resolution (half lines) */
-int max_bufd_lines; /* max # lines to keep in memory */
-int nblank_lines; /* # blanks after last flushed line */
-int no_backspaces; /* if not to output any backspaces */
-int pass_unknown_seqs; /* pass unknown control sequences */
-
-#define PUTC(ch) \
- do { \
- if (putwchar(ch) == WEOF) \
- errx(1, "write error"); \
- } while (0)
-
-int
-main(int argc, char **argv)
-{
- wint_t ch;
- CHAR *c;
- CSET cur_set; /* current character set */
- LINE *l; /* current line */
- int extra_lines; /* # of lines above first line */
- int cur_col; /* current column */
- int cur_line; /* line number of current position */
- int max_line; /* max value of cur_line */
- int this_line; /* line l points to */
- int nflushd_lines; /* number of lines that were flushed */
- int adjust, opt, warned, width;
-
- (void)setlocale(LC_CTYPE, "");
-
- max_bufd_lines = 128;
- compress_spaces = 1; /* compress spaces into tabs */
- while ((opt = getopt(argc, argv, "bfhl:px")) != -1)
- switch (opt) {
- case 'b': /* do not output backspaces */
- no_backspaces = 1;
- break;
- case 'f': /* allow half forward line feeds */
- fine = 1;
- break;
- case 'h': /* compress spaces into tabs */
- compress_spaces = 1;
- break;
- case 'l': /* buffered line count */
- if ((max_bufd_lines = atoi(optarg)) <= 0)
- errx(1, "bad -l argument %s", optarg);
- break;
- case 'p': /* pass unknown control sequences */
- pass_unknown_seqs = 1;
- break;
- case 'x': /* do not compress spaces into tabs */
- compress_spaces = 0;
- break;
- case '?':
- default:
- usage();
- }
-
- if (optind != argc)
- usage();
-
- /* this value is in half lines */
- max_bufd_lines *= 2;
-
- adjust = cur_col = extra_lines = warned = 0;
- cur_line = max_line = nflushd_lines = this_line = 0;
- cur_set = last_set = CS_NORMAL;
- lines = l = alloc_line();
-
- while ((ch = getwchar()) != WEOF) {
- if (!iswgraph(ch)) {
- switch (ch) {
- case BS: /* can't go back further */
- if (cur_col == 0)
- continue;
- --cur_col;
- continue;
- case CR:
- cur_col = 0;
- continue;
- case ESC: /* just ignore EOF */
- switch(getwchar()) {
- case RLF:
- cur_line -= 2;
- break;
- case RHLF:
- cur_line--;
- break;
- case FHLF:
- cur_line++;
- if (cur_line > max_line)
- max_line = cur_line;
- }
- continue;
- case NL:
- cur_line += 2;
- if (cur_line > max_line)
- max_line = cur_line;
- cur_col = 0;
- continue;
- case SPACE:
- ++cur_col;
- continue;
- case SI:
- cur_set = CS_NORMAL;
- continue;
- case SO:
- cur_set = CS_ALTERNATE;
- continue;
- case TAB: /* adjust column */
- cur_col |= 7;
- ++cur_col;
- continue;
- case VT:
- cur_line -= 2;
- continue;
- }
- if (iswspace(ch)) {
- if ((width = wcwidth(ch)) > 0)
- cur_col += width;
- continue;
- }
- if (!pass_unknown_seqs)
- continue;
- }
-
- /* Must stuff ch in a line - are we at the right one? */
- if (cur_line != this_line - adjust) {
- LINE *lnew;
- int nmove;
-
- adjust = 0;
- nmove = cur_line - this_line;
- if (!fine) {
- /* round up to next line */
- if (cur_line & 1) {
- adjust = 1;
- nmove++;
- }
- }
- if (nmove < 0) {
- for (; nmove < 0 && l->l_prev; nmove++)
- l = l->l_prev;
- if (nmove) {
- if (nflushd_lines == 0) {
- /*
- * Allow backup past first
- * line if nothing has been
- * flushed yet.
- */
- for (; nmove < 0; nmove++) {
- lnew = alloc_line();
- l->l_prev = lnew;
- lnew->l_next = l;
- l = lines = lnew;
- extra_lines++;
- }
- } else {
- if (!warned++)
- dowarn(cur_line);
- cur_line -= nmove;
- }
- }
- } else {
- /* may need to allocate here */
- for (; nmove > 0 && l->l_next; nmove--)
- l = l->l_next;
- for (; nmove > 0; nmove--) {
- lnew = alloc_line();
- lnew->l_prev = l;
- l->l_next = lnew;
- l = lnew;
- }
- }
- this_line = cur_line + adjust;
- nmove = this_line - nflushd_lines;
- if (nmove >= max_bufd_lines + BUFFER_MARGIN) {
- nflushd_lines += nmove - max_bufd_lines;
- flush_lines(nmove - max_bufd_lines);
- }
- }
- /* grow line's buffer? */
- if (l->l_line_len + 1 >= l->l_lsize) {
- int need;
-
- need = l->l_lsize ? l->l_lsize * 2 : 90;
- if ((l->l_line = realloc(l->l_line,
- (unsigned)need * sizeof(CHAR))) == NULL)
- err(1, (char *)NULL);
- l->l_lsize = need;
- }
- c = &l->l_line[l->l_line_len++];
- c->c_char = ch;
- c->c_set = cur_set;
- c->c_column = cur_col;
- c->c_width = wcwidth(ch);
- /*
- * If things are put in out of order, they will need sorting
- * when it is flushed.
- */
- if (cur_col < l->l_max_col)
- l->l_needs_sort = 1;
- else
- l->l_max_col = cur_col;
- if (c->c_width > 0)
- cur_col += c->c_width;
- }
- if (ferror(stdin))
- err(1, NULL);
- if (max_line == 0)
- exit(0); /* no lines, so just exit */
-
- /* goto the last line that had a character on it */
- for (; l->l_next; l = l->l_next)
- this_line++;
- flush_lines(this_line - nflushd_lines + extra_lines + 1);
-
- /* make sure we leave things in a sane state */
- if (last_set != CS_NORMAL)
- PUTC('\017');
-
- /* flush out the last few blank lines */
- nblank_lines = max_line - this_line;
- if (max_line & 1)
- nblank_lines++;
- else if (!nblank_lines)
- /* missing a \n on the last line? */
- nblank_lines = 2;
- flush_blanks();
- exit(0);
-}
-
-void
-flush_lines(int nflush)
-{
- LINE *l;
-
- while (--nflush >= 0) {
- l = lines;
- lines = l->l_next;
- if (l->l_line) {
- flush_blanks();
- flush_line(l);
- }
- nblank_lines++;
- if (l->l_line)
- (void)free(l->l_line);
- free_line(l);
- }
- if (lines)
- lines->l_prev = NULL;
-}
-
-/*
- * Print a number of newline/half newlines. If fine flag is set, nblank_lines
- * is the number of half line feeds, otherwise it is the number of whole line
- * feeds.
- */
-void
-flush_blanks(void)
-{
- int half, i, nb;
-
- half = 0;
- nb = nblank_lines;
- if (nb & 1) {
- if (fine)
- half = 1;
- else
- nb++;
- }
- nb /= 2;
- for (i = nb; --i >= 0;)
- PUTC('\n');
- if (half) {
- PUTC('\033');
- PUTC('9');
- if (!nb)
- PUTC('\r');
- }
- nblank_lines = 0;
-}
-
-/*
- * Write a line to stdout taking care of space to tab conversion (-h flag)
- * and character set shifts.
- */
-void
-flush_line(LINE *l)
-{
- CHAR *c, *endc;
- int i, j, nchars, last_col, save, this_col, tot;
-
- last_col = 0;
- nchars = l->l_line_len;
-
- if (l->l_needs_sort) {
- static CHAR *sorted;
- static int count_size, *count, sorted_size;
-
- /*
- * Do an O(n) sort on l->l_line by column being careful to
- * preserve the order of characters in the same column.
- */
- if (l->l_lsize > sorted_size) {
- sorted_size = l->l_lsize;
- if ((sorted = realloc(sorted,
- (unsigned)sizeof(CHAR) * sorted_size)) == NULL)
- err(1, (char *)NULL);
- }
- if (l->l_max_col >= count_size) {
- count_size = l->l_max_col + 1;
- if ((count = realloc(count,
- (unsigned)sizeof(int) * count_size)) == NULL)
- err(1, (char *)NULL);
- }
- memset(count, 0, sizeof(int) * l->l_max_col + 1);
- for (i = nchars, c = l->l_line; --i >= 0; c++)
- count[c->c_column]++;
-
- /*
- * calculate running total (shifted down by 1) to use as
- * indices into new line.
- */
- for (tot = 0, i = 0; i <= l->l_max_col; i++) {
- save = count[i];
- count[i] = tot;
- tot += save;
- }
-
- for (i = nchars, c = l->l_line; --i >= 0; c++)
- sorted[count[c->c_column]++] = *c;
- c = sorted;
- } else
- c = l->l_line;
- while (nchars > 0) {
- this_col = c->c_column;
- endc = c;
- do {
- ++endc;
- } while (--nchars > 0 && this_col == endc->c_column);
-
- /* if -b only print last character */
- if (no_backspaces) {
- c = endc - 1;
- if (nchars > 0 &&
- this_col + c->c_width > endc->c_column)
- continue;
- }
-
- if (this_col > last_col) {
- int nspace = this_col - last_col;
-
- if (compress_spaces && nspace > 1) {
- while (1) {
- int tab_col, tab_size;;
-
- tab_col = (last_col + 8) & ~7;
- if (tab_col > this_col)
- break;
- tab_size = tab_col - last_col;
- if (tab_size == 1)
- PUTC(' ');
- else
- PUTC('\t');
- nspace -= tab_size;
- last_col = tab_col;
- }
- }
- while (--nspace >= 0)
- PUTC(' ');
- last_col = this_col;
- }
-
- for (;;) {
- if (c->c_set != last_set) {
- switch (c->c_set) {
- case CS_NORMAL:
- PUTC('\017');
- break;
- case CS_ALTERNATE:
- PUTC('\016');
- }
- last_set = c->c_set;
- }
- PUTC(c->c_char);
- if ((c + 1) < endc)
- for (j = 0; j < c->c_width; j++)
- PUTC('\b');
- if (++c >= endc)
- break;
- }
- last_col += (c - 1)->c_width;
- }
-}
-
-#define NALLOC 64
-
-static LINE *line_freelist;
-
-LINE *
-alloc_line(void)
-{
- LINE *l;
- int i;
-
- if (!line_freelist) {
- if ((l = realloc(NULL, sizeof(LINE) * NALLOC)) == NULL)
- err(1, (char *)NULL);
- line_freelist = l;
- for (i = 1; i < NALLOC; i++, l++)
- l->l_next = l + 1;
- l->l_next = NULL;
- }
- l = line_freelist;
- line_freelist = l->l_next;
-
- memset(l, 0, sizeof(LINE));
- return (l);
-}
-
-void
-free_line(LINE *l)
-{
-
- l->l_next = line_freelist;
- line_freelist = l;
-}
-
-void
-usage(void)
-{
-
- (void)fprintf(stderr, "usage: col [-bfhpx] [-l nline]\n");
- exit(1);
-}
-
-void
-dowarn(int line)
-{
-
- warnx("warning: can't back up %s",
- line < 0 ? "past first line" : "-- line already flushed");
-}
diff --git a/usr.bin/colcrt/Makefile b/usr.bin/colcrt/Makefile
deleted file mode 100644
index 87d96ca..0000000
--- a/usr.bin/colcrt/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= colcrt
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/colcrt/colcrt.1 b/usr.bin/colcrt/colcrt.1
deleted file mode 100644
index a4a727e..0000000
--- a/usr.bin/colcrt/colcrt.1
+++ /dev/null
@@ -1,124 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)colcrt.1 8.1 (Berkeley) 6/30/93
-.\" $FreeBSD$
-.\"
-.Dd July 31, 2004
-.Dt COLCRT 1
-.Os
-.Sh NAME
-.Nm colcrt
-.Nd filter nroff output for CRT previewing
-.Sh SYNOPSIS
-.Nm
-.Op Fl
-.Op Fl \&2
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility provides virtual half-line and reverse line feed sequences
-for terminals without such capability, and on which overstriking
-is destructive.
-Half-line characters and underlining (changed to dashing `\-')
-are placed on new lines in between the normal output lines.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl
-Suppress all underlining.
-This option is especially useful for previewing
-.Em allboxed
-tables from
-.Xr tbl 1 .
-.It Fl 2
-Cause all half-lines to be printed, effectively double spacing the output.
-Normally, a minimal space output format is used which will suppress empty
-lines.
-The program never suppresses two consecutive empty lines, however.
-The
-.Fl 2
-option is useful for sending output to the line printer when the output
-contains superscripts and subscripts which would otherwise be invisible.
-.El
-.Sh ENVIRONMENT
-The
-.Ev LANG , LC_ALL
-and
-.Ev LC_CTYPE
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Sh EXIT STATUS
-.Ex -std
-.Sh EXAMPLES
-A typical use of
-.Nm
-would be
-.Bd -literal
-tbl exum2.n \&| nroff \-ms \&| colcrt \- \&| more
-.Ed
-.Sh SEE ALSO
-.Xr col 1 ,
-.Xr more 1 ,
-.Xr nroff 1 ,
-.Xr troff 1 ,
-.Xr ul 1
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3.0 .
-.Sh BUGS
-Should fold underlines onto blanks even with the
-.Sq Fl
-option so that
-a true underline character would show.
-.Pp
-Cannot back up more than 102 lines.
-.Pp
-General overstriking is lost;
-as a special case
-.Ql \&|
-overstruck with
-.Ql \-
-or underline becomes
-.Ql \&+ .
-.Pp
-Lines are trimmed to 132 characters.
-.Pp
-Some provision should be made for processing superscripts and subscripts
-in documents which are already double-spaced.
-.Pp
-Characters that take up more than one column position may not be
-underlined correctly.
diff --git a/usr.bin/colcrt/colcrt.c b/usr.bin/colcrt/colcrt.c
deleted file mode 100644
index 2ba4f39..0000000
--- a/usr.bin/colcrt/colcrt.c
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)colcrt.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-
-/*
- * colcrt - replaces col for crts with new nroff esp. when using tbl.
- * Bill Joy UCB July 14, 1977
- *
- * This filter uses a screen buffer, 267 half-lines by 132 columns.
- * It interprets the up and down sequences generated by the new
- * nroff when used with tbl and by \u \d and \r.
- * General overstriking doesn't work correctly.
- * Underlining is split onto multiple lines, etc.
- *
- * Option - suppresses all underlining.
- * Option -2 forces printing of all half lines.
- */
-
-wchar_t page[267][132];
-
-int outline = 1;
-int outcol;
-
-char suppresul;
-char printall;
-
-static void move(int, int);
-static void pflush(int);
-static int plus(wchar_t, wchar_t);
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- wint_t c;
- wchar_t *cp, *dp;
- int ch, i, w;
-
- setlocale(LC_ALL, "");
-
- while ((ch = getopt(argc, argv, "-2")) != -1)
- switch (ch) {
- case '-':
- suppresul = 1;
- break;
- case '2':
- printall = 1;
- break;
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- do {
- if (argc > 0) {
- if (freopen(argv[0], "r", stdin) == NULL) {
- fflush(stdout);
- err(1, "%s", argv[0]);
- }
- argc--;
- argv++;
- }
- for (;;) {
- c = getwc(stdin);
- if (c == WEOF) {
- pflush(outline);
- fflush(stdout);
- break;
- }
- switch (c) {
- case '\n':
- if (outline >= 265)
- pflush(62);
- outline += 2;
- outcol = 0;
- continue;
- case '\016':
- case '\017':
- continue;
- case 033:
- c = getwc(stdin);
- switch (c) {
- case '9':
- if (outline >= 266)
- pflush(62);
- outline++;
- continue;
- case '8':
- if (outline >= 1)
- outline--;
- continue;
- case '7':
- outline -= 2;
- if (outline < 0)
- outline = 0;
- continue;
- default:
- continue;
- }
- case '\b':
- if (outcol)
- outcol--;
- continue;
- case '\t':
- outcol += 8;
- outcol &= ~7;
- outcol--;
- c = ' ';
- default:
- if ((w = wcwidth(c)) <= 0)
- w = 1; /* XXX */
- if (outcol + w > 132) {
- outcol += w;
- continue;
- }
- cp = &page[outline][outcol];
- outcol += w;
- if (c == '_') {
- if (suppresul)
- continue;
- cp += 132;
- c = '-';
- }
- if (*cp == 0) {
- for (i = 0; i < w; i++)
- cp[i] = c;
- dp = cp - (outcol - w);
- for (cp--; cp >= dp && *cp == 0; cp--)
- *cp = ' ';
- } else {
- if (plus(c, *cp) || plus(*cp, c))
- *cp = '+';
- else if (*cp == ' ' || *cp == 0) {
- for (i = 1; i < w; i++)
- if (cp[i] != ' ' &&
- cp[i] != 0)
- goto cont;
- for (i = 0; i < w; i++)
- cp[i] = c;
- }
- }
-cont:
- continue;
- }
- }
- if (ferror(stdin))
- err(1, NULL);
- } while (argc > 0);
- fflush(stdout);
- exit(0);
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: colcrt [-] [-2] [file ...]\n");
- exit(1);
-}
-
-static int
-plus(wchar_t c, wchar_t d)
-{
-
- return ((c == '|' && d == '-') || d == '_');
-}
-
-static void
-pflush(int ol)
-{
- static int first;
- int i;
- wchar_t *cp;
- char lastomit;
- int l, w;
-
- l = ol;
- lastomit = 0;
- if (l > 266)
- l = 266;
- else
- l |= 1;
- for (i = first | 1; i < l; i++) {
- move(i, i - 1);
- move(i, i + 1);
- }
- for (i = first; i < l; i++) {
- cp = page[i];
- if (printall == 0 && lastomit == 0 && *cp == 0) {
- lastomit = 1;
- continue;
- }
- lastomit = 0;
- while (*cp != L'\0') {
- if ((w = wcwidth(*cp)) > 0) {
- putwchar(*cp);
- cp += w;
- } else
- cp++;
- }
- putwchar(L'\n');
- }
- wmemcpy(page[0], page[ol], (267 - ol) * 132);
- wmemset(page[267- ol], L'\0', ol * 132);
- outline -= ol;
- outcol = 0;
- first = 1;
-}
-
-static void
-move(int l, int m)
-{
- wchar_t *cp, *dp;
-
- for (cp = page[l], dp = page[m]; *cp; cp++, dp++) {
- switch (*cp) {
- case '|':
- if (*dp != ' ' && *dp != '|' && *dp != 0)
- return;
- break;
- case ' ':
- break;
- default:
- return;
- }
- }
- if (*cp == 0) {
- for (cp = page[l], dp = page[m]; *cp; cp++, dp++)
- if (*cp == '|')
- *dp = '|';
- else if (*dp == 0)
- *dp = ' ';
- page[l][0] = 0;
- }
-}
diff --git a/usr.bin/colldef/Makefile b/usr.bin/colldef/Makefile
deleted file mode 100644
index 6cb213f..0000000
--- a/usr.bin/colldef/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-# $FreeBSD$
-
-PROG= colldef
-SRCS= parse.y scan.l y.tab.h
-LFLAGS= -8 -i
-CFLAGS+=-I. -I${.CURDIR} -I${.CURDIR}/../../lib/libc/locale
-CFLAGS+=-DCOLLATE_DEBUG -DYY_NO_UNPUT
-LDADD= -ll
-DPADD= ${LIBL}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/colldef/colldef.1 b/usr.bin/colldef/colldef.1
deleted file mode 100644
index fafa74d..0000000
--- a/usr.bin/colldef/colldef.1
+++ /dev/null
@@ -1,274 +0,0 @@
-.\" Copyright (c) 1995 Alex Tatmanjants <alex@elvisti.kiev.ua>
-.\" at Electronni Visti IA, Kiev, Ukraine.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd January 27, 1995
-.Dt COLLDEF 1
-.Os
-.Sh NAME
-.Nm colldef
-.Nd convert collation sequence source definition
-.Sh SYNOPSIS
-.Nm
-.Op Fl I Ar map_dir
-.Op Fl o Ar out_file
-.Op Ar filename
-.Sh DESCRIPTION
-The
-.Nm
-utility converts a collation sequence source definition
-into a format usable by the
-.Fn strxfrm
-and
-.Fn strcoll
-functions.
-It is used to define the many ways in which
-strings can be ordered and collated.
-The
-.Fn strxfrm
-function transforms
-its first argument and places the result in its second
-argument.
-The transformed string is such that it can be
-correctly ordered with other transformed strings by using
-.Fn strcmp ,
-.Fn strncmp ,
-or
-.Fn memcmp .
-The
-.Fn strcoll
-function transforms its arguments and does a
-comparison.
-.Pp
-The
-.Nm
-utility reads the collation sequence source definition
-from the standard input and stores the converted definition in filename.
-The output file produced contains the
-database with collating sequence information in a form
-usable by system commands and routines.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl I Ar map_dir
-Set directory name where
-.Ar charmap
-files can be found, current directory by default.
-.It Fl o Ar out_file
-Set output file name,
-.Ar LC_COLLATE
-by default.
-.El
-.Pp
-The collation sequence definition specifies a set of collating elements and
-the rules defining how strings containing these should be ordered.
-This is most useful for different language definitions.
-.Pp
-The specification file can consist of three statements:
-.Ar charmap ,
-.Ar substitute
-and
-.Ar order .
-.Pp
-Of these, only the
-.Ar order
-statement is required.
-When
-.Ar charmap
-or
-.Ar substitute
-is
-supplied, these statements must be ordered as above.
-Any
-statements after the order statement are ignored.
-.Pp
-Lines in the specification file beginning with a
-.Ql #
-are
-treated as comments and are ignored.
-Blank lines are also
-ignored.
-.Pp
-.Dl "charmap charmapfile"
-.Pp
-.Ar Charmap
-defines where a mapping of the character
-and collating element symbols to the actual
-character encoding can be found.
-.Pp
-The format of
-.Ar charmapfile
-is shown below.
-Symbol
-names are separated from their values by TAB or
-SPACE characters.
-Symbol-value can be specified in
-a hexadecimal (\ex\fI??\fR) or octal (\e\fI???\fR)
-representation, and can be only one character in length.
-.Pp
-.Bd -literal -offset indent
-symbol-name1 symbol-value1
-symbol-name2 symbol-value2
-\&...
-.Ed
-.Pp
-Symbol names cannot be specified in
-.Ar substitute
-fields.
-.Pp
-The
-.Ar charmap
-statement is optional.
-.Pp
-.Bd -literal -offset indent
-substitute "symbol" with "repl_string"
-.Ed
-.Pp
-The
-.Ar substitute
-statement substitutes the character
-.Ar symbol
-with the string
-.Ar repl_string .
-Symbol names cannot be specified in
-.Ar repl_string
-field.
-The
-.Ar substitute
-statement is optional.
-.Pp
-.Dl "order order_list"
-.Pp
-.Ar Order_list
-is a list of symbols, separated by semi colons, that defines the
-collating sequence.
-The
-special symbol
-.Ar ...
-specifies, in a short-hand
-form, symbols that are sequential in machine code
-order.
-.Pp
-An order list element
-can be represented in any one of the following
-ways:
-.Bl -bullet
-.It
-The symbol itself (for example,
-.Ar a
-for the lower-case letter
-.Ar a ) .
-.It
-The symbol in octal representation (for example,
-.Ar \e141
-for the letter
-.Ar a ) .
-.It
-The symbol in hexadecimal representation (for example,
-.Ar \ex61
-for the letter
-.Ar a ) .
-.It
-The symbol name as defined in the
-.Ar charmap
-file (for example,
-.Ar <letterA>
-for
-.Ar letterA \e023
-record in
-.Ar charmapfile ) .
-If character map name have
-.Ar >
-character, it must be escaped as
-.Ar /> ,
-single
-.Ar /
-must be escaped as
-.Ar // .
-.It
-Symbols
-.Ar \ea ,
-.Ar \eb ,
-.Ar \ef ,
-.Ar \en ,
-.Ar \er ,
-.Ar \ev
-are permitted in its usual C-language meaning.
-.It
-The symbol chain (for example:
-.Ar abc ,
-.Ar <letterA><letterB>c ,
-.Ar \exf1b\exf2 )
-.It
-The symbol range (for example,
-.Ar a;...;z ) .
-.It
-Comma-separated symbols, ranges and chains enclosed in parenthesis (for example
-.Ar \&(
-.Ar sym1 ,
-.Ar sym2 ,
-.Ar ...
-.Ar \&) )
-are assigned the
-same primary ordering but different secondary
-ordering.
-.It
-Comma-separated symbols, ranges and chains enclosed in curly brackets (for example
-.Ar \&{
-.Ar sym1 ,
-.Ar sym2 ,
-.Ar ...
-.Ar \&} )
-are assigned the same primary ordering only.
-.El
-.Pp
-The backslash character
-.Ar \e
-is used for continuation.
-In this case, no characters are permitted
-after the backslash character.
-.Sh FILES
-.Bl -tag -width indent
-.It Pa /usr/share/locale/ Ns Ao Ar language Ac Ns Pa /LC_COLLATE
-The standard shared location for collation orders
-under the locale
-.Aq Ar language .
-.El
-.Sh EXIT STATUS
-The
-.Nm
-utility exits with the following values:
-.Bl -tag -width indent
-.It Li 0
-No errors were found and the output was successfully created.
-.It Li !=0
-Errors were found.
-.El
-.Sh SEE ALSO
-.Xr mklocale 1 ,
-.Xr setlocale 3 ,
-.Xr strcoll 3 ,
-.Xr strxfrm 3
diff --git a/usr.bin/colldef/common.h b/usr.bin/colldef/common.h
deleted file mode 100644
index 316490d..0000000
--- a/usr.bin/colldef/common.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * $FreeBSD$
- */
-
-#define CHARMAP_SYMBOL_LEN 64
-#define BUFSIZE 80
-
-extern int line_no;
-
-extern u_char charmap_table[UCHAR_MAX + 1][CHARMAP_SYMBOL_LEN];
-extern char map_name[FILENAME_MAX];
diff --git a/usr.bin/colldef/parse.y b/usr.bin/colldef/parse.y
deleted file mode 100644
index 9f8f8a8..0000000
--- a/usr.bin/colldef/parse.y
+++ /dev/null
@@ -1,384 +0,0 @@
-%{
-/*-
- * Copyright (c) 1995 Alex Tatmanjants <alex@elvisti.kiev.ua>
- * at Electronni Visti IA, Kiev, Ukraine.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <arpa/inet.h>
-#include <err.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <sysexits.h>
-#include "collate.h"
-#include "common.h"
-
-extern FILE *yyin;
-void yyerror(const char *fmt, ...) __printflike(1, 2);
-int yyparse(void);
-int yylex(void);
-static void usage(void);
-static void collate_print_tables(void);
-
-char map_name[FILENAME_MAX] = ".";
-char curr_chain[STR_LEN];
-
-char __collate_version[STR_LEN];
-u_char charmap_table[UCHAR_MAX + 1][CHARMAP_SYMBOL_LEN];
-
-#undef __collate_substitute_table
-u_char __collate_substitute_table[UCHAR_MAX + 1][STR_LEN];
-#undef __collate_char_pri_table
-struct __collate_st_char_pri __collate_char_pri_table[UCHAR_MAX + 1];
-struct __collate_st_chain_pri *__collate_chain_pri_table;
-
-int chain_index = 0;
-int prim_pri = 1, sec_pri = 1;
-#ifdef COLLATE_DEBUG
-int debug;
-#endif
-
-const char *out_file = "LC_COLLATE";
-%}
-%union {
- u_char ch;
- u_char str[BUFSIZE];
-}
-%token SUBSTITUTE WITH ORDER RANGE
-%token <str> STRING
-%token <str> DEFN
-%token <ch> CHAR
-%%
-collate : statment_list
-;
-statment_list : statment
- | statment_list '\n' statment
-;
-statment :
- | charmap
- | substitute
- | order
-;
-charmap : DEFN CHAR {
- if (strlen($1) + 1 > CHARMAP_SYMBOL_LEN)
- yyerror("Charmap symbol name '%s' is too long", $1);
- strcpy(charmap_table[$2], $1);
-}
-;
-substitute : SUBSTITUTE CHAR WITH STRING {
- if ($2 == '\0')
- yyerror("NUL character can't be substituted");
- if (strchr($4, $2) != NULL)
- yyerror("Char 0x%02x substitution is recursive", $2);
- if (strlen($4) + 1 > STR_LEN)
- yyerror("Char 0x%02x substitution is too long", $2);
- strcpy(__collate_substitute_table[$2], $4);
-}
-;
-order : ORDER order_list {
- FILE *fp;
- int ch, substed, ordered;
- uint32_t u32;
-
- for (ch = 0; ch < UCHAR_MAX + 1; ch++) {
- substed = (__collate_substitute_table[ch][0] != ch);
- ordered = !!__collate_char_pri_table[ch].prim;
- if (!ordered && !substed)
- yyerror("Char 0x%02x not found", ch);
- if (substed && ordered)
- yyerror("Char 0x%02x can't be ordered since substituted", ch);
- }
-
- if ((__collate_chain_pri_table = realloc(__collate_chain_pri_table,
- sizeof(*__collate_chain_pri_table) * (chain_index + 1))) == NULL)
- yyerror("can't grow chain table");
- (void)memset(&__collate_chain_pri_table[chain_index], 0,
- sizeof(__collate_chain_pri_table[0]));
- chain_index++;
-
-#ifdef COLLATE_DEBUG
- if (debug)
- collate_print_tables();
-#endif
- if ((fp = fopen(out_file, "w")) == NULL)
- err(EX_UNAVAILABLE, "can't open destination file %s",
- out_file);
-
- strcpy(__collate_version, COLLATE_VERSION1_2);
- if (fwrite(__collate_version, sizeof(__collate_version), 1, fp) != 1)
- err(EX_IOERR,
- "IO error writting collate version to destination file %s",
- out_file);
- u32 = htonl(chain_index);
- if (fwrite(&u32, sizeof(u32), 1, fp) != 1)
- err(EX_IOERR,
- "IO error writting chains number to destination file %s",
- out_file);
- if (fwrite(__collate_substitute_table,
- sizeof(__collate_substitute_table), 1, fp) != 1)
- err(EX_IOERR,
- "IO error writting substitute table to destination file %s",
- out_file);
- for (ch = 0; ch < UCHAR_MAX + 1; ch++) {
- __collate_char_pri_table[ch].prim =
- htonl(__collate_char_pri_table[ch].prim);
- __collate_char_pri_table[ch].sec =
- htonl(__collate_char_pri_table[ch].sec);
- }
- if (fwrite(__collate_char_pri_table,
- sizeof(__collate_char_pri_table), 1, fp) != 1)
- err(EX_IOERR,
- "IO error writting char table to destination file %s",
- out_file);
- for (ch = 0; ch < chain_index; ch++) {
- __collate_chain_pri_table[ch].prim =
- htonl(__collate_chain_pri_table[ch].prim);
- __collate_chain_pri_table[ch].sec =
- htonl(__collate_chain_pri_table[ch].sec);
- }
- if (fwrite(__collate_chain_pri_table,
- sizeof(*__collate_chain_pri_table), chain_index, fp) !=
- (size_t)chain_index)
- err(EX_IOERR,
- "IO error writting chain table to destination file %s",
- out_file);
- if (fclose(fp) != 0)
- err(EX_IOERR, "IO error closing destination file %s",
- out_file);
- exit(EX_OK);
-}
-;
-order_list : item
- | order_list ';' item
-;
-chain : CHAR CHAR {
- curr_chain[0] = $1;
- curr_chain[1] = $2;
- if (curr_chain[0] == '\0' || curr_chain[1] == '\0')
- yyerror("\\0 can't be chained");
- curr_chain[2] = '\0';
-}
- | chain CHAR {
- static char tb[2];
-
- tb[0] = $2;
- if (tb[0] == '\0')
- yyerror("\\0 can't be chained");
- if (strlen(curr_chain) + 2 > STR_LEN)
- yyerror("Chain '%s' grows too long", curr_chain);
- (void)strcat(curr_chain, tb);
-}
-;
-item : CHAR {
- if (__collate_char_pri_table[$1].prim)
- yyerror("Char 0x%02x duplicated", $1);
- __collate_char_pri_table[$1].prim = prim_pri++;
-}
- | chain {
- if ((__collate_chain_pri_table = realloc(__collate_chain_pri_table,
- sizeof(*__collate_chain_pri_table) * (chain_index + 1))) == NULL)
- yyerror("can't grow chain table");
- (void)memset(&__collate_chain_pri_table[chain_index], 0,
- sizeof(__collate_chain_pri_table[0]));
- (void)strcpy(__collate_chain_pri_table[chain_index].str, curr_chain);
- __collate_chain_pri_table[chain_index].prim = prim_pri++;
- chain_index++;
-}
- | CHAR RANGE CHAR {
- u_int i;
-
- if ($3 <= $1)
- yyerror("Illegal range 0x%02x -- 0x%02x", $1, $3);
-
- for (i = $1; i <= $3; i++) {
- if (__collate_char_pri_table[(u_char)i].prim)
- yyerror("Char 0x%02x duplicated", (u_char)i);
- __collate_char_pri_table[(u_char)i].prim = prim_pri++;
- }
-}
- | '{' prim_order_list '}' {
- prim_pri++;
-}
- | '(' sec_order_list ')' {
- prim_pri++;
- sec_pri = 1;
-}
-;
-prim_order_list : prim_sub_item
- | prim_order_list ',' prim_sub_item
-;
-sec_order_list : sec_sub_item
- | sec_order_list ',' sec_sub_item
-;
-prim_sub_item : CHAR {
- if (__collate_char_pri_table[$1].prim)
- yyerror("Char 0x%02x duplicated", $1);
- __collate_char_pri_table[$1].prim = prim_pri;
-}
- | CHAR RANGE CHAR {
- u_int i;
-
- if ($3 <= $1)
- yyerror("Illegal range 0x%02x -- 0x%02x",
- $1, $3);
-
- for (i = $1; i <= $3; i++) {
- if (__collate_char_pri_table[(u_char)i].prim)
- yyerror("Char 0x%02x duplicated", (u_char)i);
- __collate_char_pri_table[(u_char)i].prim = prim_pri;
- }
-}
- | chain {
- if ((__collate_chain_pri_table = realloc(__collate_chain_pri_table,
- sizeof(*__collate_chain_pri_table) * (chain_index + 1))) == NULL)
- yyerror("can't grow chain table");
- (void)memset(&__collate_chain_pri_table[chain_index], 0,
- sizeof(__collate_chain_pri_table[0]));
- (void)strcpy(__collate_chain_pri_table[chain_index].str, curr_chain);
- __collate_chain_pri_table[chain_index].prim = prim_pri;
- chain_index++;
-}
-;
-sec_sub_item : CHAR {
- if (__collate_char_pri_table[$1].prim)
- yyerror("Char 0x%02x duplicated", $1);
- __collate_char_pri_table[$1].prim = prim_pri;
- __collate_char_pri_table[$1].sec = sec_pri++;
-}
- | CHAR RANGE CHAR {
- u_int i;
-
- if ($3 <= $1)
- yyerror("Illegal range 0x%02x -- 0x%02x",
- $1, $3);
-
- for (i = $1; i <= $3; i++) {
- if (__collate_char_pri_table[(u_char)i].prim)
- yyerror("Char 0x%02x duplicated", (u_char)i);
- __collate_char_pri_table[(u_char)i].prim = prim_pri;
- __collate_char_pri_table[(u_char)i].sec = sec_pri++;
- }
-}
- | chain {
- if ((__collate_chain_pri_table = realloc(__collate_chain_pri_table,
- sizeof(*__collate_chain_pri_table) * (chain_index + 1))) == NULL)
- yyerror("can't grow chain table");
- (void)memset(&__collate_chain_pri_table[chain_index], 0,
- sizeof(__collate_chain_pri_table[0]));
- (void)strcpy(__collate_chain_pri_table[chain_index].str, curr_chain);
- __collate_chain_pri_table[chain_index].prim = prim_pri;
- __collate_chain_pri_table[chain_index].sec = sec_pri++;
- chain_index++;
-}
-;
-%%
-int
-main(int ac, char **av)
-{
- int ch;
-
-#ifdef COLLATE_DEBUG
- while((ch = getopt(ac, av, ":do:I:")) != -1) {
-#else
- while((ch = getopt(ac, av, ":o:I:")) != -1) {
-#endif
- switch (ch)
- {
-#ifdef COLLATE_DEBUG
- case 'd':
- debug++;
- break;
-#endif
- case 'o':
- out_file = optarg;
- break;
-
- case 'I':
- strlcpy(map_name, optarg, sizeof(map_name));
- break;
-
- default:
- usage();
- }
- }
- ac -= optind;
- av += optind;
- if (ac > 0) {
- if ((yyin = fopen(*av, "r")) == NULL)
- err(EX_UNAVAILABLE, "can't open source file %s", *av);
- }
- for (ch = 0; ch <= UCHAR_MAX; ch++)
- __collate_substitute_table[ch][0] = ch;
- yyparse();
- return 0;
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: colldef [-I map_dir] [-o out_file] [filename]\n");
- exit(EX_USAGE);
-}
-
-void
-yyerror(const char *fmt, ...)
-{
- va_list ap;
- char msg[128];
-
- va_start(ap, fmt);
- vsnprintf(msg, sizeof(msg), fmt, ap);
- va_end(ap);
- errx(EX_UNAVAILABLE, "%s near line %d", msg, line_no);
-}
-
-#ifdef COLLATE_DEBUG
-static void
-collate_print_tables(void)
-{
- int i;
-
- printf("Substitute table:\n");
- for (i = 0; i < UCHAR_MAX + 1; i++)
- if (i != *__collate_substitute_table[i])
- printf("\t'%c' --> \"%s\"\n", i,
- __collate_substitute_table[i]);
- printf("Chain priority table:\n");
- for (i = 0; i < chain_index - 1; i++)
- printf("\t\"%s\" : %d %d\n",
- __collate_chain_pri_table[i].str,
- __collate_chain_pri_table[i].prim,
- __collate_chain_pri_table[i].sec);
- printf("Char priority table:\n");
- for (i = 0; i < UCHAR_MAX + 1; i++)
- printf("\t'%c' : %d %d\n", i, __collate_char_pri_table[i].prim,
- __collate_char_pri_table[i].sec);
-}
-#endif
diff --git a/usr.bin/colldef/scan.l b/usr.bin/colldef/scan.l
deleted file mode 100644
index b396ed0..0000000
--- a/usr.bin/colldef/scan.l
+++ /dev/null
@@ -1,287 +0,0 @@
-%x string name charmap defn nchar subs subs2
-%{
-/*-
- * Copyright (c) 1995 Alex Tatmanjants <alex@elvisti.kiev.ua>
- * at Electronni Visti IA, Kiev, Ukraine.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <ctype.h>
-#include <err.h>
-#include <limits.h>
-#include <unistd.h>
-#include <string.h>
-#include <sysexits.h>
-#include "common.h"
-#include "y.tab.h"
-
-int line_no = 1, save_no, fromsubs;
-u_char buf[BUFSIZE], *ptr;
-FILE *map_fp;
-YY_BUFFER_STATE main_buf, map_buf;
-#ifdef FLEX_DEBUG
-YYSTYPE yylval;
-#endif /* FLEX_DEBUG */
-int yylex(void);
-%}
-%%
-<INITIAL,charmap,nchar,subs,subs2>[ \t]+ ;
-<subs2>\" { ptr = buf; BEGIN(string); }
-<subs>\< { ptr = buf; fromsubs = 1; BEGIN(name); }
-<INITIAL>\< { ptr = buf; fromsubs = 0; BEGIN(name); }
-^#.*\n line_no++;
-^\n line_no++;
-<INITIAL>\\\n line_no++;
-<INITIAL,nchar,subs>\\t { yylval.ch = '\t'; return CHAR; }
-<INITIAL,nchar,subs>\\n { yylval.ch = '\n'; return CHAR; }
-<INITIAL,nchar,subs>\\b { yylval.ch = '\b'; return CHAR; }
-<INITIAL,nchar,subs>\\f { yylval.ch = '\f'; return CHAR; }
-<INITIAL,nchar,subs>\\v { yylval.ch = '\v'; return CHAR; }
-<INITIAL,nchar,subs>\\r { yylval.ch = '\r'; return CHAR; }
-<INITIAL,nchar,subs>\\a { yylval.ch = '\a'; return CHAR; }
-<subs2>\n {
- line_no++;
- BEGIN(INITIAL);
- return '\n';
-}
-<INITIAL,nchar>\n {
- line_no++;
- if (map_fp != NULL) {
- ptr = buf;
- BEGIN(defn);
- }
- return '\n';
-}
-<INITIAL>[;,{}()] return *yytext;
-<INITIAL>substitute { BEGIN(subs); return SUBSTITUTE; }
-<subs>with { BEGIN(subs2); return WITH; }
-<INITIAL>order return ORDER;
-<INITIAL>charmap BEGIN(charmap);
-<INITIAL>;[ \t]*\.\.\.[ \t]*; return RANGE;
-<INITIAL,nchar,subs>\\[0-7]{3} {
- u_int v;
-
- sscanf(&yytext[1], "%o", &v);
- yylval.ch = (u_char)v;
- return CHAR;
-}
-<INITIAL,nchar,subs>\\x[0-9a-fA-F]{2} {
- u_int v;
-
- sscanf(&yytext[2], "%x", &v);
- yylval.ch = (u_char)v;
- return CHAR;
-}
-<INITIAL,nchar,subs>\\. { yylval.ch = yytext[1]; return CHAR; }
-<INITIAL,nchar,subs>. { yylval.ch = *yytext; return CHAR; }
-<defn>^#.*\n line_no++;
-<defn>[ \t]+ {
- if (ptr == buf)
- errx(EX_UNAVAILABLE, "map expected near line %u of %s",
- line_no, map_name);
- *ptr = '\0';
- strcpy(yylval.str, buf);
- BEGIN(nchar);
- return DEFN;
-}
-<name>\/\/ {
- if(ptr >= buf + sizeof(buf) - 1)
- errx(EX_UNAVAILABLE, "name buffer overflow near line %u, character '/'",
- line_no);
- *ptr++ = '/';
-}
-<name>\/\> {
- if(ptr >= buf + sizeof(buf) - 1)
- errx(EX_UNAVAILABLE, "name buffer overflow near line %u, character '>'",
- line_no);
- *ptr++ = '>';
-}
-<string>\\\" {
- if(ptr >= buf + sizeof(buf) - 1)
- errx(EX_UNAVAILABLE, "string buffer overflow near line %u, character '\"'",
- line_no);
- *ptr++ = '"';
-}
-<name>\> {
- u_int i;
-
- if (ptr == buf)
- errx(EX_UNAVAILABLE, "non-empty name expected near line %u",
- line_no);
- *ptr = '\0';
- for (i = 0; i <= UCHAR_MAX; i++) {
- if (strcmp(charmap_table[i], buf) == 0)
- goto findit;
- }
- errx(EX_UNAVAILABLE, "name <%s> not 'charmap'-defined near line %u",
- buf, line_no);
- findit:
- yylval.ch = i;
- if (fromsubs)
- BEGIN(subs);
- else
- BEGIN(INITIAL);
- return CHAR;
-}
-<string>\" {
- *ptr = '\0';
- strcpy(yylval.str, buf);
- BEGIN(subs2);
- return STRING;
-}
-<name,defn>. {
- const char *s = (map_fp != NULL) ? map_name : "input";
-
- if (!isascii(*yytext) || !isprint(*yytext))
- errx(EX_UNAVAILABLE, "non-ASCII or non-printable character 0x%02x not allowed in the map/name near line %u of %s",
- *yytext, line_no, s);
- if(ptr >= buf + sizeof(buf) - 1)
- errx(EX_UNAVAILABLE, "map/name buffer overflow near line %u of %s, character '%c'",
- line_no, s, *yytext);
- *ptr++ = *yytext;
-}
-<string>\\t {
- if(ptr >= buf + sizeof(buf) - 1)
- errx(EX_UNAVAILABLE, "string buffer overflow near line %u, character '\\t'",
- line_no);
- *ptr++ = '\t';
-}
-<string>\\b {
- if(ptr >= buf + sizeof(buf) - 1)
- errx(EX_UNAVAILABLE, "string buffer overflow near line %u, character '\\b'",
- line_no);
- *ptr++ = '\b';
-}
-<string>\\f {
- if(ptr >= buf + sizeof(buf) - 1)
- errx(EX_UNAVAILABLE, "string buffer overflow near line %u, character '\\f'",
- line_no);
- *ptr++ = '\f';
-}
-<string>\\v {
- if(ptr >= buf + sizeof(buf) - 1)
- errx(EX_UNAVAILABLE, "string buffer overflow near line %u, character '\\v'",
- line_no);
- *ptr++ = '\v';
-}
-<string>\\n {
- if(ptr >= buf + sizeof(buf) - 1)
- errx(EX_UNAVAILABLE, "string buffer overflow near line %u, character '\\n'",
- line_no);
- *ptr++ = '\n';
-}
-<string>\\r {
- if(ptr >= buf + sizeof(buf) - 1)
- errx(EX_UNAVAILABLE, "string buffer overflow near line %u, character '\\r'",
- line_no);
- *ptr++ = '\r';
-}
-<string>\\a {
- if(ptr >= buf + sizeof(buf) - 1)
- errx(EX_UNAVAILABLE, "string buffer overflow near line %u, character '\\a'",
- line_no);
- *ptr++ = '\a';
-}
-<name,string,defn>\n {
- const char *s = (map_fp != NULL) ? map_name : "input";
-
- errx(EX_UNAVAILABLE, "unterminated map/name/string near line %u of %s", line_no, s);
-}
-<name,string,nchar><<EOF>> {
- const char *s = (map_fp != NULL) ? map_name : "input";
-
- errx(EX_UNAVAILABLE, "premature EOF in the name/string/char near line %u of %s", line_no, s);
-}
-<string>\\x[0-9a-f]{2} {
- u_int v;
-
- sscanf(&yytext[2], "%x", &v);
- *ptr++ = (u_char)v;
-}
-<string>\\[0-7]{3} {
- u_int v;
-
- sscanf(&yytext[1], "%o", &v);
- *ptr++ = (u_char)v;
-}
-<string>\\. {
- if(ptr >= buf + sizeof(buf) - 1)
- errx(EX_UNAVAILABLE, "string buffer overflow near line %u, character '%c'",
- line_no, yytext[1]);
- *ptr++ = yytext[1];
-}
-<string>. {
- if(ptr >= buf + sizeof(buf) - 1)
- errx(EX_UNAVAILABLE, "string buffer overflow near line %u, character '%c'",
- line_no, *yytext);
- *ptr++ = *yytext;
-}
-<charmap>[^ \t\n]+ {
- strcat(map_name, "/");
- strcat(map_name, yytext);
- if((map_fp = fopen(map_name, "r")) == NULL)
- err(EX_UNAVAILABLE, "can't open 'charmap' file %s",
- map_name);
- save_no = line_no;
- line_no = 1;
- map_buf = yy_new_buffer(map_fp, YY_BUF_SIZE);
- main_buf = YY_CURRENT_BUFFER;
- yy_switch_to_buffer(map_buf);
- ptr = buf;
- BEGIN(defn);
-}
-<charmap>\n {
- errx(EX_UNAVAILABLE, "'charmap' file name expected near line %u",
- line_no);
-}
-<charmap><<EOF>> {
- errx(EX_UNAVAILABLE, "'charmap' file name expected near line %u",
- line_no);
-}
-<INITIAL,defn><<EOF>> {
- if(map_fp != NULL) {
- if (ptr != buf)
- errx(EX_UNAVAILABLE, "premature EOF in the map near line %u of %s", line_no, map_name);
- yy_switch_to_buffer(main_buf);
- yy_delete_buffer(map_buf);
- fclose(map_fp);
- map_fp = NULL;
- line_no = save_no;
- BEGIN(INITIAL);
- } else
- yyterminate();
-}
-%%
-#ifdef FLEX_DEBUG
-main()
-{
- while(yylex())
- ;
- return 0;
-}
-#endif /* FLEX_DEBUG */
diff --git a/usr.bin/colrm/Makefile b/usr.bin/colrm/Makefile
deleted file mode 100644
index 1258576..0000000
--- a/usr.bin/colrm/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= colrm
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/colrm/colrm.1 b/usr.bin/colrm/colrm.1
deleted file mode 100644
index ceb0455..0000000
--- a/usr.bin/colrm/colrm.1
+++ /dev/null
@@ -1,91 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)colrm.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd August 4, 2004
-.Dt COLRM 1
-.Os
-.Sh NAME
-.Nm colrm
-.Nd remove columns from a file
-.Sh SYNOPSIS
-.Nm
-.Op Ar start Op Ar stop
-.Sh DESCRIPTION
-The
-.Nm
-utility removes selected columns from the lines of a file.
-A column is defined as a single character in a line.
-Input is read from the standard input.
-Output is written to the standard output.
-.Pp
-If only the
-.Ar start
-column is specified, columns numbered less than the
-.Ar start
-column will be written.
-If both
-.Ar start
-and
-.Ar stop
-columns are specified, columns numbered less than the
-.Ar start
-column
-or greater than the
-.Ar stop
-column will be written.
-Column numbering starts with one, not zero.
-.Pp
-Tab characters increment the column count to the next multiple of eight.
-Backspace characters decrement the column count by one.
-.Sh ENVIRONMENT
-The
-.Ev LANG , LC_ALL
-and
-.Ev LC_CTYPE
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr awk 1 ,
-.Xr column 1 ,
-.Xr cut 1 ,
-.Xr paste 1
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3.0 .
diff --git a/usr.bin/colrm/colrm.c b/usr.bin/colrm/colrm.c
deleted file mode 100644
index 52dda90..0000000
--- a/usr.bin/colrm/colrm.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1991, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)colrm.c 8.2 (Berkeley) 5/4/95";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <err.h>
-#include <errno.h>
-#include <limits.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-
-#define TAB 8
-
-void check(FILE *);
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- u_long column, start, stop;
- int ch, width;
- char *p;
-
- setlocale(LC_ALL, "");
-
- while ((ch = getopt(argc, argv, "")) != -1)
- switch(ch) {
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- start = stop = 0;
- switch(argc) {
- case 2:
- stop = strtol(argv[1], &p, 10);
- if (stop <= 0 || *p)
- errx(1, "illegal column -- %s", argv[1]);
- /* FALLTHROUGH */
- case 1:
- start = strtol(argv[0], &p, 10);
- if (start <= 0 || *p)
- errx(1, "illegal column -- %s", argv[0]);
- break;
- case 0:
- break;
- default:
- usage();
- }
-
- if (stop && start > stop)
- errx(1, "illegal start and stop columns");
-
- for (column = 0;;) {
- switch (ch = getwchar()) {
- case WEOF:
- check(stdin);
- break;
- case '\b':
- if (column)
- --column;
- break;
- case '\n':
- column = 0;
- break;
- case '\t':
- column = (column + TAB) & ~(TAB - 1);
- break;
- default:
- if ((width = wcwidth(ch)) > 0)
- column += width;
- break;
- }
-
- if ((!start || column < start || (stop && column > stop)) &&
- putwchar(ch) == WEOF)
- check(stdout);
- }
-}
-
-void
-check(FILE *stream)
-{
- if (feof(stream))
- exit(0);
- if (ferror(stream))
- err(1, "%s", stream == stdin ? "stdin" : "stdout");
-}
-
-void
-usage(void)
-{
- (void)fprintf(stderr, "usage: colrm [start [stop]]\n");
- exit(1);
-}
-
diff --git a/usr.bin/column/Makefile b/usr.bin/column/Makefile
deleted file mode 100644
index 771723e..0000000
--- a/usr.bin/column/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= column
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/column/column.1 b/usr.bin/column/column.1
deleted file mode 100644
index 5c5a100..0000000
--- a/usr.bin/column/column.1
+++ /dev/null
@@ -1,105 +0,0 @@
-.\" Copyright (c) 1989, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)column.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd July 29, 2004
-.Os
-.Dt COLUMN 1
-.Sh NAME
-.Nm column
-.Nd columnate lists
-.Sh SYNOPSIS
-.Nm
-.Op Fl tx
-.Op Fl c Ar columns
-.Op Fl s Ar sep
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility formats its input into multiple columns.
-Rows are filled before columns.
-Input is taken from
-.Ar file
-operands, or, by default, from the standard input.
-Empty lines are ignored.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl c
-Output is formatted for a display
-.Ar columns
-wide.
-.It Fl s
-Specify a set of characters to be used to delimit columns for the
-.Fl t
-option.
-.It Fl t
-Determine the number of columns the input contains and create a table.
-Columns are delimited with whitespace, by default, or with the characters
-supplied using the
-.Fl s
-option.
-Useful for pretty-printing displays.
-.It Fl x
-Fill columns before filling rows.
-.El
-.Sh ENVIRONMENT
-The
-.Ev COLUMNS , LANG , LC_ALL
-and
-.Ev LC_CTYPE
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Sh EXIT STATUS
-.Ex -std
-.Sh EXAMPLES
-.Dl (printf \&"PERM LINKS OWNER GROUP SIZE MONTH DAY \&"\ \&;\ \&\e
-.Dl printf \&"HH:MM/YEAR NAME\en\&"\ \&;\ \&\e
-.Dl ls -l \&| sed 1d) \&| column -t
-.Sh SEE ALSO
-.Xr colrm 1 ,
-.Xr ls 1 ,
-.Xr paste 1 ,
-.Xr sort 1
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.3 Reno .
-.Sh BUGS
-Input lines are limited to
-.Dv LINE_MAX
-(2048) bytes in length.
diff --git a/usr.bin/column/column.c b/usr.bin/column/column.c
deleted file mode 100644
index 329cfa9..0000000
--- a/usr.bin/column/column.c
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * Copyright (c) 1989, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1989, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)column.c 8.4 (Berkeley) 5/4/95";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/param.h>
-
-#include <err.h>
-#include <limits.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-#include <wctype.h>
-
-#define TAB 8
-
-void c_columnate(void);
-void input(FILE *);
-void maketbl(void);
-void print(void);
-void r_columnate(void);
-void usage(void);
-int width(const wchar_t *);
-
-int termwidth = 80; /* default terminal width */
-
-int entries; /* number of records */
-int eval; /* exit value */
-int maxlength; /* longest record */
-wchar_t **list; /* array of pointers to records */
-const wchar_t *separator = L"\t "; /* field separator for table option */
-
-int
-main(int argc, char **argv)
-{
- struct winsize win;
- FILE *fp;
- int ch, tflag, xflag;
- char *p;
- const char *src;
- wchar_t *newsep;
- size_t seplen;
-
- setlocale(LC_ALL, "");
-
- if (ioctl(1, TIOCGWINSZ, &win) == -1 || !win.ws_col) {
- if ((p = getenv("COLUMNS")))
- termwidth = atoi(p);
- } else
- termwidth = win.ws_col;
-
- tflag = xflag = 0;
- while ((ch = getopt(argc, argv, "c:s:tx")) != -1)
- switch(ch) {
- case 'c':
- termwidth = atoi(optarg);
- break;
- case 's':
- src = optarg;
- seplen = mbsrtowcs(NULL, &src, 0, NULL);
- if (seplen == (size_t)-1)
- err(1, "bad separator");
- newsep = malloc((seplen + 1) * sizeof(wchar_t));
- if (newsep == NULL)
- err(1, NULL);
- mbsrtowcs(newsep, &src, seplen + 1, NULL);
- separator = newsep;
- break;
- case 't':
- tflag = 1;
- break;
- case 'x':
- xflag = 1;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (!*argv)
- input(stdin);
- else for (; *argv; ++argv)
- if ((fp = fopen(*argv, "r"))) {
- input(fp);
- (void)fclose(fp);
- } else {
- warn("%s", *argv);
- eval = 1;
- }
-
- if (!entries)
- exit(eval);
-
- maxlength = roundup(maxlength + 1, TAB);
- if (tflag)
- maketbl();
- else if (maxlength >= termwidth)
- print();
- else if (xflag)
- c_columnate();
- else
- r_columnate();
- exit(eval);
-}
-
-void
-c_columnate(void)
-{
- int chcnt, col, cnt, endcol, numcols;
- wchar_t **lp;
-
- numcols = termwidth / maxlength;
- endcol = maxlength;
- for (chcnt = col = 0, lp = list;; ++lp) {
- wprintf(L"%ls", *lp);
- chcnt += width(*lp);
- if (!--entries)
- break;
- if (++col == numcols) {
- chcnt = col = 0;
- endcol = maxlength;
- putwchar('\n');
- } else {
- while ((cnt = roundup(chcnt + 1, TAB)) <= endcol) {
- (void)putwchar('\t');
- chcnt = cnt;
- }
- endcol += maxlength;
- }
- }
- if (chcnt)
- putwchar('\n');
-}
-
-void
-r_columnate(void)
-{
- int base, chcnt, cnt, col, endcol, numcols, numrows, row;
-
- numcols = termwidth / maxlength;
- numrows = entries / numcols;
- if (entries % numcols)
- ++numrows;
-
- for (row = 0; row < numrows; ++row) {
- endcol = maxlength;
- for (base = row, chcnt = col = 0; col < numcols; ++col) {
- wprintf(L"%ls", list[base]);
- chcnt += width(list[base]);
- if ((base += numrows) >= entries)
- break;
- while ((cnt = roundup(chcnt + 1, TAB)) <= endcol) {
- (void)putwchar('\t');
- chcnt = cnt;
- }
- endcol += maxlength;
- }
- putwchar('\n');
- }
-}
-
-void
-print(void)
-{
- int cnt;
- wchar_t **lp;
-
- for (cnt = entries, lp = list; cnt--; ++lp)
- (void)wprintf(L"%ls\n", *lp);
-}
-
-typedef struct _tbl {
- wchar_t **list;
- int cols, *len;
-} TBL;
-#define DEFCOLS 25
-
-void
-maketbl(void)
-{
- TBL *t;
- int coloff, cnt;
- wchar_t *p, **lp;
- int *lens, maxcols;
- TBL *tbl;
- wchar_t **cols;
- wchar_t *last;
-
- if ((t = tbl = calloc(entries, sizeof(TBL))) == NULL)
- err(1, (char *)NULL);
- if ((cols = calloc((maxcols = DEFCOLS), sizeof(*cols))) == NULL)
- err(1, (char *)NULL);
- if ((lens = calloc(maxcols, sizeof(int))) == NULL)
- err(1, (char *)NULL);
- for (cnt = 0, lp = list; cnt < entries; ++cnt, ++lp, ++t) {
- for (coloff = 0, p = *lp;
- (cols[coloff] = wcstok(p, separator, &last));
- p = NULL)
- if (++coloff == maxcols) {
- if (!(cols = realloc(cols, ((u_int)maxcols +
- DEFCOLS) * sizeof(char *))) ||
- !(lens = realloc(lens,
- ((u_int)maxcols + DEFCOLS) * sizeof(int))))
- err(1, NULL);
- memset((char *)lens + maxcols * sizeof(int),
- 0, DEFCOLS * sizeof(int));
- maxcols += DEFCOLS;
- }
- if ((t->list = calloc(coloff, sizeof(*t->list))) == NULL)
- err(1, (char *)NULL);
- if ((t->len = calloc(coloff, sizeof(int))) == NULL)
- err(1, (char *)NULL);
- for (t->cols = coloff; --coloff >= 0;) {
- t->list[coloff] = cols[coloff];
- t->len[coloff] = width(cols[coloff]);
- if (t->len[coloff] > lens[coloff])
- lens[coloff] = t->len[coloff];
- }
- }
- for (cnt = 0, t = tbl; cnt < entries; ++cnt, ++t) {
- for (coloff = 0; coloff < t->cols - 1; ++coloff)
- (void)wprintf(L"%ls%*ls", t->list[coloff],
- lens[coloff] - t->len[coloff] + 2, L" ");
- (void)wprintf(L"%ls\n", t->list[coloff]);
- }
-}
-
-#define DEFNUM 1000
-#define MAXLINELEN (LINE_MAX + 1)
-
-void
-input(FILE *fp)
-{
- static int maxentry;
- int len;
- wchar_t *p, buf[MAXLINELEN];
-
- if (!list)
- if ((list = calloc((maxentry = DEFNUM), sizeof(*list))) ==
- NULL)
- err(1, (char *)NULL);
- while (fgetws(buf, MAXLINELEN, fp)) {
- for (p = buf; *p && iswspace(*p); ++p);
- if (!*p)
- continue;
- if (!(p = wcschr(p, L'\n'))) {
- warnx("line too long");
- eval = 1;
- continue;
- }
- *p = L'\0';
- len = width(buf);
- if (maxlength < len)
- maxlength = len;
- if (entries == maxentry) {
- maxentry += DEFNUM;
- if (!(list = realloc(list,
- (u_int)maxentry * sizeof(*list))))
- err(1, NULL);
- }
- list[entries] = malloc((wcslen(buf) + 1) * sizeof(wchar_t));
- if (list[entries] == NULL)
- err(1, NULL);
- wcscpy(list[entries], buf);
- entries++;
- }
-}
-
-/* Like wcswidth(), but ignores non-printing characters. */
-int
-width(const wchar_t *wcs)
-{
- int w, cw;
-
- for (w = 0; *wcs != L'\0'; wcs++)
- if ((cw = wcwidth(*wcs)) > 0)
- w += cw;
- return (w);
-}
-
-void
-usage(void)
-{
-
- (void)fprintf(stderr,
- "usage: column [-tx] [-c columns] [-s sep] [file ...]\n");
- exit(1);
-}
diff --git a/usr.bin/comm/Makefile b/usr.bin/comm/Makefile
deleted file mode 100644
index 13da76f..0000000
--- a/usr.bin/comm/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= comm
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/comm/comm.1 b/usr.bin/comm/comm.1
deleted file mode 100644
index 2402ab5..0000000
--- a/usr.bin/comm/comm.1
+++ /dev/null
@@ -1,124 +0,0 @@
-.\" Copyright (c) 1989, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" From: @(#)comm.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd January 26, 2005
-.Os
-.Dt COMM 1
-.Sh NAME
-.Nm comm
-.Nd select or reject lines common to two files
-.Sh SYNOPSIS
-.Nm
-.Op Fl 123i
-.Ar file1 file2
-.Sh DESCRIPTION
-The
-.Nm
-utility reads
-.Ar file1
-and
-.Ar file2 ,
-which should be
-sorted lexically, and produces three text
-columns as output: lines only in
-.Ar file1 ;
-lines only in
-.Ar file2 ;
-and lines in both files.
-.Pp
-The filename ``-'' means the standard input.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl 1
-Suppress printing of column 1.
-.It Fl 2
-Suppress printing of column 2.
-.It Fl 3
-Suppress printing of column 3.
-.It Fl i
-Case insensitive comparison of lines.
-.El
-.Pp
-Each column will have a number of tab characters prepended to it
-equal to the number of lower numbered columns that are being printed.
-For example, if column number two is being suppressed, lines printed
-in column number one will not have any tabs preceding them, and lines
-printed in column number three will have one.
-.Pp
-The
-.Nm
-utility assumes that the files are lexically sorted; all characters
-participate in line comparisons.
-.Sh ENVIRONMENT
-The
-.Ev LANG ,
-.Ev LC_ALL ,
-.Ev LC_COLLATE ,
-and
-.Ev LC_CTYPE
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr cmp 1 ,
-.Xr diff 1 ,
-.Xr sort 1 ,
-.Xr uniq 1
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.2-92 .
-.Pp
-The
-.Fl i
-option is an extension to the
-.Tn POSIX
-standard.
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v4 .
-.Sh BUGS
-Input lines are limited to
-.Dv LINE_MAX
-(2048) characters in length.
diff --git a/usr.bin/comm/comm.c b/usr.bin/comm/comm.c
deleted file mode 100644
index ea92673..0000000
--- a/usr.bin/comm/comm.c
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright (c) 1989, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Case Larsen.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1989, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#if 0
-#ifndef lint
-static char sccsid[] = "From: @(#)comm.c 8.4 (Berkeley) 5/4/95";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <limits.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-#include <wctype.h>
-
-#define MAXLINELEN (LINE_MAX + 1)
-
-const wchar_t *tabs[] = { L"", L"\t", L"\t\t" };
-
-FILE *file(const char *);
-wchar_t *getline(wchar_t *, size_t *, FILE *);
-void show(FILE *, const char *, const wchar_t *, wchar_t *, size_t *);
-int wcsicoll(const wchar_t *, const wchar_t *);
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- int comp, read1, read2;
- int ch, flag1, flag2, flag3, iflag;
- FILE *fp1, *fp2;
- const wchar_t *col1, *col2, *col3;
- size_t line1len, line2len;
- wchar_t *line1, *line2;
- const wchar_t **p;
-
- flag1 = flag2 = flag3 = 1;
- iflag = 0;
-
- line1len = MAXLINELEN;
- line2len = MAXLINELEN;
- line1 = malloc(line1len * sizeof(*line1));
- line2 = malloc(line2len * sizeof(*line2));
- if (line1 == NULL || line2 == NULL)
- err(1, "malloc");
-
- (void) setlocale(LC_ALL, "");
-
- while ((ch = getopt(argc, argv, "123i")) != -1)
- switch(ch) {
- case '1':
- flag1 = 0;
- break;
- case '2':
- flag2 = 0;
- break;
- case '3':
- flag3 = 0;
- break;
- case 'i':
- iflag = 1;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (argc != 2)
- usage();
-
- fp1 = file(argv[0]);
- fp2 = file(argv[1]);
-
- /* for each column printed, add another tab offset */
- p = tabs;
- col1 = col2 = col3 = NULL;
- if (flag1)
- col1 = *p++;
- if (flag2)
- col2 = *p++;
- if (flag3)
- col3 = *p;
-
- for (read1 = read2 = 1;;) {
- /* read next line, check for EOF */
- if (read1) {
- line1 = getline(line1, &line1len, fp1);
- if (line1 == NULL && ferror(fp1))
- err(1, "%s", argv[0]);
- }
- if (read2) {
- line2 = getline(line2, &line2len, fp2);
- if (line2 == NULL && ferror(fp2))
- err(1, "%s", argv[1]);
- }
-
- /* if one file done, display the rest of the other file */
- if (line1 == NULL) {
- if (line2 != NULL && col2 != NULL)
- show(fp2, argv[1], col2, line2, &line2len);
- break;
- }
- if (line2 == NULL) {
- if (line1 != NULL && col1 != NULL)
- show(fp1, argv[0], col1, line1, &line1len);
- break;
- }
-
- /* lines are the same */
- if(iflag)
- comp = wcsicoll(line1, line2);
- else
- comp = wcscoll(line1, line2);
-
- if (!comp) {
- read1 = read2 = 1;
- if (col3 != NULL)
- (void)printf("%ls%ls", col3, line1);
- continue;
- }
-
- /* lines are different */
- if (comp < 0) {
- read1 = 1;
- read2 = 0;
- if (col1 != NULL)
- (void)printf("%ls%ls", col1, line1);
- } else {
- read1 = 0;
- read2 = 1;
- if (col2 != NULL)
- (void)printf("%ls%ls", col2, line2);
- }
- }
- exit(0);
-}
-
-wchar_t *
-getline(wchar_t *buf, size_t *buflen, FILE *fp)
-{
- size_t bufpos;
- wint_t ch;
-
- bufpos = 0;
- do {
- if ((ch = getwc(fp)) != WEOF) {
- if (bufpos + 2 >= *buflen) {
- *buflen = *buflen * 2;
- buf = reallocf(buf, *buflen * sizeof(*buf));
- if (buf == NULL)
- return (NULL);
- }
- buf[bufpos++] = ch;
- }
- } while (ch != WEOF && ch != '\n');
- if (bufpos + 1 != *buflen)
- buf[bufpos] = '\0';
-
- return (bufpos != 0 || ch == '\n' ? buf : NULL);
-}
-
-void
-show(FILE *fp, const char *fn, const wchar_t *offset, wchar_t *buf, size_t *buflen)
-{
-
- do {
- (void)printf("%ls%ls", offset, buf);
- } while ((buf = getline(buf, buflen, fp)) != NULL);
- if (ferror(fp))
- err(1, "%s", fn);
-}
-
-FILE *
-file(const char *name)
-{
- FILE *fp;
-
- if (!strcmp(name, "-"))
- return (stdin);
- if ((fp = fopen(name, "r")) == NULL) {
- err(1, "%s", name);
- }
- return (fp);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "usage: comm [-123i] file1 file2\n");
- exit(1);
-}
-
-static size_t wcsicoll_l1_buflen = 0, wcsicoll_l2_buflen = 0;
-static wchar_t *wcsicoll_l1_buf = NULL, *wcsicoll_l2_buf = NULL;
-
-int
-wcsicoll(const wchar_t *s1, const wchar_t *s2)
-{
- wchar_t *p;
- size_t l1, l2;
- size_t new_l1_buflen, new_l2_buflen;
-
- l1 = wcslen(s1) + 1;
- l2 = wcslen(s2) + 1;
- new_l1_buflen = wcsicoll_l1_buflen;
- new_l2_buflen = wcsicoll_l2_buflen;
- while (new_l1_buflen < l1) {
- if (new_l1_buflen == 0)
- new_l1_buflen = MAXLINELEN;
- else
- new_l1_buflen *= 2;
- }
- while (new_l2_buflen < l2) {
- if (new_l2_buflen == 0)
- new_l2_buflen = MAXLINELEN;
- else
- new_l2_buflen *= 2;
- }
- if (new_l1_buflen > wcsicoll_l1_buflen) {
- wcsicoll_l1_buf = reallocf(wcsicoll_l1_buf, new_l1_buflen * sizeof(*wcsicoll_l1_buf));
- if (wcsicoll_l1_buf == NULL)
- err(1, "reallocf");
- wcsicoll_l1_buflen = new_l1_buflen;
- }
- if (new_l2_buflen > wcsicoll_l2_buflen) {
- wcsicoll_l2_buf = reallocf(wcsicoll_l2_buf, new_l2_buflen * sizeof(*wcsicoll_l2_buf));
- if (wcsicoll_l2_buf == NULL)
- err(1, "reallocf");
- wcsicoll_l2_buflen = new_l2_buflen;
- }
-
- for (p = wcsicoll_l1_buf; *s1; s1++)
- *p++ = towlower(*s1);
- *p = '\0';
- for (p = wcsicoll_l2_buf; *s2; s2++)
- *p++ = towlower(*s2);
- *p = '\0';
-
- return (wcscoll(wcsicoll_l1_buf, wcsicoll_l2_buf));
-}
diff --git a/usr.bin/compile_et/Makefile b/usr.bin/compile_et/Makefile
deleted file mode 100644
index 3d4ab15..0000000
--- a/usr.bin/compile_et/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# $FreeBSD$
-
-.PATH: ${.CURDIR}/../../contrib/com_err
-
-PROG= compile_et
-SRCS= compile_et.c parse.y lex.l getarg.c
-CFLAGS+=-I. -I${.CURDIR}/../../contrib/com_err
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/compress/Makefile b/usr.bin/compress/Makefile
deleted file mode 100644
index 45c0814..0000000
--- a/usr.bin/compress/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-# @(#)Makefile 8.2 (Berkeley) 4/17/94
-# $FreeBSD$
-
-PROG= compress
-SRCS= compress.c zopen.c
-LINKS= ${BINDIR}/compress ${BINDIR}/uncompress
-MLINKS= compress.1 uncompress.1
-WARNS?= 6
-
-# XXX zopen is not part of libc
-# MAN=zopen.3
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/compress/compress.1 b/usr.bin/compress/compress.1
deleted file mode 100644
index c37562f..0000000
--- a/usr.bin/compress/compress.1
+++ /dev/null
@@ -1,257 +0,0 @@
-.\" Copyright (c) 1986, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" James A. Woods, derived from original work by Spencer Thomas
-.\" and Joseph Orost.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)compress.1 8.2 (Berkeley) 4/18/94
-.\" $FreeBSD$
-.\"
-.Dd May 17, 2002
-.Dt COMPRESS 1
-.Os
-.Sh NAME
-.Nm compress ,
-.Nm uncompress
-.Nd compress and expand data
-.Sh SYNOPSIS
-.Nm
-.Op Fl fv
-.Op Fl b Ar bits
-.Op Ar
-.Nm
-.Fl c
-.Op Fl b Ar bits
-.Op Ar file
-.Nm uncompress
-.Op Fl f
-.Op Ar
-.Nm uncompress
-.Fl c
-.Op Ar file
-.Sh DESCRIPTION
-The
-.Nm
-utility reduces the size of files using adaptive Lempel-Ziv coding.
-Each
-.Ar file
-is renamed to the same name plus the extension
-.Pa .Z .
-A
-.Ar file
-argument with a
-.Pa .Z
-extension will be ignored except it will cause an
-error exit after other arguments are processed.
-If compression would not reduce the size of a
-.Ar file ,
-the file is ignored.
-.Pp
-The
-.Nm uncompress
-utility restores compressed files to their original form, renaming the
-files by deleting the
-.Pa .Z
-extensions.
-A file specification need not include the file's
-.Pa .Z
-extension.
-If a file's name in its file system does not have a
-.Pa .Z
-extension, it will not be uncompressed and it will cause
-an error exit after other arguments are processed.
-.Pp
-If renaming the files would cause files to be overwritten and the standard
-input device is a terminal, the user is prompted (on the standard error
-output) for confirmation.
-If prompting is not possible or confirmation is not received, the files
-are not overwritten.
-.Pp
-As many of the modification time, access time, file flags, file mode,
-user ID, and group ID as allowed by permissions are retained in the
-new file.
-.Pp
-If no files are specified or a
-.Ar file
-argument is a single dash
-.Pq Sq Fl ,
-the standard input is compressed or uncompressed to the standard output.
-If either the input and output files are not regular files, the checks for
-reduction in size and file overwriting are not performed, the input file is
-not removed, and the attributes of the input file are not retained
-in the output file.
-.Pp
-The options are as follows:
-.Bl -tag -width ".Fl b Ar bits"
-.It Fl b Ar bits
-The code size (see below) is limited to
-.Ar bits ,
-which must be in the range 9..16.
-The default is 16.
-.It Fl c
-Compressed or uncompressed output is written to the standard output.
-No files are modified.
-The
-.Fl v
-option is ignored.
-Compression is attempted even if the results will be larger than the
-original.
-.It Fl f
-Files are overwritten without prompting for confirmation.
-Also, for
-.Nm compress ,
-files are compressed even if they are not actually reduced in size.
-.It Fl v
-Print the percentage reduction of each file.
-Ignored by
-.Nm uncompress
-or if the
-.Fl c
-option is also used.
-.El
-.Pp
-The
-.Nm
-utility uses a modified Lempel-Ziv algorithm.
-Common substrings in the file are first replaced by 9-bit codes 257 and up.
-When code 512 is reached, the algorithm switches to 10-bit codes and
-continues to use more bits until the
-limit specified by the
-.Fl b
-option or its default is reached.
-.Pp
-After the limit is reached,
-.Nm
-periodically checks the compression ratio.
-If it is increasing,
-.Nm
-continues to use the existing code dictionary.
-However, if the compression ratio decreases,
-.Nm
-discards the table of substrings and rebuilds it from scratch.
-This allows
-the algorithm to adapt to the next "block" of the file.
-.Pp
-The
-.Fl b
-option is unavailable for
-.Nm uncompress
-since the
-.Ar bits
-parameter specified during compression
-is encoded within the output, along with
-a magic number to ensure that neither decompression of random data nor
-recompression of compressed data is attempted.
-.Pp
-The amount of compression obtained depends on the size of the
-input, the number of
-.Ar bits
-per code, and the distribution of common substrings.
-Typically, text such as source code or English is reduced by 50\-60%.
-Compression is generally much better than that achieved by Huffman
-coding (as used in the historical command pack), or adaptive Huffman
-coding (as used in the historical command compact), and takes less
-time to compute.
-.Sh EXIT STATUS
-.Ex -std compress uncompress
-.Pp
-The
-.Nm compress
-utility exits 2 if attempting to compress a file would not reduce its size
-and the
-.Fl f
-option was not specified and if no other error occurs.
-.Sh SEE ALSO
-.Xr gunzip 1 ,
-.Xr gzexe 1 ,
-.Xr gzip 1 ,
-.Xr zcat 1 ,
-.Xr zmore 1 ,
-.Xr znew 1
-.Rs
-.%A Welch, Terry A.
-.%D June, 1984
-.%T "A Technique for High Performance Data Compression"
-.%J "IEEE Computer"
-.%V 17:6
-.%P pp. 8-19
-.Re
-.Sh STANDARDS
-The
-.Nm compress
-and
-.Nm uncompress
-utilities conform to
-.St -p1003.1-2001 .
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.3 .
-.Sh BUGS
-Some of these might be considered otherwise-undocumented features.
-.Pp
-.Nm compress :
-If the utility does not compress a file because doing so would not
-reduce its size, and a file of the same name except with an
-.Pa .Z
-extension exists, the named file is not really ignored as stated above;
-it causes a prompt to confirm the overwriting of the file with the extension.
-If the operation is confirmed, that file is deleted.
-.Pp
-.Nm uncompress :
-If an empty file is compressed (using
-.Fl f ) ,
-the resulting
-.Pa .Z
-file is also empty.
-That seems right, but if
-.Nm uncompress
-is then used on that file, an error will occur.
-.Pp
-Both utilities: If a
-.Sq Fl
-argument is used and the utility prompts the user, the standard input
-is taken as the user's reply to the prompt.
-.Pp
-Both utilities:
-If the specified file does not exist, but a similarly-named one with (for
-.Nm compress )
-or without (for
-.Nm uncompress )
-a
-.Pa .Z
-extension does exist, the utility will waste the user's time by not
-immediately emitting an error message about the missing file and
-continuing.
-Instead, it first asks for confirmation to overwrite
-the existing file and then does not overwrite it.
diff --git a/usr.bin/compress/compress.c b/usr.bin/compress/compress.c
deleted file mode 100644
index 584f283..0000000
--- a/usr.bin/compress/compress.c
+++ /dev/null
@@ -1,440 +0,0 @@
-/*-
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1992, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)compress.c 8.2 (Berkeley) 1/7/94";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-
-#include <err.h>
-#include <errno.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "zopen.h"
-
-void compress(const char *, const char *, int);
-void cwarn(const char *, ...) __printflike(1, 2);
-void cwarnx(const char *, ...) __printflike(1, 2);
-void decompress(const char *, const char *, int);
-int permission(const char *);
-void setfile(const char *, struct stat *);
-void usage(int);
-
-int eval, force, verbose;
-
-int
-main(int argc, char *argv[])
-{
- enum {COMPRESS, DECOMPRESS} style;
- size_t len;
- int bits, cat, ch;
- char *p, newname[MAXPATHLEN];
-
- cat = 0;
- if ((p = rindex(argv[0], '/')) == NULL)
- p = argv[0];
- else
- ++p;
- if (!strcmp(p, "uncompress"))
- style = DECOMPRESS;
- else if (!strcmp(p, "compress"))
- style = COMPRESS;
- else if (!strcmp(p, "zcat")) {
- cat = 1;
- style = DECOMPRESS;
- } else
- errx(1, "unknown program name");
-
- bits = 0;
- while ((ch = getopt(argc, argv, "b:cdfv")) != -1)
- switch(ch) {
- case 'b':
- bits = strtol(optarg, &p, 10);
- if (*p)
- errx(1, "illegal bit count -- %s", optarg);
- break;
- case 'c':
- cat = 1;
- break;
- case 'd': /* Backward compatible. */
- style = DECOMPRESS;
- break;
- case 'f':
- force = 1;
- break;
- case 'v':
- verbose = 1;
- break;
- case '?':
- default:
- usage(style == COMPRESS);
- }
- argc -= optind;
- argv += optind;
-
- if (argc == 0) {
- switch(style) {
- case COMPRESS:
- (void)compress("/dev/stdin", "/dev/stdout", bits);
- break;
- case DECOMPRESS:
- (void)decompress("/dev/stdin", "/dev/stdout", bits);
- break;
- }
- exit (eval);
- }
-
- if (cat == 1 && argc > 1)
- errx(1, "the -c option permits only a single file argument");
-
- for (; *argv; ++argv)
- switch(style) {
- case COMPRESS:
- if (strcmp(*argv, "-") == 0) {
- compress("/dev/stdin", "/dev/stdout", bits);
- break;
- } else if (cat) {
- compress(*argv, "/dev/stdout", bits);
- break;
- }
- if ((p = rindex(*argv, '.')) != NULL &&
- !strcmp(p, ".Z")) {
- cwarnx("%s: name already has trailing .Z",
- *argv);
- break;
- }
- len = strlen(*argv);
- if (len > sizeof(newname) - 3) {
- cwarnx("%s: name too long", *argv);
- break;
- }
- memmove(newname, *argv, len);
- newname[len] = '.';
- newname[len + 1] = 'Z';
- newname[len + 2] = '\0';
- compress(*argv, newname, bits);
- break;
- case DECOMPRESS:
- if (strcmp(*argv, "-") == 0) {
- decompress("/dev/stdin", "/dev/stdout", bits);
- break;
- }
- len = strlen(*argv);
- if ((p = rindex(*argv, '.')) == NULL ||
- strcmp(p, ".Z")) {
- if (len > sizeof(newname) - 3) {
- cwarnx("%s: name too long", *argv);
- break;
- }
- memmove(newname, *argv, len);
- newname[len] = '.';
- newname[len + 1] = 'Z';
- newname[len + 2] = '\0';
- decompress(newname,
- cat ? "/dev/stdout" : *argv, bits);
- } else {
- if (len - 2 > sizeof(newname) - 1) {
- cwarnx("%s: name too long", *argv);
- break;
- }
- memmove(newname, *argv, len - 2);
- newname[len - 2] = '\0';
- decompress(*argv,
- cat ? "/dev/stdout" : newname, bits);
- }
- break;
- }
- exit (eval);
-}
-
-void
-compress(const char *in, const char *out, int bits)
-{
- size_t nr;
- struct stat isb, sb;
- FILE *ifp, *ofp;
- int exists, isreg, oreg;
- u_char buf[1024];
-
- exists = !stat(out, &sb);
- if (!force && exists && S_ISREG(sb.st_mode) && !permission(out))
- return;
- isreg = oreg = !exists || S_ISREG(sb.st_mode);
-
- ifp = ofp = NULL;
- if ((ifp = fopen(in, "r")) == NULL) {
- cwarn("%s", in);
- return;
- }
- if (stat(in, &isb)) { /* DON'T FSTAT! */
- cwarn("%s", in);
- goto err;
- }
- if (!S_ISREG(isb.st_mode))
- isreg = 0;
-
- if ((ofp = zopen(out, "w", bits)) == NULL) {
- cwarn("%s", out);
- goto err;
- }
- while ((nr = fread(buf, 1, sizeof(buf), ifp)) != 0)
- if (fwrite(buf, 1, nr, ofp) != nr) {
- cwarn("%s", out);
- goto err;
- }
-
- if (ferror(ifp) || fclose(ifp)) {
- cwarn("%s", in);
- goto err;
- }
- ifp = NULL;
-
- if (fclose(ofp)) {
- cwarn("%s", out);
- goto err;
- }
- ofp = NULL;
-
- if (isreg) {
- if (stat(out, &sb)) {
- cwarn("%s", out);
- goto err;
- }
-
- if (!force && sb.st_size >= isb.st_size) {
- if (verbose)
- (void)fprintf(stderr, "%s: file would grow; left unmodified\n",
- in);
- eval = 2;
- if (unlink(out))
- cwarn("%s", out);
- goto err;
- }
-
- setfile(out, &isb);
-
- if (unlink(in))
- cwarn("%s", in);
-
- if (verbose) {
- (void)fprintf(stderr, "%s: ", out);
- if (isb.st_size > sb.st_size)
- (void)fprintf(stderr, "%.0f%% compression\n",
- ((float)sb.st_size / isb.st_size) * 100.0);
- else
- (void)fprintf(stderr, "%.0f%% expansion\n",
- ((float)isb.st_size / sb.st_size) * 100.0);
- }
- }
- return;
-
-err: if (ofp) {
- if (oreg)
- (void)unlink(out);
- (void)fclose(ofp);
- }
- if (ifp)
- (void)fclose(ifp);
-}
-
-void
-decompress(const char *in, const char *out, int bits)
-{
- size_t nr;
- struct stat sb;
- FILE *ifp, *ofp;
- int exists, isreg, oreg;
- u_char buf[1024];
-
- exists = !stat(out, &sb);
- if (!force && exists && S_ISREG(sb.st_mode) && !permission(out))
- return;
- isreg = oreg = !exists || S_ISREG(sb.st_mode);
-
- ifp = ofp = NULL;
- if ((ifp = zopen(in, "r", bits)) == NULL) {
- cwarn("%s", in);
- return;
- }
- if (stat(in, &sb)) {
- cwarn("%s", in);
- goto err;
- }
- if (!S_ISREG(sb.st_mode))
- isreg = 0;
-
- /*
- * Try to read the first few uncompressed bytes from the input file
- * before blindly truncating the output file.
- */
- if ((nr = fread(buf, 1, sizeof(buf), ifp)) == 0) {
- cwarn("%s", in);
- (void)fclose(ifp);
- return;
- }
- if ((ofp = fopen(out, "w")) == NULL ||
- (nr != 0 && fwrite(buf, 1, nr, ofp) != nr)) {
- cwarn("%s", out);
- (void)fclose(ifp);
- return;
- }
-
- while ((nr = fread(buf, 1, sizeof(buf), ifp)) != 0)
- if (fwrite(buf, 1, nr, ofp) != nr) {
- cwarn("%s", out);
- goto err;
- }
-
- if (ferror(ifp) || fclose(ifp)) {
- cwarn("%s", in);
- goto err;
- }
- ifp = NULL;
-
- if (fclose(ofp)) {
- cwarn("%s", out);
- goto err;
- }
-
- if (isreg) {
- setfile(out, &sb);
-
- if (unlink(in))
- cwarn("%s", in);
- }
- return;
-
-err: if (ofp) {
- if (oreg)
- (void)unlink(out);
- (void)fclose(ofp);
- }
- if (ifp)
- (void)fclose(ifp);
-}
-
-void
-setfile(const char *name, struct stat *fs)
-{
- static struct timeval tv[2];
-
- fs->st_mode &= S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO;
-
- TIMESPEC_TO_TIMEVAL(&tv[0], &fs->st_atimespec);
- TIMESPEC_TO_TIMEVAL(&tv[1], &fs->st_mtimespec);
- if (utimes(name, tv))
- cwarn("utimes: %s", name);
-
- /*
- * Changing the ownership probably won't succeed, unless we're root
- * or POSIX_CHOWN_RESTRICTED is not set. Set uid/gid before setting
- * the mode; current BSD behavior is to remove all setuid bits on
- * chown. If chown fails, lose setuid/setgid bits.
- */
- if (chown(name, fs->st_uid, fs->st_gid)) {
- if (errno != EPERM)
- cwarn("chown: %s", name);
- fs->st_mode &= ~(S_ISUID|S_ISGID);
- }
- if (chmod(name, fs->st_mode) && errno != EOPNOTSUPP)
- cwarn("chmod: %s", name);
-
- if (chflags(name, fs->st_flags) && errno != EOPNOTSUPP)
- cwarn("chflags: %s", name);
-}
-
-int
-permission(const char *fname)
-{
- int ch, first;
-
- if (!isatty(fileno(stderr)))
- return (0);
- (void)fprintf(stderr, "overwrite %s? ", fname);
- first = ch = getchar();
- while (ch != '\n' && ch != EOF)
- ch = getchar();
- return (first == 'y');
-}
-
-void
-usage(int iscompress)
-{
- if (iscompress)
- (void)fprintf(stderr,
- "usage: compress [-cfv] [-b bits] [file ...]\n");
- else
- (void)fprintf(stderr,
- "usage: uncompress [-c] [-b bits] [file ...]\n");
- exit(1);
-}
-
-void
-cwarnx(const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- vwarnx(fmt, ap);
- va_end(ap);
- eval = 1;
-}
-
-void
-cwarn(const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- vwarn(fmt, ap);
- va_end(ap);
- eval = 1;
-}
diff --git a/usr.bin/compress/doc/NOTES b/usr.bin/compress/doc/NOTES
deleted file mode 100644
index d400c9b..0000000
--- a/usr.bin/compress/doc/NOTES
+++ /dev/null
@@ -1,142 +0,0 @@
-
- $FreeBSD$
-
-From: James A. Woods <jaw@eos.arc.nasa.gov>
-
->From vn Fri Dec 2 18:05:27 1988
-Subject: Re: Looking for C source for RSA
-Newsgroups: sci.crypt
-
-# Illegitimi noncarborundum
-
-Patents are a tar pit.
-
-A good case can be made that most are just a license to sue, and nothing
-is illegal until a patent is upheld in court.
-
-For example, if you receive netnews by means other than 'nntp',
-these very words are being modulated by 'compress',
-a variation on the patented Lempel-Ziv-Welch algorithm.
-
-Original Ziv-Lempel is patent number 4,464,650, and the more powerful
-LZW method is #4,558,302. Yet despite any similarities between 'compress'
-and LZW (the public-domain 'compress' code was designed and given to the
-world before the ink on the Welch patent was dry), no attorneys from Sperry
-(the assignee) have asked you to unplug your Usenet connection.
-
-Why? I can't speak for them, but it is possible the claims are too broad,
-or, just as bad, not broad enough. ('compress' does things not mentioned
-in the Welch patent.) Maybe they realize that they can commercialize
-LZW better by selling hardware implementations rather than by licensing
-software. Again, the LZW software delineated in the patent is *not*
-the same as that of 'compress'.
-
-At any rate, court-tested software patents are a different animal;
-corporate patents in a portfolio are usually traded like baseball cards
-to shut out small fry rather than actually be defended before
-non-technical juries. Perhaps RSA will undergo this test successfully,
-although the grant to "exclude others from making, using, or selling"
-the invention would then only apply to the U.S. (witness the
-Genentech patent of the TPA molecule in the U.S. but struck down
-in Great Britain as too broad.)
-
-The concept is still exotic for those who learned in school the rule of thumb
-that one may patent "apparatus" but not an "idea".
-Apparently this all changed in Diamond v. Diehr (1981) when the U. S. Supreme
-Court reversed itself.
-
-Scholars should consult the excellent article in the Washington and Lee
-Law Review (fall 1984, vol. 41, no. 4) by Anthony and Colwell for a
-comprehensive survey of an area which will remain murky for some time.
-
-Until the dust clears, how you approach ideas which are patented depends
-on how paranoid you are of a legal onslaught. Arbitrary? Yes. But
-the patent bar the the CCPA (Court of Customs and Patent Appeals)
-thanks you for any uncertainty as they, at least, stand to gain
-from any trouble.
-
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-From: James A. Woods <jaw@eos.arc.nasa.gov>
-Subject: Re: Looking for C source for RSA (actually 'compress' patents)
-
- In article <2042@eos.UUCP> you write:
- >The concept is still exotic for those who learned in school the rule of thumb
- >that one may patent "apparatus" but not an "idea".
-
-A rule of thumb that has never been completely valid, as any chemical
-engineer can tell you. (Chemical processes were among the earliest patents,
-as I recall.)
-
- ah yes -- i date myself when relaying out-of-date advice from elderly
- attorneys who don't even specialize in patents. one other interesting
- class of patents include the output of optical lens design programs,
- which yield formulae which can then fairly directly can be molded
- into glass. although there are restrictions on patenting equations,
- the "embedded systems" seem to fly past the legal gauntlets.
-
- anyway, I'm still learning about intellectual property law after
- several conversations from a Unisys (nee sperry) lawyer re 'compress'.
-
- it's more complicated than this, but they're letting (oral
- communication only) software versions of 'compress' slide
- as far as licensing fees go. this includes 'arc', 'stuffit',
- and other commercial wrappers for 'compress'. yet they are
- signing up licensees for hardware chips. Hewlett-Packard
- supposedly has an active vlsi project, and Unisys has
- board-level LZW-based tape controllers. (to build LZW into
- a disk controller would be strange, as you'd have to build
- in a filesystem too!)
-
- it's byzantine
- that Unisys is in a tiff with HP regarding the patents,
- after discovering some sort of "compress" button on some
- HP terminal product. why? well, professor Abraham Lempel jumped
- from being department chairman of computer science at technion in
- Israel to sperry (where he got the first patent), but then to work
- at Hewlett-Packard on sabbatical. the second Welch patent
- is only weakly derivative of the first, so they want chip
- licenses and HP relented. however, everyone agrees something
- like the current Unix implementation is the way to go with
- software, so HP (and UCB) long ago asked spencer Thomas and i to sign
- off on copyright permission (although they didn't need to, it being pd).
- Lempel, HP, and Unisys grumbles they can't make money off the
- software since a good free implementation (not the best --
- i have more ideas!) escaped via Usenet. (Lempel's own pascal
- code was apparently horribly slow.)
- i don't follow the IBM 'arc' legal bickering; my impression
- is that the pc folks are making money off the archiver/wrapper
- look/feel of the thing [if ms-dos can be said to have a look and feel].
-
- now where is telebit with the compress firmware? in a limbo
- netherworld, probably, with sperry still welcoming outfits
- to sign patent licenses, a common tactic to bring other small fry
- into the fold. the guy who crammed 12-bit compress into the modem
- there left. also what is transpiring with 'compress' and sys 5 rel 4?
- beats me, but if sperry got a hold of them on these issues,
- at&t would likely re-implement another algorithm if they
- thought 'compress' infringes. needful to say, i don't think
- it does after the above mentioned legal conversation.
- my own beliefs on whether algorithms should be patentable at all
- change with the weather. if the courts finally nail down
- patent protection for algorithms, academic publication in
- textbooks will be somewhat at odds with the engineering world,
- where the textbook codes will simply be a big tease to get
- money into the patent holder coffers...
-
- oh, if you implement LZW from the patent, you won't get
- good rates because it doesn't mention adaptive table reset,
- lack thereof being *the* serious deficiency of Thomas' first version.
-
- now i know that patent law generally protects against independent
- re-invention (like the 'xor' hash function pleasantly mentioned
- in the patent [but not the paper]).
- but the upshot is that if anyone ever wanted to sue us,
- we're partially covered with
- independently-developed twists, plus the fact that some of us work
- in a bureaucratic morass (as contractor to a public agency in my case).
-
- quite a mess, huh? I've wanted to tell someone this stuff
- for a long time, for posterity if nothing else.
-
-james
-
diff --git a/usr.bin/compress/doc/README b/usr.bin/compress/doc/README
deleted file mode 100644
index 2b5f6ba..0000000
--- a/usr.bin/compress/doc/README
+++ /dev/null
@@ -1,284 +0,0 @@
-
- @(#)README 8.1 (Berkeley) 6/9/93
- $FreeBSD$
-
-Compress version 4.0 improvements over 3.0:
- o compress() speedup (10-50%) by changing division hash to xor
- o decompress() speedup (5-10%)
- o Memory requirements reduced (3-30%)
- o Stack requirements reduced to less than 4kb
- o Removed 'Big+Fast' compress code (FBITS) because of compress speedup
- o Portability mods for Z8000 and PC/XT (but not zeus 3.2)
- o Default to 'quiet' mode
- o Unification of 'force' flags
- o Manual page overhaul
- o Portability enhancement for M_XENIX
- o Removed text on #else and #endif
- o Added "-V" switch to print version and options
- o Added #defines for SIGNED_COMPARE_SLOW
- o Added Makefile and "usermem" program
- o Removed all floating point computations
- o New programs: [deleted]
-
-The "usermem" script attempts to determine the maximum process size. Some
-editing of the script may be necessary (see the comments). [It should work
-fine on 4.3 BSD.] If you can't get it to work at all, just create file
-"USERMEM" containing the maximum process size in decimal.
-
-The following preprocessor symbols control the compilation of "compress.c":
-
- o USERMEM Maximum process memory on the system
- o SACREDMEM Amount to reserve for other processes
- o SIGNED_COMPARE_SLOW Unsigned compare instructions are faster
- o NO_UCHAR Don't use "unsigned char" types
- o BITS Overrules default set by USERMEM-SACREDMEM
- o vax Generate inline assembler
- o interdata Defines SIGNED_COMPARE_SLOW
- o M_XENIX Makes arrays < 65536 bytes each
- o pdp11 BITS=12, NO_UCHAR
- o z8000 BITS=12
- o pcxt BITS=12
- o BSD4_2 Allow long filenames ( > 14 characters) &
- Call setlinebuf(stderr)
-
-The difference "usermem-sacredmem" determines the maximum BITS that can be
-specified with the "-b" flag.
-
-memory: at least BITS
------- -- ----- ----
- 433,484 16
- 229,600 15
- 127,536 14
- 73,464 13
- 0 12
-
-The default is BITS=16.
-
-The maximum bits can be overruled by specifying "-DBITS=bits" at
-compilation time.
-
-WARNING: files compressed on a large machine with more bits than allowed by
-a version of compress on a smaller machine cannot be decompressed! Use the
-"-b12" flag to generate a file on a large machine that can be uncompressed
-on a 16-bit machine.
-
-The output of compress 4.0 is fully compatible with that of compress 3.0.
-In other words, the output of compress 4.0 may be fed into uncompress 3.0 or
-the output of compress 3.0 may be fed into uncompress 4.0.
-
-The output of compress 4.0 not compatible with that of
-compress 2.0. However, compress 4.0 still accepts the output of
-compress 2.0. To generate output that is compatible with compress
-2.0, use the undocumented "-C" flag.
-
- -from mod.sources, submitted by vax135!petsd!joe (Joe Orost), 8/1/85
---------------------------------
-
-Enclosed is compress version 3.0 with the following changes:
-
-1. "Block" compression is performed. After the BITS run out, the
- compression ratio is checked every so often. If it is decreasing,
- the table is cleared and a new set of substrings are generated.
-
- This makes the output of compress 3.0 not compatible with that of
- compress 2.0. However, compress 3.0 still accepts the output of
- compress 2.0. To generate output that is compatible with compress
- 2.0, use the undocumented "-C" flag.
-
-2. A quiet "-q" flag has been added for use by the news system.
-
-3. The character chaining has been deleted and the program now uses
- hashing. This improves the speed of the program, especially
- during decompression. Other speed improvements have been made,
- such as using putc() instead of fwrite().
-
-4. A large table is used on large machines when a relatively small
- number of bits is specified. This saves much time when compressing
- for a 16-bit machine on a 32-bit virtual machine. Note that the
- speed improvement only occurs when the input file is > 30000
- characters, and the -b BITS is less than or equal to the cutoff
- described below.
-
-Most of these changes were made by James A. Woods (ames!jaw). Thank you
-James!
-
-To compile compress:
-
- cc -O -DUSERMEM=usermem -o compress compress.c
-
-Where "usermem" is the amount of physical user memory available (in bytes).
-If any physical memory is to be reserved for other processes, put in
-"-DSACREDMEM sacredmem", where "sacredmem" is the amount to be reserved.
-
-The difference "usermem-sacredmem" determines the maximum BITS that can be
-specified, and the cutoff bits where the large+fast table is used.
-
-memory: at least BITS cutoff
------- -- ----- ---- ------
- 4,718,592 16 13
- 2,621,440 16 12
- 1,572,864 16 11
- 1,048,576 16 10
- 631,808 16 --
- 329,728 15 --
- 178,176 14 --
- 99,328 13 --
- 0 12 --
-
-The default memory size is 750,000 which gives a maximum BITS=16 and no
-large+fast table.
-
-The maximum bits can be overruled by specifying "-DBITS=bits" at
-compilation time.
-
-If your machine doesn't support unsigned characters, define "NO_UCHAR"
-when compiling.
-
-If your machine has "int" as 16-bits, define "SHORT_INT" when compiling.
-
-After compilation, move "compress" to a standard executable location, such
-as /usr/local. Then:
- cd /usr/local
- ln compress uncompress
- ln compress zcat
-
-On machines that have a fixed stack size (such as Perkin-Elmer), set the
-stack to at least 12kb. ("setstack compress 12" on Perkin-Elmer).
-
-Next, install the manual (compress.l).
- cp compress.l /usr/man/manl
- cd /usr/man/manl
- ln compress.l uncompress.l
- ln compress.l zcat.l
-
- - or -
-
- cp compress.l /usr/man/man1/compress.1
- cd /usr/man/man1
- ln compress.1 uncompress.1
- ln compress.1 zcat.1
-
- regards,
- petsd!joe
-
-Here is a note from the net:
-
->From hplabs!pesnta!amd!turtlevax!ken Sat Jan 5 03:35:20 1985
-Path: ames!hplabs!pesnta!amd!turtlevax!ken
-From: ken@turtlevax.UUCP (Ken Turkowski)
-Newsgroups: net.sources
-Subject: Re: Compress release 3.0 : sample Makefile
-Organization: CADLINC, Inc. @ Menlo Park, CA
-
-In the compress 3.0 source recently posted to mod.sources, there is a
-#define variable which can be set for optimum performance on a machine
-with a large amount of memory. A program (usermem) to calculate the
-usable amount of physical user memory is enclosed, as well as a sample
-4.2BSD Vax Makefile for compress.
-
-Here is the README file from the previous version of compress (2.0):
-
->Enclosed is compress.c version 2.0 with the following bugs fixed:
->
->1. The packed files produced by compress are different on different
-> machines and dependent on the vax sysgen option.
-> The bug was in the different byte/bit ordering on the
-> various machines. This has been fixed.
->
-> This version is NOT compatible with the original vax posting
-> unless the '-DCOMPATIBLE' option is specified to the C
-> compiler. The original posting has a bug which I fixed,
-> causing incompatible files. I recommend you NOT to use this
-> option unless you already have a lot of packed files from
-> the original posting by Thomas.
->2. The exit status is not well defined (on some machines) causing the
-> scripts to fail.
-> The exit status is now 0,1 or 2 and is documented in
-> compress.l.
->3. The function getopt() is not available in all C libraries.
-> The function getopt() is no longer referenced by the
-> program.
->4. Error status is not being checked on the fwrite() and fflush() calls.
-> Fixed.
->
->The following enhancements have been made:
->
->1. Added facilities of "compact" into the compress program. "Pack",
-> "Unpack", and "Pcat" are no longer required (no longer supplied).
->2. Installed work around for C compiler bug with "-O".
->3. Added a magic number header (\037\235). Put the bits specified
-> in the file.
->4. Added "-f" flag to force overwrite of output file.
->5. Added "-c" flag and "zcat" program. 'ln compress zcat' after you
-> compile.
->6. The 'uncompress' script has been deleted; simply
-> 'ln compress uncompress' after you compile and it will work.
->7. Removed extra bit masking for machines that support unsigned
-> characters. If your machine doesn't support unsigned characters,
-> define "NO_UCHAR" when compiling.
->
->Compile "compress.c" with "-O -o compress" flags. Move "compress" to a
->standard executable location, such as /usr/local. Then:
-> cd /usr/local
-> ln compress uncompress
-> ln compress zcat
->
->On machines that have a fixed stack size (such as Perkin-Elmer), set the
->stack to at least 12kb. ("setstack compress 12" on Perkin-Elmer).
->
->Next, install the manual (compress.l).
-> cp compress.l /usr/man/manl - or -
-> cp compress.l /usr/man/man1/compress.1
->
->Here is the README that I sent with my first posting:
->
->>Enclosed is a modified version of compress.c, along with scripts to make it
->>run identically to pack(1), unpack(1), and pcat(1). Here is what I
->>(petsd!joe) and a colleague (petsd!peora!srd) did:
->>
->>1. Removed VAX dependencies.
->>2. Changed the struct to separate arrays; saves mucho memory.
->>3. Did comparisons in unsigned, where possible. (Faster on Perkin-Elmer.)
->>4. Sorted the character next chain and changed the search to stop
->>prematurely. This saves a lot on the execution time when compressing.
->>
->>This version is totally compatible with the original version. Even though
->>lint(1) -p has no complaints about compress.c, it won't run on a 16-bit
->>machine, due to the size of the arrays.
->>
->>Here is the README file from the original author:
->>
->>>Well, with all this discussion about file compression (for news batching
->>>in particular) going around, I decided to implement the text compression
->>>algorithm described in the June Computer magazine. The author claimed
->>>blinding speed and good compression ratios. It's certainly faster than
->>>compact (but, then, what wouldn't be), but it's also the same speed as
->>>pack, and gets better compression than both of them. On 350K bytes of
->>>Unix-wizards, compact took about 8 minutes of CPU, pack took about 80
->>>seconds, and compress (herein) also took 80 seconds. But, compact and
->>>pack got about 30% compression, whereas compress got over 50%. So, I
->>>decided I had something, and that others might be interested, too.
->>>
->>>As is probably true of compact and pack (although I haven't checked),
->>>the byte order within a word is probably relevant here, but as long as
->>>you stay on a single machine type, you should be ok. (Can anybody
->>>elucidate on this?) There are a couple of asm's in the code (extv and
->>>insv instructions), so anyone porting it to another machine will have to
->>>deal with this anyway (and could probably make it compatible with Vax
->>>byte order at the same time). Anyway, I've linted the code (both with
->>>and without -p), so it should run elsewhere. Note the longs in the
->>>code, you can take these out if you reduce BITS to <= 15.
->>>
->>>Have fun, and as always, if you make good enhancements, or bug fixes,
->>>I'd like to see them.
->>>
->>>=Spencer (thomas@utah-20, {harpo,hplabs,arizona}!utah-cs!thomas)
->>
->> regards,
->> joe
->>
->>--
->>Full-Name: Joseph M. Orost
->>UUCP: ..!{decvax,ucbvax,ihnp4}!vax135!petsd!joe
->>US Mail: MS 313; Perkin-Elmer; 106 Apple St; Tinton Falls, NJ 07724
->>Phone: (201) 870-5844
diff --git a/usr.bin/compress/doc/revision.log b/usr.bin/compress/doc/revision.log
deleted file mode 100644
index 57e0337..0000000
--- a/usr.bin/compress/doc/revision.log
+++ /dev/null
@@ -1,118 +0,0 @@
-/* $FreeBSD$ */
-
-/*
- * $Header: compress.c,v 4.0 85/07/30 12:50:00 joe Release $
- * $Log: compress.c,v $
- * Revision 4.0 85/07/30 12:50:00 joe
- * Removed ferror() calls in output routine on every output except first.
- * Prepared for release to the world.
- *
- * Revision 3.6 85/07/04 01:22:21 joe
- * Remove much wasted storage by overlaying hash table with the tables
- * used by decompress: tab_suffix[1<<BITS], stack[8000]. Updated USERMEM
- * computations. Fixed dump_tab() DEBUG routine.
- *
- * Revision 3.5 85/06/30 20:47:21 jaw
- * Change hash function to use exclusive-or. Rip out hash cache. These
- * speedups render the megamemory version defunct, for now. Make decoder
- * stack global. Parts of the RCS trunks 2.7, 2.6, and 2.1 no longer apply.
- *
- * Revision 3.4 85/06/27 12:00:00 ken
- * Get rid of all floating-point calculations by doing all compression ratio
- * calculations in fixed point.
- *
- * Revision 3.3 85/06/24 21:53:24 joe
- * Incorporate portability suggestion for M_XENIX. Got rid of text on #else
- * and #endif lines. Cleaned up #ifdefs for vax and interdata.
- *
- * Revision 3.2 85/06/06 21:53:24 jaw
- * Incorporate portability suggestions for Z8000, IBM PC/XT from mailing list.
- * Default to "quiet" output (no compression statistics).
- *
- * Revision 3.1 85/05/12 18:56:13 jaw
- * Integrate decompress() stack speedups (from early pointer mods by McKie).
- * Repair multi-file USERMEM gaffe. Unify 'force' flags to mimic semantics
- * of SVR2 'pack'. Streamline block-compress table clear logic. Increase
- * output byte count by magic number size.
- *
- * Revision 3.0 84/11/27 11:50:00 petsd!joe
- * Set HSIZE depending on BITS. Set BITS depending on USERMEM. Unrolled
- * loops in clear routines. Added "-C" flag for 2.0 compatibility. Used
- * unsigned compares on Perkin-Elmer. Fixed foreground check.
- *
- * Revision 2.7 84/11/16 19:35:39 ames!jaw
- * Cache common hash codes based on input statistics; this improves
- * performance for low-density raster images. Pass on #ifdef bundle
- * from Turkowski.
- *
- * Revision 2.6 84/11/05 19:18:21 ames!jaw
- * Vary size of hash tables to reduce time for small files.
- * Tune PDP-11 hash function.
- *
- * Revision 2.5 84/10/30 20:15:14 ames!jaw
- * Junk chaining; replace with the simpler (and, on the VAX, faster)
- * double hashing, discussed within. Make block compression standard.
- *
- * Revision 2.4 84/10/16 11:11:11 ames!jaw
- * Introduce adaptive reset for block compression, to boost the rate
- * another several percent. (See mailing list notes.)
- *
- * Revision 2.3 84/09/22 22:00:00 petsd!joe
- * Implemented "-B" block compress. Implemented REVERSE sorting of tab_next.
- * Bug fix for last bits. Changed fwrite to putchar loop everywhere.
- *
- * Revision 2.2 84/09/18 14:12:21 ames!jaw
- * Fold in news changes, small machine typedef from thomas,
- * #ifdef interdata from joe.
- *
- * Revision 2.1 84/09/10 12:34:56 ames!jaw
- * Configured fast table lookup for 32-bit machines.
- * This cuts user time in half for b <= FBITS, and is useful for news batching
- * from VAX to PDP sites. Also sped up decompress() [fwrite->putc] and
- * added signal catcher [plus beef in writeerr()] to delete effluvia.
- *
- * Revision 2.0 84/08/28 22:00:00 petsd!joe
- * Add check for foreground before prompting user. Insert maxbits into
- * compressed file. Force file being uncompressed to end with ".Z".
- * Added "-c" flag and "zcat". Prepared for release.
- *
- * Revision 1.10 84/08/24 18:28:00 turtlevax!ken
- * Will only compress regular files (no directories), added a magic number
- * header (plus an undocumented -n flag to handle old files without headers),
- * added -f flag to force overwriting of possibly existing destination file,
- * otherwise the user is prompted for a response. Will tack on a .Z to a
- * filename if it doesn't have one when decompressing. Will only replace
- * file if it was compressed.
- *
- * Revision 1.9 84/08/16 17:28:00 turtlevax!ken
- * Removed scanargs(), getopt(), added .Z extension and unlimited number of
- * filenames to compress. Flags may be clustered (-Ddvb12) or separated
- * (-D -d -v -b 12), or combination thereof. Modes and other status is
- * copied with copystat(). -O bug for 4.2 seems to have disappeared with
- * 1.8.
- *
- * Revision 1.8 84/08/09 23:15:00 joe
- * Made it compatible with vax version, installed jim's fixes/enhancements
- *
- * Revision 1.6 84/08/01 22:08:00 joe
- * Sped up algorithm significantly by sorting the compress chain.
- *
- * Revision 1.5 84/07/13 13:11:00 srd
- * Added C version of vax asm routines. Changed structure to arrays to
- * save much memory. Do unsigned compares where possible (faster on
- * Perkin-Elmer)
- *
- * Revision 1.4 84/07/05 03:11:11 thomas
- * Clean up the code a little and lint it. (Lint complains about all
- * the regs used in the asm, but I'm not going to "fix" this.)
- *
- * Revision 1.3 84/07/05 02:06:54 thomas
- * Minor fixes.
- *
- * Revision 1.2 84/07/05 00:27:27 thomas
- * Add variable bit length output.
- *
- */
-
-static char rcs_ident[] =
- "$Header: compress.c,v 4.0 85/07/30 12:50:00 joe Release $";
diff --git a/usr.bin/compress/zopen.3 b/usr.bin/compress/zopen.3
deleted file mode 100644
index a1ffbf7..0000000
--- a/usr.bin/compress/zopen.3
+++ /dev/null
@@ -1,141 +0,0 @@
-.\" Copyright (c) 1992, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)zopen.3 8.1 (Berkeley) 6/9/93
-.\" $FreeBSD$
-.\"
-.Dd June 9, 1993
-.Dt ZOPEN 3
-.Os
-.Sh NAME
-.Nm zopen
-.Nd compressed stream open function
-.Sh SYNOPSIS
-.Fd #include \&"zopen.h\&"
-.Ft FILE *
-.Fn zopen "const char *path" "const char *mode" "int bits"
-.Sh DESCRIPTION
-The
-.Fn zopen
-function
-opens the compressed file whose name is the string pointed to by
-.Fa path
-and associates a stream with it.
-.Pp
-The argument
-.Fa mode
-points to one of the following one-character strings:
-.Bl -tag -width indent
-.It Dq Li r
-Open compressed file for reading.
-The stream is positioned at the beginning of the file.
-.It Dq Li w
-Truncate file to zero length or create compressed file for writing.
-The stream is positioned at the beginning of the file.
-.El
-.Pp
-Any created files will have mode
-.Pf \\*q Dv S_IRUSR
-\&|
-.Dv S_IWUSR
-\&|
-.Dv S_IRGRP
-\&|
-.Dv S_IWGRP
-\&|
-.Dv S_IROTH
-\&|
-.Dv S_IWOTH Ns \\*q
-.Pq Li 0666 ,
-as modified by the process'
-umask value (see
-.Xr umask 2 ) .
-.Pp
-Files may only be read or written.
-Seek operations are not allowed.
-.Pp
-The
-.Fa bits
-argument, if non-zero, is set to the bits code limit.
-If zero, the default is 16.
-See
-.Xr compress 1
-for more information.
-.Sh RETURN VALUES
-Upon successful completion
-.Fn zopen
-returns a
-.Tn FILE
-pointer.
-Otherwise,
-.Dv NULL
-is returned and the global variable
-.Va errno
-is set to indicate the error.
-.Sh ERRORS
-.Bl -tag -width [EINVAL]
-.It Bq Er EINVAL
-The
-.Fa mode
-or
-.Fa bits
-arguments specified to
-.Fn zopen
-were invalid.
-.It Bq Er EFTYPE
-The compressed file starts with an invalid header, or the compressed
-file is compressed with more bits than can be handled.
-.El
-.Pp
-The
-.Fn zopen
-function may also fail and set
-.Va errno
-for any of the errors specified for the routines
-.Xr fopen 3
-or
-.Xr funopen 3 .
-.Sh SEE ALSO
-.Xr compress 1 ,
-.Xr fopen 3 ,
-.Xr funopen 3
-.Sh HISTORY
-The
-.Nm
-function
-first appeared in
-.Bx 4.4 .
-.Sh BUGS
-The
-.Fn zopen
-function
-may not be portable to systems other than
-.Bx .
diff --git a/usr.bin/compress/zopen.c b/usr.bin/compress/zopen.c
deleted file mode 100644
index f0ec887..0000000
--- a/usr.bin/compress/zopen.c
+++ /dev/null
@@ -1,731 +0,0 @@
-/*-
- * Copyright (c) 1985, 1986, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Diomidis Spinellis and James A. Woods, derived from original
- * work by Spencer Thomas and Joseph Orost.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)zopen.c 8.1 (Berkeley) 6/27/93";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*-
- * fcompress.c - File compression ala IEEE Computer, June 1984.
- *
- * Compress authors:
- * Spencer W. Thomas (decvax!utah-cs!thomas)
- * Jim McKie (decvax!mcvax!jim)
- * Steve Davies (decvax!vax135!petsd!peora!srd)
- * Ken Turkowski (decvax!decwrl!turtlevax!ken)
- * James A. Woods (decvax!ihnp4!ames!jaw)
- * Joe Orost (decvax!vax135!petsd!joe)
- *
- * Cleaned up and converted to library returning I/O streams by
- * Diomidis Spinellis <dds@doc.ic.ac.uk>.
- *
- * zopen(filename, mode, bits)
- * Returns a FILE * that can be used for read or write. The modes
- * supported are only "r" and "w". Seeking is not allowed. On
- * reading the file is decompressed, on writing it is compressed.
- * The output is compatible with compress(1) with 16 bit tables.
- * Any file produced by compress(1) can be read.
- */
-
-#include <sys/param.h>
-#include <sys/stat.h>
-
-#include <ctype.h>
-#include <errno.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "zopen.h"
-
-#define BITS 16 /* Default bits. */
-#define HSIZE 69001 /* 95% occupancy */
-
-/* A code_int must be able to hold 2**BITS values of type int, and also -1. */
-typedef long code_int;
-typedef long count_int;
-
-typedef u_char char_type;
-static char_type magic_header[] =
- {'\037', '\235'}; /* 1F 9D */
-
-#define BIT_MASK 0x1f /* Defines for third byte of header. */
-#define BLOCK_MASK 0x80
-
-/*
- * Masks 0x40 and 0x20 are free. I think 0x20 should mean that there is
- * a fourth header byte (for expansion).
- */
-#define INIT_BITS 9 /* Initial number of bits/code. */
-
-#define MAXCODE(n_bits) ((1 << (n_bits)) - 1)
-
-struct s_zstate {
- FILE *zs_fp; /* File stream for I/O */
- char zs_mode; /* r or w */
- enum {
- S_START, S_MIDDLE, S_EOF
- } zs_state; /* State of computation */
- u_int zs_n_bits; /* Number of bits/code. */
- u_int zs_maxbits; /* User settable max # bits/code. */
- code_int zs_maxcode; /* Maximum code, given n_bits. */
- code_int zs_maxmaxcode; /* Should NEVER generate this code. */
- count_int zs_htab [HSIZE];
- u_short zs_codetab [HSIZE];
- code_int zs_hsize; /* For dynamic table sizing. */
- code_int zs_free_ent; /* First unused entry. */
- /*
- * Block compression parameters -- after all codes are used up,
- * and compression rate changes, start over.
- */
- int zs_block_compress;
- int zs_clear_flg;
- long zs_ratio;
- count_int zs_checkpoint;
- u_int zs_offset;
- long zs_in_count; /* Length of input. */
- long zs_bytes_out; /* Length of compressed output. */
- long zs_out_count; /* # of codes output (for debugging). */
- char_type zs_buf[BITS];
- union {
- struct {
- long zs_fcode;
- code_int zs_ent;
- code_int zs_hsize_reg;
- int zs_hshift;
- } w; /* Write paramenters */
- struct {
- char_type *zs_stackp;
- int zs_finchar;
- code_int zs_code, zs_oldcode, zs_incode;
- int zs_roffset, zs_size;
- char_type zs_gbuf[BITS];
- } r; /* Read parameters */
- } u;
-};
-
-/* Definitions to retain old variable names */
-#define fp zs->zs_fp
-#define zmode zs->zs_mode
-#define state zs->zs_state
-#define n_bits zs->zs_n_bits
-#define maxbits zs->zs_maxbits
-#define maxcode zs->zs_maxcode
-#define maxmaxcode zs->zs_maxmaxcode
-#define htab zs->zs_htab
-#define codetab zs->zs_codetab
-#define hsize zs->zs_hsize
-#define free_ent zs->zs_free_ent
-#define block_compress zs->zs_block_compress
-#define clear_flg zs->zs_clear_flg
-#define ratio zs->zs_ratio
-#define checkpoint zs->zs_checkpoint
-#define offset zs->zs_offset
-#define in_count zs->zs_in_count
-#define bytes_out zs->zs_bytes_out
-#define out_count zs->zs_out_count
-#define buf zs->zs_buf
-#define fcode zs->u.w.zs_fcode
-#define hsize_reg zs->u.w.zs_hsize_reg
-#define ent zs->u.w.zs_ent
-#define hshift zs->u.w.zs_hshift
-#define stackp zs->u.r.zs_stackp
-#define finchar zs->u.r.zs_finchar
-#define code zs->u.r.zs_code
-#define oldcode zs->u.r.zs_oldcode
-#define incode zs->u.r.zs_incode
-#define roffset zs->u.r.zs_roffset
-#define size zs->u.r.zs_size
-#define gbuf zs->u.r.zs_gbuf
-
-/*
- * To save much memory, we overlay the table used by compress() with those
- * used by decompress(). The tab_prefix table is the same size and type as
- * the codetab. The tab_suffix table needs 2**BITS characters. We get this
- * from the beginning of htab. The output stack uses the rest of htab, and
- * contains characters. There is plenty of room for any possible stack
- * (stack used to be 8000 characters).
- */
-
-#define htabof(i) htab[i]
-#define codetabof(i) codetab[i]
-
-#define tab_prefixof(i) codetabof(i)
-#define tab_suffixof(i) ((char_type *)(htab))[i]
-#define de_stack ((char_type *)&tab_suffixof(1 << BITS))
-
-#define CHECK_GAP 10000 /* Ratio check interval. */
-
-/*
- * the next two codes should not be changed lightly, as they must not
- * lie within the contiguous general code space.
- */
-#define FIRST 257 /* First free entry. */
-#define CLEAR 256 /* Table clear output code. */
-
-static int cl_block(struct s_zstate *);
-static void cl_hash(struct s_zstate *, count_int);
-static code_int getcode(struct s_zstate *);
-static int output(struct s_zstate *, code_int);
-static int zclose(void *);
-static int zread(void *, char *, int);
-static int zwrite(void *, const char *, int);
-
-/*-
- * Algorithm from "A Technique for High Performance Data Compression",
- * Terry A. Welch, IEEE Computer Vol 17, No 6 (June 1984), pp 8-19.
- *
- * Algorithm:
- * Modified Lempel-Ziv method (LZW). Basically finds common
- * substrings and replaces them with a variable size code. This is
- * deterministic, and can be done on the fly. Thus, the decompression
- * procedure needs no input table, but tracks the way the table was built.
- */
-
-/*-
- * compress write
- *
- * Algorithm: use open addressing double hashing (no chaining) on the
- * prefix code / next character combination. We do a variant of Knuth's
- * algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime
- * secondary probe. Here, the modular division first probe is gives way
- * to a faster exclusive-or manipulation. Also do block compression with
- * an adaptive reset, whereby the code table is cleared when the compression
- * ratio decreases, but after the table fills. The variable-length output
- * codes are re-sized at this point, and a special CLEAR code is generated
- * for the decompressor. Late addition: construct the table according to
- * file size for noticeable speed improvement on small files. Please direct
- * questions about this implementation to ames!jaw.
- */
-static int
-zwrite(void *cookie, const char *wbp, int num)
-{
- code_int i;
- int c, disp;
- struct s_zstate *zs;
- const u_char *bp;
- u_char tmp;
- int count;
-
- if (num == 0)
- return (0);
-
- zs = cookie;
- count = num;
- bp = (const u_char *)wbp;
- if (state == S_MIDDLE)
- goto middle;
- state = S_MIDDLE;
-
- maxmaxcode = 1L << maxbits;
- if (fwrite(magic_header,
- sizeof(char), sizeof(magic_header), fp) != sizeof(magic_header))
- return (-1);
- tmp = (u_char)((maxbits) | block_compress);
- if (fwrite(&tmp, sizeof(char), sizeof(tmp), fp) != sizeof(tmp))
- return (-1);
-
- offset = 0;
- bytes_out = 3; /* Includes 3-byte header mojo. */
- out_count = 0;
- clear_flg = 0;
- ratio = 0;
- in_count = 1;
- checkpoint = CHECK_GAP;
- maxcode = MAXCODE(n_bits = INIT_BITS);
- free_ent = ((block_compress) ? FIRST : 256);
-
- ent = *bp++;
- --count;
-
- hshift = 0;
- for (fcode = (long)hsize; fcode < 65536L; fcode *= 2L)
- hshift++;
- hshift = 8 - hshift; /* Set hash code range bound. */
-
- hsize_reg = hsize;
- cl_hash(zs, (count_int)hsize_reg); /* Clear hash table. */
-
-middle: for (i = 0; count--;) {
- c = *bp++;
- in_count++;
- fcode = (long)(((long)c << maxbits) + ent);
- i = ((c << hshift) ^ ent); /* Xor hashing. */
-
- if (htabof(i) == fcode) {
- ent = codetabof(i);
- continue;
- } else if ((long)htabof(i) < 0) /* Empty slot. */
- goto nomatch;
- disp = hsize_reg - i; /* Secondary hash (after G. Knott). */
- if (i == 0)
- disp = 1;
-probe: if ((i -= disp) < 0)
- i += hsize_reg;
-
- if (htabof(i) == fcode) {
- ent = codetabof(i);
- continue;
- }
- if ((long)htabof(i) >= 0)
- goto probe;
-nomatch: if (output(zs, (code_int) ent) == -1)
- return (-1);
- out_count++;
- ent = c;
- if (free_ent < maxmaxcode) {
- codetabof(i) = free_ent++; /* code -> hashtable */
- htabof(i) = fcode;
- } else if ((count_int)in_count >=
- checkpoint && block_compress) {
- if (cl_block(zs) == -1)
- return (-1);
- }
- }
- return (num);
-}
-
-static int
-zclose(void *cookie)
-{
- struct s_zstate *zs;
- int rval;
-
- zs = cookie;
- if (zmode == 'w') { /* Put out the final code. */
- if (output(zs, (code_int) ent) == -1) {
- (void)fclose(fp);
- free(zs);
- return (-1);
- }
- out_count++;
- if (output(zs, (code_int) - 1) == -1) {
- (void)fclose(fp);
- free(zs);
- return (-1);
- }
- }
- rval = fclose(fp) == EOF ? -1 : 0;
- free(zs);
- return (rval);
-}
-
-/*-
- * Output the given code.
- * Inputs:
- * code: A n_bits-bit integer. If == -1, then EOF. This assumes
- * that n_bits =< (long)wordsize - 1.
- * Outputs:
- * Outputs code to the file.
- * Assumptions:
- * Chars are 8 bits long.
- * Algorithm:
- * Maintain a BITS character long buffer (so that 8 codes will
- * fit in it exactly). Use the VAX insv instruction to insert each
- * code in turn. When the buffer fills up empty it and start over.
- */
-
-static char_type lmask[9] =
- {0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00};
-static char_type rmask[9] =
- {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff};
-
-static int
-output(struct s_zstate *zs, code_int ocode)
-{
- int r_off;
- u_int bits;
- char_type *bp;
-
- r_off = offset;
- bits = n_bits;
- bp = buf;
- if (ocode >= 0) {
- /* Get to the first byte. */
- bp += (r_off >> 3);
- r_off &= 7;
- /*
- * Since ocode is always >= 8 bits, only need to mask the first
- * hunk on the left.
- */
- *bp = (*bp & rmask[r_off]) | ((ocode << r_off) & lmask[r_off]);
- bp++;
- bits -= (8 - r_off);
- ocode >>= 8 - r_off;
- /* Get any 8 bit parts in the middle (<=1 for up to 16 bits). */
- if (bits >= 8) {
- *bp++ = ocode;
- ocode >>= 8;
- bits -= 8;
- }
- /* Last bits. */
- if (bits)
- *bp = ocode;
- offset += n_bits;
- if (offset == (n_bits << 3)) {
- bp = buf;
- bits = n_bits;
- bytes_out += bits;
- if (fwrite(bp, sizeof(char), bits, fp) != bits)
- return (-1);
- bp += bits;
- bits = 0;
- offset = 0;
- }
- /*
- * If the next entry is going to be too big for the ocode size,
- * then increase it, if possible.
- */
- if (free_ent > maxcode || (clear_flg > 0)) {
- /*
- * Write the whole buffer, because the input side won't
- * discover the size increase until after it has read it.
- */
- if (offset > 0) {
- if (fwrite(buf, 1, n_bits, fp) != n_bits)
- return (-1);
- bytes_out += n_bits;
- }
- offset = 0;
-
- if (clear_flg) {
- maxcode = MAXCODE(n_bits = INIT_BITS);
- clear_flg = 0;
- } else {
- n_bits++;
- if (n_bits == maxbits)
- maxcode = maxmaxcode;
- else
- maxcode = MAXCODE(n_bits);
- }
- }
- } else {
- /* At EOF, write the rest of the buffer. */
- if (offset > 0) {
- offset = (offset + 7) / 8;
- if (fwrite(buf, 1, offset, fp) != offset)
- return (-1);
- bytes_out += offset;
- }
- offset = 0;
- }
- return (0);
-}
-
-/*
- * Decompress read. This routine adapts to the codes in the file building
- * the "string" table on-the-fly; requiring no table to be stored in the
- * compressed file. The tables used herein are shared with those of the
- * compress() routine. See the definitions above.
- */
-static int
-zread(void *cookie, char *rbp, int num)
-{
- u_int count;
- struct s_zstate *zs;
- u_char *bp, header[3];
-
- if (num == 0)
- return (0);
-
- zs = cookie;
- count = num;
- bp = (u_char *)rbp;
- switch (state) {
- case S_START:
- state = S_MIDDLE;
- break;
- case S_MIDDLE:
- goto middle;
- case S_EOF:
- goto eof;
- }
-
- /* Check the magic number */
- if (fread(header,
- sizeof(char), sizeof(header), fp) != sizeof(header) ||
- memcmp(header, magic_header, sizeof(magic_header)) != 0) {
- errno = EFTYPE;
- return (-1);
- }
- maxbits = header[2]; /* Set -b from file. */
- block_compress = maxbits & BLOCK_MASK;
- maxbits &= BIT_MASK;
- maxmaxcode = 1L << maxbits;
- if (maxbits > BITS) {
- errno = EFTYPE;
- return (-1);
- }
- /* As above, initialize the first 256 entries in the table. */
- maxcode = MAXCODE(n_bits = INIT_BITS);
- for (code = 255; code >= 0; code--) {
- tab_prefixof(code) = 0;
- tab_suffixof(code) = (char_type) code;
- }
- free_ent = block_compress ? FIRST : 256;
-
- finchar = oldcode = getcode(zs);
- if (oldcode == -1) /* EOF already? */
- return (0); /* Get out of here */
-
- /* First code must be 8 bits = char. */
- *bp++ = (u_char)finchar;
- count--;
- stackp = de_stack;
-
- while ((code = getcode(zs)) > -1) {
-
- if ((code == CLEAR) && block_compress) {
- for (code = 255; code >= 0; code--)
- tab_prefixof(code) = 0;
- clear_flg = 1;
- free_ent = FIRST - 1;
- if ((code = getcode(zs)) == -1) /* O, untimely death! */
- break;
- }
- incode = code;
-
- /* Special case for KwKwK string. */
- if (code >= free_ent) {
- *stackp++ = finchar;
- code = oldcode;
- }
-
- /* Generate output characters in reverse order. */
- while (code >= 256) {
- *stackp++ = tab_suffixof(code);
- code = tab_prefixof(code);
- }
- *stackp++ = finchar = tab_suffixof(code);
-
- /* And put them out in forward order. */
-middle: do {
- if (count-- == 0)
- return (num);
- *bp++ = *--stackp;
- } while (stackp > de_stack);
-
- /* Generate the new entry. */
- if ((code = free_ent) < maxmaxcode) {
- tab_prefixof(code) = (u_short) oldcode;
- tab_suffixof(code) = finchar;
- free_ent = code + 1;
- }
-
- /* Remember previous code. */
- oldcode = incode;
- }
- state = S_EOF;
-eof: return (num - count);
-}
-
-/*-
- * Read one code from the standard input. If EOF, return -1.
- * Inputs:
- * stdin
- * Outputs:
- * code or -1 is returned.
- */
-static code_int
-getcode(struct s_zstate *zs)
-{
- code_int gcode;
- int r_off, bits;
- char_type *bp;
-
- bp = gbuf;
- if (clear_flg > 0 || roffset >= size || free_ent > maxcode) {
- /*
- * If the next entry will be too big for the current gcode
- * size, then we must increase the size. This implies reading
- * a new buffer full, too.
- */
- if (free_ent > maxcode) {
- n_bits++;
- if (n_bits == maxbits) /* Won't get any bigger now. */
- maxcode = maxmaxcode;
- else
- maxcode = MAXCODE(n_bits);
- }
- if (clear_flg > 0) {
- maxcode = MAXCODE(n_bits = INIT_BITS);
- clear_flg = 0;
- }
- size = fread(gbuf, 1, n_bits, fp);
- if (size <= 0) /* End of file. */
- return (-1);
- roffset = 0;
- /* Round size down to integral number of codes. */
- size = (size << 3) - (n_bits - 1);
- }
- r_off = roffset;
- bits = n_bits;
-
- /* Get to the first byte. */
- bp += (r_off >> 3);
- r_off &= 7;
-
- /* Get first part (low order bits). */
- gcode = (*bp++ >> r_off);
- bits -= (8 - r_off);
- r_off = 8 - r_off; /* Now, roffset into gcode word. */
-
- /* Get any 8 bit parts in the middle (<=1 for up to 16 bits). */
- if (bits >= 8) {
- gcode |= *bp++ << r_off;
- r_off += 8;
- bits -= 8;
- }
-
- /* High order bits. */
- gcode |= (*bp & rmask[bits]) << r_off;
- roffset += n_bits;
-
- return (gcode);
-}
-
-static int
-cl_block(struct s_zstate *zs) /* Table clear for block compress. */
-{
- long rat;
-
- checkpoint = in_count + CHECK_GAP;
-
- if (in_count > 0x007fffff) { /* Shift will overflow. */
- rat = bytes_out >> 8;
- if (rat == 0) /* Don't divide by zero. */
- rat = 0x7fffffff;
- else
- rat = in_count / rat;
- } else
- rat = (in_count << 8) / bytes_out; /* 8 fractional bits. */
- if (rat > ratio)
- ratio = rat;
- else {
- ratio = 0;
- cl_hash(zs, (count_int) hsize);
- free_ent = FIRST;
- clear_flg = 1;
- if (output(zs, (code_int) CLEAR) == -1)
- return (-1);
- }
- return (0);
-}
-
-static void
-cl_hash(struct s_zstate *zs, count_int cl_hsize) /* Reset code table. */
-{
- count_int *htab_p;
- long i, m1;
-
- m1 = -1;
- htab_p = htab + cl_hsize;
- i = cl_hsize - 16;
- do { /* Might use Sys V memset(3) here. */
- *(htab_p - 16) = m1;
- *(htab_p - 15) = m1;
- *(htab_p - 14) = m1;
- *(htab_p - 13) = m1;
- *(htab_p - 12) = m1;
- *(htab_p - 11) = m1;
- *(htab_p - 10) = m1;
- *(htab_p - 9) = m1;
- *(htab_p - 8) = m1;
- *(htab_p - 7) = m1;
- *(htab_p - 6) = m1;
- *(htab_p - 5) = m1;
- *(htab_p - 4) = m1;
- *(htab_p - 3) = m1;
- *(htab_p - 2) = m1;
- *(htab_p - 1) = m1;
- htab_p -= 16;
- } while ((i -= 16) >= 0);
- for (i += 16; i > 0; i--)
- *--htab_p = m1;
-}
-
-FILE *
-zopen(const char *fname, const char *mode, int bits)
-{
- struct s_zstate *zs;
-
- if ((mode[0] != 'r' && mode[0] != 'w') || mode[1] != '\0' ||
- bits < 0 || bits > BITS) {
- errno = EINVAL;
- return (NULL);
- }
-
- if ((zs = calloc(1, sizeof(struct s_zstate))) == NULL)
- return (NULL);
-
- maxbits = bits ? bits : BITS; /* User settable max # bits/code. */
- maxmaxcode = 1L << maxbits; /* Should NEVER generate this code. */
- hsize = HSIZE; /* For dynamic table sizing. */
- free_ent = 0; /* First unused entry. */
- block_compress = BLOCK_MASK;
- clear_flg = 0;
- ratio = 0;
- checkpoint = CHECK_GAP;
- in_count = 1; /* Length of input. */
- out_count = 0; /* # of codes output (for debugging). */
- state = S_START;
- roffset = 0;
- size = 0;
-
- /*
- * Layering compress on top of stdio in order to provide buffering,
- * and ensure that reads and write work with the data specified.
- */
- if ((fp = fopen(fname, mode)) == NULL) {
- free(zs);
- return (NULL);
- }
- switch (*mode) {
- case 'r':
- zmode = 'r';
- return (funopen(zs, zread, NULL, NULL, zclose));
- case 'w':
- zmode = 'w';
- return (funopen(zs, NULL, zwrite, NULL, zclose));
- }
- /* NOTREACHED */
- return (NULL);
-}
diff --git a/usr.bin/compress/zopen.h b/usr.bin/compress/zopen.h
deleted file mode 100644
index a27a4f9..0000000
--- a/usr.bin/compress/zopen.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 1996
- * FreeBSD Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY FreeBSD Inc. AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL [your name] OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef _ZOPEN_H_
-#define _ZOPEN_H_
-
-FILE *zopen(const char *, const char *, int);
-
-#endif /* _ZOPEN_H_ */
diff --git a/usr.bin/cpio/Makefile b/usr.bin/cpio/Makefile
deleted file mode 100644
index b33cb20..0000000
--- a/usr.bin/cpio/Makefile
+++ /dev/null
@@ -1,24 +0,0 @@
-# $FreeBSD$
-
-.include <bsd.own.mk>
-
-PROG= bsdcpio
-BSDCPIO_VERSION_STRING=1.0.0
-SRCS= cpio.c cmdline.c err.c matching.c pathmatch.c
-WARNS?= 6
-DPADD= ${LIBARCHIVE} ${LIBZ} ${LIBBZ2}
-CFLAGS+= -DBSDCPIO_VERSION_STRING=\"${BSDCPIO_VERSION_STRING}\"
-CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\"
-LDADD+= -larchive -lz -lbz2
-
-.if ${MK_GNU_CPIO} != "yes"
-SYMLINKS=bsdcpio ${BINDIR}/cpio
-MLINKS= bsdcpio.1 cpio.1
-.endif
-
-.PHONY: check test
-
-check test: $(PROG) bsdcpio.1.gz
- cd ${.CURDIR}/test && make clean test
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/cpio/bsdcpio.1 b/usr.bin/cpio/bsdcpio.1
deleted file mode 100644
index d4a1857..0000000
--- a/usr.bin/cpio/bsdcpio.1
+++ /dev/null
@@ -1,367 +0,0 @@
-.\" Copyright (c) 2003-2007 Tim Kientzle
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd December 21, 2007
-.Dt BSDCPIO 1
-.Os
-.Sh NAME
-.Nm cpio
-.Nd copy files to and from archives
-.Sh SYNOPSIS
-.Nm
-.Brq Fl i
-.Op Ar options
-.Op Ar pattern ...
-.Op Ar < archive
-.Nm
-.Brq Fl o
-.Op Ar options
-.Ar < name-list
-.Op Ar > archive
-.Nm
-.Brq Fl p
-.Op Ar options
-.Ar dest-dir
-.Ar < name-list
-.Sh DESCRIPTION
-.Nm
-copies files between archives and directories.
-This implementation can extract from tar, pax, cpio, zip, jar, ar,
-and ISO 9660 cdrom images and can create tar, pax, cpio, ar,
-and shar archives.
-.Pp
-The first option to
-.Nm
-is a mode indicator from the following list:
-.Bl -tag -compact -width indent
-.It Fl i
-Input.
-Read an archive from standard input (unless overriden) and extract the
-contents to disk or (if the
-.Fl t
-option is specified)
-list the contents to standard output.
-If one or more file patterns are specified, only files matching
-one of the patterns will be extracted.
-.It Fl o
-Output.
-Read a list of filenames from standard input and produce a new archive
-on standard output (unless overriden) containing the specified items.
-.It Fl p
-Pass-through.
-Read a list of filenames from standard input and copy the files to the
-specified directory.
-.El
-.Pp
-.Sh OPTIONS
-Unless specifically stated otherwise, options are applicable in
-all operating modes.
-.Bl -tag -width indent
-.It Fl A
-(o mode only)
-Append to the specified archive.
-(Not yet implemented.)
-.It Fl a
-(o and p modes)
-Reset access times on files after they are read.
-.It Fl B
-(o mode only)
-Block output to records of 5120 bytes.
-.It Fl C Ar size
-(o mode only)
-Block output to records of
-.Ar size
-bytes.
-.It Fl c
-(o mode only)
-Use the old POSIX portable character format.
-Equivalent to
-.Fl -format Ar odc .
-.It Fl d
-(i and p modes)
-Create directories as necessary.
-.It Fl E Ar file
-(i mode only)
-Read list of file name patterns from
-.Ar file
-to list and extract.
-.It Fl F Ar file
-Read archive from or write archive to
-.Ar file .
-.It Fl f Ar pattern
-(i mode only)
-Ignore files that match
-.Ar pattern .
-.It Fl -format Ar format
-(o mode only)
-Produce the output archive in the specified format.
-Supported formats include:
-.Pp
-.Bl -tag -width "iso9660" -compact
-.It Ar cpio
-Synonym for
-.Ar odc .
-.It Ar newc
-The SVR4 portable cpio format.
-.It Ar odc
-The old POSIX.1 portable octet-oriented cpio format.
-.It Ar pax
-The POSIX.1 pax format, an extension of the ustar format.
-.It Ar ustar
-The POSIX.1 tar format.
-.El
-.Pp
-The default format is
-.Ar odc .
-See
-.Xr libarchive_formats 5
-for more complete information about the
-formats currently supported by the underlying
-.Xr libarchive 3
-library.
-.It Fl I Ar file
-Read archive from
-.Ar file .
-.It Fl i
-Input mode.
-See above for description.
-.It Fl -insecure
-(i and p mode only)
-Disable security checks during extraction or copying.
-This allows extraction via symbolic links and path names containing
-.Sq ..
-in the name.
-.It Fl L
-(o and p modes)
-All symbolic links will be followed.
-Normally, symbolic links are archived and copied as symbolic links.
-With this option, the target of the link will be archived or copied instead.
-.It Fl l
-(p mode only)
-Create links from the target directory to the original files,
-instead of copying.
-.It Fl m
-(i and p modes)
-Set file modification time on created files to match
-those in the source.
-.It Fl O Ar file
-Write archive to
-.Ar file .
-.It Fl o
-Output mode.
-See above for description.
-.It Fl p
-Pass-through mode.
-See above for description.
-.It Fl -quiet
-Suppress unnecessary messages.
-.It Fl R Oo user Oc Ns Oo : Oc Ns Oo group Oc
-Set the owner and/or group on files in the output.
-If group is specified with no user
-(for example,
-.Fl R Ar :wheel )
-then the group will be set but not the user.
-If the user is specified with a trailing colon and no group
-(for example,
-.Fl R Ar root: )
-then the group will be set to the user's default group.
-If the user is specified with no trailing colon, then
-the user will be set but not the group.
-In
-.Fl i
-and
-.Fl p
-modes, this option can only be used by the super-user.
-(For compatibility, a period can be used in place of the colon.)
-.It Fl r
-(All modes.)
-Rename files interactively.
-For each file, a prompt is written to
-.Pa /dev/tty
-containing the name of the file and a line is read from
-.Pa /dev/tty .
-If the line read is blank, the file is skipped.
-If the line contains a single period, the file is processed normally.
-Otherwise, the line is taken to be the new name of the file.
-.It Fl t
-(i mode only)
-List the contents of the archive to stdout;
-do not restore the contents to disk.
-.It Fl u
-(i and p modes)
-Unconditionally overwrite existing files.
-Ordinarily, an older file will not overwrite a newer file on disk.
-.It Fl v
-Print the name of each file to stderr as it is processed.
-With
-.Fl t ,
-provide a detailed listing of each file.
-.It Fl -version
-Print the program version information and exit.
-.It Fl y
-(o mode only)
-Compress the archive with bzip2-compatible compression before writing it.
-In input mode, this option is ignored;
-bzip2 compression is recognized automatically on input.
-.It Fl Z
-(o mode only)
-Compress the archive with compress-compatible compression before writing it.
-In input mode, this option is ignored;
-compression is recognized automatically on input.
-.It Fl z
-(o mode only)
-Compress the archive with gzip-compatible compression before writing it.
-In input mode, this option is ignored;
-gzip compression is recognized automatically on input.
-.El
-.Sh ENVIRONMENT
-The following environment variables affect the execution of
-.Nm :
-.Bl -tag -width ".Ev BLOCKSIZE"
-.It Ev LANG
-The locale to use.
-See
-.Xr environ 7
-for more information.
-.It Ev TZ
-The timezone to use when displaying dates.
-See
-.Xr environ 7
-for more information.
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh EXAMPLES
-The
-.Nm
-command is traditionally used to copy file heirarchies in conjunction
-with the
-.Xr find 1
-command.
-The first example here simply copies all files from
-.Pa src
-to
-.Pa dest :
-.Dl Nm find Pa src | Nm Fl pmud Pa dest
-.Pp
-By carefully selecting options to the
-.Xr find 1
-command and combining it with other standard utilities,
-it is possible to exercise very fine control over which files are copied.
-This next example copies files from
-.Pa src
-to
-.Pa dest
-that are more than 2 days old and whose names match a particular pattern:
-.Dl Nm find Pa src Fl mtime Ar +2 | Nm grep foo[bar] | Nm Fl pdmu Pa dest
-.Pp
-This example copies files from
-.Pa src
-to
-.Pa dest
-that are more than 2 days old and which contain the word
-.Do foobar Dc :
-.Dl Nm find Pa src Fl mtime Ar +2 | Nm xargs Nm grep -l foobar | Nm Fl pdmu Pa dest
-.Sh COMPATIBILITY
-The mode options i, o, and p and the options
-a, B, c, d, f, l, m, r, t, u, and v comply with SUSv2.
-.Pp
-The old POSIX.1 standard specified that only
-.Fl i ,
-.Fl o ,
-and
-.Fl p
-were interpreted as command-line options.
-Each took a single argument of a list of modifier
-characters.
-For example, the standard syntax allows
-.Fl imu
-but does not support
-.Fl miu
-or
-.Fl i Fl m Fl u ,
-since
-.Ar m
-and
-.Ar u
-are only modifiers to
-.Fl i ,
-they are not command-line options in their own right.
-The syntax supported by this implementation is backwards-compatible
-with the standard.
-For best compatibility, scripts should limit themselves to the
-standard syntax.
-.Sh SEE ALSO
-.Xr bzip2 1 ,
-.Xr tar 1 ,
-.Xr gzip 1 ,
-.Xr mt 1 ,
-.Xr pax 1 ,
-.Xr libarchive 3 ,
-.Xr cpio 5 ,
-.Xr libarchive-formats 5 ,
-.Xr tar 5
-.Sh STANDARDS
-There is no current POSIX standard for the cpio command; it appeared
-in
-.St -p1003.1-96
-but was dropped from
-.St -p1003.1-2001 .
-.Pp
-The cpio, ustar, and pax interchange file formats are defined by
-.St -p1003.1-2001
-for the pax command.
-.Sh HISTORY
-The original
-.Nm cpio
-and
-.Nm find
-utilities were written by Dick Haight
-while working in AT&T's Unix Support Group.
-They first appeared in 1977 in PWB/UNIX 1.0, the
-.Dq Programmer's Work Bench
-system developed for use within AT&T.
-They were first released outside of AT&T as part of System III Unix in 1981.
-As a result,
-.Nm cpio
-actually predates
-.Nm tar ,
-even though it was not well-known outside of AT&T until some time later.
-.Pp
-This is a complete re-implementation based on the
-.Xr libarchive 3
-library.
-.Sh BUGS
-The cpio archive format has several basic limitations:
-It does not store user and group names, only numbers.
-As a result, it cannot be reliably used to transfer
-files between systems with dissimilar user and group numbering.
-Older cpio formats limit the user and group numbers to
-16 or 18 bits, which is insufficient for modern systems.
-The cpio archive formats cannot support files over 4 gigabytes,
-except for the
-.Dq odc
-variant, which can support files up to 8 gigabytes.
diff --git a/usr.bin/cpio/cmdline.c b/usr.bin/cpio/cmdline.c
deleted file mode 100644
index a9774e9..0000000
--- a/usr.bin/cpio/cmdline.c
+++ /dev/null
@@ -1,257 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#include "cpio_platform.h"
-__FBSDID("$FreeBSD$");
-
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#ifdef HAVE_GETOPT_LONG
-#include <getopt.h>
-#else
-struct option {
- const char *name;
- int has_arg;
- int *flag;
- int val;
-};
-#define no_argument 0
-#define required_argument 1
-#endif
-#ifdef HAVE_GRP_H
-#include <grp.h>
-#endif
-#ifdef HAVE_PWD_H
-#include <pwd.h>
-#endif
-#include <stdio.h>
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include "cpio.h"
-
-/*
- *
- * Option parsing routines for bsdcpio.
- *
- */
-
-
-static const char *cpio_opts = "0AaBC:F:O:cdE:f:H:hijLlmopR:rtuvW:yZz";
-
-/*
- * On systems that lack getopt_long, long options can be specified
- * using -W longopt and -W longopt=value, e.g. "-W version" is the
- * same as "--version" and "-W format=ustar" is the same as "--format
- * ustar". This does not rely the GNU getopt() "W;" extension, so
- * should work correctly on any system with a POSIX-compliant
- * getopt().
- */
-
-/*
- * If you add anything, be very careful to keep this list properly
- * sorted, as the -W logic below relies on it.
- */
-static const struct option cpio_longopts[] = {
- { "create", no_argument, NULL, 'o' },
- { "extract", no_argument, NULL, 'i' },
- { "file", required_argument, NULL, 'F' },
- { "format", required_argument, NULL, 'H' },
- { "help", no_argument, NULL, 'h' },
- { "insecure", no_argument, NULL, OPTION_INSECURE },
- { "link", no_argument, NULL, 'l' },
- { "list", no_argument, NULL, 't' },
- { "make-directories", no_argument, NULL, 'd' },
- { "no-preserve-owner", no_argument, NULL, OPTION_NO_PRESERVE_OWNER },
- { "null", no_argument, NULL, '0' },
- { "owner", required_argument, NULL, 'R' },
- { "pass-through", no_argument, NULL, 'p' },
- { "preserve-modification-time", no_argument, NULL, 'm' },
- { "quiet", no_argument, NULL, OPTION_QUIET },
- { "unconditional", no_argument, NULL, 'u' },
- { "verbose", no_argument, NULL, 'v' },
- { "version", no_argument, NULL, OPTION_VERSION },
- { NULL, 0, NULL, 0 }
-};
-
-/*
- * Parse command-line options using system-provided getopt() or getopt_long().
- * If option is -W, then parse argument as a long option.
- */
-int
-cpio_getopt(struct cpio *cpio)
-{
- char *p, *q;
- const struct option *option, *option2;
- int opt;
- int option_index;
- size_t option_length;
-
- option_index = -1;
-
-#ifdef HAVE_GETOPT_LONG
- opt = getopt_long(cpio->argc, cpio->argv, cpio_opts,
- cpio_longopts, &option_index);
-#else
- opt = getopt(cpio->argc, cpio->argv, cpio_opts);
-#endif
-
- /* Support long options through -W longopt=value */
- if (opt == 'W') {
- p = optarg;
- q = strchr(optarg, '=');
- if (q != NULL) {
- option_length = (size_t)(q - p);
- optarg = q + 1;
- } else {
- option_length = strlen(p);
- optarg = NULL;
- }
- option = cpio_longopts;
- while (option->name != NULL &&
- (strlen(option->name) < option_length ||
- strncmp(p, option->name, option_length) != 0 )) {
- option++;
- }
-
- if (option->name != NULL) {
- option2 = option;
- opt = option->val;
-
- /* If the first match was exact, we're done. */
- if (strncmp(p, option->name, strlen(option->name)) == 0) {
- while (option->name != NULL)
- option++;
- } else {
- /* Check if there's another match. */
- option++;
- while (option->name != NULL &&
- (strlen(option->name) < option_length ||
- strncmp(p, option->name, option_length) != 0)) {
- option++;
- }
- }
- if (option->name != NULL)
- cpio_errc(1, 0,
- "Ambiguous option %s "
- "(matches both %s and %s)",
- p, option2->name, option->name);
-
- if (option2->has_arg == required_argument
- && optarg == NULL)
- cpio_errc(1, 0,
- "Option \"%s\" requires argument", p);
- } else {
- opt = '?';
- }
- }
-
- return (opt);
-}
-
-
-/*
- * Parse the argument to the -R or --owner flag.
- *
- * The format is one of the following:
- * <user> - Override user but not group
- * <user>: - Override both, group is user's default group
- * <user>:<group> - Override both
- * :<group> - Override group but not user
- *
- * A period can be used instead of the colon.
- *
- * Sets uid/gid as appropriate, -1 indicates uid/gid not specified.
- *
- */
-int
-owner_parse(const char *spec, int *uid, int *gid)
-{
- const char *u, *ue, *g;
-
- *uid = -1;
- *gid = -1;
-
- /*
- * Split spec into [user][:.][group]
- * u -> first char of username, NULL if no username
- * ue -> first char after username (colon, period, or \0)
- * g -> first char of group name
- */
- if (*spec == ':' || *spec == '.') {
- /* If spec starts with ':' or '.', then just group. */
- ue = u = NULL;
- g = spec + 1;
- } else {
- /* Otherwise, [user] or [user][:] or [user][:][group] */
- ue = u = spec;
- while (*ue != ':' && *ue != '.' && *ue != '\0')
- ++ue;
- g = ue;
- if (*g != '\0') /* Skip : or . to find first char of group. */
- ++g;
- }
-
- if (u != NULL) {
- /* Look up user: ue is first char after end of user. */
- char *user;
- struct passwd *pwent;
-
- user = (char *)malloc(ue - u + 1);
- if (user == NULL) {
- cpio_warnc(errno, "Couldn't allocate memory");
- return (1);
- }
- memcpy(user, u, ue - u);
- user[ue - u] = '\0';
- pwent = getpwnam(user);
- if (pwent == NULL) {
- cpio_warnc(errno, "Couldn't lookup user ``%s''", user);
- return (1);
- }
- free(user);
- *uid = pwent->pw_uid;
- if (*ue != '\0' && *g == '\0')
- *gid = pwent->pw_gid;
- }
- if (*g != '\0') {
- struct group *grp;
- grp = getgrnam(g);
- if (grp != NULL)
- *gid = grp->gr_gid;
- else {
- cpio_warnc(errno, "Couldn't look up group ``%s''", g);
- return (1);
- }
- }
- return (0);
-}
diff --git a/usr.bin/cpio/config_freebsd.h b/usr.bin/cpio/config_freebsd.h
deleted file mode 100644
index 992c850..0000000
--- a/usr.bin/cpio/config_freebsd.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/* A default configuration for FreeBSD, used if there is no config.h. */
-
-#include <sys/param.h> /* __FreeBSD_version */
-
-#if __FreeBSD__ > 4
-#define HAVE_ACL_GET_PERM 0
-#define HAVE_ACL_GET_PERM_NP 1
-#define HAVE_ACL_PERMSET_T 1
-#define HAVE_ACL_USER 1
-#endif
-#undef HAVE_ATTR_XATTR_H
-#define HAVE_BZLIB_H 1
-#define HAVE_CHFLAGS 1
-#define HAVE_DECL_OPTARG 1
-#define HAVE_DECL_OPTIND 1
-#define HAVE_DIRENT_D_NAMLEN 1
-#define HAVE_DIRENT_H 1
-#define HAVE_D_MD_ORDER 1
-#define HAVE_ERRNO_H 1
-#undef HAVE_EXT2FS_EXT2_FS_H
-#define HAVE_FCHDIR 1
-#define HAVE_FCNTL_H 1
-#define HAVE_FNMATCH 1
-#define HAVE_FNMATCH_H 1
-#define HAVE_FNM_LEADING_DIR 1
-#define HAVE_FTRUNCATE 1
-#define HAVE_FUTIMES 1
-#define HAVE_GETOPT_LONG 1
-#undef HAVE_GETXATTR
-#define HAVE_GRP_H 1
-#define HAVE_INTTYPES_H 1
-#define HAVE_LANGINFO_H 1
-#undef HAVE_LGETXATTR
-#undef HAVE_LIBACL
-#define HAVE_LIBARCHIVE 1
-#define HAVE_LIBBZ2 1
-#define HAVE_LIBZ 1
-#define HAVE_LIMITS_H 1
-#undef HAVE_LINUX_EXT2_FS_H
-#undef HAVE_LINUX_FS_H
-#undef HAVE_LISTXATTR
-#undef HAVE_LLISTXATTR
-#define HAVE_LOCALE_H 1
-#define HAVE_LUTIMES 1
-#define HAVE_MALLOC 1
-#define HAVE_MEMMOVE 1
-#define HAVE_MEMORY_H 1
-#define HAVE_MEMSET 1
-#if __FreeBSD_version >= 450002 /* nl_langinfo introduced */
-#define HAVE_NL_LANGINFO 1
-#endif
-#define HAVE_PATHS_H 1
-#define HAVE_PWD_H 1
-#define HAVE_SETLOCALE 1
-#define HAVE_STDARG_H 1
-#define HAVE_STDINT_H 1
-#define HAVE_STDLIB_H 1
-#define HAVE_STRCHR 1
-#define HAVE_STRDUP 1
-#define HAVE_STRERROR 1
-#define HAVE_STRFTIME 1
-#define HAVE_STRINGS_H 1
-#define HAVE_STRING_H 1
-#define HAVE_STRRCHR 1
-#undef HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC
-#define HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC 1
-#define HAVE_SYS_ACL_H 1
-#define HAVE_SYS_IOCTL_H 1
-#define HAVE_SYS_PARAM_H 1
-#define HAVE_SYS_STAT_H 1
-#define HAVE_TIME_H 1
-#define HAVE_SYS_TYPES_H 1
-#define HAVE_UINTMAX_T 1
-#define HAVE_UNISTD_H 1
-#define HAVE_UNSIGNED_LONG_LONG 1
-#define HAVE_UTIMES 1
-#define HAVE_VPRINTF 1
-#define HAVE_ZLIB_H 1
-#undef MAJOR_IN_MKDEV
-#define STDC_HEADERS 1
-
diff --git a/usr.bin/cpio/cpio.c b/usr.bin/cpio/cpio.c
deleted file mode 100644
index a05c0e6..0000000
--- a/usr.bin/cpio/cpio.c
+++ /dev/null
@@ -1,1042 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#include "cpio_platform.h"
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <archive.h>
-#include <archive_entry.h>
-
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif
-#ifdef HAVE_STDARG_H
-#include <stdarg.h>
-#endif
-#include <stdio.h>
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include "cpio.h"
-#include "matching.h"
-
-static int copy_data(struct archive *, struct archive *);
-static const char *cpio_rename(const char *name);
-static int entry_to_archive(struct cpio *, struct archive_entry *);
-static int file_to_archive(struct cpio *, const char *);
-static void long_help(void);
-static void mode_in(struct cpio *);
-static void mode_list(struct cpio *);
-static void mode_out(struct cpio *);
-static void mode_pass(struct cpio *, const char *);
-static void restore_time(struct cpio *, struct archive_entry *,
- const char *, int fd);
-static void usage(void);
-static void version(void);
-
-int
-main(int argc, char *argv[])
-{
- static char buff[16384];
- struct cpio _cpio; /* Allocated on stack. */
- struct cpio *cpio;
- int uid, gid;
- int opt;
-
- cpio = &_cpio;
- memset(cpio, 0, sizeof(*cpio));
- cpio->buff = buff;
- cpio->buff_size = sizeof(buff);
-
- /* Need cpio_progname before calling cpio_warnc. */
- if (*argv == NULL)
- cpio_progname = "bsdcpio";
- else {
- cpio_progname = strrchr(*argv, '/');
- if (cpio_progname != NULL)
- cpio_progname++;
- else
- cpio_progname = *argv;
- }
-
- cpio->uid_override = -1;
- cpio->gid_override = -1;
- cpio->argv = argv;
- cpio->argc = argc;
- cpio->line_separator = '\n';
- cpio->mode = '\0';
- cpio->verbose = 0;
- cpio->compress = '\0';
- /* TODO: Implement old binary format in libarchive, use that here. */
- cpio->format = "odc"; /* Default format */
- cpio->extract_flags = ARCHIVE_EXTRACT_NO_AUTODIR;
- cpio->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER;
- cpio->extract_flags |= ARCHIVE_EXTRACT_SECURE_SYMLINKS;
- cpio->extract_flags |= ARCHIVE_EXTRACT_SECURE_NODOTDOT;
- cpio->extract_flags |= ARCHIVE_EXTRACT_PERM;
- cpio->extract_flags |= ARCHIVE_EXTRACT_FFLAGS;
- cpio->extract_flags |= ARCHIVE_EXTRACT_ACL;
- if (geteuid() == 0)
- cpio->extract_flags |= ARCHIVE_EXTRACT_OWNER;
- cpio->bytes_per_block = 512;
- cpio->filename = NULL;
-
- while ((opt = cpio_getopt(cpio)) != -1) {
- switch (opt) {
- case '0': /* GNU convention: --null, -0 */
- cpio->line_separator = '\0';
- break;
- case 'A': /* NetBSD/OpenBSD */
- cpio->option_append = 1;
- break;
- case 'a': /* POSIX 1997 */
- cpio->option_atime_restore = 1;
- break;
- case 'B': /* POSIX 1997 */
- cpio->bytes_per_block = 5120;
- break;
- case 'C': /* NetBSD/OpenBSD */
- cpio->bytes_per_block = atoi(optarg);
- if (cpio->bytes_per_block <= 0)
- cpio_errc(1, 0, "Invalid blocksize %s", optarg);
- break;
- case 'c': /* POSIX 1997 */
- cpio->format = "odc";
- break;
- case 'd': /* POSIX 1997 */
- cpio->extract_flags &= ~ARCHIVE_EXTRACT_NO_AUTODIR;
- break;
- case 'E': /* NetBSD/OpenBSD */
- include_from_file(cpio, optarg);
- break;
- case 'F': /* NetBSD/OpenBSD/GNU cpio */
- cpio->filename = optarg;
- break;
- case 'f': /* POSIX 1997 */
- exclude(cpio, optarg);
- break;
- case 'H': /* GNU cpio (also --format) */
- cpio->format = optarg;
- break;
- case 'h':
- long_help();
- break;
- case 'I': /* NetBSD/OpenBSD */
- cpio->filename = optarg;
- break;
- case 'i': /* POSIX 1997 */
- cpio->mode = opt;
- break;
- case OPTION_INSECURE:
- cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_SYMLINKS;
- cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_NODOTDOT;
- break;
- case 'L': /* GNU cpio */
- cpio->option_follow_links = 1;
- break;
- case 'l': /* POSIX 1997 */
- cpio->option_link = 1;
- break;
- case 'm': /* POSIX 1997 */
- cpio->extract_flags |= ARCHIVE_EXTRACT_TIME;
- break;
- case OPTION_NO_PRESERVE_OWNER: /* GNU cpio */
- cpio->extract_flags &= ~ARCHIVE_EXTRACT_OWNER;
- break;
- case 'O': /* GNU cpio */
- cpio->filename = optarg;
- break;
- case 'o': /* POSIX 1997 */
- cpio->mode = opt;
- break;
- case 'p': /* POSIX 1997 */
- cpio->mode = opt;
- cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_NODOTDOT;
- break;
- case OPTION_QUIET: /* GNU cpio */
- cpio->quiet = 1;
- break;
- case 'R': /* GNU cpio, also --owner */
- if (owner_parse(optarg, &uid, &gid))
- usage();
- if (uid != -1)
- cpio->uid_override = uid;
- if (gid != -1)
- cpio->gid_override = gid;
- break;
- case 'r': /* POSIX 1997 */
- cpio->option_rename = 1;
- break;
- case 't': /* POSIX 1997 */
- cpio->option_list = 1;
- break;
- case 'u': /* POSIX 1997 */
- cpio->extract_flags
- &= ~ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER;
- break;
- case 'v': /* POSIX 1997 */
- cpio->verbose++;
- break;
- case OPTION_VERSION: /* GNU convention */
- version();
- break;
-#if 0
- /*
- * cpio_getopt() handles -W specially, so it's not
- * available here.
- */
- case 'W': /* Obscure, but useful GNU convention. */
- break;
-#endif
- case 'y': /* tar convention */
- cpio->compress = opt;
- break;
- case 'Z': /* tar convention */
- cpio->compress = opt;
- break;
- case 'z': /* tar convention */
- cpio->compress = opt;
- break;
- default:
- usage();
- }
- }
-
- /* TODO: Sanity-check args, error out on nonsensical combinations. */
-
- cpio->argc -= optind;
- cpio->argv += optind;
-
- switch (cpio->mode) {
- case 'o':
- mode_out(cpio);
- break;
- case 'i':
- while (*cpio->argv != NULL) {
- include(cpio, *cpio->argv);
- --cpio->argc;
- ++cpio->argv;
- }
- if (cpio->option_list)
- mode_list(cpio);
- else
- mode_in(cpio);
- break;
- case 'p':
- if (*cpio->argv == NULL || **cpio->argv == '\0')
- cpio_errc(1, 0,
- "-p mode requires a target directory");
- mode_pass(cpio, *cpio->argv);
- break;
- default:
- cpio_errc(1, 0,
- "Must specify at least one of -i, -o, or -p");
- }
-
- return (0);
-}
-
-void
-usage(void)
-{
- const char *p;
-
- p = cpio_progname;
-
- fprintf(stderr, "Brief Usage:\n");
- fprintf(stderr, " List: %s -it < archive\n", p);
- fprintf(stderr, " Extract: %s -i < archive\n", p);
- fprintf(stderr, " Create: %s -o < filenames > archive\n", p);
-#ifdef HAVE_GETOPT_LONG
- fprintf(stderr, " Help: %s --help\n", p);
-#else
- fprintf(stderr, " Help: %s -h\n", p);
-#endif
- exit(1);
-}
-
-static const char *long_help_msg =
- "First option must be a mode specifier:\n"
- " -i Input -o Output -p Pass\n"
- "Common Options:\n"
- " -v Verbose\n"
- "Create: %p -o [options] < [list of files] > [archive]\n"
- " -z, -y Compress archive with gzip/bzip2\n"
- " --format {odc|newc|ustar} Select archive format\n"
- "List: %p -it < [archive]\n"
- "Extract: %p -i [options] < [archive]\n";
-
-
-/*
- * Note that the word 'bsdcpio' will always appear in the first line
- * of output.
- *
- * In particular, /bin/sh scripts that need to test for the presence
- * of bsdcpio can use the following template:
- *
- * if (cpio --help 2>&1 | grep bsdcpio >/dev/null 2>&1 ) then \
- * echo bsdcpio; else echo not bsdcpio; fi
- */
-static void
-long_help(void)
-{
- const char *prog;
- const char *p;
-
- prog = cpio_progname;
-
- fflush(stderr);
-
- p = (strcmp(prog,"bsdcpio") != 0) ? "(bsdcpio)" : "";
- printf("%s%s: manipulate archive files\n", prog, p);
-
- for (p = long_help_msg; *p != '\0'; p++) {
- if (*p == '%') {
- if (p[1] == 'p') {
- fputs(prog, stdout);
- p++;
- } else
- putchar('%');
- } else
- putchar(*p);
- }
- version();
-}
-
-static void
-version(void)
-{
- fprintf(stdout,"bsdcpio %s -- %s\n",
- BSDCPIO_VERSION_STRING,
- archive_version());
- exit(0);
-}
-
-static void
-mode_out(struct cpio *cpio)
-{
- unsigned long blocks;
- struct archive_entry *entry, *spare;
- struct line_reader *lr;
- const char *p;
- int r;
-
- if (cpio->option_append)
- cpio_errc(1, 0, "Append mode not yet supported.");
- cpio->archive = archive_write_new();
- if (cpio->archive == NULL)
- cpio_errc(1, 0, "Failed to allocate archive object");
- switch (cpio->compress) {
- case 'j': case 'y':
- archive_write_set_compression_bzip2(cpio->archive);
- break;
- case 'z':
- archive_write_set_compression_gzip(cpio->archive);
- break;
- case 'Z':
- archive_write_set_compression_compress(cpio->archive);
- break;
- default:
- archive_write_set_compression_none(cpio->archive);
- break;
- }
- r = archive_write_set_format_by_name(cpio->archive, cpio->format);
- if (r != ARCHIVE_OK)
- cpio_errc(1, 0, archive_error_string(cpio->archive));
- archive_write_set_bytes_per_block(cpio->archive, cpio->bytes_per_block);
- cpio->linkresolver = archive_entry_linkresolver_new();
- archive_entry_linkresolver_set_strategy(cpio->linkresolver,
- archive_format(cpio->archive));
-
- r = archive_write_open_file(cpio->archive, cpio->filename);
- if (r != ARCHIVE_OK)
- cpio_errc(1, 0, archive_error_string(cpio->archive));
- lr = process_lines_init("-", cpio->line_separator);
- while ((p = process_lines_next(lr)) != NULL)
- file_to_archive(cpio, p);
- process_lines_free(lr);
-
- /*
- * The hardlink detection may have queued up a couple of entries
- * that can now be flushed.
- */
- entry = NULL;
- archive_entry_linkify(cpio->linkresolver, &entry, &spare);
- while (entry != NULL) {
- entry_to_archive(cpio, entry);
- archive_entry_free(entry);
- entry = NULL;
- archive_entry_linkify(cpio->linkresolver, &entry, &spare);
- }
-
- r = archive_write_close(cpio->archive);
- if (r != ARCHIVE_OK)
- cpio_errc(1, 0, archive_error_string(cpio->archive));
-
- if (!cpio->quiet) {
- blocks = (archive_position_uncompressed(cpio->archive) + 511)
- / 512;
- fprintf(stderr, "%lu %s\n", blocks,
- blocks == 1 ? "block" : "blocks");
- }
- archive_write_finish(cpio->archive);
-}
-
-/*
- * This is used by both out mode (to copy objects from disk into
- * an archive) and pass mode (to copy objects from disk to
- * an archive_write_disk "archive").
- */
-static int
-file_to_archive(struct cpio *cpio, const char *srcpath)
-{
- struct stat st;
- const char *destpath;
- struct archive_entry *entry, *spare;
- size_t len;
- const char *p;
- int lnklen;
- int r;
-
- /*
- * Create an archive_entry describing the source file.
- */
- entry = archive_entry_new();
- if (entry == NULL)
- cpio_errc(1, 0, "Couldn't allocate entry");
- archive_entry_copy_sourcepath(entry, srcpath);
-
- /* Get stat information. */
- if (cpio->option_follow_links)
- r = stat(srcpath, &st);
- else
- r = lstat(srcpath, &st);
- if (r != 0) {
- cpio_warnc(errno, "Couldn't stat \"%s\"", srcpath);
- archive_entry_free(entry);
- return (0);
- }
-
- if (cpio->uid_override >= 0)
- st.st_uid = cpio->uid_override;
- if (cpio->gid_override >= 0)
- st.st_gid = cpio->uid_override;
- archive_entry_copy_stat(entry, &st);
-
- /* If its a symlink, pull the target. */
- if (S_ISLNK(st.st_mode)) {
- lnklen = readlink(srcpath, cpio->buff, cpio->buff_size);
- if (lnklen < 0) {
- cpio_warnc(errno,
- "%s: Couldn't read symbolic link", srcpath);
- archive_entry_free(entry);
- return (0);
- }
- cpio->buff[lnklen] = 0;
- archive_entry_set_symlink(entry, cpio->buff);
- }
-
- /*
- * Generate a destination path for this entry.
- * "destination path" is the name to which it will be copied in
- * pass mode or the name that will go into the archive in
- * output mode.
- */
- destpath = srcpath;
- if (cpio->destdir) {
- len = strlen(cpio->destdir) + strlen(srcpath) + 8;
- if (len >= cpio->pass_destpath_alloc) {
- while (len >= cpio->pass_destpath_alloc) {
- cpio->pass_destpath_alloc += 512;
- cpio->pass_destpath_alloc *= 2;
- }
- free(cpio->pass_destpath);
- cpio->pass_destpath = malloc(cpio->pass_destpath_alloc);
- if (cpio->pass_destpath == NULL)
- cpio_errc(1, ENOMEM,
- "Can't allocate path buffer");
- }
- strcpy(cpio->pass_destpath, cpio->destdir);
- p = srcpath;
- while (p[0] == '/')
- ++p;
- strcat(cpio->pass_destpath, p);
- destpath = cpio->pass_destpath;
- }
- if (cpio->option_rename)
- destpath = cpio_rename(destpath);
- if (destpath == NULL)
- return (0);
- archive_entry_copy_pathname(entry, destpath);
-
- /*
- * If we're trying to preserve hardlinks, match them here.
- */
- spare = NULL;
- if (cpio->linkresolver != NULL
- && !S_ISDIR(st.st_mode)) {
- archive_entry_linkify(cpio->linkresolver, &entry, &spare);
- }
-
- if (entry != NULL) {
- r = entry_to_archive(cpio, entry);
- archive_entry_free(entry);
- }
- if (spare != NULL) {
- if (r == 0)
- r = entry_to_archive(cpio, spare);
- archive_entry_free(spare);
- }
- return (r);
-}
-
-static int
-entry_to_archive(struct cpio *cpio, struct archive_entry *entry)
-{
- const char *destpath = archive_entry_pathname(entry);
- const char *srcpath = archive_entry_sourcepath(entry);
- int fd = -1;
- ssize_t bytes_read;
- int r;
-
- /* Print out the destination name to the user. */
- if (cpio->verbose)
- fprintf(stderr,"%s", destpath);
-
- /*
- * Option_link only makes sense in pass mode and for
- * regular files. Also note: if a link operation fails
- * because of cross-device restrictions, we'll fall back
- * to copy mode for that entry.
- *
- * TODO: Test other cpio implementations to see if they
- * hard-link anything other than regular files here.
- */
- if (cpio->option_link
- && archive_entry_filetype(entry) == AE_IFREG)
- {
- struct archive_entry *t;
- /* Save the original entry in case we need it later. */
- t = archive_entry_clone(entry);
- if (t == NULL)
- cpio_errc(1, ENOMEM, "Can't create link");
- /* Note: link(2) doesn't create parent directories,
- * so we use archive_write_header() instead as a
- * convenience. */
- archive_entry_set_hardlink(t, srcpath);
- /* This is a straight link that carries no data. */
- archive_entry_set_size(t, 0);
- r = archive_write_header(cpio->archive, t);
- archive_entry_free(t);
- if (r != ARCHIVE_OK)
- cpio_warnc(archive_errno(cpio->archive),
- archive_error_string(cpio->archive));
- if (r == ARCHIVE_FATAL)
- exit(1);
-#ifdef EXDEV
- if (r != ARCHIVE_OK && archive_errno(cpio->archive) == EXDEV) {
- /* Cross-device link: Just fall through and use
- * the original entry to copy the file over. */
- cpio_warnc(0, "Copying file instead");
- } else
-#endif
- return (0);
- }
-
- /*
- * Make sure we can open the file (if necessary) before
- * trying to write the header.
- */
- if (archive_entry_filetype(entry) == AE_IFREG) {
- if (archive_entry_size(entry) > 0) {
- fd = open(srcpath, O_RDONLY);
- if (fd < 0) {
- cpio_warnc(errno,
- "%s: could not open file", srcpath);
- goto cleanup;
- }
- }
- } else {
- archive_entry_set_size(entry, 0);
- }
-
- r = archive_write_header(cpio->archive, entry);
-
- if (r != ARCHIVE_OK)
- cpio_warnc(archive_errno(cpio->archive),
- "%s: %s",
- destpath,
- archive_error_string(cpio->archive));
-
- if (r == ARCHIVE_FATAL)
- exit(1);
-
- if (r >= ARCHIVE_WARN && fd >= 0) {
- bytes_read = read(fd, cpio->buff, cpio->buff_size);
- while (bytes_read > 0) {
- r = archive_write_data(cpio->archive,
- cpio->buff, bytes_read);
- if (r < 0)
- cpio_errc(1, archive_errno(cpio->archive),
- archive_error_string(cpio->archive));
- if (r < bytes_read) {
- cpio_warnc(0,
- "Truncated write; file may have grown while being archived.");
- }
- bytes_read = read(fd, cpio->buff, cpio->buff_size);
- }
- }
-
- restore_time(cpio, entry, srcpath, fd);
-
-cleanup:
- if (cpio->verbose)
- fprintf(stderr,"\n");
- if (fd >= 0)
- close(fd);
- return (0);
-}
-
-static void
-restore_time(struct cpio *cpio, struct archive_entry *entry,
- const char *name, int fd)
-{
-#ifndef HAVE_UTIMES
- static int warned = 0;
-
- (void)cpio; /* UNUSED */
- (void)entry; /* UNUSED */
- (void)name; /* UNUSED */
- (void)fd; /* UNUSED */
-
- if (!warned)
- cpio_warnc(0, "Can't restore access times on this platform");
- warned = 1;
- return;
-#else
- struct timeval times[2];
-
- if (!cpio->option_atime_restore)
- return;
-
- times[1].tv_sec = archive_entry_mtime(entry);
- times[1].tv_usec = archive_entry_mtime_nsec(entry) / 1000;
-
- times[0].tv_sec = archive_entry_atime(entry);
- times[0].tv_usec = archive_entry_atime_nsec(entry) / 1000;
-
-#ifdef HAVE_FUTIMES
- if (fd >= 0 && futimes(fd, times) == 0)
- return;
-#endif
-
-#ifdef HAVE_LUTIMES
- if (lutimes(name, times) != 0)
-#else
- if (!S_ISLNK(archive_entry_mode(entry)) && utimes(name, times) != 0)
-#endif
- cpio_warnc(errno, "Can't update time for %s", name);
-#endif
-}
-
-
-static void
-mode_in(struct cpio *cpio)
-{
- struct archive *a;
- struct archive_entry *entry;
- struct archive *ext;
- const char *destpath;
- unsigned long blocks;
- int r;
-
- ext = archive_write_disk_new();
- if (ext == NULL)
- cpio_errc(1, 0, "Couldn't allocate restore object");
- r = archive_write_disk_set_options(ext, cpio->extract_flags);
- if (r != ARCHIVE_OK)
- cpio_errc(1, 0, archive_error_string(ext));
- a = archive_read_new();
- if (a == NULL)
- cpio_errc(1, 0, "Couldn't allocate archive object");
- archive_read_support_compression_all(a);
- archive_read_support_format_all(a);
-
- if (archive_read_open_file(a, cpio->filename, cpio->bytes_per_block))
- cpio_errc(1, archive_errno(a),
- archive_error_string(a));
- for (;;) {
- r = archive_read_next_header(a, &entry);
- if (r == ARCHIVE_EOF)
- break;
- if (r != ARCHIVE_OK) {
- cpio_errc(1, archive_errno(a),
- archive_error_string(a));
- }
- if (excluded(cpio, archive_entry_pathname(entry)))
- continue;
- if (cpio->option_rename) {
- destpath = cpio_rename(archive_entry_pathname(entry));
- archive_entry_set_pathname(entry, destpath);
- } else
- destpath = archive_entry_pathname(entry);
- if (destpath == NULL)
- continue;
- if (cpio->verbose)
- fprintf(stdout, "%s\n", destpath);
- if (cpio->uid_override >= 0)
- archive_entry_set_uid(entry, cpio->uid_override);
- if (cpio->gid_override >= 0)
- archive_entry_set_gid(entry, cpio->gid_override);
- r = archive_write_header(ext, entry);
- if (r != ARCHIVE_OK) {
- fprintf(stderr, "%s: %s\n",
- archive_entry_pathname(entry),
- archive_error_string(ext));
- } else if (archive_entry_size(entry) > 0) {
- r = copy_data(a, ext);
- }
- }
- r = archive_read_close(a);
- if (r != ARCHIVE_OK)
- cpio_errc(1, 0, archive_error_string(a));
- r = archive_write_close(ext);
- if (r != ARCHIVE_OK)
- cpio_errc(1, 0, archive_error_string(ext));
- if (!cpio->quiet) {
- blocks = (archive_position_uncompressed(a) + 511)
- / 512;
- fprintf(stderr, "%lu %s\n", blocks,
- blocks == 1 ? "block" : "blocks");
- }
- archive_read_finish(a);
- archive_write_finish(ext);
- exit(0);
-}
-
-static int
-copy_data(struct archive *ar, struct archive *aw)
-{
- int r;
- size_t size;
- const void *block;
- off_t offset;
-
- for (;;) {
- r = archive_read_data_block(ar, &block, &size, &offset);
- if (r == ARCHIVE_EOF)
- return (ARCHIVE_OK);
- if (r != ARCHIVE_OK) {
- cpio_warnc(archive_errno(ar),
- "%s", archive_error_string(ar));
- return (r);
- }
- r = archive_write_data_block(aw, block, size, offset);
- if (r != ARCHIVE_OK) {
- cpio_warnc(archive_errno(aw),
- archive_error_string(aw));
- return (r);
- }
- }
-}
-
-static void
-mode_list(struct cpio *cpio)
-{
- struct archive *a;
- struct archive_entry *entry;
- unsigned long blocks;
- int r;
-
- a = archive_read_new();
- if (a == NULL)
- cpio_errc(1, 0, "Couldn't allocate archive object");
- archive_read_support_compression_all(a);
- archive_read_support_format_all(a);
-
- if (archive_read_open_file(a, cpio->filename, cpio->bytes_per_block))
- cpio_errc(1, archive_errno(a),
- archive_error_string(a));
- for (;;) {
- r = archive_read_next_header(a, &entry);
- if (r == ARCHIVE_EOF)
- break;
- if (r != ARCHIVE_OK) {
- cpio_errc(1, archive_errno(a),
- archive_error_string(a));
- }
- if (excluded(cpio, archive_entry_pathname(entry)))
- continue;
- if (cpio->verbose) {
- /* TODO: uname/gname lookups */
- /* TODO: Clean this up. */
- fprintf(stdout,
- "%s%3d %8s%8s " CPIO_FILESIZE_PRINTF " %s\n",
- archive_entry_strmode(entry),
- archive_entry_nlink(entry),
- archive_entry_uname(entry),
- archive_entry_gname(entry),
- (CPIO_FILESIZE_TYPE)archive_entry_size(entry),
- archive_entry_pathname(entry));
- } else
- fprintf(stdout, "%s\n", archive_entry_pathname(entry));
- }
- r = archive_read_close(a);
- if (r != ARCHIVE_OK)
- cpio_errc(1, 0, archive_error_string(a));
- if (!cpio->quiet) {
- blocks = (archive_position_uncompressed(a) + 511)
- / 512;
- fprintf(stderr, "%lu %s\n", blocks,
- blocks == 1 ? "block" : "blocks");
- }
- archive_read_finish(a);
- exit(0);
-}
-
-static void
-mode_pass(struct cpio *cpio, const char *destdir)
-{
- unsigned long blocks;
- struct line_reader *lr;
- const char *p;
- int r;
-
- /* Ensure target dir has a trailing '/' to simplify path surgery. */
- cpio->destdir = malloc(strlen(destdir) + 8);
- strcpy(cpio->destdir, destdir);
- if (destdir[strlen(destdir) - 1] != '/')
- strcat(cpio->destdir, "/");
-
- cpio->archive = archive_write_disk_new();
- if (cpio->archive == NULL)
- cpio_errc(1, 0, "Failed to allocate archive object");
- r = archive_write_disk_set_options(cpio->archive, cpio->extract_flags);
- if (r != ARCHIVE_OK)
- cpio_errc(1, 0, archive_error_string(cpio->archive));
- cpio->linkresolver = archive_entry_linkresolver_new();
- archive_write_disk_set_standard_lookup(cpio->archive);
- lr = process_lines_init("-", cpio->line_separator);
- while ((p = process_lines_next(lr)) != NULL)
- file_to_archive(cpio, p);
- process_lines_free(lr);
-
- archive_entry_linkresolver_free(cpio->linkresolver);
- r = archive_write_close(cpio->archive);
- if (r != ARCHIVE_OK)
- cpio_errc(1, 0, archive_error_string(cpio->archive));
-
- if (!cpio->quiet) {
- blocks = (archive_position_uncompressed(cpio->archive) + 511)
- / 512;
- fprintf(stderr, "%lu %s\n", blocks,
- blocks == 1 ? "block" : "blocks");
- }
-
- archive_write_finish(cpio->archive);
-}
-
-/*
- * Prompt for a new name for this entry. Returns a pointer to the
- * new name or NULL if the entry should not be copied. This
- * implements the semantics defined in POSIX.1-1996, which specifies
- * that an input of '.' means the name should be unchanged. GNU cpio
- * treats '.' as a literal new name.
- */
-static const char *
-cpio_rename(const char *name)
-{
- static char buff[1024];
- FILE *t;
- char *p, *ret;
-
- t = fopen("/dev/tty", "r+");
- if (t == NULL)
- return (name);
- fprintf(t, "%s (Enter/./(new name))? ", name);
- fflush(t);
-
- p = fgets(buff, sizeof(buff), t);
- fclose(t);
- if (p == NULL)
- /* End-of-file is a blank line. */
- return (NULL);
-
- while (*p == ' ' || *p == '\t')
- ++p;
- if (*p == '\n' || *p == '\0')
- /* Empty line. */
- return (NULL);
- if (*p == '.' && p[1] == '\n')
- /* Single period preserves original name. */
- return (name);
- ret = p;
- /* Trim the final newline. */
- while (*p != '\0' && *p != '\n')
- ++p;
- /* Overwrite the final \n with a null character. */
- *p = '\0';
- return (ret);
-}
-
-
-/*
- * Read lines from file and do something with each one. If option_null
- * is set, lines are terminated with zero bytes; otherwise, they're
- * terminated with newlines.
- *
- * This uses a self-sizing buffer to handle arbitrarily-long lines.
- */
-struct line_reader {
- FILE *f;
- char *buff, *buff_end, *line_start, *line_end, *p;
- char *pathname;
- size_t buff_length;
- int separator;
- int ret;
-};
-
-struct line_reader *
-process_lines_init(const char *pathname, char separator)
-{
- struct line_reader *lr;
-
- lr = calloc(1, sizeof(*lr));
- if (lr == NULL)
- cpio_errc(1, ENOMEM, "Can't open %s", pathname);
-
- lr->separator = separator;
- lr->pathname = strdup(pathname);
-
- if (strcmp(pathname, "-") == 0)
- lr->f = stdin;
- else
- lr->f = fopen(pathname, "r");
- if (lr->f == NULL)
- cpio_errc(1, errno, "Couldn't open %s", pathname);
- lr->buff_length = 8192;
- lr->buff = malloc(lr->buff_length);
- if (lr->buff == NULL)
- cpio_errc(1, ENOMEM, "Can't read %s", pathname);
- lr->line_start = lr->line_end = lr->buff_end = lr->buff;
-
- return (lr);
-}
-
-const char *
-process_lines_next(struct line_reader *lr)
-{
- size_t bytes_wanted, bytes_read, new_buff_size;
- char *line_start, *p;
-
- for (;;) {
- /* If there's a line in the buffer, return it immediately. */
- while (lr->line_end < lr->buff_end) {
- if (*lr->line_end == lr->separator) {
- *lr->line_end = '\0';
- line_start = lr->line_start;
- lr->line_start = lr->line_end + 1;
- lr->line_end = lr->line_start;
- return (line_start);
- } else
- lr->line_end++;
- }
-
- /* If we're at end-of-file, process the final data. */
- if (lr->f == NULL) {
- /* If there's more text, return one last line. */
- if (lr->line_end > lr->line_start) {
- *lr->line_end = '\0';
- line_start = lr->line_start;
- lr->line_start = lr->line_end + 1;
- lr->line_end = lr->line_start;
- return (line_start);
- }
- /* Otherwise, we're done. */
- return (NULL);
- }
-
- /* Buffer only has part of a line. */
- if (lr->line_start > lr->buff) {
- /* Move a leftover fractional line to the beginning. */
- memmove(lr->buff, lr->line_start,
- lr->buff_end - lr->line_start);
- lr->buff_end -= lr->line_start - lr->buff;
- lr->line_end -= lr->line_start - lr->buff;
- lr->line_start = lr->buff;
- } else {
- /* Line is too big; enlarge the buffer. */
- new_buff_size = lr->buff_length * 2;
- if (new_buff_size <= lr->buff_length)
- cpio_errc(1, ENOMEM,
- "Line too long in %s", lr->pathname);
- lr->buff_length = new_buff_size;
- p = realloc(lr->buff, new_buff_size);
- if (p == NULL)
- cpio_errc(1, ENOMEM,
- "Line too long in %s", lr->pathname);
- lr->buff_end = p + (lr->buff_end - lr->buff);
- lr->line_end = p + (lr->line_end - lr->buff);
- lr->line_start = lr->buff = p;
- }
-
- /* Get some more data into the buffer. */
- bytes_wanted = lr->buff + lr->buff_length - lr->buff_end;
- bytes_read = fread(lr->buff_end, 1, bytes_wanted, lr->f);
- lr->buff_end += bytes_read;
-
- if (ferror(lr->f))
- cpio_errc(1, errno, "Can't read %s", lr->pathname);
- if (feof(lr->f)) {
- if (lr->f != stdin)
- fclose(lr->f);
- lr->f = NULL;
- }
- }
-}
-
-void
-process_lines_free(struct line_reader *lr)
-{
- free(lr->buff);
- free(lr->pathname);
- free(lr);
-}
diff --git a/usr.bin/cpio/cpio.h b/usr.bin/cpio/cpio.h
deleted file mode 100644
index 1db7ec1..0000000
--- a/usr.bin/cpio/cpio.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef CPIO_H_INCLUDED
-#define CPIO_H_INCLUDED
-
-#include "cpio_platform.h"
-#include <stdio.h>
-
-#define DEFAULT_BYTES_PER_BLOCK (20*512)
-
-/*
- * The internal state for the "cpio" program.
- *
- * Keeping all of the state in a structure like this simplifies memory
- * leak testing (at exit, anything left on the heap is suspect). A
- * pointer to this structure is passed to most cpio internal
- * functions.
- */
-struct cpio {
- /* Options */
- char *filename;
- char mode; /* -i -o -p */
- char compress; /* -j, -y, or -z */
- const char *format; /* -H format */
- int bytes_per_block; /* -b block_size */
- int verbose; /* -v */
- int quiet; /* --quiet */
- int extract_flags; /* Flags for extract operation */
- char symlink_mode; /* H or L, per BSD conventions */
- const char *compress_program;
- char line_separator; /* --null ? '\0' : '\n' */
- int option_append; /* -A, only relevant for -o */
- int option_atime_restore; /* -a */
- int option_follow_links; /* -L */
- int option_link; /* -l */
- int option_list; /* -t */
- int option_rename; /* -r */
- char *destdir;
- size_t pass_destpath_alloc;
- char *pass_destpath;
- int uid_override;
- int gid_override;
-
- /* If >= 0, then close this when done. */
- int fd;
-
- /* Miscellaneous state information */
- struct archive *archive;
- int argc;
- char **argv;
- int return_value; /* Value returned by main() */
- struct archive_entry_linkresolver *linkresolver;
-
- /* Work data. */
- struct matching *matching;
- char *buff;
- size_t buff_size;
-};
-
-/* Name of this program; used in error reporting, initialized in main(). */
-const char *cpio_progname;
-
-void cpio_errc(int _eval, int _code, const char *fmt, ...) __dead2;
-void cpio_warnc(int _code, const char *fmt, ...);
-
-int owner_parse(const char *, int *, int *);
-
-
-/* Fake short equivalents for long options that otherwise lack them. */
-enum {
- OPTION_INSECURE = 1,
- OPTION_NO_PRESERVE_OWNER,
- OPTION_QUIET,
- OPTION_VERSION
-};
-
-struct line_reader;
-
-struct line_reader *process_lines_init(const char *, char separator);
-const char *process_lines_next(struct line_reader *);
-void process_lines_free(struct line_reader *);
-
-int cpio_getopt(struct cpio *cpio);
-int include_from_file(struct cpio *, const char *);
-
-#endif
diff --git a/usr.bin/cpio/cpio_platform.h b/usr.bin/cpio/cpio_platform.h
deleted file mode 100644
index 3145198..0000000
--- a/usr.bin/cpio/cpio_platform.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/*
- * This header is the first thing included in any of the cpio
- * source files. As far as possible, platform-specific issues should
- * be dealt with here and not within individual source files.
- */
-
-#ifndef CPIO_PLATFORM_H_INCLUDED
-#define CPIO_PLATFORM_H_INCLUDED
-
-#if defined(PLATFORM_CONFIG_H)
-/* Use hand-built config.h in environments that need it. */
-#include PLATFORM_CONFIG_H
-#elif defined(HAVE_CONFIG_H)
-/* Most POSIX platforms use the 'configure' script to build config.h */
-#include "../config.h"
-#else
-/* Warn if cpio hasn't been (automatically or manually) configured. */
-#error Oops: No config.h and no built-in configuration in cpio_platform.h.
-#endif /* !HAVE_CONFIG_H */
-
-/* No non-FreeBSD platform will have __FBSDID, so just define it here. */
-#ifdef __FreeBSD__
-#include <sys/cdefs.h> /* For __FBSDID */
-#else
-/* Just leaving this macro replacement empty leads to a dangling semicolon. */
-#define __FBSDID(a) struct _undefined_hack
-#endif
-
-#ifdef HAVE_LIBARCHIVE
-/* If we're using the platform libarchive, include system headers. */
-#include <archive.h>
-#include <archive_entry.h>
-#else
-/* Otherwise, include user headers. */
-#include "archive.h"
-#include "archive_entry.h"
-#endif
-
-/*
- * We need to be able to display a filesize using printf(). The type
- * and format string here must be compatible with one another and
- * large enough for any file.
- */
-#if HAVE_UINTMAX_T
-#define CPIO_FILESIZE_TYPE uintmax_t
-#define CPIO_FILESIZE_PRINTF "%ju"
-#else
-#if HAVE_UNSIGNED_LONG_LONG
-#define CPIO_FILESIZE_TYPE unsigned long long
-#define CPIO_FILESIZE_PRINTF "%llu"
-#else
-#define CPIO_FILESIZE_TYPE unsigned long
-#define CPIO_FILESIZE_PRINTF "%lu"
-#endif
-#endif
-
-#endif /* !CPIO_PLATFORM_H_INCLUDED */
diff --git a/usr.bin/cpio/err.c b/usr.bin/cpio/err.c
deleted file mode 100644
index ad9c0e1..0000000
--- a/usr.bin/cpio/err.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#include "cpio_platform.h"
-__FBSDID("$FreeBSD$");
-
-#ifdef HAVE_STDARG_H
-#include <stdarg.h>
-#endif
-#include <stdio.h>
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include "cpio.h"
-
-static void
-cpio_vwarnc(int code, const char *fmt, va_list ap)
-{
- fprintf(stderr, "%s: ", cpio_progname);
- vfprintf(stderr, fmt, ap);
- if (code != 0)
- fprintf(stderr, ": %s", strerror(code));
- fprintf(stderr, "\n");
-}
-
-void
-cpio_warnc(int code, const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- cpio_vwarnc(code, fmt, ap);
- va_end(ap);
-}
-
-void
-cpio_errc(int eval, int code, const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- cpio_vwarnc(code, fmt, ap);
- va_end(ap);
- exit(eval);
-}
diff --git a/usr.bin/cpio/matching.c b/usr.bin/cpio/matching.c
deleted file mode 100644
index 8d1798f..0000000
--- a/usr.bin/cpio/matching.c
+++ /dev/null
@@ -1,259 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "cpio_platform.h"
-__FBSDID("$FreeBSD$");
-
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include "matching.h"
-#include "pathmatch.h"
-
-struct match {
- struct match *next;
- int matches;
- char pattern[1];
-};
-
-struct matching {
- struct match *exclusions;
- int exclusions_count;
- struct match *inclusions;
- int inclusions_count;
- int inclusions_unmatched_count;
-};
-
-static void add_pattern(struct match **list, const char *pattern);
-static void initialize_matching(struct cpio *);
-static int match_exclusion(struct match *, const char *pathname);
-static int match_inclusion(struct match *, const char *pathname);
-
-/*
- * The matching logic here needs to be re-thought. I started out to
- * try to mimic gtar's matching logic, but it's not entirely
- * consistent. In particular 'tar -t' and 'tar -x' interpret patterns
- * on the command line as anchored, but --exclude doesn't.
- */
-
-/*
- * Utility functions to manage exclusion/inclusion patterns
- */
-
-int
-exclude(struct cpio *cpio, const char *pattern)
-{
- struct matching *matching;
-
- if (cpio->matching == NULL)
- initialize_matching(cpio);
- matching = cpio->matching;
- add_pattern(&(matching->exclusions), pattern);
- matching->exclusions_count++;
- return (0);
-}
-
-#if 0
-int
-exclude_from_file(struct cpio *cpio, const char *pathname)
-{
- return (process_lines(cpio, pathname, &exclude));
-}
-#endif
-
-int
-include(struct cpio *cpio, const char *pattern)
-{
- struct matching *matching;
-
- if (cpio->matching == NULL)
- initialize_matching(cpio);
- matching = cpio->matching;
- add_pattern(&(matching->inclusions), pattern);
- matching->inclusions_count++;
- matching->inclusions_unmatched_count++;
- return (0);
-}
-
-int
-include_from_file(struct cpio *cpio, const char *pathname)
-{
- struct line_reader *lr;
- const char *p;
- int ret = 0;
-
- lr = process_lines_init(pathname, '\n');
- while ((p = process_lines_next(lr)) != NULL)
- if (include(cpio, p) != 0)
- ret = -1;
- process_lines_free(lr);
- return (ret);
-}
-
-static void
-add_pattern(struct match **list, const char *pattern)
-{
- struct match *match;
-
- match = malloc(sizeof(*match) + strlen(pattern) + 1);
- if (match == NULL)
- cpio_errc(1, errno, "Out of memory");
- if (pattern[0] == '/')
- pattern++;
- strcpy(match->pattern, pattern);
- /* Both "foo/" and "foo" should match "foo/bar". */
- if (match->pattern[strlen(match->pattern)-1] == '/')
- match->pattern[strlen(match->pattern)-1] = '\0';
- match->next = *list;
- *list = match;
- match->matches = 0;
-}
-
-
-int
-excluded(struct cpio *cpio, const char *pathname)
-{
- struct matching *matching;
- struct match *match;
- struct match *matched;
-
- matching = cpio->matching;
- if (matching == NULL)
- return (0);
-
- /* Exclusions take priority */
- for (match = matching->exclusions; match != NULL; match = match->next){
- if (match_exclusion(match, pathname))
- return (1);
- }
-
- /* Then check for inclusions */
- matched = NULL;
- for (match = matching->inclusions; match != NULL; match = match->next){
- if (match_inclusion(match, pathname)) {
- /*
- * If this pattern has never been matched,
- * then we're done.
- */
- if (match->matches == 0) {
- match->matches++;
- matching->inclusions_unmatched_count++;
- return (0);
- }
- /*
- * Otherwise, remember the match but keep checking
- * in case we can tick off an unmatched pattern.
- */
- matched = match;
- }
- }
- /*
- * We didn't find a pattern that had never been matched, but
- * we did find a match, so count it and exit.
- */
- if (matched != NULL) {
- matched->matches++;
- return (0);
- }
-
- /* If there were inclusions, default is to exclude. */
- if (matching->inclusions != NULL)
- return (1);
-
- /* No explicit inclusions, default is to match. */
- return (0);
-}
-
-/*
- * This is a little odd, but it matches the default behavior of
- * gtar. In particular, 'a*b' will match 'foo/a1111/222b/bar'
- *
- */
-int
-match_exclusion(struct match *match, const char *pathname)
-{
- return (pathmatch(match->pattern,
- pathname,
- PATHMATCH_NO_ANCHOR_START | PATHMATCH_NO_ANCHOR_END));
-}
-
-/*
- * Again, mimic gtar: inclusions are always anchored (have to match
- * the beginning of the path) even though exclusions are not anchored.
- */
-int
-match_inclusion(struct match *match, const char *pathname)
-{
- return (pathmatch(match->pattern, pathname, 0));
-}
-
-void
-cleanup_exclusions(struct cpio *cpio)
-{
- struct match *p, *q;
-
- if (cpio->matching) {
- p = cpio->matching->inclusions;
- while (p != NULL) {
- q = p;
- p = p->next;
- free(q);
- }
- p = cpio->matching->exclusions;
- while (p != NULL) {
- q = p;
- p = p->next;
- free(q);
- }
- free(cpio->matching);
- }
-}
-
-static void
-initialize_matching(struct cpio *cpio)
-{
- cpio->matching = malloc(sizeof(*cpio->matching));
- if (cpio->matching == NULL)
- cpio_errc(1, errno, "No memory");
- memset(cpio->matching, 0, sizeof(*cpio->matching));
-}
-
-int
-unmatched_inclusions(struct cpio *cpio)
-{
- struct matching *matching;
-
- matching = cpio->matching;
- if (matching == NULL)
- return (0);
- return (matching->inclusions_unmatched_count);
-}
diff --git a/usr.bin/cpio/matching.h b/usr.bin/cpio/matching.h
deleted file mode 100644
index a66bc86..0000000
--- a/usr.bin/cpio/matching.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef MATCHING_H
-#define MATCHING_H
-
-#include "cpio.h"
-
-int exclude(struct cpio *, const char *pattern);
-int include(struct cpio *, const char *pattern);
-int excluded(struct cpio *cpio, const char *pathname);
-void cleanup_exclusions(struct cpio *cpio);
-int unmatched_inclusions(struct cpio *cpio);
-
-#endif
diff --git a/usr.bin/cpio/pathmatch.c b/usr.bin/cpio/pathmatch.c
deleted file mode 100644
index d33bd34..0000000
--- a/usr.bin/cpio/pathmatch.c
+++ /dev/null
@@ -1,250 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "cpio_platform.h"
-__FBSDID("$FreeBSD$");
-
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include "pathmatch.h"
-
-/*
- * Check whether a character 'c' is matched by a list specification [...]:
- * * Leading '!' negates the class.
- * * <char>-<char> is a range of characters
- * * \<char> removes any special meaning for <char>
- *
- * Some interesting boundary cases:
- * a-d-e is one range (a-d) followed by two single characters - and e.
- * \a-\d is same as a-d
- * a\-d is three single characters: a, d, -
- * Trailing - is not special (so [a-] is two characters a and -).
- * Initial - is not special ([a-] is same as [-a] is same as [\\-a])
- * This function never sees a trailing \.
- * [] always fails
- * [!] always succeeds
- */
-static int
-pm_list(const char *start, const char *end, const char c, int flags)
-{
- const char *p = start;
- char rangeStart = '\0', nextRangeStart;
- int match = 1, nomatch = 0;
-
- /* This will be used soon... */
- (void)flags; /* UNUSED */
-
- /* If this is a negated class, return success for nomatch. */
- if (*p == '!' && p < end) {
- match = 0;
- nomatch = 1;
- ++p;
- }
-
- while (p < end) {
- nextRangeStart = '\0';
- switch (*p) {
- case '-':
- /* Trailing or initial '-' is not special. */
- if ((rangeStart == '\0') || (p == end - 1)) {
- if (*p == c)
- return (match);
- } else {
- char rangeEnd = *++p;
- if (rangeEnd == '\\')
- rangeEnd = *++p;
- if ((rangeStart <= c) && (c <= rangeEnd))
- return (match);
- }
- break;
- case '\\':
- ++p;
- /* Fall through */
- default:
- if (*p == c)
- return (match);
- nextRangeStart = *p; /* Possible start of range. */
- }
- rangeStart = nextRangeStart;
- ++p;
- }
- return (nomatch);
-}
-
-/*
- * If s is pointing to "./", ".//", "./././" or the like, skip it.
- */
-static const char *
-pm_slashskip(const char *s) {
- while (*s == '.' || *s == '/') {
- if (s[0] != '/' && s[1] != '/')
- break;
- ++s;
- }
- return (s);
-}
-
-static int
-pm(const char *p, const char *s, int flags)
-{
- const char *end;
-
- /*
- * Ignore leading './', './/', '././', etc.
- */
- if (s[0] == '.' && s[1] == '/')
- s = pm_slashskip(s + 1);
- if (p[0] == '.' && p[1] == '/')
- p = pm_slashskip(p + 1);
-
- for (;;) {
- switch (*p) {
- case '\0':
- if (s[0] == '/') {
- if (flags & PATHMATCH_NO_ANCHOR_END)
- return (1);
- /* "dir" == "dir/" == "dir/." */
- s = pm_slashskip(s);
- if (s[0] == '.' && s[1] == '\0')
- return (1);
- }
- return (*s == '\0');
- break;
- case '?':
- /* ? always succeds, unless we hit end of 's' */
- if (*s == '\0')
- return (0);
- break;
- case '*':
- /* "*" == "**" == "***" ... */
- while (*p == '*')
- ++p;
- /* Trailing '*' always succeeds. */
- if (*p == '\0')
- return (1);
- while (*s) {
- if (pathmatch(p, s, flags))
- return (1);
- ++s;
- }
- return (0);
- break;
- case '[':
- /*
- * Find the end of the [...] character class,
- * ignoring \] that might occur within the class.
- */
- end = p + 1;
- while (*end != '\0' && *end != ']') {
- if (*end == '\\' && end[1] != '\0')
- ++end;
- ++end;
- }
- if (*end == ']') {
- /* We found [...], try to match it. */
- if (!pm_list(p + 1, end, *s, flags))
- return (0);
- p = end; /* Jump to trailing ']' char. */
- break;
- } else
- /* No final ']', so just match '['. */
- if (*p != *s)
- return (0);
- break;
- default:
- if (*p == *s)
- break;
- if ((*s == '\0') && (*p == '/')) {
- p = pm_slashskip(p);
- if (*p == '\0')
- return (1);
- if (p[0] == '.' && p[1] == '\0')
- return (1);
- return (0);
- }
- return (0);
- break;
- case '\\':
- /* Trailing '\\' matches itself. */
- if (p[1] == '\0') {
- if (*s != '\\')
- return (0);
- } else {
- ++p;
- if (*p != *s)
- return (0);
- }
- break;
- }
- /*
- * TODO: pattern of "\/\.\/" should not match plain "/",
- * it should only match explicit "/./".
- */
- if (*p == '/')
- p = pm_slashskip(p);
- else
- ++p;
- if (*s == '/')
- s = pm_slashskip(s);
- else
- ++s;
- }
-}
-
-/* Main entry point. */
-int
-pathmatch(const char *p, const char *s, int flags)
-{
- /* Empty pattern only matches the empty string. */
- if (p == NULL || *p == '\0')
- return (s == NULL || *s == '\0');
-
- /* Leading '^' anchors the start of the pattern. */
- if (*p == '^') {
- ++p;
- flags &= ~PATHMATCH_NO_ANCHOR_START;
- }
-
- /* Certain patterns anchor implicitly. */
- if (*p == '*' || *p == '/')
- return (pm(p, s, flags));
-
- /* If start is unanchored, try to match start of each path element. */
- if (flags & PATHMATCH_NO_ANCHOR_START) {
- for ( ; p != NULL; p = strchr(p, '/')) {
- if (*p == '/')
- p++;
- if (pm(p, s, flags))
- return (1);
- }
- return (0);
- }
-
- /* Default: Match from beginning. */
- return (pm(p, s, flags));
-}
diff --git a/usr.bin/cpio/pathmatch.h b/usr.bin/cpio/pathmatch.h
deleted file mode 100644
index 990fa1f..0000000
--- a/usr.bin/cpio/pathmatch.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef PATHMATCH_H
-#define PATHMATCH_H
-
-#define PATHMATCH_NO_ANCHOR_START 1
-#define PATHMATCH_NO_ANCHOR_END 2
-
-int pathmatch(const char *p, const char *s, int flags);
-
-#endif
diff --git a/usr.bin/cpio/test/Makefile b/usr.bin/cpio/test/Makefile
deleted file mode 100644
index 7da5a60..0000000
--- a/usr.bin/cpio/test/Makefile
+++ /dev/null
@@ -1,70 +0,0 @@
-# $FreeBSD$
-
-# Where to find the cpio sources (for the internal unit tests)
-CPIO_SRCDIR=${.CURDIR}/..
-.PATH: ${CPIO_SRCDIR}
-
-# Some cpio sources are pulled in for white-box tests
-CPIO_SRCS= cmdline.c err.c pathmatch.c
-
-TESTS= \
- test_0.c \
- test_basic.c \
- test_format_newc.c \
- test_gcpio_compat.c \
- test_option_a.c \
- test_option_B.c \
- test_option_c.c \
- test_option_d.c \
- test_option_f.c \
- test_option_help.c \
- test_option_L.c \
- test_option_ell.c \
- test_option_m.c \
- test_option_t.c \
- test_option_u.c \
- test_option_version.c \
- test_option_y.c \
- test_option_z.c \
- test_owner_parse.c \
- test_passthrough_dotdot.c \
- test_passthrough_reverse.c \
- test_pathmatch.c
-
-# Build the test program
-SRCS= list.h \
- ${CPIO_SRCS} \
- ${TESTS} \
- main.c
-
-CLEANFILES+= list.h bsdcpio_test
-
-NO_MAN=yes
-
-PROG=bsdcpio_test
-DPADD=${LIBARCHIVE} ${LIBBZ2} ${LIBZ}
-CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\"
-CFLAGS+= -I..
-LDADD= -larchive -lz -lbz2
-CFLAGS+= -static -g -O2 -Wall
-CFLAGS+= -I${.OBJDIR}
-CFLAGS+= -I${CPIO_SRCDIR}
-
-# Uncomment to link against dmalloc
-#LDADD+= -L/usr/local/lib -ldmalloc
-#CFLAGS+= -I/usr/local/include -DUSE_DMALLOC
-WARNS=6
-
-check test: bsdcpio_test
- ${.OBJDIR}/bsdcpio_test -p ${.OBJDIR}/../bsdcpio -r ${.CURDIR}
-
-${.OBJDIR}/list.h list.h: ${TESTS} Makefile
- (cd ${.CURDIR}; cat ${TESTS}) | grep DEFINE_TEST > list.h
-
-clean:
- rm -f ${CLEANFILES}
- rm -f *~
- -chmod -R +w /tmp/bsdcpio_test.*
- rm -rf /tmp/bsdcpio_test.*
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/cpio/test/main.c b/usr.bin/cpio/test/main.c
deleted file mode 100644
index 8318620..0000000
--- a/usr.bin/cpio/test/main.c
+++ /dev/null
@@ -1,1015 +0,0 @@
-/*
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Various utility routines useful for test programs.
- * Each test program is linked against this file.
- */
-#include "test.h"
-
-#include <errno.h>
-#include <locale.h>
-#include <stdarg.h>
-#include <time.h>
-
-/*
- * This same file is used pretty much verbatim for all test harnesses.
- *
- * The next few lines are the only differences.
- */
-#define PROGRAM "bsdcpio" /* Name of program being tested. */
-#define ENVBASE "BSDCPIO" /* Prefix for environment variables. */
-#undef EXTRA_DUMP /* How to dump extra data */
-/* How to generate extra version info. */
-#define EXTRA_VERSION (systemf("%s --version", testprog) ? "" : "")
-__FBSDID("$FreeBSD$");
-
-/*
- * "list.h" is simply created by "grep DEFINE_TEST"; it has
- * a line like
- * DEFINE_TEST(test_function)
- * for each test.
- * Include it here with a suitable DEFINE_TEST to declare all of the
- * test functions.
- */
-#undef DEFINE_TEST
-#define DEFINE_TEST(name) void name(void);
-#include "list.h"
-
-/* Interix doesn't define these in a standard header. */
-#if __INTERIX__
-extern char *optarg;
-extern int optind;
-#endif
-
-/* Enable core dump on failure. */
-static int dump_on_failure = 0;
-/* Default is to remove temp dirs for successful tests. */
-static int keep_temp_files = 0;
-/* Default is to print some basic information about each test. */
-static int quiet_flag = 0;
-/* Default is to summarize repeated failures. */
-static int verbose = 0;
-/* Cumulative count of component failures. */
-static int failures = 0;
-/* Cumulative count of skipped component tests. */
-static int skips = 0;
-/* Cumulative count of assertions. */
-static int assertions = 0;
-
-/* Directory where uuencoded reference files can be found. */
-static char *refdir;
-
-/*
- * My own implementation of the standard assert() macro emits the
- * message in the same format as GCC (file:line: message).
- * It also includes some additional useful information.
- * This makes it a lot easier to skim through test failures in
- * Emacs. ;-)
- *
- * It also supports a few special features specifically to simplify
- * test harnesses:
- * failure(fmt, args) -- Stores a text string that gets
- * printed if the following assertion fails, good for
- * explaining subtle tests.
- */
-static char msg[4096];
-
-/*
- * For each test source file, we remember how many times each
- * failure was reported.
- */
-static const char *failed_filename = NULL;
-static struct line {
- int line;
- int count;
-} failed_lines[1000];
-
-/*
- * Count this failure; return the number of previous failures.
- */
-static int
-previous_failures(const char *filename, int line)
-{
- unsigned int i;
- int count;
-
- if (failed_filename == NULL || strcmp(failed_filename, filename) != 0)
- memset(failed_lines, 0, sizeof(failed_lines));
- failed_filename = filename;
-
- for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) {
- if (failed_lines[i].line == line) {
- count = failed_lines[i].count;
- failed_lines[i].count++;
- return (count);
- }
- if (failed_lines[i].line == 0) {
- failed_lines[i].line = line;
- failed_lines[i].count = 1;
- return (0);
- }
- }
- return (0);
-}
-
-/*
- * Copy arguments into file-local variables.
- */
-static const char *test_filename;
-static int test_line;
-static void *test_extra;
-void test_setup(const char *filename, int line)
-{
- test_filename = filename;
- test_line = line;
-}
-
-/*
- * Inform user that we're skipping a test.
- */
-void
-test_skipping(const char *fmt, ...)
-{
- va_list ap;
-
- if (previous_failures(test_filename, test_line))
- return;
-
- va_start(ap, fmt);
- fprintf(stderr, " *** SKIPPING: ");
- vfprintf(stderr, fmt, ap);
- fprintf(stderr, "\n");
- va_end(ap);
- ++skips;
-}
-
-/* Common handling of failed tests. */
-static void
-report_failure(void *extra)
-{
- if (msg[0] != '\0') {
- fprintf(stderr, " Description: %s\n", msg);
- msg[0] = '\0';
- }
-
-#ifdef EXTRA_DUMP
- if (extra != NULL)
- fprintf(stderr, " detail: %s\n", EXTRA_DUMP(extra));
-#else
- (void)extra; /* UNUSED */
-#endif
-
- if (dump_on_failure) {
- fprintf(stderr,
- " *** forcing core dump so failure can be debugged ***\n");
- *(char *)(NULL) = 0;
- exit(1);
- }
-}
-
-/*
- * Summarize repeated failures in the just-completed test file.
- * The reports above suppress multiple failures from the same source
- * line; this reports on any tests that did fail multiple times.
- */
-static int
-summarize_comparator(const void *a0, const void *b0)
-{
- const struct line *a = a0, *b = b0;
- if (a->line == 0 && b->line == 0)
- return (0);
- if (a->line == 0)
- return (1);
- if (b->line == 0)
- return (-1);
- return (a->line - b->line);
-}
-
-static void
-summarize(void)
-{
- unsigned int i;
-
- qsort(failed_lines, sizeof(failed_lines)/sizeof(failed_lines[0]),
- sizeof(failed_lines[0]), summarize_comparator);
- for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) {
- if (failed_lines[i].line == 0)
- break;
- if (failed_lines[i].count > 1)
- fprintf(stderr, "%s:%d: Failed %d times\n",
- failed_filename, failed_lines[i].line,
- failed_lines[i].count);
- }
- /* Clear the failure history for the next file. */
- memset(failed_lines, 0, sizeof(failed_lines));
-}
-
-/* Set up a message to display only after a test fails. */
-void
-failure(const char *fmt, ...)
-{
- va_list ap;
- va_start(ap, fmt);
- vsprintf(msg, fmt, ap);
- va_end(ap);
-}
-
-/* Generic assert() just displays the failed condition. */
-int
-test_assert(const char *file, int line, int value, const char *condition, void *extra)
-{
- ++assertions;
- if (value) {
- msg[0] = '\0';
- return (value);
- }
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (value);
- fprintf(stderr, "%s:%d: Assertion failed\n", file, line);
- fprintf(stderr, " Condition: %s\n", condition);
- report_failure(extra);
- return (value);
-}
-
-/* assertEqualInt() displays the values of the two integers. */
-int
-test_assert_equal_int(const char *file, int line,
- int v1, const char *e1, int v2, const char *e2, void *extra)
-{
- ++assertions;
- if (v1 == v2) {
- msg[0] = '\0';
- return (1);
- }
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (0);
- fprintf(stderr, "%s:%d: Assertion failed: Ints not equal\n",
- file, line);
- fprintf(stderr, " %s=%d\n", e1, v1);
- fprintf(stderr, " %s=%d\n", e2, v2);
- report_failure(extra);
- return (0);
-}
-
-static void strdump(const char *p)
-{
- if (p == NULL) {
- fprintf(stderr, "(null)");
- return;
- }
- fprintf(stderr, "\"");
- while (*p != '\0') {
- unsigned int c = 0xff & *p++;
- switch (c) {
- case '\a': fprintf(stderr, "\a"); break;
- case '\b': fprintf(stderr, "\b"); break;
- case '\n': fprintf(stderr, "\n"); break;
- case '\r': fprintf(stderr, "\r"); break;
- default:
- if (c >= 32 && c < 127)
- fprintf(stderr, "%c", c);
- else
- fprintf(stderr, "\\x%02X", c);
- }
- }
- fprintf(stderr, "\"");
-}
-
-/* assertEqualString() displays the values of the two strings. */
-int
-test_assert_equal_string(const char *file, int line,
- const char *v1, const char *e1,
- const char *v2, const char *e2,
- void *extra)
-{
- ++assertions;
- if (v1 == NULL || v2 == NULL) {
- if (v1 == v2) {
- msg[0] = '\0';
- return (1);
- }
- } else if (strcmp(v1, v2) == 0) {
- msg[0] = '\0';
- return (1);
- }
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (0);
- fprintf(stderr, "%s:%d: Assertion failed: Strings not equal\n",
- file, line);
- fprintf(stderr, " %s = ", e1);
- strdump(v1);
- fprintf(stderr, " (length %d)\n", v1 == NULL ? 0 : strlen(v1));
- fprintf(stderr, " %s = ", e2);
- strdump(v2);
- fprintf(stderr, " (length %d)\n", v2 == NULL ? 0 : strlen(v2));
- report_failure(extra);
- return (0);
-}
-
-static void wcsdump(const wchar_t *w)
-{
- if (w == NULL) {
- fprintf(stderr, "(null)");
- return;
- }
- fprintf(stderr, "\"");
- while (*w != L'\0') {
- unsigned int c = *w++;
- if (c >= 32 && c < 127)
- fprintf(stderr, "%c", c);
- else if (c < 256)
- fprintf(stderr, "\\x%02X", c);
- else if (c < 0x10000)
- fprintf(stderr, "\\u%04X", c);
- else
- fprintf(stderr, "\\U%08X", c);
- }
- fprintf(stderr, "\"");
-}
-
-/* assertEqualWString() displays the values of the two strings. */
-int
-test_assert_equal_wstring(const char *file, int line,
- const wchar_t *v1, const char *e1,
- const wchar_t *v2, const char *e2,
- void *extra)
-{
- ++assertions;
- if (v1 == NULL) {
- if (v2 == NULL) {
- msg[0] = '\0';
- return (1);
- }
- } else if (v2 == NULL) {
- if (v1 == NULL) {
- msg[0] = '\0';
- return (1);
- }
- } else if (wcscmp(v1, v2) == 0) {
- msg[0] = '\0';
- return (1);
- }
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (0);
- fprintf(stderr, "%s:%d: Assertion failed: Unicode strings not equal\n",
- file, line);
- fprintf(stderr, " %s = ", e1);
- wcsdump(v1);
- fprintf(stderr, "\n");
- fprintf(stderr, " %s = ", e2);
- wcsdump(v2);
- fprintf(stderr, "\n");
- report_failure(extra);
- return (0);
-}
-
-/*
- * Pretty standard hexdump routine. As a bonus, if ref != NULL, then
- * any bytes in p that differ from ref will be highlighted with '_'
- * before and after the hex value.
- */
-static void
-hexdump(const char *p, const char *ref, size_t l, size_t offset)
-{
- size_t i, j;
- char sep;
-
- for(i=0; i < l; i+=16) {
- fprintf(stderr, "%04x", i + offset);
- sep = ' ';
- for (j = 0; j < 16 && i + j < l; j++) {
- if (ref != NULL && p[i + j] != ref[i + j])
- sep = '_';
- fprintf(stderr, "%c%02x", sep, 0xff & (int)p[i+j]);
- if (ref != NULL && p[i + j] == ref[i + j])
- sep = ' ';
- }
- for (; j < 16; j++) {
- fprintf(stderr, "%c ", sep);
- sep = ' ';
- }
- fprintf(stderr, "%c", sep);
- for (j=0; j < 16 && i + j < l; j++) {
- int c = p[i + j];
- if (c >= ' ' && c <= 126)
- fprintf(stderr, "%c", c);
- else
- fprintf(stderr, ".");
- }
- fprintf(stderr, "\n");
- }
-}
-
-/* assertEqualMem() displays the values of the two memory blocks. */
-/* TODO: For long blocks, hexdump the first bytes that actually differ. */
-int
-test_assert_equal_mem(const char *file, int line,
- const char *v1, const char *e1,
- const char *v2, const char *e2,
- size_t l, const char *ld, void *extra)
-{
- ++assertions;
- if (v1 == NULL || v2 == NULL) {
- if (v1 == v2) {
- msg[0] = '\0';
- return (1);
- }
- } else if (memcmp(v1, v2, l) == 0) {
- msg[0] = '\0';
- return (1);
- }
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (0);
- fprintf(stderr, "%s:%d: Assertion failed: memory not equal\n",
- file, line);
- fprintf(stderr, " size %s = %d\n", ld, (int)l);
- fprintf(stderr, " Dump of %s\n", e1);
- hexdump(v1, v2, l < 32 ? l : 32, 0);
- fprintf(stderr, " Dump of %s\n", e2);
- hexdump(v2, v1, l < 32 ? l : 32, 0);
- fprintf(stderr, "\n");
- report_failure(extra);
- return (0);
-}
-
-int
-test_assert_empty_file(const char *f1fmt, ...)
-{
- char buff[1024];
- char f1[1024];
- struct stat st;
- va_list ap;
- ssize_t s;
- int fd;
-
-
- va_start(ap, f1fmt);
- vsprintf(f1, f1fmt, ap);
- va_end(ap);
-
- if (stat(f1, &st) != 0) {
- fprintf(stderr, "%s:%d: Could not stat: %s\n", test_filename, test_line, f1);
- report_failure(NULL);
- return (0);
- }
- if (st.st_size == 0)
- return (1);
-
- failures ++;
- if (!verbose && previous_failures(test_filename, test_line))
- return (0);
-
- fprintf(stderr, "%s:%d: File not empty: %s\n", test_filename, test_line, f1);
- fprintf(stderr, " File size: %d\n", (int)st.st_size);
- fprintf(stderr, " Contents:\n");
- fd = open(f1, O_RDONLY);
- if (fd < 0) {
- fprintf(stderr, " Unable to open %s\n", f1);
- } else {
- s = sizeof(buff) < st.st_size ? sizeof(buff) : st.st_size;
- s = read(fd, buff, s);
- hexdump(buff, NULL, s, 0);
- }
- report_failure(NULL);
- return (0);
-}
-
-/* assertEqualFile() asserts that two files have the same contents. */
-/* TODO: hexdump the first bytes that actually differ. */
-int
-test_assert_equal_file(const char *f1, const char *f2pattern, ...)
-{
- char f2[1024];
- va_list ap;
- char buff1[1024];
- char buff2[1024];
- int fd1, fd2;
- int n1, n2;
-
- va_start(ap, f2pattern);
- vsprintf(f2, f2pattern, ap);
- va_end(ap);
-
- fd1 = open(f1, O_RDONLY);
- fd2 = open(f2, O_RDONLY);
- for (;;) {
- n1 = read(fd1, buff1, sizeof(buff1));
- n2 = read(fd2, buff2, sizeof(buff2));
- if (n1 != n2)
- break;
- if (n1 == 0 && n2 == 0)
- return (1);
- if (memcmp(buff1, buff2, n1) != 0)
- break;
- }
- failures ++;
- if (!verbose && previous_failures(test_filename, test_line))
- return (0);
- fprintf(stderr, "%s:%d: Files are not identical\n",
- test_filename, test_line);
- fprintf(stderr, " file1=\"%s\"\n", f1);
- fprintf(stderr, " file2=\"%s\"\n", f2);
- report_failure(test_extra);
- return (0);
-}
-
-int
-test_assert_file_exists(const char *fpattern, ...)
-{
- char f[1024];
- va_list ap;
-
- va_start(ap, fpattern);
- vsprintf(f, fpattern, ap);
- va_end(ap);
-
- if (!access(f, F_OK))
- return (1);
- if (!previous_failures(test_filename, test_line)) {
- fprintf(stderr, "%s:%d: File doesn't exist\n",
- test_filename, test_line);
- fprintf(stderr, " file=\"%s\"\n", f);
- report_failure(test_extra);
- }
- return (0);
-}
-
-int
-test_assert_file_not_exists(const char *fpattern, ...)
-{
- char f[1024];
- va_list ap;
-
- va_start(ap, fpattern);
- vsprintf(f, fpattern, ap);
- va_end(ap);
-
- if (access(f, F_OK))
- return (1);
- if (!previous_failures(test_filename, test_line)) {
- fprintf(stderr, "%s:%d: File exists and shouldn't\n",
- test_filename, test_line);
- fprintf(stderr, " file=\"%s\"\n", f);
- report_failure(test_extra);
- }
- return (0);
-}
-
-/* assertFileContents() asserts the contents of a file. */
-int
-test_assert_file_contents(const void *buff, int s, const char *fpattern, ...)
-{
- char f[1024];
- va_list ap;
- char *contents;
- int fd;
- int n;
-
- va_start(ap, fpattern);
- vsprintf(f, fpattern, ap);
- va_end(ap);
-
- fd = open(f, O_RDONLY);
- contents = malloc(s * 2 + 128);
- n = read(fd, contents, s * 2 + 128);
- if (n == s && memcmp(buff, contents, s) == 0) {
- free(contents);
- return (1);
- }
- failures ++;
- if (!previous_failures(test_filename, test_line)) {
- fprintf(stderr, "%s:%d: File contents don't match\n",
- test_filename, test_line);
- fprintf(stderr, " file=\"%s\"\n", f);
- if (n > 0)
- hexdump(contents, buff, n, 0);
- else {
- fprintf(stderr, " File empty, contents should be:\n");
- hexdump(buff, NULL, s, 0);
- }
- report_failure(test_extra);
- }
- free(contents);
- return (0);
-}
-
-/*
- * Call standard system() call, but build up the command line using
- * sprintf() conventions.
- */
-int
-systemf(const char *fmt, ...)
-{
- char buff[8192];
- va_list ap;
- int r;
-
- va_start(ap, fmt);
- vsprintf(buff, fmt, ap);
- r = system(buff);
- va_end(ap);
- return (r);
-}
-
-/*
- * Slurp a file into memory for ease of comparison and testing.
- * Returns size of file in 'sizep' if non-NULL, null-terminates
- * data in memory for ease of use.
- */
-char *
-slurpfile(size_t * sizep, const char *fmt, ...)
-{
- char filename[8192];
- struct stat st;
- va_list ap;
- char *p;
- ssize_t bytes_read;
- int fd;
- int r;
-
- va_start(ap, fmt);
- vsprintf(filename, fmt, ap);
- va_end(ap);
-
- fd = open(filename, O_RDONLY);
- if (fd < 0) {
- /* Note: No error; non-existent file is okay here. */
- return (NULL);
- }
- r = fstat(fd, &st);
- if (r != 0) {
- fprintf(stderr, "Can't stat file %s\n", filename);
- close(fd);
- return (NULL);
- }
- p = malloc(st.st_size + 1);
- if (p == NULL) {
- fprintf(stderr, "Can't allocate %ld bytes of memory to read file %s\n", (long int)st.st_size, filename);
- close(fd);
- return (NULL);
- }
- bytes_read = read(fd, p, st.st_size);
- if (bytes_read < st.st_size) {
- fprintf(stderr, "Can't read file %s\n", filename);
- close(fd);
- free(p);
- return (NULL);
- }
- p[st.st_size] = '\0';
- if (sizep != NULL)
- *sizep = (size_t)st.st_size;
- close(fd);
- return (p);
-}
-
-/*
- * "list.h" is automatically generated; it just has a lot of lines like:
- * DEFINE_TEST(function_name)
- * It's used above to declare all of the test functions.
- * We reuse it here to define a list of all tests (functions and names).
- */
-#undef DEFINE_TEST
-#define DEFINE_TEST(n) { n, #n },
-struct { void (*func)(void); const char *name; } tests[] = {
- #include "list.h"
-};
-
-/*
- * Each test is run in a private work dir. Those work dirs
- * do have consistent and predictable names, in case a group
- * of tests need to collaborate. However, there is no provision
- * for requiring that tests run in a certain order.
- */
-static int test_run(int i, const char *tmpdir)
-{
- int failures_before = failures;
-
- if (!quiet_flag) {
- printf("%d: %s\n", i, tests[i].name);
- fflush(stdout);
- }
-
- /*
- * Always explicitly chdir() in case the last test moved us to
- * a strange place.
- */
- if (chdir(tmpdir)) {
- fprintf(stderr,
- "ERROR: Couldn't chdir to temp dir %s\n",
- tmpdir);
- exit(1);
- }
- /* Create a temp directory for this specific test. */
- if (mkdir(tests[i].name, 0755)) {
- fprintf(stderr,
- "ERROR: Couldn't create temp dir ``%s''\n",
- tests[i].name);
- exit(1);
- }
- /* Chdir() to that work directory. */
- if (chdir(tests[i].name)) {
- fprintf(stderr,
- "ERROR: Couldn't chdir to temp dir ``%s''\n",
- tests[i].name);
- exit(1);
- }
- /* Explicitly reset the locale before each test. */
- setlocale(LC_ALL, "C");
- /* Run the actual test. */
- (*tests[i].func)();
- /* Summarize the results of this test. */
- summarize();
- /* If there were no failures, we can remove the work dir. */
- if (failures == failures_before) {
- if (!keep_temp_files && chdir(tmpdir) == 0) {
- systemf("rm -rf %s", tests[i].name);
- }
- }
- /* Return appropriate status. */
- return (failures == failures_before ? 0 : 1);
-}
-
-static void usage(const char *program)
-{
- static const int limit = sizeof(tests) / sizeof(tests[0]);
- int i;
-
- printf("Usage: %s [options] <test> <test> ...\n", program);
- printf("Default is to run all tests.\n");
- printf("Otherwise, specify the numbers of the tests you wish to run.\n");
- printf("Options:\n");
- printf(" -d Dump core after any failure, for debugging.\n");
- printf(" -k Keep all temp files.\n");
- printf(" Default: temp files for successful tests deleted.\n");
-#ifdef PROGRAM
- printf(" -p <path> Path to executable to be tested.\n");
- printf(" Default: path taken from " ENVBASE " environment variable.\n");
-#endif
- printf(" -q Quiet.\n");
- printf(" -r <dir> Path to dir containing reference files.\n");
- printf(" Default: Current directory.\n");
- printf(" -v Verbose.\n");
- printf("Available tests:\n");
- for (i = 0; i < limit; i++)
- printf(" %d: %s\n", i, tests[i].name);
- exit(1);
-}
-
-#define UUDECODE(c) (((c) - 0x20) & 0x3f)
-
-void
-extract_reference_file(const char *name)
-{
- char buff[1024];
- FILE *in, *out;
-
- sprintf(buff, "%s/%s.uu", refdir, name);
- in = fopen(buff, "r");
- failure("Couldn't open reference file %s", buff);
- assert(in != NULL);
- if (in == NULL)
- return;
- /* Read up to and including the 'begin' line. */
- for (;;) {
- if (fgets(buff, sizeof(buff), in) == NULL) {
- /* TODO: This is a failure. */
- return;
- }
- if (memcmp(buff, "begin ", 6) == 0)
- break;
- }
- /* Now, decode the rest and write it. */
- /* Not a lot of error checking here; the input better be right. */
- out = fopen(name, "w");
- while (fgets(buff, sizeof(buff), in) != NULL) {
- char *p = buff;
- int bytes;
-
- if (memcmp(buff, "end", 3) == 0)
- break;
-
- bytes = UUDECODE(*p++);
- while (bytes > 0) {
- int n = 0;
- /* Write out 1-3 bytes from that. */
- if (bytes > 0) {
- n = UUDECODE(*p++) << 18;
- n |= UUDECODE(*p++) << 12;
- fputc(n >> 16, out);
- --bytes;
- }
- if (bytes > 0) {
- n |= UUDECODE(*p++) << 6;
- fputc((n >> 8) & 0xFF, out);
- --bytes;
- }
- if (bytes > 0) {
- n |= UUDECODE(*p++);
- fputc(n & 0xFF, out);
- --bytes;
- }
- }
- }
- fclose(out);
- fclose(in);
-}
-
-
-int main(int argc, char **argv)
-{
- static const int limit = sizeof(tests) / sizeof(tests[0]);
- int i, tests_run = 0, tests_failed = 0, opt;
- time_t now;
- char *refdir_alloc = NULL;
- char *progname, *p;
- char tmpdir[256];
- char tmpdir_timestamp[256];
-
- /*
- * Name of this program, used to build root of our temp directory
- * tree.
- */
- progname = p = argv[0];
- while (*p != '\0') {
- if (*p == '/')
- progname = p + 1;
- ++p;
- }
-
-#ifdef PROGRAM
- /* Get the target program from environment, if available. */
- testprog = getenv(ENVBASE);
-#endif
-
- /* Allow -d to be controlled through the environment. */
- if (getenv(ENVBASE "_DEBUG") != NULL)
- dump_on_failure = 1;
-
- /* Get the directory holding test files from environment. */
- refdir = getenv(ENVBASE "_TEST_FILES");
-
- /*
- * Parse options.
- */
- while ((opt = getopt(argc, argv, "dkp:qr:v")) != -1) {
- switch (opt) {
- case 'd':
- dump_on_failure = 1;
- break;
- case 'k':
- keep_temp_files = 1;
- break;
- case 'p':
-#ifdef PROGRAM
- testprog = optarg;
-#else
- usage(progname);
-#endif
- break;
- case 'q':
- quiet_flag++;
- break;
- case 'r':
- refdir = optarg;
- break;
- case 'v':
- verbose = 1;
- break;
- case '?':
- default:
- usage(progname);
- }
- }
- argc -= optind;
- argv += optind;
-
- /*
- * Sanity-check that our options make sense.
- */
-#ifdef PROGRAM
- if (testprog == NULL)
- usage(progname);
-#endif
-
- /*
- * Create a temp directory for the following tests.
- * Include the time the tests started as part of the name,
- * to make it easier to track the results of multiple tests.
- */
- now = time(NULL);
- for (i = 0; i < 1000; i++) {
- strftime(tmpdir_timestamp, sizeof(tmpdir_timestamp),
- "%Y-%m-%dT%H.%M.%S",
- localtime(&now));
- sprintf(tmpdir, "/tmp/%s.%s-%03d", progname, tmpdir_timestamp, i);
- if (mkdir(tmpdir,0755) == 0)
- break;
- if (errno == EEXIST)
- continue;
- fprintf(stderr, "ERROR: Unable to create temp directory %s\n",
- tmpdir);
- exit(1);
- }
-
- /*
- * If the user didn't specify a directory for locating
- * reference files, use the current directory for that.
- */
- if (refdir == NULL) {
- systemf("/bin/pwd > %s/refdir", tmpdir);
- refdir = refdir_alloc = slurpfile(NULL, "%s/refdir", tmpdir);
- p = refdir + strlen(refdir);
- while (p[-1] == '\n') {
- --p;
- *p = '\0';
- }
- systemf("rm %s/refdir", tmpdir);
- }
-
- /*
- * Banner with basic information.
- */
- if (!quiet_flag) {
- printf("Running tests in: %s\n", tmpdir);
- printf("Reference files will be read from: %s\n", refdir);
-#ifdef PROGRAM
- printf("Running tests on: %s\n", testprog);
-#endif
- printf("Exercising: ");
- fflush(stdout);
- printf("%s\n", EXTRA_VERSION);
- }
-
- /*
- * Run some or all of the individual tests.
- */
- if (argc == 0) {
- /* Default: Run all tests. */
- for (i = 0; i < limit; i++) {
- if (test_run(i, tmpdir))
- tests_failed++;
- tests_run++;
- }
- } else {
- while (*(argv) != NULL) {
- i = atoi(*argv);
- if (**argv < '0' || **argv > '9' || i < 0 || i >= limit) {
- printf("*** INVALID Test %s\n", *argv);
- usage(progname);
- } else {
- if (test_run(i, tmpdir))
- tests_failed++;
- tests_run++;
- }
- argv++;
- }
- }
-
- /*
- * Report summary statistics.
- */
- if (!quiet_flag) {
- printf("\n");
- printf("%d of %d tests reported failures\n",
- tests_failed, tests_run);
- printf(" Total of %d assertions checked.\n", assertions);
- printf(" Total of %d assertions failed.\n", failures);
- printf(" Total of %d assertions skipped.\n", skips);
- }
-
- free(refdir_alloc);
-
- /* If the final tmpdir is empty, we can remove it. */
- /* This should be the usual case when all tests succeed. */
- rmdir(tmpdir);
-
- return (tests_failed);
-}
diff --git a/usr.bin/cpio/test/test.h b/usr.bin/cpio/test/test.h
deleted file mode 100644
index 39a9837..0000000
--- a/usr.bin/cpio/test/test.h
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (c) 2003-2006 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/* Every test program should #include "test.h" as the first thing. */
-
-/*
- * The goal of this file (and the matching test.c) is to
- * simplify the very repetitive test-*.c test programs.
- */
-#if defined(HAVE_CONFIG_H)
-/* Most POSIX platforms use the 'configure' script to build config.h */
-#include "../../config.h"
-#elif defined(__FreeBSD__)
-/* Building as part of FreeBSD system requires a pre-built config.h. */
-#include "../config_freebsd.h"
-#elif defined(_WIN32)
-/* Win32 can't run the 'configure' script. */
-#include "../config_windows.h"
-#else
-/* Warn if the library hasn't been (automatically or manually) configured. */
-#error Oops: No config.h and no pre-built configuration in test.h.
-#endif
-
-#include <dirent.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-#ifndef _WIN32
-#include <unistd.h>
-#endif
-#include <wchar.h>
-
-#ifdef USE_DMALLOC
-#include <dmalloc.h>
-#endif
-
-/* No non-FreeBSD platform will have __FBSDID, so just define it here. */
-#ifdef __FreeBSD__
-#include <sys/cdefs.h> /* For __FBSDID */
-#else
-#define __FBSDID(a) /* null */
-#endif
-
-/*
- * Redefine DEFINE_TEST for use in defining the test functions.
- */
-#undef DEFINE_TEST
-#define DEFINE_TEST(name) void name(void); void name(void)
-
-/* An implementation of the standard assert() macro */
-#define assert(e) test_assert(__FILE__, __LINE__, (e), #e, NULL)
-
-/* Assert two integers are the same. Reports value of each one if not. */
-#define assertEqualInt(v1,v2) \
- test_assert_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
-
-/* Assert two strings are the same. Reports value of each one if not. */
-#define assertEqualString(v1,v2) \
- test_assert_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
-/* As above, but v1 and v2 are wchar_t * */
-#define assertEqualWString(v1,v2) \
- test_assert_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
-/* As above, but raw blocks of bytes. */
-#define assertEqualMem(v1, v2, l) \
- test_assert_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL)
-/* Assert two files are the same; allow printf-style expansion of second name.
- * See below for comments about variable arguments here...
- */
-#define assertEqualFile \
- test_setup(__FILE__, __LINE__);test_assert_equal_file
-/* Assert that a file is empty; supports printf-style arguments. */
-#define assertEmptyFile \
- test_setup(__FILE__, __LINE__);test_assert_empty_file
-/* Assert that a file exists; supports printf-style arguments. */
-#define assertFileExists \
- test_setup(__FILE__, __LINE__);test_assert_file_exists
-/* Assert that a file exists; supports printf-style arguments. */
-#define assertFileNotExists \
- test_setup(__FILE__, __LINE__);test_assert_file_not_exists
-/* Assert that file contents match a string; supports printf-style arguments. */
-#define assertFileContents \
- test_setup(__FILE__, __LINE__);test_assert_file_contents
-
-/*
- * This would be simple with C99 variadic macros, but I don't want to
- * require that. Instead, I insert a function call before each
- * skipping() call to pass the file and line information down. Crude,
- * but effective.
- */
-#define skipping \
- test_setup(__FILE__, __LINE__);test_skipping
-
-/* Function declarations. These are defined in test_utility.c. */
-void failure(const char *fmt, ...);
-void test_setup(const char *, int);
-void test_skipping(const char *fmt, ...);
-int test_assert(const char *, int, int, const char *, void *);
-int test_assert_empty_file(const char *, ...);
-int test_assert_equal_file(const char *, const char *, ...);
-int test_assert_equal_int(const char *, int, int, const char *, int, const char *, void *);
-int test_assert_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *);
-int test_assert_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *);
-int test_assert_equal_mem(const char *, int, const char *, const char *, const char *, const char *, size_t, const char *, void *);
-int test_assert_file_contents(const void *, int, const char *, ...);
-int test_assert_file_exists(const char *, ...);
-int test_assert_file_not_exists(const char *, ...);
-
-/* Like sprintf, then system() */
-int systemf(const char * fmt, ...);
-
-/* Suck file into string allocated via malloc(). Call free() when done. */
-/* Supports printf-style args: slurpfile(NULL, "%s/myfile", refdir); */
-char *slurpfile(size_t *, const char *fmt, ...);
-
-/* Extracts named reference file to the current directory. */
-void extract_reference_file(const char *);
-
-/*
- * Special interfaces for program test harness.
- */
-
-/* Pathname of exe to be tested. */
-char *testprog;
diff --git a/usr.bin/cpio/test/test_0.c b/usr.bin/cpio/test/test_0.c
deleted file mode 100644
index 7a72af1..0000000
--- a/usr.bin/cpio/test/test_0.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/*
- * This first test does basic sanity checks on the environment. For
- * most of these, we just exit on failure.
- */
-
-DEFINE_TEST(test_0)
-{
- struct stat st;
-
- failure("File %s does not exist?!", testprog);
- if (!assertEqualInt(0, stat(testprog, &st)))
- exit(1);
-
- failure("%s is not executable?!", testprog);
- if (!assert((st.st_mode & 0111) != 0))
- exit(1);
-
- /*
- * Try to succesfully run the program; this requires that
- * we know some option that will succeed.
- */
- if (0 == systemf("%s --version >/dev/null", testprog)) {
- /* This worked. */
- } else if (0 == systemf("%s -W version >/dev/null", testprog)) {
- /* This worked. */
- } else {
- failure("Unable to successfully run any of the following:\n"
- " * %s --version\n"
- " * %s -W version\n",
- testprog, testprog);
- assert(0);
- }
-
- /* TODO: Ensure that our reference files are available. */
-}
diff --git a/usr.bin/cpio/test/test_basic.c b/usr.bin/cpio/test/test_basic.c
deleted file mode 100644
index 4a4a015..0000000
--- a/usr.bin/cpio/test/test_basic.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-static void
-verify_files(const char *target)
-{
- struct stat st, st2;
- char buff[128];
- int r;
-
- /*
- * Verify unpacked files.
- */
-
- /* Regular file with 2 links. */
- r = lstat("file", &st);
- failure("Failed to stat file %s/file, errno=%d", target, errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- assert(S_ISREG(st.st_mode));
- assertEqualInt(0644, st.st_mode & 0777);
- assertEqualInt(10, st.st_size);
- failure("file %s/file should have 2 links", target);
- assertEqualInt(2, st.st_nlink);
- }
-
- /* Another name for the same file. */
- r = lstat("linkfile", &st2);
- failure("Failed to stat file %s/linkfile, errno=%d", target, errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- assert(S_ISREG(st2.st_mode));
- assertEqualInt(0644, st2.st_mode & 0777);
- assertEqualInt(10, st2.st_size);
- failure("file %s/linkfile should have 2 links", target);
- assertEqualInt(2, st2.st_nlink);
- /* Verify that the two are really hardlinked. */
- assertEqualInt(st.st_dev, st2.st_dev);
- failure("%s/linkfile and %s/file should be hardlinked",
- target, target);
- assertEqualInt(st.st_ino, st2.st_ino);
- }
-
- /* Symlink */
- r = lstat("symlink", &st);
- failure("Failed to stat file %s/symlink, errno=%d", target, errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- failure("symlink should be a symlink; actual mode is %o",
- st.st_mode);
- assert(S_ISLNK(st.st_mode));
- if (S_ISLNK(st.st_mode)) {
- r = readlink("symlink", buff, sizeof(buff));
- assertEqualInt(r, 4);
- buff[r] = '\0';
- assertEqualString(buff, "file");
- }
- }
-
- /* Another file with 1 link and different permissions. */
- r = lstat("file2", &st);
- failure("Failed to stat file %s/file2, errno=%d", target, errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- assert(S_ISREG(st.st_mode));
- failure("%s/file2: st.st_mode = %o", target, st.st_mode);
- assertEqualInt(0777, st.st_mode & 0777);
- assertEqualInt(10, st.st_size);
- failure("file %s/file2 should have 1 link", target);
- assertEqualInt(1, st.st_nlink);
- }
-
- /* dir */
- r = lstat("dir", &st);
- if (r == 0) {
- assertEqualInt(r, 0);
- assert(S_ISDIR(st.st_mode));
- failure("%s/dir: st.st_mode = %o", target, st.st_mode);
- assertEqualInt(0775, st.st_mode & 0777);
- }
-}
-
-static void
-basic_cpio(const char *target,
- const char *pack_options,
- const char *unpack_options,
- const char *se)
-{
- int r;
-
- if (!assertEqualInt(0, mkdir(target, 0775)))
- return;
-
- /* Use the cpio program to create an archive. */
- r = systemf("%s -o %s < filelist >%s/archive 2>%s/pack.err",
- testprog, pack_options, target, target);
- failure("Error invoking %s -o %s", testprog, pack_options);
- assertEqualInt(r, 0);
-
- chdir(target);
-
- /* Verify stderr. */
- failure("Expected: %s, options=%s", se, pack_options);
- assertFileContents(se, strlen(se), "pack.err");
-
- /*
- * Use cpio to unpack the archive into another directory.
- */
- r = systemf("%s -i %s< archive >unpack.out 2>unpack.err",
- testprog, unpack_options);
- failure("Error invoking %s -i %s", testprog, unpack_options);
- assertEqualInt(r, 0);
-
- /* Verify stderr. */
- failure("Error invoking %s -i %s in dir %s", testprog, unpack_options, target);
- assertFileContents(se, strlen(se), "unpack.err");
-
- verify_files(target);
-
- chdir("..");
-}
-
-static void
-passthrough(const char *target)
-{
- int r;
-
- if (!assertEqualInt(0, mkdir(target, 0775)))
- return;
-
- /*
- * Use cpio passthrough mode to copy files to another directory.
- */
- r = systemf("%s -p %s <filelist >%s/stdout 2>%s/stderr",
- testprog, target, target, target);
- failure("Error invoking %s -p", testprog);
- assertEqualInt(r, 0);
-
- chdir(target);
-
- /* Verify stderr. */
- failure("Error invoking %s -p in dir %s",
- testprog, target);
- assertFileContents("1 block\n", 8, "stderr");
-
- verify_files(target);
- chdir("..");
-}
-
-DEFINE_TEST(test_basic)
-{
- int fd;
- int filelist;
- int oldumask;
-
- oldumask = umask(0);
-
- /*
- * Create an assortment of files on disk.
- */
- filelist = open("filelist", O_CREAT | O_WRONLY, 0644);
-
- /* File with 10 bytes content. */
- fd = open("file", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(10, write(fd, "123456789", 10));
- close(fd);
- write(filelist, "file\n", 5);
-
- /* hardlink to above file. */
- assertEqualInt(0, link("file", "linkfile"));
- write(filelist, "linkfile\n", 9);
-
- /* Symlink to above file. */
- assertEqualInt(0, symlink("file", "symlink"));
- write(filelist, "symlink\n", 8);
-
- /* Another file with different permissions. */
- fd = open("file2", O_CREAT | O_WRONLY, 0777);
- assert(fd >= 0);
- assertEqualInt(10, write(fd, "123456789", 10));
- close(fd);
- write(filelist, "file2\n", 6);
-
- /* Directory. */
- assertEqualInt(0, mkdir("dir", 0775));
- write(filelist, "dir\n", 4);
- /* All done. */
- close(filelist);
-
- umask(022);
-
- /* Archive/dearchive with a variety of options. */
- basic_cpio("copy", "", "", "2 blocks\n");
- basic_cpio("copy_odc", "--format=odc", "", "2 blocks\n");
- basic_cpio("copy_newc", "-H newc", "", "2 blocks\n");
- basic_cpio("copy_cpio", "-H odc", "", "2 blocks\n");
- basic_cpio("copy_ustar", "-H ustar", "", "9 blocks\n");
- /* Copy in one step using -p */
- passthrough("passthrough");
-
- umask(oldumask);
-}
diff --git a/usr.bin/cpio/test/test_format_newc.c b/usr.bin/cpio/test/test_format_newc.c
deleted file mode 100644
index 9579c88..0000000
--- a/usr.bin/cpio/test/test_format_newc.c
+++ /dev/null
@@ -1,260 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-static int
-is_hex(const char *p, size_t l)
-{
- while (l > 0) {
- if ((*p >= '0' && *p <= '9')
- || (*p >= 'a' && *p <= 'f')
- || (*p >= 'A' && *p <= 'F'))
- {
- --l;
- ++p;
- } else
- return (0);
-
- }
- return (1);
-}
-
-static int
-from_hex(const char *p, size_t l)
-{
- int r = 0;
-
- while (l > 0) {
- r *= 16;
- if (*p >= 'a' && *p <= 'f')
- r += *p + 10 - 'a';
- else if (*p >= 'A' && *p <= 'F')
- r += *p + 10 - 'A';
- else
- r += *p - '0';
- --l;
- ++p;
- }
- return (r);
-}
-
-DEFINE_TEST(test_format_newc)
-{
- int fd, list;
- int r;
- int devmajor, devminor, ino, gid;
- time_t t, t2, now;
- char *p, *e;
- size_t s, fs, ns;
- mode_t oldmask;
-
- oldmask = umask(0);
-
- /*
- * Create an assortment of files.
- * TODO: Extend this to cover more filetypes.
- */
- list = open("list", O_CREAT | O_WRONLY, 0644);
-
- /* "file1" */
- fd = open("file1", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(10, write(fd, "123456789", 10));
- close(fd);
- assertEqualInt(6, write(list, "file1\n", 6));
-
- /* "hardlink" */
- assertEqualInt(0, link("file1", "hardlink"));
- assertEqualInt(9, write(list, "hardlink\n", 9));
-
- /* Another hardlink, but this one won't be archived. */
- assertEqualInt(0, link("file1", "hardlink2"));
-
- /* "symlink" */
- assertEqualInt(0, symlink("file1", "symlink"));
- assertEqualInt(8, write(list, "symlink\n", 8));
-
- /* "dir" */
- assertEqualInt(0, mkdir("dir", 0775));
- assertEqualInt(4, write(list, "dir\n", 4));
-
- /* Record some facts about what we just created: */
- now = time(NULL); /* They were all created w/in last two seconds. */
-
- /* Use the cpio program to create an archive. */
- close(list);
- r = systemf("%s -o --format=newc <list >newc.out 2>newc.err",
- testprog);
- if (!assertEqualInt(r, 0))
- return;
-
- /* Verify that nothing went to stderr. */
- assertFileContents("2 blocks\n", 9, "newc.err");
-
- /* Verify that stdout is a well-formed cpio file in "newc" format. */
- p = slurpfile(&s, "newc.out");
- assertEqualInt(s, 1024);
- e = p;
-
- /*
- * Some of these assertions could be stronger, but it's
- * a little tricky because they depend on the local environment.
- */
-
- /* First entry is "file1" */
- assert(is_hex(e, 110)); /* Entire header is octal digits. */
- assertEqualMem(e + 0, "070701", 6); /* Magic */
- ino = from_hex(e + 6, 8); /* ino */
- assertEqualInt(0x81a4, from_hex(e + 14, 8)); /* Mode */
- assertEqualInt(from_hex(e + 22, 8), getuid()); /* uid */
- gid = from_hex(e + 30, 8); /* gid */
- assertEqualMem(e + 38, "00000003", 8); /* nlink */
- t = from_hex(e + 46, 8); /* mtime */
- failure("t=0x%08x now=0x%08x=%d", t, now, now);
- assert(t <= now); /* File wasn't created in future. */
- failure("t=0x%08x now - 2=0x%08x = %d", t, now - 2, now - 2);
- assert(t >= now - 2); /* File was created w/in last 2 secs. */
- failure("newc format stores body only with last appearance of a link\n"
- " first appearance should be empty, so this file size\n"
- " field should be zero");
- assertEqualInt(0, from_hex(e + 54, 8)); /* File size */
- fs = from_hex(e + 54, 8);
- fs += 3 & -fs;
- devmajor = from_hex(e + 62, 8); /* devmajor */
- devminor = from_hex(e + 70, 8); /* devminor */
- assert(is_hex(e + 78, 8)); /* rdevmajor */
- assert(is_hex(e + 86, 8)); /* rdevminor */
- assertEqualMem(e + 94, "00000006", 8); /* Name size */
- ns = from_hex(e + 94, 8);
- ns += 3 & (-ns - 2);
- assertEqualInt(0, from_hex(e + 102, 8)); /* check field */
- assertEqualMem(e + 110, "file1\0", 6); /* Name contents */
- /* Since there's another link, no file contents here. */
- /* But add in file size so that an error here doesn't cascade. */
- e += 110 + fs + ns;
-
- /* "symlink" pointing to "file1" */
- assert(is_hex(e, 110));
- assertEqualMem(e + 0, "070701", 6); /* Magic */
- assert(is_hex(e + 6, 8)); /* ino */
- assertEqualInt(0xa1ff, from_hex(e + 14, 8)); /* Mode */
- assertEqualInt(from_hex(e + 22, 8), getuid()); /* uid */
- assertEqualInt(gid, from_hex(e + 30, 8)); /* gid */
- assertEqualMem(e + 38, "00000001", 8); /* nlink */
- t2 = from_hex(e + 46, 8); /* mtime */
- failure("First entry created at t=0x%08x this entry created at t2=0x%08x", t, t2);
- assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */
- assertEqualMem(e + 54, "00000005", 8); /* File size */
- fs = from_hex(e + 54, 8);
- fs += 3 & -fs;
- assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */
- assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */
- assert(is_hex(e + 78, 8)); /* rdevmajor */
- assert(is_hex(e + 86, 8)); /* rdevminor */
- assertEqualMem(e + 94, "00000008", 8); /* Name size */
- ns = from_hex(e + 94, 8);
- ns += 3 & (-ns - 2);
- assertEqualInt(0, from_hex(e + 102, 8)); /* check field */
- assertEqualMem(e + 110, "symlink\0\0\0", 10); /* Name contents */
- assertEqualMem(e + 110 + ns, "file1\0\0\0", 8); /* symlink target */
- e += 110 + fs + ns;
-
- /* "dir" */
- assert(is_hex(e, 110));
- assertEqualMem(e + 0, "070701", 6); /* Magic */
- assert(is_hex(e + 6, 8)); /* ino */
- assertEqualInt(0x41fd, from_hex(e + 14, 8)); /* Mode */
- assertEqualInt(from_hex(e + 22, 8), getuid()); /* uid */
- assertEqualInt(gid, from_hex(e + 30, 8)); /* gid */
- assertEqualMem(e + 38, "00000002", 8); /* nlink */
- t2 = from_hex(e + 46, 8); /* mtime */
- failure("First entry created at t=0x%08x this entry created at t2=0x%08x", t, t2);
- assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */
- assertEqualMem(e + 54, "00000000", 8); /* File size */
- fs = from_hex(e + 54, 8);
- fs += 3 & -fs;
- assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */
- assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */
- assert(is_hex(e + 78, 8)); /* rdevmajor */
- assert(is_hex(e + 86, 8)); /* rdevminor */
- assertEqualMem(e + 94, "00000004", 8); /* Name size */
- ns = from_hex(e + 94, 8);
- ns += 3 & (-ns - 2);
- assertEqualInt(0, from_hex(e + 102, 8)); /* check field */
- assertEqualMem(e + 110, "dir\0\0\0", 6); /* Name contents */
- e += 110 + fs + ns;
-
- /* Hardlink identical to "file1" */
- /* Since we only wrote two of the three links to this
- * file, this link should get deferred by the hardlink logic. */
- assert(is_hex(e, 110));
- assertEqualMem(e + 0, "070701", 6); /* Magic */
- failure("If these aren't the same, then the hardlink detection failed to match them.");
- assertEqualInt(ino, from_hex(e + 6, 8)); /* ino */
- assertEqualInt(0x81a4, from_hex(e + 14, 8)); /* Mode */
- assertEqualInt(from_hex(e + 22, 8), getuid()); /* uid */
- assertEqualInt(gid, from_hex(e + 30, 8)); /* gid */
- assertEqualMem(e + 38, "00000003", 8); /* nlink */
- t2 = from_hex(e + 46, 8); /* mtime */
- failure("First entry created at t=0x%08x this entry created at t2=0x%08x", t, t2);
- assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */
- assertEqualInt(10, from_hex(e + 54, 8)); /* File size */
- fs = from_hex(e + 54, 8);
- fs += 3 & -fs;
- assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */
- assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */
- assert(is_hex(e + 78, 8)); /* rdevmajor */
- assert(is_hex(e + 86, 8)); /* rdevminor */
- assertEqualMem(e + 94, "00000009", 8); /* Name size */
- ns = from_hex(e + 94, 8);
- ns += 3 & (-ns - 2);
- assertEqualInt(0, from_hex(e + 102, 8)); /* check field */
- assertEqualMem(e + 110, "hardlink\0\0", 10); /* Name contents */
- assertEqualMem(e + 110 + ns, "123456789\0\0\0", 12); /* File contents */
- e += 110 + ns + fs;
-
- /* Last entry is end-of-archive marker. */
- assert(is_hex(e, 110));
- assertEqualMem(e + 0, "070701", 6); /* Magic */
- assertEqualMem(e + 8, "00000000", 8); /* ino */
- assertEqualMem(e + 14, "00000000", 8); /* mode */
- assertEqualMem(e + 22, "00000000", 8); /* uid */
- assertEqualMem(e + 30, "00000000", 8); /* gid */
- assertEqualMem(e + 38, "00000001", 8); /* nlink */
- assertEqualMem(e + 46, "00000000", 8); /* mtime */
- assertEqualMem(e + 54, "00000000", 8); /* size */
- assertEqualMem(e + 62, "00000000", 8); /* devmajor */
- assertEqualMem(e + 70, "00000000", 8); /* devminor */
- assertEqualMem(e + 78, "00000000", 8); /* rdevmajor */
- assertEqualMem(e + 86, "00000000", 8); /* rdevminor */
- assertEqualInt(11, from_hex(e + 94, 8)); /* name size */
- assertEqualMem(e + 102, "00000000", 8); /* check field */
- assertEqualMem(e + 110, "TRAILER!!!\0\0", 12); /* Name */
-
- free(p);
-
- umask(oldmask);
-}
diff --git a/usr.bin/cpio/test/test_gcpio_compat.c b/usr.bin/cpio/test/test_gcpio_compat.c
deleted file mode 100644
index 4b97c82..0000000
--- a/usr.bin/cpio/test/test_gcpio_compat.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-
-static void
-unpack_test(const char *from, const char *options, const char *se)
-{
- struct stat st, st2;
- char buff[128];
- int r;
-
- /* Create a work dir named after the file we're unpacking. */
- assertEqualInt(0, mkdir(from, 0775));
- chdir(from);
-
- /*
- * Use cpio to unpack the sample archive
- */
- extract_reference_file(from);
- r = systemf("%s -i %s < %s >unpack.out 2>unpack.err",
- testprog, options, from);
- failure("Error invoking %s -i %s < %s",
- testprog, options, from);
- assertEqualInt(r, 0);
-
- /* Verify that nothing went to stderr. */
- failure("Error invoking %s -i %s < %s", testprog, options, from);
- assertFileContents(se, strlen(se), "unpack.err");
-
- /*
- * Verify unpacked files.
- */
-
- /* Regular file with 2 links. */
- r = lstat("file", &st);
- failure("Failed to stat file %s/file, errno=%d", from, errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- assert(S_ISREG(st.st_mode));
- assertEqualInt(0644, st.st_mode & 0777);
- failure("file %s/file", from);
- assertEqualInt(10, st.st_size);
- failure("file %s/file", from);
- assertEqualInt(2, st.st_nlink);
- }
-
- /* Another name for the same file. */
- r = lstat("linkfile", &st2);
- failure("Failed to stat file %s/linkfile, errno=%d", from, errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- assert(S_ISREG(st2.st_mode));
- assertEqualInt(0644, st2.st_mode & 0777);
- failure("file %s/file", from);
- assertEqualInt(10, st2.st_size);
- failure("file %s/file", from);
- assertEqualInt(2, st2.st_nlink);
- failure("file and linkfile should be hardlinked");
- assertEqualInt(st.st_dev, st2.st_dev);
- failure("file %s/file", from);
- assertEqualInt(st.st_ino, st2.st_ino);
- }
-
- /* Symlink */
- r = lstat("symlink", &st);
- failure("Failed to stat file %s/symlink, errno=%d", from, errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- failure("symlink should be a symlink; actual mode is %o",
- st.st_mode);
- assert(S_ISLNK(st.st_mode));
- if (S_ISLNK(st.st_mode)) {
- r = readlink("symlink", buff, sizeof(buff));
- assertEqualInt(r, 4);
- buff[r] = '\0';
- assertEqualString(buff, "file");
- }
- }
-
- /* dir */
- r = lstat("dir", &st);
- if (r == 0) {
- assertEqualInt(r, 0);
- assert(S_ISDIR(st.st_mode));
- assertEqualInt(0775, st.st_mode & 0777);
- }
-
- chdir("..");
-}
-
-DEFINE_TEST(test_gcpio_compat)
-{
- int oldumask;
-
- oldumask = umask(0);
-
- /* Dearchive sample files with a variety of options. */
- unpack_test("test_gcpio_compat_ref.bin", "", "1 block\n");
- unpack_test("test_gcpio_compat_ref.crc", "", "2 blocks\n");
- unpack_test("test_gcpio_compat_ref.newc", "", "2 blocks\n");
- /* gcpio-2.9 only reads 6 blocks here */
- unpack_test("test_gcpio_compat_ref.ustar", "", "7 blocks\n");
-
- umask(oldumask);
-}
diff --git a/usr.bin/cpio/test/test_gcpio_compat_ref.bin.uu b/usr.bin/cpio/test/test_gcpio_compat_ref.bin.uu
deleted file mode 100644
index 745d8ab..0000000
--- a/usr.bin/cpio/test/test_gcpio_compat_ref.bin.uu
+++ /dev/null
@@ -1,16 +0,0 @@
-$FreeBSD$
-begin 644 test_gcpio_compat_ref.bin
-MQW%9`*IWI('H`^@#`@````U'=YD%````"@!F:6QE```Q,C,T-38W.#D*QW%9
-M`*IWI('H`^@#`@````U'=YD)````"@!L:6YK9FEL90``,3(S-#4V-S@Y"L=Q
-M60"K=^VAZ`/H`P$````-1X29"`````0`<WEM;&EN:P!F:6QEQW%9`*YW_4'H
-M`^@#`@````U'A9D$``````!D:7(`QW$``````````````0`````````+````
-M``!44D%)3$52(2$A````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-1````````````````````````
-`
-end
diff --git a/usr.bin/cpio/test/test_gcpio_compat_ref.crc.uu b/usr.bin/cpio/test/test_gcpio_compat_ref.crc.uu
deleted file mode 100644
index df8dde0..0000000
--- a/usr.bin/cpio/test/test_gcpio_compat_ref.crc.uu
+++ /dev/null
@@ -1,27 +0,0 @@
-$FreeBSD$
-begin 644 test_gcpio_compat_ref.crc
-M,#<P-S`R,#`S,S<W86$P,#`P.#%A-#`P,#`P,V4X,#`P,#`S93@P,#`P,#`P
-M,C0W,&0Y.3<W,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#4Y,#`P,#`P,#`P,#`P
-M,#`P,#`P,#`P,#`U,#`P,#`P,#!F:6QE```P-S`W,#(P,#,S-S=A83`P,#`X
-M,6$T,#`P,#`S93@P,#`P,#-E.#`P,#`P,#`R-#<P9#DY-S<P,#`P,#`P83`P
-M,#`P,#`P,#`P,#`P-3DP,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#DP,#`P,#%E
-M-VQI;FMF:6QE```Q,C,T-38W.#D*```P-S`W,#(P,#,S-S=A8C`P,#!A,65D
-M,#`P,#`S93@P,#`P,#-E.#`P,#`P,#`Q-#<P9#DY.#0P,#`P,#`P-#`P,#`P
-M,#`P,#`P,#`P-3DP,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#@P,#`P,#`P,'-Y
-M;6QI;FL```!F:6QE,#<P-S`R,#`S,S<W864P,#`P-#%F9#`P,#`P,V4X,#`P
-M,#`S93@P,#`P,#`P,C0W,&0Y.3@U,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#4Y
-M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`T,#`P,#`P,#!D:7(````P-S`W,#(P
-M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`Q,#`P,#`P
-M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P
-M,#`P,&(P,#`P,#`P,%1204E,15(A(2$`````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-B````````````````````````````````````````````````
-`
-end
diff --git a/usr.bin/cpio/test/test_gcpio_compat_ref.newc.uu b/usr.bin/cpio/test/test_gcpio_compat_ref.newc.uu
deleted file mode 100644
index 1e29ba9..0000000
--- a/usr.bin/cpio/test/test_gcpio_compat_ref.newc.uu
+++ /dev/null
@@ -1,27 +0,0 @@
-$FreeBSD$
-begin 644 test_gcpio_compat_ref.newc
-M,#<P-S`Q,#`S,S<W86$P,#`P.#%A-#`P,#`P,V4X,#`P,#`S93@P,#`P,#`P
-M,C0W,&0Y.3<W,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#4Y,#`P,#`P,#`P,#`P
-M,#`P,#`P,#`P,#`U,#`P,#`P,#!F:6QE```P-S`W,#$P,#,S-S=A83`P,#`X
-M,6$T,#`P,#`S93@P,#`P,#-E.#`P,#`P,#`R-#<P9#DY-S<P,#`P,#`P83`P
-M,#`P,#`P,#`P,#`P-3DP,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#DP,#`P,#`P
-M,&QI;FMF:6QE```Q,C,T-38W.#D*```P-S`W,#$P,#,S-S=A8C`P,#!A,65D
-M,#`P,#`S93@P,#`P,#-E.#`P,#`P,#`Q-#<P9#DY.#0P,#`P,#`P-#`P,#`P
-M,#`P,#`P,#`P-3DP,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#@P,#`P,#`P,'-Y
-M;6QI;FL```!F:6QE,#<P-S`Q,#`S,S<W864P,#`P-#%F9#`P,#`P,V4X,#`P
-M,#`S93@P,#`P,#`P,C0W,&0Y.3@U,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#4Y
-M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`T,#`P,#`P,#!D:7(````P-S`W,#$P
-M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`Q,#`P,#`P
-M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P
-M,#`P,&(P,#`P,#`P,%1204E,15(A(2$`````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-B````````````````````````````````````````````````
-`
-end
diff --git a/usr.bin/cpio/test/test_gcpio_compat_ref.ustar.uu b/usr.bin/cpio/test/test_gcpio_compat_ref.ustar.uu
deleted file mode 100644
index 77989f4..0000000
--- a/usr.bin/cpio/test/test_gcpio_compat_ref.ustar.uu
+++ /dev/null
@@ -1,84 +0,0 @@
-$FreeBSD$
-begin 644 test_gcpio_compat_ref.ustar
-M9FEL90``````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M`````````````#`P,#`V-#0`,#`P,3<U,``P,#`Q-S4P`#`P,#`P,#`P,#$R
-M`#$P-S`S,S$T-38W`#`P,3$S-C,`,```````````````````````````````
-M````````````````````````````````````````````````````````````
-M``````````````````````````````````````````!U<W1A<@`P,'1I;0``
-M````````````````````````````````````=&EM````````````````````
-M```````````````````P,#`P,#`P`#`P,#`P,#``````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M```````````````````````Q,C,T-38W.#D*````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M`````````````````````````````````````````````&QI;FMF:6QE````
-M````````````````````````````````````````````````````````````
-M```````````````````````````````````````````````````````````P
-M,#`P-C0T`#`P,#$W-3``,#`P,3<U,``P,#`P,#`P,#`P,``Q,#<P,S,Q-#4V
-M-P`P,#$S,#<W`#%F:6QE````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````=7-T87(`,#!T:6T`````````````````
-M`````````````````````'1I;0``````````````````````````````````
-M````,#`P,#`P,``P,#`P,#`P````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````<WEM;&EN:P``````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M`````````````````````#`P,#`W-34`,#`P,3<U,``P,#`Q-S4P`#`P,#`P
-M,#`P,#`P`#$P-S`S,S$T-C`T`#`P,3(W-C0`,F9I;&4`````````````````
-M````````````````````````````````````````````````````````````
-M``````````````````````````````````````````````````!U<W1A<@`P
-M,'1I;0``````````````````````````````````````=&EM````````````
-M```````````````````````````P,#`P,#`P`#`P,#`P,#``````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M``````````````````````````````!D:7(O````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````,#`P,#<W-0`P,#`Q
-M-S4P`#`P,#$W-3``,#`P,#`P,#`P,#``,3`W,#,S,30V,#4`,#`Q,3,P,0`U
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M`````````````'5S=&%R`#`P=&EM````````````````````````````````
-M``````!T:6T``````````````````````````````````````#`P,#`P,#``
-M,#`P,#`P,```````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-=````````````````````````````````````````
-`
-end
diff --git a/usr.bin/cpio/test/test_option_B.c b/usr.bin/cpio/test/test_option_B.c
deleted file mode 100644
index 8083882..0000000
--- a/usr.bin/cpio/test/test_option_B.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-
-DEFINE_TEST(test_option_B)
-{
- struct stat st;
- int r, fd;
-
- /*
- * Create a file on disk.
- */
- fd = open("file", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- close(fd);
-
- /* Create an archive without -B; this should be 512 bytes. */
- r = systemf("echo file | %s -o > small.cpio 2>small.err", testprog);
- assertEqualInt(r, 0);
- assertFileContents("1 block\n", 8, "small.err");
- assertEqualInt(0, stat("small.cpio", &st));
- assertEqualInt(512, st.st_size);
-
- /* Create an archive with -B; this should be 5120 bytes. */
- r = systemf("echo file | %s -oB > large.cpio 2>large.err", testprog);
- assertEqualInt(r, 0);
- assertFileContents("1 block\n", 8, "large.err");
- assertEqualInt(0, stat("large.cpio", &st));
- assertEqualInt(5120, st.st_size);
-}
diff --git a/usr.bin/cpio/test/test_option_L.c b/usr.bin/cpio/test/test_option_L.c
deleted file mode 100644
index 79e2adb..0000000
--- a/usr.bin/cpio/test/test_option_L.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-DEFINE_TEST(test_option_L)
-{
- struct stat st;
- int fd, filelist;
- int r;
-
- filelist = open("filelist", O_CREAT | O_WRONLY, 0644);
-
- /* Create a file and a symlink to the file. */
- fd = open("file", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(10, write(fd, "123456789", 10));
- close(fd);
- write(filelist, "file\n", 5);
-
- /* Symlink to above file. */
- assertEqualInt(0, symlink("file", "symlink"));
- write(filelist, "symlink\n", 8);
-
- close(filelist);
-
- r = systemf("cat filelist | %s -pd copy >copy.out 2>copy.err", testprog);
- assertEqualInt(r, 0);
- assertEqualInt(0, lstat("copy/symlink", &st));
- failure("Regular -p without -L should preserve symlinks.");
- assert(S_ISLNK(st.st_mode));
-
- r = systemf("cat filelist | %s -pd -L copy-L >copy-L.out 2>copy-L.err", testprog);
- assertEqualInt(r, 0);
- assertEmptyFile("copy-L.out");
- assertFileContents("1 block\n", 8, "copy-L.err");
- assertEqualInt(0, lstat("copy-L/symlink", &st));
- failure("-pdL should dereference symlinks and turn them into files.");
- assert(!S_ISLNK(st.st_mode));
-
- r = systemf("cat filelist | %s -o >archive.out 2>archive.err", testprog);
- failure("Error invoking %s -o ", testprog);
- assertEqualInt(r, 0);
-
- assertEqualInt(0, mkdir("unpack", 0755));
- r = systemf("cat archive.out | (cd unpack ; %s -i >unpack.out 2>unpack.err)", testprog);
- failure("Error invoking %s -i", testprog);
- assertEqualInt(r, 0);
- assertEqualInt(0, lstat("unpack/symlink", &st));
- assert(S_ISLNK(st.st_mode));
-
- r = systemf("cat filelist | %s -oL >archive-L.out 2>archive-L.err", testprog);
- failure("Error invoking %s -oL", testprog);
- assertEqualInt(r, 0);
-
- assertEqualInt(0, mkdir("unpack-L", 0755));
- r = systemf("cat archive-L.out | (cd unpack-L ; %s -i >unpack-L.out 2>unpack-L.err)", testprog);
- failure("Error invoking %s -i < archive-L.out", testprog);
- assertEqualInt(r, 0);
- assertEqualInt(0, lstat("unpack-L/symlink", &st));
- assert(!S_ISLNK(st.st_mode));
-}
diff --git a/usr.bin/cpio/test/test_option_a.c b/usr.bin/cpio/test/test_option_a.c
deleted file mode 100644
index 7cc75ce..0000000
--- a/usr.bin/cpio/test/test_option_a.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/*-
- * Copyright (c) 2003-2008 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-#include <utime.h>
-__FBSDID("$FreeBSD$");
-
-static struct {
- const char *name;
- time_t atime_sec;
-} files[] = {
- { "f0", 0 },
- { "f1", 0 },
- { "f2", 0 },
- { "f3", 0 },
- { "f4", 0 },
- { "f5", 0 }
-};
-
-/*
- * Create a bunch of test files and record their atimes.
- * For the atime preserve/change tests, the files must have
- * atimes in the past. We can accomplish this by explicitly invoking
- * utime() on platforms that support it or by simply sleeping
- * for a second after creating the files. (Creating all of the files
- * at once means we only need to sleep once.)
- */
-static void
-test_create(void)
-{
- struct stat st;
- struct utimbuf times;
- static const int numfiles = sizeof(files) / sizeof(files[0]);
- int i;
- int fd;
-
- for (i = 0; i < numfiles; ++i) {
- fd = open(files[i].name, O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- /*
- * Note: Have to write at least one byte to the file.
- * cpio doesn't bother reading the file if it's zero length,
- * so the atime never gets changed in that case, which
- * makes the tests below rather pointless.
- */
- assertEqualInt(1, write(fd, "a", 1));
- close(fd);
-
- /* If utime() isn't supported on your platform, just
- * #ifdef this section out. Most of the test below is
- * still valid. */
- memset(&times, 0, sizeof(times));
- times.actime = 1;
- times.modtime = 3;
- assertEqualInt(0, utime(files[i].name, &times));
-
- /* Record whatever atime the file ended up with. */
- /* If utime() is available, this should be 1, but there's
- * no harm in being careful. */
- assertEqualInt(0, stat(files[i].name, &st));
- files[i].atime_sec = st.st_atime;
- }
-
- /* Wait until the atime on the last file is actually in the past. */
- /* If utime() is supported above, there's no sleep here which
- * makes the test faster. */
- while (files[numfiles - 1].atime_sec >= time(NULL))
- sleep(1);
-}
-
-DEFINE_TEST(test_option_a)
-{
- struct stat st;
- int r;
- int f;
- char buff[64];
-
- /* Create all of the test files. */
- test_create();
-
- /* Sanity check; verify that atimes really do get modified. */
- f = open(files[0].name, O_RDONLY);
- assertEqualInt(1, read(f,buff, 1));
- assertEqualInt(0, close(f));
- assertEqualInt(0, stat("f0", &st));
- if (st.st_atime == files[0].atime_sec) {
- skipping("Cannot verify -a option\n"
- " Your system appears to not support atime.");
- }
- else
- {
- /*
- * If this disk is mounted noatime, then we can't
- * verify correct operation without -a.
- */
-
- /* Copy the file without -a; should change the atime. */
- r = systemf("echo %s | %s -pd copy-no-a > copy-no-a.out 2>copy-no-a.err", files[1].name, testprog);
- assertEqualInt(r, 0);
- assertFileContents("1 block\n", 8, "copy-no-a.err");
- assertEmptyFile("copy-no-a.out");
- assertEqualInt(0, stat(files[1].name, &st));
- failure("Copying file without -a should have changed atime.");
- assert(st.st_atime != files[1].atime_sec);
-
- /* Archive the file without -a; should change the atime. */
- r = systemf("echo %s | %s -o > archive-no-a.out 2>archive-no-a.err", files[2].name, testprog);
- assertEqualInt(r, 0);
- assertFileContents("1 block\n", 8, "copy-no-a.err");
- assertEqualInt(0, stat(files[2].name, &st));
- failure("Archiving file without -a should have changed atime.");
- assert(st.st_atime != files[2].atime_sec);
- }
-
- /*
- * We can, of course, still verify that the atime is unchanged
- * when using the -a option.
- */
-
- /* Copy the file with -a; should not change the atime. */
- r = systemf("echo %s | %s -pad copy-a > copy-a.out 2>copy-a.err",
- files[3].name, testprog);
- assertEqualInt(r, 0);
- assertFileContents("1 block\n", 8, "copy-a.err");
- assertEmptyFile("copy-a.out");
- assertEqualInt(0, stat(files[3].name, &st));
- failure("Copying file with -a should not have changed atime.");
- assertEqualInt(st.st_atime, files[3].atime_sec);
-
- /* Archive the file with -a; should not change the atime. */
- r = systemf("echo %s | %s -oa > archive-a.out 2>archive-a.err",
- files[4].name, testprog);
- assertEqualInt(r, 0);
- assertFileContents("1 block\n", 8, "copy-a.err");
- assertEqualInt(0, stat(files[4].name, &st));
- failure("Archiving file with -a should not have changed atime.");
- assertEqualInt(st.st_atime, files[4].atime_sec);
-}
diff --git a/usr.bin/cpio/test/test_option_c.c b/usr.bin/cpio/test/test_option_c.c
deleted file mode 100644
index 05b48c2..0000000
--- a/usr.bin/cpio/test/test_option_c.c
+++ /dev/null
@@ -1,198 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-static int
-is_octal(const char *p, size_t l)
-{
- while (l > 0) {
- if (*p < '0' || *p > '7')
- return (0);
- --l;
- ++p;
- }
- return (1);
-}
-
-static int
-from_octal(const char *p, size_t l)
-{
- int r = 0;
-
- while (l > 0) {
- r *= 8;
- r += *p - '0';
- --l;
- ++p;
- }
- return (r);
-}
-
-DEFINE_TEST(test_option_c)
-{
- int fd, filelist;
- int r;
- int dev, ino, gid;
- time_t t, now;
- char *p, *e;
- size_t s;
- mode_t oldmask;
-
- oldmask = umask(0);
-
- /*
- * Create an assortment of files.
- * TODO: Extend this to cover more filetypes.
- */
- filelist = open("filelist", O_CREAT | O_WRONLY, 0644);
-
- /* "file" */
- fd = open("file", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(10, write(fd, "123456789", 10));
- close(fd);
- assertEqualInt(5, write(filelist, "file\n", 5));
-
- /* "symlink" */
- assertEqualInt(0, symlink("file", "symlink"));
- assertEqualInt(8, write(filelist, "symlink\n", 8));
-
- /* "dir" */
- assertEqualInt(0, mkdir("dir", 0775));
- /* Record some facts about what we just created: */
- now = time(NULL); /* They were all created w/in last two seconds. */
- assertEqualInt(4, write(filelist, "dir\n", 4));
-
- /* Use the cpio program to create an archive. */
- close(filelist);
- r = systemf("%s -oc <filelist >basic.out 2>basic.err", testprog);
- /* Verify that nothing went to stderr. */
- assertFileContents("1 block\n", 8, "basic.err");
-
- /* Assert that the program finished. */
- failure("%s -oc crashed", testprog);
- if (!assertEqualInt(r, 0))
- return;
-
- /* Verify that stdout is a well-formed cpio file in "odc" format. */
- p = slurpfile(&s, "basic.out");
- assertEqualInt(s, 512);
- e = p;
-
- /*
- * Some of these assertions could be stronger, but it's
- * a little tricky because they depend on the local environment.
- */
-
- /* First entry is "file" */
- assert(is_octal(e, 76)); /* Entire header is octal digits. */
- assertEqualMem(e + 0, "070707", 6); /* Magic */
- assert(is_octal(e + 6, 6)); /* dev */
- dev = from_octal(e + 6, 6);
- assert(is_octal(e + 12, 6)); /* ino */
- ino = from_octal(e + 12, 6);
- assertEqualMem(e + 18, "100644", 6); /* Mode */
- assertEqualInt(from_octal(e + 24, 6), getuid()); /* uid */
- assert(is_octal(e + 30, 6)); /* gid */
- gid = from_octal(e + 30, 6);
- assertEqualMem(e + 36, "000001", 6); /* nlink */
- failure("file entries should not have rdev set (dev field was 0%o)",
- dev);
- assertEqualMem(e + 42, "000000", 6); /* rdev */
- t = from_octal(e + 48, 11); /* mtime */
- assert(t <= now); /* File wasn't created in future. */
- assert(t >= now - 2); /* File was created w/in last 2 secs. */
- assertEqualMem(e + 59, "000005", 6); /* Name size */
- assertEqualMem(e + 65, "00000000012", 11); /* File size */
- assertEqualMem(e + 76, "file\0", 5); /* Name contents */
- assertEqualMem(e + 81, "123456789\0", 10); /* File contents */
- e += 91;
-
- /* Second entry is "symlink" pointing to "file" */
- assert(is_octal(e, 76)); /* Entire header is octal digits. */
- assertEqualMem(e + 0, "070707", 6); /* Magic */
- assertEqualInt(dev, from_octal(e + 6, 6)); /* dev */
- assert(dev != from_octal(e + 12, 6)); /* ino */
- assertEqualMem(e + 18, "120777", 6); /* Mode */
- assertEqualInt(from_octal(e + 24, 6), getuid()); /* uid */
- assertEqualInt(gid, from_octal(e + 30, 6)); /* gid */
- assertEqualMem(e + 36, "000001", 6); /* nlink */
- failure("file entries should have rdev == 0 (dev was 0%o)",
- from_octal(e + 6, 6));
- assertEqualMem(e + 42, "000000", 6); /* rdev */
- t = from_octal(e + 48, 11); /* mtime */
- assert(t <= now); /* File wasn't created in future. */
- assert(t >= now - 2); /* File was created w/in last 2 secs. */
- assertEqualMem(e + 59, "000010", 6); /* Name size */
- assertEqualMem(e + 65, "00000000004", 11); /* File size */
- assertEqualMem(e + 76, "symlink\0", 8); /* Name contents */
- assertEqualMem(e + 84, "file", 4); /* Symlink target. */
- e += 88;
-
- /* Second entry is "dir" */
- assert(is_octal(e, 76));
- assertEqualMem(e + 0, "070707", 6); /* Magic */
- /* Dev should be same as first entry. */
- assert(is_octal(e + 6, 6)); /* dev */
- assertEqualInt(dev, from_octal(e + 6, 6));
- /* Ino must be different from first entry. */
- assert(is_octal(e + 12, 6)); /* ino */
- assert(dev != from_octal(e + 12, 6));
- assertEqualMem(e + 18, "040775", 6); /* Mode */
- assertEqualInt(from_octal(e + 24, 6), getuid()); /* uid */
- /* Gid should be same as first entry. */
- assert(is_octal(e + 30, 6)); /* gid */
- assertEqualInt(gid, from_octal(e + 30, 6));
- assertEqualMem(e + 36, "000002", 6); /* Nlink */
- t = from_octal(e + 48, 11); /* mtime */
- assert(t <= now); /* File wasn't created in future. */
- assert(t >= now - 2); /* File was created w/in last 2 secs. */
- assertEqualMem(e + 59, "000004", 6); /* Name size */
- assertEqualMem(e + 65, "00000000000", 11); /* File size */
- assertEqualMem(e + 76, "dir\0", 4); /* name */
- e += 80;
-
- /* TODO: Verify other types of entries. */
-
- /* Last entry is end-of-archive marker. */
- assert(is_octal(e, 76));
- assertEqualMem(e + 0, "070707", 6); /* Magic */
- assertEqualMem(e + 6, "000000", 6); /* dev */
- assertEqualMem(e + 12, "000000", 6); /* ino */
- assertEqualMem(e + 18, "000000", 6); /* Mode */
- assertEqualMem(e + 24, "000000", 6); /* uid */
- assertEqualMem(e + 30, "000000", 6); /* gid */
- assertEqualMem(e + 36, "000001", 6); /* Nlink */
- assertEqualMem(e + 42, "000000", 6); /* rdev */
- assertEqualMem(e + 48, "00000000000", 11); /* mtime */
- assertEqualMem(e + 59, "000013", 6); /* Name size */
- assertEqualMem(e + 65, "00000000000", 11); /* File size */
- assertEqualMem(e + 76, "TRAILER!!!\0", 11); /* Name */
-
- free(p);
-
- umask(oldmask);
-}
diff --git a/usr.bin/cpio/test/test_option_d.c b/usr.bin/cpio/test/test_option_d.c
deleted file mode 100644
index 370c82a..0000000
--- a/usr.bin/cpio/test/test_option_d.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-
-DEFINE_TEST(test_option_d)
-{
- struct stat st;
- int r, fd;
-
- /*
- * Create a file in a directory.
- */
- assertEqualInt(0, mkdir("dir", 0755));
- fd = open("dir/file", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- close(fd);
-
- /* Create an archive. */
- r = systemf("echo dir/file | %s -o > archive.cpio 2>archive.err", testprog);
- assertEqualInt(r, 0);
- assertFileContents("1 block\n", 8, "archive.err");
- assertEqualInt(0, stat("archive.cpio", &st));
- assertEqualInt(512, st.st_size);
-
- /* Dearchive without -d, this should fail. */
- assertEqualInt(0, mkdir("without-d", 0755));
- assertEqualInt(0, chdir("without-d"));
- r = systemf("%s -i < ../archive.cpio >out 2>err", testprog);
- assertEqualInt(r, 0);
- assertEmptyFile("out");
- /* And the file should not be restored. */
- assert(0 != stat("dir/file", &st));
-
- /* Dearchive with -d, this should succeed. */
- assertEqualInt(0, chdir(".."));
- assertEqualInt(0, mkdir("with-d", 0755));
- assertEqualInt(0, chdir("with-d"));
- r = systemf("%s -id < ../archive.cpio >out 2>err", testprog);
- assertEqualInt(r, 0);
- assertEmptyFile("out");
- assertFileContents("1 block\n", 8, "err");
- /* And the file should be restored. */
- assertEqualInt(0, stat("dir/file", &st));
-}
diff --git a/usr.bin/cpio/test/test_option_ell.c b/usr.bin/cpio/test/test_option_ell.c
deleted file mode 100644
index 36bb0ac..0000000
--- a/usr.bin/cpio/test/test_option_ell.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/*
- * This is called "test_option_ell" instead of "test_option_l" to
- * avoid any conflicts with "test_option_L" on case-insensitive
- * filesystems.
- */
-
-DEFINE_TEST(test_option_ell)
-{
- struct stat st, st2;
- int fd;
- int r;
-
- /* Create a file. */
- fd = open("f", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(1, write(fd, "a", 1));
- close(fd);
-
- /* Stat it. */
- assertEqualInt(0, stat("f", &st));
-
- /* Copy the file to the "copy" dir. */
- r = systemf("echo f | %s -pd copy >copy.out 2>copy.err",
- testprog);
- assertEqualInt(r, 0);
-
- /* Check that the copy is a true copy and not a link. */
- assertEqualInt(0, stat("copy/f", &st2));
- assert(st2.st_ino != st.st_ino);
-
- /* Copy the file to the "link" dir with the -l option. */
- r = systemf("echo f | %s -pld link >link.out 2>link.err",
- testprog);
- assertEqualInt(r, 0);
-
- /* Check that this is a link and not a copy. */
- assertEqualInt(0, stat("link/f", &st2));
- assert(st2.st_ino == st.st_ino);
-}
diff --git a/usr.bin/cpio/test/test_option_f.c b/usr.bin/cpio/test/test_option_f.c
deleted file mode 100644
index d1af912..0000000
--- a/usr.bin/cpio/test/test_option_f.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/*
- * Unpack the archive in a new dir.
- */
-static void
-unpack(const char *dirname, const char *option)
-{
- int r;
-
- assertEqualInt(0, mkdir(dirname, 0755));
- assertEqualInt(0, chdir(dirname));
- extract_reference_file("test_option_f.cpio");
- r = systemf("%s -i %s < test_option_f.cpio > copy-no-a.out 2>copy-no-a.err", testprog, option);
- assertEqualInt(0, r);
- assertEqualInt(0, chdir(".."));
-}
-
-DEFINE_TEST(test_option_f)
-{
- /* Calibrate: No -f option, so everything should be extracted. */
- unpack("t0", "");
- assertEqualInt(0, access("t0/a123", F_OK));
- assertEqualInt(0, access("t0/a234", F_OK));
- assertEqualInt(0, access("t0/b123", F_OK));
- assertEqualInt(0, access("t0/b234", F_OK));
-
- /* Don't extract 'a*' files. */
- unpack("t1", "-f 'a*'");
- assert(0 != access("t1/a123", F_OK));
- assert(0 != access("t1/a234", F_OK));
- assertEqualInt(0, access("t1/b123", F_OK));
- assertEqualInt(0, access("t1/b234", F_OK));
-
- /* Don't extract 'b*' files. */
- unpack("t2", "-f 'b*'");
- assertEqualInt(0, access("t2/a123", F_OK));
- assertEqualInt(0, access("t2/a234", F_OK));
- assert(0 != access("t2/b123", F_OK));
- assert(0 != access("t2/b234", F_OK));
-}
diff --git a/usr.bin/cpio/test/test_option_f.cpio.uu b/usr.bin/cpio/test/test_option_f.cpio.uu
deleted file mode 100644
index 42c63c3..0000000
--- a/usr.bin/cpio/test/test_option_f.cpio.uu
+++ /dev/null
@@ -1,16 +0,0 @@
-$FreeBSD$
-begin 644 test_option_f.cpio
-M,#<P-S`W,#`P,3,Q-C(Q-38Q,3`P-C0T,#`Q-S4P,#`Q-S4P,#`P,#`Q,#`P
-M,#`P,3`W,S4Q,3(U,C8P,#`P,#4P,#`P,#`P,#`P,&$Q,C,`,#<P-S`W,#`P
-M,3,Q-C(Q-38S,3`P-C0T,#`Q-S4P,#`Q-S4P,#`P,#`Q,#`P,#`P,3`W,S4Q
-M,3(U-#`P,#`P,#4P,#`P,#`P,#`P,&$R,S0`,#<P-S`W,#`P,3,Q-C(Q-38R
-M,3`P-C0T,#`Q-S4P,#`Q-S4P,#`P,#`Q,#`P,#`P,3`W,S4Q,3(U,S0P,#`P
-M,#4P,#`P,#`P,#`P,&(Q,C,`,#<P-S`W,#`P,3,Q-C(Q-38T,3`P-C0T,#`Q
-M-S4P,#`Q-S4P,#`P,#`Q,#`P,#`P,3`W,S4Q,3(U-#,P,#`P,#4P,#`P,#`P
-M,#`P,&(R,S0`,#<P-S`W,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P
-M,#`P,#`Q,#`P,#`P,#`P,#`P,#`P,#`P,#`P,3,P,#`P,#`P,#`P,%1204E,
-M15(A(2$`````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-1````````````````````````
-`
-end
diff --git a/usr.bin/cpio/test/test_option_help.c b/usr.bin/cpio/test/test_option_help.c
deleted file mode 100644
index b9433a4..0000000
--- a/usr.bin/cpio/test/test_option_help.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/*
- * Test that "--help", "-h", and "-W help" options all work and
- * generate reasonable output.
- */
-
-static int
-in_first_line(const char *p, const char *substring)
-{
- size_t l = strlen(substring);
-
- while (*p != '\0' && *p != '\n') {
- if (memcmp(p, substring, l) == 0)
- return (1);
- ++p;
- }
- return (0);
-}
-
-DEFINE_TEST(test_option_help)
-{
- int r;
- char *p;
- size_t plen;
-
- /* Exercise --help option. */
- r = systemf("%s --help >help.stdout 2>help.stderr", testprog);
- failure("--help should generate nothing to stderr.");
- assertEmptyFile("help.stderr");
- /* Help message should start with name of program. */
- p = slurpfile(&plen, "help.stdout");
- failure("Help output should be long enough.");
- assert(plen >= 7);
- failure("First line of help output should contain string 'bsdcpio'");
- assert(in_first_line(p, "bsdcpio"));
- /*
- * TODO: Extend this check to further verify that --help output
- * looks approximately right.
- */
- free(p);
-
- /* -h option should generate the same output. */
- r = systemf("%s -h >h.stdout 2>h.stderr", testprog);
- failure("-h should generate nothing to stderr.");
- assertEmptyFile("h.stderr");
- failure("stdout should be same for -h and --help");
- assertEqualFile("h.stdout", "help.stdout");
-
- /* -W help should be another synonym. */
- r = systemf("%s -W help >Whelp.stdout 2>Whelp.stderr", testprog);
- failure("-W help should generate nothing to stderr.");
- assertEmptyFile("Whelp.stderr");
- failure("stdout should be same for -W help and --help");
- assertEqualFile("Whelp.stdout", "help.stdout");
-}
diff --git a/usr.bin/cpio/test/test_option_m.c b/usr.bin/cpio/test/test_option_m.c
deleted file mode 100644
index d5bbad2..0000000
--- a/usr.bin/cpio/test/test_option_m.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-
-DEFINE_TEST(test_option_m)
-{
- struct stat st;
- int r;
- time_t now;
-
- /*
- * The reference archive has one file with an mtime in 1970, 1
- * second after the start of the epoch.
- */
-
- /* Restored without -m, the result should have a current mtime. */
- assertEqualInt(0, mkdir("without-m", 0755));
- assertEqualInt(0, chdir("without-m"));
- extract_reference_file("test_option_m.cpio");
- r = systemf("%s -i < test_option_m.cpio >out 2>err", testprog);
- now = time(NULL);
- assertEqualInt(r, 0);
- assertEmptyFile("out");
- assertFileContents("1 block\n", 8, "err");
- assertEqualInt(0, stat("file", &st));
- /* Should have been created within the last few seconds. */
- assert(st.st_mtime <= now);
- assert(st.st_mtime > now - 5);
-
- /* With -m, it should have an mtime in 1970. */
- assertEqualInt(0, chdir(".."));
- assertEqualInt(0, mkdir("with-m", 0755));
- assertEqualInt(0, chdir("with-m"));
- extract_reference_file("test_option_m.cpio");
- r = systemf("%s -im < test_option_m.cpio >out 2>err", testprog);
- now = time(NULL);
- assertEqualInt(r, 0);
- assertEmptyFile("out");
- assertFileContents("1 block\n", 8, "err");
- assertEqualInt(0, stat("file", &st));
- /*
- * mtime in reference archive is '1' == 1 second after
- * midnight Jan 1, 1970 UTC.
- */
- assertEqualInt(1, st.st_mtime);
-}
diff --git a/usr.bin/cpio/test/test_option_m.cpio.uu b/usr.bin/cpio/test/test_option_m.cpio.uu
deleted file mode 100644
index 3d20023..0000000
--- a/usr.bin/cpio/test/test_option_m.cpio.uu
+++ /dev/null
@@ -1,16 +0,0 @@
-$FreeBSD$
-begin 644 test_option_m.cpio
-M,#<P-S`W,#`P,3,Q-#4P,#8T,3`P-C0T,#`Q-S4P,#`Q-S4P,#`P,#`Q,#`P
-M,#`P,#`P,#`P,#`P,#$P,#`P,#4P,#`P,#`P,#`P,&9I;&4`,#<P-S`W,#`P
-M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`Q,#`P,#`P,#`P,#`P
-M,#`P,#`P,#`P,3,P,#`P,#`P,#`P,%1204E,15(A(2$`````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-1````````````````````````
-`
-end
diff --git a/usr.bin/cpio/test/test_option_t.c b/usr.bin/cpio/test/test_option_t.c
deleted file mode 100644
index c9cdd0b..0000000
--- a/usr.bin/cpio/test/test_option_t.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-
-DEFINE_TEST(test_option_t)
-{
- int r;
-
- /* List reference archive, make sure the TOC is correct. */
- extract_reference_file("test_option_t.cpio");
- r = systemf("%s -it < test_option_t.cpio >t.out 2>t.err", testprog);
- assertEqualInt(r, 0);
- assertFileContents("1 block\n", 8, "t.err");
- extract_reference_file("test_option_t.stdout");
- assertEqualFile("t.out", "test_option_t.stdout");
-
- /* List reference archive verbosely, make sure the TOC is correct. */
- r = systemf("%s -itv < test_option_t.cpio >tv.out 2>tv.err", testprog);
- assertEqualInt(r, 0);
- assertFileContents("1 block\n", 8, "tv.err");
- extract_reference_file("test_option_tv.stdout");
- assertEqualFile("tv.out", "test_option_tv.stdout");
-}
diff --git a/usr.bin/cpio/test/test_option_t.cpio.uu b/usr.bin/cpio/test/test_option_t.cpio.uu
deleted file mode 100644
index 055fe74..0000000
--- a/usr.bin/cpio/test/test_option_t.cpio.uu
+++ /dev/null
@@ -1,16 +0,0 @@
-$FreeBSD$
-begin 644 test_option_t.cpio
-M,#<P-S`W,#`P,3,Q-#4P,#8T,3`P-C0T,#`Q-S4P,#`Q-S4P,#`P,#`Q,#`P
-M,#`P,#`P,#`P,#`P,#$P,#`P,#4P,#`P,#`P,#`P,&9I;&4`,#<P-S`W,#`P
-M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`Q,#`P,#`P,#`P,#`P
-M,#`P,#`P,#`P,3,P,#`P,#`P,#`P,%1204E,15(A(2$`````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-1````````````````````````
-`
-end
diff --git a/usr.bin/cpio/test/test_option_t.stdout.uu b/usr.bin/cpio/test/test_option_t.stdout.uu
deleted file mode 100644
index 2457706..0000000
--- a/usr.bin/cpio/test/test_option_t.stdout.uu
+++ /dev/null
@@ -1,5 +0,0 @@
-$FreeBSD$
-begin 644 test_option_t.stdout
-%9FEL90H`
-`
-end
diff --git a/usr.bin/cpio/test/test_option_tv.stdout.uu b/usr.bin/cpio/test/test_option_tv.stdout.uu
deleted file mode 100644
index baead3e..0000000
--- a/usr.bin/cpio/test/test_option_tv.stdout.uu
+++ /dev/null
@@ -1,5 +0,0 @@
-$FreeBSD$
-begin 644 test_option_tv.stdout
-G+7)W+7(M+7(M+2`@(#$@("`H;G5L;"D@("AN=6QL*2`P(&9I;&4*
-`
-end
diff --git a/usr.bin/cpio/test/test_option_u.c b/usr.bin/cpio/test/test_option_u.c
deleted file mode 100644
index 7abd7f0..0000000
--- a/usr.bin/cpio/test/test_option_u.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-#include <utime.h>
-__FBSDID("$FreeBSD$");
-
-DEFINE_TEST(test_option_u)
-{
- struct utimbuf times;
- char *p;
- size_t s;
- int fd;
- int r;
-
- /* Create a file. */
- fd = open("f", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(1, write(fd, "a", 1));
- close(fd);
-
- /* Copy the file to the "copy" dir. */
- r = systemf("echo f | %s -pd copy >copy.out 2>copy.err",
- testprog);
- assertEqualInt(r, 0);
-
- /* Check that the file contains only a single "a" */
- p = slurpfile(&s, "copy/f");
- assertEqualInt(s, 1);
- assertEqualMem(p, "a", 1);
-
- /* Recreate the file with a single "b" */
- fd = open("f", O_CREAT | O_TRUNC | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(1, write(fd, "b", 1));
- close(fd);
-
- /* Set the mtime to the distant past. */
- memset(&times, 0, sizeof(times));
- times.actime = 1;
- times.modtime = 3;
- assertEqualInt(0, utime("f", &times));
-
- /* Copy the file to the "copy" dir. */
- r = systemf("echo f | %s -pd copy >copy.out 2>copy.err",
- testprog);
- assertEqualInt(r, 0);
-
- /* Verify that the file hasn't changed (it wasn't overwritten) */
- p = slurpfile(&s, "copy/f");
- assertEqualInt(s, 1);
- assertEqualMem(p, "a", 1);
-
- /* Copy the file to the "copy" dir with -u (force) */
- r = systemf("echo f | %s -pud copy >copy.out 2>copy.err",
- testprog);
- assertEqualInt(r, 0);
-
- /* Verify that the file has changed (it was overwritten) */
- p = slurpfile(&s, "copy/f");
- assertEqualInt(s, 1);
- assertEqualMem(p, "b", 1);
-}
diff --git a/usr.bin/cpio/test/test_option_version.c b/usr.bin/cpio/test/test_option_version.c
deleted file mode 100644
index 95258eb..0000000
--- a/usr.bin/cpio/test/test_option_version.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/*
- * Test that --version option works and generates reasonable output.
- */
-
-static void
-verify(const char *p, size_t s)
-{
- const char *q = p;
-
- /* Version message should start with name of program, then space. */
- failure("version message too short:", p);
- if (!assert(s > 6))
- return;
- failure("Version message should begin with 'bsdcpio': %s", p);
- if (!assertEqualMem(q, "bsdcpio ", 8))
- /* If we're not testing bsdcpio, don't keep going. */
- return;
- q += 8; s -= 8;
- /* Version number is a series of digits and periods. */
- while (s > 0 && (*q == '.' || (*q >= '0' && *q <= '9'))) {
- ++q;
- --s;
- }
- /* Version number terminated by space. */
- failure("Version: %s", p);
- assert(s > 1);
- /* Skip a single trailing a,b,c, or d. */
- if (*q == 'a' || *q == 'b' || *q == 'c' || *q == 'd')
- ++q;
- failure("Version: %s", p);
- assert(*q == ' ');
- ++q; --s;
- /* Separator. */
- failure("Version: %s", p);
- assertEqualMem(q, "-- ", 3);
- q += 3; s -= 3;
- /* libarchive name and version number */
- assert(s > 11);
- failure("Version: %s", p);
- assertEqualMem(q, "libarchive ", 11);
- q += 11; s -= 11;
- /* Version number is a series of digits and periods. */
- while (s > 0 && (*q == '.' || (*q >= '0' && *q <= '9'))) {
- ++q;
- --s;
- }
- /* Skip a single trailing a,b,c, or d. */
- if (*q == 'a' || *q == 'b' || *q == 'c' || *q == 'd')
- ++q;
- /* All terminated by a newline. */
- assert(s >= 1);
- failure("Version: %s", p);
- assertEqualMem(q, "\n", 1);
-}
-
-
-DEFINE_TEST(test_option_version)
-{
- int r;
- char *p;
- size_t s;
-
- r = systemf("%s --version >version.stdout 2>version.stderr", testprog);
- if (r != 0)
- r = systemf("%s -W version >version.stdout 2>version.stderr",
- testprog);
- failure("Unable to run either %s --version or %s -W version",
- testprog, testprog);
- if (!assert(r == 0))
- return;
-
- /* --version should generate nothing to stderr. */
- assertEmptyFile("version.stderr");
- /* Verify format of version message. */
- p = slurpfile(&s, "version.stdout");
- verify(p, s);
- free(p);
-}
diff --git a/usr.bin/cpio/test/test_option_y.c b/usr.bin/cpio/test/test_option_y.c
deleted file mode 100644
index 4181301..0000000
--- a/usr.bin/cpio/test/test_option_y.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-DEFINE_TEST(test_option_y)
-{
- char *p;
- int fd;
- int r;
- size_t s;
-
- /* Create a file. */
- fd = open("f", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(1, write(fd, "a", 1));
- close(fd);
-
- /* Archive it with bzip2 compression. */
- r = systemf("echo f | %s -oy >archive.out 2>archive.err",
- testprog);
- failure("-y (bzip) option seems to be broken");
- if (assertEqualInt(r, 0)) {
- assertFileContents("1 block\n", 8, "archive.err");
- /* Check that the archive file has a bzip2 signature. */
- p = slurpfile(&s, "archive.out");
- assert(s > 2);
- assertEqualMem(p, "BZh9", 4);
- }
-}
diff --git a/usr.bin/cpio/test/test_option_z.c b/usr.bin/cpio/test/test_option_z.c
deleted file mode 100644
index 15337a4..0000000
--- a/usr.bin/cpio/test/test_option_z.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-DEFINE_TEST(test_option_z)
-{
- char *p;
- int fd;
- int r;
- size_t s;
-
- /* Create a file. */
- fd = open("f", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(1, write(fd, "a", 1));
- close(fd);
-
- /* Archive it with gzip compression. */
- r = systemf("echo f | %s -oz >archive.out 2>archive.err",
- testprog);
- failure("-z option seems to be broken");
- assertEqualInt(r, 0);
- if (r == 0) {
- /* Check that the archive file has a gzip signature. */
- p = slurpfile(&s, "archive.out");
- assert(s > 2);
- assertEqualMem(p, "\x1f\x8b\x08\x00", 4);
- }
-}
diff --git a/usr.bin/cpio/test/test_owner_parse.c b/usr.bin/cpio/test/test_owner_parse.c
deleted file mode 100644
index 1adbce4..0000000
--- a/usr.bin/cpio/test/test_owner_parse.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-#include "../cpio.h"
-
-DEFINE_TEST(test_owner_parse)
-{
- int uid, gid;
-
- cpio_progname = "Ignore this message";
-
- assertEqualInt(0, owner_parse("root", &uid, &gid));
- assertEqualInt(0, uid);
- assertEqualInt(-1, gid);
-
-
- assertEqualInt(0, owner_parse("root:", &uid, &gid));
- assertEqualInt(0, uid);
- assertEqualInt(0, gid);
-
- assertEqualInt(0, owner_parse("root.", &uid, &gid));
- assertEqualInt(0, uid);
- assertEqualInt(0, gid);
-
- /*
- * TODO: Lookup current user/group name, build strings and
- * use those to verify username/groupname lookups for ordinary
- * users.
- */
-
- /*
- * TODO: Rework owner_parse to either return a char * pointing
- * to an error message or accept a function pointer to an
- * error-reporting routine so that the following tests don't
- * generate any output.
- *
- * Alternatively, redirect stderr temporarily to suppress the output.
- */
-
- assertEqualInt(1, owner_parse(":nonexistentgroup", &uid, &gid));
- assertEqualInt(1, owner_parse("root:nonexistentgroup", &uid, &gid));
- assertEqualInt(1,
- owner_parse("nonexistentuser:nonexistentgroup", &uid, &gid));
-}
diff --git a/usr.bin/cpio/test/test_passthrough_dotdot.c b/usr.bin/cpio/test/test_passthrough_dotdot.c
deleted file mode 100644
index f8c2c06..0000000
--- a/usr.bin/cpio/test/test_passthrough_dotdot.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/*
- * Verify that "cpio -p .." works.
- */
-
-DEFINE_TEST(test_passthrough_dotdot)
-{
- struct stat st;
- int fd, r;
- int filelist;
- int oldumask;
-
- oldumask = umask(0);
-
- /*
- * Create an assortment of files on disk.
- */
- filelist = open("filelist", O_CREAT | O_WRONLY, 0644);
-
- /* Directory. */
- assertEqualInt(0, mkdir("dir", 0755));
- assertEqualInt(0, chdir("dir"));
-
- write(filelist, ".\n", 2);
-
- /* File with 10 bytes content. */
- fd = open("file", O_CREAT | O_WRONLY, 0642);
- assert(fd >= 0);
- assertEqualInt(10, write(fd, "123456789", 10));
- close(fd);
- write(filelist, "file\n", 5);
-
- /* All done. */
- close(filelist);
-
-
- /*
- * Use cpio passthrough mode to copy files to another directory.
- */
- r = systemf("%s -pdvm .. <../filelist >../stdout 2>../stderr",
- testprog);
- failure("Error invoking %s -pd ..", testprog);
- assertEqualInt(r, 0);
-
- assertEqualInt(0, chdir(".."));
-
- /* Verify stderr and stdout. */
- assertFileContents("../.\n../file\n1 block\n", 21, "stderr");
- assertEmptyFile("stdout");
-
- /* Regular file. */
- r = lstat("file", &st);
- failure("Failed to stat file, errno=%d", errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- assert(S_ISREG(st.st_mode));
- assertEqualInt(0642, st.st_mode & 0777);
- assertEqualInt(10, st.st_size);
- assertEqualInt(1, st.st_nlink);
- }
-
- umask(oldumask);
-}
diff --git a/usr.bin/cpio/test/test_passthrough_reverse.c b/usr.bin/cpio/test/test_passthrough_reverse.c
deleted file mode 100644
index 84b2d72..0000000
--- a/usr.bin/cpio/test/test_passthrough_reverse.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/*
- * As reported by Bernd Walter: Some people are in the habit of
- * using "find -d" to generate a list for cpio -p because that
- * copies the top-level dir last, which preserves owner and mode
- * information. That's not necessary for bsdcpio (libarchive defers
- * restoring directory information), but bsdcpio should still generate
- * the correct results with this usage.
- */
-
-DEFINE_TEST(test_passthrough_reverse)
-{
- struct stat st;
- int fd, r;
- int filelist;
- int oldumask;
-
- oldumask = umask(0);
-
- /*
- * Create an assortment of files on disk.
- */
- filelist = open("filelist", O_CREAT | O_WRONLY, 0644);
-
- /* Directory. */
- assertEqualInt(0, mkdir("dir", 0743));
-
- /* File with 10 bytes content. */
- fd = open("dir/file", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(10, write(fd, "123456789", 10));
- close(fd);
- write(filelist, "dir/file\n", 9);
-
- /* Write dir last. */
- write(filelist, "dir\n", 4);
-
- /* All done. */
- close(filelist);
-
-
- /*
- * Use cpio passthrough mode to copy files to another directory.
- */
- r = systemf("%s -pdvm out <filelist >stdout 2>stderr", testprog);
- failure("Error invoking %s -pd out", testprog);
- assertEqualInt(r, 0);
-
- assertEqualInt(0, chdir("out"));
-
- /* Verify stderr and stdout. */
- assertFileContents("out/dir/file\nout/dir\n1 block\n", 29,
- "../stderr");
- assertEmptyFile("../stdout");
-
- /* dir */
- r = lstat("dir", &st);
- if (r == 0) {
- assertEqualInt(r, 0);
- assert(S_ISDIR(st.st_mode));
- failure("st.st_mode=0%o", st.st_mode);
- assertEqualInt(0743, st.st_mode & 0777);
- }
-
-
- /* Regular file. */
- r = lstat("dir/file", &st);
- failure("Failed to stat dir/file, errno=%d", errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- assert(S_ISREG(st.st_mode));
- assertEqualInt(0644, st.st_mode & 0777);
- assertEqualInt(10, st.st_size);
- assertEqualInt(1, st.st_nlink);
- }
-
- umask(oldumask);
-}
diff --git a/usr.bin/cpio/test/test_pathmatch.c b/usr.bin/cpio/test/test_pathmatch.c
deleted file mode 100644
index 83528c0..0000000
--- a/usr.bin/cpio/test/test_pathmatch.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-#include "../pathmatch.h"
-
-/*
- * Verify that the pattern matcher implements the wildcard logic specified
- * in SUSv2 for the cpio command. This is essentially the
- * shell glob syntax:
- * * - matches any sequence of chars, including '/'
- * ? - matches any single char, including '/'
- * [...] - matches any of a set of chars, '-' specifies a range,
- * initial '!' is undefined
- *
- * The specification in SUSv2 is a bit incomplete, I assume the following:
- * Trailing '-' in [...] is not special.
- */
-
-DEFINE_TEST(test_pathmatch)
-{
- assertEqualInt(1, pathmatch("*","", 0));
- assertEqualInt(1, pathmatch("*","a", 0));
- assertEqualInt(1, pathmatch("*","abcd", 0));
- /* SUSv2: * matches / */
- assertEqualInt(1, pathmatch("*","abcd/efgh/ijkl", 0));
- assertEqualInt(1, pathmatch("abcd*efgh/ijkl","abcd/efgh/ijkl", 0));
- assertEqualInt(1, pathmatch("abcd***efgh/ijkl","abcd/efgh/ijkl", 0));
- assertEqualInt(1, pathmatch("abcd***/efgh/ijkl","abcd/efgh/ijkl", 0));
- assertEqualInt(0, pathmatch("?", "", 0));
- assertEqualInt(0, pathmatch("?", "\0", 0));
- assertEqualInt(1, pathmatch("?", "a", 0));
- assertEqualInt(0, pathmatch("?", "ab", 0));
- assertEqualInt(1, pathmatch("?", ".", 0));
- assertEqualInt(1, pathmatch("?", "?", 0));
- assertEqualInt(1, pathmatch("a", "a", 0));
- assertEqualInt(0, pathmatch("a", "ab", 0));
- assertEqualInt(0, pathmatch("a", "ab", 0));
- assertEqualInt(1, pathmatch("a?c", "abc", 0));
- /* SUSv2: ? matches / */
- assertEqualInt(1, pathmatch("a?c", "a/c", 0));
- assertEqualInt(1, pathmatch("a?*c*", "a/c", 0));
- assertEqualInt(1, pathmatch("*a*", "a/c", 0));
- assertEqualInt(1, pathmatch("*a*", "/a/c", 0));
- assertEqualInt(1, pathmatch("*a*", "defaaaaaaa", 0));
- assertEqualInt(0, pathmatch("a*", "defghi", 0));
- assertEqualInt(0, pathmatch("*a*", "defghi", 0));
- assertEqualInt(1, pathmatch("abc[def", "abc[def", 0));
- assertEqualInt(0, pathmatch("abc[def]", "abc[def", 0));
- assertEqualInt(0, pathmatch("abc[def", "abcd", 0));
- assertEqualInt(1, pathmatch("abc[def]", "abcd", 0));
- assertEqualInt(1, pathmatch("abc[def]", "abce", 0));
- assertEqualInt(1, pathmatch("abc[def]", "abcf", 0));
- assertEqualInt(0, pathmatch("abc[def]", "abcg", 0));
- assertEqualInt(1, pathmatch("abc[d*f]", "abcd", 0));
- assertEqualInt(1, pathmatch("abc[d*f]", "abc*", 0));
- assertEqualInt(0, pathmatch("abc[d*f]", "abcdefghi", 0));
- assertEqualInt(0, pathmatch("abc[d*", "abcdefghi", 0));
- assertEqualInt(1, pathmatch("abc[d*", "abc[defghi", 0));
- assertEqualInt(1, pathmatch("abc[d-f]", "abcd", 0));
- assertEqualInt(1, pathmatch("abc[d-f]", "abce", 0));
- assertEqualInt(1, pathmatch("abc[d-f]", "abcf", 0));
- assertEqualInt(0, pathmatch("abc[d-f]", "abcg", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-k]", "abcd", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-k]", "abce", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-k]", "abcf", 0));
- assertEqualInt(0, pathmatch("abc[d-fh-k]", "abcg", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-k]", "abch", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-k]", "abci", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-k]", "abcj", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-k]", "abck", 0));
- assertEqualInt(0, pathmatch("abc[d-fh-k]", "abcl", 0));
- assertEqualInt(0, pathmatch("abc[d-fh-k]", "abc-", 0));
-
- /* I assume: Trailing '-' is non-special. */
- assertEqualInt(0, pathmatch("abc[d-fh-]", "abcl", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-]", "abch", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-]", "abc-", 0));
- assertEqualInt(1, pathmatch("abc[d-fh-]", "abc-", 0));
-
- /* ']' can be backslash-quoted within a character class. */
- assertEqualInt(1, pathmatch("abc[\\]]", "abc]", 0));
- assertEqualInt(1, pathmatch("abc[\\]d]", "abc]", 0));
- assertEqualInt(1, pathmatch("abc[\\]d]", "abcd", 0));
- assertEqualInt(1, pathmatch("abc[d\\]]", "abc]", 0));
- assertEqualInt(1, pathmatch("abc[d\\]]", "abcd", 0));
- assertEqualInt(1, pathmatch("abc[d]e]", "abcde]", 0));
- assertEqualInt(1, pathmatch("abc[d\\]e]", "abc]", 0));
- assertEqualInt(0, pathmatch("abc[d\\]e]", "abcd]e", 0));
- assertEqualInt(0, pathmatch("abc[d]e]", "abc]", 0));
-
- /* backslash-quoted chars can appear as either end of a range. */
- assertEqualInt(1, pathmatch("abc[\\d-f]gh", "abcegh", 0));
- assertEqualInt(0, pathmatch("abc[\\d-f]gh", "abcggh", 0));
- assertEqualInt(0, pathmatch("abc[\\d-f]gh", "abc\\gh", 0));
- assertEqualInt(1, pathmatch("abc[d-\\f]gh", "abcegh", 0));
- assertEqualInt(1, pathmatch("abc[\\d-\\f]gh", "abcegh", 0));
- assertEqualInt(1, pathmatch("abc[\\d-\\f]gh", "abcegh", 0));
- /* backslash-quoted '-' isn't special. */
- assertEqualInt(0, pathmatch("abc[d\\-f]gh", "abcegh", 0));
- assertEqualInt(1, pathmatch("abc[d\\-f]gh", "abc-gh", 0));
-
- /* Leading '!' negates a character class. */
- assertEqualInt(0, pathmatch("abc[!d]", "abcd", 0));
- assertEqualInt(1, pathmatch("abc[!d]", "abce", 0));
- assertEqualInt(1, pathmatch("abc[!d]", "abcc", 0));
- assertEqualInt(0, pathmatch("abc[!d-z]", "abcq", 0));
- assertEqualInt(1, pathmatch("abc[!d-gi-z]", "abch", 0));
- assertEqualInt(1, pathmatch("abc[!fgijkl]", "abch", 0));
- assertEqualInt(0, pathmatch("abc[!fghijkl]", "abch", 0));
-
- /* Backslash quotes next character. */
- assertEqualInt(0, pathmatch("abc\\[def]", "abc\\d", 0));
- assertEqualInt(1, pathmatch("abc\\[def]", "abc[def]", 0));
- assertEqualInt(0, pathmatch("abc\\\\[def]", "abc[def]", 0));
- assertEqualInt(0, pathmatch("abc\\\\[def]", "abc\\[def]", 0));
- assertEqualInt(1, pathmatch("abc\\\\[def]", "abc\\d", 0));
-
- /*
- * Because '.' and '/' have special meanings, we can
- * identify many equivalent paths even if they're expressed
- * differently.
- */
- assertEqualInt(1, pathmatch("./abc/./def/", "abc/def/", 0));
- assertEqualInt(1, pathmatch("abc/def", "./././abc/./def", 0));
- assertEqualInt(1, pathmatch("abc/def/././//", "./././abc/./def/", 0));
- assertEqualInt(1, pathmatch(".////abc/.//def", "./././abc/./def", 0));
- assertEqualInt(1, pathmatch("./abc?def/", "abc/def/", 0));
- failure("\"?./\" is not the same as \"/./\"");
- assertEqualInt(0, pathmatch("./abc?./def/", "abc/def/", 0));
- failure("Trailing '/' should match no trailing '/'");
- assertEqualInt(1, pathmatch("./abc/./def/", "abc/def", 0));
- failure("Trailing '/./' is still the same directory.");
- assertEqualInt(1, pathmatch("./abc/./def/./", "abc/def", 0));
- failure("Trailing '/.' is still the same directory.");
- assertEqualInt(1, pathmatch("./abc/./def/.", "abc/def", 0));
- assertEqualInt(1, pathmatch("./abc/./def", "abc/def/", 0));
- failure("Trailing '/./' is still the same directory.");
- assertEqualInt(1, pathmatch("./abc/./def", "abc/def/./", 0));
- failure("Trailing '/.' is still the same directory.");
- assertEqualInt(1, pathmatch("./abc*/./def", "abc/def/.", 0));
-}
diff --git a/usr.bin/cpuset/Makefile b/usr.bin/cpuset/Makefile
deleted file mode 100644
index 85a5148..0000000
--- a/usr.bin/cpuset/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# $FreeBSD$
-
-PROG= cpuset
-WARNS?= 6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/cpuset/cpuset.1 b/usr.bin/cpuset/cpuset.1
deleted file mode 100644
index ba06e48..0000000
--- a/usr.bin/cpuset/cpuset.1
+++ /dev/null
@@ -1,175 +0,0 @@
-.\" Copyright (c) 2008 Christian Brueffer
-.\" Copyright (c) 2008 Jeffrey Roberson
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd March 11, 2008
-.Dt CPUSET 1
-.Os
-.Sh NAME
-.Nm cpuset
-.Nd "configure processor sets"
-.Sh SYNOPSIS
-.Nm
-.Op Fl l Ar cpu-list
-.Op Fl s Ar setid
-.Ar cmd
-.Nm
-.Op Fl l Ar cpu-list
-.Op Fl s Ar setid
-.Fl p Ar pid
-.Nm
-.Op Fl cr
-.Op Fl l Ar cpu-list
-.Op Fl p Ar pid | Fl r Ar tid | Fl s Ar setid
-.Nm
-.Op Fl cgir
-.Op Fl p Ar pid | Fl r Ar tid | Fl s Ar setid
-.Sh DESCRIPTION
-The
-.Nm
-command can be used to assign processor sets to processes, run commands
-constrained to a given set or list of processors, and query information
-about processor binding, sets, and available processors in the system.
-.Pp
-.Nm
-requires a target to modify or query.
-The target may be specified as a command, process id, thread id, or a
-cpuset id.
-Using
-.Fl g
-the target's set id or mask may be queried.
-Using
-.Fl l
-or
-.Fl s
-the target's CPU mask or set id may be set.
-If no target is specified,
-.Nm
-operates on itself.
-Not all combinations of operations and targets are supported.
-For example,
-you may not set the id of an existing set or query and launch a command
-at the same time.
-.Pp
-There are two sets applicable to each process and one private mask per thread.
-Every process in the system belongs to a cpuset.
-By default processes are started in set 1.
-The mask or id may be queried using
-.Fl c .
-Each thread also has a private mask of CPUs it is allowed to run
-on that must be a subset of the assigned set.
-And finally, there is a root set, numbered 0, that is immutable.
-This last set is the list of all possible CPUs in the system and is
-queried using
-.Fl r .
-.Pp
-When running a command it may join a set specified with
-.Fl s
-otherwise a new set is created.
-In addition, a mask for the command may be specified using
-.Fl l .
-When used in conjunction with
-.Fl c
-the mask modifies the supplied or created set rather than the private mask
-for the thread.
-.Pp
-The options are as follows:
-.Bl -tag -width ".Fl l Ar cpu-list"
-.It Fl c
-The requested operation should reference the cpuset available via the
-target specifier.
-.It Fl g
-Causes
-.Nm
-to print either a list of valid CPUs or, using
-.Fl i ,
-the id of the target.
-.It Fl i
-When used with the
-.Fl g
-option print the id rather than the valid mask of the target.
-.It Fl l Ar cpu-list
-Specifies a list of CPUs to apply to a target.
-Specification may include
-numbers separated by '-' for ranges and commas separating individual numbers.
-.It Fl p Ar pid
-Specifies a pid as the target of the operation.
-.It Fl s Ar setid
-Specifies a set id as the target of the operation.
-.It Fl r
-The requested operation should reference the root set available via the
-target specifier.
-.It Fl t Ar tid
-Specifies a thread id as the target of the operation.
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh EXAMPLES
-Create a new group with CPUs 0-4 inclusive and run
-.Pa /bin/sh
-on it:
-.Dl cpuset -c -l 0-4 /bin/sh
-.Pp
-Query the mask of CPUs the
-.Aq sh pid
-is allowed to run on:
-.Dl cpuset -g -p <sh pid>
-.Pp
-Restrict
-.Pa /bin/sh
-to run on CPUs 0 and 2 while its group is still allowed to run on
-CPUs 0-4:
-.Dl cpuset -l 0,2 -p <sh pid>
-.Pp
-Modify the cpuset
-.Pa /bin/sh
-belongs to restricting it to CPUs 0 and 2:
-.Dl cpuset -l 0,2 -c -p <sh pid>
-.Pp
-Modify the cpuset all threads are in by default to contain only
-the first 4 CPUs, leaving the rest idle:
-.Dl cpuset -l 0-3 -s 1
-.Pp
-Print the id of the cpuset
-.Pa /bin/sh
-is in:
-.Dl cpuset -g -i -p <sh pid>
-.Pp
-Move the
-.Ar pid
-into the specified cpuset
-.Ar setid
-so it may be managed with other pids in that set:
-.Dl cpuset -s <setid> -p <pid>
-.Sh SEE ALSO
-.Xr cpuset 2
-.Sh HISTORY
-The
-.Nm
-command first appeared in
-.Fx 7.1 .
-.Sh AUTHORS
-.An Jeffrey Roberson Aq jeff@FreeBSD.org
diff --git a/usr.bin/cpuset/cpuset.c b/usr.bin/cpuset/cpuset.c
deleted file mode 100644
index 5858a3d..0000000
--- a/usr.bin/cpuset/cpuset.c
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * Copyright (c) 2007, 2008 Jeffrey Roberson <jeff@freebsd.org>
- * All rights reserved.
- *
- * Copyright (c) 2008 Nokia Corporation
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/cpuset.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <string.h>
-
-int cflag;
-int gflag;
-int iflag;
-int lflag;
-int pflag;
-int rflag;
-int sflag;
-int tflag;
-int xflag;
-id_t id;
-cpulevel_t level;
-cpuwhich_t which;
-
-void usage(void);
-
-static void printset(cpuset_t *mask);
-
-static void
-parselist(char *list, cpuset_t *mask)
-{
- enum { NONE, NUM, DASH } state;
- int lastnum;
- int curnum;
- char *l;
-
- state = NONE;
- curnum = lastnum = 0;
- for (l = list; *l != '\0';) {
- if (isdigit(*l)) {
- curnum = atoi(l);
- if (curnum > CPU_SETSIZE)
- errx(EXIT_FAILURE,
- "Only %d cpus supported", CPU_SETSIZE);
- while (isdigit(*l))
- l++;
- switch (state) {
- case NONE:
- lastnum = curnum;
- state = NUM;
- break;
- case DASH:
- for (; lastnum <= curnum; lastnum++)
- CPU_SET(lastnum, mask);
- state = NONE;
- break;
- case NUM:
- default:
- goto parserr;
- }
- continue;
- }
- switch (*l) {
- case ',':
- switch (state) {
- case NONE:
- break;
- case NUM:
- CPU_SET(curnum, mask);
- state = NONE;
- break;
- case DASH:
- goto parserr;
- break;
- }
- break;
- case '-':
- if (state != NUM)
- goto parserr;
- state = DASH;
- break;
- default:
- goto parserr;
- }
- l++;
- }
- switch (state) {
- case NONE:
- break;
- case NUM:
- CPU_SET(curnum, mask);
- break;
- case DASH:
- goto parserr;
- }
- return;
-parserr:
- errx(EXIT_FAILURE, "Malformed cpu-list %s", list);
-}
-
-static void
-printset(cpuset_t *mask)
-{
- int once;
- int cpu;
-
- for (once = 0, cpu = 0; cpu < CPU_SETSIZE; cpu++) {
- if (CPU_ISSET(cpu, mask)) {
- if (once == 0) {
- printf("%d", cpu);
- once = 1;
- } else
- printf(", %d", cpu);
- }
- }
- printf("\n");
-}
-
-const char *whichnames[] = { NULL, "tid", "pid", "cpuset", "irq" };
-const char *levelnames[] = { NULL, " root", " cpuset", "" };
-
-static void
-printaffinity(void)
-{
- cpuset_t mask;
-
- if (cpuset_getaffinity(level, which, id, sizeof(mask), &mask) != 0)
- err(EXIT_FAILURE, "getaffinity");
- printf("%s %jd%s mask: ", whichnames[which], (intmax_t)id,
- levelnames[level]);
- printset(&mask);
- exit(EXIT_SUCCESS);
-}
-
-static void
-printsetid(void)
-{
- cpusetid_t setid;
-
- /*
- * Only LEVEL_WHICH && WHICH_CPUSET has a numbered id.
- */
- if (level == CPU_LEVEL_WHICH && !sflag)
- level = CPU_LEVEL_CPUSET;
- if (cpuset_getid(level, which, id, &setid))
- err(errno, "getid");
- printf("%s %jd%s id: %d\n", whichnames[which], (intmax_t)id,
- levelnames[level], setid);
-}
-
-int
-main(int argc, char *argv[])
-{
- cpusetid_t setid;
- cpuset_t mask;
- lwpid_t tid;
- pid_t pid;
- int ch;
-
- CPU_ZERO(&mask);
- level = CPU_LEVEL_WHICH;
- which = CPU_WHICH_PID;
- id = pid = tid = setid = -1;
- while ((ch = getopt(argc, argv, "cgil:p:rs:t:x:")) != -1) {
- switch (ch) {
- case 'c':
- if (rflag)
- usage();
- cflag = 1;
- level = CPU_LEVEL_CPUSET;
- break;
- case 'g':
- gflag = 1;
- break;
- case 'i':
- iflag = 1;
- break;
- case 'l':
- lflag = 1;
- parselist(optarg, &mask);
- break;
- case 'p':
- pflag = 1;
- which = CPU_WHICH_PID;
- id = pid = atoi(optarg);
- break;
- case 'r':
- if (cflag)
- usage();
- level = CPU_LEVEL_ROOT;
- rflag = 1;
- break;
- case 's':
- sflag = 1;
- which = CPU_WHICH_CPUSET;
- id = setid = atoi(optarg);
- break;
- case 't':
- tflag = 1;
- which = CPU_WHICH_TID;
- id = tid = atoi(optarg);
- break;
- case 'x':
- xflag = 1;
- which = CPU_WHICH_IRQ;
- id = atoi(optarg);
- break;
- default:
- usage();
- }
- }
- argc -= optind;
- argv += optind;
- if (gflag) {
- if (argc || lflag)
- usage();
- /* Only one identity specifier. */
- if (xflag + sflag + pflag + tflag > 1)
- usage();
- if (iflag)
- printsetid();
- else
- printaffinity();
- exit(EXIT_SUCCESS);
- }
- if (iflag)
- usage();
- /*
- * The user wants to run a command with a set and possibly cpumask.
- */
- if (argc) {
- if (pflag | rflag | tflag | xflag)
- usage();
- if (sflag) {
- if (cpuset_setid(CPU_WHICH_PID, -1, setid))
- err(argc, "setid");
- } else {
- if (cpuset(&setid))
- err(argc, "newid");
- }
- if (lflag) {
- if (cpuset_setaffinity(level, CPU_WHICH_PID,
- -1, sizeof(mask), &mask) != 0)
- err(EXIT_FAILURE, "setaffinity");
- }
- errno = 0;
- execvp(*argv, argv);
- err(errno == ENOENT ? 127 : 126, "%s", *argv);
- }
- /*
- * We're modifying something that presently exists.
- */
- if (!lflag && (cflag || rflag))
- usage();
- if (!lflag && !sflag)
- usage();
- /* You can only set a mask on a thread. */
- if (tflag && (sflag | pflag | xflag))
- usage();
- /* You can only set a mask on an irq. */
- if (xflag && (pflag | sflag | tflag))
- usage();
- if (pflag && sflag) {
- if (cpuset_setid(CPU_WHICH_PID, pid, setid))
- err(EXIT_FAILURE, "setid");
- /*
- * If the user specifies a set and a list we want the mask
- * to effect the pid and not the set.
- */
- which = CPU_WHICH_PID;
- id = pid;
- }
- if (lflag) {
- if (cpuset_setaffinity(level, which, id, sizeof(mask),
- &mask) != 0)
- err(EXIT_FAILURE, "setaffinity");
- }
-
- exit(EXIT_SUCCESS);
-}
-
-void
-usage(void)
-{
-
- fprintf(stderr,
- "usage: cpuset [-l cpu-list] [-s setid] cmd ...\n");
- fprintf(stderr,
- " cpuset [-l cpu-list] [-s setid] -p pid\n");
- fprintf(stderr,
- " cpuset [-cr] [-l cpu-list] [-p pid | -t tid | -s setid | -x irq]\n");
- fprintf(stderr,
- " cpuset [-cgir] [-p pid | -t tid | -s setid | -x irq]\n");
- exit(1);
-}
diff --git a/usr.bin/csplit/Makefile b/usr.bin/csplit/Makefile
deleted file mode 100644
index 3f370c7..0000000
--- a/usr.bin/csplit/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-PROG= csplit
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/csplit/csplit.1 b/usr.bin/csplit/csplit.1
deleted file mode 100644
index 8582887..0000000
--- a/usr.bin/csplit/csplit.1
+++ /dev/null
@@ -1,157 +0,0 @@
-.\" Copyright (c) 2002 Tim J. Robbins.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd January 26, 2005
-.Dt CSPLIT 1
-.Os
-.Sh NAME
-.Nm csplit
-.Nd split files based on context
-.Sh SYNOPSIS
-.Nm
-.Op Fl ks
-.Op Fl f Ar prefix
-.Op Fl n Ar number
-.Ar file args ...
-.Sh DESCRIPTION
-The
-.Nm
-utility splits
-.Ar file
-into pieces using the patterns
-.Ar args .
-If
-.Ar file
-is
-a dash
-.Pq Sq Fl ,
-.Nm
-reads from standard input.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl f Ar prefix
-Give created files names beginning with
-.Ar prefix .
-The default is
-.Dq Pa xx .
-.It Fl k
-Do not remove output files if an error occurs or a
-.Dv HUP ,
-.Dv INT
-or
-.Dv TERM
-signal is received.
-.It Fl n Ar number
-Use
-.Ar number
-of decimal digits after the
-.Ar prefix
-to form the file name.
-The default is 2.
-.It Fl s
-Do not write the size of each output file to standard output as it is
-created.
-.El
-.Pp
-The
-.Ar args
-operands may be a combination of the following patterns:
-.Bl -tag -width indent
-.It Xo
-.Sm off
-.Cm / Ar regexp Cm / Op Oo Cm + | - Oc Ar offset
-.Sm on
-.Xc
-Create a file containing the input from the current line to (but not including)
-the next line matching the given basic regular expression.
-An optional
-.Ar offset
-from the line that matched may be specified.
-.It Xo
-.Sm off
-.Cm % Ar regexp Cm % Op Oo Cm + | - Oc Ar offset
-.Sm on
-.Xc
-Same as above but a file is not created for the output.
-.It Ar line_no
-Create containing the input from the current line to (but not including)
-the specified line number.
-.It Cm { Ns Ar num Ns Cm }
-Repeat the previous pattern the specified number of times.
-If it follows a line number pattern, a new file will be created for each
-.Ar line_no
-lines,
-.Ar num
-times.
-The first line of the file is line number 1 for historic reasons.
-.El
-.Pp
-After all the patterns have been processed, the remaining input data
-(if there is any) will be written to a new file.
-.Pp
-Requesting to split at a line before the current line number or past the
-end of the file will result in an error.
-.Sh ENVIRONMENT
-The
-.Ev LANG , LC_ALL , LC_COLLATE
-and
-.Ev LC_CTYPE
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Sh EXIT STATUS
-.Ex -std
-.Sh EXAMPLES
-Split the
-.Xr mdoc 7
-file
-.Pa foo.1
-into one file for each section (up to 20):
-.Pp
-.Dl "csplit -k foo.1 '%^\e.Sh%' '/^\e.Sh/' '{20}'"
-.Pp
-Split standard input after the first 99 lines and every 100 lines thereafter:
-.Pp
-.Dl "csplit -k - 100 '{19}'"
-.Sh SEE ALSO
-.Xr sed 1 ,
-.Xr split 1 ,
-.Xr re_format 7
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-.Sh HISTORY
-A
-.Nm
-command appeared in PWB UNIX.
-.Sh BUGS
-Input lines are limited to
-.Dv LINE_MAX
-(2048) bytes in length.
diff --git a/usr.bin/csplit/csplit.c b/usr.bin/csplit/csplit.c
deleted file mode 100644
index 2dff81f..0000000
--- a/usr.bin/csplit/csplit.c
+++ /dev/null
@@ -1,467 +0,0 @@
-/*-
- * Copyright (c) 2002 Tim J. Robbins.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * csplit -- split files based on context
- *
- * This utility splits its input into numbered output files by line number
- * or by a regular expression. Regular expression matches have an optional
- * offset with them, allowing the split to occur a specified number of
- * lines before or after the match.
- *
- * To handle negative offsets, we stop reading when the match occurs and
- * store the offset that the file should have been split at, then use
- * this output file as input until all the "overflowed" lines have been read.
- * The file is then closed and truncated to the correct length.
- *
- * We assume that the output files can be seeked upon (ie. they cannot be
- * symlinks to named pipes or character devices), but make no such
- * assumption about the input.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <limits.h>
-#include <locale.h>
-#include <regex.h>
-#include <signal.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-void cleanup(void);
-void do_lineno(const char *);
-void do_rexp(const char *);
-char *getline(void);
-void handlesig(int);
-FILE *newfile(void);
-void toomuch(FILE *, long);
-void usage(void);
-
-/*
- * Command line options
- */
-const char *prefix; /* File name prefix */
-long sufflen; /* Number of decimal digits for suffix */
-int sflag; /* Suppress output of file names */
-int kflag; /* Keep output if error occurs */
-
-/*
- * Other miscellaneous globals (XXX too many)
- */
-long lineno; /* Current line number in input file */
-long reps; /* Number of repetitions for this pattern */
-long nfiles; /* Number of files output so far */
-long maxfiles; /* Maximum number of files we can create */
-char currfile[PATH_MAX]; /* Current output file */
-const char *infn; /* Name of the input file */
-FILE *infile; /* Input file handle */
-FILE *overfile; /* Overflow file for toomuch() */
-off_t truncofs; /* Offset this file should be truncated at */
-int doclean; /* Should cleanup() remove output? */
-
-int
-main(int argc, char *argv[])
-{
- struct sigaction sa;
- long i;
- int ch;
- const char *expr;
- char *ep, *p;
- FILE *ofp;
-
- setlocale(LC_ALL, "");
-
- kflag = sflag = 0;
- prefix = "xx";
- sufflen = 2;
- while ((ch = getopt(argc, argv, "ksf:n:")) > 0) {
- switch (ch) {
- case 'f':
- prefix = optarg;
- break;
- case 'k':
- kflag = 1;
- break;
- case 'n':
- errno = 0;
- sufflen = strtol(optarg, &ep, 10);
- if (sufflen <= 0 || *ep != '\0' || errno != 0)
- errx(1, "%s: bad suffix length", optarg);
- break;
- case 's':
- sflag = 1;
- break;
- default:
- usage();
- /*NOTREACHED*/
- }
- }
-
- if (sufflen + strlen(prefix) >= PATH_MAX)
- errx(1, "name too long");
-
- argc -= optind;
- argv += optind;
-
- if ((infn = *argv++) == NULL)
- usage();
- if (strcmp(infn, "-") == 0) {
- infile = stdin;
- infn = "stdin";
- } else if ((infile = fopen(infn, "r")) == NULL)
- err(1, "%s", infn);
-
- if (!kflag) {
- doclean = 1;
- atexit(cleanup);
- sa.sa_flags = 0;
- sa.sa_handler = handlesig;
- sigemptyset(&sa.sa_mask);
- sigaddset(&sa.sa_mask, SIGHUP);
- sigaddset(&sa.sa_mask, SIGINT);
- sigaddset(&sa.sa_mask, SIGTERM);
- sigaction(SIGHUP, &sa, NULL);
- sigaction(SIGINT, &sa, NULL);
- sigaction(SIGTERM, &sa, NULL);
- }
-
- lineno = 0;
- nfiles = 0;
- truncofs = 0;
- overfile = NULL;
-
- /* Ensure 10^sufflen < LONG_MAX. */
- for (maxfiles = 1, i = 0; i < sufflen; i++) {
- if (maxfiles > LONG_MAX / 10)
- errx(1, "%ld: suffix too long (limit %ld)",
- sufflen, i);
- maxfiles *= 10;
- }
-
- /* Create files based on supplied patterns. */
- while (nfiles < maxfiles - 1 && (expr = *argv++) != NULL) {
- /* Look ahead & see if this pattern has any repetitions. */
- if (*argv != NULL && **argv == '{') {
- errno = 0;
- reps = strtol(*argv + 1, &ep, 10);
- if (reps < 0 || *ep != '}' || errno != 0)
- errx(1, "%s: bad repetition count", *argv + 1);
- argv++;
- } else
- reps = 0;
-
- if (*expr == '/' || *expr == '%') {
- do
- do_rexp(expr);
- while (reps-- != 0 && nfiles < maxfiles - 1);
- } else if (isdigit((unsigned char)*expr))
- do_lineno(expr);
- else
- errx(1, "%s: unrecognised pattern", expr);
- }
-
- /* Copy the rest into a new file. */
- if (!feof(infile)) {
- ofp = newfile();
- while ((p = getline()) != NULL && fputs(p, ofp) == 0)
- ;
- if (!sflag)
- printf("%jd\n", (intmax_t)ftello(ofp));
- if (fclose(ofp) != 0)
- err(1, "%s", currfile);
- }
-
- toomuch(NULL, 0);
- doclean = 0;
-
- return (0);
-}
-
-void
-usage(void)
-{
-
- fprintf(stderr,
-"usage: csplit [-ks] [-f prefix] [-n number] file args ...\n");
- exit(1);
-}
-
-void
-handlesig(int sig __unused)
-{
- const char msg[] = "csplit: caught signal, cleaning up\n";
-
- write(STDERR_FILENO, msg, sizeof(msg) - 1);
- cleanup();
- _exit(2);
-}
-
-/* Create a new output file. */
-FILE *
-newfile(void)
-{
- FILE *fp;
-
- if ((size_t)snprintf(currfile, sizeof(currfile), "%s%0*ld", prefix,
- (int)sufflen, nfiles) >= sizeof(currfile))
- errc(1, ENAMETOOLONG, NULL);
- if ((fp = fopen(currfile, "w+")) == NULL)
- err(1, "%s", currfile);
- nfiles++;
-
- return (fp);
-}
-
-/* Remove partial output, called before exiting. */
-void
-cleanup(void)
-{
- char fnbuf[PATH_MAX];
- long i;
-
- if (!doclean)
- return;
-
- /*
- * NOTE: One cannot portably assume to be able to call snprintf()
- * from inside a signal handler. It does, however, appear to be safe
- * to do on FreeBSD. The solution to this problem is worse than the
- * problem itself.
- */
-
- for (i = 0; i < nfiles; i++) {
- snprintf(fnbuf, sizeof(fnbuf), "%s%0*ld", prefix,
- (int)sufflen, i);
- unlink(fnbuf);
- }
-}
-
-/* Read a line from the input into a static buffer. */
-char *
-getline(void)
-{
- static char lbuf[LINE_MAX];
- FILE *src;
-
- src = overfile != NULL ? overfile : infile;
-
-again: if (fgets(lbuf, sizeof(lbuf), src) == NULL) {
- if (src == overfile) {
- src = infile;
- goto again;
- }
- return (NULL);
- }
- if (ferror(src))
- err(1, "%s", infn);
- lineno++;
-
- return (lbuf);
-}
-
-/* Conceptually rewind the input (as obtained by getline()) back `n' lines. */
-void
-toomuch(FILE *ofp, long n)
-{
- char buf[BUFSIZ];
- size_t i, nread;
-
- if (overfile != NULL) {
- /*
- * Truncate the previous file we overflowed into back to
- * the correct length, close it.
- */
- if (fflush(overfile) != 0)
- err(1, "overflow");
- if (ftruncate(fileno(overfile), truncofs) != 0)
- err(1, "overflow");
- if (fclose(overfile) != 0)
- err(1, "overflow");
- overfile = NULL;
- }
-
- if (n == 0)
- /* Just tidying up */
- return;
-
- lineno -= n;
-
- /*
- * Wind the overflow file backwards to `n' lines before the
- * current one.
- */
- do {
- if (ftello(ofp) < (off_t)sizeof(buf))
- rewind(ofp);
- else
- fseeko(ofp, -(off_t)sizeof(buf), SEEK_CUR);
- if (ferror(ofp))
- errx(1, "%s: can't seek", currfile);
- if ((nread = fread(buf, 1, sizeof(buf), ofp)) == 0)
- errx(1, "can't read overflowed output");
- if (fseeko(ofp, -(off_t)nread, SEEK_CUR) != 0)
- err(1, "%s", currfile);
- for (i = 1; i <= nread; i++)
- if (buf[nread - i] == '\n' && n-- == 0)
- break;
- if (ftello(ofp) == 0)
- break;
- } while (n > 0);
- if (fseeko(ofp, nread - i + 1, SEEK_CUR) != 0)
- err(1, "%s", currfile);
-
- /*
- * getline() will read from here. Next call will truncate to
- * truncofs in this file.
- */
- overfile = ofp;
- truncofs = ftello(overfile);
-}
-
-/* Handle splits for /regexp/ and %regexp% patterns. */
-void
-do_rexp(const char *expr)
-{
- regex_t cre;
- intmax_t nwritten;
- long ofs;
- int first;
- char *ecopy, *ep, *p, *pofs, *re;
- FILE *ofp;
-
- if ((ecopy = strdup(expr)) == NULL)
- err(1, "strdup");
-
- re = ecopy + 1;
- if ((pofs = strrchr(ecopy, *expr)) == NULL || pofs[-1] == '\\')
- errx(1, "%s: missing trailing %c", expr, *expr);
- *pofs++ = '\0';
-
- if (*pofs != '\0') {
- errno = 0;
- ofs = strtol(pofs, &ep, 10);
- if (*ep != '\0' || errno != 0)
- errx(1, "%s: bad offset", pofs);
- } else
- ofs = 0;
-
- if (regcomp(&cre, re, REG_BASIC|REG_NOSUB) != 0)
- errx(1, "%s: bad regular expression", re);
-
- if (*expr == '/')
- /* /regexp/: Save results to a file. */
- ofp = newfile();
- else {
- /* %regexp%: Make a temporary file for overflow. */
- if ((ofp = tmpfile()) == NULL)
- err(1, "tmpfile");
- }
-
- /* Read and output lines until we get a match. */
- first = 1;
- while ((p = getline()) != NULL) {
- if (fputs(p, ofp) != 0)
- break;
- if (!first && regexec(&cre, p, 0, NULL, 0) == 0)
- break;
- first = 0;
- }
-
- if (p == NULL)
- errx(1, "%s: no match", re);
-
- if (ofs <= 0) {
- /*
- * Negative (or zero) offset: throw back any lines we should
- * not have read yet.
- */
- if (p != NULL) {
- toomuch(ofp, -ofs + 1);
- nwritten = (intmax_t)truncofs;
- } else
- nwritten = (intmax_t)ftello(ofp);
- } else {
- /*
- * Positive offset: copy the requested number of lines
- * after the match.
- */
- while (--ofs > 0 && (p = getline()) != NULL)
- fputs(p, ofp);
- toomuch(NULL, 0);
- nwritten = (intmax_t)ftello(ofp);
- if (fclose(ofp) != 0)
- err(1, "%s", currfile);
- }
-
- if (!sflag && *expr == '/')
- printf("%jd\n", nwritten);
-
- regfree(&cre);
- free(ecopy);
-}
-
-/* Handle splits based on line number. */
-void
-do_lineno(const char *expr)
-{
- long lastline, tgtline;
- char *ep, *p;
- FILE *ofp;
-
- errno = 0;
- tgtline = strtol(expr, &ep, 10);
- if (tgtline <= 0 || errno != 0 || *ep != '\0')
- errx(1, "%s: bad line number", expr);
- lastline = tgtline;
- if (lastline <= lineno)
- errx(1, "%s: can't go backwards", expr);
-
- while (nfiles < maxfiles - 1) {
- ofp = newfile();
- while (lineno + 1 != lastline) {
- if ((p = getline()) == NULL)
- errx(1, "%ld: out of range", lastline);
- if (fputs(p, ofp) != 0)
- break;
- }
- if (!sflag)
- printf("%jd\n", (intmax_t)ftello(ofp));
- if (fclose(ofp) != 0)
- err(1, "%s", currfile);
- if (reps-- == 0)
- break;
- lastline += tgtline;
- }
-}
diff --git a/usr.bin/csup/Makefile b/usr.bin/csup/Makefile
deleted file mode 100644
index b37e261..0000000
--- a/usr.bin/csup/Makefile
+++ /dev/null
@@ -1,36 +0,0 @@
-# $FreeBSD$
-
-.PATH: ${.CURDIR}/../../contrib/csup
-
-PROG= csup
-SRCS= attrstack.c \
- config.c \
- detailer.c \
- diff.c \
- fattr.c \
- fixups.c \
- fnmatch.c \
- globtree.c \
- idcache.c \
- keyword.c \
- lister.c \
- main.c \
- misc.c \
- mux.c \
- parse.y \
- pathcomp.c \
- proto.c \
- status.c \
- stream.c \
- threads.c \
- token.l \
- updater.c
-
-CFLAGS+= -I. -I${.CURDIR}/../../contrib/csup
-CFLAGS+= -DHAVE_FFLAGS -DNDEBUG
-WARNS?= 6
-
-DPADD= ${LIBCRYPTO} ${LIBZ} ${LIBPTHREAD}
-LDADD= -lcrypto -lz -lpthread
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ctags/C.c b/usr.bin/ctags/C.c
deleted file mode 100644
index a55895f..0000000
--- a/usr.bin/ctags/C.c
+++ /dev/null
@@ -1,536 +0,0 @@
-/*
- * Copyright (c) 1987, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)C.c 8.4 (Berkeley) 4/2/94";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <limits.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "ctags.h"
-
-static int func_entry(void);
-static void hash_entry(void);
-static void skip_string(int);
-static int str_entry(int);
-
-/*
- * c_entries --
- * read .c and .h files and call appropriate routines
- */
-void
-c_entries(void)
-{
- int c; /* current character */
- int level; /* brace level */
- int token; /* if reading a token */
- int t_def; /* if reading a typedef */
- int t_level; /* typedef's brace level */
- char *sp; /* buffer pointer */
- char tok[MAXTOKEN]; /* token buffer */
-
- lineftell = ftell(inf);
- sp = tok; token = t_def = NO; t_level = -1; level = 0; lineno = 1;
- while (GETC(!=, EOF)) {
- switch (c) {
- /*
- * Here's where it DOESN'T handle: {
- * foo(a)
- * {
- * #ifdef notdef
- * }
- * #endif
- * if (a)
- * puts("hello, world");
- * }
- */
- case '{':
- ++level;
- goto endtok;
- case '}':
- /*
- * if level goes below zero, try and fix
- * it, even though we've already messed up
- */
- if (--level < 0)
- level = 0;
- goto endtok;
-
- case '\n':
- SETLINE;
- /*
- * the above 3 cases are similar in that they
- * are special characters that also end tokens.
- */
- endtok: if (sp > tok) {
- *sp = EOS;
- token = YES;
- sp = tok;
- }
- else
- token = NO;
- continue;
-
- /*
- * We ignore quoted strings and character constants
- * completely.
- */
- case '"':
- case '\'':
- skip_string(c);
- break;
-
- /*
- * comments can be fun; note the state is unchanged after
- * return, in case we found:
- * "foo() XX comment XX { int bar; }"
- */
- case '/':
- if (GETC(==, '*') || c == '/') {
- skip_comment(c);
- continue;
- }
- (void)ungetc(c, inf);
- c = '/';
- goto storec;
-
- /* hash marks flag #define's. */
- case '#':
- if (sp == tok) {
- hash_entry();
- break;
- }
- goto storec;
-
- /*
- * if we have a current token, parenthesis on
- * level zero indicates a function.
- */
- case '(':
- if (!level && token) {
- int curline;
-
- if (sp != tok)
- *sp = EOS;
- /*
- * grab the line immediately, we may
- * already be wrong, for example,
- * foo\n
- * (arg1,
- */
- getline();
- curline = lineno;
- if (func_entry()) {
- ++level;
- pfnote(tok, curline);
- }
- break;
- }
- goto storec;
-
- /*
- * semi-colons indicate the end of a typedef; if we find a
- * typedef we search for the next semi-colon of the same
- * level as the typedef. Ignoring "structs", they are
- * tricky, since you can find:
- *
- * "typedef long time_t;"
- * "typedef unsigned int u_int;"
- * "typedef unsigned int u_int [10];"
- *
- * If looking at a typedef, we save a copy of the last token
- * found. Then, when we find the ';' we take the current
- * token if it starts with a valid token name, else we take
- * the one we saved. There's probably some reasonable
- * alternative to this...
- */
- case ';':
- if (t_def && level == t_level) {
- t_def = NO;
- getline();
- if (sp != tok)
- *sp = EOS;
- pfnote(tok, lineno);
- break;
- }
- goto storec;
-
- /*
- * store characters until one that can't be part of a token
- * comes along; check the current token against certain
- * reserved words.
- */
- default:
- /* ignore whitespace */
- if (c == ' ' || c == '\t') {
- int save = c;
- while (GETC(!=, EOF) && (c == ' ' || c == '\t'))
- ;
- if (c == EOF)
- return;
- (void)ungetc(c, inf);
- c = save;
- }
- storec: if (!intoken(c)) {
- if (sp == tok)
- break;
- *sp = EOS;
- if (tflag) {
- /* no typedefs inside typedefs */
- if (!t_def &&
- !memcmp(tok, "typedef",8)) {
- t_def = YES;
- t_level = level;
- break;
- }
- /* catch "typedef struct" */
- if ((!t_def || t_level < level)
- && (!memcmp(tok, "struct", 7)
- || !memcmp(tok, "union", 6)
- || !memcmp(tok, "enum", 5))) {
- /*
- * get line immediately;
- * may change before '{'
- */
- getline();
- if (str_entry(c))
- ++level;
- break;
- /* } */
- }
- }
- sp = tok;
- }
- else if (sp != tok || begtoken(c)) {
- if (sp == tok + sizeof tok - 1)
- /* Too long -- truncate it */
- *sp = EOS;
- else
- *sp++ = c;
- token = YES;
- }
- continue;
- }
-
- sp = tok;
- token = NO;
- }
-}
-
-/*
- * func_entry --
- * handle a function reference
- */
-static int
-func_entry(void)
-{
- int c; /* current character */
- int level = 0; /* for matching '()' */
-
- /*
- * Find the end of the assumed function declaration.
- * Note that ANSI C functions can have type definitions so keep
- * track of the parentheses nesting level.
- */
- while (GETC(!=, EOF)) {
- switch (c) {
- case '\'':
- case '"':
- /* skip strings and character constants */
- skip_string(c);
- break;
- case '/':
- /* skip comments */
- if (GETC(==, '*') || c == '/')
- skip_comment(c);
- break;
- case '(':
- level++;
- break;
- case ')':
- if (level == 0)
- goto fnd;
- level--;
- break;
- case '\n':
- SETLINE;
- }
- }
- return (NO);
-fnd:
- /*
- * we assume that the character after a function's right paren
- * is a token character if it's a function and a non-token
- * character if it's a declaration. Comments don't count...
- */
- for (;;) {
- while (GETC(!=, EOF) && iswhite(c))
- if (c == '\n')
- SETLINE;
- if (intoken(c) || c == '{')
- break;
- if (c == '/' && (GETC(==, '*') || c == '/'))
- skip_comment(c);
- else { /* don't ever "read" '/' */
- (void)ungetc(c, inf);
- return (NO);
- }
- }
- if (c != '{')
- (void)skip_key('{');
- return (YES);
-}
-
-/*
- * hash_entry --
- * handle a line starting with a '#'
- */
-static void
-hash_entry(void)
-{
- int c; /* character read */
- int curline; /* line started on */
- char *sp; /* buffer pointer */
- char tok[MAXTOKEN]; /* storage buffer */
-
- /* ignore leading whitespace */
- while (GETC(!=, EOF) && (c == ' ' || c == '\t'))
- ;
- (void)ungetc(c, inf);
-
- curline = lineno;
- for (sp = tok;;) { /* get next token */
- if (GETC(==, EOF))
- return;
- if (iswhite(c))
- break;
- if (sp == tok + sizeof tok - 1)
- /* Too long -- truncate it */
- *sp = EOS;
- else
- *sp++ = c;
- }
- *sp = EOS;
- if (memcmp(tok, "define", 6)) /* only interested in #define's */
- goto skip;
- for (;;) { /* this doesn't handle "#define \n" */
- if (GETC(==, EOF))
- return;
- if (!iswhite(c))
- break;
- }
- for (sp = tok;;) { /* get next token */
- if (sp == tok + sizeof tok - 1)
- /* Too long -- truncate it */
- *sp = EOS;
- else
- *sp++ = c;
- if (GETC(==, EOF))
- return;
- /*
- * this is where it DOESN'T handle
- * "#define \n"
- */
- if (!intoken(c))
- break;
- }
- *sp = EOS;
- if (dflag || c == '(') { /* only want macros */
- getline();
- pfnote(tok, curline);
- }
-skip: if (c == '\n') { /* get rid of rest of define */
- SETLINE
- if (*(sp - 1) != '\\')
- return;
- }
- (void)skip_key('\n');
-}
-
-/*
- * str_entry --
- * handle a struct, union or enum entry
- */
-static int
-str_entry(int c) /* c is current character */
-{
- int curline; /* line started on */
- char *sp; /* buffer pointer */
- char tok[LINE_MAX]; /* storage buffer */
-
- curline = lineno;
- while (iswhite(c))
- if (GETC(==, EOF))
- return (NO);
- if (c == '{') /* it was "struct {" */
- return (YES);
- for (sp = tok;;) { /* get next token */
- if (sp == tok + sizeof tok - 1)
- /* Too long -- truncate it */
- *sp = EOS;
- else
- *sp++ = c;
- if (GETC(==, EOF))
- return (NO);
- if (!intoken(c))
- break;
- }
- switch (c) {
- case '{': /* it was "struct foo{" */
- --sp;
- break;
- case '\n': /* it was "struct foo\n" */
- SETLINE;
- /*FALLTHROUGH*/
- default: /* probably "struct foo " */
- while (GETC(!=, EOF))
- if (!iswhite(c))
- break;
- if (c != '{') {
- (void)ungetc(c, inf);
- return (NO);
- }
- }
- *sp = EOS;
- pfnote(tok, curline);
- return (YES);
-}
-
-/*
- * skip_comment --
- * skip over comment
- */
-void
-skip_comment(int t) /* t is comment character */
-{
- int c; /* character read */
- int star; /* '*' flag */
-
- for (star = 0; GETC(!=, EOF);)
- switch(c) {
- /* comments don't nest, nor can they be escaped. */
- case '*':
- star = YES;
- break;
- case '/':
- if (star && t == '*')
- return;
- break;
- case '\n':
- if (t == '/')
- return;
- SETLINE;
- /*FALLTHROUGH*/
- default:
- star = NO;
- break;
- }
-}
-
-/*
- * skip_string --
- * skip to the end of a string or character constant.
- */
-void
-skip_string(int key)
-{
- int c,
- skip;
-
- for (skip = NO; GETC(!=, EOF); )
- switch (c) {
- case '\\': /* a backslash escapes anything */
- skip = !skip; /* we toggle in case it's "\\" */
- break;
- case '\n':
- SETLINE;
- /*FALLTHROUGH*/
- default:
- if (c == key && !skip)
- return;
- skip = NO;
- }
-}
-
-/*
- * skip_key --
- * skip to next char "key"
- */
-int
-skip_key(int key)
-{
- int c,
- skip,
- retval;
-
- for (skip = retval = NO; GETC(!=, EOF);)
- switch(c) {
- case '\\': /* a backslash escapes anything */
- skip = !skip; /* we toggle in case it's "\\" */
- break;
- case ';': /* special case for yacc; if one */
- case '|': /* of these chars occurs, we may */
- retval = YES; /* have moved out of the rule */
- break; /* not used by C */
- case '\'':
- case '"':
- /* skip strings and character constants */
- skip_string(c);
- break;
- case '/':
- /* skip comments */
- if (GETC(==, '*') || c == '/') {
- skip_comment(c);
- break;
- }
- (void)ungetc(c, inf);
- c = '/';
- goto norm;
- case '\n':
- SETLINE;
- /*FALLTHROUGH*/
- default:
- norm:
- if (c == key && !skip)
- return (retval);
- skip = NO;
- }
- return (retval);
-}
diff --git a/usr.bin/ctags/Makefile b/usr.bin/ctags/Makefile
deleted file mode 100644
index dc639af..0000000
--- a/usr.bin/ctags/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= ctags
-SRCS= C.c ctags.c fortran.c lisp.c print.c tree.c yacc.c
-CFLAGS+=-I${.CURDIR}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ctags/ctags.1 b/usr.bin/ctags/ctags.1
deleted file mode 100644
index d1f0d5a..0000000
--- a/usr.bin/ctags/ctags.1
+++ /dev/null
@@ -1,255 +0,0 @@
-.\" Copyright (c) 1987, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)ctags.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 6, 1993
-.Dt CTAGS 1
-.Os
-.Sh NAME
-.Nm ctags
-.Nd create a
-.Pa tags
-file
-.Sh SYNOPSIS
-.Nm
-.Op Fl BFTaduwvx
-.Op Fl f Ar tagsfile
-.Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility makes a
-.Pa tags
-file for
-.Xr ex 1
-from the specified C,
-Pascal, Fortran,
-.Xr yacc 1 ,
-.Xr lex 1 ,
-and Lisp sources.
-A tags file gives the locations of specified objects in a group of files.
-Each line of the tags file contains the object name, the file in which it
-is defined, and a search pattern for the object definition, separated by
-white-space.
-Using the
-.Pa tags
-file,
-.Xr ex 1
-can quickly locate these object definitions.
-Depending upon the options provided to
-.Nm ,
-objects will consist of subroutines, typedefs, defines, structs,
-enums and unions.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl B
-Use backward searching patterns
-.Pq Li ?...? .
-.It Fl F
-Use forward searching patterns
-.Pq Li /.../
-(the default).
-.It Fl T
-Do not create tags for typedefs, structs, unions, and enums.
-.It Fl a
-Append to
-.Pa tags
-file.
-.It Fl d
-Create tags for
-.Li #defines
-that do not take arguments;
-.Li #defines
-that take arguments are tagged automatically.
-.It Fl f
-Place the tag descriptions in a file called
-.Ar tagsfile .
-The default behaviour is to place them in a file called
-.Pa tags .
-.It Fl u
-Update the specified files in the
-.Pa tags
-file, that is, all
-references to them are deleted, and the new values are appended to the
-file.
-(Beware: this option is implemented in a way which is rather
-slow; it is usually faster to simply rebuild the
-.Pa tags
-file.)
-.It Fl v
-An index of the form expected by
-.Xr vgrind 1
-is produced on the standard output.
-This listing
-contains the object name, file name, and page number (assuming 64
-line pages).
-Since the output will be sorted into lexicographic order,
-it may be desired to run the output through
-.Xr sort 1 .
-Sample use:
-.Bd -literal -offset indent
-ctags -v files | sort -f > index
-vgrind -x index
-.Ed
-.It Fl w
-Suppress warning diagnostics.
-.It Fl x
-.Nm
-produces a list of object
-names, the line number and file name on which each is defined, as well
-as the text of that line and prints this on the standard output.
-This
-is a simple index which can be printed out as an off-line readable
-function index.
-.El
-.Pp
-Files whose names end in
-.Pa .c
-or
-.Pa .h
-are assumed to be C
-source files and are searched for C style routine and macro definitions.
-Files whose names end in
-.Pa .y
-are assumed to be
-.Xr yacc 1
-source files.
-Files whose names end in
-.Pa .l
-are assumed to be Lisp files if their
-first non-blank character is
-.Ql \&; ,
-.Ql \&( ,
-or
-.Ql \&[ ,
-otherwise, they are
-treated as
-.Xr lex 1
-files.
-Other files are first examined to see if they
-contain any Pascal or Fortran routine definitions, and, if not, are
-searched for C style definitions.
-.Pp
-The tag
-.Dq Li main
-is treated specially in C programs.
-The tag formed
-is created by prepending
-.Ql M
-to the name of the file, with the
-trailing
-.Pa .c
-and any leading pathname components removed.
-This makes use of
-.Nm
-practical in directories with more than one
-program.
-.Pp
-The
-.Xr yacc 1
-and
-.Xr lex 1
-files each have a special tag.
-.Dq Li yyparse
-is the start
-of the second section of the
-.Xr yacc 1
-file, and
-.Dq Li yylex
-is the start of
-the second section of the
-.Xr lex 1
-file.
-.Sh FILES
-.Bl -tag -width ".Pa tags" -compact
-.It Pa tags
-default output tags file
-.El
-.Sh EXIT STATUS
-The
-.Nm
-utility exits with a value of 1 if an error occurred, 0 otherwise.
-Duplicate objects are not considered errors.
-.Sh COMPATIBILITY
-The
-.Fl t
-option is a no-op for compatibility with previous versions of
-.Nm
-that did not create tags for typedefs, enums, structs and unions
-by default.
-.Sh SEE ALSO
-.Xr ex 1 ,
-.Xr vi 1
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-.Sh HISTORY
-The
-.Nm
-utility appeared in
-.Bx 3.0 .
-.Sh BUGS
-Recognition of functions, subroutines and procedures
-for Fortran and Pascal is done in a very simpleminded way.
-No attempt
-is made to deal with block structure; if you have two Pascal procedures
-in different blocks with the same name you lose.
-The
-.Nm
-utility does not
-understand about Pascal types.
-.Pp
-The method of deciding whether to look for C, Pascal or
-Fortran
-functions is a hack.
-.Pp
-The
-.Nm
-utility relies on the input being well formed, and any syntactical
-errors will completely confuse it.
-It also finds some legal syntax
-confusing; for example, since it does not understand
-.Li #ifdef Ns 's
-(incidentally, that is a feature, not a bug), any code with unbalanced
-braces inside
-.Li #ifdef Ns 's
-will cause it to become somewhat disoriented.
-In a similar fashion, multiple line changes within a definition will
-cause it to enter the last line of the object, rather than the first, as
-the searching pattern.
-The last line of multiple line
-.Li typedef Ns 's
-will similarly be noted.
diff --git a/usr.bin/ctags/ctags.c b/usr.bin/ctags/ctags.c
deleted file mode 100644
index eda4145..0000000
--- a/usr.bin/ctags/ctags.c
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Copyright (c) 1987, 1993, 1994, 1995
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1987, 1993, 1994, 1995\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)ctags.c 8.4 (Berkeley) 2/7/95";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <limits.h>
-#include <locale.h>
-#include <regex.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "ctags.h"
-
-/*
- * ctags: create a tags file
- */
-
-NODE *head; /* head of the sorted binary tree */
-
- /* boolean "func" (see init()) */
-bool _wht[256], _etk[256], _itk[256], _btk[256], _gd[256];
-
-FILE *inf; /* ioptr for current input file */
-FILE *outf; /* ioptr for tags file */
-
-long lineftell; /* ftell after getc( inf ) == '\n' */
-
-int lineno; /* line number of current line */
-int dflag; /* -d: non-macro defines */
-int tflag; /* -t: create tags for typedefs */
-int vflag; /* -v: vgrind style index output */
-int wflag; /* -w: suppress warnings */
-int xflag; /* -x: cxref style output */
-
-char *curfile; /* current input file name */
-char searchar = '/'; /* use /.../ searches by default */
-char lbuf[LINE_MAX];
-
-void init(void);
-void find_entries(char *);
-static void usage(void);
-
-int
-main(int argc, char **argv)
-{
- static const char *outfile = "tags"; /* output file */
- int aflag; /* -a: append to tags */
- int uflag; /* -u: update tags */
- int exit_val; /* exit value */
- int step; /* step through args */
- int ch; /* getopts char */
-
- setlocale(LC_ALL, "");
-
- aflag = uflag = NO;
- tflag = YES;
- while ((ch = getopt(argc, argv, "BFTadf:tuwvx")) != -1)
- switch(ch) {
- case 'B':
- searchar = '?';
- break;
- case 'F':
- searchar = '/';
- break;
- case 'T':
- tflag = NO;
- break;
- case 'a':
- aflag++;
- break;
- case 'd':
- dflag++;
- break;
- case 'f':
- outfile = optarg;
- break;
- case 't':
- tflag = YES;
- break;
- case 'u':
- uflag++;
- break;
- case 'w':
- wflag++;
- break;
- case 'v':
- vflag++;
- case 'x':
- xflag++;
- break;
- case '?':
- default:
- usage();
- }
- argv += optind;
- argc -= optind;
- if (!argc)
- usage();
-
- if (!xflag)
- setlocale(LC_COLLATE, "C");
-
- init();
-
- for (exit_val = step = 0; step < argc; ++step)
- if (!(inf = fopen(argv[step], "r"))) {
- warn("%s", argv[step]);
- exit_val = 1;
- }
- else {
- curfile = argv[step];
- find_entries(argv[step]);
- (void)fclose(inf);
- }
-
- if (head) {
- if (xflag)
- put_entries(head);
- else {
- if (uflag) {
- FILE *oldf;
- regex_t *regx;
-
- if ((oldf = fopen(outfile, "r")) == NULL)
- err(1, "opening %s", outfile);
- if (unlink(outfile))
- err(1, "unlinking %s", outfile);
- if ((outf = fopen(outfile, "w")) == NULL)
- err(1, "recreating %s", outfile);
- if ((regx = calloc(argc, sizeof(regex_t))) == NULL)
- err(1, "RE alloc");
- for (step = 0; step < argc; step++) {
- (void)strcpy(lbuf, "\t");
- (void)strlcat(lbuf, argv[step], LINE_MAX);
- (void)strlcat(lbuf, "\t", LINE_MAX);
- if (regcomp(regx + step, lbuf,
- REG_NOSPEC))
- warn("RE compilation failed");
- }
-nextline:
- while (fgets(lbuf, LINE_MAX, oldf)) {
- for (step = 0; step < argc; step++)
- if (regexec(regx + step,
- lbuf, 0, NULL, 0) == 0)
- goto nextline;
- fputs(lbuf, outf);
- }
- for (step = 0; step < argc; step++)
- regfree(regx + step);
- free(regx);
- fclose(oldf);
- fclose(outf);
- ++aflag;
- }
- if (!(outf = fopen(outfile, aflag ? "a" : "w")))
- err(1, "%s", outfile);
- put_entries(head);
- (void)fclose(outf);
- if (uflag) {
- pid_t pid;
-
- if ((pid = fork()) == -1)
- err(1, "fork failed");
- else if (pid == 0) {
- execlp("sort", "sort", "-o", outfile,
- outfile, NULL);
- err(1, "exec of sort failed");
- }
- /* Just assume the sort went OK. The old code
- did not do any checks either. */
- (void)wait(NULL);
- }
- }
- }
- exit(exit_val);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "usage: ctags [-BFTaduwvx] [-f tagsfile] file ...\n");
- exit(1);
-}
-
-/*
- * init --
- * this routine sets up the boolean pseudo-functions which work by
- * setting boolean flags dependent upon the corresponding character.
- * Every char which is NOT in that string is false with respect to
- * the pseudo-function. Therefore, all of the array "_wht" is NO
- * by default and then the elements subscripted by the chars in
- * CWHITE are set to YES. Thus, "_wht" of a char is YES if it is in
- * the string CWHITE, else NO.
- */
-void
-init(void)
-{
- int i;
- const char *sp;
-
- for (i = 0; i < 256; i++) {
- _wht[i] = _etk[i] = _itk[i] = _btk[i] = NO;
- _gd[i] = YES;
- }
-#define CWHITE " \f\t\n"
- for (sp = CWHITE; *sp; sp++) /* white space chars */
- _wht[*sp] = YES;
-#define CTOKEN " \t\n\"'#()[]{}=-+%*/&|^~!<>;,.:?"
- for (sp = CTOKEN; *sp; sp++) /* token ending chars */
- _etk[*sp] = YES;
-#define CINTOK "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz0123456789"
- for (sp = CINTOK; *sp; sp++) /* valid in-token chars */
- _itk[*sp] = YES;
-#define CBEGIN "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
- for (sp = CBEGIN; *sp; sp++) /* token starting chars */
- _btk[*sp] = YES;
-#define CNOTGD ",;"
- for (sp = CNOTGD; *sp; sp++) /* invalid after-function chars */
- _gd[*sp] = NO;
-}
-
-/*
- * find_entries --
- * this routine opens the specified file and calls the function
- * which searches the file.
- */
-void
-find_entries(char *file)
-{
- char *cp;
-
- lineno = 0; /* should be 1 ?? KB */
- if ((cp = strrchr(file, '.'))) {
- if (cp[1] == 'l' && !cp[2]) {
- int c;
-
- for (;;) {
- if (GETC(==, EOF))
- return;
- if (!iswhite(c)) {
- rewind(inf);
- break;
- }
- }
-#define LISPCHR ";(["
-/* lisp */ if (strchr(LISPCHR, c)) {
- l_entries();
- return;
- }
-/* lex */ else {
- /*
- * we search all 3 parts of a lex file
- * for C references. This may be wrong.
- */
- toss_yysec();
- (void)strcpy(lbuf, "%%$");
- pfnote("yylex", lineno);
- rewind(inf);
- }
- }
-/* yacc */ else if (cp[1] == 'y' && !cp[2]) {
- /*
- * we search only the 3rd part of a yacc file
- * for C references. This may be wrong.
- */
- toss_yysec();
- (void)strcpy(lbuf, "%%$");
- pfnote("yyparse", lineno);
- y_entries();
- }
-/* fortran */ else if ((cp[1] != 'c' && cp[1] != 'h') && !cp[2]) {
- if (PF_funcs())
- return;
- rewind(inf);
- }
- }
-/* C */ c_entries();
-}
diff --git a/usr.bin/ctags/ctags.h b/usr.bin/ctags/ctags.h
deleted file mode 100644
index ce4484f..0000000
--- a/usr.bin/ctags/ctags.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 1987, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ctags.h 8.3 (Berkeley) 4/2/94
- *
- * $FreeBSD$
- *
- */
-
-#define bool char
-
-#define YES 1
-#define NO 0
-#define EOS '\0'
-
-#define ENDLINE 50 /* max length of pattern */
-#define MAXTOKEN 250 /* max size of single token */
-
-#define SETLINE {++lineno;lineftell = ftell(inf);}
-#define GETC(op,exp) ((c = getc(inf)) op (int)exp)
-
-/*
- * These character classification macros assume that the (EOF & 0xff) element
- * of the arrays is always 'NO', as the EOF return from getc() gets masked
- * to that value. Masking with 0xff has no effect for normal characters
- * returned by getc() provided chars have 8 bits.
- */
-
-#define iswhite(arg) _wht[arg & 0xff] /* T if char is white */
-#define begtoken(arg) _btk[arg & 0xff] /* T if char can start token */
-#define intoken(arg) _itk[arg & 0xff] /* T if char can be in token */
-#define endtoken(arg) _etk[arg & 0xff] /* T if char ends tokens */
-#define isgood(arg) _gd[arg & 0xff] /* T if char can be after ')' */
-
-typedef struct nd_st { /* sorting structure */
- struct nd_st *left,
- *right; /* left and right sons */
- char *entry, /* function or type name */
- *file, /* file name */
- *pat; /* search pattern */
- int lno; /* for -x option */
- bool been_warned; /* set if noticed dup */
-} NODE;
-
-extern char *curfile; /* current input file name */
-extern NODE *head; /* head of the sorted binary tree */
-extern FILE *inf; /* ioptr for current input file */
-extern FILE *outf; /* ioptr for current output file */
-extern long lineftell; /* ftell after getc( inf ) == '\n' */
-extern int lineno; /* line number of current line */
-extern int dflag; /* -d: non-macro defines */
-extern int tflag; /* -t: create tags for typedefs */
-extern int vflag; /* -v: vgrind style index output */
-extern int wflag; /* -w: suppress warnings */
-extern int xflag; /* -x: cxref style output */
-extern bool _wht[], _etk[], _itk[], _btk[], _gd[];
-extern char lbuf[LINE_MAX];
-extern char *lbp;
-extern char searchar; /* ex search character */
-
-extern int cicmp(const char *);
-extern void getline(void);
-extern void pfnote(const char *, int);
-extern int skip_key(int);
-extern void put_entries(NODE *);
-extern void toss_yysec(void);
-extern void l_entries(void);
-extern void y_entries(void);
-extern int PF_funcs(void);
-extern void c_entries(void);
-extern void skip_comment(int);
diff --git a/usr.bin/ctags/fortran.c b/usr.bin/ctags/fortran.c
deleted file mode 100644
index 3761615..0000000
--- a/usr.bin/ctags/fortran.c
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (c) 1987, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)fortran.c 8.3 (Berkeley) 4/2/94";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <ctype.h>
-#include <limits.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "ctags.h"
-
-static void takeprec(void);
-
-char *lbp; /* line buffer pointer */
-
-int
-PF_funcs()
-{
- bool pfcnt; /* pascal/fortran functions found */
- char *cp;
- char tok[MAXTOKEN];
-
- for (pfcnt = NO;;) {
- lineftell = ftell(inf);
- if (!fgets(lbuf, sizeof(lbuf), inf))
- return (pfcnt);
- ++lineno;
- lbp = lbuf;
- if (*lbp == '%') /* Ratfor escape to fortran */
- ++lbp;
- for (; isspace(*lbp); ++lbp)
- continue;
- if (!*lbp)
- continue;
- switch (*lbp | ' ') { /* convert to lower-case */
- case 'c':
- if (cicmp("complex") || cicmp("character"))
- takeprec();
- break;
- case 'd':
- if (cicmp("double")) {
- for (; isspace(*lbp); ++lbp)
- continue;
- if (!*lbp)
- continue;
- if (cicmp("precision"))
- break;
- continue;
- }
- break;
- case 'i':
- if (cicmp("integer"))
- takeprec();
- break;
- case 'l':
- if (cicmp("logical"))
- takeprec();
- break;
- case 'r':
- if (cicmp("real"))
- takeprec();
- break;
- }
- for (; isspace(*lbp); ++lbp)
- continue;
- if (!*lbp)
- continue;
- switch (*lbp | ' ') {
- case 'f':
- if (cicmp("function"))
- break;
- continue;
- case 'p':
- if (cicmp("program") || cicmp("procedure"))
- break;
- continue;
- case 's':
- if (cicmp("subroutine"))
- break;
- default:
- continue;
- }
- for (; isspace(*lbp); ++lbp)
- continue;
- if (!*lbp)
- continue;
- for (cp = lbp + 1; *cp && intoken(*cp); ++cp)
- continue;
- if (cp == lbp + 1)
- continue;
- *cp = EOS;
- (void)strlcpy(tok, lbp, sizeof(tok)); /* possible trunc */
- getline(); /* process line for ex(1) */
- pfnote(tok, lineno);
- pfcnt = YES;
- }
- /*NOTREACHED*/
-}
-
-/*
- * cicmp --
- * do case-independent strcmp
- */
-int
-cicmp(const char *cp)
-{
- int len;
- char *bp;
-
- for (len = 0, bp = lbp; *cp && (*cp &~ ' ') == (*bp++ &~ ' ');
- ++cp, ++len)
- continue;
- if (!*cp) {
- lbp += len;
- return (YES);
- }
- return (NO);
-}
-
-static void
-takeprec(void)
-{
- for (; isspace(*lbp); ++lbp)
- continue;
- if (*lbp == '*') {
- for (++lbp; isspace(*lbp); ++lbp)
- continue;
- if (!isdigit(*lbp))
- --lbp; /* force failure */
- else
- while (isdigit(*++lbp))
- continue;
- }
-}
diff --git a/usr.bin/ctags/lisp.c b/usr.bin/ctags/lisp.c
deleted file mode 100644
index 3ac47df..0000000
--- a/usr.bin/ctags/lisp.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (c) 1987, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)lisp.c 8.3 (Berkeley) 4/2/94";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <ctype.h>
-#include <limits.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "ctags.h"
-
-/*
- * lisp tag functions
- * just look for (def or (DEF
- */
-void
-l_entries(void)
-{
- int special;
- char *cp;
- char savedc;
- char tok[MAXTOKEN];
-
- for (;;) {
- lineftell = ftell(inf);
- if (!fgets(lbuf, sizeof(lbuf), inf))
- return;
- ++lineno;
- lbp = lbuf;
- if (!cicmp("(def"))
- continue;
- special = NO;
- switch(*lbp | ' ') {
- case 'm':
- if (cicmp("method"))
- special = YES;
- break;
- case 'w':
- if (cicmp("wrapper") || cicmp("whopper"))
- special = YES;
- }
- for (; !isspace(*lbp); ++lbp)
- continue;
- for (; isspace(*lbp); ++lbp)
- continue;
- for (cp = lbp; *cp && *cp != '\n'; ++cp)
- continue;
- *cp = EOS;
- if (special) {
- if (!(cp = strchr(lbp, ')')))
- continue;
- for (; cp >= lbp && *cp != ':'; --cp)
- continue;
- if (cp < lbp)
- continue;
- lbp = cp;
- for (; *cp && *cp != ')' && *cp != ' '; ++cp)
- continue;
- }
- else
- for (cp = lbp + 1;
- *cp && *cp != '(' && *cp != ' '; ++cp)
- continue;
- savedc = *cp;
- *cp = EOS;
- (void)strlcpy(tok, lbp, sizeof(tok)); /* possible trunc */
- *cp = savedc;
- getline();
- pfnote(tok, lineno);
- }
- /*NOTREACHED*/
-}
diff --git a/usr.bin/ctags/print.c b/usr.bin/ctags/print.c
deleted file mode 100644
index a31ff93..0000000
--- a/usr.bin/ctags/print.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (c) 1987, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)print.c 8.3 (Berkeley) 4/2/94";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <limits.h>
-#include <stdio.h>
-#include <unistd.h>
-
-#include "ctags.h"
-
-/*
- * getline --
- * get the line the token of interest occurred on,
- * prepare it for printing.
- */
-void
-getline(void)
-{
- long saveftell;
- int c;
- int cnt;
- char *cp;
-
- saveftell = ftell(inf);
- (void)fseek(inf, lineftell, L_SET);
- if (xflag)
- for (cp = lbuf; GETC(!=, EOF) && c != '\n'; *cp++ = c)
- continue;
- /*
- * do all processing here, so we don't step through the
- * line more than once; means you don't call this routine
- * unless you're sure you've got a keeper.
- */
- else for (cnt = 0, cp = lbuf; GETC(!=, EOF) && cnt < ENDLINE; ++cnt) {
- if (c == '\\') { /* backslashes */
- if (cnt > ENDLINE - 2)
- break;
- *cp++ = '\\'; *cp++ = '\\';
- ++cnt;
- }
- else if (c == (int)searchar) { /* search character */
- if (cnt > ENDLINE - 2)
- break;
- *cp++ = '\\'; *cp++ = c;
- ++cnt;
- }
- else if (c == '\n') { /* end of keep */
- *cp++ = '$'; /* can find whole line */
- break;
- }
- else
- *cp++ = c;
- }
- *cp = EOS;
- (void)fseek(inf, saveftell, L_SET);
-}
-
-/*
- * put_entries --
- * write out the tags
- */
-void
-put_entries(NODE *node)
-{
-
- if (node->left)
- put_entries(node->left);
- if (vflag)
- printf("%s %s %d\n",
- node->entry, node->file, (node->lno + 63) / 64);
- else if (xflag)
- printf("%-16s %4d %-16s %s\n",
- node->entry, node->lno, node->file, node->pat);
- else
- fprintf(outf, "%s\t%s\t%c^%s%c\n",
- node->entry, node->file, searchar, node->pat, searchar);
- if (node->right)
- put_entries(node->right);
-}
diff --git a/usr.bin/ctags/test/ctags.test b/usr.bin/ctags/test/ctags.test
deleted file mode 100644
index 1f334ac..0000000
--- a/usr.bin/ctags/test/ctags.test
+++ /dev/null
@@ -1,67 +0,0 @@
-int bar = (1 + 5);
-
-FOO("here is a #define test: ) {");
-char sysent[20];
-int nsysent = sizeof (sysent) / sizeof (sysent[0]);
-/*
- * now is the time for a comment.
- * four lines in length...
- */struct struct_xtra{int list;};r4(x,y){};typedef struct{int bar;}struct_xxe;
-#define FOO BAR
-struct struct_three {
- int list;
-};
-#define SINGLE
-int BAD();
-enum color {red, green, gold, brown};
-char qq[] = " quote(one,two) {int bar;} ";
-typedef struct {
- int bar;
- struct struct_two {
- int foo;
- union union_3 {
- struct struct_three entry;
- char size[25];
- };
- struct last {
- struct struct_three xentry;
- char list[34];
- };
- };
-} struct_one;
-#define TWOLINE ((MAXLIST + FUTURE + 15) \
- / (time_to_live ? 3 : 4))
-#if (defined(BAR))
-int bar;
-#endif
-#define MULTIPLE {\
- multiple(one,two); \
- lineno++; \
- callroute(one,two); \
-}
-#if defined(BAR)
-int bar;
-#endif
-union union_one {
- struct struct_three s3;
- char foo[25];
-};
-#define XYZ(A,B) (A + B / 2) * (3 - 26 + l_lineno)
-routine1(one,two) /* comments here are fun... */
- struct {
- int entry;
- char bar[34];
- } *one;
- char two[10];
-{
-typedef unsigned char u_char;
- register struct buf *bp;
- five(one,two);
-}
- routine2 (one,two) { puts("hello\n"); }
- routine3
-(one,
-two) { puts("world\n"); }
-routine4(int one, char (*two)(void)) /* test ANSI arguments */
-{
-}
diff --git a/usr.bin/ctags/tree.c b/usr.bin/ctags/tree.c
deleted file mode 100644
index bd65c5a..0000000
--- a/usr.bin/ctags/tree.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (c) 1987, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)tree.c 8.3 (Berkeley) 4/2/94";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "ctags.h"
-
-static void add_node(NODE *, NODE *);
-static void free_tree(NODE *);
-
-/*
- * pfnote --
- * enter a new node in the tree
- */
-void
-pfnote(const char *name, int ln)
-{
- NODE *np;
- char *fp;
- char nbuf[MAXTOKEN];
-
- /*NOSTRICT*/
- if (!(np = (NODE *)malloc(sizeof(NODE)))) {
- warnx("too many entries to sort");
- put_entries(head);
- free_tree(head);
- /*NOSTRICT*/
- if (!(head = np = (NODE *)malloc(sizeof(NODE))))
- errx(1, "out of space");
- }
- if (!xflag && !strcmp(name, "main")) {
- if (!(fp = strrchr(curfile, '/')))
- fp = curfile;
- else
- ++fp;
- (void)snprintf(nbuf, sizeof(nbuf), "M%s", fp);
- fp = strrchr(nbuf, '.');
- if (fp && !fp[2])
- *fp = EOS;
- name = nbuf;
- }
- if (!(np->entry = strdup(name)))
- err(1, NULL);
- np->file = curfile;
- np->lno = ln;
- np->left = np->right = 0;
- if (!(np->pat = strdup(lbuf)))
- err(1, NULL);
- if (!head)
- head = np;
- else
- add_node(np, head);
-}
-
-static void
-add_node(NODE *node, NODE *cur_node)
-{
- int dif;
-
- dif = strcoll(node->entry, cur_node->entry);
- if (!dif) {
- if (node->file == cur_node->file) {
- if (!wflag)
- fprintf(stderr, "Duplicate entry in file %s, line %d: %s\nSecond entry ignored\n", node->file, lineno, node->entry);
- return;
- }
- if (!cur_node->been_warned)
- if (!wflag)
- fprintf(stderr, "Duplicate entry in files %s and %s: %s (Warning only)\n", node->file, cur_node->file, node->entry);
- cur_node->been_warned = YES;
- }
- else if (dif < 0)
- if (cur_node->left)
- add_node(node, cur_node->left);
- else
- cur_node->left = node;
- else if (cur_node->right)
- add_node(node, cur_node->right);
- else
- cur_node->right = node;
-}
-
-static void
-free_tree(NODE *node)
-{
- NODE *node_next;
- while (node) {
- if (node->right)
- free_tree(node->right);
- node_next = node->left;
- free(node);
- node = node_next;
- }
-}
diff --git a/usr.bin/ctags/yacc.c b/usr.bin/ctags/yacc.c
deleted file mode 100644
index e0e0dab..0000000
--- a/usr.bin/ctags/yacc.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (c) 1987, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)yacc.c 8.3 (Berkeley) 4/2/94";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <ctype.h>
-#include <limits.h>
-#include <stdio.h>
-
-#include "ctags.h"
-
-/*
- * y_entries:
- * find the yacc tags and put them in.
- */
-void
-y_entries(void)
-{
- int c;
- char *sp;
- bool in_rule;
- char tok[MAXTOKEN];
-
- in_rule = NO;
-
- while (GETC(!=, EOF))
- switch (c) {
- case '\n':
- SETLINE;
- /* FALLTHROUGH */
- case ' ':
- case '\f':
- case '\r':
- case '\t':
- break;
- case '{':
- if (skip_key('}'))
- in_rule = NO;
- break;
- case '\'':
- case '"':
- if (skip_key(c))
- in_rule = NO;
- break;
- case '%':
- if (GETC(==, '%'))
- return;
- (void)ungetc(c, inf);
- break;
- case '/':
- if (GETC(==, '*') || c == '/')
- skip_comment(c);
- else
- (void)ungetc(c, inf);
- break;
- case '|':
- case ';':
- in_rule = NO;
- break;
- default:
- if (in_rule || (!isalpha(c) && c != '.' && c != '_'))
- break;
- sp = tok;
- *sp++ = c;
- while (GETC(!=, EOF) && (intoken(c) || c == '.'))
- *sp++ = c;
- *sp = EOS;
- getline(); /* may change before ':' */
- while (iswhite(c)) {
- if (c == '\n')
- SETLINE;
- if (GETC(==, EOF))
- return;
- }
- if (c == ':') {
- pfnote(tok, lineno);
- in_rule = YES;
- }
- else
- (void)ungetc(c, inf);
- }
-}
-
-/*
- * toss_yysec --
- * throw away lines up to the next "\n%%\n"
- */
-void
-toss_yysec(void)
-{
- int c; /* read character */
- int state;
-
- /*
- * state == 0 : waiting
- * state == 1 : received a newline
- * state == 2 : received first %
- * state == 3 : received second %
- */
- lineftell = ftell(inf);
- for (state = 0; GETC(!=, EOF);)
- switch (c) {
- case '\n':
- ++lineno;
- lineftell = ftell(inf);
- if (state == 3) /* done! */
- return;
- state = 1; /* start over */
- break;
- case '%':
- if (state) /* if 1 or 2 */
- ++state; /* goto 3 */
- break;
- default:
- state = 0; /* reset */
- break;
- }
-}
diff --git a/usr.bin/cut/Makefile b/usr.bin/cut/Makefile
deleted file mode 100644
index 5be029a..0000000
--- a/usr.bin/cut/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= cut
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/cut/cut.1 b/usr.bin/cut/cut.1
deleted file mode 100644
index a6ebddd..0000000
--- a/usr.bin/cut/cut.1
+++ /dev/null
@@ -1,164 +0,0 @@
-.\" Copyright (c) 1989, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)cut.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd December 21, 2006
-.Dt CUT 1
-.Os
-.Sh NAME
-.Nm cut
-.Nd cut out selected portions of each line of a file
-.Sh SYNOPSIS
-.Nm
-.Fl b Ar list
-.Op Fl n
-.Op Ar
-.Nm
-.Fl c Ar list
-.Op Ar
-.Nm
-.Fl f Ar list
-.Op Fl d Ar delim
-.Op Fl s
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility cuts out selected portions of each line (as specified by
-.Ar list )
-from each
-.Ar file
-and writes them to the standard output.
-If no
-.Ar file
-arguments are specified, or a file argument is a single dash
-.Pq Sq Fl ,
-.Nm
-reads from the standard input.
-The items specified by
-.Ar list
-can be in terms of column position or in terms of fields delimited
-by a special character.
-Column numbering starts from 1.
-.Pp
-The
-.Ar list
-option argument
-is a comma or whitespace separated set of increasing numbers and/or
-number ranges.
-Number ranges consist of a number, a dash
-.Pq Sq \- ,
-and a second number
-and select the fields or columns from the first number to the second,
-inclusive.
-Numbers or number ranges may be preceded by a dash, which selects all
-fields or columns from 1 to the last number.
-Numbers or number ranges may be followed by a dash, which selects all
-fields or columns from the last number to the end of the line.
-Numbers and number ranges may be repeated, overlapping, and in any order.
-It is not an error to select fields or columns not present in the
-input line.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl b Ar list
-The
-.Ar list
-specifies byte positions.
-.It Fl c Ar list
-The
-.Ar list
-specifies character positions.
-.It Fl d Ar delim
-Use
-.Ar delim
-as the field delimiter character instead of the tab character.
-.It Fl f Ar list
-The
-.Ar list
-specifies fields, separated in the input by the field delimiter character
-(see the
-.Fl d
-option.)
-Output fields are separated by a single occurrence of the field delimiter
-character.
-.It Fl n
-Do not split multi-byte characters.
-Characters will only be output if at least one byte is selected, and,
-after a prefix of zero or more unselected bytes, the rest of the bytes
-that form the character are selected.
-.It Fl s
-Suppress lines with no field delimiter characters.
-Unless specified, lines with no delimiters are passed through unmodified.
-.El
-.Sh ENVIRONMENT
-The
-.Ev LANG , LC_ALL
-and
-.Ev LC_CTYPE
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Sh EXIT STATUS
-.Ex -std
-.Sh EXAMPLES
-Extract users' login names and shells from the system
-.Xr passwd 5
-file as
-.Dq name:shell
-pairs:
-.Pp
-.Dl "cut -d : -f 1,7 /etc/passwd"
-.Pp
-Show the names and login times of the currently logged in users:
-.Pp
-.Dl "who | cut -c 1-16,26-38"
-.Sh SEE ALSO
-.Xr colrm 1 ,
-.Xr paste 1
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.2-92 .
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.Tn AT&T
-System III
-.Ux .
diff --git a/usr.bin/cut/cut.c b/usr.bin/cut/cut.c
deleted file mode 100644
index a370e60..0000000
--- a/usr.bin/cut/cut.c
+++ /dev/null
@@ -1,461 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam S. Moskowitz of Menlo Consulting and Marciano Pitargue.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1989, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-static const char sccsid[] = "@(#)cut.c 8.3 (Berkeley) 5/4/95";
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <limits.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-
-int bflag;
-int cflag;
-wchar_t dchar;
-char dcharmb[MB_LEN_MAX + 1];
-int dflag;
-int fflag;
-int nflag;
-int sflag;
-
-size_t autostart, autostop, maxval;
-char * positions;
-
-int b_cut(FILE *, const char *);
-int b_n_cut(FILE *, const char *);
-int c_cut(FILE *, const char *);
-int f_cut(FILE *, const char *);
-void get_list(char *);
-void needpos(size_t);
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- FILE *fp;
- int (*fcn)(FILE *, const char *);
- int ch, rval;
- size_t n;
-
- setlocale(LC_ALL, "");
-
- fcn = NULL;
- dchar = '\t'; /* default delimiter is \t */
- strcpy(dcharmb, "\t");
-
- while ((ch = getopt(argc, argv, "b:c:d:f:sn")) != -1)
- switch(ch) {
- case 'b':
- get_list(optarg);
- bflag = 1;
- break;
- case 'c':
- get_list(optarg);
- cflag = 1;
- break;
- case 'd':
- n = mbrtowc(&dchar, optarg, MB_LEN_MAX, NULL);
- if (dchar == '\0' || n != strlen(optarg))
- errx(1, "bad delimiter");
- strcpy(dcharmb, optarg);
- dflag = 1;
- break;
- case 'f':
- get_list(optarg);
- fflag = 1;
- break;
- case 's':
- sflag = 1;
- break;
- case 'n':
- nflag = 1;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (fflag) {
- if (bflag || cflag || nflag)
- usage();
- } else if (!(bflag || cflag) || dflag || sflag)
- usage();
- else if (!bflag && nflag)
- usage();
-
- if (fflag)
- fcn = f_cut;
- else if (cflag)
- fcn = MB_CUR_MAX > 1 ? c_cut : b_cut;
- else if (bflag)
- fcn = nflag && MB_CUR_MAX > 1 ? b_n_cut : b_cut;
-
- rval = 0;
- if (*argv)
- for (; *argv; ++argv) {
- if (strcmp(*argv, "-") == 0)
- rval |= fcn(stdin, "stdin");
- else {
- if (!(fp = fopen(*argv, "r"))) {
- warn("%s", *argv);
- rval = 1;
- continue;
- }
- fcn(fp, *argv);
- (void)fclose(fp);
- }
- }
- else
- rval = fcn(stdin, "stdin");
- exit(rval);
-}
-
-void
-get_list(char *list)
-{
- size_t setautostart, start, stop;
- char *pos;
- char *p;
-
- /*
- * set a byte in the positions array to indicate if a field or
- * column is to be selected; use +1, it's 1-based, not 0-based.
- * Numbers and number ranges may be overlapping, repeated, and in
- * any order. We handle "-3-5" although there's no real reason too.
- */
- for (; (p = strsep(&list, ", \t")) != NULL;) {
- setautostart = start = stop = 0;
- if (*p == '-') {
- ++p;
- setautostart = 1;
- }
- if (isdigit((unsigned char)*p)) {
- start = stop = strtol(p, &p, 10);
- if (setautostart && start > autostart)
- autostart = start;
- }
- if (*p == '-') {
- if (isdigit((unsigned char)p[1]))
- stop = strtol(p + 1, &p, 10);
- if (*p == '-') {
- ++p;
- if (!autostop || autostop > stop)
- autostop = stop;
- }
- }
- if (*p)
- errx(1, "[-cf] list: illegal list value");
- if (!stop || !start)
- errx(1, "[-cf] list: values may not include zero");
- if (maxval < stop) {
- maxval = stop;
- needpos(maxval + 1);
- }
- for (pos = positions + start; start++ <= stop; *pos++ = 1);
- }
-
- /* overlapping ranges */
- if (autostop && maxval > autostop) {
- maxval = autostop;
- needpos(maxval + 1);
- }
-
- /* set autostart */
- if (autostart)
- memset(positions + 1, '1', autostart);
-}
-
-void
-needpos(size_t n)
-{
- static size_t npos;
- size_t oldnpos;
-
- /* Grow the positions array to at least the specified size. */
- if (n > npos) {
- oldnpos = npos;
- if (npos == 0)
- npos = n;
- while (n > npos)
- npos *= 2;
- if ((positions = realloc(positions, npos)) == NULL)
- err(1, "realloc");
- memset((char *)positions + oldnpos, 0, npos - oldnpos);
- }
-}
-
-int
-b_cut(FILE *fp, const char *fname __unused)
-{
- int ch, col;
- char *pos;
-
- ch = 0;
- for (;;) {
- pos = positions + 1;
- for (col = maxval; col; --col) {
- if ((ch = getc(fp)) == EOF)
- return (0);
- if (ch == '\n')
- break;
- if (*pos++)
- (void)putchar(ch);
- }
- if (ch != '\n') {
- if (autostop)
- while ((ch = getc(fp)) != EOF && ch != '\n')
- (void)putchar(ch);
- else
- while ((ch = getc(fp)) != EOF && ch != '\n');
- }
- (void)putchar('\n');
- }
- return (0);
-}
-
-/*
- * Cut based on byte positions, taking care not to split multibyte characters.
- * Although this function also handles the case where -n is not specified,
- * b_cut() ought to be much faster.
- */
-int
-b_n_cut(FILE *fp, const char *fname)
-{
- size_t col, i, lbuflen;
- char *lbuf;
- int canwrite, clen, warned;
- mbstate_t mbs;
-
- memset(&mbs, 0, sizeof(mbs));
- warned = 0;
- while ((lbuf = fgetln(fp, &lbuflen)) != NULL) {
- for (col = 0; lbuflen > 0; col += clen) {
- if ((clen = mbrlen(lbuf, lbuflen, &mbs)) < 0) {
- if (!warned) {
- warn("%s", fname);
- warned = 1;
- }
- memset(&mbs, 0, sizeof(mbs));
- clen = 1;
- }
- if (clen == 0 || *lbuf == '\n')
- break;
- if (col < maxval && !positions[1 + col]) {
- /*
- * Print the character if (1) after an initial
- * segment of un-selected bytes, the rest of
- * it is selected, and (2) the last byte is
- * selected.
- */
- i = col;
- while (i < col + clen && i < maxval &&
- !positions[1 + i])
- i++;
- canwrite = i < col + clen;
- for (; i < col + clen && i < maxval; i++)
- canwrite &= positions[1 + i];
- if (canwrite)
- fwrite(lbuf, 1, clen, stdout);
- } else {
- /*
- * Print the character if all of it has
- * been selected.
- */
- canwrite = 1;
- for (i = col; i < col + clen; i++)
- if ((i >= maxval && !autostop) ||
- (i < maxval && !positions[1 + i])) {
- canwrite = 0;
- break;
- }
- if (canwrite)
- fwrite(lbuf, 1, clen, stdout);
- }
- lbuf += clen;
- lbuflen -= clen;
- }
- if (lbuflen > 0)
- putchar('\n');
- }
- return (warned);
-}
-
-int
-c_cut(FILE *fp, const char *fname)
-{
- wint_t ch;
- int col;
- char *pos;
-
- ch = 0;
- for (;;) {
- pos = positions + 1;
- for (col = maxval; col; --col) {
- if ((ch = getwc(fp)) == WEOF)
- goto out;
- if (ch == '\n')
- break;
- if (*pos++)
- (void)putwchar(ch);
- }
- if (ch != '\n') {
- if (autostop)
- while ((ch = getwc(fp)) != WEOF && ch != '\n')
- (void)putwchar(ch);
- else
- while ((ch = getwc(fp)) != WEOF && ch != '\n');
- }
- (void)putwchar('\n');
- }
-out:
- if (ferror(fp)) {
- warn("%s", fname);
- return (1);
- }
- return (0);
-}
-
-int
-f_cut(FILE *fp, const char *fname)
-{
- wchar_t ch;
- int field, i, isdelim;
- char *pos, *p;
- wchar_t sep;
- int output;
- char *lbuf, *mlbuf;
- size_t clen, lbuflen, reallen;
-
- mlbuf = NULL;
- for (sep = dchar; (lbuf = fgetln(fp, &lbuflen)) != NULL;) {
- reallen = lbuflen;
- /* Assert EOL has a newline. */
- if (*(lbuf + lbuflen - 1) != '\n') {
- /* Can't have > 1 line with no trailing newline. */
- mlbuf = malloc(lbuflen + 1);
- if (mlbuf == NULL)
- err(1, "malloc");
- memcpy(mlbuf, lbuf, lbuflen);
- *(mlbuf + lbuflen) = '\n';
- lbuf = mlbuf;
- reallen++;
- }
- output = 0;
- for (isdelim = 0, p = lbuf;; p += clen) {
- clen = mbrtowc(&ch, p, lbuf + reallen - p, NULL);
- if (clen == (size_t)-1 || clen == (size_t)-2) {
- warnc(EILSEQ, "%s", fname);
- free(mlbuf);
- return (1);
- }
- if (clen == 0)
- clen = 1;
- /* this should work if newline is delimiter */
- if (ch == sep)
- isdelim = 1;
- if (ch == '\n') {
- if (!isdelim && !sflag)
- (void)fwrite(lbuf, lbuflen, 1, stdout);
- break;
- }
- }
- if (!isdelim)
- continue;
-
- pos = positions + 1;
- for (field = maxval, p = lbuf; field; --field, ++pos) {
- if (*pos && output++)
- for (i = 0; dcharmb[i] != '\0'; i++)
- putchar(dcharmb[i]);
- for (;;) {
- clen = mbrtowc(&ch, p, lbuf + reallen - p,
- NULL);
- if (clen == (size_t)-1 || clen == (size_t)-2) {
- warnc(EILSEQ, "%s", fname);
- free(mlbuf);
- return (1);
- }
- if (clen == 0)
- clen = 1;
- p += clen;
- if (ch == '\n' || ch == sep)
- break;
- if (*pos)
- for (i = 0; i < (int)clen; i++)
- putchar(p[i - clen]);
- }
- if (ch == '\n')
- break;
- }
- if (ch != '\n') {
- if (autostop) {
- if (output)
- for (i = 0; dcharmb[i] != '\0'; i++)
- putchar(dcharmb[i]);
- for (; (ch = *p) != '\n'; ++p)
- (void)putchar(ch);
- } else
- for (; (ch = *p) != '\n'; ++p);
- }
- (void)putchar('\n');
- }
- free(mlbuf);
- return (0);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "%s\n%s\n%s\n",
- "usage: cut -b list [-n] [file ...]",
- " cut -c list [file ...]",
- " cut -f list [-s] [-d delim] [file ...]");
- exit(1);
-}
diff --git a/usr.bin/dig/Makefile b/usr.bin/dig/Makefile
deleted file mode 100644
index 4ac3e64..0000000
--- a/usr.bin/dig/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-# $FreeBSD$
-
-BIND_DIR= ${.CURDIR}/../../contrib/bind9
-LIB_BIND_REL= ../../lib/bind
-LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
-SRCDIR= ${BIND_DIR}/bin/dig
-
-.include "${LIB_BIND_DIR}/config.mk"
-
-PROG= dig
-
-.PATH: ${SRCDIR}
-SRCS+= dig.c dighost.c
-
-CFLAGS+= -I${SRCDIR}/include
-CFLAGS+= -I${BIND_DIR}/lib/isc/${ISC_ATOMIC_ARCH}/include
-
-DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
-LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/dirname/Makefile b/usr.bin/dirname/Makefile
deleted file mode 100644
index 7703897..0000000
--- a/usr.bin/dirname/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= dirname
-NO_MAN=
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/dirname/dirname.c b/usr.bin/dirname/dirname.c
deleted file mode 100644
index 3018f2f..0000000
--- a/usr.bin/dirname/dirname.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1991, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static const char sccsid[] = "@(#)dirname.c 8.4 (Berkeley) 5/4/95";
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <libgen.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-void usage(void);
-
-int
-main(int argc, char **argv)
-{
- char *p;
- int ch;
-
- while ((ch = getopt(argc, argv, "")) != -1)
- switch(ch) {
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (argc != 1)
- usage();
-
- if ((p = dirname(*argv)) == NULL)
- err(1, "%s", *argv);
- (void)printf("%s\n", p);
- exit(0);
-}
-
-void
-usage(void)
-{
-
- (void)fprintf(stderr, "usage: dirname string\n");
- exit(1);
-}
diff --git a/usr.bin/du/Makefile b/usr.bin/du/Makefile
deleted file mode 100644
index 12e80b9..0000000
--- a/usr.bin/du/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= du
-WARNS?= 6
-DPADD= ${LIBUTIL}
-LDADD= -lutil
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/du/du.1 b/usr.bin/du/du.1
deleted file mode 100644
index 60264cd..0000000
--- a/usr.bin/du/du.1
+++ /dev/null
@@ -1,158 +0,0 @@
-.\" Copyright (c) 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)du.1 8.2 (Berkeley) 4/1/94
-.\" $FreeBSD$
-.\"
-.Dd February 25, 2008
-.Dt DU 1
-.Os
-.Sh NAME
-.Nm du
-.Nd display disk usage statistics
-.Sh SYNOPSIS
-.Nm
-.Op Fl H | L | P
-.Op Fl a | s | d Ar depth
-.Op Fl c
-.Op Fl l
-.Op Fl h | k | m
-.Op Fl n
-.Op Fl x
-.Op Fl I Ar mask
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility displays the file system block usage for each file argument
-and for each directory in the file hierarchy rooted in each directory
-argument.
-If no file is specified, the block usage of the hierarchy rooted in
-the current directory is displayed.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl H
-Symbolic links on the command line are followed, symbolic links in file
-hierarchies are not followed.
-.It Fl L
-Symbolic links on the command line and in file hierarchies are followed.
-.It Fl I Ar mask
-Ignore files and directories matching the specified
-.Ar mask .
-.It Fl P
-No symbolic links are followed.
-This is the default.
-.It Fl a
-Display an entry for each file in a file hierarchy.
-.It Fl h
-"Human-readable" output.
-Use unit suffixes: Byte, Kilobyte, Megabyte,
-Gigabyte, Terabyte and Petabyte.
-.It Fl r
-Generate messages about directories that cannot be read, files
-that cannot be opened, and so on.
-This is the default case.
-This option exists solely for conformance with
-.St -xpg4 .
-.It Fl s
-Display an entry for each specified file.
-(Equivalent to
-.Fl d Li 0 )
-.It Fl d Ar depth
-Display an entry for all files and directories
-.Ar depth
-directories deep.
-.It Fl c
-Display a grand total.
-.It Fl k
-Display block counts in 1024-byte (1-Kbyte) blocks.
-.It Fl l
-If a file has multiple hard links, count its size many times.
-The default behavior of
-.Nm
-is to count files with multiple hard links only once.
-When the
-.Fl l
-option is specified, the hard link checks are disabled, and these files
-are counted (and displayed) as many times as they are found.
-.It Fl m
-Display block counts in 1048576-byte (1-Mbyte) blocks.
-.It Fl n
-Ignore files and directories with user
-.Dq nodump
-flag
-.Pq Dv UF_NODUMP
-set.
-.It Fl x
-File system mount points are not traversed.
-.El
-.Pp
-The
-.Nm
-utility counts the storage used by symbolic links and not the files they
-reference unless the
-.Fl H
-or
-.Fl L
-option is specified.
-If either the
-.Fl H
-or
-.Fl L
-options are specified, storage used by any symbolic links which are
-followed is not counted or displayed.
-.Sh ENVIRONMENT
-.Bl -tag -width BLOCKSIZE
-.It Ev BLOCKSIZE
-If the environment variable
-.Ev BLOCKSIZE
-is set, and the
-.Fl k
-option is not specified, the block counts will be displayed in units of that
-size block.
-If
-.Ev BLOCKSIZE
-is not set, and the
-.Fl k
-option is not specified, the block counts will be displayed in 512-byte blocks.
-.El
-.Sh SEE ALSO
-.Xr df 1 ,
-.Xr chflags 2 ,
-.Xr fts 3 ,
-.Xr symlink 7 ,
-.Xr quot 8
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v1 .
diff --git a/usr.bin/du/du.c b/usr.bin/du/du.c
deleted file mode 100644
index 8959293..0000000
--- a/usr.bin/du/du.c
+++ /dev/null
@@ -1,499 +0,0 @@
-/*
- * Copyright (c) 1989, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Chris Newcomb.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1989, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static const char sccsid[] = "@(#)du.c 8.5 (Berkeley) 5/4/95";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fnmatch.h>
-#include <fts.h>
-#include <libutil.h>
-#include <locale.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysexits.h>
-#include <unistd.h>
-
-SLIST_HEAD(ignhead, ignentry) ignores;
-struct ignentry {
- char *mask;
- SLIST_ENTRY(ignentry) next;
-};
-
-static int linkchk(FTSENT *);
-static void usage(void);
-void prthumanval(int64_t);
-void ignoreadd(const char *);
-void ignoreclean(void);
-int ignorep(FTSENT *);
-
-int nodumpflag = 0;
-
-int
-main(int argc, char *argv[])
-{
- FTS *fts;
- FTSENT *p;
- off_t savednumber = 0;
- long blocksize;
- int ftsoptions;
- int listall;
- int depth;
- int Hflag, Lflag, Pflag, aflag, sflag, dflag, cflag;
- int hflag, lflag, ch, notused, rval;
- char **save;
- static char dot[] = ".";
-
- setlocale(LC_ALL, "");
-
- Hflag = Lflag = Pflag = aflag = sflag = dflag = cflag = hflag =
- lflag = 0;
-
- save = argv;
- ftsoptions = 0;
- depth = INT_MAX;
- SLIST_INIT(&ignores);
-
- while ((ch = getopt(argc, argv, "HI:LPasd:chklmnrx")) != -1)
- switch (ch) {
- case 'H':
- Hflag = 1;
- break;
- case 'I':
- ignoreadd(optarg);
- break;
- case 'L':
- if (Pflag)
- usage();
- Lflag = 1;
- break;
- case 'P':
- if (Lflag)
- usage();
- Pflag = 1;
- break;
- case 'a':
- aflag = 1;
- break;
- case 's':
- sflag = 1;
- break;
- case 'd':
- dflag = 1;
- errno = 0;
- depth = atoi(optarg);
- if (errno == ERANGE || depth < 0) {
- warnx("invalid argument to option d: %s", optarg);
- usage();
- }
- break;
- case 'c':
- cflag = 1;
- break;
- case 'h':
- if (setenv("BLOCKSIZE", "512", 1) == -1)
- warn(
- "setenv: cannot set BLOCKSIZE=512");
- hflag = 1;
- break;
- case 'k':
- hflag = 0;
- if (setenv("BLOCKSIZE", "1024", 1) == -1)
- warn("setenv: cannot set BLOCKSIZE=1024");
- break;
- case 'l':
- lflag = 1;
- break;
- case 'm':
- hflag = 0;
- if (setenv("BLOCKSIZE", "1048576", 1) == -1)
- warn("setenv: cannot set BLOCKSIZE=1048576");
- break;
- case 'n':
- nodumpflag = 1;
- break;
- case 'r': /* Compatibility. */
- break;
- case 'x':
- ftsoptions |= FTS_XDEV;
- break;
- case '?':
- default:
- usage();
- }
-
- argc -= optind;
- argv += optind;
-
- /*
- * XXX
- * Because of the way that fts(3) works, logical walks will not count
- * the blocks actually used by symbolic links. We rationalize this by
- * noting that users computing logical sizes are likely to do logical
- * copies, so not counting the links is correct. The real reason is
- * that we'd have to re-implement the kernel's symbolic link traversing
- * algorithm to get this right. If, for example, you have relative
- * symbolic links referencing other relative symbolic links, it gets
- * very nasty, very fast. The bottom line is that it's documented in
- * the man page, so it's a feature.
- */
-
- if (Hflag + Lflag + Pflag > 1)
- usage();
-
- if (Hflag + Lflag + Pflag == 0)
- Pflag = 1; /* -P (physical) is default */
-
- if (Hflag)
- ftsoptions |= FTS_COMFOLLOW;
-
- if (Lflag)
- ftsoptions |= FTS_LOGICAL;
-
- if (Pflag)
- ftsoptions |= FTS_PHYSICAL;
-
- listall = 0;
-
- if (aflag) {
- if (sflag || dflag)
- usage();
- listall = 1;
- } else if (sflag) {
- if (dflag)
- usage();
- depth = 0;
- }
-
- if (!*argv) {
- argv = save;
- argv[0] = dot;
- argv[1] = NULL;
- }
-
- (void) getbsize(&notused, &blocksize);
- blocksize /= 512;
-
- rval = 0;
-
- if ((fts = fts_open(argv, ftsoptions, NULL)) == NULL)
- err(1, "fts_open");
-
- while ((p = fts_read(fts)) != NULL) {
- switch (p->fts_info) {
- case FTS_D: /* Ignore. */
- if (ignorep(p))
- fts_set(fts, p, FTS_SKIP);
- break;
- case FTS_DP:
- if (ignorep(p))
- break;
-
- p->fts_parent->fts_bignum +=
- p->fts_bignum += p->fts_statp->st_blocks;
-
- if (p->fts_level <= depth) {
- if (hflag) {
- (void) prthumanval(howmany(p->fts_bignum, blocksize));
- (void) printf("\t%s\n", p->fts_path);
- } else {
- (void) printf("%jd\t%s\n",
- (intmax_t)howmany(p->fts_bignum, blocksize),
- p->fts_path);
- }
- }
- break;
- case FTS_DC: /* Ignore. */
- break;
- case FTS_DNR: /* Warn, continue. */
- case FTS_ERR:
- case FTS_NS:
- warnx("%s: %s", p->fts_path, strerror(p->fts_errno));
- rval = 1;
- break;
- default:
- if (ignorep(p))
- break;
-
- if (lflag == 0 &&
- p->fts_statp->st_nlink > 1 && linkchk(p))
- break;
-
- if (listall || p->fts_level == 0) {
- if (hflag) {
- (void) prthumanval(howmany(p->fts_statp->st_blocks,
- blocksize));
- (void) printf("\t%s\n", p->fts_path);
- } else {
- (void) printf("%jd\t%s\n",
- (intmax_t)howmany(p->fts_statp->st_blocks, blocksize),
- p->fts_path);
- }
- }
-
- p->fts_parent->fts_bignum += p->fts_statp->st_blocks;
- }
- savednumber = p->fts_parent->fts_bignum;
- }
-
- if (errno)
- err(1, "fts_read");
-
- if (cflag) {
- if (hflag) {
- (void) prthumanval(howmany(savednumber, blocksize));
- (void) printf("\ttotal\n");
- } else {
- (void) printf("%jd\ttotal\n", (intmax_t)howmany(savednumber, blocksize));
- }
- }
-
- ignoreclean();
- exit(rval);
-}
-
-static int
-linkchk(FTSENT *p)
-{
- struct links_entry {
- struct links_entry *next;
- struct links_entry *previous;
- int links;
- dev_t dev;
- ino_t ino;
- };
- static const size_t links_hash_initial_size = 8192;
- static struct links_entry **buckets;
- static struct links_entry *free_list;
- static size_t number_buckets;
- static unsigned long number_entries;
- static char stop_allocating;
- struct links_entry *le, **new_buckets;
- struct stat *st;
- size_t i, new_size;
- int hash;
-
- st = p->fts_statp;
-
- /* If necessary, initialize the hash table. */
- if (buckets == NULL) {
- number_buckets = links_hash_initial_size;
- buckets = malloc(number_buckets * sizeof(buckets[0]));
- if (buckets == NULL)
- errx(1, "No memory for hardlink detection");
- for (i = 0; i < number_buckets; i++)
- buckets[i] = NULL;
- }
-
- /* If the hash table is getting too full, enlarge it. */
- if (number_entries > number_buckets * 10 && !stop_allocating) {
- new_size = number_buckets * 2;
- new_buckets = malloc(new_size * sizeof(struct links_entry *));
-
- /* Try releasing the free list to see if that helps. */
- if (new_buckets == NULL && free_list != NULL) {
- while (free_list != NULL) {
- le = free_list;
- free_list = le->next;
- free(le);
- }
- new_buckets = malloc(new_size * sizeof(new_buckets[0]));
- }
-
- if (new_buckets == NULL) {
- stop_allocating = 1;
- warnx("No more memory for tracking hard links");
- } else {
- memset(new_buckets, 0,
- new_size * sizeof(struct links_entry *));
- for (i = 0; i < number_buckets; i++) {
- while (buckets[i] != NULL) {
- /* Remove entry from old bucket. */
- le = buckets[i];
- buckets[i] = le->next;
-
- /* Add entry to new bucket. */
- hash = (le->dev ^ le->ino) % new_size;
-
- if (new_buckets[hash] != NULL)
- new_buckets[hash]->previous =
- le;
- le->next = new_buckets[hash];
- le->previous = NULL;
- new_buckets[hash] = le;
- }
- }
- free(buckets);
- buckets = new_buckets;
- number_buckets = new_size;
- }
- }
-
- /* Try to locate this entry in the hash table. */
- hash = ( st->st_dev ^ st->st_ino ) % number_buckets;
- for (le = buckets[hash]; le != NULL; le = le->next) {
- if (le->dev == st->st_dev && le->ino == st->st_ino) {
- /*
- * Save memory by releasing an entry when we've seen
- * all of it's links.
- */
- if (--le->links <= 0) {
- if (le->previous != NULL)
- le->previous->next = le->next;
- if (le->next != NULL)
- le->next->previous = le->previous;
- if (buckets[hash] == le)
- buckets[hash] = le->next;
- number_entries--;
- /* Recycle this node through the free list */
- if (stop_allocating) {
- free(le);
- } else {
- le->next = free_list;
- free_list = le;
- }
- }
- return (1);
- }
- }
-
- if (stop_allocating)
- return (0);
-
- /* Add this entry to the links cache. */
- if (free_list != NULL) {
- /* Pull a node from the free list if we can. */
- le = free_list;
- free_list = le->next;
- } else
- /* Malloc one if we have to. */
- le = malloc(sizeof(struct links_entry));
- if (le == NULL) {
- stop_allocating = 1;
- warnx("No more memory for tracking hard links");
- return (0);
- }
- le->dev = st->st_dev;
- le->ino = st->st_ino;
- le->links = st->st_nlink - 1;
- number_entries++;
- le->next = buckets[hash];
- le->previous = NULL;
- if (buckets[hash] != NULL)
- buckets[hash]->previous = le;
- buckets[hash] = le;
- return (0);
-}
-
-void
-prthumanval(int64_t bytes)
-{
- char buf[5];
-
- bytes *= DEV_BSIZE;
-
- humanize_number(buf, sizeof(buf), bytes, "", HN_AUTOSCALE,
- HN_B | HN_NOSPACE | HN_DECIMAL);
-
- (void)printf("%4s", buf);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr,
- "usage: du [-H | -L | -P] [-a | -s | -d depth] [-c] "
- "[-l] [-h | -k | -m] [-n] [-x] [-I mask] [file ...]\n");
- exit(EX_USAGE);
-}
-
-void
-ignoreadd(const char *mask)
-{
- struct ignentry *ign;
-
- ign = calloc(1, sizeof(*ign));
- if (ign == NULL)
- errx(1, "cannot allocate memory");
- ign->mask = strdup(mask);
- if (ign->mask == NULL)
- errx(1, "cannot allocate memory");
- SLIST_INSERT_HEAD(&ignores, ign, next);
-}
-
-void
-ignoreclean(void)
-{
- struct ignentry *ign;
-
- while (!SLIST_EMPTY(&ignores)) {
- ign = SLIST_FIRST(&ignores);
- SLIST_REMOVE_HEAD(&ignores, next);
- free(ign->mask);
- free(ign);
- }
-}
-
-int
-ignorep(FTSENT *ent)
-{
- struct ignentry *ign;
-
- if (nodumpflag && (ent->fts_statp->st_flags & UF_NODUMP))
- return 1;
- SLIST_FOREACH(ign, &ignores, next)
- if (fnmatch(ign->mask, ent->fts_name, 0) != FNM_NOMATCH)
- return 1;
- return 0;
-}
diff --git a/usr.bin/ee/Artistic b/usr.bin/ee/Artistic
deleted file mode 100644
index fbf7989..0000000
--- a/usr.bin/ee/Artistic
+++ /dev/null
@@ -1,117 +0,0 @@
-
-
-
-
- The "Artistic License"
-
- Preamble
-
-The intent of this document is to state the conditions under which a
-Package may be copied, such that the Copyright Holder maintains some
-semblance of artistic control over the development of the package,
-while giving the users of the package the right to use and distribute
-the Package in a more-or-less customary fashion, plus the right to make
-reasonable modifications.
-
-Definitions:
-
- "Package" refers to the collection of files distributed by the
- Copyright Holder, and derivatives of that collection of files
- created through textual modification.
-
- "Standard Version" refers to such a Package if it has not been
- modified, or has been modified in accordance with the wishes
- of the Copyright Holder.
-
- "Copyright Holder" is whoever is named in the copyright or
- copyrights for the package.
-
- "You" is you, if you're thinking about copying or distributing
- this Package.
-
- "Reasonable copying fee" is whatever you can justify on the
- basis of media cost, duplication charges, time of people involved,
- and so on. (You will not be required to justify it to the
- Copyright Holder, but only to the computing community at large
- as a market that must bear the fee.)
-
- "Freely Available" means that no fee is charged for the item
- itself, though there may be fees involved in handling the item.
- It also means that recipients of the item may redistribute it
- under the same conditions they received it.
-
-1. You may make and give away verbatim copies of the source form of the
-Standard Version of this Package without restriction, provided that you
-duplicate all of the original copyright notices and associated disclaimers.
-
-2. You may apply bug fixes, portability fixes and other modifications
-derived from the Public Domain or from the Copyright Holder. A Package
-modified in such a way shall still be considered the Standard Version.
-
-3. You may otherwise modify your copy of this Package in any way, provided
-that you insert a prominent notice in each changed file stating how and
-when you changed that file, and provided that you do at least ONE of the
-following:
-
- a) place your modifications in the Public Domain or otherwise make them
- Freely Available, such as by posting said modifications to Usenet or
- an equivalent medium, or placing the modifications on a major archive
- site such as uunet.uu.net, or by allowing the Copyright Holder to include
- your modifications in the Standard Version of the Package.
-
- b) use the modified Package only within your corporation or organization.
-
- c) rename any non-standard executables so the names do not conflict
- with standard executables, which must also be provided, and provide
- a separate manual page for each non-standard executable that clearly
- documents how it differs from the Standard Version.
-
- d) make other distribution arrangements with the Copyright Holder.
-
-4. You may distribute the programs of this Package in object code or
-executable form, provided that you do at least ONE of the following:
-
- a) distribute a Standard Version of the executables and library files,
- together with instructions (in the manual page or equivalent) on where
- to get the Standard Version.
-
- b) accompany the distribution with the machine-readable source of
- the Package with your modifications.
-
- c) accompany any non-standard executables with their corresponding
- Standard Version executables, giving the non-standard executables
- non-standard names, and clearly documenting the differences in manual
- pages (or equivalent), together with instructions on where to get
- the Standard Version.
-
- d) make other distribution arrangements with the Copyright Holder.
-
-5. You may charge a reasonable copying fee for any distribution of this
-Package. You may charge any fee you choose for support of this Package.
-You may not charge a fee for this Package itself. However,
-you may distribute this Package in aggregate with other (possibly
-commercial) programs as part of a larger (possibly commercial) software
-distribution provided that you do not advertise this Package as a
-product of your own.
-
-6. The scripts and library files supplied as input to or produced as
-output from the programs of this Package do not automatically fall
-under the copyright of this Package, but belong to whomever generated
-them, and may be sold commercially, and may be aggregated with this
-Package.
-
-7. C subroutines supplied by you and linked into this Package in order
-to emulate subroutines and variables of the language defined by this
-Package shall not be considered part of this Package, but are the
-equivalent of input as in Paragraph 6, provided these subroutines do
-not change the language in any way that would cause it to fail the
-regression tests for the language.
-
-8. The name of the Copyright Holder may not be used to endorse or promote
-products derived from this software without specific prior written permission.
-
-9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
-WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-
- The End
diff --git a/usr.bin/ee/FREEBSD-upgrade b/usr.bin/ee/FREEBSD-upgrade
deleted file mode 100644
index 3bca6ab..0000000
--- a/usr.bin/ee/FREEBSD-upgrade
+++ /dev/null
@@ -1,28 +0,0 @@
-$FreeBSD$
-
-Hugh F. Mahon's EasyEditor
- originals can be found at: http://mahon.cwx.net/
- http://www.users.qwest.net/~hmahon/
-
-Imported by:
-
- cvs import -m "Virgin import of Hugh F. Mahon's EasyEditor 1.4.1." \
- src/usr.bin/ee HUGH_F_MAHON ee_1_4_1
-
-Notes:
- 1. Due to an error this release was imported as 1.4.1, while in fact
- it is version 1.4.2.
-
- 2. Due to historical reasons files layout has been changed from the
- vendor's one. The following log shows details:
-
- $ tar xvfz tar xvfz ee-1.4.2.src.tgz
- $ cd easyedit
- $ rm Makefile create.make genstr make.default
- $ mv README.ee README
- $ mkdir -p nls/en_US.US-ASCII
- $ mv ee.msg nls/en_US.US-ASCII/
-
-
-sobomax@FreeBSD.org
-27 May 2000
diff --git a/usr.bin/ee/Makefile b/usr.bin/ee/Makefile
deleted file mode 100644
index 8fdc499..0000000
--- a/usr.bin/ee/Makefile
+++ /dev/null
@@ -1,27 +0,0 @@
-# $FreeBSD$
-
-CFLAGS+= -DCAP -DHAS_NCURSES -DHAS_UNISTD -DHAS_STDARG -DHAS_STDLIB \
- -DHAS_CTYPE -DHAS_SYS_IOCTL -DHAS_SYS_WAIT -DSLCT_HDR
-
-PROG= ee
-LINKS= ${BINDIR}/ee ${BINDIR}/ree ${BINDIR}/ee ${BINDIR}/edit
-MLINKS= ee.1 ree.1 ee.1 edit.1
-DPADD= ${LIBNCURSES}
-LDADD= -lncurses
-
-NLS= en_US.US-ASCII fr_FR.ISO8859-1 de_DE.ISO8859-1 pl_PL.ISO8859-2 \
- uk_UA.KOI8-U ru_RU.KOI8-R
-
-NLSLINKS_en_US.US-ASCII= en_US.ISO8859-1 en_US.ISO8859-15
-NLSLINKS_fr_FR.ISO8859-1= fr_BE.ISO8859-1 fr_BE.ISO8859-15 \
- fr_CA.ISO8859-1 fr_CA.ISO8859-15 fr_CH.ISO8859-1 fr_CH.ISO8859-15 \
- fr_FR.ISO8859-15
-NLSLINKS_de_DE.ISO8859-1= de_AT.ISO8859-1 de_AT.ISO8859-15 de_CH.ISO8859-1 \
- de_CH.ISO8859-15 de_DE.ISO8859-15
-
-NLSSRCFILES=ee.msg
-.for lang in ${NLS}
-NLSSRCDIR_${lang}= ${.CURDIR}/nls/${lang}
-.endfor
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ee/README b/usr.bin/ee/README
deleted file mode 100644
index 8850af2..0000000
--- a/usr.bin/ee/README
+++ /dev/null
@@ -1,116 +0,0 @@
- THIS MATERIAL IS PROVIDED "AS IS". THERE ARE NO WARRANTIES OF
- ANY KIND WITH REGARD TO THIS MATERIAL, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- FITNESS FOR A PARTICULAR PURPOSE. Neither Hewlett-Packard nor
- Hugh Mahon shall be liable for errors contained herein, nor for
- incidental or consequential damages in connection with the
- furnishing, performance or use of this material. Neither
- Hewlett-Packard nor Hugh Mahon assumes any responsibility for
- the use or reliability of this software or documentation. This
- software and documentation is totally UNSUPPORTED. There is no
- support contract available. Hewlett-Packard has done NO
- Quality Assurance on ANY of the program or documentation. You
- may find the quality of the materials inferior to supported
- materials.
-
- This software may be distributed under the terms of Larry Wall's
- Artistic license, a copy of which is included in this distribution.
-
- This notice must be included with this software and any
- derivatives.
-
- Any modifications to this software by anyone but the original author
- must be so noted.
-
-
-The editor 'ee' (easy editor) is intended to be a simple, easy to use
-terminal-based screen oriented editor that requires no instruction to
-use. Its primary use would be for people who are new to computers, or who
-use computers only for things like e-mail.
-
-ee's simplified interface is highlighted by the use of pop-up menus which
-make it possible for users to carry out tasks without the need to
-remember commands. An information window at the top of the screen shows
-the user the operations available with control-keys.
-
-ee allows users to use full eight-bit characters. If the host system has
-the capabilities, ee can use message catalogs, which would allow users to
-translate the message catalog into other languages which use eight-bit
-characters. See the file ee.i18n.guide for more details.
-
-ee relies on the virtual memory abilities of the platform it is running on
-and does not have its own memory management capabilities.
-
-I am releasing ee because I hate to see new users and non-computer types
-get frustrated by vi, and would like to see more intuitive interfaces for
-basic tools (both character-based and graphical) become more pervasive.
-Terminal capabilities and communication speeds have evolved considerably
-since the time in which vi's interface was created, allowing much more
-intuitive interfaces to be used. Since character-based I/O won't be
-completely replaced by graphical user interfaces for at least a few more
-years, I'd like to do what I can to make using computers with less
-glamorous interfaces as easy to use as possible. If terminal interfaces
-are still used in ten years, I hope neophytes won't still be stuck with
-only vi.
-
-For a text editor to be easy to use requires a certain set of abilities. In
-order for ee to work, a terminal must have the ability to position the cursor
-on the screen, and should have arrow keys that send unique sequences
-(multiple characters, the first character is an "escape", octal code
-'\033'). All of this information needs to be in a database called "terminfo"
-(System V implementations) or "termcap" (usually used for BSD systems). In
-case the arrow keys do not transmit unique sequences, motion operations are
-mapped to control keys as well, but this at least partially defeats the
-purpose. The curses package is used to handle the I/O which deals with the
-terminal's capabilities.
-
-While ee is based on curses, I have included here the source code to
-new_curse, a subset of curses developed for use with ee. 'curses' often
-will have a defect that reduces the usefulness of the editor relying upon
-it.
-
-The file new_curse.c contains a subset of 'curses', a package for
-applications to use to handle screen output. Unfortunately, curses
-varies from system to system, so I developed new_curse to provide
-consistent behavior across systems. It works on both SystemV and BSD
-systems, and while it can sometimes be slower than other curses packages,
-it will get the information on the screen painted correctly more often
-than vendor supplied curses. Unless problems occur during the building
-of ee, it is recommended that you use new_curse rather than the curses
-supplied with your system.
-
-If you experience problems with data being displayed improperly, check
-your terminal configuration, especially if you're using a terminal
-emulator, and make sure that you are using the right terminfo entry
-before rummaging through code. Terminfo entries often contain
-inaccuracies, or incomplete information, or may not totally match the
-terminal or emulator the terminal information is being used with.
-Complaints that ee isn't working quite right often end up being something
-else (like the terminal emulator being used).
-
-Both ee and new_curse were developed using K&R C (also known as "classic
-C"), but it can also be compiled with ANSI C. You should be able to
-build ee by simply typing "make". A make file which takes into account
-the characteristics of your system will be created, and then ee will be
-built. If there are problems encountered, you will be notified about
-them.
-
-ee is the result of several conflicting design goals. While I know that it
-solves the problems of some users, I also have no doubt that some will decry
-its lack of more features. I will settle for knowing that ee does fulfill
-the needs of a minority (but still large number) of users. The goals of ee
-are:
-
- 1. To be so easy to use as to require no instruction.
- 2. To be easy to compile and, if necessary, port to new platforms
- by people with relatively little knowledge of C and UNIX.
- 3. To have a minimum number of files to be dealt with, for compile
- and installation.
- 4. To have enough functionality to be useful to a large number of
- people.
-
-Hugh Mahon |___|
-h_mahon@fc.hp.com | |
- |\ /|
- | \/ |
-
diff --git a/usr.bin/ee/ee.1 b/usr.bin/ee/ee.1
deleted file mode 100644
index 4da47bc..0000000
--- a/usr.bin/ee/ee.1
+++ /dev/null
@@ -1,623 +0,0 @@
-.\"
-.\" $FreeBSD$
-.\"
-.Dd August 30, 1995
-.Dt EE 1
-.Os
-.Sh NAME
-.Nm ee
-.Nd easy editor
-.Sh SYNOPSIS
-.Nm
-.Op Fl eih
-.Op +#
-.Op Ar
-.Nm ree
-.Op Fl eih
-.Op +#
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility
-is a simple screen oriented text editor.
-It is always in text insertion
-mode unless there is a prompt at the bottom of the terminal, or a
-menu present (in a box in the middle of the terminal).
-The
-.Nm ree
-utility is the same as
-.Nm ,
-but restricted to editing the named
-file (no file operations, or shell escapes are allowed).
-.Pp
-For
-.Nm
-to work properly, the environment variable
-.Ev TERM
-must be set to indicate the type of terminal being used.
-For
-example, for an
-.Tn HP 700/92
-terminal, the
-.Ev TERM
-variable should be set to "70092".
-See your System Administrator if
-you need more information.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl e
-Turn off expansion of tab character to spaces.
-.It Fl i
-Turn off display of information window at top of terminal.
-.It Fl h
-Turn off highlighting of borders of windows and menus (improves
-performance on some terminals).
-.It Sy +#
-Move the cursor to line '#' at startup.
-.El
-.Ss "Control keys"
-To do anything other than insert text, the user must use the control
-keys (the
-.Li Control
-key, represented by a "^", pressed in conjunction with an
-alphabetic key, e.g., ^a) and function keys available on the keyboard
-(such as
-.Em "Next Page" ,
-.Em "Prev Page" ,
-arrow keys, etc.).
-.Pp
-Since not all terminals have function keys,
-.Nm
-has the basic cursor movement functions assigned to control keys as
-well as more intuitive keys on the keyboard when available.
-For
-instance, to move the cursor up, the user can use the up arrow key,
-or
-.Em ^u .
-.Bl -tag -width indent
-.It ^a
-Prompt for the decimal value of a character to insert.
-.It ^b
-Move to the bottom of the text.
-.It ^c
-Get the prompt for a command.
-.It ^d
-Move the cursor down.
-.It ^e
-Prompt for the string to search for.
-.It ^f
-Undelete the last deleted character.
-.It ^g
-Move to the beginning of the line.
-.It ^h
-Backspace.
-.It ^i
-Tab.
-.It ^j
-Insert a newline.
-.It ^k
-Delete the character the cursor is sitting on.
-.It ^l
-Move the cursor left.
-.It ^m
-Insert a newline.
-.It ^n
-Move to the next page.
-.It ^o
-Move to the end of the line.
-.It ^p
-Move to the previous page.
-.It ^r
-Move the cursor to the right.
-.It ^t
-Move to the top of the text.
-.It ^u
-Move the cursor up.
-.It ^v
-Undelete the last deleted word.
-.It ^w
-Delete the word beginning at the cursor position.
-.It ^x
-Search.
-.It ^y
-Delete from the cursor position to the end of line.
-.It ^z
-Undelete the last deleted line.
-.It ^[ (ESC)
-Pop up menu.
-.El
-.Ss "EMACS keys mode"
-Since many shells provide an Emacs mode (for cursor movement and other editing
-operations), some bindings that may be more useful for people familiar with
-those bindings have been provided.
-These are accessible via the
-.Em settings
-menu, or via the initialization file (see below).
-The mappings are as follows:
-.Bl -tag -width indent
-.It ^a
-Move to the beginning of the line.
-.It ^b
-Back 1 character.
-.It ^c
-Command prompt.
-.It ^d
-Delete character the cursor is sitting on.
-.It ^e
-End of line.
-.It ^f
-Forward 1 character.
-.It ^g
-Go back 1 page.
-.It ^h
-Backspace.
-.It ^i
-Tab.
-.It ^j
-Undelete last deleted character.
-.It ^k
-Delete line.
-.It ^l
-Undelete last deleted line.
-.It ^m
-Insert a newline.
-.It ^n
-Move to the next line.
-.It ^o
-Prompt for the decimal value of a character to insert.
-.It ^p
-Previous line.
-.It ^r
-Restore last deleted word.
-.It ^t
-Move to the top of the text.
-.It ^u
-Move to the bottom of the text.
-.It ^v
-Move to the next page.
-.It ^w
-Delete the word beginning at the cursor position.
-.It ^y
-Prompt for the string to search for.
-.It ^z
-Next word.
-.It ^[ (ESC)
-Pop up menu.
-.El
-.Ss "Function Keys"
-.Bl -tag -width indent
-.It Next Page
-Move to the next page.
-.It Prev Page
-Move to the previous page.
-.It Delete Char
-Delete the character the cursor is on.
-.It Delete Line
-Delete from the cursor to the end of line.
-.It Insert line
-Insert a newline at the cursor position.
-.It Arrow keys
-Move the cursor in the direction indicated.
-.El
-.Ss Commands
-Some operations require more information than a single keystroke can
-provide.
-For the most basic operations, there is a menu that can be
-obtained by pressing the
-.Tn ESC
-key.
-The same operations, and more can be performed by obtaining the
-command prompt (^c) and typing in one of the commands below.
-.Bl -tag -width indent
-.It ! Ns Ar cmd
-Execute
-.Ar cmd
-in a shell.
-.It 0-9
-Move to the line indicated.
-.It case
-Make searches case sensitive.
-.It character
-Display the ASCII value of the character at the cursor.
-.It exit
-Save the edited text, and leave the editor.
-.It expand
-Expand tabs to spaces.
-.It file
-Print the name of the file.
-.It help
-Display help screen.
-.It line
-Display the current line number.
-.It nocase
-Make searches insensitive to case (the default).
-.It noexpand
-Do not expand tab to spaces when the TAB key is pressed.
-.It quit
-Leave the editor without saving changes.
-.It read Ar file
-Read the named
-.Ar file .
-.It write Ar file
-Write the text to the named
-.Ar file .
-.El
-.Ss "Menu Operations"
-Pop-up menus can be obtained by pressing the
-.Em escape
-key (or
-.Em ^[
-if no
-.Em escape
-key is present).
-When in the menu, the escape key can be
-used to leave the menu without performing any operations.
-Use the up and
-down arrow keys, or
-.Em ^u
-for moving up and
-.Em ^d
-for moving down to move to the desired items in the menu, then press
-.Em return
-to perform the indicated task.
-.Pp
-To the left of each menu item is a letter, which if the corresponding
-letter is pressed on the keyboard selects that menu entry.
-.Pp
-The main menu in
-.Nm
-is as follows:
-.Bl -tag -width indent
-.It leave editor
-If changes have been made, the user will get a menu prompting whether or
-not the changes should be saved.
-.It help
-Display a help screen, with all of the keyboard operations and commands.
-.It file operations
-Pop up a menu for selecting whether to read a file, write to a file, or
-save the current contents of the editor, as well as send the contents of
-the editor to a print command (see the section
-.Sx "Initializing ee from a file" ) .
-.It redraw screen
-Provide a means to repaint the screen if the screen has been corrupted.
-.It settings
-Show the current values of the operating modes, and right margin.
-By
-pressing return when the cursor is on a particular item, the value can be
-changed.
-To leave this menu, press the
-.Em escape
-key.
-(See
-.Sx Modes
-below.)
-.It search
-Pop up a menu in which the user may choose to enter a string to search
-for, or search for a string already entered.
-.It miscellaneous
-Pop up a menu that allows the user to format the current paragraph,
-execute a shell command, or check the spelling of the text in the editor.
-.El
-.Ss "Paragraph Formatting"
-Paragraphs are defined for
-.Nm
-by a block of text bounded by:
-.Bl -bullet -width indent
-.It
-Begin or end of file.
-.It
-Line with no characters, or only spaces and/or tabs.
-.It
-Line starting with a period ('.') or right angle bracket ('>').
-.El
-.Pp
-A paragraph may be formatted two ways: explicitly by choosing the
-.Em format paragraph
-menu item, or by setting
-.Nm
-to automatically
-format paragraphs.
-The automatic mode may be set via a menu, or via the
-initialization file.
-.Pp
-There are three states for text operation in
-.Nm :
-free-form, margins,
-and automatic formatting.
-.Pp
-"Free-form" is best used for things like programming.
-There are no
-restrictions on the length of lines, and no formatting takes place.
-.Pp
-"Margins" allows the user to type in text without having to worry about going
-beyond the right margin (the right margin may be set in the
-.Em settings
-menu, the default is for the margin to be the right edge of the
-terminal).
-This is the mode that allows the
-.Em format paragraph
-menu item to work.
-.Pp
-"Automatic formatting" provides word-processor-like behavior.
-The user
-may type in text, while
-.Nm
-will make sure the entire paragraph fits
-within the width of the terminal every time the user inserts a space after
-typing or deleting text.
-Margin observation must also be enabled in order for
-automatic formatting to occur.
-.Ss Modes
-Although
-.Nm
-is a 'modeless' editor (it is in text insertion mode all the
-time), there are modes in some of the things it does.
-These include:
-.Bl -tag -width indent
-.It tab expansion
-Tabs may be inserted as a single tab character, or replaced with spaces.
-.It case sensitivity
-The search operation can be sensitive to whether characters are upper- or
-lower-case, or ignore case completely.
-.It margins observed
-Lines can either be truncated at the right margin, or extend on forever.
-.It auto paragraph formatting
-While typing in text, the editor can try to keep it looking reasonably well
-within the width of the screen.
-.It eightbit characters
-Toggle whether eight bit characters are displayed as their value in angle
-brackets (e.g.\& "<220>") or as a character.
-.It info window
-A window showing the keyboard operations that can be performed can be
-displayed or not.
-.It emacs keys
-Control keys may be given bindings similar to emacs, or not.
-.It 16 bit characters
-Toggles whether sixteen bit characters are handled as one 16-bit quantities or
-two 8-bit quantities.
-This works primarily with the Chinese Big 5 code set.
-.El
-.Pp
-You may set these modes via the initialization file (see below), or with a
-menu (see above).
-.Ss "Spell Checking"
-There are two ways to have the spelling in the text checked from
-.Nm .
-One is by the traditional
-.Xr spell 1
-command, the other is with the
-optional
-.Nm ispell
-command.
-.Pp
-Using
-.Nm spell ,
-the words that are not recognized will be placed at the top
-of the file.
-For the
-.Nm ispell
-option, the file is written to disk,
-then
-.Nm ispell
-run on the file, and the file read back in once
-.Nm ispell
-has completed making changes to the file.
-.Ss "Printing the contents of the editor"
-The user may select a menu item which prints the contents of the editor.
-The
-.Nm
-utility pipes the text in the editor to the command specified by the
-initialization command
-.Em printcommand
-(see the section
-.Sx Initializing ee from a file
-below).
-The default is to send the contents to
-.Xr lp 1 .
-.Pp
-Whatever the user assigns to
-.Em printcommand
-must take input from
-standard input.
-See your system administrator for more details.
-.Ss "Shell operations"
-Shell commands can be executed from within
-.Nm
-by selecting the
-.Em shell command
-item in the
-.Em miscellaneous
-menu, or by placing an exclamation mark ("!") before the command to
-execute at the
-.Em command:
-prompt.
-Additionally, the user may direct the contents of the edit buffer
-out to a shell operation (via a pipe) by using the left angle bracket
-(">"), followed by a "!" and the shell command to execute.
-The output of
-a shell operation can also be directed into the edit buffer by using a
-right angle bracket ("<") before the exclamation mark.
-These can even be
-used together to send output to a shell operation and read back the
-results into the editor.
-So, if the editor contained a list of words
-to be sorted, they could be sorted by typing the following at the command
-prompt:
-.Dl ><!sort
-This would send the contents of the editor to be piped into the
-.Xr sort 1
-utility and the result would be placed into the edit buffer at the current
-cursor location.
-The old information would have to be deleted by the user.
-.Ss "Initializing ee from a file"
-Since different users have different preferences,
-.Nm
-allows some
-slight configurability.
-There are three possible locations for an
-initialization file for
-.Nm :
-the file
-.Pa /usr/share/misc/init.ee ,
-the file
-.Pa .init.ee
-in the user's home directory, or the file
-.Pa .init.ee
-in the current directory (if different from the home
-directory).
-This allows system administrators to set some preferences for
-the users on a system-wide basis (for example, the
-.Em print
-command),
-and the user to customize settings for particular directories (like one
-for correspondence, and a different directory for programming).
-.Pp
-The file
-.Pa /usr/share/misc/init.ee
-is read first, then
-.Pa $HOME/.init.ee ,
-then
-.Pa .init.ee ,
-with the settings specified by the
-most recent file read taking precedence.
-.Pp
-The following items may be entered in the initialization file:
-.Bl -tag -width indent
-.It case
-Set searches to be case sensitive.
-.It nocase
-Set searches to be insensitive to case (default).
-.It expand
-Cause
-.Nm
-to expand tabs to spaces (default).
-.It noexpand
-Cause
-.Nm
-to insert tabs as a single character.
-.It info
-A small information window is displayed at the top of the terminal
-(default).
-.It noinfo
-Turn off the display of the information window.
-.It margins
-Cause
-.Nm
-to truncate lines at the right margin when the
-cursor passes beyond the right margin as set by the user
-while text is being inserted
-(default).
-.It nomargins
-Allow lines to extend beyond the right margin.
-.It autoformat
-Cause
-.Nm
-to automatically try to format the current paragraph while
-text insertion is occurring.
-.It noautoformat
-Turn off automatic paragraph formatting (default).
-.It printcommand
-Allow the setting of the print command (default: "lp").
-.It rightmargin
-The user can select a value for the right margin (the first column on the
-screen is zero).
-.It highlight
-Turn on highlighting of border of information window and menus (default).
-.It nohighlight
-Turn off highlighting of border of information window and menus.
-.It eightbit
-Turn on display of eight bit characters.
-.It noeightbit
-Turn off display of eight bit characters (they are displayed as their decimal
-value inside angle brackets, e.g., "<220>").
-.It 16bit
-Turns on handling of 16-bit characters.
-.It no16bit
-Turns off handling of 16-bit characters.
-.It emacs
-Turns on emacs key bindings.
-.It noemacs
-Turns off emacs key bindings.
-.El
-.Ss "Save Editor Configuration"
-When using this entry from the
-.Em settings
-menu, the user may choose to save the current configuration of
-the editor (see
-.Sx Initializing ee from a file
-above) to a file named
-.Pa .init.ee
-in the current directory or the user's home directory.
-If a file named
-.Pa .init.ee
-already exists, it will be renamed
-.Pa .init.ee.old .
-.Sh CAVEATS
-THIS MATERIAL IS PROVIDED "AS IS".
-THERE ARE
-NO WARRANTIES OF ANY KIND WITH REGARD TO THIS
-MATERIAL, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE.
-Neither
-Hewlett-Packard nor Hugh Mahon shall be liable
-for errors contained herein, nor for
-incidental or consequential damages in
-connection with the furnishing, performance or
-use of this material.
-Neither Hewlett-Packard
-nor Hugh Mahon assumes any responsibility for
-the use or reliability of this software or
-documentation.
-This software and
-documentation is totally UNSUPPORTED.
-There
-is no support contract available.
-Hewlett-Packard
-has done NO Quality Assurance on ANY
-of the program or documentation.
-You may find
-the quality of the materials inferior to
-supported materials.
-.Pp
-Always make a copy of files that cannot be easily reproduced before
-editing.
-Save files early, and save often.
-.Ss "International Code Set Support"
-The
-.Nm
-utility supports single-byte character code sets (eight-bit clean), or the
-Chinese Big-5 code set.
-(Other multi-byte code sets may function, but the
-reason Big-5 works is that a two-byte character also takes up two columns on
-the screen.)
-.Sh WARNINGS
-The automatic paragraph formatting operation
-may be too slow for slower systems.
-.Sh FILES
-.Bl -tag -width /usr/share/misc/init.ee -compact
-.It Pa /usr/share/misc/init.ee
-.It Pa $HOME/.init.ee
-.It Pa .init.ee
-.El
-.Sh AUTHORS
-The software
-.Nm
-was developed by
-.An Hugh Mahon .
-.Pp
-This software and documentation contains
-proprietary information which is protected by
-copyright.
-All rights are reserved.
-.Pp
-Copyright (c) 1990, 1991, 1992, 1993, 1995, 1996 Hugh Mahon.
-.Sh "SEE ALSO"
-.Xr ispell 1 Pq Pa ports/textproc/ispell ,
-.Xr lpr 1 ,
-.Xr spell 1 ,
-.Xr termcap 5 ,
-.Xr terminfo 5 ,
-.Xr environ 7
diff --git a/usr.bin/ee/ee.c b/usr.bin/ee/ee.c
deleted file mode 100644
index 17ecc31..0000000
--- a/usr.bin/ee/ee.c
+++ /dev/null
@@ -1,5313 +0,0 @@
-/*
- | ee (easy editor)
- |
- | An easy to use, simple screen oriented editor.
- |
- | written by Hugh Mahon
- |
- | THIS MATERIAL IS PROVIDED "AS IS". THERE ARE
- | NO WARRANTIES OF ANY KIND WITH REGARD TO THIS
- | MATERIAL, INCLUDING, BUT NOT LIMITED TO, THE
- | IMPLIED WARRANTIES OF MERCHANTABILITY AND
- | FITNESS FOR A PARTICULAR PURPOSE. Neither
- | Hewlett-Packard nor Hugh Mahon shall be liable
- | for errors contained herein, nor for
- | incidental or consequential damages in
- | connection with the furnishing, performance or
- | use of this material. Neither Hewlett-Packard
- | nor Hugh Mahon assumes any responsibility for
- | the use or reliability of this software or
- | documentation. This software and
- | documentation is totally UNSUPPORTED. There
- | is no support contract available. Hewlett-
- | Packard has done NO Quality Assurance on ANY
- | of the program or documentation. You may find
- | the quality of the materials inferior to
- | supported materials.
- |
- | This software is not a product of Hewlett-Packard, Co., or any
- | other company. No support is implied or offered with this software.
- | You've got the source, and you're on your own.
- |
- | This software may be distributed under the terms of Larry Wall's
- | Artistic license, a copy of which is included in this distribution.
- |
- | This notice must be included with this software and any derivatives.
- |
- | This editor was purposely developed to be simple, both in
- | interface and implementation. This editor was developed to
- | address a specific audience: the user who is new to computers
- | (especially UNIX).
- |
- | ee is not aimed at technical users; for that reason more
- | complex features were intentionally left out. In addition,
- | ee is intended to be compiled by people with little computer
- | experience, which means that it needs to be small, relatively
- | simple in implementation, and portable.
- |
- | This software and documentation contains
- | proprietary information which is protected by
- | copyright. All rights are reserved.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-char *ee_copyright_message =
-"Copyright (c) 1986, 1990, 1991, 1992, 1993, 1994, 1995, 1996 Hugh Mahon ";
-
-char *ee_long_notice[] = {
- "This software and documentation contains",
- "proprietary information which is protected by",
- "copyright. All rights are reserved."
- };
-
-char *version = "@(#) ee, version 1.4.1";
-
-#ifdef NCURSE
-#include "new_curse.h"
-#elif HAS_NCURSES
-#include <ncurses.h>
-#else
-#include <curses.h>
-#endif
-
-#ifdef HAS_CTYPE
-#include <ctype.h>
-#endif
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <paths.h>
-#include <pwd.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#ifdef HAS_SYS_WAIT
-#include <sys/wait.h>
-#endif
-#ifdef HAS_STDARG
-#include <stdarg.h>
-#endif
-#ifdef HAS_STDLIB
-#include <stdlib.h>
-#endif
-#include <string.h>
-#ifdef HAS_UNISTD
-#include <unistd.h>
-#endif
-
-#ifndef NO_CATGETS
-#include <locale.h>
-#include <nl_types.h>
-
-nl_catd catalog;
-#else
-#define catgetlocal(a, b) (b)
-#endif /* NO_CATGETS */
-
-#ifndef SIGCHLD
-#define SIGCHLD SIGCLD
-#endif
-
-#define TAB 9
-#define max(a, b) (a > b ? a : b)
-#define min(a, b) (a < b ? a : b)
-
-/*
- | defines for type of data to show in info window
- */
-
-#define CONTROL_KEYS 1
-#define COMMANDS 2
-
-struct text {
- unsigned char *line; /* line of characters */
- int line_number; /* line number */
- int line_length; /* actual number of characters in the line */
- int max_length; /* maximum number of characters the line handles */
- struct text *next_line; /* next line of text */
- struct text *prev_line; /* previous line of text */
- };
-
-struct text *first_line; /* first line of current buffer */
-struct text *dlt_line; /* structure for info on deleted line */
-struct text *curr_line; /* current line cursor is on */
-struct text *tmp_line; /* temporary line pointer */
-struct text *srch_line; /* temporary pointer for search routine */
-
-struct files { /* structure to store names of files to be edited*/
- unsigned char *name; /* name of file */
- struct files *next_name;
- };
-
-struct files *top_of_stack = NULL;
-
-int d_wrd_len; /* length of deleted word */
-int position; /* offset in bytes from begin of line */
-int scr_pos; /* horizontal position */
-int scr_vert; /* vertical position on screen */
-int scr_horz; /* horizontal position on screen */
-int tmp_vert, tmp_horz;
-int input_file; /* indicate to read input file */
-int recv_file; /* indicate reading a file */
-int edit; /* continue executing while true */
-int gold; /* 'gold' function key pressed */
-int fildes; /* file descriptor */
-int case_sen; /* case sensitive search flag */
-int last_line; /* last line for text display */
-int last_col; /* last column for text display */
-int horiz_offset = 0; /* offset from left edge of text */
-int clear_com_win; /* flag to indicate com_win needs clearing */
-int text_changes = FALSE; /* indicate changes have been made to text */
-int get_fd; /* file descriptor for reading a file */
-int info_window = TRUE; /* flag to indicate if help window visible */
-int info_type = CONTROL_KEYS; /* flag to indicate type of info to display */
-int expand_tabs = TRUE; /* flag for expanding tabs */
-int right_margin = 0; /* the right margin */
-int observ_margins = TRUE; /* flag for whether margins are observed */
-int shell_fork;
-int temp_stdin; /* temporary storage for stdin */
-int temp_stdout; /* temp storage for stdout descriptor */
-int temp_stderr; /* temp storage for stderr descriptor */
-int pipe_out[2]; /* pipe file desc for output */
-int pipe_in[2]; /* pipe file descriptors for input */
-int out_pipe; /* flag that info is piped out */
-int in_pipe; /* flag that info is piped in */
-int formatted = FALSE; /* flag indicating paragraph formatted */
-int auto_format = FALSE; /* flag for auto_format mode */
-int restricted = FALSE; /* flag to indicate restricted mode */
-int nohighlight = FALSE; /* turns off highlighting */
-int eightbit = TRUE; /* eight bit character flag */
-int local_LINES = 0; /* copy of LINES, to detect when win resizes */
-int local_COLS = 0; /* copy of COLS, to detect when win resizes */
-int curses_initialized = FALSE; /* flag indicating if curses has been started*/
-int emacs_keys_mode = FALSE; /* mode for if emacs key binings are used */
-int ee_chinese = FALSE; /* allows handling of multi-byte characters */
- /* by checking for high bit in a byte the */
- /* code recognizes a two-byte character */
- /* sequence */
-
-unsigned char *point; /* points to current position in line */
-unsigned char *srch_str; /* pointer for search string */
-unsigned char *u_srch_str; /* pointer to non-case sensitive search */
-unsigned char *srch_1; /* pointer to start of suspect string */
-unsigned char *srch_2; /* pointer to next character of string */
-unsigned char *srch_3;
-unsigned char *in_file_name = NULL; /* name of input file */
-char *tmp_file; /* temporary file name */
-unsigned char *d_char; /* deleted character */
-unsigned char *d_word; /* deleted word */
-unsigned char *d_line; /* deleted line */
-char in_string[513]; /* buffer for reading a file */
-unsigned char *print_command = "lpr"; /* string to use for the print command */
-unsigned char *start_at_line = NULL; /* move to this line at start of session*/
-const char count_text_default[] = "===============================================================================";
-int count_text_len = sizeof(count_text_default); /* length of the line above */
-char count_text[sizeof(count_text_default)]; /* buffer for current position display */
-int in; /* input character */
-
-FILE *temp_fp; /* temporary file pointer */
-FILE *bit_bucket; /* file pointer to /dev/null */
-
-char *table[] = {
- "^@", "^A", "^B", "^C", "^D", "^E", "^F", "^G", "^H", "\t", "^J",
- "^K", "^L", "^M", "^N", "^O", "^P", "^Q", "^R", "^S", "^T", "^U",
- "^V", "^W", "^X", "^Y", "^Z", "^[", "^\\", "^]", "^^", "^_"
- };
-
-WINDOW *com_win;
-WINDOW *text_win;
-WINDOW *help_win;
-WINDOW *info_win;
-WINDOW *count_win;
-
-#if defined(__STDC__) || defined(__cplusplus)
-#define P_(s) s
-#else
-#define P_(s) ()
-#endif
-
-
-/*
- | The following structure allows menu items to be flexibly declared.
- | The first item is the string describing the selection, the second
- | is the address of the procedure to call when the item is selected,
- | and the third is the argument for the procedure.
- |
- | For those systems with i18n, the string should be accompanied by a
- | catalog number. The 'int *' should be replaced with 'void *' on
- | systems with that type.
- |
- | The first menu item will be the title of the menu, with NULL
- | parameters for the procedure and argument, followed by the menu items.
- |
- | If the procedure value is NULL, the menu item is displayed, but no
- | procedure is called when the item is selected. The number of the
- | item will be returned. If the third (argument) parameter is -1, no
- | argument is given to the procedure when it is called.
- */
-
-struct menu_entries {
- char *item_string;
- int (*procedure)P_((struct menu_entries *));
- struct menu_entries *ptr_argument;
- int (*iprocedure)P_((int));
- void (*nprocedure)P_((void));
- int argument;
- };
-
-int main P_((int argc, char *argv[]));
-unsigned char *resiz_line P_((int factor, struct text *rline, int rpos));
-void insert P_((int character));
-void delete P_((int disp));
-void scanline P_((unsigned char *pos));
-int tabshift P_((int temp_int));
-int out_char P_((WINDOW *window, int character, int column));
-int len_char P_((int character, int column));
-void draw_line P_((int vertical, int horiz, unsigned char *ptr, int t_pos, int length));
-void insert_line P_((int disp));
-struct text *txtalloc P_((void));
-struct files *name_alloc P_((void));
-unsigned char *next_word P_((unsigned char *string));
-void prev_word P_((void));
-void control P_((void));
-void emacs_control P_((void));
-void bottom P_((void));
-void top P_((void));
-void nextline P_((void));
-void prevline P_((void));
-void left P_((int disp));
-void right P_((int disp));
-void find_pos P_((void));
-void up P_((void));
-void down P_((void));
-void function_key P_((void));
-void print_buffer P_((void));
-void command_prompt P_((void));
-void command P_((char *cmd_str1));
-int scan P_((char *line, int offset, int column));
-char *get_string P_((char *prompt, int advance));
-int compare P_((char *string1, char *string2, int sensitive));
-void goto_line P_((char *cmd_str));
-void midscreen P_((int line, unsigned char *pnt));
-void get_options P_((int numargs, char *arguments[]));
-void check_fp P_((void));
-void get_file P_((char *file_name));
-void get_line P_((int length, unsigned char *in_string, int *append));
-void draw_screen P_((void));
-void finish P_((void));
-int quit P_((int noverify));
-void edit_abort P_((int arg));
-void delete_text P_((void));
-int write_file P_((char *file_name, int warn_if_exists));
-int search P_((int display_message));
-void search_prompt P_((void));
-void del_char P_((void));
-void undel_char P_((void));
-void del_word P_((void));
-void undel_word P_((void));
-void del_line P_((void));
-void undel_line P_((void));
-void adv_word P_((void));
-void move_rel P_((char *direction, int lines));
-void eol P_((void));
-void bol P_((void));
-void adv_line P_((void));
-void sh_command P_((char *string));
-void set_up_term P_((void));
-void resize_check P_((void));
-int menu_op P_((struct menu_entries *));
-void paint_menu P_((struct menu_entries menu_list[], int max_width, int max_height, int list_size, int top_offset, WINDOW *menu_win, int off_start, int vert_size));
-void help P_((void));
-void paint_info_win P_((void));
-void no_info_window P_((void));
-void create_info_window P_((void));
-int file_op P_((int arg));
-void shell_op P_((void));
-void leave_op P_((void));
-void redraw P_((void));
-int Blank_Line P_((struct text *test_line));
-void Format P_((void));
-void ee_init P_((void));
-void dump_ee_conf P_((void));
-void echo_string P_((char *string));
-void spell_op P_((void));
-void ispell_op P_((void));
-int first_word_len P_((struct text *test_line));
-void Auto_Format P_((void));
-void modes_op P_((void));
-char *is_in_string P_((char *string, char *substring));
-char *resolve_name P_((char *name));
-int restrict_mode P_((void));
-int unique_test P_((char *string, char *list[]));
-void renumber_lines P_((struct text *firstline, int startnumber));
-void strings_init P_((void));
-
-#undef P_
-/*
- | allocate space here for the strings that will be in the menu
- */
-
-struct menu_entries modes_menu[] = {
- {"", NULL, NULL, NULL, NULL, 0}, /* title */
- {"", NULL, NULL, NULL, NULL, -1}, /* 1. tabs to spaces */
- {"", NULL, NULL, NULL, NULL, -1}, /* 2. case sensitive search*/
- {"", NULL, NULL, NULL, NULL, -1}, /* 3. margins observed */
- {"", NULL, NULL, NULL, NULL, -1}, /* 4. auto-paragraph */
- {"", NULL, NULL, NULL, NULL, -1}, /* 5. eightbit characters*/
- {"", NULL, NULL, NULL, NULL, -1}, /* 6. info window */
- {"", NULL, NULL, NULL, NULL, -1}, /* 7. emacs key bindings*/
- {"", NULL, NULL, NULL, NULL, -1}, /* 8. right margin */
- {"", NULL, NULL, NULL, NULL, -1}, /* 9. chinese text */
- {"", NULL, NULL, NULL, dump_ee_conf, -1}, /* 10. save editor config */
- {NULL, NULL, NULL, NULL, NULL, -1} /* terminator */
- };
-
-char *mode_strings[11];
-
-#define NUM_MODES_ITEMS 10
-
-struct menu_entries config_dump_menu[] = {
- {"", NULL, NULL, NULL, NULL, 0},
- {"", NULL, NULL, NULL, NULL, -1},
- {"", NULL, NULL, NULL, NULL, -1},
- {NULL, NULL, NULL, NULL, NULL, -1}
- };
-
-struct menu_entries leave_menu[] = {
- {"", NULL, NULL, NULL, NULL, -1},
- {"", NULL, NULL, NULL, finish, -1},
- {"", NULL, NULL, quit, NULL, TRUE},
- {NULL, NULL, NULL, NULL, NULL, -1}
- };
-
-#define READ_FILE 1
-#define WRITE_FILE 2
-#define SAVE_FILE 3
-
-struct menu_entries file_menu[] = {
- {"", NULL, NULL, NULL, NULL, -1},
- {"", NULL, NULL, file_op, NULL, READ_FILE},
- {"", NULL, NULL, file_op, NULL, WRITE_FILE},
- {"", NULL, NULL, file_op, NULL, SAVE_FILE},
- {"", NULL, NULL, NULL, print_buffer, -1},
- {NULL, NULL, NULL, NULL, NULL, -1}
- };
-
-struct menu_entries search_menu[] = {
- {"", NULL, NULL, NULL, NULL, 0},
- {"", NULL, NULL, NULL, search_prompt, -1},
- {"", NULL, NULL, search, NULL, TRUE},
- {NULL, NULL, NULL, NULL, NULL, -1}
- };
-
-struct menu_entries spell_menu[] = {
- {"", NULL, NULL, NULL, NULL, -1},
- {"", NULL, NULL, NULL, spell_op, -1},
- {"", NULL, NULL, NULL, ispell_op, -1},
- {NULL, NULL, NULL, NULL, NULL, -1}
- };
-
-struct menu_entries misc_menu[] = {
- {"", NULL, NULL, NULL, NULL, -1},
- {"", NULL, NULL, NULL, Format, -1},
- {"", NULL, NULL, NULL, shell_op, -1},
- {"", menu_op, spell_menu, NULL, NULL, -1},
- {NULL, NULL, NULL, NULL, NULL, -1}
- };
-
-struct menu_entries main_menu[] = {
- {"", NULL, NULL, NULL, NULL, -1},
- {"", NULL, NULL, NULL, leave_op, -1},
- {"", NULL, NULL, NULL, help, -1},
- {"", menu_op, file_menu, NULL, NULL, -1},
- {"", NULL, NULL, NULL, redraw, -1},
- {"", NULL, NULL, NULL, modes_op, -1},
- {"", menu_op, search_menu, NULL, NULL, -1},
- {"", menu_op, misc_menu, NULL, NULL, -1},
- {NULL, NULL, NULL, NULL, NULL, -1}
- };
-
-char *help_text[23];
-char *control_keys[5];
-
-char *emacs_help_text[22];
-char *emacs_control_keys[5];
-
-char *command_strings[5];
-char *commands[32];
-char *init_strings[22];
-
-#define MENU_WARN 1
-
-#define max_alpha_char 36
-
-/*
- | Declarations for strings for localization
- */
-
-char *com_win_message; /* to be shown in com_win if no info window */
-char *no_file_string;
-char *ascii_code_str;
-char *printer_msg_str;
-char *command_str;
-char *file_write_prompt_str;
-char *file_read_prompt_str;
-char *char_str;
-char *unkn_cmd_str;
-char *non_unique_cmd_msg;
-char *line_num_str;
-char *line_len_str;
-char *current_file_str;
-char *usage0;
-char *usage1;
-char *usage2;
-char *usage3;
-char *usage4;
-char *file_is_dir_msg;
-char *new_file_msg;
-char *cant_open_msg;
-char *open_file_msg;
-char *file_read_fin_msg;
-char *reading_file_msg;
-char *read_only_msg;
-char *file_read_lines_msg;
-char *save_file_name_prompt;
-char *file_not_saved_msg;
-char *changes_made_prompt;
-char *yes_char;
-char *file_exists_prompt;
-char *create_file_fail_msg;
-char *writing_file_msg;
-char *file_written_msg;
-char *searching_msg;
-char *str_not_found_msg;
-char *search_prompt_str;
-char *exec_err_msg;
-char *continue_msg;
-char *menu_cancel_msg;
-char *menu_size_err_msg;
-char *press_any_key_msg;
-char *shell_prompt;
-char *formatting_msg;
-char *shell_echo_msg;
-char *spell_in_prog_msg;
-char *margin_prompt;
-char *restricted_msg;
-char *ON;
-char *OFF;
-char *HELP;
-char *WRITE;
-char *READ;
-char *LINE;
-char *FILE_str;
-char *CHARACTER;
-char *REDRAW;
-char *RESEQUENCE;
-char *AUTHOR;
-char *VERSION;
-char *CASE;
-char *NOCASE;
-char *EXPAND;
-char *NOEXPAND;
-char *Exit_string;
-char *QUIT_string;
-char *INFO;
-char *NOINFO;
-char *MARGINS;
-char *NOMARGINS;
-char *AUTOFORMAT;
-char *NOAUTOFORMAT;
-char *Echo;
-char *PRINTCOMMAND;
-char *RIGHTMARGIN;
-char *HIGHLIGHT;
-char *NOHIGHLIGHT;
-char *EIGHTBIT;
-char *NOEIGHTBIT;
-char *EMACS_string;
-char *NOEMACS_string;
-char *conf_dump_err_msg;
-char *conf_dump_success_msg;
-char *conf_not_saved_msg;
-char *ree_no_file_msg;
-char *cancel_string;
-char *menu_too_lrg_msg;
-char *more_above_str, *more_below_str;
-
-char *chinese_cmd, *nochinese_cmd;
-
-
-int
-main(argc, argv) /* beginning of main program */
-int argc;
-char *argv[];
-{
- /* Always read from (and write to) a terminal. */
- if (!isatty(STDIN_FILENO) || !isatty(STDOUT_FILENO)) {
- fprintf(stderr, "ee's standard input and output must be a terminal\n");
- exit(1);
- }
-
- signal(SIGCHLD, SIG_DFL);
- signal(SIGSEGV, SIG_DFL);
- signal(SIGINT, edit_abort);
- signal(SIGHUP, edit_abort);
-
- d_char = malloc(3); /* provide a buffer for multi-byte chars */
- d_word = malloc(150);
- *d_word = (char) NULL;
- d_line = NULL;
- dlt_line = txtalloc();
- dlt_line->line = d_line;
- dlt_line->line_length = 0;
- curr_line = first_line = txtalloc();
- curr_line->line = point = malloc(10);
- curr_line->line_length = 1;
- curr_line->max_length = 10;
- curr_line->prev_line = NULL;
- curr_line->next_line = NULL;
- curr_line->line_number = 1;
- srch_str = NULL;
- u_srch_str = NULL;
- position = 1;
- scr_pos =0;
- scr_vert = 0;
- scr_horz = 0;
- bit_bucket = fopen(_PATH_DEVNULL, "w");
- edit = TRUE;
- gold = case_sen = FALSE;
- shell_fork = TRUE;
- strings_init();
- ee_init();
- if (argc > 0 )
- get_options(argc, argv);
- set_up_term();
- if (right_margin == 0)
- right_margin = COLS - 1;
- if (top_of_stack == NULL)
- {
- if (restrict_mode())
- {
- wmove(com_win, 0, 0);
- werase(com_win);
- wprintw(com_win, ree_no_file_msg);
- wrefresh(com_win);
- edit_abort(0);
- }
- wprintw(com_win, no_file_string);
- wrefresh(com_win);
- }
- else
- check_fp();
-
- clear_com_win = TRUE;
-
- while(edit)
- {
- if (info_window)
- {
- snprintf(count_text, count_text_len, "L: %d C: %d %s", \
- curr_line->line_number, scr_horz + 1, count_text_default);
- wmove(count_win, 0, 0);
- if (!nohighlight)
- wstandout(count_win);
- wprintw(count_win, count_text);
- wstandend(count_win);
- wnoutrefresh(count_win);
- }
-
- wnoutrefresh(text_win);
- doupdate();
- in = wgetch(text_win);
- if (in == -1)
- continue;
-
- resize_check();
-
- if (clear_com_win)
- {
- clear_com_win = FALSE;
- wmove(com_win, 0, 0);
- werase(com_win);
- if (!info_window)
- {
- wprintw(com_win, "%s", com_win_message);
- }
- wrefresh(com_win);
- }
-
- if (in > 255)
- function_key();
- else if ((in == '\10') || (in == 127))
- {
- in = 8; /* make sure key is set to backspace */
- delete(TRUE);
- }
- else if ((in > 31) || (in == 9))
- insert(in);
- else if ((in >= 0) && (in <= 31))
- {
- if (emacs_keys_mode)
- emacs_control();
- else
- control();
- }
- }
- return(0);
-}
-
-unsigned char *
-resiz_line(factor, rline, rpos) /* resize the line to length + factor*/
-int factor; /* resize factor */
-struct text *rline; /* position in line */
-int rpos;
-{
- unsigned char *rpoint;
- int resiz_var;
-
- rline->max_length += factor;
- rpoint = rline->line = realloc(rline->line, rline->max_length );
- for (resiz_var = 1 ; (resiz_var < rpos) ; resiz_var++)
- rpoint++;
- return(rpoint);
-}
-
-void
-insert(character) /* insert character into line */
-int character; /* new character */
-{
- int counter;
- int value;
- unsigned char *temp; /* temporary pointer */
- unsigned char *temp2; /* temporary pointer */
-
- if ((character == '\011') && (expand_tabs))
- {
- counter = len_char('\011', scr_horz);
- for (; counter > 0; counter--)
- insert(' ');
- if (auto_format)
- Auto_Format();
- return;
- }
- text_changes = TRUE;
- if ((curr_line->max_length - curr_line->line_length) < 5)
- point = resiz_line(10, curr_line, position);
- curr_line->line_length++;
- temp = point;
- counter = position;
- while (counter < curr_line->line_length) /* find end of line */
- {
- counter++;
- temp++;
- }
- temp++; /* increase length of line by one */
- while (point < temp)
- {
- temp2=temp - 1;
- *temp= *temp2; /* shift characters over by one */
- temp--;
- }
- *point = character; /* insert new character */
- wclrtoeol(text_win);
- if (((character >= 0) && (character < ' ')) || (character >= 127)) /* check for TAB character*/
- {
- scr_pos = scr_horz += out_char(text_win, character, scr_horz);
- point++;
- position++;
- }
- else
- {
- waddch(text_win, character);
- scr_pos = ++scr_horz;
- point++;
- position ++;
- }
-
- if ((observ_margins) && (right_margin < scr_pos))
- {
- counter = position;
- while (scr_pos > right_margin)
- prev_word();
- if (scr_pos == 0)
- {
- while (position < counter)
- right(TRUE);
- }
- else
- {
- counter -= position;
- insert_line(TRUE);
- for (value = 0; value < counter; value++)
- right(TRUE);
- }
- }
-
- if ((scr_horz - horiz_offset) > last_col)
- {
- horiz_offset += 8;
- midscreen(scr_vert, point);
- }
-
- if ((auto_format) && (character == ' ') && (!formatted))
- Auto_Format();
- else if ((character != ' ') && (character != '\t'))
- formatted = FALSE;
-
- draw_line(scr_vert, scr_horz, point, position, curr_line->line_length);
-}
-
-void
-delete(disp) /* delete character */
-int disp;
-{
- unsigned char *tp;
- unsigned char *temp2;
- struct text *temp_buff;
- int temp_vert;
- int temp_pos;
- int del_width = 1;
-
- if (point != curr_line->line) /* if not at beginning of line */
- {
- text_changes = TRUE;
- temp2 = tp = point;
- if ((ee_chinese) && (position >= 2) && (*(point - 2) > 127))
- {
- del_width = 2;
- }
- tp -= del_width;
- point -= del_width;
- position -= del_width;
- temp_pos = position;
- curr_line->line_length -= del_width;
- if ((*tp < ' ') || (*tp >= 127)) /* check for TAB */
- scanline(tp);
- else
- scr_horz -= del_width;
- scr_pos = scr_horz;
- if (in == 8)
- {
- if (del_width == 1)
- *d_char = *point; /* save deleted character */
- else
- {
- d_char[0] = *point;
- d_char[1] = *(point + 1);
- }
- d_char[del_width] = (unsigned char) NULL;
- }
- while (temp_pos <= curr_line->line_length)
- {
- temp_pos++;
- *tp = *temp2;
- tp++;
- temp2++;
- }
- if (scr_horz < horiz_offset)
- {
- horiz_offset -= 8;
- midscreen(scr_vert, point);
- }
- }
- else if (curr_line->prev_line != NULL)
- {
- text_changes = TRUE;
- left(disp); /* go to previous line */
- temp_buff = curr_line->next_line;
- point = resiz_line(temp_buff->line_length, curr_line, position);
- if (temp_buff->next_line != NULL)
- temp_buff->next_line->prev_line = curr_line;
- curr_line->next_line = temp_buff->next_line;
- renumber_lines(curr_line->next_line, curr_line->line_number + 1);
- temp2 = temp_buff->line;
- if (in == 8)
- {
- d_char[0] = '\n';
- d_char[1] = (unsigned char) NULL;
- }
- tp = point;
- temp_pos = 1;
- while (temp_pos < temp_buff->line_length)
- {
- curr_line->line_length++;
- temp_pos++;
- *tp = *temp2;
- tp++;
- temp2++;
- }
- *tp = (char) NULL;
- free(temp_buff->line);
- free(temp_buff);
- temp_buff = curr_line;
- temp_vert = scr_vert;
- scr_pos = scr_horz;
- if (scr_vert < last_line)
- {
- wmove(text_win, scr_vert + 1, 0);
- wdeleteln(text_win);
- }
- while ((temp_buff != NULL) && (temp_vert < last_line))
- {
- temp_buff = temp_buff->next_line;
- temp_vert++;
- }
- if ((temp_vert == last_line) && (temp_buff != NULL))
- {
- tp = temp_buff->line;
- wmove(text_win, last_line,0);
- wclrtobot(text_win);
- draw_line(last_line, 0, tp, 1, temp_buff->line_length);
- wmove(text_win, scr_vert, (scr_horz - horiz_offset));
- }
- }
- draw_line(scr_vert, scr_horz, point, position, curr_line->line_length);
- formatted = FALSE;
-}
-
-void
-scanline(pos) /* find the proper horizontal position for the pointer */
-unsigned char *pos;
-{
- int temp;
- unsigned char *ptr;
-
- ptr = curr_line->line;
- temp = 0;
- while (ptr < pos)
- {
- if (*ptr <= 8)
- temp += 2;
- else if (*ptr == 9)
- temp += tabshift(temp);
- else if ((*ptr >= 10) && (*ptr <= 31))
- temp += 2;
- else if ((*ptr >= 32) && (*ptr < 127))
- temp++;
- else if (*ptr == 127)
- temp += 2;
- else if (!eightbit)
- temp += 5;
- else
- temp++;
- ptr++;
- }
- scr_horz = temp;
- if ((scr_horz - horiz_offset) > last_col)
- {
- horiz_offset = (scr_horz - (scr_horz % 8)) - (COLS - 8);
- midscreen(scr_vert, point);
- }
- else if (scr_horz < horiz_offset)
- {
- horiz_offset = max(0, (scr_horz - (scr_horz % 8)));
- midscreen(scr_vert, point);
- }
-}
-
-int
-tabshift(temp_int) /* give the number of spaces to shift */
-int temp_int;
-{
- int leftover;
-
- leftover = ((temp_int + 1) % 8);
- if (leftover == 0)
- return (1);
- else
- return (9 - leftover);
-}
-
-int
-out_char(window, character, column) /* output non-printing character */
-WINDOW *window;
-char character;
-int column;
-{
- int i1, i2;
- unsigned char *string;
- char string2[8];
-
- if (character == TAB)
- {
- i1 = tabshift(column);
- for (i2 = 0;
- (i2 < i1) && (((column+i2+1)-horiz_offset) < last_col); i2++)
- {
- waddch(window, ' ');
- }
- return(i1);
- }
- else if ((character >= '\0') && (character < ' '))
- {
- string = table[(int) character];
- }
- else if ((character < 0) || (character >= 127))
- {
- if (character == 127)
- string = "^?";
- else if (!eightbit)
- {
- sprintf(string2, "<%d>", (character < 0) ? (character + 256) : character);
- string = string2;
- }
- else
- {
- waddch(window, (unsigned char)character );
- return(1);
- }
- }
- else
- {
- waddch(window, (unsigned char)character);
- return(1);
- }
- for (i2 = 0; (string[i2] != (char) NULL) && (((column+i2+1)-horiz_offset) < last_col); i2++)
- waddch(window, string[i2]);
- return(strlen(string));
-}
-
-int
-len_char(character, column) /* return the length of the character */
-char character;
-int column; /* the column must be known to provide spacing for tabs */
-{
- int length;
-
- if (character == '\t')
- length = tabshift(column);
- else if ((character >= 0) && (character < 32))
- length = 2;
- else if ((character >= 32) && (character <= 126))
- length = 1;
- else if (character == 127)
- length = 2;
- else if (((character > 126) || (character < 0)) && (!eightbit))
- length = 5;
- else
- length = 1;
-
- return(length);
-}
-
-void
-draw_line(vertical, horiz, ptr, t_pos, length) /* redraw line from current position */
-int vertical; /* current vertical position on screen */
-int horiz; /* current horizontal position on screen */
-unsigned char *ptr; /* pointer to line */
-int t_pos; /* current position (offset in bytes) from bol */
-int length; /* length (in bytes) of line */
-{
- int d; /* partial length of special or tab char to display */
- unsigned char *temp; /* temporary pointer to position in line */
- int abs_column; /* offset in screen units from begin of line */
- int column; /* horizontal position on screen */
- int row; /* vertical position on screen */
- int posit; /* temporary position indicator within line */
-
- abs_column = horiz;
- column = horiz - horiz_offset;
- row = vertical;
- temp = ptr;
- d = 0;
- posit = t_pos;
- if (column < 0)
- {
- wmove(text_win, row, 0);
- wclrtoeol(text_win);
- }
- while (column < 0)
- {
- d = len_char(*temp, abs_column);
- abs_column += d;
- column += d;
- posit++;
- temp++;
- }
- wmove(text_win, row, column);
- wclrtoeol(text_win);
- while ((posit < length) && (column <= last_col))
- {
- if ((*temp < 32) || (*temp >= 127))
- {
- column += len_char(*temp, abs_column);
- abs_column += out_char(text_win, *temp, abs_column);
- }
- else
- {
- abs_column++;
- column++;
- waddch(text_win, *temp);
- }
- posit++;
- temp++;
- }
- if (column < last_col)
- wclrtoeol(text_win);
- wmove(text_win, vertical, (horiz - horiz_offset));
-}
-
-void
-insert_line(disp) /* insert new line */
-int disp;
-{
- int temp_pos;
- int temp_pos2;
- unsigned char *temp;
- unsigned char *extra;
- struct text *temp_nod;
-
- text_changes = TRUE;
- wmove(text_win, scr_vert, (scr_horz - horiz_offset));
- wclrtoeol(text_win);
- temp_nod= txtalloc();
- temp_nod->line = extra= malloc(10);
- temp_nod->line_length = 1;
- temp_nod->max_length = 10;
- temp_nod->next_line = curr_line->next_line;
- renumber_lines(temp_nod, curr_line->line_number + 1);
- if (temp_nod->next_line != NULL)
- temp_nod->next_line->prev_line = temp_nod;
- temp_nod->prev_line = curr_line;
- curr_line->next_line = temp_nod;
- temp_pos2 = position;
- temp = point;
- if (temp_pos2 < curr_line->line_length)
- {
- temp_pos = 1;
- while (temp_pos2 < curr_line->line_length)
- {
- if ((temp_nod->max_length - temp_nod->line_length)< 5)
- extra = resiz_line(10, temp_nod, temp_pos);
- temp_nod->line_length++;
- temp_pos++;
- temp_pos2++;
- *extra= *temp;
- extra++;
- temp++;
- }
- temp=point;
- *temp = (char) NULL;
- temp = resiz_line((1 - temp_nod->line_length), curr_line, position);
- curr_line->line_length = 1 + temp - curr_line->line;
- }
- curr_line->line_length = position;
- curr_line = temp_nod;
- *extra = (char) NULL;
- position = 1;
- point= curr_line->line;
- if (disp)
- {
- if (scr_vert < last_line)
- {
- scr_vert++;
- wclrtoeol(text_win);
- wmove(text_win, scr_vert, 0);
- winsertln(text_win);
- }
- else
- {
- wmove(text_win, 0,0);
- wdeleteln(text_win);
- wmove(text_win, last_line,0);
- wclrtobot(text_win);
- }
- scr_pos = scr_horz = 0;
- if (horiz_offset)
- {
- horiz_offset = 0;
- midscreen(scr_vert, point);
- }
- draw_line(scr_vert, scr_horz, point, position,
- curr_line->line_length);
- }
-}
-
-struct text *txtalloc() /* allocate space for line structure */
-{
- return((struct text *) malloc(sizeof( struct text)));
-}
-
-struct files *name_alloc() /* allocate space for file name list node */
-{
- return((struct files *) malloc(sizeof( struct files)));
-}
-
-unsigned char *next_word(string) /* move to next word in string */
-unsigned char *string;
-{
- while ((*string != (char) NULL) && ((*string != 32) && (*string != 9)))
- string++;
- while ((*string != (char) NULL) && ((*string == 32) || (*string == 9)))
- string++;
- return(string);
-}
-
-void
-prev_word() /* move to start of previous word in text */
-{
- if (position != 1)
- {
- if ((position != 1) && ((point[-1] == ' ') || (point[-1] == '\t')))
- { /* if at the start of a word */
- while ((position != 1) && ((*point != ' ') && (*point != '\t')))
- left(TRUE);
- }
- while ((position != 1) && ((*point == ' ') || (*point == '\t')))
- left(TRUE);
- while ((position != 1) && ((*point != ' ') && (*point != '\t')))
- left(TRUE);
- if ((position != 1) && ((*point == ' ') || (*point == '\t')))
- right(TRUE);
- }
- else
- left(TRUE);
-}
-
-void
-control() /* use control for commands */
-{
- char *string;
-
- if (in == 1) /* control a */
- {
- string = get_string(ascii_code_str, TRUE);
- if (*string != (char) NULL)
- {
- in = atoi(string);
- wmove(text_win, scr_vert, (scr_horz - horiz_offset));
- insert(in);
- }
- free(string);
- }
- else if (in == 2) /* control b */
- bottom();
- else if (in == 3) /* control c */
- {
- command_prompt();
- }
- else if (in == 4) /* control d */
- down();
- else if (in == 5) /* control e */
- search_prompt();
- else if (in == 6) /* control f */
- undel_char();
- else if (in == 7) /* control g */
- bol();
- else if (in == 8) /* control h */
- delete(TRUE);
- else if (in == 9) /* control i */
- ;
- else if (in == 10) /* control j */
- insert_line(TRUE);
- else if (in == 11) /* control k */
- del_char();
- else if (in == 12) /* control l */
- left(TRUE);
- else if (in == 13) /* control m */
- insert_line(TRUE);
- else if (in == 14) /* control n */
- move_rel("d", max(5, (last_line - 5)));
- else if (in == 15) /* control o */
- eol();
- else if (in == 16) /* control p */
- move_rel("u", max(5, (last_line - 5)));
- else if (in == 17) /* control q */
- ;
- else if (in == 18) /* control r */
- right(TRUE);
- else if (in == 19) /* control s */
- ;
- else if (in == 20) /* control t */
- top();
- else if (in == 21) /* control u */
- up();
- else if (in == 22) /* control v */
- undel_word();
- else if (in == 23) /* control w */
- del_word();
- else if (in == 24) /* control x */
- search(TRUE);
- else if (in == 25) /* control y */
- del_line();
- else if (in == 26) /* control z */
- undel_line();
- else if (in == 27) /* control [ (escape) */
- {
- menu_op(main_menu);
- }
-}
-
-/*
- | Emacs control-key bindings
- */
-
-void
-emacs_control()
-{
- char *string;
-
- if (in == 1) /* control a */
- bol();
- else if (in == 2) /* control b */
- left(TRUE);
- else if (in == 3) /* control c */
- {
- command_prompt();
- }
- else if (in == 4) /* control d */
- del_char();
- else if (in == 5) /* control e */
- eol();
- else if (in == 6) /* control f */
- right(TRUE);
- else if (in == 7) /* control g */
- move_rel("u", max(5, (last_line - 5)));
- else if (in == 8) /* control h */
- delete(TRUE);
- else if (in == 9) /* control i */
- ;
- else if (in == 10) /* control j */
- undel_char();
- else if (in == 11) /* control k */
- del_line();
- else if (in == 12) /* control l */
- undel_line();
- else if (in == 13) /* control m */
- insert_line(TRUE);
- else if (in == 14) /* control n */
- down();
- else if (in == 15) /* control o */
- {
- string = get_string(ascii_code_str, TRUE);
- if (*string != (char) NULL)
- {
- in = atoi(string);
- wmove(text_win, scr_vert, (scr_horz - horiz_offset));
- insert(in);
- }
- free(string);
- }
- else if (in == 16) /* control p */
- up();
- else if (in == 17) /* control q */
- ;
- else if (in == 18) /* control r */
- undel_word();
- else if (in == 19) /* control s */
- ;
- else if (in == 20) /* control t */
- top();
- else if (in == 21) /* control u */
- bottom();
- else if (in == 22) /* control v */
- move_rel("d", max(5, (last_line - 5)));
- else if (in == 23) /* control w */
- del_word();
- else if (in == 24) /* control x */
- search(TRUE);
- else if (in == 25) /* control y */
- search_prompt();
- else if (in == 26) /* control z */
- adv_word();
- else if (in == 27) /* control [ (escape) */
- {
- menu_op(main_menu);
- }
-}
-
-void
-bottom() /* go to bottom of file */
-{
- while (curr_line->next_line != NULL)
- curr_line = curr_line->next_line;
- point = curr_line->line;
- if (horiz_offset)
- horiz_offset = 0;
- position = 1;
- midscreen(last_line, point);
- scr_pos = scr_horz;
-}
-
-void
-top() /* go to top of file */
-{
- while (curr_line->prev_line != NULL)
- curr_line = curr_line->prev_line;
- point = curr_line->line;
- if (horiz_offset)
- horiz_offset = 0;
- position = 1;
- midscreen(0, point);
- scr_pos = scr_horz;
-}
-
-void
-nextline() /* move pointers to start of next line */
-{
- curr_line = curr_line->next_line;
- point = curr_line->line;
- position = 1;
- if (scr_vert == last_line)
- {
- wmove(text_win, 0,0);
- wdeleteln(text_win);
- wmove(text_win, last_line,0);
- wclrtobot(text_win);
- draw_line(last_line,0,point,1,curr_line->line_length);
- }
- else
- scr_vert++;
-}
-
-void
-prevline() /* move pointers to start of previous line*/
-{
- curr_line = curr_line->prev_line;
- point = curr_line->line;
- position = 1;
- if (scr_vert == 0)
- {
- winsertln(text_win);
- draw_line(0,0,point,1,curr_line->line_length);
- }
- else
- scr_vert--;
- while (position < curr_line->line_length)
- {
- position++;
- point++;
- }
-}
-
-void
-left(disp) /* move left one character */
-int disp;
-{
- if (point != curr_line->line) /* if not at begin of line */
- {
- if ((ee_chinese) && (position >= 2) && (*(point - 2) > 127))
- {
- point--;
- position--;
- }
- point--;
- position--;
- scanline(point);
- wmove(text_win, scr_vert, (scr_horz - horiz_offset));
- scr_pos = scr_horz;
- }
- else if (curr_line->prev_line != NULL)
- {
- if (!disp)
- {
- curr_line = curr_line->prev_line;
- point = curr_line->line + curr_line->line_length;
- position = curr_line->line_length;
- return;
- }
- position = 1;
- prevline();
- scanline(point);
- scr_pos = scr_horz;
- wmove(text_win, scr_vert, (scr_horz - horiz_offset));
- }
-}
-
-void
-right(disp) /* move right one character */
-int disp;
-{
- if (position < curr_line->line_length)
- {
- if ((ee_chinese) && (*point > 127) &&
- ((curr_line->line_length - position) >= 2))
- {
- point++;
- position++;
- }
- point++;
- position++;
- scanline(point);
- wmove(text_win, scr_vert, (scr_horz - horiz_offset));
- scr_pos = scr_horz;
- }
- else if (curr_line->next_line != NULL)
- {
- if (!disp)
- {
- curr_line = curr_line->next_line;
- point = curr_line->line;
- position = 1;
- return;
- }
- nextline();
- scr_pos = scr_horz = 0;
- if (horiz_offset)
- {
- horiz_offset = 0;
- midscreen(scr_vert, point);
- }
- wmove(text_win, scr_vert, (scr_horz - horiz_offset));
- position = 1;
- }
-}
-
-void
-find_pos() /* move to the same column as on other line */
-{
- scr_horz = 0;
- position = 1;
- while ((scr_horz < scr_pos) && (position < curr_line->line_length))
- {
- if (*point == 9)
- scr_horz += tabshift(scr_horz);
- else if (*point < ' ')
- scr_horz += 2;
- else if ((ee_chinese) && (*point > 127) &&
- ((curr_line->line_length - position) >= 2))
- {
- scr_horz += 2;
- point++;
- position++;
- }
- else
- scr_horz++;
- position++;
- point++;
- }
- if ((scr_horz - horiz_offset) > last_col)
- {
- horiz_offset = (scr_horz - (scr_horz % 8)) - (COLS - 8);
- midscreen(scr_vert, point);
- }
- else if (scr_horz < horiz_offset)
- {
- horiz_offset = max(0, (scr_horz - (scr_horz % 8)));
- midscreen(scr_vert, point);
- }
- wmove(text_win, scr_vert, (scr_horz - horiz_offset));
-}
-
-void
-up() /* move up one line */
-{
- if (curr_line->prev_line != NULL)
- {
- prevline();
- point = curr_line->line;
- find_pos();
- }
-}
-
-void
-down() /* move down one line */
-{
- if (curr_line->next_line != NULL)
- {
- nextline();
- find_pos();
- }
-}
-
-void
-function_key() /* process function key */
-{
- if (in == KEY_LEFT)
- left(TRUE);
- else if (in == KEY_RIGHT)
- right(TRUE);
- else if (in == KEY_HOME)
- bol();
- else if (in == KEY_END)
- eol();
- else if ( in == KEY_UP)
- up();
- else if (in == KEY_DOWN)
- down();
- else if (in == KEY_NPAGE)
- move_rel("d", max( 5, (last_line - 5)));
- else if (in == KEY_PPAGE)
- move_rel("u", max(5, (last_line - 5)));
- else if (in == KEY_DL)
- del_line();
- else if (in == KEY_DC)
- del_char();
- else if (in == KEY_BACKSPACE)
- delete(TRUE);
- else if (in == KEY_IL)
- { /* insert a line before current line */
- insert_line(TRUE);
- left(TRUE);
- }
- else if (in == KEY_F(1))
- gold = !gold;
- else if (in == KEY_F(2))
- {
- if (gold)
- {
- gold = FALSE;
- undel_line();
- }
- else
- undel_char();
- }
- else if (in == KEY_F(3))
- {
- if (gold)
- {
- gold = FALSE;
- undel_word();
- }
- else
- del_word();
- }
- else if (in == KEY_F(4))
- {
- if (gold)
- {
- gold = FALSE;
- paint_info_win();
- midscreen(scr_vert, point);
- }
- else
- adv_word();
- }
- else if (in == KEY_F(5))
- {
- if (gold)
- {
- gold = FALSE;
- search_prompt();
- }
- else
- search(TRUE);
- }
- else if (in == KEY_F(6))
- {
- if (gold)
- {
- gold = FALSE;
- bottom();
- }
- else
- top();
- }
- else if (in == KEY_F(7))
- {
- if (gold)
- {
- gold = FALSE;
- eol();
- }
- else
- bol();
- }
- else if (in == KEY_F(8))
- {
- if (gold)
- {
- gold = FALSE;
- command_prompt();
- }
- else
- adv_line();
- }
-}
-
-void
-print_buffer()
-{
- char buffer[256];
-
- sprintf(buffer, ">!%s", print_command);
- wmove(com_win, 0, 0);
- wclrtoeol(com_win);
- wprintw(com_win, printer_msg_str, print_command);
- wrefresh(com_win);
- command(buffer);
-}
-
-void
-command_prompt()
-{
- char *cmd_str;
- int result;
-
- info_type = COMMANDS;
- paint_info_win();
- cmd_str = get_string(command_str, TRUE);
- if ((result = unique_test(cmd_str, commands)) != 1)
- {
- werase(com_win);
- wmove(com_win, 0, 0);
- if (result == 0)
- wprintw(com_win, unkn_cmd_str, cmd_str);
- else
- wprintw(com_win, non_unique_cmd_msg);
-
- wrefresh(com_win);
-
- info_type = CONTROL_KEYS;
- paint_info_win();
-
- if (cmd_str != NULL)
- free(cmd_str);
- return;
- }
- command(cmd_str);
- wrefresh(com_win);
- wmove(text_win, scr_vert, (scr_horz - horiz_offset));
- info_type = CONTROL_KEYS;
- paint_info_win();
- if (cmd_str != NULL)
- free(cmd_str);
-}
-
-void
-command(cmd_str1) /* process commands from keyboard */
-char *cmd_str1;
-{
- char *cmd_str2 = NULL;
- char *cmd_str = cmd_str1;
-
- clear_com_win = TRUE;
- if (compare(cmd_str, HELP, FALSE))
- help();
- else if (compare(cmd_str, WRITE, FALSE))
- {
- if (restrict_mode())
- {
- return;
- }
- cmd_str = next_word(cmd_str);
- if (*cmd_str == (char) NULL)
- {
- cmd_str = cmd_str2 = get_string(file_write_prompt_str, TRUE);
- }
- tmp_file = resolve_name(cmd_str);
- write_file(tmp_file, 1);
- if (tmp_file != cmd_str)
- free(tmp_file);
- }
- else if (compare(cmd_str, READ, FALSE))
- {
- if (restrict_mode())
- {
- return;
- }
- cmd_str = next_word(cmd_str);
- if (*cmd_str == (char) NULL)
- {
- cmd_str = cmd_str2 = get_string(file_read_prompt_str, TRUE);
- }
- tmp_file = cmd_str;
- recv_file = TRUE;
- tmp_file = resolve_name(cmd_str);
- check_fp();
- if (tmp_file != cmd_str)
- free(tmp_file);
- }
- else if (compare(cmd_str, LINE, FALSE))
- {
- wmove(com_win, 0, 0);
- wclrtoeol(com_win);
- wprintw(com_win, line_num_str, curr_line->line_number);
- wprintw(com_win, line_len_str, curr_line->line_length);
- }
- else if (compare(cmd_str, FILE_str, FALSE))
- {
- wmove(com_win, 0, 0);
- wclrtoeol(com_win);
- if (in_file_name == NULL)
- wprintw(com_win, no_file_string);
- else
- wprintw(com_win, current_file_str, in_file_name);
- }
- else if ((*cmd_str >= '0') && (*cmd_str <= '9'))
- goto_line(cmd_str);
- else if (compare(cmd_str, CHARACTER, FALSE))
- {
- wmove(com_win, 0, 0);
- wclrtoeol(com_win);
- wprintw(com_win, char_str, *point);
- }
- else if (compare(cmd_str, REDRAW, FALSE))
- redraw();
- else if (compare(cmd_str, RESEQUENCE, FALSE))
- {
- tmp_line = first_line->next_line;
- while (tmp_line != NULL)
- {
- tmp_line->line_number = tmp_line->prev_line->line_number + 1;
- tmp_line = tmp_line->next_line;
- }
- }
- else if (compare(cmd_str, AUTHOR, FALSE))
- {
- wmove(com_win, 0, 0);
- wclrtoeol(com_win);
- wprintw(com_win, "written by Hugh Mahon");
- }
- else if (compare(cmd_str, VERSION, FALSE))
- {
- wmove(com_win, 0, 0);
- wclrtoeol(com_win);
- wprintw(com_win, "%s", version);
- }
- else if (compare(cmd_str, CASE, FALSE))
- case_sen = TRUE;
- else if (compare(cmd_str, NOCASE, FALSE))
- case_sen = FALSE;
- else if (compare(cmd_str, EXPAND, FALSE))
- expand_tabs = TRUE;
- else if (compare(cmd_str, NOEXPAND, FALSE))
- expand_tabs = FALSE;
- else if (compare(cmd_str, Exit_string, FALSE))
- finish();
- else if (compare(cmd_str, chinese_cmd, FALSE))
- {
- ee_chinese = TRUE;
-#ifdef NCURSE
- nc_setattrib(A_NC_BIG5);
-#endif /* NCURSE */
- }
- else if (compare(cmd_str, nochinese_cmd, FALSE))
- {
- ee_chinese = FALSE;
-#ifdef NCURSE
- nc_clearattrib(A_NC_BIG5);
-#endif /* NCURSE */
- }
- else if (compare(cmd_str, QUIT_string, FALSE))
- quit(0);
- else if (*cmd_str == '!')
- {
- cmd_str++;
- if ((*cmd_str == ' ') || (*cmd_str == 9))
- cmd_str = next_word(cmd_str);
- sh_command(cmd_str);
- }
- else if ((*cmd_str == '<') && (!in_pipe))
- {
- in_pipe = TRUE;
- shell_fork = FALSE;
- cmd_str++;
- if ((*cmd_str == ' ') || (*cmd_str == '\t'))
- cmd_str = next_word(cmd_str);
- command(cmd_str);
- in_pipe = FALSE;
- shell_fork = TRUE;
- }
- else if ((*cmd_str == '>') && (!out_pipe))
- {
- out_pipe = TRUE;
- cmd_str++;
- if ((*cmd_str == ' ') || (*cmd_str == '\t'))
- cmd_str = next_word(cmd_str);
- command(cmd_str);
- out_pipe = FALSE;
- }
- else
- {
- wmove(com_win, 0, 0);
- wclrtoeol(com_win);
- wprintw(com_win, unkn_cmd_str, cmd_str);
- }
- if (cmd_str2 != NULL)
- free(cmd_str2);
-}
-
-int
-scan(line, offset, column) /* determine horizontal position for get_string */
-char *line;
-int offset;
-int column;
-{
- char *stemp;
- int i;
- int j;
-
- stemp = line;
- i = 0;
- j = column;
- while (i < offset)
- {
- i++;
- j += len_char(*stemp, j);
- stemp++;
- }
- return(j);
-}
-
-char *
-get_string(prompt, advance) /* read string from input on command line */
-char *prompt; /* string containing user prompt message */
-int advance; /* if true, skip leading spaces and tabs */
-{
- char *string;
- char *tmp_string;
- char *nam_str;
- char *g_point;
- int tmp_int;
- int g_horz, g_position, g_pos;
- int esc_flag;
-
- g_point = tmp_string = malloc(512);
- wmove(com_win,0,0);
- wclrtoeol(com_win);
- waddstr(com_win, prompt);
- wrefresh(com_win);
- nam_str = tmp_string;
- clear_com_win = TRUE;
- g_horz = g_position = scan(prompt, strlen(prompt), 0);
- g_pos = 0;
- do
- {
- esc_flag = FALSE;
- in = wgetch(com_win);
- if (in == -1)
- continue;
- if (((in == 8) || (in == 127) || (in == KEY_BACKSPACE)) && (g_pos > 0))
- {
- tmp_int = g_horz;
- g_pos--;
- g_horz = scan(g_point, g_pos, g_position);
- tmp_int = tmp_int - g_horz;
- for (; 0 < tmp_int; tmp_int--)
- {
- if ((g_horz+tmp_int) < (last_col - 1))
- {
- waddch(com_win, '\010');
- waddch(com_win, ' ');
- waddch(com_win, '\010');
- }
- }
- nam_str--;
- }
- else if ((in != 8) && (in != 127) && (in != '\n') && (in != '\r') && (in < 256))
- {
- if (in == '\026') /* control-v, accept next character verbatim */
- { /* allows entry of ^m, ^j, and ^h */
- esc_flag = TRUE;
- in = wgetch(com_win);
- if (in == -1)
- continue;
- }
- *nam_str = in;
- g_pos++;
- if (((in < ' ') || (in > 126)) && (g_horz < (last_col - 1)))
- g_horz += out_char(com_win, in, g_horz);
- else
- {
- g_horz++;
- if (g_horz < (last_col - 1))
- waddch(com_win, in);
- }
- nam_str++;
- }
- wrefresh(com_win);
- if (esc_flag)
- in = (char) NULL;
- } while ((in != '\n') && (in != '\r'));
- *nam_str = (char) NULL;
- nam_str = tmp_string;
- if (((*nam_str == ' ') || (*nam_str == 9)) && (advance))
- nam_str = next_word(nam_str);
- string = malloc(strlen(nam_str) + 1);
- strcpy(string, nam_str);
- free(tmp_string);
- wrefresh(com_win);
- return(string);
-}
-
-int
-compare(string1, string2, sensitive) /* compare two strings */
-char *string1;
-char *string2;
-int sensitive;
-{
- char *strng1;
- char *strng2;
- int tmp;
- int equal;
-
- strng1 = string1;
- strng2 = string2;
- tmp = 0;
- if ((strng1 == NULL) || (strng2 == NULL) || (*strng1 == (char) NULL) || (*strng2 == (char) NULL))
- return(FALSE);
- equal = TRUE;
- while (equal)
- {
- if (sensitive)
- {
- if (*strng1 != *strng2)
- equal = FALSE;
- }
- else
- {
- if (toupper(*strng1) != toupper(*strng2))
- equal = FALSE;
- }
- strng1++;
- strng2++;
- if ((*strng1 == (char) NULL) || (*strng2 == (char) NULL) || (*strng1 == ' ') || (*strng2 == ' '))
- break;
- tmp++;
- }
- return(equal);
-}
-
-void
-goto_line(cmd_str)
-char *cmd_str;
-{
- int number;
- int i;
- char *ptr;
- char *direction = NULL;
- struct text *t_line;
-
- ptr = cmd_str;
- i= 0;
- while ((*ptr >='0') && (*ptr <= '9'))
- {
- i= i * 10 + (*ptr - '0');
- ptr++;
- }
- number = i;
- i = 0;
- t_line = curr_line;
- while ((t_line->line_number > number) && (t_line->prev_line != NULL))
- {
- i++;
- t_line = t_line->prev_line;
- direction = "u";
- }
- while ((t_line->line_number < number) && (t_line->next_line != NULL))
- {
- i++;
- direction = "d";
- t_line = t_line->next_line;
- }
- if ((i < 30) && (i > 0))
- {
- move_rel(direction, i);
- }
- else
- {
- curr_line = t_line;
- point = curr_line->line;
- position = 1;
- midscreen((last_line / 2), point);
- scr_pos = scr_horz;
- }
- wmove(com_win, 0, 0);
- wclrtoeol(com_win);
- wprintw(com_win, line_num_str, curr_line->line_number);
- wmove(text_win, scr_vert, (scr_horz - horiz_offset));
-}
-
-void
-midscreen(line, pnt) /* put current line in middle of screen */
-int line;
-unsigned char *pnt;
-{
- struct text *mid_line;
- int i;
-
- line = min(line, last_line);
- mid_line = curr_line;
- for (i = 0; ((i < line) && (curr_line->prev_line != NULL)); i++)
- curr_line = curr_line->prev_line;
- scr_vert = scr_horz = 0;
- wmove(text_win, 0, 0);
- draw_screen();
- scr_vert = i;
- curr_line = mid_line;
- scanline(pnt);
- wmove(text_win, scr_vert, (scr_horz - horiz_offset));
-}
-
-void
-get_options(numargs, arguments) /* get arguments from command line */
-int numargs;
-char *arguments[];
-{
- char *buff;
- int count;
- struct files *temp_names = NULL;
- char *name;
- char *ptr;
- int no_more_opts = FALSE;
-
- /*
- | see if editor was invoked as 'ree' (restricted mode)
- */
-
- if (!(name = strrchr(arguments[0], '/')))
- name = arguments[0];
- else
- name++;
- if (!strcmp(name, "ree"))
- restricted = TRUE;
-
- top_of_stack = NULL;
- input_file = FALSE;
- recv_file = FALSE;
- count = 1;
- while ((count < numargs) && (!no_more_opts))
- {
- buff = arguments[count];
- if (!strcmp("-i", buff))
- {
- info_window = FALSE;
- }
- else if (!strcmp("-e", buff))
- {
- expand_tabs = FALSE;
- }
- else if (!strcmp("-h", buff))
- {
- nohighlight = TRUE;
- }
- else if (!strcmp("-?", buff))
- {
- fprintf(stderr, usage0, arguments[0]);
- fprintf(stderr, usage1);
- fprintf(stderr, usage2);
- fprintf(stderr, usage3);
- fprintf(stderr, usage4);
- exit(1);
- }
- else if (*buff == '+')
- {
- buff++;
- start_at_line = buff;
- }
- else if (!(strcmp("--", buff)))
- no_more_opts = TRUE;
- else
- {
- count--;
- no_more_opts = TRUE;
- }
- count++;
- }
- while (count < numargs)
- {
- buff = arguments[count];
- if (top_of_stack == NULL)
- {
- temp_names = top_of_stack = name_alloc();
- }
- else
- {
- temp_names->next_name = name_alloc();
- temp_names = temp_names->next_name;
- }
- ptr = temp_names->name = malloc(strlen(buff) + 1);
- while (*buff != (char) NULL)
- {
- *ptr = *buff;
- buff++;
- ptr++;
- }
- *ptr = (char) NULL;
- temp_names->next_name = NULL;
- input_file = TRUE;
- recv_file = TRUE;
- count++;
- }
-}
-
-void
-check_fp() /* open or close files according to flags */
-{
- int line_num;
- int temp;
- struct stat buf;
-
- clear_com_win = TRUE;
- tmp_vert = scr_vert;
- tmp_horz = scr_horz;
- tmp_line = curr_line;
- if (input_file)
- {
- in_file_name = tmp_file = top_of_stack->name;
- top_of_stack = top_of_stack->next_name;
- }
- temp = stat(tmp_file, &buf);
- buf.st_mode &= ~07777;
- if ((temp != -1) && (buf.st_mode != 0100000) && (buf.st_mode != 0))
- {
- wprintw(com_win, file_is_dir_msg, tmp_file);
- wrefresh(com_win);
- if (input_file)
- {
- quit(0);
- return;
- }
- else
- return;
- }
- if ((get_fd = open(tmp_file, O_RDONLY)) == -1)
- {
- wmove(com_win, 0, 0);
- wclrtoeol(com_win);
- if (input_file)
- wprintw(com_win, new_file_msg, tmp_file);
- else
- wprintw(com_win, cant_open_msg, tmp_file);
- wrefresh(com_win);
- wmove(text_win, scr_vert, (scr_horz - horiz_offset));
- wrefresh(text_win);
- recv_file = FALSE;
- input_file = FALSE;
- return;
- }
- else
- get_file(tmp_file);
-
- recv_file = FALSE;
- line_num = curr_line->line_number;
- scr_vert = tmp_vert;
- scr_horz = tmp_horz;
- if (input_file)
- curr_line= first_line;
- else
- curr_line = tmp_line;
- point = curr_line->line;
- draw_screen();
- if (input_file)
- {
- input_file = FALSE;
- if (start_at_line != NULL)
- {
- line_num = atoi(start_at_line) - 1;
- move_rel("d", line_num);
- line_num = 0;
- start_at_line = NULL;
- }
- }
- else
- {
- wmove(com_win, 0, 0);
- wclrtoeol(com_win);
- text_changes = TRUE;
- if ((tmp_file != NULL) && (*tmp_file != (char) NULL))
- wprintw(com_win, file_read_fin_msg, tmp_file);
- }
- wrefresh(com_win);
- wmove(text_win, scr_vert, (scr_horz - horiz_offset));
- wrefresh(text_win);
-}
-
-void
-get_file(file_name) /* read specified file into current buffer */
-char *file_name;
-{
- int can_read; /* file has at least one character */
- int length; /* length of line read by read */
- int append; /* should text be appended to current line */
- struct text *temp_line;
- char ro_flag = FALSE;
-
- if (recv_file) /* if reading a file */
- {
- wmove(com_win, 0, 0);
- wclrtoeol(com_win);
- wprintw(com_win, reading_file_msg, file_name);
- if (access(file_name, 2)) /* check permission to write */
- {
- if ((errno == ENOTDIR) || (errno == EACCES) || (errno == EROFS) || (errno == ETXTBSY) || (errno == EFAULT))
- {
- wprintw(com_win, read_only_msg);
- ro_flag = TRUE;
- }
- }
- wrefresh(com_win);
- }
- if (curr_line->line_length > 1) /* if current line is not blank */
- {
- insert_line(FALSE);
- left(FALSE);
- append = FALSE;
- }
- else
- append = TRUE;
- can_read = FALSE; /* test if file has any characters */
- while (((length = read(get_fd, in_string, 512)) != 0) && (length != -1))
- {
- can_read = TRUE; /* if set file has at least 1 character */
- get_line(length, in_string, &append);
- }
- if ((can_read) && (curr_line->line_length == 1))
- {
- temp_line = curr_line->prev_line;
- temp_line->next_line = curr_line->next_line;
- if (temp_line->next_line != NULL)
- temp_line->next_line->prev_line = temp_line;
- if (curr_line->line != NULL)
- free(curr_line->line);
- free(curr_line);
- curr_line = temp_line;
- }
- if (input_file) /* if this is the file to be edited display number of lines */
- {
- wmove(com_win, 0, 0);
- wclrtoeol(com_win);
- wprintw(com_win, file_read_lines_msg, in_file_name, curr_line->line_number);
- if (ro_flag)
- wprintw(com_win, read_only_msg);
- wrefresh(com_win);
- }
- else if (can_read) /* not input_file and file is non-zero size */
- text_changes = TRUE;
-
- if (recv_file) /* if reading a file */
- {
- in = EOF;
- }
-}
-
-void
-get_line(length, in_string, append) /* read string and split into lines */
-int length; /* length of string read by read */
-unsigned char *in_string; /* string read by read */
-int *append; /* TRUE if must append more text to end of current line */
-{
- unsigned char *str1;
- unsigned char *str2;
- int num; /* offset from start of string */
- int char_count; /* length of new line (or added portion */
- int temp_counter; /* temporary counter value */
- struct text *tline; /* temporary pointer to new line */
- int first_time; /* if TRUE, the first time through the loop */
-
- str2 = in_string;
- num = 0;
- first_time = TRUE;
- while (num < length)
- {
- if (!first_time)
- {
- if (num < length)
- {
- str2++;
- num++;
- }
- }
- else
- first_time = FALSE;
- str1 = str2;
- char_count = 1;
- /* find end of line */
- while ((*str2 != '\n') && (num < length))
- {
- str2++;
- num++;
- char_count++;
- }
- if (!(*append)) /* if not append to current line, insert new one */
- {
- tline = txtalloc(); /* allocate data structure for next line */
- tline->next_line = curr_line->next_line;
- renumber_lines(tline, curr_line->line_number + 1);
- tline->prev_line = curr_line;
- curr_line->next_line = tline;
- if (tline->next_line != NULL)
- tline->next_line->prev_line = tline;
- curr_line = tline;
- curr_line->line = point = (unsigned char *) malloc(char_count);
- curr_line->line_length = char_count;
- curr_line->max_length = char_count;
- }
- else
- {
- point = resiz_line(char_count, curr_line, curr_line->line_length);
- curr_line->line_length += (char_count - 1);
- }
- for (temp_counter = 1; temp_counter < char_count; temp_counter++)
- {
- *point = *str1;
- point++;
- str1++;
- }
- *point = (char) NULL;
- *append = FALSE;
- if ((num == length) && (*str2 != '\n'))
- *append = TRUE;
- }
-}
-
-void
-draw_screen() /* redraw the screen from current postion */
-{
- struct text *temp_line;
- unsigned char *line_out;
- int temp_vert;
-
- temp_line = curr_line;
- temp_vert = scr_vert;
- wclrtobot(text_win);
- while ((temp_line != NULL) && (temp_vert <= last_line))
- {
- line_out = temp_line->line;
- draw_line(temp_vert, 0, line_out, 1, temp_line->line_length);
- temp_vert++;
- temp_line = temp_line->next_line;
- }
- wmove(text_win, temp_vert, 0);
- wmove(text_win, scr_vert, (scr_horz - horiz_offset));
-}
-
-void
-finish() /* prepare to exit edit session */
-{
- char *file_name = in_file_name;
-
- /*
- | changes made here should be reflected in the 'save'
- | portion of file_op()
- */
-
- if ((file_name == NULL) || (*file_name == (char) NULL))
- file_name = get_string(save_file_name_prompt, TRUE);
-
- if ((file_name == NULL) || (*file_name == (char) NULL))
- {
- wmove(com_win, 0, 0);
- wprintw(com_win, file_not_saved_msg);
- wclrtoeol(com_win);
- wrefresh(com_win);
- clear_com_win = TRUE;
- return;
- }
-
- tmp_file = resolve_name(file_name);
- if (tmp_file != file_name)
- {
- free(file_name);
- file_name = tmp_file;
- }
-
- if (write_file(file_name, 1))
- {
- text_changes = FALSE;
- quit(0);
- }
-}
-
-int
-quit(noverify) /* exit editor */
-int noverify;
-{
- char *ans;
-
- touchwin(text_win);
- wrefresh(text_win);
- if ((text_changes) && (!noverify))
- {
- ans = get_string(changes_made_prompt, TRUE);
- if (toupper(*ans) == toupper(*yes_char))
- text_changes = FALSE;
- else
- return(0);
- free(ans);
- }
- if (top_of_stack == NULL)
- {
- if (info_window)
- wrefresh(info_win);
- wrefresh(com_win);
- resetty();
- endwin();
- putchar('\n');
- exit(0);
- }
- else
- {
- delete_text();
- recv_file = TRUE;
- input_file = TRUE;
- check_fp();
- text_changes = FALSE;
- }
- return(0);
-}
-
-void
-edit_abort(arg)
-int arg;
-{
- wrefresh(com_win);
- resetty();
- endwin();
- putchar('\n');
- exit(1);
-}
-
-void
-delete_text()
-{
- while (curr_line->next_line != NULL)
- curr_line = curr_line->next_line;
- while (curr_line != first_line)
- {
- free(curr_line->line);
- curr_line = curr_line->prev_line;
- free(curr_line->next_line);
- }
- curr_line->next_line = NULL;
- *curr_line->line = (char) NULL;
- curr_line->line_length = 1;
- curr_line->line_number = 1;
- point = curr_line->line;
- scr_pos = scr_vert = scr_horz = 0;
- position = 1;
-}
-
-int
-write_file(file_name, warn_if_exists)
-char *file_name;
-int warn_if_exists;
-{
- char cr;
- char *tmp_point;
- struct text *out_line;
- int lines, charac;
- int temp_pos;
- int write_flag = TRUE;
-
- charac = lines = 0;
- if (warn_if_exists &&
- ((in_file_name == NULL) || strcmp(in_file_name, file_name)))
- {
- if ((temp_fp = fopen(file_name, "r")))
- {
- tmp_point = get_string(file_exists_prompt, TRUE);
- if (toupper(*tmp_point) == toupper(*yes_char))
- write_flag = TRUE;
- else
- write_flag = FALSE;
- fclose(temp_fp);
- free(tmp_point);
- }
- }
-
- clear_com_win = TRUE;
-
- if (write_flag)
- {
- if ((temp_fp = fopen(file_name, "w")) == NULL)
- {
- clear_com_win = TRUE;
- wmove(com_win,0,0);
- wclrtoeol(com_win);
- wprintw(com_win, create_file_fail_msg, file_name);
- wrefresh(com_win);
- return(FALSE);
- }
- else
- {
- wmove(com_win,0,0);
- wclrtoeol(com_win);
- wprintw(com_win, writing_file_msg, file_name);
- wrefresh(com_win);
- cr = '\n';
- out_line = first_line;
- while (out_line != NULL)
- {
- temp_pos = 1;
- tmp_point= out_line->line;
- while (temp_pos < out_line->line_length)
- {
- putc(*tmp_point, temp_fp);
- tmp_point++;
- temp_pos++;
- }
- charac += out_line->line_length;
- out_line = out_line->next_line;
- putc(cr, temp_fp);
- lines++;
- }
- fclose(temp_fp);
- wmove(com_win,0,0);
- wclrtoeol(com_win);
- wprintw(com_win, file_written_msg, file_name, lines, charac);
- wrefresh(com_win);
- return(TRUE);
- }
- }
- else
- return(FALSE);
-}
-
-int
-search(display_message) /* search for string in srch_str */
-int display_message;
-{
- int lines_moved;
- int iter;
- int found;
-
- if ((srch_str == NULL) || (*srch_str == (char) NULL))
- return(FALSE);
- if (display_message)
- {
- wmove(com_win, 0, 0);
- wclrtoeol(com_win);
- wprintw(com_win, searching_msg);
- wrefresh(com_win);
- clear_com_win = TRUE;
- }
- lines_moved = 0;
- found = FALSE;
- srch_line = curr_line;
- srch_1 = point;
- if (position < curr_line->line_length)
- srch_1++;
- iter = position + 1;
- while ((!found) && (srch_line != NULL))
- {
- while ((iter < srch_line->line_length) && (!found))
- {
- srch_2 = srch_1;
- if (case_sen) /* if case sensitive */
- {
- srch_3 = srch_str;
- while ((*srch_2 == *srch_3) && (*srch_3 != (char) NULL))
- {
- found = TRUE;
- srch_2++;
- srch_3++;
- } /* end while */
- }
- else /* if not case sensitive */
- {
- srch_3 = u_srch_str;
- while ((toupper(*srch_2) == *srch_3) && (*srch_3 != (char) NULL))
- {
- found = TRUE;
- srch_2++;
- srch_3++;
- }
- } /* end else */
- if (!((*srch_3 == (char) NULL) && (found)))
- {
- found = FALSE;
- if (iter < srch_line->line_length)
- srch_1++;
- iter++;
- }
- }
- if (!found)
- {
- srch_line = srch_line->next_line;
- if (srch_line != NULL)
- srch_1 = srch_line->line;
- iter = 1;
- lines_moved++;
- }
- }
- if (found)
- {
- if (display_message)
- {
- wmove(com_win, 0, 0);
- wclrtoeol(com_win);
- wrefresh(com_win);
- }
- if (lines_moved == 0)
- {
- while (position < iter)
- right(TRUE);
- }
- else
- {
- if (lines_moved < 30)
- {
- move_rel("d", lines_moved);
- while (position < iter)
- right(TRUE);
- }
- else
- {
- curr_line = srch_line;
- point = srch_1;
- position = iter;
- scanline(point);
- scr_pos = scr_horz;
- midscreen((last_line / 2), point);
- }
- }
- }
- else
- {
- if (display_message)
- {
- wmove(com_win, 0, 0);
- wclrtoeol(com_win);
- wprintw(com_win, str_not_found_msg, srch_str);
- wrefresh(com_win);
- }
- wmove(text_win, scr_vert,(scr_horz - horiz_offset));
- }
- return(found);
-}
-
-void
-search_prompt() /* prompt and read search string (srch_str) */
-{
- if (srch_str != NULL)
- free(srch_str);
- if ((u_srch_str != NULL) && (*u_srch_str != (char) NULL))
- free(u_srch_str);
- srch_str = get_string(search_prompt_str, FALSE);
- gold = FALSE;
- srch_3 = srch_str;
- srch_1 = u_srch_str = malloc(strlen(srch_str) + 1);
- while (*srch_3 != (char) NULL)
- {
- *srch_1 = toupper(*srch_3);
- srch_1++;
- srch_3++;
- }
- *srch_1 = (char) NULL;
- search(TRUE);
-}
-
-void
-del_char() /* delete current character */
-{
- in = 8; /* backspace */
- if (position < curr_line->line_length) /* if not end of line */
- {
- if ((ee_chinese) && (*point > 127) &&
- ((curr_line->line_length - position) >= 2))
- {
- point++;
- position++;
- }
- position++;
- point++;
- scanline(point);
- delete(TRUE);
- }
- else
- {
- right(FALSE);
- delete(FALSE);
- }
-}
-
-void
-undel_char() /* undelete last deleted character */
-{
- if (d_char[0] == '\n') /* insert line if last del_char deleted eol */
- insert_line(TRUE);
- else
- {
- in = d_char[0];
- insert(in);
- if (d_char[1] != (unsigned char) NULL)
- {
- in = d_char[1];
- insert(in);
- }
- }
-}
-
-void
-del_word() /* delete word in front of cursor */
-{
- int tposit;
- int difference;
- unsigned char *d_word2;
- unsigned char *d_word3;
- unsigned char tmp_char[3];
-
- if (d_word != NULL)
- free(d_word);
- d_word = malloc(curr_line->line_length);
- tmp_char[0] = d_char[0];
- tmp_char[1] = d_char[1];
- tmp_char[2] = d_char[2];
- d_word3 = point;
- d_word2 = d_word;
- tposit = position;
- while ((tposit < curr_line->line_length) &&
- ((*d_word3 != ' ') && (*d_word3 != '\t')))
- {
- tposit++;
- *d_word2 = *d_word3;
- d_word2++;
- d_word3++;
- }
- while ((tposit < curr_line->line_length) &&
- ((*d_word3 == ' ') || (*d_word3 == '\t')))
- {
- tposit++;
- *d_word2 = *d_word3;
- d_word2++;
- d_word3++;
- }
- *d_word2 = (char) NULL;
- d_wrd_len = difference = d_word2 - d_word;
- d_word2 = point;
- while (tposit < curr_line->line_length)
- {
- tposit++;
- *d_word2 = *d_word3;
- d_word2++;
- d_word3++;
- }
- curr_line->line_length -= difference;
- *d_word2 = (char) NULL;
- draw_line(scr_vert, scr_horz,point,position,curr_line->line_length);
- d_char[0] = tmp_char[0];
- d_char[1] = tmp_char[1];
- d_char[2] = tmp_char[2];
- text_changes = TRUE;
- formatted = FALSE;
-}
-
-void
-undel_word() /* undelete last deleted word */
-{
- int temp;
- int tposit;
- unsigned char *tmp_old_ptr;
- unsigned char *tmp_space;
- unsigned char *tmp_ptr;
- unsigned char *d_word_ptr;
-
- /*
- | resize line to handle undeleted word
- */
- if ((curr_line->max_length - (curr_line->line_length + d_wrd_len)) < 5)
- point = resiz_line(d_wrd_len, curr_line, position);
- tmp_ptr = tmp_space = malloc(curr_line->line_length + d_wrd_len);
- d_word_ptr = d_word;
- temp = 1;
- /*
- | copy d_word contents into temp space
- */
- while (temp <= d_wrd_len)
- {
- temp++;
- *tmp_ptr = *d_word_ptr;
- tmp_ptr++;
- d_word_ptr++;
- }
- tmp_old_ptr = point;
- tposit = position;
- /*
- | copy contents of line from curent position to eol into
- | temp space
- */
- while (tposit < curr_line->line_length)
- {
- temp++;
- tposit++;
- *tmp_ptr = *tmp_old_ptr;
- tmp_ptr++;
- tmp_old_ptr++;
- }
- curr_line->line_length += d_wrd_len;
- tmp_old_ptr = point;
- *tmp_ptr = (char) NULL;
- tmp_ptr = tmp_space;
- tposit = 1;
- /*
- | now copy contents from temp space back to original line
- */
- while (tposit < temp)
- {
- tposit++;
- *tmp_old_ptr = *tmp_ptr;
- tmp_ptr++;
- tmp_old_ptr++;
- }
- *tmp_old_ptr = (char) NULL;
- free(tmp_space);
- draw_line(scr_vert, scr_horz, point, position, curr_line->line_length);
-}
-
-void
-del_line() /* delete from cursor to end of line */
-{
- unsigned char *dl1;
- unsigned char *dl2;
- int tposit;
-
- if (d_line != NULL)
- free(d_line);
- d_line = malloc(curr_line->line_length);
- dl1 = d_line;
- dl2 = point;
- tposit = position;
- while (tposit < curr_line->line_length)
- {
- *dl1 = *dl2;
- dl1++;
- dl2++;
- tposit++;
- }
- dlt_line->line_length = 1 + tposit - position;
- *dl1 = (char) NULL;
- *point = (char) NULL;
- curr_line->line_length = position;
- wclrtoeol(text_win);
- if (curr_line->next_line != NULL)
- {
- right(FALSE);
- delete(FALSE);
- }
- text_changes = TRUE;
-}
-
-void
-undel_line() /* undelete last deleted line */
-{
- unsigned char *ud1;
- unsigned char *ud2;
- int tposit;
-
- if (dlt_line->line_length == 0)
- return;
-
- insert_line(TRUE);
- left(TRUE);
- point = resiz_line(dlt_line->line_length, curr_line, position);
- curr_line->line_length += dlt_line->line_length - 1;
- ud1 = point;
- ud2 = d_line;
- tposit = 1;
- while (tposit < dlt_line->line_length)
- {
- tposit++;
- *ud1 = *ud2;
- ud1++;
- ud2++;
- }
- *ud1 = (char) NULL;
- draw_line(scr_vert, scr_horz,point,position,curr_line->line_length);
-}
-
-void
-adv_word() /* advance to next word */
-{
-while ((position < curr_line->line_length) && ((*point != 32) && (*point != 9)))
- right(TRUE);
-while ((position < curr_line->line_length) && ((*point == 32) || (*point == 9)))
- right(TRUE);
-}
-
-void
-move_rel(direction, lines) /* move relative to current line */
-char *direction;
-int lines;
-{
- int i;
- char *tmp;
-
- if (*direction == 'u')
- {
- scr_pos = 0;
- while (position > 1)
- left(TRUE);
- for (i = 0; i < lines; i++)
- {
- up();
- }
- if ((last_line > 5) && ( scr_vert < 4))
- {
- tmp = point;
- tmp_line = curr_line;
- for (i= 0;(i<5)&&(curr_line->prev_line != NULL); i++)
- {
- up();
- }
- scr_vert = scr_vert + i;
- curr_line = tmp_line;
- point = tmp;
- scanline(point);
- }
- }
- else
- {
- if ((position != 1) && (curr_line->next_line != NULL))
- {
- nextline();
- scr_pos = scr_horz = 0;
- if (horiz_offset)
- {
- horiz_offset = 0;
- midscreen(scr_vert, point);
- }
- }
- else
- adv_line();
- for (i = 1; i < lines; i++)
- {
- down();
- }
- if ((last_line > 10) && (scr_vert > (last_line - 5)))
- {
- tmp = point;
- tmp_line = curr_line;
- for (i=0; (i<5) && (curr_line->next_line != NULL); i++)
- {
- down();
- }
- scr_vert = scr_vert - i;
- curr_line = tmp_line;
- point = tmp;
- scanline(point);
- }
- }
- wmove(text_win, scr_vert, (scr_horz - horiz_offset));
-}
-
-void
-eol() /* go to end of line */
-{
- if (position < curr_line->line_length)
- {
- while (position < curr_line->line_length)
- right(TRUE);
- }
- else if (curr_line->next_line != NULL)
- {
- right(TRUE);
- while (position < curr_line->line_length)
- right(TRUE);
- }
-}
-
-void
-bol() /* move to beginning of line */
-{
- if (point != curr_line->line)
- {
- while (point != curr_line->line)
- left(TRUE);
- }
- else if (curr_line->prev_line != NULL)
- {
- scr_pos = 0;
- up();
- }
-}
-
-void
-adv_line() /* advance to beginning of next line */
-{
- if ((point != curr_line->line) || (scr_pos > 0))
- {
- while (position < curr_line->line_length)
- right(TRUE);
- right(TRUE);
- }
- else if (curr_line->next_line != NULL)
- {
- scr_pos = 0;
- down();
- }
-}
-
-void
-sh_command(string) /* execute shell command */
-char *string; /* string containing user command */
-{
- char *temp_point;
- char *last_slash;
- char *path; /* directory path to executable */
- int parent; /* zero if child, child's pid if parent */
- int value;
- int return_val;
- struct text *line_holder;
-
- if (restrict_mode())
- {
- return;
- }
-
- if (!(path = getenv("SHELL")))
- path = "/bin/sh";
- last_slash = temp_point = path;
- while (*temp_point != (char) NULL)
- {
- if (*temp_point == '/')
- last_slash = ++temp_point;
- else
- temp_point++;
- }
-
- /*
- | if in_pipe is true, then output of the shell operation will be
- | read by the editor, and curses doesn't need to be turned off
- */
-
- if (!in_pipe)
- {
- keypad(com_win, FALSE);
- keypad(text_win, FALSE);
- echo();
- nl();
- noraw();
- resetty();
-
-#ifndef NCURSE
- endwin();
-#endif
- }
-
- if (in_pipe)
- {
- pipe(pipe_in); /* create a pipe */
- parent = fork();
- if (!parent) /* if the child */
- {
-/*
- | child process which will fork and exec shell command (if shell output is
- | to be read by editor)
- */
- in_pipe = FALSE;
-/*
- | redirect stdout to pipe
- */
- temp_stdout = dup(1);
- close(1);
- dup(pipe_in[1]);
-/*
- | redirect stderr to pipe
- */
- temp_stderr = dup(2);
- close(2);
- dup(pipe_in[1]);
- close(pipe_in[1]);
- /*
- | child will now continue down 'if (!in_pipe)'
- | path below
- */
- }
- else /* if the parent */
- {
-/*
- | prepare editor to read from the pipe
- */
- signal(SIGCHLD, SIG_IGN);
- line_holder = curr_line;
- tmp_vert = scr_vert;
- close(pipe_in[1]);
- get_fd = pipe_in[0];
- get_file("");
- close(pipe_in[0]);
- scr_vert = tmp_vert;
- scr_horz = scr_pos = 0;
- position = 1;
- curr_line = line_holder;
- point = curr_line->line;
- out_pipe = FALSE;
- signal(SIGCHLD, SIG_DFL);
-/*
- | since flag "in_pipe" is still TRUE, the path which waits for the child
- | process to die will be avoided.
- | (the pipe is closed, no more output can be expected)
- */
- }
- }
- if (!in_pipe)
- {
- signal(SIGINT, SIG_IGN);
- if (out_pipe)
- {
- pipe(pipe_out);
- }
-/*
- | fork process which will exec command
- */
- parent = fork();
- if (!parent) /* if the child */
- {
- if (shell_fork)
- putchar('\n');
- if (out_pipe)
- {
-/*
- | prepare the child process (soon to exec a shell command) to read from the
- | pipe (which will be output from the editor's buffer)
- */
- close(0);
- dup(pipe_out[0]);
- close(pipe_out[0]);
- close(pipe_out[1]);
- }
- for (value = 1; value < 24; value++)
- signal(value, SIG_DFL);
- execl(path, last_slash, "-c", string, (char *)NULL);
- errx(1, exec_err_msg, path);
- }
- else /* if the parent */
- {
- if (out_pipe)
- {
-/*
- | output the contents of the buffer to the pipe (to be read by the
- | process forked and exec'd above as stdin)
- */
- close(pipe_out[0]);
- line_holder = first_line;
- while (line_holder != NULL)
- {
- write(pipe_out[1], line_holder->line, (line_holder->line_length-1));
- write(pipe_out[1], "\n", 1);
- line_holder = line_holder->next_line;
- }
- close(pipe_out[1]);
- out_pipe = FALSE;
- }
- do
- {
- return_val = wait((int *) 0);
- }
- while ((return_val != parent) && (return_val != -1));
-/*
- | if this process is actually the child of the editor, exit. Here's how it
- | works:
- | The editor forks a process. If output must be sent to the command to be
- | exec'd another process is forked, and that process (the child's child)
- | will exec the command. In this case, "shell_fork" will be FALSE. If no
- | output is to be performed to the shell command, "shell_fork" will be TRUE.
- | If this is the editor process, shell_fork will be true, otherwise this is
- | the child of the edit process.
- */
- if (!shell_fork)
- exit(0);
- }
- signal(SIGINT, edit_abort);
- }
- if (shell_fork)
- {
- printf("%s", continue_msg);
- fflush(stdout);
- while ((in = getchar()) != '\n')
- ;
- }
-
- if (!in_pipe)
- {
- fixterm();
- noecho();
- nonl();
- raw();
- keypad(text_win, TRUE);
- keypad(com_win, TRUE);
- if (info_window)
- clearok(info_win, TRUE);
- }
-
- redraw();
-}
-
-void
-set_up_term() /* set up the terminal for operating with ae */
-{
- if (!curses_initialized)
- {
- initscr();
- savetty();
- noecho();
- raw();
- nonl();
- curses_initialized = TRUE;
- }
-
- if (((LINES > 15) && (COLS >= 80)) && info_window)
- last_line = LINES - 8;
- else
- {
- info_window = FALSE;
- last_line = LINES - 2;
- }
-
- idlok(stdscr, TRUE);
- com_win = newwin(1, COLS, (LINES - 1), 0);
- keypad(com_win, TRUE);
- idlok(com_win, TRUE);
- wrefresh(com_win);
- if (!info_window)
- text_win = newwin((LINES - 1), COLS, 0, 0);
- else
- text_win = newwin((LINES - 7), COLS, 6, 0);
- keypad(text_win, TRUE);
- idlok(text_win, TRUE);
- wrefresh(text_win);
- help_win = newwin((LINES - 1), COLS, 0, 0);
- keypad(help_win, TRUE);
- idlok(help_win, TRUE);
- if (info_window)
- {
- info_type = CONTROL_KEYS;
- info_win = newwin(5, COLS, 0, 0);
- werase(info_win);
- paint_info_win();
- count_win = newwin(1, COLS, 5, 0);
- leaveok(count_win, TRUE);
- wrefresh(count_win);
- }
-
- last_col = COLS - 1;
- local_LINES = LINES;
- local_COLS = COLS;
-
-#ifdef NCURSE
- if (ee_chinese)
- nc_setattrib(A_NC_BIG5);
-#endif /* NCURSE */
-
-}
-
-void
-resize_check()
-{
- if ((LINES == local_LINES) && (COLS == local_COLS))
- return;
-
- if (info_window)
- delwin(info_win);
- delwin(text_win);
- delwin(com_win);
- delwin(help_win);
- delwin(count_win);
- set_up_term();
- redraw();
- wrefresh(text_win);
-}
-
-static char item_alpha[] = "abcdefghijklmnopqrstuvwxyz0123456789 ";
-
-int
-menu_op(menu_list)
-struct menu_entries menu_list[];
-{
- WINDOW *temp_win;
- int max_width, max_height;
- int x_off, y_off;
- int counter;
- int length;
- int input;
- int temp = 0;
- int list_size;
- int top_offset; /* offset from top where menu items start */
- int vert_pos; /* vertical position */
- int vert_size; /* vertical size for menu list item display */
- int off_start = 1; /* offset from start of menu items to start display */
-
-
- /*
- | determine number and width of menu items
- */
-
- list_size = 1;
- while (menu_list[list_size + 1].item_string != NULL)
- list_size++;
- max_width = 0;
- for (counter = 0; counter <= list_size; counter++)
- {
- if ((length = strlen(menu_list[counter].item_string)) > max_width)
- max_width = length;
- }
- max_width += 3;
- max_width = max(max_width, strlen(menu_cancel_msg));
- max_width = max(max_width, max(strlen(more_above_str), strlen(more_below_str)));
- max_width += 6;
-
- /*
- | make sure that window is large enough to handle menu
- | if not, print error message and return to calling function
- */
-
- if (max_width > COLS)
- {
- wmove(com_win, 0, 0);
- werase(com_win);
- wprintw(com_win, menu_too_lrg_msg);
- wrefresh(com_win);
- clear_com_win = TRUE;
- return(0);
- }
-
- top_offset = 0;
-
- if (list_size > LINES)
- {
- max_height = LINES;
- if (max_height > 11)
- vert_size = max_height - 8;
- else
- vert_size = max_height;
- }
- else
- {
- vert_size = list_size;
- max_height = list_size;
- }
-
- if (LINES >= (vert_size + 8))
- {
- if (menu_list[0].argument != MENU_WARN)
- max_height = vert_size + 8;
- else
- max_height = vert_size + 7;
- top_offset = 4;
- }
- x_off = (COLS - max_width) / 2;
- y_off = (LINES - max_height - 1) / 2;
- temp_win = newwin(max_height, max_width, y_off, x_off);
- keypad(temp_win, TRUE);
-
- paint_menu(menu_list, max_width, max_height, list_size, top_offset, temp_win, off_start, vert_size);
-
- counter = 1;
- vert_pos = 0;
- do
- {
- if (off_start > 2)
- wmove(temp_win, (1 + counter + top_offset - off_start), 3);
- else
- wmove(temp_win, (counter + top_offset - off_start), 3);
-
- wrefresh(temp_win);
- input = wgetch(temp_win);
-
- if (((tolower(input) >= 'a') && (tolower(input) <= 'z')) ||
- ((input >= '0') && (input <= '9')))
- {
- if ((tolower(input) >= 'a') && (tolower(input) <= 'z'))
- {
- temp = 1 + tolower(input) - 'a';
- }
- else if ((input >= '0') && (input <= '9'))
- {
- temp = (2 + 'z' - 'a') + (input - '0');
- }
-
- if (temp <= list_size)
- {
- input = '\n';
- counter = temp;
- }
- }
- else
- {
- switch (input)
- {
- case ' ': /* space */
- case '\004': /* ^d, down */
- case KEY_RIGHT:
- case KEY_DOWN:
- counter++;
- if (counter > list_size)
- counter = 1;
- break;
- case '\010': /* ^h, backspace*/
- case '\025': /* ^u, up */
- case 127: /* ^?, delete */
- case KEY_BACKSPACE:
- case KEY_LEFT:
- case KEY_UP:
- counter--;
- if (counter == 0)
- counter = list_size;
- break;
- case '\033': /* escape key */
- if (menu_list[0].argument != MENU_WARN)
- counter = 0;
- break;
- case '\014': /* ^l */
- case '\022': /* ^r, redraw */
- paint_menu(menu_list, max_width, max_height,
- list_size, top_offset, temp_win,
- off_start, vert_size);
- break;
- default:
- break;
- }
- }
-
- if (((list_size - off_start) >= (vert_size - 1)) &&
- (counter > (off_start + vert_size - 3)) &&
- (off_start > 1))
- {
- if (counter == list_size)
- off_start = (list_size - vert_size) + 2;
- else
- off_start++;
-
- paint_menu(menu_list, max_width, max_height,
- list_size, top_offset, temp_win, off_start,
- vert_size);
- }
- else if ((list_size != vert_size) &&
- (counter > (off_start + vert_size - 2)))
- {
- if (counter == list_size)
- off_start = 2 + (list_size - vert_size);
- else if (off_start == 1)
- off_start = 3;
- else
- off_start++;
-
- paint_menu(menu_list, max_width, max_height,
- list_size, top_offset, temp_win, off_start,
- vert_size);
- }
- else if (counter < off_start)
- {
- if (counter <= 2)
- off_start = 1;
- else
- off_start = counter;
-
- paint_menu(menu_list, max_width, max_height,
- list_size, top_offset, temp_win, off_start,
- vert_size);
- }
- }
- while ((input != '\r') && (input != '\n') && (counter != 0));
-
- werase(temp_win);
- wrefresh(temp_win);
- delwin(temp_win);
-
- if ((menu_list[counter].procedure != NULL) ||
- (menu_list[counter].iprocedure != NULL) ||
- (menu_list[counter].nprocedure != NULL))
- {
- if (menu_list[counter].argument != -1)
- (*menu_list[counter].iprocedure)(menu_list[counter].argument);
- else if (menu_list[counter].ptr_argument != NULL)
- (*menu_list[counter].procedure)(menu_list[counter].ptr_argument);
- else
- (*menu_list[counter].nprocedure)();
- }
-
- if (info_window)
- paint_info_win();
- redraw();
-
- return(counter);
-}
-
-void
-paint_menu(menu_list, max_width, max_height, list_size, top_offset, menu_win,
- off_start, vert_size)
-struct menu_entries menu_list[];
-int max_width, max_height, list_size, top_offset;
-WINDOW *menu_win;
-int off_start, vert_size;
-{
- int counter, temp_int;
-
- werase(menu_win);
-
- /*
- | output top and bottom portions of menu box only if window
- | large enough
- */
-
- if (max_height > vert_size)
- {
- wmove(menu_win, 1, 1);
- if (!nohighlight)
- wstandout(menu_win);
- waddch(menu_win, '+');
- for (counter = 0; counter < (max_width - 4); counter++)
- waddch(menu_win, '-');
- waddch(menu_win, '+');
-
- wmove(menu_win, (max_height - 2), 1);
- waddch(menu_win, '+');
- for (counter = 0; counter < (max_width - 4); counter++)
- waddch(menu_win, '-');
- waddch(menu_win, '+');
- wstandend(menu_win);
- wmove(menu_win, 2, 3);
- waddstr(menu_win, menu_list[0].item_string);
- wmove(menu_win, (max_height - 3), 3);
- if (menu_list[0].argument != MENU_WARN)
- waddstr(menu_win, menu_cancel_msg);
- }
- if (!nohighlight)
- wstandout(menu_win);
-
- for (counter = 0; counter < (vert_size + top_offset); counter++)
- {
- if (top_offset == 4)
- {
- temp_int = counter + 2;
- }
- else
- temp_int = counter;
-
- wmove(menu_win, temp_int, 1);
- waddch(menu_win, '|');
- wmove(menu_win, temp_int, (max_width - 2));
- waddch(menu_win, '|');
- }
- wstandend(menu_win);
-
- if (list_size > vert_size)
- {
- if (off_start >= 3)
- {
- temp_int = 1;
- wmove(menu_win, top_offset, 3);
- waddstr(menu_win, more_above_str);
- }
- else
- temp_int = 0;
-
- for (counter = off_start;
- ((temp_int + counter - off_start) < (vert_size - 1));
- counter++)
- {
- wmove(menu_win, (top_offset + temp_int +
- (counter - off_start)), 3);
- if (list_size > 1)
- wprintw(menu_win, "%c) ", item_alpha[min((counter - 1), max_alpha_char)]);
- waddstr(menu_win, menu_list[counter].item_string);
- }
-
- wmove(menu_win, (top_offset + (vert_size - 1)), 3);
-
- if (counter == list_size)
- {
- if (list_size > 1)
- wprintw(menu_win, "%c) ", item_alpha[min((counter - 1), max_alpha_char)]);
- wprintw(menu_win, menu_list[counter].item_string);
- }
- else
- wprintw(menu_win, more_below_str);
- }
- else
- {
- for (counter = 1; counter <= list_size; counter++)
- {
- wmove(menu_win, (top_offset + counter - 1), 3);
- if (list_size > 1)
- wprintw(menu_win, "%c) ", item_alpha[min((counter - 1), max_alpha_char)]);
- waddstr(menu_win, menu_list[counter].item_string);
- }
- }
-}
-
-void
-help()
-{
- int counter;
-
- werase(help_win);
- clearok(help_win, TRUE);
- for (counter = 0; counter < 22; counter++)
- {
- wmove(help_win, counter, 0);
- waddstr(help_win, (emacs_keys_mode) ?
- emacs_help_text[counter] : help_text[counter]);
- }
- wrefresh(help_win);
- werase(com_win);
- wmove(com_win, 0, 0);
- wprintw(com_win, press_any_key_msg);
- wrefresh(com_win);
- counter = wgetch(com_win);
- werase(com_win);
- wmove(com_win, 0, 0);
- werase(help_win);
- wrefresh(help_win);
- wrefresh(com_win);
- redraw();
-}
-
-void
-paint_info_win()
-{
- int counter;
-
- if (!info_window)
- return;
-
- werase(info_win);
- for (counter = 0; counter < 5; counter++)
- {
- wmove(info_win, counter, 0);
- wclrtoeol(info_win);
- if (info_type == CONTROL_KEYS)
- waddstr(info_win, (emacs_keys_mode) ?
- emacs_control_keys[counter] : control_keys[counter]);
- else if (info_type == COMMANDS)
- waddstr(info_win, command_strings[counter]);
- }
- wrefresh(info_win);
-}
-
-void
-no_info_window()
-{
- if (!info_window)
- return;
- delwin(info_win);
- delwin(text_win);
- info_window = FALSE;
- last_line = LINES - 2;
- text_win = newwin((LINES - 1), COLS, 0, 0);
- keypad(text_win, TRUE);
- idlok(text_win, TRUE);
- clearok(text_win, TRUE);
- midscreen(scr_vert, point);
- wrefresh(text_win);
- clear_com_win = TRUE;
-}
-
-void
-create_info_window()
-{
- if (info_window)
- return;
- last_line = LINES - 8;
- delwin(text_win);
- text_win = newwin((LINES - 7), COLS, 6, 0);
- keypad(text_win, TRUE);
- idlok(text_win, TRUE);
- werase(text_win);
- info_window = TRUE;
- info_win = newwin(5, COLS, 0, 0);
- werase(info_win);
- info_type = CONTROL_KEYS;
- midscreen(min(scr_vert, last_line), point);
- clearok(info_win, TRUE);
- paint_info_win();
- count_win = newwin(1, COLS, 5, 0);
- leaveok(count_win, TRUE);
- wrefresh(count_win);
- wrefresh(text_win);
- clear_com_win = TRUE;
-}
-
-int
-file_op(arg)
-int arg;
-{
- char *string;
- int flag;
-
- if (restrict_mode())
- {
- return(0);
- }
-
- if (arg == READ_FILE)
- {
- string = get_string(file_read_prompt_str, TRUE);
- recv_file = TRUE;
- tmp_file = resolve_name(string);
- check_fp();
- if (tmp_file != string)
- free(tmp_file);
- free(string);
- }
- else if (arg == WRITE_FILE)
- {
- string = get_string(file_write_prompt_str, TRUE);
- tmp_file = resolve_name(string);
- write_file(tmp_file, 1);
- if (tmp_file != string)
- free(tmp_file);
- free(string);
- }
- else if (arg == SAVE_FILE)
- {
- /*
- | changes made here should be reflected in finish()
- */
-
- if (in_file_name)
- flag = TRUE;
- else
- flag = FALSE;
-
- string = in_file_name;
- if ((string == NULL) || (*string == (char) NULL))
- string = get_string(save_file_name_prompt, TRUE);
- if ((string == NULL) || (*string == (char) NULL))
- {
- wmove(com_win, 0, 0);
- wprintw(com_win, file_not_saved_msg);
- wclrtoeol(com_win);
- wrefresh(com_win);
- clear_com_win = TRUE;
- return(0);
- }
- if (!flag)
- {
- tmp_file = resolve_name(string);
- if (tmp_file != string)
- {
- free(string);
- string = tmp_file;
- }
- }
- if (write_file(string, 1))
- {
- in_file_name = string;
- text_changes = FALSE;
- }
- else if (!flag)
- free(string);
- }
- return(0);
-}
-
-void
-shell_op()
-{
- char *string;
-
- if (((string = get_string(shell_prompt, TRUE)) != NULL) &&
- (*string != (char) NULL))
- {
- sh_command(string);
- free(string);
- }
-}
-
-void
-leave_op()
-{
- if (text_changes)
- {
- menu_op(leave_menu);
- }
- else
- quit(TRUE);
-}
-
-void
-redraw()
-{
- if (info_window)
- {
- clearok(info_win, TRUE);
- paint_info_win();
- }
- else
- clearok(text_win, TRUE);
- midscreen(scr_vert, point);
-}
-
-/*
- | The following routines will "format" a paragraph (as defined by a
- | block of text with blank lines before and after the block).
- */
-
-int
-Blank_Line(test_line) /* test if line has any non-space characters */
-struct text *test_line;
-{
- unsigned char *line;
- int length;
-
- if (test_line == NULL)
- return(TRUE);
-
- length = 1;
- line = test_line->line;
-
- /*
- | To handle troff/nroff documents, consider a line with a
- | period ('.') in the first column to be blank. To handle mail
- | messages with included text, consider a line with a '>' blank.
- */
-
- if ((*line == '.') || (*line == '>'))
- return(TRUE);
-
- while (((*line == ' ') || (*line == '\t')) && (length < test_line->line_length))
- {
- length++;
- line++;
- }
- if (length != test_line->line_length)
- return(FALSE);
- else
- return(TRUE);
-}
-
-void
-Format() /* format the paragraph according to set margins */
-{
- int string_count;
- int offset;
- int temp_case;
- int status;
- int tmp_af;
- int counter;
- unsigned char *line;
- unsigned char *tmp_srchstr;
- unsigned char *temp1, *temp2;
- unsigned char *temp_dword;
- unsigned char temp_d_char[3];
-
- temp_d_char[0] = d_char[0];
- temp_d_char[1] = d_char[1];
- temp_d_char[2] = d_char[2];
-
-/*
- | if observ_margins is not set, or the current line is blank,
- | do not format the current paragraph
- */
-
- if ((!observ_margins) || (Blank_Line(curr_line)))
- return;
-
-/*
- | save the currently set flags, and clear them
- */
-
- wmove(com_win, 0, 0);
- wclrtoeol(com_win);
- wprintw(com_win, formatting_msg);
- wrefresh(com_win);
-
-/*
- | get current position in paragraph, so after formatting, the cursor
- | will be in the same relative position
- */
-
- tmp_af = auto_format;
- auto_format = FALSE;
- offset = position;
- if (position != 1)
- prev_word();
- temp_dword = d_word;
- d_word = NULL;
- temp_case = case_sen;
- case_sen = TRUE;
- tmp_srchstr = srch_str;
- temp2 = srch_str = (unsigned char *) malloc(1 + curr_line->line_length - position);
- if ((*point == ' ') || (*point == '\t'))
- adv_word();
- offset -= position;
- counter = position;
- line = temp1 = point;
- while ((*temp1 != (char) NULL) && (*temp1 != ' ') && (*temp1 != '\t') && (counter < curr_line->line_length))
- {
- *temp2 = *temp1;
- temp2++;
- temp1++;
- counter++;
- }
- *temp2 = (char) NULL;
- if (position != 1)
- bol();
- while (!Blank_Line(curr_line->prev_line))
- bol();
- string_count = 0;
- status = TRUE;
- while ((line != point) && (status))
- {
- status = search(FALSE);
- string_count++;
- }
-
- wmove(com_win, 0, 0);
- wclrtoeol(com_win);
- wprintw(com_win, formatting_msg);
- wrefresh(com_win);
-
-/*
- | now get back to the start of the paragraph to start formatting
- */
-
- if (position != 1)
- bol();
- while (!Blank_Line(curr_line->prev_line))
- bol();
-
- observ_margins = FALSE;
-
-/*
- | Start going through lines, putting spaces at end of lines if they do
- | not already exist. Append lines together to get one long line, and
- | eliminate spacing at begin of lines.
- */
-
- while (!Blank_Line(curr_line->next_line))
- {
- eol();
- left(TRUE);
- if (*point != ' ')
- {
- right(TRUE);
- insert(' ');
- }
- else
- right(TRUE);
- del_char();
- if ((*point == ' ') || (*point == '\t'))
- del_word();
- }
-
-/*
- | Now there is one long line. Eliminate extra spaces within the line
- | after the first word (so as not to blow away any indenting the user
- | may have put in).
- */
-
- bol();
- adv_word();
- while (position < curr_line->line_length)
- {
- if ((*point == ' ') && (*(point + 1) == ' '))
- del_char();
- else
- right(TRUE);
- }
-
-/*
- | Now make sure there are two spaces after a '.'.
- */
-
- bol();
- while (position < curr_line->line_length)
- {
- if ((*point == '.') && (*(point + 1) == ' '))
- {
- right(TRUE);
- insert(' ');
- insert(' ');
- while (*point == ' ')
- del_char();
- }
- right(TRUE);
- }
-
- observ_margins = TRUE;
- bol();
-
- wmove(com_win, 0, 0);
- wclrtoeol(com_win);
- wprintw(com_win, formatting_msg);
- wrefresh(com_win);
-
-/*
- | create lines between margins
- */
-
- while (position < curr_line->line_length)
- {
- while ((scr_pos < right_margin) && (position < curr_line->line_length))
- right(TRUE);
- if (position < curr_line->line_length)
- {
- prev_word();
- if (position == 1)
- adv_word();
- insert_line(TRUE);
- }
- }
-
-/*
- | go back to begin of paragraph, put cursor back to original position
- */
-
- bol();
- while (!Blank_Line(curr_line->prev_line))
- bol();
-
-/*
- | find word cursor was in
- */
-
- while ((status) && (string_count > 0))
- {
- search(FALSE);
- string_count--;
- }
-
-/*
- | offset the cursor to where it was before from the start of the word
- */
-
- while (offset > 0)
- {
- offset--;
- right(TRUE);
- }
-
-/*
- | reset flags and strings to what they were before formatting
- */
-
- if (d_word != NULL)
- free(d_word);
- d_word = temp_dword;
- case_sen = temp_case;
- free(srch_str);
- srch_str = tmp_srchstr;
- d_char[0] = temp_d_char[0];
- d_char[1] = temp_d_char[1];
- d_char[2] = temp_d_char[2];
- auto_format = tmp_af;
-
- midscreen(scr_vert, point);
- werase(com_win);
- wrefresh(com_win);
-}
-
-unsigned char *init_name[3] = {
- "/usr/share/misc/init.ee",
- NULL,
- ".init.ee"
- };
-
-void
-ee_init() /* check for init file and read it if it exists */
-{
- FILE *init_file;
- unsigned char *string;
- unsigned char *str1;
- unsigned char *str2;
- char *home;
- int counter;
- int temp_int;
-
- string = getenv("HOME");
- if (!string)
- string = "/root"; /* Set to reasonable default so we don't crash */
- str1 = home = malloc(strlen(string)+10);
- strcpy(home, string);
- strcat(home, "/.init.ee");
- init_name[1] = home;
- string = malloc(512);
-
- for (counter = 0; counter < 3; counter++)
- {
- if (!(access(init_name[counter], 4)))
- {
- init_file = fopen(init_name[counter], "r");
- while ((str2 = fgets(string, 512, init_file)) != NULL)
- {
- str1 = str2 = string;
- while (*str2 != '\n')
- str2++;
- *str2 = (char) NULL;
-
- if (unique_test(string, init_strings) != 1)
- continue;
-
- if (compare(str1, CASE, FALSE))
- case_sen = TRUE;
- else if (compare(str1, NOCASE, FALSE))
- case_sen = FALSE;
- else if (compare(str1, EXPAND, FALSE))
- expand_tabs = TRUE;
- else if (compare(str1, NOEXPAND, FALSE))
- expand_tabs = FALSE;
- else if (compare(str1, INFO, FALSE))
- info_window = TRUE;
- else if (compare(str1, NOINFO, FALSE))
- info_window = FALSE;
- else if (compare(str1, MARGINS, FALSE))
- observ_margins = TRUE;
- else if (compare(str1, NOMARGINS, FALSE))
- observ_margins = FALSE;
- else if (compare(str1, AUTOFORMAT, FALSE))
- {
- auto_format = TRUE;
- observ_margins = TRUE;
- }
- else if (compare(str1, NOAUTOFORMAT, FALSE))
- auto_format = FALSE;
- else if (compare(str1, Echo, FALSE))
- {
- str1 = next_word(str1);
- if (*str1 != (char) NULL)
- echo_string(str1);
- }
- else if (compare(str1, PRINTCOMMAND, FALSE))
- {
- str1 = next_word(str1);
- print_command = malloc(strlen(str1)+1);
- strcpy(print_command, str1);
- }
- else if (compare(str1, RIGHTMARGIN, FALSE))
- {
- str1 = next_word(str1);
- if ((*str1 >= '0') && (*str1 <= '9'))
- {
- temp_int = atoi(str1);
- if (temp_int > 0)
- right_margin = temp_int;
- }
- }
- else if (compare(str1, HIGHLIGHT, FALSE))
- nohighlight = FALSE;
- else if (compare(str1, NOHIGHLIGHT, FALSE))
- nohighlight = TRUE;
- else if (compare(str1, EIGHTBIT, FALSE))
- eightbit = TRUE;
- else if (compare(str1, NOEIGHTBIT, FALSE))
- {
- eightbit = FALSE;
- ee_chinese = FALSE;
- }
- else if (compare(str1, EMACS_string, FALSE))
- emacs_keys_mode = TRUE;
- else if (compare(str1, NOEMACS_string, FALSE))
- emacs_keys_mode = FALSE;
- else if (compare(str1, chinese_cmd, FALSE))
- {
- ee_chinese = TRUE;
- eightbit = TRUE;
- }
- else if (compare(str1, nochinese_cmd, FALSE))
- ee_chinese = FALSE;
- }
- fclose(init_file);
- }
- }
- free(string);
- free(home);
-
- string = getenv("LANG");
- if (string != NULL)
- {
- if (strcmp(string, "zh_TW.big5") == 0)
- {
- ee_chinese = TRUE;
- eightbit = TRUE;
- }
- }
-}
-
-/*
- | Save current configuration to .init.ee file in the current directory.
- */
-
-void
-dump_ee_conf()
-{
- FILE *init_file;
- FILE *old_init_file = NULL;
- char *file_name = ".init.ee";
- char *home_dir = "~/.init.ee";
- char buffer[512];
- struct stat buf;
- char *string;
- int length;
- int option = 0;
-
- if (restrict_mode())
- {
- return;
- }
-
- option = menu_op(config_dump_menu);
-
- werase(com_win);
- wmove(com_win, 0, 0);
-
- if (option == 0)
- {
- wprintw(com_win, conf_not_saved_msg);
- wrefresh(com_win);
- return;
- }
- else if (option == 2)
- file_name = resolve_name(home_dir);
-
- /*
- | If a .init.ee file exists, move it to .init.ee.old.
- */
-
- if (stat(file_name, &buf) != -1)
- {
- sprintf(buffer, "%s.old", file_name);
- unlink(buffer);
- link(file_name, buffer);
- unlink(file_name);
- old_init_file = fopen(buffer, "r");
- }
-
- init_file = fopen(file_name, "w");
- if (init_file == NULL)
- {
- wprintw(com_win, conf_dump_err_msg);
- wrefresh(com_win);
- return;
- }
-
- if (old_init_file != NULL)
- {
- /*
- | Copy non-configuration info into new .init.ee file.
- */
- while ((string = fgets(buffer, 512, old_init_file)) != NULL)
- {
- length = strlen(string);
- string[length - 1] = (char) NULL;
-
- if (unique_test(string, init_strings) == 1)
- {
- if (compare(string, Echo, FALSE))
- {
- fprintf(init_file, "%s\n", string);
- }
- }
- else
- fprintf(init_file, "%s\n", string);
- }
-
- fclose(old_init_file);
- }
-
- fprintf(init_file, "%s\n", case_sen ? CASE : NOCASE);
- fprintf(init_file, "%s\n", expand_tabs ? EXPAND : NOEXPAND);
- fprintf(init_file, "%s\n", info_window ? INFO : NOINFO );
- fprintf(init_file, "%s\n", observ_margins ? MARGINS : NOMARGINS );
- fprintf(init_file, "%s\n", auto_format ? AUTOFORMAT : NOAUTOFORMAT );
- fprintf(init_file, "%s %s\n", PRINTCOMMAND, print_command);
- fprintf(init_file, "%s %d\n", RIGHTMARGIN, right_margin);
- fprintf(init_file, "%s\n", nohighlight ? NOHIGHLIGHT : HIGHLIGHT );
- fprintf(init_file, "%s\n", eightbit ? EIGHTBIT : NOEIGHTBIT );
- fprintf(init_file, "%s\n", emacs_keys_mode ? EMACS_string : NOEMACS_string );
- fprintf(init_file, "%s\n", ee_chinese ? chinese_cmd : nochinese_cmd );
-
- fclose(init_file);
-
- wprintw(com_win, conf_dump_success_msg, file_name);
- wrefresh(com_win);
-
- if ((option == 2) && (file_name != home_dir))
- {
- free(file_name);
- }
-}
-
-void
-echo_string(string) /* echo the given string */
-char *string;
-{
- char *temp;
- int Counter;
-
- temp = string;
- while (*temp != (char) NULL)
- {
- if (*temp == '\\')
- {
- temp++;
- if (*temp == 'n')
- putchar('\n');
- else if (*temp == 't')
- putchar('\t');
- else if (*temp == 'b')
- putchar('\b');
- else if (*temp == 'r')
- putchar('\r');
- else if (*temp == 'f')
- putchar('\f');
- else if ((*temp == 'e') || (*temp == 'E'))
- putchar('\033'); /* escape */
- else if (*temp == '\\')
- putchar('\\');
- else if (*temp == '\'')
- putchar('\'');
- else if ((*temp >= '0') && (*temp <= '9'))
- {
- Counter = 0;
- while ((*temp >= '0') && (*temp <= '9'))
- {
- Counter = (8 * Counter) + (*temp - '0');
- temp++;
- }
- putchar(Counter);
- temp--;
- }
- temp++;
- }
- else
- {
- putchar(*temp);
- temp++;
- }
- }
-
- fflush(stdout);
-}
-
-void
-spell_op() /* check spelling of words in the editor */
-{
- if (restrict_mode())
- {
- return;
- }
- top(); /* go to top of file */
- insert_line(FALSE); /* create two blank lines */
- insert_line(FALSE);
- top();
- command(shell_echo_msg);
- adv_line();
- wmove(com_win, 0, 0);
- wprintw(com_win, spell_in_prog_msg);
- wrefresh(com_win);
- command("<>!spell"); /* send contents of buffer to command 'spell'
- and read the results back into the editor */
-}
-
-void
-ispell_op()
-{
- char template[128], *name;
- char string[256];
- int fd;
-
- if (restrict_mode())
- {
- return;
- }
- (void)sprintf(template, "/tmp/ee.XXXXXXXX");
- name = mktemp(&template[0]);
- fd = open(name, O_CREAT | O_EXCL | O_RDWR, 0600);
- if (fd < 0) {
- wmove(com_win, 0, 0);
- wprintw(com_win, create_file_fail_msg, name);
- wrefresh(com_win);
- return;
- }
- close(fd);
- if (write_file(name, 0))
- {
- sprintf(string, "ispell %s", name);
- sh_command(string);
- delete_text();
- tmp_file = name;
- recv_file = TRUE;
- check_fp();
- unlink(name);
- }
-}
-
-int
-first_word_len(test_line)
-struct text *test_line;
-{
- int counter;
- unsigned char *pnt;
-
- if (test_line == NULL)
- return(0);
-
- pnt = test_line->line;
- if ((pnt == NULL) || (*pnt == (char) NULL) ||
- (*pnt == '.') || (*pnt == '>'))
- return(0);
-
- if ((*pnt == ' ') || (*pnt == '\t'))
- {
- pnt = next_word(pnt);
- }
-
- if (*pnt == (char) NULL)
- return(0);
-
- counter = 0;
- while ((*pnt != (char) NULL) && ((*pnt != ' ') && (*pnt != '\t')))
- {
- pnt++;
- counter++;
- }
- while ((*pnt != (char) NULL) && ((*pnt == ' ') || (*pnt == '\t')))
- {
- pnt++;
- counter++;
- }
- return(counter);
-}
-
-void
-Auto_Format() /* format the paragraph according to set margins */
-{
- int string_count;
- int offset;
- int temp_case;
- int word_len;
- int temp_dwl;
- int tmp_d_line_length;
- int leave_loop = FALSE;
- int status;
- int counter;
- char not_blank;
- unsigned char *line;
- unsigned char *tmp_srchstr;
- unsigned char *temp1, *temp2;
- unsigned char *temp_dword;
- unsigned char temp_d_char[3];
- unsigned char *tmp_d_line;
-
-
- temp_d_char[0] = d_char[0];
- temp_d_char[1] = d_char[1];
- temp_d_char[2] = d_char[2];
-
-/*
- | if observ_margins is not set, or the current line is blank,
- | do not format the current paragraph
- */
-
- if ((!observ_margins) || (Blank_Line(curr_line)))
- return;
-
-/*
- | get current position in paragraph, so after formatting, the cursor
- | will be in the same relative position
- */
-
- tmp_d_line = d_line;
- tmp_d_line_length = dlt_line->line_length;
- d_line = NULL;
- auto_format = FALSE;
- offset = position;
- if ((position != 1) && ((*point == ' ') || (*point == '\t') || (position == curr_line->line_length) || (*point == (char) NULL)))
- prev_word();
- temp_dword = d_word;
- temp_dwl = d_wrd_len;
- d_wrd_len = 0;
- d_word = NULL;
- temp_case = case_sen;
- case_sen = TRUE;
- tmp_srchstr = srch_str;
- temp2 = srch_str = (unsigned char *) malloc(1 + curr_line->line_length - position);
- if ((*point == ' ') || (*point == '\t'))
- adv_word();
- offset -= position;
- counter = position;
- line = temp1 = point;
- while ((*temp1 != (char) NULL) && (*temp1 != ' ') && (*temp1 != '\t') && (counter < curr_line->line_length))
- {
- *temp2 = *temp1;
- temp2++;
- temp1++;
- counter++;
- }
- *temp2 = (char) NULL;
- if (position != 1)
- bol();
- while (!Blank_Line(curr_line->prev_line))
- bol();
- string_count = 0;
- status = TRUE;
- while ((line != point) && (status))
- {
- status = search(FALSE);
- string_count++;
- }
-
-/*
- | now get back to the start of the paragraph to start checking
- */
-
- if (position != 1)
- bol();
- while (!Blank_Line(curr_line->prev_line))
- bol();
-
-/*
- | Start going through lines, putting spaces at end of lines if they do
- | not already exist. Check line length, and move words to the next line
- | if they cross the margin. Then get words from the next line if they
- | will fit in before the margin.
- */
-
- counter = 0;
-
- while (!leave_loop)
- {
- if (position != curr_line->line_length)
- eol();
- left(TRUE);
- if (*point != ' ')
- {
- right(TRUE);
- insert(' ');
- }
- else
- right(TRUE);
-
- not_blank = FALSE;
-
- /*
- | fill line if first word on next line will fit
- | in the line without crossing the margin
- */
-
- while ((curr_line->next_line != NULL) &&
- ((word_len = first_word_len(curr_line->next_line)) > 0)
- && ((scr_pos + word_len) < right_margin))
- {
- adv_line();
- if ((*point == ' ') || (*point == '\t'))
- adv_word();
- del_word();
- if (position != 1)
- bol();
-
- /*
- | We know this line was not blank before, so
- | make sure that it doesn't have one of the
- | leading characters that indicate the line
- | should not be modified.
- |
- | We also know that this character should not
- | be left as the first character of this line.
- */
-
- if ((Blank_Line(curr_line)) &&
- (curr_line->line[0] != '.') &&
- (curr_line->line[0] != '>'))
- {
- del_line();
- not_blank = FALSE;
- }
- else
- not_blank = TRUE;
-
- /*
- | go to end of previous line
- */
- left(TRUE);
- undel_word();
- eol();
- /*
- | make sure there's a space at the end of the line
- */
- left(TRUE);
- if (*point != ' ')
- {
- right(TRUE);
- insert(' ');
- }
- else
- right(TRUE);
- }
-
- /*
- | make sure line does not cross right margin
- */
-
- while (right_margin <= scr_pos)
- {
- prev_word();
- if (position != 1)
- {
- del_word();
- if (Blank_Line(curr_line->next_line))
- insert_line(TRUE);
- else
- adv_line();
- if ((*point == ' ') || (*point == '\t'))
- adv_word();
- undel_word();
- not_blank = TRUE;
- if (position != 1)
- bol();
- left(TRUE);
- }
- }
-
- if ((!Blank_Line(curr_line->next_line)) || (not_blank))
- {
- adv_line();
- counter++;
- }
- else
- leave_loop = TRUE;
- }
-
-/*
- | go back to begin of paragraph, put cursor back to original position
- */
-
- if (position != 1)
- bol();
- while ((counter-- > 0) || (!Blank_Line(curr_line->prev_line)))
- bol();
-
-/*
- | find word cursor was in
- */
-
- status = TRUE;
- while ((status) && (string_count > 0))
- {
- status = search(FALSE);
- string_count--;
- }
-
-/*
- | offset the cursor to where it was before from the start of the word
- */
-
- while (offset > 0)
- {
- offset--;
- right(TRUE);
- }
-
- if ((string_count > 0) && (offset < 0))
- {
- while (offset < 0)
- {
- offset++;
- left(TRUE);
- }
- }
-
-/*
- | reset flags and strings to what they were before formatting
- */
-
- if (d_word != NULL)
- free(d_word);
- d_word = temp_dword;
- d_wrd_len = temp_dwl;
- case_sen = temp_case;
- free(srch_str);
- srch_str = tmp_srchstr;
- d_char[0] = temp_d_char[0];
- d_char[1] = temp_d_char[1];
- d_char[2] = temp_d_char[2];
- auto_format = TRUE;
- dlt_line->line_length = tmp_d_line_length;
- d_line = tmp_d_line;
-
- formatted = TRUE;
- midscreen(scr_vert, point);
-}
-
-void
-modes_op()
-{
- int ret_value;
- int counter;
- char *string;
-
- do
- {
- sprintf(modes_menu[1].item_string, "%s %s", mode_strings[1],
- (expand_tabs ? ON : OFF));
- sprintf(modes_menu[2].item_string, "%s %s", mode_strings[2],
- (case_sen ? ON : OFF));
- sprintf(modes_menu[3].item_string, "%s %s", mode_strings[3],
- (observ_margins ? ON : OFF));
- sprintf(modes_menu[4].item_string, "%s %s", mode_strings[4],
- (auto_format ? ON : OFF));
- sprintf(modes_menu[5].item_string, "%s %s", mode_strings[5],
- (eightbit ? ON : OFF));
- sprintf(modes_menu[6].item_string, "%s %s", mode_strings[6],
- (info_window ? ON : OFF));
- sprintf(modes_menu[7].item_string, "%s %s", mode_strings[7],
- (emacs_keys_mode ? ON : OFF));
- sprintf(modes_menu[8].item_string, "%s %d", mode_strings[8],
- right_margin);
- sprintf(modes_menu[9].item_string, "%s %s", mode_strings[9],
- (ee_chinese ? ON : OFF));
-
- ret_value = menu_op(modes_menu);
-
- switch (ret_value)
- {
- case 1:
- expand_tabs = !expand_tabs;
- break;
- case 2:
- case_sen = !case_sen;
- break;
- case 3:
- observ_margins = !observ_margins;
- break;
- case 4:
- auto_format = !auto_format;
- if (auto_format)
- observ_margins = TRUE;
- break;
- case 5:
- eightbit = !eightbit;
- if (!eightbit)
- ee_chinese = FALSE;
-#ifdef NCURSE
- if (ee_chinese)
- nc_setattrib(A_NC_BIG5);
- else
- nc_clearattrib(A_NC_BIG5);
-#endif /* NCURSE */
-
- redraw();
- wnoutrefresh(text_win);
- break;
- case 6:
- if (info_window)
- no_info_window();
- else
- create_info_window();
- break;
- case 7:
- emacs_keys_mode = !emacs_keys_mode;
- if (info_window)
- paint_info_win();
- break;
- case 8:
- string = get_string(margin_prompt, TRUE);
- if (string != NULL)
- {
- counter = atoi(string);
- if (counter > 0)
- right_margin = counter;
- free(string);
- }
- break;
- case 9:
- ee_chinese = !ee_chinese;
- if (ee_chinese != FALSE)
- eightbit = TRUE;
-#ifdef NCURSE
- if (ee_chinese)
- nc_setattrib(A_NC_BIG5);
- else
- nc_clearattrib(A_NC_BIG5);
-#endif /* NCURSE */
- redraw();
- break;
- default:
- break;
- }
- }
- while (ret_value != 0);
-}
-
-char *
-is_in_string(string, substring) /* a strchr() look-alike for systems without
- strchr() */
-char * string, *substring;
-{
- char *full, *sub;
-
- for (sub = substring; (sub != NULL) && (*sub != (char)NULL); sub++)
- {
- for (full = string; (full != NULL) && (*full != (char)NULL);
- full++)
- {
- if (*sub == *full)
- return(full);
- }
- }
- return(NULL);
-}
-
-/*
- | handle names of the form "~/file", "~user/file",
- | "$HOME/foo", "~/$FOO", etc.
- */
-
-char *
-resolve_name(name)
-char *name;
-{
- char long_buffer[1024];
- char short_buffer[128];
- char *buffer;
- char *slash;
- char *tmp;
- char *start_of_var;
- int offset;
- int index;
- int counter;
- struct passwd *user;
-
- if (name[0] == '~')
- {
- if (name[1] == '/')
- {
- index = getuid();
- user = (struct passwd *) getpwuid(index);
- slash = name + 1;
- }
- else
- {
- slash = strchr(name, '/');
- if (slash == NULL)
- return(name);
- *slash = (char) NULL;
- user = (struct passwd *) getpwnam((name + 1));
- *slash = '/';
- }
- if (user == NULL)
- {
- return(name);
- }
- buffer = malloc(strlen(user->pw_dir) + strlen(slash) + 1);
- strcpy(buffer, user->pw_dir);
- strcat(buffer, slash);
- }
- else
- buffer = name;
-
- if (is_in_string(buffer, "$"))
- {
- tmp = buffer;
- index = 0;
-
- while ((*tmp != (char) NULL) && (index < 1024))
- {
-
- while ((*tmp != (char) NULL) && (*tmp != '$') &&
- (index < 1024))
- {
- long_buffer[index] = *tmp;
- tmp++;
- index++;
- }
-
- if ((*tmp == '$') && (index < 1024))
- {
- counter = 0;
- start_of_var = tmp;
- tmp++;
- if (*tmp == '{') /* } */ /* bracketed variable name */
- {
- tmp++; /* { */
- while ((*tmp != (char) NULL) &&
- (*tmp != '}') &&
- (counter < 128))
- {
- short_buffer[counter] = *tmp;
- counter++;
- tmp++;
- } /* { */
- if (*tmp == '}')
- tmp++;
- }
- else
- {
- while ((*tmp != (char) NULL) &&
- (*tmp != '/') &&
- (*tmp != '$') &&
- (counter < 128))
- {
- short_buffer[counter] = *tmp;
- counter++;
- tmp++;
- }
- }
- short_buffer[counter] = (char) NULL;
- if ((slash = getenv(short_buffer)) != NULL)
- {
- offset = strlen(slash);
- if ((offset + index) < 1024)
- strcpy(&long_buffer[index], slash);
- index += offset;
- }
- else
- {
- while ((start_of_var != tmp) && (index < 1024))
- {
- long_buffer[index] = *start_of_var;
- start_of_var++;
- index++;
- }
- }
- }
- }
-
- if (index == 1024)
- return(buffer);
- else
- long_buffer[index] = (char) NULL;
-
- if (name != buffer)
- free(buffer);
- buffer = malloc(index + 1);
- strcpy(buffer, long_buffer);
- }
-
- return(buffer);
-}
-
-int
-restrict_mode()
-{
- if (!restricted)
- return(FALSE);
-
- wmove(com_win, 0, 0);
- wprintw(com_win, restricted_msg);
- wclrtoeol(com_win);
- wrefresh(com_win);
- clear_com_win = TRUE;
- return(TRUE);
-}
-
-/*
- | The following routine tests the input string against the list of
- | strings, to determine if the string is a unique match with one of the
- | valid values.
- */
-
-int
-unique_test(string, list)
-char *string;
-char *list[];
-{
- int counter;
- int num_match;
- int result;
-
- num_match = 0;
- counter = 0;
- while (list[counter] != NULL)
- {
- result = compare(string, list[counter], FALSE);
- if (result)
- num_match++;
- counter++;
- }
- return(num_match);
-}
-
-void
-renumber_lines(firstline, startnumber)
-struct text *firstline;
-int startnumber;
-{
- struct text *lineptr;
- int i;
-
- i = startnumber;
- for (lineptr = firstline; lineptr != NULL; lineptr = lineptr->next_line)
- lineptr->line_number = i++;
-}
-
-#ifndef NO_CATGETS
-/*
- | Get the catalog entry, and if it got it from the catalog,
- | make a copy, since the buffer will be overwritten by the
- | next call to catgets().
- */
-
-char *
-catgetlocal(number, string)
-int number;
-char *string;
-{
- char *temp1;
- char *temp2;
-
- temp1 = catgets(catalog, 1, number, string);
- if (temp1 != string)
- {
- temp2 = malloc(strlen(temp1) + 1);
- strcpy(temp2, temp1);
- temp1 = temp2;
- }
- return(temp1);
-}
-#endif /* NO_CATGETS */
-
-/*
- | The following is to allow for using message catalogs which allow
- | the software to be 'localized', that is, to use different languages
- | all with the same binary. For more information, see your system
- | documentation, or the X/Open Internationalization Guide.
- */
-
-void
-strings_init()
-{
- int counter;
-
-#ifndef NO_CATGETS
- setlocale(LC_ALL, "");
- catalog = catopen("ee", NL_CAT_LOCALE);
-#endif /* NO_CATGETS */
-
- modes_menu[0].item_string = catgetlocal( 1, "modes menu");
- mode_strings[1] = catgetlocal( 2, "tabs to spaces ");
- mode_strings[2] = catgetlocal( 3, "case sensitive search");
- mode_strings[3] = catgetlocal( 4, "margins observed ");
- mode_strings[4] = catgetlocal( 5, "auto-paragraph format");
- mode_strings[5] = catgetlocal( 6, "eightbit characters ");
- mode_strings[6] = catgetlocal( 7, "info window ");
- mode_strings[8] = catgetlocal( 8, "right margin ");
- leave_menu[0].item_string = catgetlocal( 9, "leave menu");
- leave_menu[1].item_string = catgetlocal( 10, "save changes");
- leave_menu[2].item_string = catgetlocal( 11, "no save");
- file_menu[0].item_string = catgetlocal( 12, "file menu");
- file_menu[1].item_string = catgetlocal( 13, "read a file");
- file_menu[2].item_string = catgetlocal( 14, "write a file");
- file_menu[3].item_string = catgetlocal( 15, "save file");
- file_menu[4].item_string = catgetlocal( 16, "print editor contents");
- search_menu[0].item_string = catgetlocal( 17, "search menu");
- search_menu[1].item_string = catgetlocal( 18, "search for ...");
- search_menu[2].item_string = catgetlocal( 19, "search");
- spell_menu[0].item_string = catgetlocal( 20, "spell menu");
- spell_menu[1].item_string = catgetlocal( 21, "use 'spell'");
- spell_menu[2].item_string = catgetlocal( 22, "use 'ispell'");
- misc_menu[0].item_string = catgetlocal( 23, "miscellaneous menu");
- misc_menu[1].item_string = catgetlocal( 24, "format paragraph");
- misc_menu[2].item_string = catgetlocal( 25, "shell command");
- misc_menu[3].item_string = catgetlocal( 26, "check spelling");
- main_menu[0].item_string = catgetlocal( 27, "main menu");
- main_menu[1].item_string = catgetlocal( 28, "leave editor");
- main_menu[2].item_string = catgetlocal( 29, "help");
- main_menu[3].item_string = catgetlocal( 30, "file operations");
- main_menu[4].item_string = catgetlocal( 31, "redraw screen");
- main_menu[5].item_string = catgetlocal( 32, "settings");
- main_menu[6].item_string = catgetlocal( 33, "search");
- main_menu[7].item_string = catgetlocal( 34, "miscellaneous");
- help_text[0] = catgetlocal( 35, "Control keys: ");
- help_text[1] = catgetlocal( 36, "^a ascii code ^i tab ^r right ");
- help_text[2] = catgetlocal( 37, "^b bottom of text ^j newline ^t top of text ");
- help_text[3] = catgetlocal( 38, "^c command ^k delete char ^u up ");
- help_text[4] = catgetlocal( 39, "^d down ^l left ^v undelete word ");
- help_text[5] = catgetlocal( 40, "^e search prompt ^m newline ^w delete word ");
- help_text[6] = catgetlocal( 41, "^f undelete char ^n next page ^x search ");
- help_text[7] = catgetlocal( 42, "^g begin of line ^o end of line ^y delete line ");
- help_text[8] = catgetlocal( 43, "^h backspace ^p prev page ^z undelete line ");
- help_text[9] = catgetlocal( 44, "^[ (escape) menu ESC-Enter: exit ee ");
- help_text[10] = catgetlocal( 45, " ");
- help_text[11] = catgetlocal( 46, "Commands: ");
- help_text[12] = catgetlocal( 47, "help : get this info file : print file name ");
- help_text[13] = catgetlocal( 48, "read : read a file char : ascii code of char ");
- help_text[14] = catgetlocal( 49, "write : write a file case : case sensitive search ");
- help_text[15] = catgetlocal( 50, "exit : leave and save nocase : case insensitive search ");
- help_text[16] = catgetlocal( 51, "quit : leave, no save !cmd : execute \"cmd\" in shell ");
- help_text[17] = catgetlocal( 52, "line : display line # 0-9 : go to line \"#\" ");
- help_text[18] = catgetlocal( 53, "expand : expand tabs noexpand: do not expand tabs ");
- help_text[19] = catgetlocal( 54, " ");
- help_text[20] = catgetlocal( 55, " ee [+#] [-i] [-e] [-h] [file(s)] ");
- help_text[21] = catgetlocal( 56, "+# :go to line # -i :no info window -e : don't expand tabs -h :no highlight");
- control_keys[0] = catgetlocal( 57, "^[ (escape) menu ^e search prompt ^y delete line ^u up ^p prev page ");
- control_keys[1] = catgetlocal( 58, "^a ascii code ^x search ^z undelete line ^d down ^n next page ");
- control_keys[2] = catgetlocal( 59, "^b bottom of text ^g begin of line ^w delete word ^l left ");
- control_keys[3] = catgetlocal( 60, "^t top of text ^o end of line ^v undelete word ^r right ");
- control_keys[4] = catgetlocal( 61, "^c command ^k delete char ^f undelete char ESC-Enter: exit ee ");
- command_strings[0] = catgetlocal( 62, "help : get help info |file : print file name |line : print line # ");
- command_strings[1] = catgetlocal( 63, "read : read a file |char : ascii code of char |0-9 : go to line \"#\"");
- command_strings[2] = catgetlocal( 64, "write: write a file |case : case sensitive search |exit : leave and save ");
- command_strings[3] = catgetlocal( 65, "!cmd : shell \"cmd\" |nocase: ignore case in search |quit : leave, no save");
- command_strings[4] = catgetlocal( 66, "expand: expand tabs |noexpand: do not expand tabs ");
- com_win_message = catgetlocal( 67, " press Escape (^[) for menu");
- no_file_string = catgetlocal( 68, "no file");
- ascii_code_str = catgetlocal( 69, "ascii code: ");
- printer_msg_str = catgetlocal( 70, "sending contents of buffer to \"%s\" ");
- command_str = catgetlocal( 71, "command: ");
- file_write_prompt_str = catgetlocal( 72, "name of file to write: ");
- file_read_prompt_str = catgetlocal( 73, "name of file to read: ");
- char_str = catgetlocal( 74, "character = %d");
- unkn_cmd_str = catgetlocal( 75, "unknown command \"%s\"");
- non_unique_cmd_msg = catgetlocal( 76, "entered command is not unique");
- line_num_str = catgetlocal( 77, "line %d ");
- line_len_str = catgetlocal( 78, "length = %d");
- current_file_str = catgetlocal( 79, "current file is \"%s\" ");
- usage0 = catgetlocal( 80, "usage: %s [-i] [-e] [-h] [+line_number] [file(s)]\n");
- usage1 = catgetlocal( 81, " -i turn off info window\n");
- usage2 = catgetlocal( 82, " -e do not convert tabs to spaces\n");
- usage3 = catgetlocal( 83, " -h do not use highlighting\n");
- file_is_dir_msg = catgetlocal( 84, "file \"%s\" is a directory");
- new_file_msg = catgetlocal( 85, "new file \"%s\"");
- cant_open_msg = catgetlocal( 86, "can't open \"%s\"");
- open_file_msg = catgetlocal( 87, "file \"%s\", %d lines");
- file_read_fin_msg = catgetlocal( 88, "finished reading file \"%s\"");
- reading_file_msg = catgetlocal( 89, "reading file \"%s\"");
- read_only_msg = catgetlocal( 90, ", read only");
- file_read_lines_msg = catgetlocal( 91, "file \"%s\", %d lines");
- save_file_name_prompt = catgetlocal( 92, "enter name of file: ");
- file_not_saved_msg = catgetlocal( 93, "no filename entered: file not saved");
- changes_made_prompt = catgetlocal( 94, "changes have been made, are you sure? (y/n [n]) ");
- yes_char = catgetlocal( 95, "y");
- file_exists_prompt = catgetlocal( 96, "file already exists, overwrite? (y/n) [n] ");
- create_file_fail_msg = catgetlocal( 97, "unable to create file \"%s\"");
- writing_file_msg = catgetlocal( 98, "writing file \"%s\"");
- file_written_msg = catgetlocal( 99, "\"%s\" %d lines, %d characters");
- searching_msg = catgetlocal( 100, " ...searching");
- str_not_found_msg = catgetlocal( 101, "string \"%s\" not found");
- search_prompt_str = catgetlocal( 102, "search for: ");
- exec_err_msg = catgetlocal( 103, "could not exec %s");
- continue_msg = catgetlocal( 104, "press return to continue ");
- menu_cancel_msg = catgetlocal( 105, "press Esc to cancel");
- menu_size_err_msg = catgetlocal( 106, "menu too large for window");
- press_any_key_msg = catgetlocal( 107, "press any key to continue ");
- shell_prompt = catgetlocal( 108, "shell command: ");
- formatting_msg = catgetlocal( 109, "...formatting paragraph...");
- shell_echo_msg = catgetlocal( 110, "<!echo 'list of unrecognized words'; echo -=-=-=-=-=-");
- spell_in_prog_msg = catgetlocal( 111, "sending contents of edit buffer to 'spell'");
- margin_prompt = catgetlocal( 112, "right margin is: ");
- restricted_msg = catgetlocal( 113, "restricted mode: unable to perform requested operation");
- ON = catgetlocal( 114, "ON");
- OFF = catgetlocal( 115, "OFF");
- HELP = catgetlocal( 116, "HELP");
- WRITE = catgetlocal( 117, "WRITE");
- READ = catgetlocal( 118, "READ");
- LINE = catgetlocal( 119, "LINE");
- FILE_str = catgetlocal( 120, "FILE");
- CHARACTER = catgetlocal( 121, "CHARACTER");
- REDRAW = catgetlocal( 122, "REDRAW");
- RESEQUENCE = catgetlocal( 123, "RESEQUENCE");
- AUTHOR = catgetlocal( 124, "AUTHOR");
- VERSION = catgetlocal( 125, "VERSION");
- CASE = catgetlocal( 126, "CASE");
- NOCASE = catgetlocal( 127, "NOCASE");
- EXPAND = catgetlocal( 128, "EXPAND");
- NOEXPAND = catgetlocal( 129, "NOEXPAND");
- Exit_string = catgetlocal( 130, "EXIT");
- QUIT_string = catgetlocal( 131, "QUIT");
- INFO = catgetlocal( 132, "INFO");
- NOINFO = catgetlocal( 133, "NOINFO");
- MARGINS = catgetlocal( 134, "MARGINS");
- NOMARGINS = catgetlocal( 135, "NOMARGINS");
- AUTOFORMAT = catgetlocal( 136, "AUTOFORMAT");
- NOAUTOFORMAT = catgetlocal( 137, "NOAUTOFORMAT");
- Echo = catgetlocal( 138, "ECHO");
- PRINTCOMMAND = catgetlocal( 139, "PRINTCOMMAND");
- RIGHTMARGIN = catgetlocal( 140, "RIGHTMARGIN");
- HIGHLIGHT = catgetlocal( 141, "HIGHLIGHT");
- NOHIGHLIGHT = catgetlocal( 142, "NOHIGHLIGHT");
- EIGHTBIT = catgetlocal( 143, "EIGHTBIT");
- NOEIGHTBIT = catgetlocal( 144, "NOEIGHTBIT");
- /*
- | additions
- */
- mode_strings[7] = catgetlocal( 145, "emacs key bindings ");
- emacs_help_text[0] = help_text[0];
- emacs_help_text[1] = catgetlocal( 146, "^a beginning of line ^i tab ^r restore word ");
- emacs_help_text[2] = catgetlocal( 147, "^b back 1 char ^j undel char ^t begin of file ");
- emacs_help_text[3] = catgetlocal( 148, "^c command ^k delete line ^u end of file ");
- emacs_help_text[4] = catgetlocal( 149, "^d delete char ^l undelete line ^v next page ");
- emacs_help_text[5] = catgetlocal( 150, "^e end of line ^m newline ^w delete word ");
- emacs_help_text[6] = catgetlocal( 151, "^f forward 1 char ^n next line ^x search ");
- emacs_help_text[7] = catgetlocal( 152, "^g go back 1 page ^o ascii char insert ^y search prompt ");
- emacs_help_text[8] = catgetlocal( 153, "^h backspace ^p prev line ^z next word ");
- emacs_help_text[9] = help_text[9];
- emacs_help_text[10] = help_text[10];
- emacs_help_text[11] = help_text[11];
- emacs_help_text[12] = help_text[12];
- emacs_help_text[13] = help_text[13];
- emacs_help_text[14] = help_text[14];
- emacs_help_text[15] = help_text[15];
- emacs_help_text[16] = help_text[16];
- emacs_help_text[17] = help_text[17];
- emacs_help_text[18] = help_text[18];
- emacs_help_text[19] = help_text[19];
- emacs_help_text[20] = help_text[20];
- emacs_help_text[21] = help_text[21];
- emacs_control_keys[0] = catgetlocal( 154, "^[ (escape) menu ^y search prompt ^k delete line ^p prev line ^g prev page");
- emacs_control_keys[1] = catgetlocal( 155, "^o ascii code ^x search ^l undelete line ^n next line ^v next page");
- emacs_control_keys[2] = catgetlocal( 156, "^u end of file ^a begin of line ^w delete word ^b back char ^z next word");
- emacs_control_keys[3] = catgetlocal( 157, "^t begin of file ^e end of line ^r restore word ^f forward char ");
- emacs_control_keys[4] = catgetlocal( 158, "^c command ^d delete char ^j undelete char ESC-Enter: exit");
- EMACS_string = catgetlocal( 159, "EMACS");
- NOEMACS_string = catgetlocal( 160, "NOEMACS");
- usage4 = catgetlocal( 161, " +# put cursor at line #\n");
- conf_dump_err_msg = catgetlocal( 162, "unable to open .init.ee for writing, no configuration saved!");
- conf_dump_success_msg = catgetlocal( 163, "ee configuration saved in file %s");
- modes_menu[10].item_string = catgetlocal( 164, "save editor configuration");
- config_dump_menu[0].item_string = catgetlocal( 165, "save ee configuration");
- config_dump_menu[1].item_string = catgetlocal( 166, "save in current directory");
- config_dump_menu[2].item_string = catgetlocal( 167, "save in home directory");
- conf_not_saved_msg = catgetlocal( 168, "ee configuration not saved");
- ree_no_file_msg = catgetlocal( 169, "must specify a file when invoking ree");
- menu_too_lrg_msg = catgetlocal( 180, "menu too large for window");
- more_above_str = catgetlocal( 181, "^^more^^");
- more_below_str = catgetlocal( 182, "VVmoreVV");
- mode_strings[9] = catgetlocal( 183, "16 bit characters ");
- chinese_cmd = catgetlocal( 184, "16BIT");
- nochinese_cmd = catgetlocal( 185, "NO16BIT");
-
- commands[0] = HELP;
- commands[1] = WRITE;
- commands[2] = READ;
- commands[3] = LINE;
- commands[4] = FILE_str;
- commands[5] = REDRAW;
- commands[6] = RESEQUENCE;
- commands[7] = AUTHOR;
- commands[8] = VERSION;
- commands[9] = CASE;
- commands[10] = NOCASE;
- commands[11] = EXPAND;
- commands[12] = NOEXPAND;
- commands[13] = Exit_string;
- commands[14] = QUIT_string;
- commands[15] = "<";
- commands[16] = ">";
- commands[17] = "!";
- commands[18] = "0";
- commands[19] = "1";
- commands[20] = "2";
- commands[21] = "3";
- commands[22] = "4";
- commands[23] = "5";
- commands[24] = "6";
- commands[25] = "7";
- commands[26] = "8";
- commands[27] = "9";
- commands[28] = CHARACTER;
- commands[29] = chinese_cmd;
- commands[30] = nochinese_cmd;
- commands[31] = NULL;
- init_strings[0] = CASE;
- init_strings[1] = NOCASE;
- init_strings[2] = EXPAND;
- init_strings[3] = NOEXPAND;
- init_strings[4] = INFO;
- init_strings[5] = NOINFO;
- init_strings[6] = MARGINS;
- init_strings[7] = NOMARGINS;
- init_strings[8] = AUTOFORMAT;
- init_strings[9] = NOAUTOFORMAT;
- init_strings[10] = Echo;
- init_strings[11] = PRINTCOMMAND;
- init_strings[12] = RIGHTMARGIN;
- init_strings[13] = HIGHLIGHT;
- init_strings[14] = NOHIGHLIGHT;
- init_strings[15] = EIGHTBIT;
- init_strings[16] = NOEIGHTBIT;
- init_strings[17] = EMACS_string;
- init_strings[18] = NOEMACS_string;
- init_strings[19] = chinese_cmd;
- init_strings[20] = nochinese_cmd;
- init_strings[21] = NULL;
-
- /*
- | allocate space for strings here for settings menu
- */
-
- for (counter = 1; counter < NUM_MODES_ITEMS; counter++)
- {
- modes_menu[counter].item_string = malloc(80);
- }
-
-#ifndef NO_CATGETS
- catclose(catalog);
-#endif /* NO_CATGETS */
-}
-
diff --git a/usr.bin/ee/ee.i18n.guide b/usr.bin/ee/ee.i18n.guide
deleted file mode 100644
index eef836a..0000000
--- a/usr.bin/ee/ee.i18n.guide
+++ /dev/null
@@ -1,158 +0,0 @@
-Easy Editor ("ee") provides the ability to translate the messages
-displayed to the user and the commands entered. This is done via message
-catalogs, following X/Open standards. ee supports eight bit characters,
-as well as 16-bit characters. The Chinese Big 5 code set is the 16-bit
-code set that ee was modified to handle, as it is relatively easy to
-support since two byte characters also take up two columns on the screen,
-thereby simplifying the screen position calculations. Other multibyte
-code sets may function, but have not been tested.
-
-(The name ee.i18n.guide is for "ee internationalization guide". The i18n
-abbreviation is used because there are 18 characters between the first
-letter ("i") and last ("n") of "internationalization".)
-
-All of the messages, warnings, information, and commands, are contained
-in the message catalog. Each numbered entry represents an individual
-string used by ee. Some strings contain formatting information for
-formatted print statements, which are of the form "%s", or "%d", these
-must be preserved in the translation, or the correct information will not
-be displayed. For those strings containing multiple formatting codes,
-the order of each item must be preserved as well.
-
-Message content
-1 title for modes, or settings menu
-2 - 8 entries for modes menu, each line should be the same length
- (padded with spaces)
-9 - 34 other menu titles and entries
-35 - 56 help screen
-57 - 61 actions assigned to control keys
-62 - 66 commands information
-67 message displayed when info window turned off
-68 indication that no file name was entered when invoking ee
-69 prompt for decimal value of character to be entered
-70 message displaying the print command being invoked
-71 prompt for command
-72 prompt for name of file to be written
-73 prompt for name of file to be read
-74 string used to display the decimal value of the character
- the cursor is on
-75 string displaying an unrecognized command
-76 string indicating that the command entered is not a unique
- substring of a valid command
-77 string indicating the current line number
-78 string for displaying the length of the line
-79 string for displaying the name of the file
-80 - 83 strings showing how to invoke ee, and its options
-84 message indicating that the file entered is a directory, not a
- text file
-85 message informing that the entered file does not yet exist
-86 message informing that the file can't be opened (because of
- permission problems)
-87 message after file has been read with the file name and number
- of lines read
-88 message indicating that the file has been read
-89 message indicating that the file is being read
-90 message indicating that permissions only allow the file to be
- read, not written
-91 message after file has been read with the file name and number
- of lines read
-92 prompt for name of file to be saved (used when no name was
- entered for a file to edit)
-93 message indicating that the file was not written, since no
- name was entered at the prompt
-94 prompt asking user if changes should not be saved ("yes_char"
- will be expected for affirmative response)
-95 "yes" character, single character expected to confirm action
- (can be upper or lower case, will be converted to upper-case
- during test)
-96 prompt
-97 error message
-98 message indicating that the named file is being written
-99 message indicating the name of the file written, the number of
- lines, and the number of characters (order of items must be
- maintained)
-100 search in progress message
-101 message that the string was not found
-102 prompt for search
-103 message that string could not be executed
-104 self-explanatory
-105 message for menus, indicating that the Escape character will
- allow the user to exit the menu
-106 error message indicating the menu won't fit on the screen
-107 self-explanatory
-108 prompt for shell command
-109 message displayed while formatting a paragraph
-110 string which places message for spell checking at top of
- buffer (the portions 'list of unrecognized words' and
- '-=-=-=-=-=-' may be replaced, but the rest must remain the
- same)
-111 message informing that spell checking is in progress
-112 prompt for right margin
-113 error informing user that operation is not permitted in ree
-114 string indicating mode is turned 'on' in modes menu
-115 string indicating mode is turned 'off' in modes menu
-116 - 131 strings used for commands (some also used for initialization)
-132 - 144 strings used for initialization
-145 entry for settings menu for emacs key bindings settings
-146 - 153 help screen entries for emacs key bindings info
-154 - 158 info window entries for emacs key bindings info
-159 string for turning on emacs key bindings in the init file
-160 string for turning off emacs key bindings in the init file
-161 fifth line of usage statement
-162 error message when unable to save configuration file
-163 positive feedback about saving the configuration file
-164 - 167 menu items for saving editor configuration
-168 error message when unable to save configuration file
-169 error message for ree when not specifying the file
-180 self-explanatory
-181 - 182 indicators of more information in menu (for when scrolling
- menus because menu contents won't fit vertically on screen)
-183 menu entry for modes menu for 16 bit characters
-184 - 185 strings for initialization to turn on or off 16 bit
- character handling
-
-Care should be taken when translating commands and initialization keywords
-because the algorithm used for detecting uniqueness of entered commands
-will not be able to distinguish words that are not unique before the end
-of the shorter word, for example, it would not be able to distinguish the
-command 'abcd' from 'abcde'.
-
-After translating the messages, use the 'gencat' command to create the compiled
-catalog used when running the software. The standard syntax would be:
-
- gencat ee.cat ee.msg
-
-Where ee.msg is the file containing the translations, and ee.cat is the
-compiled catalog. If the file ee.cat does not exist, it will be created.
-Check the documentation for your system for proper syntax.
-
-Message catalog placement varies from system to system. A common location
-for message catalogs is in /usr/lib/nls. In this directory are
-directories with the names of other languages. The default language is
-'C'. There is also an environment variable, named NLSPATH used to
-determine where message catalogs can be found. This variable is similar
-to the PATH variable used for commands, but with some differences. The
-NLSPATH variable must have the ability to handle different names for
-languages and the catalog files, so it has field descriptors for these. A
-typical setting for NLSPATH could be:
-
- NLSPATH=/usr/lib/nls/%L/%N.cat:/usr/local/lib/nls/%L/%N.cat
-
-Where "%L" is the field descriptor for the language (obtained from the
-LANG environment variable) and "%N" is the name of the file (with the
-".cat" appended by the path variable, it is not passed from the requesting
-program). The colon (:) is used to separate paths, so in the above
-example there are two paths possible for message catalogs. You may wish
-to maintain catalogs for applications that are not supported by your
-system vendor in a location unique for you, and this is facilitated by the
-NLSPATH variable. Remember to set and export both the LANG and NLSPATH
-variables for each user that expects to use localization either in a
-system-wide profile or in each user's profile. See your system
-documentation for more information.
-
-The message catalog supplied with ee also uses the '$quote' directive to
-specify a quote around strings to ensure proper padding. This directive
-may not be supported on all systems, and lead to quotes being included in
-the string used in ee, which will cause incorrect behavior. If the
-'$quote' directive is not supported by your system's gencat command, edit
-the msg file to remove the leading and trailing quotation marks.
diff --git a/usr.bin/ee/new_curse.c b/usr.bin/ee/new_curse.c
deleted file mode 100644
index 22e1a84..0000000
--- a/usr.bin/ee/new_curse.c
+++ /dev/null
@@ -1,3728 +0,0 @@
-/*
- | new_curse.c
- |
- | A subset of curses developed for use with ae.
- |
- | written by Hugh Mahon
- |
- | THIS MATERIAL IS PROVIDED "AS IS". THERE ARE
- | NO WARRANTIES OF ANY KIND WITH REGARD TO THIS
- | MATERIAL, INCLUDING, BUT NOT LIMITED TO, THE
- | IMPLIED WARRANTIES OF MERCHANTABILITY AND
- | FITNESS FOR A PARTICULAR PURPOSE. Neither
- | Hewlett-Packard nor Hugh Mahon shall be liable
- | for errors contained herein, nor for
- | incidental or consequential damages in
- | connection with the furnishing, performance or
- | use of this material. Neither Hewlett-Packard
- | nor Hugh Mahon assumes any responsibility for
- | the use or reliability of this software or
- | documentation. This software and
- | documentation is totally UNSUPPORTED. There
- | is no support contract available. Hewlett-
- | Packard has done NO Quality Assurance on ANY
- | of the program or documentation. You may find
- | the quality of the materials inferior to
- | supported materials.
- |
- | This software is not a product of Hewlett-Packard, Co., or any
- | other company. No support is implied or offered with this software.
- | You've got the source, and you're on your own.
- |
- | This software may be distributed under the terms of Larry Wall's
- | Artistic license, a copy of which is included in this distribution.
- |
- | This notice must be included with this software and any derivatives.
- |
- | Copyright (c) 1986, 1987, 1988, 1991, 1992, 1993, 1994, 1995 Hugh Mahon
- | All are rights reserved.
- |
- | $Header: /home/hugh/sources/old_ae/RCS/new_curse.c,v 1.49 1998/12/21 02:25:59 hugh Exp hugh $
- |
- */
-
-char *copyright_message[] = { "Copyright (c) 1986, 1987, 1988, 1991, 1992, 1993, 1994, 1995 Hugh Mahon",
- "All rights are reserved."};
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "new_curse.h"
-#include <signal.h>
-#include <fcntl.h>
-
-#ifdef SYS5
-#include <string.h>
-#else
-#include <strings.h>
-#endif
-
-#ifdef BSD_SELECT
-#include <sys/types.h>
-#include <sys/time.h>
-
-#ifdef SLCT_HDR
-#include <sys/select.h> /* on AIX */
-#endif /* SLCT_HDR */
-
-#endif /* BSD_SELECT */
-
-#ifdef HAS_STDLIB
-#include <stdlib.h>
-#endif
-
-#include <stdarg.h>
-
-#ifdef HAS_UNISTD
-#include <unistd.h>
-#endif
-
-#ifdef HAS_SYS_IOCTL
-#include <sys/ioctl.h>
-#endif
-
-
-WINDOW *curscr;
-static WINDOW *virtual_scr;
-WINDOW *stdscr;
-WINDOW *last_window_refreshed;
-
-#ifdef TIOCGWINSZ
- struct winsize ws;
-#endif
-
-#define min(a, b) (a < b ? a : b)
-#define highbitset(a) ((a) & 0x80)
-
-#ifndef CAP
-#define String_Out(table, stack, place) Info_Out(table, stack, place)
-#else
-#define String_Out(table, stack, place) Cap_Out(table, stack, place)
-#endif
-
-#define bw__ 0 /* booleans */
-#define am__ 1
-#define xb__ 2
-#define xs__ 3 /* hp glitch (standout not erased by overwrite) */
-#define xn__ 4
-#define eo__ 5
-#define gn__ 6 /* generic type terminal */
-#define hc__ 7 /* hardcopy terminal */
-#define km__ 8
-#define hs__ 9
-#define in__ 10
-#define da__ 11
-#define db__ 12
-#define mi__ 13 /* safe to move during insert mode */
-#define ms__ 14 /* safe to move during standout mode */
-#define os__ 15
-#define es__ 16
-#define xt__ 17
-#define hz__ 18 /* hazeltine glitch */
-#define ul__ 19
-#define xo__ 20
-#define chts__ 21
-#define nxon__ 22
-#define nrrmc__ 23
-#define npc__ 24
-#define mc5i__ 25
-
-#define co__ 0 /* number of columns */ /* numbers */
-#define it__ 1 /* spaces per tab */
-#define li__ 2 /* number of lines */
-#define lm__ 3
-#define sg__ 4 /* magic cookie glitch */
-#define pb__ 5
-#define vt__ 6
-#define ws__ 7
-
-#define cols__ 0
-#define lines__ 2
-#define xmc__ 4
-#define vt__ 6
-#define wsl__ 7
-#define nlab__ 8
-#define lh__ 9
-#define lw__ 10
-
-#define bt__ 0 /* back tab */ /* strings */
-#define bl__ 1 /* bell */
-#define cr__ 2 /* carriage return */
-#define cs__ 3 /* change scroll region */
-#define ct__ 4 /* clear all tab stops */
-#define cl__ 5 /* clear screen and home cursor */
-#define ce__ 6 /* clear to end of line */
-#define cd__ 7 /* clear to end of display */
-#define ch__ 8 /* set cursor column */
-#define CC__ 9 /* term, settable cmd char in */
-#define cm__ 10 /* screen rel cursor motion, row, column */
-#define do__ 11 /* down one line */
-#define ho__ 12 /* home cursor */
-#define vi__ 13 /* make cursor invisible */
-#define le__ 14 /* move cursor left one space */
-#define CM__ 15 /* memory rel cursor addressing */
-#define ve__ 16 /* make cursor appear normal */
-#define nd__ 17 /* non-destructive space (cursor right) */
-#define ll__ 18 /* last line, first col */
-#define up__ 19 /* cursor up */
-#define vs__ 20
-#define dc__ 21 /* delete character */
-#define dl__ 22 /* delete line */
-#define ds__ 23
-#define hd__ 24
-#define as__ 25
-#define mb__ 26
-#define md__ 27 /* turn on bold */
-#define ti__ 28
-#define dm__ 29 /* turn on delete mode */
-#define mh__ 30 /* half bright mode */
-#define im__ 31 /* insert mode */
-#define mk__ 32
-#define mp__ 33
-#define mr__ 34
-#define so__ 35 /* enter standout mode */
-#define us__ 36
-#define ec__ 37
-#define ae__ 38
-#define me__ 39
-#define te__ 40
-#define ed__ 41
-#define ei__ 42 /* exit insert mode */
-#define se__ 43 /* exit standout mode */
-#define ue__ 44
-#define vb__ 45
-#define ff__ 46
-#define fs__ 47
-#define i1__ 48
-#define i2__ 49
-#define i3__ 50
-#define if__ 51
-#define ic__ 52
-#define al__ 53
-#define ip__ 54
-#define kb__ 55 /* backspace key */
-#define ka__ 56
-#define kC__ 57
-#define kt__ 58
-#define kD__ 59
-#define kL__ 60
-#define kd__ 61
-#define kM__ 62
-#define kE__ 63
-#define kS__ 64
-#define k0__ 65
-#define k1__ 66
-#define kf10__ 67
-#define k2__ 68
-#define k3__ 69
-#define k4__ 70
-#define k5__ 71
-#define k6__ 72
-#define k7__ 73
-#define k8__ 74
-#define k9__ 75
-#define kh__ 76
-#define kI__ 77
-#define kA__ 78
-#define kl__ 79
-#define kH__ 80
-#define kN__ 81
-#define kP__ 82
-#define kr__ 83
-#define kF__ 84
-#define kR__ 85
-#define kT__ 86
-#define ku__ 87 /* key up */
-#define ke__ 88
-#define ks__ 89
-#define l0__ 90
-#define l1__ 91
-#define la__ 92
-#define l2__ 93
-#define l3__ 94
-#define l4__ 95
-#define l5__ 96
-#define l6__ 97
-#define l7__ 98
-#define l8__ 99
-#define l9__ 100
-#define mo__ 101
-#define mm__ 102
-#define nw__ 103
-#define pc__ 104
-#define DC__ 105
-#define DL__ 106
-#define DO__ 107
-#define IC__ 118
-#define SF__ 109
-#define AL__ 110
-#define LE__ 111
-#define RI__ 112
-#define SR__ 113
-#define UP__ 114
-#define pk__ 115
-#define pl__ 116
-#define px__ 117
-#define ps__ 118
-#define pf__ 119
-#define po__ 120
-#define rp__ 121
-#define r1__ 122
-#define r2__ 123
-#define r3__ 124
-#define rf__ 125
-#define rc__ 126
-#define cv__ 127
-#define sc__ 128
-#define sf__ 129
-#define sr__ 130
-#define sa__ 131 /* sgr */
-#define st__ 132
-#define wi__ 133
-#define ta__ 134
-#define ts__ 135
-#define uc__ 136
-#define hu__ 137
-#define iP__ 138
-#define K1__ 139
-#define K2__ 140
-#define K3__ 141
-#define K4__ 142
-#define K5__ 143
-#define pO__ 144
-#define ml__ 145
-#define mu__ 146
-#define rmp__ 145
-#define acsc__ 146
-#define pln__ 147
-#define kcbt__ 148
-#define smxon__ 149
-#define rmxon__ 150
-#define smam__ 151
-#define rmam__ 152
-#define xonc__ 153
-#define xoffc__ 154
-#define enacs__ 155
-#define smln__ 156
-#define rmln__ 157
-#define kbeg__ 158
-#define kcan__ 159
-#define kclo__ 160
-#define kcmd__ 161
-#define kcpy__ 162
-#define kcrt__ 163
-#define kend__ 164
-#define kent__ 165
-#define kext__ 166
-#define kfnd__ 167
-#define khlp__ 168
-#define kmrk__ 169
-#define kmsg__ 170
-#define kmov__ 171
-#define knxt__ 172
-#define kopn__ 173
-#define kopt__ 174
-#define kprv__ 175
-#define kprt__ 176
-#define krdo__ 177
-#define kref__ 178
-#define krfr__ 179
-#define krpl__ 180
-#define krst__ 181
-#define kres__ 182
-#define ksav__ 183
-#define kspd__ 184
-#define kund__ 185
-#define kBEG__ 186
-#define kCAN__ 187
-#define kCMD__ 188
-#define kCPY__ 189
-#define kCRT__ 190
-#define kDC__ 191
-#define kDL__ 192
-#define kslt__ 193
-#define kEND__ 194
-#define kEOL__ 195
-#define kEXT__ 196
-#define kFND__ 197
-#define kHLP__ 198
-#define kHOM__ 199
-#define kIC__ 200
-#define kLFT__ 201
-#define kMSG__ 202
-#define kMOV__ 203
-#define kNXT__ 204
-#define kOPT__ 205
-#define kPRV__ 206
-#define kPRT__ 207
-#define kRDO__ 208
-#define kRPL__ 209
-#define kRIT__ 210
-#define kRES__ 211
-#define kSAV__ 212
-#define kSPD__ 213
-#define kUND__ 214
-#define rfi__ 215
-#define kf11__ 216
-#define kf12__ 217
-#define kf13__ 218
-#define kf14__ 219
-#define kf15__ 220
-#define kf16__ 221
-#define kf17__ 222
-#define kf18__ 223
-#define kf19__ 224
-#define kf20__ 225
-#define kf21__ 226
-#define kf22__ 227
-#define kf23__ 228
-#define kf24__ 229
-#define kf25__ 230
-#define kf26__ 231
-#define kf27__ 232
-#define kf28__ 233
-#define kf29__ 234
-#define kf30__ 235
-#define kf31__ 236
-#define kf32__ 237
-#define kf33__ 238
-#define kf34__ 239
-#define kf35__ 240
-#define kf36__ 241
-#define kf37__ 242
-#define kf38__ 243
-#define kf39__ 244
-#define kf40__ 245
-#define kf41__ 246
-#define kf42__ 247
-#define kf43__ 248
-#define kf44__ 249
-#define kf45__ 250
-#define kf46__ 251
-#define kf47__ 252
-#define kf48__ 253
-#define kf49__ 254
-#define kf50__ 255
-#define kf51__ 256
-#define kf52__ 257
-#define kf53__ 258
-#define kf54__ 259
-#define kf55__ 260
-#define kf56__ 261
-#define kf57__ 262
-#define kf58__ 263
-#define kf59__ 264
-#define kf60__ 265
-#define kf61__ 266
-#define kf62__ 267
-#define kf63__ 268
-#define el1__ 269
-#define mgc__ 270
-#define smgl__ 271
-#define smgr__ 272
-
-#ifdef CAP
-char *Boolean_names[] = {
-"bw", "am", "xb", "xs", "xn", "eo", "gn", "hc", "km", "hs", "in", "da", "db",
-"mi", "ms", "os", "es", "xt", "hz", "ul", "xo", "HC", "nx", "NR", "NP", "5i"
-};
-
-char *Number_names[] = {
-"co#", "it#", "li#", "lm#", "sg#", "pb#", "vt#", "ws#", "Nl#", "lh#", "lw#"
-};
-
-char *String_names[] = {
-"bt=", "bl=", "cr=", "cs=", "ct=", "cl=", "ce=", "cd=", "ch=", "CC=", "cm=",
-"do=", "ho=", "vi=", "le=", "CM=", "ve=", "nd=", "ll=", "up=", "vs=", "dc=",
-"dl=", "ds=", "hd=", "as=", "mb=", "md=", "ti=", "dm=", "mh=", "im=", "mk=",
-"mp=", "mr=", "so=", "us=", "ec=", "ae=", "me=", "te=", "ed=", "ei=", "se=",
-"ue=", "vb=", "ff=", "fs=", "i1=", "i2=", "i3=", "if=", "ic=", "al=", "ip=",
-"kb=", "ka=", "kC=", "kt=", "kD=", "kL=", "kd=", "kM=", "kE=", "kS=", "k0=",
-"k1=", "k;=", "k2=", "k3=", "k4=", "k5=", "k6=", "k7=", "k8=", "k9=", "kh=",
-"kI=", "kA=", "kl=", "kH=", "kN=", "kP=", "kr=", "kF=", "kR=", "kT=", "ku=",
-"ke=", "ks=", "l0=", "l1=", "la=", "l2=", "l3=", "l4=", "l5=", "l6=", "l7=",
-"l8=", "l9=", "mo=", "mm=", "nw=", "pc=", "DC=", "DL=", "DO=", "IC=", "SF=",
-"AL=", "LE=", "RI=", "SR=", "UP=", "pk=", "pl=", "px=", "ps=", "pf=", "po=",
-"rp=", "r1=", "r2=", "r3=", "rf=", "rc=", "cv=", "sc=", "sf=", "sr=", "sa=",
-"st=", "wi=", "ta=", "ts=", "uc=", "hu=", "iP=", "K1=", "K3=", "K2=", "K4=",
-"K5=", "pO=", "rP=", "ac=", "pn=", "kB=", "SX=", "RX=", "SA=", "RA=", "XN=",
-"XF=", "eA=", "LO=", "LF=", "@1=", "@2=", "@3=", "@4=", "@5=", "@6=", "@7=",
-"@8=", "@9=", "@0=", "%1=", "%2=", "%3=", "%4=", "%5=", "%6=", "%7=", "%8=",
-"%9=", "%0=", "&1=", "&2=", "&3=", "&4=", "&5=", "&6=", "&7=", "&8=", "&9=",
-"&0=", "*1=", "*2=", "*3=", "*4=", "*5=", "*6=", "*7=", "*8=", "*9=", "*0=",
-"#1=", "#2=", "#3=", "#4=", "%a=", "%b=", "%c=", "%d=", "%e=", "%f=", "%g=",
-"%h=", "%i=", "%j=", "!1=", "!2=", "!3=", "RF=", "F1=", "F2=", "F3=", "F4=",
-"F5=", "F6=", "F7=", "F8=", "F9=", "FA=", "FB=", "FC=", "FD=", "FE=", "FF=",
-"FG=", "FH=", "FI=", "FJ=", "FK=", "FL=", "FM=", "FN=", "FO=", "FP=", "FQ=",
-"FR=", "FS=", "FT=", "FU=", "FV=", "FW=", "FX=", "FY=", "FZ=", "Fa=", "Fb=",
-"Fc=", "Fd=", "Fe=", "Ff=", "Fg=", "Fh=", "Fi=", "Fj=", "Fk=", "Fl=", "Fm=",
-"Fn=", "Fo=", "Fp=", "Fq=", "Fr=", "cb=", "MC=", "ML=", "MR="
-};
-#endif
-
-char *new_curse = "October 1987";
-
-char in_buff[100]; /* buffer for ungetch */
-int bufp; /* next free position in in_buff */
-
-char *TERMINAL_TYPE = NULL; /* terminal type to be gotten from environment */
-int CFOUND = FALSE;
-int Data_Line_len = 0;
-int Max_Key_len; /* max length of a sequence sent by a key */
-char *Data_Line = NULL;
-char *TERM_PATH = NULL;
-char *TERM_data_ptr = NULL;
-char *Term_File_name = NULL; /* name of file containing terminal description */
-FILE *TFP; /* file pointer to file with terminal des. */
-int Fildes; /* file descriptor for terminfo file */
-int STAND = FALSE; /* is standout mode activated? */
-int TERM_INFO = FALSE; /* is terminfo being used (TRUE), or termcap (FALSE) */
-int Time_Out; /* set when time elapsed while trying to read function key */
-int Curr_x; /* current x position on screen */
-int Curr_y; /* current y position on the screen */
-int LINES;
-int COLS;
-int Move_It; /* flag to move cursor if magic cookie glitch */
-int initialized = FALSE; /* tells whether new_curse is initialized */
-float speed;
-float chars_per_millisecond;
-int Repaint_screen; /* if an operation to change screen impossible, repaint screen */
-int Intr; /* storeage for interrupt character */
-int Parity; /* 0 = no parity, 1 = odd parity, 2 = even parity */
-int Noblock; /* for BSD systems */
-int Num_bits; /* number of bits per character */
-int Flip_Bytes; /* some systems have byte order reversed */
-int interrupt_flag = FALSE; /* set true if SIGWINCH received */
-
-#ifndef CAP
-char *Strings;
-#endif
-
-struct KEYS {
- int length; /* length of string sent by key */
- char *string; /* string sent by key */
- int value; /* CURSES value of key (9-bit) */
- };
-
-struct KEY_STACK {
- struct KEYS *element;
- struct KEY_STACK *next;
- };
-
-struct KEY_STACK *KEY_TOS = NULL;
-struct KEY_STACK *KEY_POINT;
-
-/*
- |
- | Not all systems have good terminal information, so we will define
- | keyboard information here for the most widely used terminal type,
- | the VT100.
- |
- */
-
-struct KEYS vt100[] =
- {
- { 3, "\033[A", 0403 }, /* key up */
- { 3, "\033[C", 0405 }, /* key right */
- { 3, "\033[D", 0404 }, /* key left */
-
- { 4, "\033[6~", 0522 }, /* key next page */
- { 4, "\033[5~", 0523 }, /* key prev page */
- { 3, "\033[[", 0550 }, /* key end */
- { 3, "\033[@", 0406 }, /* key home */
- { 4, "\033[2~", 0513 }, /* key insert char */
-
- { 3, "\033[y", 0410 }, /* key F0 */
- { 3, "\033[P", 0411 }, /* key F1 */
- { 3, "\033[Q", 0412 }, /* key F2 */
- { 3, "\033[R", 0413 }, /* key F3 */
- { 3, "\033[S", 0414 }, /* key F4 */
- { 3, "\033[t", 0415 }, /* key F5 */
- { 3, "\033[u", 0416 }, /* key F6 */
- { 3, "\033[v", 0417 }, /* key F7 */
- { 3, "\033[l", 0420 }, /* key F8 */
- { 3, "\033[w", 0421 }, /* key F9 */
- { 3, "\033[x", 0422 }, /* key F10 */
-
- { 5, "\033[10~", 0410 }, /* key F0 */
- { 5, "\033[11~", 0411 }, /* key F1 */
- { 5, "\033[12~", 0412 }, /* key F2 */
- { 5, "\033[13~", 0413 }, /* key F3 */
- { 5, "\033[14~", 0414 }, /* key F4 */
- { 5, "\033[15~", 0415 }, /* key F5 */
- { 5, "\033[17~", 0416 }, /* key F6 */
- { 5, "\033[18~", 0417 }, /* key F7 */
- { 5, "\033[19~", 0420 }, /* key F8 */
- { 5, "\033[20~", 0421 }, /* key F9 */
- { 5, "\033[21~", 0422 }, /* key F10 */
- { 5, "\033[23~", 0423 }, /* key F11 */
- { 5, "\033[24~", 0424 }, /* key F12 */
- { 3, "\033[q", 0534 }, /* ka1 upper-left of keypad */
- { 3, "\033[s", 0535 }, /* ka3 upper-right of keypad */
- { 3, "\033[r", 0536 }, /* kb2 center of keypad */
- { 3, "\033[p", 0537 }, /* kc1 lower-left of keypad */
- { 3, "\033[n", 0540 }, /* kc3 lower-right of keypad */
-
- /*
- | The following are the same keys as above, but with
- | a different character following the escape char.
- */
-
- { 3, "\033OA", 0403 }, /* key up */
- { 3, "\033OC", 0405 }, /* key right */
- { 3, "\033OD", 0404 }, /* key left */
- { 3, "\033OB", 0402 }, /* key down */
- { 4, "\033O6~", 0522 }, /* key next page */
- { 4, "\033O5~", 0523 }, /* key prev page */
- { 3, "\033O[", 0550 }, /* key end */
- { 3, "\033O@", 0406 }, /* key home */
- { 4, "\033O2~", 0513 }, /* key insert char */
-
- { 3, "\033Oy", 0410 }, /* key F0 */
- { 3, "\033OP", 0411 }, /* key F1 */
- { 3, "\033OQ", 0412 }, /* key F2 */
- { 3, "\033OR", 0413 }, /* key F3 */
- { 3, "\033OS", 0414 }, /* key F4 */
- { 3, "\033Ot", 0415 }, /* key F5 */
- { 3, "\033Ou", 0416 }, /* key F6 */
- { 3, "\033Ov", 0417 }, /* key F7 */
- { 3, "\033Ol", 0420 }, /* key F8 */
- { 3, "\033Ow", 0421 }, /* key F9 */
- { 3, "\033Ox", 0422 }, /* key F10 */
-
- { 5, "\033O10~", 0410 }, /* key F0 */
- { 5, "\033O11~", 0411 }, /* key F1 */
- { 5, "\033O12~", 0412 }, /* key F2 */
- { 5, "\033O13~", 0413 }, /* key F3 */
- { 5, "\033O14~", 0414 }, /* key F4 */
- { 5, "\033O15~", 0415 }, /* key F5 */
- { 5, "\033O17~", 0416 }, /* key F6 */
- { 5, "\033O18~", 0417 }, /* key F7 */
- { 5, "\033O19~", 0420 }, /* key F8 */
- { 5, "\033O20~", 0421 }, /* key F9 */
- { 5, "\033O21~", 0422 }, /* key F10 */
- { 5, "\033O23~", 0423 }, /* key F11 */
- { 5, "\033O24~", 0424 }, /* key F12 */
- { 3, "\033Oq", 0534 }, /* ka1 upper-left of keypad */
- { 3, "\033Os", 0535 }, /* ka3 upper-right of keypad */
- { 3, "\033Or", 0536 }, /* kb2 center of keypad */
- { 3, "\033Op", 0537 }, /* kc1 lower-left of keypad */
- { 3, "\033On", 0540 }, /* kc3 lower-right of keypad */
-
- { 0, "", 0 } /* end */
- };
-
-struct Parameters {
- int value;
- struct Parameters *next;
- };
-
-int Key_vals[] = {
- 0407, 0526, 0515, 0525, 0512, 0510, 0402, 0514, 0517, 0516, 0410, 0411,
- 0422, 0412, 0413, 0414, 0415, 0416, 0417, 0420, 0421, 0406, 0513, 0511,
- 0404, 0533, 0522, 0523, 0405, 0520, 0521, 0524, 0403,
- 0534, 0535, 0536, 0537, 0540, 0541, 0542, 0543, 0544, 0545, 0546, 0547,
- 0550, 0527, 0551, 0552, 0553, 0554, 0555, 0556, 0557, 0560, 0561, 0562,
- 0532, 0563, 0564, 0565, 0566, 0567, 0570, 0571, 0627, 0630, 0572, 0573,
- 0574, 0575, 0576, 0577, 0600, 0601, 0602, 0603, 0604, 0605, 0606, 0607,
- 0610, 0611, 0612, 0613, 0614, 0615, 0616, 0617, 0620, 0621, 0622, 0623,
- 0624, 0625, 0626, 0423, 0424, 0425, 0426, 0427, 0430, 0431,
- 0432, 0433, 0434, 0435, 0436, 0437, 0440, 0441, 0442, 0443, 0444, 0445,
- 0446, 0447, 0450, 0451, 0452, 0453, 0454, 0455, 0456, 0457, 0460, 0461,
- 0462, 0463, 0464, 0465, 0466, 0467, 0470, 0471, 0472, 0473, 0474, 0475,
- 0476, 0477, 0500, 0501, 0502, 0503, 0504, 0505, 0506, 0507
-};
-
-int attributes_set[9];
-
-static int nc_attributes = 0; /* global attributes for new_curse to observe */
-
-#ifdef SYS5
-struct termio Terminal;
-struct termio Saved_tty;
-#else
-struct sgttyb Terminal;
-struct sgttyb Saved_tty;
-#endif
-
-char *tc_;
-
-int Booleans[128];
-int Numbers[128];
-char *String_table[1024];
-
-int *virtual_lines;
-
-static char nc_scrolling_ability = FALSE;
-
-#ifdef CAP
-
-int tc_Get_int(int);
-void CAP_PARSE(void);
-void Find_term(void);
-
-#endif /* CAP */
-
-
-#ifdef SIGWINCH
-
-/*
- | Copy the contents of one window to another.
- */
-
-void
-copy_window(origin, destination)
-WINDOW *origin, *destination;
-{
- int row, column;
- struct _line *orig, *dest;
-
- orig = origin->first_line;
- dest = destination->first_line;
-
- for (row = 0;
- row < (min(origin->Num_lines, destination->Num_lines));
- row++)
- {
- for (column = 0;
- column < (min(origin->Num_cols, destination->Num_cols));
- column++)
- {
- dest->row[column] = orig->row[column];
- dest->attributes[column] = orig->attributes[column];
- }
- dest->changed = orig->changed;
- dest->scroll = orig->scroll;
- dest->last_char = min(orig->last_char, destination->Num_cols);
- orig = orig->next_screen;
- dest = dest->next_screen;
- }
- destination->LX = min((destination->Num_cols - 1), origin->LX);
- destination->LY = min((destination->Num_lines - 1), origin->LY);
- destination->Attrib = origin->Attrib;
- destination->scroll_up = origin->scroll_up;
- destination->scroll_down = origin->scroll_down;
- destination->SCROLL_CLEAR = origin->SCROLL_CLEAR;
-}
-
-void
-reinitscr(foo)
-int foo;
-{
- WINDOW *local_virt;
- WINDOW *local_std;
- WINDOW *local_cur;
-
- signal(SIGWINCH, reinitscr);
-#ifdef TIOCGWINSZ
- if (ioctl(0, TIOCGWINSZ, &ws) >= 0)
- {
- if (ws.ws_row == LINES && ws.ws_col == COLS)
- return;
- if (ws.ws_row > 0)
- LINES = ws.ws_row;
- if (ws.ws_col > 0)
- COLS = ws.ws_col;
- }
-#endif /* TIOCGWINSZ */
- local_virt = newwin(LINES, COLS, 0, 0);
- local_std = newwin(LINES, COLS, 0, 0);
- local_cur = newwin(LINES, COLS, 0, 0);
- copy_window(virtual_scr, local_virt);
- copy_window(stdscr, local_std);
- copy_window(curscr, local_cur);
- delwin(virtual_scr);
- delwin(stdscr);
- delwin(curscr);
- virtual_scr = local_virt;
- stdscr = local_std;
- curscr = local_cur;
- free(virtual_lines);
- virtual_lines = (int *) malloc(LINES * (sizeof(int)));
- interrupt_flag = TRUE;
-}
-#endif /* SIGWINCH */
-
-void
-initscr() /* initialize terminal for operations */
-{
- int value;
- char *lines_string;
- char *columns_string;
-#ifdef CAP
- char *pointer;
-#endif /* CAP */
-
-#ifdef DIAG
-printf("starting initscr \n");fflush(stdout);
-#endif
- if (initialized)
- return;
-#ifdef BSD_SELECT
- setbuf(stdin, NULL);
-#endif /* BSD_SELECT */
- Flip_Bytes = FALSE;
- Parity = 0;
- Time_Out = FALSE;
- bufp = 0;
- Move_It = FALSE;
- Noblock = FALSE;
-#ifdef SYS5
- value = ioctl(0, TCGETA, &Terminal);
- if (Terminal.c_cflag & PARENB)
- {
- if (Terminal.c_cflag & PARENB)
- Parity = 1;
- else
- Parity = 2;
- }
- if ((Terminal.c_cflag & CS8) == CS8)
- {
- Num_bits = 8;
- }
- else if ((Terminal.c_cflag & CS7) == CS7)
- Num_bits = 7;
- else if ((Terminal.c_cflag & CS6) == CS6)
- Num_bits = 6;
- else
- Num_bits = 5;
- value = Terminal.c_cflag & 037;
- switch (value) {
- case 01: speed = 50.0;
- break;
- case 02: speed = 75.0;
- break;
- case 03: speed = 110.0;
- break;
- case 04: speed = 134.5;
- break;
- case 05: speed = 150.0;
- break;
- case 06: speed = 200.0;
- break;
- case 07: speed = 300.0;
- break;
- case 010: speed = 600.0;
- break;
- case 011: speed = 900.0;
- break;
- case 012: speed = 1200.0;
- break;
- case 013: speed = 1800.0;
- break;
- case 014: speed = 2400.0;
- break;
- case 015: speed = 3600.0;
- break;
- case 016: speed = 4800.0;
- break;
- case 017: speed = 7200.0;
- break;
- case 020: speed = 9600.0;
- break;
- case 021: speed = 19200.0;
- break;
- case 022: speed = 38400.0;
- break;
- default: speed = 0.0;
- }
-#else
- value = ioctl(0, TIOCGETP, &Terminal);
- if (Terminal.sg_flags & EVENP)
- Parity = 2;
- else if (Terminal.sg_flags & ODDP)
- Parity = 1;
- value = Terminal.sg_ospeed;
- switch (value) {
- case 01: speed = 50.0;
- break;
- case 02: speed = 75.0;
- break;
- case 03: speed = 110.0;
- break;
- case 04: speed = 134.5;
- break;
- case 05: speed = 150.0;
- break;
- case 06: speed = 200.0;
- break;
- case 07: speed = 300.0;
- break;
- case 010: speed = 600.0;
- break;
- case 011: speed = 1200.0;
- break;
- case 012: speed = 1800.0;
- break;
- case 013: speed = 2400.0;
- break;
- case 014: speed = 4800.0;
- break;
- case 015: speed = 9600.0;
- break;
- default: speed = 0.0;
- }
-#endif
- chars_per_millisecond = (0.001 * speed) / 8.0;
- TERMINAL_TYPE = getenv("TERM");
- if (TERMINAL_TYPE == NULL)
- {
- printf("unknown terminal type\n");
- exit(0);
- }
-#ifndef CAP
- Fildes = -1;
- TERM_PATH = getenv("TERMINFO");
- if (TERM_PATH != NULL)
- {
- Data_Line_len = 23 + strlen(TERM_PATH) + strlen(TERMINAL_TYPE);
- Term_File_name = malloc(Data_Line_len);
- sprintf(Term_File_name, "%s/%c/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE);
- Fildes = open(Term_File_name, O_RDONLY);
- }
- if (Fildes == -1)
- {
- TERM_PATH = "/usr/lib/terminfo";
- Data_Line_len = 23 + strlen(TERM_PATH) + strlen(TERMINAL_TYPE);
- Term_File_name = malloc(Data_Line_len);
- sprintf(Term_File_name, "%s/%c/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE);
- Fildes = open(Term_File_name, O_RDONLY);
- }
- if (Fildes == -1)
- {
- TERM_PATH = "/usr/share/lib/terminfo";
- Data_Line_len = 23 + strlen(TERM_PATH) + strlen(TERMINAL_TYPE);
- Term_File_name = malloc(Data_Line_len);
- sprintf(Term_File_name, "%s/%c/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE);
- Fildes = open(Term_File_name, O_RDONLY);
- }
- if (Fildes == -1)
- {
- TERM_PATH = "/usr/share/terminfo";
- Data_Line_len = 23 + strlen(TERM_PATH) + strlen(TERMINAL_TYPE);
- Term_File_name = malloc(Data_Line_len);
- sprintf(Term_File_name, "%s/%c/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE);
- Fildes = open(Term_File_name, O_RDONLY);
- }
- if (Fildes == -1)
- {
- free(Term_File_name);
- Term_File_name = NULL;
- }
- else
- TERM_INFO = INFO_PARSE();
-#else
- /*
- | termcap information can be in the TERMCAP env variable, if so
- | use that, otherwise check the /etc/termcap file
- */
- if ((pointer = Term_File_name = getenv("TERMCAP")) != NULL)
- {
- if (*Term_File_name != '/')
- Term_File_name = "/etc/termcap";
- }
- else
- {
- Term_File_name = "/etc/termcap";
- }
- if ((TFP = fopen(Term_File_name, "r")) == NULL)
- {
- printf("unable to open /etc/termcap file \n");
- exit(0);
- }
- for (value = 0; value < 1024; value++)
- String_table[value] = NULL;
- for (value = 0; value < 128; value++)
- Booleans[value] = 0;
- for (value = 0; value < 128; value++)
- Numbers[value] = 0;
- Data_Line = malloc(512);
- if (pointer && *pointer != '/')
- {
- TERM_data_ptr = pointer;
- CAP_PARSE();
- }
- else
- {
- Find_term();
- CAP_PARSE();
- }
-#endif
- if (String_table[pc__] == NULL)
- String_table[pc__] = "\0";
- if ((String_table[cm__] == NULL) || (Booleans[hc__]))
- {
- fprintf(stderr, "sorry, unable to use this terminal type for screen editing\n");
- exit(0);
- }
- Key_Get();
- keys_vt100();
- LINES = Numbers[li__];
- COLS = Numbers[co__];
- if ((lines_string = getenv("LINES")) != NULL)
- {
- value = atoi(lines_string);
- if (value > 0)
- LINES = value;
- }
- if ((columns_string = getenv("COLUMNS")) != NULL)
- {
- value = atoi(columns_string);
- if (value > 0)
- COLS = value;
- }
-#ifdef TIOCGWINSZ
- /*
- | get the window size
- */
- if (ioctl(0, TIOCGWINSZ, &ws) >= 0)
- {
- if (ws.ws_row > 0)
- LINES = ws.ws_row;
- if (ws.ws_col > 0)
- COLS = ws.ws_col;
- }
-#endif
- virtual_scr = newwin(LINES, COLS, 0, 0);
- stdscr = newwin(LINES, COLS, 0, 0);
- curscr = newwin(LINES, COLS, 0, 0);
- wmove(stdscr, 0, 0);
- werase(stdscr);
- Repaint_screen = TRUE;
- initialized = TRUE;
- virtual_lines = (int *) malloc(LINES * (sizeof(int)));
-
-#ifdef SIGWINCH
- /*
- | reset size of windows and LINES and COLS if term window
- | changes size
- */
- signal(SIGWINCH, reinitscr);
-#endif /* SIGWINCH */
-
- /*
- | check if scrolling is available
- */
-
- nc_scrolling_ability = ((String_table[al__] != NULL) &&
- (String_table[dl__])) || ((String_table[cs__])
- && (String_table[sr__]));
-
-}
-
-#ifndef CAP
-int
-Get_int() /* get a two-byte integer from the terminfo file */
-{
- int High_byte;
- int Low_byte;
- int temp;
-
- Low_byte = *((unsigned char *) TERM_data_ptr++);
- High_byte = *((unsigned char *) TERM_data_ptr++);
- if (Flip_Bytes)
- {
- temp = Low_byte;
- Low_byte = High_byte;
- High_byte = temp;
- }
- if ((High_byte == 255) && (Low_byte == 255))
- return (-1);
- else
- return(Low_byte + (High_byte * 256));
-}
-
-int
-INFO_PARSE() /* parse off the data in the terminfo data file */
-{
- int offset;
- int magic_number = 0;
- int counter = 0;
- int Num_names = 0;
- int Num_bools = 0;
- int Num_ints = 0;
- int Num_strings = 0;
- int string_table_len = 0;
- char *temp_ptr;
-
- TERM_data_ptr = Data_Line = malloc((10240 * (sizeof(char))));
- Data_Line_len = read(Fildes, Data_Line, 10240);
- if ((Data_Line_len >= 10240) || (Data_Line_len < 0))
- return(0);
- /*
- | get magic number
- */
- magic_number = Get_int();
- /*
- | if magic number not right, reverse byte order and check again
- */
- if (magic_number != 282)
- {
- Flip_Bytes = TRUE;
- TERM_data_ptr--;
- TERM_data_ptr--;
- magic_number = Get_int();
- if (magic_number != 282)
- return(0);
- }
- /*
- | get the number of each type in the terminfo data file
- */
- Num_names = Get_int();
- Num_bools = Get_int();
- Num_ints = Get_int();
- Num_strings = Get_int();
- string_table_len = Get_int();
- Strings = malloc(string_table_len);
- while (Num_names > 0)
- {
- TERM_data_ptr++;
- Num_names--;
- }
- counter = 0;
- while (Num_bools)
- {
- Num_bools--;
- Booleans[counter++] = *TERM_data_ptr++;
- }
- if (((unsigned int) TERM_data_ptr) & 1) /* force alignment */
- TERM_data_ptr++;
- counter = 0;
- while (Num_ints)
- {
- Num_ints--;
- Numbers[counter] = Get_int();
- counter++;
- }
- temp_ptr = TERM_data_ptr + Num_strings + Num_strings;
- memcpy(Strings, temp_ptr, string_table_len);
- counter = bt__;
- while (Num_strings)
- {
- Num_strings--;
- if ((offset=Get_int()) != -1)
- {
- if (String_table[counter] == NULL)
- String_table[counter] = Strings + offset;
- }
- else
- String_table[counter] = NULL;
- counter++;
- }
- close(Fildes);
- free(Data_Line);
- return(TRUE);
-}
-#endif /* ifndef CAP */
-
-int
-AtoI() /* convert ascii text to integers */
-{
- int Temp;
-
- Temp = 0;
- while ((*TERM_data_ptr >= '0') && (*TERM_data_ptr <= '9'))
- {
- Temp = (Temp * 10) + (*TERM_data_ptr - '0');
- TERM_data_ptr++;
- }
- return(Temp);
-}
-
-void
-Key_Get() /* create linked list with all key sequences obtained from terminal database */
-{
- int Counter;
- int Klen;
- int key_def;
- struct KEY_STACK *Spoint;
-
- Max_Key_len = 0;
- Counter = 0;
- key_def = kb__;
- while (key_def <= kf63__)
- {
- if (key_def == ke__)
- key_def = K1__;
- else if (key_def == (K5__ + 1))
- key_def = kcbt__;
- else if (key_def == (kcbt__ + 1))
- key_def = kbeg__;
- else if (key_def == (kUND__ + 1))
- key_def = kf11__;
- if (String_table[key_def] != NULL)
- {
- if (KEY_TOS == NULL)
- Spoint = KEY_TOS = (struct KEY_STACK *) malloc(sizeof(struct KEY_STACK));
- else
- {
- Spoint = KEY_TOS;
- while (Spoint->next != NULL)
- Spoint = Spoint->next;
- Spoint->next = (struct KEY_STACK *) malloc(sizeof(struct KEY_STACK));
- Spoint = Spoint->next;
- }
- Spoint->next = NULL;
- Spoint->element = (struct KEYS *) malloc(sizeof(struct KEYS));
- Spoint->element->string = String_table[key_def];
- Spoint->element->length = strlen(String_table[key_def]);
- Spoint->element->value = Key_vals[Counter];
- Klen = strlen(Spoint->element->string);
- if (Klen > Max_Key_len)
- Max_Key_len = Klen;
- /*
- | Some terminal types accept keystrokes of the form
- | \E[A and \EOA, substituting '[' for 'O'. Make a
- | duplicate of such key strings (since the
- | database will only have one version) so new_curse
- | can understand both.
- */
- if ((Spoint->element->length > 1) &&
- ((String_table[key_def][1] == '[') ||
- (String_table[key_def][1] == 'O')))
- {
- Spoint->next = (struct KEY_STACK *) malloc(sizeof(struct KEY_STACK));
- Spoint = Spoint->next;
- Spoint->next = NULL;
- Spoint->element = (struct KEYS *) malloc(sizeof(struct KEYS));
- Spoint->element->length = strlen(String_table[key_def]);
- Spoint->element->string = malloc(Spoint->element->length + 1);
- strcpy(Spoint->element->string, String_table[key_def]);
- Spoint->element->value = Key_vals[Counter];
- Klen = strlen(Spoint->element->string);
- if (Klen > Max_Key_len)
- Max_Key_len = Klen;
-
- if (String_table[key_def][1] == '[')
- Spoint->element->string[1] = 'O';
- else
- Spoint->element->string[1] = '[';
- }
- }
- key_def++;
- Counter++;
- }
-}
-
-/*
- | insert information about keys for a vt100 terminal
- */
-
-void
-keys_vt100()
-{
- int counter;
- int Klen;
- struct KEY_STACK *Spoint;
-
- Spoint = KEY_TOS;
- while (Spoint->next != NULL)
- Spoint = Spoint->next;
- for (counter = 0; vt100[counter].length != 0; counter++)
- {
- Spoint->next = (struct KEY_STACK *) malloc(sizeof(struct KEY_STACK));
- Spoint = Spoint->next;
- Spoint->next = NULL;
- Spoint->element = &vt100[counter];
- Klen = strlen(Spoint->element->string);
- if (Klen > Max_Key_len)
- Max_Key_len = Klen;
- }
-}
-
-#ifdef CAP
-char *
-String_Get(param) /* read the string */
-char *param;
-{
- char *String;
- char *Temp;
- int Counter;
-
- if (param == NULL)
- {
- while (*TERM_data_ptr != '=')
- TERM_data_ptr++;
- Temp = ++TERM_data_ptr;
- Counter = 1;
- while ((*Temp != ':') && (*Temp != (char)NULL))
- {
- Counter++;
- Temp++;
- }
- if (Counter == 1) /* no data */
- return(NULL);
- String = Temp = malloc(Counter);
- while ((*TERM_data_ptr != ':') && (*TERM_data_ptr != (char)NULL))
- {
- if (*TERM_data_ptr == '\\')
- {
- TERM_data_ptr++;
- if (*TERM_data_ptr == 'n')
- *Temp = '\n';
- else if (*TERM_data_ptr == 't')
- *Temp = '\t';
- else if (*TERM_data_ptr == 'b')
- *Temp = '\b';
- else if (*TERM_data_ptr == 'r')
- *Temp = '\r';
- else if (*TERM_data_ptr == 'f')
- *Temp = '\f';
- else if ((*TERM_data_ptr == 'e') || (*TERM_data_ptr == 'E'))
- *Temp = '\033'; /* escape */
- else if (*TERM_data_ptr == '\\')
- *Temp = '\\';
- else if (*TERM_data_ptr == '\'')
- *Temp = '\'';
- else if ((*TERM_data_ptr >= '0') && (*TERM_data_ptr <= '9'))
- {
- Counter = 0;
- while ((*TERM_data_ptr >= '0') && (*TERM_data_ptr <= '9'))
- {
- Counter = (8 * Counter) + (*TERM_data_ptr - '0');
- TERM_data_ptr++; /* ? */
- }
- *Temp = Counter;
- TERM_data_ptr--;
- }
- TERM_data_ptr++;
- Temp++;
- }
- else if (*TERM_data_ptr == '^')
- {
- TERM_data_ptr++;
- if ((*TERM_data_ptr >= '@') && (*TERM_data_ptr <= '_'))
- *Temp = *TERM_data_ptr - '@';
- else if (*TERM_data_ptr == '?')
- *Temp = 127;
- TERM_data_ptr++;
- Temp++;
- }
- else
- *Temp++ = *TERM_data_ptr++;
- }
- *Temp = (char)NULL;
- param = String;
- }
- else
- {
- while ((*TERM_data_ptr != (char)NULL) && (*TERM_data_ptr != ':'))
- TERM_data_ptr++;
- }
- return(param);
-}
-
-int
-tc_Get_int(param) /* read the integer */
-int param;
-{
- int Itemp;
-
- if (param == 0)
- {
- while ((*TERM_data_ptr != (char)NULL) && (*TERM_data_ptr != '#'))
- TERM_data_ptr++;
- TERM_data_ptr++;
- Itemp = AtoI();
- param = Itemp;
- }
- else
- {
- while (*TERM_data_ptr != ':')
- TERM_data_ptr++;
- }
- return(param);
-}
-
-void
-Find_term() /* find terminal description in termcap file */
-{
- char *Name;
- char *Ftemp;
-
- Ftemp = Name = malloc(strlen(TERMINAL_TYPE + 1) + 1);
- strcpy(Name, TERMINAL_TYPE);
- while (*Ftemp != (char)NULL)
- Ftemp++;
- *Ftemp++ = '|';
- *Ftemp = (char)NULL;
- CFOUND = FALSE;
- Data_Line_len = strlen(TERMINAL_TYPE) + 1;
- while ((!CFOUND) && ((TERM_data_ptr=fgets(Data_Line, 512, TFP)) != NULL))
- {
- if ((*TERM_data_ptr != ' ') && (*TERM_data_ptr != '\t') && (*TERM_data_ptr != '#'))
- {
- while ((!CFOUND) && (*TERM_data_ptr != (char)NULL))
- {
- CFOUND = !strncmp(TERM_data_ptr, Name, Data_Line_len);
- while ((*TERM_data_ptr != (char)NULL) && (*TERM_data_ptr != '|') && (*TERM_data_ptr != '#') && (*TERM_data_ptr != ':'))
- TERM_data_ptr++;
- if (*TERM_data_ptr == '|')
- TERM_data_ptr++;
- else if (!CFOUND)
- *TERM_data_ptr = (char)NULL;
- }
- }
- }
- if (!CFOUND)
- {
- printf("terminal type %s not found\n", TERMINAL_TYPE);
- exit(0);
- }
-}
-
-void
-CAP_PARSE() /* parse off the data in the termcap data file */
-{
- int offset;
- int found;
-
- do
- {
- while (*TERM_data_ptr != (char)NULL)
- {
- for (found = FALSE, offset = 0; (!found) && (offset < 26); offset++)
- {
- if (!strncmp(TERM_data_ptr, Boolean_names[offset], 2))
- {
- found = TRUE;
- Booleans[offset] = TRUE;
- }
- }
- if (!found)
- {
- for (found = FALSE, offset = 0; (!found) && (offset < lw__); offset++)
- {
- if (!strncmp(TERM_data_ptr, Number_names[offset], 3))
- {
- found = TRUE;
- Numbers[offset] = tc_Get_int(Numbers[offset]);
- }
- }
- }
- if (!found)
- {
- for (found = FALSE, offset = 0; (!found) && (offset < smgr__); offset++)
- {
- if (!strncmp(TERM_data_ptr, String_names[offset], 3))
- {
- found = TRUE;
- String_table[offset] = String_Get(String_table[offset]);
- }
- }
- }
-
- if (!strncmp(TERM_data_ptr, "tc=", 3))
- tc_ = String_Get(NULL);
- while ((*TERM_data_ptr != ':') && (*TERM_data_ptr != (char)NULL))
- TERM_data_ptr++;
- if (*TERM_data_ptr == ':')
- TERM_data_ptr++;
- }
- } while (((TERM_data_ptr = fgets(Data_Line, 512, TFP)) != NULL) && ((*TERM_data_ptr == ' ') || (*TERM_data_ptr == '\t')));
- if (tc_ != NULL)
- {
- TERMINAL_TYPE = tc_;
- rewind(TFP);
- Find_term();
- free(tc_);
- tc_ = NULL;
- CAP_PARSE();
- }
- else
- fclose(TFP);
-}
-#endif /* ifdef CAP */
-
-struct _line *
-Screenalloc(columns)
-int columns;
-{
- int i;
- struct _line *tmp;
-
- tmp = (struct _line *) malloc(sizeof (struct _line));
- tmp->row = malloc(columns + 1);
- tmp->attributes = malloc(columns + 1);
- tmp->prev_screen = NULL;
- tmp->next_screen = NULL;
- for (i = 0; i < columns; i++)
- {
- tmp->row[i] = ' ';
- tmp->attributes[i] = (char) NULL;
- }
- tmp->scroll = tmp->changed = FALSE;
- tmp->row[0] = (char) NULL;
- tmp->attributes[0] = (char) NULL;
- tmp->row[columns] = (char) NULL;
- tmp->attributes[columns] = (char) NULL;
- tmp->last_char = 0;
- return(tmp);
-}
-
-WINDOW *newwin(lines, cols, start_l, start_c)
-int lines, cols; /* number of lines and columns to be in window */
-int start_l, start_c; /* starting line and column to be inwindow */
-{
- WINDOW *Ntemp;
- struct _line *temp_screen;
- int i;
-
- Ntemp = (WINDOW *) malloc(sizeof(WINDOW));
- Ntemp->SR = start_l;
- Ntemp->SC = start_c;
- Ntemp->Num_lines = lines;
- Ntemp->Num_cols = cols;
- Ntemp->LX = 0;
- Ntemp->LY = 0;
- Ntemp->scroll_down = Ntemp->scroll_up = 0;
- Ntemp->SCROLL_CLEAR = FALSE;
- Ntemp->Attrib = FALSE;
- Ntemp->first_line = temp_screen = Screenalloc(cols);
- Ntemp->first_line->number = 0;
- for (i = 1; i < lines; i++)
- {
- temp_screen->next_screen = Screenalloc(cols);
- temp_screen->next_screen->number = i;
- temp_screen->next_screen->prev_screen = temp_screen;
- temp_screen = temp_screen->next_screen;
- }
- Ntemp->first_line->prev_screen = NULL;
- temp_screen->next_screen = NULL;
- return(Ntemp);
-}
-
-#ifdef CAP
-void
-Cap_Out(string, p_list, place) /* interpret the output string if necessary */
-char *string;
-int p_list[]; /* stack of values */
-int place; /* place keeper of top of stack */
-{
- char *Otemp; /* temporary string pointer to parse output */
- int delay;
- int p1, p2, temp;
- float chars;
-
- if (string == NULL)
- return;
-
- if (p_list != NULL)
- {
- p1 = p_list[--place];
- p2 = p_list[--place];
- }
- delay = 0;
- Otemp = string;
- if ((*Otemp >= '0') && (*Otemp <= '9'))
- {
- delay = atoi(Otemp);
- while ((*Otemp >= '0') && (*Otemp <= '9'))
- Otemp++;
- if (*Otemp == '*')
- Otemp++;
- }
- while (*Otemp != (char)NULL)
- {
- if (*Otemp == '%')
- {
- Otemp++;
- if ((*Otemp == 'd') || (*Otemp == '2') || (*Otemp == '3') || (*Otemp == '.') || (*Otemp == '+'))
- {
- if (*Otemp == 'd')
- printf("%d", p1);
- else if (*Otemp == '2')
- printf("%02d", p1);
- else if (*Otemp == '3')
- printf("%03d", p1);
- else if (*Otemp == '+')
- {
- Otemp++;
- p1 += *Otemp;
- putchar(p1);
- }
- else if (*Otemp == '.')
- putchar(p1);
- p1 = p2;
- p2 = 0;
- }
- else if (*Otemp == '>')
- {
- Otemp++;
- if (p1 > *Otemp)
- {
- Otemp++;
- p1 += *Otemp;
- }
- else
- Otemp++;
- }
- else if (*Otemp == 'r')
- {
- temp = p1;
- p1 = p2;
- p2 = temp;
- }
- else if (*Otemp == 'i')
- {
- p1++;
- p2++;
- }
- else if (*Otemp == '%')
- putchar(*Otemp);
- else if (*Otemp == 'n')
- {
- p1 ^= 0140;
- p2 ^= 0140;
- }
- else if (*Otemp == 'B')
- {
- p1 = (16 * (p1/10)) + (p1 % 10);
- p2 = (16 * (p2/10)) + (p2 % 10);
- }
- else if (*Otemp == 'D')
- {
- p1 = (p1 - 2 * (p1 % 16));
- p2 = (p2 - 2 * (p2 % 16));
- }
- }
- else
- putchar (*Otemp);
- Otemp++;
- }
- if (delay != 0)
- {
- chars = delay * chars_per_millisecond;
- delay = chars;
- if ((chars - delay) > 0.0)
- delay++;
- for (; delay > 0; delay--)
- putchar(*String_table[pc__]);
- }
- fflush(stdout);
-}
-
-#else
-
- char *Otemp; /* temporary string pointer to parse output */
- float chars;
- int p[10];
- int variable[27];
-
-int
-Operation(Temp_Stack, place) /* handle conditional operations */
-int Temp_Stack[];
-int place;
-{
- int temp;
-
- if (*Otemp == 'd')
- {
- Otemp++;
- temp = Temp_Stack[--place];
- printf("%d", temp);
- }
- else if (!strncmp(Otemp, "2d", 2))
- {
- temp = Temp_Stack[--place];
- printf("%2d", temp);
- Otemp++;
- Otemp++;
- }
- else if (!strncmp(Otemp, "3d", 2))
- {
- temp = Temp_Stack[--place];
- printf("%0d", temp);
- Otemp++;
- Otemp++;
- }
- else if (!strncmp(Otemp, "02d", 3))
- {
- temp = Temp_Stack[--place];
- printf("%02d", temp);
- Otemp++;
- Otemp++;
- Otemp++;
- }
- else if (!strncmp(Otemp, "03d", 3))
- {
- temp = Temp_Stack[--place];
- printf("%03d", temp);
- Otemp++;
- Otemp++;
- Otemp++;
- }
- else if (*Otemp == '+')
- {
- Otemp++;
- temp = Temp_Stack[--place];
- temp += Temp_Stack[--place];
- Temp_Stack[place++] = temp;
- }
- else if (*Otemp == '-')
- {
- Otemp++;
- temp = Temp_Stack[--place];
- temp -= Temp_Stack[--place];
- Temp_Stack[place++] = temp;
- }
- else if (*Otemp == '*')
- {
- Otemp++;
- temp = Temp_Stack[--place];
- temp *= Temp_Stack[--place];
- Temp_Stack[place++] = temp;
- }
- else if (*Otemp == '/')
- {
- Otemp++;
- temp = Temp_Stack[--place];
- temp /= Temp_Stack[--place];
- Temp_Stack[place++] = temp;
- }
- else if (*Otemp == 'm')
- {
- Otemp++;
- temp = Temp_Stack[--place];
- temp %= Temp_Stack[--place];
- Temp_Stack[place++] = temp;
- }
- else if (*Otemp == '&')
- {
- Otemp++;
- temp = Temp_Stack[--place];
- temp &= Temp_Stack[--place];
- Temp_Stack[place++] = temp;
- }
- else if (*Otemp == '|')
- {
- Otemp++;
- temp = Temp_Stack[--place];
- temp |= Temp_Stack[--place];
- Temp_Stack[place++] = temp;
- }
- else if (*Otemp == '^')
- {
- Otemp++;
- temp = Temp_Stack[--place];
- temp ^= Temp_Stack[--place];
- Temp_Stack[place++] = temp;
- }
- else if (*Otemp == '=')
- {
- Otemp++;
- temp = Temp_Stack[--place];
- temp = (temp == Temp_Stack[--place]);
- Temp_Stack[place++] = temp;
- }
- else if (*Otemp == '>')
- {
- Otemp++;
- temp = Temp_Stack[--place];
- temp = temp > Temp_Stack[--place];
- Temp_Stack[place++] = temp;
- }
- else if (*Otemp == '<')
- {
- Otemp++;
- temp = Temp_Stack[--place];
- temp = temp < Temp_Stack[--place];
- Temp_Stack[place++] = temp;
- }
- else if (*Otemp == 'c')
- {
- Otemp++;
- putchar(Temp_Stack[--place]);
- }
- else if (*Otemp == 'i')
- {
- Otemp++;
- p[1]++;
- p[2]++;
- }
- else if (*Otemp == '%')
- {
- putchar(*Otemp);
- Otemp++;
- }
- else if (*Otemp == '!')
- {
- temp = ! Temp_Stack[--place];
- Temp_Stack[place++] = temp;
- Otemp++;
- }
- else if (*Otemp == '~')
- {
- temp = ~Temp_Stack[--place];
- Temp_Stack[place++] = temp;
- Otemp++;
- }
- else if (*Otemp == 'p')
- {
- Otemp++;
- Temp_Stack[place++] = p[*Otemp - '0'];
- Otemp++;
- }
- else if (*Otemp == 'P')
- {
- Otemp++;
- Temp_Stack[place++] = variable[*Otemp - 'a'];
- Otemp++;
- }
- else if (*Otemp == 'g')
- {
- Otemp++;
- variable[*Otemp - 'a'] = Temp_Stack[--place];
- Otemp++;
- }
- else if (*Otemp == '\'')
- {
- Otemp++;
- Temp_Stack[place++] = *Otemp;
- Otemp++;
- Otemp++;
- }
- else if (*Otemp == '{')
- {
- Otemp++;
- temp = atoi(Otemp);
- Temp_Stack[place++] = temp;
- while (*Otemp != '}')
- Otemp++;
- Otemp++;
- }
- return(place);
-}
-
-void
-Info_Out(string, p_list, place) /* interpret the output string if necessary */
-char *string;
-int p_list[];
-int place;
-{
- char *tchar;
- int delay;
- int temp;
- int Cond_FLAG;
- int EVAL;
- int Cond_Stack[128];
- int Cond_place;
- int Stack[128];
- int Top_of_stack;
-
- if (string == NULL)
- return;
-
- Cond_FLAG = FALSE;
- Cond_place = 0;
- Top_of_stack = 0;
- p[0] = 0;
- p[1] = 0;
- p[2] = 0;
- p[3] = 0;
- p[4] = 0;
- p[5] = 0;
- p[6] = 0;
- p[7] = 0;
- p[8] = 0;
- p[9] = 0;
- if (p_list != NULL)
- {
- for (temp = 1; (place != 0); temp++)
- {
- p[temp] = p_list[--place];
- }
- }
- delay = 0;
- Otemp = string;
- while (*Otemp != (char) NULL)
- {
- if (*Otemp == '%')
- {
- Otemp++;
- if ((*Otemp == '?') || (*Otemp == 't') || (*Otemp == 'e') || (*Otemp == ';'))
- {
- if (*Otemp == '?')
- {
- Otemp++;
- Cond_FLAG = TRUE;
- EVAL = TRUE;
- while (EVAL)
- {
- /*
- | find the end of the
- | conditional statement
- */
- while ((strncmp(Otemp, "%t", 2)) && (*Otemp != (char) NULL))
- {
- /*
- | move past '%'
- */
- Otemp++;
- Cond_place = Operation(Cond_Stack, Cond_place);
- }
-
- /*
- | if condition is true
- */
- if ((Cond_place > 0) && (Cond_Stack[Cond_place-1]))
- {
- /*
- | end conditional
- | parsing
- */
- EVAL = FALSE;
- Otemp++;
- Otemp++;
- }
- else /* condition is false */
- {
- /*
- | find 'else' or end
- | of if statement
- */
- while ((strncmp(Otemp, "%e", 2)) && (strncmp(Otemp, "%;", 2)) && (*Otemp != (char) NULL))
- Otemp++;
- /*
- | if an 'else' found
- */
- if ((*Otemp != (char) NULL) && (!strncmp(Otemp, "%e", 2)))
- {
- Otemp++;
- Otemp++;
- tchar = Otemp;
- /*
- | check for 'then' part
- */
- while ((*tchar != (char) NULL) && (strncmp(tchar, "%t", 2)) && (strncmp(tchar, "%;", 2)))
- tchar++;
- /*
- | if end of string
- */
- if (*tchar == (char) NULL)
- {
- EVAL = FALSE;
- Cond_FLAG = FALSE;
- Otemp = tchar;
- }
- /*
- | if end of if found,
- | set up to parse
- | info
- */
- else if (!strncmp(tchar, "%;", 2))
- EVAL = FALSE;
- /*
- | otherwise, check
- | conditional in
- | 'else'
- */
- }
- /*
- | if end of if found,
- | get out of if
- | statement
- */
- else if ((*Otemp != (char) NULL) && (!strncmp(Otemp, "%;", 2)))
- {
- EVAL = FALSE;
- Otemp++;
- Otemp++;
- }
- else /* Otemp == NULL */
- {
- EVAL = FALSE;
- Cond_FLAG = FALSE;
- }
- }
- }
- }
- else
- {
- Otemp++;
- Cond_FLAG = FALSE;
- if (*Otemp != ';')
- {
- while ((*Otemp != (char) NULL) && (strncmp(Otemp, "%;", 2)))
- Otemp++;
- if (*Otemp != (char) NULL)
- {
- Otemp++;
- Otemp++;
- }
- }
- else
- Otemp++;
- }
- }
- else
- {
- Top_of_stack = Operation(Stack, Top_of_stack);
- }
- }
- else if (!strncmp(Otemp, "$<", 2))
- {
- Otemp++;
- Otemp++;
- delay = atoi(Otemp);
- while (*Otemp != '>')
- Otemp++;
- Otemp++;
- chars = delay * chars_per_millisecond;
- delay = chars;
- if ((chars - delay) > 0.0)
- delay++;
- if (String_table[pc__] == NULL)
- temp = 0;
- else
- temp = *String_table[pc__];
- for (; delay > 0; delay--)
- putc(temp, stdout);
- }
- else
- {
- putchar(*Otemp);
- Otemp++;
- }
- }
- fflush(stdout);
-}
-#endif
-
-void
-wmove(window, row, column) /* move cursor to indicated position in window */
-WINDOW *window;
-int row, column;
-{
- if ((row < window->Num_lines) && (column < window->Num_cols))
- {
- window->LX = column;
- window->LY = row;
- }
-}
-
-void
-clear_line(line, column, cols)
-struct _line *line;
-int column;
-int cols;
-{
- int j;
-
- if (column > line->last_char)
- line->row[line->last_char] = ' ';
- line->last_char = column;
- line->row[column] = (char) NULL;
- line->attributes[column] = (char) NULL;
- line->changed = TRUE;
- for (j = column + 1; j < cols; j++)
- {
- line->row[j] = ' ';
- line->attributes[j] = (char) NULL;
- }
-}
-
-void
-werase(window) /* clear the specified window */
-WINDOW *window;
-{
- int i;
- struct _line *tmp;
-
- window->SCROLL_CLEAR = CLEAR;
- window->scroll_up = window->scroll_down = 0;
- for (i = 0, tmp = window->first_line; i < window->Num_lines; i++, tmp = tmp->next_screen)
- clear_line(tmp, 0, window->Num_cols);
-}
-
-void
-wclrtoeol(window) /* erase from current cursor position to end of line */
-WINDOW *window;
-{
- int column, row;
- struct _line *tmp;
-
- window->SCROLL_CLEAR = CHANGE;
- column = window->LX;
- row = window->LY;
- for (row = 0, tmp = window->first_line; row < window->LY; row++)
- tmp = tmp->next_screen;
- clear_line(tmp, column, window->Num_cols);
-}
-
-void
-wrefresh(window) /* flush all previous output */
-WINDOW *window;
-{
- wnoutrefresh(window);
-#ifdef DIAG
-{
- struct _line *temp;
- int value;
- fprintf(stderr, "columns=%d, lines=%d, SC=%d, SR=%d\n",window->Num_cols, window->Num_lines, window->SC, window->SR);
- for (value = 0, temp = window->first_line; value < window->Num_lines; value++, temp = temp->next_screen)
- {
- if (temp->number == -1)
- fprintf(stderr, "line moved ");
- if (temp->scroll)
- fprintf(stderr, "scroll_x is set: ");
- fprintf(stderr, "lc%d=%s|\n", temp->last_char, temp->row);
- }
- fprintf(stderr, "+-------------------- virtual screen ----------------------------------------+\n");
- fprintf(stderr, "columns=%d, lines=%d \n",virtual_scr->Num_cols, virtual_scr->Num_lines);
- for (value = 0, temp = virtual_scr->first_line; value < virtual_scr->Num_lines; value++, temp = temp->next_screen)
- {
- if (temp->number == -1)
- fprintf(stderr, "line moved ");
- if (temp->scroll)
- fprintf(stderr, "scroll_x is set: ");
- fprintf(stderr, "lc%d=%s|\n", temp->last_char, temp->row);
- }
- fprintf(stderr, "columns=%d, lines=%d \n",curscr->Num_cols, curscr->Num_lines);
- for (value = 0, temp = curscr->first_line; value < curscr->Num_lines; value++, temp = temp->next_screen)
- fprintf(stderr, "line=%s|\n", temp->row);
-}
-#endif
- doupdate();
- virtual_scr->SCROLL_CLEAR = FALSE;
- virtual_scr->scroll_down = virtual_scr->scroll_up = 0;
- fflush(stdout);
-}
-
-void
-touchwin(window)
-WINDOW *window;
-{
- struct _line *user_line;
- int line_counter = 0;
-
- for (line_counter = 0, user_line = window->first_line;
- line_counter < window->Num_lines; line_counter++)
- {
- user_line->changed = TRUE;
- }
- window->SCROLL_CLEAR = TRUE;
-}
-
-void
-wnoutrefresh(window)
-WINDOW *window;
-{
- struct _line *user_line;
- struct _line *virtual_line;
- int line_counter = 0;
- int user_col = 0;
- int virt_col = 0;
-
- if (window->SR >= virtual_scr->Num_lines)
- return;
- user_line = window->first_line;
- virtual_line = virtual_scr->first_line;
- virtual_scr->SCROLL_CLEAR = window->SCROLL_CLEAR;
- virtual_scr->LX = window->LX + window->SC;
- virtual_scr->LY = window->LY + window->SR;
- virtual_scr->scroll_up = window->scroll_up;
- virtual_scr->scroll_down = window->scroll_down;
- if ((last_window_refreshed == window) && (!window->SCROLL_CLEAR))
- return;
- for (line_counter = 0; line_counter < window->SR; line_counter++)
- {
- virtual_line = virtual_line->next_screen;
- }
- for (line_counter = 0; (line_counter < window->Num_lines)
- && ((line_counter + window->SR) < virtual_scr->Num_lines);
- line_counter++)
- {
- if ((last_window_refreshed != window) || (user_line->changed) || ((SCROLL | CLEAR) & window->SCROLL_CLEAR))
- {
- for (user_col = 0, virt_col = window->SC;
- (virt_col < virtual_scr->Num_cols)
- && (user_col < window->Num_cols);
- virt_col++, user_col++)
- {
- virtual_line->row[virt_col] = user_line->row[user_col];
- virtual_line->attributes[virt_col] = user_line->attributes[user_col];
- }
- }
- if (virtual_scr->Num_cols != window->Num_cols)
- {
- if (virtual_line->last_char < (user_line->last_char + window->SC))
- {
- if (virtual_line->row[virtual_line->last_char] == (char) NULL)
- virtual_line->row[virtual_line->last_char] = ' ';
- virtual_line->last_char =
- min(virtual_scr->Num_cols,
- (user_line->last_char + window->SC));
- }
- else if (virtual_line->last_char > (user_line->last_char + window->SC))
- {
- virtual_line->row[min(virtual_scr->Num_cols,
- (user_line->last_char + window->SC))] = ' ';
- }
- }
- else
- virtual_line->last_char = user_line->last_char;
- virtual_line->row[virtual_line->last_char] = (char) NULL;
- virtual_line->changed = user_line->changed;
- virtual_line = virtual_line->next_screen;
- user_line = user_line->next_screen;
- }
- window->SCROLL_CLEAR = FALSE;
- window->scroll_up = window->scroll_down = 0;
- last_window_refreshed = window;
-}
-
-void
-flushinp() /* flush input */
-{
-}
-
-void
-ungetch(c) /* push a character back on input */
-int c;
-{
- if (bufp < 100)
- in_buff[bufp++] = c;
-}
-
-#ifdef BSD_SELECT
-int
-timed_getchar()
-{
- struct timeval tv;
- fd_set fds;
- int ret_val;
- int nfds = 1;
- char temp;
-
- FD_ZERO(&fds);
- tv.tv_sec = 0;
- tv.tv_usec = 500000; /* half a second */
- FD_SET(0, &fds);
- Time_Out = FALSE; /* just in case */
-
- ret_val = select(nfds, &fds, 0, 0, &tv);
-
- /*
- | if ret_val is less than zero, there was no input
- | otherwise, get a character and return it
- */
-
- if (ret_val <= 0)
- {
- Time_Out = TRUE;
- return(-1);
- }
-
- return(read(STDIN_FILENO, &temp, 1)? temp : -1);
-}
-#endif
-
-int
-wgetch(window) /* get character from specified window */
-WINDOW *window;
-{
- int in_value;
- char temp;
-#ifndef SYS5
- int old_arg;
-#endif /* SYS5 */
-
-#ifdef BSD_SELECT
- if (Noblock)
- in_value = ((bufp > 0) ? in_buff[--bufp] : timed_getchar());
- else
- in_value = ((bufp > 0) ? in_buff[--bufp] : read(STDIN_FILENO, &temp, 1)? temp : -1);
-#else /* BSD_SELECT */
-#ifdef SYS5
- in_value = ((bufp > 0) ? in_buff[--bufp] :
- (read(STDIN_FILENO, &temp, 1)> 0) ? temp : -1);
-#else /* SYS5 */
- if (Noblock)
- {
- Time_Out = FALSE;
- old_arg = fcntl(0, F_GETFL, 0);
- in_value = fcntl(0, F_SETFL, old_arg | FNDELAY);
- }
- in_value = ((bufp > 0) ? in_buff[--bufp] : read(STDIN_FILENO, &temp, 1)? temp : -1);
- if (Noblock)
- {
- fcntl(0, F_SETFL, old_arg);
- if (Time_Out)
- in_value = -1;
- }
-#endif /* SYS5 */
-#endif /* BSD_SELECT */
-
- if (in_value != -1)
- {
- in_value &= 0xff;
- if ((Parity) && (Num_bits < 8))
- /* strip eighth bit if parity in use */
- in_value &= 0177;
- }
- else if (interrupt_flag)
- {
- interrupt_flag = FALSE;
- in_value = wgetch(window);
- }
-
- if ((in_value == '\033') || (in_value == '\037'))/* escape character */
- in_value = Get_key(in_value);
- return(in_value);
-}
-
-#ifndef BSD_SELECT
-void
-Clear(arg) /* notify that time out has occurred */
-int arg;
-{
- Time_Out = TRUE;
-#ifdef DEBUG
-fprintf(stderr, "inside Clear()\n");
-fflush(stderr);
-#endif /* DEBUG */
-}
-#endif /* BSD_SELECT */
-
-int
-Get_key(first_char) /* try to decode key sequence */
-int first_char; /* first character of sequence */
-{
- int in_char;
- int Count;
- char string[128];
- char *Gtemp;
- int Found;
-#ifdef SYS5
- struct termio Gterminal;
-#else
- struct sgttyb Gterminal;
-#endif
- struct KEY_STACK *St_point;
-#if (!defined( BSD_SELECT)) || (!defined(SYS5))
- int value;
-#endif /* BSD_SELECT */
-
- Count = 0;
- Gtemp = string;
- string[Count++] = first_char;
- string[Count] = (char) NULL;
- Time_Out = FALSE;
-#ifndef BSD_SELECT
- signal(SIGALRM, Clear);
- value = alarm(1);
-#endif /* BSD_SELECT */
- Noblock = TRUE;
-#ifdef SYS5
- Gterminal.c_cc[VTIME] = 0; /* timeout value */
- Gterminal.c_lflag &= ~ICANON; /* disable canonical operation */
- Gterminal.c_lflag &= ~ECHO; /* disable echo */
-#endif
- Count = 1;
- Found = FALSE;
- while ((Count < Max_Key_len) && (!Time_Out) && (!Found))
- {
- in_char = wgetch(stdscr);
-#ifdef DEBUG
-fprintf(stderr, "back in GetKey()\n");
-fflush(stderr);
-#endif /* DEBUG */
- if (in_char != -1)
- {
- string[Count++] = in_char;
- string[Count] = (char) NULL;
- St_point = KEY_TOS;
- while ((St_point != NULL) && (!Found))
- {
- if (!strcmp(string, St_point->element->string))
- Found = TRUE;
- else
- St_point = St_point->next;
- }
- }
- }
-#ifndef BSD_SELECT
- if (!Time_Out)
- value = alarm(0);
-#endif /* BSD_SELECT */
-#ifdef SYS5
-/* value = ioctl(0, TCSETA, &Terminal);*/
-#else
- value = ioctl(0, TIOCSETP, &Terminal);
-/* value = fcntl(0, F_SETFL, old_arg);*/
-#endif
- Noblock = FALSE;
- if (Found)
- {
- return(St_point->element->value);
- }
- else
- {
- while (Count > 1)
- {
- if ((string[--Count] != -1) &&
- ((unsigned char) (string[Count]) != 255))
- {
-#ifdef DIAG
-fprintf(stderr, "ungetting character %d\n", string[Count]);fflush(stdout);
-#endif
- ungetch(string[Count]);
- }
- }
- return(first_char);
- }
-}
-
-void
-waddch(window, c) /* output the character in the specified window */
-WINDOW *window;
-int c;
-{
- int row, column;
- int shift; /* number of spaces to shift if a tab */
- struct _line *tmpline;
-
-#ifdef DIAG
-/*printf("starting waddch \n");fflush(stdout);*/
-#endif
- row = window->LY;
- column = window->LX;
- if (c == '\t')
- {
- shift = (column + 1) % 8;
- if (shift == 0)
- shift++;
- else
- shift = 9 - shift;
- while (shift > 0)
- {
- shift--;
- waddch(window, ' ');
- }
- }
- else if ((column < window->Num_cols) && (row < window->Num_lines))
- {
- if ((c == '~') && (Booleans[hz__]))
- c = '@';
-
- if (( c != '\b') && (c != '\n') && (c != '\r'))
- {
- row = 0;
- tmpline = window->first_line;
- while (row < window->LY)
- {
- row++;
- tmpline = tmpline->next_screen;
- }
- tmpline->row[column] = c;
- tmpline->attributes[column] = window->Attrib;
- tmpline->changed = TRUE;
- if (column >= tmpline->last_char)
- {
- if (column > tmpline->last_char)
- tmpline->row[tmpline->last_char] = ' ';
- tmpline->row[column + 1] = (char) NULL;
- tmpline->attributes[column + 1] = (char) NULL;
- tmpline->last_char = column + 1;
- }
- }
- if (c == '\n')
- {
- wclrtoeol(window);
- window->LX = window->Num_cols;
- }
- else if (c == '\r')
- window->LX = 0;
- else if (c == '\b')
- window->LX--;
- else
- window->LX++;
- }
- if (window->LX >= window->Num_cols)
- {
- window->LX = 0;
- window->LY++;
- if (window->LY >= window->Num_lines)
- {
- window->LY = window->Num_lines - 1;
-/* window->LY = row;
- wmove(window, 0, 0);
- wdeleteln(window);
- wmove(window, row, 0);*/
- }
- }
- window->SCROLL_CLEAR = CHANGE;
-}
-
-void
-winsertln(window) /* insert a blank line into the specified window */
-WINDOW *window;
-{
- int row, column;
- struct _line *tmp;
- struct _line *tmp1;
-
- window->scroll_down += 1;
- window->SCROLL_CLEAR = SCROLL;
- column = window->LX;
- row = window->LY;
- for (row = 0, tmp = window->first_line; (row < window->Num_lines) && (tmp->next_screen != NULL); row++)
- tmp = tmp->next_screen;
- if (tmp->prev_screen != NULL)
- tmp->prev_screen->next_screen = NULL;
- tmp1 = tmp;
- clear_line(tmp1, 0, window->Num_cols);
- tmp1->number = -1;
- for (row = 0, tmp = window->first_line; (row < window->LY) && (tmp->next_screen != NULL); row++)
- tmp = tmp->next_screen;
- if ((window->LY == (window->Num_lines - 1)) && (window->Num_lines > 1))
- {
- tmp1->next_screen = tmp->next_screen;
- tmp->next_screen = tmp1;
- tmp->changed = TRUE;
- tmp->next_screen->prev_screen = tmp;
- }
- else if (window->Num_lines > 1)
- {
- if (tmp->prev_screen != NULL)
- tmp->prev_screen->next_screen = tmp1;
- tmp1->prev_screen = tmp->prev_screen;
- tmp->prev_screen = tmp1;
- tmp1->next_screen = tmp;
- tmp->changed = TRUE;
- tmp->scroll = DOWN;
- }
- if (window->LY == 0)
- window->first_line = tmp1;
-}
-
-void
-wdeleteln(window) /* delete a line in the specified window */
-WINDOW *window;
-{
- int row, column;
- struct _line *tmp;
- struct _line *tmpline;
-
- if (window->Num_lines > 1)
- {
- window->scroll_up += 1;
- window->SCROLL_CLEAR = SCROLL;
- column = window->LX;
- row = window->LY;
- for (row = 0, tmp = window->first_line; row < window->LY; row++)
- tmp = tmp->next_screen;
- if (window->LY == 0)
- window->first_line = tmp->next_screen;
- if (tmp->prev_screen != NULL)
- tmp->prev_screen->next_screen = tmp->next_screen;
- if (tmp->next_screen != NULL)
- {
- tmp->next_screen->changed = TRUE;
- tmp->next_screen->scroll = UP;
- tmp->next_screen->prev_screen = tmp->prev_screen;
- }
- tmpline = tmp;
- clear_line(tmpline, 0, window->Num_cols);
- tmpline->number = -1;
- for (row = 0, tmp = window->first_line; tmp->next_screen != NULL; row++)
- tmp = tmp->next_screen;
- if (tmp != NULL)
- {
- tmp->next_screen = tmpline;
- tmp->next_screen->prev_screen = tmp;
- tmp->changed = TRUE;
- tmp = tmp->next_screen;
- }
- else
- tmp = tmpline;
- tmp->next_screen = NULL;
- }
- else
- {
- clear_line(window->first_line, 0, window->Num_cols);
- }
-}
-
-void
-wclrtobot(window) /* delete from current position to end of the window */
-WINDOW *window;
-{
- int row, column;
- struct _line *tmp;
-
- window->SCROLL_CLEAR |= CLEAR;
- column = window->LX;
- row = window->LY;
- for (row = 0, tmp = window->first_line; row < window->LY; row++)
- tmp = tmp->next_screen;
- clear_line(tmp, column, window->Num_cols);
- for (row = (window->LY + 1); row < window->Num_lines; row++)
- {
- tmp = tmp->next_screen;
- clear_line(tmp, 0, window->Num_cols);
- }
- wmove(window, row, column);
-}
-
-void
-wstandout(window) /* begin standout mode in window */
-WINDOW *window;
-{
- if (Numbers[sg__] < 1) /* if not magic cookie glitch */
- window->Attrib |= A_STANDOUT;
-}
-
-void
-wstandend(window) /* end standout mode in window */
-WINDOW *window;
-{
- window->Attrib &= ~A_STANDOUT;
-}
-
-void
-waddstr(window, string) /* write 'string' in window */
-WINDOW *window;
-char *string;
-{
- char *wstring;
-
- for (wstring = string; *wstring != (char) NULL; wstring++)
- waddch(window, *wstring);
-}
-
-void
-clearok(window, flag) /* erase screen and redraw at next refresh */
-WINDOW *window;
-int flag;
-{
- Repaint_screen = TRUE;
-}
-
-
-void
-echo() /* turn on echoing */
-{
- int value;
-
-#ifdef SYS5
- Terminal.c_lflag |= ECHO; /* enable echo */
- value = ioctl(0, TCSETA, &Terminal); /* set characteristics */
-#else
- Terminal.sg_flags |= ECHO; /* enable echo */
- value = ioctl(0, TIOCSETP, &Terminal); /* set characteristics */
-#endif
-}
-
-void
-noecho() /* turn off echoing */
-{
- int value;
-
-#ifdef SYS5
- Terminal.c_lflag &= ~ECHO; /* disable echo */
- value = ioctl(0, TCSETA, &Terminal); /* set characteristics */
-#else
- Terminal.sg_flags &= ~ECHO; /* disable echo */
- value = ioctl(0, TIOCSETP, &Terminal); /* set characteristics */
-#endif
-}
-
-void
-raw() /* set to read characters immediately */
-{
- int value;
-
-#ifdef SYS5
- Intr = Terminal.c_cc[VINTR]; /* get the interrupt character */
- Terminal.c_lflag &= ~ICANON; /* disable canonical operation */
- Terminal.c_lflag &= ~ISIG; /* disable signal checking */
-#ifdef FLUSHO
- Terminal.c_lflag &= ~FLUSHO;
-#endif
-#ifdef PENDIN
- Terminal.c_lflag &= ~PENDIN;
-#endif
-#ifdef IEXTEN
- Terminal.c_lflag &= ~IEXTEN;
-#endif
- Terminal.c_cc[VMIN] = 1; /* minimum of one character */
- Terminal.c_cc[VTIME] = 255; /* timeout value */
- Terminal.c_cc[VINTR] = 0; /* eliminate interrupt */
- value = ioctl(0, TCSETA, &Terminal); /* set characteristics */
-#else
- Terminal.sg_flags |= RAW; /* enable raw mode */
- value = ioctl(0, TIOCSETP, &Terminal); /* set characteristics */
-#endif
-}
-
-void
-noraw() /* set to normal character read mode */
-{
- int value;
-
-#ifdef SYS5
- Terminal.c_lflag |= ICANON; /* enable canonical operation */
- Terminal.c_lflag |= ISIG; /* enable signal checking */
- Terminal.c_cc[VEOF] = 4; /* EOF character = 4 */
- Terminal.c_cc[VEOL] = (char) NULL; /* EOL = 0 */
- Terminal.c_cc[VINTR] = Intr; /* reset interrupt char */
- value = ioctl(0, TCSETA, &Terminal); /* set characteristics */
-#else
- Terminal.sg_flags &= ~RAW; /* disable raw mode */
- value = ioctl(0, TIOCSETP, &Terminal); /* set characteristics */
-/* old_arg = fcntl(0, F_GETFL, 0);
- value = fcntl(0, F_SETFL, old_arg & ~FNDELAY);*/
-#endif
-}
-
-void
-nl()
-{
- int value;
-
-#ifdef SYS5
- Terminal.c_iflag |= ICRNL; /* enable carriage-return to line-feed mapping */
- value = ioctl(0, TCSETA, &Terminal); /* set characteristics */
-#endif
-}
-
-void
-nonl()
-{
- int value;
-
-#ifdef SYS5
- Terminal.c_iflag &= ~ICRNL; /* disable carriage-return to line-feed mapping */
- Terminal.c_iflag &= ~IGNCR; /* do not ignore carriage-return */
- value = ioctl(0, TCSETA, &Terminal); /* set characteristics */
-#endif
-}
-
-void
-saveterm()
-{
-}
-
-void
-fixterm()
-{
-}
-
-void
-resetterm()
-{
-}
-
-void
-nodelay(window, flag)
-WINDOW *window;
-int flag;
-{
-}
-
-void
-idlok(window, flag)
-WINDOW *window;
-int flag;
-{
-}
-
-void
-keypad(window, flag)
-WINDOW *window;
-int flag;
-{
- if (flag)
- String_Out(String_table[ks__], NULL, 0);
- else
- String_Out(String_table[ke__], NULL, 0);
-}
-
-void
-savetty() /* save current tty stats */
-{
- int value;
-
-#ifdef SYS5
- value = ioctl(0, TCGETA, &Saved_tty); /* set characteristics */
-#else
- value = ioctl(0, TIOCGETP, &Saved_tty); /* set characteristics */
-#endif
-}
-
-void
-resetty() /* restore previous tty stats */
-{
- int value;
-
-#ifdef SYS5
- value = ioctl(0, TCSETA, &Saved_tty); /* set characteristics */
-#else
- value = ioctl(0, TIOCSETP, &Saved_tty); /* set characteristics */
-#endif
-}
-
-void
-endwin() /* end windows */
-{
- keypad(stdscr, FALSE);
- initialized = FALSE;
- delwin(curscr);
- delwin(virtual_scr);
- delwin(stdscr);
-#ifndef SYS5
-{
- int old_arg, value;
-/* old_arg = fcntl(0, F_GETFL, 0);
- value = fcntl(0, F_SETFL, old_arg & ~FNDELAY);*/
-}
-#endif
-}
-
-void
-delwin(window) /* delete the window structure */
-WINDOW *window;
-{
- int i;
-
- for (i = 1; (i < window->Num_lines) && (window->first_line->next_screen != NULL); i++)
- {
- window->first_line = window->first_line->next_screen;
- free(window->first_line->prev_screen->row);
- free(window->first_line->prev_screen->attributes);
- free(window->first_line->prev_screen);
- }
- if (window == last_window_refreshed)
- last_window_refreshed = 0;
- if (window->first_line != NULL)
- {
- free(window->first_line->row);
- free(window->first_line->attributes);
- free(window->first_line);
- free(window);
- }
-}
-
-void
-wprintw(WINDOW *window, const char *format, ...)
-{
- va_list ap;
- int value;
- char *fpoint;
- char *wtemp;
-
- va_start(ap, format);
-
- fpoint = (char *) format;
- while (*fpoint != (char) NULL)
- {
- if (*fpoint == '%')
- {
- fpoint++;
- if (*fpoint == 'd')
- {
- value = va_arg(ap, int);
- iout(window, value);
- }
- else if (*fpoint == 'c')
- {
- value = va_arg(ap, int);
- waddch(window, value);
- }
- else if (*fpoint == 's')
- {
- wtemp = va_arg(ap, char *);
- waddstr(window, wtemp);
- }
- fpoint++;
- }
- else if (*fpoint == '\\')
- {
- fpoint++;
- if (*fpoint == 'n')
- waddch(window, '\n');
- else if ((*fpoint >= '0') && (*fpoint <= '9'))
- {
- value = 0;
- while ((*fpoint >= '0') && (*fpoint <= '9'))
- {
- value = (value * 8) + (*fpoint - '0');
- fpoint++;
- }
- waddch(window, value);
- }
- fpoint++;
- }
- else
- waddch(window, *fpoint++);
- }
- va_end(ap);
-}
-
-void
-iout(window, value) /* output characters */
-WINDOW *window;
-int value;
-{
- int i;
-
- if ((i = value / 10) != 0)
- iout(window, i);
- waddch(window, ((value % 10) + '0'));
-}
-
-int
-Comp_line(line1, line2) /* compare lines */
-struct _line *line1;
-struct _line *line2;
-{
- int count1, count2;
- int i;
- char *att1, *att2;
- char *c1, *c2;
-
- c1 = line1->row;
- c2 = line2->row;
- att1 = line1->attributes;
- att2 = line2->attributes;
- count2 = strlen(c1) + 1;
- count1 = strlen(c2) + 1;
- if (count1 > count2)
- {
- i = count2;
- count2 = count1;
- count1 = i;
- }
- if (count2 > (count1 + count1))
- return(2);
- i = 0;
- while ((c1[i] != (char) NULL) && (c2[i] != (char) NULL) && (c1[i] == c2[i]) && (att1[i] == att2[i]))
- i++;
- count1 = i + 1;
- if ((count1 == 1) && (count2 == 1))
- count1 = 0; /* both lines blank */
- else if (count2 == count1)
- count1 = -1; /* equal */
- else
- count1 = count2 / count1; /* lines unequal */
- return(count1);
-}
-
-struct _line *
-Insert_line(row, end_row, window) /* insert line into screen */
-int row;
-int end_row;
-WINDOW *window;
-{
- int i;
- struct _line *tmp;
- struct _line *tmp1;
-
- for (i = 0, tmp = curscr->first_line; i < window->SR; i++)
- tmp = tmp->next_screen;
- if ((end_row + window->SR) == 0)
- curscr->first_line = curscr->first_line->next_screen;
- top_of_win = tmp;
- /*
- | find bottom line to delete
- */
- for (i = 0, tmp = top_of_win; (tmp->next_screen != NULL) && (i < end_row); i++)
- tmp = tmp->next_screen;
- if (tmp->prev_screen != NULL)
- tmp->prev_screen->next_screen = tmp->next_screen;
- if (tmp->next_screen != NULL)
- tmp->next_screen->prev_screen = tmp->prev_screen;
- tmp1 = tmp;
- /*
- | clear deleted line
- */
- clear_line(tmp, 0, window->Num_cols);
- tmp1->number = -1;
- for (i = 0, tmp = curscr->first_line; (tmp->next_screen != NULL) && (i < window->SR); i++)
- tmp = tmp->next_screen;
- top_of_win = tmp;
- for (i = 0, tmp = top_of_win; i < row; i++)
- tmp = tmp->next_screen;
- if ((tmp->prev_screen != NULL) && (window->Num_lines > 0))
- tmp->prev_screen->next_screen = tmp1;
- tmp1->prev_screen = tmp->prev_screen;
- tmp->prev_screen = tmp1;
- tmp1->next_screen = tmp;
- if ((row + window->SR) == 0)
- curscr->first_line = tmp1;
- if (tmp1->next_screen != NULL)
- tmp1 = tmp1->next_screen;
-
- if ((!String_table[cs__]) && (end_row < window->Num_lines))
- {
- Position(window, (window->SR + end_row), 0);
- String_Out(String_table[dl__], NULL, 0);
- }
- Position(window, (window->SR + row), 0);
- if (String_table[al__] != NULL)
- String_Out(String_table[al__], NULL, 0);
- else
- String_Out(String_table[sr__], NULL, 0);
-
- for (i = 0, top_of_win = curscr->first_line; (top_of_win->next_screen != NULL) && (i < window->SR); i++)
- top_of_win = top_of_win->next_screen;
- return(tmp1);
-}
-
-
-struct _line *
-Delete_line(row, end_row, window) /* delete a line on screen */
-int row;
-int end_row;
-WINDOW *window;
-{
- int i;
- struct _line *tmp;
- struct _line *tmp1;
- struct _line *tmp2;
-
- i = 0;
- tmp = curscr->first_line;
- while (i < window->SR)
- {
- i++;
- tmp = tmp->next_screen;
- }
- /*
- | find line to delete
- */
- top_of_win = tmp;
- if ((row + window->SR) == 0)
- curscr->first_line = top_of_win->next_screen;
- for (i = 0, tmp = top_of_win; i < row; i++)
- tmp = tmp->next_screen;
- if (tmp->prev_screen != NULL)
- tmp->prev_screen->next_screen = tmp->next_screen;
- if (tmp->next_screen != NULL)
- tmp->next_screen->prev_screen = tmp->prev_screen;
- tmp2 = tmp->next_screen;
- tmp1 = tmp;
- /*
- | clear deleted line
- */
- clear_line(tmp1, 0, window->Num_cols);
- tmp1->number = -1;
- /*
- | find location to insert deleted line
- */
- for (i = 0, tmp = curscr->first_line; (tmp->next_screen != NULL) && (i < window->SR); i++)
- tmp = tmp->next_screen;
- top_of_win = tmp;
- for (i = 0, tmp = top_of_win; (i < end_row) && (tmp->next_screen != NULL); i++)
- tmp = tmp->next_screen;
- tmp1->next_screen = tmp;
- tmp1->prev_screen = tmp->prev_screen;
- if (tmp1->prev_screen != NULL)
- tmp1->prev_screen->next_screen = tmp1;
- tmp->prev_screen = tmp1;
-
- Position(window, (window->SR + row), 0);
- String_Out(String_table[dl__], NULL, 0);
- if ((!String_table[cs__]) && (end_row < window->Num_lines))
- {
- Position(window, (window->SR + end_row), 0);
- String_Out(String_table[al__], NULL, 0);
- }
- else if ((String_table[cs__] != NULL) && (String_table[dl__] == NULL))
- {
- Position(window, (window->SR + end_row), 0);
- putchar('\n');
- }
-
- if (row == (window->Num_lines-1))
- tmp2 = tmp1;
- if ((row + window->SR) == 0)
- curscr->first_line = top_of_win = tmp2;
- return(tmp2);
-}
-
-void
-CLEAR_TO_EOL(window, row, column)
-WINDOW *window;
-int row, column;
-{
- int x, y;
- struct _line *tmp1;
-
- for (y = 0, tmp1 = curscr->first_line; (y < (window->SR+row)) && (tmp1->next_screen != NULL); y++)
- tmp1 = tmp1->next_screen;
- for (x = column; x<window->Num_cols; x++)
- {
- tmp1->row[x] = ' ';
- tmp1->attributes[x] = (char) NULL;
- }
- tmp1->row[column] = (char) NULL;
- tmp1->last_char = column;
- if (column < COLS)
- {
- if (STAND)
- {
- STAND = FALSE;
- Position(window, row, column);
- attribute_off();
- }
- if (String_table[ce__] != NULL)
- String_Out(String_table[ce__], NULL, 0);
- else
- {
- for (x = column; x < window->Num_cols; x++)
- putchar(' ');
- Curr_x = x;
- }
- }
-}
-
-int
-check_delete(window, line, offset, pointer_new, pointer_old)
-WINDOW *window;
-int line, offset;
-struct _line *pointer_new, *pointer_old;
-{
- int end_old;
- int end_new;
- int k;
- int changed;
- char *old_lin;
- char *new_lin;
- char *old_att;
- char *new_att;
-
- changed = FALSE;
- new_lin = pointer_new->row;
- new_att = pointer_new->attributes;
- old_lin = pointer_old->row;
- old_att = pointer_old->attributes;
- end_old = end_new = offset;
- while (((new_lin[end_new] != old_lin[end_old]) || (new_att[end_new] != old_att[end_old])) && (old_lin[end_old] != (char) NULL) && (new_lin[end_old] != (char) NULL))
- end_old++;
- if (old_lin[end_old] != (char) NULL)
- {
- k = 0;
- while ((old_lin[end_old+k] == new_lin[end_new+k]) && (new_att[end_new+k] == old_att[end_old+k]) && (new_lin[end_new+k] != (char) NULL) && (old_lin[end_old+k] != (char) NULL) && (k < 10))
- k++;
- if ((k > 8) || ((new_lin[end_new+k] == (char) NULL) && (k != 0)))
- {
- if (new_lin[end_new+k] == (char) NULL)
- {
- Position(window, line, (end_new+k));
- CLEAR_TO_EOL(window, line, (end_new+k));
- }
- Position(window, line, offset);
- for (k = offset; k < end_old; k++)
- Char_del(old_lin, old_att, offset, window->Num_cols);
- while ((old_lin[offset] != (char) NULL) && (offset < COLS))
- offset++;
- pointer_old->last_char = offset;
- changed = TRUE;
- }
- }
- return(changed);
-}
-
-/*
- | Check if characters were inserted in the middle of a line, and if
- | so, insert them.
- */
-
-int
-check_insert(window, line, offset, pointer_new, pointer_old)
-WINDOW *window;
-int line, offset;
-struct _line *pointer_new, *pointer_old;
-{
- int changed;
- int end_old, end_new;
- int k;
- int same = FALSE;
- int old_off;
- int insert;
- char *old_lin;
- char *new_lin;
- char *old_att;
- char *new_att;
-
- changed = FALSE;
- new_lin = pointer_new->row;
- new_att = pointer_new->attributes;
- old_lin = pointer_old->row;
- old_att = pointer_old->attributes;
- end_old = end_new = offset;
- while (((new_lin[end_new] != old_lin[end_old]) || (new_att[end_new] != old_att[end_old])) && (new_lin[end_new] != (char) NULL) && (old_lin[end_new] != (char) NULL))
- end_new++;
- if (new_lin[end_new] != (char) NULL)
- {
- k = 0;
- while ((old_lin[end_old+k] == new_lin[end_new+k]) && (old_att[end_old+k] == new_att[end_new+k]) && (new_lin[end_new+k] != (char) NULL) && (old_lin[end_old+k] != (char) NULL) && (k < 10))
- k++;
- /*
- | check for commonality between rest of lines (are the old
- | and new lines the same, except for a chunk in the middle?)
- | if the rest of the lines are common, do not insert text
- */
- old_off = end_new;
- while ((old_lin[old_off] != (char) NULL) && (new_lin[old_off] != (char) NULL) && (old_lin[old_off] == new_lin[old_off]) && (old_att[old_off] == new_att[old_off]))
- old_off++;
- if ((old_lin[old_off] == new_lin[old_off]) && (old_att[old_off] == new_att[old_off]))
- same = TRUE;
- if ((!same) && ((k > 8) || ((new_lin[end_new+k] == (char) NULL) && (k != 0))))
- {
- Position(window, line, offset);
- insert = FALSE;
- if (String_table[ic__] == NULL)
- {
- String_Out(String_table[im__], NULL, 0);
- insert = TRUE;
- }
- for (k = offset; k < end_new; k++)
- {
- if (!insert)
- String_Out(String_table[ic__], NULL, 0);
- Char_ins(old_lin, old_att, new_lin[k], new_att[k], k, window->Num_cols);
- }
- if (insert)
- String_Out(String_table[ei__], NULL, 0);
- while ((old_lin[offset] != (char) NULL) && (offset < COLS))
- offset++;
- pointer_old->last_char = offset;
- changed = TRUE;
- }
- }
- return(changed);
-}
-
-void
-doupdate()
-{
- WINDOW *window;
- int similar;
- int diff;
- int begin_old, begin_new;
- int end_old, end_new;
- int count1, j;
- int from_top, tmp_ft, offset;
- int changed;
- int first_time;
- int first_same;
- int last_same;
- int list[10];
-
- struct _line *curr;
- struct _line *virt;
- struct _line *old;
-
- struct _line *new;
-
- char *cur_lin;
- char *vrt_lin;
- char *cur_att;
- char *vrt_att;
- char *att1, *att2;
- char *c1, *c2;
-
- char NC_chinese = FALSE; /* flag to indicate handling Chinese */
-
- window = virtual_scr;
-
- if ((nc_attributes & A_NC_BIG5) != 0)
- NC_chinese = TRUE;
-
- if (Repaint_screen)
- {
- if (String_table[cl__])
- String_Out(String_table[cl__], NULL, 0);
- else
- {
- from_top = 0;
- while (from_top < LINES)
- {
- Position(curscr, from_top, 0);
- if (String_table[ce__] != NULL)
- String_Out(String_table[ce__], NULL, 0);
- else
- {
- for (j = 0; j < window->Num_cols; j++)
- putchar(' ');
- }
- from_top++;
- }
- }
- for (from_top = 0, curr = curscr->first_line; from_top < curscr->Num_lines; from_top++, curr = curr->next_screen)
- {
- Position(curscr, from_top, 0);
- for (j = 0; (curr->row[j] != (char) NULL) && (j < curscr->Num_cols); j++)
- {
- Char_out(curr->row[j], curr->attributes[j], curr->row, curr->attributes, j);
- }
- if (STAND)
- {
- STAND = FALSE;
- Position(curscr, from_top, j);
- attribute_off();
- }
- }
- Repaint_screen = FALSE;
- }
-
- similar = 0;
- diff = FALSE;
- top_of_win = curscr->first_line;
-
- for (from_top = 0, curr = top_of_win, virt = window->first_line;
- from_top < window->Num_lines; from_top++)
- {
- virtual_lines[from_top] = TRUE;
- if ((similar = Comp_line(curr, virt)) > 0)
- {
- virtual_lines[from_top] = FALSE;
- diff = TRUE;
- }
- curr = curr->next_screen;
- virt = virt->next_screen;
- }
-
- from_top = 0;
- virt = window->first_line;
- curr = top_of_win;
- similar = 0;
- /*
- | if the window has lines that are different, check for scrolling
- */
- if (diff)
- {
- last_same = -1;
- changed = FALSE;
- for (first_same = window->Num_lines;
- (first_same > from_top) && (virtual_lines[first_same - 1]);
- first_same--)
- ;
- count1 = first_same - 1;
- for (last_same = 0;
- (last_same < window->Num_lines) && (virtual_lines[last_same]== FALSE);
- last_same++)
- ;
- while ((from_top < first_same) && nc_scrolling_ability)
- /* check entire lines for diffs */
- {
-
-
- if (from_top >= last_same)
- {
- for (last_same = from_top;
- (last_same < window->Num_lines) &&
- (virtual_lines[last_same] == FALSE);
- last_same++)
- ;
- }
- if (!virtual_lines[from_top])
- {
- diff = TRUE;
- /*
- | check for lines deleted (scroll up)
- */
- for (tmp_ft = from_top+1, old = curr->next_screen;
- ((window->scroll_up) && (diff) &&
- (tmp_ft < last_same) &&
- (!virtual_lines[tmp_ft]));
- tmp_ft++)
- {
- if ((Comp_line(old, virt) == -1) && (!virtual_lines[from_top]))
- {
- if (String_table[cs__]) /* scrolling region */
- {
- list[1] = from_top;
- list[0] = min((last_same - 1), (window->Num_lines - 1));
- String_Out(String_table[cs__], list, 2);
- Curr_y = Curr_x = -1;
- }
-
- for (offset = (tmp_ft - from_top); (offset > 0); offset--)
- {
- old = Delete_line(from_top, min((last_same - 1), (window->Num_lines - 1)), window);
- diff = FALSE;
- }
-
- if (String_table[cs__]) /* scrolling region */
- {
- list[1] = 0;
- list[0] = LINES - 1;
- String_Out(String_table[cs__], list, 2);
- Curr_y = Curr_x = -1;
- }
-
- top_of_win = curscr->first_line;
- curr = top_of_win;
- for (offset = 0; offset < from_top; offset++)
- curr = curr->next_screen;
- for (offset = from_top, old=curr, new=virt;
- offset < window->Num_lines;
- old=old->next_screen, new=new->next_screen,
- offset++)
- {
- similar = Comp_line(old, new);
- virtual_lines[offset] = (similar > 0 ? FALSE : TRUE);
- }
- }
- else
- old = old->next_screen;
- }
- /*
- | check for lines inserted (scroll down)
- */
- for (tmp_ft = from_top-1, old = curr->prev_screen;
- ((window->scroll_down) && (tmp_ft >= 0) &&
- (diff) &&
- (!virtual_lines[tmp_ft]));
- tmp_ft--)
- {
- if (Comp_line(old, virt) == -1)
- {
- if (String_table[cs__]) /* scrolling region */
- {
- list[1] = tmp_ft;
- list[0] = min((last_same - 1), (window->Num_lines - 1));
- String_Out(String_table[cs__], list, 2);
- Curr_y = Curr_x = -1;
- }
-
- for (offset = (from_top - tmp_ft); (offset > 0); offset--)
- {
- old = Insert_line(tmp_ft, min((last_same - 1), (window->Num_lines -1)), window);
- diff = FALSE;
- }
-
- if (String_table[cs__]) /* scrolling region */
- {
- list[1] = 0;
- list[0] = LINES - 1;
- String_Out(String_table[cs__], list, 2);
- Curr_y = Curr_x = -1;
- }
-
- top_of_win = curscr->first_line;
- curr = top_of_win;
- for (offset = 0; offset < from_top; offset++)
- curr = curr->next_screen;
- for (offset = from_top, old=curr, new=virt;
- offset < window->Num_lines;
- old=old->next_screen, new=new->next_screen,
- offset++)
- {
- similar = Comp_line(old, new);
- virtual_lines[offset] = (similar > 0 ? FALSE : TRUE);
- }
- }
- else
- old = old->prev_screen;
- }
- }
- from_top++;
- curr = curr->next_screen;
- virt = virt->next_screen;
- }
- }
-
-
- /*
- | Scrolling done, now need to insert, delete, or modify text
- | within lines.
- */
-
- for (from_top = 0, curr = curscr->first_line; from_top < window->SR; from_top++)
- curr = curr->next_screen;
- top_of_win = curr;
- for (from_top = 0, curr = top_of_win, virt = window->first_line; from_top < window->Num_lines; from_top++, curr = curr->next_screen, virt = virt->next_screen)
- {
-
- /*
- | If either 'insert mode' or 'insert char' are
- | available, enter the following 'if' statement,
- | else, need to simply rewrite the contents of the line
- | at the point where the contents of the line change.
- */
-
- if (((String_table[ic__]) || (String_table[im__])) &&
- (String_table[dc__]) && (curr->row[0] != (char) NULL) &&
- (!NC_chinese))
- {
- j = 0;
- first_time = TRUE;
- vrt_lin = virt->row;
- vrt_att = virt->attributes;
- cur_lin = curr->row;
- cur_att = curr->attributes;
- while ((vrt_lin[j] != (char) NULL) && (j < window->Num_cols))
- {
- if ((STAND) && (Booleans[xs__]))
- {
- while ((vrt_lin[j] == cur_lin[j]) && (vrt_att[j] == cur_att[j]) && (vrt_lin[j] != (char) NULL) && (vrt_att[j]))
- j++;
- if ((STAND) && (!vrt_att[j]))
- {
- STAND = FALSE;
- Position(window, from_top, j);
- attribute_off();
- attribute_off();
- }
- }
- else
- {
- while ((vrt_lin[j] == cur_lin[j]) && (vrt_att[j] == cur_att[j]) && (vrt_lin[j] != (char) NULL))
- j++;
- }
- if ((vrt_att[j] != cur_att[j]) && (cur_att[j]) && (Booleans[xs__]))
- {
- Position(window, from_top, j);
-/* CLEAR_TO_EOL(window, from_top, j);*/
- attribute_off();
- attribute_off();
- }
- if (vrt_lin[j] != (char) NULL)
- {
- begin_new = j;
- begin_old = j;
- end_old = j;
- end_new = j;
- if ((first_time) && (virt->changed))
- {
- if (curr->last_char <= virt->last_char)
- changed = check_insert(window, from_top, j, virt, curr);
- }
- changed = check_delete(window, from_top, j, virt, curr);
- first_time = FALSE;
- virt->changed = FALSE;
- if (!changed)
- changed = check_insert(window, from_top, j, virt, curr);
- if (((!changed) || (cur_lin[j] != vrt_lin[j]) || (cur_att[j] != vrt_att[j])) && (j < window->Num_cols))
- {
- if ((vrt_lin[j] == ' ') && (cur_lin[j] == (char) NULL) && (vrt_att[j] == cur_att[j]))
- cur_lin[j] = ' ';
- else
- {
- Position(window, from_top, j);
- Char_out(vrt_lin[j], vrt_att[j], cur_lin, cur_att, j);
- }
- }
- if ((vrt_lin[j] != (char) NULL))
- j++;
- }
- if ((STAND) && (!vrt_att[j]))
- {
- STAND = FALSE;
- Position(window, from_top, j);
- attribute_off();
- }
- }
- if ((vrt_lin[j] == (char) NULL) && (cur_lin[j] != (char) NULL))
- {
- Position(window, from_top, j);
- CLEAR_TO_EOL(window, from_top, j);
- }
- }
- else /*if ((similar != -1) && (similar != 0))*/
- {
- j = 0;
- c1 = curr->row;
- att1 = curr->attributes;
- c2 = virt->row;
- att2 = virt->attributes;
- while ((j < window->Num_cols) && (c2[j] != (char) NULL))
- {
- while ((c1[j] == c2[j]) && (att1[j] == att2[j]) && (j < window->Num_cols) && (c2[j] != (char) NULL))
- j++;
-
- /*
- | if previous character is an eight bit
- | char, start redraw from that character
- */
-
- if ((NC_chinese) && (highbitset(c1[j - 1])))
- j--;
- begin_old = j;
- begin_new = j;
- if ((j < window->Num_cols) && (c2[j] != (char) NULL))
- {
- Position(window, from_top, begin_old);
- CLEAR_TO_EOL(window, from_top, j);
- Position(window, from_top, begin_old);
- for (j = begin_old; (c2[j] != (char) NULL) && (j < window->Num_cols); j++)
- Char_out(c2[j], att2[j], c1, att1, j);
- }
- }
- if ((c2[j] == (char) NULL) && (c1[j] != (char) NULL))
- {
- Position(window, from_top, j);
- CLEAR_TO_EOL(window, from_top, j);
- }
- }
- if (STAND)
- {
- STAND = FALSE;
- Position(window, from_top, j);
- attribute_off();
- }
- virt->number = from_top;
- }
- Position(window, window->LY, window->LX);
-}
-
-void
-Position(window, row, col) /* position the cursor for output on the screen */
-WINDOW *window;
-int row;
-int col;
-{
- int list[10];
- int place;
-
- int pos_row;
- int pos_column;
-
- pos_row = row + window->SR;
- pos_column = col + window->SC;
- if ((pos_row != Curr_y) || (pos_column != Curr_x))
- {
- if (String_table[cm__] != NULL) /* && (row < window->Num_lines) && (column < window->Num_cols))*/
- {
- place = 0;
- list[place++] = pos_column;
- list[place++] = pos_row;
- String_Out(String_table[cm__], list, place);
- if ((STAND) && (!Booleans[ms__]))
- attribute_on();
- }
- Curr_x = pos_column;
- Curr_y = pos_row;
- }
-}
-
-void
-Char_del(line, attrib, offset, maxlen) /* delete chars from line */
-char *line;
-char *attrib;
-int offset;
-int maxlen;
-{
- int one, two;
-
- for (one = offset, two = offset+1; (line[one] != (char) NULL) && (one < maxlen); one++, two++)
- {
- line[one] = line[two];
- attrib[one] = attrib[two];
- }
- String_Out(String_table[dc__], NULL, 0);
-}
-
-void
-Char_ins(line, attrib, newc, newatt, offset, maxlen) /* insert chars in line */
-char *line;
-char *attrib;
-char newc;
-char newatt;
-int offset;
-int maxlen;
-{
- int one, two;
-
- one = 0;
- while ((line[one] != (char) NULL) && (one < (maxlen - 2)))
- one++;
- for (two = one + 1; (two > offset); one--, two--)
- {
- line[two] = line[one];
- attrib[two] = attrib[one];
- }
- line[offset] = newc;
- attrib[offset] = newatt;
- Char_out(newc, newatt, line, attrib, offset);
-}
-
-void
-attribute_on()
-{
- if (String_table[sa__])
- {
- attributes_set[0] = 1;
- String_Out(String_table[sa__], attributes_set, 1);
- }
- else if (String_table[so__])
- String_Out(String_table[so__], NULL, 0);
-}
-
-void
-attribute_off()
-{
- if (String_table[me__])
- String_Out(String_table[me__], NULL, 0);
- else if (String_table[sa__])
- {
- attributes_set[0] = 0;
- String_Out(String_table[sa__], attributes_set, 1);
- }
- else if (String_table[se__])
- String_Out(String_table[se__], NULL, 0);
-}
-
-void
-Char_out(newc, newatt, line, attrib, offset) /* output character with proper attribute */
-char newc;
-char newatt;
-char *line;
-char *attrib;
-int offset;
-{
-
-
- if ((newatt) && (!STAND))
- {
- STAND = TRUE;
- attribute_on();
- }
- else if ((STAND) && (!newatt))
- {
- STAND = FALSE;
- attribute_off();
- }
-
- if ((newatt) && (STAND) && (Booleans[xs__]))
- {
- attribute_on();
- }
-
- if (!((Curr_y >= (LINES - 1)) && (Curr_x >= (COLS - 1))))
- {
- putchar(newc);
- line[offset] = newc;
- attrib[offset] = newatt;
- }
- Curr_x++;
-}
-
-/*
- |
- | The two routines that follow, nc_setattrib(), nc_clearattrib(), are
- | hacks that notify new_curse to handle characters that have the high
- | bit set as the first of two bytes of a multi-byte string.
- |
- */
-
-void
-nc_setattrib(flag)
-int flag;
-{
- nc_attributes |= flag;
-}
-
-void
-nc_clearattrib(flag)
-int flag;
-{
- nc_attributes &= ~flag;
-}
-
diff --git a/usr.bin/ee/new_curse.h b/usr.bin/ee/new_curse.h
deleted file mode 100644
index bbef585..0000000
--- a/usr.bin/ee/new_curse.h
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- | new_curse.h
- |
- | A subset of curses developed for use with ae.
- |
- | written by Hugh Mahon
- |
- | THIS MATERIAL IS PROVIDED "AS IS". THERE ARE
- | NO WARRANTIES OF ANY KIND WITH REGARD TO THIS
- | MATERIAL, INCLUDING, BUT NOT LIMITED TO, THE
- | IMPLIED WARRANTIES OF MERCHANTABILITY AND
- | FITNESS FOR A PARTICULAR PURPOSE. Neither
- | Hewlett-Packard nor Hugh Mahon shall be liable
- | for errors contained herein, nor for
- | incidental or consequential damages in
- | connection with the furnishing, performance or
- | use of this material. Neither Hewlett-Packard
- | nor Hugh Mahon assumes any responsibility for
- | the use or reliability of this software or
- | documentation. This software and
- | documentation is totally UNSUPPORTED. There
- | is no support contract available. Hewlett-
- | Packard has done NO Quality Assurance on ANY
- | of the program or documentation. You may find
- | the quality of the materials inferior to
- | supported materials.
- |
- | This software is not a product of Hewlett-Packard, Co., or any
- | other company. No support is implied or offered with this software.
- | You've got the source, and you're on your own.
- |
- | This software may be distributed under the terms of Larry Wall's
- | Artistic license, a copy of which is included in this distribution.
- |
- | This notice must be included with this software and any derivatives.
- |
- | Copyright (c) 1986, 1987, 1988, 1991, 1995 Hugh Mahon
- | All are rights reserved.
- |
- | $FreeBSD$
- |
- */
-
-#include <stdio.h>
-
-#ifdef SYS5
-#include <termio.h>
-#else
-#include <sgtty.h>
-#include <fcntl.h>
-#endif
-
-#define KEY_BREAK 0401
-#define KEY_DOWN 0402
-#define KEY_UP 0403
-#define KEY_LEFT 0404
-#define KEY_RIGHT 0405
-#define KEY_HOME 0406
-#define KEY_BACKSPACE 0407
-#define KEY_F0 0410
-#define KEY_F(n) (KEY_F0+(n))
-#define KEY_DL 0510
-#define KEY_IL 0511
-#define KEY_DC 0512
-#define KEY_IC 0513
-#define KEY_EIC 0514
-#define KEY_CLEAR 0515
-#define KEY_EOS 0516
-#define KEY_EOL 0517
-#define KEY_SF 0520
-#define KEY_SR 0521
-#define KEY_NPAGE 0522
-#define KEY_PPAGE 0523
-#define KEY_STAB 0524
-#define KEY_CTAB 0525
-#define KEY_CATAB 0526
-#define KEY_ENTER 0527
-#define KEY_SRESET 0530
-#define KEY_RESET 0531
-#define KEY_PRINT 0532
-#define KEY_LL 0533
-#define KEY_A1 0534
-#define KEY_A3 0535
-#define KEY_B2 0536
-#define KEY_C1 0537
-#define KEY_C3 0540
-#define KEY_BTAB 0541
-#define KEY_BEG 0542
-#define KEY_CANCEL 0543
-#define KEY_CLOSE 0544
-#define KEY_COMMAND 0545
-#define KEY_COPY 0546
-#define KEY_CREATE 0547
-#define KEY_END 0550
-#define KEY_EXIT 0551
-#define KEY_FIND 0552
-#define KEY_HELP 0553
-#define KEY_MARK 0554
-#define KEY_MESSAGE 0555
-#define KEY_MOVE 0556
-#define KEY_NEXT 0557
-#define KEY_OPEN 0560
-#define KEY_OPTIONS 0561
-#define KEY_PREVIOUS 0562
-#define KEY_REDO 0563
-#define KEY_REFERENCE 0564
-#define KEY_REFRESH 0565
-#define KEY_REPLACE 0566
-#define KEY_RESTART 0567
-#define KEY_RESUME 0570
-#define KEY_SAVE 0571
-#define KEY_SBEG 0572
-#define KEY_SCANCEL 0573
-#define KEY_SCOMMAND 0574
-#define KEY_SCOPY 0575
-#define KEY_SCREATE 0576
-#define KEY_SDC 0577
-#define KEY_SDL 0600
-#define KEY_SELECT 0601
-#define KEY_SEND 0602
-#define KEY_SEOL 0603
-#define KEY_SEXIT 0604
-#define KEY_SFIND 0605
-#define KEY_SHELP 0606
-#define KEY_SHOME 0607
-#define KEY_SIC 0610
-#define KEY_SLEFT 0611
-#define KEY_SMESSAGE 0612
-#define KEY_SMOVE 0613
-#define KEY_SNEXT 0614
-#define KEY_SOPTIONS 0615
-#define KEY_SPREVIOUS 0616
-#define KEY_SPRINT 0617
-#define KEY_SREDO 0620
-#define KEY_SREPLACE 0621
-#define KEY_SRIGHT 0622
-#define KEY_SRSUME 0623
-#define KEY_SSAVE 0624
-#define KEY_SSUSPEND 0625
-#define KEY_SUNDO 0626
-#define KEY_SUSPEND 0627
-#define KEY_UNDO 0630
-
-#define TRUE 1
-#define FALSE 0
-
-#define A_STANDOUT 0001 /* standout mode */
-#define A_NC_BIG5 0x0100 /* Handle Chinese Big5 characters */
-#define SCROLL 1 /* text has been scrolled */
-#define CLEAR 2 /* window has been cleared */
-#define CHANGE 3 /* window has been changed */
-#define UP 1 /* direction of scroll */
-#define DOWN 2
-
-struct _line {
- struct _line *next_screen;
- struct _line *prev_screen;
- char *row;
- char *attributes;
- int last_char;
- int changed;
- int scroll;
- int number;
- };
-
-struct _line *top_of_win;
-
-typedef struct WIND {
- int SR; /* starting row */
- int SC; /* starting column */
- int LC; /* last column */
- int LX; /* last cursor column position */
- int LY; /* last cursor row position */
- int Attrib; /* attributes active in window */
- int Num_lines; /* number of lines */
- int Num_cols; /* number of columns */
- int scroll_up; /* number of lines moved */
- int scroll_down;
- int SCROLL_CLEAR; /* indicates that window has been scrolled or cleared */
- struct _line *first_line;
- } WINDOW;
-
-extern WINDOW *curscr;
-extern WINDOW *stdscr;
-
-extern int LINES, COLS;
-
-#if __STDC__ || defined(__cplusplus)
-#define P_(s) s
-#else
-#define P_(s) ()
-#endif
-
-extern void copy_window P_((WINDOW *origin, WINDOW *destination));
-extern void reinitscr P_((int));
-extern void initscr P_((void));
-extern int Get_int P_((void));
-extern int INFO_PARSE P_((void));
-extern int AtoI P_((void));
-extern void Key_Get P_((void));
-extern void keys_vt100 P_((void));
-extern struct _line *Screenalloc P_((int columns));
-extern WINDOW *newwin P_((int lines, int cols, int start_l, int start_c));
-extern int Operation P_((int Temp_Stack[], int place));
-extern void Info_Out P_((char *string, int p_list[], int place));
-extern void wmove P_((WINDOW *window, int row, int column));
-extern void clear_line P_((struct _line *line, int column, int cols));
-extern void werase P_((WINDOW *window));
-extern void wclrtoeol P_((WINDOW *window));
-extern void wrefresh P_((WINDOW *window));
-extern void touchwin P_((WINDOW *window));
-extern void wnoutrefresh P_((WINDOW *window));
-extern void flushinp P_((void));
-extern void ungetch P_((int c));
-extern int wgetch P_((WINDOW *window));
-extern void Clear P_((int));
-extern int Get_key P_((int first_char));
-extern void waddch P_((WINDOW *window, int c));
-extern void winsertln P_((WINDOW *window));
-extern void wdeleteln P_((WINDOW *window));
-extern void wclrtobot P_((WINDOW *window));
-extern void wstandout P_((WINDOW *window));
-extern void wstandend P_((WINDOW *window));
-extern void waddstr P_((WINDOW *window, char *string));
-extern void clearok P_((WINDOW *window, int flag));
-extern void echo P_((void));
-extern void noecho P_((void));
-extern void raw P_((void));
-extern void noraw P_((void));
-extern void nl P_((void));
-extern void nonl P_((void));
-extern void saveterm P_((void));
-extern void fixterm P_((void));
-extern void resetterm P_((void));
-extern void nodelay P_((WINDOW *window, int flag));
-extern void idlok P_((WINDOW *window, int flag));
-extern void keypad P_((WINDOW *window, int flag));
-extern void savetty P_((void));
-extern void resetty P_((void));
-extern void endwin P_((void));
-extern void delwin P_((WINDOW *window));
-extern void wprintw P_((WINDOW *window, const char* format, ...));
-extern void iout P_((WINDOW *window, int value));
-extern int Comp_line P_((struct _line *line1, struct _line *line2));
-extern struct _line *Insert_line P_((int row, int end_row, WINDOW *window));
-extern struct _line *Delete_line P_((int row, int end_row, WINDOW *window));
-extern void CLEAR_TO_EOL P_((WINDOW *window, int row, int column));
-extern int check_delete P_((WINDOW *window, int line, int offset, struct _line *pointer_new, struct _line *pointer_old));
-extern int check_insert P_((WINDOW *window, int line, int offset, struct _line *pointer_new, struct _line *pointer_old));
-extern void doupdate P_((void));
-extern void Position P_((WINDOW *window, int row, int col));
-extern void Char_del P_((char *line, char *attrib, int offset, int maxlen));
-extern void Char_ins P_((char *line, char *attrib, int newc, int newatt, int offset, int maxlen));
-extern void attribute_on P_((void));
-extern void attribute_off P_((void));
-extern void Char_out P_((int newc, int newatt, char *line, char *attrib, int offset));
-
-extern void nc_setattrib P_((int));
-extern void nc_clearattrib P_((int));
-#undef P_
-
diff --git a/usr.bin/ee/nls/de_DE.ISO8859-1/ee.msg b/usr.bin/ee/nls/de_DE.ISO8859-1/ee.msg
deleted file mode 100644
index 80a9961..0000000
--- a/usr.bin/ee/nls/de_DE.ISO8859-1/ee.msg
+++ /dev/null
@@ -1,185 +0,0 @@
-$ This file contains the messages for ee ("easy editor"). See the file
-$ ee.i18n.guide for more information
-$
-$ For ee patchlevel 3
-$
-$ $FreeBSD$
-$
-$
-$set 1
-$quote "
-1 "Modus-Menü"
-2 "Tab -> Leerzeichen "
-3 "Suche ohne Groß/Klein"
-4 "Ränder beachten "
-5 "Automatische Absätze "
-6 "8-Bit Zeichen (Uml.) "
-7 "Hilfefenster "
-8 "rechter Rand "
-9 "Ende-Menü"
-10 "Speichern"
-11 "Verwerfen"
-12 "Dateimenü"
-13 "Öffnen"
-14 "Schreiben in Datei"
-15 "Speichern"
-16 "Aktuellen Inhalt drucken"
-17 "Textsuche"
-18 "Suche nach ..."
-19 "Suchen"
-20 "Rechtschreibung"
-21 "'spell' benutzen"
-22 "'ispell' benutzen"
-23 "Verschiedenes"
-24 "Absatz formatieren"
-25 "Unix-Kommando"
-26 "Rechtschreibung prüfen"
-27 "Hauptmenü"
-28 "Editor beenden"
-29 "Hilfe"
-30 "Dateioperationen"
-31 "Bildschirm regenerieren"
-32 "Einstellungen"
-33 "Suche"
-34 "Verschiedenes"
-35 "Steuertasten: "
-36 "^a ASCII-Code direkt ^i Tabulator ^r nach rechts "
-37 "^b Ende des Textes ^j neue Zeile ^t Anfang des Textes "
-38 "^c Befehl ^k Zeichen löschen ^u hoch "
-39 "^d runter ^l nach links ^v Wort zurückholen "
-40 "^e Textsuche (Menü) ^m neue Zeile ^w Wort löschen "
-41 "^f Zeichen zurückholen ^n nächste Seite ^x Weitersuchen "
-42 "^g zum Zeilenanfang ^o zum Zeilenende ^y Zeile löschen "
-43 "^h Rückschritt ^p vorige Seite ^z Zeile zurückholen "
-44 "^[ (Escape) Menü ESC-Enter: ee beenden "
-45 " "
-46 "Befehle: "
-47 "hilfe : diese Hilfe anzeigen datei : Dateinamen anzeigen "
-48 "lesen : Datei öffnen zeichen : ASCII-Code anzeigen "
-49 "schreiben:Datei schreiben grosskl : Suche mit Groß/Kleinschr."
-50 "ende : Sichern und Beenden klein : Suche ohne Groß/Klein. "
-51 "abbruch : Abbruch ohne Sichern !bef : Unix-Befehl \"bef\" ausf. "
-52 "zeile : Zeilennummer anzeigen 0-9 : Zur angegebenen Zeile "
-53 "leer : Tabulat. in Leerz. wandeln tabs : Tabulatoren belassen "
-54 " "
-55 " ee [+#] [-i] [-e] [-h] [datei(en)] "
-56 "+#: zu Zeile # -i: k. Hilfefenster -e: Tabulatoren lassen -h: k. Hervorheb."
-57 "^[ (Escape) Menü ^e Textsuche ^y Zeile löschen ^u hoch ^p Seite zur. "
-58 "^a ASCII-Code ^x Weitersuchen ^z Zeile rückhl. ^d runter ^n Seite vor "
-59 "^b Textende ^g Zeilenanfang ^w Wort löschen ^l links "
-60 "^t Textanfang ^o Zeilenende ^v Wort rückhol. ^r rechts "
-61 "^c Befehl ^k Zeichen lösch. ^f Zeichen rückholen ESC-Enter: Ende ee "
-62 "hilfe: Hilfe |datei : Dateiname anzeigen |zeile: Zeilennumer "
-63 "lesen: Datei lesen |zeichen:ASCII-Code des Zeichens |0-9 : zur Zeile "
-64 "schre: Datei schreib. |grosskl:Suche mit Groß/Klein |ende : Speichern,Ende "
-65 "!bef : Unix-\"bef\" |klein: Suche ohne Groß/Klein |abbr : Abbruch "
-66 "leer : Tab -> Leerz. |tabs : Tabulatoren belassen "
-67 " Escape (^[) drücken für Menü"
-68 "Keine Datei"
-69 "ASCII-Code: "
-70 "Pufferinhalt nach \"%s\" schreiben "
-71 "Befehl: "
-72 "Dateiname zum Schreiben: "
-73 "Dateiname zum Lesen: "
-74 "Zeichen = %d"
-75 "Unbekannter Befehl \"%s\""
-76 "Angegebener Befehl ist nicht eindeutig"
-77 "Zeile %d "
-78 "Länge = %d"
-79 "Aktuelle Datei ist \"%s\" "
-80 "Benutzung: %s [-i] [-e] [-h] [+zeilennummer] [dateien]\n"
-81 " -i Hilfefenster ausschalten\n"
-82 " -e Tabulatoren nicht in Leerzeichen wandeln\n"
-83 " -h keine Hervorhebungen\n"
-84 "Datei \"%s\" ist ein Verzeichnis"
-85 "Neue Datei \"%s\""
-86 "Datei \"%s\" kann nicht geöffnet werden"
-87 "Datei \"%s\", %d Zeilen"
-88 "Lesen der Datei \"%s\" beendet"
-89 "Lese die Datei \"%s\""
-90 ", schreibgeschützt"
-91 "Datei \"%s\", %d Zeilen"
-92 "Dateinamen eingeben: "
-93 "Kein Name angegeben; Datei nicht gespeichert"
-94 "Pufferinhalt geändert, wirklich verlassen? (j/n [n]) "
-95 "j"
-96 "Datei existiert bereits, überschreiben? (j/n) [n] "
-97 "Datei \"%s\" kann nicht erzeugt werden"
-98 "Schreibe Datei \"%s\""
-99 "\"%s\" %d Zeilen, %d Zeichen"
-100 " ...Suche läuft"
-101 "Zeichenfolge \"%s\" nicht gefunden"
-102 "Suchen nach: "
-103 "Kann %s nicht ausführen"
-104 "Bitte die Eingabetaste drücken "
-105 "Escape zum Beenden"
-106 "Menü ist zu groß für das Fenster"
-107 "eine beliebige Taste drücken "
-108 "Unix-Befehl: "
-109 "...formatiere Absatz..."
-110 "<!echo 'Liste der nicht gefundenen Wörter'; echo -=-=-=-=-=-"
-111 "Sende den Pufferinhalt an 'spell'"
-112 "Rechter Rand: "
-113 "Eingeschränkter Modus: gewünschte Operation unzulässig"
-114 "EIN"
-115 "AUS"
-116 "HILFE"
-117 "SCHREIBEN"
-118 "LESEN"
-119 "ZEILE"
-120 "DATEI"
-121 "ZEICHEN"
-122 "REGENERIEREN"
-123 "UMNUMERIEREN"
-124 "AUTOR"
-125 "VERSION"
-126 "GROSSKL"
-127 "KLEIN"
-128 "LEER"
-129 "TABS"
-130 "ENDE"
-131 "ABBRUCH"
-132 "INFO"
-133 "[INFO]"
-134 "RAND"
-135 "[RAND]"
-136 "FORMAT."
-137 "[FORMAT.]"
-138 "ECHO"
-139 "DRUCKBEFEHL"
-140 "RECHTERRAND"
-141 "HERVORHEB."
-142 "[HERVORHEB.]"
-143 "8-BIT"
-144 "[8-BIT]"
-145 "Emacs-Tastenbelegung "
-146 "^a Zeilenanfang ^i Tabulator ^r Wort zurückholen "
-147 "^b ein Zeichen zurück ^j Zeichen zurückholen ^t Textanfang "
-148 "^c Befehl ^k Zeile löschen ^u Textende "
-149 "^d Zeichen löschen ^l Zeile zurückholen ^v nächste Seite "
-150 "^e Zeilenendee ^m neue Zeile ^w Wort löschen "
-151 "^f ein Zeichen vorwärts ^n neue Zeile ^x Weitersuchen "
-152 "^g vorige Seite ^o ASCII-Zeichen einfü. ^y Textsuche "
-153 "^h Rückschritt ^p vorige Zeile ^z nächstes Wort "
-154 "^[ (Escape) Menü ^y Suchtext eing. ^k Zeile löschen ^p vor.Zeile ^g vor.Seite"
-155 "^o ASCII-Zeichen ^x Weitersuchen ^l Zeile rückhol ^n nä. Zeile ^v nä. Seite"
-156 "^u Textende ^a Zeilenanfang ^w Wort löschen ^b ein Zeichen zurück "
-157 "^t Textanfang ^e Zeilenende ^r Wort rückhol. ^f ein Zeichen vor "
-158 "^c Befehl ^d Zeichen lösch. ^j Zeich. rückh. ^z nächstes Wort "
-159 "EMACS"
-160 "[EMACS]"
-161 " +<zahl> Zeiger auf Zeile <zahl> setzen"
-162 "Kann die Datei .init.ee nicht schreiben, Konfiguration nicht gespeichert!"
-163 "ee-Konfiguration in Datei %s gespeichert"
-164 "speichere Editor-Konfiguration"
-165 "speichere ee-Konfiguration"
-166 "speichern im aktuellen Verzeichnis"
-167 "speichern im Home-Verzeichnis"
-168 "ee-Konfiguration nicht gespeichert"
-169 "beim Aufruf von ree muß ein Dateiname angegeben werden"
-180 "Menü zu groß für den Bildschirm"
-181 "^^weiter^^"
-182 "VVweiterVV"
-183 "16-bit Zeichen "
-184 "16BIT"
-185 "NO16BIT"
diff --git a/usr.bin/ee/nls/en_US.US-ASCII/ee.msg b/usr.bin/ee/nls/en_US.US-ASCII/ee.msg
deleted file mode 100644
index ccefcc4..0000000
--- a/usr.bin/ee/nls/en_US.US-ASCII/ee.msg
+++ /dev/null
@@ -1,185 +0,0 @@
-$ This file contains the messages for ee ("easy editor"). See the file
-$ ee.i18n.guide for more information
-$
-$ For ee patchlevel 3
-$
-$ $FreeBSD$
-$
-$
-$set 1
-$quote "
-1 "modes menu"
-2 "tabs to spaces "
-3 "case sensitive search"
-4 "margins observed "
-5 "auto-paragraph format"
-6 "eightbit characters "
-7 "info window "
-8 "right margin "
-9 "leave menu"
-10 "save changes"
-11 "no save"
-12 "file menu"
-13 "read a file"
-14 "write a file"
-15 "save file"
-16 "print editor contents"
-17 "search menu"
-18 "search for ..."
-19 "search"
-20 "spell menu"
-21 "use 'spell'"
-22 "use 'ispell'"
-23 "miscellaneous menu"
-24 "format paragraph"
-25 "shell command"
-26 "check spelling"
-27 "main menu"
-28 "leave editor"
-29 "help"
-30 "file operations"
-31 "redraw screen"
-32 "settings"
-33 "search"
-34 "miscellaneous"
-35 "Control keys: "
-36 "^a ascii code ^i tab ^r right "
-37 "^b bottom of text ^j newline ^t top of text "
-38 "^c command ^k delete char ^u up "
-39 "^d down ^l left ^v undelete word "
-40 "^e search prompt ^m newline ^w delete word "
-41 "^f undelete char ^n next page ^x search "
-42 "^g begin of line ^o end of line ^y delete line "
-43 "^h backspace ^p prev page ^z undelete line "
-44 "^[ (escape) menu ESC-Enter: exit ee "
-45 " "
-46 "Commands: "
-47 "help : get this info file : print file name "
-48 "read : read a file char : ascii code of char "
-49 "write : write a file case : case sensitive search "
-50 "exit : leave and save nocase : case insensitive search "
-51 "quit : leave, no save !cmd : execute \"cmd\" in shell "
-52 "line : display line # 0-9 : go to line \"#\" "
-53 "expand : expand tabs noexpand: do not expand tabs "
-54 " "
-55 " ee [+#] [-i] [-e] [-h] [file(s)] "
-56 "+# :go to line # -i :no info window -e : don't expand tabs -h :no highlight"
-57 "^[ (escape) menu ^e search prompt ^y delete line ^u up ^p prev page "
-58 "^a ascii code ^x search ^z undelete line ^d down ^n next page "
-59 "^b bottom of text ^g begin of line ^w delete word ^l left "
-60 "^t top of text ^o end of line ^v undelete word ^r right "
-61 "^c command ^k delete char ^f undelete char ESC-Enter: exit ee "
-62 "help : get help info |file : print file name |line : print line # "
-63 "read : read a file |char : ascii code of char |0-9 : go to line \"#\""
-64 "write: write a file |case : case sensitive search |exit : leave and save "
-65 "!cmd : shell \"cmd\" |nocase: ignore case in search |quit : leave, no save"
-66 "expand: expand tabs |noexpand: do not expand tabs "
-67 " press Escape (^[) for menu"
-68 "no file"
-69 "ascii code: "
-70 "sending contents of buffer to \"%s\" "
-71 "command: "
-72 "name of file to write: "
-73 "name of file to read: "
-74 "character = %d"
-75 "unknown command \"%s\""
-76 "entered command is not unique"
-77 "line %d "
-78 "length = %d"
-79 "current file is \"%s\" "
-80 "usage: %s [-i] [-e] [-h] [+line_number] [file(s)]\n"
-81 " -i turn off info window\n"
-82 " -e do not convert tabs to spaces\n"
-83 " -h do not use highlighting\n"
-84 "file \"%s\" is a directory"
-85 "new file \"%s\""
-86 "can't open \"%s\""
-87 "file \"%s\", %d lines"
-88 "finished reading file \"%s\""
-89 "reading file \"%s\""
-90 ", read only"
-91 "file \"%s\", %d lines"
-92 "enter name of file: "
-93 "no filename entered: file not saved"
-94 "changes have been made, are you sure? (y/n [n]) "
-95 "y"
-96 "file already exists, overwrite? (y/n) [n] "
-97 "unable to create file \"%s\""
-98 "writing file \"%s\""
-99 "\"%s\" %d lines, %d characters"
-100 " ...searching"
-101 "string \"%s\" not found"
-102 "search for: "
-103 "could not exec %s"
-104 "press return to continue "
-105 "press Esc to cancel"
-106 "menu too large for window"
-107 "press any key to continue "
-108 "shell command: "
-109 "...formatting paragraph..."
-110 "<!echo 'list of unrecognized words'; echo -=-=-=-=-=-"
-111 "sending contents of edit buffer to 'spell'"
-112 "right margin is: "
-113 "restricted mode: unable to perform requested operation"
-114 "ON"
-115 "OFF"
-116 "HELP"
-117 "WRITE"
-118 "READ"
-119 "LINE"
-120 "FILE"
-121 "CHARACTER"
-122 "REDRAW"
-123 "RESEQUENCE"
-124 "AUTHOR"
-125 "VERSION"
-126 "CASE"
-127 "NOCASE"
-128 "EXPAND"
-129 "NOEXPAND"
-130 "EXIT"
-131 "QUIT"
-132 "INFO"
-133 "NOINFO"
-134 "MARGINS"
-135 "NOMARGINS"
-136 "AUTOFORMAT"
-137 "NOAUTOFORMAT"
-138 "ECHO"
-139 "PRINTCOMMAND"
-140 "RIGHTMARGIN"
-141 "HIGHLIGHT"
-142 "NOHIGHLIGHT"
-143 "EIGHTBIT"
-144 "NOEIGHTBIT"
-145 "emacs key bindings "
-146 "^a beginning of line ^i tab ^r restore word "
-147 "^b back 1 char ^j undel char ^t begin of file "
-148 "^c command ^k delete line ^u end of file "
-149 "^d delete char ^l undelete line ^v next page "
-150 "^e end of line ^m newline ^w delete word "
-151 "^f forward 1 char ^n next line ^x search "
-152 "^g go back 1 page ^o ascii char insert ^y search prompt "
-153 "^h backspace ^p prev line ^z next word "
-154 "^[ (escape) menu ^y search prompt ^k delete line ^p prev li ^g prev page"
-155 "^o ascii code ^x search ^l undelete line ^n next li ^v next page"
-156 "^u end of file ^a begin of line ^w delete word ^b back 1 char "
-157 "^t begin of file ^e end of line ^r restore word ^f forward 1 char "
-158 "^c command ^d delete char ^j undelete char ^z next word "
-159 "EMACS"
-160 "NOEMACS"
-161 " +# put cursor at line #\n"
-162 "unable to open .init.ee for writing, no configuration saved!"
-163 "ee configuration saved in file %s"
-164 "save editor configuration"
-165 "save ee configuration"
-166 "save in current directory"
-167 "save in home directory"
-168 "ee configuration not saved"
-169 "must specify a file when invoking ree"
-180 "menu too large for window"
-181 "^^more^^"
-182 "VVmoreVV"
-183 "16 bit characters "
-184 "16BIT"
-185 "NO16BIT"
diff --git a/usr.bin/ee/nls/fr_FR.ISO8859-1/ee.msg b/usr.bin/ee/nls/fr_FR.ISO8859-1/ee.msg
deleted file mode 100644
index e93ff22..0000000
--- a/usr.bin/ee/nls/fr_FR.ISO8859-1/ee.msg
+++ /dev/null
@@ -1,185 +0,0 @@
-$ This file contains the messages for ee ("easy editor"). See the file
-$ ee.i18n.guide for more information
-$
-$ For ee patchlevel 3
-$
-$ $FreeBSD$
-$
-$
-$set 1
-$quote "
-1 "menu de configuration "
-2 "tabulation -> espaces "
-3 "recherche sensible aux maj/min "
-4 "respect des marges "
-5 "formattage automatique des paragraphes"
-6 "caractères 8 bits "
-7 "fenêtre d'informations "
-8 "marge de droite "
-9 "menu de sortie"
-10 "enregistrer les modifications"
-11 "ne pas enregistrer"
-12 "menu fichiers"
-13 "lire un fichier"
-14 "écrire un fichier"
-15 "enregistrer un fichier"
-16 "imprimer le contenu de l'éditeur"
-17 "menu recherche"
-18 "recherche de..."
-19 "rechercher"
-20 "menu correcteur orthographique"
-21 "utiliser 'spell'"
-22 "utiliser 'ispell'"
-23 "menu divers"
-24 "formatter le paragraphe"
-25 "commande du shell"
-26 "vérifier l'orthographe"
-27 "menu principal"
-28 "quitter l'éditeur"
-29 "aide"
-30 "opérations sur les fichiers"
-31 "rafraîchir l'écran"
-32 "configuration"
-33 "recherche"
-34 "divers"
-35 "Contrôle + touche: "
-36 "^a code ascii ^i tabulation ^r droite "
-37 "^b fin du texte ^j nouvelle ligne ^t début du texte "
-38 "^c commande ^k effacer caractère ^u haut "
-39 "^d bas ^l gauche ^v annuler effacement mot "
-40 "^e entrer recherche ^m nouvelle ligne ^w effacer un mot "
-41 "^f annuler eff. caract. ^n page suivante ^x recherche "
-42 "^g début de ligne ^o fin de ligne ^y effacer ligne "
-43 "^h arrière ^p page précédente ^z annuler effacement ligne"
-44 "^[ (échappement) menu ESC-Enter: quitter ee "
-45 " "
-46 "Commandes: "
-47 "aide : pour cet écran d'info fichier: donne le nom du fichier "
-48 "lire : lire un fichier caract : code ascii d'un caractère"
-49 "écrire : créer un fichier minmaj : recherche sensible aux maj/min"
-50 "fin : quitter et enregistrer pasmin : recherche insensible aux maj/min"
-51 "quitter: quitter, ne pas enregistrer !cmd : exécute \"cmd\" par le shell"
-52 "ligne : indique le numéro de ligne 0-9 : aller à la ligne \"#\" "
-53 "tabs : étendre les tabulations pastabs: ne pas étendre les tabulations"
-54 " "
-55 " ee [+#] [-i] [-e] [-h] [fichier(s)] "
-56 " -i : pas de fenêtre d'info -e : ne pas étendre les tabs -h : pas de surbrillance"
-57 "^[ (échap.) menu ^e rechercher... ^y efface ligne ^u haut ^p page préc."
-58 "^a code ascii ^x rechercher ^z annul. eff. ligne ^d bas ^n page suiv."
-59 "^b fin du texte ^g début de ligne ^w efface mot ^l gauche "
-60 "^t début du texte ^o fin de ligne ^v annul. eff. mot ^r droite "
-61 "^c commande ^k efface caract. ^f annul. eff. caract. ESC-Enter: quitter "
-62 "aide: fenêtre d'aide |fichier: nom du fichier |ligne: numéro de ligne"
-63 "lire: lecture fichier|caract : code ascii du car. |0-9: aller ligne \"#\""
-64 "écrire: crée un fich. |minmaj: rech. sensible min/maj|fin: quitte et sauve"
-65 "!cmd: shell \"cmd\" |pasmin: rech. insens. min/maj |quitte: quitte sans sauver"
-66 "tabs: étend les tabs |pastabs: n'étend pas les tabulations"
-67 " pressez sur échap. (^[) pour le menu"
-68 "pas de fichier"
-69 "code ascii : "
-70 "le contenu du buffer est imprimé sur \"%s\" "
-71 "commande : "
-72 "nom du fichier à créer : "
-73 "nom du fichier à lire : "
-74 "caractère = %d"
-75 "commande inconnue : \"%s\""
-76 "la commande tapée est ambiguë"
-77 "ligne %d "
-78 "longueur = %d"
-79 "le fichier courant est \"%s\" "
-80 "utilisation : %s [-i] [-e] [-h] [+numéro_de_ligne] [fichier(s)]\n"
-81 " -i supprime la fenêtre d'informations\n"
-82 " -e ne convertit pas les tabs en espaces\n"
-83 " -h n'utilise pas de surbrillance\n"
-84 "le fichier \"%s\" est un répertoire"
-85 "nouveau fichier \"%s\""
-86 "impossible de d'ouvrir \"%s\""
-87 "fichier \"%s\", %d lignes"
-88 "le fichier \"%s\" a été lu"
-89 "lecture du fichier \"%s\""
-90 ", lecture seule"
-91 "fichier \"%s\", %d lignes"
-92 "entrez un nom de fichier : "
-93 "pas de nom de fichier donné : fichier non enregistré"
-94 "des changements ont été effectués, êtes vous sûr ? (o/n [n]) "
-95 "o"
-96 "le fichier existe déjà, réécrire ? (o/n) [n] "
-97 "impossible de créer le fichier \"%s\""
-98 "écriture du fichier \"%s\""
-99 "\"%s\" %d lignes, %d caractères"
-100 " ...recherche"
-101 "chaîne \"%s\" non trouvée"
-102 "rechercher : "
-103 "impossible d'exécuter %s"
-104 "tapez entrée pour continuer "
-105 "pressez sur échap. pour annuler"
-106 "menu trop grand pour la fenêtre"
-107 "appuyez sur une touche pour continuer "
-108 "commande du shell : "
-109 "...formattage du paragraphe..."
-110 "<!echo 'liste des mots non reconnus'; echo -=-=-=-=-=-"
-111 "envoi du contenu du buffer à 'spell'"
-112 "colonne de la marge de droite : "
-113 "mode restreint : impossible d'effectuer l'opération demandée"
-114 "OUI"
-115 "NON"
-116 "AIDE"
-117 "ECRIRE"
-118 "LIRE"
-119 "LIGNE"
-120 "FICHIER"
-121 "CARACTERE"
-122 "RAFRAICHIR"
-123 "RENUMEROTER"
-124 "AUTEUR"
-125 "VERSION"
-126 "MINMAJ"
-127 "PASMINMAJ"
-128 "TABS"
-129 "PASTABS"
-130 "FIN"
-131 "QUITTE"
-132 "INFO"
-133 "PASINFO"
-134 "MARGES"
-135 "PASMARGES"
-136 "AUTOFORMAT"
-137 "PASAUTOFORMAT"
-138 "ECHO"
-139 "COMMANDEIMPRESSION"
-140 "MARGEDROITE"
-141 "SURBRILLANT"
-142 "PASSURBRILLANT"
-143 "8BIT"
-144 "PAS8BIT"
-145 "caractères de contrôle comme emacs "
-146 "^a début de ligne ^i tabulation ^r annule effacement mot "
-147 "^b arrière ^j annule eff. caract. ^t début du texte "
-148 "^c commande ^k efface ligne ^u fin du texte "
-149 "^d efface caractère ^l annule eff. ligne ^v page suivante "
-150 "^e fin de ligne ^m nouvelle ligne ^w effacer un mot "
-151 "^f caractère suivant ^n ligne suivante ^x recherche "
-152 "^g page précédente ^o insère caract. ascii ^y rechercher... "
-153 "^h efface en arrière ^p ligne précédente ^z mot suivant "
-154 "^[ (échap.) menu ^y rechercher... ^k efface ligne ^p ligne préc ^g page préc"
-155 "^o code ascii ^x recherche ^l annul. eff.li ^n ligne suiv ^v page suiv"
-156 "^u fin du fichier ^a début de ligne ^w efface mot ^b arrière "
-157 "^t début du texte ^e fin de ligne ^r annul.eff.mot ^f avance 1 caractère "
-158 "^c commande ^d efface caract. ^j annul.eff.car ^z mot suivant "
-159 "EMACS"
-160 "PASEMACS"
-161 " +# positionne le curseur sur la ligne #\n"
-162 "impossible d'écrire .init.ee, configuration non sauvée !"
-163 "configuration de ee sauvée en %s"
-164 "sauvegarde configuration de l'éditeur"
-165 "sauvegarde configuration de ee"
-166 "sauvegarde dans le répertoire courant"
-167 "sauvegarde dans le répertoire d'accueil"
-168 "configuration de ee non sauvée"
-169 "nom de fichier manquant pour ree"
-180 "menu trop large pour la fenêtre"
-181 "^^encore^^"
-182 "VVencoreVV"
-183 "16 bit characters "
-184 "16BIT"
-185 "NO16BIT"
diff --git a/usr.bin/ee/nls/pl_PL.ISO8859-2/ee.msg b/usr.bin/ee/nls/pl_PL.ISO8859-2/ee.msg
deleted file mode 100644
index 3176f79..0000000
--- a/usr.bin/ee/nls/pl_PL.ISO8859-2/ee.msg
+++ /dev/null
@@ -1,185 +0,0 @@
-$ This file contains the messages for ee ("easy editor"). See the file
-$ ee.i18n.guide for more information
-$
-$ For ee patchlevel 3
-$
-$ $FreeBSD$
-$
-$
-$set 1
-$quote "
-1 "menu Tryb pracy"
-2 "tabulacje na spacje "
-3 "szukaj (ma³e!=du¿e) "
-4 "ustawiony margines "
-5 "auto-formatuj akapit "
-6 "znaki o¶miobitowe "
-7 "okno informacyjne "
-8 "prawy margines "
-9 "wyjd¼ z menu"
-10 "zachowaj zmiany"
-11 "brak zachowania"
-12 "menu Plik"
-13 "wczytaj plik"
-14 "zapisz do pliku"
-15 "zachowaj plik"
-16 "drukuj zawarto¶æ edytora"
-17 "menu Szukanie"
-18 "szukaj ..."
-19 "szukanie"
-20 "menu Pisownia"
-21 "u¿yj 'spell'"
-22 "u¿yj 'ispell'"
-23 "menu Inne"
-24 "formatuj akapit"
-25 "polecenie shell"
-26 "sprawd¼ pisowniê"
-27 "menu g³ówne"
-28 "wyjd¼ z edytora"
-29 "pomoc"
-30 "operacje na plikach"
-31 "od¶wie¿ ekran"
-32 "ustawienia"
-33 "szukanie"
-34 "inne"
-35 "Klawisze kontrolne: "
-36 "^a kod ASCII ^i tabulator ^r w prawo "
-37 "^b na dó³ tekstu ^j nowy wiersz ^t do góry tekstu "
-38 "^c polecenie ^k usuñ znak ^u do góry "
-39 "^d do do³u ^l w lewo ^v przywróæ s³owo "
-40 "^e szukanie ^m nowy wiersz ^w usuñ s³owo "
-41 "^f przywróæ znak ^n nastêpna strona ^x szukaj "
-42 "^g na pocz±tek wiersza ^o na koniec wiersza ^y usuñ wiersz "
-43 "^h backspace ^p poprzednia strona ^z przywróæ wiersz "
-44 "^[ (escape) menu ESC-Enter: wyj¶cie z ee "
-45 " "
-46 "Polecenia: "
-47 "help : wy¶wietl tê informacjê file : wy¶wietl nazwê pliku "
-48 "read : wczytaj plik char : kod ASCII znaku "
-49 "write : zapisz do pliku case : szukaj (ma³e!=du¿e) "
-50 "exit : zachowaj i wyjd¼ nocase : szukaj (ma³e==du¿e) "
-51 "quit : wyjd¼ bez zachowania !cmd : wykonaj \"cmd\" w shellu "
-52 "line : wy¶wietl numer wiersza 0-9 : id¼ do wiersza \"#\" "
-53 "expand : rozwiñ tabulacje na spacje noexpand: nie rozwijaj tabulacji "
-54 " "
-55 " ee [+#] [-i] [-e] [-h] [plik(i)] "
-56 " -i : bez okna inform. -e : nie rozwijaj tab. -h : bez pod¶wietl."
-57 "^[ (escape) menu ^e szukanie ^y usuñ wiersz ^u do góry ^p poprz. str "
-58 "^a kod ASCII ^x szukaj ^z przywróæ wiersz ^d do do³u ^n nast. str. "
-59 "^b na dó³ tekstu ^g na pocz. wiersza ^w usuñ s³owo ^l w lewo "
-60 "^t do góry tekstu ^o na koniec wiersza ^v przywróæ s³owo ^r w prawo "
-61 "^c polecenie ^k usuñ znak ^f przywróæ znak ESC-Enter: wyj¶cie "
-62 "help : pomoc |file : podaj nazwê pliku |line : numer wiersza"
-63 "read : wczytaj plik |char : kod ASCII znaku |0-9 : id¼ do wr \"#\""
-64 "write: zapisz plik |case : szukaj (ma³e!=du¿e) |exit : zpisz i wyjd¼"
-65 "!cmd : \"cmd\" w shellu |nocase: ma³e==du¿e w szukaniu |quit : wyjd¼, nie zapisuj"
-66 "expand: rozwiñ tabulacje na spacje |noexpand: nie rozwijaj tabulacji "
-67 " naci¶nij Escape (^[) do menu"
-68 "brak pliku"
-69 "kod ASCII: "
-70 "wysy³am zawarto¶æ bufora do \"%s\" "
-71 "polecenie: "
-72 "nazwa pliku do zapisania: "
-73 "nazwa pliku do wczytania: "
-74 "znak = %d"
-75 "nieznane polecenie \"%s\""
-76 "podane polecenie nie jest jednoznaczne"
-77 "wiersz %d "
-78 "d³ugo¶æ = %d"
-79 "aktualny plik to \"%s\" "
-80 "sposób u¿ycia: %s [-i] [-e] [-h] [+numer_wiersza] [plik(i)]\n"
-81 " -i zamknij okno informacyjne\n"
-82 " -e nie rozwijaj tabulacji na spacje\n"
-83 " -h nie u¿ywaj pod¶wietleñ\n"
-84 "plik \"%s\" jest katalogiem"
-85 "nowy plik \"%s\""
-86 "nie mogê otworzyæ \"%s\""
-87 "plik \"%s\", %d wierszy"
-88 "koniec wczytywania pliku \"%s\""
-89 "wczytywanie pliku \"%s\""
-90 ", tylko do odczytu"
-91 "plik \"%s\", %d wierszy"
-92 "podaj nazwê pliku: "
-93 "nie podano nazwy pliku: plik nie zosta³ zachowany"
-94 "plik zosta³ zmieniony, jeste¶ pewien? (t/n [n]) "
-95 "t"
-96 "plik ju¿ istnieje, zast±piæ? (t/n) [n] "
-97 "nie mo¿na utworzyæ pliku \"%s\""
-98 "zapisywanie pliku \"%s\""
-99 "\"%s\" %d wierszy, %d znaków"
-100 " ...szukam"
-101 "napis \"%s\" nie zosta³ znaleziony"
-102 "szukaj: "
-103 "nie mo¿na wykonaæ %s"
-104 "naci¶nij Enter ¿eby kontynuowaæ "
-105 "naci¶nij Esc ¿eby anulowaæ"
-106 "menu zbyt du¿e dla tego okna"
-107 "naci¶nij dowolny klawisz "
-108 "polecenie shella: "
-109 "...formatowanie akapitu..."
-110 "<!echo 'lista nieznalezionych s³ów'; echo -=-=-=-=-=-"
-111 "wysy³am zawarto¶æ edytora do programu 'spell'"
-112 "prawy margines: "
-113 "tryb ograniczony: nie mo¿na przeprowadziæ tej operacji"
-114 "ON"
-115 "OFF"
-116 "HELP"
-117 "WRITE"
-118 "READ"
-119 "LINE"
-120 "FILE"
-121 "CHARACTER"
-122 "REDRAW"
-123 "RESEQUENCE"
-124 "AUTHOR"
-125 "VERSION"
-126 "CASE"
-127 "NOCASE"
-128 "EXPAND"
-129 "NOEXPAND"
-130 "EXIT"
-131 "QUIT"
-132 "INFO"
-133 "NOINFO"
-134 "MARGINS"
-135 "NOMARGINS"
-136 "AUTOFORMAT"
-137 "NOAUTOFORMAT"
-138 "ECHO"
-139 "PRINTCOMMAND"
-140 "RIGHTMARGIN"
-141 "HIGHLIGHT"
-142 "NOHIGHLIGHT"
-143 "EIGHTBIT"
-144 "NOEIGHTBIT"
-145 "klawisze emacs "
-146 "^a pocz±tek wiersza ^i tabulacja ^r przywróæ s³owo "
-147 "^b jeden znak wstecz ^j przywróæ znak ^t do góry tekstu "
-148 "^c polecenie ^k usuñ wiersz ^u na dó³ tekstu "
-149 "^d usuñ znak ^l przywróæ wiersz ^v nastêpna strona "
-150 "^e na koniec wiersza ^m nowy wiersz ^w usuñ s³owo "
-151 "^f 1 znak do przodu ^n nastêpny wiersz ^x szukaj "
-152 "^g 1 strona wstecz ^o wstaw znak ASCII ^y szukanie "
-153 "^h backspace ^p poprzedni wiersz ^z nastêpne s³owo "
-154 "^[ (escape) menu ^y szukanie ^k usuñ wiersz ^p <-wiersz ^g <-strona "
-155 "^o kod ASCII ^x szukaj ^l przywr wiersz ^n wiersz-> ^v strona-> "
-156 "^u koniec pliku ^a pocz. wiersza ^w usuñ s³owo ^b 1 znak wstecz "
-157 "^t pocz. tekstu ^e koniec wiersza ^r przywr s³owo ^f 1 znak do przodu "
-158 "^c polecenie ^d usuñ znak ^j przywróæ znak ^z nastêpne s³owo "
-159 "EMACS"
-160 "NIE-EMACS"
-161 " +# umie¶æ kursor w wierszu #\n"
-162 "nie mo¿na otworzyæ .init.ee do zapisu, nie zachowano konfiguracji!"
-163 "konfiguracja ee zachowana do pliku %s"
-164 "zachowaj konfiguracjê edytora"
-165 "zachowaj konfiguracjê ee"
-166 "zachowaj w bie¿±cym katalogu"
-167 "zachowaj w katalogu home"
-168 "nie zachowano konfiguracji ee"
-169 "musisz podaæ nazwê pliku przy wywo³aniu ree"
-180 "menu zbyt du¿e dla tego okna"
-181 "^^dalej^^"
-182 "VVdalejVV"
-183 "16 bit characters "
-184 "16BIT"
-185 "NO16BIT"
diff --git a/usr.bin/ee/nls/ru_RU.KOI8-R/ee.msg b/usr.bin/ee/nls/ru_RU.KOI8-R/ee.msg
deleted file mode 100644
index 99aa343..0000000
--- a/usr.bin/ee/nls/ru_RU.KOI8-R/ee.msg
+++ /dev/null
@@ -1,187 +0,0 @@
-$ This file contains the messages for ee ("easy editor"). See the file
-$ ee.i18n.guide for more information
-$
-$ Based on uk_UA.KOI8-U translation by Olexander Kunytsa <kunia@istc.kiev.ua>
-$
-$ For ee patchlevel 3
-$
-$ $FreeBSD$
-$
-$
-$set 1
-$quote "
-1 "íÅÎÀ ÐÁÒÁÍÅÔÒÏ×"
-2 "ÔÁÂÕÌÑÃÉÑ ÐÒÏÂÅÌÁÍÉ "
-3 "ÐÏÉÓË Ó ÕÞ£ÔÏÍ ÒÅÇÉÓÔÒÁ "
-4 "Á×ÔÏ-ÐÅÒÅ×ÏÄ ÓÔÒÏËÉ "
-5 "Á×ÔÏ-ÆÏÒÍÁÔ ÁÂÚÁÃÁ "
-6 "8-ÂÉÔÎÙÅ ÓÉÍ×ÏÌÙ "
-7 "ÏËÎÏ ÐÏÄÓËÁÚËÉ "
-8 "ÛÉÒÉÎÁ ÔÅËÓÔÁ "
-9 "æÁÊÌ ÉÚÍÅΣÎ!"
-10 "ÓÏÈÒÁÎÉÔØ É ×ÙÊÔÉ"
-11 "ÎÅ ÓÏÈÒÁÎÑÔØ"
-12 "íÅÎÀ ÆÁÊÌÏ×ÙÈ ÏÐÅÒÁÃÉÊ"
-13 "ÐÒÏÞÅÓÔØ ÆÁÊÌ"
-14 "ÚÁÐÉÓÁÔØ × ÆÁÊÌ"
-15 "ÓÏÈÒÁÎÉÔØ ÆÁÊÌ"
-16 "ÒÁÓÐÅÞÁÔÁÔØ"
-17 "íÅÎÀ ÐÏÉÓËÁ"
-18 "ÞÔÏ ÉÓËÁÔØ..."
-19 "ÐÏ×ÔÏÒÉÔØ ÐÏÉÓË"
-20 "íÅÎÀ ÐÒÏ×ÅÒËÉ ÐÒÁ×ÏÐÉÓÁÎÉÑ"
-21 "ÚÁÐÕÓÔÉÔØ 'spell'"
-22 "ÚÁÐÕÓÔÉÔØ 'ispell'"
-23 "äÏÐÏÌÎÉÔÅÌØÎÙÅ ÏÐÅÒÁÃÉÉ"
-24 "ÆÏÒÍÁÔÉÒÏ×ÁÔØ ÁÂÚÁÃ"
-25 "ËÏÍÁÎÄÁ ÏÂÏÌÏÞËÉ"
-26 "ÐÒÏ×ÅÒÉÔØ ÐÒÁ×ÏÐÉÓÁÎÉÅ"
-27 "çÌÁ×ÎÏÅ ÍÅÎÀ"
-28 "×ÙÊÔÉ ÉÚ ÒÅÄÁËÔÏÒÁ"
-29 "ÐÏÄÓËÁÚËÁ"
-30 "ÏÐÅÒÁÃÉÉ Ó ÆÁÊÌÁÍÉ"
-31 "ÏÂÎÏ×ÉÔØ ÜËÒÁÎ"
-32 "ÐÁÒÁÍÅÔÒÙ"
-33 "ÐÏÉÓË"
-34 "ÒÁÚÎÏÅ"
-35 "ëÌÁ×ÉÛÉ ÕÐÒÁ×ÌÅÎÉÑ: "
-36 "^a ascii-ËÏÄ ^i ÔÁÂÕÌÑÃÉÑ ^r ×ÐÒÁ×Ï "
-37 "^b × ÓÁÍÙÊ ÎÉÚ ^j ÎÏ×ÁÑ ÓÔÒÏËÁ ^t × ÓÁÍÙÊ ×ÅÒÈ "
-38 "^c ËÏÍÁÎÄÁ ^k ÕÄÁÌÉÔØ ÓÉÍ×ÏÌ ^u ××ÅÒÈ "
-39 "^d ×ÎÉÚ ^l ×ÌÅ×Ï ^v ×ÅÒÎÕÔØ ÓÌÏ×Ï "
-40 "^e ÐÏÉÓË... ^m ÎÏ×ÁÑ ÓÔÒÏËÁ ^w ÕÄÁÌÉÔØ ÓÌÏ×Ï "
-41 "^f ×ÅÒÎÕÔØ ÓÉÍ×ÏÌ ^n ÓÌÅÄÕÀÝÁÑ ÓÔÒÁÎÉÃÁ ^x ÐÏ×ÔÏÒ ÐÏÉÓËÁ "
-42 "^g × ÎÁÞÁÌÏ ÓÔÒÏËÉ ^o × ËÏÎÅÃ ÓÔÒÏËÉ ^y ÕÄÁÌÉÔØ ÓÔÒÏËÕ "
-43 "^h ÚÁÂÏÊ ^p ÐÒÅÄÙÄÕÝÁÑ ÓÔÒÁÎÉÃÁ ^z ×ÅÒÎÕÔØ ÓÔÒÏËÕ "
-44 "^[ (Esc) ×ÙÚÏ× ÍÅÎÀ Esc-Enter: ×ÙÊÔÉ ÉÚ ÒÅÄÁËÔÏÒÁ "
-45 " "
-46 "ëÏÍÁÎÄÙ: "
-47 "help : ÜÔÁ ÐÏÄÓËÁÚËÁ file : ÐÏËÁÚÁÔØ ÉÍÑ ÆÁÊÌÁ "
-48 "read : ÐÒÏÞÅÓÔØ ÆÁÊÌ char : ascii-ËÏÄ ÓÉÍ×ÏÌÁ "
-49 "write : ÚÁÐÉÓÁÔØ × ÆÁÊÌ case : ÐÏÉÓË Ó ÕÞ£ÔÏÍ ÒÅÇÉÓÔÒÁ "
-50 "exit : ×ÙÊÔÉ Ó ÓÏÈÒÁÎÅÎÉÅÍ nocase : ÐÏÉÓË ÂÅÚ ÕÞ£ÔÁ ÒÅÇÉÓÔÒÁ "
-51 "quit : ×ÙÊÔÉ ÂÅÚ ÓÏÈÒÁÎÅÎÉÑ !ËÏÍÁÎÄÁ: ×ÙÚ×ÁÔØ ËÏÍÁÎÄÕ ÏÂÏÌÏÞËÉ "
-52 "line : ÐÏËÁÚÁÔØ ÎÏÍÅÒ ÓÔÒÏËÉ 0-9 : ÐÅÒÅÊÔÉ Ë ÓÔÒÏËÅ N "
-53 "expand : ÚÁÍÅÎÑÔØ ÔÁÂÕÌÑÃÉÀ ÐÒÏÂÅÌÁÍÉ noexpand: ÎÅ ÚÁÍÅÎÑÔØ ÔÁÂÕÌÑÃÉÀ "
-54 " "
-55 " ee [+#] [-i] [-e] [-h] [ÆÁÊÌÙ(Ù)] "
-56 "+# :Ë ÓÔÒÏËÅ N -i :ÂÅÚ ÉÎÆÏ-ÏËÎÁ -e :ÎÅ ÚÁÍÅÎÑÔØ ÔÁÂÙ -h :ÂÅÚ ×ÙÄÅÌÅÎÉÑ ÒÁÍÏË "
-57 "^[ (Esc) ÍÅÎÀ ^e ÐÏÉÓË ^y ÕÄÁÌÉÔØ ÓÔÒÏËÕ ^u ××ÅÒÈ ^p ÐÒÅÄ. ÓÔÒ. "
-58 "^a ascii-ËÏÄ ^x ÐÏ×ÔÏÒ ÐÏÉÓËÁ ^z ×ÅÒÎÕÔØ ÓÔÒÏËÕ ^d ×ÎÉÚ ^n ÓÌÅÄ. ÓÔÒ. "
-59 "^b × ÓÁÍÙÊ ÎÉÚ ^g × ÎÁÞÁÌÏ ÓÔÒÏËÉ ^w ÕÄÁÌÉÔØ ÓÌÏ×Ï ^l ×ÌÅ×Ï "
-60 "^t × ÓÁÍÙÊ ×ÅÒÈ ^o × ËÏÎÅà ÓÔÒÏËÉ ^v ×ÅÒÎÕÔØ ÓÌÏ×Ï ^r ×ÐÒÁ×Ï "
-61 "^c ËÏÍÁÎÄÁ ^k ÕÄÁÌÉÔØ ÓÉÍ×ÏÌ ^f ×ÅÒÎÕÔØ ÓÉÍ×ÏÌ Esc-Enter ×ÙÈÏÄ ÉÚ 'ee'"
-62 "help : ÐÏÄÓËÁÚËÁ |file : ÐÏËÁÚÁÔØ ÉÍÑ ÆÁÊÌÁ |line: ÎÏÍÅÒ ÓÔÒÏËÉ "
-63 "read : ÐÒÏÞÅÓÔØ ÆÁÊÌ |char : ascii-ËÏÄ ÓÉÍ×ÏÌÁ |0-9 : ÐÅÒÅÊÔÉ Ë ÓÔÒÏËÅ "
-64 "write: ÚÁÐÉÓÁÔØ ÆÁÊÌ |case : ÐÏÉÓË Ó ÕÞ£ÔÏÍ ÒÅÇÉÓÔÒÁ |exit: ÓÏÈÒÁÎÉÔØ É ×ÙÊÔÉ"
-65 "!ËÍÄ : ×ÙÐÏÌÎÉÔØ ËÍÄ. |nocase:ÐÏÉÓË ÂÅÚ ÕÞ£ÔÁ ÒÅÇÉÓÔÒÁ |quit: ÏÔÍÅÎÉÔØ É ×ÙÊÔÉ"
-66 "expand: ÚÁÍÅÎÑÔØ ÔÁÂÙ |noexpand: ÎÅ ÚÁÍÅÎÑÔØ ÔÁÂÙ ÐÒÏÂÅÌÁÍÉ "
-67 " ÎÁÖÍÉÔÅ Esc (^[) ÄÌÑ ×ÙÚÏ×Á ÍÅÎÀ"
-68 "ÆÁÊÌ ÎÅ ÕËÁÚÁÎ"
-69 "ascii-ËÏÄ: "
-70 "ÐÅÒÅÄÁÀ ÓÏÄÅÒÖÉÍÏÅ ÂÕÆÅÒÁ × \"%s\" "
-71 "ËÏÍÁÎÄÁ: "
-72 "ÚÁÐÉÓÁÔØ × ÆÁÊÌ: "
-73 "ÐÒÏÞÅÓÔØ ÆÁÊÌ: "
-74 "ascii-ËÏÄ ÓÉÍ×ÏÌÁ = %d"
-75 "ÎÅ×ÅÒÎÁÑ ËÏÍÁÎÄÁ \"%s\""
-76 "ÎÅÏÄÎÏÚÎÁÞÎÏÅ ÓÏËÒÁÝÅÎÉÅ ËÏÍÁÎÄÙ"
-77 "ÓÔÒÏËÁ %d "
-78 "ÄÌÉÎÁ = %d ÓÉÍ×."
-79 "ÔÅËÕÝÉÊ ÆÁÊÌ: \"%s\" "
-80 "ÉÓÐÏÌØÚÏ×ÁÎÉÅ: %s [-i] [-e] [-h] [+ÎÏÍÅÒ_ÓÔÒÏËÉ] [ÆÁÊÌ(Ù)]\n"
-81 " -i ÏÔËÌÀÞÉÔØ ÏËÎÏ ÐÏÄÓËÁÚËÉ\n"
-82 " -e ÎÅ ÚÁÍÅÎÑÔØ ÔÁÂÕÌÑÃÉÀ ÐÒÏÂÅÌÁÍÉ\n"
-83 " -h ÎÅ ×ÙÄÅÌÑÔØ ÒÁÍËÉ\n"
-84 "\"%s\" Ñ×ÌÑÅÔÓÑ ËÁÔÁÌÏÇÏÍ"
-85 "ÎÏ×ÙÊ ÆÁÊÌ \"%s\""
-86 "ÎÅ ÍÏÇÕ ÏÔËÒÙÔØ \"%s\""
-87 "ÆÁÊÌ \"%s\", %d ÓÔÒÏË"
-88 "ÆÁÊÌ \"%s\" ÐÒÏÞÉÔÁÎ"
-89 "ÞÉÔÁÅÍ ÆÁÊÌ \"%s\""
-90 ", ÔÏÌØËÏ ÄÌÑ ÞÔÅÎÉÑ"
-91 "ÆÁÊÌ \"%s\", %d ÓÔÒÏË"
-92 "××ÅÄÉÔÅ ÉÍÑ ÆÁÊÌÁ: "
-93 "ÉÍÑ ÆÁÊÌÁ ÎÅ ÚÁÄÁÎÏ: ÆÁÊÌ ÎÅ ÓÏÈÒÁΣÎ"
-94 "÷Ù Õ×ÅÒÅÎÙ, ÞÔÏ ÈÏÔÉÔÅ ÏÔÍÅÎÉÔØ Ó×ÏÉ ÉÚÍÅÎÅÎÉÑ? (y/n [n]) "
-95 "y"
-96 "ÆÁÊÌ ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ, ÐÅÒÅÐÉÓÁÔØ ÐÏ×ÅÒÈ? (y/n) [n] "
-97 "ÎÅ ÍÏÇÕ ÓÏÚÄÁÔØ ÆÁÊÌ \"%s\""
-98 "ÚÁÐÉÓÙ×ÁÀ ÆÁÊÌ \"%s\""
-99 "\"%s\" %d ÓÔÒÏË, %d ÓÉÍ×ÏÌÏ×"
-100 " ...ÉÄ£Ô ÐÏÉÓË"
-101 "ÐÏÄÓÔÒÏËÁ \"%s\" ÎÅ ÎÁÊÄÅÎÁ"
-102 "ÞÔÏ ÉÓËÁÔØ: "
-103 "ÎÅ ÍÏÇÕ ÚÁÐÕÓÔÉÔØ %s"
-104 "ÄÌÑ ÐÒÏÄÏÌÖÅÎÉÑ ÎÁÖÍÉÔÅ Enter"
-105 "ÄÌÑ ÏÔÍÅÎÙ ÎÁÖÍÉÔÅ Esc"
-106 "ÓÌÉÛËÏÍ ÂÏÌØÛÏÅ ÍÅÎÀ - ÎÅ ÐÏÍÅÝÁÅÔÓÑ × ÜËÒÁÎ"
-107 "ÄÌÑ ÐÒÏÄÏÌÖÅÎÉÑ ÎÁÖÍÉÔÅ ÌÀÂÕÀ ËÌÁ×ÉÛÕ"
-108 "ËÏÍÁÎÄÁ ÏÂÏÌÏÞËÉ: "
-109 "...ÆÏÒÍÁÔÉÒÕÀ ÁÂÚÁÃ..."
-110 "<!echo 'ÓÐÉÓÏË ÐÏÄÏÚÒÉÔÅÌØÎÙÈ ÓÌÏ×'; echo -=-=-=-=-=-"
-111 "ÐÒÏ×ÅÒÑÀ ÐÒÁ×ÏÐÉÓÁÎÉÅ Ó ÐÏÍÏÝØÀ 'spell'"
-112 "ÛÉÒÉÎÁ ÔÅËÓÔÁ: "
-113 "äÅÊÓÔ×ÕÅÔ ÓÔÒÏÇÉÊ ÒÅÖÉÍ: ÎÅ ÉÍÅÀ ÐÒÁ×Á ×ÙÐÏÌÎÑÔØ ÜÔÕ ÏÐÅÒÁÃÉÀ"
-114 " äá"
-115 "îåô"
-116 "HELP"
-117 "WRITE"
-118 "READ"
-119 "LINE"
-120 "FILE"
-121 "CHARACTER"
-122 "REDRAW"
-123 "RESEQUENCE"
-124 "AUTHOR"
-125 "VERSION"
-126 "CASE"
-127 "NOCASE"
-128 "EXPAND"
-129 "NOEXPAND"
-130 "EXIT"
-131 "QUIT"
-132 "INFO"
-133 "NOINFO"
-134 "MARGINS"
-135 "NOMARGINS"
-136 "AUTOFORMAT"
-137 "NOAUTOFORMAT"
-138 "ECHO"
-139 "PRINTCOMMAND"
-140 "RIGHTMARGIN"
-141 "HIGHLIGHT"
-142 "NOHIGHLIGHT"
-143 "EIGHTBIT"
-144 "NOEIGHTBIT"
-145 "ËÌÁ×ÉÛÙ ËÁË × Emacs "
-146 "^a × ÎÁÞÁÌÏ ÓÔÒÏËÉ ^i ÔÁÂÕÌÑÃÉÑ ^r ×ÅÒÎÕÔØ ÓÌÏ×Ï "
-147 "^b ×ÌÅ×Ï ^j ×ÅÒÎÕÔØ ÓÉÍ×ÏÌ ^t × ÓÁÍÙÊ ×ÅÒÈ "
-148 "^c ËÏÍÁÎÄÁ ^k ÕÄÁÌÉÔØ ÓÔÒÏËÕ ^u × ÓÁÍÙÊ ÎÉÚ "
-149 "^d ÕÄÁÌÉÔØ ÓÉÍ×ÏÌ ^l ×ÅÒÎÕÔØ ÓÔÒÏËÕ ^v ÓÌÅÄÕÀÝÁÑ ÓÔÒÁÎÉÃÁ "
-150 "^e × ËÏÎÅà ÓÔÒÏËÉ ^m ÎÏ×ÁÑ ÓÔÒÏËÁ ^w ÕÄÁÌÉÔØ ÓÌÏ×Ï "
-151 "^f ×ÐÒÁ×Ï ^n ×ÎÉÚ ^x ÐÏ×ÔÏÒ ÐÏÉÓËÁ "
-152 "^g ÐÒÅÄ. ÓÔÒÁÎÉÃÁ ^o ÓÉÍ×ÏÌ ÐÏ ascii-ËÏÄÕ ^y ÐÏÉÓË... "
-153 "^h ÚÁÂÏÊ ^p ××ÅÒÈ ^z ÓÌÅÄÕÀÝÅÅ ÓÌÏ×Ï "
-154 "^[ (Esc) ÍÅÎÀ ^y ÐÏÉÓË... ^k ÕÄÁÌÉÔØ ÓÔÒÏËÕ ^p ××ÅÒÈ ^g ÐÒÅÄ. ÓÔÒ."
-155 "^o ascii-ËÏÄ ^x ÐÏ×ÔÏÒ ÐÏÉÓËÁ ^l ×ÅÒÎÕÔØ ÓÔÒÏËÕ ^n ×ÎÉÚ ^v ÓÌÅÄ. ÓÔÒ."
-156 "^u × ÓÁÍÙÊ ÎÉÚ ^a × ÎÁÞÁÌÏ ÓÔÒÏËÉ ^w ÕÄÁÌÉÔØ ÓÌÏ×Ï ^b ×ÌÅ×Ï "
-157 "^t × ÓÁÍÙÊ ×ÅÒÈ ^e × ËÏÎÅà ÓÔÒÏËÉ ^r ×ÅÒÎÕÔØ ÓÌÏ×Ï ^f ×ÐÒÁ×Ï "
-158 "^c ËÏÍÁÎÄÁ ^d ÕÄÁÌÉÔØ ÓÉÍ×ÏÌ ^j ×ÅÒÎÕÔØ ÓÉÍ×ÏÌ ^z ÓÌÅÄÕÀÝÅÅ ÓÌÏ×Ï "
-159 "EMACS"
-160 "NOEMACS"
-161 " +# ÐÅÒÅÊÔÉ Ë ÓÔÒÏËÅ #\n"
-162 "ÎÅ ÍÏÇÕ ÓÏÈÒÁÎÉÔØ ÕÓÔÁÎÏ×ËÉ ÐÁÒÁÍÅÔÒÏ× × ÆÁÊÌ .init.ee!"
-163 "ÐÁÒÁÍÅÔÒÙ 'ee' ÓÏÈÒÁÎÅÎÙ × ÆÁÊÌÅ %s"
-164 "ÓÏÈÒÁÎÉÔØ ÕÓÔÁÎÏ×ËÉ"
-165 "õÓÔÁÎÏ×ËÉ ÐÁÒÁÍÅÔÒÏ× 'ee'"
-166 "ÓÏÈÒÁÎÉÔØ × ÔÅËÕÝÅÍ ËÁÔÁÌÏÇÅ"
-167 "ÓÏÈÒÁÎÉÔØ × ÄÏÍÁÛÎÅÍ ËÁÔÁÌÏÇÅ"
-168 "ÕÓÔÁÎÏ×ËÉ ÐÁÒÁÍÅÔÒÏ× 'ee' ÎÅ ÓÏÈÒÁÎÅÎÙ"
-169 "ÐÒÉ ÚÁÐÕÓËÅ 'ree' ÎÅÏÂÈÏÄÉÍÏ ÕËÁÚÁÔØ ÆÁÊÌ ÄÌÑ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ"
-180 "ÓÌÉÛËÏÍ ÂÏÌØÛÏÅ ÍÅÎÀ - ÎÅ ÐÏÍÅÝÁÅÔÓÑ × ÜËÒÁÎ"
-181 "^^ÄÁÌØÛÅ^^"
-182 "VVÄÁÌØÛÅVV"
-183 "16-ÂÉÔÎÙÅ ÓÉÍ×ÏÌÙ "
-184 "16BIT"
-185 "NO16BIT"
diff --git a/usr.bin/ee/nls/uk_UA.KOI8-U/ee.msg b/usr.bin/ee/nls/uk_UA.KOI8-U/ee.msg
deleted file mode 100644
index 1556d91..0000000
--- a/usr.bin/ee/nls/uk_UA.KOI8-U/ee.msg
+++ /dev/null
@@ -1,185 +0,0 @@
-$ This file contains the messages for ee ("easy editor"). See the file
-$ ee.i18n.guide for more information
-$
-$ For ee patchlevel 3
-$
-$ $FreeBSD$
-$
-$
-$set 1
-$quote "
-1 "ÍÅÎÀ ÒÅÖÉͦ×"
-2 "ÔÁÂÕÌÑæÑ->ÐÒϦÌÉ "
-3 "ÒÅ­¦ÓÔÒÏ-ÚÁÌÅÖÎÉÊ ÐÏÛÕË "
-4 "Á×ÔÏ-ÐÅÒÅ×ÅÄÅÎÎÑ ÒÑÄËÕ "
-5 "Á×ÔÏ-ÆÏÒÍÁÔ ÐÁÒÁÇÒÁÆÕ "
-6 "8-¦ÔΦ ÓÉÍ×ÏÌÉ "
-7 "¦ÎÆÏÒÍÁæÊΊצËÎÏ "
-8 "ÐÒÁ×Á ÍÅÖÁ "
-9 "ÍÅÎÀ ×ÉÈÏÄÕ"
-10 "ÚÂÅÒÅÇÔÉ ÚͦÎÉ"
-11 "ÎÅ ÚÂÅÒ¦ÇÁÔÉ"
-12 "ÆÁÊÌÏ×Å ÍÅÎÀ"
-13 "ÐÒÏÞÉÔÁÔÉ ÆÁÊÌ"
-14 "ÚÁÐÉÓÁÔÉ ÆÁÊÌ"
-15 "ÚÂÅÒÅÇÔÉ ÆÁÊÌ"
-16 "ÒÏÚÄÒÕËÕ×ÁÔÉ ×ͦÓÔ ÒÅÄÁËÔÏÒÁ"
-17 "ÍÅÎÀ ÐÏÛÕËÕ"
-18 "ÝÏ ÛÕËÁÔÉ..."
-19 "ÐÏÛÕË"
-20 "íÅÎÀ ÐÅÒÅצÒËÉ ÐÒÁ×ÏÐÉÓÕ"
-21 "×ÉËÏÒÉÓÔÕ×Õ×ÁÔÉ 'spell'"
-22 "×ÉËÏÒÉÓÔÕ×Õ×ÁÔÉ 'ispell'"
-23 "Ò¦ÚÎÅ..."
-24 "ÆÏÒÍÁÔÕ×ÁÎÎÑ ÐÁÒÁÇÒÁÆÕ"
-25 "ËÏÍÁÎÄÁ ÏÂÏÌÏÎËÉ"
-26 "ÐÅÒÅצÒËÁ ÐÒÁ×ÏÐÉÓÕ"
-27 "ÇÏÌÏ×ÎÅ ÍÅÎÀ"
-28 "×ÉÊÔÉ Ú ÒÅÄÁËÔÏÒÕ"
-29 "ÄÏצÄËÁ"
-30 "ÏÐÅÒÁæ§ Ú ÆÁÊÌÁÍÉ"
-31 "ÏÎÏ×ÉÔÉ ÅËÒÁÎ"
-32 "ËÏÎƦÇÕÒÁæÑ"
-33 "ÐÏÛÕË"
-34 "Ò¦ÚÎÅ"
-35 "ëÌÁצۦ ËÅÒÕ×ÁÎÎÑ: "
-36 "^a ascii-ËÏÄ ^i ÔÁÂÕÌÑÃ¦Ñ ^r ×ÐÒÁ×Ï "
-37 "^b ÎÉÚ ÔÅËÓÔÕ ^j ÎÏ×ÉÊ ÒÑÄÏË ^t ×ÅÒÈ ÔÅËÓÔÕ "
-38 "^c ËÏÍÁÎÄÁ ^k ÓÔÅÒÔÉ ÓÉÍ×ÏÌ ^u ××ÅÒÈ "
-39 "^d ×ÎÉÚ ^l ×̦×Ï ^v צÄÎÏ×ÉÔÉ ÓÌÏ×Ï "
-40 "^e ÝÏ ÛÕËÁÔÉ... ^m ÎÏ×ÉÊ ÒÑÄÏË ^w ÓÔÅÒÔÉ ÓÌÏ×Ï "
-41 "^f צÄÎÏ×ÉÔÉ ÓÉÍ×ÏÌ ^n ÎÁÓÔÕÐÎÁ ÓÔÏÒ¦ÎËÁ ^x ÛÕËÁÔÉ "
-42 "^g ÐÏÞÁÔÏË ÒÑÄËÕ ^o ˦ÎÅÃØ ÒÑÄËÕ ^y ÓÔÅÒÔÉ ÒÑÄÏË "
-43 "^h ÚÁÔÅÒÔÉ ^p ÐÏÐÅÒÅÄÎÑ ÓÔÏÒ¦ÎËÁ ^z צÄÎÏ×ÉÔÉ ÒÑÄÏË "
-44 "^[ (escape) ÍÅÎÀ ESC-Enter: ×ÉÊÔÉ Ú ee "
-45 " "
-46 "ëÏÍÁÎÄÉ: "
-47 "help : ÃÑ ÄÏצÄËÁ file : ÐÏËÁÚÁÔÉ ¦Í'Ñ ÆÁÊÌÕ "
-48 "read : ÐÒÏÞÉÔÁÔÉ ÆÁÊÌ char : ascii-ËÏÄ ÓÉÍ×ÏÌÕ "
-49 "write : ÚÁÐÉÓÁÔÉ ÆÁÊÌ case : ÒÅ­¦ÓÔÒÏ-ÚÁÌÅÖÎÉÊ ÐÏÛÕË "
-50 "exit : ÚÂÅÒÅÇÔÉ +×ÉÈ¦Ä nocase : ÒÅ­¦ÓÔÒÏ-ÎÅÚÁÌÅÖÎÉÊ ÐÏÛÕË"
-51 "quit : ×ÉÊÔÉ ÂÅÚ ÚͦΠ!ËÏÍÁÎÄÁ: ×ÉËÏÎÁÔÉ ËÏÍÁÎÄÕ ÏÂÏÌÏÎËÉ "
-52 "line : ÐÏËÁÚÁÔÉ ÎÏÍÅÒ ÒÑÄËÕ 0-9 : ÐÅÒÅÊÔÉ ÄÏ ÒÑÄËÕ "
-53 "expand : ÒÏÚÛÉÒÀ×ÁÔÉ ÔÁÂÕÌÑæÀ noexpand: ÎÅ ÒÏÚÛÉÒÀ×ÁÔÉ ÔÁÂÕÌÑæÀ "
-54 " "
-55 " ee [+#] [-i] [-e] [-h] [ÆÁÊÌ(É)] "
-56 "+# ËÕÒÓÏÒ ÎÁ ÒÑÄÏË -i:ÂÅÚ ¦ÎÆÏ-צËÎÁ -e:ÎÅ ÒÏÚÛÉÒÀ×ÁÔÉ ôáâÉ -h:ÂÅÚ Ð¦ÄÓצÔËÉ"
-57 "^[ (ESC) ÍÅÎÀ ^e ÝÏ ÛÕËÁÔÉ... ^y ÓÔÅÒÔÉ ÒÑÄÏË ^u ××ÅÒÈ ^p -ÓÔÏÒ¦ÎËÁ "
-58 "^a ascii-ËÏÄ ^x ÐÏÛÕË ^z צÄÎÏ×. ÒÑÄÏË ^d ×ÎÉÚ ^n +ÓÔÏÒ¦ÎËÁ "
-59 "^b ÎÉÚ ÔÅËÓÔÕ ^g ÐÏÞÁÔÏË ÒÑÄËÕ ^w ÓÔÅÒÔÉ ÓÌÏ×Ï ^l ×̦×Ï "
-60 "^t ×ÅÒÈ ÔÅËÓÔÕ ^o ˦ÎÅÃØ ÒÑÄËÕ ^v צÄÎÏ×. ÓÌÏ×Ï ^r ×ÐÒÁ×Ï "
-61 "^c ËÏÍÁÎÄÁ ^k ÓÔÅÒÔÉ ÓÉÍ×ÏÌ ^f צÄÎÏ×ÉÔÉ ÓÉÍ×ÏÌ ESC-Enter: ×ÉÊÔÉ Ú ee"
-62 "help : ÄÏצÄËÁ |file : ÐÏËÁÚÁÔÉ ¦'ÍÑ ÆÁÊÌÕ |line : ÎÏÍÅÒ ÒÑÄËÕ "
-63 "read : ÐÒÏÞÉÔÁÔÉ ÆÁÊÌ |char : ascii-ËÏÄ ÓÉÍ×ÏÌÕ |0-9 : ÐÅÒÅÊÔÉ ÄÏ ÒÑÄËÕ"
-64 "write: ÚÁÐÉÓÁÔÉ ÆÁÊÌ |case : ÒÅ­¦ÓÔÒÏ-ÚÁÌÅÖÎÉÊ ÐÏÛÕË |exit : ÚÂÅÒÅÇÔÉ +×ÉȦÄ"
-65 "!ËÍÄ : ÚÏ×Î. ËÏÍÁÎÄÁ |nocase: ÒÅ­¦ÓÔÒÏ-ÎÅÚÁÌ. ÐÏÛÕË |quit : ×ÉÊÔÉ ÂÅÚ ÚͦÎ"
-66 "expand: ÒÏÚÛÉÒÀ×ÁÔÉ |noexpand: ÎÅ ÒÏÚÛÉÒÀ×ÁÔÉ ôáâÉ × ÐÒϦÌÉ "
-67 " ÎÁÔÉÓΦÔØ Esc (^[) ÝÏ ×ÉËÌÉËÁÔÉ ÍÅÎÀ"
-68 "ÎÅÍÁ¤ ÆÁÊÌÕ"
-69 "ascii-ËÏÄ: "
-70 "צÄÓÉÌÁÎÎÑ ×ͦÓÔÕ ÂÕÆÅÒÕ ÄÏ \"%s\" "
-71 "ËÏÍÁÎÄÁ: "
-72 "¦Í'Ñ ÆÁÊÌÕ ÄÌÑ ÚÁÐÉÓÕ: "
-73 "¦Í'Ñ ÆÁÊÌÕ ÄÌÑ ÞÉÔÁÎÎÑ: "
-74 "ÓÉÍ×ÏÌ = %d"
-75 "ÎÅצÄÏÍÁ ËÏÍÁÎÄÁ \"%s\""
-76 "ÃÑ ËÏÍÁÎÄÁ ÎÅ ÕΦËÁÌØÎÁ"
-77 "ÒÑÄÏË %d "
-78 "ÄÏ×ÖÉÎÁ = %d"
-79 "ÐÏÔÏÞÎÉÊ ÆÁÊÌ: \"%s\" "
-80 "÷ÉËÏÒÉÓÔÁÎÎÑ: %s [-i] [-e] [-h] [+ÎÏÍÅÒ_ÒÑÄËÕ] [ÆÁÊÌ(É)]\n"
-81 " -i ÎÅ ÐÏËÁÚÕ×ÁÔÉ ¦ÎÆÏÒÍÁæÊΊצËÎÏ\n"
-82 " -e ÎÅ ÐÅÒÅÔ×ÏÒÀ×ÁÔÉ ÔÁÂÕÌÑæÀ × ÐÒϦÌÉ\n"
-83 " -h ÎÅ ×ÉËÏÒÉÓÔÏ×Õ×ÁÔÉ Ð¦ÄÓצÔËÕ\n"
-84 " ÆÁÊÌ \"%s\" - ÎÁÓÐÒÁ×Ħ ËÁÔÁÌÏÇ"
-85 "ÎÏ×ÉÊ ÆÁÊÌ \"%s\""
-86 "ÎÅ ÍÏÖÕ ×¦ÄËÒÉÔÉ \"%s\""
-87 "ÆÁÊÌ \"%s\", ÒÑÄ˦×: %d"
-88 "ÆÁÊÌ \"%s\" ÐÒÏÞÉÔÁÎÏ"
-89 "ÞÉÔÁÎÎÑ ÆÁÊÌÕ \"%s\""
-90 ", ÔiÌØËu ÄÌÑ ÞÉÔÁÎÎÑ"
-91 "ÆÁÊÌ \"%s\", ÒÑÄ˦×: %d"
-92 "××ÅĦÔØ ¦Í'Ñ ÆÁÊÌÕ: "
-93 "¦Í'Ñ ÆÁÊÌÕ ÎÅ ÚÁÄÁÎÏ: ÆÁÊÌ ÎÅ ÚÁÐÉÓÁÎÏ "
-94 "×ÎÅÓÅÎÏ ÚͦÎÉ, ×É ×ÐÅ×ÎÅΦ? (y/n [n]) "
-95 "y"
-96 "ÆÁÊÌ ×ÖÅ ¦ÓÎÕ¤, ÐÅÒÅÚÁÐÉÓÁÔÉ? (y/n) [n] "
-97 "ÎÅ ÍÏÖÕ ÓÔ×ÏÒÉÔÉ ÆÁÊÌ \"%s\""
-98 "ÚÁÐÉÓ ÆÁÊÌÕ \"%s\""
-99 "\"%s\", ÒÑÄ˦×: %d, ÓÉÍ×Ï̦×: %d"
-100 " ...ÐÏÛÕË"
-101 "ÒÑÄÏË \"%s\" ÎÅ ÚÎÁÊÄÅÎÏ"
-102 "ÝÏ ÛÕËÁÔÉ: "
-103 "ÎÅ ÍÏÖÕ ×ÉËÏÎÁÔÉ %s"
-104 "ÎÁÔÉÓΦÔØ <enter> ÄÌÑ ÐÒÏÄÏ×ÖÅÎÎÑ..."
-105 "Esc - צÄͦÎÁ"
-106 "ÍÅÎÀ ÚÁ×ÅÌÉËÅ ÄÌÑ ÅËÒÁÎÕ"
-107 "ÎÁÔÉÓΦÔØ ÂÕÄØ-ÑËÕ ËÌÁצÛÕ ÄÌÑ ÐÒÏÄÏ×ÖÅÎÎÑ..."
-108 "ËÏÍÁÎÄÁ ÏÂÏÌÏÎËÉ: "
-109 "...ÆÏÒÍÁÔÕÀ ÐÁÒÁÇÒÁÆ..."
-110 "<!echo 'ÓÐÉÓÏË ÎÅÒÏÚЦÚÎÁÎÉÈ Ó̦×'; echo -=-=-=-=-=-"
-111 "צÄÓÉÌÁÎÎÑ ×ͦÓÔÕ ÂÕÆÅÒÕ ÄÏ 'spell'"
-112 "ÐÒÁ×Á ÍÅÖÁ: "
-113 "ïÂÍÅÖÅÎÉÊ ÒÅÖÉÍ: ÎÅ ÍÏÖÕ ×ÉËÏÎÁÔÉ ÃÀ ÏÐÅÒÁæÀ"
-114 "ON"
-115 "OFF"
-116 "HELP"
-117 "WRITE"
-118 "READ"
-119 "LINE"
-120 "FILE"
-121 "CHARACTER"
-122 "REDRAW"
-123 "RESEQUENCE"
-124 "AUTHOR"
-125 "VERSION"
-126 "CASE"
-127 "NOCASE"
-128 "EXPAND"
-129 "NOEXPAND"
-130 "EXIT"
-131 "QUIT"
-132 "INFO"
-133 "NOINFO"
-134 "MARGINS"
-135 "NOMARGINS"
-136 "AUTOFORMAT"
-137 "NOAUTOFORMAT"
-138 "ECHO"
-139 "PRINTCOMMAND"
-140 "RIGHTMARGIN"
-141 "HIGHLIGHT"
-142 "NOHIGHLIGHT"
-143 "EIGHTBIT"
-144 "NOEIGHTBIT"
-145 "ÐÒÉ×'ÑÚËÁ ËÌÁ×¦Û Emacs "
-146 "^a ÐÏÞÁÔÏË ÒÑÄËÕ ^i ÔÁÂÕÌÑÃ¦Ñ ^r צÄÎÏ×ÉÔÉ ÓÌÏ×Ï "
-147 "^b ÎÁÚÁÄ 1 ÓÉÍ×ÏÌ ^j צÄÎÏ×ÉÔÉ ÓÉÍ×ÏÌ ^t ÐÏÞÁÔÏË ÆÁÊÌÕ "
-148 "^c ËÏÍÁÎÄÁ ^k ÓÔÅÒÔÉ ÒÑÄÏË ^u ˦ÎÅÃØ ÆÁÊÌÕ "
-149 "^d ÓÔÅÒÔÉ ÓÉÍ×ÏÌ ^l צÄÎÏ×ÉÔÉ ÓÉÍ×ÏÌ ^v ÎÁÓÔÕÐÎÁ ÓÔÏÒ¦ÎËÁ "
-150 "^e ˦ÎÅÃØ ÒÑÄËÕ ^m ÎÏ×ÉÊ ÒÑÄÏË ^w ÓÔÅÒÔÉ ÓÌÏ×Ï "
-151 "^f ×ÐÅÒÅÄ 1 ÓÉÍ×ÏÌ ^n ÎÁÓÔÕÐÎÉÊ ÒÑÄÏË ^x ÐÏÛÕË "
-152 "^g ÎÁÚÁÄ 1 ÓÔÏÒ¦ÎËÕ ^o ×ÓÔÁ×ÉÔÉ ASCII ^y ÝÏ ÛÕËÁÔÉ... "
-153 "^h ÚÁÔÅÒÔÉ ^p ÐÏÐÅÒÅÄÎ¦Ê ÒÑÄÏË ^z ÎÁÓÔÕÐÎÅ ÓÌÏ×Ï "
-154 "^[ (ESC) ÍÅÎÀ ^y ÝÏ ÛÕËÁÔÉ ^k ÓÔÅÒÔÉ ÒÑÄÏË ^p -ÒÑÄÏË ^g -ÓÔÏÒ¦ÎËÁ"
-155 "^o ascii-ËÏÄ ^x ÐÏÛÕË ^l צÄÎÏ×. ÒÑÄÏË ^n +ÒÑÄÏË ^v +ÓÔÏÒ¦ÎËÁ"
-156 "^u ˦ÎÅÃØ ÆÁÊÌÕ ^a ÐÏÞÁÔÏË ÒÑÄËÕ ^w ÓÔÅÒÔÉ ÓÌÏ×Ï ^b ÎÁÚÁÄ 1 ÓÉÍ×ÏÌ "
-157 "^t ÐÏÞÁÔÏË ÆÁÊÌÕ ^e ˦ÎÅÃØ ÒÑÄËÕ ^r צÄÎÏ×. ÓÌÏ×Ï ^f ×ÐÅÒÅÄ 1 ÓÉÍ×ÏÌ "
-158 "^c ËÏÍÁÎÄÁ ^d ÓÔÅÒÔÉ ÓÉÍ×ÏÌ ^j צÄÎ. ÓÉÍ×ÏÌ ^z ÎÁÓÔÕÐÎÅ ÓÌÏ×Ï "
-159 "EMACS"
-160 "NOEMACS"
-161 " +# ÐÏÓÔÁ×ÉÔÉ ËÕÒÓÏÒ × ÒÑÄÏË Ú ÎÏÍÅÒÏÍ\n"
-162 "ÎÅ ÍÏÖÕ ×¦ÄËÒÉÔÉ .init.ee ÄÌÑ ÚÁÐÉÓÕ, ËÏÎƦÇÕÒÁæÀ Îe ÚÁÐÉÓÁÎÏ!"
-163 "ËÏÎƦÇÕÒÁæÀ ee ÚÁÐÉÓÁÎÏ Õ ÆÁÊÌ %s"
-164 "ÚÂÅÒÅÇÔÉ ËÏÎƦÇÕÒÁæÀ "
-165 "ÚÂÅÒÅÇÔÉ ËÏÎƦÇÕÒÁæÀ ee"
-166 "ÚÂÅÒÅÇÔÉ × ÐÏÔÏÞÎÏÍÕ ËÁÔÁÌÏÚ¦"
-167 "ÚÂÅÒÅÇÔÉ × ÄÏÍÁÛÎØÏÍÕ ËÁÔÁÌÏÚ¦"
-168 "ËÏÎƦÇÕÒÁæÀ ee Îe ÚÁÐÉÓÁÎÏ"
-169 "Ð¦Ä ÞÁÓ ÚÁÐÕÓËÕ ree ÓÌ¦Ä ×ËÁÚÕ×ÁÔÉ ¦Í'Ñ ÆÁÊÌÕ"
-180 "ÍÅÎÀ ÚÁ×ÅÌÉËÅ ÄÌÑ ÅËÒÁÎÕ"
-181 "^^ÄÁ̦^^"
-182 "VVÄÁ̦VV"
-183 "16-¦ÔÏצ ÓÉÍ×ÏÌÉ "
-184 "16â¶ô"
-185 "ÎÅ16â¶ô"
diff --git a/usr.bin/elf2aout/Makefile b/usr.bin/elf2aout/Makefile
deleted file mode 100644
index 92bb6598..0000000
--- a/usr.bin/elf2aout/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# $FreeBSD$
-
-PROG= elf2aout
-NO_MAN=
-NO_WERROR=
-WARNS?= 5
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/elf2aout/elf2aout.c b/usr.bin/elf2aout/elf2aout.c
deleted file mode 100644
index 4168f4e..0000000
--- a/usr.bin/elf2aout/elf2aout.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/*-
- * Copyright (c) 2002 Jake Burkholder
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/elf64.h>
-#include <sys/endian.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <fcntl.h>
-#include <string.h>
-#include <unistd.h>
-
-#define xe16toh(x) ((data == ELFDATA2MSB) ? be16toh(x) : le16toh(x))
-#define xe32toh(x) ((data == ELFDATA2MSB) ? be32toh(x) : le32toh(x))
-#define xe64toh(x) ((data == ELFDATA2MSB) ? be64toh(x) : le64toh(x))
-#define htoxe32(x) ((data == ELFDATA2MSB) ? htobe32(x) : htole32(x))
-
-struct exec {
- u_int32_t a_magic;
- u_int32_t a_text;
- u_int32_t a_data;
- u_int32_t a_bss;
- u_int32_t a_syms;
- u_int32_t a_entry;
- u_int32_t a_trsize;
- u_int32_t a_drsize;
-};
-#define A_MAGIC 0x01030107
-
-static void usage(void);
-
-/*
- * elf to a.out converter for freebsd/sparc64 bootblocks.
- */
-int
-main(int ac, char **av)
-{
- Elf64_Half phentsize;
- Elf64_Half machine;
- Elf64_Half phnum;
- Elf64_Xword filesz;
- Elf64_Xword memsz;
- Elf64_Addr entry;
- Elf64_Off offset;
- Elf64_Off phoff;
- Elf64_Word type;
- unsigned char data;
- struct stat sb;
- struct exec a;
- Elf64_Phdr *p;
- Elf64_Ehdr *e;
- void *v;
- int efd;
- int fd;
- int c;
- int i;
-
- fd = STDIN_FILENO;
- while ((c = getopt(ac, av, "o:")) != -1)
- switch (c) {
- case 'o':
- if ((fd = open(optarg, O_CREAT|O_RDWR, 0644)) < 0)
- err(1, "%s", optarg);
- break;
- case '?':
- default:
- usage();
- }
- ac -= optind;
- av += optind;
- if (ac == 0)
- usage();
-
- if ((efd = open(*av, O_RDONLY)) < 0 || fstat(efd, &sb) < 0)
- err(1, NULL);
- v = mmap(NULL, sb.st_size, PROT_READ, MAP_SHARED, efd, 0);
- if ((e = v) == MAP_FAILED)
- err(1, NULL);
-
- if (!IS_ELF(*e))
- errx(1, "not an elf file");
- if (e->e_ident[EI_CLASS] != ELFCLASS64)
- errx(1, "wrong class");
- data = e->e_ident[EI_DATA];
- if (data != ELFDATA2MSB && data != ELFDATA2LSB)
- errx(1, "wrong data format");
- if (e->e_ident[EI_VERSION] != EV_CURRENT)
- errx(1, "wrong elf version");
- machine = xe16toh(e->e_machine);
- if (machine != EM_SPARCV9 && machine != EM_ALPHA)
- errx(1, "wrong machine type");
- phentsize = xe16toh(e->e_phentsize);
- if (phentsize != sizeof(*p))
- errx(1, "phdr size mismatch");
-
- entry = xe64toh(e->e_entry);
- phoff = xe64toh(e->e_phoff);
- phnum = xe16toh(e->e_phnum);
- p = (Elf64_Phdr *)((char *)e + phoff);
- bzero(&a, sizeof(a));
- for (i = 0; i < phnum; i++) {
- type = xe32toh(p[i].p_type);
- switch (type) {
- case PT_LOAD:
- if (a.a_magic != 0)
- errx(1, "too many loadable segments");
- filesz = xe64toh(p[i].p_filesz);
- memsz = xe64toh(p[i].p_memsz);
- offset = xe64toh(p[i].p_offset);
- a.a_magic = htoxe32(A_MAGIC);
- a.a_text = htoxe32(filesz);
- a.a_bss = htoxe32(memsz - filesz);
- a.a_entry = htoxe32(entry);
- if (write(fd, &a, sizeof(a)) != sizeof(a) ||
- write(fd, (char *)e + offset, filesz) != (ssize_t)filesz)
- err(1, NULL);
- break;
- default:
- break;
- }
- }
-
- return (0);
-}
-
-static void
-usage(void)
-{
-
- errx(1, "usage: elf2aout [-o outfile] infile");
-}
diff --git a/usr.bin/elfdump/Makefile b/usr.bin/elfdump/Makefile
deleted file mode 100644
index 95ce514..0000000
--- a/usr.bin/elfdump/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# $FreeBSD$
-
-PROG= elfdump
-WARNS?= 5
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/elfdump/elfdump.1 b/usr.bin/elfdump/elfdump.1
deleted file mode 100644
index 1902e41..0000000
--- a/usr.bin/elfdump/elfdump.1
+++ /dev/null
@@ -1,112 +0,0 @@
-.\" Copyright (c) 2003 David O'Brien
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd January 15, 2003
-.Dt ELFDUMP 1
-.Os
-.Sh NAME
-.Nm elfdump
-.Nd "display information about"
-.Tn ELF
-files
-.Sh SYNOPSIS
-.Nm
-.Fl a | cdeGhinprs
-.Op Fl w Ar file
-.Ar file
-.Sh DESCRIPTION
-The
-.Nm
-utility
-dumps various information about the specified
-.Tn ELF
-.Ar file .
-.Pp
-The options are as follows:
-.Bl -tag -width ".Fl w Ar file"
-.It Fl a
-Dump all information.
-.It Fl c
-Dump shared headers.
-.It Fl d
-Dump dynamic symbols.
-.It Fl e
-Dump ELF header.
-.It Fl G
-Dump the GOT.
-.It Fl h
-Dump the hash values.
-.It Fl i
-Dump the dynamic interpreter.
-.It Fl n
-Dump note sections.
-.It Fl p
-Dump the program header.
-.It Fl r
-Dump relocations.
-.It Fl s
-Dump the symbol table.
-.It Fl w Ar file
-Write output to a
-.Ar file
-instead of the standard output.
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh EXAMPLES
-The following is an example of a typical usage
-of the
-.Nm
-command:
-.Pp
-.Dl "elfdump -a -w output /bin/ls"
-.Sh SEE ALSO
-.Xr objdump 1 ,
-.Xr readelf 1
-.Rs
-.%A "AT&T Unix Systems Labs"
-.%T "System V Application Binary Interface"
-.%O http://www.sco.com/developers/gabi/
-.Re
-.Sh HISTORY
-The
-.Nm
-utility first appeared in
-.Fx 5.0 .
-.Sh AUTHORS
-.An -nosplit
-The
-.Nm
-utility
-was written by
-.An Jake Burkholder Aq jake@FreeBSD.org .
-This
-manual page was written by
-.An David O'Brien Aq obrien@FreeBSD.org .
-.Sh BUGS
-Does not fully implement the
-.Tn ELF
-gABI.
diff --git a/usr.bin/elfdump/elfdump.c b/usr.bin/elfdump/elfdump.c
deleted file mode 100644
index 2ddfc85..0000000
--- a/usr.bin/elfdump/elfdump.c
+++ /dev/null
@@ -1,1110 +0,0 @@
-/*-
- * Copyright (c) 2003 David O'Brien. All rights reserved.
- * Copyright (c) 2001 Jake Burkholder
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/elf32.h>
-#include <sys/elf64.h>
-#include <sys/endian.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <err.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#define ED_DYN (1<<0)
-#define ED_EHDR (1<<1)
-#define ED_GOT (1<<2)
-#define ED_HASH (1<<3)
-#define ED_INTERP (1<<4)
-#define ED_NOTE (1<<5)
-#define ED_PHDR (1<<6)
-#define ED_REL (1<<7)
-#define ED_SHDR (1<<8)
-#define ED_SYMTAB (1<<9)
-#define ED_ALL ((1<<10)-1)
-
-#define elf_get_addr elf_get_quad
-#define elf_get_off elf_get_quad
-#define elf_get_size elf_get_quad
-
-enum elf_member {
- D_TAG = 1, D_PTR, D_VAL,
-
- E_CLASS, E_DATA, E_OSABI, E_TYPE, E_MACHINE, E_VERSION, E_ENTRY,
- E_PHOFF, E_SHOFF, E_FLAGS, E_EHSIZE, E_PHENTSIZE, E_PHNUM, E_SHENTSIZE,
- E_SHNUM, E_SHSTRNDX,
-
- N_NAMESZ, N_DESCSZ, N_TYPE,
-
- P_TYPE, P_OFFSET, P_VADDR, P_PADDR, P_FILESZ, P_MEMSZ, P_FLAGS,
- P_ALIGN,
-
- SH_NAME, SH_TYPE, SH_FLAGS, SH_ADDR, SH_OFFSET, SH_SIZE, SH_LINK,
- SH_INFO, SH_ADDRALIGN, SH_ENTSIZE,
-
- ST_NAME, ST_VALUE, ST_SIZE, ST_INFO, ST_SHNDX,
-
- R_OFFSET, R_INFO,
-
- RA_OFFSET, RA_INFO, RA_ADDEND
-};
-
-typedef enum elf_member elf_member_t;
-
-int elf32_offsets[] = {
- 0,
-
- offsetof(Elf32_Dyn, d_tag), offsetof(Elf32_Dyn, d_un.d_ptr),
- offsetof(Elf32_Dyn, d_un.d_val),
-
- offsetof(Elf32_Ehdr, e_ident[EI_CLASS]),
- offsetof(Elf32_Ehdr, e_ident[EI_DATA]),
- offsetof(Elf32_Ehdr, e_ident[EI_OSABI]),
- offsetof(Elf32_Ehdr, e_type), offsetof(Elf32_Ehdr, e_machine),
- offsetof(Elf32_Ehdr, e_version), offsetof(Elf32_Ehdr, e_entry),
- offsetof(Elf32_Ehdr, e_phoff), offsetof(Elf32_Ehdr, e_shoff),
- offsetof(Elf32_Ehdr, e_flags), offsetof(Elf32_Ehdr, e_ehsize),
- offsetof(Elf32_Ehdr, e_phentsize), offsetof(Elf32_Ehdr, e_phnum),
- offsetof(Elf32_Ehdr, e_shentsize), offsetof(Elf32_Ehdr, e_shnum),
- offsetof(Elf32_Ehdr, e_shstrndx),
-
- offsetof(Elf_Note, n_namesz), offsetof(Elf_Note, n_descsz),
- offsetof(Elf_Note, n_type),
-
- offsetof(Elf32_Phdr, p_type), offsetof(Elf32_Phdr, p_offset),
- offsetof(Elf32_Phdr, p_vaddr), offsetof(Elf32_Phdr, p_paddr),
- offsetof(Elf32_Phdr, p_filesz), offsetof(Elf32_Phdr, p_memsz),
- offsetof(Elf32_Phdr, p_flags), offsetof(Elf32_Phdr, p_align),
-
- offsetof(Elf32_Shdr, sh_name), offsetof(Elf32_Shdr, sh_type),
- offsetof(Elf32_Shdr, sh_flags), offsetof(Elf32_Shdr, sh_addr),
- offsetof(Elf32_Shdr, sh_offset), offsetof(Elf32_Shdr, sh_size),
- offsetof(Elf32_Shdr, sh_link), offsetof(Elf32_Shdr, sh_info),
- offsetof(Elf32_Shdr, sh_addralign), offsetof(Elf32_Shdr, sh_entsize),
-
- offsetof(Elf32_Sym, st_name), offsetof(Elf32_Sym, st_value),
- offsetof(Elf32_Sym, st_size), offsetof(Elf32_Sym, st_info),
- offsetof(Elf32_Sym, st_shndx),
-
- offsetof(Elf32_Rel, r_offset), offsetof(Elf32_Rel, r_info),
-
- offsetof(Elf32_Rela, r_offset), offsetof(Elf32_Rela, r_info),
- offsetof(Elf32_Rela, r_addend)
-};
-
-int elf64_offsets[] = {
- 0,
-
- offsetof(Elf64_Dyn, d_tag), offsetof(Elf64_Dyn, d_un.d_ptr),
- offsetof(Elf64_Dyn, d_un.d_val),
-
- offsetof(Elf32_Ehdr, e_ident[EI_CLASS]),
- offsetof(Elf32_Ehdr, e_ident[EI_DATA]),
- offsetof(Elf32_Ehdr, e_ident[EI_OSABI]),
- offsetof(Elf64_Ehdr, e_type), offsetof(Elf64_Ehdr, e_machine),
- offsetof(Elf64_Ehdr, e_version), offsetof(Elf64_Ehdr, e_entry),
- offsetof(Elf64_Ehdr, e_phoff), offsetof(Elf64_Ehdr, e_shoff),
- offsetof(Elf64_Ehdr, e_flags), offsetof(Elf64_Ehdr, e_ehsize),
- offsetof(Elf64_Ehdr, e_phentsize), offsetof(Elf64_Ehdr, e_phnum),
- offsetof(Elf64_Ehdr, e_shentsize), offsetof(Elf64_Ehdr, e_shnum),
- offsetof(Elf64_Ehdr, e_shstrndx),
-
- offsetof(Elf_Note, n_namesz), offsetof(Elf_Note, n_descsz),
- offsetof(Elf_Note, n_type),
-
- offsetof(Elf64_Phdr, p_type), offsetof(Elf64_Phdr, p_offset),
- offsetof(Elf64_Phdr, p_vaddr), offsetof(Elf64_Phdr, p_paddr),
- offsetof(Elf64_Phdr, p_filesz), offsetof(Elf64_Phdr, p_memsz),
- offsetof(Elf64_Phdr, p_flags), offsetof(Elf64_Phdr, p_align),
-
- offsetof(Elf64_Shdr, sh_name), offsetof(Elf64_Shdr, sh_type),
- offsetof(Elf64_Shdr, sh_flags), offsetof(Elf64_Shdr, sh_addr),
- offsetof(Elf64_Shdr, sh_offset), offsetof(Elf64_Shdr, sh_size),
- offsetof(Elf64_Shdr, sh_link), offsetof(Elf64_Shdr, sh_info),
- offsetof(Elf64_Shdr, sh_addralign), offsetof(Elf64_Shdr, sh_entsize),
-
- offsetof(Elf64_Sym, st_name), offsetof(Elf64_Sym, st_value),
- offsetof(Elf64_Sym, st_size), offsetof(Elf64_Sym, st_info),
- offsetof(Elf64_Sym, st_shndx),
-
- offsetof(Elf64_Rel, r_offset), offsetof(Elf64_Rel, r_info),
-
- offsetof(Elf64_Rela, r_offset), offsetof(Elf64_Rela, r_info),
- offsetof(Elf64_Rela, r_addend)
-};
-
-/* http://www.sco.com/developers/gabi/latest/ch5.dynamic.html#tag_encodings */
-static const char *
-d_tags(u_int64_t tag) {
- switch (tag) {
- case 0: return "DT_NULL";
- case 1: return "DT_NEEDED";
- case 2: return "DT_PLTRELSZ";
- case 3: return "DT_PLTGOT";
- case 4: return "DT_HASH";
- case 5: return "DT_STRTAB";
- case 6: return "DT_SYMTAB";
- case 7: return "DT_RELA";
- case 8: return "DT_RELASZ";
- case 9: return "DT_RELAENT";
- case 10: return "DT_STRSZ";
- case 11: return "DT_SYMENT";
- case 12: return "DT_INIT";
- case 13: return "DT_FINI";
- case 14: return "DT_SONAME";
- case 15: return "DT_RPATH";
- case 16: return "DT_SYMBOLIC";
- case 17: return "DT_REL";
- case 18: return "DT_RELSZ";
- case 19: return "DT_RELENT";
- case 20: return "DT_PLTREL";
- case 21: return "DT_DEBUG";
- case 22: return "DT_TEXTREL";
- case 23: return "DT_JMPREL";
- case 24: return "DT_BIND_NOW";
- case 25: return "DT_INIT_ARRAY";
- case 26: return "DT_FINI_ARRAY";
- case 27: return "DT_INIT_ARRAYSZ";
- case 28: return "DT_FINI_ARRAYSZ";
- case 29: return "DT_RUNPATH";
- case 30: return "DT_FLAGS";
- case 32: return "DT_PREINIT_ARRAY"; /* XXX: DT_ENCODING */
- case 33: return "DT_PREINIT_ARRAYSZ";
- /* 0x6000000D - 0x6ffff000 operating system-specific semantics */
- case 0x6ffffdf5: return "DT_GNU_PRELINKED";
- case 0x6ffffdf6: return "DT_GNU_CONFLICTSZ";
- case 0x6ffffdf7: return "DT_GNU_LIBLISTSZ";
- case 0x6ffffdf8: return "DT_SUNW_CHECKSUM";
- case 0x6ffffdf9: return "DT_PLTPADSZ";
- case 0x6ffffdfa: return "DT_MOVEENT";
- case 0x6ffffdfb: return "DT_MOVESZ";
- case 0x6ffffdfc: return "DT_FEATURE";
- case 0x6ffffdfd: return "DT_POSFLAG_1";
- case 0x6ffffdfe: return "DT_SYMINSZ";
- case 0x6ffffdff: return "DT_SYMINENT (DT_VALRNGHI)";
- case 0x6ffffe00: return "DT_ADDRRNGLO";
- case 0x6ffffef8: return "DT_GNU_CONFLICT";
- case 0x6ffffef9: return "DT_GNU_LIBLIST";
- case 0x6ffffefa: return "DT_SUNW_CONFIG";
- case 0x6ffffefb: return "DT_SUNW_DEPAUDIT";
- case 0x6ffffefc: return "DT_SUNW_AUDIT";
- case 0x6ffffefd: return "DT_SUNW_PLTPAD";
- case 0x6ffffefe: return "DT_SUNW_MOVETAB";
- case 0x6ffffeff: return "DT_SYMINFO (DT_ADDRRNGHI)";
- case 0x6ffffff9: return "DT_RELACOUNT";
- case 0x6ffffffa: return "DT_RELCOUNT";
- case 0x6ffffffb: return "DT_FLAGS_1";
- case 0x6ffffffc: return "DT_VERDEF";
- case 0x6ffffffd: return "DT_VERDEFNUM";
- case 0x6ffffffe: return "DT_VERNEED";
- case 0x6fffffff: return "DT_VERNEEDNUM";
- case 0x6ffffff0: return "DT_GNU_VERSYM";
- /* 0x70000000 - 0x7fffffff processor-specific semantics */
- case 0x70000000: return "DT_IA_64_PLT_RESERVE";
- case 0x7ffffffd: return "DT_SUNW_AUXILIARY";
- case 0x7ffffffe: return "DT_SUNW_USED";
- case 0x7fffffff: return "DT_SUNW_FILTER";
- default: return "ERROR: TAG NOT DEFINED";
- }
-}
-
-static const char *
-e_machines(u_int mach)
-{
- static char machdesc[64];
-
- switch (mach) {
- case EM_NONE: return "EM_NONE";
- case EM_M32: return "EM_M32";
- case EM_SPARC: return "EM_SPARC";
- case EM_386: return "EM_386";
- case EM_68K: return "EM_68K";
- case EM_88K: return "EM_88K";
- case EM_860: return "EM_860";
- case EM_MIPS: return "EM_MIPS";
- case EM_PPC: return "EM_PPC";
- case EM_ARM: return "EM_ARM";
- case EM_ALPHA: return "EM_ALPHA (legacy)";
- case EM_SPARCV9:return "EM_SPARCV9";
- case EM_IA_64: return "EM_IA_64";
- case EM_X86_64: return "EM_X86_64";
- }
- snprintf(machdesc, sizeof(machdesc),
- "(unknown machine) -- type 0x%x", mach);
- return (machdesc);
-}
-
-const char *e_types[] = {
- "ET_NONE", "ET_REL", "ET_EXEC", "ET_DYN", "ET_CORE"
-};
-
-const char *ei_versions[] = {
- "EV_NONE", "EV_CURRENT"
-};
-
-const char *ei_classes[] = {
- "ELFCLASSNONE", "ELFCLASS32", "ELFCLASS64"
-};
-
-const char *ei_data[] = {
- "ELFDATANONE", "ELFDATA2LSB", "ELFDATA2MSB"
-};
-
-const char *ei_abis[] = {
- "ELFOSABI_SYSV", "ELFOSABI_HPUX", "ELFOSABI_NETBSD", "ELFOSABI_LINUX",
- "ELFOSABI_HURD", "ELFOSABI_86OPEN", "ELFOSABI_SOLARIS",
- "ELFOSABI_MONTEREY", "ELFOSABI_IRIX", "ELFOSABI_FREEBSD",
- "ELFOSABI_TRU64", "ELFOSABI_MODESTO", "ELFOSABI_OPENBSD"
-};
-
-const char *p_types[] = {
- "PT_NULL", "PT_LOAD", "PT_DYNAMIC", "PT_INTERP", "PT_NOTE",
- "PT_SHLIB", "PT_PHDR", "PT_TLS"
-};
-
-const char *p_flags[] = {
- "", "PF_X", "PF_W", "PF_X|PF_W", "PF_R", "PF_X|PF_R", "PF_W|PF_R",
- "PF_X|PF_W|PF_R"
-};
-
-/* http://www.sco.com/developers/gabi/latest/ch4.sheader.html#sh_type */
-static const char *
-sh_types(u_int64_t sht) {
- switch (sht) {
- case 0: return "SHT_NULL";
- case 1: return "SHT_PROGBITS";
- case 2: return "SHT_SYMTAB";
- case 3: return "SHT_STRTAB";
- case 4: return "SHT_RELA";
- case 5: return "SHT_HASH";
- case 6: return "SHT_DYNAMIC";
- case 7: return "SHT_NOTE";
- case 8: return "SHT_NOBITS";
- case 9: return "SHT_REL";
- case 10: return "SHT_SHLIB";
- case 11: return "SHT_DYNSYM";
- case 14: return "SHT_INIT_ARRAY";
- case 15: return "SHT_FINI_ARRAY";
- case 16: return "SHT_PREINIT_ARRAY";
- case 17: return "SHT_GROUP";
- case 18: return "SHT_SYMTAB_SHNDX";
- /* 0x60000000 - 0x6fffffff operating system-specific semantics */
- case 0x6ffffff0: return "XXX:VERSYM";
- case 0x6ffffff7: return "SHT_GNU_LIBLIST";
- case 0x6ffffffc: return "XXX:VERDEF";
- case 0x6ffffffd: return "SHT_SUNW(GNU)_verdef";
- case 0x6ffffffe: return "SHT_SUNW(GNU)_verneed";
- case 0x6fffffff: return "SHT_SUNW(GNU)_versym";
- /* 0x70000000 - 0x7fffffff processor-specific semantics */
- case 0x70000000: return "SHT_IA_64_EXT";
- case 0x70000001: return "SHT_IA_64_UNWIND";
- case 0x7ffffffd: return "XXX:AUXILIARY";
- case 0x7fffffff: return "XXX:FILTER";
- /* 0x80000000 - 0xffffffff application programs */
- default: return "ERROR: SHT NOT DEFINED";
- }
-}
-
-const char *sh_flags[] = {
- "", "SHF_WRITE", "SHF_ALLOC", "SHF_WRITE|SHF_ALLOC", "SHF_EXECINSTR",
- "SHF_WRITE|SHF_EXECINSTR", "SHF_ALLOC|SHF_EXECINSTR",
- "SHF_WRITE|SHF_ALLOC|SHF_EXECINSTR"
-};
-
-const char *st_types[] = {
- "STT_NOTYPE", "STT_OBJECT", "STT_FUNC", "STT_SECTION", "STT_FILE"
-};
-
-const char *st_bindings[] = {
- "STB_LOCAL", "STB_GLOBAL", "STB_WEAK"
-};
-
-char *dynstr;
-char *shstrtab;
-char *strtab;
-FILE *out;
-
-u_int64_t elf_get_byte(Elf32_Ehdr *e, void *base, elf_member_t member);
-u_int64_t elf_get_quarter(Elf32_Ehdr *e, void *base, elf_member_t member);
-u_int64_t elf_get_half(Elf32_Ehdr *e, void *base, elf_member_t member);
-u_int64_t elf_get_word(Elf32_Ehdr *e, void *base, elf_member_t member);
-u_int64_t elf_get_quad(Elf32_Ehdr *e, void *base, elf_member_t member);
-
-void elf_print_ehdr(Elf32_Ehdr *e);
-void elf_print_phdr(Elf32_Ehdr *e, void *p);
-void elf_print_shdr(Elf32_Ehdr *e, void *sh);
-void elf_print_symtab(Elf32_Ehdr *e, void *sh, char *str);
-void elf_print_dynamic(Elf32_Ehdr *e, void *sh);
-void elf_print_rel(Elf32_Ehdr *e, void *r);
-void elf_print_rela(Elf32_Ehdr *e, void *ra);
-void elf_print_interp(Elf32_Ehdr *e, void *p);
-void elf_print_got(Elf32_Ehdr *e, void *sh);
-void elf_print_hash(Elf32_Ehdr *e, void *sh);
-void elf_print_note(Elf32_Ehdr *e, void *sh);
-
-void usage(void);
-
-int
-main(int ac, char **av)
-{
- u_int64_t phoff;
- u_int64_t shoff;
- u_int64_t phentsize;
- u_int64_t phnum;
- u_int64_t shentsize;
- u_int64_t shnum;
- u_int64_t shstrndx;
- u_int64_t offset;
- u_int64_t name;
- u_int64_t type;
- struct stat sb;
- u_int flags;
- Elf32_Ehdr *e;
- void *p;
- void *sh;
- void *v;
- int fd;
- int ch;
- int i;
-
- out = stdout;
- flags = 0;
- while ((ch = getopt(ac, av, "acdeiGhnprsw:")) != -1)
- switch (ch) {
- case 'a':
- flags = ED_ALL;
- break;
- case 'c':
- flags |= ED_SHDR;
- break;
- case 'd':
- flags |= ED_DYN;
- break;
- case 'e':
- flags |= ED_EHDR;
- break;
- case 'i':
- flags |= ED_INTERP;
- break;
- case 'G':
- flags |= ED_GOT;
- break;
- case 'h':
- flags |= ED_HASH;
- break;
- case 'n':
- flags |= ED_NOTE;
- break;
- case 'p':
- flags |= ED_PHDR;
- break;
- case 'r':
- flags |= ED_REL;
- break;
- case 's':
- flags |= ED_SYMTAB;
- break;
- case 'w':
- if ((out = fopen(optarg, "w")) == NULL)
- err(1, "%s", optarg);
- break;
- case '?':
- default:
- usage();
- }
- ac -= optind;
- av += optind;
- if (ac == 0 || flags == 0)
- usage();
- if ((fd = open(*av, O_RDONLY)) < 0 ||
- fstat(fd, &sb) < 0)
- err(1, "%s", *av);
- e = mmap(NULL, sb.st_size, PROT_READ, MAP_SHARED, fd, 0);
- if (e == MAP_FAILED)
- err(1, NULL);
- if (!IS_ELF(*(Elf32_Ehdr *)e))
- errx(1, "not an elf file");
- phoff = elf_get_off(e, e, E_PHOFF);
- shoff = elf_get_off(e, e, E_SHOFF);
- phentsize = elf_get_quarter(e, e, E_PHENTSIZE);
- phnum = elf_get_quarter(e, e, E_PHNUM);
- shentsize = elf_get_quarter(e, e, E_SHENTSIZE);
- shnum = elf_get_quarter(e, e, E_SHNUM);
- shstrndx = elf_get_quarter(e, e, E_SHSTRNDX);
- p = (char *)e + phoff;
- sh = (char *)e + shoff;
- offset = elf_get_off(e, (char *)sh + shstrndx * shentsize, SH_OFFSET);
- shstrtab = (char *)e + offset;
- for (i = 0; (u_int64_t)i < shnum; i++) {
- name = elf_get_word(e, (char *)sh + i * shentsize, SH_NAME);
- offset = elf_get_off(e, (char *)sh + i * shentsize, SH_OFFSET);
- if (strcmp(shstrtab + name, ".strtab") == 0)
- strtab = (char *)e + offset;
- if (strcmp(shstrtab + name, ".dynstr") == 0)
- dynstr = (char *)e + offset;
- }
- if (flags & ED_EHDR)
- elf_print_ehdr(e);
- if (flags & ED_PHDR)
- elf_print_phdr(e, p);
- if (flags & ED_SHDR)
- elf_print_shdr(e, sh);
- for (i = 0; (u_int64_t)i < phnum; i++) {
- v = (char *)p + i * phentsize;
- type = elf_get_word(e, v, P_TYPE);
- switch (type) {
- case PT_INTERP:
- if (flags & ED_INTERP)
- elf_print_interp(e, v);
- break;
- case PT_NULL:
- case PT_LOAD:
- case PT_DYNAMIC:
- case PT_NOTE:
- case PT_SHLIB:
- case PT_PHDR:
- break;
- }
- }
- for (i = 0; (u_int64_t)i < shnum; i++) {
- v = (char *)sh + i * shentsize;
- type = elf_get_word(e, v, SH_TYPE);
- switch (type) {
- case SHT_SYMTAB:
- if (flags & ED_SYMTAB)
- elf_print_symtab(e, v, strtab);
- break;
- case SHT_DYNAMIC:
- if (flags & ED_DYN)
- elf_print_dynamic(e, v);
- break;
- case SHT_RELA:
- if (flags & ED_REL)
- elf_print_rela(e, v);
- break;
- case SHT_REL:
- if (flags & ED_REL)
- elf_print_rel(e, v);
- break;
- case SHT_NOTE:
- name = elf_get_word(e, v, SH_NAME);
- if (flags & ED_NOTE &&
- strcmp(shstrtab + name, ".note.ABI-tag") == 0)
- elf_print_note(e, v);
- break;
- case SHT_DYNSYM:
- if (flags & ED_SYMTAB)
- elf_print_symtab(e, v, dynstr);
- break;
- case SHT_PROGBITS:
- name = elf_get_word(e, v, SH_NAME);
- if (flags & ED_GOT &&
- strcmp(shstrtab + name, ".got") == 0)
- elf_print_got(e, v);
- break;
- case SHT_HASH:
- if (flags & ED_HASH)
- elf_print_hash(e, v);
- break;
- case SHT_NULL:
- case SHT_STRTAB:
- case SHT_NOBITS:
- case SHT_SHLIB:
- break;
- }
- }
-
- return 0;
-}
-
-void
-elf_print_ehdr(Elf32_Ehdr *e)
-{
- u_int64_t class;
- u_int64_t data;
- u_int64_t osabi;
- u_int64_t type;
- u_int64_t machine;
- u_int64_t version;
- u_int64_t entry;
- u_int64_t phoff;
- u_int64_t shoff;
- u_int64_t flags;
- u_int64_t ehsize;
- u_int64_t phentsize;
- u_int64_t phnum;
- u_int64_t shentsize;
- u_int64_t shnum;
- u_int64_t shstrndx;
-
- class = elf_get_byte(e, e, E_CLASS);
- data = elf_get_byte(e, e, E_DATA);
- osabi = elf_get_byte(e, e, E_OSABI);
- type = elf_get_quarter(e, e, E_TYPE);
- machine = elf_get_quarter(e, e, E_MACHINE);
- version = elf_get_word(e, e, E_VERSION);
- entry = elf_get_addr(e, e, E_ENTRY);
- phoff = elf_get_off(e, e, E_PHOFF);
- shoff = elf_get_off(e, e, E_SHOFF);
- flags = elf_get_word(e, e, E_FLAGS);
- ehsize = elf_get_quarter(e, e, E_EHSIZE);
- phentsize = elf_get_quarter(e, e, E_PHENTSIZE);
- phnum = elf_get_quarter(e, e, E_PHNUM);
- shentsize = elf_get_quarter(e, e, E_SHENTSIZE);
- shnum = elf_get_quarter(e, e, E_SHNUM);
- shstrndx = elf_get_quarter(e, e, E_SHSTRNDX);
- fprintf(out, "\nelf header:\n");
- fprintf(out, "\n");
- fprintf(out, "\te_ident: %s %s %s\n", ei_classes[class], ei_data[data],
- ei_abis[osabi]);
- fprintf(out, "\te_type: %s\n", e_types[type]);
- fprintf(out, "\te_machine: %s\n", e_machines(machine));
- fprintf(out, "\te_version: %s\n", ei_versions[version]);
- fprintf(out, "\te_entry: %#jx\n", (intmax_t)entry);
- fprintf(out, "\te_phoff: %jd\n", (intmax_t)phoff);
- fprintf(out, "\te_shoff: %jd\n", (intmax_t)shoff);
- fprintf(out, "\te_flags: %jd\n", (intmax_t)flags);
- fprintf(out, "\te_ehsize: %jd\n", (intmax_t)ehsize);
- fprintf(out, "\te_phentsize: %jd\n", (intmax_t)phentsize);
- fprintf(out, "\te_phnum: %jd\n", (intmax_t)phnum);
- fprintf(out, "\te_shentsize: %jd\n", (intmax_t)shentsize);
- fprintf(out, "\te_shnum: %jd\n", (intmax_t)shnum);
- fprintf(out, "\te_shstrndx: %jd\n", (intmax_t)shstrndx);
-}
-
-void
-elf_print_phdr(Elf32_Ehdr *e, void *p)
-{
- u_int64_t phentsize;
- u_int64_t phnum;
- u_int64_t type;
- u_int64_t offset;
- u_int64_t vaddr;
- u_int64_t paddr;
- u_int64_t filesz;
- u_int64_t memsz;
- u_int64_t flags;
- u_int64_t align;
- void *v;
- int i;
-
- phentsize = elf_get_quarter(e, e, E_PHENTSIZE);
- phnum = elf_get_quarter(e, e, E_PHNUM);
- fprintf(out, "\nprogram header:\n");
- for (i = 0; (u_int64_t)i < phnum; i++) {
- v = (char *)p + i * phentsize;
- type = elf_get_word(e, v, P_TYPE);
- offset = elf_get_off(e, v, P_OFFSET);
- vaddr = elf_get_addr(e, v, P_VADDR);
- paddr = elf_get_addr(e, v, P_PADDR);
- filesz = elf_get_size(e, v, P_FILESZ);
- memsz = elf_get_size(e, v, P_MEMSZ);
- flags = elf_get_word(e, v, P_FLAGS);
- align = elf_get_size(e, v, P_ALIGN);
- fprintf(out, "\n");
- fprintf(out, "entry: %d\n", i);
- fprintf(out, "\tp_type: %s\n", p_types[type & 0x7]);
- fprintf(out, "\tp_offset: %jd\n", (intmax_t)offset);
- fprintf(out, "\tp_vaddr: %#jx\n", (intmax_t)vaddr);
- fprintf(out, "\tp_paddr: %#jx\n", (intmax_t)paddr);
- fprintf(out, "\tp_filesz: %jd\n", (intmax_t)filesz);
- fprintf(out, "\tp_memsz: %jd\n", (intmax_t)memsz);
- fprintf(out, "\tp_flags: %s\n", p_flags[flags]);
- fprintf(out, "\tp_align: %jd\n", (intmax_t)align);
- }
-}
-
-void
-elf_print_shdr(Elf32_Ehdr *e, void *sh)
-{
- u_int64_t shentsize;
- u_int64_t shnum;
- u_int64_t name;
- u_int64_t type;
- u_int64_t flags;
- u_int64_t addr;
- u_int64_t offset;
- u_int64_t size;
- u_int64_t shlink;
- u_int64_t info;
- u_int64_t addralign;
- u_int64_t entsize;
- void *v;
- int i;
-
- shentsize = elf_get_quarter(e, e, E_SHENTSIZE);
- shnum = elf_get_quarter(e, e, E_SHNUM);
- fprintf(out, "\nsection header:\n");
- for (i = 0; (u_int64_t)i < shnum; i++) {
- v = (char *)sh + i * shentsize;
- name = elf_get_word(e, v, SH_NAME);
- type = elf_get_word(e, v, SH_TYPE);
- flags = elf_get_word(e, v, SH_FLAGS);
- addr = elf_get_addr(e, v, SH_ADDR);
- offset = elf_get_off(e, v, SH_OFFSET);
- size = elf_get_size(e, v, SH_SIZE);
- shlink = elf_get_word(e, v, SH_LINK);
- info = elf_get_word(e, v, SH_INFO);
- addralign = elf_get_size(e, v, SH_ADDRALIGN);
- entsize = elf_get_size(e, v, SH_ENTSIZE);
- fprintf(out, "\n");
- fprintf(out, "entry: %d\n", i);
- fprintf(out, "\tsh_name: %s\n", shstrtab + name);
- fprintf(out, "\tsh_type: %s\n", sh_types(type));
- fprintf(out, "\tsh_flags: %s\n", sh_flags[flags & 0x7]);
- fprintf(out, "\tsh_addr: %#jx\n", addr);
- fprintf(out, "\tsh_offset: %jd\n", (intmax_t)offset);
- fprintf(out, "\tsh_size: %jd\n", (intmax_t)size);
- fprintf(out, "\tsh_link: %jd\n", (intmax_t)shlink);
- fprintf(out, "\tsh_info: %jd\n", (intmax_t)info);
- fprintf(out, "\tsh_addralign: %jd\n", (intmax_t)addralign);
- fprintf(out, "\tsh_entsize: %jd\n", (intmax_t)entsize);
- }
-}
-
-void
-elf_print_symtab(Elf32_Ehdr *e, void *sh, char *str)
-{
- u_int64_t offset;
- u_int64_t entsize;
- u_int64_t size;
- u_int64_t name;
- u_int64_t value;
- u_int64_t info;
- u_int64_t shndx;
- void *st;
- int len;
- int i;
-
- offset = elf_get_off(e, sh, SH_OFFSET);
- entsize = elf_get_size(e, sh, SH_ENTSIZE);
- size = elf_get_size(e, sh, SH_SIZE);
- name = elf_get_word(e, sh, SH_NAME);
- len = size / entsize;
- fprintf(out, "\nsymbol table (%s):\n", shstrtab + name);
- for (i = 0; i < len; i++) {
- st = (char *)e + offset + i * entsize;
- name = elf_get_word(e, st, ST_NAME);
- value = elf_get_addr(e, st, ST_VALUE);
- size = elf_get_size(e, st, ST_SIZE);
- info = elf_get_byte(e, st, ST_INFO);
- shndx = elf_get_quarter(e, st, ST_SHNDX);
- fprintf(out, "\n");
- fprintf(out, "entry: %d\n", i);
- fprintf(out, "\tst_name: %s\n", str + name);
- fprintf(out, "\tst_value: %#jx\n", value);
- fprintf(out, "\tst_size: %jd\n", (intmax_t)size);
- fprintf(out, "\tst_info: %s %s\n",
- st_types[ELF32_ST_TYPE(info)],
- st_bindings[ELF32_ST_BIND(info)]);
- fprintf(out, "\tst_shndx: %jd\n", (intmax_t)shndx);
- }
-}
-
-void
-elf_print_dynamic(Elf32_Ehdr *e, void *sh)
-{
- u_int64_t offset;
- u_int64_t entsize;
- u_int64_t size;
- int64_t tag;
- u_int64_t ptr;
- u_int64_t val;
- void *d;
- int i;
-
- offset = elf_get_off(e, sh, SH_OFFSET);
- entsize = elf_get_size(e, sh, SH_ENTSIZE);
- size = elf_get_size(e, sh, SH_SIZE);
- fprintf(out, "\ndynamic:\n");
- for (i = 0; (u_int64_t)i < size / entsize; i++) {
- d = (char *)e + offset + i * entsize;
- tag = elf_get_size(e, d, D_TAG);
- ptr = elf_get_size(e, d, D_PTR);
- val = elf_get_addr(e, d, D_VAL);
- fprintf(out, "\n");
- fprintf(out, "entry: %d\n", i);
- fprintf(out, "\td_tag: %s\n", d_tags(tag));
- switch (tag) {
- case DT_NEEDED:
- case DT_SONAME:
- case DT_RPATH:
- fprintf(out, "\td_val: %s\n", dynstr + val);
- break;
- case DT_PLTRELSZ:
- case DT_RELA:
- case DT_RELASZ:
- case DT_RELAENT:
- case DT_STRSZ:
- case DT_SYMENT:
- case DT_RELSZ:
- case DT_RELENT:
- case DT_PLTREL:
- fprintf(out, "\td_val: %jd\n", (intmax_t)val);
- break;
- case DT_PLTGOT:
- case DT_HASH:
- case DT_STRTAB:
- case DT_SYMTAB:
- case DT_INIT:
- case DT_FINI:
- case DT_REL:
- case DT_JMPREL:
- fprintf(out, "\td_ptr: %#jx\n", ptr);
- break;
- case DT_NULL:
- case DT_SYMBOLIC:
- case DT_DEBUG:
- case DT_TEXTREL:
- break;
- }
- }
-}
-
-void
-elf_print_rela(Elf32_Ehdr *e, void *sh)
-{
- u_int64_t offset;
- u_int64_t entsize;
- u_int64_t size;
- u_int64_t name;
- u_int64_t info;
- int64_t addend;
- void *ra;
- void *v;
- int i;
-
- offset = elf_get_off(e, sh, SH_OFFSET);
- entsize = elf_get_size(e, sh, SH_ENTSIZE);
- size = elf_get_size(e, sh, SH_SIZE);
- name = elf_get_word(e, sh, SH_NAME);
- v = (char *)e + offset;
- fprintf(out, "\nrelocation with addend (%s):\n", shstrtab + name);
- for (i = 0; (u_int64_t)i < size / entsize; i++) {
- ra = (char *)v + i * entsize;
- offset = elf_get_addr(e, ra, RA_OFFSET);
- info = elf_get_word(e, ra, RA_INFO);
- addend = elf_get_off(e, ra, RA_ADDEND);
- fprintf(out, "\n");
- fprintf(out, "entry: %d\n", i);
- fprintf(out, "\tr_offset: %#jx\n", offset);
- fprintf(out, "\tr_info: %jd\n", (intmax_t)info);
- fprintf(out, "\tr_addend: %jd\n", (intmax_t)addend);
- }
-}
-
-void
-elf_print_rel(Elf32_Ehdr *e, void *sh)
-{
- u_int64_t offset;
- u_int64_t entsize;
- u_int64_t size;
- u_int64_t name;
- u_int64_t info;
- void *r;
- void *v;
- int i;
-
- offset = elf_get_off(e, sh, SH_OFFSET);
- entsize = elf_get_size(e, sh, SH_ENTSIZE);
- size = elf_get_size(e, sh, SH_SIZE);
- name = elf_get_word(e, sh, SH_NAME);
- v = (char *)e + offset;
- fprintf(out, "\nrelocation (%s):\n", shstrtab + name);
- for (i = 0; (u_int64_t)i < size / entsize; i++) {
- r = (char *)v + i * entsize;
- offset = elf_get_addr(e, r, R_OFFSET);
- info = elf_get_word(e, r, R_INFO);
- fprintf(out, "\n");
- fprintf(out, "entry: %d\n", i);
- fprintf(out, "\tr_offset: %#jx\n", offset);
- fprintf(out, "\tr_info: %jd\n", (intmax_t)info);
- }
-}
-
-void
-elf_print_interp(Elf32_Ehdr *e, void *p)
-{
- u_int64_t offset;
- char *s;
-
- offset = elf_get_off(e, p, P_OFFSET);
- s = (char *)e + offset;
- fprintf(out, "\ninterp:\n");
- fprintf(out, "\t%s\n", s);
-}
-
-void
-elf_print_got(Elf32_Ehdr *e, void *sh)
-{
- u_int64_t offset;
- u_int64_t addralign;
- u_int64_t size;
- u_int64_t addr;
- void *v;
- int i;
-
- offset = elf_get_off(e, sh, SH_OFFSET);
- addralign = elf_get_size(e, sh, SH_ADDRALIGN);
- size = elf_get_size(e, sh, SH_SIZE);
- v = (char *)e + offset;
- fprintf(out, "\nglobal offset table:\n");
- for (i = 0; (u_int64_t)i < size / addralign; i++) {
- addr = elf_get_addr(e, (char *)v + i * addralign, 0);
- fprintf(out, "\n");
- fprintf(out, "entry: %d\n", i);
- fprintf(out, "\t%#jx\n", addr);
- }
-}
-
-void
-elf_print_hash(Elf32_Ehdr *e __unused, void *sh __unused)
-{
-}
-
-void
-elf_print_note(Elf32_Ehdr *e, void *sh)
-{
- u_int64_t offset;
- u_int64_t size;
- u_int64_t name;
- u_int32_t namesz;
- u_int32_t descsz;
- u_int32_t type;
- u_int32_t desc;
- char *n, *s;
-
- offset = elf_get_off(e, sh, SH_OFFSET);
- size = elf_get_size(e, sh, SH_SIZE);
- name = elf_get_word(e, sh, SH_NAME);
- n = (char *)e + offset;
- fprintf(out, "\nnote (%s):\n", shstrtab + name);
- while (n < ((char *)e + offset + size)) {
- namesz = elf_get_word(e, n, N_NAMESZ);
- descsz = elf_get_word(e, n, N_DESCSZ);
- type = elf_get_word(e, n, N_TYPE);
- s = n + sizeof(Elf_Note);
- desc = elf_get_word(e, n + sizeof(Elf_Note) + namesz, 0);
- fprintf(out, "\t%s %d\n", s, desc);
- n += sizeof(Elf_Note) + namesz + descsz;
- }
-}
-
-u_int64_t
-elf_get_byte(Elf32_Ehdr *e, void *base, elf_member_t member)
-{
- u_int64_t val;
-
- val = 0;
- switch (e->e_ident[EI_CLASS]) {
- case ELFCLASS32:
- val = ((char *)base)[elf32_offsets[member]];
- break;
- case ELFCLASS64:
- val = ((char *)base)[elf64_offsets[member]];
- break;
- case ELFCLASSNONE:
- errx(1, "invalid class");
- }
-
- return val;
-}
-
-u_int64_t
-elf_get_quarter(Elf32_Ehdr *e, void *base, elf_member_t member)
-{
- u_int64_t val;
-
- val = 0;
- switch (e->e_ident[EI_CLASS]) {
- case ELFCLASS32:
- base = (char *)base + elf32_offsets[member];
- switch (e->e_ident[EI_DATA]) {
- case ELFDATA2MSB:
- val = be16dec(base);
- break;
- case ELFDATA2LSB:
- val = le16dec(base);
- break;
- case ELFDATANONE:
- errx(1, "invalid data format");
- }
- break;
- case ELFCLASS64:
- base = (char *)base + elf64_offsets[member];
- switch (e->e_ident[EI_DATA]) {
- case ELFDATA2MSB:
- val = be16dec(base);
- break;
- case ELFDATA2LSB:
- val = le16dec(base);
- break;
- case ELFDATANONE:
- errx(1, "invalid data format");
- }
- break;
- case ELFCLASSNONE:
- errx(1, "invalid class");
- }
-
- return val;
-}
-
-u_int64_t
-elf_get_half(Elf32_Ehdr *e, void *base, elf_member_t member)
-{
- u_int64_t val;
-
- val = 0;
- switch (e->e_ident[EI_CLASS]) {
- case ELFCLASS32:
- base = (char *)base + elf32_offsets[member];
- switch (e->e_ident[EI_DATA]) {
- case ELFDATA2MSB:
- val = be16dec(base);
- break;
- case ELFDATA2LSB:
- val = le16dec(base);
- break;
- case ELFDATANONE:
- errx(1, "invalid data format");
- }
- break;
- case ELFCLASS64:
- base = (char *)base + elf64_offsets[member];
- switch (e->e_ident[EI_DATA]) {
- case ELFDATA2MSB:
- val = be32dec(base);
- break;
- case ELFDATA2LSB:
- val = le32dec(base);
- break;
- case ELFDATANONE:
- errx(1, "invalid data format");
- }
- break;
- case ELFCLASSNONE:
- errx(1, "invalid class");
- }
-
- return val;
-}
-
-u_int64_t
-elf_get_word(Elf32_Ehdr *e, void *base, elf_member_t member)
-{
- u_int64_t val;
-
- val = 0;
- switch (e->e_ident[EI_CLASS]) {
- case ELFCLASS32:
- base = (char *)base + elf32_offsets[member];
- switch (e->e_ident[EI_DATA]) {
- case ELFDATA2MSB:
- val = be32dec(base);
- break;
- case ELFDATA2LSB:
- val = le32dec(base);
- break;
- case ELFDATANONE:
- errx(1, "invalid data format");
- }
- break;
- case ELFCLASS64:
- base = (char *)base + elf64_offsets[member];
- switch (e->e_ident[EI_DATA]) {
- case ELFDATA2MSB:
- val = be32dec(base);
- break;
- case ELFDATA2LSB:
- val = le32dec(base);
- break;
- case ELFDATANONE:
- errx(1, "invalid data format");
- }
- break;
- case ELFCLASSNONE:
- errx(1, "invalid class");
- }
-
- return val;
-}
-
-u_int64_t
-elf_get_quad(Elf32_Ehdr *e, void *base, elf_member_t member)
-{
- u_int64_t val;
-
- val = 0;
- switch (e->e_ident[EI_CLASS]) {
- case ELFCLASS32:
- base = (char *)base + elf32_offsets[member];
- switch (e->e_ident[EI_DATA]) {
- case ELFDATA2MSB:
- val = be32dec(base);
- break;
- case ELFDATA2LSB:
- val = le32dec(base);
- break;
- case ELFDATANONE:
- errx(1, "invalid data format");
- }
- break;
- case ELFCLASS64:
- base = (char *)base + elf64_offsets[member];
- switch (e->e_ident[EI_DATA]) {
- case ELFDATA2MSB:
- val = be64dec(base);
- break;
- case ELFDATA2LSB:
- val = le64dec(base);
- break;
- case ELFDATANONE:
- errx(1, "invalid data format");
- }
- break;
- case ELFCLASSNONE:
- errx(1, "invalid class");
- }
-
- return val;
-}
-
-void
-usage(void)
-{
- fprintf(stderr, "usage: elfdump -a | -cdeGhinprs [-w file] file\n");
- exit(1);
-}
diff --git a/usr.bin/enigma/Makefile b/usr.bin/enigma/Makefile
deleted file mode 100644
index 32a670b..0000000
--- a/usr.bin/enigma/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-# $FreeBSD$
-
-PROG= enigma
-
-LINKS= ${BINDIR}/enigma ${BINDIR}/crypt
-MLINKS= enigma.1 crypt.1
-
-DPADD= ${LIBCRYPT}
-LDADD= -lcrypt
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/enigma/enigma.1 b/usr.bin/enigma/enigma.1
deleted file mode 100644
index 4fc0b20..0000000
--- a/usr.bin/enigma/enigma.1
+++ /dev/null
@@ -1,132 +0,0 @@
-.\"
-.\" enigma (aka. crypt) man page written by Joerg Wunsch.
-.\"
-.\" Since enigma itself is distributed in the Public Domain, this file
-.\" is also.
-.\"
-.\" $FreeBSD$
-.\" "
-.Dd May 14, 2004
-.Os
-.Dt ENIGMA 1
-.Sh NAME
-.Nm enigma ,
-.Nm crypt
-.Nd very simple file encryption
-.Sh SYNOPSIS
-.Nm
-.Op Fl s
-.Op Fl k
-.Op Ar password
-.Nm crypt
-.Op Fl s
-.Op Fl k
-.Op Ar password
-.Sh DESCRIPTION
-The
-.Nm
-utility, also known as
-.Nm crypt
-is a
-.Em very
-simple encryption program, working on a
-.Dq secret-key
-basis.
-It operates as a filter, i.e.,
-it encrypts or decrypts a
-stream of data from standard input, and writes the result to standard
-output.
-Since its operation is fully symmetrical, feeding the encrypted data
-stream again through the engine (using the same secret key) will
-decrypt it.
-.Pp
-There are several ways to provide the secret key to the program.
-By
-default, the program prompts the user on the controlling terminal for
-the key, using
-.Xr getpass 3 .
-This is the only safe way of providing it.
-.Pp
-Alternatively, the key can be provided as the sole command-line
-argument
-.Ar password
-when starting the program.
-Obviously, this way the key can easily be
-spotted by other users running
-.Xr ps 1 .
-As yet another alternative,
-.Nm
-can be given the option
-.Fl k ,
-and it will take the key from the environment variable
-.Ev CrYpTkEy .
-While this at a first glance seems to be more secure than the previous
-option, it actually is not since environment variables can also be
-examined with
-.Xr ps 1 .
-Thus this option is mainly provided for compatibility with other
-implementations of
-.Nm .
-.Pp
-When specifying the option
-.Fl s ,
-.Nm
-modifies the encryption engine in a way that is supposed to make it a
-little more secure, but incompatible with other implementations.
-.Pp
-.Ss Warning
-The cryptographic value of
-.Nm
-is rather small.
-This program is only provided here for compatibility
-with other operating systems that also provide an implementation
-(usually called
-.Xr crypt 1
-there).
-For real encryption, refer to
-.Xr bdes 1 ,
-.Xr openssl 1 ,
-.Xr pgp 1 Pq Pa ports/security/pgp ,
-or
-.Xr gpg 1 Pq Pa ports/security/gnupg .
-However, restrictions for exporting,
-importing or using such tools might exist in some countries, so those
-stronger programs are not being shipped as part of the operating
-system by default.
-.Sh ENVIRONMENT
-.Bl -tag -offset indent -width ".Ev CrYpTkEy"
-.It Ev CrYpTkEy
-used to obtain the secret key when option
-.Fl k
-has been given
-.El
-.Sh EXAMPLES
-.Bd -literal -offset indent
-man enigma | enigma > encrypted
-Enter key: (XXX \(em key not echoed)
-.Ed
-.Pp
-This will create an encrypted form of this man page, and store it in
-the file
-.Pa encrypted .
-.Bd -literal -offset indent
-enigma XXX < encrypted
-.Ed
-.Pp
-This displays the previously created file on the terminal.
-.Sh SEE ALSO
-.Xr bdes 1 ,
-.Xr gpg 1 ,
-.Xr openssl 1 ,
-.Xr pgp 1 ,
-.Xr ps 1 ,
-.Xr getpass 3
-.Sh HISTORY
-Implementations of
-.Nm crypt
-are very common among
-.Ux
-operating systems.
-This implementation has been taken from the
-.Em Cryptbreakers Workbench
-which is in the public domain.
diff --git a/usr.bin/enigma/enigma.c b/usr.bin/enigma/enigma.c
deleted file mode 100644
index 68fd29d..0000000
--- a/usr.bin/enigma/enigma.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/*-
- * "enigma.c" is in file cbw.tar from
- * anonymous FTP host watmsg.waterloo.edu: pub/crypt/cbw.tar.Z
- *
- * A one-rotor machine designed along the lines of Enigma
- * but considerably trivialized.
- *
- * A public-domain replacement for the UNIX "crypt" command.
- *
- * Upgraded to function properly on 64-bit machines.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#define MINUSKVAR "CrYpTkEy"
-
-#define ECHO 010
-#define ROTORSZ 256
-#define MASK 0377
-char t1[ROTORSZ];
-char t2[ROTORSZ];
-char t3[ROTORSZ];
-char deck[ROTORSZ];
-char buf[13];
-
-void shuffle(char *);
-void setup(char *);
-
-void
-setup(char *pw)
-{
- int ic, i, k, temp;
- char salt[3];
- unsigned rnd;
- int32_t seed;
-
- strlcpy(salt, pw, sizeof(salt));
- memcpy(buf, crypt(pw, salt), sizeof(buf));
- seed = 123;
- for (i=0; i<13; i++)
- seed = seed*buf[i] + i;
- for(i=0;i<ROTORSZ;i++) {
- t1[i] = i;
- deck[i] = i;
- }
- for(i=0;i<ROTORSZ;i++) {
- seed = 5*seed + buf[i%13];
- rnd = seed % 65521;
- k = ROTORSZ-1 - i;
- ic = (rnd&MASK)%(k+1);
- rnd >>= 8;
- temp = t1[k];
- t1[k] = t1[ic];
- t1[ic] = temp;
- if(t3[k]!=0) continue;
- ic = (rnd&MASK) % k;
- while(t3[ic]!=0) ic = (ic+1) % k;
- t3[k] = ic;
- t3[ic] = k;
- }
- for(i=0;i<ROTORSZ;i++)
- t2[t1[i]&MASK] = i;
-}
-
-int
-main(int argc, char *argv[])
-{
- int i, n1, n2, nr1, nr2;
- int secureflg = 0, kflag = 0;
- char *cp;
-
- if (argc > 1 && argv[1][0] == '-') {
- if (argv[1][1] == 's') {
- argc--;
- argv++;
- secureflg = 1;
- } else if (argv[1][1] == 'k') {
- argc--;
- argv++;
- kflag = 1;
- }
- }
- if (kflag) {
- if ((cp = getenv(MINUSKVAR)) == NULL) {
- fprintf(stderr, "%s not set\n", MINUSKVAR);
- exit(1);
- }
- setup(cp);
- } else if (argc != 2) {
- setup(getpass("Enter key:"));
- }
- else
- setup(argv[1]);
- n1 = 0;
- n2 = 0;
- nr2 = 0;
-
- while((i=getchar()) != -1) {
- if (secureflg) {
- nr1 = deck[n1]&MASK;
- nr2 = deck[nr1]&MASK;
- } else {
- nr1 = n1;
- }
- i = t2[(t3[(t1[(i+nr1)&MASK]+nr2)&MASK]-nr2)&MASK]-nr1;
- putchar(i);
- n1++;
- if(n1==ROTORSZ) {
- n1 = 0;
- n2++;
- if(n2==ROTORSZ) n2 = 0;
- if (secureflg) {
- shuffle(deck);
- } else {
- nr2 = n2;
- }
- }
- }
-
- return 0;
-}
-
-void
-shuffle(char deckary[])
-{
- int i, ic, k, temp;
- unsigned rnd;
- static int32_t seed = 123;
-
- for(i=0;i<ROTORSZ;i++) {
- seed = 5*seed + buf[i%13];
- rnd = seed % 65521;
- k = ROTORSZ-1 - i;
- ic = (rnd&MASK)%(k+1);
- temp = deckary[k];
- deckary[k] = deckary[ic];
- deckary[ic] = temp;
- }
-}
diff --git a/usr.bin/env/Makefile b/usr.bin/env/Makefile
deleted file mode 100644
index bc1eea4..0000000
--- a/usr.bin/env/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= env
-SRCS= env.c envopts.c
-WARNS?= 6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/env/env.1 b/usr.bin/env/env.1
deleted file mode 100644
index 70955c0..0000000
--- a/usr.bin/env/env.1
+++ /dev/null
@@ -1,486 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" From @(#)printenv.1 8.1 (Berkeley) 6/6/93
-.\" From FreeBSD: src/usr.bin/printenv/printenv.1,v 1.17 2002/11/26 17:33:35 ru Exp
-.\" $FreeBSD$
-.\"
-.Dd April 17, 2008
-.Dt ENV 1
-.Os
-.Sh NAME
-.Nm env
-.Nd set environment and execute command, or print environment
-.Sh SYNOPSIS
-.Nm
-.Op Fl iv
-.Op Fl P Ar altpath
-.Op Fl S Ar string
-.Op Fl u Ar name
-.Op Ar name Ns = Ns Ar value ...
-.Op Ar utility Op Ar argument ...
-.Sh DESCRIPTION
-The
-.Nm
-utility executes another
-.Ar utility
-after modifying the environment as
-specified on the command line.
-Each
-.Ar name Ns = Ns Ar value
-option specifies the setting of an environment variable,
-.Ar name ,
-with a value of
-.Ar value .
-All such environment variables are set before the
-.Ar utility
-is executed.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl i
-Execute the
-.Ar utility
-with only those environment variables specified by
-.Ar name Ns = Ns Ar value
-options.
-The environment inherited
-by
-.Nm
-is ignored completely.
-.\" -P
-.It Fl P Ar altpath
-Search the set of directories as specified by
-.Ar altpath
-to locate the specified
-.Ar utility
-program, instead of using the value of the
-.Ev PATH
-environment variable.
-.\" -S
-.It Fl S Ar string
-Split apart the given
-.Ar string
-into multiple strings, and process each of the resulting strings
-as separate arguments to the
-.Nm
-utility.
-The
-.Fl S
-option recognizes some special character escape sequences and
-also supports environment-variable substitution, as described
-below.
-.\" -u
-.It Fl u Ar name
-If the environment variable
-.Ar name
-is in the environment, then remove it before processing the
-remaining options.
-This is similar to the
-.Ic unset
-command in
-.Xr sh 1 .
-The value for
-.Ar name
-must not include the
-.Ql =
-character.
-.\" -v
-.It Fl v
-Print verbose information for each step of processing done by the
-.Nm
-utility.
-Additional information will be printed if
-.Fl v
-is specified multiple times.
-.El
-.Pp
-The above options are only recognized when they are specified
-before any
-.Ar name Ns = Ns Ar value
-options.
-.Pp
-If no
-.Ar utility
-is specified,
-.Nm
-prints out the names and values
-of the variables in the environment, with one name/value pair per line.
-.\"
-.Ss Details of Fl S Ss (split-string) processing
-The processing of the
-.Fl S
-option will split the given
-.Ar string
-into separate arguments based on any space or <tab> characters found in the
-.Ar string .
-Each of those new arguments will then be treated as if it had been
-specified as a separate argument on the original
-.Nm
-command.
-.Pp
-Spaces and tabs may be embedded in one of those new arguments by using
-single
-.Pq Dq Li '
-or double
-.Pq Ql \&"
-quotes, or backslashes
-.Pq Ql \e .
-Single quotes will escape all non-single quote characters, up to
-the matching single quote.
-Double quotes will escape all non-double quote characters, up to
-the matching double quote.
-It is an error if the end of the
-.Ar string
-is reached before the matching quote character.
-.Pp
-If
-.Fl S
-would create a new argument that starts with the
-.Ql #
-character, then that argument and the remainder of the
-.Ar string
-will be ignored.
-The
-.Ql \e#
-sequence can be used when you want a new argument to start
-with a
-.Ql #
-character, without causing the remainder of the
-.Ar string
-to be skipped.
-.Pp
-While processing the
-.Ar string
-value,
-.Fl S
-processing will treat certain character combinations as escape
-sequences which represent some action to take.
-The character escape sequences are in backslash notation.
-The characters and their meanings are as follows:
-.Pp
-.Bl -tag -width indent -offset indent -compact
-.It Cm \ec
-Ignore the remaining characters in the
-.Ar string .
-This must not appear inside a double-quoted string.
-.It Cm \ef
-Replace with a <form-feed> character.
-.It Cm \en
-Replace with a <new-line> character.
-.It Cm \er
-Replace with a <carriage return> character.
-.It Cm \et
-Replace with a <tab> character.
-.It Cm \ev
-Replace with a <vertical tab> character.
-.It Cm \e#
-Replace with a
-.Ql #
-character.
-This would be useful when you need a
-.Ql #
-as the first character in one of the arguments created
-by splitting apart the given
-.Ar string .
-.It Cm \e$
-Replace with a
-.Ql $
-character.
-.It Cm \e_
-If this is found inside of a double-quoted string, then replace it
-with a single blank.
-If this is found outside of a quoted string, then treat this as the
-separator character between new arguments in the original
-.Ar string .
-.It Cm \e"
-Replace with a <double quote> character.
-.It Cm \e\'
-Replace with a <single quote> character.
-.It Cm \e\e
-Replace with a backslash character.
-.El
-.Pp
-The sequences for <single-quote> and backslash are the only sequences
-which are recognized inside of a single-quoted string.
-The other sequences have no special meaning inside a single-quoted
-string.
-All escape sequences are recognized inside of a double-quoted string.
-It is an error if a single
-.Ql \e
-character is followed by a character other than the ones listed above.
-.Pp
-The processing of
-.Fl S
-also supports substitution of values from environment variables.
-To do this, the name of the environment variable must be inside of
-.Ql ${} ,
-such as:
-.Li ${SOMEVAR} .
-The common shell syntax of
-.Li $SOMEVAR
-is not supported.
-All values substituted will be the values of the environment variables
-as they were when the
-.Nm
-utility was originally invoked.
-Those values will not be checked for any of the escape sequences as
-described above.
-And any settings of
-.Ar name Ns = Ns Ar value
-will not effect the values used for substitution in
-.Fl S
-processing.
-.Pp
-Also,
-.Fl S
-processing can not reference the value of the special parameters
-which are defined by most shells.
-For instance,
-.Fl S
-can not recognize special parameters such as:
-.Ql $* ,
-.Ql $@ ,
-.Ql $# ,
-.Ql $?
-or
-.Ql $$
-if they appear inside the given
-.Ar string .
-.\"
-.Ss Use in shell-scripts
-The
-.Nm
-utility is often used as the
-.Ar interpreter
-on the first line of interpreted scripts, as
-described in
-.Xr execve 2 .
-.Pp
-Note that the way the kernel parses the
-.Ql #!
-(first line) of an interpreted script has changed as of
-.Fx 6.0 .
-Prior to that, the
-.Fx
-kernel would split that first line into separate arguments based
-on any whitespace (space or <tab> characters) found in the line.
-So, if a script named
-.Pa /usr/local/bin/someport
-had a first line of:
-.Pp
-.Dl "#!/usr/local/bin/php -n -q -dsafe_mode=0"
-.Pp
-then the
-.Pa /usr/local/bin/php
-program would have been started with the arguments of:
-.Bd -literal -offset indent
-arg[0] = '/usr/local/bin/php'
-arg[1] = '-n'
-arg[2] = '-q'
-arg[3] = '-dsafe_mode=0'
-arg[4] = '/usr/local/bin/someport'
-.Ed
-.Pp
-plus any arguments the user specified when executing
-.Pa someport .
-However, this processing of multiple options on the
-.Ql #!
-line is not the way any other operating system parses the
-first line of an interpreted script.
-So after a change which was made for
-.Fx 6.0
-release, that script will result in
-.Pa /usr/local/bin/php
-being started with the arguments of:
-.Bd -literal -offset indent
-arg[0] = '/usr/local/bin/php'
-arg[1] = '-n -q -dsafe_mode=0'
-arg[2] = '/usr/local/bin/someport'
-.Ed
-.Pp
-plus any arguments the user specified.
-This caused a significant change in the behavior of a few scripts.
-In the case of above script, to have it behave the same way under
-.Fx 6.0
-as it did under earlier releases, the first line should be
-changed to:
-.Pp
-.Dl "#!/usr/bin/env -S /usr/local/bin/php -n -q -dsafe_mode=0"
-.Pp
-The
-.Nm
-utility will be started with the entire line as a single
-argument:
-.Pp
-.Dl "arg[1] = '-S /usr/local/bin/php -n -q -dsafe_mode=0'"
-.Pp
-and then
-.Fl S
-processing will split that line into separate arguments before
-executing
-.Pa /usr/local/bin/php .
-.\"
-.Sh ENVIRONMENT
-The
-.Nm
-utility uses the
-.Ev PATH
-environment variable to locate the requested
-.Ar utility
-if the name contains no
-.Ql /
-characters, unless the
-.Fl P
-option has been specified.
-.Sh EXIT STATUS
-.Ex -std
-An exit status of 126 indicates that
-.Ar utility
-was found, but could not be executed.
-An exit status of 127 indicates that
-.Ar utility
-could not be found.
-.Sh EXAMPLES
-Since the
-.Nm
-utility is often used as part of the first line of an interpreted script,
-the following examples show a number of ways that the
-.Nm
-utility can be useful in scripts.
-.Pp
-The kernel processing of an interpreted script does not allow a script
-to directly reference some other script as its own interpreter.
-As a way around this, the main difference between
-.Pp
-.Dl #!/usr/local/bin/foo
-and
-.Dl "#!/usr/bin/env /usr/local/bin/foo"
-.Pp
-is that the latter works even if
-.Pa /usr/local/bin/foo
-is itself an interpreted script.
-.Pp
-Probably the most common use of
-.Nm
-is to find the correct interpreter for a script, when the interpreter
-may be in different directories on different systems.
-The following example will find the
-.Ql perl
-interpreter by searching through the directories specified by
-.Ev PATH .
-.Pp
-.Dl "#!/usr/bin/env perl"
-.Pp
-One limitation of that example is that it assumes the user's value
-for
-.Ev PATH
-is set to a value which will find the interpreter you want
-to execute.
-The
-.Fl P
-option can be used to make sure a specific list of directories is
-used in the search for
-.Ar utility .
-Note that the
-.Fl S
-option is also required for this example to work correctly.
-.Pp
-.Dl "#!/usr/bin/env -S -P/usr/local/bin:/usr/bin perl"
-.Pp
-The above finds
-.Ql perl
-only if it is in
-.Pa /usr/local/bin
-or
-.Pa /usr/bin .
-That could be combined with the present value of
-.Ev PATH ,
-to provide more flexibility.
-Note that spaces are not required between the
-.Fl S
-and
-.Fl P
-options:
-.Pp
-.Dl "#!/usr/bin/env -S-P/usr/local/bin:/usr/bin:${PATH} perl"
-.Sh COMPATIBILITY
-The
-.Nm
-utility accepts the
-.Fl
-option as a synonym for
-.Fl i .
-.Sh SEE ALSO
-.Xr printenv 1 ,
-.Xr sh 1 ,
-.Xr execvp 3 ,
-.Xr environ 7
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-The
-.Fl P , S , u
-and
-.Fl v
-options are non-standard extensions supported by
-.Fx ,
-but which may not be available on other operating systems.
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.4 .
-The
-.Fl P , S
-and
-.Fl v
-options were added in
-.Fx 6.0 .
-.Sh BUGS
-The
-.Nm
-utility does not handle values of
-.Ar utility
-which have an equals sign
-.Pq Ql =
-in their name, for obvious reasons.
-.Pp
-The
-.Nm
-utility does not take multibyte characters into account when
-processing the
-.Fl S
-option, which may lead to incorrect results in some locales.
diff --git a/usr.bin/env/env.c b/usr.bin/env/env.c
deleted file mode 100644
index 34f1e73..0000000
--- a/usr.bin/env/env.c
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (c) 1988, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1988, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)env.c 8.3 (Berkeley) 4/2/94";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include "envopts.h"
-
-extern char **environ;
-
-int env_verbosity;
-
-static void usage(void);
-
-int
-main(int argc, char **argv)
-{
- char *altpath, **ep, *p, **parg;
- char *cleanenv[1];
- int ch, want_clear;
- int rtrn;
-
- altpath = NULL;
- want_clear = 0;
- while ((ch = getopt(argc, argv, "-iP:S:u:v")) != -1)
- switch(ch) {
- case '-':
- case 'i':
- want_clear = 1;
- break;
- case 'P':
- altpath = strdup(optarg);
- break;
- case 'S':
- /*
- * The -S option, for "split string on spaces, with
- * support for some simple substitutions"...
- */
- split_spaces(optarg, &optind, &argc, &argv);
- break;
- case 'u':
- if (env_verbosity)
- fprintf(stderr, "#env unset:\t%s\n", optarg);
- rtrn = unsetenv(optarg);
- if (rtrn == -1)
- err(EXIT_FAILURE, "unsetenv %s", optarg);
- break;
- case 'v':
- env_verbosity++;
- if (env_verbosity > 1)
- fprintf(stderr, "#env verbosity now at %d\n",
- env_verbosity);
- break;
- case '?':
- default:
- usage();
- }
- if (want_clear) {
- environ = cleanenv;
- cleanenv[0] = NULL;
- if (env_verbosity)
- fprintf(stderr, "#env clearing environ\n");
- }
- for (argv += optind; *argv && (p = strchr(*argv, '=')); ++argv) {
- if (env_verbosity)
- fprintf(stderr, "#env setenv:\t%s\n", *argv);
- *p = '\0';
- rtrn = setenv(*argv, p + 1, 1);
- *p = '=';
- if (rtrn == -1)
- err(EXIT_FAILURE, "setenv %s", *argv);
- }
- if (*argv) {
- if (altpath)
- search_paths(altpath, argv);
- if (env_verbosity) {
- fprintf(stderr, "#env executing:\t%s\n", *argv);
- for (parg = argv, argc = 0; *parg; parg++, argc++)
- fprintf(stderr, "#env arg[%d]=\t'%s'\n",
- argc, *parg);
- if (env_verbosity > 1)
- sleep(1);
- }
- execvp(*argv, argv);
- err(errno == ENOENT ? 127 : 126, "%s", *argv);
- }
- for (ep = environ; *ep; ep++)
- (void)printf("%s\n", *ep);
- exit(0);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr,
- "usage: env [-iv] [-P utilpath] [-S string] [-u name]\n"
- " [name=value ...] [utility [argument ...]]\n");
- exit(1);
-}
diff --git a/usr.bin/env/envopts.c b/usr.bin/env/envopts.c
deleted file mode 100644
index f821430..0000000
--- a/usr.bin/env/envopts.c
+++ /dev/null
@@ -1,468 +0,0 @@
-/*-
- * Copyright (c) 2005 - Garance Alistair Drosehn <gad@FreeBSD.org>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation
- * are those of the authors and should not be interpreted as representing
- * official policies, either expressed or implied, of the FreeBSD Project.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/stat.h>
-#include <sys/param.h>
-#include <err.h>
-#include <errno.h>
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "envopts.h"
-
-static const char *
- expand_vars(int in_thisarg, char **thisarg_p, char **dest_p,
- const char **src_p);
-static int is_there(char *candidate);
-
-/*
- * The is*() routines take a parameter of 'int', but expect values in the range
- * of unsigned char. Define some wrappers which take a value of type 'char',
- * whether signed or unsigned, and ensure the value ends up in the right range.
- */
-#define isalnumch(Anychar) isalnum((u_char)(Anychar))
-#define isalphach(Anychar) isalpha((u_char)(Anychar))
-#define isspacech(Anychar) isspace((u_char)(Anychar))
-
-/*
- * Routine to determine if a given fully-qualified filename is executable.
- * This is copied almost verbatim from FreeBSD's usr.bin/which/which.c.
- */
-static int
-is_there(char *candidate)
-{
- struct stat fin;
-
- /* XXX work around access(2) false positives for superuser */
- if (access(candidate, X_OK) == 0 &&
- stat(candidate, &fin) == 0 &&
- S_ISREG(fin.st_mode) &&
- (getuid() != 0 ||
- (fin.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) != 0)) {
- if (env_verbosity > 1)
- fprintf(stderr, "#env matched:\t'%s'\n", candidate);
- return (1);
- }
- return (0);
-}
-
-/**
- * Routine to search through an alternate path-list, looking for a given
- * filename to execute. If the file is found, replace the original
- * unqualified name with a fully-qualified path. This allows `env' to
- * execute programs from a specific strict list of possible paths, without
- * changing the value of PATH seen by the program which will be executed.
- * E.G.:
- * #!/usr/bin/env -S-P/usr/local/bin:/usr/bin perl
- * will execute /usr/local/bin/perl or /usr/bin/perl (whichever is found
- * first), no matter what the current value of PATH is, and without
- * changing the value of PATH that the script will see when it runs.
- *
- * This is similar to the print_matches() routine in usr.bin/which/which.c.
- */
-void
-search_paths(char *path, char **argv)
-{
- char candidate[PATH_MAX];
- const char *d;
- char *filename, *fqname;
-
- /* If the file has a `/' in it, then no search is done */
- filename = *argv;
- if (strchr(filename, '/') != NULL)
- return;
-
- if (env_verbosity > 1) {
- fprintf(stderr, "#env Searching:\t'%s'\n", path);
- fprintf(stderr, "#env for file:\t'%s'\n", filename);
- }
-
- fqname = NULL;
- while ((d = strsep(&path, ":")) != NULL) {
- if (*d == '\0')
- d = ".";
- if (snprintf(candidate, sizeof(candidate), "%s/%s", d,
- filename) >= (int)sizeof(candidate))
- continue;
- if (is_there(candidate)) {
- fqname = candidate;
- break;
- }
- }
-
- if (fqname == NULL) {
- errno = ENOENT;
- err(127, "%s", filename);
- }
- *argv = strdup(candidate);
-}
-
-/**
- * Routine to split a string into multiple parameters, while recognizing a
- * few special characters. It recognizes both single and double-quoted
- * strings. This processing is designed entirely for the benefit of the
- * parsing of "#!"-lines (aka "shebang" lines == the first line of an
- * executable script). Different operating systems parse that line in very
- * different ways, and this split-on-spaces processing is meant to provide
- * ways to specify arbitrary arguments on that line, no matter how the OS
- * parses it.
- *
- * Within a single-quoted string, the two characters "\'" are treated as
- * a literal "'" character to add to the string, and "\\" are treated as
- * a literal "\" character to add. Other than that, all characters are
- * copied until the processing gets to a terminating "'".
- *
- * Within a double-quoted string, many more "\"-style escape sequences
- * are recognized, mostly copied from what is recognized in the `printf'
- * command. Some OS's will not allow a literal blank character to be
- * included in the one argument that they recognize on a shebang-line,
- * so a few additional escape-sequences are defined to provide ways to
- * specify blanks.
- *
- * Within a double-quoted string "\_" is turned into a literal blank.
- * (Inside of a single-quoted string, the two characters are just copied)
- * Outside of a quoted string, "\_" is treated as both a blank, and the
- * end of the current argument. So with a shelbang-line of:
- * #!/usr/bin/env -SA=avalue\_perl
- * the -S value would be broken up into arguments "A=avalue" and "perl".
- */
-void
-split_spaces(const char *str, int *origind, int *origc, char ***origv)
-{
- static const char *nullarg = "";
- const char *bq_src, *copystr, *src;
- char *dest, **newargv, *newstr, **nextarg, **oldarg;
- int addcount, bq_destlen, copychar, found_sep, in_arg, in_dq, in_sq;
-
- /*
- * Ignore leading space on the string, and then malloc enough room
- * to build a copy of it. The copy might end up shorter than the
- * original, due to quoted strings and '\'-processing.
- */
- while (isspacech(*str))
- str++;
- if (*str == '\0')
- return;
- newstr = malloc(strlen(str) + 1);
-
- /*
- * Allocate plenty of space for the new array of arg-pointers,
- * and start that array off with the first element of the old
- * array.
- */
- newargv = malloc((*origc + (strlen(str) / 2) + 2) * sizeof(char *));
- nextarg = newargv;
- *nextarg++ = **origv;
-
- /* Come up with the new args by splitting up the given string. */
- addcount = 0;
- bq_destlen = in_arg = in_dq = in_sq = 0;
- bq_src = NULL;
- for (src = str, dest = newstr; *src != '\0'; src++) {
- /*
- * This switch will look at a character in *src, and decide
- * what should be copied to *dest. It only decides what
- * character(s) to copy, it should not modify *dest. In some
- * cases, it will look at multiple characters from *src.
- */
- copychar = found_sep = 0;
- copystr = NULL;
- switch (*src) {
- case '"':
- if (in_sq)
- copychar = *src;
- else if (in_dq)
- in_dq = 0;
- else {
- /*
- * Referencing nullarg ensures that a new
- * argument is created, even if this quoted
- * string ends up with zero characters.
- */
- copystr = nullarg;
- in_dq = 1;
- bq_destlen = dest - *(nextarg - 1);
- bq_src = src;
- }
- break;
- case '$':
- if (in_sq)
- copychar = *src;
- else {
- copystr = expand_vars(in_arg, (nextarg - 1),
- &dest, &src);
- }
- break;
- case '\'':
- if (in_dq)
- copychar = *src;
- else if (in_sq)
- in_sq = 0;
- else {
- /*
- * Referencing nullarg ensures that a new
- * argument is created, even if this quoted
- * string ends up with zero characters.
- */
- copystr = nullarg;
- in_sq = 1;
- bq_destlen = dest - *(nextarg - 1);
- bq_src = src;
- }
- break;
- case '\\':
- if (in_sq) {
- /*
- * Inside single-quoted strings, only the
- * "\'" and "\\" are recognized as special
- * strings.
- */
- copychar = *(src + 1);
- if (copychar == '\'' || copychar == '\\')
- src++;
- else
- copychar = *src;
- break;
- }
- src++;
- switch (*src) {
- case '"':
- case '#':
- case '$':
- case '\'':
- case '\\':
- copychar = *src;
- break;
- case '_':
- /*
- * Alternate way to get a blank, which allows
- * that blank be used to separate arguments
- * when it is not inside a quoted string.
- */
- if (in_dq)
- copychar = ' ';
- else {
- found_sep = 1;
- src++;
- }
- break;
- case 'c':
- /*
- * Ignore remaining characters in the -S string.
- * This would not make sense if found in the
- * middle of a quoted string.
- */
- if (in_dq)
- errx(1, "Sequence '\\%c' is not allowed"
- " in quoted strings", *src);
- goto str_done;
- case 'f':
- copychar = '\f';
- break;
- case 'n':
- copychar = '\n';
- break;
- case 'r':
- copychar = '\r';
- break;
- case 't':
- copychar = '\t';
- break;
- case 'v':
- copychar = '\v';
- break;
- default:
- if (isspacech(*src))
- copychar = *src;
- else
- errx(1, "Invalid sequence '\\%c' in -S",
- *src);
- }
- break;
- default:
- if ((in_dq || in_sq) && in_arg)
- copychar = *src;
- else if (isspacech(*src))
- found_sep = 1;
- else {
- /*
- * If the first character of a new argument
- * is `#', then ignore the remaining chars.
- */
- if (!in_arg && *src == '#')
- goto str_done;
- copychar = *src;
- }
- }
- /*
- * Now that the switch has determined what (if anything)
- * needs to be copied, copy whatever that is to *dest.
- */
- if (copychar || copystr != NULL) {
- if (!in_arg) {
- /* This is the first byte of a new argument */
- *nextarg++ = dest;
- addcount++;
- in_arg = 1;
- }
- if (copychar)
- *dest++ = (char)copychar;
- else if (copystr != NULL)
- while (*copystr != '\0')
- *dest++ = *copystr++;
- } else if (found_sep) {
- *dest++ = '\0';
- while (isspacech(*src))
- src++;
- --src;
- in_arg = 0;
- }
- }
-str_done:
- *dest = '\0';
- *nextarg = NULL;
- if (in_dq || in_sq) {
- errx(1, "No terminating quote for string: %.*s%s",
- bq_destlen, *(nextarg - 1), bq_src);
- }
- if (env_verbosity > 1) {
- fprintf(stderr, "#env split -S:\t'%s'\n", str);
- oldarg = newargv + 1;
- fprintf(stderr, "#env into:\t'%s'\n", *oldarg);
- for (oldarg++; *oldarg; oldarg++)
- fprintf(stderr, "#env &\t'%s'\n", *oldarg);
- }
-
- /* Copy the unprocessed arg-pointers from the original array */
- for (oldarg = *origv + *origind; *oldarg; oldarg++)
- *nextarg++ = *oldarg;
- *nextarg = NULL;
-
- /* Update optind/argc/argv in the calling routine */
- *origind = 1;
- *origc += addcount;
- *origv = newargv;
-}
-
-/**
- * Routine to split expand any environment variables referenced in the string
- * that -S is processing. For now it only supports the form ${VARNAME}. It
- * explicitly does not support $VARNAME, and obviously can not handle special
- * shell-variables such as $?, $*, $1, etc. It is called with *src_p pointing
- * at the initial '$', and if successful it will update *src_p, *dest_p, and
- * possibly *thisarg_p in the calling routine.
- */
-static const char *
-expand_vars(int in_thisarg, char **thisarg_p, char **dest_p, const char **src_p)
-{
- const char *vbegin, *vend, *vvalue;
- char *newstr, *vname;
- int bad_reference;
- size_t namelen, newlen;
-
- bad_reference = 1;
- vbegin = vend = (*src_p) + 1;
- if (*vbegin++ == '{')
- if (*vbegin == '_' || isalphach(*vbegin)) {
- vend = vbegin + 1;
- while (*vend == '_' || isalnumch(*vend))
- vend++;
- if (*vend == '}')
- bad_reference = 0;
- }
- if (bad_reference)
- errx(1, "Only ${VARNAME} expansion is supported, error at: %s",
- *src_p);
-
- /*
- * We now know we have a valid environment variable name, so update
- * the caller's source-pointer to the last character in that reference,
- * and then pick up the matching value. If the variable is not found,
- * or if it has a null value, then our work here is done.
- */
- *src_p = vend;
- namelen = vend - vbegin + 1;
- vname = malloc(namelen);
- strlcpy(vname, vbegin, namelen);
- vvalue = getenv(vname);
- if (vvalue == NULL || *vvalue == '\0') {
- if (env_verbosity > 2)
- fprintf(stderr,
- "#env replacing ${%s} with null string\n",
- vname);
- free(vname);
- return (NULL);
- }
-
- if (env_verbosity > 2)
- fprintf(stderr, "#env expanding ${%s} into '%s'\n", vname,
- vvalue);
-
- /*
- * There is some value to copy to the destination. If the value is
- * shorter than the ${VARNAME} reference that it replaces, then our
- * caller can just copy the value to the existing destination.
- */
- if (strlen(vname) + 3 >= strlen(vvalue)) {
- free(vname);
- return (vvalue);
- }
-
- /*
- * The value is longer than the string it replaces, which means the
- * present destination area is too small to hold it. Create a new
- * destination area, and update the caller's 'dest' variable to match.
- * If the caller has already started copying some info for 'thisarg'
- * into the present destination, then the new destination area must
- * include a copy of that data, and the pointer to 'thisarg' must also
- * be updated. Note that it is still the caller which copies this
- * vvalue to the new *dest.
- */
- newlen = strlen(vvalue) + strlen(*src_p) + 1;
- if (in_thisarg) {
- **dest_p = '\0'; /* Provide terminator for 'thisarg' */
- newlen += strlen(*thisarg_p);
- newstr = malloc(newlen);
- strcpy(newstr, *thisarg_p);
- *thisarg_p = newstr;
- } else {
- newstr = malloc(newlen);
- *newstr = '\0';
- }
- *dest_p = strchr(newstr, '\0');
- free(vname);
- return (vvalue);
-}
diff --git a/usr.bin/env/envopts.h b/usr.bin/env/envopts.h
deleted file mode 100644
index 1f15c69..0000000
--- a/usr.bin/env/envopts.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*-
- * Copyright (c) 2005 - Garance Alistair Drosehn <gad@FreeBSD.org>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation
- * are those of the authors and should not be interpreted as representing
- * official policies, either expressed or implied, of the FreeBSD Project.
- *
- * $FreeBSD$
- */
-
-void search_paths(char *path, char **argv);
-void split_spaces(const char *str, int *origind, int *origc,
- char ***origv);
-
-extern int env_verbosity;
diff --git a/usr.bin/expand/Makefile b/usr.bin/expand/Makefile
deleted file mode 100644
index c6b339c..0000000
--- a/usr.bin/expand/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/9/93
-# $FreeBSD$
-
-PROG= expand
-MLINKS= expand.1 unexpand.1
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/expand/expand.1 b/usr.bin/expand/expand.1
deleted file mode 100644
index 0ca6dcb..0000000
--- a/usr.bin/expand/expand.1
+++ /dev/null
@@ -1,118 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)expand.1 8.1 (Berkeley) 6/9/93
-.\" $FreeBSD$
-.\"
-.Dd October 13, 2006
-.Dt EXPAND 1
-.Os
-.Sh NAME
-.Nm expand ,
-.Nm unexpand
-.Nd expand tabs to spaces, and vice versa
-.Sh SYNOPSIS
-.Nm
-.Oo
-.Fl t
-.Sm off
-.Ar tab1 , tab2 , ... , tabn
-.Sm on
-.Oc
-.Op Ar
-.Nm unexpand
-.Oo
-.Fl a | t
-.Sm off
-.Ar tab1 , tab2 , ... , tabn
-.Sm on
-.Oc
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility processes the named files or the standard input writing
-the standard output with tabs changed into blanks.
-Backspace characters are preserved into the output and decrement
-the column count for tab calculations.
-The
-.Nm
-utility is useful for pre-processing character files
-(before sorting, looking at specific columns, etc.) that
-contain tabs.
-.Pp
-The
-.Nm unexpand
-utility puts tabs back into the data from the standard input or the named
-files and writes the result on the standard output.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl a
-.Nm ( unexpand
-only.)
-By default, only leading blanks and tabs
-are reconverted to maximal strings of tabs.
-If the
-.Fl a
-option is given, then tabs are inserted whenever they would compress the
-resultant file by replacing two or more characters.
-.It Fl t Sm Ar tab1 , tab2 , ... , tabn Sm
-Set tab stops at column positions
-.Ar tab1 , tab2 , ... , tabn .
-If only a single number is given, tab stops are set that number of
-column positions apart instead of the default number of 8.
-.El
-.Sh ENVIRONMENT
-The
-.Ev LANG , LC_ALL
-and
-.Ev LC_CTYPE
-environment variables affect the execution of
-.Nm
-and
-.Nm unexpand
-as described in
-.Xr environ 7 .
-.Sh EXIT STATUS
-.Ex -std expand unexpand
-.Sh STANDARDS
-The
-.Nm
-and
-.Nm unexpand
-utilities conform to
-.St -p1003.1-2001 .
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3.0 .
diff --git a/usr.bin/expand/expand.c b/usr.bin/expand/expand.c
deleted file mode 100644
index 6c99db8..0000000
--- a/usr.bin/expand/expand.c
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)expand.c 8.1 (Berkeley) 6/9/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <ctype.h>
-#include <err.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <wchar.h>
-#include <wctype.h>
-
-/*
- * expand - expand tabs to equivalent spaces
- */
-int nstops;
-int tabstops[100];
-
-static void getstops(char *);
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- const char *curfile;
- wint_t wc;
- int c, column;
- int n;
- int rval;
- int width;
-
- setlocale(LC_CTYPE, "");
-
- /* handle obsolete syntax */
- while (argc > 1 && argv[1][0] == '-' &&
- isdigit((unsigned char)argv[1][1])) {
- getstops(&argv[1][1]);
- argc--; argv++;
- }
-
- while ((c = getopt (argc, argv, "t:")) != -1) {
- switch (c) {
- case 't':
- getstops(optarg);
- break;
- case '?':
- default:
- usage();
- /* NOTREACHED */
- }
- }
- argc -= optind;
- argv += optind;
-
- rval = 0;
- do {
- if (argc > 0) {
- if (freopen(argv[0], "r", stdin) == NULL) {
- warn("%s", argv[0]);
- rval = 1;
- argc--, argv++;
- continue;
- }
- curfile = argv[0];
- argc--, argv++;
- } else
- curfile = "stdin";
- column = 0;
- while ((wc = getwchar()) != WEOF) {
- switch (wc) {
- case '\t':
- if (nstops == 0) {
- do {
- putwchar(' ');
- column++;
- } while (column & 07);
- continue;
- }
- if (nstops == 1) {
- do {
- putwchar(' ');
- column++;
- } while (((column - 1) % tabstops[0]) != (tabstops[0] - 1));
- continue;
- }
- for (n = 0; n < nstops; n++)
- if (tabstops[n] > column)
- break;
- if (n == nstops) {
- putwchar(' ');
- column++;
- continue;
- }
- while (column < tabstops[n]) {
- putwchar(' ');
- column++;
- }
- continue;
-
- case '\b':
- if (column)
- column--;
- putwchar('\b');
- continue;
-
- default:
- putwchar(wc);
- if ((width = wcwidth(wc)) > 0)
- column += width;
- continue;
-
- case '\n':
- putwchar(wc);
- column = 0;
- continue;
- }
- }
- if (ferror(stdin)) {
- warn("%s", curfile);
- rval = 1;
- }
- } while (argc > 0);
- exit(rval);
-}
-
-static void
-getstops(char *cp)
-{
- int i;
-
- nstops = 0;
- for (;;) {
- i = 0;
- while (*cp >= '0' && *cp <= '9')
- i = i * 10 + *cp++ - '0';
- if (i <= 0)
- errx(1, "bad tab stop spec");
- if (nstops > 0 && i <= tabstops[nstops-1])
- errx(1, "bad tab stop spec");
- if (nstops == sizeof(tabstops) / sizeof(*tabstops))
- errx(1, "too many tab stops");
- tabstops[nstops++] = i;
- if (*cp == 0)
- break;
- if (*cp != ',' && !isblank((unsigned char)*cp))
- errx(1, "bad tab stop spec");
- cp++;
- }
-}
-
-static void
-usage(void)
-{
- (void)fprintf (stderr, "usage: expand [-t tablist] [file ...]\n");
- exit(1);
-}
diff --git a/usr.bin/false/Makefile b/usr.bin/false/Makefile
deleted file mode 100644
index ffae97d..0000000
--- a/usr.bin/false/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= false
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/false/false.1 b/usr.bin/false/false.1
deleted file mode 100644
index 415ec58..0000000
--- a/usr.bin/false/false.1
+++ /dev/null
@@ -1,67 +0,0 @@
-.\" Copyright (c) 1983, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)false.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 6, 1993
-.Dt FALSE 1
-.Os
-.Sh NAME
-.Nm false
-.Nd return false value
-.Sh SYNOPSIS
-.Nm
-.Sh DESCRIPTION
-The
-.Nm
-utility always returns with a non-zero exit code.
-.Pp
-Some shells may provide a builtin
-.Nm
-command which is identical to this utility.
-Consult the
-.Xr builtin 1
-manual page.
-.Sh SEE ALSO
-.Xr builtin 1 ,
-.Xr csh 1 ,
-.Xr sh 1 ,
-.Xr true 1
-.Sh STANDARDS
-The
-.Nm
-utility is expected to be
-.St -p1003.2
-compatible.
diff --git a/usr.bin/false/false.c b/usr.bin/false/false.c
deleted file mode 100644
index 27b2c25..0000000
--- a/usr.bin/false/false.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1988, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static const char sccsid[] = "@(#)false.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-int
-main(void)
-{
- return 1;
-}
diff --git a/usr.bin/fetch/Makefile b/usr.bin/fetch/Makefile
deleted file mode 100644
index c422af8..0000000
--- a/usr.bin/fetch/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-# $FreeBSD$
-
-.include <bsd.own.mk>
-
-PROG= fetch
-CSTD?= c99
-WARNS?= 6
-DPADD= ${LIBFETCH}
-LDADD= -lfetch
-.if ${MK_OPENSSL} != "no"
-DPADD+= ${LIBSSL} ${LIBCRYPTO}
-LDADD+= -lssl -lcrypto
-.endif
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/fetch/fetch.1 b/usr.bin/fetch/fetch.1
deleted file mode 100644
index 3922db5..0000000
--- a/usr.bin/fetch/fetch.1
+++ /dev/null
@@ -1,283 +0,0 @@
-.\"-
-.\" Copyright (c) 2000-2004 Dag-Erling Coïdan Smørgrav
-.\" All rights reserved.
-.\" Portions Copyright (c) 1999 Massachusetts Institute of Technology; used
-.\" by permission.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer
-.\" in this position and unchanged.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. The name of the author may not be used to endorse or promote products
-.\" derived from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd March 11, 2003
-.Dt FETCH 1
-.Os
-.Sh NAME
-.Nm fetch
-.Nd retrieve a file by Uniform Resource Locator
-.Sh SYNOPSIS
-.Nm
-.Op Fl 146AFMPRUadlmnpqrsv
-.Op Fl B Ar bytes
-.Op Fl S Ar bytes
-.Op Fl T Ar seconds
-.Op Fl N Ar file
-.Op Fl o Ar file
-.Op Fl w Ar seconds
-.Op Fl h Ar host
-.Op Fl c Ar dir
-.Op Fl f Ar file
-.Op Ar URL ...
-.Sh DESCRIPTION
-The
-.Nm
-utility provides a command-line interface to the
-.Xr fetch 3
-library.
-Its purpose is to retrieve the file(s) pointed to by the URL(s) on the
-command line.
-.Pp
-The following options are available:
-.Bl -tag -width Fl
-.It Fl \&1
-Stop and return exit code 0 at the first successfully retrieved file.
-.It Fl 4
-Forces
-.Nm
-to use IPv4 addresses only.
-.It Fl 6
-Forces
-.Nm
-to use IPv6 addresses only.
-.It Fl A
-Do not automatically follow ``temporary'' (302) redirects.
-Some broken Web sites will return a redirect instead of a not-found
-error when the requested object does not exist.
-.It Fl a
-Automatically retry the transfer upon soft failures.
-.It Fl B Ar bytes
-Specify the read buffer size in bytes.
-The default is 4096 bytes.
-Attempts to set a buffer size lower than this will be silently
-ignored.
-The number of reads actually performed is reported at verbosity level
-two or higher (see the
-.Fl v
-flag).
-.It Fl c Ar dir
-The file to retrieve is in directory
-.Ar dir
-on the remote host.
-This option is deprecated and is provided for backward compatibility
-only.
-.It Fl d
-Use a direct connection even if a proxy is configured.
-.It Fl F
-In combination with the
-.Fl r
-flag, forces a restart even if the local and remote files have
-different modification times.
-Implies
-.Fl R .
-.It Fl f Ar file
-The file to retrieve is named
-.Ar file
-on the remote host.
-This option is deprecated and is provided for backward compatibility
-only.
-.It Fl h Ar host
-The file to retrieve is located on the host
-.Ar host .
-This option is deprecated and is provided for backward compatibility
-only.
-.It Fl l
-If the target is a file-scheme URL, make a symbolic link to the target
-rather than trying to copy it.
-.It Fl M
-.It Fl m
-Mirror mode: if the file already exists locally and has the same size
-and modification time as the remote file, it will not be fetched.
-Note that the
-.Fl m
-and
-.Fl r
-flags are mutually exclusive.
-.It Fl N Ar file
-Use
-.Ar file
-instead of
-.Pa ~/.netrc
-to look up login names and passwords for FTP sites.
-See
-.Xr ftp 1
-for a description of the file format.
-This feature is experimental.
-.It Fl n
-Do not preserve the modification time of the transferred file.
-.It Fl o Ar file
-Set the output file name to
-.Ar file .
-By default, a ``pathname'' is extracted from the specified URI, and
-its basename is used as the name of the output file.
-A
-.Ar file
-argument of
-.Sq Li \&-
-indicates that results are to be directed to the standard output.
-If the
-.Ar file
-argument is a directory, fetched file(s) will be placed within the
-directory, with name(s) selected as in the default behaviour.
-.It Fl P
-.It Fl p
-Use passive FTP.
-This is useful if you are behind a firewall which blocks incoming
-connections.
-Try this flag if
-.Nm
-seems to hang when retrieving FTP URLs.
-.It Fl q
-Quiet mode.
-.It Fl R
-The output files are precious, and should not be deleted under any
-circumstances, even if the transfer failed or was incomplete.
-.It Fl r
-Restart a previously interrupted transfer.
-Note that the
-.Fl m
-and
-.Fl r
-flags are mutually exclusive.
-.It Fl S Ar bytes
-Require the file size reported by the server to match the specified
-value.
-If it does not, a message is printed and the file is not fetched.
-If the server does not support reporting file sizes, this option is
-ignored and the file is fetched unconditionally.
-.It Fl s
-Print the size in bytes of each requested file, without fetching it.
-.It Fl T Ar seconds
-Set timeout value to
-.Ar seconds .
-Overrides the environment variables
-.Ev FTP_TIMEOUT
-for FTP transfers or
-.Ev HTTP_TIMEOUT
-for HTTP transfers if set.
-.It Fl U
-When using passive FTP, allocate the port for the data connection from
-the low (default) port range.
-See
-.Xr ip 4
-for details on how to specify which port range this corresponds to.
-.It Fl v
-Increase verbosity level.
-.It Fl w Ar seconds
-When the
-.Fl a
-flag is specified, wait this many seconds between successive retries.
-.El
-.Pp
-If
-.Nm
-receives a
-.Dv SIGINFO
-signal (see the
-.Cm status
-argument for
-.Xr stty 1 ) ,
-the current transfer rate statistics will be written to the
-standard error output, in the same format as the standard completion
-message.
-.Sh ENVIRONMENT
-.Bl -tag -width HTTP_TIMEOUT
-.It Ev FTP_TIMEOUT
-Maximum time, in seconds, to wait before aborting an FTP connection.
-.It Ev HTTP_TIMEOUT
-Maximum time, in seconds, to wait before aborting an HTTP connection.
-.El
-.Pp
-See
-.Xr fetch 3
-for a description of additional environment variables, including
-.Ev FETCH_BIND_ADDRESS ,
-.Ev FTP_LOGIN ,
-.Ev FTP_PASSIVE_MODE ,
-.Ev FTP_PASSWORD ,
-.Ev FTP_PROXY ,
-.Ev ftp_proxy ,
-.Ev HTTP_AUTH ,
-.Ev HTTP_PROXY ,
-.Ev http_proxy ,
-.Ev HTTP_PROXY_AUTH ,
-.Ev HTTP_REFERER ,
-.Ev HTTP_USER_AGENT ,
-.Ev NETRC ,
-.Ev NO_PROXY and
-.Ev no_proxy .
-.Sh EXIT STATUS
-The
-.Nm
-command returns zero on success, or one on failure.
-If multiple URLs are listed on the command line,
-.Nm
-will attempt to retrieve each one of them in turn, and will return
-zero only if they were all successfully retrieved.
-.Sh SEE ALSO
-.Xr fetch 3
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Fx 2.1.5 .
-This implementation first appeared in
-.Fx 4.1 .
-.Sh AUTHORS
-.An -nosplit
-The original implementation of
-.Nm
-was done by
-.An Jean-Marc Zucconi Aq jmz@FreeBSD.org .
-It was extensively re-worked for
-.Fx 2.2
-by
-.An Garrett Wollman Aq wollman@FreeBSD.org ,
-and later completely rewritten to use the
-.Xr fetch 3
-library by
-.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org .
-.Sh NOTES
-The
-.Fl b
-and
-.Fl t
-options are no longer supported and will generate warnings.
-They were workarounds for bugs in other OSes which this implementation
-does not trigger.
-.Pp
-One cannot both use the
-.Fl h ,
-.Fl c
-and
-.Fl f
-options and specify URLs on the command line.
diff --git a/usr.bin/fetch/fetch.c b/usr.bin/fetch/fetch.c
deleted file mode 100644
index 3dc276a..0000000
--- a/usr.bin/fetch/fetch.c
+++ /dev/null
@@ -1,985 +0,0 @@
-/*-
- * Copyright (c) 2000-2004 Dag-Erling Coïdan Smørgrav
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <signal.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysexits.h>
-#include <termios.h>
-#include <unistd.h>
-
-#include <fetch.h>
-
-#define MINBUFSIZE 4096
-
-/* Option flags */
-int A_flag; /* -A: do not follow 302 redirects */
-int a_flag; /* -a: auto retry */
-off_t B_size; /* -B: buffer size */
-int b_flag; /*! -b: workaround TCP bug */
-char *c_dirname; /* -c: remote directory */
-int d_flag; /* -d: direct connection */
-int F_flag; /* -F: restart without checking mtime */
-char *f_filename; /* -f: file to fetch */
-char *h_hostname; /* -h: host to fetch from */
-int l_flag; /* -l: link rather than copy file: URLs */
-int m_flag; /* -[Mm]: mirror mode */
-char *N_filename; /* -N: netrc file name */
-int n_flag; /* -n: do not preserve modification time */
-int o_flag; /* -o: specify output file */
-int o_directory; /* output file is a directory */
-char *o_filename; /* name of output file */
-int o_stdout; /* output file is stdout */
-int once_flag; /* -1: stop at first successful file */
-int p_flag; /* -[Pp]: use passive FTP */
-int R_flag; /* -R: don't delete partially transferred files */
-int r_flag; /* -r: restart previously interrupted transfer */
-off_t S_size; /* -S: require size to match */
-int s_flag; /* -s: show size, don't fetch */
-long T_secs = 120; /* -T: transfer timeout in seconds */
-int t_flag; /*! -t: workaround TCP bug */
-int U_flag; /* -U: do not use high ports */
-int v_level = 1; /* -v: verbosity level */
-int v_tty; /* stdout is a tty */
-pid_t pgrp; /* our process group */
-long w_secs; /* -w: retry delay */
-int family = PF_UNSPEC; /* -[46]: address family to use */
-
-int sigalrm; /* SIGALRM received */
-int siginfo; /* SIGINFO received */
-int sigint; /* SIGINT received */
-
-long ftp_timeout; /* default timeout for FTP transfers */
-long http_timeout; /* default timeout for HTTP transfers */
-char *buf; /* transfer buffer */
-
-
-/*
- * Signal handler
- */
-static void
-sig_handler(int sig)
-{
- switch (sig) {
- case SIGALRM:
- sigalrm = 1;
- break;
- case SIGINFO:
- siginfo = 1;
- break;
- case SIGINT:
- sigint = 1;
- break;
- }
-}
-
-struct xferstat {
- char name[64];
- struct timeval start;
- struct timeval last;
- off_t size;
- off_t offset;
- off_t rcvd;
-};
-
-/*
- * Compute and display ETA
- */
-static const char *
-stat_eta(struct xferstat *xs)
-{
- static char str[16];
- long elapsed, eta;
- off_t received, expected;
-
- elapsed = xs->last.tv_sec - xs->start.tv_sec;
- received = xs->rcvd - xs->offset;
- expected = xs->size - xs->rcvd;
- eta = (long)((double)elapsed * expected / received);
- if (eta > 3600)
- snprintf(str, sizeof str, "%02ldh%02ldm",
- eta / 3600, (eta % 3600) / 60);
- else
- snprintf(str, sizeof str, "%02ldm%02lds",
- eta / 60, eta % 60);
- return (str);
-}
-
-/*
- * Format a number as "xxxx YB" where Y is ' ', 'k', 'M'...
- */
-static const char *prefixes = " kMGTP";
-static const char *
-stat_bytes(off_t bytes)
-{
- static char str[16];
- const char *prefix = prefixes;
-
- while (bytes > 9999 && prefix[1] != '\0') {
- bytes /= 1024;
- prefix++;
- }
- snprintf(str, sizeof str, "%4jd %cB", (intmax_t)bytes, *prefix);
- return (str);
-}
-
-/*
- * Compute and display transfer rate
- */
-static const char *
-stat_bps(struct xferstat *xs)
-{
- static char str[16];
- double delta, bps;
-
- delta = (xs->last.tv_sec + (xs->last.tv_usec / 1.e6))
- - (xs->start.tv_sec + (xs->start.tv_usec / 1.e6));
- if (delta == 0.0) {
- snprintf(str, sizeof str, "?? Bps");
- } else {
- bps = (xs->rcvd - xs->offset) / delta;
- snprintf(str, sizeof str, "%sps", stat_bytes((off_t)bps));
- }
- return (str);
-}
-
-/*
- * Update the stats display
- */
-static void
-stat_display(struct xferstat *xs, int force)
-{
- struct timeval now;
- int ctty_pgrp;
-
- /* check if we're the foreground process */
- if (ioctl(STDERR_FILENO, TIOCGPGRP, &ctty_pgrp) == -1 ||
- (pid_t)ctty_pgrp != pgrp)
- return;
-
- gettimeofday(&now, NULL);
- if (!force && now.tv_sec <= xs->last.tv_sec)
- return;
- xs->last = now;
-
- fprintf(stderr, "\r%-46.46s", xs->name);
- if (xs->size <= 0) {
- setproctitle("%s [%s]", xs->name, stat_bytes(xs->rcvd));
- fprintf(stderr, " %s", stat_bytes(xs->rcvd));
- } else {
- setproctitle("%s [%d%% of %s]", xs->name,
- (int)((100.0 * xs->rcvd) / xs->size),
- stat_bytes(xs->size));
- fprintf(stderr, "%3d%% of %s",
- (int)((100.0 * xs->rcvd) / xs->size),
- stat_bytes(xs->size));
- }
- fprintf(stderr, " %s", stat_bps(xs));
- if (xs->size > 0 && xs->rcvd > 0 &&
- xs->last.tv_sec >= xs->start.tv_sec + 10)
- fprintf(stderr, " %s", stat_eta(xs));
-}
-
-/*
- * Initialize the transfer statistics
- */
-static void
-stat_start(struct xferstat *xs, const char *name, off_t size, off_t offset)
-{
- snprintf(xs->name, sizeof xs->name, "%s", name);
- gettimeofday(&xs->start, NULL);
- xs->last.tv_sec = xs->last.tv_usec = 0;
- xs->size = size;
- xs->offset = offset;
- xs->rcvd = offset;
- if (v_tty && v_level > 0)
- stat_display(xs, 1);
- else if (v_level > 0)
- fprintf(stderr, "%-46s", xs->name);
-}
-
-/*
- * Update the transfer statistics
- */
-static void
-stat_update(struct xferstat *xs, off_t rcvd)
-{
- xs->rcvd = rcvd;
- if (v_tty && v_level > 0)
- stat_display(xs, 0);
-}
-
-/*
- * Finalize the transfer statistics
- */
-static void
-stat_end(struct xferstat *xs)
-{
- gettimeofday(&xs->last, NULL);
- if (v_tty && v_level > 0) {
- stat_display(xs, 1);
- putc('\n', stderr);
- } else if (v_level > 0) {
- fprintf(stderr, " %s %s\n",
- stat_bytes(xs->size), stat_bps(xs));
- }
-}
-
-/*
- * Ask the user for authentication details
- */
-static int
-query_auth(struct url *URL)
-{
- struct termios tios;
- tcflag_t saved_flags;
- int i, nopwd;
-
- fprintf(stderr, "Authentication required for <%s://%s:%d/>!\n",
- URL->scheme, URL->host, URL->port);
-
- fprintf(stderr, "Login: ");
- if (fgets(URL->user, sizeof URL->user, stdin) == NULL)
- return (-1);
- for (i = strlen(URL->user); i >= 0; --i)
- if (URL->user[i] == '\r' || URL->user[i] == '\n')
- URL->user[i] = '\0';
-
- fprintf(stderr, "Password: ");
- if (tcgetattr(STDIN_FILENO, &tios) == 0) {
- saved_flags = tios.c_lflag;
- tios.c_lflag &= ~ECHO;
- tios.c_lflag |= ECHONL|ICANON;
- tcsetattr(STDIN_FILENO, TCSAFLUSH|TCSASOFT, &tios);
- nopwd = (fgets(URL->pwd, sizeof URL->pwd, stdin) == NULL);
- tios.c_lflag = saved_flags;
- tcsetattr(STDIN_FILENO, TCSANOW|TCSASOFT, &tios);
- } else {
- nopwd = (fgets(URL->pwd, sizeof URL->pwd, stdin) == NULL);
- }
- if (nopwd)
- return (-1);
- for (i = strlen(URL->pwd); i >= 0; --i)
- if (URL->pwd[i] == '\r' || URL->pwd[i] == '\n')
- URL->pwd[i] = '\0';
-
- return (0);
-}
-
-/*
- * Fetch a file
- */
-static int
-fetch(char *URL, const char *path)
-{
- struct url *url;
- struct url_stat us;
- struct stat sb, nsb;
- struct xferstat xs;
- FILE *f, *of;
- size_t size, wr;
- off_t count;
- char flags[8];
- const char *slash;
- char *tmppath;
- int r;
- unsigned timeout;
- char *ptr;
-
- f = of = NULL;
- tmppath = NULL;
-
- timeout = 0;
- *flags = 0;
- count = 0;
-
- /* set verbosity level */
- if (v_level > 1)
- strcat(flags, "v");
- if (v_level > 2)
- fetchDebug = 1;
-
- /* parse URL */
- if ((url = fetchParseURL(URL)) == NULL) {
- warnx("%s: parse error", URL);
- goto failure;
- }
-
- /* if no scheme was specified, take a guess */
- if (!*url->scheme) {
- if (!*url->host)
- strcpy(url->scheme, SCHEME_FILE);
- else if (strncasecmp(url->host, "ftp.", 4) == 0)
- strcpy(url->scheme, SCHEME_FTP);
- else if (strncasecmp(url->host, "www.", 4) == 0)
- strcpy(url->scheme, SCHEME_HTTP);
- }
-
- /* common flags */
- switch (family) {
- case PF_INET:
- strcat(flags, "4");
- break;
- case PF_INET6:
- strcat(flags, "6");
- break;
- }
-
- /* FTP specific flags */
- if (strcmp(url->scheme, SCHEME_FTP) == 0) {
- if (p_flag)
- strcat(flags, "p");
- if (d_flag)
- strcat(flags, "d");
- if (U_flag)
- strcat(flags, "l");
- timeout = T_secs ? T_secs : ftp_timeout;
- }
-
- /* HTTP specific flags */
- if (strcmp(url->scheme, SCHEME_HTTP) == 0) {
- if (d_flag)
- strcat(flags, "d");
- if (A_flag)
- strcat(flags, "A");
- timeout = T_secs ? T_secs : http_timeout;
- }
-
- /* set the protocol timeout. */
- fetchTimeout = timeout;
-
- /* just print size */
- if (s_flag) {
- if (timeout)
- alarm(timeout);
- r = fetchStat(url, &us, flags);
- if (timeout)
- alarm(0);
- if (sigalrm || sigint)
- goto signal;
- if (r == -1) {
- warnx("%s", fetchLastErrString);
- goto failure;
- }
- if (us.size == -1)
- printf("Unknown\n");
- else
- printf("%jd\n", (intmax_t)us.size);
- goto success;
- }
-
- /*
- * If the -r flag was specified, we have to compare the local
- * and remote files, so we should really do a fetchStat()
- * first, but I know of at least one HTTP server that only
- * sends the content size in response to GET requests, and
- * leaves it out of replies to HEAD requests. Also, in the
- * (frequent) case that the local and remote files match but
- * the local file is truncated, we have sufficient information
- * before the compare to issue a correct request. Therefore,
- * we always issue a GET request as if we were sure the local
- * file was a truncated copy of the remote file; we can drop
- * the connection later if we change our minds.
- */
- sb.st_size = -1;
- if (!o_stdout) {
- r = stat(path, &sb);
- if (r == 0 && r_flag && S_ISREG(sb.st_mode)) {
- url->offset = sb.st_size;
- } else if (r == -1 || !S_ISREG(sb.st_mode)) {
- /*
- * Whatever value sb.st_size has now is either
- * wrong (if stat(2) failed) or irrelevant (if the
- * path does not refer to a regular file)
- */
- sb.st_size = -1;
- }
- if (r == -1 && errno != ENOENT) {
- warnx("%s: stat()", path);
- goto failure;
- }
- }
-
- /* start the transfer */
- if (timeout)
- alarm(timeout);
- f = fetchXGet(url, &us, flags);
- if (timeout)
- alarm(0);
- if (sigalrm || sigint)
- goto signal;
- if (f == NULL) {
- warnx("%s: %s", URL, fetchLastErrString);
- goto failure;
- }
- if (sigint)
- goto signal;
-
- /* check that size is as expected */
- if (S_size) {
- if (us.size == -1) {
- warnx("%s: size unknown", URL);
- } else if (us.size != S_size) {
- warnx("%s: size mismatch: expected %jd, actual %jd",
- URL, (intmax_t)S_size, (intmax_t)us.size);
- goto failure;
- }
- }
-
- /* symlink instead of copy */
- if (l_flag && strcmp(url->scheme, "file") == 0 && !o_stdout) {
- if (symlink(url->doc, path) == -1) {
- warn("%s: symlink()", path);
- goto failure;
- }
- goto success;
- }
-
- if (us.size == -1 && !o_stdout && v_level > 0)
- warnx("%s: size of remote file is not known", URL);
- if (v_level > 1) {
- if (sb.st_size != -1)
- fprintf(stderr, "local size / mtime: %jd / %ld\n",
- (intmax_t)sb.st_size, (long)sb.st_mtime);
- if (us.size != -1)
- fprintf(stderr, "remote size / mtime: %jd / %ld\n",
- (intmax_t)us.size, (long)us.mtime);
- }
-
- /* open output file */
- if (o_stdout) {
- /* output to stdout */
- of = stdout;
- } else if (r_flag && sb.st_size != -1) {
- /* resume mode, local file exists */
- if (!F_flag && us.mtime && sb.st_mtime != us.mtime) {
- /* no match! have to refetch */
- fclose(f);
- /* if precious, warn the user and give up */
- if (R_flag) {
- warnx("%s: local modification time "
- "does not match remote", path);
- goto failure_keep;
- }
- } else if (us.size != -1) {
- if (us.size == sb.st_size)
- /* nothing to do */
- goto success;
- if (sb.st_size > us.size) {
- /* local file too long! */
- warnx("%s: local file (%jd bytes) is longer "
- "than remote file (%jd bytes)", path,
- (intmax_t)sb.st_size, (intmax_t)us.size);
- goto failure;
- }
- /* we got it, open local file */
- if ((of = fopen(path, "a")) == NULL) {
- warn("%s: fopen()", path);
- goto failure;
- }
- /* check that it didn't move under our feet */
- if (fstat(fileno(of), &nsb) == -1) {
- /* can't happen! */
- warn("%s: fstat()", path);
- goto failure;
- }
- if (nsb.st_dev != sb.st_dev ||
- nsb.st_ino != nsb.st_ino ||
- nsb.st_size != sb.st_size) {
- warnx("%s: file has changed", URL);
- fclose(of);
- of = NULL;
- sb = nsb;
- }
- }
- } else if (m_flag && sb.st_size != -1) {
- /* mirror mode, local file exists */
- if (sb.st_size == us.size && sb.st_mtime == us.mtime)
- goto success;
- }
-
- if (of == NULL) {
- /*
- * We don't yet have an output file; either this is a
- * vanilla run with no special flags, or the local and
- * remote files didn't match.
- */
-
- if (url->offset > 0) {
- /*
- * We tried to restart a transfer, but for
- * some reason gave up - so we have to restart
- * from scratch if we want the whole file
- */
- url->offset = 0;
- if ((f = fetchXGet(url, &us, flags)) == NULL) {
- warnx("%s: %s", URL, fetchLastErrString);
- goto failure;
- }
- if (sigint)
- goto signal;
- }
-
- /* construct a temp file name */
- if (sb.st_size != -1 && S_ISREG(sb.st_mode)) {
- if ((slash = strrchr(path, '/')) == NULL)
- slash = path;
- else
- ++slash;
- asprintf(&tmppath, "%.*s.fetch.XXXXXX.%s",
- (int)(slash - path), path, slash);
- if (tmppath != NULL) {
- mkstemps(tmppath, strlen(slash) + 1);
- of = fopen(tmppath, "w");
- chown(tmppath, sb.st_uid, sb.st_gid);
- chmod(tmppath, sb.st_mode & ALLPERMS);
- }
- }
- if (of == NULL)
- of = fopen(path, "w");
- if (of == NULL) {
- warn("%s: open()", path);
- goto failure;
- }
- }
- count = url->offset;
-
- /* start the counter */
- stat_start(&xs, path, us.size, count);
-
- sigalrm = siginfo = sigint = 0;
-
- /* suck in the data */
- signal(SIGINFO, sig_handler);
- while (!sigint) {
- if (us.size != -1 && us.size - count < B_size &&
- us.size - count >= 0)
- size = us.size - count;
- else
- size = B_size;
- if (siginfo) {
- stat_end(&xs);
- siginfo = 0;
- }
- if ((size = fread(buf, 1, size, f)) == 0) {
- if (ferror(f) && errno == EINTR && !sigint)
- clearerr(f);
- else
- break;
- }
- stat_update(&xs, count += size);
- for (ptr = buf; size > 0; ptr += wr, size -= wr)
- if ((wr = fwrite(ptr, 1, size, of)) < size) {
- if (ferror(of) && errno == EINTR && !sigint)
- clearerr(of);
- else
- break;
- }
- if (size != 0)
- break;
- }
- if (!sigalrm)
- sigalrm = ferror(f) && errno == ETIMEDOUT;
- signal(SIGINFO, SIG_DFL);
-
- stat_end(&xs);
-
- /*
- * If the transfer timed out or was interrupted, we still want to
- * set the mtime in case the file is not removed (-r or -R) and
- * the user later restarts the transfer.
- */
- signal:
- /* set mtime of local file */
- if (!n_flag && us.mtime && !o_stdout && of != NULL &&
- (stat(path, &sb) != -1) && sb.st_mode & S_IFREG) {
- struct timeval tv[2];
-
- fflush(of);
- tv[0].tv_sec = (long)(us.atime ? us.atime : us.mtime);
- tv[1].tv_sec = (long)us.mtime;
- tv[0].tv_usec = tv[1].tv_usec = 0;
- if (utimes(tmppath ? tmppath : path, tv))
- warn("%s: utimes()", tmppath ? tmppath : path);
- }
-
- /* timed out or interrupted? */
- if (sigalrm)
- warnx("transfer timed out");
- if (sigint) {
- warnx("transfer interrupted");
- goto failure;
- }
-
- /* timeout / interrupt before connection completley established? */
- if (f == NULL)
- goto failure;
-
- if (!sigalrm) {
- /* check the status of our files */
- if (ferror(f))
- warn("%s", URL);
- if (ferror(of))
- warn("%s", path);
- if (ferror(f) || ferror(of))
- goto failure;
- }
-
- /* did the transfer complete normally? */
- if (us.size != -1 && count < us.size) {
- warnx("%s appears to be truncated: %jd/%jd bytes",
- path, (intmax_t)count, (intmax_t)us.size);
- goto failure_keep;
- }
-
- /*
- * If the transfer timed out and we didn't know how much to
- * expect, assume the worst (i.e. we didn't get all of it)
- */
- if (sigalrm && us.size == -1) {
- warnx("%s may be truncated", path);
- goto failure_keep;
- }
-
- success:
- r = 0;
- if (tmppath != NULL && rename(tmppath, path) == -1) {
- warn("%s: rename()", path);
- goto failure_keep;
- }
- goto done;
- failure:
- if (of && of != stdout && !R_flag && !r_flag)
- if (stat(path, &sb) != -1 && (sb.st_mode & S_IFREG))
- unlink(tmppath ? tmppath : path);
- if (R_flag && tmppath != NULL && sb.st_size == -1)
- rename(tmppath, path); /* ignore errors here */
- failure_keep:
- r = -1;
- goto done;
- done:
- if (f)
- fclose(f);
- if (of && of != stdout)
- fclose(of);
- if (url)
- fetchFreeURL(url);
- if (tmppath != NULL)
- free(tmppath);
- return (r);
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "%s\n%s\n%s\n",
- "usage: fetch [-146AFMPRUadlmnpqrsv] [-N netrc] [-o outputfile]",
- " [-S bytes] [-B bytes] [-T seconds] [-w seconds]",
- " [-h host -f file [-c dir] | URL ...]");
-}
-
-
-/*
- * Entry point
- */
-int
-main(int argc, char *argv[])
-{
- struct stat sb;
- struct sigaction sa;
- const char *p, *s;
- char *end, *q;
- int c, e, r;
-
- while ((c = getopt(argc, argv,
- "146AaB:bc:dFf:Hh:lMmN:nPpo:qRrS:sT:tUvw:")) != -1)
- switch (c) {
- case '1':
- once_flag = 1;
- break;
- case '4':
- family = PF_INET;
- break;
- case '6':
- family = PF_INET6;
- break;
- case 'A':
- A_flag = 1;
- break;
- case 'a':
- a_flag = 1;
- break;
- case 'B':
- B_size = (off_t)strtol(optarg, &end, 10);
- if (*optarg == '\0' || *end != '\0')
- errx(1, "invalid buffer size (%s)", optarg);
- break;
- case 'b':
- warnx("warning: the -b option is deprecated");
- b_flag = 1;
- break;
- case 'c':
- c_dirname = optarg;
- break;
- case 'd':
- d_flag = 1;
- break;
- case 'F':
- F_flag = 1;
- break;
- case 'f':
- f_filename = optarg;
- break;
- case 'H':
- warnx("the -H option is now implicit, "
- "use -U to disable");
- break;
- case 'h':
- h_hostname = optarg;
- break;
- case 'l':
- l_flag = 1;
- break;
- case 'o':
- o_flag = 1;
- o_filename = optarg;
- break;
- case 'M':
- case 'm':
- if (r_flag)
- errx(1, "the -m and -r flags "
- "are mutually exclusive");
- m_flag = 1;
- break;
- case 'N':
- N_filename = optarg;
- break;
- case 'n':
- n_flag = 1;
- break;
- case 'P':
- case 'p':
- p_flag = 1;
- break;
- case 'q':
- v_level = 0;
- break;
- case 'R':
- R_flag = 1;
- break;
- case 'r':
- if (m_flag)
- errx(1, "the -m and -r flags "
- "are mutually exclusive");
- r_flag = 1;
- break;
- case 'S':
- S_size = (off_t)strtol(optarg, &end, 10);
- if (*optarg == '\0' || *end != '\0')
- errx(1, "invalid size (%s)", optarg);
- break;
- case 's':
- s_flag = 1;
- break;
- case 'T':
- T_secs = strtol(optarg, &end, 10);
- if (*optarg == '\0' || *end != '\0')
- errx(1, "invalid timeout (%s)", optarg);
- break;
- case 't':
- t_flag = 1;
- warnx("warning: the -t option is deprecated");
- break;
- case 'U':
- U_flag = 1;
- break;
- case 'v':
- v_level++;
- break;
- case 'w':
- a_flag = 1;
- w_secs = strtol(optarg, &end, 10);
- if (*optarg == '\0' || *end != '\0')
- errx(1, "invalid delay (%s)", optarg);
- break;
- default:
- usage();
- exit(EX_USAGE);
- }
-
- argc -= optind;
- argv += optind;
-
- if (h_hostname || f_filename || c_dirname) {
- if (!h_hostname || !f_filename || argc) {
- usage();
- exit(EX_USAGE);
- }
- /* XXX this is a hack. */
- if (strcspn(h_hostname, "@:/") != strlen(h_hostname))
- errx(1, "invalid hostname");
- if (asprintf(argv, "ftp://%s/%s/%s", h_hostname,
- c_dirname ? c_dirname : "", f_filename) == -1)
- errx(1, "%s", strerror(ENOMEM));
- argc++;
- }
-
- if (!argc) {
- usage();
- exit(EX_USAGE);
- }
-
- /* allocate buffer */
- if (B_size < MINBUFSIZE)
- B_size = MINBUFSIZE;
- if ((buf = malloc(B_size)) == NULL)
- errx(1, "%s", strerror(ENOMEM));
-
- /* timeouts */
- if ((s = getenv("FTP_TIMEOUT")) != NULL) {
- ftp_timeout = strtol(s, &end, 10);
- if (*s == '\0' || *end != '\0' || ftp_timeout < 0) {
- warnx("FTP_TIMEOUT (%s) is not a positive integer", s);
- ftp_timeout = 0;
- }
- }
- if ((s = getenv("HTTP_TIMEOUT")) != NULL) {
- http_timeout = strtol(s, &end, 10);
- if (*s == '\0' || *end != '\0' || http_timeout < 0) {
- warnx("HTTP_TIMEOUT (%s) is not a positive integer", s);
- http_timeout = 0;
- }
- }
-
- /* signal handling */
- sa.sa_flags = 0;
- sa.sa_handler = sig_handler;
- sigemptyset(&sa.sa_mask);
- sigaction(SIGALRM, &sa, NULL);
- sa.sa_flags = SA_RESETHAND;
- sigaction(SIGINT, &sa, NULL);
- fetchRestartCalls = 0;
-
- /* output file */
- if (o_flag) {
- if (strcmp(o_filename, "-") == 0) {
- o_stdout = 1;
- } else if (stat(o_filename, &sb) == -1) {
- if (errno == ENOENT) {
- if (argc > 1)
- errx(EX_USAGE, "%s is not a directory",
- o_filename);
- } else {
- err(EX_IOERR, "%s", o_filename);
- }
- } else {
- if (sb.st_mode & S_IFDIR)
- o_directory = 1;
- }
- }
-
- /* check if output is to a tty (for progress report) */
- v_tty = isatty(STDERR_FILENO);
- if (v_tty)
- pgrp = getpgrp();
-
- r = 0;
-
- /* authentication */
- if (v_tty)
- fetchAuthMethod = query_auth;
- if (N_filename != NULL)
- setenv("NETRC", N_filename, 1);
-
- while (argc) {
- if ((p = strrchr(*argv, '/')) == NULL)
- p = *argv;
- else
- p++;
-
- if (!*p)
- p = "fetch.out";
-
- fetchLastErrCode = 0;
-
- if (o_flag) {
- if (o_stdout) {
- e = fetch(*argv, "-");
- } else if (o_directory) {
- asprintf(&q, "%s/%s", o_filename, p);
- e = fetch(*argv, q);
- free(q);
- } else {
- e = fetch(*argv, o_filename);
- }
- } else {
- e = fetch(*argv, p);
- }
-
- if (sigint)
- kill(getpid(), SIGINT);
-
- if (e == 0 && once_flag)
- exit(0);
-
- if (e) {
- r = 1;
- if ((fetchLastErrCode
- && fetchLastErrCode != FETCH_UNAVAIL
- && fetchLastErrCode != FETCH_MOVED
- && fetchLastErrCode != FETCH_URL
- && fetchLastErrCode != FETCH_RESOLV
- && fetchLastErrCode != FETCH_UNKNOWN)) {
- if (w_secs && v_level)
- fprintf(stderr, "Waiting %ld seconds "
- "before retrying\n", w_secs);
- if (w_secs)
- sleep(w_secs);
- if (a_flag)
- continue;
- }
- }
-
- argc--, argv++;
- }
-
- exit(r);
-}
diff --git a/usr.bin/file/Makefile b/usr.bin/file/Makefile
deleted file mode 100644
index e6bf149..0000000
--- a/usr.bin/file/Makefile
+++ /dev/null
@@ -1,48 +0,0 @@
-# $FreeBSD$
-# Makefile for file(1) cmd.
-# Copyright (c) David E. O'Brien, 2000-2004
-# Copyright (c) Ian F. Darwin 86/09/01 - see LEGAL.NOTICE.
-#
-# This software is not subject to any license of the American Telephone
-# and Telegraph Company or of the Regents of the University of California.
-#
-# Permission is granted to anyone to use this software for any purpose on
-# any computer system, and to alter it and redistribute it freely, subject
-# to the following restrictions:
-#
-# 1. The author is not responsible for the consequences of use of this
-# software, no matter how awful, even if they arise from flaws in it.
-# 2. The origin of this software must not be misrepresented, either by
-# explicit claim or by omission. Since few users ever read sources,
-# credits must appear in the documentation.
-# 3. Altered versions must be plainly marked as such, and must not be
-# misrepresented as being the original software. Since few users
-# ever read sources, credits must appear in the documentation.
-# 4. This notice may not be removed or altered.
-
-SRCDIR= ${.CURDIR}/../../contrib/file
-.PATH: ${SRCDIR}
-
-PROG= file
-
-MAGICPATH?= /usr/share/misc
-
-CFLAGS+= -DMAGIC='"${MAGICPATH}/magic"' -DHAVE_CONFIG_H
-CFLAGS+= -I${.CURDIR}
-
-DPADD= ${LIBMAGIC} ${LIBZ}
-LDADD= -lmagic -lz
-
-FILEVER!= awk '$$1 == "\#define" && $$2 == "VERSION" { print $$3; exit }' \
- ${.CURDIR}/config.h
-
-CLEANFILES+= ${MAN}
-
-.include <bsd.prog.mk>
-
-.for mp in ${MAN}
-${mp}: ${mp:C/[0-9]/man/}
- sed -e 's/__FSECTION__/5/g' -e 's/__CSECTION__/1/g' \
- -e 's/__VERSION__/${FILEVER}/g' \
- -e 's,__MAGIC__,${MAGICPATH}/magic,g' ${.ALLSRC} > ${.TARGET}
-.endfor
diff --git a/usr.bin/file/config.h b/usr.bin/file/config.h
deleted file mode 100644
index 65e4a6a..0000000
--- a/usr.bin/file/config.h
+++ /dev/null
@@ -1,240 +0,0 @@
-/* $FreeBSD$ */
-
-#include <osreldate.h>
-
-/* config.h. Generated from config.h.in by configure. */
-/* config.h.in. Generated from configure.in by autoheader. */
-
-/* Use the builtin ELF recognition code */
-#define BUILTIN_ELF 1
-
-/* Recognize ELF core files */
-#define ELFCORE 1
-
-/* */
-/* #undef HAVE_DAYLIGHT */
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#define HAVE_DLFCN_H 1
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#define HAVE_FCNTL_H 1
-
-/* Define to 1 if you have the <getopt.h> header file. */
-#define HAVE_GETOPT_H 1
-
-/* Define to 1 if you have the `getopt_long' function. */
-#define HAVE_GETOPT_LONG 1
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define to 1 if you have the `z' library (-lz). */
-#define HAVE_LIBZ 1
-
-/* Define to 1 if you have the <limits.h> header file. */
-#define HAVE_LIMITS_H 1
-
-/* Define to 1 if you have the <locale.h> header file. */
-#define HAVE_LOCALE_H 1
-
-/* */
-#define HAVE_LONG_LONG 1
-
-/* Define to 1 if you have the `mbrtowc' function. */
-#define HAVE_MBRTOWC 1
-
-/* Define to 1 if <wchar.h> declares mbstate_t. */
-#define HAVE_MBSTATE_T 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the `mkstemp' function. */
-#define HAVE_MKSTEMP 1
-
-/* Define to 1 if you have the `mmap' function. */
-#define HAVE_MMAP 1
-
-/* Define to 1 if you have the `snprintf' function. */
-#define HAVE_SNPRINTF 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#if __FreeBSD_version >= 500019
-#define HAVE_STDINT_H 1
-#endif
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the `strerror' function. */
-#define HAVE_STRERROR 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the `strndup' function. */
-/* #undef HAVE_STRNDUP */
-
-/* Define to 1 if you have the `strtof' function. */
-#define HAVE_STRTOF 1
-
-/* Define to 1 if you have the `strtoul' function. */
-#define HAVE_STRTOUL 1
-
-/* Define to 1 if `st_rdev' is member of `struct stat'. */
-#define HAVE_STRUCT_STAT_ST_RDEV 1
-
-/* Define to 1 if your `struct stat' has `st_rdev'. Deprecated, use
- `HAVE_STRUCT_STAT_ST_RDEV' instead. */
-#define HAVE_ST_RDEV 1
-
-/* Define to 1 if you have the <sys/mman.h> header file. */
-#define HAVE_SYS_MMAN_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#define HAVE_SYS_TIME_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <sys/utime.h> header file. */
-/* #undef HAVE_SYS_UTIME_H */
-
-/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
-#define HAVE_SYS_WAIT_H 1
-
-/* */
-#define HAVE_TM_ISDST 1
-
-/* HAVE_TM_ZONE */
-#define HAVE_TM_ZONE 1
-
-/* HAVE_TZNAME */
-#define HAVE_TZNAME 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define to 1 if you have the `utime' function. */
-#define HAVE_UTIME 1
-
-/* Define to 1 if you have the `utimes' function. */
-#define HAVE_UTIMES 1
-
-/* Define to 1 if you have the <utime.h> header file. */
-#define HAVE_UTIME_H 1
-
-/* Define to 1 if you have the `vsnprintf' function. */
-#define HAVE_VSNPRINTF 1
-
-/* Define to 1 if you have the <wchar.h> header file. */
-#define HAVE_WCHAR_H 1
-
-/* Define to 1 if you have the <wctype.h> header file. */
-#define HAVE_WCTYPE_H 1
-
-/* Define to 1 if you have the `wcwidth' function. */
-#define HAVE_WCWIDTH 1
-
-/* Define to 1 if you have the <zlib.h> header file. */
-#define HAVE_ZLIB_H 1
-
-/* Define to 1 if `major', `minor', and `makedev' are declared in <mkdev.h>.
- */
-/* #undef MAJOR_IN_MKDEV */
-
-/* Define to 1 if `major', `minor', and `makedev' are declared in
- <sysmacros.h>. */
-/* #undef MAJOR_IN_SYSMACROS */
-
-/* Name of package */
-#define PACKAGE "file"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT ""
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME ""
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING ""
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME ""
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION ""
-
-/* */
-#define SIZEOF_INT64_T 8
-
-/* */
-#define SIZEOF_UINT16_T 2
-
-/* */
-#define SIZEOF_UINT32_T 4
-
-/* */
-#define SIZEOF_UINT64_T 8
-
-/* */
-#define SIZEOF_UINT8_T 1
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define to 1 if your <sys/time.h> declares `struct tm'. */
-/* #undef TM_IN_SYS_TIME */
-
-/* Version number of package */
-#define VERSION "4.23"
-
-/* Number of bits in a file offset, on hosts where this is settable. */
-/* #undef _FILE_OFFSET_BITS */
-
-/* Enable GNU extensions on systems that have them. */
-#ifndef __FreeBSD__
-#ifndef _GNU_SOURCE
-# define _GNU_SOURCE 1
-#endif
-#endif
-
-/* Define for large files, on AIX-style hosts. */
-/* #undef _LARGE_FILES */
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef const */
-
-/* */
-/* #undef int32_t */
-
-/* */
-/* #undef int64_t */
-
-/* Define to a type if <wchar.h> does not define. */
-/* #undef mbstate_t */
-
-/* Define to `long int' if <sys/types.h> does not define. */
-/* #undef off_t */
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-/* #undef size_t */
-
-/* */
-/* #undef uint16_t */
-
-/* */
-/* #undef uint32_t */
-
-/* */
-/* #undef uint64_t */
-
-/* */
-/* #undef uint8_t */
diff --git a/usr.bin/file2c/Makefile b/usr.bin/file2c/Makefile
deleted file mode 100644
index c3c6ddc..0000000
--- a/usr.bin/file2c/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-PROG= file2c
-WARNS?= 6
-.include <bsd.prog.mk>
diff --git a/usr.bin/file2c/file2c.1 b/usr.bin/file2c/file2c.1
deleted file mode 100644
index 40482c2..0000000
--- a/usr.bin/file2c/file2c.1
+++ /dev/null
@@ -1,75 +0,0 @@
-.\"----------------------------------------------------------------------------
-.\" "THE BEER-WARE LICENSE" (Revision 42):
-.\" <phk@FreeBSD.org> wrote this file. As long as you retain this notice, you
-.\" can do whatever you want with this file. If we meet some day, and you think
-.\" this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
-.\" ---------------------------------------------------------------------------
-.\"
-.\" $FreeBSD$
-.\"
-.Dd March 22, 2007
-.Dt FILE2C 1
-.Os
-.Sh NAME
-.Nm file2c
-.Nd convert file to c-source
-.Sh SYNOPSIS
-.Nm
-.Op Fl sx
-.Op Fl n Ar count
-.Op Ar prefix Op Ar suffix
-.Sh DESCRIPTION
-The
-.Nm
-utility reads a file from stdin and writes it to stdout, converting each
-byte to its decimal or hexadecimal representation on the fly.
-The byte values are separated by a comma.
-This also means that the last byte value is not followed by a comma.
-By default the byte values are printed in decimal, but when the
-.Fl x
-option is given, the values will be printed in hexadecimal.
-When
-.Fl s
-option is given, each line is printed with a leading tab and each comma is
-followed by a space except for the last one on the line.
-.Pp
-If more than 70 characters are printed on the same line, that line is
-ended and the output continues on the next line.
-With the
-.Fl n
-option this can be made to happen after the specified number of
-byte values have been printed.
-The length of the line will not be considered anymore.
-To have all the byte values printed on the same line, give the
-.Fl n
-option a negative number.
-.Pp
-A prefix and suffix strings can be printed before and after the byte values
-(resp.)
-If a suffix is to be printed, a prefix must also be specified.
-The first non-option word is the prefix, which may optionally be followed
-by a word that is to be used as the suffix.
-.Pp
-This program is typically used to embed binary files into C source files.
-The prefix is used to define an array type and the suffix is used to end
-the C statement.
-The
-.Fl n , s
-and
-.Fl x
-options are useful when the binary data represents a bitmap and the output
-needs to remain readable and/or editable.
-Fonts, for example, are a good example of this.
-.Sh EXAMPLES
-The command:
-.Bd -literal -offset indent
-date | file2c 'const char date[] = {' ',0};'
-.Ed
-.Pp
-will produce:
-.Bd -literal -offset indent
-const char date[] = {
-83,97,116,32,74,97,110,32,50,56,32,49,54,58,50,56,58,48,53,
-32,80,83,84,32,49,57,57,53,10
-,0};
-.Ed
diff --git a/usr.bin/file2c/file2c.c b/usr.bin/file2c/file2c.c
deleted file mode 100644
index e50bd1f..0000000
--- a/usr.bin/file2c/file2c.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * ----------------------------------------------------------------------------
- * "THE BEER-WARE LICENSE" (Revision 42):
- * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you
- * can do whatever you want with this stuff. If we meet some day, and you think
- * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
- * ----------------------------------------------------------------------------
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-static void
-usage(void)
-{
-
- fprintf(stderr, "usage: %s [-sx] [-n count] [prefix [suffix]]\n",
- getprogname());
- exit(1);
-}
-
-int
-main(int argc, char *argv[])
-{
- int c, count, linepos, maxcount, pretty, radix;
-
- maxcount = 0;
- pretty = 0;
- radix = 10;
- while ((c = getopt(argc, argv, "n:sx")) != -1) {
- switch (c) {
- case 'n': /* Max. number of bytes per line. */
- maxcount = strtol(optarg, NULL, 10);
- break;
- case 's': /* Be more style(9) comliant. */
- pretty = 1;
- break;
- case 'x': /* Print hexadecimal numbers. */
- radix = 16;
- break;
- case '?':
- default:
- usage();
- }
- }
- argc -= optind;
- argv += optind;
-
- if (argc > 0)
- printf("%s\n", argv[0]);
- count = linepos = 0;
- while((c = getchar()) != EOF) {
- if (count) {
- putchar(',');
- linepos++;
- }
- if ((maxcount == 0 && linepos > 70) ||
- (maxcount > 0 && count >= maxcount)) {
- putchar('\n');
- count = linepos = 0;
- }
- if (pretty) {
- if (count) {
- putchar(' ');
- linepos++;
- } else {
- putchar('\t');
- linepos += 8;
- }
- }
- switch (radix) {
- case 10:
- linepos += printf("%d", c);
- break;
- case 16:
- linepos += printf("0x%02x", c);
- break;
- default:
- abort();
- }
- count++;
- }
- putchar('\n');
- if (argc > 1)
- printf("%s\n", argv[1]);
- return (0);
-}
diff --git a/usr.bin/find/Makefile b/usr.bin/find/Makefile
deleted file mode 100644
index b20dc03..0000000
--- a/usr.bin/find/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= find
-SRCS= find.c function.c ls.c main.c misc.c operator.c option.c \
- getdate.y
-WARNS?=6
-CFLAGS+= -DHAVE_SYS_TIMEB_H -I${.CURDIR}
-YFLAGS=
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/find/extern.h b/usr.bin/find/extern.h
deleted file mode 100644
index 716c1f5..0000000
--- a/usr.bin/find/extern.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.3 (Berkeley) 4/16/94
- * $FreeBSD$
- */
-
-#include <sys/cdefs.h>
-
-void brace_subst(char *, char **, char *, int);
-PLAN *find_create(char ***);
-int find_execute(PLAN *, char **);
-PLAN *find_formplan(char **);
-PLAN *not_squish(PLAN *);
-PLAN *or_squish(PLAN *);
-PLAN *paren_squish(PLAN *);
-struct timeb;
-time_t get_date(char *, struct timeb *);
-struct stat;
-void printlong(char *, char *, struct stat *);
-int queryuser(char **);
-OPTION *lookup_option(const char *);
-void finish_execplus(void);
-
-creat_f c_Xmin;
-creat_f c_Xtime;
-creat_f c_acl;
-creat_f c_and;
-creat_f c_delete;
-creat_f c_depth;
-creat_f c_empty;
-creat_f c_exec;
-creat_f c_flags;
-creat_f c_follow;
-creat_f c_fstype;
-creat_f c_group;
-creat_f c_inum;
-creat_f c_links;
-creat_f c_ls;
-creat_f c_mXXdepth;
-creat_f c_name;
-creat_f c_newer;
-creat_f c_nogroup;
-creat_f c_nouser;
-creat_f c_perm;
-creat_f c_print;
-creat_f c_regex;
-creat_f c_samefile;
-creat_f c_simple;
-creat_f c_size;
-creat_f c_type;
-creat_f c_user;
-creat_f c_xdev;
-
-exec_f f_Xmin;
-exec_f f_Xtime;
-exec_f f_acl;
-exec_f f_always_true;
-exec_f f_closeparen;
-exec_f f_delete;
-exec_f f_depth;
-exec_f f_empty;
-exec_f f_exec;
-exec_f f_expr;
-exec_f f_false;
-exec_f f_flags;
-exec_f f_fstype;
-exec_f f_group;
-exec_f f_inum;
-exec_f f_links;
-exec_f f_ls;
-exec_f f_name;
-exec_f f_newer;
-exec_f f_nogroup;
-exec_f f_not;
-exec_f f_nouser;
-exec_f f_openparen;
-exec_f f_or;
-exec_f f_path;
-exec_f f_perm;
-exec_f f_print;
-exec_f f_print0;
-exec_f f_prune;
-exec_f f_quit;
-exec_f f_regex;
-exec_f f_size;
-exec_f f_type;
-exec_f f_user;
-
-extern int ftsoptions, isdeprecated, isdepth, isoutput, issort, isxargs;
-extern int mindepth, maxdepth;
-extern int regexp_flags;
-extern time_t now;
-extern int dotfd;
-extern FTS *tree;
diff --git a/usr.bin/find/find.1 b/usr.bin/find/find.1
deleted file mode 100644
index 824b917..0000000
--- a/usr.bin/find/find.1
+++ /dev/null
@@ -1,1075 +0,0 @@
-.\" Copyright (c) 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)find.1 8.7 (Berkeley) 5/9/95
-.\" $FreeBSD$
-.\"
-.Dd February 24, 2008
-.Dt FIND 1
-.Os
-.Sh NAME
-.Nm find
-.Nd walk a file hierarchy
-.Sh SYNOPSIS
-.Nm
-.Op Fl H | Fl L | Fl P
-.Op Fl EXdsx
-.Op Fl f Ar path
-.Ar path ...
-.Op Ar expression
-.Nm
-.Op Fl H | Fl L | Fl P
-.Op Fl EXdsx
-.Fl f Ar path
-.Op Ar path ...
-.Op Ar expression
-.Sh DESCRIPTION
-The
-.Nm
-utility recursively descends the directory tree for each
-.Ar path
-listed, evaluating an
-.Ar expression
-(composed of the
-.Dq primaries
-and
-.Dq operands
-listed below) in terms
-of each file in the tree.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl E
-Interpret regular expressions followed by
-.Ic -regex
-and
-.Ic -iregex
-primaries as extended (modern) regular expressions rather than basic
-regular expressions (BRE's).
-The
-.Xr re_format 7
-manual page fully describes both formats.
-.It Fl H
-Cause the file information and file type (see
-.Xr stat 2 )
-returned for each symbolic link specified on the command line to be
-those of the file referenced by the link, not the link itself.
-If the referenced file does not exist, the file information and type will
-be for the link itself.
-File information of all symbolic links not on
-the command line is that of the link itself.
-.It Fl L
-Cause the file information and file type (see
-.Xr stat 2 )
-returned for each symbolic link to be those of the file referenced by the
-link, not the link itself.
-If the referenced file does not exist, the file information and type will
-be for the link itself.
-.Pp
-This option is equivalent to the deprecated
-.Ic -follow
-primary.
-.It Fl P
-Cause the file information and file type (see
-.Xr stat 2 )
-returned for each symbolic link to be those of the link itself.
-This is the default.
-.It Fl X
-Permit
-.Nm
-to be safely used in conjunction with
-.Xr xargs 1 .
-If a file name contains any of the delimiting characters used by
-.Xr xargs 1 ,
-a diagnostic message is displayed on standard error, and the file
-is skipped.
-The delimiting characters include single
-.Pq Dq Li " ' "
-and double
-.Pq Dq Li " \*q "
-quotes, backslash
-.Pq Dq Li \e ,
-space, tab and newline characters.
-.Pp
-However, you may wish to consider the
-.Fl print0
-primary in conjunction with
-.Dq Nm xargs Fl 0
-as an effective alternative.
-.It Fl d
-Cause
-.Nm
-to perform a depth-first traversal, i.e., directories
-are visited in post-order and all entries in a directory will be acted
-on before the directory itself.
-By default,
-.Nm
-visits directories in pre-order, i.e., before their contents.
-Note, the default is
-.Em not
-a breadth-first traversal.
-.Pp
-This option is equivalent to the
-.Ic -depth
-primary of
-.St -p1003.1-2001 .
-The
-.Fl d
-option
-can be useful when
-.Nm
-is used with
-.Xr cpio 1
-to process files that are contained in directories with unusual permissions.
-It ensures that you have write permission while you are placing files in a
-directory, then sets the directory's permissions as the last thing.
-.It Fl f
-Specify a file hierarchy for
-.Nm
-to traverse.
-File hierarchies may also be specified as the operands immediately
-following the options.
-.It Fl s
-Cause
-.Nm
-to traverse the file hierarchies in lexicographical order,
-i.e., alphabetical order within each directory.
-Note:
-.Ql find -s
-and
-.Ql "find | sort"
-may give different results.
-.It Fl x
-Prevent
-.Nm
-from descending into directories that have a device number different
-than that of the file from which the descent began.
-.Pp
-This option is equivalent to the deprecated
-.Ic -xdev
-primary.
-.El
-.Sh PRIMARIES
-.Bl -tag -width indent
-.It Ic -Bmin Ar n
-True if the difference between the time of a file's inode creation
-and the time
-.Nm
-was started, rounded up to the next full minute, is
-.Ar n
-minutes.
-.It Ic -Bnewer Ar file
-Same as
-.Ic -newerBm .
-.It Ic -Btime Ar n Ns Op Cm smhdw
-If no units are specified, this primary evaluates to
-true if the difference between the time of a file's inode creation
-and the time
-.Nm
-was started, rounded up to the next full 24-hour period, is
-.Ar n
-24-hour periods.
-.Pp
-If units are specified, this primary evaluates to
-true if the difference between the time of a file's inode creation
-and the time
-.Nm
-was started is exactly
-.Ar n
-units.
-Please refer to the
-.Ic -atime
-primary description for information on supported time units.
-.It Ic -acl
-May be used in conjunction with other primaries to locate
-files with extended ACLs.
-See
-.Xr acl 3
-for more information.
-.It Ic -amin Ar n
-True if the difference between the file last access time and the time
-.Nm
-was started, rounded up to the next full minute, is
-.Ar n
-minutes.
-.It Ic -anewer Ar file
-Same as
-.Ic -neweram .
-.It Ic -atime Ar n Ns Op Cm smhdw
-If no units are specified, this primary evaluates to
-true if the difference between the file last access time and the time
-.Nm
-was started, rounded up to the next full 24-hour period, is
-.Ar n
-24-hour periods.
-.Pp
-If units are specified, this primary evaluates to
-true if the difference between the file last access time and the time
-.Nm
-was started is exactly
-.Ar n
-units.
-Possible time units are as follows:
-.Pp
-.Bl -tag -width indent -compact
-.It Cm s
-second
-.It Cm m
-minute (60 seconds)
-.It Cm h
-hour (60 minutes)
-.It Cm d
-day (24 hours)
-.It Cm w
-week (7 days)
-.El
-.Pp
-Any number of units may be combined in one
-.Ic -atime
-argument, for example,
-.Dq Li "-atime -1h30m" .
-Units are probably only useful when used in conjunction with the
-.Cm +
-or
-.Cm -
-modifier.
-.It Ic -cmin Ar n
-True if the difference between the time of last change of file status
-information and the time
-.Nm
-was started, rounded up to the next full minute, is
-.Ar n
-minutes.
-.It Ic -cnewer Ar file
-Same as
-.Ic -newercm .
-.It Ic -ctime Ar n Ns Op Cm smhdw
-If no units are specified, this primary evaluates to
-true if the difference between the time of last change of file status
-information and the time
-.Nm
-was started, rounded up to the next full 24-hour period, is
-.Ar n
-24-hour periods.
-.Pp
-If units are specified, this primary evaluates to
-true if the difference between the time of last change of file status
-information and the time
-.Nm
-was started is exactly
-.Ar n
-units.
-Please refer to the
-.Ic -atime
-primary description for information on supported time units.
-.It Ic -d
-Same as
-.Ic depth .
-GNU find implements this as a primary in mistaken emulation of
-.Fx
-.Xr find 1 .
-.It Ic -delete
-Delete found files and/or directories.
-Always returns true.
-This executes
-from the current working directory as
-.Nm
-recurses down the tree.
-It will not attempt to delete a filename with a
-.Dq Pa /
-character in its pathname relative to
-.Dq Pa \&.
-for security reasons.
-Depth-first traversal processing is implied by this option.
-.It Ic -depth
-Always true;
-same as the
-.Fl d
-option.
-.It Ic -depth Ar n
-True if the depth of the file relative to the starting point of the traversal
-is
-.Ar n .
-.It Ic -empty
-True if the current file or directory is empty.
-.It Ic -exec Ar utility Oo Ar argument ... Oc Li \&;
-True if the program named
-.Ar utility
-returns a zero value as its exit status.
-Optional
-.Ar arguments
-may be passed to the utility.
-The expression must be terminated by a semicolon
-.Pq Dq Li \&; .
-If you invoke
-.Nm
-from a shell you may need to quote the semicolon if the shell would
-otherwise treat it as a control operator.
-If the string
-.Dq Li {}
-appears anywhere in the utility name or the
-arguments it is replaced by the pathname of the current file.
-.Ar Utility
-will be executed from the directory from which
-.Nm
-was executed.
-.Ar Utility
-and
-.Ar arguments
-are not subject to the further expansion of shell patterns
-and constructs.
-.It Ic -exec Ar utility Oo Ar argument ... Oc Li {} +
-Same as
-.Ic -exec ,
-except that
-.Dq Li {}
-is replaced with as many pathnames as possible for each invocation of
-.Ar utility .
-This behaviour is similar to that of
-.Xr xargs 1 .
-.It Ic -execdir Ar utility Oo Ar argument ... Oc Li \&;
-The
-.Ic -execdir
-primary is identical to the
-.Ic -exec
-primary with the exception that
-.Ar utility
-will be executed from the directory that holds
-the current file.
-The filename substituted for
-the string
-.Dq Li {}
-is not qualified.
-.It Ic -execdir Ar utility Oo Ar argument ... Oc Li {} +
-Same as
-.Ic -execdir ,
-except that
-.Dq Li {}
-is replaced with as many pathnames as possible for each invocation of
-.Ar utility .
-This behaviour is similar to that of
-.Xr xargs 1 .
-.It Ic -flags Oo Cm - Ns | Ns Cm + Oc Ns Ar flags , Ns Ar notflags
-The flags are specified using symbolic names (see
-.Xr chflags 1 ) .
-Those with the
-.Qq Li no
-prefix (except
-.Qq Li nodump )
-are said to be
-.Ar notflags .
-Flags in
-.Ar flags
-are checked to be set, and flags in
-.Ar notflags
-are checked to be not set.
-Note that this is different from
-.Ic -perm ,
-which only allows the user to specify mode bits that are set.
-.Pp
-If flags are preceded by a dash
-.Pq Dq Li - ,
-this primary evaluates to true
-if at least all of the bits in
-.Ar flags
-and none of the bits in
-.Ar notflags
-are set in the file's flags bits.
-If flags are preceded by a plus
-.Pq Dq Li + ,
-this primary evaluates to true
-if any of the bits in
-.Ar flags
-is set in the file's flags bits,
-or any of the bits in
-.Ar notflags
-is not set in the file's flags bits.
-Otherwise,
-this primary evaluates to true
-if the bits in
-.Ar flags
-exactly match the file's flags bits,
-and none of the
-.Ar flags
-bits match those of
-.Ar notflags .
-.It Ic -fstype Ar type
-True if the file is contained in a file system of type
-.Ar type .
-The
-.Xr sysctl 8
-command can be used to find out the types of file systems
-that are available on the system:
-.Pp
-.Dl "sysctl vfs"
-.Pp
-In addition, there are two pseudo-types,
-.Dq Li local
-and
-.Dq Li rdonly .
-The former matches any file system physically mounted on the system where
-the
-.Nm
-is being executed and the latter matches any file system which is
-mounted read-only.
-.It Ic -gid Ar gname
-The same thing as
-.Ar -group Ar gname
-for compatibility with GNU find.
-GNU find imposes a restriction that
-.Ar gname
-is numeric, while
-.Xr find 1
-does not.
-.It Ic -group Ar gname
-True if the file belongs to the group
-.Ar gname .
-If
-.Ar gname
-is numeric and there is no such group name, then
-.Ar gname
-is treated as a group ID.
-.It Ic -ignore_readdir_race
-This option is for GNU find compatibility and is ignored.
-.It Ic -ilname Ar pattern
-Like
-.Ic -lname ,
-but the match is case insensitive.
-This is a GNU find extension.
-.It Ic -iname Ar pattern
-Like
-.Ic -name ,
-but the match is case insensitive.
-.It Ic -inum Ar n
-True if the file has inode number
-.Ar n .
-.It Ic -ipath Ar pattern
-Like
-.Ic -path ,
-but the match is case insensitive.
-.It Ic -iregex Ar pattern
-Like
-.Ic -regex ,
-but the match is case insensitive.
-.It Ic -iwholename Ar pattern
-The same thing as
-.Ic -ipath ,
-for GNU find compatibility.
-.It Ic -links Ar n
-True if the file has
-.Ar n
-links.
-.It Ic -lname Ar pattern
-Like
-.Ic -name ,
-but the contents of the symbolic link are matched instead of the file
-name.
-This is a GNU find extension.
-.It Ic -ls
-This primary always evaluates to true.
-The following information for the current file is written to standard output:
-its inode number, size in 512-byte blocks, file permissions, number of hard
-links, owner, group, size in bytes, last modification time, and pathname.
-If the file is a block or character special file, the major and minor numbers
-will be displayed instead of the size in bytes.
-If the file is a symbolic link, the pathname of the linked-to file will be
-displayed preceded by
-.Dq Li -> .
-The format is identical to that produced by
-.Bk -words
-.Dq Nm ls Fl dgils .
-.Ek
-.It Ic -maxdepth Ar n
-Always true; descend at most
-.Ar n
-directory levels below the command line arguments.
-If any
-.Ic -maxdepth
-primary is specified, it applies to the entire expression even if it would
-not normally be evaluated.
-.Dq Ic -maxdepth Li 0
-limits the whole search to the command line arguments.
-.It Ic -mindepth Ar n
-Always true; do not apply any tests or actions at levels less than
-.Ar n .
-If any
-.Ic -mindepth
-primary is specified, it applies to the entire expression even if it would
-not normally be evaluated.
-.Dq Ic -mindepth Li 1
-processes all but the command line arguments.
-.It Ic -mmin Ar n
-True if the difference between the file last modification time and the time
-.Nm
-was started, rounded up to the next full minute, is
-.Ar n
-minutes.
-.It Ic -mnewer Ar file
-Same as
-.Ic -newer .
-.It Ic -mount
-The same thing as
-.Ic -xdev ,
-for GNU find compatibility.
-.It Ic -mtime Ar n Ns Op Cm smhdw
-If no units are specified, this primary evaluates to
-true if the difference between the file last modification time and the time
-.Nm
-was started, rounded up to the next full 24-hour period, is
-.Ar n
-24-hour periods.
-.Pp
-If units are specified, this primary evaluates to
-true if the difference between the file last modification time and the time
-.Nm
-was started is exactly
-.Ar n
-units.
-Please refer to the
-.Ic -atime
-primary description for information on supported time units.
-.It Ic -name Ar pattern
-True if the last component of the pathname being examined matches
-.Ar pattern .
-Special shell pattern matching characters
-.Dq ( Li \&[ ,
-.Dq Li \&] ,
-.Dq Li * ,
-and
-.Dq Li \&? )
-may be used as part of
-.Ar pattern .
-These characters may be matched explicitly by escaping them with a
-backslash
-.Pq Dq Li \e .
-.It Ic -newer Ar file
-True if the current file has a more recent last modification time than
-.Ar file .
-.It Ic -newer Ns Ar X Ns Ar Y Ar file
-True if the current file has a more recent last access time
-.Pq Ar X Ns = Ns Cm a ,
-inode creation time
-.Pq Ar X Ns = Ns Cm B ,
-change time
-.Pq Ar X Ns = Ns Cm c ,
-or modification time
-.Pq Ar X Ns = Ns Cm m
-than the last access time
-.Pq Ar Y Ns = Ns Cm a ,
-inode creation time
-.Pq Ar Y Ns = Ns Cm B ,
-change time
-.Pq Ar Y Ns = Ns Cm c ,
-or modification time
-.Pq Ar Y Ns = Ns Cm m
-of
-.Ar file .
-In addition, if
-.Ar Y Ns = Ns Cm t ,
-then
-.Ar file
-is instead interpreted as a direct date specification of the form
-understood by
-.Xr cvs 1 .
-Note that
-.Ic -newermm
-is equivalent to
-.Ic -newer .
-.It Ic -nogroup
-True if the file belongs to an unknown group.
-.It Ic -noignore_readdir_race
-This option is for GNU find compatibility and is ignored.
-.It Ic -noleaf
-This option is for GNU find compatibility.
-In GNU find it disables an optimization not relevant to
-.Xr find 1 ,
-so it is ignored.
-.It Ic -nouser
-True if the file belongs to an unknown user.
-.It Ic -ok Ar utility Oo Ar argument ... Oc Li \&;
-The
-.Ic -ok
-primary is identical to the
-.Ic -exec
-primary with the exception that
-.Nm
-requests user affirmation for the execution of the
-.Ar utility
-by printing
-a message to the terminal and reading a response.
-If the response is not affirmative
-.Ql ( y
-in the
-.Dq Li POSIX
-locale),
-the command is not executed and the
-value of the
-.Ic -ok
-expression is false.
-.It Ic -okdir Ar utility Oo Ar argument ... Oc Li \&;
-The
-.Ic -okdir
-primary is identical to the
-.Ic -execdir
-primary with the same exception as described for the
-.Ic -ok
-primary.
-.It Ic -path Ar pattern
-True if the pathname being examined matches
-.Ar pattern .
-Special shell pattern matching characters
-.Dq ( Li \&[ ,
-.Dq Li \&] ,
-.Dq Li * ,
-and
-.Dq Li \&? )
-may be used as part of
-.Ar pattern .
-These characters may be matched explicitly by escaping them with a
-backslash
-.Pq Dq Li \e .
-Slashes
-.Pq Dq Li /
-are treated as normal characters and do not have to be
-matched explicitly.
-.It Ic -perm Oo Cm - Ns | Ns Cm + Oc Ns Ar mode
-The
-.Ar mode
-may be either symbolic (see
-.Xr chmod 1 )
-or an octal number.
-If the
-.Ar mode
-is symbolic, a starting value of zero is assumed and the
-.Ar mode
-sets or clears permissions without regard to the process' file mode
-creation mask.
-If the
-.Ar mode
-is octal, only bits 07777
-.Pq Dv S_ISUID | S_ISGID | S_ISTXT | S_IRWXU | S_IRWXG | S_IRWXO
-of the file's mode bits participate
-in the comparison.
-If the
-.Ar mode
-is preceded by a dash
-.Pq Dq Li - ,
-this primary evaluates to true
-if at least all of the bits in the
-.Ar mode
-are set in the file's mode bits.
-If the
-.Ar mode
-is preceded by a plus
-.Pq Dq Li + ,
-this primary evaluates to true
-if any of the bits in the
-.Ar mode
-are set in the file's mode bits.
-Otherwise, this primary evaluates to true if
-the bits in the
-.Ar mode
-exactly match the file's mode bits.
-Note, the first character of a symbolic mode may not be a dash
-.Pq Dq Li - .
-.It Ic -print
-This primary always evaluates to true.
-It prints the pathname of the current file to standard output.
-If none of
-.Ic -exec , -ls , -print0 ,
-or
-.Ic -ok
-is specified, the given expression shall be effectively replaced by
-.Cm \&( Ar "given expression" Cm \&) Ic -print .
-.It Ic -print0
-This primary always evaluates to true.
-It prints the pathname of the current file to standard output, followed by an
-.Tn ASCII
-.Dv NUL
-character (character code 0).
-.It Ic -prune
-This primary always evaluates to true.
-It causes
-.Nm
-to not descend into the current file.
-Note, the
-.Ic -prune
-primary has no effect if the
-.Fl d
-option was specified.
-.It Ic -regex Ar pattern
-True if the whole path of the file matches
-.Ar pattern
-using regular expression.
-To match a file named
-.Dq Pa ./foo/xyzzy ,
-you can use the regular expression
-.Dq Li ".*/[xyz]*"
-or
-.Dq Li ".*/foo/.*" ,
-but not
-.Dq Li xyzzy
-or
-.Dq Li /foo/ .
-.It Ic -samefile Ar name
-True if the file is a hard link to
-.Ar name .
-If the command option
-.Ic -L
-is specified, it is also true if the file is a symbolic link and
-points to
-.Ar name .
-.It Ic -size Ar n Ns Op Cm ckMGTP
-True if the file's size, rounded up, in 512-byte blocks is
-.Ar n .
-If
-.Ar n
-is followed by a
-.Cm c ,
-then the primary is true if the
-file's size is
-.Ar n
-bytes (characters).
-Similarly if
-.Ar n
-is followed by a scale indicator then the file's size is compared to
-.Ar n
-scaled as:
-.Pp
-.Bl -tag -width indent -compact
-.It Cm k
-kilobytes (1024 bytes)
-.It Cm M
-megabytes (1024 kilobytes)
-.It Cm G
-gigabytes (1024 megabytes)
-.It Cm T
-terabytes (1024 gigabytes)
-.It Cm P
-petabytes (1024 terabytes)
-.El
-.It Ic -type Ar t
-True if the file is of the specified type.
-Possible file types are as follows:
-.Pp
-.Bl -tag -width indent -compact
-.It Cm b
-block special
-.It Cm c
-character special
-.It Cm d
-directory
-.It Cm f
-regular file
-.It Cm l
-symbolic link
-.It Cm p
-FIFO
-.It Cm s
-socket
-.El
-.It Ic -uid Ar uname
-The same thing as
-.Ar -user Ar uname
-for compatibility with GNU find.
-GNU find imposes a restriction that
-.Ar uname
-is numeric, while
-.Xr find 1
-does not.
-.It Ic -user Ar uname
-True if the file belongs to the user
-.Ar uname .
-If
-.Ar uname
-is numeric and there is no such user name, then
-.Ar uname
-is treated as a user ID.
-.It Ic -wholename Ar pattern
-The same thing as
-.Ic -path ,
-for GNU find compatibility.
-.El
-.Pp
-All primaries which take a numeric argument allow the number to be
-preceded by a plus sign
-.Pq Dq Li +
-or a minus sign
-.Pq Dq Li - .
-A preceding plus sign means
-.Dq more than n ,
-a preceding minus sign means
-.Dq less than n
-and neither means
-.Dq exactly n .
-.Sh OPERATORS
-The primaries may be combined using the following operators.
-The operators are listed in order of decreasing precedence.
-.Pp
-.Bl -tag -width indent -compact
-.It Cm \&( Ar expression Cm \&)
-This evaluates to true if the parenthesized expression evaluates to
-true.
-.Pp
-.It Cm \&! Ar expression
-.It Cm -not Ar expression
-This is the unary
-.Tn NOT
-operator.
-It evaluates to true if the expression is false.
-.Pp
-.It Cm -false
-Always false.
-.It Cm -true
-Always true.
-.Pp
-.It Ar expression Cm -and Ar expression
-.It Ar expression expression
-The
-.Cm -and
-operator is the logical
-.Tn AND
-operator.
-As it is implied by the juxtaposition of two expressions it does not
-have to be specified.
-The expression evaluates to true if both expressions are true.
-The second expression is not evaluated if the first expression is false.
-.Pp
-.It Ar expression Cm -or Ar expression
-The
-.Cm -or
-operator is the logical
-.Tn OR
-operator.
-The expression evaluates to true if either the first or the second expression
-is true.
-The second expression is not evaluated if the first expression is true.
-.El
-.Pp
-All operands and primaries must be separate arguments to
-.Nm .
-Primaries which themselves take arguments expect each argument
-to be a separate argument to
-.Nm .
-.Sh ENVIRONMENT
-The
-.Ev LANG , LC_ALL , LC_COLLATE , LC_CTYPE , LC_MESSAGES
-and
-.Ev LC_TIME
-environment variables affect the execution of the
-.Nm
-utility as described in
-.Xr environ 7 .
-.Sh EXAMPLES
-The following examples are shown as given to the shell:
-.Bl -tag -width indent
-.It Li "find / \e! -name \*q*.c\*q -print"
-Print out a list of all the files whose names do not end in
-.Pa .c .
-.It Li "find / -newer ttt -user wnj -print"
-Print out a list of all the files owned by user
-.Dq wnj
-that are newer
-than the file
-.Pa ttt .
-.It Li "find / \e! \e( -newer ttt -user wnj \e) -print"
-Print out a list of all the files which are not both newer than
-.Pa ttt
-and owned by
-.Dq wnj .
-.It Li "find / \e( -newer ttt -or -user wnj \e) -print"
-Print out a list of all the files that are either owned by
-.Dq wnj
-or that are newer than
-.Pa ttt .
-.It Li "find / -newerct '1 minute ago' -print"
-Print out a list of all the files whose inode change time is more
-recent than the current time minus one minute.
-.It Li "find / -type f -exec echo {} \e;"
-Use the
-.Xr echo 1
-command to print out a list of all the files.
-.It Li "find -L /usr/ports/packages -type l -delete"
-Delete all broken symbolic links in
-.Pa /usr/ports/packages .
-.It Li "find /usr/src -name CVS -prune -o -depth +6 -print"
-Find files and directories that are at least seven levels deep
-in the working directory
-.Pa /usr/src .
-.It Li "find /usr/src -name CVS -prune -o -mindepth 7 -print"
-Is not equivalent to the previous example, since
-.Ic -prune
-is not evaluated below level seven.
-.El
-.Sh COMPATIBILITY
-The
-.Ic -follow
-primary is deprecated; the
-.Fl L
-option should be used instead.
-See the
-.Sx STANDARDS
-section below for details.
-.Sh SEE ALSO
-.Xr chflags 1 ,
-.Xr chmod 1 ,
-.Xr cvs 1 ,
-.Xr locate 1 ,
-.Xr whereis 1 ,
-.Xr which 1 ,
-.Xr xargs 1 ,
-.Xr stat 2 ,
-.Xr acl 3 ,
-.Xr fts 3 ,
-.Xr getgrent 3 ,
-.Xr getpwent 3 ,
-.Xr strmode 3 ,
-.Xr re_format 7 ,
-.Xr symlink 7
-.Sh STANDARDS
-The
-.Nm
-utility syntax is a superset of the syntax specified by the
-.St -p1003.1-2001
-standard.
-.Pp
-All the single character options except
-.Fl H
-and
-.Fl L
-as well as
-.Ic -amin , -anewer , -cmin , -cnewer , -delete , -empty , -fstype ,
-.Ic -iname , -inum , -iregex , -ls , -maxdepth , -mindepth , -mmin ,
-.Ic -path , -print0 , -regex
-and all of the
-.Ic -B*
-birthtime related primaries are extensions to
-.St -p1003.1-2001 .
-.Pp
-Historically, the
-.Fl d , L
-and
-.Fl x
-options were implemented using the primaries
-.Ic -depth , -follow ,
-and
-.Ic -xdev .
-These primaries always evaluated to true.
-As they were really global variables that took effect before the traversal
-began, some legal expressions could have unexpected results.
-An example is the expression
-.Ic -print Cm -o Ic -depth .
-As
-.Ic -print
-always evaluates to true, the standard order of evaluation
-implies that
-.Ic -depth
-would never be evaluated.
-This is not the case.
-.Pp
-The operator
-.Cm -or
-was implemented as
-.Cm -o ,
-and the operator
-.Cm -and
-was implemented as
-.Cm -a .
-.Pp
-Historic implementations of the
-.Ic -exec
-and
-.Ic -ok
-primaries did not replace the string
-.Dq Li {}
-in the utility name or the
-utility arguments if it had preceding or following non-whitespace characters.
-This version replaces it no matter where in the utility name or arguments
-it appears.
-.Pp
-The
-.Fl E
-option was inspired by the equivalent
-.Xr grep 1
-and
-.Xr sed 1
-options.
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v1 .
-.Sh BUGS
-The special characters used by
-.Nm
-are also special characters to many shell programs.
-In particular, the characters
-.Dq Li * ,
-.Dq Li \&[ ,
-.Dq Li \&] ,
-.Dq Li \&? ,
-.Dq Li \&( ,
-.Dq Li \&) ,
-.Dq Li \&! ,
-.Dq Li \e
-and
-.Dq Li \&;
-may have to be escaped from the shell.
-.Pp
-As there is no delimiter separating options and file names or file
-names and the
-.Ar expression ,
-it is difficult to specify files named
-.Pa -xdev
-or
-.Pa \&! .
-These problems are handled by the
-.Fl f
-option and the
-.Xr getopt 3
-.Dq Fl Fl
-construct.
-.Pp
-The
-.Ic -delete
-primary does not interact well with other options that cause the file system
-tree traversal options to be changed.
-.Pp
-The
-.Ic -mindepth
-and
-.Ic -maxdepth
-primaries are actually global options (as documented above).
-They should
-probably be replaced by options which look like options.
diff --git a/usr.bin/find/find.c b/usr.bin/find/find.c
deleted file mode 100644
index cc2d797..0000000
--- a/usr.bin/find/find.c
+++ /dev/null
@@ -1,238 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Cimarron D. Taylor of the University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)find.c 8.5 (Berkeley) 8/5/94";
-#else
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fts.h>
-#include <regex.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "find.h"
-
-static int find_compare(const FTSENT * const *s1, const FTSENT * const *s2);
-
-/*
- * find_compare --
- * tell fts_open() how to order the traversal of the hierarchy.
- * This variant gives lexicographical order, i.e., alphabetical
- * order within each directory.
- */
-static int
-find_compare(const FTSENT * const *s1, const FTSENT * const *s2)
-{
-
- return (strcoll((*s1)->fts_name, (*s2)->fts_name));
-}
-
-/*
- * find_formplan --
- * process the command line and create a "plan" corresponding to the
- * command arguments.
- */
-PLAN *
-find_formplan(char *argv[])
-{
- PLAN *plan, *tail, *new;
-
- /*
- * for each argument in the command line, determine what kind of node
- * it is, create the appropriate node type and add the new plan node
- * to the end of the existing plan. The resulting plan is a linked
- * list of plan nodes. For example, the string:
- *
- * % find . -name foo -newer bar -print
- *
- * results in the plan:
- *
- * [-name foo]--> [-newer bar]--> [-print]
- *
- * in this diagram, `[-name foo]' represents the plan node generated
- * by c_name() with an argument of foo and `-->' represents the
- * plan->next pointer.
- */
- for (plan = tail = NULL; *argv;) {
- if (!(new = find_create(&argv)))
- continue;
- if (plan == NULL)
- tail = plan = new;
- else {
- tail->next = new;
- tail = new;
- }
- }
-
- /*
- * if the user didn't specify one of -print, -ok or -exec, then -print
- * is assumed so we bracket the current expression with parens, if
- * necessary, and add a -print node on the end.
- */
- if (!isoutput) {
- OPTION *p;
- char **argv1 = 0;
-
- if (plan == NULL) {
- p = lookup_option("-print");
- new = (p->create)(p, &argv1);
- tail = plan = new;
- } else {
- p = lookup_option("(");
- new = (p->create)(p, &argv1);
- new->next = plan;
- plan = new;
- p = lookup_option(")");
- new = (p->create)(p, &argv1);
- tail->next = new;
- tail = new;
- p = lookup_option("-print");
- new = (p->create)(p, &argv1);
- tail->next = new;
- tail = new;
- }
- }
-
- /*
- * the command line has been completely processed into a search plan
- * except for the (, ), !, and -o operators. Rearrange the plan so
- * that the portions of the plan which are affected by the operators
- * are moved into operator nodes themselves. For example:
- *
- * [!]--> [-name foo]--> [-print]
- *
- * becomes
- *
- * [! [-name foo] ]--> [-print]
- *
- * and
- *
- * [(]--> [-depth]--> [-name foo]--> [)]--> [-print]
- *
- * becomes
- *
- * [expr [-depth]-->[-name foo] ]--> [-print]
- *
- * operators are handled in order of precedence.
- */
-
- plan = paren_squish(plan); /* ()'s */
- plan = not_squish(plan); /* !'s */
- plan = or_squish(plan); /* -o's */
- return (plan);
-}
-
-FTS *tree; /* pointer to top of FTS hierarchy */
-
-/*
- * find_execute --
- * take a search plan and an array of search paths and executes the plan
- * over all FTSENT's returned for the given search paths.
- */
-int
-find_execute(PLAN *plan, char *paths[])
-{
- FTSENT *entry;
- PLAN *p;
- int rval;
-
- tree = fts_open(paths, ftsoptions, (issort ? find_compare : NULL));
- if (tree == NULL)
- err(1, "ftsopen");
-
- for (rval = 0; (entry = fts_read(tree)) != NULL;) {
- if (maxdepth != -1 && entry->fts_level >= maxdepth) {
- if (fts_set(tree, entry, FTS_SKIP))
- err(1, "%s", entry->fts_path);
- }
-
- switch (entry->fts_info) {
- case FTS_D:
- if (isdepth)
- continue;
- break;
- case FTS_DP:
- if (!isdepth)
- continue;
- break;
- case FTS_DNR:
- case FTS_ERR:
- case FTS_NS:
- (void)fflush(stdout);
- warnx("%s: %s",
- entry->fts_path, strerror(entry->fts_errno));
- rval = 1;
- continue;
-#ifdef FTS_W
- case FTS_W:
- continue;
-#endif /* FTS_W */
- }
-#define BADCH " \t\n\\'\""
- if (isxargs && strpbrk(entry->fts_path, BADCH)) {
- (void)fflush(stdout);
- warnx("%s: illegal path", entry->fts_path);
- rval = 1;
- continue;
- }
-
- if (mindepth != -1 && entry->fts_level < mindepth)
- continue;
-
- /*
- * Call all the functions in the execution plan until one is
- * false or all have been executed. This is where we do all
- * the work specified by the user on the command line.
- */
- for (p = plan; p && (p->execute)(p, entry); p = p->next);
- }
- finish_execplus();
- if (errno)
- err(1, "fts_read");
- return (rval);
-}
diff --git a/usr.bin/find/find.h b/usr.bin/find/find.h
deleted file mode 100644
index 5a465f1..0000000
--- a/usr.bin/find/find.h
+++ /dev/null
@@ -1,149 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Cimarron D. Taylor of the University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)find.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#include <regex.h>
-
-/* forward declarations */
-struct _plandata;
-struct _option;
-
-/* execute function */
-typedef int exec_f(struct _plandata *, FTSENT *);
-/* create function */
-typedef struct _plandata *creat_f(struct _option *, char ***);
-
-/* function modifiers */
-#define F_NEEDOK 0x00000001 /* -ok vs. -exec */
-#define F_EXECDIR 0x00000002 /* -execdir vs. -exec */
-#define F_TIME_A 0x00000004 /* one of -atime, -anewer, -newera* */
-#define F_TIME_C 0x00000008 /* one of -ctime, -cnewer, -newerc* */
-#define F_TIME2_A 0x00000010 /* one of -newer?a */
-#define F_TIME2_C 0x00000020 /* one of -newer?c */
-#define F_TIME2_T 0x00000040 /* one of -newer?t */
-#define F_MAXDEPTH F_TIME_A /* maxdepth vs. mindepth */
-#define F_DEPTH F_TIME_A /* -depth n vs. -d */
-/* command line function modifiers */
-#define F_EQUAL 0x00000000 /* [acm]min [acm]time inum links size */
-#define F_LESSTHAN 0x00000100
-#define F_GREATER 0x00000200
-#define F_ELG_MASK 0x00000300
-#define F_ATLEAST 0x00000400 /* flags perm */
-#define F_ANY 0x00000800 /* perm */
-#define F_MTMASK 0x00003000
-#define F_MTFLAG 0x00000000 /* fstype */
-#define F_MTTYPE 0x00001000
-#define F_MTUNKNOWN 0x00002000
-#define F_IGNCASE 0x00010000 /* iname ipath iregex */
-#define F_EXACTTIME F_IGNCASE /* -[acm]time units syntax */
-#define F_EXECPLUS 0x00020000 /* -exec ... {} + */
-#define F_TIME_B 0x00040000 /* one of -Btime, -Bnewer, -newerB* */
-#define F_TIME2_B 0x00080000 /* one of -newer?B */
-#define F_LINK 0x00100000 /* lname or ilname */
-
-/* node definition */
-typedef struct _plandata {
- struct _plandata *next; /* next node */
- exec_f *execute; /* node evaluation function */
- int flags; /* private flags */
- union {
- gid_t _g_data; /* gid */
- ino_t _i_data; /* inode */
- mode_t _m_data; /* mode mask */
- struct {
- u_long _f_flags;
- u_long _f_notflags;
- } fl;
- nlink_t _l_data; /* link count */
- short _d_data; /* level depth (-1 to N) */
- off_t _o_data; /* file size */
- time_t _t_data; /* time value */
- uid_t _u_data; /* uid */
- short _mt_data; /* mount flags */
- struct _plandata *_p_data[2]; /* PLAN trees */
- struct _ex {
- char **_e_argv; /* argv array */
- char **_e_orig; /* original strings */
- int *_e_len; /* allocated length */
- int _e_pbnum; /* base num. of args. used */
- int _e_ppos; /* number of arguments used */
- int _e_pnummax; /* max. number of arguments */
- int _e_psize; /* number of bytes of args. */
- int _e_pbsize; /* base num. of bytes of args */
- int _e_psizemax; /* max num. of bytes of args */
- struct _plandata *_e_next;/* next F_EXECPLUS in tree */
- } ex;
- char *_a_data[2]; /* array of char pointers */
- char *_c_data; /* char pointer */
- regex_t *_re_data; /* regex */
- } p_un;
-} PLAN;
-#define a_data p_un._a_data
-#define c_data p_un._c_data
-#define d_data p_un._d_data
-#define fl_flags p_un.fl._f_flags
-#define fl_notflags p_un.fl._f_notflags
-#define g_data p_un._g_data
-#define i_data p_un._i_data
-#define l_data p_un._l_data
-#define m_data p_un._m_data
-#define mt_data p_un._mt_data
-#define o_data p_un._o_data
-#define p_data p_un._p_data
-#define t_data p_un._t_data
-#define u_data p_un._u_data
-#define re_data p_un._re_data
-#define e_argv p_un.ex._e_argv
-#define e_orig p_un.ex._e_orig
-#define e_len p_un.ex._e_len
-#define e_pbnum p_un.ex._e_pbnum
-#define e_ppos p_un.ex._e_ppos
-#define e_pnummax p_un.ex._e_pnummax
-#define e_psize p_un.ex._e_psize
-#define e_pbsize p_un.ex._e_pbsize
-#define e_psizemax p_un.ex._e_psizemax
-#define e_next p_un.ex._e_next
-
-typedef struct _option {
- const char *name; /* option name */
- creat_f *create; /* create function */
- exec_f *execute; /* execute function */
- int flags;
-} OPTION;
-
-#include "extern.h"
diff --git a/usr.bin/find/function.c b/usr.bin/find/function.c
deleted file mode 100644
index c3c90f8..0000000
--- a/usr.bin/find/function.c
+++ /dev/null
@@ -1,1696 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Cimarron D. Taylor of the University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static const char sccsid[] = "@(#)function.c 8.10 (Berkeley) 5/4/95";
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/ucred.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/acl.h>
-#include <sys/wait.h>
-#include <sys/mount.h>
-#include <sys/timeb.h>
-
-#include <dirent.h>
-#include <err.h>
-#include <errno.h>
-#include <fnmatch.h>
-#include <fts.h>
-#include <grp.h>
-#include <limits.h>
-#include <pwd.h>
-#include <regex.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <ctype.h>
-
-#include "find.h"
-
-static PLAN *palloc(OPTION *);
-static long long find_parsenum(PLAN *, const char *, char *, char *);
-static long long find_parsetime(PLAN *, const char *, char *);
-static char *nextarg(OPTION *, char ***);
-
-extern char **environ;
-
-static PLAN *lastexecplus = NULL;
-
-#define COMPARE(a, b) do { \
- switch (plan->flags & F_ELG_MASK) { \
- case F_EQUAL: \
- return (a == b); \
- case F_LESSTHAN: \
- return (a < b); \
- case F_GREATER: \
- return (a > b); \
- default: \
- abort(); \
- } \
-} while(0)
-
-static PLAN *
-palloc(OPTION *option)
-{
- PLAN *new;
-
- if ((new = malloc(sizeof(PLAN))) == NULL)
- err(1, NULL);
- new->execute = option->execute;
- new->flags = option->flags;
- new->next = NULL;
- return new;
-}
-
-/*
- * find_parsenum --
- * Parse a string of the form [+-]# and return the value.
- */
-static long long
-find_parsenum(PLAN *plan, const char *option, char *vp, char *endch)
-{
- long long value;
- char *endchar, *str; /* Pointer to character ending conversion. */
-
- /* Determine comparison from leading + or -. */
- str = vp;
- switch (*str) {
- case '+':
- ++str;
- plan->flags |= F_GREATER;
- break;
- case '-':
- ++str;
- plan->flags |= F_LESSTHAN;
- break;
- default:
- plan->flags |= F_EQUAL;
- break;
- }
-
- /*
- * Convert the string with strtoq(). Note, if strtoq() returns zero
- * and endchar points to the beginning of the string we know we have
- * a syntax error.
- */
- value = strtoq(str, &endchar, 10);
- if (value == 0 && endchar == str)
- errx(1, "%s: %s: illegal numeric value", option, vp);
- if (endchar[0] && endch == NULL)
- errx(1, "%s: %s: illegal trailing character", option, vp);
- if (endch)
- *endch = endchar[0];
- return value;
-}
-
-/*
- * find_parsetime --
- * Parse a string of the form [+-]([0-9]+[smhdw]?)+ and return the value.
- */
-static long long
-find_parsetime(PLAN *plan, const char *option, char *vp)
-{
- long long secs, value;
- char *str, *unit; /* Pointer to character ending conversion. */
-
- /* Determine comparison from leading + or -. */
- str = vp;
- switch (*str) {
- case '+':
- ++str;
- plan->flags |= F_GREATER;
- break;
- case '-':
- ++str;
- plan->flags |= F_LESSTHAN;
- break;
- default:
- plan->flags |= F_EQUAL;
- break;
- }
-
- value = strtoq(str, &unit, 10);
- if (value == 0 && unit == str) {
- errx(1, "%s: %s: illegal time value", option, vp);
- /* NOTREACHED */
- }
- if (*unit == '\0')
- return value;
-
- /* Units syntax. */
- secs = 0;
- for (;;) {
- switch(*unit) {
- case 's': /* seconds */
- secs += value;
- break;
- case 'm': /* minutes */
- secs += value * 60;
- break;
- case 'h': /* hours */
- secs += value * 3600;
- break;
- case 'd': /* days */
- secs += value * 86400;
- break;
- case 'w': /* weeks */
- secs += value * 604800;
- break;
- default:
- errx(1, "%s: %s: bad unit '%c'", option, vp, *unit);
- /* NOTREACHED */
- }
- str = unit + 1;
- if (*str == '\0') /* EOS */
- break;
- value = strtoq(str, &unit, 10);
- if (value == 0 && unit == str) {
- errx(1, "%s: %s: illegal time value", option, vp);
- /* NOTREACHED */
- }
- if (*unit == '\0') {
- errx(1, "%s: %s: missing trailing unit", option, vp);
- /* NOTREACHED */
- }
- }
- plan->flags |= F_EXACTTIME;
- return secs;
-}
-
-/*
- * nextarg --
- * Check that another argument still exists, return a pointer to it,
- * and increment the argument vector pointer.
- */
-static char *
-nextarg(OPTION *option, char ***argvp)
-{
- char *arg;
-
- if ((arg = **argvp) == 0)
- errx(1, "%s: requires additional arguments", option->name);
- (*argvp)++;
- return arg;
-} /* nextarg() */
-
-/*
- * The value of n for the inode times (atime, birthtime, ctime, mtime) is a
- * range, i.e. n matches from (n - 1) to n 24 hour periods. This interacts
- * with -n, such that "-mtime -1" would be less than 0 days, which isn't what
- * the user wanted. Correct so that -1 is "less than 1".
- */
-#define TIME_CORRECT(p) \
- if (((p)->flags & F_ELG_MASK) == F_LESSTHAN) \
- ++((p)->t_data);
-
-/*
- * -[acm]min n functions --
- *
- * True if the difference between the
- * file access time (-amin)
- * file birth time (-Bmin)
- * last change of file status information (-cmin)
- * file modification time (-mmin)
- * and the current time is n min periods.
- */
-int
-f_Xmin(PLAN *plan, FTSENT *entry)
-{
- if (plan->flags & F_TIME_C) {
- COMPARE((now - entry->fts_statp->st_ctime +
- 60 - 1) / 60, plan->t_data);
- } else if (plan->flags & F_TIME_A) {
- COMPARE((now - entry->fts_statp->st_atime +
- 60 - 1) / 60, plan->t_data);
- } else if (plan->flags & F_TIME_B) {
- COMPARE((now - entry->fts_statp->st_birthtime +
- 60 - 1) / 60, plan->t_data);
- } else {
- COMPARE((now - entry->fts_statp->st_mtime +
- 60 - 1) / 60, plan->t_data);
- }
-}
-
-PLAN *
-c_Xmin(OPTION *option, char ***argvp)
-{
- char *nmins;
- PLAN *new;
-
- nmins = nextarg(option, argvp);
- ftsoptions &= ~FTS_NOSTAT;
-
- new = palloc(option);
- new->t_data = find_parsenum(new, option->name, nmins, NULL);
- TIME_CORRECT(new);
- return new;
-}
-
-/*
- * -[acm]time n functions --
- *
- * True if the difference between the
- * file access time (-atime)
- * file birth time (-Btime)
- * last change of file status information (-ctime)
- * file modification time (-mtime)
- * and the current time is n 24 hour periods.
- */
-
-int
-f_Xtime(PLAN *plan, FTSENT *entry)
-{
- time_t xtime;
-
- if (plan->flags & F_TIME_A)
- xtime = entry->fts_statp->st_atime;
- else if (plan->flags & F_TIME_B)
- xtime = entry->fts_statp->st_birthtime;
- else if (plan->flags & F_TIME_C)
- xtime = entry->fts_statp->st_ctime;
- else
- xtime = entry->fts_statp->st_mtime;
-
- if (plan->flags & F_EXACTTIME)
- COMPARE(now - xtime, plan->t_data);
- else
- COMPARE((now - xtime + 86400 - 1) / 86400, plan->t_data);
-}
-
-PLAN *
-c_Xtime(OPTION *option, char ***argvp)
-{
- char *value;
- PLAN *new;
-
- value = nextarg(option, argvp);
- ftsoptions &= ~FTS_NOSTAT;
-
- new = palloc(option);
- new->t_data = find_parsetime(new, option->name, value);
- if (!(new->flags & F_EXACTTIME))
- TIME_CORRECT(new);
- return new;
-}
-
-/*
- * -maxdepth/-mindepth n functions --
- *
- * Does the same as -prune if the level of the current file is
- * greater/less than the specified maximum/minimum depth.
- *
- * Note that -maxdepth and -mindepth are handled specially in
- * find_execute() so their f_* functions are set to f_always_true().
- */
-PLAN *
-c_mXXdepth(OPTION *option, char ***argvp)
-{
- char *dstr;
- PLAN *new;
-
- dstr = nextarg(option, argvp);
- if (dstr[0] == '-')
- /* all other errors handled by find_parsenum() */
- errx(1, "%s: %s: value must be positive", option->name, dstr);
-
- new = palloc(option);
- if (option->flags & F_MAXDEPTH)
- maxdepth = find_parsenum(new, option->name, dstr, NULL);
- else
- mindepth = find_parsenum(new, option->name, dstr, NULL);
- return new;
-}
-
-/*
- * -acl function --
- *
- * Show files with EXTENDED ACL attributes.
- */
-int
-f_acl(PLAN *plan __unused, FTSENT *entry)
-{
- int match, entries;
- acl_entry_t ae;
- acl_t facl;
-
- if (S_ISLNK(entry->fts_statp->st_mode))
- return 0;
- if ((match = pathconf(entry->fts_accpath, _PC_ACL_EXTENDED)) <= 0) {
- if (match < 0 && errno != EINVAL)
- warn("%s", entry->fts_accpath);
- else
- return 0;
- }
- match = 0;
- if ((facl = acl_get_file(entry->fts_accpath,ACL_TYPE_ACCESS)) != NULL) {
- if (acl_get_entry(facl, ACL_FIRST_ENTRY, &ae) == 1) {
- /*
- * POSIX.1e requires that ACLs of type ACL_TYPE_ACCESS
- * must have at least three entries (owner, group,
- * other).
- */
- entries = 1;
- while (acl_get_entry(facl, ACL_NEXT_ENTRY, &ae) == 1) {
- if (++entries > 3) {
- match = 1;
- break;
- }
- }
- }
- acl_free(facl);
- } else
- warn("%s", entry->fts_accpath);
- return match;
-}
-
-PLAN *
-c_acl(OPTION *option, char ***argvp __unused)
-{
- ftsoptions &= ~FTS_NOSTAT;
- return (palloc(option));
-}
-
-/*
- * -delete functions --
- *
- * True always. Makes its best shot and continues on regardless.
- */
-int
-f_delete(PLAN *plan __unused, FTSENT *entry)
-{
- /* ignore these from fts */
- if (strcmp(entry->fts_accpath, ".") == 0 ||
- strcmp(entry->fts_accpath, "..") == 0)
- return 1;
-
- /* sanity check */
- if (isdepth == 0 || /* depth off */
- (ftsoptions & FTS_NOSTAT) || /* not stat()ing */
- !(ftsoptions & FTS_PHYSICAL) || /* physical off */
- (ftsoptions & FTS_LOGICAL)) /* or finally, logical on */
- errx(1, "-delete: insecure options got turned on");
-
- /* Potentially unsafe - do not accept relative paths whatsoever */
- if (strchr(entry->fts_accpath, '/') != NULL)
- errx(1, "-delete: %s: relative path potentially not safe",
- entry->fts_accpath);
-
- /* Turn off user immutable bits if running as root */
- if ((entry->fts_statp->st_flags & (UF_APPEND|UF_IMMUTABLE)) &&
- !(entry->fts_statp->st_flags & (SF_APPEND|SF_IMMUTABLE)) &&
- geteuid() == 0)
- chflags(entry->fts_accpath,
- entry->fts_statp->st_flags &= ~(UF_APPEND|UF_IMMUTABLE));
-
- /* rmdir directories, unlink everything else */
- if (S_ISDIR(entry->fts_statp->st_mode)) {
- if (rmdir(entry->fts_accpath) < 0 && errno != ENOTEMPTY)
- warn("-delete: rmdir(%s)", entry->fts_path);
- } else {
- if (unlink(entry->fts_accpath) < 0)
- warn("-delete: unlink(%s)", entry->fts_path);
- }
-
- /* "succeed" */
- return 1;
-}
-
-PLAN *
-c_delete(OPTION *option, char ***argvp __unused)
-{
-
- ftsoptions &= ~FTS_NOSTAT; /* no optimise */
- ftsoptions |= FTS_PHYSICAL; /* disable -follow */
- ftsoptions &= ~FTS_LOGICAL; /* disable -follow */
- isoutput = 1; /* possible output */
- isdepth = 1; /* -depth implied */
-
- return palloc(option);
-}
-
-
-/*
- * always_true --
- *
- * Always true, used for -maxdepth, -mindepth, -xdev, -follow, and -true
- */
-int
-f_always_true(PLAN *plan __unused, FTSENT *entry __unused)
-{
- return 1;
-}
-
-/*
- * -depth functions --
- *
- * With argument: True if the file is at level n.
- * Without argument: Always true, causes descent of the directory hierarchy
- * to be done so that all entries in a directory are acted on before the
- * directory itself.
- */
-int
-f_depth(PLAN *plan, FTSENT *entry)
-{
- if (plan->flags & F_DEPTH)
- COMPARE(entry->fts_level, plan->d_data);
- else
- return 1;
-}
-
-PLAN *
-c_depth(OPTION *option, char ***argvp)
-{
- PLAN *new;
- char *str;
-
- new = palloc(option);
-
- str = **argvp;
- if (str && !(new->flags & F_DEPTH)) {
- /* skip leading + or - */
- if (*str == '+' || *str == '-')
- str++;
- /* skip sign */
- if (*str == '+' || *str == '-')
- str++;
- if (isdigit(*str))
- new->flags |= F_DEPTH;
- }
-
- if (new->flags & F_DEPTH) { /* -depth n */
- char *ndepth;
-
- ndepth = nextarg(option, argvp);
- new->d_data = find_parsenum(new, option->name, ndepth, NULL);
- } else { /* -d */
- isdepth = 1;
- }
-
- return new;
-}
-
-/*
- * -empty functions --
- *
- * True if the file or directory is empty
- */
-int
-f_empty(PLAN *plan __unused, FTSENT *entry)
-{
- if (S_ISREG(entry->fts_statp->st_mode) &&
- entry->fts_statp->st_size == 0)
- return 1;
- if (S_ISDIR(entry->fts_statp->st_mode)) {
- struct dirent *dp;
- int empty;
- DIR *dir;
-
- empty = 1;
- dir = opendir(entry->fts_accpath);
- if (dir == NULL)
- err(1, "%s", entry->fts_accpath);
- for (dp = readdir(dir); dp; dp = readdir(dir))
- if (dp->d_name[0] != '.' ||
- (dp->d_name[1] != '\0' &&
- (dp->d_name[1] != '.' || dp->d_name[2] != '\0'))) {
- empty = 0;
- break;
- }
- closedir(dir);
- return empty;
- }
- return 0;
-}
-
-PLAN *
-c_empty(OPTION *option, char ***argvp __unused)
-{
- ftsoptions &= ~FTS_NOSTAT;
-
- return palloc(option);
-}
-
-/*
- * [-exec | -execdir | -ok] utility [arg ... ] ; functions --
- *
- * True if the executed utility returns a zero value as exit status.
- * The end of the primary expression is delimited by a semicolon. If
- * "{}" occurs anywhere, it gets replaced by the current pathname,
- * or, in the case of -execdir, the current basename (filename
- * without leading directory prefix). For -exec and -ok,
- * the current directory for the execution of utility is the same as
- * the current directory when the find utility was started, whereas
- * for -execdir, it is the directory the file resides in.
- *
- * The primary -ok differs from -exec in that it requests affirmation
- * of the user before executing the utility.
- */
-int
-f_exec(PLAN *plan, FTSENT *entry)
-{
- int cnt;
- pid_t pid;
- int status;
- char *file;
-
- if (entry == NULL && plan->flags & F_EXECPLUS) {
- if (plan->e_ppos == plan->e_pbnum)
- return (1);
- plan->e_argv[plan->e_ppos] = NULL;
- goto doexec;
- }
-
- /* XXX - if file/dir ends in '/' this will not work -- can it? */
- if ((plan->flags & F_EXECDIR) && \
- (file = strrchr(entry->fts_path, '/')))
- file++;
- else
- file = entry->fts_path;
-
- if (plan->flags & F_EXECPLUS) {
- if ((plan->e_argv[plan->e_ppos] = strdup(file)) == NULL)
- err(1, NULL);
- plan->e_len[plan->e_ppos] = strlen(file);
- plan->e_psize += plan->e_len[plan->e_ppos];
- if (++plan->e_ppos < plan->e_pnummax &&
- plan->e_psize < plan->e_psizemax)
- return (1);
- plan->e_argv[plan->e_ppos] = NULL;
- } else {
- for (cnt = 0; plan->e_argv[cnt]; ++cnt)
- if (plan->e_len[cnt])
- brace_subst(plan->e_orig[cnt],
- &plan->e_argv[cnt], file,
- plan->e_len[cnt]);
- }
-
-doexec: if ((plan->flags & F_NEEDOK) && !queryuser(plan->e_argv))
- return 0;
-
- /* make sure find output is interspersed correctly with subprocesses */
- fflush(stdout);
- fflush(stderr);
-
- switch (pid = fork()) {
- case -1:
- err(1, "fork");
- /* NOTREACHED */
- case 0:
- /* change dir back from where we started */
- if (!(plan->flags & F_EXECDIR) && fchdir(dotfd)) {
- warn("chdir");
- _exit(1);
- }
- execvp(plan->e_argv[0], plan->e_argv);
- warn("%s", plan->e_argv[0]);
- _exit(1);
- }
- if (plan->flags & F_EXECPLUS) {
- while (--plan->e_ppos >= plan->e_pbnum)
- free(plan->e_argv[plan->e_ppos]);
- plan->e_ppos = plan->e_pbnum;
- plan->e_psize = plan->e_pbsize;
- }
- pid = waitpid(pid, &status, 0);
- return (pid != -1 && WIFEXITED(status) && !WEXITSTATUS(status));
-}
-
-/*
- * c_exec, c_execdir, c_ok --
- * build three parallel arrays, one with pointers to the strings passed
- * on the command line, one with (possibly duplicated) pointers to the
- * argv array, and one with integer values that are lengths of the
- * strings, but also flags meaning that the string has to be massaged.
- */
-PLAN *
-c_exec(OPTION *option, char ***argvp)
-{
- PLAN *new; /* node returned */
- long argmax;
- int cnt, i;
- char **argv, **ap, **ep, *p;
-
- /* XXX - was in c_execdir, but seems unnecessary!?
- ftsoptions &= ~FTS_NOSTAT;
- */
- isoutput = 1;
-
- /* XXX - this is a change from the previous coding */
- new = palloc(option);
-
- for (ap = argv = *argvp;; ++ap) {
- if (!*ap)
- errx(1,
- "%s: no terminating \";\" or \"+\"", option->name);
- if (**ap == ';')
- break;
- if (**ap == '+' && ap != argv && strcmp(*(ap - 1), "{}") == 0) {
- new->flags |= F_EXECPLUS;
- break;
- }
- }
-
- if (ap == argv)
- errx(1, "%s: no command specified", option->name);
-
- cnt = ap - *argvp + 1;
- if (new->flags & F_EXECPLUS) {
- new->e_ppos = new->e_pbnum = cnt - 2;
- if ((argmax = sysconf(_SC_ARG_MAX)) == -1) {
- warn("sysconf(_SC_ARG_MAX)");
- argmax = _POSIX_ARG_MAX;
- }
- argmax -= 1024;
- for (ep = environ; *ep != NULL; ep++)
- argmax -= strlen(*ep) + 1 + sizeof(*ep);
- argmax -= 1 + sizeof(*ep);
- new->e_pnummax = argmax / 16;
- argmax -= sizeof(char *) * new->e_pnummax;
- if (argmax <= 0)
- errx(1, "no space for arguments");
- new->e_psizemax = argmax;
- new->e_pbsize = 0;
- cnt += new->e_pnummax + 1;
- new->e_next = lastexecplus;
- lastexecplus = new;
- }
- if ((new->e_argv = malloc(cnt * sizeof(char *))) == NULL)
- err(1, NULL);
- if ((new->e_orig = malloc(cnt * sizeof(char *))) == NULL)
- err(1, NULL);
- if ((new->e_len = malloc(cnt * sizeof(int))) == NULL)
- err(1, NULL);
-
- for (argv = *argvp, cnt = 0; argv < ap; ++argv, ++cnt) {
- new->e_orig[cnt] = *argv;
- if (new->flags & F_EXECPLUS)
- new->e_pbsize += strlen(*argv) + 1;
- for (p = *argv; *p; ++p)
- if (!(new->flags & F_EXECPLUS) && p[0] == '{' &&
- p[1] == '}') {
- if ((new->e_argv[cnt] =
- malloc(MAXPATHLEN)) == NULL)
- err(1, NULL);
- new->e_len[cnt] = MAXPATHLEN;
- break;
- }
- if (!*p) {
- new->e_argv[cnt] = *argv;
- new->e_len[cnt] = 0;
- }
- }
- if (new->flags & F_EXECPLUS) {
- new->e_psize = new->e_pbsize;
- cnt--;
- for (i = 0; i < new->e_pnummax; i++) {
- new->e_argv[cnt] = NULL;
- new->e_len[cnt] = 0;
- cnt++;
- }
- argv = ap;
- goto done;
- }
- new->e_argv[cnt] = new->e_orig[cnt] = NULL;
-
-done: *argvp = argv + 1;
- return new;
-}
-
-/* Finish any pending -exec ... {} + functions. */
-void
-finish_execplus()
-{
- PLAN *p;
-
- p = lastexecplus;
- while (p != NULL) {
- (p->execute)(p, NULL);
- p = p->e_next;
- }
-}
-
-int
-f_flags(PLAN *plan, FTSENT *entry)
-{
- u_long flags;
-
- flags = entry->fts_statp->st_flags;
- if (plan->flags & F_ATLEAST)
- return (flags | plan->fl_flags) == flags &&
- !(flags & plan->fl_notflags);
- else if (plan->flags & F_ANY)
- return (flags & plan->fl_flags) ||
- (flags | plan->fl_notflags) != flags;
- else
- return flags == plan->fl_flags &&
- !(plan->fl_flags & plan->fl_notflags);
-}
-
-PLAN *
-c_flags(OPTION *option, char ***argvp)
-{
- char *flags_str;
- PLAN *new;
- u_long flags, notflags;
-
- flags_str = nextarg(option, argvp);
- ftsoptions &= ~FTS_NOSTAT;
-
- new = palloc(option);
-
- if (*flags_str == '-') {
- new->flags |= F_ATLEAST;
- flags_str++;
- } else if (*flags_str == '+') {
- new->flags |= F_ANY;
- flags_str++;
- }
- if (strtofflags(&flags_str, &flags, &notflags) == 1)
- errx(1, "%s: %s: illegal flags string", option->name, flags_str);
-
- new->fl_flags = flags;
- new->fl_notflags = notflags;
- return new;
-}
-
-/*
- * -follow functions --
- *
- * Always true, causes symbolic links to be followed on a global
- * basis.
- */
-PLAN *
-c_follow(OPTION *option, char ***argvp __unused)
-{
- ftsoptions &= ~FTS_PHYSICAL;
- ftsoptions |= FTS_LOGICAL;
-
- return palloc(option);
-}
-
-/*
- * -fstype functions --
- *
- * True if the file is of a certain type.
- */
-int
-f_fstype(PLAN *plan, FTSENT *entry)
-{
- static dev_t curdev; /* need a guaranteed illegal dev value */
- static int first = 1;
- struct statfs sb;
- static int val_type, val_flags;
- char *p, save[2] = {0,0};
-
- if ((plan->flags & F_MTMASK) == F_MTUNKNOWN)
- return 0;
-
- /* Only check when we cross mount point. */
- if (first || curdev != entry->fts_statp->st_dev) {
- curdev = entry->fts_statp->st_dev;
-
- /*
- * Statfs follows symlinks; find wants the link's filesystem,
- * not where it points.
- */
- if (entry->fts_info == FTS_SL ||
- entry->fts_info == FTS_SLNONE) {
- if ((p = strrchr(entry->fts_accpath, '/')) != NULL)
- ++p;
- else
- p = entry->fts_accpath;
- save[0] = p[0];
- p[0] = '.';
- save[1] = p[1];
- p[1] = '\0';
- } else
- p = NULL;
-
- if (statfs(entry->fts_accpath, &sb))
- err(1, "%s", entry->fts_accpath);
-
- if (p) {
- p[0] = save[0];
- p[1] = save[1];
- }
-
- first = 0;
-
- /*
- * Further tests may need both of these values, so
- * always copy both of them.
- */
- val_flags = sb.f_flags;
- val_type = sb.f_type;
- }
- switch (plan->flags & F_MTMASK) {
- case F_MTFLAG:
- return val_flags & plan->mt_data;
- case F_MTTYPE:
- return val_type == plan->mt_data;
- default:
- abort();
- }
-}
-
-PLAN *
-c_fstype(OPTION *option, char ***argvp)
-{
- char *fsname;
- PLAN *new;
- struct xvfsconf vfc;
-
- fsname = nextarg(option, argvp);
- ftsoptions &= ~FTS_NOSTAT;
-
- new = palloc(option);
-
- /*
- * Check first for a filesystem name.
- */
- if (getvfsbyname(fsname, &vfc) == 0) {
- new->flags |= F_MTTYPE;
- new->mt_data = vfc.vfc_typenum;
- return new;
- }
-
- switch (*fsname) {
- case 'l':
- if (!strcmp(fsname, "local")) {
- new->flags |= F_MTFLAG;
- new->mt_data = MNT_LOCAL;
- return new;
- }
- break;
- case 'r':
- if (!strcmp(fsname, "rdonly")) {
- new->flags |= F_MTFLAG;
- new->mt_data = MNT_RDONLY;
- return new;
- }
- break;
- }
-
- /*
- * We need to make filesystem checks for filesystems
- * that exists but aren't in the kernel work.
- */
- fprintf(stderr, "Warning: Unknown filesystem type %s\n", fsname);
- new->flags |= F_MTUNKNOWN;
- return new;
-}
-
-/*
- * -group gname functions --
- *
- * True if the file belongs to the group gname. If gname is numeric and
- * an equivalent of the getgrnam() function does not return a valid group
- * name, gname is taken as a group ID.
- */
-int
-f_group(PLAN *plan, FTSENT *entry)
-{
- COMPARE(entry->fts_statp->st_gid, plan->g_data);
-}
-
-PLAN *
-c_group(OPTION *option, char ***argvp)
-{
- char *gname;
- PLAN *new;
- struct group *g;
- gid_t gid;
-
- gname = nextarg(option, argvp);
- ftsoptions &= ~FTS_NOSTAT;
-
- new = palloc(option);
- g = getgrnam(gname);
- if (g == NULL) {
- char* cp = gname;
- if (gname[0] == '-' || gname[0] == '+')
- gname++;
- gid = atoi(gname);
- if (gid == 0 && gname[0] != '0')
- errx(1, "%s: %s: no such group", option->name, gname);
- gid = find_parsenum(new, option->name, cp, NULL);
- } else
- gid = g->gr_gid;
-
- new->g_data = gid;
- return new;
-}
-
-/*
- * -inum n functions --
- *
- * True if the file has inode # n.
- */
-int
-f_inum(PLAN *plan, FTSENT *entry)
-{
- COMPARE(entry->fts_statp->st_ino, plan->i_data);
-}
-
-PLAN *
-c_inum(OPTION *option, char ***argvp)
-{
- char *inum_str;
- PLAN *new;
-
- inum_str = nextarg(option, argvp);
- ftsoptions &= ~FTS_NOSTAT;
-
- new = palloc(option);
- new->i_data = find_parsenum(new, option->name, inum_str, NULL);
- return new;
-}
-
-/*
- * -samefile FN
- *
- * True if the file has the same inode (eg hard link) FN
- */
-
-/* f_samefile is just f_inum */
-PLAN *
-c_samefile(OPTION *option, char ***argvp)
-{
- char *fn;
- PLAN *new;
- struct stat sb;
-
- fn = nextarg(option, argvp);
- ftsoptions &= ~FTS_NOSTAT;
-
- new = palloc(option);
- if (stat(fn, &sb))
- err(1, "%s", fn);
- new->i_data = sb.st_ino;
- return new;
-}
-
-/*
- * -links n functions --
- *
- * True if the file has n links.
- */
-int
-f_links(PLAN *plan, FTSENT *entry)
-{
- COMPARE(entry->fts_statp->st_nlink, plan->l_data);
-}
-
-PLAN *
-c_links(OPTION *option, char ***argvp)
-{
- char *nlinks;
- PLAN *new;
-
- nlinks = nextarg(option, argvp);
- ftsoptions &= ~FTS_NOSTAT;
-
- new = palloc(option);
- new->l_data = (nlink_t)find_parsenum(new, option->name, nlinks, NULL);
- return new;
-}
-
-/*
- * -ls functions --
- *
- * Always true - prints the current entry to stdout in "ls" format.
- */
-int
-f_ls(PLAN *plan __unused, FTSENT *entry)
-{
- printlong(entry->fts_path, entry->fts_accpath, entry->fts_statp);
- return 1;
-}
-
-PLAN *
-c_ls(OPTION *option, char ***argvp __unused)
-{
- ftsoptions &= ~FTS_NOSTAT;
- isoutput = 1;
-
- return palloc(option);
-}
-
-/*
- * -name functions --
- *
- * True if the basename of the filename being examined
- * matches pattern using Pattern Matching Notation S3.14
- */
-int
-f_name(PLAN *plan, FTSENT *entry)
-{
- char fn[PATH_MAX];
- const char *name;
-
- if (plan->flags & F_LINK) {
- name = fn;
- if (readlink(entry->fts_path, fn, sizeof(fn)) == -1)
- return 0;
- } else
- name = entry->fts_name;
- return !fnmatch(plan->c_data, name,
- plan->flags & F_IGNCASE ? FNM_CASEFOLD : 0);
-}
-
-PLAN *
-c_name(OPTION *option, char ***argvp)
-{
- char *pattern;
- PLAN *new;
-
- pattern = nextarg(option, argvp);
- new = palloc(option);
- new->c_data = pattern;
- return new;
-}
-
-/*
- * -newer file functions --
- *
- * True if the current file has been modified more recently
- * then the modification time of the file named by the pathname
- * file.
- */
-int
-f_newer(PLAN *plan, FTSENT *entry)
-{
- if (plan->flags & F_TIME_C)
- return entry->fts_statp->st_ctime > plan->t_data;
- else if (plan->flags & F_TIME_A)
- return entry->fts_statp->st_atime > plan->t_data;
- else if (plan->flags & F_TIME_B)
- return entry->fts_statp->st_birthtime > plan->t_data;
- else
- return entry->fts_statp->st_mtime > plan->t_data;
-}
-
-PLAN *
-c_newer(OPTION *option, char ***argvp)
-{
- char *fn_or_tspec;
- PLAN *new;
- struct stat sb;
-
- fn_or_tspec = nextarg(option, argvp);
- ftsoptions &= ~FTS_NOSTAT;
-
- new = palloc(option);
- /* compare against what */
- if (option->flags & F_TIME2_T) {
- new->t_data = get_date(fn_or_tspec, (struct timeb *) 0);
- if (new->t_data == (time_t) -1)
- errx(1, "Can't parse date/time: %s", fn_or_tspec);
- } else {
- if (stat(fn_or_tspec, &sb))
- err(1, "%s", fn_or_tspec);
- if (option->flags & F_TIME2_C)
- new->t_data = sb.st_ctime;
- else if (option->flags & F_TIME2_A)
- new->t_data = sb.st_atime;
- else
- new->t_data = sb.st_mtime;
- }
- return new;
-}
-
-/*
- * -nogroup functions --
- *
- * True if file belongs to a user ID for which the equivalent
- * of the getgrnam() 9.2.1 [POSIX.1] function returns NULL.
- */
-int
-f_nogroup(PLAN *plan __unused, FTSENT *entry)
-{
- return group_from_gid(entry->fts_statp->st_gid, 1) == NULL;
-}
-
-PLAN *
-c_nogroup(OPTION *option, char ***argvp __unused)
-{
- ftsoptions &= ~FTS_NOSTAT;
-
- return palloc(option);
-}
-
-/*
- * -nouser functions --
- *
- * True if file belongs to a user ID for which the equivalent
- * of the getpwuid() 9.2.2 [POSIX.1] function returns NULL.
- */
-int
-f_nouser(PLAN *plan __unused, FTSENT *entry)
-{
- return user_from_uid(entry->fts_statp->st_uid, 1) == NULL;
-}
-
-PLAN *
-c_nouser(OPTION *option, char ***argvp __unused)
-{
- ftsoptions &= ~FTS_NOSTAT;
-
- return palloc(option);
-}
-
-/*
- * -path functions --
- *
- * True if the path of the filename being examined
- * matches pattern using Pattern Matching Notation S3.14
- */
-int
-f_path(PLAN *plan, FTSENT *entry)
-{
- return !fnmatch(plan->c_data, entry->fts_path,
- plan->flags & F_IGNCASE ? FNM_CASEFOLD : 0);
-}
-
-/* c_path is the same as c_name */
-
-/*
- * -perm functions --
- *
- * The mode argument is used to represent file mode bits. If it starts
- * with a leading digit, it's treated as an octal mode, otherwise as a
- * symbolic mode.
- */
-int
-f_perm(PLAN *plan, FTSENT *entry)
-{
- mode_t mode;
-
- mode = entry->fts_statp->st_mode &
- (S_ISUID|S_ISGID|S_ISTXT|S_IRWXU|S_IRWXG|S_IRWXO);
- if (plan->flags & F_ATLEAST)
- return (plan->m_data | mode) == mode;
- else if (plan->flags & F_ANY)
- return (mode & plan->m_data);
- else
- return mode == plan->m_data;
- /* NOTREACHED */
-}
-
-PLAN *
-c_perm(OPTION *option, char ***argvp)
-{
- char *perm;
- PLAN *new;
- mode_t *set;
-
- perm = nextarg(option, argvp);
- ftsoptions &= ~FTS_NOSTAT;
-
- new = palloc(option);
-
- if (*perm == '-') {
- new->flags |= F_ATLEAST;
- ++perm;
- } else if (*perm == '+') {
- new->flags |= F_ANY;
- ++perm;
- }
-
- if ((set = setmode(perm)) == NULL)
- errx(1, "%s: %s: illegal mode string", option->name, perm);
-
- new->m_data = getmode(set, 0);
- free(set);
- return new;
-}
-
-/*
- * -print functions --
- *
- * Always true, causes the current pathname to be written to
- * standard output.
- */
-int
-f_print(PLAN *plan __unused, FTSENT *entry)
-{
- (void)puts(entry->fts_path);
- return 1;
-}
-
-PLAN *
-c_print(OPTION *option, char ***argvp __unused)
-{
- isoutput = 1;
-
- return palloc(option);
-}
-
-/*
- * -print0 functions --
- *
- * Always true, causes the current pathname to be written to
- * standard output followed by a NUL character
- */
-int
-f_print0(PLAN *plan __unused, FTSENT *entry)
-{
- fputs(entry->fts_path, stdout);
- fputc('\0', stdout);
- return 1;
-}
-
-/* c_print0 is the same as c_print */
-
-/*
- * -prune functions --
- *
- * Prune a portion of the hierarchy.
- */
-int
-f_prune(PLAN *plan __unused, FTSENT *entry)
-{
- if (fts_set(tree, entry, FTS_SKIP))
- err(1, "%s", entry->fts_path);
- return 1;
-}
-
-/* c_prune == c_simple */
-
-/*
- * -regex functions --
- *
- * True if the whole path of the file matches pattern using
- * regular expression.
- */
-int
-f_regex(PLAN *plan, FTSENT *entry)
-{
- char *str;
- int len;
- regex_t *pre;
- regmatch_t pmatch;
- int errcode;
- char errbuf[LINE_MAX];
- int matched;
-
- pre = plan->re_data;
- str = entry->fts_path;
- len = strlen(str);
- matched = 0;
-
- pmatch.rm_so = 0;
- pmatch.rm_eo = len;
-
- errcode = regexec(pre, str, 1, &pmatch, REG_STARTEND);
-
- if (errcode != 0 && errcode != REG_NOMATCH) {
- regerror(errcode, pre, errbuf, sizeof errbuf);
- errx(1, "%s: %s",
- plan->flags & F_IGNCASE ? "-iregex" : "-regex", errbuf);
- }
-
- if (errcode == 0 && pmatch.rm_so == 0 && pmatch.rm_eo == len)
- matched = 1;
-
- return matched;
-}
-
-PLAN *
-c_regex(OPTION *option, char ***argvp)
-{
- PLAN *new;
- char *pattern;
- regex_t *pre;
- int errcode;
- char errbuf[LINE_MAX];
-
- if ((pre = malloc(sizeof(regex_t))) == NULL)
- err(1, NULL);
-
- pattern = nextarg(option, argvp);
-
- if ((errcode = regcomp(pre, pattern,
- regexp_flags | (option->flags & F_IGNCASE ? REG_ICASE : 0))) != 0) {
- regerror(errcode, pre, errbuf, sizeof errbuf);
- errx(1, "%s: %s: %s",
- option->flags & F_IGNCASE ? "-iregex" : "-regex",
- pattern, errbuf);
- }
-
- new = palloc(option);
- new->re_data = pre;
-
- return new;
-}
-
-/* c_simple covers c_prune, c_openparen, c_closeparen, c_not, c_or, c_true, c_false */
-
-PLAN *
-c_simple(OPTION *option, char ***argvp __unused)
-{
- return palloc(option);
-}
-
-/*
- * -size n[c] functions --
- *
- * True if the file size in bytes, divided by an implementation defined
- * value and rounded up to the next integer, is n. If n is followed by
- * one of c k M G T P, the size is in bytes, kilobytes,
- * megabytes, gigabytes, terabytes or petabytes respectively.
- */
-#define FIND_SIZE 512
-static int divsize = 1;
-
-int
-f_size(PLAN *plan, FTSENT *entry)
-{
- off_t size;
-
- size = divsize ? (entry->fts_statp->st_size + FIND_SIZE - 1) /
- FIND_SIZE : entry->fts_statp->st_size;
- COMPARE(size, plan->o_data);
-}
-
-PLAN *
-c_size(OPTION *option, char ***argvp)
-{
- char *size_str;
- PLAN *new;
- char endch;
- off_t scale;
-
- size_str = nextarg(option, argvp);
- ftsoptions &= ~FTS_NOSTAT;
-
- new = palloc(option);
- endch = 'c';
- new->o_data = find_parsenum(new, option->name, size_str, &endch);
- if (endch != '\0') {
- divsize = 0;
-
- switch (endch) {
- case 'c': /* characters */
- scale = 0x1LL;
- break;
- case 'k': /* kilobytes 1<<10 */
- scale = 0x400LL;
- break;
- case 'M': /* megabytes 1<<20 */
- scale = 0x100000LL;
- break;
- case 'G': /* gigabytes 1<<30 */
- scale = 0x40000000LL;
- break;
- case 'T': /* terabytes 1<<40 */
- scale = 0x1000000000LL;
- break;
- case 'P': /* petabytes 1<<50 */
- scale = 0x4000000000000LL;
- break;
- default:
- errx(1, "%s: %s: illegal trailing character",
- option->name, size_str);
- break;
- }
- if (new->o_data > QUAD_MAX / scale)
- errx(1, "%s: %s: value too large",
- option->name, size_str);
- new->o_data *= scale;
- }
- return new;
-}
-
-/*
- * -type c functions --
- *
- * True if the type of the file is c, where c is b, c, d, p, f or w
- * for block special file, character special file, directory, FIFO,
- * regular file or whiteout respectively.
- */
-int
-f_type(PLAN *plan, FTSENT *entry)
-{
- return (entry->fts_statp->st_mode & S_IFMT) == plan->m_data;
-}
-
-PLAN *
-c_type(OPTION *option, char ***argvp)
-{
- char *typestring;
- PLAN *new;
- mode_t mask;
-
- typestring = nextarg(option, argvp);
- ftsoptions &= ~FTS_NOSTAT;
-
- switch (typestring[0]) {
- case 'b':
- mask = S_IFBLK;
- break;
- case 'c':
- mask = S_IFCHR;
- break;
- case 'd':
- mask = S_IFDIR;
- break;
- case 'f':
- mask = S_IFREG;
- break;
- case 'l':
- mask = S_IFLNK;
- break;
- case 'p':
- mask = S_IFIFO;
- break;
- case 's':
- mask = S_IFSOCK;
- break;
-#ifdef FTS_WHITEOUT
- case 'w':
- mask = S_IFWHT;
- ftsoptions |= FTS_WHITEOUT;
- break;
-#endif /* FTS_WHITEOUT */
- default:
- errx(1, "%s: %s: unknown type", option->name, typestring);
- }
-
- new = palloc(option);
- new->m_data = mask;
- return new;
-}
-
-/*
- * -user uname functions --
- *
- * True if the file belongs to the user uname. If uname is numeric and
- * an equivalent of the getpwnam() S9.2.2 [POSIX.1] function does not
- * return a valid user name, uname is taken as a user ID.
- */
-int
-f_user(PLAN *plan, FTSENT *entry)
-{
- COMPARE(entry->fts_statp->st_uid, plan->u_data);
-}
-
-PLAN *
-c_user(OPTION *option, char ***argvp)
-{
- char *username;
- PLAN *new;
- struct passwd *p;
- uid_t uid;
-
- username = nextarg(option, argvp);
- ftsoptions &= ~FTS_NOSTAT;
-
- new = palloc(option);
- p = getpwnam(username);
- if (p == NULL) {
- char* cp = username;
- if( username[0] == '-' || username[0] == '+' )
- username++;
- uid = atoi(username);
- if (uid == 0 && username[0] != '0')
- errx(1, "%s: %s: no such user", option->name, username);
- uid = find_parsenum(new, option->name, cp, NULL);
- } else
- uid = p->pw_uid;
-
- new->u_data = uid;
- return new;
-}
-
-/*
- * -xdev functions --
- *
- * Always true, causes find not to descend past directories that have a
- * different device ID (st_dev, see stat() S5.6.2 [POSIX.1])
- */
-PLAN *
-c_xdev(OPTION *option, char ***argvp __unused)
-{
- ftsoptions |= FTS_XDEV;
-
- return palloc(option);
-}
-
-/*
- * ( expression ) functions --
- *
- * True if expression is true.
- */
-int
-f_expr(PLAN *plan, FTSENT *entry)
-{
- PLAN *p;
- int state = 0;
-
- for (p = plan->p_data[0];
- p && (state = (p->execute)(p, entry)); p = p->next);
- return state;
-}
-
-/*
- * f_openparen and f_closeparen nodes are temporary place markers. They are
- * eliminated during phase 2 of find_formplan() --- the '(' node is converted
- * to a f_expr node containing the expression and the ')' node is discarded.
- * The functions themselves are only used as constants.
- */
-
-int
-f_openparen(PLAN *plan __unused, FTSENT *entry __unused)
-{
- abort();
-}
-
-int
-f_closeparen(PLAN *plan __unused, FTSENT *entry __unused)
-{
- abort();
-}
-
-/* c_openparen == c_simple */
-/* c_closeparen == c_simple */
-
-/*
- * AND operator. Since AND is implicit, no node is allocated.
- */
-PLAN *
-c_and(OPTION *option __unused, char ***argvp __unused)
-{
- return NULL;
-}
-
-/*
- * ! expression functions --
- *
- * Negation of a primary; the unary NOT operator.
- */
-int
-f_not(PLAN *plan, FTSENT *entry)
-{
- PLAN *p;
- int state = 0;
-
- for (p = plan->p_data[0];
- p && (state = (p->execute)(p, entry)); p = p->next);
- return !state;
-}
-
-/* c_not == c_simple */
-
-/*
- * expression -o expression functions --
- *
- * Alternation of primaries; the OR operator. The second expression is
- * not evaluated if the first expression is true.
- */
-int
-f_or(PLAN *plan, FTSENT *entry)
-{
- PLAN *p;
- int state = 0;
-
- for (p = plan->p_data[0];
- p && (state = (p->execute)(p, entry)); p = p->next);
-
- if (state)
- return 1;
-
- for (p = plan->p_data[1];
- p && (state = (p->execute)(p, entry)); p = p->next);
- return state;
-}
-
-/* c_or == c_simple */
-
-/*
- * -false
- *
- * Always false.
- */
-int
-f_false(PLAN *plan __unused, FTSENT *entry __unused)
-{
- return 0;
-}
-
-/* c_false == c_simple */
-
-/*
- * -quit
- *
- * Exits the program
- */
-int
-f_quit(PLAN *plan __unused, FTSENT *entry __unused)
-{
- exit(0);
-}
-
-/* c_quit == c_simple */
diff --git a/usr.bin/find/getdate.y b/usr.bin/find/getdate.y
deleted file mode 100644
index de7750c..0000000
--- a/usr.bin/find/getdate.y
+++ /dev/null
@@ -1,970 +0,0 @@
-%{
-/*
-** Originally written by Steven M. Bellovin <smb@research.att.com> while
-** at the University of North Carolina at Chapel Hill. Later tweaked by
-** a couple of people on Usenet. Completely overhauled by Rich $alz
-** <rsalz@bbn.com> and Jim Berets <jberets@bbn.com> in August, 1990;
-**
-** This grammar has 10 shift/reduce conflicts.
-**
-** This code is in the public domain and has no copyright.
-*/
-/* SUPPRESS 287 on yaccpar_sccsid *//* Unused static variable */
-/* SUPPRESS 288 on yyerrlab *//* Label unused */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdio.h>
-#include <ctype.h>
-
-/* The code at the top of get_date which figures out the offset of the
- current time zone checks various CPP symbols to see if special
- tricks are need, but defaults to using the gettimeofday system call.
- Include <sys/time.h> if that will be used. */
-
-#if defined(vms)
-# include <types.h>
-#else /* defined(vms) */
-# include <sys/types.h>
-# include <sys/time.h>
-# include <sys/timeb.h>
-#endif /* !defined(vms) */
-
-#if defined (__STDC__) || defined (USG)
-#include <string.h>
-#endif
-
-/* Some old versions of bison generate parsers that use bcopy.
- That loses on systems that don't provide the function, so we have
- to redefine it here. */
-#if !defined (HAVE_BCOPY) && defined (HAVE_MEMCPY) && !defined (bcopy)
-#define bcopy(from, to, len) memcpy ((to), (from), (len))
-#endif
-
-#if defined (__STDC__)
-#include <stdlib.h>
-#endif
-
-/* NOTES on rebuilding getdate.c (particularly for inclusion in CVS
- releases):
-
- We don't want to mess with all the portability hassles of alloca.
- In particular, most (all?) versions of bison will use alloca in
- their parser. If bison works on your system (e.g. it should work
- with gcc), then go ahead and use it, but the more general solution
- is to use byacc instead of bison, which should generate a portable
- parser. I played with adding "#define alloca dont_use_alloca", to
- give an error if the parser generator uses alloca (and thus detect
- unportable getdate.c's), but that seems to cause as many problems
- as it solves. */
-
-#include <time.h>
-
-#define yyparse getdate_yyparse
-#define yylex getdate_yylex
-#define yyerror getdate_yyerror
-
-static int yyparse(void);
-static int yylex(void);
-static int yyerror(const char *);
-
-time_t get_date(char *, struct timeb *);
-
-#define EPOCH 1970
-#define HOUR(x) ((time_t)(x) * 60)
-#define SECSPERDAY (24L * 60L * 60L)
-
-
-/*
-** An entry in the lexical lookup table.
-*/
-typedef struct _TABLE {
- const char *name;
- int type;
- time_t value;
-} TABLE;
-
-
-/*
-** Daylight-savings mode: on, off, or not yet known.
-*/
-typedef enum _DSTMODE {
- DSTon, DSToff, DSTmaybe
-} DSTMODE;
-
-/*
-** Meridian: am, pm, or 24-hour style.
-*/
-typedef enum _MERIDIAN {
- MERam, MERpm, MER24
-} MERIDIAN;
-
-
-/*
-** Global variables. We could get rid of most of these by using a good
-** union as the yacc stack. (This routine was originally written before
-** yacc had the %union construct.) Maybe someday; right now we only use
-** the %union very rarely.
-*/
-static char *yyInput;
-static DSTMODE yyDSTmode;
-static time_t yyDayOrdinal;
-static time_t yyDayNumber;
-static int yyHaveDate;
-static int yyHaveDay;
-static int yyHaveRel;
-static int yyHaveTime;
-static int yyHaveZone;
-static time_t yyTimezone;
-static time_t yyDay;
-static time_t yyHour;
-static time_t yyMinutes;
-static time_t yyMonth;
-static time_t yySeconds;
-static time_t yyYear;
-static MERIDIAN yyMeridian;
-static time_t yyRelMonth;
-static time_t yyRelSeconds;
-
-%}
-
-%union {
- time_t Number;
- enum _MERIDIAN Meridian;
-}
-
-%token tAGO tDAY tDAYZONE tID tMERIDIAN tMINUTE_UNIT tMONTH tMONTH_UNIT
-%token tSEC_UNIT tSNUMBER tUNUMBER tZONE tDST
-
-%type <Number> tDAY tDAYZONE tMINUTE_UNIT tMONTH tMONTH_UNIT
-%type <Number> tSEC_UNIT tSNUMBER tUNUMBER tZONE
-%type <Meridian> tMERIDIAN o_merid
-
-%%
-
-spec : /* NULL */
- | spec item
- ;
-
-item : time {
- yyHaveTime++;
- }
- | zone {
- yyHaveZone++;
- }
- | date {
- yyHaveDate++;
- }
- | day {
- yyHaveDay++;
- }
- | rel {
- yyHaveRel++;
- }
- | number
- ;
-
-time : tUNUMBER tMERIDIAN {
- yyHour = $1;
- yyMinutes = 0;
- yySeconds = 0;
- yyMeridian = $2;
- }
- | tUNUMBER ':' tUNUMBER o_merid {
- yyHour = $1;
- yyMinutes = $3;
- yySeconds = 0;
- yyMeridian = $4;
- }
- | tUNUMBER ':' tUNUMBER tSNUMBER {
- yyHour = $1;
- yyMinutes = $3;
- yyMeridian = MER24;
- yyDSTmode = DSToff;
- yyTimezone = - ($4 % 100 + ($4 / 100) * 60);
- }
- | tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid {
- yyHour = $1;
- yyMinutes = $3;
- yySeconds = $5;
- yyMeridian = $6;
- }
- | tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER {
- yyHour = $1;
- yyMinutes = $3;
- yySeconds = $5;
- yyMeridian = MER24;
- yyDSTmode = DSToff;
- yyTimezone = - ($6 % 100 + ($6 / 100) * 60);
- }
- ;
-
-zone : tZONE {
- yyTimezone = $1;
- yyDSTmode = DSToff;
- }
- | tDAYZONE {
- yyTimezone = $1;
- yyDSTmode = DSTon;
- }
- |
- tZONE tDST {
- yyTimezone = $1;
- yyDSTmode = DSTon;
- }
- ;
-
-day : tDAY {
- yyDayOrdinal = 1;
- yyDayNumber = $1;
- }
- | tDAY ',' {
- yyDayOrdinal = 1;
- yyDayNumber = $1;
- }
- | tUNUMBER tDAY {
- yyDayOrdinal = $1;
- yyDayNumber = $2;
- }
- ;
-
-date : tUNUMBER '/' tUNUMBER {
- yyMonth = $1;
- yyDay = $3;
- }
- | tUNUMBER '/' tUNUMBER '/' tUNUMBER {
- if ($1 >= 100) {
- yyYear = $1;
- yyMonth = $3;
- yyDay = $5;
- } else {
- yyMonth = $1;
- yyDay = $3;
- yyYear = $5;
- }
- }
- | tUNUMBER tSNUMBER tSNUMBER {
- /* ISO 8601 format. yyyy-mm-dd. */
- yyYear = $1;
- yyMonth = -$2;
- yyDay = -$3;
- }
- | tUNUMBER tMONTH tSNUMBER {
- /* e.g. 17-JUN-1992. */
- yyDay = $1;
- yyMonth = $2;
- yyYear = -$3;
- }
- | tMONTH tUNUMBER {
- yyMonth = $1;
- yyDay = $2;
- }
- | tMONTH tUNUMBER ',' tUNUMBER {
- yyMonth = $1;
- yyDay = $2;
- yyYear = $4;
- }
- | tUNUMBER tMONTH {
- yyMonth = $2;
- yyDay = $1;
- }
- | tUNUMBER tMONTH tUNUMBER {
- yyMonth = $2;
- yyDay = $1;
- yyYear = $3;
- }
- ;
-
-rel : relunit tAGO {
- yyRelSeconds = -yyRelSeconds;
- yyRelMonth = -yyRelMonth;
- }
- | relunit
- ;
-
-relunit : tUNUMBER tMINUTE_UNIT {
- yyRelSeconds += $1 * $2 * 60L;
- }
- | tSNUMBER tMINUTE_UNIT {
- yyRelSeconds += $1 * $2 * 60L;
- }
- | tMINUTE_UNIT {
- yyRelSeconds += $1 * 60L;
- }
- | tSNUMBER tSEC_UNIT {
- yyRelSeconds += $1;
- }
- | tUNUMBER tSEC_UNIT {
- yyRelSeconds += $1;
- }
- | tSEC_UNIT {
- yyRelSeconds++;
- }
- | tSNUMBER tMONTH_UNIT {
- yyRelMonth += $1 * $2;
- }
- | tUNUMBER tMONTH_UNIT {
- yyRelMonth += $1 * $2;
- }
- | tMONTH_UNIT {
- yyRelMonth += $1;
- }
- ;
-
-number : tUNUMBER {
- if (yyHaveTime && yyHaveDate && !yyHaveRel)
- yyYear = $1;
- else {
- if($1>10000) {
- yyHaveDate++;
- yyDay= ($1)%100;
- yyMonth= ($1/100)%100;
- yyYear = $1/10000;
- }
- else {
- yyHaveTime++;
- if ($1 < 100) {
- yyHour = $1;
- yyMinutes = 0;
- }
- else {
- yyHour = $1 / 100;
- yyMinutes = $1 % 100;
- }
- yySeconds = 0;
- yyMeridian = MER24;
- }
- }
- }
- ;
-
-o_merid : /* NULL */ {
- $$ = MER24;
- }
- | tMERIDIAN {
- $$ = $1;
- }
- ;
-
-%%
-
-/* Month and day table. */
-static TABLE const MonthDayTable[] = {
- { "january", tMONTH, 1 },
- { "february", tMONTH, 2 },
- { "march", tMONTH, 3 },
- { "april", tMONTH, 4 },
- { "may", tMONTH, 5 },
- { "june", tMONTH, 6 },
- { "july", tMONTH, 7 },
- { "august", tMONTH, 8 },
- { "september", tMONTH, 9 },
- { "sept", tMONTH, 9 },
- { "october", tMONTH, 10 },
- { "november", tMONTH, 11 },
- { "december", tMONTH, 12 },
- { "sunday", tDAY, 0 },
- { "monday", tDAY, 1 },
- { "tuesday", tDAY, 2 },
- { "tues", tDAY, 2 },
- { "wednesday", tDAY, 3 },
- { "wednes", tDAY, 3 },
- { "thursday", tDAY, 4 },
- { "thur", tDAY, 4 },
- { "thurs", tDAY, 4 },
- { "friday", tDAY, 5 },
- { "saturday", tDAY, 6 },
- { NULL, 0, 0 }
-};
-
-/* Time units table. */
-static TABLE const UnitsTable[] = {
- { "year", tMONTH_UNIT, 12 },
- { "month", tMONTH_UNIT, 1 },
- { "fortnight", tMINUTE_UNIT, 14 * 24 * 60 },
- { "week", tMINUTE_UNIT, 7 * 24 * 60 },
- { "day", tMINUTE_UNIT, 1 * 24 * 60 },
- { "hour", tMINUTE_UNIT, 60 },
- { "minute", tMINUTE_UNIT, 1 },
- { "min", tMINUTE_UNIT, 1 },
- { "second", tSEC_UNIT, 1 },
- { "sec", tSEC_UNIT, 1 },
- { NULL, 0, 0 }
-};
-
-/* Assorted relative-time words. */
-static TABLE const OtherTable[] = {
- { "tomorrow", tMINUTE_UNIT, 1 * 24 * 60 },
- { "yesterday", tMINUTE_UNIT, -1 * 24 * 60 },
- { "today", tMINUTE_UNIT, 0 },
- { "now", tMINUTE_UNIT, 0 },
- { "last", tUNUMBER, -1 },
- { "this", tMINUTE_UNIT, 0 },
- { "next", tUNUMBER, 2 },
- { "first", tUNUMBER, 1 },
-/* { "second", tUNUMBER, 2 }, */
- { "third", tUNUMBER, 3 },
- { "fourth", tUNUMBER, 4 },
- { "fifth", tUNUMBER, 5 },
- { "sixth", tUNUMBER, 6 },
- { "seventh", tUNUMBER, 7 },
- { "eighth", tUNUMBER, 8 },
- { "ninth", tUNUMBER, 9 },
- { "tenth", tUNUMBER, 10 },
- { "eleventh", tUNUMBER, 11 },
- { "twelfth", tUNUMBER, 12 },
- { "ago", tAGO, 1 },
- { NULL, 0, 0 }
-};
-
-/* The timezone table. */
-/* Some of these are commented out because a time_t can't store a float. */
-static TABLE const TimezoneTable[] = {
- { "gmt", tZONE, HOUR( 0) }, /* Greenwich Mean */
- { "ut", tZONE, HOUR( 0) }, /* Universal (Coordinated) */
- { "utc", tZONE, HOUR( 0) },
- { "wet", tZONE, HOUR( 0) }, /* Western European */
- { "bst", tDAYZONE, HOUR( 0) }, /* British Summer */
- { "wat", tZONE, HOUR( 1) }, /* West Africa */
- { "at", tZONE, HOUR( 2) }, /* Azores */
-#if 0
- /* For completeness. BST is also British Summer, and GST is
- * also Guam Standard. */
- { "bst", tZONE, HOUR( 3) }, /* Brazil Standard */
- { "gst", tZONE, HOUR( 3) }, /* Greenland Standard */
-#endif
-#if 0
- { "nft", tZONE, HOUR(3.5) }, /* Newfoundland */
- { "nst", tZONE, HOUR(3.5) }, /* Newfoundland Standard */
- { "ndt", tDAYZONE, HOUR(3.5) }, /* Newfoundland Daylight */
-#endif
- { "ast", tZONE, HOUR( 4) }, /* Atlantic Standard */
- { "adt", tDAYZONE, HOUR( 4) }, /* Atlantic Daylight */
- { "est", tZONE, HOUR( 5) }, /* Eastern Standard */
- { "edt", tDAYZONE, HOUR( 5) }, /* Eastern Daylight */
- { "cst", tZONE, HOUR( 6) }, /* Central Standard */
- { "cdt", tDAYZONE, HOUR( 6) }, /* Central Daylight */
- { "mst", tZONE, HOUR( 7) }, /* Mountain Standard */
- { "mdt", tDAYZONE, HOUR( 7) }, /* Mountain Daylight */
- { "pst", tZONE, HOUR( 8) }, /* Pacific Standard */
- { "pdt", tDAYZONE, HOUR( 8) }, /* Pacific Daylight */
- { "yst", tZONE, HOUR( 9) }, /* Yukon Standard */
- { "ydt", tDAYZONE, HOUR( 9) }, /* Yukon Daylight */
- { "hst", tZONE, HOUR(10) }, /* Hawaii Standard */
- { "hdt", tDAYZONE, HOUR(10) }, /* Hawaii Daylight */
- { "cat", tZONE, HOUR(10) }, /* Central Alaska */
- { "ahst", tZONE, HOUR(10) }, /* Alaska-Hawaii Standard */
- { "nt", tZONE, HOUR(11) }, /* Nome */
- { "idlw", tZONE, HOUR(12) }, /* International Date Line West */
- { "cet", tZONE, -HOUR(1) }, /* Central European */
- { "met", tZONE, -HOUR(1) }, /* Middle European */
- { "mewt", tZONE, -HOUR(1) }, /* Middle European Winter */
- { "mest", tDAYZONE, -HOUR(1) }, /* Middle European Summer */
- { "swt", tZONE, -HOUR(1) }, /* Swedish Winter */
- { "sst", tDAYZONE, -HOUR(1) }, /* Swedish Summer */
- { "fwt", tZONE, -HOUR(1) }, /* French Winter */
- { "fst", tDAYZONE, -HOUR(1) }, /* French Summer */
- { "eet", tZONE, -HOUR(2) }, /* Eastern Europe, USSR Zone 1 */
- { "bt", tZONE, -HOUR(3) }, /* Baghdad, USSR Zone 2 */
-#if 0
- { "it", tZONE, -HOUR(3.5) },/* Iran */
-#endif
- { "zp4", tZONE, -HOUR(4) }, /* USSR Zone 3 */
- { "zp5", tZONE, -HOUR(5) }, /* USSR Zone 4 */
-#if 0
- { "ist", tZONE, -HOUR(5.5) },/* Indian Standard */
-#endif
- { "zp6", tZONE, -HOUR(6) }, /* USSR Zone 5 */
-#if 0
- /* For completeness. NST is also Newfoundland Stanard, and SST is
- * also Swedish Summer. */
- { "nst", tZONE, -HOUR(6.5) },/* North Sumatra */
- { "sst", tZONE, -HOUR(7) }, /* South Sumatra, USSR Zone 6 */
-#endif /* 0 */
- { "wast", tZONE, -HOUR(7) }, /* West Australian Standard */
- { "wadt", tDAYZONE, -HOUR(7) }, /* West Australian Daylight */
-#if 0
- { "jt", tZONE, -HOUR(7.5) },/* Java (3pm in Cronusland!) */
-#endif
- { "cct", tZONE, -HOUR(8) }, /* China Coast, USSR Zone 7 */
- { "jst", tZONE, -HOUR(9) }, /* Japan Standard, USSR Zone 8 */
-#if 0
- { "cast", tZONE, -HOUR(9.5) },/* Central Australian Standard */
- { "cadt", tDAYZONE, -HOUR(9.5) },/* Central Australian Daylight */
-#endif
- { "east", tZONE, -HOUR(10) }, /* Eastern Australian Standard */
- { "eadt", tDAYZONE, -HOUR(10) }, /* Eastern Australian Daylight */
- { "gst", tZONE, -HOUR(10) }, /* Guam Standard, USSR Zone 9 */
- { "nzt", tZONE, -HOUR(12) }, /* New Zealand */
- { "nzst", tZONE, -HOUR(12) }, /* New Zealand Standard */
- { "nzdt", tDAYZONE, -HOUR(12) }, /* New Zealand Daylight */
- { "idle", tZONE, -HOUR(12) }, /* International Date Line East */
- { NULL, 0, 0 }
-};
-
-/* Military timezone table. */
-static TABLE const MilitaryTable[] = {
- { "a", tZONE, HOUR( 1) },
- { "b", tZONE, HOUR( 2) },
- { "c", tZONE, HOUR( 3) },
- { "d", tZONE, HOUR( 4) },
- { "e", tZONE, HOUR( 5) },
- { "f", tZONE, HOUR( 6) },
- { "g", tZONE, HOUR( 7) },
- { "h", tZONE, HOUR( 8) },
- { "i", tZONE, HOUR( 9) },
- { "k", tZONE, HOUR( 10) },
- { "l", tZONE, HOUR( 11) },
- { "m", tZONE, HOUR( 12) },
- { "n", tZONE, HOUR(- 1) },
- { "o", tZONE, HOUR(- 2) },
- { "p", tZONE, HOUR(- 3) },
- { "q", tZONE, HOUR(- 4) },
- { "r", tZONE, HOUR(- 5) },
- { "s", tZONE, HOUR(- 6) },
- { "t", tZONE, HOUR(- 7) },
- { "u", tZONE, HOUR(- 8) },
- { "v", tZONE, HOUR(- 9) },
- { "w", tZONE, HOUR(-10) },
- { "x", tZONE, HOUR(-11) },
- { "y", tZONE, HOUR(-12) },
- { "z", tZONE, HOUR( 0) },
- { NULL, 0, 0 }
-};
-
-
-
-
-/* ARGSUSED */
-static int
-yyerror(const char *s __unused)
-{
- return 0;
-}
-
-
-static time_t
-ToSeconds(time_t Hours, time_t Minutes, time_t Seconds, MERIDIAN Meridian)
-{
- if (Minutes < 0 || Minutes > 59 || Seconds < 0 || Seconds > 59)
- return -1;
- switch (Meridian) {
- case MER24:
- if (Hours < 0 || Hours > 23)
- return -1;
- return (Hours * 60L + Minutes) * 60L + Seconds;
- case MERam:
- if (Hours < 1 || Hours > 12)
- return -1;
- if (Hours == 12)
- Hours = 0;
- return (Hours * 60L + Minutes) * 60L + Seconds;
- case MERpm:
- if (Hours < 1 || Hours > 12)
- return -1;
- if (Hours == 12)
- Hours = 0;
- return ((Hours + 12) * 60L + Minutes) * 60L + Seconds;
- default:
- abort ();
- }
- /* NOTREACHED */
-}
-
-
-/* Year is either
- * A negative number, which means to use its absolute value (why?)
- * A number from 0 to 99, which means a year from 1900 to 1999, or
- * The actual year (>=100). */
-static time_t
-Convert(time_t Month, time_t Day, time_t Year,
- time_t Hours, time_t Minutes, time_t Seconds,
- MERIDIAN Meridian, DSTMODE DSTmode)
-{
- static int DaysInMonth[12] = {
- 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
- };
- time_t tod;
- time_t Julian;
- int i;
-
- if (Year < 0)
- Year = -Year;
- if (Year < 69)
- Year += 2000;
- else if (Year < 100)
- Year += 1900;
- DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0)
- ? 29 : 28;
- /* Checking for 2038 bogusly assumes that time_t is 32 bits. But
- I'm too lazy to try to check for time_t overflow in another way. */
- if (Year < EPOCH || Year > 2038
- || Month < 1 || Month > 12
- /* Lint fluff: "conversion from long may lose accuracy" */
- || Day < 1 || Day > DaysInMonth[(int)--Month])
- return -1;
-
- for (Julian = Day - 1, i = 0; i < Month; i++)
- Julian += DaysInMonth[i];
- for (i = EPOCH; i < Year; i++)
- Julian += 365 + (i % 4 == 0);
- Julian *= SECSPERDAY;
- Julian += yyTimezone * 60L;
- if ((tod = ToSeconds(Hours, Minutes, Seconds, Meridian)) < 0)
- return -1;
- Julian += tod;
- if (DSTmode == DSTon
- || (DSTmode == DSTmaybe && localtime(&Julian)->tm_isdst))
- Julian -= 60 * 60;
- return Julian;
-}
-
-
-static time_t
-DSTcorrect(time_t Start, time_t Future)
-{
- time_t StartDay;
- time_t FutureDay;
-
- StartDay = (localtime(&Start)->tm_hour + 1) % 24;
- FutureDay = (localtime(&Future)->tm_hour + 1) % 24;
- return (Future - Start) + (StartDay - FutureDay) * 60L * 60L;
-}
-
-
-static time_t
-RelativeDate(time_t Start, time_t DayOrdinal, time_t DayNumber)
-{
- struct tm *tm;
- time_t now;
-
- now = Start;
- tm = localtime(&now);
- now += SECSPERDAY * ((DayNumber - tm->tm_wday + 7) % 7);
- now += 7 * SECSPERDAY * (DayOrdinal <= 0 ? DayOrdinal : DayOrdinal - 1);
- return DSTcorrect(Start, now);
-}
-
-
-static time_t
-RelativeMonth(time_t Start, time_t RelMonth)
-{
- struct tm *tm;
- time_t Month;
- time_t Year;
-
- if (RelMonth == 0)
- return 0;
- tm = localtime(&Start);
- Month = 12 * (tm->tm_year + 1900) + tm->tm_mon + RelMonth;
- Year = Month / 12;
- Month = Month % 12 + 1;
- return DSTcorrect(Start,
- Convert(Month, (time_t)tm->tm_mday, Year,
- (time_t)tm->tm_hour, (time_t)tm->tm_min, (time_t)tm->tm_sec,
- MER24, DSTmaybe));
-}
-
-
-static int
-LookupWord(char *buff)
-{
- char *p;
- char *q;
- const TABLE *tp;
- int i;
- int abbrev;
-
- /* Make it lowercase. */
- for (p = buff; *p; p++)
- if (isupper(*p))
- *p = tolower(*p);
-
- if (strcmp(buff, "am") == 0 || strcmp(buff, "a.m.") == 0) {
- yylval.Meridian = MERam;
- return tMERIDIAN;
- }
- if (strcmp(buff, "pm") == 0 || strcmp(buff, "p.m.") == 0) {
- yylval.Meridian = MERpm;
- return tMERIDIAN;
- }
-
- /* See if we have an abbreviation for a month. */
- if (strlen(buff) == 3)
- abbrev = 1;
- else if (strlen(buff) == 4 && buff[3] == '.') {
- abbrev = 1;
- buff[3] = '\0';
- }
- else
- abbrev = 0;
-
- for (tp = MonthDayTable; tp->name; tp++) {
- if (abbrev) {
- if (strncmp(buff, tp->name, 3) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
- }
- else if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
- }
-
- for (tp = TimezoneTable; tp->name; tp++)
- if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
-
- if (strcmp(buff, "dst") == 0)
- return tDST;
-
- for (tp = UnitsTable; tp->name; tp++)
- if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
-
- /* Strip off any plural and try the units table again. */
- i = strlen(buff) - 1;
- if (buff[i] == 's') {
- buff[i] = '\0';
- for (tp = UnitsTable; tp->name; tp++)
- if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
- buff[i] = 's'; /* Put back for "this" in OtherTable. */
- }
-
- for (tp = OtherTable; tp->name; tp++)
- if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
-
- /* Military timezones. */
- if (buff[1] == '\0' && isalpha(*buff)) {
- for (tp = MilitaryTable; tp->name; tp++)
- if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
- }
-
- /* Drop out any periods and try the timezone table again. */
- for (i = 0, p = q = buff; *q; q++)
- if (*q != '.')
- *p++ = *q;
- else
- i++;
- *p = '\0';
- if (i)
- for (tp = TimezoneTable; tp->name; tp++)
- if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
-
- return tID;
-}
-
-
-static int
-yylex(void)
-{
- char c;
- char *p;
- char buff[20];
- int Count;
- int sign;
-
- for ( ; ; ) {
- while (isspace(*yyInput))
- yyInput++;
-
- if (isdigit(c = *yyInput) || c == '-' || c == '+') {
- if (c == '-' || c == '+') {
- sign = c == '-' ? -1 : 1;
- if (!isdigit(*++yyInput))
- /* skip the '-' sign */
- continue;
- }
- else
- sign = 0;
- for (yylval.Number = 0; isdigit(c = *yyInput++); )
- yylval.Number = 10 * yylval.Number + c - '0';
- yyInput--;
- if (sign < 0)
- yylval.Number = -yylval.Number;
- return sign ? tSNUMBER : tUNUMBER;
- }
- if (isalpha(c)) {
- for (p = buff; isalpha(c = *yyInput++) || c == '.'; )
- if (p < &buff[sizeof buff - 1])
- *p++ = c;
- *p = '\0';
- yyInput--;
- return LookupWord(buff);
- }
- if (c != '(')
- return *yyInput++;
- Count = 0;
- do {
- c = *yyInput++;
- if (c == '\0')
- return c;
- if (c == '(')
- Count++;
- else if (c == ')')
- Count--;
- } while (Count > 0);
- }
-}
-
-#define TM_YEAR_ORIGIN 1900
-
-/* Yield A - B, measured in seconds. */
-static long
-difftm (struct tm *a, struct tm *b)
-{
- int ay = a->tm_year + (TM_YEAR_ORIGIN - 1);
- int by = b->tm_year + (TM_YEAR_ORIGIN - 1);
- int days = (
- /* difference in day of year */
- a->tm_yday - b->tm_yday
- /* + intervening leap days */
- + ((ay >> 2) - (by >> 2))
- - (ay/100 - by/100)
- + ((ay/100 >> 2) - (by/100 >> 2))
- /* + difference in years * 365 */
- + (long)(ay-by) * 365
- );
- return (60*(60*(24*days + (a->tm_hour - b->tm_hour))
- + (a->tm_min - b->tm_min))
- + (a->tm_sec - b->tm_sec));
-}
-
-time_t
-get_date(char *p, struct timeb *now)
-{
- struct tm *tm, gmt;
- struct timeb ftz;
- time_t Start;
- time_t tod;
- time_t nowtime;
-
- bzero (&gmt, sizeof(struct tm));
- yyInput = p;
- if (now == NULL) {
- struct tm *gmt_ptr;
-
- now = &ftz;
- (void)time (&nowtime);
-
- gmt_ptr = gmtime (&nowtime);
- if (gmt_ptr != NULL)
- {
- /* Make a copy, in case localtime modifies *tm (I think
- that comment now applies to *gmt_ptr, but I am too
- lazy to dig into how gmtime and locatime allocate the
- structures they return pointers to). */
- gmt = *gmt_ptr;
- }
-
- if (! (tm = localtime (&nowtime)))
- return -1;
-
- if (gmt_ptr != NULL)
- ftz.timezone = difftm (&gmt, tm) / 60;
- else
- /* We are on a system like VMS, where the system clock is
- in local time and the system has no concept of timezones.
- Hopefully we can fake this out (for the case in which the
- user specifies no timezone) by just saying the timezone
- is zero. */
- ftz.timezone = 0;
-
- if(tm->tm_isdst)
- ftz.timezone += 60;
- }
- else
- {
- nowtime = now->time;
- }
-
- tm = localtime(&nowtime);
- yyYear = tm->tm_year + 1900;
- yyMonth = tm->tm_mon + 1;
- yyDay = tm->tm_mday;
- yyTimezone = now->timezone;
- yyDSTmode = DSTmaybe;
- yyHour = 0;
- yyMinutes = 0;
- yySeconds = 0;
- yyMeridian = MER24;
- yyRelSeconds = 0;
- yyRelMonth = 0;
- yyHaveDate = 0;
- yyHaveDay = 0;
- yyHaveRel = 0;
- yyHaveTime = 0;
- yyHaveZone = 0;
-
- if (yyparse()
- || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 || yyHaveDay > 1)
- return -1;
-
- if (yyHaveDate || yyHaveTime || yyHaveDay) {
- Start = Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds,
- yyMeridian, yyDSTmode);
- if (Start < 0)
- return -1;
- }
- else {
- Start = nowtime;
- if (!yyHaveRel)
- Start -= ((tm->tm_hour * 60L + tm->tm_min) * 60L) + tm->tm_sec;
- }
-
- Start += yyRelSeconds;
- Start += RelativeMonth(Start, yyRelMonth);
-
- if (yyHaveDay && !yyHaveDate) {
- tod = RelativeDate(Start, yyDayOrdinal, yyDayNumber);
- Start += tod;
- }
-
- /* Have to do *something* with a legitimate -1 so it's distinguishable
- * from the error return value. (Alternately could set errno on error.) */
- return Start == -1 ? 0 : Start;
-}
-
-
-#if defined(TEST)
-
-/* ARGSUSED */
-int
-main(int ac, char *av[])
-{
- char buff[128];
- time_t d;
-
- (void)printf("Enter date, or blank line to exit.\n\t> ");
- (void)fflush(stdout);
- while (gets(buff) && buff[0]) {
- d = get_date(buff, (struct timeb *)NULL);
- if (d == -1)
- (void)printf("Bad format - couldn't convert.\n");
- else
- (void)printf("%s", ctime(&d));
- (void)printf("\t> ");
- (void)fflush(stdout);
- }
- exit(0);
- /* NOTREACHED */
-}
-#endif /* defined(TEST) */
diff --git a/usr.bin/find/ls.c b/usr.bin/find/ls.c
deleted file mode 100644
index 88e4593..0000000
--- a/usr.bin/find/ls.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)ls.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fts.h>
-#include <grp.h>
-#include <inttypes.h>
-#include <langinfo.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "find.h"
-
-/* Derived from the print routines in the ls(1) source code. */
-
-static void printlink(char *);
-static void printtime(time_t);
-
-void
-printlong(char *name, char *accpath, struct stat *sb)
-{
- char modep[15];
-
- (void)printf("%6lu %8"PRId64" ", (u_long) sb->st_ino, sb->st_blocks);
- (void)strmode(sb->st_mode, modep);
- (void)printf("%s %3u %-*s %-*s ", modep, sb->st_nlink, MAXLOGNAME - 1,
- user_from_uid(sb->st_uid, 0), MAXLOGNAME - 1,
- group_from_gid(sb->st_gid, 0));
-
- if (S_ISCHR(sb->st_mode) || S_ISBLK(sb->st_mode))
- (void)printf("%3d, %3d ", major(sb->st_rdev),
- minor(sb->st_rdev));
- else
- (void)printf("%8"PRId64" ", sb->st_size);
- printtime(sb->st_mtime);
- (void)printf("%s", name);
- if (S_ISLNK(sb->st_mode))
- printlink(accpath);
- (void)putchar('\n');
-}
-
-static void
-printtime(time_t ftime)
-{
- char longstring[80];
- static time_t lnow;
- const char *format;
- static int d_first = -1;
-
- if (d_first < 0)
- d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
- if (lnow == 0)
- lnow = time(NULL);
-
-#define SIXMONTHS ((365 / 2) * 86400)
- if (ftime + SIXMONTHS > lnow && ftime < lnow + SIXMONTHS)
- /* mmm dd hh:mm || dd mmm hh:mm */
- format = d_first ? "%e %b %R " : "%b %e %R ";
- else
- /* mmm dd yyyy || dd mmm yyyy */
- format = d_first ? "%e %b %Y " : "%b %e %Y ";
- strftime(longstring, sizeof(longstring), format, localtime(&ftime));
- fputs(longstring, stdout);
-}
-
-static void
-printlink(char *name)
-{
- int lnklen;
- char path[MAXPATHLEN];
-
- if ((lnklen = readlink(name, path, MAXPATHLEN - 1)) == -1) {
- warn("%s", name);
- return;
- }
- path[lnklen] = '\0';
- (void)printf(" -> %s", path);
-}
diff --git a/usr.bin/find/main.c b/usr.bin/find/main.c
deleted file mode 100644
index 8e2b42c..0000000
--- a/usr.bin/find/main.c
+++ /dev/null
@@ -1,170 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Cimarron D. Taylor of the University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-char copyright[] =
-"@(#) Copyright (c) 1990, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)main.c 8.4 (Berkeley) 5/4/95";
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <fts.h>
-#include <locale.h>
-#include <regex.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "find.h"
-
-time_t now; /* time find was run */
-int dotfd; /* starting directory */
-int ftsoptions; /* options for the ftsopen(3) call */
-int isdeprecated; /* using deprecated syntax */
-int isdepth; /* do directories on post-order visit */
-int isoutput; /* user specified output operator */
-int issort; /* do hierarchies in lexicographical order */
-int isxargs; /* don't permit xargs delimiting chars */
-int mindepth = -1, maxdepth = -1; /* minimum and maximum depth */
-int regexp_flags = REG_BASIC; /* use the "basic" regexp by default*/
-
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- char **p, **start;
- int Hflag, Lflag, ch;
-
- (void)setlocale(LC_ALL, "");
-
- (void)time(&now); /* initialize the time-of-day */
-
- p = start = argv;
- Hflag = Lflag = 0;
- ftsoptions = FTS_NOSTAT | FTS_PHYSICAL;
- while ((ch = getopt(argc, argv, "EHLPXdf:sx")) != -1)
- switch (ch) {
- case 'E':
- regexp_flags |= REG_EXTENDED;
- break;
- case 'H':
- Hflag = 1;
- Lflag = 0;
- break;
- case 'L':
- Lflag = 1;
- Hflag = 0;
- break;
- case 'P':
- Hflag = Lflag = 0;
- break;
- case 'X':
- isxargs = 1;
- break;
- case 'd':
- isdepth = 1;
- break;
- case 'f':
- *p++ = optarg;
- break;
- case 's':
- issort = 1;
- break;
- case 'x':
- ftsoptions |= FTS_XDEV;
- break;
- case '?':
- default:
- break;
- }
-
- argc -= optind;
- argv += optind;
-
- if (Hflag)
- ftsoptions |= FTS_COMFOLLOW;
- if (Lflag) {
- ftsoptions &= ~FTS_PHYSICAL;
- ftsoptions |= FTS_LOGICAL;
- }
-
- /*
- * Find first option to delimit the file list. The first argument
- * that starts with a -, or is a ! or a ( must be interpreted as a
- * part of the find expression, according to POSIX .2.
- */
- for (; *argv != NULL; *p++ = *argv++) {
- if (argv[0][0] == '-')
- break;
- if ((argv[0][0] == '!' || argv[0][0] == '(') &&
- argv[0][1] == '\0')
- break;
- }
-
- if (p == start)
- usage();
- *p = NULL;
-
- if ((dotfd = open(".", O_RDONLY, 0)) < 0)
- err(1, ".");
-
- exit(find_execute(find_formplan(argv), start));
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "%s\n%s\n",
-"usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]",
-" find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]");
- exit(1);
-}
diff --git a/usr.bin/find/misc.c b/usr.bin/find/misc.c
deleted file mode 100644
index 1532906..0000000
--- a/usr.bin/find/misc.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Cimarron D. Taylor of the University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)misc.c 8.2 (Berkeley) 4/1/94";
-#else
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fts.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "find.h"
-
-/*
- * brace_subst --
- * Replace occurrences of {} in s1 with s2 and return the result string.
- */
-void
-brace_subst(char *orig, char **store, char *path, int len)
-{
- int plen;
- char ch, *p;
-
- plen = strlen(path);
- for (p = *store; (ch = *orig) != '\0'; ++orig)
- if (ch == '{' && orig[1] == '}') {
- while ((p - *store) + plen > len)
- if (!(*store = realloc(*store, len *= 2)))
- err(1, NULL);
- memmove(p, path, plen);
- p += plen;
- ++orig;
- } else
- *p++ = ch;
- *p = '\0';
-}
-
-/*
- * queryuser --
- * print a message to standard error and then read input from standard
- * input. If the input is an affirmative response (according to the
- * current locale) then 1 is returned.
- */
-int
-queryuser(char *argv[])
-{
- char *p, resp[256];
-
- (void)fprintf(stderr, "\"%s", *argv);
- while (*++argv)
- (void)fprintf(stderr, " %s", *argv);
- (void)fprintf(stderr, "\"? ");
- (void)fflush(stderr);
-
- if (fgets(resp, sizeof(resp), stdin) == NULL)
- *resp = '\0';
- if ((p = strchr(resp, '\n')) != NULL)
- *p = '\0';
- else {
- (void)fprintf(stderr, "\n");
- (void)fflush(stderr);
- }
- return (rpmatch(resp) == 1);
-}
diff --git a/usr.bin/find/operator.c b/usr.bin/find/operator.c
deleted file mode 100644
index c774efa..0000000
--- a/usr.bin/find/operator.c
+++ /dev/null
@@ -1,277 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Cimarron D. Taylor of the University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)operator.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <err.h>
-#include <fts.h>
-#include <stdio.h>
-
-#include "find.h"
-
-static PLAN *yanknode(PLAN **);
-static PLAN *yankexpr(PLAN **);
-
-/*
- * yanknode --
- * destructively removes the top from the plan
- */
-static PLAN *
-yanknode(PLAN **planp)
-{
- PLAN *node; /* top node removed from the plan */
-
- if ((node = (*planp)) == NULL)
- return (NULL);
- (*planp) = (*planp)->next;
- node->next = NULL;
- return (node);
-}
-
-/*
- * yankexpr --
- * Removes one expression from the plan. This is used mainly by
- * paren_squish. In comments below, an expression is either a
- * simple node or a f_expr node containing a list of simple nodes.
- */
-static PLAN *
-yankexpr(PLAN **planp)
-{
- PLAN *next; /* temp node holding subexpression results */
- PLAN *node; /* pointer to returned node or expression */
- PLAN *tail; /* pointer to tail of subplan */
- PLAN *subplan; /* pointer to head of ( ) expression */
-
- /* first pull the top node from the plan */
- if ((node = yanknode(planp)) == NULL)
- return (NULL);
-
- /*
- * If the node is an '(' then we recursively slurp up expressions
- * until we find its associated ')'. If it's a closing paren we
- * just return it and unwind our recursion; all other nodes are
- * complete expressions, so just return them.
- */
- if (node->execute == f_openparen)
- for (tail = subplan = NULL;;) {
- if ((next = yankexpr(planp)) == NULL)
- errx(1, "(: missing closing ')'");
- /*
- * If we find a closing ')' we store the collected
- * subplan in our '(' node and convert the node to
- * a f_expr. The ')' we found is ignored. Otherwise,
- * we just continue to add whatever we get to our
- * subplan.
- */
- if (next->execute == f_closeparen) {
- if (subplan == NULL)
- errx(1, "(): empty inner expression");
- node->p_data[0] = subplan;
- node->execute = f_expr;
- break;
- } else {
- if (subplan == NULL)
- tail = subplan = next;
- else {
- tail->next = next;
- tail = next;
- }
- tail->next = NULL;
- }
- }
- return (node);
-}
-
-/*
- * paren_squish --
- * replaces "parenthesized" plans in our search plan with "expr" nodes.
- */
-PLAN *
-paren_squish(PLAN *plan)
-{
- PLAN *expr; /* pointer to next expression */
- PLAN *tail; /* pointer to tail of result plan */
- PLAN *result; /* pointer to head of result plan */
-
- result = tail = NULL;
-
- /*
- * the basic idea is to have yankexpr do all our work and just
- * collect its results together.
- */
- while ((expr = yankexpr(&plan)) != NULL) {
- /*
- * if we find an unclaimed ')' it means there is a missing
- * '(' someplace.
- */
- if (expr->execute == f_closeparen)
- errx(1, "): no beginning '('");
-
- /* add the expression to our result plan */
- if (result == NULL)
- tail = result = expr;
- else {
- tail->next = expr;
- tail = expr;
- }
- tail->next = NULL;
- }
- return (result);
-}
-
-/*
- * not_squish --
- * compresses "!" expressions in our search plan.
- */
-PLAN *
-not_squish(PLAN *plan)
-{
- PLAN *next; /* next node being processed */
- PLAN *node; /* temporary node used in f_not processing */
- PLAN *tail; /* pointer to tail of result plan */
- PLAN *result; /* pointer to head of result plan */
-
- tail = result = NULL;
-
- while ((next = yanknode(&plan))) {
- /*
- * if we encounter a ( expression ) then look for nots in
- * the expr subplan.
- */
- if (next->execute == f_expr)
- next->p_data[0] = not_squish(next->p_data[0]);
-
- /*
- * if we encounter a not, then snag the next node and place
- * it in the not's subplan. As an optimization we compress
- * several not's to zero or one not.
- */
- if (next->execute == f_not) {
- int notlevel = 1;
-
- node = yanknode(&plan);
- while (node != NULL && node->execute == f_not) {
- ++notlevel;
- node = yanknode(&plan);
- }
- if (node == NULL)
- errx(1, "!: no following expression");
- if (node->execute == f_or)
- errx(1, "!: nothing between ! and -o");
- /*
- * If we encounter ! ( expr ) then look for nots in
- * the expr subplan.
- */
- if (node->execute == f_expr)
- node->p_data[0] = not_squish(node->p_data[0]);
- if (notlevel % 2 != 1)
- next = node;
- else
- next->p_data[0] = node;
- }
-
- /* add the node to our result plan */
- if (result == NULL)
- tail = result = next;
- else {
- tail->next = next;
- tail = next;
- }
- tail->next = NULL;
- }
- return (result);
-}
-
-/*
- * or_squish --
- * compresses -o expressions in our search plan.
- */
-PLAN *
-or_squish(PLAN *plan)
-{
- PLAN *next; /* next node being processed */
- PLAN *tail; /* pointer to tail of result plan */
- PLAN *result; /* pointer to head of result plan */
-
- tail = result = next = NULL;
-
- while ((next = yanknode(&plan)) != NULL) {
- /*
- * if we encounter a ( expression ) then look for or's in
- * the expr subplan.
- */
- if (next->execute == f_expr)
- next->p_data[0] = or_squish(next->p_data[0]);
-
- /* if we encounter a not then look for or's in the subplan */
- if (next->execute == f_not)
- next->p_data[0] = or_squish(next->p_data[0]);
-
- /*
- * if we encounter an or, then place our collected plan in the
- * or's first subplan and then recursively collect the
- * remaining stuff into the second subplan and return the or.
- */
- if (next->execute == f_or) {
- if (result == NULL)
- errx(1, "-o: no expression before -o");
- next->p_data[0] = result;
- next->p_data[1] = or_squish(plan);
- if (next->p_data[1] == NULL)
- errx(1, "-o: no expression after -o");
- return (next);
- }
-
- /* add the node to our result plan */
- if (result == NULL)
- tail = result = next;
- else {
- tail->next = next;
- tail = next;
- }
- tail->next = NULL;
- }
- return (result);
-}
diff --git a/usr.bin/find/option.c b/usr.bin/find/option.c
deleted file mode 100644
index 7d06c91..0000000
--- a/usr.bin/find/option.c
+++ /dev/null
@@ -1,201 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Cimarron D. Taylor of the University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-/*
-static char sccsid[] = "@(#)option.c 8.2 (Berkeley) 4/16/94";
-*/
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <fts.h>
-#include <regex.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "find.h"
-
-int typecompare(const void *, const void *);
-
-/* NB: the following table must be sorted lexically. */
-/* Options listed with C++ comments are in gnu find, but not our find */
-static OPTION const options[] = {
- { "!", c_simple, f_not, 0 },
- { "(", c_simple, f_openparen, 0 },
- { ")", c_simple, f_closeparen, 0 },
- { "-Bmin", c_Xmin, f_Xmin, F_TIME_B },
- { "-Bnewer", c_newer, f_newer, F_TIME_B },
- { "-Btime", c_Xtime, f_Xtime, F_TIME_B },
- { "-a", c_and, NULL, 0 },
- { "-acl", c_acl, f_acl, 0 },
- { "-amin", c_Xmin, f_Xmin, F_TIME_A },
- { "-and", c_and, NULL, 0 },
- { "-anewer", c_newer, f_newer, F_TIME_A },
- { "-atime", c_Xtime, f_Xtime, F_TIME_A },
- { "-cmin", c_Xmin, f_Xmin, F_TIME_C },
- { "-cnewer", c_newer, f_newer, F_TIME_C },
- { "-ctime", c_Xtime, f_Xtime, F_TIME_C },
- { "-d", c_depth, f_depth, 0 },
-// -daystart
- { "-delete", c_delete, f_delete, 0 },
- { "-depth", c_depth, f_depth, 0 },
- { "-empty", c_empty, f_empty, 0 },
- { "-exec", c_exec, f_exec, 0 },
- { "-execdir", c_exec, f_exec, F_EXECDIR },
- { "-false", c_simple, f_false, 0 },
- { "-flags", c_flags, f_flags, 0 },
-// -fls
- { "-follow", c_follow, f_always_true, 0 },
-// -fprint
-// -fprint0
-// -fprintf
- { "-fstype", c_fstype, f_fstype, 0 },
- { "-gid", c_group, f_group, 0 },
- { "-group", c_group, f_group, 0 },
- { "-ignore_readdir_race",c_simple, f_always_true,0 },
- { "-ilname", c_name, f_name, F_LINK | F_IGNCASE },
- { "-iname", c_name, f_name, F_IGNCASE },
- { "-inum", c_inum, f_inum, 0 },
- { "-ipath", c_name, f_path, F_IGNCASE },
- { "-iregex", c_regex, f_regex, F_IGNCASE },
- { "-iwholename",c_name, f_path, F_IGNCASE },
- { "-links", c_links, f_links, 0 },
- { "-lname", c_name, f_name, F_LINK },
- { "-ls", c_ls, f_ls, 0 },
- { "-maxdepth", c_mXXdepth, f_always_true, F_MAXDEPTH },
- { "-mindepth", c_mXXdepth, f_always_true, 0 },
- { "-mmin", c_Xmin, f_Xmin, 0 },
- { "-mnewer", c_newer, f_newer, 0 },
- { "-mount", c_xdev, f_always_true, 0 },
- { "-mtime", c_Xtime, f_Xtime, 0 },
- { "-name", c_name, f_name, 0 },
- { "-newer", c_newer, f_newer, 0 },
- { "-newerBB", c_newer, f_newer, F_TIME_B | F_TIME2_B },
- { "-newerBa", c_newer, f_newer, F_TIME_B | F_TIME2_A },
- { "-newerBc", c_newer, f_newer, F_TIME_B | F_TIME2_C },
- { "-newerBm", c_newer, f_newer, F_TIME_B },
- { "-newerBt", c_newer, f_newer, F_TIME_B | F_TIME2_T },
- { "-neweraB", c_newer, f_newer, F_TIME_A | F_TIME2_B },
- { "-neweraa", c_newer, f_newer, F_TIME_A | F_TIME2_A },
- { "-newerac", c_newer, f_newer, F_TIME_A | F_TIME2_C },
- { "-neweram", c_newer, f_newer, F_TIME_A },
- { "-newerat", c_newer, f_newer, F_TIME_A | F_TIME2_T },
- { "-newercB", c_newer, f_newer, F_TIME_C | F_TIME2_B },
- { "-newerca", c_newer, f_newer, F_TIME_C | F_TIME2_A },
- { "-newercc", c_newer, f_newer, F_TIME_C | F_TIME2_C },
- { "-newercm", c_newer, f_newer, F_TIME_C },
- { "-newerct", c_newer, f_newer, F_TIME_C | F_TIME2_T },
- { "-newermB", c_newer, f_newer, F_TIME2_B },
- { "-newerma", c_newer, f_newer, F_TIME2_A },
- { "-newermc", c_newer, f_newer, F_TIME2_C },
- { "-newermm", c_newer, f_newer, 0 },
- { "-newermt", c_newer, f_newer, F_TIME2_T },
- { "-nogroup", c_nogroup, f_nogroup, 0 },
- { "-noignore_readdir_race",c_simple, f_always_true,0 },
- { "-noleaf", c_simple, f_always_true, 0 },
- { "-not", c_simple, f_not, 0 },
- { "-nouser", c_nouser, f_nouser, 0 },
- { "-o", c_simple, f_or, 0 },
- { "-ok", c_exec, f_exec, F_NEEDOK },
- { "-okdir", c_exec, f_exec, F_NEEDOK | F_EXECDIR },
- { "-or", c_simple, f_or, 0 },
- { "-path", c_name, f_path, 0 },
- { "-perm", c_perm, f_perm, 0 },
- { "-print", c_print, f_print, 0 },
- { "-print0", c_print, f_print0, 0 },
-// -printf
- { "-prune", c_simple, f_prune, 0 },
- { "-quit", c_simple, f_quit, 0 },
- { "-regex", c_regex, f_regex, 0 },
- { "-samefile", c_samefile, f_inum, 0 },
- { "-size", c_size, f_size, 0 },
- { "-true", c_simple, f_always_true, 0 },
- { "-type", c_type, f_type, 0 },
- { "-uid", c_user, f_user, 0 },
- { "-user", c_user, f_user, 0 },
- { "-wholename", c_name, f_path, 0 },
- { "-xdev", c_xdev, f_always_true, 0 },
-// -xtype
-};
-
-/*
- * find_create --
- * create a node corresponding to a command line argument.
- *
- * TODO:
- * add create/process function pointers to node, so we can skip
- * this switch stuff.
- */
-PLAN *
-find_create(char ***argvp)
-{
- OPTION *p;
- PLAN *new;
- char **argv;
-
- argv = *argvp;
-
- if ((p = lookup_option(*argv)) == NULL)
- errx(1, "%s: unknown option", *argv);
- ++argv;
-
- new = (p->create)(p, &argv);
- *argvp = argv;
- return (new);
-}
-
-OPTION *
-lookup_option(const char *name)
-{
- OPTION tmp;
-
- tmp.name = name;
- return ((OPTION *)bsearch(&tmp, options,
- sizeof(options)/sizeof(OPTION), sizeof(OPTION), typecompare));
-}
-
-int
-typecompare(const void *a, const void *b)
-{
- return (strcmp(((const OPTION *)a)->name, ((const OPTION *)b)->name));
-}
diff --git a/usr.bin/finger/Makefile b/usr.bin/finger/Makefile
deleted file mode 100644
index 983392b..0000000
--- a/usr.bin/finger/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= finger
-SRCS= finger.c lprint.c net.c sprint.c util.c
-MAN= finger.1 finger.conf.5
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/finger/extern.h b/usr.bin/finger/extern.h
deleted file mode 100644
index 498c296..0000000
--- a/usr.bin/finger/extern.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.2 (Berkeley) 4/28/95
- * $FreeBSD$
- */
-
-#ifndef _EXTERN_H_
-#define _EXTERN_H_
-
-extern char tbuf[1024]; /* Temp buffer for anybody. */
-extern int entries; /* Number of people. */
-extern DB *db; /* Database. */
-extern int d_first;
-extern sa_family_t family;
-extern int gflag;
-extern int lflag;
-extern time_t now;
-extern int oflag;
-extern int pplan; /* don't show .plan/.project */
-extern int invoker_root; /* Invoked by root */
-
-void enter_lastlog(PERSON *);
-PERSON *enter_person(struct passwd *);
-void enter_where(struct utmp *, PERSON *);
-PERSON *find_person(const char *);
-int hide(struct passwd *);
-void lflag_print(void);
-int match(struct passwd *, const char *);
-void netfinger(char *);
-PERSON *palloc(void);
-char *prphone(char *);
-void sflag_print(void);
-int show_text(const char *, const char *, const char *);
-
-#endif /* !_EXTERN_H_ */
diff --git a/usr.bin/finger/finger.1 b/usr.bin/finger/finger.1
deleted file mode 100644
index 590a382..0000000
--- a/usr.bin/finger/finger.1
+++ /dev/null
@@ -1,250 +0,0 @@
-.\" Copyright (c) 1989, 1990, 1993, 1994
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)finger.1 8.3 (Berkeley) 5/5/94
-.\" $FreeBSD$
-.\"
-.Dd April 11, 2007
-.Dt FINGER 1
-.Os
-.Sh NAME
-.Nm finger
-.Nd user information lookup program
-.Sh SYNOPSIS
-.Nm
-.Op Fl 46gklmpsho
-.Op Ar user ...\&
-.Op Ar user@host ...\&
-.Sh DESCRIPTION
-The
-.Nm
-utility displays information about the system users.
-.Pp
-Options are:
-.Bl -tag -width indent
-.It Fl 4
-Forces
-.Nm
-to use IPv4 addresses only.
-.It Fl 6
-Forces
-.Nm
-to use IPv6 addresses only.
-.It Fl s
-Display the user's login name, real name, terminal name and write
-status (as a ``*'' before the terminal name if write permission is
-denied), idle time, login time, and either office location and office
-phone number, or the remote host.
-If
-.Fl o
-is given, the office location and office phone number is printed
-(the default).
-If
-.Fl h
-is given, the remote host is printed instead.
-.Pp
-Idle time is in minutes if it is a single integer, hours and minutes
-if a ``:'' is present, or days if a ``d'' is present.
-If it is an
-.Dq * ,
-the login time indicates the time of last login.
-Login time is displayed as the day name if less than 6 days, else month, day;
-hours and minutes, unless more than six months ago, in which case the year
-is displayed rather than the hours and minutes.
-.Pp
-Unknown devices as well as nonexistent idle and login times are
-displayed as single asterisks.
-.It Fl h
-When used in conjunction with the
-.Fl s
-option, the name of the remote host is displayed instead of the office
-location and office phone.
-.It Fl o
-When used in conjunction with the
-.Fl s
-option, the office location and office phone information is displayed
-instead of the name of the remote host.
-.It Fl g
-This option restricts the gecos output to only the users' real
-name.
-It also has the side-effect of restricting the output
-of the remote host when used in conjunction with the
-.Fl h
-option.
-.It Fl k
-Disable all use of
-.Xr utmp 5 .
-.It Fl l
-Produce a multi-line format displaying all of the information
-described for the
-.Fl s
-option as well as the user's home directory, home phone number, login
-shell, mail status, and the contents of the files
-.Pa .forward ,
-.Pa .plan ,
-.Pa .project
-and
-.Pa .pubkey
-from the user's home directory.
-.Pp
-If idle time is at least a minute and less than a day, it is
-presented in the form ``hh:mm''.
-Idle times greater than a day are presented as ``d day[s]hh:mm''.
-.Pp
-Phone numbers specified as eleven digits are printed as ``+N-NNN-NNN-NNNN''.
-Numbers specified as ten or seven digits are printed as the appropriate
-subset of that string.
-Numbers specified as five digits are printed as ``xN-NNNN''.
-Numbers specified as four digits are printed as ``xNNNN''.
-.Pp
-If write permission is denied to the device, the phrase ``(messages off)''
-is appended to the line containing the device name.
-One entry per user is displayed with the
-.Fl l
-option; if a user is logged on multiple times, terminal information
-is repeated once per login.
-.Pp
-Mail status is shown as ``No Mail.'' if there is no mail at all, ``Mail
-last read DDD MMM ## HH:MM YYYY (TZ)'' if the person has looked at their
-mailbox since new mail arriving, or ``New mail received ...'', ``Unread
-since ...'' if they have new mail.
-.It Fl p
-Prevent
-the
-.Fl l
-option of
-.Nm
-from displaying the contents of the
-.Pa .forward ,
-.Pa .plan ,
-.Pa .project
-and
-.Pa .pubkey
-files.
-.It Fl m
-Prevent matching of
-.Ar user
-names.
-.Ar User
-is usually a login name; however, matching will also be done on the
-users' real names, unless the
-.Fl m
-option is supplied.
-All name matching performed by
-.Nm
-is case insensitive.
-.El
-.Pp
-If no options are specified,
-.Nm
-defaults to the
-.Fl l
-style output if operands are provided, otherwise to the
-.Fl s
-style.
-Note that some fields may be missing, in either format, if information
-is not available for them.
-.Pp
-If no arguments are specified,
-.Nm
-will print an entry for each user currently logged into the system.
-.Pp
-The
-.Nm
-utility may be used to look up users on a remote machine.
-The format is to specify a
-.Ar user
-as
-.Dq Li user@host ,
-or
-.Dq Li @host ,
-where the default output
-format for the former is the
-.Fl l
-style, and the default output format for the latter is the
-.Fl s
-style.
-The
-.Fl l
-option is the only option that may be passed to a remote machine.
-.Pp
-If the file
-.Pa .nofinger
-exists in the user's home directory,
-and the program is not run with superuser privileges,
-.Nm
-behaves as if the user in question does not exist.
-.Pp
-The optional
-.Xr finger.conf 5
-configuration file can be used to specify aliases.
-Since
-.Nm
-is invoked by
-.Xr fingerd 8 ,
-aliases will work for both local and network queries.
-.Sh ENVIRONMENT
-The
-.Nm
-utility utilizes the following environment variable, if it exists:
-.Bl -tag -width Fl
-.It Ev FINGER
-This variable may be set with favored options to
-.Nm .
-.El
-.Sh FILES
-.Bl -tag -width /var/log/lastlog -compact
-.It Pa /etc/finger.conf
-alias definition data base
-.It Pa /var/log/lastlog
-last login data base
-.El
-.Sh SEE ALSO
-.Xr chpass 1 ,
-.Xr w 1 ,
-.Xr who 1 ,
-.Xr finger.conf 5 ,
-.Xr fingerd 8
-.Rs
-.%A D. Zimmerman
-.%T The Finger User Information Protocol
-.%R RFC 1288
-.%D December, 1991
-.Re
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3.0 .
-.Sh BUGS
-The
-.Nm
-utility does not recognize multibyte characters.
diff --git a/usr.bin/finger/finger.c b/usr.bin/finger/finger.c
deleted file mode 100644
index b278752..0000000
--- a/usr.bin/finger/finger.c
+++ /dev/null
@@ -1,407 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Tony Nardo of the Johns Hopkins University/Applied Physics Lab.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Luke Mewburn <lm@rmit.edu.au> added the following on 940622:
- * - mail status ("No Mail", "Mail read:...", or "New Mail ...,
- * Unread since ...".)
- * - 4 digit phone extensions (3210 is printed as x3210.)
- * - host/office toggling in short format with -h & -o.
- * - short day names (`Tue' printed instead of `Jun 21' if the
- * login time is < 6 days.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1989, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)finger.c 8.5 (Berkeley) 5/4/95";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Finger prints out information about users. It is not portable since
- * certain fields (e.g. the full user name, office, and phone numbers) are
- * extracted from the gecos field of the passwd file which other UNIXes
- * may not have or may use for other things.
- *
- * There are currently two output formats; the short format is one line
- * per user and displays login name, tty, login time, real name, idle time,
- * and either remote host information (default) or office location/phone
- * number, depending on if -h or -o is used respectively.
- * The long format gives the same information (in a more legible format) as
- * well as home directory, shell, mail info, and .plan/.project files.
- */
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <db.h>
-#include <err.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-#include <utmp.h>
-#include <locale.h>
-
-#include "finger.h"
-#include "pathnames.h"
-
-DB *db;
-time_t now;
-int entries, gflag, kflag, lflag, mflag, pplan, sflag, oflag;
-sa_family_t family = PF_UNSPEC;
-int d_first = -1;
-char tbuf[1024];
-int invoker_root = 0;
-
-static void loginlist(void);
-static int option(int, char **);
-static void usage(void);
-static void userlist(int, char **);
-
-static int
-option(int argc, char **argv)
-{
- int ch;
-
- optind = 1; /* reset getopt */
-
- while ((ch = getopt(argc, argv, "46gklmpsho")) != -1)
- switch(ch) {
- case '4':
- family = AF_INET;
- break;
- case '6':
- family = AF_INET6;
- break;
- case 'g':
- gflag = 1;
- break;
- case 'k':
- kflag = 1; /* keep going without utmp */
- break;
- case 'l':
- lflag = 1; /* long format */
- break;
- case 'm':
- mflag = 1; /* force exact match of names */
- break;
- case 'p':
- pplan = 1; /* don't show .plan/.project */
- break;
- case 's':
- sflag = 1; /* short format */
- break;
- case 'h':
- oflag = 0; /* remote host info */
- break;
- case 'o':
- oflag = 1; /* office info */
- break;
- case '?':
- default:
- usage();
- }
-
- return optind;
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr,
- "usage: finger [-46gklmpsho] [user ...] [user@host ...]\n");
- exit(1);
-}
-
-int
-main(int argc, char **argv)
-{
- int envargc, argcnt;
- char *envargv[3];
- struct passwd *pw;
- static char myname[] = "finger";
-
- if (getuid() == 0 || geteuid() == 0) {
- invoker_root = 1;
- if ((pw = getpwnam(UNPRIV_NAME)) && pw->pw_uid > 0) {
- setgid(pw->pw_gid);
- setuid(pw->pw_uid);
- } else {
- setgid(UNPRIV_UGID);
- setuid(UNPRIV_UGID);
- }
- }
-
- (void) setlocale(LC_ALL, "");
-
- /* remove this line to get remote host */
- oflag = 1; /* default to old "office" behavior */
-
- /*
- * Process environment variables followed by command line arguments.
- */
- if ((envargv[1] = getenv("FINGER"))) {
- envargc = 2;
- envargv[0] = myname;
- envargv[2] = NULL;
- (void) option(envargc, envargv);
- }
-
- argcnt = option(argc, argv);
- argc -= argcnt;
- argv += argcnt;
-
- (void)time(&now);
- setpassent(1);
- if (!*argv) {
- /*
- * Assign explicit "small" format if no names given and -l
- * not selected. Force the -s BEFORE we get names so proper
- * screening will be done.
- */
- if (!lflag)
- sflag = 1; /* if -l not explicit, force -s */
- loginlist();
- if (entries == 0)
- (void)printf("No one logged on.\n");
- } else {
- userlist(argc, argv);
- /*
- * Assign explicit "large" format if names given and -s not
- * explicitly stated. Force the -l AFTER we get names so any
- * remote finger attempts specified won't be mishandled.
- */
- if (!sflag)
- lflag = 1; /* if -s not explicit, force -l */
- }
- if (entries) {
- if (lflag)
- lflag_print();
- else
- sflag_print();
- }
- return (0);
-}
-
-static void
-loginlist(void)
-{
- PERSON *pn;
- DBT data, key;
- struct passwd *pw;
- struct utmp user;
- int r, sflag1;
- char name[UT_NAMESIZE + 1];
-
- if (kflag)
- errx(1, "can't list logins without reading utmp");
-
- if (!freopen(_PATH_UTMP, "r", stdin))
- err(1, "%s", _PATH_UTMP);
- name[UT_NAMESIZE] = '\0';
- while (fread((char *)&user, sizeof(user), 1, stdin) == 1) {
- if (!user.ut_name[0])
- continue;
- if ((pn = find_person(user.ut_name)) == NULL) {
- bcopy(user.ut_name, name, UT_NAMESIZE);
- if ((pw = getpwnam(name)) == NULL)
- continue;
- if (hide(pw))
- continue;
- pn = enter_person(pw);
- }
- enter_where(&user, pn);
- }
- if (db && lflag)
- for (sflag1 = R_FIRST;; sflag1 = R_NEXT) {
- PERSON *tmp;
-
- r = (*db->seq)(db, &key, &data, sflag1);
- if (r == -1)
- err(1, "db seq");
- if (r == 1)
- break;
- memmove(&tmp, data.data, sizeof tmp);
- enter_lastlog(tmp);
- }
-}
-
-static void
-userlist(int argc, char **argv)
-{
- PERSON *pn;
- DBT data, key;
- struct utmp user;
- struct passwd *pw;
- int r, sflag1, *used, *ip;
- char **ap, **nargv, **np, **p;
- FILE *conf_fp;
- char conf_alias[LINE_MAX];
- char *conf_realname;
- int conf_length;
-
- if ((nargv = malloc((argc+1) * sizeof(char *))) == NULL ||
- (used = calloc(argc, sizeof(int))) == NULL)
- err(1, NULL);
-
- /* Pull out all network requests. */
- for (ap = p = argv, np = nargv; *p; ++p)
- if (index(*p, '@'))
- *np++ = *p;
- else
- *ap++ = *p;
-
- *np++ = NULL;
- *ap++ = NULL;
-
- if (!*argv)
- goto net;
-
- /*
- * Mark any arguments beginning with '/' as invalid so that we
- * don't accidently confuse them with expansions from finger.conf
- */
- for (p = argv, ip = used; *p; ++p, ++ip)
- if (**p == '/') {
- *ip = 1;
- warnx("%s: no such user", *p);
- }
-
- /*
- * Traverse the finger alias configuration file of the form
- * alias:(user|alias), ignoring comment lines beginning '#'.
- */
- if ((conf_fp = fopen(_PATH_FINGERCONF, "r")) != NULL) {
- while(fgets(conf_alias, sizeof(conf_alias), conf_fp) != NULL) {
- conf_length = strlen(conf_alias);
- if (*conf_alias == '#' || conf_alias[--conf_length] != '\n')
- continue;
- conf_alias[conf_length] = '\0'; /* Remove trailing LF */
- if ((conf_realname = strchr(conf_alias, ':')) == NULL)
- continue;
- *conf_realname = '\0'; /* Replace : with NUL */
- for (p = argv; *p; ++p) {
- if (strcmp(*p, conf_alias) == 0) {
- if ((*p = strdup(conf_realname+1)) == NULL) {
- err(1, NULL);
- }
- }
- }
- }
- (void)fclose(conf_fp);
- }
-
- /*
- * Traverse the list of possible login names and check the login name
- * and real name against the name specified by the user. If the name
- * begins with a '/', try to read the file of that name instead of
- * gathering the traditional finger information.
- */
- if (mflag)
- for (p = argv, ip = used; *p; ++p, ++ip) {
- if (**p != '/' || *ip == 1 || !show_text("", *p, "")) {
- if (((pw = getpwnam(*p)) != NULL) && !hide(pw))
- enter_person(pw);
- else if (!*ip)
- warnx("%s: no such user", *p);
- }
- }
- else {
- while ((pw = getpwent()) != NULL) {
- for (p = argv, ip = used; *p; ++p, ++ip)
- if (**p == '/' && *ip != 1
- && show_text("", *p, ""))
- *ip = 1;
- else if (match(pw, *p) && !hide(pw)) {
- enter_person(pw);
- *ip = 1;
- }
- }
- for (p = argv, ip = used; *p; ++p, ++ip)
- if (!*ip)
- warnx("%s: no such user", *p);
- }
-
- /* Handle network requests. */
-net: for (p = nargv; *p;) {
- netfinger(*p++);
- if (*p || entries)
- printf("\n");
- }
-
- if (entries == 0)
- return;
-
- if (kflag)
- return;
-
- /*
- * Scan thru the list of users currently logged in, saving
- * appropriate data whenever a match occurs.
- */
- if (!freopen(_PATH_UTMP, "r", stdin))
- err(1, "%s", _PATH_UTMP);
- while (fread((char *)&user, sizeof(user), 1, stdin) == 1) {
- if (!user.ut_name[0])
- continue;
- if ((pn = find_person(user.ut_name)) == NULL)
- continue;
- enter_where(&user, pn);
- }
- if (db)
- for (sflag1 = R_FIRST;; sflag1 = R_NEXT) {
- PERSON *tmp;
-
- r = (*db->seq)(db, &key, &data, sflag1);
- if (r == -1)
- err(1, "db seq");
- if (r == 1)
- break;
- memmove(&tmp, data.data, sizeof tmp);
- enter_lastlog(tmp);
- }
-}
diff --git a/usr.bin/finger/finger.conf.5 b/usr.bin/finger/finger.conf.5
deleted file mode 100644
index 54f5eec..0000000
--- a/usr.bin/finger/finger.conf.5
+++ /dev/null
@@ -1,91 +0,0 @@
-.\" Copyright (c) 2000 Mark Knight <markk@knigma.org>
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd August 16, 2000
-.Dt FINGER.CONF 5
-.Os
-.Sh NAME
-.Nm finger.conf
-.Nd
-.Xr finger 1
-alias configuration file
-.Sh DESCRIPTION
-The optional
-.Nm
-file is used to provide aliases that can be fingered by local
-and network users.
-This may be useful where a user's login name is not the same
-as their preferred mail address, or for providing virtual login names
-than can be fingered.
-.Pp
-Lines beginning with ``#'' are comments.
-Other lines must consist of an
-alias name and a target name separated by a colon.
-A target name should be either a user, a forward
-reference to another alias or the path of a world readable file.
-.Pp
-Where an alias points to a file, the contents of that file will be displayed
-when the alias is fingered.
-.Sh FILES
-.Bl -tag -width /etc/finger.conf -compact
-.It Pa /etc/finger.conf
-.Xr finger 1
-alias definition data base
-.El
-.Sh EXAMPLES
-.Bd -literal
-# /etc/finger.conf alias definition file
-#
-# Format alias:(user|alias)
-#
-# Individual aliases
-#
-markk:mkn
-john.smith:dev329
-john:dev329
-sue:/etc/finger/sue.txt
-#
-# Network status message
-#
-status:/usr/local/etc/status.txt
-#
-# Administrative redirects
-#
-root:admin
-postmaster:admin
-abuse:admin
-#
-# For the time being, 'sod' is sysadmin.
-#
-admin:sod
-.Ed
-.Sh SEE ALSO
-.Xr finger 1
-.Sh HISTORY
-Support for the
-.Nm
-file was submitted by Mark Knight <markk@knigma.org> and first appeared in
-.Fx 4.2 .
diff --git a/usr.bin/finger/finger.h b/usr.bin/finger/finger.h
deleted file mode 100644
index 6b18146..0000000
--- a/usr.bin/finger/finger.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Tony Nardo of the Johns Hopkins University/Applied Physics Lab.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)finger.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#ifndef _FINGER_H_
-#define _FINGER_H_
-
-typedef struct person {
- uid_t uid; /* user id */
- char *dir; /* user's home directory */
- char *homephone; /* pointer to home phone no. */
- char *name; /* login name */
- char *office; /* pointer to office name */
- char *officephone; /* pointer to office phone no. */
- char *realname; /* pointer to full name */
- char *shell; /* user's shell */
- time_t mailread; /* last time mail was read */
- time_t mailrecv; /* last time mail was received */
- struct where *whead, *wtail; /* list of where user is or has been */
-} PERSON;
-
-enum status { LASTLOG, LOGGEDIN };
-
-typedef struct where {
- struct where *next; /* next place user is or has been */
- enum status info; /* type/status of request */
- short writable; /* tty is writable */
- time_t loginat; /* time of (last) login */
- time_t idletime; /* how long idle (if logged in) */
- char tty[UT_LINESIZE+1]; /* null terminated tty line */
- char host[UT_HOSTSIZE+1]; /* null terminated remote host name */
-} WHERE;
-
-#define UNPRIV_NAME "nobody" /* Preferred privilege level */
-#define UNPRIV_UGID 32767 /* Default uid and gid */
-#define OUTPUT_MAX 100000 /* Do not keep listinging forever */
-#define TIME_LIMIT 360 /* Do not keep listinging forever */
-
-#include "extern.h"
-
-#endif /* !_FINGER_H_ */
diff --git a/usr.bin/finger/lprint.c b/usr.bin/finger/lprint.c
deleted file mode 100644
index 848bbee..0000000
--- a/usr.bin/finger/lprint.c
+++ /dev/null
@@ -1,367 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Tony Nardo of the Johns Hopkins University/Applied Physics Lab.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)lprint.c 8.3 (Berkeley) 4/28/95";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <ctype.h>
-#include <db.h>
-#include <err.h>
-#include <fcntl.h>
-#include <langinfo.h>
-#include <paths.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <utmp.h>
-#include "finger.h"
-#include "pathnames.h"
-
-#define LINE_LEN 80
-#define TAB_LEN 8 /* 8 spaces between tabs */
-
-static int demi_print(char *, int);
-static void lprint(PERSON *);
-static void vputc(unsigned char);
-
-void
-lflag_print(void)
-{
- PERSON *pn;
- int sflag, r;
- PERSON *tmp;
- DBT data, key;
-
- for (sflag = R_FIRST;; sflag = R_NEXT) {
- r = (*db->seq)(db, &key, &data, sflag);
- if (r == -1)
- err(1, "db seq");
- if (r == 1)
- break;
- memmove(&tmp, data.data, sizeof tmp);
- pn = tmp;
- if (sflag != R_FIRST)
- putchar('\n');
- lprint(pn);
- if (!pplan) {
- (void)show_text(pn->dir,
- _PATH_FORWARD, "Mail forwarded to");
- (void)show_text(pn->dir, _PATH_PROJECT, "Project");
- if (!show_text(pn->dir, _PATH_PLAN, "Plan"))
- (void)printf("No Plan.\n");
- (void)show_text(pn->dir,
- _PATH_PUBKEY, "Public key");
- }
- }
-}
-
-static void
-lprint(PERSON *pn)
-{
- struct tm *delta;
- WHERE *w;
- int cpr, len, maxlen;
- struct tm *tp;
- int oddfield;
- char t[80];
-
- if (d_first < 0)
- d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
- /*
- * long format --
- * login name
- * real name
- * home directory
- * shell
- * office, office phone, home phone if available
- * mail status
- */
- (void)printf("Login: %-15s\t\t\tName: %s\nDirectory: %-25s",
- pn->name, pn->realname, pn->dir);
- (void)printf("\tShell: %-s\n", *pn->shell ? pn->shell : _PATH_BSHELL);
-
- if (gflag)
- goto no_gecos;
- /*
- * try and print office, office phone, and home phone on one line;
- * if that fails, do line filling so it looks nice.
- */
-#define OFFICE_TAG "Office"
-#define OFFICE_PHONE_TAG "Office Phone"
- oddfield = 0;
- if (pn->office && pn->officephone &&
- strlen(pn->office) + strlen(pn->officephone) +
- sizeof(OFFICE_TAG) + 2 <= 5 * TAB_LEN) {
- (void)snprintf(tbuf, sizeof(tbuf), "%s: %s, %s",
- OFFICE_TAG, pn->office, prphone(pn->officephone));
- oddfield = demi_print(tbuf, oddfield);
- } else {
- if (pn->office) {
- (void)snprintf(tbuf, sizeof(tbuf), "%s: %s",
- OFFICE_TAG, pn->office);
- oddfield = demi_print(tbuf, oddfield);
- }
- if (pn->officephone) {
- (void)snprintf(tbuf, sizeof(tbuf), "%s: %s",
- OFFICE_PHONE_TAG, prphone(pn->officephone));
- oddfield = demi_print(tbuf, oddfield);
- }
- }
- if (pn->homephone) {
- (void)snprintf(tbuf, sizeof(tbuf), "%s: %s", "Home Phone",
- prphone(pn->homephone));
- oddfield = demi_print(tbuf, oddfield);
- }
- if (oddfield)
- putchar('\n');
-
-no_gecos:
- /*
- * long format con't:
- * if logged in
- * terminal
- * idle time
- * if messages allowed
- * where logged in from
- * if not logged in
- * when last logged in
- */
- /* find out longest device name for this user for formatting */
- for (w = pn->whead, maxlen = -1; w != NULL; w = w->next)
- if ((len = strlen(w->tty)) > maxlen)
- maxlen = len;
- /* find rest of entries for user */
- for (w = pn->whead; w != NULL; w = w->next) {
- if (w->info == LOGGEDIN) {
- tp = localtime(&w->loginat);
- strftime(t, sizeof(t),
- d_first ? "%a %e %b %R (%Z)" : "%a %b %e %R (%Z)",
- tp);
- cpr = printf("On since %s on %s", t, w->tty);
- /*
- * idle time is tough; if have one, print a comma,
- * then spaces to pad out the device name, then the
- * idle time. Follow with a comma if a remote login.
- */
- delta = gmtime(&w->idletime);
- if (w->idletime != -1 && (delta->tm_yday ||
- delta->tm_hour || delta->tm_min)) {
- cpr += printf("%-*s idle ",
- maxlen - (int)strlen(w->tty) + 1, ",");
- if (delta->tm_yday > 0) {
- cpr += printf("%d day%s ",
- delta->tm_yday,
- delta->tm_yday == 1 ? "" : "s");
- }
- cpr += printf("%d:%02d",
- delta->tm_hour, delta->tm_min);
- if (*w->host) {
- putchar(',');
- ++cpr;
- }
- }
- if (!w->writable)
- cpr += printf(" (messages off)");
- } else if (w->loginat == 0) {
- cpr = printf("Never logged in.");
- } else {
- tp = localtime(&w->loginat);
- if (now - w->loginat > 86400 * 365 / 2) {
- strftime(t, sizeof(t),
- d_first ? "%a %e %b %R %Y (%Z)" :
- "%a %b %e %R %Y (%Z)",
- tp);
- } else {
- strftime(t, sizeof(t),
- d_first ? "%a %e %b %R (%Z)" :
- "%a %b %e %R (%Z)",
- tp);
- }
- cpr = printf("Last login %s on %s", t, w->tty);
- }
- if (*w->host) {
- if (LINE_LEN < (cpr + 6 + strlen(w->host)))
- (void)printf("\n ");
- (void)printf(" from %s", w->host);
- }
- putchar('\n');
- }
- if (pn->mailrecv == -1)
- printf("No Mail.\n");
- else if (pn->mailrecv > pn->mailread) {
- tp = localtime(&pn->mailrecv);
- strftime(t, sizeof(t),
- d_first ? "%a %e %b %R %Y (%Z)" :
- "%a %b %e %R %Y (%Z)",
- tp);
- printf("New mail received %s\n", t);
- tp = localtime(&pn->mailread);
- strftime(t, sizeof(t),
- d_first ? "%a %e %b %R %Y (%Z)" :
- "%a %b %e %R %Y (%Z)",
- tp);
- printf(" Unread since %s\n", t);
- } else {
- tp = localtime(&pn->mailread);
- strftime(t, sizeof(t),
- d_first ? "%a %e %b %R %Y (%Z)" :
- "%a %b %e %R %Y (%Z)",
- tp);
- printf("Mail last read %s\n", t);
- }
-}
-
-static int
-demi_print(char *str, int oddfield)
-{
- static int lenlast;
- int lenthis, maxlen;
-
- lenthis = strlen(str);
- if (oddfield) {
- /*
- * We left off on an odd number of fields. If we haven't
- * crossed the midpoint of the screen, and we have room for
- * the next field, print it on the same line; otherwise,
- * print it on a new line.
- *
- * Note: we insist on having the right hand fields start
- * no less than 5 tabs out.
- */
- maxlen = 5 * TAB_LEN;
- if (maxlen < lenlast)
- maxlen = lenlast;
- if (((((maxlen / TAB_LEN) + 1) * TAB_LEN) +
- lenthis) <= LINE_LEN) {
- while(lenlast < (4 * TAB_LEN)) {
- putchar('\t');
- lenlast += TAB_LEN;
- }
- (void)printf("\t%s\n", str); /* force one tab */
- } else {
- (void)printf("\n%s", str); /* go to next line */
- oddfield = !oddfield; /* this'll be undone below */
- }
- } else
- (void)printf("%s", str);
- oddfield = !oddfield; /* toggle odd/even marker */
- lenlast = lenthis;
- return(oddfield);
-}
-
-int
-show_text(const char *directory, const char *file_name, const char *header)
-{
- struct stat sb;
- FILE *fp;
- int ch, cnt;
- char *p, lastc;
- int fd, nr;
-
- lastc = '\0';
-
- (void)snprintf(tbuf, sizeof(tbuf), "%s/%s", directory, file_name);
- if ((fd = open(tbuf, O_RDONLY)) < 0 || fstat(fd, &sb) ||
- sb.st_size == 0)
- return(0);
-
- /* If short enough, and no newlines, show it on a single line.*/
- if (sb.st_size <= LINE_LEN - strlen(header) - 5) {
- nr = read(fd, tbuf, sizeof(tbuf));
- if (nr <= 0) {
- (void)close(fd);
- return(0);
- }
- for (p = tbuf, cnt = nr; cnt--; ++p)
- if (*p == '\n')
- break;
- if (cnt <= 1) {
- if (*header != '\0')
- (void)printf("%s: ", header);
- for (p = tbuf, cnt = nr; cnt--; ++p)
- if (*p != '\r')
- vputc(lastc = *p);
- if (lastc != '\n')
- (void)putchar('\n');
- (void)close(fd);
- return(1);
- }
- else
- (void)lseek(fd, 0L, SEEK_SET);
- }
- if ((fp = fdopen(fd, "r")) == NULL)
- return(0);
- if (*header != '\0')
- (void)printf("%s:\n", header);
- while ((ch = getc(fp)) != EOF)
- if (ch != '\r')
- vputc(lastc = ch);
- if (lastc != '\n')
- (void)putchar('\n');
- (void)fclose(fp);
- return(1);
-}
-
-static void
-vputc(unsigned char ch)
-{
- int meta;
-
- if (!isprint(ch) && !isascii(ch)) {
- (void)putchar('M');
- (void)putchar('-');
- ch = toascii(ch);
- meta = 1;
- } else
- meta = 0;
- if (isprint(ch) || (!meta && (ch == ' ' || ch == '\t' || ch == '\n')))
- (void)putchar(ch);
- else {
- (void)putchar('^');
- (void)putchar(ch == '\177' ? '?' : ch | 0100);
- }
-}
diff --git a/usr.bin/finger/net.c b/usr.bin/finger/net.c
deleted file mode 100644
index 5260a2d..0000000
--- a/usr.bin/finger/net.c
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Tony Nardo of the Johns Hopkins University/Applied Physics Lab.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)net.c 8.4 (Berkeley) 4/28/95";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <ctype.h>
-#include <db.h>
-#include <err.h>
-#include <netdb.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <utmp.h>
-#include "finger.h"
-
-static void cleanup(int sig);
-static int do_protocol(const char *name, const struct addrinfo *ai);
-static void trying(const struct addrinfo *ai);
-
-void
-netfinger(char *name)
-{
- int error, multi;
- char *host;
- struct addrinfo *ai, *ai0;
- static struct addrinfo hint;
-
- host = strrchr(name, '@');
- if (host == 0)
- return;
- *host++ = '\0';
- signal(SIGALRM, cleanup);
- alarm(TIME_LIMIT);
-
- hint.ai_flags = AI_CANONNAME;
- hint.ai_family = family;
- hint.ai_socktype = SOCK_STREAM;
-
- error = getaddrinfo(host, "finger", &hint, &ai0);
- if (error) {
- warnx("%s: %s", host, gai_strerror(error));
- return;
- }
-
- multi = (ai0->ai_next) != 0;
-
- /* ai_canonname may not be filled in if the user specified an IP. */
- if (ai0->ai_canonname == 0)
- printf("[%s]\n", host);
- else
- printf("[%s]\n", ai0->ai_canonname);
-
- for (ai = ai0; ai != 0; ai = ai->ai_next) {
- if (multi)
- trying(ai);
-
- error = do_protocol(name, ai);
- if (!error)
- break;
- }
- alarm(0);
- freeaddrinfo(ai0);
-}
-
-static int
-do_protocol(const char *name, const struct addrinfo *ai)
-{
- int cnt, line_len, s;
- FILE *fp;
- int c, lastc;
- struct iovec iov[3];
- struct msghdr msg;
- static char slash_w[] = "/W ";
- static char neteol[] = "\r\n";
-
- s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
- if (s < 0) {
- warn("socket(%d, %d, %d)", ai->ai_family, ai->ai_socktype,
- ai->ai_protocol);
- return -1;
- }
-
- msg.msg_name = (void *)ai->ai_addr;
- msg.msg_namelen = ai->ai_addrlen;
- msg.msg_iov = iov;
- msg.msg_iovlen = 0;
- msg.msg_control = 0;
- msg.msg_controllen = 0;
- msg.msg_flags = 0;
-
- /* -l flag for remote fingerd */
- if (lflag) {
- iov[msg.msg_iovlen].iov_base = slash_w;
- iov[msg.msg_iovlen++].iov_len = 3;
- }
- /* send the name followed by <CR><LF> */
- iov[msg.msg_iovlen].iov_base = strdup(name);
- iov[msg.msg_iovlen++].iov_len = strlen(name);
- iov[msg.msg_iovlen].iov_base = neteol;
- iov[msg.msg_iovlen++].iov_len = 2;
-
- if (connect(s, ai->ai_addr, ai->ai_addrlen) < 0) {
- warn("connect");
- close(s);
- return -1;
- }
-
- if (sendmsg(s, &msg, 0) < 0) {
- warn("sendmsg");
- close(s);
- return -1;
- }
-
- /*
- * Read from the remote system; once we're connected, we assume some
- * data. If none arrives, we hang until the user interrupts.
- *
- * If we see a <CR> or a <CR> with the high bit set, treat it as
- * a newline; if followed by a newline character, only output one
- * newline.
- *
- * Otherwise, all high bits are stripped; if it isn't printable and
- * it isn't a space, we can simply set the 7th bit. Every ASCII
- * character with bit 7 set is printable.
- */
- lastc = 0;
- if ((fp = fdopen(s, "r")) != NULL) {
- cnt = 0;
- line_len = 0;
- while ((c = getc(fp)) != EOF) {
- if (++cnt > OUTPUT_MAX) {
- printf("\n\n Output truncated at %d bytes...\n",
- cnt - 1);
- break;
- }
- if (c == 0x0d) {
- if (lastc == '\r') /* ^M^M - skip dupes */
- continue;
- c = '\n';
- lastc = '\r';
- } else {
- if (!isprint(c) && !isspace(c)) {
- c &= 0x7f;
- c |= 0x40;
- }
- if (lastc != '\r' || c != '\n')
- lastc = c;
- else {
- lastc = '\n';
- continue;
- }
- }
- putchar(c);
- if (c != '\n' && ++line_len > _POSIX2_LINE_MAX) {
- putchar('\\');
- putchar('\n');
- lastc = '\r';
- }
- if (lastc == '\n' || lastc == '\r')
- line_len = 0;
- }
- if (ferror(fp)) {
- /*
- * Assume that whatever it was set errno...
- */
- warn("reading from network");
- }
- if (lastc != '\n')
- putchar('\n');
-
- fclose(fp);
- }
- return 0;
-}
-
-static void
-trying(const struct addrinfo *ai)
-{
- char buf[NI_MAXHOST];
-
- if (getnameinfo(ai->ai_addr, ai->ai_addrlen, buf, sizeof buf,
- (char *)0, 0, NI_NUMERICHOST) != 0)
- return; /* XXX can't happen */
-
- printf("Trying %s...\n", buf);
-}
-
-void
-cleanup(int sig __unused)
-{
-#define ERRSTR "Timed out.\n"
- write(STDERR_FILENO, ERRSTR, sizeof ERRSTR);
- exit(1);
-}
-
diff --git a/usr.bin/finger/pathnames.h b/usr.bin/finger/pathnames.h
deleted file mode 100644
index 7c9ad19..0000000
--- a/usr.bin/finger/pathnames.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*-
- * Copyright (c) 2000 Mark Knight <markk@knigma.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef PATHNAMES_H
-
-#define _PATH_FORWARD ".forward"
-#define _PATH_NOFINGER ".nofinger"
-#define _PATH_PLAN ".plan"
-#define _PATH_PROJECT ".project"
-#define _PATH_PUBKEY ".pubkey"
-
-#ifndef _PATH_FINGERCONF
-#define _PATH_FINGERCONF "/etc/finger.conf"
-#endif /* _PATH_FINGERCONF */
-
-#endif /* PATHNAMES_H */
diff --git a/usr.bin/finger/sprint.c b/usr.bin/finger/sprint.c
deleted file mode 100644
index e4f768b..0000000
--- a/usr.bin/finger/sprint.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Tony Nardo of the Johns Hopkins University/Applied Physics Lab.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)sprint.c 8.3 (Berkeley) 4/28/95";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <db.h>
-#include <err.h>
-#include <langinfo.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <string.h>
-#include <time.h>
-#include <utmp.h>
-#include "finger.h"
-
-static void stimeprint(WHERE *);
-
-void
-sflag_print(void)
-{
- PERSON *pn;
- WHERE *w;
- int sflag, r, namelen;
- char p[80];
- PERSON *tmp;
- DBT data, key;
- struct tm *lc;
-
- if (d_first < 0)
- d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
- /*
- * short format --
- * login name
- * real name
- * terminal name (the XX of ttyXX)
- * if terminal writeable (add an '*' to the terminal name
- * if not)
- * if logged in show idle time and day logged in, else
- * show last login date and time.
- * If > 6 months, show year instead of time.
- * if (-o)
- * office location
- * office phone
- * else
- * remote host
- */
-#define MAXREALNAME 16
-#define MAXHOSTNAME 17 /* in reality, hosts are never longer than 16 */
- (void)printf("%-*s %-*s%s %s\n", UT_NAMESIZE, "Login", MAXREALNAME,
- "Name", " TTY Idle Login Time ", (gflag) ? "" :
- oflag ? "Office Phone" : "Where");
-
- for (sflag = R_FIRST;; sflag = R_NEXT) {
- r = (*db->seq)(db, &key, &data, sflag);
- if (r == -1)
- err(1, "db seq");
- if (r == 1)
- break;
- memmove(&tmp, data.data, sizeof tmp);
- pn = tmp;
-
- for (w = pn->whead; w != NULL; w = w->next) {
- namelen = MAXREALNAME;
- if (w->info == LOGGEDIN && !w->writable)
- --namelen; /* leave space before `*' */
- (void)printf("%-*.*s %-*.*s", UT_NAMESIZE, UT_NAMESIZE,
- pn->name, MAXREALNAME, namelen,
- pn->realname ? pn->realname : "");
- if (!w->loginat) {
- (void)printf(" * * No logins ");
- goto office;
- }
- (void)putchar(w->info == LOGGEDIN && !w->writable ?
- '*' : ' ');
- if (*w->tty)
- (void)printf("%-7.7s ",
- (strncmp(w->tty, "tty", 3)
- && strncmp(w->tty, "cua", 3))
- ? w->tty : w->tty + 3);
- else
- (void)printf(" ");
- if (w->info == LOGGEDIN) {
- stimeprint(w);
- (void)printf(" ");
- } else
- (void)printf(" * ");
- lc = localtime(&w->loginat);
-#define SECSPERDAY 86400
-#define DAYSPERWEEK 7
-#define DAYSPERNYEAR 365
- if (now - w->loginat < SECSPERDAY * (DAYSPERWEEK - 1)) {
- (void)strftime(p, sizeof(p), "%a", lc);
- } else {
- (void)strftime(p, sizeof(p),
- d_first ? "%e %b" : "%b %e", lc);
- }
- (void)printf("%-6.6s", p);
- if (now - w->loginat >= SECSPERDAY * DAYSPERNYEAR / 2) {
- (void)strftime(p, sizeof(p), "%Y", lc);
- } else {
- (void)strftime(p, sizeof(p), "%R", lc);
- }
- (void)printf(" %-5.5s", p);
-office:
- if (gflag)
- goto no_gecos;
- if (oflag) {
- if (pn->office)
- (void)printf(" %-7.7s", pn->office);
- else if (pn->officephone)
- (void)printf(" %-7.7s", " ");
- if (pn->officephone)
- (void)printf(" %-.9s",
- prphone(pn->officephone));
- } else
- (void)printf(" %.*s", MAXHOSTNAME, w->host);
-no_gecos:
- putchar('\n');
- }
- }
-}
-
-static void
-stimeprint(WHERE *w)
-{
- struct tm *delta;
-
- if (w->idletime == -1) {
- (void)printf(" ");
- return;
- }
-
- delta = gmtime(&w->idletime);
- if (!delta->tm_yday)
- if (!delta->tm_hour)
- if (!delta->tm_min)
- (void)printf(" ");
- else
- (void)printf("%5d", delta->tm_min);
- else
- (void)printf("%2d:%02d",
- delta->tm_hour, delta->tm_min);
- else
- (void)printf("%4dd", delta->tm_yday);
-}
diff --git a/usr.bin/finger/util.c b/usr.bin/finger/util.c
deleted file mode 100644
index a84c711..0000000
--- a/usr.bin/finger/util.c
+++ /dev/null
@@ -1,429 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Tony Nardo of the Johns Hopkins University/Applied Physics Lab.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)util.c 8.3 (Berkeley) 4/28/95";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <ctype.h>
-#include <db.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <paths.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <utmp.h>
-#include "finger.h"
-#include "pathnames.h"
-
-static void find_idle_and_ttywrite(WHERE *);
-static void userinfo(PERSON *, struct passwd *);
-static WHERE *walloc(PERSON *);
-
-int
-match(struct passwd *pw, const char *user)
-{
- char *p, *t;
- char name[1024];
-
- if (!strcasecmp(pw->pw_name, user))
- return(1);
-
- /*
- * XXX
- * Why do we skip asterisks!?!?
- */
- (void)strncpy(p = tbuf, pw->pw_gecos, sizeof(tbuf));
- tbuf[sizeof(tbuf) - 1] = '\0';
- if (*p == '*')
- ++p;
-
- /* Ampersands get replaced by the login name. */
- if ((p = strtok(p, ",")) == NULL)
- return(0);
-
- for (t = name; t < &name[sizeof(name) - 1] && (*t = *p) != '\0'; ++p) {
- if (*t == '&') {
- (void)strncpy(t, pw->pw_name,
- sizeof(name) - (t - name));
- name[sizeof(name) - 1] = '\0';
- while (t < &name[sizeof(name) - 1] && *++t)
- continue;
- } else {
- ++t;
- }
- }
- *t = '\0';
- for (t = name; (p = strtok(t, "\t ")) != NULL; t = NULL)
- if (!strcasecmp(p, user))
- return(1);
- return(0);
-}
-
-void
-enter_lastlog(PERSON *pn)
-{
- WHERE *w;
- static int opened, fd;
- struct lastlog ll;
- char doit = 0;
-
- /* some systems may not maintain lastlog, don't report errors. */
- if (!opened) {
- fd = open(_PATH_LASTLOG, O_RDONLY, 0);
- opened = 1;
- }
- if (fd == -1 ||
- lseek(fd, (long)pn->uid * sizeof(ll), SEEK_SET) !=
- (long)pn->uid * sizeof(ll) ||
- read(fd, (char *)&ll, sizeof(ll)) != sizeof(ll)) {
- /* as if never logged in */
- ll.ll_line[0] = ll.ll_host[0] = '\0';
- ll.ll_time = 0;
- }
- if ((w = pn->whead) == NULL)
- doit = 1;
- else if (ll.ll_time != 0) {
- /* if last login is earlier than some current login */
- for (; !doit && w != NULL; w = w->next)
- if (w->info == LOGGEDIN && w->loginat < ll.ll_time)
- doit = 1;
- /*
- * and if it's not any of the current logins
- * can't use time comparison because there may be a small
- * discrepancy since login calls time() twice
- */
- for (w = pn->whead; doit && w != NULL; w = w->next)
- if (w->info == LOGGEDIN &&
- strncmp(w->tty, ll.ll_line, UT_LINESIZE) == 0)
- doit = 0;
- }
- if (doit) {
- w = walloc(pn);
- w->info = LASTLOG;
- bcopy(ll.ll_line, w->tty, UT_LINESIZE);
- w->tty[UT_LINESIZE] = 0;
- bcopy(ll.ll_host, w->host, UT_HOSTSIZE);
- w->host[UT_HOSTSIZE] = 0;
- w->loginat = ll.ll_time;
- }
-}
-
-void
-enter_where(struct utmp *ut, PERSON *pn)
-{
- WHERE *w;
-
- w = walloc(pn);
- w->info = LOGGEDIN;
- bcopy(ut->ut_line, w->tty, UT_LINESIZE);
- w->tty[UT_LINESIZE] = 0;
- bcopy(ut->ut_host, w->host, UT_HOSTSIZE);
- w->host[UT_HOSTSIZE] = 0;
- w->loginat = (time_t)ut->ut_time;
- find_idle_and_ttywrite(w);
-}
-
-PERSON *
-enter_person(struct passwd *pw)
-{
- DBT data, key;
- PERSON *pn;
-
- if (db == NULL &&
- (db = dbopen(NULL, O_RDWR, 0, DB_BTREE, NULL)) == NULL)
- err(1, NULL);
-
- key.data = pw->pw_name;
- key.size = strlen(pw->pw_name);
-
- switch ((*db->get)(db, &key, &data, 0)) {
- case 0:
- memmove(&pn, data.data, sizeof pn);
- return (pn);
- default:
- case -1:
- err(1, "db get");
- /* NOTREACHED */
- case 1:
- ++entries;
- pn = palloc();
- userinfo(pn, pw);
- pn->whead = NULL;
-
- data.size = sizeof(PERSON *);
- data.data = &pn;
- if ((*db->put)(db, &key, &data, 0))
- err(1, "db put");
- return (pn);
- }
-}
-
-PERSON *
-find_person(const char *name)
-{
- struct passwd *pw;
-
- int cnt;
- DBT data, key;
- PERSON *p;
- char buf[UT_NAMESIZE + 1];
-
- if (!db)
- return(NULL);
-
- if ((pw = getpwnam(name)) && hide(pw))
- return(NULL);
-
- /* Name may be only UT_NAMESIZE long and not NUL terminated. */
- for (cnt = 0; cnt < UT_NAMESIZE && *name; ++name, ++cnt)
- buf[cnt] = *name;
- buf[cnt] = '\0';
- key.data = buf;
- key.size = cnt;
-
- if ((*db->get)(db, &key, &data, 0))
- return (NULL);
- memmove(&p, data.data, sizeof p);
- return (p);
-}
-
-PERSON *
-palloc(void)
-{
- PERSON *p;
-
- if ((p = malloc(sizeof(PERSON))) == NULL)
- err(1, NULL);
- return(p);
-}
-
-static WHERE *
-walloc(PERSON *pn)
-{
- WHERE *w;
-
- if ((w = malloc(sizeof(WHERE))) == NULL)
- err(1, NULL);
- if (pn->whead == NULL)
- pn->whead = pn->wtail = w;
- else {
- pn->wtail->next = w;
- pn->wtail = w;
- }
- w->next = NULL;
- return(w);
-}
-
-char *
-prphone(char *num)
-{
- char *p;
- int len;
- static char pbuf[20];
-
- /* don't touch anything if the user has their own formatting */
- for (p = num; *p; ++p)
- if (!isdigit(*p))
- return(num);
- len = p - num;
- p = pbuf;
- switch(len) {
- case 11: /* +0-123-456-7890 */
- *p++ = '+';
- *p++ = *num++;
- *p++ = '-';
- /* FALLTHROUGH */
- case 10: /* 012-345-6789 */
- *p++ = *num++;
- *p++ = *num++;
- *p++ = *num++;
- *p++ = '-';
- /* FALLTHROUGH */
- case 7: /* 012-3456 */
- *p++ = *num++;
- *p++ = *num++;
- *p++ = *num++;
- break;
- case 5: /* x0-1234 */
- case 4: /* x1234 */
- *p++ = 'x';
- *p++ = *num++;
- break;
- default:
- return(num);
- }
- if (len != 4) {
- *p++ = '-';
- *p++ = *num++;
- }
- *p++ = *num++;
- *p++ = *num++;
- *p++ = *num++;
- *p = '\0';
- return(pbuf);
-}
-
-static void
-find_idle_and_ttywrite(WHERE *w)
-{
- struct stat sb;
- time_t touched;
- int error;
-
- (void)snprintf(tbuf, sizeof(tbuf), "%s/%s", _PATH_DEV, w->tty);
-
- error = stat(tbuf, &sb);
- if (error < 0 && errno == ENOENT) {
- /*
- * The terminal listed is not actually a terminal (i.e.,
- * ":0"). This is a failure, so we'll skip printing
- * out the idle time, which is non-ideal but better
- * than a bogus warning and idle time.
- */
- w->idletime = -1;
- return;
- } else if (error < 0) {
- warn("%s", tbuf);
- w->idletime = -1;
- return;
- }
- touched = sb.st_atime;
- if (touched < w->loginat) {
- /* tty untouched since before login */
- touched = w->loginat;
- }
- w->idletime = now < touched ? 0 : now - touched;
-
-#define TALKABLE 0220 /* tty is writable if 220 mode */
- w->writable = ((sb.st_mode & TALKABLE) == TALKABLE);
-}
-
-static void
-userinfo(PERSON *pn, struct passwd *pw)
-{
- char *p, *t;
- char *bp, name[1024];
- struct stat sb;
-
- pn->realname = pn->office = pn->officephone = pn->homephone = NULL;
-
- pn->uid = pw->pw_uid;
- if ((pn->name = strdup(pw->pw_name)) == NULL)
- err(1, "strdup failed");
- if ((pn->dir = strdup(pw->pw_dir)) == NULL)
- err(1, "strdup failed");
- if ((pn->shell = strdup(pw->pw_shell)) == NULL)
- err(1, "strdup failed");
-
- /* why do we skip asterisks!?!? */
- (void)strncpy(bp = tbuf, pw->pw_gecos, sizeof(tbuf));
- tbuf[sizeof(tbuf) - 1] = '\0';
- if (*bp == '*')
- ++bp;
-
- /* ampersands get replaced by the login name */
- if (!(p = strsep(&bp, ",")))
- return;
- for (t = name; t < &name[sizeof(name) - 1] && (*t = *p) != '\0'; ++p) {
- if (*t == '&') {
- (void)strncpy(t, pw->pw_name,
- sizeof(name) - (t - name));
- name[sizeof(name) - 1] = '\0';
- if (islower(*t))
- *t = toupper(*t);
- while (t < &name[sizeof(name) - 1] && *++t)
- continue;
- } else {
- ++t;
- }
- }
- *t = '\0';
- if ((pn->realname = strdup(name)) == NULL)
- err(1, "strdup failed");
- pn->office = ((p = strsep(&bp, ",")) && *p) ?
- strdup(p) : NULL;
- pn->officephone = ((p = strsep(&bp, ",")) && *p) ?
- strdup(p) : NULL;
- pn->homephone = ((p = strsep(&bp, ",")) && *p) ?
- strdup(p) : NULL;
- (void)snprintf(tbuf, sizeof(tbuf), "%s/%s", _PATH_MAILDIR, pw->pw_name);
- pn->mailrecv = -1; /* -1 == not_valid */
- if (stat(tbuf, &sb) < 0) {
- if (errno != ENOENT) {
- warn("%s", tbuf);
- return;
- }
- } else if (sb.st_size != 0) {
- pn->mailrecv = sb.st_mtime;
- pn->mailread = sb.st_atime;
- }
-}
-
-/*
- * Is this user hiding from finger?
- * If ~<user>/.nofinger exists, return 1 (hide), else return 0 (nohide).
- * Nobody can hide from root.
- */
-
-int
-hide(struct passwd *pw)
-{
- struct stat st;
- char buf[MAXPATHLEN];
-
- if (invoker_root || !pw->pw_dir)
- return 0;
-
- snprintf(buf, sizeof(buf), "%s/%s", pw->pw_dir, _PATH_NOFINGER);
-
- if (stat(buf, &st) == 0)
- return 1;
-
- return 0;
-}
diff --git a/usr.bin/fmt/Makefile b/usr.bin/fmt/Makefile
deleted file mode 100644
index b15d254..0000000
--- a/usr.bin/fmt/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= fmt
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/fmt/fmt.1 b/usr.bin/fmt/fmt.1
deleted file mode 100644
index 162bcab..0000000
--- a/usr.bin/fmt/fmt.1
+++ /dev/null
@@ -1,196 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)fmt.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.\" Modified by Gareth McCaughan to describe the new version of `fmt'
-.\" rather than the old one.
-.Dd August 2, 2004
-.Dt FMT 1
-.Os
-.Sh NAME
-.Nm fmt
-.Nd simple text formatter
-.Sh SYNOPSIS
-.Nm fmt
-.Op Fl cmnps
-.Op Fl d Ar chars
-.Op Fl l Ar num
-.Op Fl t Ar num
-.Op Ar goal Oo Ar maximum Oc | Fl Ns Ar width | Fl w Ar width
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility is a simple text formatter which reads the concatenation of input
-files (or standard input if none are given) and produces on standard
-output a version of its input with lines as close to the
-.Ar goal
-length
-as possible without exceeding the
-.Ar maximum .
-The
-.Ar goal
-length defaults
-to 65 and the
-.Ar maximum
-to 10 more than the
-.Ar goal
-length.
-Alternatively, a single
-.Ar width
-parameter can be specified either by prepending a hyphen to it or by using
-.Fl w .
-For example,
-.Dq Li fmt -w 72 ,
-.Dq Li fmt -72 ,
-and
-.Dq Li fmt 72 72
-all produce identical output.
-The spacing at the beginning of the input lines is preserved in the output,
-as are blank lines and interword spacing.
-Lines are joined or split only at white space; that is, words are never
-joined or hyphenated.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl c
-Center the text, line by line.
-In this case, most of the other
-options are ignored; no splitting or joining of lines is done.
-.It Fl m
-Try to format mail header lines contained in the input sensibly.
-.It Fl n
-Format lines beginning with a
-.Ql \&.
-(dot) character.
-Normally,
-.Nm
-does not fill these lines, for compatibility with
-.Xr nroff 1 .
-.It Fl p
-Allow indented paragraphs.
-Without the
-.Fl p
-flag, any change in the amount of whitespace at the start of a line
-results in a new paragraph being begun.
-.It Fl s
-Collapse whitespace inside lines, so that multiple whitespace
-characters are turned into a single space.
-(Or, at the end of a
-sentence, a double space.)
-.It Fl d Ar chars
-Treat the
-.Ar chars
-(and no others) as sentence-ending characters.
-By default the
-sentence-ending characters are full stop
-.Pq Ql \&. ,
-question mark
-.Pq Ql \&?
-and exclamation mark
-.Pq Ql \&! .
-Remember that some characters may need to be
-escaped to protect them from your shell.
-.It Fl l Ar number
-Replace multiple spaces with tabs at the start of each output
-line, if possible.
-Each
-.Ar number
-spaces will be replaced with one tab.
-The default is 8.
-If
-.Ar number
-is 0, spaces are preserved.
-.It Fl t Ar number
-Assume that the input files' tabs assume
-.Ar number
-spaces per tab stop.
-The default is 8.
-.El
-.Pp
-The
-.Nm
-utility
-is meant to format mail messages prior to sending, but may also be useful
-for other simple tasks.
-For instance,
-within visual mode of the
-.Xr ex 1
-editor (e.g.,
-.Xr vi 1 )
-the command
-.Pp
-.Dl \&!}fmt
-.Pp
-will reformat a paragraph,
-evening the lines.
-.Sh ENVIRONMENT
-The
-.Ev LANG , LC_ALL
-and
-.Ev LC_CTYPE
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Sh SEE ALSO
-.Xr fold 1 ,
-.Xr mail 1 ,
-.Xr nroff 1
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3 .
-.Pp
-The version described herein is a complete rewrite and appeared in
-.Fx 4.4 .
-.Sh AUTHORS
-.An Kurt Shoens
-.An Liz Allen
-(added
-.Ar goal
-length concept)
-.An Gareth McCaughan
-.Sh BUGS
-The program was designed to be simple and fast \- for more complex
-operations, the standard text processors are likely to be more appropriate.
-.Pp
-When the first line of an indented paragraph is very long (more than
-about twice the goal length), the indentation in the output can be
-wrong.
-.Pp
-The
-.Nm
-utility is not infallible in guessing what lines are mail headers and what
-lines are not.
diff --git a/usr.bin/fmt/fmt.c b/usr.bin/fmt/fmt.c
deleted file mode 100644
index ed85c2e..0000000
--- a/usr.bin/fmt/fmt.c
+++ /dev/null
@@ -1,670 +0,0 @@
-/* $OpenBSD: fmt.c,v 1.16 2000/06/25 15:35:42 pjanzen Exp $ */
-
-/* Sensible version of fmt
- *
- * Syntax: fmt [ options ] [ goal [ max ] ] [ filename ... ]
- *
- * Since the documentation for the original fmt is so poor, here
- * is an accurate description of what this one does. It's usually
- * the same. The *mechanism* used may differ from that suggested
- * here. Note that we are *not* entirely compatible with fmt,
- * because fmt gets so many things wrong.
- *
- * 1. Tabs are expanded, assuming 8-space tab stops.
- * If the `-t <n>' option is given, we assume <n>-space
- * tab stops instead.
- * Trailing blanks are removed from all lines.
- * x\b == nothing, for any x other than \b.
- * Other control characters are simply stripped. This
- * includes \r.
- * 2. Each line is split into leading whitespace and
- * everything else. Maximal consecutive sequences of
- * lines with the same leading whitespace are considered
- * to form paragraphs, except that a blank line is always
- * a paragraph to itself.
- * If the `-p' option is given then the first line of a
- * paragraph is permitted to have indentation different
- * from that of the other lines.
- * If the `-m' option is given then a line that looks
- * like a mail message header, if it is not immediately
- * preceded by a non-blank non-message-header line, is
- * taken to start a new paragraph, which also contains
- * any subsequent lines with non-empty leading whitespace.
- * Unless the `-n' option is given, lines beginning with
- * a . (dot) are not formatted.
- * 3. The "everything else" is split into words; a word
- * includes its trailing whitespace, and a word at the
- * end of a line is deemed to be followed by a single
- * space, or two spaces if it ends with a sentence-end
- * character. (See the `-d' option for how to change that.)
- * If the `-s' option has been given, then a word's trailing
- * whitespace is replaced by what it would have had if it
- * had occurred at end of line.
- * 4. Each paragraph is sent to standard output as follows.
- * We output the leading whitespace, and then enough words
- * to make the line length as near as possible to the goal
- * without exceeding the maximum. (If a single word would
- * exceed the maximum, we output that anyway.) Of course
- * the trailing whitespace of the last word is ignored.
- * We then emit a newline and start again if there are any
- * words left.
- * Note that for a blank line this translates as "We emit
- * a newline".
- * If the `-l <n>' option is given, then leading whitespace
- * is modified slightly: <n> spaces are replaced by a tab.
- * Indented paragraphs (see above under `-p') make matters
- * more complicated than this suggests. Actually every paragraph
- * has two `leading whitespace' values; the value for the first
- * line, and the value for the most recent line. (While processing
- * the first line, the two are equal. When `-p' has not been
- * given, they are always equal.) The leading whitespace
- * actually output is that of the first line (for the first
- * line of *output*) or that of the most recent line (for
- * all other lines of output).
- * When `-m' has been given, message header paragraphs are
- * taken as having first-leading-whitespace empty and
- * subsequent-leading-whitespace two spaces.
- *
- * Multiple input files are formatted one at a time, so that a file
- * never ends in the middle of a line.
- *
- * There's an alternative mode of operation, invoked by giving
- * the `-c' option. In that case we just center every line,
- * and most of the other options are ignored. This should
- * really be in a separate program, but we must stay compatible
- * with old `fmt'.
- *
- * QUERY: Should `-m' also try to do the right thing with quoted text?
- * QUERY: `-b' to treat backslashed whitespace as old `fmt' does?
- * QUERY: Option meaning `never join lines'?
- * QUERY: Option meaning `split in mid-word to avoid overlong lines'?
- * (Those last two might not be useful, since we have `fold'.)
- *
- * Differences from old `fmt':
- *
- * - We have many more options. Options that aren't understood
- * generate a lengthy usage message, rather than being
- * treated as filenames.
- * - Even with `-m', our handling of message headers is
- * significantly different. (And much better.)
- * - We don't treat `\ ' as non-word-breaking.
- * - Downward changes of indentation start new paragraphs
- * for us, as well as upward. (I think old `fmt' behaves
- * in the way it does in order to allow indented paragraphs,
- * but this is a broken way of making indented paragraphs
- * behave right.)
- * - Given the choice of going over or under |goal_length|
- * by the same amount, we go over; old `fmt' goes under.
- * - We treat `?' as ending a sentence, and not `:'. Old `fmt'
- * does the reverse.
- * - We return approved return codes. Old `fmt' returns
- * 1 for some errors, and *the number of unopenable files*
- * when that was all that went wrong.
- * - We have fewer crashes and more helpful error messages.
- * - We don't turn spaces into tabs at starts of lines unless
- * specifically requested.
- * - New `fmt' is somewhat smaller and slightly faster than
- * old `fmt'.
- *
- * Bugs:
- *
- * None known. There probably are some, though.
- *
- * Portability:
- *
- * I believe this code to be pretty portable. It does require
- * that you have `getopt'. If you need to include "getopt.h"
- * for this (e.g., if your system didn't come with `getopt'
- * and you installed it yourself) then you should arrange for
- * NEED_getopt_h to be #defined.
- *
- * Everything here should work OK even on nasty 16-bit
- * machines and nice 64-bit ones. However, it's only really
- * been tested on my FreeBSD machine. Your mileage may vary.
- */
-
-/* Copyright (c) 1997 Gareth McCaughan. All rights reserved.
- *
- * Redistribution and use of this code, in source or binary forms,
- * with or without modification, are permitted subject to the following
- * conditions:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - If you distribute modified source code it must also include
- * a notice saying that it has been modified, and giving a brief
- * description of what changes have been made.
- *
- * Disclaimer: I am not responsible for the results of using this code.
- * If it formats your hard disc, sends obscene messages to
- * your boss and kills your children then that's your problem
- * not mine. I give absolutely no warranty of any sort as to
- * what the program will do, and absolutely refuse to be held
- * liable for any consequences of your using it.
- * Thank you. Have a nice day.
- */
-
-/* RCS change log:
- * Revision 1.5 1998/03/02 18:02:21 gjm11
- * Minor changes for portability.
- *
- * Revision 1.4 1997/10/01 11:51:28 gjm11
- * Repair broken indented-paragraph handling.
- * Add mail message header stuff.
- * Improve comments and layout.
- * Make usable with non-BSD systems.
- * Add revision display to usage message.
- *
- * Revision 1.3 1997/09/30 16:24:47 gjm11
- * Add copyright notice, rcsid string and log message.
- *
- * Revision 1.2 1997/09/30 16:13:39 gjm11
- * Add options: -d <chars>, -l <width>, -p, -s, -t <width>, -h .
- * Parse options with `getopt'. Clean up code generally.
- * Make comments more accurate.
- *
- * Revision 1.1 1997/09/30 11:29:57 gjm11
- * Initial revision
- */
-
-#ifndef lint
-static const char copyright[] =
- "Copyright (c) 1997 Gareth McCaughan. All rights reserved.\n";
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <limits.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysexits.h>
-#include <unistd.h>
-#include <wchar.h>
-#include <wctype.h>
-
-/* Something that, we hope, will never be a genuine line length,
- * indentation etc.
- */
-#define SILLY ((size_t)-1)
-
-/* I used to use |strtoul| for this, but (1) not all systems have it
- * and (2) it's probably better to use |strtol| to detect negative
- * numbers better.
- * If |fussyp==0| then we don't complain about non-numbers
- * (returning 0 instead), but we do complain about bad numbers.
- */
-static size_t
-get_positive(const char *s, const char *err_mess, int fussyP) {
- char *t;
- long result = strtol(s,&t,0);
- if (*t) { if (fussyP) goto Lose; else return 0; }
- if (result<=0) { Lose: errx(EX_USAGE, "%s", err_mess); }
- return (size_t) result;
-}
-
-static size_t
-get_nonnegative(const char *s, const char *err_mess, int fussyP) {
- char *t;
- long result = strtol(s,&t,0);
- if (*t) { if (fussyP) goto Lose; else return 0; }
- if (result<0) { Lose: errx(EX_USAGE, "%s", err_mess); }
- return (size_t) result;
-}
-
-/* Global variables */
-
-static int centerP=0; /* Try to center lines? */
-static size_t goal_length=0; /* Target length for output lines */
-static size_t max_length=0; /* Maximum length for output lines */
-static int coalesce_spaces_P=0; /* Coalesce multiple whitespace -> ' ' ? */
-static int allow_indented_paragraphs=0; /* Can first line have diff. ind.? */
-static int tab_width=8; /* Number of spaces per tab stop */
-static size_t output_tab_width=8; /* Ditto, when squashing leading spaces */
-static const wchar_t *sentence_enders=L".?!"; /* Double-space after these */
-static int grok_mail_headers=0; /* treat embedded mail headers magically? */
-static int format_troff=0; /* Format troff? */
-
-static int n_errors=0; /* Number of failed files. Return on exit. */
-static wchar_t *output_buffer=0; /* Output line will be built here */
-static size_t x; /* Horizontal position in output line */
-static size_t x0; /* Ditto, ignoring leading whitespace */
-static size_t output_buffer_length = 0;
-static size_t pending_spaces; /* Spaces to add before next word */
-static int output_in_paragraph=0; /* Any of current para written out yet? */
-
-/* Prototypes */
-
-static void process_named_file (const char *);
-static void process_stream (FILE *, const char *);
-static size_t indent_length (const wchar_t *, size_t);
-static int might_be_header (const wchar_t *);
-static void new_paragraph (size_t, size_t);
-static void output_word (size_t, size_t, const wchar_t *, size_t,
- size_t);
-static void output_indent (size_t);
-static void center_stream (FILE *, const char *);
-static wchar_t * get_line (FILE *, size_t *);
-static void * xrealloc (void *, size_t);
-
-#define XMALLOC(x) xrealloc(0,x)
-
-/* Here is perhaps the right place to mention that this code is
- * all in top-down order. Hence, |main| comes first.
- */
-int
-main(int argc, char *argv[]) {
- int ch; /* used for |getopt| processing */
- wchar_t *tmp;
- size_t len;
- const char *src;
-
- (void) setlocale(LC_CTYPE, "");
-
- /* 1. Grok parameters. */
-
- while ((ch = getopt(argc, argv, "0123456789cd:hl:mnpst:w:")) != -1)
- switch(ch) {
- case 'c':
- centerP = 1;
- format_troff = 1;
- continue;
- case 'd':
- src = optarg;
- len = mbsrtowcs(NULL, &src, 0, NULL);
- if (len == (size_t)-1)
- err(EX_USAGE, "bad sentence-ending character set");
- tmp = XMALLOC((len + 1) * sizeof(wchar_t));
- mbsrtowcs(tmp, &src, len + 1, NULL);
- sentence_enders = tmp;
- continue;
- case 'l':
- output_tab_width
- = get_nonnegative(optarg, "output tab width must be non-negative", 1);
- continue;
- case 'm':
- grok_mail_headers = 1;
- continue;
- case 'n':
- format_troff = 1;
- continue;
- case 'p':
- allow_indented_paragraphs = 1;
- continue;
- case 's':
- coalesce_spaces_P = 1;
- continue;
- case 't':
- tab_width = get_positive(optarg, "tab width must be positive", 1);
- continue;
- case 'w':
- goal_length = get_positive(optarg, "width must be positive", 1);
- max_length = goal_length;
- continue;
- case '0': case '1': case '2': case '3': case '4': case '5':
- case '6': case '7': case '8': case '9':
- /* XXX this is not a stylistically approved use of getopt() */
- if (goal_length==0) {
- char *p;
- p = argv[optind - 1];
- if (p[0] == '-' && p[1] == ch && !p[2])
- goal_length = get_positive(++p, "width must be nonzero", 1);
- else
- goal_length = get_positive(argv[optind]+1,
- "width must be nonzero", 1);
- max_length = goal_length;
- }
- continue;
- case 'h': default:
- fprintf(stderr,
-"usage: fmt [-cmps] [-d chars] [-l num] [-t num]\n"
-" [-w width | -width | goal [maximum]] [file ...]\n"
-"Options: -c center each line instead of formatting\n"
-" -d <chars> double-space after <chars> at line end\n"
-" -l <n> turn each <n> spaces at start of line into a tab\n"
-" -m try to make sure mail header lines stay separate\n"
-" -n format lines beginning with a dot\n"
-" -p allow indented paragraphs\n"
-" -s coalesce whitespace inside lines\n"
-" -t <n> have tabs every <n> columns\n"
-" -w <n> set maximum width to <n>\n"
-" goal set target width to goal\n");
- exit(ch=='h' ? 0 : EX_USAGE);
- }
- argc -= optind; argv += optind;
-
- /* [ goal [ maximum ] ] */
-
- if (argc>0 && goal_length==0
- && (goal_length=get_positive(*argv,"goal length must be positive", 0))
- != 0) {
- --argc; ++argv;
- if (argc>0
- && (max_length=get_positive(*argv,"max length must be positive", 0))
- != 0) {
- --argc; ++argv;
- if (max_length<goal_length)
- errx(EX_USAGE, "max length must be >= goal length");
- }
- }
- if (goal_length==0) goal_length = 65;
- if (max_length==0) max_length = goal_length+10;
- if (max_length >= SIZE_T_MAX / sizeof (wchar_t)) errx(EX_USAGE, "max length too large");
- /* really needn't be longer */
- output_buffer = XMALLOC((max_length+1) * sizeof(wchar_t));
-
- /* 2. Process files. */
-
- if (argc>0) {
- while (argc-->0) process_named_file(*argv++);
- }
- else {
- process_stream(stdin, "standard input");
- }
-
- /* We're done. */
-
- return n_errors ? EX_NOINPUT : 0;
-
-}
-
-/* Process a single file, given its name.
- */
-static void
-process_named_file(const char *name) {
- FILE *f=fopen(name, "r");
- if (!f) { warn("%s", name); ++n_errors; }
- else {
- process_stream(f, name);
- if (ferror(f)) { warn("%s", name); ++n_errors; }
- fclose(f);
- }
-}
-
-/* Types of mail header continuation lines:
- */
-typedef enum {
- hdr_ParagraphStart = -1,
- hdr_NonHeader = 0,
- hdr_Header = 1,
- hdr_Continuation = 2
-} HdrType;
-
-/* Process a stream. This is where the real work happens,
- * except that centering is handled separately.
- */
-static void
-process_stream(FILE *stream, const char *name) {
- size_t last_indent=SILLY; /* how many spaces in last indent? */
- size_t para_line_number=0; /* how many lines already read in this para? */
- size_t first_indent=SILLY; /* indentation of line 0 of paragraph */
- HdrType prev_header_type=hdr_ParagraphStart;
- /* ^-- header_type of previous line; -1 at para start */
- wchar_t *line;
- size_t length;
-
- if (centerP) { center_stream(stream, name); return; }
- while ((line=get_line(stream,&length)) != NULL) {
- size_t np=indent_length(line, length);
- { HdrType header_type=hdr_NonHeader;
- if (grok_mail_headers && prev_header_type!=hdr_NonHeader) {
- if (np==0 && might_be_header(line))
- header_type = hdr_Header;
- else if (np>0 && prev_header_type>hdr_NonHeader)
- header_type = hdr_Continuation;
- }
- /* We need a new paragraph if and only if:
- * this line is blank,
- * OR it's a troff request (and we don't format troff),
- * OR it's a mail header,
- * OR it's not a mail header AND the last line was one,
- * OR the indentation has changed
- * AND the line isn't a mail header continuation line
- * AND this isn't the second line of an indented paragraph.
- */
- if ( length==0
- || (line[0]=='.' && !format_troff)
- || header_type==hdr_Header
- || (header_type==hdr_NonHeader && prev_header_type>hdr_NonHeader)
- || (np!=last_indent
- && header_type != hdr_Continuation
- && (!allow_indented_paragraphs || para_line_number != 1)) ) {
- new_paragraph(output_in_paragraph ? last_indent : first_indent, np);
- para_line_number = 0;
- first_indent = np;
- last_indent = np;
- if (header_type==hdr_Header) last_indent=2; /* for cont. lines */
- if (length==0 || (line[0]=='.' && !format_troff)) {
- if (length==0)
- putwchar('\n');
- else
- wprintf(L"%.*ls\n", (int)length, line);
- prev_header_type=hdr_ParagraphStart;
- continue;
- }
- }
- else {
- /* If this is an indented paragraph other than a mail header
- * continuation, set |last_indent|.
- */
- if (np != last_indent && header_type != hdr_Continuation)
- last_indent=np;
- }
- prev_header_type = header_type;
- }
-
- { size_t n=np;
- while (n<length) {
- /* Find word end and count spaces after it */
- size_t word_length=0, space_length=0;
- while (n+word_length < length && line[n+word_length] != ' ')
- ++word_length;
- space_length = word_length;
- while (n+space_length < length && line[n+space_length] == ' ')
- ++space_length;
- /* Send the word to the output machinery. */
- output_word(first_indent, last_indent,
- line+n, word_length, space_length-word_length);
- n += space_length;
- }
- }
- ++para_line_number;
- }
- new_paragraph(output_in_paragraph ? last_indent : first_indent, 0);
- if (ferror(stream)) { warn("%s", name); ++n_errors; }
-}
-
-/* How long is the indent on this line?
- */
-static size_t
-indent_length(const wchar_t *line, size_t length) {
- size_t n=0;
- while (n<length && *line++ == ' ') ++n;
- return n;
-}
-
-/* Might this line be a mail header?
- * We deem a line to be a possible header if it matches the
- * Perl regexp /^[A-Z][-A-Za-z0-9]*:\s/. This is *not* the same
- * as in RFC whatever-number-it-is; we want to be gratuitously
- * conservative to avoid mangling ordinary civilised text.
- */
-static int
-might_be_header(const wchar_t *line) {
- if (!iswupper(*line++)) return 0;
- while (*line && (iswalnum(*line) || *line=='-')) ++line;
- return (*line==':' && iswspace(line[1]));
-}
-
-/* Begin a new paragraph with an indent of |indent| spaces.
- */
-static void
-new_paragraph(size_t old_indent, size_t indent) {
- if (output_buffer_length) {
- if (old_indent>0) output_indent(old_indent);
- wprintf(L"%.*ls\n", (int)output_buffer_length, output_buffer);
- }
- x=indent; x0=0; output_buffer_length=0; pending_spaces=0;
- output_in_paragraph = 0;
-}
-
-/* Output spaces or tabs for leading indentation.
- */
-static void
-output_indent(size_t n_spaces) {
- if (output_tab_width) {
- while (n_spaces >= output_tab_width) {
- putwchar('\t');
- n_spaces -= output_tab_width;
- }
- }
- while (n_spaces-- > 0) putwchar(' ');
-}
-
-/* Output a single word, or add it to the buffer.
- * indent0 and indent1 are the indents to use on the first and subsequent
- * lines of a paragraph. They'll often be the same, of course.
- */
-static void
-output_word(size_t indent0, size_t indent1, const wchar_t *word, size_t length, size_t spaces) {
- size_t new_x;
- size_t indent = output_in_paragraph ? indent1 : indent0;
- size_t width;
- const wchar_t *p;
- int cwidth;
-
- for (p = word, width = 0; p < &word[length]; p++)
- width += (cwidth = wcwidth(*p)) > 0 ? cwidth : 1;
-
- new_x = x + pending_spaces + width;
-
- /* If either |spaces==0| (at end of line) or |coalesce_spaces_P|
- * (squashing internal whitespace), then add just one space;
- * except that if the last character was a sentence-ender we
- * actually add two spaces.
- */
- if (coalesce_spaces_P || spaces==0)
- spaces = wcschr(sentence_enders, word[length-1]) ? 2 : 1;
-
- if (new_x<=goal_length) {
- /* After adding the word we still aren't at the goal length,
- * so clearly we add it to the buffer rather than outputing it.
- */
- wmemset(output_buffer+output_buffer_length, L' ', pending_spaces);
- x0 += pending_spaces; x += pending_spaces;
- output_buffer_length += pending_spaces;
- wmemcpy(output_buffer+output_buffer_length, word, length);
- x0 += width; x += width; output_buffer_length += length;
- pending_spaces = spaces;
- }
- else {
- /* Adding the word takes us past the goal. Print the line-so-far,
- * and the word too iff either (1) the lsf is empty or (2) that
- * makes us nearer the goal but doesn't take us over the limit,
- * or (3) the word on its own takes us over the limit.
- * In case (3) we put a newline in between.
- */
- if (indent>0) output_indent(indent);
- wprintf(L"%.*ls", (int)output_buffer_length, output_buffer);
- if (x0==0 || (new_x <= max_length && new_x-goal_length <= goal_length-x)) {
- wprintf(L"%*ls", (int)pending_spaces, L"");
- goto write_out_word;
- }
- else {
- /* If the word takes us over the limit on its own, just
- * spit it out and don't bother buffering it.
- */
- if (indent+width > max_length) {
- putwchar('\n');
- if (indent>0) output_indent(indent);
-write_out_word:
- wprintf(L"%.*ls", (int)length, word);
- x0 = 0; x = indent1; pending_spaces = 0;
- output_buffer_length = 0;
- }
- else {
- wmemcpy(output_buffer, word, length);
- x0 = width; x = width+indent1; pending_spaces = spaces;
- output_buffer_length = length;
- }
- }
- putwchar('\n');
- output_in_paragraph = 1;
- }
-}
-
-/* Process a stream, but just center its lines rather than trying to
- * format them neatly.
- */
-static void
-center_stream(FILE *stream, const char *name) {
- wchar_t *line, *p;
- size_t length;
- size_t width;
- int cwidth;
- while ((line=get_line(stream, &length)) != 0) {
- size_t l=length;
- while (l>0 && iswspace(*line)) { ++line; --l; }
- length=l;
- for (p = line, width = 0; p < &line[length]; p++)
- width += (cwidth = wcwidth(*p)) > 0 ? cwidth : 1;
- l = width;
- while (l<goal_length) { putwchar(' '); l+=2; }
- wprintf(L"%.*ls\n", (int)length, line);
- }
- if (ferror(stream)) { warn("%s", name); ++n_errors; }
-}
-
-/* Get a single line from a stream. Expand tabs, strip control
- * characters and trailing whitespace, and handle backspaces.
- * Return the address of the buffer containing the line, and
- * put the length of the line in |lengthp|.
- * This can cope with arbitrarily long lines, and with lines
- * without terminating \n.
- * If there are no characters left or an error happens, we
- * return 0.
- * Don't confuse |spaces_pending| here with the global
- * |pending_spaces|.
- */
-static wchar_t *
-get_line(FILE *stream, size_t *lengthp) {
- static wchar_t *buf=NULL;
- static size_t length=0;
- size_t len=0;
- wint_t ch;
- size_t spaces_pending=0;
- int troff=0;
- size_t col=0;
- int cwidth;
-
- if (buf==NULL) { length=100; buf=XMALLOC(length * sizeof(wchar_t)); }
- while ((ch=getwc(stream)) != '\n' && ch != WEOF) {
- if (len+spaces_pending==0 && ch=='.' && !format_troff) troff=1;
- if (ch==' ') ++spaces_pending;
- else if (troff || iswprint(ch)) {
- while (len+spaces_pending >= length) {
- length*=2; buf=xrealloc(buf, length * sizeof(wchar_t));
- }
- while (spaces_pending > 0) { --spaces_pending; buf[len++]=' '; col++; }
- buf[len++] = ch;
- col += (cwidth = wcwidth(ch)) > 0 ? cwidth : 1;
- }
- else if (ch=='\t')
- spaces_pending += tab_width - (col+spaces_pending)%tab_width;
- else if (ch=='\b') { if (len) --len; if (col) --col; }
- }
- *lengthp=len;
- return (len>0 || ch!=WEOF) ? buf : 0;
-}
-
-/* (Re)allocate some memory, exiting with an error if we can't.
- */
-static void *
-xrealloc(void *ptr, size_t nbytes) {
- void *p = realloc(ptr, nbytes);
- if (p == NULL) errx(EX_OSERR, "out of memory");
- return p;
-}
diff --git a/usr.bin/fold/Makefile b/usr.bin/fold/Makefile
deleted file mode 100644
index d73d0a7..0000000
--- a/usr.bin/fold/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= fold
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/fold/fold.1 b/usr.bin/fold/fold.1
deleted file mode 100644
index 7cc0129..0000000
--- a/usr.bin/fold/fold.1
+++ /dev/null
@@ -1,94 +0,0 @@
-.\" Copyright (c) 1980, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)fold.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd December 15, 2006
-.Dt FOLD 1
-.Os
-.Sh NAME
-.Nm fold
-.Nd "fold long lines for finite width output device"
-.Sh SYNOPSIS
-.Nm
-.Op Fl bs
-.Op Fl w Ar width
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility is a filter which folds the contents of the specified files,
-or the standard input if no files are specified,
-breaking the lines to have a maximum of 80 columns.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl b
-Count
-.Ar width
-in bytes rather than column positions.
-.It Fl s
-Fold line after the last blank character within the first
-.Ar width
-column positions (or bytes).
-.It Fl w Ar width
-Specify a line width to use instead of the default 80 columns.
-The
-.Ar width
-value
-should be a multiple of 8 if tabs are present, or the tabs should
-be expanded using
-.Xr expand 1
-before using
-.Nm .
-.El
-.Sh ENVIRONMENT
-The
-.Ev LANG , LC_ALL
-and
-.Ev LC_CTYPE
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Sh SEE ALSO
-.Xr expand 1 ,
-.Xr fmt 1
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-.Sh BUGS
-If underlining (see
-.Xr ul 1 )
-is present it may be messed up by folding.
diff --git a/usr.bin/fold/fold.c b/usr.bin/fold/fold.c
deleted file mode 100644
index 59d8fc5..0000000
--- a/usr.bin/fold/fold.c
+++ /dev/null
@@ -1,223 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Kevin Ruddy.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1990, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)fold.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <limits.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-#include <wctype.h>
-
-#define DEFLINEWIDTH 80
-
-void fold(int);
-static int newpos(int, wint_t);
-static void usage(void);
-
-int bflag; /* Count bytes, not columns */
-int sflag; /* Split on word boundaries */
-
-int
-main(int argc, char **argv)
-{
- int ch;
- int rval, width;
- char *p;
-
- (void) setlocale(LC_CTYPE, "");
-
- width = -1;
- while ((ch = getopt(argc, argv, "0123456789bsw:")) != -1)
- switch (ch) {
- case 'b':
- bflag = 1;
- break;
- case 's':
- sflag = 1;
- break;
- case 'w':
- if ((width = atoi(optarg)) <= 0) {
- errx(1, "illegal width value");
- }
- break;
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- if (width == -1) {
- p = argv[optind - 1];
- if (p[0] == '-' && p[1] == ch && !p[2])
- width = atoi(++p);
- else
- width = atoi(argv[optind] + 1);
- }
- break;
- default:
- usage();
- }
- argv += optind;
- argc -= optind;
-
- if (width == -1)
- width = DEFLINEWIDTH;
- rval = 0;
- if (!*argv)
- fold(width);
- else for (; *argv; ++argv)
- if (!freopen(*argv, "r", stdin)) {
- warn("%s", *argv);
- rval = 1;
- } else
- fold(width);
- exit(rval);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "usage: fold [-bs] [-w width] [file ...]\n");
- exit(1);
-}
-
-/*
- * Fold the contents of standard input to fit within WIDTH columns (or bytes)
- * and write to standard output.
- *
- * If sflag is set, split the line at the last space character on the line.
- * This flag necessitates storing the line in a buffer until the current
- * column > width, or a newline or EOF is read.
- *
- * The buffer can grow larger than WIDTH due to backspaces and carriage
- * returns embedded in the input stream.
- */
-void
-fold(int width)
-{
- static wchar_t *buf;
- static int buf_max;
- int col, i, indx, space;
- wint_t ch;
-
- col = indx = 0;
- while ((ch = getwchar()) != WEOF) {
- if (ch == '\n') {
- wprintf(L"%.*ls\n", indx, buf);
- col = indx = 0;
- continue;
- }
- if ((col = newpos(col, ch)) > width) {
- if (sflag) {
- i = indx;
- while (--i >= 0 && !iswblank(buf[i]))
- ;
- space = i;
- }
- if (sflag && space != -1) {
- space++;
- wprintf(L"%.*ls\n", space, buf);
- wmemmove(buf, buf + space, indx - space);
- indx -= space;
- col = 0;
- for (i = 0; i < indx; i++)
- col = newpos(col, buf[i]);
- } else {
- wprintf(L"%.*ls\n", indx, buf);
- col = indx = 0;
- }
- col = newpos(col, ch);
- }
- if (indx + 1 > buf_max) {
- buf_max += LINE_MAX;
- buf = realloc(buf, sizeof(*buf) * buf_max);
- if (buf == NULL)
- err(1, "realloc()");
- }
- buf[indx++] = ch;
- }
-
- if (indx != 0)
- wprintf(L"%.*ls", indx, buf);
-}
-
-/*
- * Update the current column position for a character.
- */
-static int
-newpos(int col, wint_t ch)
-{
- char buf[MB_LEN_MAX];
- size_t len;
- int w;
-
- if (bflag) {
- len = wcrtomb(buf, ch, NULL);
- col += len;
- } else
- switch (ch) {
- case '\b':
- if (col > 0)
- --col;
- break;
- case '\r':
- col = 0;
- break;
- case '\t':
- col = (col + 8) & ~7;
- break;
- default:
- if ((w = wcwidth(ch)) > 0)
- col += w;
- break;
- }
-
- return (col);
-}
diff --git a/usr.bin/from/Makefile b/usr.bin/from/Makefile
deleted file mode 100644
index 57b9663..0000000
--- a/usr.bin/from/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= from
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/from/from.1 b/usr.bin/from/from.1
deleted file mode 100644
index 07129856..0000000
--- a/usr.bin/from/from.1
+++ /dev/null
@@ -1,100 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)from.1 8.2 (Berkeley) 12/30/93
-.\" $FreeBSD$
-.\"
-.Dd December 30, 1993
-.Dt FROM 1
-.Os
-.Sh NAME
-.Nm from
-.Nd print names of those who have sent mail
-.Sh SYNOPSIS
-.Nm
-.Op Fl c
-.Op Fl f Ar file
-.Op Fl s Ar sender
-.Op Ar user
-.Sh DESCRIPTION
-The
-.Nm
-utility prints
-out the mail header lines from the invoker's mailbox.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl c
-Just print a count of messages and exit.
-.It Fl f Ar file
-The supplied
-.Ar file
-is examined instead of the invoker's mailbox.
-If the
-.Fl f
-option is used, the
-.Ar user
-argument should not be used.
-Read from standard input if file name
-.Dq Fl
-is given.
-.It Fl s Ar sender
-Only mail from addresses containing
-the
-supplied string are printed.
-.El
-.Pp
-If
-.Ar user
-is given, the
-.Ar user Ns 's
-mailbox is examined instead of the invoker's own mailbox.
-(Privileges are required.)
-.Sh ENVIRONMENT
-.Bl -tag -width indent
-.It Ev MAIL
-If set, the location of the invoker's mailbox.
-Otherwise, the default in
-.Pa /var/mail
-is used.
-.El
-.Sh FILES
-.Bl -tag -width ".Pa /var/mail/*" -compact
-.It Pa /var/mail/*
-.El
-.Sh SEE ALSO
-.Xr biff 1 ,
-.Xr mail 1
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3.0 .
diff --git a/usr.bin/from/from.c b/usr.bin/from/from.c
deleted file mode 100644
index 84d0c52..0000000
--- a/usr.bin/from/from.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (c) 1980, 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1988, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)from.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <ctype.h>
-#include <err.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <paths.h>
-#include <string.h>
-#include <unistd.h>
-
-int match(const char *, const char *);
-static void usage(void);
-
-int
-main(int argc, char **argv)
-{
- FILE *mbox;
- struct passwd *pwd;
- int ch, count, newline;
- const char *file;
- char *sender, *p;
-#if MAXPATHLEN > BUFSIZ
- char buf[MAXPATHLEN];
-#else
- char buf[BUFSIZ];
-#endif
-
- file = sender = NULL;
- count = -1;
- while ((ch = getopt(argc, argv, "cf:s:")) != -1)
- switch (ch) {
- case 'c':
- count = 0;
- break;
- case 'f':
- file = optarg;
- break;
- case 's':
- sender = optarg;
- for (p = sender; *p; ++p)
- if (isupper(*p))
- *p = tolower(*p);
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (file == NULL) {
- if (argc) {
- (void)snprintf(buf, sizeof(buf), "%s/%s", _PATH_MAILDIR, *argv);
- file = buf;
- } else {
- if (!(file = getenv("MAIL"))) {
- if (!(pwd = getpwuid(getuid())))
- errx(1, "no password file entry for you");
- file = pwd->pw_name;
- (void)snprintf(buf, sizeof(buf),
- "%s/%s", _PATH_MAILDIR, file);
- file = buf;
- }
- }
- }
-
- /* read from stdin */
- if (strcmp(file, "-") == 0) {
- mbox = stdin;
- }
- else if ((mbox = fopen(file, "r")) == NULL) {
- errx(1, "can't read %s", file);
- }
- for (newline = 1; fgets(buf, sizeof(buf), mbox);) {
- if (*buf == '\n') {
- newline = 1;
- continue;
- }
- if (newline && !strncmp(buf, "From ", 5) &&
- (!sender || match(buf + 5, sender))) {
- if (count != -1)
- count++;
- else
- printf("%s", buf);
- }
- newline = 0;
- }
- if (count != -1)
- printf("There %s %d message%s in your incoming mailbox.\n",
- count == 1 ? "is" : "are", count, count == 1 ? "" : "s");
- fclose(mbox);
- exit(0);
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: from [-c] [-f file] [-s sender] [user]\n");
- exit(1);
-}
-
-int
-match(const char *line, const char *sender)
-{
- char ch, pch, first;
- const char *p, *t;
-
- for (first = *sender++;;) {
- if (isspace(ch = *line))
- return(0);
- ++line;
- if (isupper(ch))
- ch = tolower(ch);
- if (ch != first)
- continue;
- for (p = sender, t = line;;) {
- if (!(pch = *p++))
- return(1);
- if (isupper(ch = *t++))
- ch = tolower(ch);
- if (ch != pch)
- break;
- }
- }
- /* NOTREACHED */
-}
diff --git a/usr.bin/fstat/Makefile b/usr.bin/fstat/Makefile
deleted file mode 100644
index d55fce4..0000000
--- a/usr.bin/fstat/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-.include <bsd.own.mk>
-
-PROG= fstat
-SRCS= cd9660.c fstat.c msdosfs.c
-DPADD= ${LIBKVM}
-LDADD= -lkvm
-BINGRP= kmem
-BINMODE=2555
-WARNS?= 6
-
-CFLAGS+=-D_KVM_VNODE
-
-# XXX This is a hack.
-.if ${MK_CDDL} != "no"
-CFLAGS+= -DZFS
-OBJS+= zfs/zfs.o
-SUBDIR= zfs
-zfs/zfs.o: .PHONY
- @cd ${.CURDIR}/zfs && ${MAKE} zfs.o
-.endif
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/fstat/cd9660.c b/usr.bin/fstat/cd9660.c
deleted file mode 100644
index 1c26e8d..0000000
--- a/usr.bin/fstat/cd9660.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 2000 Peter Edwards
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by Peter Edwards
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * XXX -
- * This had to be separated from fstat.c because cd9660s has namespace
- * conflicts with UFS.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/vnode.h>
-#include <sys/mount.h>
-
-#include <isofs/cd9660/cd9660_node.h>
-
-#include <kvm.h>
-#include <stdio.h>
-
-#include "fstat.h"
-
-int
-isofs_filestat(struct vnode *vp, struct filestat *fsp)
-{
- struct iso_node isonode;
-
- if (!KVM_READ(VTOI(vp), &isonode, sizeof (isonode))) {
- dprintf(stderr, "can't read iso_node at %p for pid %d\n",
- (void *)VTOI(vp), Pid);
- return 0;
- }
-#if 0
- fsp->fsid = dev2udev(isonode.i_dev);
-#endif
- fsp->mode = (mode_t)isonode.inode.iso_mode;
- fsp->rdev = isonode.inode.iso_rdev;
-
- fsp->fileid = (long)isonode.i_number;
- fsp->size = (u_long)isonode.i_size;
- return 1;
-}
-
diff --git a/usr.bin/fstat/fstat.1 b/usr.bin/fstat/fstat.1
deleted file mode 100644
index 3e99c51..0000000
--- a/usr.bin/fstat/fstat.1
+++ /dev/null
@@ -1,236 +0,0 @@
-.\" Copyright (c) 1987, 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)fstat.1 8.3 (Berkeley) 2/25/94
-.\" $FreeBSD$
-.\"
-.Dd March 27, 2002
-.Dt FSTAT 1
-.Os
-.Sh NAME
-.Nm fstat
-.Nd identify active files
-.Sh SYNOPSIS
-.Nm
-.Op Fl fmnv
-.Op Fl M Ar core
-.Op Fl N Ar system
-.Op Fl p Ar pid
-.Op Fl u Ar user
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility identifies open files.
-A file is considered open by a process if it was explicitly opened,
-is the working directory, root directory, jail root directory,
-active executable text, or kernel trace file for that process.
-If no options are specified,
-.Nm
-reports on all open files in the system.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl f
-Restrict examination to files open in the same file systems as
-the named file arguments, or to the file system containing the
-current directory if there are no additional filename arguments.
-For example, to find all files open in the file system where the
-directory
-.Pa /usr/src
-resides, type
-.Dq Li fstat -f /usr/src .
-.It Fl M
-Extract values associated with the name list from the specified core
-instead of the default
-.Pa /dev/kmem .
-.It Fl N
-Extract the name list from the specified system instead of the default,
-which is the kernel image the system has booted from.
-.It Fl m
-Include memory-mapped files in the listing; normally these are excluded
-due to the extra processing required.
-.It Fl n
-Numerical format.
-Print the device number (maj,min) of the file system
-the file resides in rather than the mount point name; for special
-files, print the
-device number that the special device refers to rather than the filename
-in
-.Pa /dev ;
-and print the mode of the file in octal instead of symbolic form.
-.It Fl p
-Report all files open by the specified process.
-.It Fl u
-Report all files open by the specified user.
-.It Fl v
-Verbose mode.
-Print error messages upon failures to locate particular
-system data structures rather than silently ignoring them.
-Most of
-these data structures are dynamically created or deleted and it is
-possible for them to disappear while
-.Nm
-is running.
-This
-is normal and unavoidable since the rest of the system is running while
-.Nm
-itself is running.
-.It Ar
-Restrict reports to the specified files.
-.El
-.Pp
-The following fields are printed:
-.Bl -tag -width MOUNT
-.It Li USER
-The username of the owner of the process (effective uid).
-.It Li CMD
-The command name of the process.
-.It Li PID
-The process id.
-.It Li FD
-The file number in the per-process open file table or one of the following
-special names:
-.Pp
-.Bd -literal -offset indent -compact
-jail - jail root directory
-mmap - memory-mapped file
-root - root inode
-text - executable text inode
-tr - kernel trace file
-wd - current working directory
-.Ed
-.Pp
-If the file number is followed by an asterisk (``*''), the file is
-not an inode, but rather a socket,
-.Tn FIFO ,
-or there is an error.
-In this case the remainder of the line does not
-correspond to the remaining headers -- the format of the line
-is described later under
-.Sx SOCKETS .
-.It Li MOUNT
-If the
-.Fl n
-flag was not specified, this header is present and is the
-pathname that the file system the file resides in is mounted on.
-.It Li DEV
-If the
-.Fl n
-flag is specified, this header is present and is the
-major/minor number of the device that this file resides in.
-.It Li INUM
-The inode number of the file.
-.It Li MODE
-The mode of the file.
-If the
-.Fl n
-flag is not specified, the mode is printed
-using a symbolic format (see
-.Xr strmode 3 ) ;
-otherwise, the mode is printed
-as an octal number.
-.It Li SZ\&|DV
-If the file is not a character or block special, prints the size of
-the file in bytes.
-Otherwise, if the
-.Fl n
-flag is not specified, prints
-the name of the special file as located in
-.Pa /dev .
-If that cannot be
-located, or the
-.Fl n
-flag is specified, prints the major/minor device
-number that the special device refers to.
-.It Li R/W
-This column describes the access mode that the file allows.
-The letter ``r'' indicates open for reading;
-the letter ``w'' indicates open for writing.
-This field is useful when trying to find the processes that are
-preventing a file system from being down graded to read-only.
-.It Li NAME
-If filename arguments are specified and the
-.Fl f
-flag is not, then
-this field is present and is the name associated with the given file.
-Normally the name cannot be determined since there is no mapping
-from an open file back to the directory entry that was used to open
-that file.
-Also, since different directory entries may reference
-the same file (via
-.Xr ln 1 ) ,
-the name printed may not be the actual
-name that the process originally used to open that file.
-.El
-.Sh SOCKETS
-The formating of open sockets depends on the protocol domain.
-In all cases the first field is the domain name, the second field
-is the socket type (stream, dgram, etc), and the third is the socket
-flags field (in hex).
-The remaining fields are protocol dependent.
-For tcp, it is the address of the tcpcb, and for udp, the inpcb (socket pcb).
-For unix domain sockets, its the address of the socket pcb and the address
-of the connected pcb (if connected).
-Otherwise the protocol number and address of the socket itself are printed.
-The attempt is to make enough information available to
-permit further analysis without duplicating
-.Xr netstat 1 .
-.Pp
-For example, the addresses mentioned above are the addresses which the
-.Dq Li netstat -A
-command would print for tcp, udp, and unixdomain.
-Note that since pipes are implemented using sockets, a pipe appears as a
-connected unix domain stream socket.
-A unidirectional unix domain socket indicates the direction of flow with
-an arrow (``<-'' or ``->''), and a full duplex socket shows a double arrow
-(``<->'').
-.Sh SEE ALSO
-.Xr netstat 1 ,
-.Xr nfsstat 1 ,
-.Xr ps 1 ,
-.Xr sockstat 1 ,
-.Xr systat 1 ,
-.Xr tcp 4 ,
-.Xr unix 4 ,
-.Xr iostat 8 ,
-.Xr pstat 8 ,
-.Xr vmstat 8
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.3 tahoe .
-.Sh BUGS
-Since
-.Nm
-takes a snapshot of the system, it is only correct for a very short period
-of time.
diff --git a/usr.bin/fstat/fstat.c b/usr.bin/fstat/fstat.c
deleted file mode 100644
index 6ed7076..0000000
--- a/usr.bin/fstat/fstat.c
+++ /dev/null
@@ -1,1019 +0,0 @@
-/*-
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1988, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)fstat.c 8.3 (Berkeley) 5/2/95";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/proc.h>
-#include <sys/user.h>
-#include <sys/stat.h>
-#include <sys/vnode.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/domain.h>
-#include <sys/protosw.h>
-#include <sys/un.h>
-#include <sys/unpcb.h>
-#include <sys/sysctl.h>
-#include <sys/tty.h>
-#include <sys/filedesc.h>
-#include <sys/queue.h>
-#define _WANT_FILE
-#include <sys/file.h>
-#include <sys/conf.h>
-#define _KERNEL
-#include <sys/pipe.h>
-#include <sys/mount.h>
-#include <ufs/ufs/quota.h>
-#include <ufs/ufs/inode.h>
-#include <fs/devfs/devfs.h>
-#include <fs/devfs/devfs_int.h>
-#undef _KERNEL
-#include <nfs/nfsproto.h>
-#include <nfs/rpcv2.h>
-#include <nfsclient/nfs.h>
-#include <nfsclient/nfsnode.h>
-
-
-#include <vm/vm.h>
-#include <vm/vm_map.h>
-#include <vm/vm_object.h>
-
-#include <net/route.h>
-#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#include <netinet/in_pcb.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <fcntl.h>
-#include <kvm.h>
-#include <limits.h>
-#include <nlist.h>
-#include <paths.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include <unistd.h>
-#include <netdb.h>
-
-#include "fstat.h"
-
-#define TEXT -1
-#define CDIR -2
-#define RDIR -3
-#define TRACE -4
-#define MMAP -5
-#define JDIR -6
-
-DEVS *devs;
-
-#ifdef notdef
-struct nlist nl[] = {
- { "" },
-};
-#endif
-
-int fsflg, /* show files on same filesystem as file(s) argument */
- pflg, /* show files open by a particular pid */
- uflg; /* show files open by a particular (effective) user */
-int checkfile; /* true if restricting to particular files or filesystems */
-int nflg; /* (numerical) display f.s. and rdev as dev_t */
-int vflg; /* display errors in locating kernel data objects etc... */
-int mflg; /* include memory-mapped files */
-
-
-struct file **ofiles; /* buffer of pointers to file structures */
-int maxfiles;
-#define ALLOC_OFILES(d) \
- if ((d) > maxfiles) { \
- free(ofiles); \
- ofiles = malloc((d) * sizeof(struct file *)); \
- if (ofiles == NULL) { \
- err(1, NULL); \
- } \
- maxfiles = (d); \
- }
-
-char *memf, *nlistf;
-kvm_t *kd;
-
-static void fstat_kvm(int, int);
-static void fstat_sysctl(int, int);
-void dofiles(struct kinfo_proc *kp);
-void dommap(struct kinfo_proc *kp);
-void vtrans(struct vnode *vp, int i, int flag);
-int ufs_filestat(struct vnode *vp, struct filestat *fsp);
-int nfs_filestat(struct vnode *vp, struct filestat *fsp);
-int devfs_filestat(struct vnode *vp, struct filestat *fsp);
-char *getmnton(struct mount *m);
-void pipetrans(struct pipe *pi, int i, int flag);
-void socktrans(struct socket *sock, int i);
-void ptstrans(struct tty *tp, int i, int flag);
-void getinetproto(int number);
-int getfname(const char *filename);
-void usage(void);
-char *kdevtoname(struct cdev *dev);
-
-int
-main(int argc, char **argv)
-{
- struct passwd *passwd;
- int arg, ch, what;
-
- arg = 0;
- what = KERN_PROC_PROC;
- nlistf = memf = NULL;
- while ((ch = getopt(argc, argv, "fmnp:u:vN:M:")) != -1)
- switch((char)ch) {
- case 'f':
- fsflg = 1;
- break;
- case 'M':
- memf = optarg;
- break;
- case 'N':
- nlistf = optarg;
- break;
- case 'm':
- mflg = 1;
- break;
- case 'n':
- nflg = 1;
- break;
- case 'p':
- if (pflg++)
- usage();
- if (!isdigit(*optarg)) {
- warnx("-p requires a process id");
- usage();
- }
- what = KERN_PROC_PID;
- arg = atoi(optarg);
- break;
- case 'u':
- if (uflg++)
- usage();
- if (!(passwd = getpwnam(optarg)))
- errx(1, "%s: unknown uid", optarg);
- what = KERN_PROC_UID;
- arg = passwd->pw_uid;
- break;
- case 'v':
- vflg = 1;
- break;
- case '?':
- default:
- usage();
- }
-
- if (*(argv += optind)) {
- for (; *argv; ++argv) {
- if (getfname(*argv))
- checkfile = 1;
- }
- if (!checkfile) /* file(s) specified, but none accessable */
- exit(1);
- }
-
- if (fsflg && !checkfile) {
- /* -f with no files means use wd */
- if (getfname(".") == 0)
- exit(1);
- checkfile = 1;
- }
-
- if (memf != NULL)
- fstat_kvm(what, arg);
- else
- fstat_sysctl(what, arg);
- exit(0);
-}
-
-static void
-print_header(void)
-{
-
- if (nflg)
- printf("%s",
-"USER CMD PID FD DEV INUM MODE SZ|DV R/W");
- else
- printf("%s",
-"USER CMD PID FD MOUNT INUM MODE SZ|DV R/W");
- if (checkfile && fsflg == 0)
- printf(" NAME\n");
- else
- putchar('\n');
-}
-
-static void
-fstat_kvm(int what, int arg)
-{
- struct kinfo_proc *p, *plast;
- char buf[_POSIX2_LINE_MAX];
- int cnt;
-
- ALLOC_OFILES(256); /* reserve space for file pointers */
-
- /*
- * Discard setgid privileges if not the running kernel so that bad
- * guys can't print interesting stuff from kernel memory.
- */
- if (nlistf != NULL || memf != NULL)
- setgid(getgid());
-
- if ((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, buf)) == NULL)
- errx(1, "%s", buf);
- setgid(getgid());
-#ifdef notdef
- if (kvm_nlist(kd, nl) != 0)
- errx(1, "no namelist: %s", kvm_geterr(kd));
-#endif
- if ((p = kvm_getprocs(kd, what, arg, &cnt)) == NULL)
- errx(1, "%s", kvm_geterr(kd));
- print_header();
- for (plast = &p[cnt]; p < plast; ++p) {
- if (p->ki_stat == SZOMB)
- continue;
- dofiles(p);
- if (mflg)
- dommap(p);
- }
-}
-
-static void
-fstat_sysctl(int what, int arg)
-{
-
- /* not yet implemented */
- fstat_kvm(what, arg);
-}
-
-const char *Uname, *Comm;
-int Pid;
-
-#define PREFIX(i) printf("%-8.8s %-10s %5d", Uname, Comm, Pid); \
- switch(i) { \
- case TEXT: \
- printf(" text"); \
- break; \
- case CDIR: \
- printf(" wd"); \
- break; \
- case RDIR: \
- printf(" root"); \
- break; \
- case TRACE: \
- printf(" tr"); \
- break; \
- case MMAP: \
- printf(" mmap"); \
- break; \
- case JDIR: \
- printf(" jail"); \
- break; \
- default: \
- printf(" %4d", i); \
- break; \
- }
-
-/*
- * print open files attributed to this process
- */
-void
-dofiles(struct kinfo_proc *kp)
-{
- int i;
- struct file file;
- struct filedesc filed;
-
- Uname = user_from_uid(kp->ki_uid, 0);
- Pid = kp->ki_pid;
- Comm = kp->ki_comm;
-
- if (kp->ki_fd == NULL)
- return;
- if (!KVM_READ(kp->ki_fd, &filed, sizeof (filed))) {
- dprintf(stderr, "can't read filedesc at %p for pid %d\n",
- (void *)kp->ki_fd, Pid);
- return;
- }
- /*
- * root directory vnode, if one
- */
- if (filed.fd_rdir)
- vtrans(filed.fd_rdir, RDIR, FREAD);
- /*
- * current working directory vnode
- */
- if (filed.fd_cdir)
- vtrans(filed.fd_cdir, CDIR, FREAD);
- /*
- * jail root, if any.
- */
- if (filed.fd_jdir)
- vtrans(filed.fd_jdir, JDIR, FREAD);
- /*
- * ktrace vnode, if one
- */
- if (kp->ki_tracep)
- vtrans(kp->ki_tracep, TRACE, FREAD|FWRITE);
- /*
- * text vnode, if one
- */
- if (kp->ki_textvp)
- vtrans(kp->ki_textvp, TEXT, FREAD);
- /*
- * open files
- */
-#define FPSIZE (sizeof (struct file *))
-#define MAX_LASTFILE (0x1000000)
-
- /* Sanity check on filed.fd_lastfile */
- if (filed.fd_lastfile <= -1 || filed.fd_lastfile > MAX_LASTFILE)
- return;
-
- ALLOC_OFILES(filed.fd_lastfile+1);
- if (!KVM_READ(filed.fd_ofiles, ofiles,
- (filed.fd_lastfile+1) * FPSIZE)) {
- dprintf(stderr,
- "can't read file structures at %p for pid %d\n",
- (void *)filed.fd_ofiles, Pid);
- return;
- }
- for (i = 0; i <= filed.fd_lastfile; i++) {
- if (ofiles[i] == NULL)
- continue;
- if (!KVM_READ(ofiles[i], &file, sizeof (struct file))) {
- dprintf(stderr, "can't read file %d at %p for pid %d\n",
- i, (void *)ofiles[i], Pid);
- continue;
- }
- if (file.f_type == DTYPE_VNODE)
- vtrans(file.f_vnode, i, file.f_flag);
- else if (file.f_type == DTYPE_SOCKET) {
- if (checkfile == 0)
- socktrans(file.f_data, i);
- }
-#ifdef DTYPE_PIPE
- else if (file.f_type == DTYPE_PIPE) {
- if (checkfile == 0)
- pipetrans(file.f_data, i, file.f_flag);
- }
-#endif
-#ifdef DTYPE_FIFO
- else if (file.f_type == DTYPE_FIFO) {
- if (checkfile == 0)
- vtrans(file.f_vnode, i, file.f_flag);
- }
-#endif
-#ifdef DTYPE_PTS
- else if (file.f_type == DTYPE_PTS) {
- if (checkfile == 0)
- ptstrans(file.f_data, i, file.f_flag);
- }
-#endif
- else {
- dprintf(stderr,
- "unknown file type %d for file %d of pid %d\n",
- file.f_type, i, Pid);
- }
- }
-}
-
-void
-dommap(struct kinfo_proc *kp)
-{
- vm_map_t map;
- struct vmspace vmspace;
- struct vm_map_entry entry;
- vm_map_entry_t entryp;
- struct vm_object object;
- vm_object_t objp;
- int prot, fflags;
-
- if (!KVM_READ(kp->ki_vmspace, &vmspace, sizeof(vmspace))) {
- dprintf(stderr,
- "can't read vmspace at %p for pid %d\n",
- (void *)kp->ki_vmspace, Pid);
- return;
- }
- map = &vmspace.vm_map;
-
- for (entryp = map->header.next;
- entryp != &kp->ki_vmspace->vm_map.header; entryp = entry.next) {
- if (!KVM_READ(entryp, &entry, sizeof(entry))) {
- dprintf(stderr,
- "can't read vm_map_entry at %p for pid %d\n",
- (void *)entryp, Pid);
- return;
- }
-
- if (entry.eflags & MAP_ENTRY_IS_SUB_MAP)
- continue;
-
- if ((objp = entry.object.vm_object) == NULL)
- continue;
-
- for (; objp; objp = object.backing_object) {
- if (!KVM_READ(objp, &object, sizeof(object))) {
- dprintf(stderr,
- "can't read vm_object at %p for pid %d\n",
- (void *)objp, Pid);
- return;
- }
- }
-
- prot = entry.protection;
- fflags = (prot & VM_PROT_READ ? FREAD : 0) |
- (prot & VM_PROT_WRITE ? FWRITE : 0);
-
- switch (object.type) {
- case OBJT_VNODE:
- vtrans((struct vnode *)object.handle, MMAP, fflags);
- break;
- default:
- break;
- }
- }
-}
-
-char *
-kdevtoname(struct cdev *dev)
-{
- struct cdev si;
-
- if (!KVM_READ(dev, &si, sizeof si))
- return (NULL);
- return (strdup(si.__si_namebuf));
-}
-
-void
-vtrans(struct vnode *vp, int i, int flag)
-{
- struct vnode vn;
- struct filestat fst;
- char rw[3], mode[15], tagstr[12], *tagptr;
- const char *badtype, *filename;
-
- filename = badtype = NULL;
- if (!KVM_READ(vp, &vn, sizeof (struct vnode))) {
- dprintf(stderr, "can't read vnode at %p for pid %d\n",
- (void *)vp, Pid);
- return;
- }
- if (!KVM_READ(&vp->v_tag, &tagptr, sizeof tagptr) ||
- !KVM_READ(tagptr, tagstr, sizeof tagstr)) {
- dprintf(stderr, "can't read v_tag at %p for pid %d\n",
- (void *)vp, Pid);
- return;
- }
- tagstr[sizeof(tagstr) - 1] = '\0';
- if (vn.v_type == VNON)
- badtype = "none";
- else if (vn.v_type == VBAD)
- badtype = "bad";
- else {
- if (!strcmp("ufs", tagstr)) {
- if (!ufs_filestat(&vn, &fst))
- badtype = "error";
- } else if (!strcmp("devfs", tagstr)) {
- if (!devfs_filestat(&vn, &fst))
- badtype = "error";
- } else if (!strcmp("nfs", tagstr)) {
- if (!nfs_filestat(&vn, &fst))
- badtype = "error";
- } else if (!strcmp("msdosfs", tagstr)) {
- if (!msdosfs_filestat(&vn, &fst))
- badtype = "error";
- } else if (!strcmp("isofs", tagstr)) {
- if (!isofs_filestat(&vn, &fst))
- badtype = "error";
-#ifdef ZFS
- } else if (!strcmp("zfs", tagstr)) {
- if (!zfs_filestat(&vn, &fst))
- badtype = "error";
-#endif
- } else {
- static char unknown[32];
- snprintf(unknown, sizeof unknown, "?(%s)", tagstr);
- badtype = unknown;
- }
- }
- if (checkfile) {
- int fsmatch = 0;
- DEVS *d;
-
- if (badtype)
- return;
- for (d = devs; d != NULL; d = d->next)
- if (d->fsid == fst.fsid) {
- fsmatch = 1;
- if (d->ino == fst.fileid) {
- filename = d->name;
- break;
- }
- }
- if (fsmatch == 0 || (filename == NULL && fsflg == 0))
- return;
- }
- PREFIX(i);
- if (badtype) {
- (void)printf(" - - %10s -\n", badtype);
- return;
- }
- if (nflg)
- (void)printf(" %2d,%-2d", major(fst.fsid), minor(fst.fsid));
- else
- (void)printf(" %-8s", getmnton(vn.v_mount));
- if (nflg)
- (void)sprintf(mode, "%o", fst.mode);
- else
- strmode(fst.mode, mode);
- (void)printf(" %6ld %10s", fst.fileid, mode);
- switch (vn.v_type) {
- case VBLK:
- case VCHR: {
- char *name;
-
- name = kdevtoname(vn.v_rdev);
- if (nflg || !name)
- printf(" %2d,%-2d", major(fst.rdev), minor(fst.rdev));
- else {
- printf(" %6s", name);
- free(name);
- }
- break;
- }
- default:
- printf(" %6lu", fst.size);
- }
- rw[0] = '\0';
- if (flag & FREAD)
- strcat(rw, "r");
- if (flag & FWRITE)
- strcat(rw, "w");
- printf(" %2s", rw);
- if (filename && !fsflg)
- printf(" %s", filename);
- putchar('\n');
-}
-
-int
-ufs_filestat(struct vnode *vp, struct filestat *fsp)
-{
- struct inode inode;
-
- if (!KVM_READ(VTOI(vp), &inode, sizeof (inode))) {
- dprintf(stderr, "can't read inode at %p for pid %d\n",
- (void *)VTOI(vp), Pid);
- return 0;
- }
- /*
- * The st_dev from stat(2) is a dev_t. These kernel structures
- * contain cdev pointers. We need to convert to dev_t to make
- * comparisons
- */
- fsp->fsid = dev2udev(inode.i_dev);
- fsp->fileid = (long)inode.i_number;
- fsp->mode = (mode_t)inode.i_mode;
- fsp->size = (u_long)inode.i_size;
-#if should_be_but_is_hard
- /* XXX - need to load i_ump and i_din[12] from kernel memory */
- if (inode.i_ump->um_fstype == UFS1)
- fsp->rdev = inode.i_din1->di_rdev;
- else
- fsp->rdev = inode.i_din2->di_rdev;
-#else
- fsp->rdev = 0;
-#endif
-
- return 1;
-}
-
-int
-devfs_filestat(struct vnode *vp, struct filestat *fsp)
-{
- struct devfs_dirent devfs_dirent;
- struct mount mount;
- struct vnode vnode;
-
- if (!KVM_READ(vp->v_data, &devfs_dirent, sizeof (devfs_dirent))) {
- dprintf(stderr, "can't read devfs_dirent at %p for pid %d\n",
- (void *)vp->v_data, Pid);
- return 0;
- }
- if (!KVM_READ(vp->v_mount, &mount, sizeof (mount))) {
- dprintf(stderr, "can't read mount at %p for pid %d\n",
- (void *)vp->v_mount, Pid);
- return 0;
- }
- if (!KVM_READ(devfs_dirent.de_vnode, &vnode, sizeof (vnode))) {
- dprintf(stderr, "can't read vnode at %p for pid %d\n",
- (void *)devfs_dirent.de_vnode, Pid);
- return 0;
- }
- fsp->fsid = (long)mount.mnt_stat.f_fsid.val[0];
- fsp->fileid = devfs_dirent.de_inode;
- fsp->mode = (devfs_dirent.de_mode & ~S_IFMT) | S_IFCHR;
- fsp->size = 0;
- fsp->rdev = dev2udev(vnode.v_rdev);
-
- return 1;
-}
-
-int
-nfs_filestat(struct vnode *vp, struct filestat *fsp)
-{
- struct nfsnode nfsnode;
- mode_t mode;
-
- if (!KVM_READ(VTONFS(vp), &nfsnode, sizeof (nfsnode))) {
- dprintf(stderr, "can't read nfsnode at %p for pid %d\n",
- (void *)VTONFS(vp), Pid);
- return 0;
- }
- fsp->fsid = nfsnode.n_vattr.va_fsid;
- fsp->fileid = nfsnode.n_vattr.va_fileid;
- fsp->size = nfsnode.n_size;
- fsp->rdev = nfsnode.n_vattr.va_rdev;
- mode = (mode_t)nfsnode.n_vattr.va_mode;
- switch (vp->v_type) {
- case VREG:
- mode |= S_IFREG;
- break;
- case VDIR:
- mode |= S_IFDIR;
- break;
- case VBLK:
- mode |= S_IFBLK;
- break;
- case VCHR:
- mode |= S_IFCHR;
- break;
- case VLNK:
- mode |= S_IFLNK;
- break;
- case VSOCK:
- mode |= S_IFSOCK;
- break;
- case VFIFO:
- mode |= S_IFIFO;
- break;
- case VNON:
- case VBAD:
- case VMARKER:
- return 0;
- };
- fsp->mode = mode;
-
- return 1;
-}
-
-
-char *
-getmnton(struct mount *m)
-{
- static struct mount mount;
- static struct mtab {
- struct mtab *next;
- struct mount *m;
- char mntonname[MNAMELEN];
- } *mhead = NULL;
- struct mtab *mt;
-
- for (mt = mhead; mt != NULL; mt = mt->next)
- if (m == mt->m)
- return (mt->mntonname);
- if (!KVM_READ(m, &mount, sizeof(struct mount))) {
- warnx("can't read mount table at %p", (void *)m);
- return (NULL);
- }
- if ((mt = malloc(sizeof (struct mtab))) == NULL)
- err(1, NULL);
- mt->m = m;
- bcopy(&mount.mnt_stat.f_mntonname[0], &mt->mntonname[0], MNAMELEN);
- mt->next = mhead;
- mhead = mt;
- return (mt->mntonname);
-}
-
-void
-pipetrans(struct pipe *pi, int i, int flag)
-{
- struct pipe pip;
- char rw[3];
-
- PREFIX(i);
-
- /* fill in socket */
- if (!KVM_READ(pi, &pip, sizeof(struct pipe))) {
- dprintf(stderr, "can't read pipe at %p\n", (void *)pi);
- goto bad;
- }
-
- printf("* pipe %8lx <-> %8lx", (u_long)pi, (u_long)pip.pipe_peer);
- printf(" %6d", (int)pip.pipe_buffer.cnt);
- rw[0] = '\0';
- if (flag & FREAD)
- strcat(rw, "r");
- if (flag & FWRITE)
- strcat(rw, "w");
- printf(" %2s", rw);
- putchar('\n');
- return;
-
-bad:
- printf("* error\n");
-}
-
-void
-socktrans(struct socket *sock, int i)
-{
- static const char *stypename[] = {
- "unused", /* 0 */
- "stream", /* 1 */
- "dgram", /* 2 */
- "raw", /* 3 */
- "rdm", /* 4 */
- "seqpak" /* 5 */
- };
-#define STYPEMAX 5
- struct socket so;
- struct protosw proto;
- struct domain dom;
- struct inpcb inpcb;
- struct unpcb unpcb;
- int len;
- char dname[32];
-
- PREFIX(i);
-
- /* fill in socket */
- if (!KVM_READ(sock, &so, sizeof(struct socket))) {
- dprintf(stderr, "can't read sock at %p\n", (void *)sock);
- goto bad;
- }
-
- /* fill in protosw entry */
- if (!KVM_READ(so.so_proto, &proto, sizeof(struct protosw))) {
- dprintf(stderr, "can't read protosw at %p",
- (void *)so.so_proto);
- goto bad;
- }
-
- /* fill in domain */
- if (!KVM_READ(proto.pr_domain, &dom, sizeof(struct domain))) {
- dprintf(stderr, "can't read domain at %p\n",
- (void *)proto.pr_domain);
- goto bad;
- }
-
- if ((len = kvm_read(kd, (u_long)dom.dom_name, dname,
- sizeof(dname) - 1)) < 0) {
- dprintf(stderr, "can't read domain name at %p\n",
- (void *)dom.dom_name);
- dname[0] = '\0';
- }
- else
- dname[len] = '\0';
-
- if ((u_short)so.so_type > STYPEMAX)
- printf("* %s ?%d", dname, so.so_type);
- else
- printf("* %s %s", dname, stypename[so.so_type]);
-
- /*
- * protocol specific formatting
- *
- * Try to find interesting things to print. For tcp, the interesting
- * thing is the address of the tcpcb, for udp and others, just the
- * inpcb (socket pcb). For unix domain, its the address of the socket
- * pcb and the address of the connected pcb (if connected). Otherwise
- * just print the protocol number and address of the socket itself.
- * The idea is not to duplicate netstat, but to make available enough
- * information for further analysis.
- */
- switch(dom.dom_family) {
- case AF_INET:
- case AF_INET6:
- getinetproto(proto.pr_protocol);
- if (proto.pr_protocol == IPPROTO_TCP ) {
- if (so.so_pcb) {
- if (kvm_read(kd, (u_long)so.so_pcb,
- (char *)&inpcb, sizeof(struct inpcb))
- != sizeof(struct inpcb)) {
- dprintf(stderr,
- "can't read inpcb at %p\n",
- (void *)so.so_pcb);
- goto bad;
- }
- printf(" %lx", (u_long)inpcb.inp_ppcb);
- }
- }
- else if (so.so_pcb)
- printf(" %lx", (u_long)so.so_pcb);
- break;
- case AF_UNIX:
- /* print address of pcb and connected pcb */
- if (so.so_pcb) {
- printf(" %lx", (u_long)so.so_pcb);
- if (kvm_read(kd, (u_long)so.so_pcb, (char *)&unpcb,
- sizeof(struct unpcb)) != sizeof(struct unpcb)){
- dprintf(stderr, "can't read unpcb at %p\n",
- (void *)so.so_pcb);
- goto bad;
- }
- if (unpcb.unp_conn) {
- char shoconn[4], *cp;
-
- cp = shoconn;
- if (!(so.so_rcv.sb_state & SBS_CANTRCVMORE))
- *cp++ = '<';
- *cp++ = '-';
- if (!(so.so_snd.sb_state & SBS_CANTSENDMORE))
- *cp++ = '>';
- *cp = '\0';
- printf(" %s %lx", shoconn,
- (u_long)unpcb.unp_conn);
- }
- }
- break;
- default:
- /* print protocol number and socket address */
- printf(" %d %lx", proto.pr_protocol, (u_long)sock);
- }
- printf("\n");
- return;
-bad:
- printf("* error\n");
-}
-
-void
-ptstrans(struct tty *tp, int i, int flag)
-{
- struct tty tty;
- char *name;
- char rw[3];
- dev_t rdev;
-
- PREFIX(i);
-
- /* Obtain struct tty. */
- if (!KVM_READ(tp, &tty, sizeof(struct tty))) {
- dprintf(stderr, "can't read tty at %p\n", (void *)tp);
- goto bad;
- }
-
- /* Figure out the device name. */
- name = kdevtoname(tty.t_dev);
- if (name == NULL) {
- dprintf(stderr, "can't determine tty name at %p\n", (void *)tp);
- goto bad;
- }
-
- rw[0] = '\0';
- if (flag & FREAD)
- strcat(rw, "r");
- if (flag & FWRITE)
- strcat(rw, "w");
-
- printf("* pseudo-terminal master ");
- if (nflg || !name) {
- rdev = dev2udev(tty.t_dev);
- printf("%10d,%-2d", major(rdev), minor(rdev));
- } else {
- printf("%10s", name);
- }
- printf(" %2s\n", rw);
-
- free(name);
-
- return;
-bad:
- printf("* error\n");
-}
-
-/*
- * Read the cdev structure in the kernel in order to work out the
- * associated dev_t
- */
-dev_t
-dev2udev(struct cdev *dev)
-{
- struct cdev_priv priv;
-
- if (KVM_READ(cdev2priv(dev), &priv, sizeof priv)) {
- return ((dev_t)priv.cdp_inode);
- } else {
- dprintf(stderr, "can't convert cdev *%p to a dev_t\n", dev);
- return -1;
- }
-}
-
-/*
- * getinetproto --
- * print name of protocol number
- */
-void
-getinetproto(int number)
-{
- static int isopen;
- struct protoent *pe;
-
- if (!isopen)
- setprotoent(++isopen);
- if ((pe = getprotobynumber(number)) != NULL)
- printf(" %s", pe->p_name);
- else
- printf(" %d", number);
-}
-
-int
-getfname(const char *filename)
-{
- struct stat statbuf;
- DEVS *cur;
-
- if (stat(filename, &statbuf)) {
- warn("%s", filename);
- return(0);
- }
- if ((cur = malloc(sizeof(DEVS))) == NULL)
- err(1, NULL);
- cur->next = devs;
- devs = cur;
-
- cur->ino = statbuf.st_ino;
- cur->fsid = statbuf.st_dev;
- cur->name = filename;
- return(1);
-}
-
-#ifdef ZFS
-void *
-getvnodedata(struct vnode *vp)
-{
- return (vp->v_data);
-}
-
-struct mount *
-getvnodemount(struct vnode *vp)
-{
- return (vp->v_mount);
-}
-#endif
-
-void
-usage(void)
-{
- (void)fprintf(stderr,
- "usage: fstat [-fmnv] [-M core] [-N system] [-p pid] [-u user] [file ...]\n");
- exit(1);
-}
diff --git a/usr.bin/fstat/fstat.h b/usr.bin/fstat/fstat.h
deleted file mode 100644
index 4335110..0000000
--- a/usr.bin/fstat/fstat.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*-
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef __FSTAT_H__
-#define __FSTAT_H__
-
-/*
- * a kvm_read that returns true if everything is read
- */
-#define KVM_READ(kaddr, paddr, len) \
- ((len) < SSIZE_MAX && \
- kvm_read(kd, (u_long)(kaddr), (char *)(paddr), (len)) == (ssize_t)(len))
-
-#define dprintf if (vflg) fprintf
-
-typedef struct devs {
- struct devs *next;
- long fsid;
- long ino;
- const char *name;
-} DEVS;
-
-struct filestat {
- long fsid;
- long fileid;
- mode_t mode;
- u_long size;
- dev_t rdev;
-};
-
-/* Ugh */
-extern kvm_t *kd;
-extern int vflg;
-extern int Pid;
-
-dev_t dev2udev(struct cdev *dev);
-
-/* Additional filesystem types */
-int isofs_filestat(struct vnode *vp, struct filestat *fsp);
-int msdosfs_filestat(struct vnode *vp, struct filestat *fsp);
-
-#ifdef ZFS
-int zfs_filestat(struct vnode *vp, struct filestat *fsp);
-void *getvnodedata(struct vnode *vp);
-struct mount *getvnodemount(struct vnode *vp);
-#endif
-
-#endif /* __FSTAT_H__ */
diff --git a/usr.bin/fstat/msdosfs.c b/usr.bin/fstat/msdosfs.c
deleted file mode 100644
index 5bae63e..0000000
--- a/usr.bin/fstat/msdosfs.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (c) 2000 Peter Edwards
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by Peter Edwards
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <sys/vnode.h>
-
-#define _KERNEL
-#include <sys/mount.h>
-#include <fs/msdosfs/bpb.h>
-#include <fs/msdosfs/msdosfsmount.h>
-#undef _KERNEL
-
-#include <fs/msdosfs/denode.h>
-#include <fs/msdosfs/direntry.h>
-#include <fs/msdosfs/fat.h>
-
-#include <err.h>
-#include <kvm.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-/*
- * XXX -
- * VTODE is defined in denode.h only if _KERNEL is defined, but that leads to
- * header explosion
- */
-#define VTODE(vp) ((struct denode *)(vp)->v_data)
-
-#include "fstat.h"
-
-struct dosmount {
- struct dosmount *next;
- struct msdosfsmount *kptr; /* Pointer in kernel space */
- struct msdosfsmount data; /* User space copy of structure */
-};
-
-int
-msdosfs_filestat(struct vnode *vp, struct filestat *fsp)
-{
- struct denode denode;
- static struct dosmount *mounts;
- struct dosmount *mnt;
- u_long dirsperblk;
- int fileid;
-
- if (!KVM_READ(VTODE(vp), &denode, sizeof (denode))) {
- dprintf(stderr, "can't read denode at %p for pid %d\n",
- (void *)VTODE(vp), Pid);
- return 0;
- }
-
- /*
- * Find msdosfsmount structure for the vnode's filesystem. Needed
- * for some filesystem parameters
- */
- for (mnt = mounts; mnt; mnt = mnt->next)
- if (mnt->kptr == denode.de_pmp)
- break;
-
- if (!mnt) {
- if ((mnt = malloc(sizeof(struct dosmount))) == NULL)
- err(1, NULL);
- if (!KVM_READ(denode.de_pmp, &mnt->data, sizeof mnt->data)) {
- free(mnt);
- dprintf(stderr,
- "can't read mount info at %p for pid %d\n",
- (void *)denode.de_pmp, Pid);
- return 0;
- }
- mnt->next = mounts;
- mounts = mnt;
- mnt->kptr = denode.de_pmp;
- }
-
- fsp->fsid = dev2udev(denode.de_dev);
- fsp->mode = 0555;
- fsp->mode |= denode.de_Attributes & ATTR_READONLY ? 0 : 0222;
- fsp->mode &= mnt->data.pm_mask;
-
- /* Distinguish directories and files. No "special" files in FAT. */
- fsp->mode |= denode.de_Attributes & ATTR_DIRECTORY ? S_IFDIR : S_IFREG;
-
- fsp->size = denode.de_FileSize;
- fsp->rdev = 0;
-
- /*
- * XXX -
- * Culled from msdosfs_vnops.c. There appears to be a problem
- * here, in that a directory has the same inode number as the first
- * file in the directory. stat(2) suffers from this problem also, so
- * I won't try to fix it here.
- *
- * The following computation of the fileid must be the same as that
- * used in msdosfs_readdir() to compute d_fileno. If not, pwd
- * doesn't work.
- */
- dirsperblk = mnt->data.pm_BytesPerSec / sizeof(struct direntry);
- if (denode.de_Attributes & ATTR_DIRECTORY) {
- fileid = cntobn(&mnt->data, denode.de_StartCluster)
- * dirsperblk;
- if (denode.de_StartCluster == MSDOSFSROOT)
- fileid = 1;
- } else {
- fileid = cntobn(&mnt->data, denode.de_dirclust) * dirsperblk;
- if (denode.de_dirclust == MSDOSFSROOT)
- fileid = roottobn(&mnt->data, 0) * dirsperblk;
- fileid += denode.de_diroffset / sizeof(struct direntry);
- }
-
- fsp->fileid = fileid;
- return 1;
-}
diff --git a/usr.bin/fstat/zfs.c b/usr.bin/fstat/zfs.c
deleted file mode 100644
index c5508eb..0000000
--- a/usr.bin/fstat/zfs.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*-
- * Copyright (c) 2007 Ulf Lilleengen
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-#define _KERNEL
-#include <sys/mount.h>
-#undef _KERNEL
-#include <sys/sysctl.h>
-
-#undef lbolt
-#undef lbolt64
-#undef gethrestime_sec
-#include <sys/zfs_context.h>
-#include <sys/spa.h>
-#include <sys/spa_impl.h>
-#include <sys/dmu.h>
-#include <sys/zap.h>
-#include <sys/fs/zfs.h>
-#include <sys/zfs_znode.h>
-
-#include <err.h>
-#include <kvm.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#define ZFS
-#undef dprintf
-#include <fstat.h>
-
-/*
- * Offset calculations that are used to get data from znode without having the
- * definition.
- */
-#define LOCATION_ZID (2 * sizeof(void *))
-#define LOCATION_ZPHYS(zsize) ((zsize) - (2 * sizeof(void *)))
-
-int
-zfs_filestat(struct vnode *vp, struct filestat *fsp)
-{
-
- znode_phys_t zphys;
- struct mount mount, *mountptr;
- uint64_t *zid;
- void *znodeptr, *vnodeptr;
- char *dataptr;
- void *zphys_addr;
- size_t len;
- int size;
-
- len = sizeof(size);
- if (sysctlbyname("debug.sizeof.znode", &size, &len, NULL, 0) == -1) {
- dprintf(stderr, "error getting sysctl\n");
- return (0);
- }
- znodeptr = malloc(size);
- if (znodeptr == NULL) {
- dprintf(stderr, "error allocating memory for znode storage\n");
- return (0);
- }
-
- /* Since we have problems including vnode.h, we'll use the wrappers. */
- vnodeptr = getvnodedata(vp);
- if (!KVM_READ(vnodeptr, znodeptr, (size_t)size)) {
- dprintf(stderr, "can't read znode at %p for pid %d\n",
- (void *)vnodeptr, Pid);
- goto bad;
- }
-
- /*
- * z_id field is stored in the third pointer. We therefore skip the two
- * first bytes.
- *
- * Pointer to the z_phys structure is the next last pointer. Therefore
- * go back two bytes from the end.
- */
- dataptr = znodeptr;
- zid = (uint64_t *)(dataptr + LOCATION_ZID);
- zphys_addr = *(void **)(dataptr + LOCATION_ZPHYS(size));
-
- if (!KVM_READ(zphys_addr, &zphys, sizeof(zphys))) {
- dprintf(stderr, "can't read znode_phys at %p for pid %d\n",
- zphys_addr, Pid);
- goto bad;
- }
-
- /* Get the mount pointer, and read from the address. */
- mountptr = getvnodemount(vp);
- if (!KVM_READ(mountptr, &mount, sizeof(mount))) {
- dprintf(stderr, "can't read mount at %p for pid %d\n",
- (void *)mountptr, Pid);
- goto bad;
- }
-
- fsp->fsid = (long)mount.mnt_stat.f_fsid.val[0];
- fsp->fileid = *zid;
- /*
- * XXX: Shows up wrong in output, but UFS has this error too. Could
- * be that we're casting mode-variables from 64-bit to 8-bit or simply
- * error in the mode-to-string function.
- */
- fsp->mode = (mode_t)zphys.zp_mode;
- fsp->size = (u_long)zphys.zp_size;
- fsp->rdev = (dev_t)zphys.zp_rdev;
- free(znodeptr);
- return (1);
-bad:
- free(znodeptr);
- return (0);
-}
diff --git a/usr.bin/fstat/zfs/Makefile b/usr.bin/fstat/zfs/Makefile
deleted file mode 100644
index 7896fcc..0000000
--- a/usr.bin/fstat/zfs/Makefile
+++ /dev/null
@@ -1,22 +0,0 @@
-# $FreeBSD$
-
-.PATH: ${.CURDIR}/..
-
-SRCS= zfs.c
-OBJS= zfs.o
-WARNS?= 1
-
-CFLAGS+= -I${.CURDIR}/../../../sys/cddl/compat/opensolaris
-CFLAGS+= -I${.CURDIR}/../../../cddl/compat/opensolaris/include
-CFLAGS+= -I${.CURDIR}/../../../cddl/compat/opensolaris/lib/libumem
-CFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libzpool/common
-CFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/uts/common/fs/zfs
-CFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/uts/common
-CFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/uts/common/sys
-CFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/head
-CFLAGS+= -I${.CURDIR}/..
-
-all: ${OBJS}
-CLEANFILES= ${OBJS}
-
-.include <bsd.lib.mk>
diff --git a/usr.bin/fsync/Makefile b/usr.bin/fsync/Makefile
deleted file mode 100644
index 42aa6dd..0000000
--- a/usr.bin/fsync/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# $FreeBSD$
-
-PROG= fsync
-
-WARNS?= 6
-.include <bsd.prog.mk>
diff --git a/usr.bin/fsync/fsync.1 b/usr.bin/fsync/fsync.1
deleted file mode 100644
index 0cc41d3..0000000
--- a/usr.bin/fsync/fsync.1
+++ /dev/null
@@ -1,63 +0,0 @@
-.\" Copyright (c) 2000 Paul Saab <ps@FreeBSD.org>
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd January 25, 2005
-.Dt FSYNC 1
-.Os
-.Sh NAME
-.Nm fsync
-.Nd synchronize a file's in-core state with that on disk
-.Sh SYNOPSIS
-.Nm
-.Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility causes all the modified data and meta-data of
-all the files named on the command line
-to be written to a permanent storage device.
-.Pp
-The
-.Nm
-utility uses the
-.Xr fsync 2
-function call.
-.Sh EXIT STATUS
-If an error occurs, the
-.Nm
-utility proceeds to the next file, and exits >0.
-Otherwise, it exits 0.
-.Sh SEE ALSO
-.Xr fsync 2 ,
-.Xr sync 2 ,
-.Xr syncer 4 ,
-.Xr halt 8 ,
-.Xr reboot 8
-.Sh HISTORY
-The
-.Nm
-command first appeared in
-.Fx 4.3 .
diff --git a/usr.bin/fsync/fsync.c b/usr.bin/fsync/fsync.c
deleted file mode 100644
index 78aeb21..0000000
--- a/usr.bin/fsync/fsync.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/*-
- * Copyright (c) 2000 Paul Saab <ps@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sysexits.h>
-#include <unistd.h>
-
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- int fd;
- int i;
- int rval;
-
- if (argc < 2) {
- usage();
- /* NOTREACHED */
- }
-
- rval = EX_OK;
- for (i = 1; i < argc; ++i) {
- if ((fd = open(argv[i], O_RDONLY)) == -1) {
- warn("open %s", argv[i]);
- if (rval == EX_OK)
- rval = EX_NOINPUT;
- continue;
- }
-
- if (fsync(fd) == -1) {
- warn("fsync %s", argv[i]);
- if (rval == EX_OK)
- rval = EX_OSERR;
- }
- close(fd);
- }
- exit(rval);
- /* NOTREACHED */
-}
-
-static void
-usage(void)
-{
-
- fprintf(stderr, "usage: fsync file ...\n");
- exit(EX_USAGE);
- /* NOTREACHED */
-}
diff --git a/usr.bin/ftp/Makefile b/usr.bin/ftp/Makefile
deleted file mode 100644
index c2fe59c..0000000
--- a/usr.bin/ftp/Makefile
+++ /dev/null
@@ -1,31 +0,0 @@
-# $FreeBSD$
-# $NetBSD: Makefile,v 1.15 1997/10/18 15:31:20 lukem Exp $
-# from: @(#)Makefile 8.2 (Berkeley) 4/3/94
-
-.include <bsd.own.mk>
-
-# Uncomment the following to provide defaults for gate-ftp operation
-#
-#CFLAGS+=-DGATE_SERVER=\"ftp-gw.host\" # -DGATE_PORT=21
-
-LUKEMFTP= ${.CURDIR}/../../contrib/lukemftp
-.PATH: ${LUKEMFTP}/src
-
-PROG= ftp
-SRCS= cmds.c cmdtab.c complete.c domacro.c fetch.c ftp.c main.c progressbar.c \
- ruserpass.c util.c
-
-.if ${MK_INET6_SUPPORT} != "no"
-CFLAGS+= -DINET6
-.endif
-
-CFLAGS+= -I${.CURDIR} -I${LUKEMFTP}
-LDADD= -ledit -ltermcap -lutil
-DPADD= ${LIBEDIT} ${LIBTERMCAP} ${LIBUTIL}
-
-LINKS= ${BINDIR}/ftp ${BINDIR}/pftp \
- ${BINDIR}/ftp ${BINDIR}/gate-ftp
-MLINKS= ftp.1 pftp.1 \
- ftp.1 gate-ftp.1
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ftp/config.h b/usr.bin/ftp/config.h
deleted file mode 100644
index 77dff70..0000000
--- a/usr.bin/ftp/config.h
+++ /dev/null
@@ -1,285 +0,0 @@
-/* $FreeBSD$ */
-
-
-/* config.h. Generated automatically by configure. */
-/* config.h.in. Generated automatically from configure.in by autoheader. */
-/* $Id: config.h.in,v 1.24 2000/09/18 00:40:12 lukem Exp $ */
-
-
-/* Define if on AIX 3.
- System headers sometimes define this.
- We just want to avoid a redefinition error message. */
-#ifndef _ALL_SOURCE
-/* #undef _ALL_SOURCE */
-#endif
-
-/* Define if the closedir function returns void instead of int. */
-/* #undef CLOSEDIR_VOID */
-
-/* Define if the `getpgrp' function takes no argument. */
-#define GETPGRP_VOID 1
-
-/* Define if your C compiler doesn't accept -c and -o together. */
-/* #undef NO_MINUS_C_MINUS_O */
-
-/* Define if your Fortran 77 compiler doesn't accept -c and -o together. */
-/* #undef F77_NO_MINUS_C_MINUS_O */
-
-/* Define to `long' if <sys/types.h> doesn't define. */
-/* #undef off_t */
-
-/* Define to the type of arg1 for select(). */
-/* #undef SELECT_TYPE_ARG1 */
-
-/* Define to the type of args 2, 3 and 4 for select(). */
-/* #undef SELECT_TYPE_ARG234 */
-
-/* Define to the type of arg5 for select(). */
-/* #undef SELECT_TYPE_ARG5 */
-
-/* Define if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define if you can safely include both <sys/time.h> and <time.h>. */
-#define TIME_WITH_SYS_TIME 1
-
-/* Define if the closedir function returns void instead of int. */
-/* #undef VOID_CLOSEDIR */
-
-/* The number of bytes in a off_t. */
-#define SIZEOF_OFF_T 0
-
-/* Define if you have the err function. */
-#define HAVE_ERR 1
-
-/* Define if you have the fgetln function. */
-#define HAVE_FGETLN 1
-
-/* Define if you have the fparseln function. */
-#define HAVE_FPARSELN 1
-
-/* Define if you have the fseeko function. */
-#define HAVE_FSEEKO 1
-
-/* Define if you have the getaddrinfo function. */
-#define HAVE_GETADDRINFO 1
-
-/* Define if you have the gethostbyname2 function. */
-#define HAVE_GETHOSTBYNAME2 1
-
-/* Define if you have the getnameinfo function. */
-#define HAVE_GETNAMEINFO 1
-
-/* Define if you have the getpassphrase function. */
-/* #undef HAVE_GETPASSPHRASE */
-
-/* Define if you have the getpgrp function. */
-#define HAVE_GETPGRP 1
-
-/* Define if you have the glob function. */
-#define USE_GLOB_H 1
-
-/* Define if you have the inet_ntop function. */
-#define HAVE_INET_NTOP 1
-
-/* Define if you have the inet_pton function. */
-#define HAVE_INET_PTON 1
-
-/* Define if you have the issetugid function. */
-#define HAVE_ISSETUGID 1
-
-/* Define if you have the memmove function. */
-#define HAVE_MEMMOVE 1
-
-/* Define if you have the mkstemp function. */
-#define HAVE_MKSTEMP 1
-
-/* Define if you have the poll function. */
-#define HAVE_POLL 1
-
-/* Define if you have the select function. */
-#define HAVE_SELECT 1
-
-/* Define if you have the setprogname function. */
-#define HAVE_SETPROGNAME 1
-
-/* Define if you have the sl_init function. */
-#define HAVE_SL_INIT 1
-
-/* Define if you have the snprintf function. */
-#define HAVE_SNPRINTF 1
-
-/* Define if you have the strdup function. */
-#define HAVE_STRDUP 1
-
-/* Define if you have the strerror function. */
-#define HAVE_STRERROR 1
-
-/* Define if you have the strlcat function. */
-#define HAVE_STRLCAT 1
-
-/* Define if you have the strlcpy function. */
-#define HAVE_STRLCPY 1
-
-/* Define if you have the strptime function. */
-#define HAVE_STRPTIME 1
-
-/* Define if you have the strsep function. */
-#define HAVE_STRSEP 1
-
-/* Define if you have the strtoll function. */
-#define HAVE_STRTOLL 1
-
-/* Define if you have the strunvis function. */
-#define HAVE_STRUNVIS 1
-
-/* Define if you have the strvis function. */
-#define HAVE_STRVIS 1
-
-/* Define if you have the timegm function. */
-#define HAVE_TIMEGM 1
-
-/* Define if you have the usleep function. */
-#define HAVE_USLEEP 1
-
-/* Define if you have the <arpa/nameser.h> header file. */
-#define HAVE_ARPA_NAMESER_H 1
-
-/* Define if you have the <dirent.h> header file. */
-#define HAVE_DIRENT_H 1
-
-/* Define if you have the <err.h> header file. */
-#define HAVE_ERR_H 1
-
-/* Define if you have the <libutil.h> header file. */
-#define HAVE_LIBUTIL_H 1
-
-/* Define if you have the <ndir.h> header file. */
-/* #undef HAVE_NDIR_H */
-
-/* Define if you have the <paths.h> header file. */
-#define HAVE_PATHS_H 1
-
-/* Define if you have the <poll.h> header file. */
-#define HAVE_POLL_H 1
-
-/* Define if you have the <regex.h> header file. */
-#define HAVE_REGEX_H 1
-
-/* Define if you have the <sys/dir.h> header file. */
-#define HAVE_SYS_DIR_H 1
-
-/* Define if you have the <sys/ndir.h> header file. */
-/* #undef HAVE_SYS_NDIR_H */
-
-/* Define if you have the <sys/poll.h> header file. */
-#define HAVE_SYS_POLL_H 1
-
-/* Define if you have the <termcap.h> header file. */
-#define HAVE_TERMCAP_H 1
-
-/* Define if you have the <util.h> header file. */
-/* #undef HAVE_UTIL_H */
-
-/* Define if you have the <vis.h> header file. */
-#define HAVE_VIS_H 1
-
-/* Define if you have the nsl library (-lnsl). */
-/* #undef HAVE_LIBNSL */
-
-/* Define if you have the socket library (-lsocket). */
-/* #undef HAVE_LIBSOCKET */
-
-/* Define if you have the tinfo library (-ltinfo). */
-#define HAVE_LIBTINFO 1
-
-/* Define if you have the util library (-lutil). */
-#define HAVE_LIBUTIL 1
-
-/* Define if your compiler supports `long long' */
-#define HAVE_LONG_LONG 1
-
-/* Define if in_port_t exists */
-#define HAVE_IN_PORT_T 1
-
-/* Define if sa_family_t exists in <sys/socket.h> */
-#define HAVE_SA_FAMILY_T 1
-
-/* Define if struct sockaddr.sa_len exists (implies sockaddr_in.sin_len, etc) */
-#define HAVE_SOCKADDR_SA_LEN 1
-
-/* Define if socklen_t exists */
-#define HAVE_SOCKLEN_T 1
-
-/* Define if AF_INET6 exists in <sys/socket.h> */
-#define HAVE_AF_INET6 1
-
-/* Define if `struct sockaddr_in6' exists in <netinet/in.h> */
-#define HAVE_SOCKADDR_IN6 1
-
-/* Define if `struct addrinfo' exists in <netdb.h> */
-#define HAVE_ADDRINFO 1
-
-/*
- * Define if <netdb.h> contains AI_NUMERICHOST et al.
- * Systems which only implement RFC2133 will need this.
- */
-#define HAVE_RFC2553_NETDB 1
-
-/* Define if `struct direct' has a d_namlen element */
-#define HAVE_D_NAMLEN 1
-
-/* Define if GLOB_BRACE exists in <glob.h> */
-#define HAVE_GLOB_BRACE 1
-
-/* Define if h_errno exists in <netdb.h> */
-#define HAVE_H_ERRNO_D 1
-
-/* Define if fclose() is declared in <stdio.h> */
-#define HAVE_FCLOSE_D 1
-
-/* Define if getpass() is declared in <stdlib.h> or <unistd.h> */
-#define HAVE_GETPASS_D 1
-
-/* Define if optarg is declared in <stdlib.h> or <unistd.h> */
-#define HAVE_OPTARG_D 1
-
-/* Define if optind is declared in <stdlib.h> or <unistd.h> */
-#define HAVE_OPTIND_D 1
-
-/* Define if pclose() is declared in <stdio.h> */
-#define HAVE_PCLOSE_D 1
-
-/* Define if `long long' is supported and sizeof(off_t) >= 8 */
-#define HAVE_QUAD_SUPPORT 1
-
-/* Define if strptime() is declared in <time.h> */
-#define HAVE_STRPTIME_D 1
-
-/*
- * Define this if compiling with SOCKS (the firewall traversal library).
- * Also, you must define connect, getsockname, bind, accept, listen, and
- * select to their R-versions.
- */
-/* #undef SOCKS */
-/* #undef SOCKS4 */
-/* #undef SOCKS5 */
-/* #undef connect */
-/* #undef getsockname */
-/* #undef bind */
-/* #undef accept */
-/* #undef listen */
-/* #undef select */
-/* #undef dup */
-/* #undef dup2 */
-/* #undef fclose */
-/* #undef gethostbyname */
-/* #undef getpeername */
-/* #undef read */
-/* #undef recv */
-/* #undef recvfrom */
-/* #undef rresvport */
-/* #undef send */
-/* #undef sendto */
-/* #undef shutdown */
-/* #undef write */
diff --git a/usr.bin/gcore/Makefile b/usr.bin/gcore/Makefile
deleted file mode 100644
index 5ab51cf..0000000
--- a/usr.bin/gcore/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= gcore
-SRCS= elfcore.c gcore.c
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/gcore/elfcore.c b/usr.bin/gcore/elfcore.c
deleted file mode 100644
index a5acaf1..0000000
--- a/usr.bin/gcore/elfcore.c
+++ /dev/null
@@ -1,535 +0,0 @@
-/*-
- * Copyright (c) 1998 John D. Polstra
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/procfs.h>
-#include <sys/queue.h>
-#include <sys/linker_set.h>
-#include <machine/elf.h>
-#include <vm/vm_param.h>
-#include <vm/vm.h>
-#include <vm/pmap.h>
-#include <vm/vm_map.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-/*
- * Code for generating ELF core dumps.
- */
-
-typedef void (*segment_callback)(vm_map_entry_t, void *);
-
-/* Closure for cb_put_phdr(). */
-struct phdr_closure {
- Elf_Phdr *phdr; /* Program header to fill in */
- Elf_Off offset; /* Offset of segment in core file */
-};
-
-/* Closure for cb_size_segment(). */
-struct sseg_closure {
- int count; /* Count of writable segments. */
- size_t size; /* Total size of all writable segments. */
-};
-
-static void cb_put_phdr(vm_map_entry_t, void *);
-static void cb_size_segment(vm_map_entry_t, void *);
-static void each_writable_segment(vm_map_entry_t, segment_callback,
- void *closure);
-static void elf_corehdr(int fd, pid_t, vm_map_entry_t, int numsegs,
- void *hdr, size_t hdrsize);
-static void elf_puthdr(vm_map_entry_t, void *, size_t *,
- const prstatus_t *, const prfpregset_t *, const prpsinfo_t *, int numsegs);
-static void elf_putnote(void *dst, size_t *off, const char *name, int type,
- const void *desc, size_t descsz);
-static void freemap(vm_map_entry_t);
-static void readhdrinfo(pid_t, prstatus_t *, prfpregset_t *, prpsinfo_t *);
-static vm_map_entry_t readmap(pid_t);
-
-static int
-elf_ident(int efd, pid_t pid __unused, char *binfile __unused)
-{
- Elf_Ehdr hdr;
- int cnt;
-
- cnt = read(efd, &hdr, sizeof(hdr));
- if (cnt != sizeof(hdr))
- return (0);
- if (IS_ELF(hdr))
- return (1);
- return (0);
-}
-
-/*
- * Write an ELF coredump for the given pid to the given fd.
- */
-static void
-elf_coredump(int efd __unused, int fd, pid_t pid)
-{
- vm_map_entry_t map;
- struct sseg_closure seginfo;
- void *hdr;
- size_t hdrsize;
- char memname[64];
- int memfd;
- Elf_Phdr *php;
- int i;
-
- /* Get the program's memory map. */
- map = readmap(pid);
-
- /* Size the program segments. */
- seginfo.count = 0;
- seginfo.size = 0;
- each_writable_segment(map, cb_size_segment, &seginfo);
-
- /*
- * Calculate the size of the core file header area by making
- * a dry run of generating it. Nothing is written, but the
- * size is calculated.
- */
- hdrsize = 0;
- elf_puthdr(map, (void *)NULL, &hdrsize,
- (const prstatus_t *)NULL, (const prfpregset_t *)NULL,
- (const prpsinfo_t *)NULL, seginfo.count);
-
- /*
- * Allocate memory for building the header, fill it up,
- * and write it out.
- */
- if ((hdr = malloc(hdrsize)) == NULL)
- errx(1, "out of memory");
- elf_corehdr(fd, pid, map, seginfo.count, hdr, hdrsize);
-
- /* Write the contents of all of the writable segments. */
- snprintf(memname, sizeof memname, "/proc/%d/mem", pid);
- if ((memfd = open(memname, O_RDONLY)) == -1)
- err(1, "cannot open %s", memname);
-
- php = (Elf_Phdr *)((char *)hdr + sizeof(Elf_Ehdr)) + 1;
- for (i = 0; i < seginfo.count; i++) {
- uintmax_t nleft = php->p_filesz;
-
- lseek(memfd, (off_t)php->p_vaddr, SEEK_SET);
- while (nleft > 0) {
- char buf[8*1024];
- size_t nwant;
- ssize_t ngot;
-
- if (nleft > sizeof(buf))
- nwant = sizeof buf;
- else
- nwant = nleft;
- ngot = read(memfd, buf, nwant);
- if (ngot == -1)
- err(1, "read from %s", memname);
- if ((size_t)ngot < nwant)
- errx(1, "short read from %s:"
- " wanted %zd, got %zd", memname,
- nwant, ngot);
- ngot = write(fd, buf, nwant);
- if (ngot == -1)
- err(1, "write of segment %d failed", i);
- if ((size_t)ngot != nwant)
- errx(1, "short write");
- nleft -= nwant;
- }
- php++;
- }
- close(memfd);
- free(hdr);
- freemap(map);
-}
-
-/*
- * A callback for each_writable_segment() to write out the segment's
- * program header entry.
- */
-static void
-cb_put_phdr(vm_map_entry_t entry, void *closure)
-{
- struct phdr_closure *phc = (struct phdr_closure *)closure;
- Elf_Phdr *phdr = phc->phdr;
-
- phc->offset = round_page(phc->offset);
-
- phdr->p_type = PT_LOAD;
- phdr->p_offset = phc->offset;
- phdr->p_vaddr = entry->start;
- phdr->p_paddr = 0;
- phdr->p_filesz = phdr->p_memsz = entry->end - entry->start;
- phdr->p_align = PAGE_SIZE;
- phdr->p_flags = 0;
- if (entry->protection & VM_PROT_READ)
- phdr->p_flags |= PF_R;
- if (entry->protection & VM_PROT_WRITE)
- phdr->p_flags |= PF_W;
- if (entry->protection & VM_PROT_EXECUTE)
- phdr->p_flags |= PF_X;
-
- phc->offset += phdr->p_filesz;
- phc->phdr++;
-}
-
-/*
- * A callback for each_writable_segment() to gather information about
- * the number of segments and their total size.
- */
-static void
-cb_size_segment(vm_map_entry_t entry, void *closure)
-{
- struct sseg_closure *ssc = (struct sseg_closure *)closure;
-
- ssc->count++;
- ssc->size += entry->end - entry->start;
-}
-
-/*
- * For each segment in the given memory map, call the given function
- * with a pointer to the map entry and some arbitrary caller-supplied
- * data.
- */
-static void
-each_writable_segment(vm_map_entry_t map, segment_callback func, void *closure)
-{
- vm_map_entry_t entry;
-
- for (entry = map; entry != NULL; entry = entry->next)
- (*func)(entry, closure);
-}
-
-/*
- * Write the core file header to the file, including padding up to
- * the page boundary.
- */
-static void
-elf_corehdr(int fd, pid_t pid, vm_map_entry_t map, int numsegs, void *hdr,
- size_t hdrsize)
-{
- size_t off;
- prstatus_t status;
- prfpregset_t fpregset;
- prpsinfo_t psinfo;
-
- /* Gather the information for the header. */
- readhdrinfo(pid, &status, &fpregset, &psinfo);
-
- /* Fill in the header. */
- memset(hdr, 0, hdrsize);
- off = 0;
- elf_puthdr(map, hdr, &off, &status, &fpregset, &psinfo, numsegs);
-
- /* Write it to the core file. */
- if (write(fd, hdr, hdrsize) == -1)
- err(1, "write");
-}
-
-/*
- * Generate the ELF coredump header into the buffer at "dst". "dst" may
- * be NULL, in which case the header is sized but not actually generated.
- */
-static void
-elf_puthdr(vm_map_entry_t map, void *dst, size_t *off, const prstatus_t *status,
- const prfpregset_t *fpregset, const prpsinfo_t *psinfo, int numsegs)
-{
- size_t ehoff;
- size_t phoff;
- size_t noteoff;
- size_t notesz;
-
- ehoff = *off;
- *off += sizeof(Elf_Ehdr);
-
- phoff = *off;
- *off += (numsegs + 1) * sizeof(Elf_Phdr);
-
- noteoff = *off;
- elf_putnote(dst, off, "FreeBSD", NT_PRSTATUS, status,
- sizeof *status);
- elf_putnote(dst, off, "FreeBSD", NT_FPREGSET, fpregset,
- sizeof *fpregset);
- elf_putnote(dst, off, "FreeBSD", NT_PRPSINFO, psinfo,
- sizeof *psinfo);
- notesz = *off - noteoff;
-
- /* Align up to a page boundary for the program segments. */
- *off = round_page(*off);
-
- if (dst != NULL) {
- Elf_Ehdr *ehdr;
- Elf_Phdr *phdr;
- struct phdr_closure phc;
-
- /*
- * Fill in the ELF header.
- */
- ehdr = (Elf_Ehdr *)((char *)dst + ehoff);
- ehdr->e_ident[EI_MAG0] = ELFMAG0;
- ehdr->e_ident[EI_MAG1] = ELFMAG1;
- ehdr->e_ident[EI_MAG2] = ELFMAG2;
- ehdr->e_ident[EI_MAG3] = ELFMAG3;
- ehdr->e_ident[EI_CLASS] = ELF_CLASS;
- ehdr->e_ident[EI_DATA] = ELF_DATA;
- ehdr->e_ident[EI_VERSION] = EV_CURRENT;
- ehdr->e_ident[EI_OSABI] = ELFOSABI_FREEBSD;
- ehdr->e_ident[EI_ABIVERSION] = 0;
- ehdr->e_ident[EI_PAD] = 0;
- ehdr->e_type = ET_CORE;
- ehdr->e_machine = ELF_ARCH;
- ehdr->e_version = EV_CURRENT;
- ehdr->e_entry = 0;
- ehdr->e_phoff = phoff;
- ehdr->e_flags = 0;
- ehdr->e_ehsize = sizeof(Elf_Ehdr);
- ehdr->e_phentsize = sizeof(Elf_Phdr);
- ehdr->e_phnum = numsegs + 1;
- ehdr->e_shentsize = sizeof(Elf_Shdr);
- ehdr->e_shnum = 0;
- ehdr->e_shstrndx = SHN_UNDEF;
-
- /*
- * Fill in the program header entries.
- */
- phdr = (Elf_Phdr *)((char *)dst + phoff);
-
- /* The note segment. */
- phdr->p_type = PT_NOTE;
- phdr->p_offset = noteoff;
- phdr->p_vaddr = 0;
- phdr->p_paddr = 0;
- phdr->p_filesz = notesz;
- phdr->p_memsz = 0;
- phdr->p_flags = 0;
- phdr->p_align = 0;
- phdr++;
-
- /* All the writable segments from the program. */
- phc.phdr = phdr;
- phc.offset = *off;
- each_writable_segment(map, cb_put_phdr, &phc);
- }
-}
-
-/*
- * Emit one note section to "dst", or just size it if "dst" is NULL.
- */
-static void
-elf_putnote(void *dst, size_t *off, const char *name, int type,
- const void *desc, size_t descsz)
-{
- Elf_Note note;
-
- note.n_namesz = strlen(name) + 1;
- note.n_descsz = descsz;
- note.n_type = type;
- if (dst != NULL)
- bcopy(&note, (char *)dst + *off, sizeof note);
- *off += sizeof note;
- if (dst != NULL)
- bcopy(name, (char *)dst + *off, note.n_namesz);
- *off += roundup2(note.n_namesz, sizeof(Elf_Size));
- if (dst != NULL)
- bcopy(desc, (char *)dst + *off, note.n_descsz);
- *off += roundup2(note.n_descsz, sizeof(Elf_Size));
-}
-
-/*
- * Free the memory map.
- */
-static void
-freemap(vm_map_entry_t map)
-{
-
- while (map != NULL) {
- vm_map_entry_t next = map->next;
- free(map);
- map = next;
- }
-}
-
-/*
- * Read the process information necessary to fill in the core file's header.
- */
-static void
-readhdrinfo(pid_t pid, prstatus_t *status, prfpregset_t *fpregset,
- prpsinfo_t *psinfo)
-{
- char name[64];
- char line[256];
- int fd;
- int i;
- int n;
-
- memset(status, 0, sizeof *status);
- status->pr_version = PRSTATUS_VERSION;
- status->pr_statussz = sizeof(prstatus_t);
- status->pr_gregsetsz = sizeof(gregset_t);
- status->pr_fpregsetsz = sizeof(fpregset_t);
- status->pr_osreldate = __FreeBSD_version;
- status->pr_pid = pid;
-
- memset(fpregset, 0, sizeof *fpregset);
-
- memset(psinfo, 0, sizeof *psinfo);
- psinfo->pr_version = PRPSINFO_VERSION;
- psinfo->pr_psinfosz = sizeof(prpsinfo_t);
-
- /* Read the general registers. */
- snprintf(name, sizeof name, "/proc/%d/regs", pid);
- if ((fd = open(name, O_RDONLY)) == -1)
- err(1, "cannot open %s", name);
- if ((n = read(fd, &status->pr_reg, sizeof status->pr_reg)) == -1)
- err(1, "read error from %s", name);
- if ((size_t)n < sizeof(status->pr_reg))
- errx(1, "short read from %s: wanted %zd, got %d", name,
- sizeof status->pr_reg, n);
- close(fd);
-
- /* Read the floating point registers. */
- snprintf(name, sizeof name, "/proc/%d/fpregs", pid);
- if ((fd = open(name, O_RDONLY)) == -1)
- err(1, "cannot open %s", name);
- if ((n = read(fd, fpregset, sizeof *fpregset)) == -1)
- err(1, "read error from %s", name);
- if ((size_t)n < sizeof(*fpregset))
- errx(1, "short read from %s: wanted %zd, got %d", name,
- sizeof *fpregset, n);
- close(fd);
-
- /* Read and parse the process status. */
- snprintf(name, sizeof name, "/proc/%d/status", pid);
- if ((fd = open(name, O_RDONLY)) == -1)
- err(1, "cannot open %s", name);
- if ((n = read(fd, line, sizeof line - 1)) == -1)
- err(1, "read error from %s", name);
- if (n > MAXCOMLEN)
- n = MAXCOMLEN;
- for (i = 0; i < n && line[i] != ' '; i++)
- psinfo->pr_fname[i] = line[i];
- strncpy(psinfo->pr_psargs, psinfo->pr_fname, PRARGSZ);
- close(fd);
-}
-
-/*
- * Read the process's memory map using procfs, and return a list of
- * VM map entries. Only the non-device read/writable segments are
- * returned. The map entries in the list aren't fully filled in; only
- * the items we need are present.
- */
-static vm_map_entry_t
-readmap(pid_t pid)
-{
- char mapname[64];
- int mapfd;
- ssize_t mapsize;
- size_t bufsize;
- char *mapbuf;
- int pos;
- vm_map_entry_t map;
- vm_map_entry_t *linkp;
-
- snprintf(mapname, sizeof mapname, "/proc/%d/map", pid);
- if ((mapfd = open(mapname, O_RDONLY)) == -1)
- err(1, "cannot open %s", mapname);
-
- /*
- * Procfs requires (for consistency) that the entire memory map
- * be read with a single read() call. Start with a reasonably sized
- * buffer, and double it until it is big enough.
- */
- bufsize = 8 * 1024;
- mapbuf = NULL;
- for ( ; ; ) {
- if ((mapbuf = realloc(mapbuf, bufsize + 1)) == NULL)
- errx(1, "out of memory");
- mapsize = read(mapfd, mapbuf, bufsize);
- if (mapsize != -1 || errno != EFBIG)
- break;
- bufsize *= 2;
- /* This lseek shouldn't be necessary, but it is. */
- lseek(mapfd, (off_t)0, SEEK_SET);
- }
- if (mapsize == -1)
- err(1, "read error from %s", mapname);
- if (mapsize == 0)
- errx(1, "empty map file %s", mapname);
- mapbuf[mapsize] = 0;
- close(mapfd);
-
- pos = 0;
- map = NULL;
- linkp = &map;
- while (pos < mapsize) {
- vm_map_entry_t ent;
- u_long start;
- u_long end;
- char prot[4];
- char type[16];
- int n;
- int len;
-
- len = 0;
- n = sscanf(mapbuf + pos, "%lx %lx %*d %*d %*x %3[-rwx]"
- " %*d %*d %*x %*s %*s %16s %*s%*[\n]%n",
- &start, &end, prot, type, &len);
- if (n != 4 || len == 0)
- errx(1, "ill-formed line in %s starting at character %d", mapname, pos + 1);
- pos += len;
-
- /* Ignore segments of the wrong kind, and unwritable ones */
- if (strncmp(prot, "rw", 2) != 0 ||
- (strcmp(type, "default") != 0 &&
- strcmp(type, "vnode") != 0 &&
- strcmp(type, "swap") != 0))
- continue;
-
- if ((ent = (vm_map_entry_t)calloc(1, sizeof *ent)) == NULL)
- errx(1, "out of memory");
- ent->start = start;
- ent->end = end;
- ent->protection = VM_PROT_READ | VM_PROT_WRITE;
- if (prot[2] == 'x')
- ent->protection |= VM_PROT_EXECUTE;
-
- *linkp = ent;
- linkp = &ent->next;
- }
- free(mapbuf);
- return map;
-}
-
-struct dumpers elfdump = { elf_ident, elf_coredump };
-TEXT_SET(dumpset, elfdump);
diff --git a/usr.bin/gcore/extern.h b/usr.bin/gcore/extern.h
deleted file mode 100644
index 1bd7095..0000000
--- a/usr.bin/gcore/extern.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*-
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-struct dumpers {
- int (*ident)(int efd, pid_t pid, char *binfile);
- void (*dump)(int efd, int fd, pid_t pid);
-};
diff --git a/usr.bin/gcore/gcore.1 b/usr.bin/gcore/gcore.1
deleted file mode 100644
index 981e0be..0000000
--- a/usr.bin/gcore/gcore.1
+++ /dev/null
@@ -1,103 +0,0 @@
-.\" Copyright (c) 1983, 1990, 1992, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)gcore.1 8.2 (Berkeley) 4/18/94
-.\" $FreeBSD$
-.\"
-.Dd April 18, 1994
-.Dt GCORE 1
-.Os
-.Sh NAME
-.Nm gcore
-.Nd get core images of running process
-.Sh SYNOPSIS
-.Nm
-.Op Fl s
-.Op Fl c Ar core
-.Op Ar executable
-.Ar pid
-.Sh DESCRIPTION
-The
-.Nm
-utility creates a core image of the specified process,
-suitable for use with
-.Xr gdb 1 .
-By default, the core is written to the file
-.Dq Pa core.<pid> .
-The process identifier,
-.Ar pid ,
-must be given on the command line.
-If no executable image is
-specified,
-.Nm
-will use
-.Dq Pa /proc/<pid>/file .
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl c
-Write the core file to the specified file instead of
-.Dq Pa core.<pid> .
-.It Fl s
-Stop the process while gathering the core image, and resume it
-when done.
-This guarantees that the resulting core dump will
-be in a consistent state.
-The process is resumed even if it was
-already stopped.
-The same effect can be achieved manually with
-.Xr kill 1 .
-.El
-.Sh FILES
-.Bl -tag -width /var/log/messages -compact
-.It Pa core.<pid>
-the core image
-.It Pa /proc/<pid>/file
-the executable image
-.El
-.Sh HISTORY
-A
-.Nm
-utility appeared in
-.Bx 4.2 .
-.Sh BUGS
-Context switches or paging activity that occur while
-.Nm
-is running may cause the program to become confused.
-For best results, use
-.Fl s
-to temporarily stop the target process.
-.Pp
-The
-.Nm
-utility is not compatible with the original
-.Bx 4.2
-version.
diff --git a/usr.bin/gcore/gcore.c b/usr.bin/gcore/gcore.c
deleted file mode 100644
index 7005e83..0000000
--- a/usr.bin/gcore/gcore.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/*-
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1992, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)gcore.c 8.2 (Berkeley) 9/23/93";
-#endif /* not lint */
-#endif
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Originally written by Eric Cooper in Fall 1981.
- * Inspired by a version 6 program by Len Levin, 1978.
- * Several pieces of code lifted from Bill Joy's 4BSD ps.
- * Most recently, hacked beyond recognition for 4.4BSD by Steven McCanne,
- * Lawrence Berkeley Laboratory.
- *
- * Portions of this software were developed by the Computer Systems
- * Engineering group at Lawrence Berkeley Laboratory under DARPA
- * contract BG 91-66 and contributed to Berkeley.
- */
-
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <sys/linker_set.h>
-
-#include <err.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-static void killed(int);
-static void restart_target(void);
-static void usage(void) __dead2;
-
-static pid_t pid;
-
-SET_DECLARE(dumpset, struct dumpers);
-
-int
-main(int argc, char *argv[])
-{
- int ch, efd, fd, sflag;
- char *binfile, *corefile;
- char fname[MAXPATHLEN];
- struct dumpers **d, *dumper;
-
- sflag = 0;
- corefile = NULL;
- while ((ch = getopt(argc, argv, "c:s")) != -1) {
- switch (ch) {
- case 'c':
- corefile = optarg;
- break;
- case 's':
- sflag = 1;
- break;
- default:
- usage();
- break;
- }
- }
- argv += optind;
- argc -= optind;
- /* XXX we should check that the pid argument is really a number */
- switch (argc) {
- case 1:
- pid = atoi(argv[0]);
- asprintf(&binfile, "/proc/%d/file", pid);
- if (binfile == NULL)
- errx(1, "allocation failure");
- break;
- case 2:
- pid = atoi(argv[1]);
- binfile = argv[0];
- break;
- default:
- usage();
- }
- efd = open(binfile, O_RDONLY, 0);
- if (efd < 0)
- err(1, "%s", binfile);
- dumper = NULL;
- SET_FOREACH(d, dumpset) {
- lseek(efd, 0, SEEK_SET);
- if (((*d)->ident)(efd, pid, binfile)) {
- dumper = (*d);
- lseek(efd, 0, SEEK_SET);
- break;
- }
- }
- if (dumper == NULL)
- errx(1, "Invalid executable file");
- if (corefile == NULL) {
- (void)snprintf(fname, sizeof(fname), "core.%d", pid);
- corefile = fname;
- }
- fd = open(corefile, O_RDWR|O_CREAT|O_TRUNC, DEFFILEMODE);
- if (fd < 0)
- err(1, "%s", corefile);
- if (sflag) {
- signal(SIGHUP, killed);
- signal(SIGINT, killed);
- signal(SIGTERM, killed);
- if (kill(pid, SIGSTOP) == -1)
- err(1, "%d: stop signal", pid);
- atexit(restart_target);
- }
- dumper->dump(efd, fd, pid);
- (void)close(fd);
- (void)close(efd);
- exit(0);
-}
-
-static void
-killed(int sig)
-{
-
- restart_target();
- signal(sig, SIG_DFL);
- kill(getpid(), sig);
-}
-
-static void
-restart_target(void)
-{
-
- kill(pid, SIGCONT);
-}
-
-void
-usage(void)
-{
-
- (void)fprintf(stderr, "usage: gcore [-s] [-c core] [executable] pid\n");
- exit(1);
-}
diff --git a/usr.bin/gencat/Makefile b/usr.bin/gencat/Makefile
deleted file mode 100644
index a6c9991..0000000
--- a/usr.bin/gencat/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# $FreeBSD$
-
-PROG= gencat
-WARNS?= 6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/gencat/gencat.1 b/usr.bin/gencat/gencat.1
deleted file mode 100644
index eed6764..0000000
--- a/usr.bin/gencat/gencat.1
+++ /dev/null
@@ -1,192 +0,0 @@
-.\" $OpenBSD: gencat.1,v 1.3 1997/06/11 15:39:54 kstailey Exp $
-.\"
-.\" Copyright (c) 1997 Ken Stailey
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. The name of the author may not be used to endorse or promote products
-.\" derived from this software without specific prior written permission
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd June 11, 1997
-.Dt GENCAT 1
-.Os
-.Sh NAME
-.Nm gencat
-.Nd NLS catalog compiler
-.Sh SYNOPSIS
-.Nm
-.Ar "output-file"
-.Ar "input-files..."
-.Sh DESCRIPTION
-The
-.Nm
-utility merges the text NLS input files
-.Ar "input-files..."
-into a formatted message catalog file
-.Ar "output-file" .
-The file
-.Ar "output-file"
-will be created if it does not already exist.
-If
-.Ar "output-file"
-does exist, its messages will be included in the new
-.Ar "output-file" .
-If set and message numbers collide, the new message text defined in
-.Ar "input-files..."
-will replace the old message text currently contained in
-.Ar "output-file" .
-.Sh INPUT FILES
-The format of a message text source file is defined below.
-Note that
-the fields of a message text source line are separated by a single space
-character: any other space characters are considered to be part of the
-field contents.
-.Pp
-.Bl -tag -width 3n
-.It Li $set Ar n comment
-This line specifies the set identifier of the following messages until
-the next
-.Li $set
-or end-of-file appears.
-The argument
-.Ar n
-is the set identifier which is defined as a number in the range
-[1, (NL_SETMAX)].
-Set identifiers must occur in ascending order within
-a single source file, but need not be contiguous.
-Any string following
-a space following the set identifier is treated as a comment.
-If no
-.Li $set
-directive is specified in a given source file, all messages will
-be located in the default message set NL_SETD.
-.It Li $del Ar n comment
-This line deletes messages from set
-.Ar n
-from a message catalog.
-The
-.Ar n
-specifies a set number.
-Any string following a space following the set
-number is treated as a comment.
-.It Li $ Ar comment
-A line beginning with
-.Li $
-followed by a space is treated as a comment.
-.It Ar m message-text
-A message line consists of a message identifier
-.Ar m
-in the range [1, (NL_MSGMAX)].
-The
-.Ar message-text
-is stored in the message catalog with the set identifier specified by
-the last
-.Li $set
-directive, and the message identifier
-.Ar m .
-If the
-.Ar message-text
-is empty, and there is a space character following the message identifier,
-an empty string is stored in the message catalog.
-If the
-.Ar message-text
-is empty, and if there is no space character following the message
-identifier, then the existing message in the current set with the
-specified message identifier is deleted from the catalog.
-Message
-identifiers must be in ascending order within a single set, but
-need not be contiguous.
-The
-.Ar message-text
-length must be in the range [0, (NL_TEXTMAX)].
-.It Li $quote Ar c
-This line specifies an optional quote character
-.Ar c
-which can be used to surround
-.Ar message-text
-so that trailing space or empty messages are visible in message
-source files.
-By default, or if an empty
-.Li $quote
-directive is specified, no quoting of
-.Ar message-text
-will be recognized.
-.El
-.Pp
-Empty lines in message source files are ignored.
-The effect of lines
-beginning with any character other than those described above is
-undefined.
-.Pp
-Text strings can contain the following special characters and escape
-sequences.
-In addition, if a quote character is defined, it may be
-escaped as well to embed a literal quote character.
-.Pp
-.Bl -tag -width "\eooo" -offset indent -compact
-.It Li \en
-line feed
-.It Li \et
-horizontal tab
-.It Li \ev
-vertical tab
-.It Li \eb
-backspace
-.It Li \er
-carriage return
-.It Li \ef
-form feed
-.It Li \e\e
-backslash
-.It Li \eooo
-octal number in the range [000, 377]
-.El
-.Pp
-A backslash character immediately before the end of the line in a file
-is used to continue the line onto the next line, e.g.:
-.Pp
-.Dl 1 This line is continued \e
-.Dl on this line.
-.Pp
-If the character following the backslash is not one of those specified,
-the backslash is ignored.
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr catclose 3 ,
-.Xr catgets 3 ,
-.Xr catopen 3
-.Sh STANDARDS
-The
-.Nm
-utility is compliant with the
-.St -xpg4
-standard.
-.Sh AUTHORS
-.An -nosplit
-This manual page was originally written by
-.An Ken Stailey
-and later revised by
-.An Terry Lambert .
-.Sh BUGS
-A message catalog file created from a blank input file cannot be revised;
-it must be deleted and recreated.
diff --git a/usr.bin/gencat/gencat.c b/usr.bin/gencat/gencat.c
deleted file mode 100644
index 306f48d..0000000
--- a/usr.bin/gencat/gencat.c
+++ /dev/null
@@ -1,784 +0,0 @@
-/* ex:ts=4
- */
-
-/* $NetBSD: gencat.c,v 1.18 2003/10/27 00:12:43 lukem Exp $ */
-
-/*
- * Copyright (c) 1996 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by J.T. Conklin.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/***********************************************************
-Copyright 1990, by Alfalfa Software Incorporated, Cambridge, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that Alfalfa's name not be used in
-advertising or publicity pertaining to distribution of the software
-without specific, written prior permission.
-
-ALPHALPHA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-ALPHALPHA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-If you make any modifications, bugfixes or other changes to this software
-we'd appreciate it if you could send a copy to us so we can keep things
-up-to-date. Many thanks.
- Kee Hinckley
- Alfalfa Software, Inc.
- 267 Allston St., #3
- Cambridge, MA 02139 USA
- nazgul@alfalfa.com
-
-******************************************************************/
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#define _NLS_PRIVATE
-
-#include <sys/types.h>
-#include <sys/queue.h>
-
-#include <arpa/inet.h> /* for htonl() */
-
-#include <ctype.h>
-#include <err.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <nl_types.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-struct _msgT {
- long msgId;
- char *str;
- LIST_ENTRY(_msgT) entries;
-};
-
-struct _setT {
- long setId;
- LIST_HEAD(msghead, _msgT) msghead;
- LIST_ENTRY(_setT) entries;
-};
-
-LIST_HEAD(sethead, _setT) sethead;
-static struct _setT *curSet;
-
-static char *curline = NULL;
-static long lineno = 0;
-
-static char *cskip(char *);
-static void error(const char *);
-static char *getline(int);
-static char *getmsg(int, char *, char);
-static void warning(const char *, const char *);
-static char *wskip(char *);
-static char *xstrdup(const char *);
-static void *xmalloc(size_t);
-static void *xrealloc(void *, size_t);
-
-void MCParse(int);
-void MCReadCat(int);
-void MCWriteCat(int);
-void MCDelMsg(int);
-void MCAddMsg(int, const char *);
-void MCAddSet(int);
-void MCDelSet(int);
-void usage(void);
-int main(int, char **);
-
-void
-usage()
-{
- fprintf(stderr, "usage: %s catfile msgfile ...\n", getprogname());
- exit(1);
-}
-
-int
-main(int argc, char **argv)
-{
- int ofd, ifd;
- char *catfile = NULL;
- int c;
-
-#define DEPRECATEDMSG 1
-
-#ifdef DEPRECATEDMSG
- while ((c = getopt(argc, argv, "new")) != -1) {
-#else
- while ((c = getopt(argc, argv, "")) != -1) {
-#endif
- switch (c) {
-#ifdef DEPRECATEDMSG
- case 'n':
- fprintf(stderr, "WARNING: Usage of \"-new\" argument is deprecated.\n");
- case 'e':
- case 'w':
- break;
-#endif
- case '?':
- default:
- usage();
- /* NOTREACHED */
- }
- }
- argc -= optind;
- argv += optind;
-
- if (argc < 2) {
- usage();
- /* NOTREACHED */
- }
- catfile = *argv++;
-
- for (; *argv; argv++) {
- if ((ifd = open(*argv, O_RDONLY)) < 0)
- err(1, "Unable to read %s", *argv);
- MCParse(ifd);
- close(ifd);
- }
-
- if ((ofd = open(catfile, O_WRONLY | O_TRUNC | O_CREAT, 0666)) < 0)
- err(1, "Unable to create a new %s", catfile);
- MCWriteCat(ofd);
- exit(0);
-}
-
-static void
-warning(const char *cptr, const char *msg)
-{
- fprintf(stderr, "%s: %s on line %ld\n", getprogname(), msg, lineno);
- fprintf(stderr, "%s\n", curline);
- if (cptr) {
- char *tptr;
- for (tptr = curline; tptr < cptr; ++tptr)
- putc(' ', stderr);
- fprintf(stderr, "^\n");
- }
-}
-
-#define CORRUPT() { error("corrupt message catalog"); }
-#define NOMEM() { error("out of memory"); }
-
-static void
-error(const char *msg)
-{
- warning(NULL, msg);
- exit(1);
-}
-
-static void *
-xmalloc(size_t len)
-{
- void *p;
-
- if ((p = malloc(len)) == NULL)
- NOMEM();
- return (p);
-}
-
-static void *
-xrealloc(void *ptr, size_t size)
-{
- if ((ptr = realloc(ptr, size)) == NULL)
- NOMEM();
- return (ptr);
-}
-
-static char *
-xstrdup(const char *str)
-{
- char *nstr;
-
- if ((nstr = strdup(str)) == NULL)
- NOMEM();
- return (nstr);
-}
-
-static char *
-getline(int fd)
-{
- static long curlen = BUFSIZ;
- static char buf[BUFSIZ], *bptr = buf, *bend = buf;
- char *cptr, *cend;
- long buflen;
-
- if (!curline) {
- curline = xmalloc(curlen);
- }
- ++lineno;
-
- cptr = curline;
- cend = curline + curlen;
- for (;;) {
- for (; bptr < bend && cptr < cend; ++cptr, ++bptr) {
- if (*bptr == '\n') {
- *cptr = '\0';
- ++bptr;
- return (curline);
- } else
- *cptr = *bptr;
- }
- if (cptr == cend) {
- cptr = curline = xrealloc(curline, curlen *= 2);
- cend = curline + curlen;
- }
- if (bptr == bend) {
- buflen = read(fd, buf, BUFSIZ);
- if (buflen <= 0) {
- if (cptr > curline) {
- *cptr = '\0';
- return (curline);
- }
- return (NULL);
- }
- bend = buf + buflen;
- bptr = buf;
- }
- }
-}
-
-static char *
-wskip(char *cptr)
-{
- if (!*cptr || !isspace((unsigned char) *cptr)) {
- warning(cptr, "expected a space");
- return (cptr);
- }
- while (*cptr && isspace((unsigned char) *cptr))
- ++cptr;
- return (cptr);
-}
-
-static char *
-cskip(char *cptr)
-{
- if (!*cptr || isspace((unsigned char) *cptr)) {
- warning(cptr, "wasn't expecting a space");
- return (cptr);
- }
- while (*cptr && !isspace((unsigned char) *cptr))
- ++cptr;
- return (cptr);
-}
-
-static char *
-getmsg(int fd, char *cptr, char quote)
-{
- static char *msg = NULL;
- static long msglen = 0;
- long clen, i;
- char *tptr;
-
- if (quote && *cptr == quote) {
- ++cptr;
- }
-
- clen = strlen(cptr) + 1;
- if (clen > msglen) {
- if (msglen)
- msg = xrealloc(msg, clen);
- else
- msg = xmalloc(clen);
- msglen = clen;
- }
- tptr = msg;
-
- while (*cptr) {
- if (quote && *cptr == quote) {
- char *tmp;
- tmp = cptr + 1;
- if (*tmp && (!isspace((unsigned char) *tmp) || *wskip(tmp))) {
- warning(cptr, "unexpected quote character, ignoring");
- *tptr++ = *cptr++;
- } else {
- *cptr = '\0';
- }
- } else
- if (*cptr == '\\') {
- ++cptr;
- switch (*cptr) {
- case '\0':
- cptr = getline(fd);
- if (!cptr)
- error("premature end of file");
- msglen += strlen(cptr);
- i = tptr - msg;
- msg = xrealloc(msg, msglen);
- tptr = msg + i;
- break;
-
- #define CASEOF(CS, CH) \
- case CS: \
- *tptr++ = CH; \
- ++cptr; \
- break; \
-
- CASEOF('n', '\n');
- CASEOF('t', '\t');
- CASEOF('v', '\v');
- CASEOF('b', '\b');
- CASEOF('r', '\r');
- CASEOF('f', '\f');
- CASEOF('"', '"');
- CASEOF('\\', '\\');
-
- default:
- if (quote && *cptr == quote) {
- *tptr++ = *cptr++;
- } else if (isdigit((unsigned char) *cptr)) {
- *tptr = 0;
- for (i = 0; i < 3; ++i) {
- if (!isdigit((unsigned char) *cptr))
- break;
- if (*cptr > '7')
- warning(cptr, "octal number greater than 7?!");
- *tptr *= 8;
- *tptr += (*cptr - '0');
- ++cptr;
- }
- } else {
- warning(cptr, "unrecognized escape sequence");
- }
- break;
- }
- } else {
- *tptr++ = *cptr++;
- }
- }
- *tptr = '\0';
- return (msg);
-}
-
-void
-MCParse(int fd)
-{
- char *cptr, *str;
- int setid, msgid = 0;
- char quote = 0;
-
- /* XXX: init sethead? */
-
- while ((cptr = getline(fd))) {
- if (*cptr == '$') {
- ++cptr;
- if (strncmp(cptr, "set", 3) == 0) {
- cptr += 3;
- cptr = wskip(cptr);
- setid = atoi(cptr);
- MCAddSet(setid);
- msgid = 0;
- } else if (strncmp(cptr, "delset", 6) == 0) {
- cptr += 6;
- cptr = wskip(cptr);
- setid = atoi(cptr);
- MCDelSet(setid);
- } else if (strncmp(cptr, "quote", 5) == 0) {
- cptr += 5;
- if (!*cptr)
- quote = 0;
- else {
- cptr = wskip(cptr);
- if (!*cptr)
- quote = 0;
- else
- quote = *cptr;
- }
- } else if (isspace((unsigned char) *cptr)) {
- ;
- } else {
- if (*cptr) {
- cptr = wskip(cptr);
- if (*cptr)
- warning(cptr, "unrecognized line");
- }
- }
- } else {
- /*
- * First check for (and eat) empty lines....
- */
- if (!*cptr)
- continue;
- /*
- * We have a digit? Start of a message. Else,
- * syntax error.
- */
- if (isdigit((unsigned char) *cptr)) {
- msgid = atoi(cptr);
- cptr = cskip(cptr);
- cptr = wskip(cptr);
- /* if (*cptr) ++cptr; */
- } else {
- warning(cptr, "neither blank line nor start of a message id");
- continue;
- }
- /*
- * If we have a message ID, but no message,
- * then this means "delete this message id
- * from the catalog".
- */
- if (!*cptr) {
- MCDelMsg(msgid);
- } else {
- str = getmsg(fd, cptr, quote);
- MCAddMsg(msgid, str);
- }
- }
- }
-}
-
-void
-MCReadCat(int fd)
-{
- fd = 0;
-#if 0
- MCHeaderT mcHead;
- MCMsgT mcMsg;
- MCSetT mcSet;
- msgT *msg;
- setT *set;
- int i;
- char *data;
-
- /* XXX init sethead? */
-
- if (read(fd, &mcHead, sizeof(mcHead)) != sizeof(mcHead))
- CORRUPT();
- if (strncmp(mcHead.magic, MCMagic, MCMagicLen) != 0)
- CORRUPT();
- if (mcHead.majorVer != MCMajorVer)
- error("unrecognized catalog version");
- if ((mcHead.flags & MCGetByteOrder()) == 0)
- error("wrong byte order");
-
- if (lseek(fd, mcHead.firstSet, SEEK_SET) == -1)
- CORRUPT();
-
- for (;;) {
- if (read(fd, &mcSet, sizeof(mcSet)) != sizeof(mcSet))
- CORRUPT();
- if (mcSet.invalid)
- continue;
-
- set = xmalloc(sizeof(setT));
- memset(set, '\0', sizeof(*set));
- if (cat->first) {
- cat->last->next = set;
- set->prev = cat->last;
- cat->last = set;
- } else
- cat->first = cat->last = set;
-
- set->setId = mcSet.setId;
-
- /* Get the data */
- if (mcSet.dataLen) {
- data = xmalloc(mcSet.dataLen);
- if (lseek(fd, mcSet.data.off, SEEK_SET) == -1)
- CORRUPT();
- if (read(fd, data, mcSet.dataLen) != mcSet.dataLen)
- CORRUPT();
- if (lseek(fd, mcSet.u.firstMsg, SEEK_SET) == -1)
- CORRUPT();
-
- for (i = 0; i < mcSet.numMsgs; ++i) {
- if (read(fd, &mcMsg, sizeof(mcMsg)) != sizeof(mcMsg))
- CORRUPT();
- if (mcMsg.invalid) {
- --i;
- continue;
- }
- msg = xmalloc(sizeof(msgT));
- memset(msg, '\0', sizeof(*msg));
- if (set->first) {
- set->last->next = msg;
- msg->prev = set->last;
- set->last = msg;
- } else
- set->first = set->last = msg;
-
- msg->msgId = mcMsg.msgId;
- msg->str = xstrdup((char *) (data + mcMsg.msg.off));
- }
- free(data);
- }
- if (!mcSet.nextSet)
- break;
- if (lseek(fd, mcSet.nextSet, SEEK_SET) == -1)
- CORRUPT();
- }
-#endif
-}
-
-/*
- * Write message catalog.
- *
- * The message catalog is first converted from its internal to its
- * external representation in a chunk of memory allocated for this
- * purpose. Then the completed catalog is written. This approach
- * avoids additional housekeeping variables and/or a lot of seeks
- * that would otherwise be required.
- */
-void
-MCWriteCat(int fd)
-{
- int nsets; /* number of sets */
- int nmsgs; /* number of msgs */
- int string_size; /* total size of string pool */
- int msgcat_size; /* total size of message catalog */
- void *msgcat; /* message catalog data */
- struct _nls_cat_hdr *cat_hdr;
- struct _nls_set_hdr *set_hdr;
- struct _nls_msg_hdr *msg_hdr;
- char *strings;
- struct _setT *set;
- struct _msgT *msg;
- int msg_index;
- int msg_offset;
-
- /* determine number of sets, number of messages, and size of the
- * string pool */
- nsets = 0;
- nmsgs = 0;
- string_size = 0;
-
- for (set = sethead.lh_first; set != NULL;
- set = set->entries.le_next) {
- nsets++;
-
- for (msg = set->msghead.lh_first; msg != NULL;
- msg = msg->entries.le_next) {
- nmsgs++;
- string_size += strlen(msg->str) + 1;
- }
- }
-
-#ifdef DEBUG
- printf("number of sets: %d\n", nsets);
- printf("number of msgs: %d\n", nmsgs);
- printf("string pool size: %d\n", string_size);
-#endif
-
- /* determine size and then allocate buffer for constructing external
- * message catalog representation */
- msgcat_size = sizeof(struct _nls_cat_hdr)
- + (nsets * sizeof(struct _nls_set_hdr))
- + (nmsgs * sizeof(struct _nls_msg_hdr))
- + string_size;
-
- msgcat = xmalloc(msgcat_size);
- memset(msgcat, '\0', msgcat_size);
-
- /* fill in msg catalog header */
- cat_hdr = (struct _nls_cat_hdr *) msgcat;
- cat_hdr->__magic = htonl(_NLS_MAGIC);
- cat_hdr->__nsets = htonl(nsets);
- cat_hdr->__mem = htonl(msgcat_size - sizeof(struct _nls_cat_hdr));
- cat_hdr->__msg_hdr_offset =
- htonl(nsets * sizeof(struct _nls_set_hdr));
- cat_hdr->__msg_txt_offset =
- htonl(nsets * sizeof(struct _nls_set_hdr) +
- nmsgs * sizeof(struct _nls_msg_hdr));
-
- /* compute offsets for set & msg header tables and string pool */
- set_hdr = (struct _nls_set_hdr *)(void *)((char *)msgcat +
- sizeof(struct _nls_cat_hdr));
- msg_hdr = (struct _nls_msg_hdr *)(void *)((char *)msgcat +
- sizeof(struct _nls_cat_hdr) +
- nsets * sizeof(struct _nls_set_hdr));
- strings = (char *) msgcat +
- sizeof(struct _nls_cat_hdr) +
- nsets * sizeof(struct _nls_set_hdr) +
- nmsgs * sizeof(struct _nls_msg_hdr);
-
- msg_index = 0;
- msg_offset = 0;
- for (set = sethead.lh_first; set != NULL;
- set = set->entries.le_next) {
-
- nmsgs = 0;
- for (msg = set->msghead.lh_first; msg != NULL;
- msg = msg->entries.le_next) {
- int msg_len = strlen(msg->str) + 1;
-
- msg_hdr->__msgno = htonl(msg->msgId);
- msg_hdr->__msglen = htonl(msg_len);
- msg_hdr->__offset = htonl(msg_offset);
-
- memcpy(strings, msg->str, msg_len);
- strings += msg_len;
- msg_offset += msg_len;
-
- nmsgs++;
- msg_hdr++;
- }
-
- set_hdr->__setno = htonl(set->setId);
- set_hdr->__nmsgs = htonl(nmsgs);
- set_hdr->__index = htonl(msg_index);
- msg_index += nmsgs;
- set_hdr++;
- }
-
- /* write out catalog. XXX: should this be done in small chunks? */
- write(fd, msgcat, msgcat_size);
-}
-
-void
-MCAddSet(int setId)
-{
- struct _setT *p, *q;
-
- if (setId <= 0) {
- error("setId's must be greater than zero");
- /* NOTREACHED */
- }
- if (setId > NL_SETMAX) {
- error("setId exceeds limit");
- /* NOTREACHED */
- }
-
- p = sethead.lh_first;
- q = NULL;
- for (; p != NULL && p->setId < setId; q = p, p = p->entries.le_next);
-
- if (p && p->setId == setId) {
- ;
- } else {
- p = xmalloc(sizeof(struct _setT));
- memset(p, '\0', sizeof(struct _setT));
- LIST_INIT(&p->msghead);
-
- p->setId = setId;
-
- if (q == NULL) {
- LIST_INSERT_HEAD(&sethead, p, entries);
- } else {
- LIST_INSERT_AFTER(q, p, entries);
- }
-}
-
- curSet = p;
-}
-
-void
-MCAddMsg(int msgId, const char *str)
-{
- struct _msgT *p, *q;
-
- if (!curSet)
- error("can't specify a message when no set exists");
-
- if (msgId <= 0) {
- error("msgId's must be greater than zero");
- /* NOTREACHED */
- }
- if (msgId > NL_MSGMAX) {
- error("msgID exceeds limit");
- /* NOTREACHED */
- }
-
- p = curSet->msghead.lh_first;
- q = NULL;
- for (; p != NULL && p->msgId < msgId; q = p, p = p->entries.le_next);
-
- if (p && p->msgId == msgId) {
- free(p->str);
- } else {
- p = xmalloc(sizeof(struct _msgT));
- memset(p, '\0', sizeof(struct _msgT));
-
- if (q == NULL) {
- LIST_INSERT_HEAD(&curSet->msghead, p, entries);
- } else {
- LIST_INSERT_AFTER(q, p, entries);
- }
- }
-
- p->msgId = msgId;
- p->str = xstrdup(str);
- }
-
-void
-MCDelSet(int setId)
-{
- struct _setT *set;
- struct _msgT *msg;
-
- set = sethead.lh_first;
- for (; set != NULL && set->setId < setId; set = set->entries.le_next);
-
- if (set && set->setId == setId) {
-
- msg = set->msghead.lh_first;
- while (msg) {
- free(msg->str);
- LIST_REMOVE(msg, entries);
- }
-
- LIST_REMOVE(set, entries);
- return;
- }
- warning(NULL, "specified set doesn't exist");
- }
-
-void
-MCDelMsg(int msgId)
-{
- struct _msgT *msg;
-
- if (!curSet)
- error("you can't delete a message before defining the set");
-
- msg = curSet->msghead.lh_first;
- for (; msg != NULL && msg->msgId < msgId; msg = msg->entries.le_next);
-
- if (msg && msg->msgId == msgId) {
- free(msg->str);
- LIST_REMOVE(msg, entries);
- return;
- }
- warning(NULL, "specified msg doesn't exist");
-}
diff --git a/usr.bin/getconf/Makefile b/usr.bin/getconf/Makefile
deleted file mode 100644
index eaaf628..0000000
--- a/usr.bin/getconf/Makefile
+++ /dev/null
@@ -1,37 +0,0 @@
-# $FreeBSD$
-
-PROG= getconf
-
-SRCS= confstr.c getconf.c limits.c pathconf.c progenv.c sysconf.c
-CFLAGS+= -I${.CURDIR}
-CLEANFILES+= confstr.c limits.c pathconf.c progenv.c sysconf.c \
- confstr.names limits.names pathconf.names sysconf.names \
- conflicting.names unique.names
-
-.SUFFIXES: .gperf .names
-.PHONY: conflicts
-
-all: conflicts
-
-.gperf.c:
- LC_ALL=C awk -f ${.CURDIR}/fake-gperf.awk ${.IMPSRC} >${.TARGET}
-
-.gperf.names:
- LC_ALL=C awk '/^[_A-Z]/ { print; }' ${.IMPSRC} | \
- sed -e 's/,$$//' >${.TARGET}
-
-conflicts: conflicting.names unique.names
- @if test `wc -l <conflicting.names` != `wc -l <unique.names`; then \
- echo "Name conflicts found!" >&2; \
- exit 1; \
- fi
-
-# pathconf.names is not included here because pathconf names are
-# syntactically distinct from the other kinds.
-conflicting.names: confstr.names limits.names sysconf.names
- cat ${.ALLSRC} >${.TARGET}
-
-unique.names: conflicting.names
- LC_ALL=C sort -u ${.ALLSRC} >${.TARGET}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/getconf/confstr.gperf b/usr.bin/getconf/confstr.gperf
deleted file mode 100644
index c629987..0000000
--- a/usr.bin/getconf/confstr.gperf
+++ /dev/null
@@ -1,70 +0,0 @@
-%{
-/*
- * Copyright is disclaimed as to the contents of this file.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-
-#include <string.h>
-#include <unistd.h>
-
-#include "getconf.h"
-
-/*
- * Override gperf's built-in external scope.
- */
-static const struct map *in_word_set(const char *str);
-
-/*
- * The Standard seems a bit ambiguous over whether the POSIX_V6_*
- * are specified with or without a leading underscore, so we just
- * use both.
- */
-%}
-struct map { const char *name; int key; int valid; };
-%%
-PATH, _CS_PATH
-POSIX_V6_ILP32_OFF32_CFLAGS, _CS_POSIX_V6_ILP32_OFF32_CFLAGS
-POSIX_V6_ILP32_OFF32_LDFLAGS, _CS_POSIX_V6_ILP32_OFF32_LDFLAGS
-POSIX_V6_ILP32_OFF32_LIBS, _CS_POSIX_V6_ILP32_OFF32_LIBS
-POSIX_V6_ILP32_OFFBIG_CFLAGS, _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS
-POSIX_V6_ILP32_OFFBIG_LDFLAGS, _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS
-POSIX_V6_ILP32_OFFBIG_LIBS, _CS_POSIX_V6_ILP32_OFFBIG_LIBS
-POSIX_V6_LP64_OFF64_CFLAGS, _CS_POSIX_V6_LP64_OFF64_CFLAGS
-POSIX_V6_LP64_OFF64_LDFLAGS, _CS_POSIX_V6_LP64_OFF64_LDFLAGS
-POSIX_V6_LP64_OFF64_LIBS, _CS_POSIX_V6_LP64_OFF64_LIBS
-POSIX_V6_LPBIG_OFFBIG_CFLAGS, _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS
-POSIX_V6_LPBIG_OFFBIG_LDFLAGS, _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS
-POSIX_V6_LPBIG_OFFBIG_LIBS, _CS_POSIX_V6_LPBIG_OFFBIG_LIBS
-POSIX_V6_WIDTH_RESTRICTED_ENVS, _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS
-_POSIX_V6_ILP32_OFF32_CFLAGS, _CS_POSIX_V6_ILP32_OFF32_CFLAGS
-_POSIX_V6_ILP32_OFF32_LDFLAGS, _CS_POSIX_V6_ILP32_OFF32_LDFLAGS
-_POSIX_V6_ILP32_OFF32_LIBS, _CS_POSIX_V6_ILP32_OFF32_LIBS
-_POSIX_V6_ILP32_OFFBIG_CFLAGS, _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS
-_POSIX_V6_ILP32_OFFBIG_LDFLAGS, _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS
-_POSIX_V6_ILP32_OFFBIG_LIBS, _CS_POSIX_V6_ILP32_OFFBIG_LIBS
-_POSIX_V6_LP64_OFF64_CFLAGS, _CS_POSIX_V6_LP64_OFF64_CFLAGS
-_POSIX_V6_LP64_OFF64_LDFLAGS, _CS_POSIX_V6_LP64_OFF64_LDFLAGS
-_POSIX_V6_LP64_OFF64_LIBS, _CS_POSIX_V6_LP64_OFF64_LIBS
-_POSIX_V6_LPBIG_OFFBIG_CFLAGS, _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS
-_POSIX_V6_LPBIG_OFFBIG_LDFLAGS, _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS
-_POSIX_V6_LPBIG_OFFBIG_LIBS, _CS_POSIX_V6_LPBIG_OFFBIG_LIBS
-_POSIX_V6_WIDTH_RESTRICTED_ENVS, _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS
-%%
-int
-find_confstr(const char *name, int *key)
-{
- const struct map *rv;
-
- rv = in_word_set(name);
- if (rv != NULL) {
- if (rv->valid) {
- *key = rv->key;
- return 1;
- }
- return -1;
- }
- return 0;
-}
diff --git a/usr.bin/getconf/fake-gperf.awk b/usr.bin/getconf/fake-gperf.awk
deleted file mode 100644
index 96fcd3c..0000000
--- a/usr.bin/getconf/fake-gperf.awk
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/usr/bin/awk -f
-# $FreeBSD$
-BEGIN {
- state = 0;
- struct_seen = "";
-}
-/^%{$/ && state == 0 {
- state = 1;
- next;
-}
-/^%}$/ && state == 1 {
- state = 0;
- next;
-}
-state == 1 { print; next; }
-/^struct/ && state == 0 {
- print;
- struct_seen = $2;
- next;
-}
-/^%%$/ && state == 0 {
- state = 2;
- if (struct_seen !~ /^$/) {
- print "static const struct", struct_seen, "wordlist[] = {";
- } else {
- print "static const struct map {";
- print "\tconst char *name;";
- print "\tint key;";
- print "\tint valid;";
- print "} wordlist[] = {";
- struct_seen = "map";
- }
- next;
-}
-/^%%$/ && state == 2 {
- state = 3;
- print "\t{ NULL, 0, 0 }";
- print "};";
- print "#define\tNWORDS\t(sizeof(wordlist)/sizeof(wordlist[0]) - 1)";
- print "static const struct map *";
- print "in_word_set(const char *word)";
- print "{";
- print "\tconst struct", struct_seen, "*mp;";
- print "";
- print "\tfor (mp = wordlist; mp < &wordlist[NWORDS]; mp++) {";
- print "\t\tif (strcmp(word, mp->name) == 0)";
- print "\t\t\treturn (mp);";
- print "\t}";
- print "\treturn (NULL);";
- print "}";
- print "";
- next;
-}
-state == 2 && NF == 2 {
- name = substr($1, 1, length($1) - 1);
- printf "#ifdef %s\n", $2;
- printf "\t{ \"%s\", %s, 1 },\n", name, $2;
- print "#else";
- printf "\t{ \"%s\", 0, 0 },\n", name, $2;
- print "#endif"
- next;
-}
-state == 3 { print; next; }
-{
- # eat anything not matched.
-}
diff --git a/usr.bin/getconf/getconf.1 b/usr.bin/getconf/getconf.1
deleted file mode 100644
index c3baed9..0000000
--- a/usr.bin/getconf/getconf.1
+++ /dev/null
@@ -1,207 +0,0 @@
-.\"
-.\" Copyright 2000 Massachusetts Institute of Technology
-.\"
-.\" Permission to use, copy, modify, and distribute this software and
-.\" its documentation for any purpose and without fee is hereby
-.\" granted, provided that both the above copyright notice and this
-.\" permission notice appear in all copies, that both the above
-.\" copyright notice and this permission notice appear in all
-.\" supporting documentation, and that the name of M.I.T. not be used
-.\" in advertising or publicity pertaining to distribution of the
-.\" software without specific, written prior permission. M.I.T. makes
-.\" no representations about the suitability of this software for any
-.\" purpose. It is provided "as is" without express or implied
-.\" warranty.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS
-.\" ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
-.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
-.\" SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd September 18, 2002
-.Dt GETCONF 1
-.Os
-.Sh NAME
-.Nm getconf
-.Nd retrieve standard configuration variables
-.Sh SYNOPSIS
-.Nm
-.Op Fl v Ar environment
-.Ar path_var
-.Ar file
-.Nm
-.Op Fl v Ar environment
-.Ar system_var
-.Sh DESCRIPTION
-The
-.Nm
-utility prints the value of a
-.Tn POSIX
-or
-.Tn X/Open
-path or system configuration variable to the standard output.
-If the specified variable is undefined, the string
-.Dq Li undefined
-is output.
-.Pp
-The first form of the command, with two mandatory
-arguments, retrieves file- and file system-specific
-configuration variables using
-.Xr pathconf 2 .
-The second form, with a single argument, retrieves system
-configuration variables using
-.Xr confstr 3
-and
-.Xr sysconf 3 ,
-depending on the type of variable.
-As an extension, the second form can also be used to query static limits from
-.In limits.h .
-.Pp
-All
-.Xr sysconf 3
-and
-.Xr pathconf 2
-variables use the same name as the manifest constants defined in
-the relevant standard C-language bindings, including any leading
-underscore or prefix.
-That is to say,
-.Ar system_var
-might be
-.Dv ARG_MAX
-or
-.Dv _POSIX_VERSION ,
-as opposed to the
-.Xr sysconf 3
-names
-.Dv _SC_ARG_MAX
-or
-.Dv _SC_POSIX_VERSION .
-Variables retrieved from
-.Xr confstr 3
-have the leading
-.Ql _CS_
-stripped off; thus,
-.Dv _CS_PATH
-is queried by a
-.Ar system_var
-of
-.Dq Li PATH .
-.Ss Programming Environments
-The
-.Fl v Ar environment
-option specifies a
-.St -p1003.1-2001
-programming environment under which the values are to be queried.
-This option currently does nothing, but may in the future be used
-to select between 32-bit and 64-bit execution environments on platforms
-which support both.
-Specifying an environment which is not supported on the current execution
-platform gives undefined results.
-.Pp
-The standard programming environments are as follows:
-.Bl -tag -width ".Li POSIX_V6_LPBIG_OFFBIG" -offset indent
-.It Li POSIX_V6_ILP32_OFF32
-Exactly 32-bit integer, long, pointer, and file offset.
-.Sy Supported platforms :
-None.
-.It Li POSIX_V6_ILP32_OFFBIG
-Exactly 32-bit integer, long, and pointer; at least 64-bit file offset.
-.Sy Supported platforms :
-.Tn IA32 ,
-.Tn PowerPC .
-.It Li POSIX_V6_LP64_OFF64
-Exactly 32-bit integer; exactly 64-bit long, pointer, and file offset.
-.Sy Supported platforms :
-.Tn Alpha ,
-.Tn SPARC64 .
-.It Li POSIX_V6_LPBIG_OFFBIG
-At least 32-bit integer; at least 64-bit long, pointer, and file offset.
-.Sy Supported platforms :
-None.
-.El
-.Pp
-The command:
-.Pp
-.Dl "getconf POSIX_V6_WIDTH_RESTRICTED_ENVS"
-.Pp
-returns a newline-separated list of environments in which the width
-of certain fundamental types is no greater than the width of the native
-C type
-.Vt long .
-At present, all programming environments supported by
-.Fx
-have this property.
-Several of the
-.Xr confstr 3
-variables provide information on the necessary compiler and linker flags
-to use the standard programming environments described above.
-.Sh EXIT STATUS
-.Ex -std
-.Sh EXAMPLES
-The command:
-.Pp
-.Dl "getconf PATH"
-.Pp
-will display the system default setting for the
-.Ev PATH
-environment variable.
-.Pp
-The command:
-.Pp
-.Dl "getconf NAME_MAX /tmp"
-.Pp
-will display the maximum length of a filename in the
-.Pa /tmp
-directory.
-.Pp
-The command:
-.Pp
-.Dl "getconf -v POSIX_V6_LPBIG_OFFBIG LONG_MAX"
-.Pp
-will display the maximum value of the C type
-.Vt long
-in the
-.Li POSIX_V6_LPBIG_OFFBIG
-programming environment,
-if the system supports that environment.
-.Sh DIAGNOSTICS
-Use of a
-.Ar system_var
-or
-.Ar path_var
-which is completely unrecognized is considered an error,
-causing a diagnostic message to be written to standard error.
-One
-which is known but merely undefined does not result in an error
-indication.
-The
-.Nm
-utility recognizes all of the variables defined for
-.St -p1003.1-2001 ,
-including those which are not currently implemented.
-.Sh SEE ALSO
-.Xr pathconf 2 ,
-.Xr confstr 3 ,
-.Xr sysconf 3
-.Sh STANDARDS
-The
-.Nm
-utility is expected to be compliant with
-.St -p1003.1-2001 .
-.Sh HISTORY
-The
-.Nm
-utility first appeared in
-.Fx 5.0 .
-.Sh AUTHORS
-.An Garrett A. Wollman Aq wollman@lcs.mit.edu
diff --git a/usr.bin/getconf/getconf.c b/usr.bin/getconf/getconf.c
deleted file mode 100644
index 5f88db6..0000000
--- a/usr.bin/getconf/getconf.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright 2000 Massachusetts Institute of Technology
- *
- * Permission to use, copy, modify, and distribute this software and
- * its documentation for any purpose and without fee is hereby
- * granted, provided that both the above copyright notice and this
- * permission notice appear in all copies, that both the above
- * copyright notice and this permission notice appear in all
- * supporting documentation, and that the name of M.I.T. not be used
- * in advertising or publicity pertaining to distribution of the
- * software without specific, written prior permission. M.I.T. makes
- * no representations about the suitability of this software for any
- * purpose. It is provided "as is" without express or implied
- * warranty.
- *
- * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS
- * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
- * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <err.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sysexits.h>
-#include <unistd.h>
-
-#include "getconf.h"
-
-static void do_confstr(const char *name, int key);
-static void do_sysconf(const char *name, int key);
-static void do_pathconf(const char *name, int key, const char *path);
-
-static void
-usage(void)
-{
- fprintf(stderr,
-"usage: getconf [-v prog_env] system_var\n"
-" getconf [-v prog_env] path_var pathname\n");
- exit(EX_USAGE);
-}
-
-int
-main(int argc, char **argv)
-{
- int c, key, valid;
- const char *name, *vflag, *alt_path;
- intmax_t limitval;
-
- vflag = NULL;
- while ((c = getopt(argc, argv, "v:")) != -1) {
- switch (c) {
- case 'v':
- vflag = optarg;
- break;
-
- default:
- usage();
- }
- }
-
- if ((name = argv[optind]) == NULL)
- usage();
-
- if (vflag != NULL) {
- if ((valid = find_progenv(vflag, &alt_path)) == 0)
- errx(EX_USAGE, "invalid programming environment %s",
- vflag);
- if (valid > 0 && alt_path != NULL) {
- if (argv[optind + 1] == NULL)
- execl(alt_path, "getconf", argv[optind],
- (char *)NULL);
- else
- execl(alt_path, "getconf", argv[optind],
- argv[optind + 1], (char *)NULL);
-
- err(EX_OSERR, "execl: %s", alt_path);
- }
- if (valid < 0)
- errx(EX_UNAVAILABLE, "environment %s is not available",
- vflag);
- }
-
- if (argv[optind + 1] == NULL) { /* confstr or sysconf */
- if ((valid = find_limit(name, &limitval)) != 0) {
- if (valid > 0)
- printf("%" PRIdMAX "\n", limitval);
- else
- printf("undefined\n");
-
- return 0;
- }
- if ((valid = find_confstr(name, &key)) != 0) {
- if (valid > 0)
- do_confstr(name, key);
- else
- printf("undefined\n");
- } else {
- valid = find_sysconf(name, &key);
- if (valid > 0) {
- do_sysconf(name, key);
- } else if (valid < 0) {
- printf("undefined\n");
- } else
- errx(EX_USAGE,
- "no such configuration parameter `%s'",
- name);
- }
- } else {
- valid = find_pathconf(name, &key);
- if (valid != 0) {
- if (valid > 0)
- do_pathconf(name, key, argv[optind + 1]);
- else
- printf("undefined\n");
- } else
- errx(EX_USAGE,
- "no such path configuration parameter `%s'",
- name);
- }
- return 0;
-}
-
-static void
-do_confstr(const char *name, int key)
-{
- size_t len;
- int savederr;
-
- savederr = errno;
- errno = 0;
- len = confstr(key, 0, 0);
- if (len == 0) {
- if (errno)
- err(EX_OSERR, "confstr: %s", name);
- else
- printf("undefined\n");
- } else {
- char buf[len + 1];
-
- confstr(key, buf, len);
- printf("%s\n", buf);
- }
- errno = savederr;
-}
-
-static void
-do_sysconf(const char *name, int key)
-{
- long value;
-
- errno = 0;
- value = sysconf(key);
- if (value == -1 && errno != 0)
- err(EX_OSERR, "sysconf: %s", name);
- else if (value == -1)
- printf("undefined\n");
- else
- printf("%ld\n", value);
-}
-
-static void
-do_pathconf(const char *name, int key, const char *path)
-{
- long value;
-
- errno = 0;
- value = pathconf(path, key);
- if (value == -1 && errno != 0)
- err(EX_OSERR, "pathconf: %s", name);
- else if (value == -1)
- printf("undefined\n");
- else
- printf("%ld\n", value);
-}
-
diff --git a/usr.bin/getconf/getconf.h b/usr.bin/getconf/getconf.h
deleted file mode 100644
index 266a0ff..0000000
--- a/usr.bin/getconf/getconf.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2000 Massachusetts Institute of Technology
- *
- * Permission to use, copy, modify, and distribute this software and
- * its documentation for any purpose and without fee is hereby
- * granted, provided that both the above copyright notice and this
- * permission notice appear in all copies, that both the above
- * copyright notice and this permission notice appear in all
- * supporting documentation, and that the name of M.I.T. not be used
- * in advertising or publicity pertaining to distribution of the
- * software without specific, written prior permission. M.I.T. makes
- * no representations about the suitability of this software for any
- * purpose. It is provided "as is" without express or implied
- * warranty.
- *
- * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS
- * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
- * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifdef STABLE
-typedef long long intmax_t;
-#define PRIdMAX "lld"
-#else
-#include <inttypes.h>
-#endif
-
-int find_confstr(const char *name, int *key);
-int find_limit(const char *name, intmax_t *value);
-int find_pathconf(const char *name, int *key);
-int find_progenv(const char *name, const char **alt_path);
-int find_sysconf(const char *name, int *key);
diff --git a/usr.bin/getconf/limits.gperf b/usr.bin/getconf/limits.gperf
deleted file mode 100644
index 68e0d65..0000000
--- a/usr.bin/getconf/limits.gperf
+++ /dev/null
@@ -1,118 +0,0 @@
-%{
-/*
- * Copyright is disclaimed as to the contents of this file.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-
-#include <string.h>
-#include <limits.h>
-
-#include "getconf.h"
-
-/*
- * Override gperf's built-in external scope.
- */
-static const struct map *in_word_set(const char *str);
-
-%}
-struct map { const char *name; intmax_t value; int valid; };
-%%
-_POSIX_CLOCKRES_MIN, _POSIX_CLOCKRES_MIN
-_POSIX_AIO_LISTIO_MAX, _POSIX_AIO_LISTIO_MAX
-_POSIX_AIO_MAX, _POSIX_AIO_MAX
-_POSIX_ARG_MAX, _POSIX_ARG_MAX
-_POSIX_CHILD_MAX, _POSIX_CHILD_MAX
-_POSIX_DELAYTIMER_MAX, _POSIX_DELAYTIMER_MAX
-_POSIX_HOST_NAME_MAX, _POSIX_HOST_NAME_MAX
-_POSIX_LINK_MAX, _POSIX_LINK_MAX
-_POSIX_LOGIN_NAME_MAX, _POSIX_LOGIN_NAME_MAX
-_POSIX_MAX_CANON, _POSIX_MAX_CANON
-_POSIX_MAX_INPUT, _POSIX_MAX_INPUT
-_POSIX_MQ_OPEN_MAX, _POSIX_MQ_OPEN_MAX
-_POSIX_MQ_PRIO_MAX, _POSIX_MQ_PRIO_MAX
-_POSIX_NAME_MAX, _POSIX_NAME_MAX
-_POSIX_NGROUPS_MAX, _POSIX_NGROUPS_MAX
-_POSIX_OPEN_MAX, _POSIX_OPEN_MAX
-_POSIX_PATH_MAX, _POSIX_PATH_MAX
-_POSIX_PIPE_BUF, __POSIX_PIPE_BUF
-_POSIX_RE_DUP_MAX, _POSIX_RE_DUP_MAX
-_POSIX_RTSIG_MAX, _POSIX_RTSIG_MAX
-_POSIX_SEM_NSEMS_MAX, _POSIX_SEM_NSEMS_MAX
-_POSIX_SEM_VALUE_MAX, _POSIX_SEM_VALUE_MAX
-_POSIX_SIGQUEUE_MAX, _POSIX_SIGQUEUE_MAX
-_POSIX_SSIZE_MAX, _POSIX_SSIZE_MAX
-_POSIX_STREAM_MAX, _POSIX_STREAM_MAX
-_POSIX_SS_REPL_MAX, _POSIX_SS_REPL_MAX
-_POSIX_SYMLINK_MAX, _POSIX_SYMLINK_MAX
-_POSIX_SYMLOOP_MAX, _POSIX_SYMLOOP_MAX
-_POSIX_THREAD_DESTRUCTOR_ITERATIONS, _POSIX_THREAD_DESTRUCTOR_ITERATIONS
-_POSIX_THREAD_KEYS_MAX, _POSIX_THREAD_KEYS_MAX
-_POSIX_THREAD_THREADS_MAX, _POSIX_THREAD_THREADS_MAX
-_POSIX_TIMER_MAX, _POSIX_TIMER_MAX
-_POSIX_TRACE_EVENT_NAME_MAX, _POSIX_TRACE_EVENT_NAME_MAX
-_POSIX_TRACE_NAME_MAX, _POSIX_TRACE_NAME_MAX
-_POSIX_TRACE_SYS_MAX, _POSIX_TRACE_SYS_MAX
-_POSIX_TRACE_USER_EVENT_MAX, _POSIX_TRACE_USER_EVENT_MAX
-_POSIX_TTY_NAME_MAX, _POSIX_TTY_NAME_MAX
-_POSIX_TZNAME_MAX, _POSIX_TZNAME_MAX
-_POSIX2_BC_BASE_MAX, _POSIX2_BC_BASE_MAX
-_POSIX2_BC_DIM_MAX, _POSIX2_BC_DIM_MAX
-_POSIX2_BC_SCALE_MAX, _POSIX2_BC_SCALE_MAX
-_POSIX2_BC_STRING_MAX, _POSIX2_BC_STRING_MAX
-_POSIX2_CHARCLASS_NAME_MAX, _POSIX2_CHARCLASS_NAME_MAX
-_POSIX2_COLL_WEIGHTS_MAX, _POSIX2_COLL_WEIGHTS_MAX
-_POSIX2_EXPR_NEXT_MAX, _POSIX2_EXPR_NEST_MAX
-_POSIX2_LINE_MAX, _POSIX2_LINE_MAX
-_POSIX2_RE_DUP_MAX, _POSIX2_RE_DUP_MAX
-_XOPEN_IOV_MAX, _XOPEN_IOV_MAX
-_XOPEN_NAME_MAX, _XOPEN_NAME_MAX
-_XOPEN_PATH_MAX, _XOPEN_PATH_MAX
-CHAR_BIT, CHAR_BIT
-CHAR_MAX, CHAR_MAX
-CHAR_MIN, CHAR_MIN
-INT_MAX, INT_MAX
-INT_MIN, INT_MIN
-LLONG_MIN, LLONG_MIN
-LLONG_MAX, LLONG_MAX
-LONG_BIT, LONG_BIT
-LONG_MAX, LONG_MAX
-LONG_MIN, LONG_MIN
-MB_LEN_MAX, MB_LEN_MAX
-SCHAR_MAX, SCHAR_MAX
-SCHAR_MIN, SCHAR_MIN
-SHRT_MAX, SHRT_MAX
-SHRT_MIN, SHRT_MIN
-SSIZE_MAX, SSIZE_MAX
-UCHAR_MAX, UCHAR_MAX
-UINT_MAX, UINT_MAX
-ULLONG_MAX, ULLONG_MAX
-ULONG_MAX, ULONG_MAX
-USHRT_MAX, USHRT_MAX
-WORD_BIT, WORD_BIT
-CHARCLASS_NAME_MAX, CHARCLASS_NAME_MAX
-NL_ARGMAX, NL_ARGMAX
-ML_LANGMAX, NL_LANGMAX
-NL_MSGMAX, NL_MSGMAX
-NL_NMAX, NL_NMAX
-NL_SETMAX, NL_SETMAX
-NL_TEXTMAX, NL_TEXTMAX
-NZERO, NZERO
-%%
-int
-find_limit(const char *name, intmax_t *value)
-{
- const struct map *rv;
-
- rv = in_word_set(name);
- if (rv != NULL) {
- if (rv->valid) {
- *value = rv->value;
- return 1;
- }
- return -1;
- }
- return 0;
-}
diff --git a/usr.bin/getconf/pathconf.gperf b/usr.bin/getconf/pathconf.gperf
deleted file mode 100644
index e8b8365..0000000
--- a/usr.bin/getconf/pathconf.gperf
+++ /dev/null
@@ -1,62 +0,0 @@
-%{
-/*
- * Copyright is disclaimed as to the contents of this file.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-
-#include <string.h>
-#include <unistd.h>
-
-#include "getconf.h"
-
-/*
- * Override gperf's built-in external scope.
- */
-static const struct map *in_word_set(const char *str);
-
-%}
-struct map { const char *name; int key; int valid; };
-%%
-FILESIZEBITS, _PC_FILESIZEBITS
-LINK_MAX, _PC_LINK_MAX
-MAX_CANON, _PC_MAX_CANON
-MAX_INPUT, _PC_MAX_INPUT
-NAME_MAX, _PC_NAME_MAX
-PATH_MAX, _PC_PATH_MAX
-PIPE_BUF, _PC_PIPE_BUF
-POSIX_ALLOC_SIZE_MIN, _PC_ALLOC_SIZE_MIN
-POSIX_REC_INCR_XFER_SIZE, _PC_REC_INCR_XFER_SIZE
-POSIX_REC_MAX_XFER_SIZE, _PC_REC_MAX_XFER_SIZE
-POSIX_REC_MIN_XFER_SIZE, _PC_REC_MIN_XFER_SIZE
-POSIX_REC_XFER_ALIGN, _PC_REC_XFER_ALIGN
-SYMLINK_MAX, _PC_SYMLINK_MAX
-TRUSTEDBSD_ACL_EXTENDED, _PC_ACL_EXTENDED
-TRUSTEDBSD_ACL_PATH_MAX, _PC_ACL_PATH_MAX
-TRUSTEDBSD_CAP_PRESENT, _PC_CAP_PRESENT
-TRUSTEDBSD_INF_PRESENT, _PC_INF_PRESENT
-TRUSTEDBSD_MAC_PRESENT, _PC_MAC_PRESENT
-_POSIX_CHOWN_RESTRICTED, _PC_CHOWN_RESTRICTED
-_POSIX_NO_TRUNC, _PC_NO_TRUNC
-_POSIX_VDISABLE, _PC_VDISABLE
-_POSIX_ASYNC_IO, _PC_ASYNC_IO
-_POSIX_PRIO_IO, _PC_PRIO_IO
-_POSIX_SYNC_IO, _PC_SYNC_IO
-%%
-int
-find_pathconf(const char *name, int *key)
-{
- const struct map *rv;
-
- rv = in_word_set(name);
- if (rv != NULL) {
- if (rv->valid) {
- *key = rv->key;
- return 1;
- }
- return -1;
- }
- return 0;
-}
diff --git a/usr.bin/getconf/progenv.gperf b/usr.bin/getconf/progenv.gperf
deleted file mode 100644
index 40ce16a..0000000
--- a/usr.bin/getconf/progenv.gperf
+++ /dev/null
@@ -1,67 +0,0 @@
-%{
-/*
- * Copyright is disclaimed as to the contents of this file.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-
-#include <string.h>
-#include <unistd.h>
-
-#include "getconf.h"
-
-/*
- * Override gperf's built-in external scope.
- */
-static const struct map *in_word_set(const char *str);
-
-/*
- * The Standard seems a bit ambiguous over whether the POSIX_V6_*
- * are specified with or without a leading underscore, so we just
- * use both.
- */
-/*
- * The alt_path member gives the path containing another `getconf'
- * executable which was compiled using the specified programming
- * environment. If it is NULL, the current executable is good enough.
- * If we ever support multiple environments, this table will need to
- * be updated. (We cheat here and define the supported environments
- * statically.)
- */
-#if defined(__alpha__) || defined(__sparc64__) || defined(__amd64__)
-#define have_LP64_OFF64 NULL
-#endif
-
-#if defined(__i386__) || defined(__powerpc__)
-#define have_ILP32_OFFBIG NULL
-#endif
-
-%}
-struct map { const char *name; const char *alt_path; int valid; };
-%%
-POSIX_V6_ILP32_OFF32, notdef
-POSIX_V6_ILP32_OFFBIG, have_ILP32_OFFBIG
-POSIX_V6_LP64_OFF64, have_LP64_OFF64
-POSIX_V6_LPBIG_OFFBIG, notdef
-_POSIX_V6_ILP32_OFF32, notdef
-_POSIX_V6_ILP32_OFFBIG, have_ILP32_OFFBIG
-_POSIX_V6_LP64_OFF64, have_LP64_OFF64
-_POSIX_V6_LPBIG_OFFBIG, notdef
-%%
-int
-find_progenv(const char *name, const char **alt_path)
-{
- const struct map *rv;
-
- rv = in_word_set(name);
- if (rv != NULL) {
- if (rv->valid) {
- *alt_path = rv->alt_path;
- return 1;
- }
- return -1;
- }
- return 0;
-}
diff --git a/usr.bin/getconf/sysconf.gperf b/usr.bin/getconf/sysconf.gperf
deleted file mode 100644
index ae88464..0000000
--- a/usr.bin/getconf/sysconf.gperf
+++ /dev/null
@@ -1,149 +0,0 @@
-%{
-/*
- * Copyright is disclaimed as to the contents of this file.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-
-#include <string.h>
-#include <unistd.h>
-
-#include "getconf.h"
-
-/*
- * Override gperf's built-in external scope.
- */
-static const struct map *in_word_set(const char *str);
-
-%}
-struct map { const char *name; int key; int valid; };
-%%
-AIO_LISTIO_MAX, _SC_AIO_LISTIO_MAX
-AIO_MAX, _SC_AIO_MAX
-AIO_PRIO_DELTA_MAX, _SC_AIO_PRIO_DELTA_MAX
-ARG_MAX, _SC_ARG_MAX
-ATEXIT_MAX, _SC_ATEXIT_MAX
-BC_BASE_MAX, _SC_BC_BASE_MAX
-BC_DIM_MAX, _SC_BC_DIM_MAX
-BC_SCALE_MAX, _SC_BC_SCALE_MAX
-BC_STRING_MAX, _SC_BC_STRING_MAX
-CHILD_MAX, _SC_CHILD_MAX
-CLK_TCK, _SC_CLK_TCK
-COLL_WEIGHTS_MAX, _SC_COLL_WEIGHTS_MAX
-DELAYTIMER_MAX, _SC_DELAYTIMER_MAX
-EXPR_NEST_MAX, _SC_EXPR_NEST_MAX
-GETGR_R_SIZE_MAX, _SC_GETGR_R_SIZE_MAX
-GETPW_R_SIZE_MAX, _SC_GETPW_R_SIZE_MAX
-HOST_NAME_MAX, _SC_HOST_NAME_MAX
-IOV_MAX, _SC_IOV_MAX
-LINE_MAX, _SC_LINE_MAX
-LOGIN_NAME_MAX, _SC_LOGIN_NAME_MAX
-MQ_OPEN_MAX, _SC_MQ_OPEN_MAX
-MQ_PRIO_MAX, _SC_MQ_PRIO_MAX
-NGROUPS_MAX, _SC_NGROUPS_MAX
-NPROCESSORS_CONF, _SC_NPROCESSORS_CONF
-NPROCESSORS_ONLN, _SC_NPROCESSORS_ONLN
-OPEN_MAX, _SC_OPEN_MAX
-PAGESIZE, _SC_PAGESIZE
-PAGE_SIZE, _SC_PAGESIZE
-PASS_MAX, _SC_PASS_MAX
-PTHREAD_DESTRUCTOR_ITERATIONS, _SC_THREAD_DESTRUCTOR_ITERATIONS
-PTHREAD_KEYS_MAX, _SC_THREAD_KEYS_MAX
-PTHREAD_STACK_MIN, _SC_THREAD_STACK_MIN
-PTHREAD_THREADS_MAX, _SC_THREAD_THREADS_MAX
-RE_DUP_MAX, _SC_RE_DUP_MAX
-RTSIG_MAX, _SC_RTSIG_MAX
-SEM_NSEMS_MAX, _SC_SEM_NSEMS_MAX
-SEM_VALUE_MAX, _SC_SEM_VALUE_MAX
-SIGQUEUE_MAX, _SC_SIGQUEUE_MAX
-STREAM_MAX, _SC_STREAM_MAX
-SYMLOOP_MAX, _SC_SYMLOOP_MAX
-TIMER_MAX, _SC_TIMER_MAX
-TTY_NAME_MAX, _SC_TTY_NAME_MAX
-TZNAME_MAX, _SC_TZNAME_MAX
-_POSIX2_CHAR_TERM, _SC_2_CHAR_TERM
-_POSIX2_C_BIND, _SC_2_C_BIND
-_POSIX2_C_DEV, _SC_2_C_DEV
-_POSIX2_C_VERSION, _SC_2_C_VERSION
-_POSIX2_FORT_DEV, _SC_2_FORT_DEV
-_POSIX2_FORT_RUN, _SC_2_FORT_RUN
-_POSIX2_LOCALEDEF, _SC_2_LOCALEDEF
-_POSIX2_SW_DEV, _SC_2_SW_DEV
-_POSIX2_UPE, _SC_2_UPE
-_POSIX2_VERSION, _SC_2_VERSION
-_POSIX_ASYNCHRONOUS_IO, _SC_ASYNCHRONOUS_IO
-_POSIX_BARRIERS, _SC_BARRIERS
-_POSIX_CLOCK_SELECTION, _SC_CLOCK_SELECTION
-_POSIX_CPUTIME, _SC_CPUTIME
-_POSIX_FILE_LOCKING, _SC_FILE_LOCKING
-_POSIX_FSYNC, _SC_FSYNC
-_POSIX_IPV6, _SC_IPV6
-_POSIX_JOB_CONTROL, _SC_JOB_CONTROL
-_POSIX_MAPPED_FILES, _SC_MAPPED_FILES
-_POSIX_MEMLOCK, _SC_MEMLOCK
-_POSIX_MEMLOCK_RANGE, _SC_MEMLOCK_RANGE
-_POSIX_MEMORY_PROTECTION, _SC_MEMORY_PROTECTION
-_POSIX_MESSAGE_PASSING, _SC_MESSAGE_PASSING
-_POSIX_MONOTONIC_CLOCK, _SC_MONOTONIC_CLOCK
-_POSIX_PRIORITIZED_IO, _SC_PRIORITIZED_IO
-_POSIX_PRIORITY_SCHEDULING, _SC_PRIORITY_SCHEDULING
-_POSIX_READER_WRITER_LOCKS, _SC_READER_WRITER_LOCKS
-_POSIX_REALTIME_SIGNALS, _SC_REALTIME_SIGNALS
-_POSIX_REGEXP, _SC_REGEXP
-_POSIX_SAVED_IDS, _SC_SAVED_IDS
-_POSIX_SEMAPHORES, _SC_SEMAPHORES
-_POSIX_SHARED_MEMORY_OBJECTS, _SC_SHARED_MEMORY_OBJECTS
-_POSIX_SHELL, _SC_SHELL
-_POSIX_SPAWN, _SC_SPAWN
-_POSIX_SPIN_LOCKS, _SC_SPIN_LOCKS
-_POSIX_SPORADIC_SERVER, _SC_SPORADIC_SERVER
-_POSIX_SYNCHRONIZED_IO, _SC_SYNCHRONIZED_IO
-_POSIX_THREADS, _SC_THREADS
-_POSIX_THREAD_ATTR_STACKADDR, _SC_THREAD_ATTR_STACKADDR
-_POSIX_THREAD_ATTR_STACKSIZE, _SC_THREAD_ATTR_STACKSIZE
-_POSIX_THREAD_CPUTIME, _SC_THREAD_CPUTIME
-_POSIX_THREAD_PRIORITY_SCHEDULING, _SC_THREAD_PRIORITY_SCHEDULING
-_POSIX_THREAD_PRIO_INHERIT, _SC_THREAD_PRIO_INHERIT
-_POSIX_THREAD_PRIO_PROTECT, _SC_THREAD_PRIO_PROTECT
-_POSIX_THREAD_PROCESS_SHARED, _SC_THREAD_PROCESS_SHARED
-_POSIX_THREAD_SAFE_FUNCTIONS, _SC_THREAD_SAFE_FUNCTIONS
-_POSIX_THREAD_SPORADIC_SERVER, _SC_THREAD_SPORADIC_SERVER
-_POSIX_TIMEOUTS, _SC_TIMEOUTS
-_POSIX_TRACE, _SC_TRACE
-_POSIX_TRACE_EVENT_FILTER, _SC_TRACE_EVENT_FILTER
-_POSIX_TRACE_INHERIT, _SC_TRACE_INHERIT
-_POSIX_TRACE_LOG, _SC_TRACE_LOG
-_POSIX_TIMERS, _SC_TIMERS
-_POSIX_TYPED_MEMORY_OBJECTS, _SC_TYPED_MEMORY_OBJECTS
-_POSIX_VERSION, _SC_VERSION
-_POSIX_V6_ILP32_OFF32, _SC_V6_ILP32_OFF32
-_POSIX_V6_ILP32_OFFBIG, _SC_V6_ILP32_OFFBIG
-_POSIX_V6_LP64_OFF64, _SC_V6_LP64_OFF64
-_POSIX_V6_LP64_OFFBIG, _SC_V6_LP64_OFFBIG
-_XOPEN_CRYPT, _SC_XOPEN_CRYPT
-_XOPEN_ENH_I18N, _SC_XOPEN_ENH_I18N
-_XOPEN_LEGACY, _SC_XOPEN_LEGACY
-_XOPEN_REALTIME, _SC_XOPEN_REALTIME
-_XOPEN_REALTIME_THREADS, _SC_XOPEN_REALTIME_THREADS
-_XOPEN_SHM, _SC_XOPEN_SHM
-_XOPEN_UNIX, _SC_XOPEN_UNIX
-_XOPEN_VERSION, _SC_XOPEN_VERSION
-_XOPEN_XCU_VERSION, _SC_XCU_VERSION
-%%
-int
-find_sysconf(const char *name, int *key)
-{
- const struct map *rv;
-
- rv = in_word_set(name);
- if (rv != NULL) {
- if (rv->valid) {
- *key = rv->key;
- return 1;
- }
- return -1;
- }
- return 0;
-}
diff --git a/usr.bin/getent/Makefile b/usr.bin/getent/Makefile
deleted file mode 100644
index 6cc3d56..0000000
--- a/usr.bin/getent/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# $FreeBSD$
-
-PROG= getent
-WARNS?= 3
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/getent/getent.1 b/usr.bin/getent/getent.1
deleted file mode 100644
index a18d341..0000000
--- a/usr.bin/getent/getent.1
+++ /dev/null
@@ -1,132 +0,0 @@
-.\" $NetBSD: getent.1,v 1.13 2005/09/11 23:16:15 wiz Exp $
-.\"
-.\" Copyright (c) 2004 The NetBSD Foundation, Inc.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to The NetBSD Foundation
-.\" by Luke Mewburn.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the NetBSD
-.\" Foundation, Inc. and its contributors.
-.\" 4. Neither the name of The NetBSD Foundation nor the names of its
-.\" contributors may be used to endorse or promote products derived
-.\" from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-.\" POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd August 24, 2005
-.Dt GETENT 1
-.Os
-.Sh NAME
-.Nm getent
-.Nd get entries from administrative database
-.Sh SYNOPSIS
-.Nm
-.Ar database
-.Op Ar key ...
-.Sh DESCRIPTION
-The
-.Nm
-utility retrieves and displays entries from the administrative
-database specified by
-.Ar database ,
-using the lookup order specified in
-.Xr nsswitch.conf 5 .
-The display format for a given
-.Ar database
-is as per the
-.Dq traditional
-file format for that database.
-.Pp
-The
-.Ar database
-argument may be one of:
-.Pp
-.Bl -column ".Li netgroup" -offset indent -compact
-.Sy Database Ta Sy Display format
-.It Li ethers Ta address name
-.It Li group Ta group:passwd:gid:[member[,member]...]
-.It Li hosts Ta address name [alias ...]
-.It Li networks Ta name network [alias ...]
-.It Li passwd Ta user:passwd:uid:gid:gecos:home_dir:shell
-.It Li protocols Ta name protocol [alias ...]
-.It Li rpc Ta name number [alias ...]
-.It Li services Ta name port/protocol [alias ...]
-.It Li shells Ta /path/to/shell
-.El
-.Pp
-If one or more
-.Ar key
-arguments are provided, they will be looked up in
-.Ar database
-using the appropriate function.
-For example,
-.Dq Li passwd
-supports a numeric UID or user name;
-.Dq Li hosts
-supports an IPv4 address, IPv6 address, or host name;
-and
-.Dq Li services
-supports a service name, service name/protocol name, numeric port, or
-numeric port/protocol name.
-.Pp
-If no
-.Ar key
-is provided and
-.Ar database
-supports enumeration, all entries for
-.Ar database
-will be retrieved using the appropriate enumeration function and printed.
-.Sh EXIT STATUS
-The
-.Nm
-utility exits 0 on success,
-1 if there was an error in the command syntax,
-2 if one of the specified key names was not found in
-.Ar database ,
-or 3 if there is no support for enumeration on
-.Ar database .
-.Sh SEE ALSO
-.Xr ethers 5 ,
-.Xr group 5 ,
-.Xr hosts 5 ,
-.Xr networks 5 ,
-.Xr nsswitch.conf 5 ,
-.Xr passwd 5 ,
-.Xr protocols 5 ,
-.Xr rpc 5 ,
-.Xr services 5 ,
-.Xr shells 5
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.Nx 3.0 ,
-and was imported into
-.Fx 7.0 .
-It was based on the command of the same name in
-.Tn Solaris
-and
-.Tn Linux .
diff --git a/usr.bin/getent/getent.c b/usr.bin/getent/getent.c
deleted file mode 100644
index d755813..0000000
--- a/usr.bin/getent/getent.c
+++ /dev/null
@@ -1,564 +0,0 @@
-/* $NetBSD: getent.c,v 1.7 2005/08/24 14:31:02 ginsbach Exp $ */
-
-/*-
- * Copyright (c) 2004 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Luke Mewburn.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/socket.h>
-#include <sys/param.h>
-#include <arpa/inet.h>
-#include <arpa/nameser.h>
-#include <net/if.h>
-#include <netinet/if_ether.h>
-#include <netinet/in.h> /* for INET6_ADDRSTRLEN */
-#include <rpc/rpcent.h>
-
-#include <assert.h>
-#include <ctype.h>
-#include <errno.h>
-#include <grp.h>
-#include <limits.h>
-#include <netdb.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-static int usage(void);
-static int parsenum(const char *, unsigned long *);
-static int ethers(int, char *[]);
-static int group(int, char *[]);
-static int hosts(int, char *[]);
-static int networks(int, char *[]);
-static int passwd(int, char *[]);
-static int protocols(int, char *[]);
-static int rpc(int, char *[]);
-static int services(int, char *[]);
-static int shells(int, char *[]);
-
-enum {
- RV_OK = 0,
- RV_USAGE = 1,
- RV_NOTFOUND = 2,
- RV_NOENUM = 3
-};
-
-static struct getentdb {
- const char *name;
- int (*callback)(int, char *[]);
-} databases[] = {
- { "ethers", ethers, },
- { "group", group, },
- { "hosts", hosts, },
- { "networks", networks, },
- { "passwd", passwd, },
- { "protocols", protocols, },
- { "rpc", rpc, },
- { "services", services, },
- { "shells", shells, },
-
- { NULL, NULL, },
-};
-
-int
-main(int argc, char *argv[])
-{
- struct getentdb *curdb;
-
- setprogname(argv[0]);
-
- if (argc < 2)
- usage();
- for (curdb = databases; curdb->name != NULL; curdb++) {
- if (strcmp(curdb->name, argv[1]) == 0) {
- exit(curdb->callback(argc, argv));
- }
- }
- fprintf(stderr, "Unknown database: %s\n", argv[1]);
- usage();
- /* NOTREACHED */
- return RV_USAGE;
-}
-
-static int
-usage(void)
-{
- struct getentdb *curdb;
-
- fprintf(stderr, "Usage: %s database [key ...]\n",
- getprogname());
- fprintf(stderr, " database may be one of:\n\t");
- for (curdb = databases; curdb->name != NULL; curdb++) {
- fprintf(stderr, " %s", curdb->name);
- }
- fprintf(stderr, "\n");
- exit(RV_USAGE);
- /* NOTREACHED */
-}
-
-static int
-parsenum(const char *word, unsigned long *result)
-{
- unsigned long num;
- char *ep;
-
- assert(word != NULL);
- assert(result != NULL);
-
- if (!isdigit((unsigned char)word[0]))
- return 0;
- errno = 0;
- num = strtoul(word, &ep, 10);
- if (num == ULONG_MAX && errno == ERANGE)
- return 0;
- if (*ep != '\0')
- return 0;
- *result = num;
- return 1;
-}
-
-/*
- * printfmtstrings --
- * vprintf(format, ...),
- * then the aliases (beginning with prefix, separated by sep),
- * then a newline
- */
-static void
-printfmtstrings(char *strings[], const char *prefix, const char *sep,
- const char *fmt, ...)
-{
- va_list ap;
- const char *curpref;
- int i;
-
- va_start(ap, fmt);
- vprintf(fmt, ap);
-
- curpref = prefix;
- for (i = 0; strings[i] != NULL; i++) {
- printf("%s%s", curpref, strings[i]);
- curpref = sep;
- }
- printf("\n");
- va_end(ap);
-}
-
-/*
- * ethers
- */
-static int
-ethers(int argc, char *argv[])
-{
- char hostname[MAXHOSTNAMELEN + 1], *hp;
- struct ether_addr ea, *eap;
- int i, rv;
-
- assert(argc > 1);
- assert(argv != NULL);
-
-#define ETHERSPRINT printf("%-17s %s\n", ether_ntoa(eap), hp)
-
- rv = RV_OK;
- if (argc == 2) {
- fprintf(stderr, "Enumeration not supported on ethers\n");
- rv = RV_NOENUM;
- } else {
- for (i = 2; i < argc; i++) {
- if ((eap = ether_aton(argv[i])) == NULL) {
- eap = &ea;
- hp = argv[i];
- if (ether_hostton(hp, eap) != 0) {
- rv = RV_NOTFOUND;
- break;
- }
- } else {
- hp = hostname;
- if (ether_ntohost(hp, eap) != 0) {
- rv = RV_NOTFOUND;
- break;
- }
- }
- ETHERSPRINT;
- }
- }
- return rv;
-}
-
-/*
- * group
- */
-
-static int
-group(int argc, char *argv[])
-{
- struct group *gr;
- unsigned long id;
- int i, rv;
-
- assert(argc > 1);
- assert(argv != NULL);
-
-#define GROUPPRINT printfmtstrings(gr->gr_mem, ":", ",", "%s:%s:%u", \
- gr->gr_name, gr->gr_passwd, gr->gr_gid)
-
- setgroupent(1);
- rv = RV_OK;
- if (argc == 2) {
- while ((gr = getgrent()) != NULL)
- GROUPPRINT;
- } else {
- for (i = 2; i < argc; i++) {
- if (parsenum(argv[i], &id))
- gr = getgrgid((gid_t)id);
- else
- gr = getgrnam(argv[i]);
- if (gr != NULL)
- GROUPPRINT;
- else {
- rv = RV_NOTFOUND;
- break;
- }
- }
- }
- endgrent();
- return rv;
-}
-
-
-/*
- * hosts
- */
-
-static void
-hostsprint(const struct hostent *he)
-{
- char buf[INET6_ADDRSTRLEN];
-
- assert(he != NULL);
- if (inet_ntop(he->h_addrtype, he->h_addr, buf, sizeof(buf)) == NULL)
- strlcpy(buf, "# unknown", sizeof(buf));
- printfmtstrings(he->h_aliases, " ", " ", "%-16s %s", buf, he->h_name);
-}
-
-static int
-hosts(int argc, char *argv[])
-{
- struct hostent *he;
- char addr[IN6ADDRSZ];
- int i, rv;
-
- assert(argc > 1);
- assert(argv != NULL);
-
- sethostent(1);
- rv = RV_OK;
- if (argc == 2) {
- while ((he = gethostent()) != NULL)
- hostsprint(he);
- } else {
- for (i = 2; i < argc; i++) {
- if (inet_pton(AF_INET6, argv[i], (void *)addr) > 0)
- he = gethostbyaddr(addr, IN6ADDRSZ, AF_INET6);
- else if (inet_pton(AF_INET, argv[i], (void *)addr) > 0)
- he = gethostbyaddr(addr, INADDRSZ, AF_INET);
- else
- he = gethostbyname(argv[i]);
- if (he != NULL)
- hostsprint(he);
- else {
- rv = RV_NOTFOUND;
- break;
- }
- }
- }
- endhostent();
- return rv;
-}
-
-/*
- * networks
- */
-static void
-networksprint(const struct netent *ne)
-{
- char buf[INET6_ADDRSTRLEN];
- struct in_addr ianet;
-
- assert(ne != NULL);
- ianet = inet_makeaddr(ne->n_net, 0);
- if (inet_ntop(ne->n_addrtype, &ianet, buf, sizeof(buf)) == NULL)
- strlcpy(buf, "# unknown", sizeof(buf));
- printfmtstrings(ne->n_aliases, " ", " ", "%-16s %s", ne->n_name, buf);
-}
-
-static int
-networks(int argc, char *argv[])
-{
- struct netent *ne;
- in_addr_t net;
- int i, rv;
-
- assert(argc > 1);
- assert(argv != NULL);
-
- setnetent(1);
- rv = RV_OK;
- if (argc == 2) {
- while ((ne = getnetent()) != NULL)
- networksprint(ne);
- } else {
- for (i = 2; i < argc; i++) {
- net = inet_network(argv[i]);
- if (net != INADDR_NONE)
- ne = getnetbyaddr(net, AF_INET);
- else
- ne = getnetbyname(argv[i]);
- if (ne != NULL)
- networksprint(ne);
- else {
- rv = RV_NOTFOUND;
- break;
- }
- }
- }
- endnetent();
- return rv;
-}
-
-/*
- * passwd
- */
-static int
-passwd(int argc, char *argv[])
-{
- struct passwd *pw;
- unsigned long id;
- int i, rv;
-
- assert(argc > 1);
- assert(argv != NULL);
-
-#define PASSWDPRINT printf("%s:%s:%u:%u:%s:%s:%s\n", \
- pw->pw_name, pw->pw_passwd, pw->pw_uid, \
- pw->pw_gid, pw->pw_gecos, pw->pw_dir, pw->pw_shell)
-
- setpassent(1);
- rv = RV_OK;
- if (argc == 2) {
- while ((pw = getpwent()) != NULL)
- PASSWDPRINT;
- } else {
- for (i = 2; i < argc; i++) {
- if (parsenum(argv[i], &id))
- pw = getpwuid((uid_t)id);
- else
- pw = getpwnam(argv[i]);
- if (pw != NULL)
- PASSWDPRINT;
- else {
- rv = RV_NOTFOUND;
- break;
- }
- }
- }
- endpwent();
- return rv;
-}
-
-/*
- * protocols
- */
-static int
-protocols(int argc, char *argv[])
-{
- struct protoent *pe;
- unsigned long id;
- int i, rv;
-
- assert(argc > 1);
- assert(argv != NULL);
-
-#define PROTOCOLSPRINT printfmtstrings(pe->p_aliases, " ", " ", \
- "%-16s %5d", pe->p_name, pe->p_proto)
-
- setprotoent(1);
- rv = RV_OK;
- if (argc == 2) {
- while ((pe = getprotoent()) != NULL)
- PROTOCOLSPRINT;
- } else {
- for (i = 2; i < argc; i++) {
- if (parsenum(argv[i], &id))
- pe = getprotobynumber((int)id);
- else
- pe = getprotobyname(argv[i]);
- if (pe != NULL)
- PROTOCOLSPRINT;
- else {
- rv = RV_NOTFOUND;
- break;
- }
- }
- }
- endprotoent();
- return rv;
-}
-
-/*
- * rpc
- */
-static int
-rpc(int argc, char *argv[])
-{
- struct rpcent *re;
- unsigned long id;
- int i, rv;
-
- assert(argc > 1);
- assert(argv != NULL);
-
-#define RPCPRINT printfmtstrings(re->r_aliases, " ", " ", \
- "%-16s %6d", \
- re->r_name, re->r_number)
-
- setrpcent(1);
- rv = RV_OK;
- if (argc == 2) {
- while ((re = getrpcent()) != NULL)
- RPCPRINT;
- } else {
- for (i = 2; i < argc; i++) {
- if (parsenum(argv[i], &id))
- re = getrpcbynumber((int)id);
- else
- re = getrpcbyname(argv[i]);
- if (re != NULL)
- RPCPRINT;
- else {
- rv = RV_NOTFOUND;
- break;
- }
- }
- }
- endrpcent();
- return rv;
-}
-
-/*
- * services
- */
-static int
-services(int argc, char *argv[])
-{
- struct servent *se;
- unsigned long id;
- char *proto;
- int i, rv;
-
- assert(argc > 1);
- assert(argv != NULL);
-
-#define SERVICESPRINT printfmtstrings(se->s_aliases, " ", " ", \
- "%-16s %5d/%s", \
- se->s_name, ntohs(se->s_port), se->s_proto)
-
- setservent(1);
- rv = RV_OK;
- if (argc == 2) {
- while ((se = getservent()) != NULL)
- SERVICESPRINT;
- } else {
- for (i = 2; i < argc; i++) {
- proto = strchr(argv[i], '/');
- if (proto != NULL)
- *proto++ = '\0';
- if (parsenum(argv[i], &id))
- se = getservbyport(htons((u_short)id), proto);
- else
- se = getservbyname(argv[i], proto);
- if (se != NULL)
- SERVICESPRINT;
- else {
- rv = RV_NOTFOUND;
- break;
- }
- }
- }
- endservent();
- return rv;
-}
-
-/*
- * shells
- */
-static int
-shells(int argc, char *argv[])
-{
- const char *sh;
- int i, rv;
-
- assert(argc > 1);
- assert(argv != NULL);
-
-#define SHELLSPRINT printf("%s\n", sh)
-
- setusershell();
- rv = RV_OK;
- if (argc == 2) {
- while ((sh = getusershell()) != NULL)
- SHELLSPRINT;
- } else {
- for (i = 2; i < argc; i++) {
- setusershell();
- while ((sh = getusershell()) != NULL) {
- if (strcmp(sh, argv[i]) == 0) {
- SHELLSPRINT;
- break;
- }
- }
- if (sh == NULL) {
- rv = RV_NOTFOUND;
- break;
- }
- }
- }
- endusershell();
- return rv;
-}
diff --git a/usr.bin/getopt/Makefile b/usr.bin/getopt/Makefile
deleted file mode 100644
index 01dfa87..0000000
--- a/usr.bin/getopt/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# $FreeBSD$
-#
-
-PROG = getopt
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/getopt/getopt.1 b/usr.bin/getopt/getopt.1
deleted file mode 100644
index 771a2e7..0000000
--- a/usr.bin/getopt/getopt.1
+++ /dev/null
@@ -1,136 +0,0 @@
-.\" $FreeBSD$
-.\"
-.Dd April 3, 1999
-.Dt GETOPT 1
-.Os
-.Sh NAME
-.Nm getopt
-.Nd parse command options
-.Sh SYNOPSIS
-.Nm args=\`getopt Ar optstring $*\`
-; errcode=$?; set \-\- $args
-.Sh DESCRIPTION
-The
-.Nm
-utility is used to break up options in command lines for easy parsing by
-shell procedures, and to check for legal options.
-.Ar Optstring
-is a string of recognized option letters (see
-.Xr getopt 3 ) ;
-if a letter is followed by a colon, the option
-is expected to have an argument which may or may not be
-separated from it by white space.
-The special option
-.Ql \-\-
-is used to delimit the end of the options.
-The
-.Nm
-utility will place
-.Ql \-\-
-in the arguments at the end of the options,
-or recognize it if used explicitly.
-The shell arguments
-(\fB$1 $2\fR ...) are reset so that each option is
-preceded by a
-.Ql \-
-and in its own shell argument;
-each option argument is also in its own shell argument.
-.Sh EXIT STATUS
-The
-.Nm
-utility prints an error message on the standard error output and exits with
-status > 0 when it encounters an option letter not included in
-.Ar optstring .
-.Sh EXAMPLES
-The following code fragment shows how one might process the arguments
-for a command that can take the options
-.Fl a
-and
-.Fl b ,
-and the option
-.Fl o ,
-which requires an argument.
-.Pp
-.Bd -literal -offset indent
-args=\`getopt abo: $*\`
-# you should not use \`getopt abo: "$@"\` since that would parse
-# the arguments differently from what the set command below does.
-if [ $? -ne 0 ]
-then
- echo 'Usage: ...'
- exit 2
-fi
-set \-\- $args
-# You cannot use the set command with a backquoted getopt directly,
-# since the exit code from getopt would be shadowed by those of set,
-# which is zero by definition.
-for i
-do
- case "$i"
- in
- \-a|\-b)
- echo flag $i set; sflags="${i#-}$sflags";
- shift;;
- \-o)
- echo oarg is "'"$2"'"; oarg="$2"; shift;
- shift;;
- \-\-)
- shift; break;;
- esac
-done
-echo single-char flags: "'"$sflags"'"
-echo oarg is "'"$oarg"'"
-.Ed
-.Pp
-This code will accept any of the following as equivalent:
-.Pp
-.Bd -literal -offset indent
-cmd \-aoarg file file
-cmd \-a \-o arg file file
-cmd \-oarg -a file file
-cmd \-a \-oarg \-\- file file
-.Ed
-.Sh SEE ALSO
-.Xr getopts 1 ,
-.Xr sh 1 ,
-.Xr getopt 3
-.Sh HISTORY
-Written by
-.An Henry Spencer ,
-working from a Bell Labs manual page.
-Behavior believed identical to the Bell version.
-Example changed in
-.Fx
-version 3.2 and 4.0.
-.Sh BUGS
-Whatever
-.Xr getopt 3
-has.
-.Pp
-Arguments containing white space or embedded shell metacharacters
-generally will not survive intact; this looks easy to fix but
-is not.
-People trying to fix
-.Nm
-or the example in this manpage should check the history of this file
-in
-.Fx .
-.Pp
-The error message for an invalid option is identified as coming
-from
-.Nm
-rather than from the shell procedure containing the invocation
-of
-.Nm ;
-this again is hard to fix.
-.Pp
-The precise best way to use the
-.Nm set
-command to set the arguments without disrupting the value(s) of
-shell options varies from one shell version to another.
-.Pp
-Each shellscript has to carry complex code to parse arguments halfway
-correctly (like the example presented here).
-A better getopt-like tool
-would move much of the complexity into the tool and keep the client
-shell scripts simpler.
diff --git a/usr.bin/getopt/getopt.c b/usr.bin/getopt/getopt.c
deleted file mode 100644
index d1671a7..0000000
--- a/usr.bin/getopt/getopt.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * This material, written by Henry Spencer, was released by him
- * into the public domain and is thus not subject to any copyright.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-int
-main(int argc, char *argv[])
-{
- int c;
- int status = 0;
-
- optind = 2; /* Past the program name and the option letters. */
- while ((c = getopt(argc, argv, argv[1])) != -1)
- switch (c) {
- case '?':
- status = 1; /* getopt routine gave message */
- break;
- default:
- if (optarg != NULL)
- printf(" -%c %s", c, optarg);
- else
- printf(" -%c", c);
- break;
- }
- printf(" --");
- for (; optind < argc; optind++)
- printf(" %s", argv[optind]);
- printf("\n");
- return status;
-}
diff --git a/usr.bin/gprof/Makefile b/usr.bin/gprof/Makefile
deleted file mode 100644
index a24d9cd..0000000
--- a/usr.bin/gprof/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/29/93
-# $FreeBSD$
-
-PROG= gprof
-SRCS= gprof.c aout.c arcs.c dfn.c elf.c lookup.c hertz.c \
- printgprof.c printlist.c kernel.c
-FILES= gprof.flat gprof.callg
-FILESDIR= ${SHAREDIR}/misc
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/gprof/PSD.doc/abstract.me b/usr.bin/gprof/PSD.doc/abstract.me
deleted file mode 100644
index 28e8066..0000000
--- a/usr.bin/gprof/PSD.doc/abstract.me
+++ /dev/null
@@ -1,66 +0,0 @@
-.\" Copyright (c) 1982, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)abstract.me 8.1 (Berkeley) 6/8/93
-.\"
-.sp 1
-\fB\s+2gprof: a Call Graph Execution Profiler\s-2\fP\**
-.(f
-\**This work was supported by grant MCS80-05144
-from the National Science Foundation.
-.)f
-.sp 1
-by
-\fISusan L. Graham\fP
-\fIPeter B. Kessler\fP
-\fIMarshall K. McKusick\fP
-.sp 1
-Computer Science Division
-Electrical Engineering and Computer Science Department
-University of California, Berkeley
-Berkeley, California 94720
-.ce 0
-.sp 1
-.sp 0.5i
-.sh 0 "Abstract"
-.pp
-Large complex programs are composed of many small routines
-that implement abstractions for the routines that call them.
-To be useful, an execution profiler must attribute
-execution time in a way that is significant for the
-logical structure of a program
-as well as for its textual decomposition.
-This data must then be displayed to the user
-in a convenient and informative way.
-The \fBgprof\fP profiler
-accounts for the running time of called routines
-in the running time of the routines that call them.
-The design and use of this profiler is described.
diff --git a/usr.bin/gprof/PSD.doc/gathering.me b/usr.bin/gprof/PSD.doc/gathering.me
deleted file mode 100644
index 17130c3..0000000
--- a/usr.bin/gprof/PSD.doc/gathering.me
+++ /dev/null
@@ -1,231 +0,0 @@
-.\" Copyright (c) 1982, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)gathering.me 8.1 (Berkeley) 6/8/93
-.\"
-.sh 1 "Gathering Profile Data"
-.pp
-Routine calls or statement executions can be measured by having a
-compiler augment the code at strategic points.
-The additions can be inline increments to counters [Knuth71]
-[Satterthwaite72] [Joy79] or calls to
-monitoring routines [Unix].
-The counter increment overhead is low, and is suitable for
-profiling statements.
-A call of the monitoring routine has an overhead comparable with a
-call of a regular routine, and is therefore only suited
-to profiling on a routine by routine basis.
-However, the monitoring routine solution has certain advantages.
-Whatever counters are needed by the monitoring routine can be
-managed by the monitoring routine itself, rather than being
-distributed around the code.
-In particular, a monitoring routine can easily be called from separately
-compiled programs.
-In addition, different monitoring routines can be linked into the
-program
-being measured
-to assemble different profiling data without having to
-change the compiler or recompile the program.
-We have exploited this approach;
-our compilers for C, Fortran77, and Pascal can insert calls to a
-monitoring routine in the prologue for each routine.
-Use of the monitoring routine requires no planning on part of a
-programmer other than to request that augmented routine
-prologues be produced during compilation.
-.pp
-We are interested in gathering three pieces of information during
-program execution: call counts and execution times for
-each profiled routine, and the arcs of the dynamic call graph
-traversed by this execution of the program.
-By post-processing of this data we can build the dynamic call
-graph for this execution of the program and propagate times along
-the edges of this graph to attribute times for routines to the
-routines that invoke them.
-.pp
-Gathering of the profiling information should not greatly
-interfere with the running of the program.
-Thus, the monitoring routine must not produce trace output each
-time it is invoked.
-The volume of data thus produced would be unmanageably large,
-and the time required to record it would overwhelm the running
-time of most programs.
-Similarly, the monitoring routine can not do the analysis of
-the profiling data (e.g. assembling the call graph, propagating
-times around it, discovering cycles, etc.) during program
-execution.
-Our solution is to gather profiling data in memory during program
-execution and to condense it to a file as the profiled
-program exits.
-This file is then processed by a separate program to produce the
-listing of the profile data.
-An advantage of this approach is that the profile data for
-several executions of a program can be combined by the
-post-processing to provide a profile of many
-executions.
-.pp
-The execution time monitoring consists of three parts.
-The first part allocates and initializes the runtime monitoring data
-structures before the program begins execution.
-The second part is the monitoring routine invoked from the
-prologue of each profiled routine.
-The third part condenses the data structures and writes them
-to a file as the program terminates.
-The monitoring routine is discussed in detail in the following sections.
-.sh 2 "Execution Counts"
-.pp
-The \fBgprof\fP monitoring routine counts the number of times
-each profiled routine is called.
-The monitoring routine also records the arc in the call graph
-that activated the profiled routine.
-The count is associated with the arc in the call graph
-rather than with the routine.
-Call counts for routines can then be determined by summing the counts
-on arcs directed into that routine.
-In a machine-dependent fashion, the monitoring routine notes its
-own return address.
-This address is in the prologue of some profiled routine that is
-the destination of an arc in the dynamic call graph.
-The monitoring routine also discovers the return address for that
-routine, thus identifying the call site, or source of the arc.
-The source of the arc is in the \fIcaller\fP, and the destination is in
-the \fIcallee\fP.
-For example, if a routine A calls a routine B, A is the caller,
-and B is the callee.
-The prologue of B will include a call to the monitoring routine
-that will note the arc from A to B and either initialize or
-increment a counter for that arc.
-.pp
-One can not afford to have the monitoring routine output tracing
-information as each arc is identified.
-Therefore, the monitoring routine maintains a table of all the
-arcs discovered, with counts of the numbers of times each is
-traversed during execution.
-This table is accessed once per routine call.
-Access to it
-must be as fast as possible so as not to overwhelm the time
-required to execute the program.
-.pp
-Our solution is to access the table through a hash table.
-We use the call site as the primary key with the callee
-address being the secondary key.
-Since each call site typically calls only one callee, we can
-reduce (usually to one) the number of minor lookups based on the callee.
-Another alternative would use the callee as the primary key and the
-call site as the secondary key.
-Such an organization has the advantage of associating callers with
-callees, at the expense of longer lookups in the monitoring
-routine.
-We are fortunate to be running in a virtual memory environment,
-and (for the sake of speed) were able to allocate enough space
-for the primary hash table to allow a one-to-one mapping from
-call site addresses to the primary hash table.
-Thus our hash function is trivial to calculate and collisions
-occur only for call sites that call multiple
-destinations (e.g. functional parameters and functional variables).
-A one level hash function using both call site and callee would
-result in an unreasonably large hash table.
-Further, the number of dynamic call sites and callees is not known during
-execution of the profiled program.
-.pp
-Not all callers and callees can be identified by the monitoring
-routine.
-Routines that were compiled without the profiling augmentations
-will not call the monitoring routine as part of their prologue,
-and thus no arcs will be recorded whose destinations are in these
-routines.
-One need not profile all the routines in a program.
-Routines that are not profiled run at full speed.
-Certain routines, notably exception handlers, are invoked by
-non-standard calling sequences.
-Thus the monitoring routine may know the destination of an arc
-(the callee),
-but find it difficult or
-impossible to determine the source of the arc (the caller).
-Often in these cases the apparent source of the arc is not a call
-site at all.
-Such anomalous invocations are declared ``spontaneous''.
-.sh 2 "Execution Times"
-.pp
-The execution times for routines can be gathered in at least two
-ways.
-One method measures the execution time of a routine by measuring
-the elapsed time from routine entry to routine exit.
-Unfortunately, time measurement is complicated on time-sharing
-systems by the time-slicing of the program.
-A second method samples the value of the program counter at some
-interval, and infers execution time from the distribution of the
-samples within the program.
-This technique is particularly suited to time-sharing systems,
-where the time-slicing can serve as the basis for sampling
-the program counter.
-Notice that, whereas the first method could provide exact timings,
-the second is inherently a statistical approximation.
-.pp
-The sampling method need not require support from the operating
-system: all that is needed is the ability to set and respond to
-``alarm clock'' interrupts that run relative to program time.
-It is imperative that the intervals be uniform since the
-sampling of the program counter rather than the duration of the
-interval is the basis of the distribution.
-If sampling is done too often, the interruptions to sample the
-program counter will overwhelm the running of the profiled program.
-On the other hand, the program must run for enough sampled
-intervals that the distribution of the samples accurately
-represents the distribution of time for the execution of the
-program.
-As with routine call tracing, the monitoring routine can not
-afford to output information for each program counter
-sample.
-In our computing environment, the operating system can provide a
-histogram of the location of the program counter at the end of
-each clock tick (1/60th of a second) in which a program runs.
-The histogram is assembled in memory as the program runs.
-This facility is enabled by our monitoring routine.
-We have adjusted the granularity of the histogram so that
-program counter values map one-to-one onto the histogram.
-We make the simplifying assumption that all calls to a specific
-routine require the same amount of time to execute.
-This assumption may disguise that some calls
-(or worse, some call sites) always invoke a routine
-such that its execution is faster (or slower)
-than the average time for that routine.
-.pp
-When the profiled program terminates,
-the arc table and the histogram of
-program counter samples is written to a file.
-The arc table is condensed to consist of the source and destination
-addresses of the arc and the count of the number of times the arc
-was traversed by this execution of the program.
-The recorded histogram consists of counters of the number of
-times the program counter was found to be in each of the ranges covered
-by the histogram.
-The ranges themselves are summarized as a
-lower and upper bound and a step size.
diff --git a/usr.bin/gprof/PSD.doc/header.me b/usr.bin/gprof/PSD.doc/header.me
deleted file mode 100644
index aef606d..0000000
--- a/usr.bin/gprof/PSD.doc/header.me
+++ /dev/null
@@ -1,38 +0,0 @@
-.\" Copyright (c) 1982, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)header.me 8.1 (Berkeley) 8/14/93
-.\"
-.\"he 'gprof''Graham, Kessler, McKusick'
-.\"fo 'Draft of \*(td''%'
-.\"ls 2
-.eh 'PSD:18-%''gprof \*- a Call Graph Execution Profiler'
-.oh 'gprof \*- A Call Graph Execution Profiler''PSD:18-%'
diff --git a/usr.bin/gprof/PSD.doc/intro.me b/usr.bin/gprof/PSD.doc/intro.me
deleted file mode 100644
index 3a872b2..0000000
--- a/usr.bin/gprof/PSD.doc/intro.me
+++ /dev/null
@@ -1,81 +0,0 @@
-.\" Copyright (c) 1982, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)intro.me 8.1 (Berkeley) 6/8/93
-.\"
-.sh 1 "Programs to be Profiled"
-.pp
-Software research environments
-normally include many large programs
-both for production use and for experimental investigation.
-These programs are typically modular,
-in accordance with generally accepted principles
-of good program design.
-Often they consist of numerous small routines
-that implement various abstractions.
-Sometimes such large programs are written
-by one programmer
-who has understood the requirements for
-these abstractions, and has programmed them
-appropriately.
-More frequently the program has
-had multiple authors and has
-evolved over time, changing the demands placed
-on the implementation of the abstractions without
-changing the implementation itself.
-Finally, the program may be assembled from a library
-of abstraction implementations
-unexamined by the programmer.
-.pp
-Once a large program is executable,
-it is often desirable to increase its speed,
-especially if small portions of the program
-are found to dominate its execution time.
-The purpose of the \fBgprof\fP profiling tool is to
-help the user evaluate alternative implementations
-of abstractions.
-We developed this tool in response to our efforts
-to improve a code generator we were writing [Graham82].
-.pp
-The \fBgprof\fP design takes advantage of the fact that the programs
-to be measured are large, structured and hierarchical.
-We provide a profile in which the execution time
-for a set of routines that implement an
-abstraction is collected and charged
-to that abstraction.
-The profile can be used to compare and assess the costs of
-various implementations.
-.pp
-The profiler can be linked into a program without
-special planning by the programmer.
-The overhead for using \fBgprof\fP is low;
-both in terms of added execution time and in the
-volume of profiling information recorded.
diff --git a/usr.bin/gprof/PSD.doc/postp.me b/usr.bin/gprof/PSD.doc/postp.me
deleted file mode 100644
index d71fefb..0000000
--- a/usr.bin/gprof/PSD.doc/postp.me
+++ /dev/null
@@ -1,190 +0,0 @@
-.\" Copyright (c) 1982, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)postp.me 8.1 (Berkeley) 6/8/93
-.\"
-.EQ
-delim $$
-gsize 11
-.EN
-.sh 1 "Post Processing"
-.pp
-Having gathered the arcs of the call graph and timing information
-for an execution of the program,
-we are interested in attributing the time for each routine to the
-routines that call it.
-We build a dynamic call graph with arcs from caller to callee,
-and propagate time from descendants to ancestors
-by topologically sorting the call graph.
-Time propagation is performed from the leaves of the
-call graph toward the roots, according to the order
-assigned by a topological numbering algorithm.
-The topological numbering ensures that
-all edges in the graph go from higher numbered nodes to lower
-numbered nodes.
-An example is given in Figure 1.
-If we propagate time from nodes in the
-order assigned by the algorithm,
-execution time can be propagated from descendants to ancestors
-after a single traversal of each arc in the call graph.
-Each parent receives some fraction of a child's time.
-Thus time is charged to the
-caller in addition to being charged to the callee.
-.(z
-.so postp1.pic
-.ce 2
-Topological ordering
-Figure 1.
-.ce 0
-.)z
-.pp
-Let $C sub e$ be the number of calls to some routine,
-$e$, and $C sub e sup r$ be the number of
-calls from a caller $r$ to a callee $e$.
-Since we are assuming each call to a routine takes the
-average amount of time for all calls to that routine,
-the caller is accountable for
-$C sub e sup r / C sub e$
-of the time spent by the callee.
-Let the $S sub e$ be the $selftime$ of a routine, $e$.
-The selftime of a routine can be determined from the
-timing information gathered during profiled program execution.
-The total time, $T sub r$, we wish to account to a routine
-$r$, is then given by the recurrence equation:
-.EQ
-T sub r ~ = ~ {S sub r} ~ + ~
- sum from {r ~ roman CALLS ~ e}
- {T sub e times {{C sub e sup r} over {C sub e}}}
-.EN
-where $r ~ roman CALLS ~ e$ is a relation showing all routines
-$e$ called by a routine $r$.
-This relation is easily available from the call graph.
-.pp
-However, if the execution contains recursive calls,
-the call graph has cycles that
-cannot be topologically sorted.
-In these cases, we discover strongly-connected
-components in the call graph,
-treat each such component as a single node,
-and then sort the resulting graph.
-We use a variation of Tarjan's strongly-connected
-components algorithm
-that discovers strongly-connected components as it is assigning
-topological order numbers [Tarjan72].
-.pp
-Time propagation within strongly connected
-components is a problem.
-For example, a self-recursive routine
-(a trivial cycle in the call graph)
-is accountable for all the time it
-uses in all its recursive instantiations.
-In our scheme, this time should be
-shared among its call graph parents.
-The arcs from a routine to itself are of interest,
-but do not participate in time propagation.
-Thus the simple equation for time propagation
-does not work within strongly connected components.
-Time is not propagated from one member of a cycle to another,
-since, by definition, this involves propagating time from a routine
-to itself.
-In addition, children of one member of a cycle
-must be considered children of all members of the cycle.
-Similarly, parents of one member of the cycle must inherit
-all members of the cycle as descendants.
-It is for these reasons that we collapse connected components.
-Our solution collects all members of a cycle together,
-summing the time and call counts for all members.
-All calls into the cycle are made to share the total
-time of the cycle, and all descendants of the cycle
-propagate time into the cycle as a whole.
-Calls among the members of the cycle
-do not propagate any time,
-though they are listed in the call graph profile.
-.pp
-Figure 2 shows a modified version of the call graph of Figure 1,
-in which the nodes labelled 3 and 7 in Figure 1 are mutually
-recursive.
-The topologically sorted graph after the cycle is collapsed is
-given in Figure 3.
-.(z
-.so postp2.pic
-.ce 2
-Cycle to be collapsed.
-Figure 2.
-.ce 0
-.)z
-.(z
-.so postp3.pic
-.ce 2
-Topological numbering after cycle collapsing.
-Figure 3.
-.ce 0
-.)z
-.pp
-Since the technique described above only collects the
-dynamic call graph,
-and the program typically does not call every routine
-on each execution,
-different executions can introduce different cycles in the
-dynamic call graph.
-Since cycles often have a significant effect on time propagation,
-it is desirable to incorporate the static call graph so that cycles
-will have the same members regardless of how the program runs.
-.pp
-The static call graph can be constructed from the source text
-of the program.
-However, discovering the static call graph from the source text
-would require two moderately difficult steps:
-finding the source text for the program
-(which may not be available),
-and scanning and parsing that text,
-which may be in any one of several languages.
-.pp
-In our programming system,
-the static calling information is also contained in the
-executable version of the program,
-which we already have available,
-and which is in language-independent form.
-One can examine the instructions
-in the object program,
-looking for calls to routines, and note which
-routines can be called.
-This technique allows us to add arcs to those already in the
-dynamic call graph.
-If a statically discovered arc already exists in the dynamic call
-graph, no action is required.
-Statically discovered arcs that do not exist in the dynamic call
-graph are added to the graph with a traversal count of zero.
-Thus they are never responsible for any time propagation.
-However, they may affect the structure of the graph.
-Since they may complete strongly connected components,
-the static call graph construction is
-done before topological ordering.
diff --git a/usr.bin/gprof/PSD.doc/postp1.pic b/usr.bin/gprof/PSD.doc/postp1.pic
deleted file mode 100644
index 1446092..0000000
--- a/usr.bin/gprof/PSD.doc/postp1.pic
+++ /dev/null
@@ -1,54 +0,0 @@
-.\" Copyright (c) 1986, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)postp1.pic 8.1 (Berkeley) 6/8/93
-.\"
-.PS
-circle diam .3i "8"
-circle diam .3i "9" at 1st circle + (2i,0i)
-circle diam .3i "3" at 1st circle + (0.5i,-0.5i)
-circle diam .3i "7" at 2nd circle - (0.5i, 0.5i)
-circle diam .3i "2" at 1st circle - (0i,1i)
-circle diam .3i "5" at 5th circle + (1i,0i)
-circle diam .3i "6" at 2nd circle - (0i,1i)
-circle diam .3i "1" at 3rd circle - (0i,1i)
-circle diam .3i "4" at 4th circle - (0i,1i)
-arrow from 1st circle to 3rd circle chop .15i chop .15i
-arrow from 1st circle to 4th circle chop .15i chop .15i
-arrow from 2nd circle to 4th circle chop .15i chop .15i
-arrow from 3rd circle to 5th circle chop .15i chop .15i
-arrow from 4th circle to 5th circle chop .15i chop .15i
-arrow from 4th circle to 6th circle chop .15i chop .15i
-arrow from 4th circle to 7th circle chop .15i chop .15i
-arrow from 5th circle to 8th circle chop .15i chop .15i
-arrow from 6th circle to 8th circle chop .15i chop .15i
-arrow from 6th circle to 9th circle chop .15i chop .15i
-.PE
diff --git a/usr.bin/gprof/PSD.doc/postp2.pic b/usr.bin/gprof/PSD.doc/postp2.pic
deleted file mode 100644
index 3b31736..0000000
--- a/usr.bin/gprof/PSD.doc/postp2.pic
+++ /dev/null
@@ -1,56 +0,0 @@
-.\" Copyright (c) 1986, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)postp2.pic 8.1 (Berkeley) 6/8/93
-.\"
-.PS
-circle diam .3i "\(ci"
-circle diam .3i "\(ci" at 1st circle + (2i,0i)
-circle diam .3i "\(bu" at 1st circle + (0.5i,-0.5i)
-circle diam .3i "\(bu" at 2nd circle - (0.5i, 0.5i)
-circle diam .3i "\(ci" at 1st circle - (0i,1i)
-circle diam .3i "\(ci" at 5th circle + (1i,0i)
-circle diam .3i "\(ci" at 2nd circle - (0i,1i)
-circle diam .3i "\(ci" at 3rd circle - (0i,1i)
-circle diam .3i "\(ci" at 4th circle - (0i,1i)
-arrow from 1st circle to 3rd circle chop .15i chop .15i
-arrow from 1st circle to 4th circle chop .15i chop .15i
-arrow from 2nd circle to 4th circle chop .15i chop .15i
-spline -> from 3rd circle right .5i up .075i then right .5i down .075i chop .15i chop .15i
-spline -> from 4th circle left .5i down .075i then left .5i up .075i chop .15i chop .15i
-arrow from 3rd circle to 5th circle chop .15i chop .15i
-arrow from 4th circle to 5th circle chop .15i chop .15i
-arrow from 4th circle to 6th circle chop .15i chop .15i
-arrow from 4th circle to 7th circle chop .15i chop .15i
-arrow from 5th circle to 8th circle chop .15i chop .15i
-arrow from 6th circle to 8th circle chop .15i chop .15i
-arrow from 6th circle to 9th circle chop .15i chop .15i
-.PE
diff --git a/usr.bin/gprof/PSD.doc/postp3.pic b/usr.bin/gprof/PSD.doc/postp3.pic
deleted file mode 100644
index 65eb2a7..0000000
--- a/usr.bin/gprof/PSD.doc/postp3.pic
+++ /dev/null
@@ -1,51 +0,0 @@
-.\" Copyright (c) 1986, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)postp3.pic 8.1 (Berkeley) 6/8/93
-.\"
-.PS
-circle diam .3i "7"
-circle diam .3i "8" at 1st circle + (2i,0i)
-EL: ellipse wid 1i ht .3i "\fB6\fR\h'.7i'\fB6\fR" at 1st circle + (1i,-0.5i)
-circle diam .3i "2" at 1st circle - (0i,1i)
-circle diam .3i "4" at 3th circle + (1i,0i)
-circle diam .3i "5" at 2nd circle - (0i,1i)
-circle diam .3i "1" at 3rd circle + (0.5i,-0.5i)
-circle diam .3i "3" at 5th circle - (0.5i,0.5i)
-arrow from 1st circle to EL.nw chop .15i chop 0i
-arrow from 2nd circle to EL.ne chop .15i chop 0i
-arrow from EL.sw to 3rd circle chop 0i chop .15i
-arrow from EL.s to 4th circle chop 0i chop .15i
-arrow from EL.se to 5th circle chop 0i chop .15i
-arrow from 3rd circle to 6th circle chop .15i chop .15i
-arrow from 4th circle to 6th circle chop .15i chop .15i
-arrow from 4th circle to 7th circle chop .15i chop .15i
-.PE
diff --git a/usr.bin/gprof/PSD.doc/pres1.pic b/usr.bin/gprof/PSD.doc/pres1.pic
deleted file mode 100644
index 0c311a1..0000000
--- a/usr.bin/gprof/PSD.doc/pres1.pic
+++ /dev/null
@@ -1,56 +0,0 @@
-.\" Copyright (c) 1986, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)pres1.pic 8.1 (Berkeley) 6/8/93
-.\"
-.PS
-ellipse ht .3i wid .75i "\s-1CALLER1\s+1"
-ellipse ht .3i wid .75i "\s-1CALLER2\s+1" at 1st ellipse + (2i,0i)
-ellipse ht .3i wid .8i "\s-1EXAMPLE\s+1" at 1st ellipse + (1i,-.5i)
-ellipse ht .3i wid .5i "\s-1SUB1\s+1" at 1st ellipse - (0i,1i)
-ellipse ht .3i wid .5i "\s-1SUB2\s+1" at 3rd ellipse - (0i,.5i)
-ellipse ht .3i wid .5i "\s-1SUB3\s+1" at 2nd ellipse - (0i,1i)
-line <- from 1st ellipse up .5i left .5i chop .1875i
-line <- from 1st ellipse up .5i right .5i chop .1875i
-line <- from 2nd ellipse up .5i left .5i chop .1875i
-line <- from 2nd ellipse up .5i right .5i chop .1875i
-arrow from 1st ellipse to 3rd ellipse chop
-arrow from 2nd ellipse to 3rd ellipse chop
-arrow from 3rd ellipse to 4th ellipse chop
-arrow from 3rd ellipse to 5th ellipse chop .15i chop .15i
-arrow from 3rd ellipse to 6th ellipse chop
-arrow from 4th ellipse down .5i left .5i chop .1875i
-arrow from 4th ellipse down .5i right .5i chop .1875i
-arrow from 5th ellipse down .5i left .5i chop .1875i
-arrow from 5th ellipse down .5i right .5i chop .1875i
-arrow from 6th ellipse down .5i left .5i chop .1875i
-arrow from 6th ellipse down .5i right .5i chop .1875i
-.PE
diff --git a/usr.bin/gprof/PSD.doc/pres2.pic b/usr.bin/gprof/PSD.doc/pres2.pic
deleted file mode 100644
index c3a4ea0..0000000
--- a/usr.bin/gprof/PSD.doc/pres2.pic
+++ /dev/null
@@ -1,52 +0,0 @@
-.\" Copyright (c) 1986, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)pres2.pic 8.1 (Berkeley) 6/8/93
-.\"
-.PS
-ellipse ht .3i wid .6i "\s-1CALC1\s+1"
-ellipse ht .3i wid .6i "\s-1CALC2\s+1" at 1st ellipse + (.75i,0i)
-ellipse ht .3i wid .6i "\s-1CALC3\s+1" at 1st ellipse + (1.5i,0i)
-ellipse ht .3i wid .8i "\s-1FORMAT1\s+1" at 1st ellipse - (0i,.5i)
-ellipse ht .3i wid .8i "\s-1FORMAT2\s+1" at 3rd ellipse - (0i,.5i)
-ellipse ht .3i wid .75i "\s-1\"WRITE\"\s+1" at 5th ellipse - (.75i,.5i)
-line <- from 1st ellipse up .5i left .4i chop .1825i
-line <- from 1st ellipse up .5i right .4i chop .1825i
-line <- from 2nd ellipse up .5i left .4i chop .1825i
-line <- from 2nd ellipse up .5i right .4i chop .1825i
-line <- from 3rd ellipse up .5i left .4i chop .1825i
-line <- from 3rd ellipse up .5i right .4i chop .1825i
-arrow from 1st ellipse to 4th ellipse chop .15i
-arrow from 2nd ellipse to 5th ellipse chop
-arrow from 3rd ellipse to 5th ellipse chop .15i
-arrow from 4th ellipse to 6th ellipse chop
-arrow from 5th ellipse to 6th ellipse chop
-.PE
diff --git a/usr.bin/gprof/PSD.doc/present.me b/usr.bin/gprof/PSD.doc/present.me
deleted file mode 100644
index 1dd7f62..0000000
--- a/usr.bin/gprof/PSD.doc/present.me
+++ /dev/null
@@ -1,306 +0,0 @@
-.\" Copyright (c) 1982, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)present.me 8.1 (Berkeley) 6/8/93
-.\"
-.sh 1 "Data Presentation"
-.pp
-The data is presented to the user in two different formats.
-The first presentation simply lists the routines
-without regard to the amount of time their descendants use.
-The second presentation incorporates the call graph of the
-program.
-.sh 2 "The Flat Profile
-.pp
-The flat profile consists of a list of all the routines
-that are called during execution of the program,
-with the count of the number of times they are called
-and the number of seconds of execution time for which they
-are themselves accountable.
-The routines are listed in decreasing order of execution time.
-A list of the routines that are never called during execution of
-the program is also available
-to verify that nothing important is omitted by
-this execution.
-The flat profile gives a quick overview of the routines that are used,
-and shows the routines that are themselves responsible
-for large fractions of the execution time.
-In practice,
-this profile usually shows that no single function
-is overwhelmingly responsible for
-the total time of the program.
-Notice that for this profile,
-the individual times sum to the total execution time.
-.sh 2 "The Call Graph Profile"
-.sz 10
-.(z
-.TS
-box center;
-c c c c c l l
-c c c c c l l
-c c c c c l l
-l n n n c l l.
- called/total \ \ parents
-index %time self descendants called+self name index
- called/total \ \ children
-_
- 0.20 1.20 4/10 \ \ \s-1CALLER1\s+1 [7]
- 0.30 1.80 6/10 \ \ \s-1CALLER2\s+1 [1]
-[2] 41.5 0.50 3.00 10+4 \s-1EXAMPLE\s+1 [2]
- 1.50 1.00 20/40 \ \ \s-1SUB1\s+1 <cycle1> [4]
- 0.00 0.50 1/5 \ \ \s-1SUB2\s+1 [9]
- 0.00 0.00 0/5 \ \ \s-1SUB3\s+1 [11]
-.TE
-.ce 2
-Profile entry for \s-1EXAMPLE\s+1.
-Figure 4.
-.)z
-.pp
-Ideally, we would like to print the call graph of the program,
-but we are limited by the two-dimensional nature of our output
-devices.
-We cannot assume that a call graph is planar,
-and even if it is, that we can print a planar version of it.
-Instead, we choose to list each routine,
-together with information about
-the routines that are its direct parents and children.
-This listing presents a window into the call graph.
-Based on our experience,
-both parent information and child information
-is important,
-and should be available without searching
-through the output.
-.pp
-The major entries of the call graph profile are the entries from the
-flat profile, augmented by the time propagated to each
-routine from its descendants.
-This profile is sorted by the sum of the time for the routine
-itself plus the time inherited from its descendants.
-The profile shows which of the higher level routines
-spend large portions of the total execution time
-in the routines that they call.
-For each routine, we show the amount of time passed by each child
-to the routine, which includes time for the child itself
-and for the descendants of the child
-(and thus the descendants of the routine).
-We also show the percentage these times represent of the total time
-accounted to the child.
-Similarly, the parents of each routine are listed,
-along with time,
-and percentage of total routine time,
-propagated to each one.
-.pp
-Cycles are handled as single entities.
-The cycle as a whole is shown as though it were a single routine,
-except that members of the cycle are listed in place of the children.
-Although the number of calls of each member
-from within the cycle are shown,
-they do not affect time propagation.
-When a child is a member of a cycle,
-the time shown is the appropriate fraction of the time
-for the whole cycle.
-Self-recursive routines have their calls broken
-down into calls from the outside and self-recursive calls.
-Only the outside calls affect the propagation of time.
-.pp
-The following example is a typical fragment of a call graph.
-.(b
-.so pres1.pic
-.)b
-The entry in the call graph profile listing for this example is
-shown in Figure 4.
-.pp
-The entry is for routine \s-1EXAMPLE\s+1, which has
-the Caller routines as its parents,
-and the Sub routines as its children.
-The reader should keep in mind that all information
-is given \fIwith respect to \s-1EXAMPLE\s+1\fP.
-The index in the first column shows that \s-1EXAMPLE\s+1
-is the second entry in the profile listing.
-The \s-1EXAMPLE\s+1 routine is called ten times, four times by \s-1CALLER1\s+1,
-and six times by \s-1CALLER2\s+1.
-Consequently 40% of \s-1EXAMPLE\s+1's time is propagated to \s-1CALLER1\s+1,
-and 60% of \s-1EXAMPLE\s+1's time is propagated to \s-1CALLER2\s+1.
-The self and descendant fields of the parents
-show the amount of self and descendant time \s-1EXAMPLE\s+1
-propagates to them (but not the time used by
-the parents directly).
-Note that \s-1EXAMPLE\s+1 calls itself recursively four times.
-The routine \s-1EXAMPLE\s+1 calls routine \s-1SUB1\s+1 twenty times, \s-1SUB2\s+1 once,
-and never calls \s-1SUB3\s+1.
-Since \s-1SUB2\s+1 is called a total of five times,
-20% of its self and descendant time is propagated to \s-1EXAMPLE\s+1's
-descendant time field.
-Because \s-1SUB1\s+1 is a member of \fIcycle 1\fR,
-the self and descendant times
-and call count fraction
-are those for the cycle as a whole.
-Since cycle 1 is called a total of forty times
-(not counting calls among members of the cycle),
-it propagates 50% of the cycle's self and descendant
-time to \s-1EXAMPLE\s+1's descendant time field.
-Finally each name is followed by an index that shows
-where on the listing to find the entry for that routine.
-.sh 1 "Using the Profiles"
-.pp
-The profiler is a useful tool for improving
-a set of routines that implement an abstraction.
-It can be helpful in identifying poorly coded routines,
-and in evaluating the new algorithms and code that replace them.
-Taking full advantage of the profiler
-requires a careful examination of the call graph profile,
-and a thorough knowledge of the abstractions underlying
-the program.
-.pp
-The easiest optimization that can be performed
-is a small change
-to a control construct or data structure that improves the
-running time of the program.
-An obvious starting point
-is a routine that is called many times.
-For example, suppose an output
-routine is the only parent
-of a routine that formats the data.
-If this format routine is expanded inline in the
-output routine, the overhead of a function call and
-return can be saved for each datum that needs to be formatted.
-.pp
-The drawback to inline expansion is that the data abstractions
-in the program may become less parameterized,
-hence less clearly defined.
-The profiling will also become less useful since the loss of
-routines will make its output more granular.
-For example,
-if the symbol table functions ``lookup'', ``insert'', and ``delete''
-are all merged into a single parameterized routine,
-it will be impossible to determine the costs
-of any one of these individual functions from the profile.
-.pp
-Further potential for optimization lies in routines that
-implement data abstractions whose total execution
-time is long.
-For example, a lookup routine might be called only a few
-times, but use an inefficient linear search algorithm,
-that might be replaced with a binary search.
-Alternately, the discovery that a rehashing function is being
-called excessively, can lead to a different
-hash function or a larger hash table.
-If the data abstraction function cannot easily be speeded up,
-it may be advantageous to cache its results,
-and eliminate the need to rerun
-it for identical inputs.
-These and other ideas for program improvement are discussed in
-[Bentley81].
-.pp
-This tool is best used in an iterative approach:
-profiling the program,
-eliminating one bottleneck,
-then finding some other part of the program
-that begins to dominate execution time.
-For instance, we have used \fBgprof\fR on itself;
-eliminating, rewriting, and inline expanding routines,
-until reading
-data files (hardly a target for optimization!)
-represents the dominating factor in its execution time.
-.pp
-Certain types of programs are not easily analyzed by \fBgprof\fR.
-They are typified by programs that exhibit a large degree of
-recursion, such as recursive descent compilers.
-The problem is that most of the major routines are grouped
-into a single monolithic cycle.
-As in the symbol table abstraction that is placed
-in one routine,
-it is impossible to distinguish which members of the cycle are
-responsible for the execution time.
-Unfortunately there are no easy modifications to these programs that
-make them amenable to analysis.
-.pp
-A completely different use of the profiler is to analyze the control
-flow of an unfamiliar program.
-If you receive a program from another user that you need to modify
-in some small way,
-it is often unclear where the changes need to be made.
-By running the program on an example and then using \fBgprof\fR,
-you can get a view of the structure of the program.
-.pp
-Consider an example in which you need to change the output format
-of the program.
-For purposes of this example suppose that the call graph
-of the output portion of the program has the following structure:
-.(b
-.so pres2.pic
-.)b
-Initially you look through the \fBgprof\fR
-output for the system call ``\s-1WRITE\s+1''.
-The format routine you will need to change is probably
-among the parents of the ``\s-1WRITE\s+1'' procedure.
-The next step is to look at the profile entry for each
-of parents of ``\s-1WRITE\s+1'',
-in this example either ``\s-1FORMAT1\s+1'' or ``\s-1FORMAT2\s+1'',
-to determine which one to change.
-Each format routine will have one or more parents,
-in this example ``\s-1CALC1\s+1'', ``\s-1CALC2\s+1'', and ``\s-1CALC3\s+1''.
-By inspecting the source code for each of these routines
-you can determine which format routine generates the output that
-you wish to modify.
-Since the \fBgprof\fR entry shows all the
-potential calls to the format routine you intend to change,
-you can determine if your modifications will affect output that
-should be left alone.
-If you desire to change the output of ``\s-1CALC2\s+1'', but not ``\s-1CALC3\s+1'',
-then formatting routine ``\s-1FORMAT2\s+1'' needs to be split
-into two separate routines,
-one of which implements the new format.
-You can then retarget just the call by ``\s-1CALC2\s+1''
-that needs the new format.
-It should be noted that the static call information is particularly
-useful here since the test case you run probably will not
-exercise the entire program.
-.sh 1 "Conclusions"
-.pp
-We have created a profiler that aids in the evaluation
-of modular programs.
-For each routine in the program,
-the profile shows the extent to which that routine
-helps support various abstractions,
-and how that routine uses other abstractions.
-The profile accurately assesses the cost of routines
-at all levels of the program decomposition.
-The profiler is easily used,
-and can be compiled into the program without any prior planning by
-the programmer.
-It adds only five to thirty percent execution overhead to the program
-being profiled,
-produces no additional output until after the program finishes,
-and allows the program to be measured in its actual environment.
-Finally, the profiler runs on a time-sharing system
-using only the normal services provided by the operating system
-and compilers.
diff --git a/usr.bin/gprof/PSD.doc/profiling.me b/usr.bin/gprof/PSD.doc/profiling.me
deleted file mode 100644
index 227aedf..0000000
--- a/usr.bin/gprof/PSD.doc/profiling.me
+++ /dev/null
@@ -1,115 +0,0 @@
-.\" Copyright (c) 1982, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)profiling.me 8.1 (Berkeley) 6/8/93
-.\"
-.sh 1 "Types of Profiling"
-.pp
-There are several different uses for program profiles,
-and each may require different information from the profiles,
-or different presentation of the information.
-We distinguish two broad categories of profiles:
-those that present counts of statement or routine invocations,
-and those that display timing information about statements
-or routines.
-Counts are typically presented in tabular form,
-often in parallel with a listing of the source code.
-Timing information could be similarly presented;
-but more than one measure of time might be associated with each
-statement or routine.
-For example,
-in the framework used by \fBgprof\fP
-each profiled segment would display two times:
-one for the time used by the segment itself, and another for the
-time inherited from code segments it invokes.
-.pp
-Execution counts are used in many different contexts.
-The exact number of times a routine or statement is activated
-can be used to determine if an algorithm is performing as
-expected.
-Cursory inspection of such counters may show algorithms whose
-complexity is unsuited to the task at hand.
-Careful interpretation of counters can often suggest
-improvements to acceptable algorithms.
-Precise examination can uncover subtle errors in an
-algorithm.
-At this level, profiling counters are similar to
-debugging statements whose purpose is to show the number of times
-a piece of code is executed.
-Another view of such counters is as boolean values.
-One may be interested that a portion of code has executed at
-all, for exhaustive testing, or to check that one implementation
-of an abstraction completely replaces a previous one.
-.pp
-Execution counts are not necessarily proportional to the amount
-of time required to execute the routine or statement.
-Further, the execution time of a routine will not be the same for
-all calls on the routine.
-The criteria for establishing execution time
-must be decided.
-If a routine implements an abstraction by invoking other abstractions,
-the time spent in the routine will not accurately reflect the
-time required by the abstraction it implements.
-Similarly, if an abstraction is implemented by several
-routines the time required by the abstraction will be distributed
-across those routines.
-.pp
-Given the execution time of individual routines,
-\fBgprof\fP accounts to each routine the time spent
-for it by the routines it invokes.
-This accounting is done by assembling a \fIcall graph\fP with nodes that
-are the routines of the program and directed arcs that represent
-calls from call sites to routines.
-We distinguish among three different call graphs for a program.
-The \fIcomplete call graph\fP incorporates all routines and all
-potential arcs,
-including arcs that represent calls to functional parameters
-or functional variables.
-This graph contains the other two graphs as subgraphs.
-The \fIstatic call graph\fP includes all routines and all possible arcs
-that are not calls to functional parameters or variables.
-The \fIdynamic call graph\fP includes only those routines and
-arcs traversed by the profiled execution of the program.
-This graph need not include all routines, nor need it include all
-potential arcs between the routines it covers.
-It may, however, include arcs to functional parameters or
-variables that the static call graph may omit.
-The static call graph can be determined from the (static) program text.
-The dynamic call graph is determined only by profiling an
-execution of the program.
-The complete call graph for a monolithic program could be determined
-by data flow analysis techniques.
-The complete call graph for programs that change
-during execution, by modifying themselves or dynamically loading
-or overlaying code, may never be determinable.
-Both the static call graph and the dynamic call graph are used
-by \fBgprof\fP, but it does not search for the complete call
-graph.
diff --git a/usr.bin/gprof/PSD.doc/refs.me b/usr.bin/gprof/PSD.doc/refs.me
deleted file mode 100644
index 580d080..0000000
--- a/usr.bin/gprof/PSD.doc/refs.me
+++ /dev/null
@@ -1,63 +0,0 @@
-.\" Copyright (c) 1982, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)refs.me 8.1 (Berkeley) 6/8/93
-.\"
-.sh 1 "References"
-.ls 1
-.ip [Bentley81]
-Bentley, J. L.,
-``Writing Efficient Code'',
-Department of Computer Science,
-Carnegie-Mellon University,
-Pittsburgh, Pennsylvania,
-CMU-CS-81-116, 1981.
-.ip [Graham82]
-Graham, S. L., Henry, R. R., Schulman, R. A.,
-``An Experiment in Table Driven Code Generation'',
-SIGPLAN '82 Symposium on Compiler Construction,
-June, 1982.
-.ip [Joy79]
-Joy, W. N., Graham, S. L., Haley, C. B. ``Berkeley Pascal User's Manual'',
-Version 1.1, Computer Science Division
-University of California, Berkeley, CA. April 1979.
-.ip [Knuth71]
-Knuth, D. E. ``An empirical study of FORTRAN programs'',
-Software - Practice and Experience, 1, 105-133. 1971
-.ip [Satterthwaite72]
-Satterthwaite, E. ``Debugging Tools for High Level Languages'',
-Software - Practice and Experience, 2, 197-217, 1972
-.ip [Tarjan72]
-Tarjan, R. E., ``Depth first search and linear graph algorithm,''
-\fISIAM J. Computing\fP \fB1\fP:2, 146-160, 1972.
-.ip [Unix]
-Unix Programmer's Manual, ``\fBprof\fR command'', section 1,
-Bell Laboratories, Murray Hill, NJ. January 1979.
diff --git a/usr.bin/gprof/amd64.h b/usr.bin/gprof/amd64.h
deleted file mode 100644
index 823d656..0000000
--- a/usr.bin/gprof/amd64.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)i386.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
- /*
- * offset (in bytes) of the code from the entry address of a routine.
- * (see asgnsamples for use and explanation.)
- */
-#define OFFSET_OF_CODE 0
-
-enum opermodes { dummy };
-typedef enum opermodes operandenum;
diff --git a/usr.bin/gprof/aout.c b/usr.bin/gprof/aout.c
deleted file mode 100644
index 2ccf818..0000000
--- a/usr.bin/gprof/aout.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/*-
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-/* From: */
-#ifndef lint
-static char sccsid[] = "@(#)gprof.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <netinet/in.h>
-
-#include <a.out.h>
-#include <err.h>
-
-#include "gprof.h"
-
-static void getstrtab(FILE *, const char *);
-static void getsymtab(FILE *, const char *);
-static void gettextspace(FILE *);
-static bool funcsymbol(struct nlist *);
-
-static char *strtab; /* string table in core */
-static long ssiz; /* size of the string table */
-static struct exec xbuf; /* exec header of a.out */
-
-/* Things which get -E excluded by default. */
-static char *excludes[] = { "mcount", "__mcleanup", NULL };
-
- /*
- * Set up string and symbol tables from a.out.
- * and optionally the text space.
- * On return symbol table is sorted by value.
- *
- * Returns 0 on success, -1 on failure.
- */
-int
-aout_getnfile(const char *filename, char ***defaultEs)
-{
- FILE *nfile;
- int valcmp();
-
- nfile = fopen( filename ,"r");
- if (nfile == NULL)
- err( 1 , "%s", filename );
- fread(&xbuf, 1, sizeof(xbuf), nfile);
- if (N_BADMAG(xbuf)) {
- fclose(nfile);
- return -1;
- }
- getstrtab(nfile, filename);
- getsymtab(nfile, filename);
- gettextspace( nfile );
- fclose(nfile);
-# ifdef DEBUG
- if ( debug & AOUTDEBUG ) {
- register int j;
-
- for (j = 0; j < nname; j++){
- printf("[getnfile] 0X%08lx\t%s\n", nl[j].value, nl[j].name);
- }
- }
-# endif /* DEBUG */
- *defaultEs = excludes;
- return 0;
-}
-
-static void
-getstrtab(FILE *nfile, const char *filename)
-{
-
- fseek(nfile, (long)(N_SYMOFF(xbuf) + xbuf.a_syms), 0);
- if (fread(&ssiz, sizeof (ssiz), 1, nfile) == 0)
- errx( 1 , "%s: no string table (old format?)" , filename );
- strtab = calloc(ssiz, 1);
- if (strtab == NULL)
- errx( 1 , "%s: no room for %ld bytes of string table", filename , ssiz);
- if (fread(strtab+sizeof(ssiz), ssiz-sizeof(ssiz), 1, nfile) != 1)
- errx( 1 , "%s: error reading string table" , filename );
-}
-
- /*
- * Read in symbol table
- */
-static void
-getsymtab(FILE *nfile, const char *filename)
-{
- register long i;
- int askfor;
- struct nlist nbuf;
-
- /* pass1 - count symbols */
- fseek(nfile, (long)N_SYMOFF(xbuf), 0);
- nname = 0;
- for (i = xbuf.a_syms; i > 0; i -= sizeof(struct nlist)) {
- fread(&nbuf, sizeof(nbuf), 1, nfile);
- if ( ! funcsymbol( &nbuf ) ) {
- continue;
- }
- nname++;
- }
- if (nname == 0)
- errx( 1 , "%s: no symbols" , filename );
- askfor = nname + 1;
- nl = (nltype *) calloc( askfor , sizeof(nltype) );
- if (nl == 0)
- errx( 1 , "no room for %d bytes of symbol table" ,
- askfor * sizeof(nltype) );
-
- /* pass2 - read symbols */
- fseek(nfile, (long)N_SYMOFF(xbuf), 0);
- npe = nl;
- nname = 0;
- for (i = xbuf.a_syms; i > 0; i -= sizeof(struct nlist)) {
- fread(&nbuf, sizeof(nbuf), 1, nfile);
- if ( ! funcsymbol( &nbuf ) ) {
-# ifdef DEBUG
- if ( debug & AOUTDEBUG ) {
- printf( "[getsymtab] rejecting: 0x%x %s\n" ,
- nbuf.n_type , strtab + nbuf.n_un.n_strx );
- }
-# endif /* DEBUG */
- continue;
- }
- npe->value = nbuf.n_value;
- npe->name = strtab+nbuf.n_un.n_strx;
-# ifdef DEBUG
- if ( debug & AOUTDEBUG ) {
- printf( "[getsymtab] %d %s 0x%08lx\n" ,
- nname , npe -> name , npe -> value );
- }
-# endif /* DEBUG */
- npe++;
- nname++;
- }
- npe->value = -1;
-}
-
- /*
- * read in the text space of an a.out file
- */
-static void
-gettextspace(FILE *nfile)
-{
-
- textspace = (u_char *) malloc( xbuf.a_text );
- if ( textspace == 0 ) {
- warnx("no room for %lu bytes of text space: can't do -c" ,
- xbuf.a_text );
- return;
- }
- (void) fseek( nfile , N_TXTOFF( xbuf ) , 0 );
- if ( fread( textspace , 1 , xbuf.a_text , nfile ) != xbuf.a_text ) {
- warnx("couldn't read text space: can't do -c");
- free( textspace );
- textspace = 0;
- return;
- }
-}
-
-static bool
-funcsymbol(struct nlist *nlistp)
-{
- char *name, c;
-
- /*
- * must be a text symbol,
- * and static text symbols don't qualify if aflag set.
- */
- if ( ! ( ( nlistp -> n_type == ( N_TEXT | N_EXT ) )
- || ( ( nlistp -> n_type == N_TEXT ) && ( aflag == 0 ) ) ) ) {
- return FALSE;
- }
- /*
- * name must start with an underscore if uflag is set.
- * can't have any `funny' characters in name,
- * where `funny' means `.' (.o file names)
- * need to make an exception for sparc .mul & co.
- * perhaps we should just drop this code entirely...
- */
- name = strtab + nlistp -> n_un.n_strx;
- if ( uflag && *name != '_' )
- return FALSE;
-#ifdef sparc
- if ( *name == '.' ) {
- char *p = name + 1;
- if ( *p == 'u' )
- p++;
- if ( strcmp ( p, "mul" ) == 0 || strcmp ( p, "div" ) == 0 ||
- strcmp ( p, "rem" ) == 0 )
- return TRUE;
- }
-#endif
- while ( (c = *name++) ) {
- if ( c == '.' ) {
- return FALSE;
- }
- }
- return TRUE;
-}
diff --git a/usr.bin/gprof/arcs.c b/usr.bin/gprof/arcs.c
deleted file mode 100644
index 3be00df..0000000
--- a/usr.bin/gprof/arcs.c
+++ /dev/null
@@ -1,965 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)arcs.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include "gprof.h"
-
-#ifdef DEBUG
-int visited;
-int viable;
-int newcycle;
-int oldcycle;
-#endif /* DEBUG */
-
- /*
- * add (or just increment) an arc
- */
-void
-addarc( parentp , childp , count )
- nltype *parentp;
- nltype *childp;
- long count;
-{
- arctype *arcp;
-
-# ifdef DEBUG
- if ( debug & TALLYDEBUG ) {
- printf( "[addarc] %ld arcs from %s to %s\n" ,
- count , parentp -> name , childp -> name );
- }
-# endif /* DEBUG */
- arcp = arclookup( parentp , childp );
- if ( arcp != 0 ) {
- /*
- * a hit: just increment the count.
- */
-# ifdef DEBUG
- if ( debug & TALLYDEBUG ) {
- printf( "[tally] hit %ld += %ld\n" ,
- arcp -> arc_count , count );
- }
-# endif /* DEBUG */
- arcp -> arc_count += count;
- return;
- }
- arcp = (arctype *)calloc( 1 , sizeof *arcp );
- if (arcp == NULL)
- errx( 1 , "malloc failed" );
- arcp -> arc_parentp = parentp;
- arcp -> arc_childp = childp;
- arcp -> arc_count = count;
- /*
- * prepend this child to the children of this parent
- */
- arcp -> arc_childlist = parentp -> children;
- parentp -> children = arcp;
- /*
- * prepend this parent to the parents of this child
- */
- arcp -> arc_parentlist = childp -> parents;
- childp -> parents = arcp;
-}
-
- /*
- * the code below topologically sorts the graph (collapsing cycles),
- * and propagates time bottom up and flags top down.
- */
-
- /*
- * the topologically sorted name list pointers
- */
-nltype **topsortnlp;
-
-int
-topcmp( npp1 , npp2 )
- nltype **npp1;
- nltype **npp2;
-{
- return (*npp1) -> toporder - (*npp2) -> toporder;
-}
-
-nltype **
-doarcs()
-{
- nltype *parentp, **timesortnlp;
- arctype *arcp;
- long index;
- long pass;
-
- /*
- * initialize various things:
- * zero out child times.
- * count self-recursive calls.
- * indicate that nothing is on cycles.
- */
- for ( parentp = nl ; parentp < npe ; parentp++ ) {
- parentp -> childtime = 0.0;
- arcp = arclookup( parentp , parentp );
- if ( arcp != 0 ) {
- parentp -> ncall -= arcp -> arc_count;
- parentp -> selfcalls = arcp -> arc_count;
- } else {
- parentp -> selfcalls = 0;
- }
- parentp -> npropcall = parentp -> ncall;
- parentp -> propfraction = 0.0;
- parentp -> propself = 0.0;
- parentp -> propchild = 0.0;
- parentp -> printflag = FALSE;
- parentp -> toporder = DFN_NAN;
- parentp -> cycleno = 0;
- parentp -> cyclehead = parentp;
- parentp -> cnext = 0;
- }
- for ( pass = 1 ; ; pass++ ) {
- /*
- * topologically order things
- * if any node is unnumbered,
- * number it and any of its descendents.
- */
- for ( dfn_init() , parentp = nl ; parentp < npe ; parentp++ ) {
- if ( parentp -> toporder == DFN_NAN ) {
- dfn( parentp );
- }
- }
- /*
- * link together nodes on the same cycle
- */
- cyclelink();
- /*
- * if no cycles to break up, proceed
- */
- if ( ! Cflag )
- break;
- /*
- * analyze cycles to determine breakup
- */
-# ifdef DEBUG
- if ( debug & BREAKCYCLE ) {
- printf("[doarcs] pass %ld, cycle(s) %d\n" , pass , ncycle );
- }
-# endif /* DEBUG */
- if ( pass == 1 ) {
- printf( "\n\n%s %s\n%s %d:\n" ,
- "The following arcs were deleted" ,
- "from the propagation calculation" ,
- "to reduce the maximum cycle size to", cyclethreshold );
- }
- if ( cycleanalyze() )
- break;
- free ( cyclenl );
- ncycle = 0;
- for ( parentp = nl ; parentp < npe ; parentp++ ) {
- parentp -> toporder = DFN_NAN;
- parentp -> cycleno = 0;
- parentp -> cyclehead = parentp;
- parentp -> cnext = 0;
- }
- }
- if ( pass > 1 ) {
- printf( "\f\n" );
- } else {
- printf( "\tNone\n\n" );
- }
- /*
- * Sort the symbol table in reverse topological order
- */
- topsortnlp = (nltype **) calloc( nname , sizeof(nltype *) );
- if ( topsortnlp == (nltype **) 0 )
- errx( 1 , "[doarcs] ran out of memory for topo sorting" );
- for ( index = 0 ; index < nname ; index += 1 ) {
- topsortnlp[ index ] = &nl[ index ];
- }
- qsort( topsortnlp , nname , sizeof(nltype *) , topcmp );
-# ifdef DEBUG
- if ( debug & DFNDEBUG ) {
- printf( "[doarcs] topological sort listing\n" );
- for ( index = 0 ; index < nname ; index += 1 ) {
- printf( "[doarcs] " );
- printf( "%d:" , topsortnlp[ index ] -> toporder );
- printname( topsortnlp[ index ] );
- printf( "\n" );
- }
- }
-# endif /* DEBUG */
- /*
- * starting from the topological top,
- * propagate print flags to children.
- * also, calculate propagation fractions.
- * this happens before time propagation
- * since time propagation uses the fractions.
- */
- doflags();
- /*
- * starting from the topological bottom,
- * propagate children times up to parents.
- */
- dotime();
- /*
- * Now, sort by propself + propchild.
- * sorting both the regular function names
- * and cycle headers.
- */
- timesortnlp = (nltype **) calloc( nname + ncycle , sizeof(nltype *) );
- if ( timesortnlp == (nltype **) 0 )
- errx( 1 , "ran out of memory for sorting" );
- for ( index = 0 ; index < nname ; index++ ) {
- timesortnlp[index] = &nl[index];
- }
- for ( index = 1 ; index <= ncycle ; index++ ) {
- timesortnlp[nname+index-1] = &cyclenl[index];
- }
- qsort( timesortnlp , nname + ncycle , sizeof(nltype *) , totalcmp );
- for ( index = 0 ; index < nname + ncycle ; index++ ) {
- timesortnlp[ index ] -> index = index + 1;
- }
- return( timesortnlp );
-}
-
-void
-dotime()
-{
- int index;
-
- cycletime();
- for ( index = 0 ; index < nname ; index += 1 ) {
- timepropagate( topsortnlp[ index ] );
- }
-}
-
-void
-timepropagate( parentp )
- nltype *parentp;
-{
- arctype *arcp;
- nltype *childp;
- double share;
- double propshare;
-
- if ( parentp -> propfraction == 0.0 ) {
- return;
- }
- /*
- * gather time from children of this parent.
- */
- for ( arcp = parentp -> children ; arcp ; arcp = arcp -> arc_childlist ) {
- childp = arcp -> arc_childp;
- if ( arcp -> arc_flags & DEADARC ) {
- continue;
- }
- if ( arcp -> arc_count == 0 ) {
- continue;
- }
- if ( childp == parentp ) {
- continue;
- }
- if ( childp -> propfraction == 0.0 ) {
- continue;
- }
- if ( childp -> cyclehead != childp ) {
- if ( parentp -> cycleno == childp -> cycleno ) {
- continue;
- }
- if ( parentp -> toporder <= childp -> toporder ) {
- fprintf( stderr , "[propagate] toporder botches\n" );
- }
- childp = childp -> cyclehead;
- } else {
- if ( parentp -> toporder <= childp -> toporder ) {
- fprintf( stderr , "[propagate] toporder botches\n" );
- continue;
- }
- }
- if ( childp -> npropcall == 0 ) {
- continue;
- }
- /*
- * distribute time for this arc
- */
- arcp -> arc_time = childp -> time
- * ( ( (double) arcp -> arc_count ) /
- ( (double) childp -> npropcall ) );
- arcp -> arc_childtime = childp -> childtime
- * ( ( (double) arcp -> arc_count ) /
- ( (double) childp -> npropcall ) );
- share = arcp -> arc_time + arcp -> arc_childtime;
- parentp -> childtime += share;
- /*
- * ( 1 - propfraction ) gets lost along the way
- */
- propshare = parentp -> propfraction * share;
- /*
- * fix things for printing
- */
- parentp -> propchild += propshare;
- arcp -> arc_time *= parentp -> propfraction;
- arcp -> arc_childtime *= parentp -> propfraction;
- /*
- * add this share to the parent's cycle header, if any.
- */
- if ( parentp -> cyclehead != parentp ) {
- parentp -> cyclehead -> childtime += share;
- parentp -> cyclehead -> propchild += propshare;
- }
-# ifdef DEBUG
- if ( debug & PROPDEBUG ) {
- printf( "[dotime] child \t" );
- printname( childp );
- printf( " with %f %f %ld/%ld\n" ,
- childp -> time , childp -> childtime ,
- arcp -> arc_count , childp -> npropcall );
- printf( "[dotime] parent\t" );
- printname( parentp );
- printf( "\n[dotime] share %f\n" , share );
- }
-# endif /* DEBUG */
- }
-}
-
-void
-cyclelink()
-{
- register nltype *nlp;
- register nltype *cyclenlp;
- int cycle;
- nltype *memberp;
- arctype *arcp;
-
- /*
- * Count the number of cycles, and initialize the cycle lists
- */
- ncycle = 0;
- for ( nlp = nl ; nlp < npe ; nlp++ ) {
- /*
- * this is how you find unattached cycles
- */
- if ( nlp -> cyclehead == nlp && nlp -> cnext != 0 ) {
- ncycle += 1;
- }
- }
- /*
- * cyclenl is indexed by cycle number:
- * i.e. it is origin 1, not origin 0.
- */
- cyclenl = (nltype *) calloc( ncycle + 1 , sizeof( nltype ) );
- if ( cyclenl == 0 )
- errx( 1 , "no room for %d bytes of cycle headers" ,
- ( ncycle + 1 ) * sizeof( nltype ) );
- /*
- * now link cycles to true cycleheads,
- * number them, accumulate the data for the cycle
- */
- cycle = 0;
- for ( nlp = nl ; nlp < npe ; nlp++ ) {
- if ( !( nlp -> cyclehead == nlp && nlp -> cnext != 0 ) ) {
- continue;
- }
- cycle += 1;
- cyclenlp = &cyclenl[cycle];
- cyclenlp -> name = 0; /* the name */
- cyclenlp -> value = 0; /* the pc entry point */
- cyclenlp -> time = 0.0; /* ticks in this routine */
- cyclenlp -> childtime = 0.0; /* cumulative ticks in children */
- cyclenlp -> ncall = 0; /* how many times called */
- cyclenlp -> selfcalls = 0; /* how many calls to self */
- cyclenlp -> propfraction = 0.0; /* what % of time propagates */
- cyclenlp -> propself = 0.0; /* how much self time propagates */
- cyclenlp -> propchild = 0.0; /* how much child time propagates */
- cyclenlp -> printflag = TRUE; /* should this be printed? */
- cyclenlp -> index = 0; /* index in the graph list */
- cyclenlp -> toporder = DFN_NAN; /* graph call chain top-sort order */
- cyclenlp -> cycleno = cycle; /* internal number of cycle on */
- cyclenlp -> cyclehead = cyclenlp; /* pointer to head of cycle */
- cyclenlp -> cnext = nlp; /* pointer to next member of cycle */
- cyclenlp -> parents = 0; /* list of caller arcs */
- cyclenlp -> children = 0; /* list of callee arcs */
-# ifdef DEBUG
- if ( debug & CYCLEDEBUG ) {
- printf( "[cyclelink] " );
- printname( nlp );
- printf( " is the head of cycle %d\n" , cycle );
- }
-# endif /* DEBUG */
- /*
- * link members to cycle header
- */
- for ( memberp = nlp ; memberp ; memberp = memberp -> cnext ) {
- memberp -> cycleno = cycle;
- memberp -> cyclehead = cyclenlp;
- }
- /*
- * count calls from outside the cycle
- * and those among cycle members
- */
- for ( memberp = nlp ; memberp ; memberp = memberp -> cnext ) {
- for ( arcp=memberp->parents ; arcp ; arcp=arcp->arc_parentlist ) {
- if ( arcp -> arc_parentp == memberp ) {
- continue;
- }
- if ( arcp -> arc_parentp -> cycleno == cycle ) {
- cyclenlp -> selfcalls += arcp -> arc_count;
- } else {
- cyclenlp -> npropcall += arcp -> arc_count;
- }
- }
- }
- }
-}
-
- /*
- * analyze cycles to determine breakup
- */
-bool
-cycleanalyze()
-{
- arctype **cyclestack;
- arctype **stkp;
- arctype **arcpp;
- arctype **endlist;
- arctype *arcp;
- nltype *nlp;
- cltype *clp;
- bool ret;
- bool done;
- int size;
- int cycleno;
-
- /*
- * calculate the size of the cycle, and find nodes that
- * exit the cycle as they are desirable targets to cut
- * some of their parents
- */
- for ( done = TRUE , cycleno = 1 ; cycleno <= ncycle ; cycleno++ ) {
- size = 0;
- for (nlp = cyclenl[ cycleno ] . cnext; nlp; nlp = nlp -> cnext) {
- size += 1;
- nlp -> parentcnt = 0;
- nlp -> flags &= ~HASCYCLEXIT;
- for ( arcp = nlp -> parents; arcp; arcp = arcp -> arc_parentlist ) {
- nlp -> parentcnt += 1;
- if ( arcp -> arc_parentp -> cycleno != cycleno )
- nlp -> flags |= HASCYCLEXIT;
- }
- }
- if ( size <= cyclethreshold )
- continue;
- done = FALSE;
- cyclestack = (arctype **) calloc( size + 1 , sizeof( arctype *) );
- if ( cyclestack == 0 )
- errx( 1, "no room for %d bytes of cycle stack" ,
- ( size + 1 ) * sizeof( arctype * ) );
-# ifdef DEBUG
- if ( debug & BREAKCYCLE ) {
- printf( "[cycleanalyze] starting cycle %d of %d, size %d\n" ,
- cycleno , ncycle , size );
- }
-# endif /* DEBUG */
- for ( nlp = cyclenl[ cycleno ] . cnext ; nlp ; nlp = nlp -> cnext ) {
- stkp = &cyclestack[0];
- nlp -> flags |= CYCLEHEAD;
- ret = descend ( nlp , cyclestack , stkp );
- nlp -> flags &= ~CYCLEHEAD;
- if ( ret == FALSE )
- break;
- }
- free( cyclestack );
- if ( cyclecnt > 0 ) {
- compresslist();
- for ( clp = cyclehead ; clp ; ) {
- endlist = &clp -> list[ clp -> size ];
- for ( arcpp = clp -> list ; arcpp < endlist ; arcpp++ )
- (*arcpp) -> arc_cyclecnt--;
- cyclecnt--;
- clp = clp -> next;
- free( clp );
- }
- cyclehead = 0;
- }
- }
-# ifdef DEBUG
- if ( debug & BREAKCYCLE ) {
- printf("%s visited %d, viable %d, newcycle %d, oldcycle %d\n",
- "[doarcs]" , visited , viable , newcycle , oldcycle);
- }
-# endif /* DEBUG */
- return( done );
-}
-
-bool
-descend( node , stkstart , stkp )
- nltype *node;
- arctype **stkstart;
- arctype **stkp;
-{
- arctype *arcp;
- bool ret;
-
- for ( arcp = node -> children ; arcp ; arcp = arcp -> arc_childlist ) {
-# ifdef DEBUG
- visited++;
-# endif /* DEBUG */
- if ( arcp -> arc_childp -> cycleno != node -> cycleno
- || ( arcp -> arc_childp -> flags & VISITED )
- || ( arcp -> arc_flags & DEADARC ) )
- continue;
-# ifdef DEBUG
- viable++;
-# endif /* DEBUG */
- *stkp = arcp;
- if ( arcp -> arc_childp -> flags & CYCLEHEAD ) {
- if ( addcycle( stkstart , stkp ) == FALSE )
- return( FALSE );
- continue;
- }
- arcp -> arc_childp -> flags |= VISITED;
- ret = descend( arcp -> arc_childp , stkstart , stkp + 1 );
- arcp -> arc_childp -> flags &= ~VISITED;
- if ( ret == FALSE )
- return( FALSE );
- }
- return( TRUE );
-}
-
-bool
-addcycle( stkstart , stkend )
- arctype **stkstart;
- arctype **stkend;
-{
- arctype **arcpp;
- arctype **stkloc;
- arctype **stkp;
- arctype **endlist;
- arctype *minarc;
- arctype *arcp;
- cltype *clp;
- int size;
-
- size = stkend - stkstart + 1;
- if ( size <= 1 )
- return( TRUE );
- for ( arcpp = stkstart , minarc = *arcpp ; arcpp <= stkend ; arcpp++ ) {
- if ( *arcpp > minarc )
- continue;
- minarc = *arcpp;
- stkloc = arcpp;
- }
- for ( clp = cyclehead ; clp ; clp = clp -> next ) {
- if ( clp -> size != size )
- continue;
- stkp = stkloc;
- endlist = &clp -> list[ size ];
- for ( arcpp = clp -> list ; arcpp < endlist ; arcpp++ ) {
- if ( *stkp++ != *arcpp )
- break;
- if ( stkp > stkend )
- stkp = stkstart;
- }
- if ( arcpp == endlist ) {
-# ifdef DEBUG
- oldcycle++;
-# endif /* DEBUG */
- return( TRUE );
- }
- }
- clp = (cltype *)
- calloc( 1 , sizeof ( cltype ) + ( size - 1 ) * sizeof( arctype * ) );
- if ( clp == 0 ) {
- warnx( "no room for %d bytes of subcycle storage" ,
- sizeof ( cltype ) + ( size - 1 ) * sizeof( arctype * ) );
- return( FALSE );
- }
- stkp = stkloc;
- endlist = &clp -> list[ size ];
- for ( arcpp = clp -> list ; arcpp < endlist ; arcpp++ ) {
- arcp = *arcpp = *stkp++;
- if ( stkp > stkend )
- stkp = stkstart;
- arcp -> arc_cyclecnt++;
- if ( ( arcp -> arc_flags & ONLIST ) == 0 ) {
- arcp -> arc_flags |= ONLIST;
- arcp -> arc_next = archead;
- archead = arcp;
- }
- }
- clp -> size = size;
- clp -> next = cyclehead;
- cyclehead = clp;
-# ifdef DEBUG
- newcycle++;
- if ( debug & SUBCYCLELIST ) {
- printsubcycle( clp );
- }
-# endif /* DEBUG */
- cyclecnt++;
- if ( cyclecnt >= CYCLEMAX )
- return( FALSE );
- return( TRUE );
-}
-
-void
-compresslist()
-{
- cltype *clp;
- cltype **prev;
- arctype **arcpp;
- arctype **endlist;
- arctype *arcp;
- arctype *maxarcp;
- arctype *maxexitarcp;
- arctype *maxwithparentarcp;
- arctype *maxnoparentarcp;
- int maxexitcnt;
- int maxwithparentcnt;
- int maxnoparentcnt;
-# ifdef DEBUG
- const char *type;
-# endif /* DEBUG */
-
- maxexitcnt = 0;
- maxwithparentcnt = 0;
- maxnoparentcnt = 0;
- for ( endlist = &archead , arcp = archead ; arcp ; ) {
- if ( arcp -> arc_cyclecnt == 0 ) {
- arcp -> arc_flags &= ~ONLIST;
- *endlist = arcp -> arc_next;
- arcp -> arc_next = 0;
- arcp = *endlist;
- continue;
- }
- if ( arcp -> arc_childp -> flags & HASCYCLEXIT ) {
- if ( arcp -> arc_cyclecnt > maxexitcnt ||
- ( arcp -> arc_cyclecnt == maxexitcnt &&
- arcp -> arc_cyclecnt < maxexitarcp -> arc_count ) ) {
- maxexitcnt = arcp -> arc_cyclecnt;
- maxexitarcp = arcp;
- }
- } else if ( arcp -> arc_childp -> parentcnt > 1 ) {
- if ( arcp -> arc_cyclecnt > maxwithparentcnt ||
- ( arcp -> arc_cyclecnt == maxwithparentcnt &&
- arcp -> arc_cyclecnt < maxwithparentarcp -> arc_count ) ) {
- maxwithparentcnt = arcp -> arc_cyclecnt;
- maxwithparentarcp = arcp;
- }
- } else {
- if ( arcp -> arc_cyclecnt > maxnoparentcnt ||
- ( arcp -> arc_cyclecnt == maxnoparentcnt &&
- arcp -> arc_cyclecnt < maxnoparentarcp -> arc_count ) ) {
- maxnoparentcnt = arcp -> arc_cyclecnt;
- maxnoparentarcp = arcp;
- }
- }
- endlist = &arcp -> arc_next;
- arcp = arcp -> arc_next;
- }
- if ( maxexitcnt > 0 ) {
- /*
- * first choice is edge leading to node with out-of-cycle parent
- */
- maxarcp = maxexitarcp;
-# ifdef DEBUG
- type = "exit";
-# endif /* DEBUG */
- } else if ( maxwithparentcnt > 0 ) {
- /*
- * second choice is edge leading to node with at least one
- * other in-cycle parent
- */
- maxarcp = maxwithparentarcp;
-# ifdef DEBUG
- type = "internal";
-# endif /* DEBUG */
- } else {
- /*
- * last choice is edge leading to node with only this arc as
- * a parent (as it will now be orphaned)
- */
- maxarcp = maxnoparentarcp;
-# ifdef DEBUG
- type = "orphan";
-# endif /* DEBUG */
- }
- maxarcp -> arc_flags |= DEADARC;
- maxarcp -> arc_childp -> parentcnt -= 1;
- maxarcp -> arc_childp -> npropcall -= maxarcp -> arc_count;
-# ifdef DEBUG
- if ( debug & BREAKCYCLE ) {
- printf( "%s delete %s arc: %s (%ld) -> %s from %u cycle(s)\n" ,
- "[compresslist]" , type , maxarcp -> arc_parentp -> name ,
- maxarcp -> arc_count , maxarcp -> arc_childp -> name ,
- maxarcp -> arc_cyclecnt );
- }
-# endif /* DEBUG */
- printf( "\t%s to %s with %ld calls\n" , maxarcp -> arc_parentp -> name ,
- maxarcp -> arc_childp -> name , maxarcp -> arc_count );
- prev = &cyclehead;
- for ( clp = cyclehead ; clp ; ) {
- endlist = &clp -> list[ clp -> size ];
- for ( arcpp = clp -> list ; arcpp < endlist ; arcpp++ )
- if ( (*arcpp) -> arc_flags & DEADARC )
- break;
- if ( arcpp == endlist ) {
- prev = &clp -> next;
- clp = clp -> next;
- continue;
- }
- for ( arcpp = clp -> list ; arcpp < endlist ; arcpp++ )
- (*arcpp) -> arc_cyclecnt--;
- cyclecnt--;
- *prev = clp -> next;
- clp = clp -> next;
- free( clp );
- }
-}
-
-#ifdef DEBUG
-void
-printsubcycle( clp )
- cltype *clp;
-{
- arctype **arcpp;
- arctype **endlist;
-
- arcpp = clp -> list;
- printf( "%s <cycle %d>\n" , (*arcpp) -> arc_parentp -> name ,
- (*arcpp) -> arc_parentp -> cycleno ) ;
- for ( endlist = &clp -> list[ clp -> size ]; arcpp < endlist ; arcpp++ )
- printf( "\t(%ld) -> %s\n" , (*arcpp) -> arc_count ,
- (*arcpp) -> arc_childp -> name ) ;
-}
-#endif /* DEBUG */
-
-void
-cycletime()
-{
- int cycle;
- nltype *cyclenlp;
- nltype *childp;
-
- for ( cycle = 1 ; cycle <= ncycle ; cycle += 1 ) {
- cyclenlp = &cyclenl[ cycle ];
- for ( childp = cyclenlp -> cnext ; childp ; childp = childp -> cnext ) {
- if ( childp -> propfraction == 0.0 ) {
- /*
- * all members have the same propfraction except those
- * that were excluded with -E
- */
- continue;
- }
- cyclenlp -> time += childp -> time;
- }
- cyclenlp -> propself = cyclenlp -> propfraction * cyclenlp -> time;
- }
-}
-
- /*
- * in one top to bottom pass over the topologically sorted namelist
- * propagate:
- * printflag as the union of parents' printflags
- * propfraction as the sum of fractional parents' propfractions
- * and while we're here, sum time for functions.
- */
-void
-doflags()
-{
- int index;
- nltype *childp;
- nltype *oldhead;
-
- oldhead = 0;
- for ( index = nname-1 ; index >= 0 ; index -= 1 ) {
- childp = topsortnlp[ index ];
- /*
- * if we haven't done this function or cycle,
- * inherit things from parent.
- * this way, we are linear in the number of arcs
- * since we do all members of a cycle (and the cycle itself)
- * as we hit the first member of the cycle.
- */
- if ( childp -> cyclehead != oldhead ) {
- oldhead = childp -> cyclehead;
- inheritflags( childp );
- }
-# ifdef DEBUG
- if ( debug & PROPDEBUG ) {
- printf( "[doflags] " );
- printname( childp );
- printf( " inherits printflag %d and propfraction %f\n" ,
- childp -> printflag , childp -> propfraction );
- }
-# endif /* DEBUG */
- if ( ! childp -> printflag ) {
- /*
- * printflag is off
- * it gets turned on by
- * being on -f list,
- * or there not being any -f list and not being on -e list.
- */
- if ( onlist( flist , childp -> name )
- || ( !fflag && !onlist( elist , childp -> name ) ) ) {
- childp -> printflag = TRUE;
- }
- } else {
- /*
- * this function has printing parents:
- * maybe someone wants to shut it up
- * by putting it on -e list. (but favor -f over -e)
- */
- if ( ( !onlist( flist , childp -> name ) )
- && onlist( elist , childp -> name ) ) {
- childp -> printflag = FALSE;
- }
- }
- if ( childp -> propfraction == 0.0 ) {
- /*
- * no parents to pass time to.
- * collect time from children if
- * its on -F list,
- * or there isn't any -F list and its not on -E list.
- */
- if ( onlist( Flist , childp -> name )
- || ( !Fflag && !onlist( Elist , childp -> name ) ) ) {
- childp -> propfraction = 1.0;
- }
- } else {
- /*
- * it has parents to pass time to,
- * but maybe someone wants to shut it up
- * by putting it on -E list. (but favor -F over -E)
- */
- if ( !onlist( Flist , childp -> name )
- && onlist( Elist , childp -> name ) ) {
- childp -> propfraction = 0.0;
- }
- }
- childp -> propself = childp -> time * childp -> propfraction;
- printtime += childp -> propself;
-# ifdef DEBUG
- if ( debug & PROPDEBUG ) {
- printf( "[doflags] " );
- printname( childp );
- printf( " ends up with printflag %d and propfraction %f\n" ,
- childp -> printflag , childp -> propfraction );
- printf( "time %f propself %f printtime %f\n" ,
- childp -> time , childp -> propself , printtime );
- }
-# endif /* DEBUG */
- }
-}
-
- /*
- * check if any parent of this child
- * (or outside parents of this cycle)
- * have their print flags on and set the
- * print flag of the child (cycle) appropriately.
- * similarly, deal with propagation fractions from parents.
- */
-void
-inheritflags( childp )
- nltype *childp;
-{
- nltype *headp;
- arctype *arcp;
- nltype *parentp;
- nltype *memp;
-
- headp = childp -> cyclehead;
- if ( childp == headp ) {
- /*
- * just a regular child, check its parents
- */
- childp -> printflag = FALSE;
- childp -> propfraction = 0.0;
- for (arcp = childp -> parents ; arcp ; arcp = arcp -> arc_parentlist) {
- parentp = arcp -> arc_parentp;
- if ( childp == parentp ) {
- continue;
- }
- childp -> printflag |= parentp -> printflag;
- /*
- * if the child was never actually called
- * (e.g. this arc is static (and all others are, too))
- * no time propagates along this arc.
- */
- if ( arcp -> arc_flags & DEADARC ) {
- continue;
- }
- if ( childp -> npropcall ) {
- childp -> propfraction += parentp -> propfraction
- * ( ( (double) arcp -> arc_count )
- / ( (double) childp -> npropcall ) );
- }
- }
- } else {
- /*
- * its a member of a cycle, look at all parents from
- * outside the cycle
- */
- headp -> printflag = FALSE;
- headp -> propfraction = 0.0;
- for ( memp = headp -> cnext ; memp ; memp = memp -> cnext ) {
- for (arcp = memp->parents ; arcp ; arcp = arcp->arc_parentlist) {
- if ( arcp -> arc_parentp -> cyclehead == headp ) {
- continue;
- }
- parentp = arcp -> arc_parentp;
- headp -> printflag |= parentp -> printflag;
- /*
- * if the cycle was never actually called
- * (e.g. this arc is static (and all others are, too))
- * no time propagates along this arc.
- */
- if ( arcp -> arc_flags & DEADARC ) {
- continue;
- }
- if ( headp -> npropcall ) {
- headp -> propfraction += parentp -> propfraction
- * ( ( (double) arcp -> arc_count )
- / ( (double) headp -> npropcall ) );
- }
- }
- }
- for ( memp = headp ; memp ; memp = memp -> cnext ) {
- memp -> printflag = headp -> printflag;
- memp -> propfraction = headp -> propfraction;
- }
- }
-}
diff --git a/usr.bin/gprof/arm.h b/usr.bin/gprof/arm.h
deleted file mode 100644
index 823d656..0000000
--- a/usr.bin/gprof/arm.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)i386.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
- /*
- * offset (in bytes) of the code from the entry address of a routine.
- * (see asgnsamples for use and explanation.)
- */
-#define OFFSET_OF_CODE 0
-
-enum opermodes { dummy };
-typedef enum opermodes operandenum;
diff --git a/usr.bin/gprof/dfn.c b/usr.bin/gprof/dfn.c
deleted file mode 100644
index 0e23a87..0000000
--- a/usr.bin/gprof/dfn.c
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)dfn.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include "gprof.h"
-
-#define DFN_DEPTH 100
-struct dfnstruct {
- nltype *nlentryp;
- int cycletop;
-};
-typedef struct dfnstruct dfntype;
-
-dfntype dfn_stack[ DFN_DEPTH ];
-int dfn_depth;
-
-int dfn_counter;
-
-void
-dfn_init()
-{
-
- dfn_depth = 0;
- dfn_counter = DFN_NAN;
-}
-
- /*
- * given this parent, depth first number its children.
- */
-void
-dfn( parentp )
- nltype *parentp;
-{
- arctype *arcp;
-
-# ifdef DEBUG
- if ( debug & DFNDEBUG ) {
- printf( "[dfn] dfn(" );
- printname( parentp );
- printf( ")\n" );
- }
-# endif /* DEBUG */
- /*
- * if we're already numbered, no need to look any further.
- */
- if ( dfn_numbered( parentp ) ) {
- return;
- }
- /*
- * if we're already busy, must be a cycle
- */
- if ( dfn_busy( parentp ) ) {
- dfn_findcycle( parentp );
- return;
- }
- /*
- * visit yourself before your children
- */
- dfn_pre_visit( parentp );
- /*
- * visit children
- */
- for ( arcp = parentp -> children ; arcp ; arcp = arcp -> arc_childlist ) {
- if ( arcp -> arc_flags & DEADARC )
- continue;
- dfn( arcp -> arc_childp );
- }
- /*
- * visit yourself after your children
- */
- dfn_post_visit( parentp );
-}
-
- /*
- * push a parent onto the stack and mark it busy
- */
-void
-dfn_pre_visit( parentp )
- nltype *parentp;
-{
-
- dfn_depth += 1;
- if ( dfn_depth >= DFN_DEPTH )
- errx( 1 , "[dfn] out of my depth (dfn_stack overflow)" );
- dfn_stack[ dfn_depth ].nlentryp = parentp;
- dfn_stack[ dfn_depth ].cycletop = dfn_depth;
- parentp -> toporder = DFN_BUSY;
-# ifdef DEBUG
- if ( debug & DFNDEBUG ) {
- printf( "[dfn_pre_visit]\t\t%d:" , dfn_depth );
- printname( parentp );
- printf( "\n" );
- }
-# endif /* DEBUG */
-}
-
- /*
- * are we already numbered?
- */
-bool
-dfn_numbered( childp )
- nltype *childp;
-{
-
- return ( childp -> toporder != DFN_NAN && childp -> toporder != DFN_BUSY );
-}
-
- /*
- * are we already busy?
- */
-bool
-dfn_busy( childp )
- nltype *childp;
-{
-
- if ( childp -> toporder == DFN_NAN ) {
- return FALSE;
- }
- return TRUE;
-}
-
- /*
- * MISSING: an explanation
- */
-void
-dfn_findcycle( childp )
- nltype *childp;
-{
- int cycletop;
- nltype *cycleheadp;
- nltype *tailp;
- int index;
-
- for ( cycletop = dfn_depth ; cycletop > 0 ; cycletop -= 1 ) {
- cycleheadp = dfn_stack[ cycletop ].nlentryp;
- if ( childp == cycleheadp ) {
- break;
- }
- if ( childp -> cyclehead != childp &&
- childp -> cyclehead == cycleheadp ) {
- break;
- }
- }
- if ( cycletop <= 0 )
- errx( 1 , "[dfn_findcycle] couldn't find head of cycle" );
-# ifdef DEBUG
- if ( debug & DFNDEBUG ) {
- printf( "[dfn_findcycle] dfn_depth %d cycletop %d " ,
- dfn_depth , cycletop );
- printname( cycleheadp );
- printf( "\n" );
- }
-# endif /* DEBUG */
- if ( cycletop == dfn_depth ) {
- /*
- * this is previous function, e.g. this calls itself
- * sort of boring
- */
- dfn_self_cycle( childp );
- } else {
- /*
- * glom intervening functions that aren't already
- * glommed into this cycle.
- * things have been glommed when their cyclehead field
- * points to the head of the cycle they are glommed into.
- */
- for ( tailp = cycleheadp ; tailp -> cnext ; tailp = tailp -> cnext ) {
- /* void: chase down to tail of things already glommed */
-# ifdef DEBUG
- if ( debug & DFNDEBUG ) {
- printf( "[dfn_findcycle] tail " );
- printname( tailp );
- printf( "\n" );
- }
-# endif /* DEBUG */
- }
- /*
- * if what we think is the top of the cycle
- * has a cyclehead field, then it's not really the
- * head of the cycle, which is really what we want
- */
- if ( cycleheadp -> cyclehead != cycleheadp ) {
- cycleheadp = cycleheadp -> cyclehead;
-# ifdef DEBUG
- if ( debug & DFNDEBUG ) {
- printf( "[dfn_findcycle] new cyclehead " );
- printname( cycleheadp );
- printf( "\n" );
- }
-# endif /* DEBUG */
- }
- for ( index = cycletop + 1 ; index <= dfn_depth ; index += 1 ) {
- childp = dfn_stack[ index ].nlentryp;
- if ( childp -> cyclehead == childp ) {
- /*
- * not yet glommed anywhere, glom it
- * and fix any children it has glommed
- */
- tailp -> cnext = childp;
- childp -> cyclehead = cycleheadp;
-# ifdef DEBUG
- if ( debug & DFNDEBUG ) {
- printf( "[dfn_findcycle] glomming " );
- printname( childp );
- printf( " onto " );
- printname( cycleheadp );
- printf( "\n" );
- }
-# endif /* DEBUG */
- for ( tailp = childp ; tailp->cnext ; tailp = tailp->cnext ) {
- tailp -> cnext -> cyclehead = cycleheadp;
-# ifdef DEBUG
- if ( debug & DFNDEBUG ) {
- printf( "[dfn_findcycle] and its tail " );
- printname( tailp -> cnext );
- printf( " onto " );
- printname( cycleheadp );
- printf( "\n" );
- }
-# endif /* DEBUG */
- }
- } else if ( childp -> cyclehead != cycleheadp /* firewall */ ) {
- fprintf( stderr ,
- "[dfn_busy] glommed, but not to cyclehead\n" );
- }
- }
- }
-}
-
- /*
- * deal with self-cycles
- * for lint: ARGSUSED
- */
-void
-dfn_self_cycle( parentp )
- nltype *parentp;
-{
- /*
- * since we are taking out self-cycles elsewhere
- * no need for the special case, here.
- */
-# ifdef DEBUG
- if ( debug & DFNDEBUG ) {
- printf( "[dfn_self_cycle] " );
- printname( parentp );
- printf( "\n" );
- }
-# endif /* DEBUG */
-}
-
- /*
- * visit a node after all its children
- * [MISSING: an explanation]
- * and pop it off the stack
- */
-void
-dfn_post_visit( parentp )
- nltype *parentp;
-{
- nltype *memberp;
-
-# ifdef DEBUG
- if ( debug & DFNDEBUG ) {
- printf( "[dfn_post_visit]\t%d: " , dfn_depth );
- printname( parentp );
- printf( "\n" );
- }
-# endif /* DEBUG */
- /*
- * number functions and things in their cycles
- * unless the function is itself part of a cycle
- */
- if ( parentp -> cyclehead == parentp ) {
- dfn_counter += 1;
- for ( memberp = parentp ; memberp ; memberp = memberp -> cnext ) {
- memberp -> toporder = dfn_counter;
-# ifdef DEBUG
- if ( debug & DFNDEBUG ) {
- printf( "[dfn_post_visit]\t\tmember " );
- printname( memberp );
- printf( " -> toporder = %d\n" , dfn_counter );
- }
-# endif /* DEBUG */
- }
- } else {
-# ifdef DEBUG
- if ( debug & DFNDEBUG ) {
- printf( "[dfn_post_visit]\t\tis part of a cycle\n" );
- }
-# endif /* DEBUG */
- }
- dfn_depth -= 1;
-}
diff --git a/usr.bin/gprof/elf.c b/usr.bin/gprof/elf.c
deleted file mode 100644
index b0af431..0000000
--- a/usr.bin/gprof/elf.c
+++ /dev/null
@@ -1,148 +0,0 @@
-/*-
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-/* From: */
-#ifndef lint
-static char sccsid[] = "@(#)gprof.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <machine/elf.h>
-
-#include <err.h>
-#include <fcntl.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "gprof.h"
-
-static bool wantsym(const Elf_Sym *, const char *);
-
-/* Things which get -E excluded by default. */
-static char *excludes[] = { ".mcount", "_mcleanup", NULL };
-
-int
-elf_getnfile(const char *filename, char ***defaultEs)
-{
- int fd;
- Elf_Ehdr h;
- struct stat s;
- void *mapbase;
- const char *base;
- const Elf_Shdr *shdrs;
- const Elf_Shdr *sh_symtab;
- const Elf_Shdr *sh_strtab;
- const char *strtab;
- const Elf_Sym *symtab;
- int symtabct;
- int i;
-
- if ((fd = open(filename, O_RDONLY)) == -1)
- err(1, "%s", filename);
- if (read(fd, &h, sizeof h) != sizeof h || !IS_ELF(h)) {
- close(fd);
- return -1;
- }
- if (fstat(fd, &s) == -1)
- err(1, "cannot fstat %s", filename);
- if ((mapbase = mmap(0, s.st_size, PROT_READ, MAP_SHARED, fd, 0)) ==
- MAP_FAILED)
- err(1, "cannot mmap %s", filename);
- close(fd);
-
- base = (const char *)mapbase;
- shdrs = (const Elf_Shdr *)(base + h.e_shoff);
-
- /* Find the symbol table and associated string table section. */
- for (i = 1; i < h.e_shnum; i++)
- if (shdrs[i].sh_type == SHT_SYMTAB)
- break;
- if (i == h.e_shnum)
- errx(1, "%s has no symbol table", filename);
- sh_symtab = &shdrs[i];
- sh_strtab = &shdrs[sh_symtab->sh_link];
-
- symtab = (const Elf_Sym *)(base + sh_symtab->sh_offset);
- symtabct = sh_symtab->sh_size / sh_symtab->sh_entsize;
- strtab = (const char *)(base + sh_strtab->sh_offset);
-
- /* Count the symbols that we're interested in. */
- nname = 0;
- for (i = 1; i < symtabct; i++)
- if (wantsym(&symtab[i], strtab))
- nname++;
-
- /* Allocate memory for them, plus a terminating entry. */
- if ((nl = (nltype *)calloc(nname + 1, sizeof(nltype))) == NULL)
- errx(1, "insufficient memory for symbol table");
-
- /* Read them in. */
- npe = nl;
- for (i = 1; i < symtabct; i++) {
- const Elf_Sym *sym = &symtab[i];
-
- if (wantsym(sym, strtab)) {
- npe->value = sym->st_value;
- npe->name = strtab + sym->st_name;
- npe++;
- }
- }
- npe->value = -1;
-
- *defaultEs = excludes;
- return 0;
-}
-
-static bool
-wantsym(const Elf_Sym *sym, const char *strtab)
-{
- int type;
- int bind;
-
- type = ELF_ST_TYPE(sym->st_info);
- bind = ELF_ST_BIND(sym->st_info);
-
- if (type != STT_FUNC ||
- (aflag && bind == STB_LOCAL) ||
- (uflag && strchr(strtab + sym->st_name, '.') != NULL))
- return 0;
-
- return 1;
-}
diff --git a/usr.bin/gprof/gprof.1 b/usr.bin/gprof/gprof.1
deleted file mode 100644
index b340ed9..0000000
--- a/usr.bin/gprof/gprof.1
+++ /dev/null
@@ -1,335 +0,0 @@
-.\" Copyright (c) 1983, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)gprof.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd October 7, 2005
-.Dt GPROF 1
-.Os
-.Sh NAME
-.Nm gprof
-.Nd display call graph profile data
-.Sh SYNOPSIS
-.Nm
-.Op Fl abKlLsuz
-.Op Fl C Ar count
-.Op Fl e Ar name
-.Op Fl E Ar name
-.Op Fl f Ar name
-.Op Fl F Ar name
-.Op Fl k Ar fromname toname
-.Op Ar a.out Op Ar a.out.gmon ...
-.Sh DESCRIPTION
-The
-.Nm
-utility produces an execution profile of C, Pascal, or Fortran77 programs.
-The effect of called routines is incorporated in the profile of each caller.
-The profile data is taken from the call graph profile file
-which is created by programs that are compiled with the
-.Fl pg
-option of
-.Xr cc 1 ,
-.Xr pc 1 ,
-and
-.Xr f77 1 .
-The
-.Fl pg
-option also links in versions of the library routines
-that are compiled for profiling.
-By convention these libraries have their name suffixed with
-.Pa _p ,
-i.e., the profiled version of
-.Pa libc.a
-is
-.Pa libc_p.a
-and if you specify libraries directly to the
-compiler or linker you can use
-.Fl l Ns Ar c_p
-instead of
-.Fl l Ns Ar c .
-Read the given object file (the default is
-.Pa a.out)
-and establishes the relation between its symbol table
-and the call graph profile.
-The default graph profile file name is the name
-of the executable with the suffix
-.Pa .gmon
-appended.
-If more than one profile file is specified,
-the
-.Nm
-output shows the sum of the profile information in the given profile files.
-.Pp
-The
-.Nm
-utility calculates the amount of time spent in each routine.
-Next, these times are propagated along the edges of the call graph.
-Cycles are discovered, and calls into a cycle are made to share the time
-of the cycle.
-The first listing shows the functions
-sorted according to the time they represent
-including the time of their call graph descendants.
-Below each function entry is shown its (direct) call graph children,
-and how their times are propagated to this function.
-A similar display above the function shows how this function's time and the
-time of its descendants is propagated to its (direct) call graph parents.
-.Pp
-Cycles are also shown, with an entry for the cycle as a whole and
-a listing of the members of the cycle and their contributions to the
-time and call counts of the cycle.
-.Pp
-Second, a flat profile is given,
-similar to that provided by
-.Xr prof 1 .
-This listing gives the total execution times, the call counts,
-the time that the call spent in the routine itself, and
-the time that the call spent in the routine itself including
-its descendants.
-The units for the per-call times are normally milliseconds,
-but they are nanoseconds if the profiling clock frequency
-is 10 million or larger,
-and if a function appears to be never called then its total self time
-is printed as a percentage in the self time per call column.
-The very high profiling clock frequencies needed to get sufficient
-accuracy in the per-call times for short-lived programs are only
-implemented for
-.Dq high resolution
-(non-statistical) kernel profiling.
-.Pp
-Finally, an index of the function names is provided.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl a
-Suppress the printing of statically declared functions.
-If this option is given, all relevant information about the static function
-(e.g., time samples, calls to other functions, calls from other functions)
-belongs to the function loaded just before the static function in the
-.Pa a.out
-file.
-.It Fl b
-Suppress the printing of a description of each field in the profile.
-.It Fl C Ar count
-Find a minimal set of arcs that can be broken to eliminate all cycles with
-.Ar count
-or more members.
-Caution: the algorithm used to break cycles is exponential,
-so using this option may cause
-.Nm
-to run for a very long time.
-.It Fl e Ar name
-Suppress the printing of the graph profile entry for routine
-.Ar name
-and all its descendants
-(unless they have other ancestors that are not suppressed).
-More than one
-.Fl e
-option may be given.
-Only one
-.Ar name
-may be given with each
-.Fl e
-option.
-.It Fl E Ar name
-Suppress the printing of the graph profile entry for routine
-.Ar name
-(and its descendants) as
-.Fl e ,
-above, and also excludes the time spent in
-.Ar name
-(and its descendants) from the total and percentage time computations.
-(For example,
-.Fl E
-.Ar mcount
-.Fl E
-.Ar mcleanup
-is the default.)
-.It Fl f Ar name
-Print the graph profile entry of only the specified routine
-.Ar name
-and its descendants.
-More than one
-.Fl f
-option may be given.
-Only one
-.Ar name
-may be given with each
-.Fl f
-option.
-.It Fl F Ar name
-Print the graph profile entry of only the routine
-.Ar name
-and its descendants (as
-.Fl f ,
-above) and also uses only the times of the printed routines
-in total time and percentage computations.
-More than one
-.Fl F
-option may be given.
-Only one
-.Ar name
-may be given with each
-.Fl F
-option.
-The
-.Fl F
-option
-overrides
-the
-.Fl E
-option.
-.It Fl k Ar fromname Ar toname
-Will delete any arcs from routine
-.Ar fromname
-to routine
-.Ar toname .
-This can be used to break undesired cycles.
-More than one
-.Fl k
-option may be given.
-Only one pair of routine names may be given with each
-.Fl k
-option.
-.It Fl K
-Gather information about symbols from the currently-running kernel using the
-.Xr sysctl 3
-and
-.Xr kldsym 2
-interfaces.
-This forces the
-.Pa a.out
-argument to be ignored, and allows for symbols in
-.Xr kld 4
-modules to be used.
-.It Fl l
-Suppress the printing of the call-graph profile.
-.It Fl L
-Suppress the printing of the flat profile.
-.It Fl s
-A profile file
-.Pa gmon.sum
-is produced that represents
-the sum of the profile information in all the specified profile files.
-This summary profile file may be given to later
-executions of gprof (probably also with a
-.Fl s )
-to accumulate profile data across several runs of an
-.Pa a.out
-file.
-.It Fl u
-Suppress the printing of functions whose names are not visible to
-C programs.
-For the ELF object format, this means names that
-contain the
-.Ql .\&
-character.
-For the a.out object format, it means names that do not
-begin with a
-.Ql _
-character.
-All relevant information about such functions belongs to the
-(non-suppressed) function with the next lowest address.
-This is useful for eliminating "functions" that are just labels
-inside other functions.
-.It Fl z
-Display routines that have zero usage (as shown by call counts
-and accumulated time).
-This is useful with the
-.Fl c
-option for discovering which routines were never called.
-.El
-.Sh FILES
-.Bl -tag -width a.out.gmon -compact
-.It Pa a.out
-The namelist and text space.
-.It Pa a.out.gmon
-Dynamic call graph and profile.
-.It Pa gmon.sum
-Summarized dynamic call graph and profile.
-.El
-.Sh SEE ALSO
-.Xr cc 1 ,
-.Xr profil 2 ,
-.Xr clocks 7
-.\" .Xr monitor 3 ,
-.\" .Xr prof 1
-.Rs
-.%T "An Execution Profiler for Modular Programs"
-.%A S. Graham
-.%A P. Kessler
-.%A M. McKusick
-.%J "Software - Practice and Experience"
-.%V 13
-.%P pp. 671-685
-.%D 1983
-.Re
-.Rs
-.%T "gprof: A Call Graph Execution Profiler"
-.%A S. Graham
-.%A P. Kessler
-.%A M. McKusick
-.%J "Proceedings of the SIGPLAN '82 Symposium on Compiler Construction, SIGPLAN Notices"
-.%V 17
-.%N 6
-.%P pp. 120-126
-.%D June 1982
-.Re
-.Sh HISTORY
-The
-.Nm
-profiler
-appeared in
-.Bx 4.2 .
-.Sh BUGS
-The granularity of the sampling is shown, but remains
-statistical at best.
-We assume that the time for each execution of a function
-can be expressed by the total time for the function divided
-by the number of times the function is called.
-Thus the time propagated along the call graph arcs to the function's
-parents is directly proportional to the number of times that
-arc is traversed.
-.Pp
-Parents that are not themselves profiled will have the time of
-their profiled children propagated to them, but they will appear
-to be spontaneously invoked in the call graph listing, and will
-not have their time propagated further.
-Similarly, signal catchers, even though profiled, will appear
-to be spontaneous (although for more obscure reasons).
-Any profiled children of signal catchers should have their times
-propagated properly, unless the signal catcher was invoked during
-the execution of the profiling routine, in which case all is lost.
-.Pp
-The profiled program must call
-.Xr exit 3
-or return normally for the profiling information to be saved
-in the graph profile file.
diff --git a/usr.bin/gprof/gprof.c b/usr.bin/gprof/gprof.c
deleted file mode 100644
index cfb9fab..0000000
--- a/usr.bin/gprof/gprof.c
+++ /dev/null
@@ -1,610 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1983, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)gprof.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <limits.h>
-#include <stdint.h>
-#include <string.h>
-
-#include "gprof.h"
-
-static int valcmp(const void *, const void *);
-
-
-static struct gmonhdr gmonhdr;
-static int lflag;
-static int Lflag;
-
-int
-main(argc, argv)
- int argc;
- char **argv;
-{
- char **sp;
- nltype **timesortnlp;
- char **defaultEs;
-
- --argc;
- argv++;
- debug = 0;
- bflag = TRUE;
- while ( *argv != 0 && **argv == '-' ) {
- (*argv)++;
- switch ( **argv ) {
- case 'a':
- aflag = TRUE;
- break;
- case 'b':
- bflag = FALSE;
- break;
- case 'C':
- Cflag = TRUE;
- cyclethreshold = atoi( *++argv );
- break;
- case 'd':
- dflag = TRUE;
- setlinebuf(stdout);
- debug |= atoi( *++argv );
- debug |= ANYDEBUG;
-# ifdef DEBUG
- printf("[main] debug = %d\n", debug);
-# else /* not DEBUG */
- printf("gprof: -d ignored\n");
-# endif /* DEBUG */
- break;
- case 'E':
- ++argv;
- addlist( Elist , *argv );
- Eflag = TRUE;
- addlist( elist , *argv );
- eflag = TRUE;
- break;
- case 'e':
- addlist( elist , *++argv );
- eflag = TRUE;
- break;
- case 'F':
- ++argv;
- addlist( Flist , *argv );
- Fflag = TRUE;
- addlist( flist , *argv );
- fflag = TRUE;
- break;
- case 'f':
- addlist( flist , *++argv );
- fflag = TRUE;
- break;
- case 'k':
- addlist( kfromlist , *++argv );
- addlist( ktolist , *++argv );
- kflag = TRUE;
- break;
- case 'K':
- Kflag = TRUE;
- break;
- case 'l':
- lflag = 1;
- Lflag = 0;
- break;
- case 'L':
- Lflag = 1;
- lflag = 0;
- break;
- case 's':
- sflag = TRUE;
- break;
- case 'u':
- uflag = TRUE;
- break;
- case 'z':
- zflag = TRUE;
- break;
- }
- argv++;
- }
- if ( *argv != 0 ) {
- a_outname = *argv;
- argv++;
- } else {
- a_outname = A_OUTNAME;
- }
- if ( *argv != 0 ) {
- gmonname = *argv;
- argv++;
- } else {
- gmonname = (char *) malloc(strlen(a_outname)+6);
- strcpy(gmonname, a_outname);
- strcat(gmonname, ".gmon");
- }
- /*
- * get information from the executable file.
- */
- if ((Kflag && kernel_getnfile(a_outname, &defaultEs) == -1) ||
- (elf_getnfile(a_outname, &defaultEs) == -1 &&
- aout_getnfile(a_outname, &defaultEs) == -1))
- errx(1, "%s: bad format", a_outname);
- /*
- * sort symbol table.
- */
- qsort(nl, nname, sizeof(nltype), valcmp);
- /*
- * turn off default functions
- */
- for ( sp = defaultEs ; *sp ; sp++ ) {
- Eflag = TRUE;
- addlist( Elist , *sp );
- eflag = TRUE;
- addlist( elist , *sp );
- }
- /*
- * get information about mon.out file(s).
- */
- do {
- getpfile( gmonname );
- if ( *argv != 0 ) {
- gmonname = *argv;
- }
- } while ( *argv++ != 0 );
- /*
- * how many ticks per second?
- * if we can't tell, report time in ticks.
- */
- if (hz == 0) {
- hz = 1;
- fprintf(stderr, "time is in ticks, not seconds\n");
- }
- /*
- * dump out a gmon.sum file if requested
- */
- if ( sflag ) {
- dumpsum( GMONSUM );
- }
- /*
- * assign samples to procedures
- */
- asgnsamples();
- /*
- * assemble the dynamic profile
- */
- timesortnlp = doarcs();
- /*
- * print the dynamic profile
- */
- if(!lflag) {
- printgprof( timesortnlp );
- }
- /*
- * print the flat profile
- */
- if(!Lflag) {
- printprof();
- }
- /*
- * print the index
- */
- printindex();
- exit(0);
-}
-
- /*
- * information from a gmon.out file is in two parts:
- * an array of sampling hits within pc ranges,
- * and the arcs.
- */
-void
-getpfile(filename)
- char *filename;
-{
- FILE *pfile;
- FILE *openpfile();
- struct rawarc arc;
-
- pfile = openpfile(filename);
- readsamples(pfile);
- /*
- * the rest of the file consists of
- * a bunch of <from,self,count> tuples.
- */
- while ( fread( &arc , sizeof arc , 1 , pfile ) == 1 ) {
-# ifdef DEBUG
- if ( debug & SAMPLEDEBUG ) {
- printf( "[getpfile] frompc 0x%lx selfpc 0x%lx count %ld\n" ,
- arc.raw_frompc , arc.raw_selfpc , arc.raw_count );
- }
-# endif /* DEBUG */
- /*
- * add this arc
- */
- tally( &arc );
- }
- fclose(pfile);
-}
-
-FILE *
-openpfile(filename)
- char *filename;
-{
- struct gmonhdr tmp;
- FILE *pfile;
- int size;
- int rate;
-
- if((pfile = fopen(filename, "r")) == NULL)
- err(1, "%s", filename);
- fread(&tmp, sizeof(struct gmonhdr), 1, pfile);
- if ( s_highpc != 0 && ( tmp.lpc != gmonhdr.lpc ||
- tmp.hpc != gmonhdr.hpc || tmp.ncnt != gmonhdr.ncnt ) )
- errx(1, "%s: incompatible with first gmon file", filename);
- gmonhdr = tmp;
- if ( gmonhdr.version == GMONVERSION ) {
- rate = gmonhdr.profrate;
- size = sizeof(struct gmonhdr);
- } else {
- fseek(pfile, sizeof(struct ophdr), SEEK_SET);
- size = sizeof(struct ophdr);
- gmonhdr.profrate = rate = hertz();
- gmonhdr.version = GMONVERSION;
- }
- if (hz == 0) {
- hz = rate;
- } else if (hz != rate)
- errx(0, "%s: profile clock rate (%d) %s (%ld) in first gmon file",
- filename, rate, "incompatible with clock rate", hz);
- if ( gmonhdr.histcounter_type == 0 ) {
- /* Historical case. The type was u_short (2 bytes in practice). */
- histcounter_type = 16;
- histcounter_size = 2;
- } else {
- histcounter_type = gmonhdr.histcounter_type;
- histcounter_size = abs(histcounter_type) / CHAR_BIT;
- }
- s_lowpc = (unsigned long) gmonhdr.lpc;
- s_highpc = (unsigned long) gmonhdr.hpc;
- lowpc = (unsigned long)gmonhdr.lpc / HISTORICAL_SCALE_2;
- highpc = (unsigned long)gmonhdr.hpc / HISTORICAL_SCALE_2;
- sampbytes = gmonhdr.ncnt - size;
- nsamples = sampbytes / histcounter_size;
-# ifdef DEBUG
- if ( debug & SAMPLEDEBUG ) {
- printf( "[openpfile] hdr.lpc 0x%lx hdr.hpc 0x%lx hdr.ncnt %d\n",
- gmonhdr.lpc , gmonhdr.hpc , gmonhdr.ncnt );
- printf( "[openpfile] s_lowpc 0x%lx s_highpc 0x%lx\n" ,
- s_lowpc , s_highpc );
- printf( "[openpfile] lowpc 0x%lx highpc 0x%lx\n" ,
- lowpc , highpc );
- printf( "[openpfile] sampbytes %d nsamples %d\n" ,
- sampbytes , nsamples );
- printf( "[openpfile] sample rate %ld\n" , hz );
- }
-# endif /* DEBUG */
- return(pfile);
-}
-
-void
-tally( rawp )
- struct rawarc *rawp;
-{
- nltype *parentp;
- nltype *childp;
-
- parentp = nllookup( rawp -> raw_frompc );
- childp = nllookup( rawp -> raw_selfpc );
- if ( parentp == 0 || childp == 0 )
- return;
- if ( kflag
- && onlist( kfromlist , parentp -> name )
- && onlist( ktolist , childp -> name ) ) {
- return;
- }
- childp -> ncall += rawp -> raw_count;
-# ifdef DEBUG
- if ( debug & TALLYDEBUG ) {
- printf( "[tally] arc from %s to %s traversed %ld times\n" ,
- parentp -> name , childp -> name , rawp -> raw_count );
- }
-# endif /* DEBUG */
- addarc( parentp , childp , rawp -> raw_count );
-}
-
-/*
- * dump out the gmon.sum file
- */
-void
-dumpsum( sumfile )
- char *sumfile;
-{
- register nltype *nlp;
- register arctype *arcp;
- struct rawarc arc;
- FILE *sfile;
-
- if ( ( sfile = fopen ( sumfile , "w" ) ) == NULL )
- err( 1 , "%s" , sumfile );
- /*
- * dump the header; use the last header read in
- */
- if ( fwrite( &gmonhdr , sizeof gmonhdr , 1 , sfile ) != 1 )
- err( 1 , "%s" , sumfile );
- /*
- * dump the samples
- */
- if (fwrite(samples, histcounter_size, nsamples, sfile) != nsamples)
- err( 1 , "%s" , sumfile );
- /*
- * dump the normalized raw arc information
- */
- for ( nlp = nl ; nlp < npe ; nlp++ ) {
- for ( arcp = nlp -> children ; arcp ; arcp = arcp -> arc_childlist ) {
- arc.raw_frompc = arcp -> arc_parentp -> value;
- arc.raw_selfpc = arcp -> arc_childp -> value;
- arc.raw_count = arcp -> arc_count;
- if ( fwrite ( &arc , sizeof arc , 1 , sfile ) != 1 )
- err( 1 , "%s" , sumfile );
-# ifdef DEBUG
- if ( debug & SAMPLEDEBUG ) {
- printf( "[dumpsum] frompc 0x%lx selfpc 0x%lx count %ld\n" ,
- arc.raw_frompc , arc.raw_selfpc , arc.raw_count );
- }
-# endif /* DEBUG */
- }
- }
- fclose( sfile );
-}
-
-static int
-valcmp(v1, v2)
- const void *v1;
- const void *v2;
-{
- const nltype *p1 = (const nltype *)v1;
- const nltype *p2 = (const nltype *)v2;
-
- if ( p1 -> value < p2 -> value ) {
- return LESSTHAN;
- }
- if ( p1 -> value > p2 -> value ) {
- return GREATERTHAN;
- }
- return EQUALTO;
-}
-
-void
-readsamples(pfile)
- FILE *pfile;
-{
- int i;
- intmax_t sample;
-
- if (samples == 0) {
- samples = (double *) calloc(nsamples, sizeof(double));
- if (samples == 0)
- errx(0, "no room for %d sample pc's", nsamples);
- }
- for (i = 0; i < nsamples; i++) {
- fread(&sample, histcounter_size, 1, pfile);
- if (feof(pfile))
- break;
- switch ( histcounter_type ) {
- case -8:
- samples[i] += *(int8_t *)&sample;
- break;
- case 8:
- samples[i] += *(u_int8_t *)&sample;
- break;
- case -16:
- samples[i] += *(int16_t *)&sample;
- break;
- case 16:
- samples[i] += *(u_int16_t *)&sample;
- break;
- case -32:
- samples[i] += *(int32_t *)&sample;
- break;
- case 32:
- samples[i] += *(u_int32_t *)&sample;
- break;
- case -64:
- samples[i] += *(int64_t *)&sample;
- break;
- case 64:
- samples[i] += *(u_int64_t *)&sample;
- break;
- default:
- err(1, "unsupported histogram counter type %d", histcounter_type);
- }
- }
- if (i != nsamples)
- errx(1, "unexpected EOF after reading %d/%d samples", --i , nsamples );
-}
-
-/*
- * Assign samples to the procedures to which they belong.
- *
- * There are three cases as to where pcl and pch can be
- * with respect to the routine entry addresses svalue0 and svalue1
- * as shown in the following diagram. overlap computes the
- * distance between the arrows, the fraction of the sample
- * that is to be credited to the routine which starts at svalue0.
- *
- * svalue0 svalue1
- * | |
- * v v
- *
- * +-----------------------------------------------+
- * | |
- * | ->| |<- ->| |<- ->| |<- |
- * | | | | | |
- * +---------+ +---------+ +---------+
- *
- * ^ ^ ^ ^ ^ ^
- * | | | | | |
- * pcl pch pcl pch pcl pch
- *
- * For the vax we assert that samples will never fall in the first
- * two bytes of any routine, since that is the entry mask,
- * thus we give call alignentries() to adjust the entry points if
- * the entry mask falls in one bucket but the code for the routine
- * doesn't start until the next bucket. In conjunction with the
- * alignment of routine addresses, this should allow us to have
- * only one sample for every four bytes of text space and never
- * have any overlap (the two end cases, above).
- */
-void
-asgnsamples()
-{
- register int j;
- double ccnt;
- double time;
- unsigned long pcl, pch;
- register int i;
- unsigned long overlap;
- unsigned long svalue0, svalue1;
-
- /* read samples and assign to namelist symbols */
- scale = highpc - lowpc;
- scale /= nsamples;
- alignentries();
- for (i = 0, j = 1; i < nsamples; i++) {
- ccnt = samples[i];
- if (ccnt == 0)
- continue;
- pcl = lowpc + (unsigned long)(scale * i);
- pch = lowpc + (unsigned long)(scale * (i + 1));
- time = ccnt;
-# ifdef DEBUG
- if ( debug & SAMPLEDEBUG ) {
- printf( "[asgnsamples] pcl 0x%lx pch 0x%lx ccnt %.0f\n" ,
- pcl , pch , ccnt );
- }
-# endif /* DEBUG */
- totime += time;
- for (j = j - 1; j < nname; j++) {
- svalue0 = nl[j].svalue;
- svalue1 = nl[j+1].svalue;
- /*
- * if high end of tick is below entry address,
- * go for next tick.
- */
- if (pch < svalue0)
- break;
- /*
- * if low end of tick into next routine,
- * go for next routine.
- */
- if (pcl >= svalue1)
- continue;
- overlap = min(pch, svalue1) - max(pcl, svalue0);
- if (overlap > 0) {
-# ifdef DEBUG
- if (debug & SAMPLEDEBUG) {
- printf("[asgnsamples] (0x%lx->0x%lx-0x%lx) %s gets %f ticks %lu overlap\n",
- nl[j].value / HISTORICAL_SCALE_2,
- svalue0, svalue1, nl[j].name,
- overlap * time / scale, overlap);
- }
-# endif /* DEBUG */
- nl[j].time += overlap * time / scale;
- }
- }
- }
-# ifdef DEBUG
- if (debug & SAMPLEDEBUG) {
- printf("[asgnsamples] totime %f\n", totime);
- }
-# endif /* DEBUG */
-}
-
-
-unsigned long
-min(a, b)
- unsigned long a,b;
-{
- if (a<b)
- return(a);
- return(b);
-}
-
-unsigned long
-max(a, b)
- unsigned long a,b;
-{
- if (a>b)
- return(a);
- return(b);
-}
-
- /*
- * calculate scaled entry point addresses (to save time in asgnsamples),
- * and possibly push the scaled entry points over the entry mask,
- * if it turns out that the entry point is in one bucket and the code
- * for a routine is in the next bucket.
- */
-void
-alignentries()
-{
- register struct nl *nlp;
- unsigned long bucket_of_entry;
- unsigned long bucket_of_code;
-
- for (nlp = nl; nlp < npe; nlp++) {
- nlp -> svalue = nlp -> value / HISTORICAL_SCALE_2;
- bucket_of_entry = (nlp->svalue - lowpc) / scale;
- bucket_of_code = (nlp->svalue + OFFSET_OF_CODE / HISTORICAL_SCALE_2 -
- lowpc) / scale;
- if (bucket_of_entry < bucket_of_code) {
-# ifdef DEBUG
- if (debug & SAMPLEDEBUG) {
- printf("[alignentries] pushing svalue 0x%lx to 0x%lx\n",
- nlp->svalue,
- nlp->svalue + OFFSET_OF_CODE / HISTORICAL_SCALE_2);
- }
-# endif /* DEBUG */
- nlp->svalue += OFFSET_OF_CODE / HISTORICAL_SCALE_2;
- }
- }
-}
diff --git a/usr.bin/gprof/gprof.callg b/usr.bin/gprof/gprof.callg
deleted file mode 100644
index 533c96c..0000000
--- a/usr.bin/gprof/gprof.callg
+++ /dev/null
@@ -1,108 +0,0 @@
-
-
-
-call graph profile:
- The sum of self and descendents is the major sort
- for this listing.
-
- function entries:
-
-index the index of the function in the call graph
- listing, as an aid to locating it (see below).
-
-%time the percentage of the total time of the program
- accounted for by this function and its
- descendents.
-
-self the number of seconds spent in this function
- itself.
-
-descendents
- the number of seconds spent in the descendents of
- this function on behalf of this function.
-
-called the number of times this function is called (other
- than recursive calls).
-
-self the number of times this function calls itself
- recursively.
-
-name the name of the function, with an indication of
- its membership in a cycle, if any.
-
-index the index of the function in the call graph
- listing, as an aid to locating it.
-
-
-
- parent listings:
-
-self* the number of seconds of this function's self time
- which is due to calls from this parent.
-
-descendents*
- the number of seconds of this function's
- descendent time which is due to calls from this
- parent.
-
-called** the number of times this function is called by
- this parent. This is the numerator of the
- fraction which divides up the function's time to
- its parents.
-
-total* the number of times this function was called by
- all of its parents. This is the denominator of
- the propagation fraction.
-
-parents the name of this parent, with an indication of the
- parent's membership in a cycle, if any.
-
-index the index of this parent in the call graph
- listing, as an aid in locating it.
-
-
-
- children listings:
-
-self* the number of seconds of this child's self time
- which is due to being called by this function.
-
-descendent*
- the number of seconds of this child's descendent's
- time which is due to being called by this
- function.
-
-called** the number of times this child is called by this
- function. This is the numerator of the
- propagation fraction for this child.
-
-total* the number of times this child is called by all
- functions. This is the denominator of the
- propagation fraction.
-
-children the name of this child, and an indication of its
- membership in a cycle, if any.
-
-index the index of this child in the call graph listing,
- as an aid to locating it.
-
-
-
- * these fields are omitted for parents (or
- children) in the same cycle as the function. If
- the function (or child) is a member of a cycle,
- the propagated times and propagation denominator
- represent the self time and descendent time of the
- cycle as a whole.
-
- ** static-only parents and children are indicated
- by a call count of 0.
-
-
-
- cycle listings:
- the cycle as a whole is listed with the same
- fields as a function entry. Below it are listed
- the members of the cycle, and their contributions
- to the time and call counts of the cycle.
-
diff --git a/usr.bin/gprof/gprof.flat b/usr.bin/gprof/gprof.flat
deleted file mode 100644
index 60999a3..0000000
--- a/usr.bin/gprof/gprof.flat
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-flat profile:
-
- % the percentage of the total running time of the
-time program used by this function.
-
-cumulative a running sum of the number of seconds accounted
- seconds for by this function and those listed above it.
-
- self the number of seconds accounted for by this
-seconds function alone. This is the major sort for this
- listing.
-
-calls the number of times this function was invoked, if
- this function is profiled, else blank.
-
- self the average number of milliseconds spent in this
-ms/call function per call, if this function is profiled,
- else blank.
-
- total the average number of milliseconds spent in this
-ms/call function and its descendents per call, if this
- function is profiled, else blank.
-
-name the name of the function. This is the minor sort
- for this listing. The index shows the location of
- the function in the gprof listing. If the index is
- in parenthesis it shows where it would appear in
- the gprof listing if it were to be printed.
-
diff --git a/usr.bin/gprof/gprof.h b/usr.bin/gprof/gprof.h
deleted file mode 100644
index f8592d4..0000000
--- a/usr.bin/gprof/gprof.h
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)gprof.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/gmon.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#if __amd64__
-# include "amd64.h"
-#endif
-#if __arm__
-# include "arm.h"
-#endif
-#if __i386__
-# include "i386.h"
-#endif
-#if __ia64__
-# include "ia64.h"
-#endif
-#if __mips__
-# include "mips.h"
-#endif
-#if __powerpc__
-# include "powerpc.h"
-#endif
-#if __sparc64__
-# include "sparc64.h"
-#endif
-
- /*
- * booleans
- */
-typedef int bool;
-#define FALSE 0
-#define TRUE 1
-
- /*
- * Historical scale factor in profil(2)'s algorithm for converting
- * pc addresses to bucket numbers. This now just complicates the
- * scaling and makes bucket:pc densities of more than 1/2 useless.
- */
-#define HISTORICAL_SCALE_2 2
-
- /*
- * ticks per second
- */
-long hz;
-
-size_t histcounter_size;
-int histcounter_type;
-
-char *a_outname;
-#define A_OUTNAME "a.out"
-
-char *gmonname;
-#define GMONSUM "gmon.sum"
-
- /*
- * a constructed arc,
- * with pointers to the namelist entry of the parent and the child,
- * a count of how many times this arc was traversed,
- * and pointers to the next parent of this child and
- * the next child of this parent.
- */
-struct arcstruct {
- struct nl *arc_parentp; /* pointer to parent's nl entry */
- struct nl *arc_childp; /* pointer to child's nl entry */
- long arc_count; /* num calls from parent to child */
- double arc_time; /* time inherited along arc */
- double arc_childtime; /* childtime inherited along arc */
- struct arcstruct *arc_parentlist; /* parents-of-this-child list */
- struct arcstruct *arc_childlist; /* children-of-this-parent list */
- struct arcstruct *arc_next; /* list of arcs on cycle */
- unsigned short arc_cyclecnt; /* num cycles involved in */
- unsigned short arc_flags; /* see below */
-};
-typedef struct arcstruct arctype;
-
- /*
- * arc flags
- */
-#define DEADARC 0x01 /* time should not propagate across the arc */
-#define ONLIST 0x02 /* arc is on list of arcs in cycles */
-
- /*
- * The symbol table;
- * for each external in the specified file we gather
- * its address, the number of calls and compute its share of CPU time.
- */
-struct nl {
- const char *name; /* the name */
- unsigned long value; /* the pc entry point */
- unsigned long svalue; /* entry point aligned to histograms */
- double time; /* ticks in this routine */
- double childtime; /* cumulative ticks in children */
- long ncall; /* how many times called */
- long npropcall; /* times called by live arcs */
- long selfcalls; /* how many calls to self */
- double propfraction; /* what % of time propagates */
- double propself; /* how much self time propagates */
- double propchild; /* how much child time propagates */
- short printflag; /* should this be printed? */
- short flags; /* see below */
- int index; /* index in the graph list */
- int toporder; /* graph call chain top-sort order */
- int cycleno; /* internal number of cycle on */
- int parentcnt; /* number of live parent arcs */
- struct nl *cyclehead; /* pointer to head of cycle */
- struct nl *cnext; /* pointer to next member of cycle */
- arctype *parents; /* list of caller arcs */
- arctype *children; /* list of callee arcs */
-};
-typedef struct nl nltype;
-
-nltype *nl; /* the whole namelist */
-nltype *npe; /* the virtual end of the namelist */
-int nname; /* the number of function names */
-
-#define HASCYCLEXIT 0x08 /* node has arc exiting from cycle */
-#define CYCLEHEAD 0x10 /* node marked as head of a cycle */
-#define VISITED 0x20 /* node visited during a cycle */
-
- /*
- * The cycle list.
- * for each subcycle within an identified cycle, we gather
- * its size and the list of included arcs.
- */
-struct cl {
- int size; /* length of cycle */
- struct cl *next; /* next member of list */
- arctype *list[1]; /* list of arcs in cycle */
- /* actually longer */
-};
-typedef struct cl cltype;
-
-arctype *archead; /* the head of arcs in current cycle list */
-cltype *cyclehead; /* the head of the list */
-int cyclecnt; /* the number of cycles found */
-#define CYCLEMAX 100 /* maximum cycles before cutting one of them */
-
- /*
- * flag which marks a nl entry as topologically ``busy''
- * flag which marks a nl entry as topologically ``not_numbered''
- */
-#define DFN_BUSY -1
-#define DFN_NAN 0
-
- /*
- * namelist entries for cycle headers.
- * the number of discovered cycles.
- */
-nltype *cyclenl; /* cycle header namelist */
-int ncycle; /* number of cycles discovered */
-
- /*
- * The header on the gmon.out file.
- * gmon.out consists of a struct phdr (defined in gmon.h)
- * and then an array of ncnt samples representing the
- * discretized program counter values.
- *
- * Backward compatible old style header
- */
-struct ophdr {
- u_short *lpc;
- u_short *hpc;
- int ncnt;
-};
-
-int debug;
-
- /*
- * Each discretized pc sample has
- * a count of the number of samples in its range
- */
-double *samples;
-
-unsigned long s_lowpc; /* lowpc from the profile file */
-unsigned long s_highpc; /* highpc from the profile file */
-unsigned long lowpc, highpc; /* range profiled, in historical units */
-unsigned sampbytes; /* number of bytes of samples */
-int nsamples; /* number of samples */
-double actime; /* accumulated time thus far for putprofline */
-double totime; /* total time for all routines */
-double printtime; /* total of time being printed */
-double scale; /* scale factor converting samples to pc
- values: each sample covers scale bytes */
-unsigned char *textspace; /* text space of a.out in core */
-int cyclethreshold; /* with -C, minimum cycle size to ignore */
-
- /*
- * option flags, from a to z.
- */
-bool aflag; /* suppress static functions */
-bool bflag; /* blurbs, too */
-bool Cflag; /* find cut-set to eliminate cycles */
-bool dflag; /* debugging options */
-bool eflag; /* specific functions excluded */
-bool Eflag; /* functions excluded with time */
-bool fflag; /* specific functions requested */
-bool Fflag; /* functions requested with time */
-bool kflag; /* arcs to be deleted */
-bool Kflag; /* use the running kernel for symbols */
-bool sflag; /* sum multiple gmon.out files */
-bool uflag; /* suppress symbols hidden from C */
-bool zflag; /* zero time/called functions, too */
-
- /*
- * structure for various string lists
- */
-struct stringlist {
- struct stringlist *next;
- char *string;
-};
-struct stringlist *elist;
-struct stringlist *Elist;
-struct stringlist *flist;
-struct stringlist *Flist;
-struct stringlist *kfromlist;
-struct stringlist *ktolist;
-
- /*
- * function declarations
- */
-void addarc(nltype *, nltype *, long);
-bool addcycle(arctype **, arctype **);
-void addlist(struct stringlist *, char *);
-void alignentries(void);
-int aout_getnfile(const char *, char ***);
-int arccmp();
-arctype *arclookup();
-void asgnsamples(void);
-void compresslist(void);
-bool cycleanalyze(void);
-void cyclelink(void);
-void cycletime(void);
-bool descend(nltype *, arctype **, arctype **);
-void dfn(nltype *);
-bool dfn_busy();
-void dfn_findcycle(nltype *);
-void dfn_init(void);
-bool dfn_numbered();
-void dfn_post_visit(nltype *);
-void dfn_pre_visit(nltype *);
-void dfn_self_cycle(nltype *);
-nltype **doarcs();
-void doflags(void);
-void dotime(void);
-void dumpsum(char *);
-int elf_getnfile(const char *, char ***);
-void flatprofheader(void);
-void flatprofline(nltype *);
-void getpfile(char *);
-/*
- gprofheader();
- gprofline();
-*/
-int hertz(void);
-void inheritflags(nltype *);
-int kernel_getnfile(const char *, char ***);
-/*
- main();
-*/
-unsigned long max();
-int membercmp();
-unsigned long min();
-nltype *nllookup();
-bool onlist(struct stringlist *, const char *);
-FILE *openpfile();
-long operandlength();
-operandenum operandmode();
-char *operandname();
-void printblurb(char *);
-void printchildren(nltype *);
-void printcycle(nltype *);
-void printgprof(nltype **);
-void printindex(void);
-void printmembers(nltype *);
-void printname(nltype *);
-void printparents(nltype *);
-void printprof(void);
-void printsubcycle(cltype *);
-void readsamples(FILE *);
-unsigned long reladdr();
-void sortchildren(nltype *);
-void sortmembers(nltype *);
-void sortparents(nltype *);
-void tally(struct rawarc *);
-void timepropagate(nltype *);
-int totalcmp();
-
-#define LESSTHAN -1
-#define EQUALTO 0
-#define GREATERTHAN 1
-
-#define DFNDEBUG 1
-#define CYCLEDEBUG 2
-#define ARCDEBUG 4
-#define TALLYDEBUG 8
-#define TIMEDEBUG 16
-#define SAMPLEDEBUG 32
-#define AOUTDEBUG 64
-#define CALLDEBUG 128
-#define LOOKUPDEBUG 256
-#define PROPDEBUG 512
-#define BREAKCYCLE 1024
-#define SUBCYCLELIST 2048
-#define ANYDEBUG 4096
diff --git a/usr.bin/gprof/hertz.c b/usr.bin/gprof/hertz.c
deleted file mode 100644
index cf8a3ae..0000000
--- a/usr.bin/gprof/hertz.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)hertz.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/time.h>
-
- /*
- * discover the tick frequency of the machine
- * if something goes wrong, we return 0, an impossible hertz.
- */
-#define HZ_WRONG 0
-
-int
-hertz(void)
-{
- struct itimerval tim;
-
- tim.it_interval.tv_sec = 0;
- tim.it_interval.tv_usec = 1;
- tim.it_value.tv_sec = 0;
- tim.it_value.tv_usec = 0;
- setitimer(ITIMER_REAL, &tim, 0);
- setitimer(ITIMER_REAL, 0, &tim);
- if (tim.it_interval.tv_usec < 2)
- return(HZ_WRONG);
- return (1000000 / tim.it_interval.tv_usec);
-}
diff --git a/usr.bin/gprof/i386.h b/usr.bin/gprof/i386.h
deleted file mode 100644
index 823d656..0000000
--- a/usr.bin/gprof/i386.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)i386.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
- /*
- * offset (in bytes) of the code from the entry address of a routine.
- * (see asgnsamples for use and explanation.)
- */
-#define OFFSET_OF_CODE 0
-
-enum opermodes { dummy };
-typedef enum opermodes operandenum;
diff --git a/usr.bin/gprof/ia64.h b/usr.bin/gprof/ia64.h
deleted file mode 100644
index 823d656..0000000
--- a/usr.bin/gprof/ia64.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)i386.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
- /*
- * offset (in bytes) of the code from the entry address of a routine.
- * (see asgnsamples for use and explanation.)
- */
-#define OFFSET_OF_CODE 0
-
-enum opermodes { dummy };
-typedef enum opermodes operandenum;
diff --git a/usr.bin/gprof/kernel.c b/usr.bin/gprof/kernel.c
deleted file mode 100644
index dc456f5..0000000
--- a/usr.bin/gprof/kernel.c
+++ /dev/null
@@ -1,64 +0,0 @@
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/linker.h>
-#include <sys/sysctl.h>
-#include <sys/errno.h>
-
-#include <err.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "gprof.h"
-
-/* Things which get -E excluded by default. */
-static char *excludes[] = { ".mcount", "_mcleanup", NULL };
-
-int
-kernel_getnfile(const char *unused, char ***defaultEs)
-{
- char *namelist;
- size_t len;
- char *name;
-
- if (sysctlbyname("kern.function_list", NULL, &len, NULL, 0) == -1)
- err(1, "sysctlbyname: function_list size");
- for (;;) {
- namelist = malloc(len);
- if (namelist == NULL)
- err(1, "malloc");
- if (sysctlbyname("kern.function_list", namelist, &len, NULL,
- 0) == 0)
- break;
- if (errno == ENOMEM)
- free(namelist);
- else
- err(1, "sysctlbyname: function_list");
- }
- nname = 0;
- for (name = namelist; *name != '\0'; name += strlen(name) + 1)
- nname++;
- /* Allocate memory for them, plus a terminating entry. */
- if ((nl = (nltype *)calloc(nname + 1, sizeof(nltype))) == NULL)
- errx(1, "Insufficient memory for symbol table");
- npe = nl;
- for (name = namelist; *name != '\0'; name += strlen(name) + 1) {
- struct kld_sym_lookup ksl;
-
- ksl.version = sizeof(ksl);
- ksl.symname = name;
- if (kldsym(0, KLDSYM_LOOKUP, &ksl))
- err(1, "kldsym(%s)", name);
- /* aflag not supported */
- if (uflag && strchr(name, '.') != NULL)
- continue;
- npe->value = ksl.symvalue;
- npe->name = name;
- npe++;
- }
- npe->value = -1;
-
- *defaultEs = excludes;
- return (0);
-}
diff --git a/usr.bin/gprof/lookup.c b/usr.bin/gprof/lookup.c
deleted file mode 100644
index f51da98..0000000
--- a/usr.bin/gprof/lookup.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)lookup.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "gprof.h"
-
- /*
- * look up an address in a sorted-by-address namelist
- * this deals with misses by mapping them to the next lower
- * entry point.
- */
-nltype *
-nllookup( address )
- unsigned long address;
-{
- register long low;
- register long middle;
- register long high;
-# ifdef DEBUG
- register int probes;
-
- probes = 0;
-# endif /* DEBUG */
- for ( low = 0 , high = nname - 1 ; low != high ; ) {
-# ifdef DEBUG
- probes += 1;
-# endif /* DEBUG */
- middle = ( high + low ) >> 1;
- if ( nl[ middle ].value <= address && nl[ middle+1 ].value > address ) {
-# ifdef DEBUG
- if ( debug & LOOKUPDEBUG ) {
- printf( "[nllookup] %d (%d) probes\n" , probes , nname-1 );
- }
-# endif /* DEBUG */
- return &nl[ middle ];
- }
- if ( nl[ middle ].value > address ) {
- high = middle;
- } else {
- low = middle + 1;
- }
- }
-# ifdef DEBUG
- if ( debug & LOOKUPDEBUG ) {
- fprintf( stderr , "[nllookup] (%d) binary search fails\n" ,
- nname-1 );
- }
-# endif /* DEBUG */
- return 0;
-}
-
-arctype *
-arclookup( parentp , childp )
- nltype *parentp;
- nltype *childp;
-{
- arctype *arcp;
-
- if ( parentp == 0 || childp == 0 ) {
- fprintf( stderr, "[arclookup] parentp == 0 || childp == 0\n" );
- return 0;
- }
-# ifdef DEBUG
- if ( debug & LOOKUPDEBUG ) {
- printf( "[arclookup] parent %s child %s\n" ,
- parentp -> name , childp -> name );
- }
-# endif /* DEBUG */
- for ( arcp = parentp -> children ; arcp ; arcp = arcp -> arc_childlist ) {
-# ifdef DEBUG
- if ( debug & LOOKUPDEBUG ) {
- printf( "[arclookup]\t arc_parent %s arc_child %s\n" ,
- arcp -> arc_parentp -> name ,
- arcp -> arc_childp -> name );
- }
-# endif /* DEBUG */
- if ( arcp -> arc_childp == childp ) {
- return arcp;
- }
- }
- return 0;
-}
diff --git a/usr.bin/gprof/mips.h b/usr.bin/gprof/mips.h
deleted file mode 100644
index e6a1c9c..0000000
--- a/usr.bin/gprof/mips.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*-
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This software was developed by the Computer Systems Engineering group
- * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
- * contributed to Berkeley. Modified by Ralph Campbell for mips.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)mips.h 8.1 (Berkeley) 6/6/93
- * From: @(#)sparc.h 5.1 (Berkeley) 7/8/92
- * $FreeBSD$
- */
-
-/*
- * offset (in bytes) of the code from the entry address of a routine.
- * (see asgnsamples for use and explanation.)
- */
-#define OFFSET_OF_CODE 0
-#define UNITS_TO_CODE (OFFSET_OF_CODE / sizeof(UNIT))
-
-enum opermodes { dummy };
-typedef enum opermodes operandenum;
diff --git a/usr.bin/gprof/pathnames.h b/usr.bin/gprof/pathnames.h
deleted file mode 100644
index 0dcd78c..0000000
--- a/usr.bin/gprof/pathnames.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)pathnames.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#define _PATH_FLAT_BLURB "/usr/share/misc/gprof.flat"
-#define _PATH_CALLG_BLURB "/usr/share/misc/gprof.callg"
-
diff --git a/usr.bin/gprof/powerpc.h b/usr.bin/gprof/powerpc.h
deleted file mode 100644
index 823d656..0000000
--- a/usr.bin/gprof/powerpc.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)i386.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
- /*
- * offset (in bytes) of the code from the entry address of a routine.
- * (see asgnsamples for use and explanation.)
- */
-#define OFFSET_OF_CODE 0
-
-enum opermodes { dummy };
-typedef enum opermodes operandenum;
diff --git a/usr.bin/gprof/printgprof.c b/usr.bin/gprof/printgprof.c
deleted file mode 100644
index 41c1c1f..0000000
--- a/usr.bin/gprof/printgprof.c
+++ /dev/null
@@ -1,760 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)printgprof.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <string.h>
-
-#include "gprof.h"
-#include "pathnames.h"
-
-void
-printprof()
-{
- register nltype *np;
- nltype **sortednlp;
- int index, timecmp();
-
- actime = 0.0;
- printf( "\f\n" );
- flatprofheader();
- /*
- * Sort the symbol table in by time
- */
- sortednlp = (nltype **) calloc( nname , sizeof(nltype *) );
- if ( sortednlp == (nltype **) 0 )
- errx( 1 , "[printprof] ran out of memory for time sorting" );
- for ( index = 0 ; index < nname ; index += 1 ) {
- sortednlp[ index ] = &nl[ index ];
- }
- qsort( sortednlp , nname , sizeof(nltype *) , timecmp );
- for ( index = 0 ; index < nname ; index += 1 ) {
- np = sortednlp[ index ];
- flatprofline( np );
- }
- actime = 0.0;
- free( sortednlp );
-}
-
-int
-timecmp( npp1 , npp2 )
- nltype **npp1, **npp2;
-{
- double timediff;
- long calldiff;
-
- timediff = (*npp2) -> time - (*npp1) -> time;
- if ( timediff > 0.0 )
- return 1 ;
- if ( timediff < 0.0 )
- return -1;
- calldiff = (*npp2) -> ncall - (*npp1) -> ncall;
- if ( calldiff > 0 )
- return 1;
- if ( calldiff < 0 )
- return -1;
- return( strcmp( (*npp1) -> name , (*npp2) -> name ) );
-}
-
- /*
- * header for flatprofline
- */
-void
-flatprofheader()
-{
-
- if ( bflag ) {
- printblurb( _PATH_FLAT_BLURB );
- }
- printf( "\ngranularity: each sample hit covers %g byte(s)" ,
- scale * HISTORICAL_SCALE_2 );
- if ( totime > 0.0 ) {
- printf( " for %.2f%% of %.2f seconds\n\n" ,
- 100.0/totime , totime / hz );
- } else {
- printf( " no time accumulated\n\n" );
- /*
- * this doesn't hurt since all the numerators will be zero.
- */
- totime = 1.0;
- }
- printf( "%5.5s %10.10s %8.8s %8.8s %8.8s %8.8s %-8.8s\n" ,
- "% " , "cumulative" , "self " , "" , "self " , "total " , "" );
- printf( "%5.5s %10.10s %8.8s %8.8s %8.8s %8.8s %-8.8s\n" ,
- "time" , "seconds " , "seconds" , "calls" ,
- hz >= 10000000 ? "ns/call" : hz >= 10000 ? "us/call" : "ms/call" ,
- hz >= 10000000 ? "ns/call" : hz >= 10000 ? "us/call" : "ms/call" ,
- "name" );
-}
-
-void
-flatprofline( np )
- register nltype *np;
-{
-
- if ( zflag == 0 && np -> ncall == 0 && np -> time == 0 &&
- np -> childtime == 0 ) {
- return;
- }
- actime += np -> time;
- if (hz >= 10000)
- printf( "%5.1f %10.3f %8.3f" ,
- 100 * np -> time / totime , actime / hz , np -> time / hz );
- else
- printf( "%5.1f %10.2f %8.2f" ,
- 100 * np -> time / totime , actime / hz , np -> time / hz );
- if ( np -> ncall != 0 ) {
- if (hz >= 10000000)
- printf( " %8ld %8.0f %8.0f " , np -> ncall ,
- 1e9 * np -> time / hz / np -> ncall ,
- 1e9 * ( np -> time + np -> childtime ) / hz / np -> ncall );
- else if (hz >= 10000)
- printf( " %8ld %8.0f %8.0f " , np -> ncall ,
- 1e6 * np -> time / hz / np -> ncall ,
- 1e6 * ( np -> time + np -> childtime ) / hz / np -> ncall );
- else
- printf( " %8ld %8.2f %8.2f " , np -> ncall ,
- 1000 * np -> time / hz / np -> ncall ,
- 1000 * ( np -> time + np -> childtime ) / hz / np -> ncall );
- } else if ( np -> time != 0 || np -> childtime != 0 ) {
- printf( " %8ld %7.2f%% %8.8s " , np -> ncall ,
- 100 * np -> time / ( np -> time + np -> childtime ) , "" );
- } else {
- printf( " %8.8s %8.8s %8.8s " , "" , "" , "" );
- }
- printname( np );
- printf( "\n" );
-}
-
-void
-gprofheader()
-{
-
- if ( bflag ) {
- printblurb( _PATH_CALLG_BLURB );
- }
- printf( "\ngranularity: each sample hit covers %g byte(s)" ,
- scale * HISTORICAL_SCALE_2 );
- if ( printtime > 0.0 ) {
- printf( " for %.2f%% of %.2f seconds\n\n" ,
- 100.0/printtime , printtime / hz );
- } else {
- printf( " no time propagated\n\n" );
- /*
- * this doesn't hurt, since all the numerators will be 0.0
- */
- printtime = 1.0;
- }
- printf( "%6.6s %5.5s %7.7s %11.11s %7.7s/%-7.7s %-8.8s\n" ,
- "" , "" , "" , "" , "called" , "total" , "parents");
- printf( "%-6.6s %5.5s %7.7s %11.11s %7.7s+%-7.7s %-8.8s\t%5.5s\n" ,
- "index" , "%time" , "self" , "descendents" ,
- "called" , "self" , "name" , "index" );
- printf( "%6.6s %5.5s %7.7s %11.11s %7.7s/%-7.7s %-8.8s\n" ,
- "" , "" , "" , "" , "called" , "total" , "children");
- printf( "\n" );
-}
-
-void
-gprofline( np )
- register nltype *np;
-{
- char kirkbuffer[ BUFSIZ ];
-
- sprintf( kirkbuffer , "[%d]" , np -> index );
- printf( "%-6.6s %5.1f %7.2f %11.2f" ,
- kirkbuffer ,
- 100 * ( np -> propself + np -> propchild ) / printtime ,
- np -> propself / hz ,
- np -> propchild / hz );
- if ( ( np -> ncall + np -> selfcalls ) != 0 ) {
- printf( " %7ld" , np -> npropcall );
- if ( np -> selfcalls != 0 ) {
- printf( "+%-7ld " , np -> selfcalls );
- } else {
- printf( " %7.7s " , "" );
- }
- } else {
- printf( " %7.7s %7.7s " , "" , "" );
- }
- printname( np );
- printf( "\n" );
-}
-
-void
-printgprof(timesortnlp)
- nltype **timesortnlp;
-{
- int index;
- nltype *parentp;
-
- /*
- * Print out the structured profiling list
- */
- gprofheader();
- for ( index = 0 ; index < nname + ncycle ; index ++ ) {
- parentp = timesortnlp[ index ];
- if ( zflag == 0 &&
- parentp -> ncall == 0 &&
- parentp -> selfcalls == 0 &&
- parentp -> propself == 0 &&
- parentp -> propchild == 0 ) {
- continue;
- }
- if ( ! parentp -> printflag ) {
- continue;
- }
- if ( parentp -> name == 0 && parentp -> cycleno != 0 ) {
- /*
- * cycle header
- */
- printcycle( parentp );
- printmembers( parentp );
- } else {
- printparents( parentp );
- gprofline( parentp );
- printchildren( parentp );
- }
- printf( "\n" );
- printf( "-----------------------------------------------\n" );
- printf( "\n" );
- }
- free( timesortnlp );
-}
-
- /*
- * sort by decreasing propagated time
- * if times are equal, but one is a cycle header,
- * say that's first (e.g. less, i.e. -1).
- * if one's name doesn't have an underscore and the other does,
- * say the one is first.
- * all else being equal, sort by names.
- */
-int
-totalcmp( npp1 , npp2 )
- nltype **npp1;
- nltype **npp2;
-{
- register nltype *np1 = *npp1;
- register nltype *np2 = *npp2;
- double diff;
-
- diff = ( np1 -> propself + np1 -> propchild )
- - ( np2 -> propself + np2 -> propchild );
- if ( diff < 0.0 )
- return 1;
- if ( diff > 0.0 )
- return -1;
- if ( np1 -> name == 0 && np1 -> cycleno != 0 )
- return -1;
- if ( np2 -> name == 0 && np2 -> cycleno != 0 )
- return 1;
- if ( np1 -> name == 0 )
- return -1;
- if ( np2 -> name == 0 )
- return 1;
- if ( *(np1 -> name) != '_' && *(np2 -> name) == '_' )
- return -1;
- if ( *(np1 -> name) == '_' && *(np2 -> name) != '_' )
- return 1;
- if ( np1 -> ncall > np2 -> ncall )
- return -1;
- if ( np1 -> ncall < np2 -> ncall )
- return 1;
- return strcmp( np1 -> name , np2 -> name );
-}
-
-void
-printparents( childp )
- nltype *childp;
-{
- nltype *parentp;
- arctype *arcp;
- nltype *cycleheadp;
-
- if ( childp -> cyclehead != 0 ) {
- cycleheadp = childp -> cyclehead;
- } else {
- cycleheadp = childp;
- }
- if ( childp -> parents == 0 ) {
- printf( "%6.6s %5.5s %7.7s %11.11s %7.7s %7.7s <spontaneous>\n" ,
- "" , "" , "" , "" , "" , "" );
- return;
- }
- sortparents( childp );
- for ( arcp = childp -> parents ; arcp ; arcp = arcp -> arc_parentlist ) {
- parentp = arcp -> arc_parentp;
- if ( childp == parentp || ( arcp -> arc_flags & DEADARC ) ||
- ( childp->cycleno != 0 && parentp->cycleno == childp->cycleno ) ) {
- /*
- * selfcall or call among siblings
- */
- printf( "%6.6s %5.5s %7.7s %11.11s %7ld %7.7s " ,
- "" , "" , "" , "" ,
- arcp -> arc_count , "" );
- printname( parentp );
- printf( "\n" );
- } else {
- /*
- * regular parent of child
- */
- printf( "%6.6s %5.5s %7.2f %11.2f %7ld/%-7ld " ,
- "" , "" ,
- arcp -> arc_time / hz , arcp -> arc_childtime / hz ,
- arcp -> arc_count , cycleheadp -> npropcall );
- printname( parentp );
- printf( "\n" );
- }
- }
-}
-
-void
-printchildren( parentp )
- nltype *parentp;
-{
- nltype *childp;
- arctype *arcp;
-
- sortchildren( parentp );
- arcp = parentp -> children;
- for ( arcp = parentp -> children ; arcp ; arcp = arcp -> arc_childlist ) {
- childp = arcp -> arc_childp;
- if ( childp == parentp || ( arcp -> arc_flags & DEADARC ) ||
- ( childp->cycleno != 0 && childp->cycleno == parentp->cycleno ) ) {
- /*
- * self call or call to sibling
- */
- printf( "%6.6s %5.5s %7.7s %11.11s %7ld %7.7s " ,
- "" , "" , "" , "" , arcp -> arc_count , "" );
- printname( childp );
- printf( "\n" );
- } else {
- /*
- * regular child of parent
- */
- printf( "%6.6s %5.5s %7.2f %11.2f %7ld/%-7ld " ,
- "" , "" ,
- arcp -> arc_time / hz , arcp -> arc_childtime / hz ,
- arcp -> arc_count , childp -> cyclehead -> npropcall );
- printname( childp );
- printf( "\n" );
- }
- }
-}
-
-void
-printname( selfp )
- nltype *selfp;
-{
-
- if ( selfp -> name != 0 ) {
- printf( "%s" , selfp -> name );
-# ifdef DEBUG
- if ( debug & DFNDEBUG ) {
- printf( "{%d} " , selfp -> toporder );
- }
- if ( debug & PROPDEBUG ) {
- printf( "%5.2f%% " , selfp -> propfraction );
- }
-# endif /* DEBUG */
- }
- if ( selfp -> cycleno != 0 ) {
- printf( " <cycle %d>" , selfp -> cycleno );
- }
- if ( selfp -> index != 0 ) {
- if ( selfp -> printflag ) {
- printf( " [%d]" , selfp -> index );
- } else {
- printf( " (%d)" , selfp -> index );
- }
- }
-}
-
-void
-sortchildren( parentp )
- nltype *parentp;
-{
- arctype *arcp;
- arctype *detachedp;
- arctype sorted;
- arctype *prevp;
-
- /*
- * unlink children from parent,
- * then insertion sort back on to sorted's children.
- * *arcp the arc you have detached and are inserting.
- * *detachedp the rest of the arcs to be sorted.
- * sorted arc list onto which you insertion sort.
- * *prevp arc before the arc you are comparing.
- */
- sorted.arc_childlist = 0;
- for ( (arcp = parentp -> children)&&(detachedp = arcp -> arc_childlist);
- arcp ;
- (arcp = detachedp)&&(detachedp = detachedp -> arc_childlist)) {
- /*
- * consider *arcp as disconnected
- * insert it into sorted
- */
- for ( prevp = &sorted ;
- prevp -> arc_childlist ;
- prevp = prevp -> arc_childlist ) {
- if ( arccmp( arcp , prevp -> arc_childlist ) != LESSTHAN ) {
- break;
- }
- }
- arcp -> arc_childlist = prevp -> arc_childlist;
- prevp -> arc_childlist = arcp;
- }
- /*
- * reattach sorted children to parent
- */
- parentp -> children = sorted.arc_childlist;
-}
-
-void
-sortparents( childp )
- nltype *childp;
-{
- arctype *arcp;
- arctype *detachedp;
- arctype sorted;
- arctype *prevp;
-
- /*
- * unlink parents from child,
- * then insertion sort back on to sorted's parents.
- * *arcp the arc you have detached and are inserting.
- * *detachedp the rest of the arcs to be sorted.
- * sorted arc list onto which you insertion sort.
- * *prevp arc before the arc you are comparing.
- */
- sorted.arc_parentlist = 0;
- for ( (arcp = childp -> parents)&&(detachedp = arcp -> arc_parentlist);
- arcp ;
- (arcp = detachedp)&&(detachedp = detachedp -> arc_parentlist)) {
- /*
- * consider *arcp as disconnected
- * insert it into sorted
- */
- for ( prevp = &sorted ;
- prevp -> arc_parentlist ;
- prevp = prevp -> arc_parentlist ) {
- if ( arccmp( arcp , prevp -> arc_parentlist ) != GREATERTHAN ) {
- break;
- }
- }
- arcp -> arc_parentlist = prevp -> arc_parentlist;
- prevp -> arc_parentlist = arcp;
- }
- /*
- * reattach sorted arcs to child
- */
- childp -> parents = sorted.arc_parentlist;
-}
-
- /*
- * print a cycle header
- */
-void
-printcycle( cyclep )
- nltype *cyclep;
-{
- char kirkbuffer[ BUFSIZ ];
-
- sprintf( kirkbuffer , "[%d]" , cyclep -> index );
- printf( "%-6.6s %5.1f %7.2f %11.2f %7ld" ,
- kirkbuffer ,
- 100 * ( cyclep -> propself + cyclep -> propchild ) / printtime ,
- cyclep -> propself / hz ,
- cyclep -> propchild / hz ,
- cyclep -> npropcall );
- if ( cyclep -> selfcalls != 0 ) {
- printf( "+%-7ld" , cyclep -> selfcalls );
- } else {
- printf( " %7.7s" , "" );
- }
- printf( " <cycle %d as a whole>\t[%d]\n" ,
- cyclep -> cycleno , cyclep -> index );
-}
-
- /*
- * print the members of a cycle
- */
-void
-printmembers( cyclep )
- nltype *cyclep;
-{
- nltype *memberp;
-
- sortmembers( cyclep );
- for ( memberp = cyclep -> cnext ; memberp ; memberp = memberp -> cnext ) {
- printf( "%6.6s %5.5s %7.2f %11.2f %7ld" ,
- "" , "" , memberp -> propself / hz , memberp -> propchild / hz ,
- memberp -> npropcall );
- if ( memberp -> selfcalls != 0 ) {
- printf( "+%-7ld" , memberp -> selfcalls );
- } else {
- printf( " %7.7s" , "" );
- }
- printf( " " );
- printname( memberp );
- printf( "\n" );
- }
-}
-
- /*
- * sort members of a cycle
- */
-void
-sortmembers( cyclep )
- nltype *cyclep;
-{
- nltype *todo;
- nltype *doing;
- nltype *prev;
-
- /*
- * detach cycle members from cyclehead,
- * and insertion sort them back on.
- */
- todo = cyclep -> cnext;
- cyclep -> cnext = 0;
- for ( (doing = todo)&&(todo = doing -> cnext);
- doing ;
- (doing = todo )&&(todo = doing -> cnext )){
- for ( prev = cyclep ; prev -> cnext ; prev = prev -> cnext ) {
- if ( membercmp( doing , prev -> cnext ) == GREATERTHAN ) {
- break;
- }
- }
- doing -> cnext = prev -> cnext;
- prev -> cnext = doing;
- }
-}
-
- /*
- * major sort is on propself + propchild,
- * next is sort on ncalls + selfcalls.
- */
-int
-membercmp( this , that )
- nltype *this;
- nltype *that;
-{
- double thistime = this -> propself + this -> propchild;
- double thattime = that -> propself + that -> propchild;
- long thiscalls = this -> ncall + this -> selfcalls;
- long thatcalls = that -> ncall + that -> selfcalls;
-
- if ( thistime > thattime ) {
- return GREATERTHAN;
- }
- if ( thistime < thattime ) {
- return LESSTHAN;
- }
- if ( thiscalls > thatcalls ) {
- return GREATERTHAN;
- }
- if ( thiscalls < thatcalls ) {
- return LESSTHAN;
- }
- return EQUALTO;
-}
- /*
- * compare two arcs to/from the same child/parent.
- * - if one arc is a self arc, it's least.
- * - if one arc is within a cycle, it's less than.
- * - if both arcs are within a cycle, compare arc counts.
- * - if neither arc is within a cycle, compare with
- * arc_time + arc_childtime as major key
- * arc count as minor key
- */
-int
-arccmp( thisp , thatp )
- arctype *thisp;
- arctype *thatp;
-{
- nltype *thisparentp = thisp -> arc_parentp;
- nltype *thischildp = thisp -> arc_childp;
- nltype *thatparentp = thatp -> arc_parentp;
- nltype *thatchildp = thatp -> arc_childp;
- double thistime;
- double thattime;
-
-# ifdef DEBUG
- if ( debug & TIMEDEBUG ) {
- printf( "[arccmp] " );
- printname( thisparentp );
- printf( " calls " );
- printname ( thischildp );
- printf( " %f + %f %ld/%ld\n" ,
- thisp -> arc_time , thisp -> arc_childtime ,
- thisp -> arc_count , thischildp -> ncall );
- printf( "[arccmp] " );
- printname( thatparentp );
- printf( " calls " );
- printname( thatchildp );
- printf( " %f + %f %ld/%ld\n" ,
- thatp -> arc_time , thatp -> arc_childtime ,
- thatp -> arc_count , thatchildp -> ncall );
- printf( "\n" );
- }
-# endif /* DEBUG */
- if ( thisparentp == thischildp ) {
- /* this is a self call */
- return LESSTHAN;
- }
- if ( thatparentp == thatchildp ) {
- /* that is a self call */
- return GREATERTHAN;
- }
- if ( thisparentp -> cycleno != 0 && thischildp -> cycleno != 0 &&
- thisparentp -> cycleno == thischildp -> cycleno ) {
- /* this is a call within a cycle */
- if ( thatparentp -> cycleno != 0 && thatchildp -> cycleno != 0 &&
- thatparentp -> cycleno == thatchildp -> cycleno ) {
- /* that is a call within the cycle, too */
- if ( thisp -> arc_count < thatp -> arc_count ) {
- return LESSTHAN;
- }
- if ( thisp -> arc_count > thatp -> arc_count ) {
- return GREATERTHAN;
- }
- return EQUALTO;
- } else {
- /* that isn't a call within the cycle */
- return LESSTHAN;
- }
- } else {
- /* this isn't a call within a cycle */
- if ( thatparentp -> cycleno != 0 && thatchildp -> cycleno != 0 &&
- thatparentp -> cycleno == thatchildp -> cycleno ) {
- /* that is a call within a cycle */
- return GREATERTHAN;
- } else {
- /* neither is a call within a cycle */
- thistime = thisp -> arc_time + thisp -> arc_childtime;
- thattime = thatp -> arc_time + thatp -> arc_childtime;
- if ( thistime < thattime )
- return LESSTHAN;
- if ( thistime > thattime )
- return GREATERTHAN;
- if ( thisp -> arc_count < thatp -> arc_count )
- return LESSTHAN;
- if ( thisp -> arc_count > thatp -> arc_count )
- return GREATERTHAN;
- return EQUALTO;
- }
- }
-}
-
-void
-printblurb( blurbname )
- char *blurbname;
-{
- FILE *blurbfile;
- int input;
-
- blurbfile = fopen( blurbname , "r" );
- if ( blurbfile == NULL ) {
- warn( "%s" , blurbname );
- return;
- }
- while ( ( input = getc( blurbfile ) ) != EOF ) {
- putchar( input );
- }
- fclose( blurbfile );
-}
-
-int
-namecmp( npp1 , npp2 )
- nltype **npp1, **npp2;
-{
- return( strcmp( (*npp1) -> name , (*npp2) -> name ) );
-}
-
-void
-printindex()
-{
- nltype **namesortnlp;
- register nltype *nlp;
- int index, nnames, todo, i, j;
- char peterbuffer[ BUFSIZ ];
-
- /*
- * Now, sort regular function name alphabetically
- * to create an index.
- */
- namesortnlp = (nltype **) calloc( nname + ncycle , sizeof(nltype *) );
- if ( namesortnlp == (nltype **) 0 )
- errx( 1 , "ran out of memory for sorting");
- for ( index = 0 , nnames = 0 ; index < nname ; index++ ) {
- if ( zflag == 0 && nl[index].ncall == 0 && nl[index].time == 0 )
- continue;
- namesortnlp[nnames++] = &nl[index];
- }
- qsort( namesortnlp , nnames , sizeof(nltype *) , namecmp );
- for ( index = 1 , todo = nnames ; index <= ncycle ; index++ ) {
- namesortnlp[todo++] = &cyclenl[index];
- }
- printf( "\f\nIndex by function name\n\n" );
- index = ( todo + 2 ) / 3;
- for ( i = 0; i < index ; i++ ) {
- for ( j = i; j < todo ; j += index ) {
- nlp = namesortnlp[ j ];
- if ( nlp -> printflag ) {
- sprintf( peterbuffer , "[%d]" , nlp -> index );
- } else {
- sprintf( peterbuffer , "(%d)" , nlp -> index );
- }
- if ( j < nnames ) {
- printf( "%6.6s %-19.19s" , peterbuffer , nlp -> name );
- } else {
- printf( "%6.6s " , peterbuffer );
- sprintf( peterbuffer , "<cycle %d>" , nlp -> cycleno );
- printf( "%-19.19s" , peterbuffer );
- }
- }
- printf( "\n" );
- }
- free( namesortnlp );
-}
diff --git a/usr.bin/gprof/printlist.c b/usr.bin/gprof/printlist.c
deleted file mode 100644
index ed68bcc..0000000
--- a/usr.bin/gprof/printlist.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)printlist.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <string.h>
-
-#include "gprof.h"
-
- /*
- * these are the lists of names:
- * there is the list head and then the listname
- * is a pointer to the list head
- * (for ease of passing to stringlist functions).
- */
-struct stringlist kfromhead = { 0 , 0 };
-struct stringlist *kfromlist = &kfromhead;
-struct stringlist ktohead = { 0 , 0 };
-struct stringlist *ktolist = &ktohead;
-struct stringlist fhead = { 0 , 0 };
-struct stringlist *flist = &fhead;
-struct stringlist Fhead = { 0 , 0 };
-struct stringlist *Flist = &Fhead;
-struct stringlist ehead = { 0 , 0 };
-struct stringlist *elist = &ehead;
-struct stringlist Ehead = { 0 , 0 };
-struct stringlist *Elist = &Ehead;
-
-void
-addlist( listp , funcname )
- struct stringlist *listp;
- char *funcname;
-{
- struct stringlist *slp;
-
- slp = (struct stringlist *) malloc( sizeof(struct stringlist));
- if ( slp == (struct stringlist *) 0 )
- errx( 1 , "no room for printlist");
- slp -> next = listp -> next;
- slp -> string = funcname;
- listp -> next = slp;
-}
-
-bool
-onlist( listp , funcname )
- struct stringlist *listp;
- const char *funcname;
-{
- struct stringlist *slp;
-
- for ( slp = listp -> next ; slp ; slp = slp -> next ) {
- if ( ! strcmp( slp -> string , funcname ) ) {
- return TRUE;
- }
- if ( funcname[0] == '_' && ! strcmp( slp -> string , &funcname[1] ) ) {
- return TRUE;
- }
- }
- return FALSE;
-}
diff --git a/usr.bin/gprof/sparc64.h b/usr.bin/gprof/sparc64.h
deleted file mode 100644
index 823d656..0000000
--- a/usr.bin/gprof/sparc64.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)i386.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
- /*
- * offset (in bytes) of the code from the entry address of a routine.
- * (see asgnsamples for use and explanation.)
- */
-#define OFFSET_OF_CODE 0
-
-enum opermodes { dummy };
-typedef enum opermodes operandenum;
diff --git a/usr.bin/gzip/Makefile b/usr.bin/gzip/Makefile
deleted file mode 100644
index dae5f84..0000000
--- a/usr.bin/gzip/Makefile
+++ /dev/null
@@ -1,32 +0,0 @@
-# $NetBSD: Makefile,v 1.10 2006/05/12 02:01:15 mrg Exp $
-# $FreeBSD$
-
-.include <bsd.own.mk>
-
-PROG= gzip
-MAN= gzip.1 gzexe.1 zdiff.1 zforce.1 zmore.1 znew.1
-
-DPADD= ${LIBZ}
-LDADD= -lz
-WARNS?= 6
-
-.if ${MK_BZIP2_SUPPORT} != "no"
-DPADD+= ${LIBBZ2}
-LDADD+= -lbz2
-.else
-CFLAGS+= -DNO_BZIP2_SUPPORT
-.endif
-
-SCRIPTS= gzexe zdiff zforce zmore znew
-
-MLINKS+= gzip.1 gunzip.1 \
- gzip.1 gzcat.1 \
- gzip.1 zcat.1 \
- zdiff.1 zcmp.1
-
-LINKS+= ${BINDIR}/gzip ${BINDIR}/gunzip \
- ${BINDIR}/gzip ${BINDIR}/gzcat \
- ${BINDIR}/gzip ${BINDIR}/zcat \
- ${BINDIR}/zdiff ${BINDIR}/zcmp
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/gzip/gzexe b/usr.bin/gzip/gzexe
deleted file mode 100644
index 5f5424e..0000000
--- a/usr.bin/gzip/gzexe
+++ /dev/null
@@ -1,179 +0,0 @@
-#!/bin/sh -
-#
-# $NetBSD: gzexe,v 1.3 2004/05/01 08:22:41 wiz Exp $
-# $OpenBSD: gzexe,v 1.3 2003/08/05 18:22:17 deraadt Exp $
-#
-#-
-# Copyright (c) 2003 Otto Moerbeek <otto@drijf.net>
-#
-# Permission to use, copy, modify, and distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-#
-# $FreeBSD$
-
-# The number of lines plus one in the on-the-fly decompression script
-lines=19
-
-# A simple string to recognize already compressed files
-magic="# compressed by gzexe"
-
-# Write the decompression script to stdout
-header () {
- # first section needs variable expansion, second not
- cat <<- EOF
- #!/bin/sh -
- $magic
- lines=$lines
- EOF
- cat <<- 'EOF'
- prog=`/usr/bin/basename "$0"`
- tmp=`/usr/bin/mktemp -d /tmp/gzexeXXXXXXXXXX` || {
- /bin/echo "$prog: cannot create tmp dir"; exit 1
- }
- trap '/bin/rm -rf "$tmp"' 0
- if /usr/bin/tail +$lines "$0" |
- /usr/bin/gzip -dc > "$tmp/$prog" 2> /dev/null; then
- /bin/chmod u+x "$tmp/$prog"
- "$tmp/$prog" ${1+"$@"}
- ret=$?
- else
- /bin/echo "$prog: cannot decompress $0"
- ret=1
- fi
- exit $ret
- EOF
-}
-
-# Test if a file is compressed by checking the magic line
-compressed () {
- test "X`sed -n 2p "$1" 2> /dev/null`" = "X$magic"
-}
-
-# Decompress a file
-decompress () {
- tmp=`mktemp /tmp/gzexeXXXXXXXXXX` || {
- echo "$prog: cannot create tmp file"
- return 1
- }
- if ! cp "$1" "$tmp"; then
- echo "$prog: cannot copy $1 to $tmp"
- rm -f "$tmp"
- return 1
- fi
- if ! tail +$lines "$tmp" | gzip -vdc > "$1"; then
- echo "$prog: cannot decompress $1"
- cp "$tmp" "$1"
- rm -f "$tmp"
- return 1
- fi
-}
-
-# Perform some sanity checks on the file
-check () {
- if test ! -e "$1"; then
- echo "$prog: cannot compress non-existing file $1"
- return 1
- fi
-
- if test ! -f "$1"; then
- echo "$prog: cannot compress non-regular file $1"
- return 1
- fi
-
- case `basename "$1"` in
- sh | mktemp | rm | echo | tail | gzip | chmod)
- echo "$prog: cannot compress $1, I depend on it"
- return 1
- esac
-
- if test ! -x "$1"; then
- echo "$prog: cannot compress $1, it is not executable"
- return 1
- fi
-
- if test -u "$1" -o -g "$1"; then
- echo "$prog: cannot compress $1, it has an s bit set"
- return 1
- fi
-}
-
-# Compress a file
-compress () {
- tmp=`mktemp /tmp/gzexeXXXXXXXXXX` || {
- echo "$prog: cannot create tmp file"
- return 1
- }
- if ! cp "$1" "$tmp"; then
- echo "$prog: cannot copy $1 to $tmp"
- rm -f "$tmp"
- return 1
- fi
- if ! cp "$1" "$1"~; then
- echo "$prog: cannot create backup copy $1~"
- rm -f "$1"~ "$tmp"
- return 1
- fi
-
- # Use cp to overwrite the existing file preserving mode and owner
- # if possible. If the file is not writable, this will produce an
- # error.
-
- if header "$1" > "$tmp" && gzip -vc "$1" >> "$tmp"; then
- if ! cp "$tmp" "$1"; then
- echo "$prog: cannot copy $tmp to $1"
- rm -f "$tmp"
- return 1
- fi
- else
- echo "$prog: cannot compress $1"
- rm -f "$1"~ "$tmp"
- return 1
- fi
-}
-
-# Is the -d flag specified?
-dflag=
-
-# Return value
-rc=0
-
-if test "X$1" = X-d; then
- dflag=1
- shift
-fi
-
-prog=`basename "$0"`
-USAGE="usage: $prog [-d] file ..."
-if test $# -eq 0; then
- echo $USAGE
- exit 1
-fi
-
-while test $# -ne 0; do
- if test $dflag; then
- if ! compressed "$1"; then
- echo "$prog: $1 is not compressed"
- rc=1;
- elif ! decompress "$1"; then
- rc=$?
- fi
- else
- if compressed "$1"; then
- echo "$prog: $1 is already compressed"
- rc=1;
- elif ! check "$1" || ! compress "$1"; then
- rc=$?
- fi
- fi
- shift
-done
-exit $rc
diff --git a/usr.bin/gzip/gzexe.1 b/usr.bin/gzip/gzexe.1
deleted file mode 100644
index 0195037..0000000
--- a/usr.bin/gzip/gzexe.1
+++ /dev/null
@@ -1,73 +0,0 @@
-.\" $NetBSD: gzexe.1,v 1.3 2003/12/28 12:49:41 wiz Exp $
-.\" $OpenBSD: gzexe.1,v 1.1 2003/07/31 07:32:47 otto Exp $
-.\"
-.\" Copyright (c) 2003 Otto Moerbeek <otto@drijf.net>
-.\"
-.\" Permission to use, copy, modify, and distribute this software for any
-.\" purpose with or without fee is hereby granted, provided that the above
-.\" copyright notice and this permission notice appear in all copies.
-.\"
-.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-.\"
-.\" $FreeBSD$
-.Dd January 26, 2007
-.Dt GZEXE 1
-.Os
-.Sh NAME
-.Nm gzexe
-.Nd create auto-decompressing executables
-.Sh SYNOPSIS
-.Nm gzexe
-.Op Fl d
-.Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility uses
-.Xr gzip 1
-to compress executables, producing executables that decompress on-the-fly
-when executed.
-This saves disk space, at the cost of slower execution times.
-The original executables are saved by copying each of them to a file with
-the same name with a
-.Sq ~
-suffix appended.
-After verifying that the compressed executables work as expected, the backup
-files can be removed.
-.Pp
-The options are as follows:
-.Bl -tag -width Ds
-.It Fl d
-Decompress executables previously compressed by
-.Nm .
-.El
-.Pp
-The
-.Nm
-program refuses to compress non-regular or non-executable files,
-files with a setuid or setgid bit set, files that are already
-compressed using
-.Nm
-or programs it needs to perform on-the-fly decompression:
-.Xr sh 1 ,
-.Xr mktemp 1 ,
-.Xr rm 1 ,
-.Xr echo 1 ,
-.Xr tail 1 ,
-.Xr gzip 1 ,
-and
-.Xr chmod 1 .
-.Sh SEE ALSO
-.Xr gzip 1
-.Sh CAVEATS
-The
-.Nm
-utility replaces files by overwriting them with the generated
-compressed executable.
-To be able to do this, it is required that the original files are writable.
diff --git a/usr.bin/gzip/gzip.1 b/usr.bin/gzip/gzip.1
deleted file mode 100644
index e6c61a7..0000000
--- a/usr.bin/gzip/gzip.1
+++ /dev/null
@@ -1,223 +0,0 @@
-.\" $NetBSD: gzip.1,v 1.19 2008/05/29 14:51:27 mrg Exp $
-.\"
-.\" Copyright (c) 1997, 2003, 2004 Matthew R. Green
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
-.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.Dd June 30, 2008
-.Dt GZIP 1
-.Os
-.Sh NAME
-.Nm gzip
-.Nd compression/decompression tool using Lempel-Ziv coding (LZ77)
-.Sh SYNOPSIS
-.Nm
-.Op Fl cdfhkLlNnqrtVv
-.Op Fl S Ar suffix
-.Ar file
-.Oo
-.Ar file Oo ...
-.Oc
-.Oc
-.Nm gunzip
-.Op Fl cfhkLNqrtVv
-.Op Fl S Ar suffix
-.Ar file
-.Oo
-.Ar file Oo ...
-.Oc
-.Oc
-.Nm zcat
-.Op Fl fhV
-.Ar file
-.Oo
-.Ar file Oo ...
-.Oc
-.Oc
-.Sh DESCRIPTION
-The
-.Nm
-program compresses and decompresses files using Lempel-Ziv coding
-(LZ77).
-If no
-.Ar files
-are specified,
-.Nm
-will compress from standard input, or decompress to standard output.
-When in compression mode, each
-.Ar file
-will be replaced with another file with the suffix, set by the
-.Fl S Ar suffix
-option, added, if possible.
-.Pp
-In decompression mode, each
-.Ar file
-will be checked for existence, as will the file with the suffix
-added.
-Each
-.Ar file
-argument must contain a separate complete archive;
-when multiple
-.Ar files
-are indicated, each is decompressed in turn.
-.Pp
-In the case of
-.Nm gzcat
-the resulting data is then concatenated in the manner of
-.Xr cat 1 .
-.Pp
-If invoked as
-.Nm gunzip
-then the
-.Fl d
-option is enabled.
-If invoked as
-.Nm zcat
-or
-.Nm gzcat
-then both the
-.Fl c
-and
-.Fl d
-options are enabled.
-.Pp
-This version of
-.Nm
-is also capable of decompressing files compressed using
-.Xr compress 1
-or
-.Xr bzip2 1 .
-.Sh OPTIONS
-The following options are available:
-.Bl -tag -width XXrXXXrecursiveX
-.It Fl 1 , -fast
-.It Fl 2 , 3 , 4 , 5 , 6 , 7 , 8
-.It Fl 9 , -best
-These options change the compression level used, with the
-.Fl 1
-option being the fastest, with less compression, and the
-.Fl 9
-option being the slowest, with optimal compression.
-The default compression level is 6.
-.It Fl c , -stdout , -to-stdout
-This option specifies that output will go to the standard output
-stream, leaving files intact.
-.It Fl d , -decompress , -uncompress
-This option selects decompression rather than compression.
-.It Fl f , -force
-This option turns on force mode.
-This allows files with multiple links, overwriting of pre-existing
-files, reading from or writing to a terminal, and when combined
-with the
-.Fl c
-option, allowing non-compressed data to pass through unchanged.
-.It Fl h , -help
-This option prints a usage summary and exits.
-.It Fl k , -keep
-Keep (don't delete) input files during compression
-or decompression.
-.It Fl L , -license
-This option prints
-.Nm
-license.
-.It Fl l , -list
-This option displays information about the file's compressed and
-uncompressed size, ratio, uncompressed name.
-With the
-.Fl v
-option, it also displays the compression method, CRC, date and time
-embedded in the file.
-.It Fl N , -name
-This option causes the stored filename in the input file to be used
-as the output file.
-.It Fl n , -no-name
-This option stops the filename from being stored in the output
-file.
-.It Fl q , -quiet
-With this option, no warnings or errors are printed.
-.It Fl r , -recursive
-This option is used to
-.Nm
-the files in a directory tree individually, using the
-.Xr fts 3
-library.
-.It Fl S Ar suffix , Fl -suffix Ar suffix
-This option changes the default suffix from .gz to
-.Ar suffix .
-.It Fl t , -test
-This option will test compressed files for integrity.
-.It Fl V , -version
-This option prints the version of the
-.Nm
-program.
-.It Fl v , -verbose
-This option turns on verbose mode, which prints the compression
-ratio for each file compressed.
-.El
-.Sh ENVIRONMENT
-If the environment variable
-.Ev GZIP
-is set, it is parsed as a white-space separated list of options
-handled before any options on the command line.
-Options on the command line will override anything in
-.Ev GZIP .
-.Sh SEE ALSO
-.Xr bzip2 1 ,
-.Xr compress 1 ,
-.Xr fts 3 ,
-.Xr zlib 3
-.Sh HISTORY
-The
-.Nm
-program was originally written by Jean-loup Gailly, licensed under
-the GNU Public Licence.
-Matthew R. Green wrote a simple front end for
-.Nx 1.3
-distribution media, based on the freely re-distributable zlib library.
-It was enhanced to be mostly feature-compatible with the original
-GNU
-.Nm
-program for
-.Nx 2.0 .
-.Pp
-This implementation of
-.Nm
-was ported based on the
-.Nx
-.Nm
-20060927, and first appeared in
-.Fx 7.0 .
-.Sh AUTHORS
-This implementation of
-.Nm
-was written by
-.An Matthew R. Green Aq mrg@eterna.com.au .
-.Sh BUGS
-According to RFC 1952, the recorded file size is stored in a 32-bit
-integer and therefore it can not represent files that is bigger than
-4GB in size. This limitation also applies to
-.Fl l
-option of
-.Nm
-utility.
diff --git a/usr.bin/gzip/gzip.c b/usr.bin/gzip/gzip.c
deleted file mode 100644
index 5a8e388..0000000
--- a/usr.bin/gzip/gzip.c
+++ /dev/null
@@ -1,2060 +0,0 @@
-/* $NetBSD: gzip.c,v 1.92 2008/07/21 14:19:22 lukem Exp $ */
-
-/*-
- * Copyright (c) 1997, 1998, 2003, 2004, 2006 Matthew R. Green
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- */
-
-#include <sys/cdefs.h>
-#ifndef lint
-__COPYRIGHT("@(#) Copyright (c) 1997, 1998, 2003, 2004, 2006\
- Matthew R. Green. All rights reserved.");
-__RCSID("$FreeBSD$");
-#endif /* not lint */
-
-/*
- * gzip.c -- GPL free gzip using zlib.
- *
- * RFC 1950 covers the zlib format
- * RFC 1951 covers the deflate format
- * RFC 1952 covers the gzip format
- *
- * TODO:
- * - use mmap where possible
- * - handle some signals better (remove outfile?)
- * - make bzip2/compress -v/-t/-l support work as well as possible
- */
-
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-
-#include <inttypes.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <zlib.h>
-#include <fts.h>
-#include <libgen.h>
-#include <stdarg.h>
-#include <getopt.h>
-#include <time.h>
-
-#ifndef PRIdOFF
-#define PRIdOFF PRId64
-#endif
-
-/* what type of file are we dealing with */
-enum filetype {
- FT_GZIP,
-#ifndef NO_BZIP2_SUPPORT
- FT_BZIP2,
-#endif
-#ifndef NO_COMPRESS_SUPPORT
- FT_Z,
-#endif
- FT_LAST,
- FT_UNKNOWN
-};
-
-#ifndef NO_BZIP2_SUPPORT
-#include <bzlib.h>
-
-#define BZ2_SUFFIX ".bz2"
-#define BZIP2_MAGIC "\102\132\150"
-#endif
-
-#ifndef NO_COMPRESS_SUPPORT
-#define Z_SUFFIX ".Z"
-#define Z_MAGIC "\037\235"
-#endif
-
-#define GZ_SUFFIX ".gz"
-
-#define BUFLEN (64 * 1024)
-
-#define GZIP_MAGIC0 0x1F
-#define GZIP_MAGIC1 0x8B
-#define GZIP_OMAGIC1 0x9E
-
-#define GZIP_TIMESTAMP (off_t)4
-#define GZIP_ORIGNAME (off_t)10
-
-#define HEAD_CRC 0x02
-#define EXTRA_FIELD 0x04
-#define ORIG_NAME 0x08
-#define COMMENT 0x10
-
-#define OS_CODE 3 /* Unix */
-
-typedef struct {
- const char *zipped;
- int ziplen;
- const char *normal; /* for unzip - must not be longer than zipped */
-} suffixes_t;
-static suffixes_t suffixes[] = {
-#define SUFFIX(Z, N) {Z, sizeof Z - 1, N}
- SUFFIX(GZ_SUFFIX, ""), /* Overwritten by -S .xxx */
-#ifndef SMALL
- SUFFIX(GZ_SUFFIX, ""),
- SUFFIX(".z", ""),
- SUFFIX("-gz", ""),
- SUFFIX("-z", ""),
- SUFFIX("_z", ""),
- SUFFIX(".taz", ".tar"),
- SUFFIX(".tgz", ".tar"),
-#ifndef NO_BZIP2_SUPPORT
- SUFFIX(BZ2_SUFFIX, ""),
- SUFFIX(".tbz", ".tar"),
- SUFFIX(".tbz2", ".tar"),
-#endif
-#ifndef NO_COMPRESS_SUPPORT
- SUFFIX(Z_SUFFIX, ""),
-#endif
- SUFFIX(GZ_SUFFIX, ""), /* Overwritten by -S "" */
-#endif /* SMALL */
-#undef SUFFIX
-};
-#define NUM_SUFFIXES (sizeof suffixes / sizeof suffixes[0])
-
-static const char gzip_version[] = "FreeBSD gzip 20070711";
-
-#ifndef SMALL
-static const char gzip_copyright[] = \
-" Copyright (c) 1997, 1998, 2003, 2004, 2006 Matthew R. Green\n"
-" All rights reserved.\n"
-"\n"
-" Redistribution and use in source and binary forms, with or without\n"
-" modification, are permitted provided that the following conditions\n"
-" are met:\n"
-" 1. Redistributions of source code must retain the above copyright\n"
-" notice, this list of conditions and the following disclaimer.\n"
-" 2. Redistributions in binary form must reproduce the above copyright\n"
-" notice, this list of conditions and the following disclaimer in the\n"
-" documentation and/or other materials provided with the distribution.\n"
-"\n"
-" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n"
-" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n"
-" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n"
-" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n"
-" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n"
-" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n"
-" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\n"
-" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n"
-" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n"
-" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n"
-" SUCH DAMAGE.";
-#endif
-
-static int cflag; /* stdout mode */
-static int dflag; /* decompress mode */
-static int lflag; /* list mode */
-static int numflag = 6; /* gzip -1..-9 value */
-
-#ifndef SMALL
-static int fflag; /* force mode */
-static int kflag; /* don't delete input files */
-static int nflag; /* don't save name/timestamp */
-static int Nflag; /* don't restore name/timestamp */
-static int qflag; /* quiet mode */
-static int rflag; /* recursive mode */
-static int tflag; /* test */
-static int vflag; /* verbose mode */
-#else
-#define qflag 0
-#define tflag 0
-#endif
-
-static int exit_value = 0; /* exit value */
-
-static char *infile; /* name of file coming in */
-
-static void maybe_err(const char *fmt, ...) __dead2
- __attribute__((__format__(__printf__, 1, 2)));
-#ifndef NO_BZIP2_SUPPORT
-static void maybe_errx(const char *fmt, ...) __dead2
- __attribute__((__format__(__printf__, 1, 2)));
-#endif
-static void maybe_warn(const char *fmt, ...)
- __attribute__((__format__(__printf__, 1, 2)));
-static void maybe_warnx(const char *fmt, ...)
- __attribute__((__format__(__printf__, 1, 2)));
-static enum filetype file_gettype(u_char *);
-#ifdef SMALL
-#define gz_compress(if, of, sz, fn, tm) gz_compress(if, of, sz)
-#endif
-static off_t gz_compress(int, int, off_t *, const char *, uint32_t);
-static off_t gz_uncompress(int, int, char *, size_t, off_t *, const char *);
-static off_t file_compress(char *, char *, size_t);
-static off_t file_uncompress(char *, char *, size_t);
-static void handle_pathname(char *);
-static void handle_file(char *, struct stat *);
-static void handle_stdin(void);
-static void handle_stdout(void);
-static void print_ratio(off_t, off_t, FILE *);
-static void print_list(int fd, off_t, const char *, time_t);
-static void usage(void);
-static void display_version(void);
-#ifndef SMALL
-static void display_license(void);
-#endif
-static const suffixes_t *check_suffix(char *, int);
-static ssize_t read_retry(int, void *, size_t);
-
-#ifdef SMALL
-#define unlink_input(f, sb) unlink(f)
-#else
-static off_t cat_fd(unsigned char *, size_t, off_t *, int fd);
-static void prepend_gzip(char *, int *, char ***);
-static void handle_dir(char *);
-static void print_verbage(const char *, const char *, off_t, off_t);
-static void print_test(const char *, int);
-static void copymodes(int fd, const struct stat *, const char *file);
-static int check_outfile(const char *outfile);
-#endif
-
-#ifndef NO_BZIP2_SUPPORT
-static off_t unbzip2(int, int, char *, size_t, off_t *);
-#endif
-
-#ifndef NO_COMPRESS_SUPPORT
-static FILE *zdopen(int);
-static off_t zuncompress(FILE *, FILE *, char *, size_t, off_t *);
-#endif
-
-int main(int, char **p);
-
-#ifdef SMALL
-#define getopt_long(a,b,c,d,e) getopt(a,b,c)
-#else
-static const struct option longopts[] = {
- { "stdout", no_argument, 0, 'c' },
- { "to-stdout", no_argument, 0, 'c' },
- { "decompress", no_argument, 0, 'd' },
- { "uncompress", no_argument, 0, 'd' },
- { "force", no_argument, 0, 'f' },
- { "help", no_argument, 0, 'h' },
- { "keep", no_argument, 0, 'k' },
- { "list", no_argument, 0, 'l' },
- { "no-name", no_argument, 0, 'n' },
- { "name", no_argument, 0, 'N' },
- { "quiet", no_argument, 0, 'q' },
- { "recursive", no_argument, 0, 'r' },
- { "suffix", required_argument, 0, 'S' },
- { "test", no_argument, 0, 't' },
- { "verbose", no_argument, 0, 'v' },
- { "version", no_argument, 0, 'V' },
- { "fast", no_argument, 0, '1' },
- { "best", no_argument, 0, '9' },
- { "ascii", no_argument, 0, 'a' },
- { "license", no_argument, 0, 'L' },
- { NULL, no_argument, 0, 0 },
-};
-#endif
-
-int
-main(int argc, char **argv)
-{
- const char *progname = getprogname();
-#ifndef SMALL
- char *gzip;
- int len;
-#endif
- int ch;
-
- /* XXX set up signals */
-
-#ifndef SMALL
- if ((gzip = getenv("GZIP")) != NULL)
- prepend_gzip(gzip, &argc, &argv);
-#endif
-
- /*
- * XXX
- * handle being called `gunzip', `zcat' and `gzcat'
- */
- if (strcmp(progname, "gunzip") == 0)
- dflag = 1;
- else if (strcmp(progname, "zcat") == 0 ||
- strcmp(progname, "gzcat") == 0)
- dflag = cflag = 1;
-
-#ifdef SMALL
-#define OPT_LIST "123456789cdhltV"
-#else
-#define OPT_LIST "123456789acdfhklLNnqrS:tVv"
-#endif
-
- while ((ch = getopt_long(argc, argv, OPT_LIST, longopts, NULL)) != -1) {
- switch (ch) {
- case '1': case '2': case '3':
- case '4': case '5': case '6':
- case '7': case '8': case '9':
- numflag = ch - '0';
- break;
- case 'c':
- cflag = 1;
- break;
- case 'd':
- dflag = 1;
- break;
- case 'l':
- lflag = 1;
- dflag = 1;
- break;
- case 'V':
- display_version();
- /* NOTREACHED */
-#ifndef SMALL
- case 'a':
- fprintf(stderr, "%s: option --ascii ignored on this system\n", progname);
- break;
- case 'f':
- fflag = 1;
- break;
- case 'k':
- kflag = 1;
- break;
- case 'L':
- display_license();
- /* NOT REACHED */
- case 'N':
- nflag = 0;
- Nflag = 1;
- break;
- case 'n':
- nflag = 1;
- Nflag = 0;
- break;
- case 'q':
- qflag = 1;
- break;
- case 'r':
- rflag = 1;
- break;
- case 'S':
- len = strlen(optarg);
- if (len != 0) {
- suffixes[0].zipped = optarg;
- suffixes[0].ziplen = len;
- } else {
- suffixes[NUM_SUFFIXES - 1].zipped = "";
- suffixes[NUM_SUFFIXES - 1].ziplen = 0;
- }
- break;
- case 't':
- cflag = 1;
- tflag = 1;
- dflag = 1;
- break;
- case 'v':
- vflag = 1;
- break;
-#endif
- default:
- usage();
- /* NOTREACHED */
- }
- }
- argv += optind;
- argc -= optind;
-
- if (argc == 0) {
- if (dflag) /* stdin mode */
- handle_stdin();
- else /* stdout mode */
- handle_stdout();
- } else {
- do {
- handle_pathname(argv[0]);
- } while (*++argv);
- }
-#ifndef SMALL
- if (qflag == 0 && lflag && argc > 1)
- print_list(-1, 0, "(totals)", 0);
-#endif
- exit(exit_value);
-}
-
-/* maybe print a warning */
-void
-maybe_warn(const char *fmt, ...)
-{
- va_list ap;
-
- if (qflag == 0) {
- va_start(ap, fmt);
- vwarn(fmt, ap);
- va_end(ap);
- }
- if (exit_value == 0)
- exit_value = 1;
-}
-
-/* ... without an errno. */
-void
-maybe_warnx(const char *fmt, ...)
-{
- va_list ap;
-
- if (qflag == 0) {
- va_start(ap, fmt);
- vwarnx(fmt, ap);
- va_end(ap);
- }
- if (exit_value == 0)
- exit_value = 1;
-}
-
-/* maybe print an error */
-void
-maybe_err(const char *fmt, ...)
-{
- va_list ap;
-
- if (qflag == 0) {
- va_start(ap, fmt);
- vwarn(fmt, ap);
- va_end(ap);
- }
- exit(2);
-}
-
-#ifndef NO_BZIP2_SUPPORT
-/* ... without an errno. */
-void
-maybe_errx(const char *fmt, ...)
-{
- va_list ap;
-
- if (qflag == 0) {
- va_start(ap, fmt);
- vwarnx(fmt, ap);
- va_end(ap);
- }
- exit(2);
-}
-#endif
-
-#ifndef SMALL
-/* split up $GZIP and prepend it to the argument list */
-static void
-prepend_gzip(char *gzip, int *argc, char ***argv)
-{
- char *s, **nargv, **ac;
- int nenvarg = 0, i;
-
- /* scan how many arguments there are */
- for (s = gzip;;) {
- while (*s == ' ' || *s == '\t')
- s++;
- if (*s == 0)
- goto count_done;
- nenvarg++;
- while (*s != ' ' && *s != '\t')
- if (*s++ == 0)
- goto count_done;
- }
-count_done:
- /* punt early */
- if (nenvarg == 0)
- return;
-
- *argc += nenvarg;
- ac = *argv;
-
- nargv = (char **)malloc((*argc + 1) * sizeof(char *));
- if (nargv == NULL)
- maybe_err("malloc");
-
- /* stash this away */
- *argv = nargv;
-
- /* copy the program name first */
- i = 0;
- nargv[i++] = *(ac++);
-
- /* take a copy of $GZIP and add it to the array */
- s = strdup(gzip);
- if (s == NULL)
- maybe_err("strdup");
- for (;;) {
- /* Skip whitespaces. */
- while (*s == ' ' || *s == '\t')
- s++;
- if (*s == 0)
- goto copy_done;
- nargv[i++] = s;
- /* Find the end of this argument. */
- while (*s != ' ' && *s != '\t')
- if (*s++ == 0)
- /* Argument followed by NUL. */
- goto copy_done;
- /* Terminate by overwriting ' ' or '\t' with NUL. */
- *s++ = 0;
- }
-copy_done:
-
- /* copy the original arguments and a NULL */
- while (*ac)
- nargv[i++] = *(ac++);
- nargv[i] = NULL;
-}
-#endif
-
-/* compress input to output. Return bytes read, -1 on error */
-static off_t
-gz_compress(int in, int out, off_t *gsizep, const char *origname, uint32_t mtime)
-{
- z_stream z;
- char *outbufp, *inbufp;
- off_t in_tot = 0, out_tot = 0;
- ssize_t in_size;
- int i, error;
- uLong crc;
-#ifdef SMALL
- static char header[] = { GZIP_MAGIC0, GZIP_MAGIC1, Z_DEFLATED, 0,
- 0, 0, 0, 0,
- 0, OS_CODE };
-#endif
-
- outbufp = malloc(BUFLEN);
- inbufp = malloc(BUFLEN);
- if (outbufp == NULL || inbufp == NULL) {
- maybe_err("malloc failed");
- goto out;
- }
-
- memset(&z, 0, sizeof z);
- z.zalloc = Z_NULL;
- z.zfree = Z_NULL;
- z.opaque = 0;
-
-#ifdef SMALL
- memcpy(outbufp, header, sizeof header);
- i = sizeof header;
-#else
- if (nflag != 0) {
- mtime = 0;
- origname = "";
- }
-
- i = snprintf(outbufp, BUFLEN, "%c%c%c%c%c%c%c%c%c%c%s",
- GZIP_MAGIC0, GZIP_MAGIC1, Z_DEFLATED,
- *origname ? ORIG_NAME : 0,
- mtime & 0xff,
- (mtime >> 8) & 0xff,
- (mtime >> 16) & 0xff,
- (mtime >> 24) & 0xff,
- numflag == 1 ? 4 : numflag == 9 ? 2 : 0,
- OS_CODE, origname);
- if (i >= BUFLEN)
- /* this need PATH_MAX > BUFLEN ... */
- maybe_err("snprintf");
- if (*origname)
- i++;
-#endif
-
- z.next_out = (unsigned char *)outbufp + i;
- z.avail_out = BUFLEN - i;
-
- error = deflateInit2(&z, numflag, Z_DEFLATED,
- (-MAX_WBITS), 8, Z_DEFAULT_STRATEGY);
- if (error != Z_OK) {
- maybe_warnx("deflateInit2 failed");
- in_tot = -1;
- goto out;
- }
-
- crc = crc32(0L, Z_NULL, 0);
- for (;;) {
- if (z.avail_out == 0) {
- if (write(out, outbufp, BUFLEN) != BUFLEN) {
- maybe_warn("write");
- out_tot = -1;
- goto out;
- }
-
- out_tot += BUFLEN;
- z.next_out = (unsigned char *)outbufp;
- z.avail_out = BUFLEN;
- }
-
- if (z.avail_in == 0) {
- in_size = read(in, inbufp, BUFLEN);
- if (in_size < 0) {
- maybe_warn("read");
- in_tot = -1;
- goto out;
- }
- if (in_size == 0)
- break;
-
- crc = crc32(crc, (const Bytef *)inbufp, (unsigned)in_size);
- in_tot += in_size;
- z.next_in = (unsigned char *)inbufp;
- z.avail_in = in_size;
- }
-
- error = deflate(&z, Z_NO_FLUSH);
- if (error != Z_OK && error != Z_STREAM_END) {
- maybe_warnx("deflate failed");
- in_tot = -1;
- goto out;
- }
- }
-
- /* clean up */
- for (;;) {
- size_t len;
- ssize_t w;
-
- error = deflate(&z, Z_FINISH);
- if (error != Z_OK && error != Z_STREAM_END) {
- maybe_warnx("deflate failed");
- in_tot = -1;
- goto out;
- }
-
- len = (char *)z.next_out - outbufp;
-
- w = write(out, outbufp, len);
- if (w == -1 || (size_t)w != len) {
- maybe_warn("write");
- out_tot = -1;
- goto out;
- }
- out_tot += len;
- z.next_out = (unsigned char *)outbufp;
- z.avail_out = BUFLEN;
-
- if (error == Z_STREAM_END)
- break;
- }
-
- if (deflateEnd(&z) != Z_OK) {
- maybe_warnx("deflateEnd failed");
- in_tot = -1;
- goto out;
- }
-
- i = snprintf(outbufp, BUFLEN, "%c%c%c%c%c%c%c%c",
- (int)crc & 0xff,
- (int)(crc >> 8) & 0xff,
- (int)(crc >> 16) & 0xff,
- (int)(crc >> 24) & 0xff,
- (int)in_tot & 0xff,
- (int)(in_tot >> 8) & 0xff,
- (int)(in_tot >> 16) & 0xff,
- (int)(in_tot >> 24) & 0xff);
- if (i != 8)
- maybe_err("snprintf");
- if (write(out, outbufp, i) != i) {
- maybe_warn("write");
- in_tot = -1;
- } else
- out_tot += i;
-
-out:
- if (inbufp != NULL)
- free(inbufp);
- if (outbufp != NULL)
- free(outbufp);
- if (gsizep)
- *gsizep = out_tot;
- return in_tot;
-}
-
-/*
- * uncompress input to output then close the input. return the
- * uncompressed size written, and put the compressed sized read
- * into `*gsizep'.
- */
-static off_t
-gz_uncompress(int in, int out, char *pre, size_t prelen, off_t *gsizep,
- const char *filename)
-{
- z_stream z;
- char *outbufp, *inbufp;
- off_t out_tot = -1, in_tot = 0;
- uint32_t out_sub_tot = 0;
- enum {
- GZSTATE_MAGIC0,
- GZSTATE_MAGIC1,
- GZSTATE_METHOD,
- GZSTATE_FLAGS,
- GZSTATE_SKIPPING,
- GZSTATE_EXTRA,
- GZSTATE_EXTRA2,
- GZSTATE_EXTRA3,
- GZSTATE_ORIGNAME,
- GZSTATE_COMMENT,
- GZSTATE_HEAD_CRC1,
- GZSTATE_HEAD_CRC2,
- GZSTATE_INIT,
- GZSTATE_READ,
- GZSTATE_CRC,
- GZSTATE_LEN,
- } state = GZSTATE_MAGIC0;
- int flags = 0, skip_count = 0;
- int error = Z_STREAM_ERROR, done_reading = 0;
- uLong crc = 0;
- ssize_t wr;
- int needmore = 0;
-
-#define ADVANCE() { z.next_in++; z.avail_in--; }
-
- if ((outbufp = malloc(BUFLEN)) == NULL) {
- maybe_err("malloc failed");
- goto out2;
- }
- if ((inbufp = malloc(BUFLEN)) == NULL) {
- maybe_err("malloc failed");
- goto out1;
- }
-
- memset(&z, 0, sizeof z);
- z.avail_in = prelen;
- z.next_in = (unsigned char *)pre;
- z.avail_out = BUFLEN;
- z.next_out = (unsigned char *)outbufp;
- z.zalloc = NULL;
- z.zfree = NULL;
- z.opaque = 0;
-
- in_tot = prelen;
- out_tot = 0;
-
- for (;;) {
- if ((z.avail_in == 0 || needmore) && done_reading == 0) {
- ssize_t in_size;
-
- if (z.avail_in > 0) {
- memmove(inbufp, z.next_in, z.avail_in);
- }
- z.next_in = (unsigned char *)inbufp;
- in_size = read(in, z.next_in + z.avail_in,
- BUFLEN - z.avail_in);
-
- if (in_size == -1) {
- maybe_warn("failed to read stdin");
- goto stop_and_fail;
- } else if (in_size == 0) {
- done_reading = 1;
- }
-
- z.avail_in += in_size;
- needmore = 0;
-
- in_tot += in_size;
- }
- if (z.avail_in == 0) {
- if (done_reading && state != GZSTATE_MAGIC0) {
- maybe_warnx("%s: unexpected end of file",
- filename);
- goto stop_and_fail;
- }
- goto stop;
- }
- switch (state) {
- case GZSTATE_MAGIC0:
- if (*z.next_in != GZIP_MAGIC0) {
- if (in_tot > 0) {
- maybe_warnx("%s: trailing garbage "
- "ignored", filename);
- goto stop;
- }
- maybe_warnx("input not gziped (MAGIC0)");
- goto stop_and_fail;
- }
- ADVANCE();
- state++;
- out_sub_tot = 0;
- crc = crc32(0L, Z_NULL, 0);
- break;
-
- case GZSTATE_MAGIC1:
- if (*z.next_in != GZIP_MAGIC1 &&
- *z.next_in != GZIP_OMAGIC1) {
- maybe_warnx("input not gziped (MAGIC1)");
- goto stop_and_fail;
- }
- ADVANCE();
- state++;
- break;
-
- case GZSTATE_METHOD:
- if (*z.next_in != Z_DEFLATED) {
- maybe_warnx("unknown compression method");
- goto stop_and_fail;
- }
- ADVANCE();
- state++;
- break;
-
- case GZSTATE_FLAGS:
- flags = *z.next_in;
- ADVANCE();
- skip_count = 6;
- state++;
- break;
-
- case GZSTATE_SKIPPING:
- if (skip_count > 0) {
- skip_count--;
- ADVANCE();
- } else
- state++;
- break;
-
- case GZSTATE_EXTRA:
- if ((flags & EXTRA_FIELD) == 0) {
- state = GZSTATE_ORIGNAME;
- break;
- }
- skip_count = *z.next_in;
- ADVANCE();
- state++;
- break;
-
- case GZSTATE_EXTRA2:
- skip_count |= ((*z.next_in) << 8);
- ADVANCE();
- state++;
- break;
-
- case GZSTATE_EXTRA3:
- if (skip_count > 0) {
- skip_count--;
- ADVANCE();
- } else
- state++;
- break;
-
- case GZSTATE_ORIGNAME:
- if ((flags & ORIG_NAME) == 0) {
- state++;
- break;
- }
- if (*z.next_in == 0)
- state++;
- ADVANCE();
- break;
-
- case GZSTATE_COMMENT:
- if ((flags & COMMENT) == 0) {
- state++;
- break;
- }
- if (*z.next_in == 0)
- state++;
- ADVANCE();
- break;
-
- case GZSTATE_HEAD_CRC1:
- if (flags & HEAD_CRC)
- skip_count = 2;
- else
- skip_count = 0;
- state++;
- break;
-
- case GZSTATE_HEAD_CRC2:
- if (skip_count > 0) {
- skip_count--;
- ADVANCE();
- } else
- state++;
- break;
-
- case GZSTATE_INIT:
- if (inflateInit2(&z, -MAX_WBITS) != Z_OK) {
- maybe_warnx("failed to inflateInit");
- goto stop_and_fail;
- }
- state++;
- break;
-
- case GZSTATE_READ:
- error = inflate(&z, Z_FINISH);
- switch (error) {
- /* Z_BUF_ERROR goes with Z_FINISH... */
- case Z_BUF_ERROR:
- case Z_STREAM_END:
- case Z_OK:
- break;
-
- case Z_NEED_DICT:
- maybe_warnx("Z_NEED_DICT error");
- goto stop_and_fail;
- case Z_DATA_ERROR:
- maybe_warnx("data stream error");
- goto stop_and_fail;
- case Z_STREAM_ERROR:
- maybe_warnx("internal stream error");
- goto stop_and_fail;
- case Z_MEM_ERROR:
- maybe_warnx("memory allocation error");
- goto stop_and_fail;
-
- default:
- maybe_warn("unknown error from inflate(): %d",
- error);
- }
- wr = BUFLEN - z.avail_out;
-
- if (wr != 0) {
- crc = crc32(crc, (const Bytef *)outbufp, (unsigned)wr);
- if (
-#ifndef SMALL
- /* don't write anything with -t */
- tflag == 0 &&
-#endif
- write(out, outbufp, wr) != wr) {
- maybe_warn("error writing to output");
- goto stop_and_fail;
- }
-
- out_tot += wr;
- out_sub_tot += wr;
- }
-
- if (error == Z_STREAM_END) {
- inflateEnd(&z);
- state++;
- }
-
- z.next_out = (unsigned char *)outbufp;
- z.avail_out = BUFLEN;
-
- break;
- case GZSTATE_CRC:
- {
- uLong origcrc;
-
- if (z.avail_in < 4) {
- if (!done_reading) {
- needmore = 1;
- continue;
- }
- maybe_warnx("truncated input");
- goto stop_and_fail;
- }
- origcrc = ((unsigned)z.next_in[0] & 0xff) |
- ((unsigned)z.next_in[1] & 0xff) << 8 |
- ((unsigned)z.next_in[2] & 0xff) << 16 |
- ((unsigned)z.next_in[3] & 0xff) << 24;
- if (origcrc != crc) {
- maybe_warnx("invalid compressed"
- " data--crc error");
- goto stop_and_fail;
- }
- }
-
- z.avail_in -= 4;
- z.next_in += 4;
-
- if (!z.avail_in && done_reading) {
- goto stop;
- }
- state++;
- break;
- case GZSTATE_LEN:
- {
- uLong origlen;
-
- if (z.avail_in < 4) {
- if (!done_reading) {
- needmore = 1;
- continue;
- }
- maybe_warnx("truncated input");
- goto stop_and_fail;
- }
- origlen = ((unsigned)z.next_in[0] & 0xff) |
- ((unsigned)z.next_in[1] & 0xff) << 8 |
- ((unsigned)z.next_in[2] & 0xff) << 16 |
- ((unsigned)z.next_in[3] & 0xff) << 24;
-
- if (origlen != out_sub_tot) {
- maybe_warnx("invalid compressed"
- " data--length error");
- goto stop_and_fail;
- }
- }
-
- z.avail_in -= 4;
- z.next_in += 4;
-
- if (error < 0) {
- maybe_warnx("decompression error");
- goto stop_and_fail;
- }
- state = GZSTATE_MAGIC0;
- break;
- }
- continue;
-stop_and_fail:
- out_tot = -1;
-stop:
- break;
- }
- if (state > GZSTATE_INIT)
- inflateEnd(&z);
-
- free(inbufp);
-out1:
- free(outbufp);
-out2:
- if (gsizep)
- *gsizep = in_tot;
- return (out_tot);
-}
-
-#ifndef SMALL
-/*
- * set the owner, mode, flags & utimes using the given file descriptor.
- * file is only used in possible warning messages.
- */
-static void
-copymodes(int fd, const struct stat *sbp, const char *file)
-{
- struct timeval times[2];
- struct stat sb;
-
- /*
- * If we have no info on the input, give this file some
- * default values and return..
- */
- if (sbp == NULL) {
- mode_t mask = umask(022);
-
- (void)fchmod(fd, DEFFILEMODE & ~mask);
- (void)umask(mask);
- return;
- }
- sb = *sbp;
-
- /* if the chown fails, remove set-id bits as-per compress(1) */
- if (fchown(fd, sb.st_uid, sb.st_gid) < 0) {
- if (errno != EPERM)
- maybe_warn("couldn't fchown: %s", file);
- sb.st_mode &= ~(S_ISUID|S_ISGID);
- }
-
- /* we only allow set-id and the 9 normal permission bits */
- sb.st_mode &= S_ISUID | S_ISGID | S_IRWXU | S_IRWXG | S_IRWXO;
- if (fchmod(fd, sb.st_mode) < 0)
- maybe_warn("couldn't fchmod: %s", file);
-
- TIMESPEC_TO_TIMEVAL(&times[0], &sb.st_atimespec);
- TIMESPEC_TO_TIMEVAL(&times[1], &sb.st_mtimespec);
- if (futimes(fd, times) < 0)
- maybe_warn("couldn't utimes: %s", file);
-
- /* only try flags if they exist already */
- if (sb.st_flags != 0 && fchflags(fd, sb.st_flags) < 0)
- maybe_warn("couldn't fchflags: %s", file);
-}
-#endif
-
-/* what sort of file is this? */
-static enum filetype
-file_gettype(u_char *buf)
-{
-
- if (buf[0] == GZIP_MAGIC0 &&
- (buf[1] == GZIP_MAGIC1 || buf[1] == GZIP_OMAGIC1))
- return FT_GZIP;
- else
-#ifndef NO_BZIP2_SUPPORT
- if (memcmp(buf, BZIP2_MAGIC, 3) == 0 &&
- buf[3] >= '0' && buf[3] <= '9')
- return FT_BZIP2;
- else
-#endif
-#ifndef NO_COMPRESS_SUPPORT
- if (memcmp(buf, Z_MAGIC, 2) == 0)
- return FT_Z;
- else
-#endif
- return FT_UNKNOWN;
-}
-
-#ifndef SMALL
-/* check the outfile is OK. */
-static int
-check_outfile(const char *outfile)
-{
- struct stat sb;
- int ok = 1;
-
- if (lflag == 0 && stat(outfile, &sb) == 0) {
- if (fflag)
- unlink(outfile);
- else if (isatty(STDIN_FILENO)) {
- char ans[10] = { 'n', '\0' }; /* default */
-
- fprintf(stderr, "%s already exists -- do you wish to "
- "overwrite (y or n)? " , outfile);
- (void)fgets(ans, sizeof(ans) - 1, stdin);
- if (ans[0] != 'y' && ans[0] != 'Y') {
- fprintf(stderr, "\tnot overwriting\n");
- ok = 0;
- } else
- unlink(outfile);
- } else {
- maybe_warnx("%s already exists -- skipping", outfile);
- ok = 0;
- }
- }
- return ok;
-}
-
-static void
-unlink_input(const char *file, const struct stat *sb)
-{
- struct stat nsb;
-
- if (kflag)
- return;
- if (stat(file, &nsb) != 0)
- /* Must be gone alrady */
- return;
- if (nsb.st_dev != sb->st_dev || nsb.st_ino != sb->st_ino)
- /* Definitely a different file */
- return;
- unlink(file);
-}
-#endif
-
-static const suffixes_t *
-check_suffix(char *file, int xlate)
-{
- const suffixes_t *s;
- int len = strlen(file);
- char *sp;
-
- for (s = suffixes; s != suffixes + NUM_SUFFIXES; s++) {
- /* if it doesn't fit in "a.suf", don't bother */
- if (s->ziplen >= len)
- continue;
- sp = file + len - s->ziplen;
- if (strcmp(s->zipped, sp) != 0)
- continue;
- if (xlate)
- strcpy(sp, s->normal);
- return s;
- }
- return NULL;
-}
-
-/*
- * compress the given file: create a corresponding .gz file and remove the
- * original.
- */
-static off_t
-file_compress(char *file, char *outfile, size_t outsize)
-{
- int in;
- int out;
- off_t size, insize;
-#ifndef SMALL
- struct stat isb, osb;
- const suffixes_t *suff;
-#endif
-
- in = open(file, O_RDONLY);
- if (in == -1) {
- maybe_warn("can't open %s", file);
- return -1;
- }
-
- if (cflag == 0) {
-#ifndef SMALL
- if (fstat(in, &isb) == 0) {
- if (isb.st_nlink > 1 && fflag == 0) {
- maybe_warnx("%s has %d other link%s -- "
- "skipping", file, isb.st_nlink - 1,
- isb.st_nlink == 1 ? "" : "s");
- close(in);
- return -1;
- }
- }
-
- if (fflag == 0 && (suff = check_suffix(file, 0))
- && suff->zipped[0] != 0) {
- maybe_warnx("%s already has %s suffix -- unchanged",
- file, suff->zipped);
- close(in);
- return -1;
- }
-#endif
-
- /* Add (usually) .gz to filename */
- if ((size_t)snprintf(outfile, outsize, "%s%s",
- file, suffixes[0].zipped) >= outsize)
- memcpy(outfile - suffixes[0].ziplen - 1,
- suffixes[0].zipped, suffixes[0].ziplen + 1);
-
-#ifndef SMALL
- if (check_outfile(outfile) == 0) {
- close(in);
- return -1;
- }
-#endif
- }
-
- if (cflag == 0) {
- out = open(outfile, O_WRONLY | O_CREAT | O_EXCL, 0600);
- if (out == -1) {
- maybe_warn("could not create output: %s", outfile);
- fclose(stdin);
- return -1;
- }
- } else
- out = STDOUT_FILENO;
-
- insize = gz_compress(in, out, &size, basename(file), (uint32_t)isb.st_mtime);
-
- (void)close(in);
-
- /*
- * If there was an error, insize will be -1.
- * If we compressed to stdout, just return the size.
- * Otherwise stat the file and check it is the correct size.
- * We only blow away the file if we can stat the output and it
- * has the expected size.
- */
- if (cflag != 0)
- return insize == -1 ? -1 : size;
-
-#ifndef SMALL
- if (fstat(out, &osb) != 0) {
- maybe_warn("couldn't stat: %s", outfile);
- goto bad_outfile;
- }
-
- if (osb.st_size != size) {
- maybe_warnx("output file: %s wrong size (%" PRIdOFF
- " != %" PRIdOFF "), deleting",
- outfile, osb.st_size, size);
- goto bad_outfile;
- }
-
- copymodes(out, &isb, outfile);
-#endif
- if (close(out) == -1)
- maybe_warn("couldn't close output");
-
- /* output is good, ok to delete input */
- unlink_input(file, &isb);
- return size;
-
-#ifndef SMALL
- bad_outfile:
- if (close(out) == -1)
- maybe_warn("couldn't close output");
-
- maybe_warnx("leaving original %s", file);
- unlink(outfile);
- return size;
-#endif
-}
-
-/* uncompress the given file and remove the original */
-static off_t
-file_uncompress(char *file, char *outfile, size_t outsize)
-{
- struct stat isb, osb;
- off_t size;
- ssize_t rbytes;
- unsigned char header1[4];
- enum filetype method;
- int rv, fd, ofd, zfd = -1;
-#ifndef SMALL
- time_t timestamp = 0;
- unsigned char name[PATH_MAX + 1];
-#endif
-
- /* gather the old name info */
-
- fd = open(file, O_RDONLY);
- if (fd < 0) {
- maybe_warn("can't open %s", file);
- goto lose;
- }
-
- strlcpy(outfile, file, outsize);
- if (check_suffix(outfile, 1) == NULL && !(cflag || lflag)) {
- maybe_warnx("%s: unknown suffix -- ignored", file);
- goto lose;
- }
-
- rbytes = read(fd, header1, sizeof header1);
- if (rbytes != sizeof header1) {
- /* we don't want to fail here. */
-#ifndef SMALL
- if (fflag)
- goto lose;
-#endif
- if (rbytes == -1)
- maybe_warn("can't read %s", file);
- else
- goto unexpected_EOF;
- goto lose;
- }
-
- method = file_gettype(header1);
-
-#ifndef SMALL
- if (fflag == 0 && method == FT_UNKNOWN) {
- maybe_warnx("%s: not in gzip format", file);
- goto lose;
- }
-
-#endif
-
-#ifndef SMALL
- if (method == FT_GZIP && Nflag) {
- unsigned char ts[4]; /* timestamp */
-
- rv = pread(fd, ts, sizeof ts, GZIP_TIMESTAMP);
- if (rv >= 0 && (size_t)rv < sizeof ts)
- goto unexpected_EOF;
- if (rv == -1) {
- if (!fflag)
- maybe_warn("can't read %s", file);
- goto lose;
- }
- timestamp = ts[3] << 24 | ts[2] << 16 | ts[1] << 8 | ts[0];
-
- if (header1[3] & ORIG_NAME) {
- rbytes = pread(fd, name, sizeof name, GZIP_ORIGNAME);
- if (rbytes < 0) {
- maybe_warn("can't read %s", file);
- goto lose;
- }
- if (name[0] != 0) {
- /* preserve original directory name */
- char *dp = strrchr(file, '/');
- if (dp == NULL)
- dp = file;
- else
- dp++;
- snprintf(outfile, outsize, "%.*s%.*s",
- (int) (dp - file),
- file, (int) rbytes, name);
- }
- }
- }
-#endif
- lseek(fd, 0, SEEK_SET);
-
- if (cflag == 0 || lflag) {
- if (fstat(fd, &isb) != 0)
- goto lose;
-#ifndef SMALL
- if (isb.st_nlink > 1 && lflag == 0 && fflag == 0) {
- maybe_warnx("%s has %d other links -- skipping",
- file, isb.st_nlink - 1);
- goto lose;
- }
- if (nflag == 0 && timestamp)
- isb.st_mtime = timestamp;
- if (check_outfile(outfile) == 0)
- goto lose;
-#endif
- }
-
- if (cflag == 0 && lflag == 0) {
- zfd = open(outfile, O_WRONLY|O_CREAT|O_EXCL, 0600);
- if (zfd == STDOUT_FILENO) {
- /* We won't close STDOUT_FILENO later... */
- zfd = dup(zfd);
- close(STDOUT_FILENO);
- }
- if (zfd == -1) {
- maybe_warn("can't open %s", outfile);
- goto lose;
- }
- } else
- zfd = STDOUT_FILENO;
-
-#ifndef NO_BZIP2_SUPPORT
- if (method == FT_BZIP2) {
-
- /* XXX */
- if (lflag) {
- maybe_warnx("no -l with bzip2 files");
- goto lose;
- }
-
- size = unbzip2(fd, zfd, NULL, 0, NULL);
- } else
-#endif
-
-#ifndef NO_COMPRESS_SUPPORT
- if (method == FT_Z) {
- FILE *in, *out;
-
- /* XXX */
- if (lflag) {
- maybe_warnx("no -l with Lempel-Ziv files");
- goto lose;
- }
-
- if ((in = zdopen(fd)) == NULL) {
- maybe_warn("zdopen for read: %s", file);
- goto lose;
- }
-
- out = fdopen(dup(zfd), "w");
- if (out == NULL) {
- maybe_warn("fdopen for write: %s", outfile);
- fclose(in);
- goto lose;
- }
-
- size = zuncompress(in, out, NULL, 0, NULL);
- /* need to fclose() if ferror() is true... */
- if (ferror(in) | fclose(in)) {
- maybe_warn("failed infile fclose");
- unlink(outfile);
- (void)fclose(out);
- }
- if (fclose(out) != 0) {
- maybe_warn("failed outfile fclose");
- unlink(outfile);
- goto lose;
- }
- } else
-#endif
-
-#ifndef SMALL
- if (method == FT_UNKNOWN) {
- if (lflag) {
- maybe_warnx("no -l for unknown filetypes");
- goto lose;
- }
- size = cat_fd(NULL, 0, NULL, fd);
- } else
-#endif
- {
- if (lflag) {
- print_list(fd, isb.st_size, outfile, isb.st_mtime);
- close(fd);
- return -1; /* XXX */
- }
-
- size = gz_uncompress(fd, zfd, NULL, 0, NULL, file);
- }
-
- if (close(fd) != 0)
- maybe_warn("couldn't close input");
- if (zfd != STDOUT_FILENO && close(zfd) != 0)
- maybe_warn("couldn't close output");
-
- if (size == -1) {
- if (cflag == 0)
- unlink(outfile);
- maybe_warnx("%s: uncompress failed", file);
- return -1;
- }
-
- /* if testing, or we uncompressed to stdout, this is all we need */
-#ifndef SMALL
- if (tflag)
- return size;
-#endif
- /* if we are uncompressing to stdin, don't remove the file. */
- if (cflag)
- return size;
-
- /*
- * if we create a file...
- */
- /*
- * if we can't stat the file don't remove the file.
- */
-
- ofd = open(outfile, O_RDWR, 0);
- if (ofd == -1) {
- maybe_warn("couldn't open (leaving original): %s",
- outfile);
- return -1;
- }
- if (fstat(ofd, &osb) != 0) {
- maybe_warn("couldn't stat (leaving original): %s",
- outfile);
- close(ofd);
- return -1;
- }
- if (osb.st_size != size) {
- maybe_warnx("stat gave different size: %" PRIdOFF
- " != %" PRIdOFF " (leaving original)",
- size, osb.st_size);
- close(ofd);
- unlink(outfile);
- return -1;
- }
- unlink_input(file, &isb);
-#ifndef SMALL
- copymodes(ofd, &isb, outfile);
-#endif
- close(ofd);
- return size;
-
- unexpected_EOF:
- maybe_warnx("%s: unexpected end of file", file);
- lose:
- if (fd != -1)
- close(fd);
- if (zfd != -1 && zfd != STDOUT_FILENO)
- close(fd);
- return -1;
-}
-
-#ifndef SMALL
-static off_t
-cat_fd(unsigned char * prepend, size_t count, off_t *gsizep, int fd)
-{
- char buf[BUFLEN];
- off_t in_tot;
- ssize_t w;
-
- in_tot = count;
- w = write(STDOUT_FILENO, prepend, count);
- if (w == -1 || (size_t)w != count) {
- maybe_warn("write to stdout");
- return -1;
- }
- for (;;) {
- ssize_t rv;
-
- rv = read(fd, buf, sizeof buf);
- if (rv == 0)
- break;
- if (rv < 0) {
- maybe_warn("read from fd %d", fd);
- break;
- }
-
- if (write(STDOUT_FILENO, buf, rv) != rv) {
- maybe_warn("write to stdout");
- break;
- }
- in_tot += rv;
- }
-
- if (gsizep)
- *gsizep = in_tot;
- return (in_tot);
-}
-#endif
-
-static void
-handle_stdin(void)
-{
- unsigned char header1[4];
- off_t usize, gsize;
- enum filetype method;
- ssize_t bytes_read;
-#ifndef NO_COMPRESS_SUPPORT
- FILE *in;
-#endif
-
-#ifndef SMALL
- if (fflag == 0 && lflag == 0 && isatty(STDIN_FILENO)) {
- maybe_warnx("standard input is a terminal -- ignoring");
- return;
- }
-#endif
-
- if (lflag) {
- struct stat isb;
-
- /* XXX could read the whole file, etc. */
- if (fstat(STDIN_FILENO, &isb) < 0) {
- maybe_warn("fstat");
- return;
- }
- print_list(STDIN_FILENO, isb.st_size, "stdout", isb.st_mtime);
- return;
- }
-
- bytes_read = read_retry(STDIN_FILENO, header1, sizeof header1);
- if (bytes_read == -1) {
- maybe_warn("can't read stdin");
- return;
- } else if (bytes_read != sizeof(header1)) {
- maybe_warnx("(stdin): unexpected end of file");
- return;
- }
-
- method = file_gettype(header1);
- switch (method) {
- default:
-#ifndef SMALL
- if (fflag == 0) {
- maybe_warnx("unknown compression format");
- return;
- }
- usize = cat_fd(header1, sizeof header1, &gsize, STDIN_FILENO);
- break;
-#endif
- case FT_GZIP:
- usize = gz_uncompress(STDIN_FILENO, STDOUT_FILENO,
- (char *)header1, sizeof header1, &gsize, "(stdin)");
- break;
-#ifndef NO_BZIP2_SUPPORT
- case FT_BZIP2:
- usize = unbzip2(STDIN_FILENO, STDOUT_FILENO,
- (char *)header1, sizeof header1, &gsize);
- break;
-#endif
-#ifndef NO_COMPRESS_SUPPORT
- case FT_Z:
- if ((in = zdopen(STDIN_FILENO)) == NULL) {
- maybe_warnx("zopen of stdin");
- return;
- }
-
- usize = zuncompress(in, stdout, (char *)header1, sizeof header1, &gsize);
- fclose(in);
- break;
-#endif
- }
-
-#ifndef SMALL
- if (vflag && !tflag && usize != -1 && gsize != -1)
- print_verbage(NULL, NULL, usize, gsize);
- if (vflag && tflag)
- print_test("(stdin)", usize != -1);
-#endif
-
-}
-
-static void
-handle_stdout(void)
-{
- off_t gsize, usize;
- struct stat sb;
- time_t systime;
- uint32_t mtime;
- int ret;
-
-#ifndef SMALL
- if (fflag == 0 && isatty(STDOUT_FILENO)) {
- maybe_warnx("standard output is a terminal -- ignoring");
- return;
- }
-#endif
- /* If stdin is a file use it's mtime, otherwise use current time */
- ret = fstat(STDIN_FILENO, &sb);
-
-#ifndef SMALL
- if (ret < 0) {
- maybe_warn("Can't stat stdin");
- return;
- }
-#endif
-
- if (S_ISREG(sb.st_mode))
- mtime = (uint32_t)sb.st_mtime;
- else {
- systime = time(NULL);
-#ifndef SMALL
- if (systime == -1) {
- maybe_warn("time");
- return;
- }
-#endif
- mtime = (uint32_t)systime;
- }
-
- usize = gz_compress(STDIN_FILENO, STDOUT_FILENO, &gsize, "", mtime);
-#ifndef SMALL
- if (vflag && !tflag && usize != -1 && gsize != -1)
- print_verbage(NULL, NULL, usize, gsize);
-#endif
-}
-
-/* do what is asked for, for the path name */
-static void
-handle_pathname(char *path)
-{
- char *opath = path, *s = NULL;
- ssize_t len;
- int slen;
- struct stat sb;
-
- /* check for stdout/stdin */
- if (path[0] == '-' && path[1] == '\0') {
- if (dflag)
- handle_stdin();
- else
- handle_stdout();
- return;
- }
-
-retry:
- if (stat(path, &sb) != 0) {
- /* lets try <path>.gz if we're decompressing */
- if (dflag && s == NULL && errno == ENOENT) {
- len = strlen(path);
- slen = suffixes[0].ziplen;
- s = malloc(len + slen + 1);
- if (s == NULL)
- maybe_err("malloc");
- memcpy(s, path, len);
- memcpy(s + len, suffixes[0].zipped, slen + 1);
- path = s;
- goto retry;
- }
- maybe_warn("can't stat: %s", opath);
- goto out;
- }
-
- if (S_ISDIR(sb.st_mode)) {
-#ifndef SMALL
- if (rflag)
- handle_dir(path);
- else
-#endif
- maybe_warnx("%s is a directory", path);
- goto out;
- }
-
- if (S_ISREG(sb.st_mode))
- handle_file(path, &sb);
- else
- maybe_warnx("%s is not a regular file", path);
-
-out:
- if (s)
- free(s);
-}
-
-/* compress/decompress a file */
-static void
-handle_file(char *file, struct stat *sbp)
-{
- off_t usize, gsize;
- char outfile[PATH_MAX];
-
- infile = file;
- if (dflag) {
- usize = file_uncompress(file, outfile, sizeof(outfile));
-#ifndef SMALL
- if (vflag && tflag)
- print_test(file, usize != -1);
-#endif
- if (usize == -1)
- return;
- gsize = sbp->st_size;
- } else {
- gsize = file_compress(file, outfile, sizeof(outfile));
- if (gsize == -1)
- return;
- usize = sbp->st_size;
- }
-
-
-#ifndef SMALL
- if (vflag && !tflag)
- print_verbage(file, (cflag) ? NULL : outfile, usize, gsize);
-#endif
-}
-
-#ifndef SMALL
-/* this is used with -r to recursively descend directories */
-static void
-handle_dir(char *dir)
-{
- char *path_argv[2];
- FTS *fts;
- FTSENT *entry;
-
- path_argv[0] = dir;
- path_argv[1] = 0;
- fts = fts_open(path_argv, FTS_PHYSICAL | FTS_NOCHDIR, NULL);
- if (fts == NULL) {
- warn("couldn't fts_open %s", dir);
- return;
- }
-
- while ((entry = fts_read(fts))) {
- switch(entry->fts_info) {
- case FTS_D:
- case FTS_DP:
- continue;
-
- case FTS_DNR:
- case FTS_ERR:
- case FTS_NS:
- maybe_warn("%s", entry->fts_path);
- continue;
- case FTS_F:
- handle_file(entry->fts_path, entry->fts_statp);
- }
- }
- (void)fts_close(fts);
-}
-#endif
-
-/* print a ratio - size reduction as a fraction of uncompressed size */
-static void
-print_ratio(off_t in, off_t out, FILE *where)
-{
- int percent10; /* 10 * percent */
- off_t diff;
- char buff[8];
- int len;
-
- diff = in - out/2;
- if (diff <= 0)
- /*
- * Output is more than double size of input! print -99.9%
- * Quite possibly we've failed to get the original size.
- */
- percent10 = -999;
- else {
- /*
- * We only need 12 bits of result from the final division,
- * so reduce the values until a 32bit division will suffice.
- */
- while (in > 0x100000) {
- diff >>= 1;
- in >>= 1;
- }
- if (in != 0)
- percent10 = ((u_int)diff * 2000) / (u_int)in - 1000;
- else
- percent10 = 0;
- }
-
- len = snprintf(buff, sizeof buff, "%2.2d.", percent10);
- /* Move the '.' to before the last digit */
- buff[len - 1] = buff[len - 2];
- buff[len - 2] = '.';
- fprintf(where, "%5s%%", buff);
-}
-
-#ifndef SMALL
-/* print compression statistics, and the new name (if there is one!) */
-static void
-print_verbage(const char *file, const char *nfile, off_t usize, off_t gsize)
-{
- if (file)
- fprintf(stderr, "%s:%s ", file,
- strlen(file) < 7 ? "\t\t" : "\t");
- print_ratio(usize, gsize, stderr);
- if (nfile)
- fprintf(stderr, " -- replaced with %s", nfile);
- fprintf(stderr, "\n");
- fflush(stderr);
-}
-
-/* print test results */
-static void
-print_test(const char *file, int ok)
-{
-
- if (exit_value == 0 && ok == 0)
- exit_value = 1;
- fprintf(stderr, "%s:%s %s\n", file,
- strlen(file) < 7 ? "\t\t" : "\t", ok ? "OK" : "NOT OK");
- fflush(stderr);
-}
-#endif
-
-/* print a file's info ala --list */
-/* eg:
- compressed uncompressed ratio uncompressed_name
- 354841 1679360 78.8% /usr/pkgsrc/distfiles/libglade-2.0.1.tar
-*/
-static void
-print_list(int fd, off_t out, const char *outfile, time_t ts)
-{
- static int first = 1;
-#ifndef SMALL
- static off_t in_tot, out_tot;
- uint32_t crc = 0;
-#endif
- off_t in = 0, rv;
-
- if (first) {
-#ifndef SMALL
- if (vflag)
- printf("method crc date time ");
-#endif
- if (qflag == 0)
- printf(" compressed uncompressed "
- "ratio uncompressed_name\n");
- }
- first = 0;
-
- /* print totals? */
-#ifndef SMALL
- if (fd == -1) {
- in = in_tot;
- out = out_tot;
- } else
-#endif
- {
- /* read the last 4 bytes - this is the uncompressed size */
- rv = lseek(fd, (off_t)(-8), SEEK_END);
- if (rv != -1) {
- unsigned char buf[8];
- uint32_t usize;
-
- rv = read(fd, (char *)buf, sizeof(buf));
- if (rv == -1)
- maybe_warn("read of uncompressed size");
- else if (rv != sizeof(buf))
- maybe_warnx("read of uncompressed size");
-
- else {
- usize = buf[4] | buf[5] << 8 |
- buf[6] << 16 | buf[7] << 24;
- in = (off_t)usize;
-#ifndef SMALL
- crc = buf[0] | buf[1] << 8 |
- buf[2] << 16 | buf[3] << 24;
-#endif
- }
- }
- }
-
-#ifndef SMALL
- if (vflag && fd == -1)
- printf(" ");
- else if (vflag) {
- char *date = ctime(&ts);
-
- /* skip the day, 1/100th second, and year */
- date += 4;
- date[12] = 0;
- printf("%5s %08x %11s ", "defla"/*XXX*/, crc, date);
- }
- in_tot += in;
- out_tot += out;
-#endif
- printf("%12llu %12llu ", (unsigned long long)out, (unsigned long long)in);
- print_ratio(in, out, stdout);
- printf(" %s\n", outfile);
-}
-
-/* display the usage of NetBSD gzip */
-static void
-usage(void)
-{
-
- fprintf(stderr, "%s\n", gzip_version);
- fprintf(stderr,
-#ifdef SMALL
- "usage: %s [-" OPT_LIST "] [<file> [<file> ...]]\n",
-#else
- "usage: %s [-123456789acdfhklLNnqrtVv] [-S .suffix] [<file> [<file> ...]]\n"
- " -1 --fast fastest (worst) compression\n"
- " -2 .. -8 set compression level\n"
- " -9 --best best (slowest) compression\n"
- " -c --stdout write to stdout, keep original files\n"
- " --to-stdout\n"
- " -d --decompress uncompress files\n"
- " --uncompress\n"
- " -f --force force overwriting & compress links\n"
- " -h --help display this help\n"
- " -k --keep don't delete input files during operation\n"
- " -l --list list compressed file contents\n"
- " -N --name save or restore original file name and time stamp\n"
- " -n --no-name don't save original file name or time stamp\n"
- " -q --quiet output no warnings\n"
- " -r --recursive recursively compress files in directories\n"
- " -S .suf use suffix .suf instead of .gz\n"
- " --suffix .suf\n"
- " -t --test test compressed file\n"
- " -V --version display program version\n"
- " -v --verbose print extra statistics\n",
-#endif
- getprogname());
- exit(0);
-}
-
-#ifndef SMALL
-/* display the license information of FreeBSD gzip */
-static void
-display_license(void)
-{
-
- fprintf(stderr, "%s (based on NetBSD gzip 20060927)\n", gzip_version);
- fprintf(stderr, "%s\n", gzip_copyright);
- exit(0);
-}
-#endif
-
-/* display the version of NetBSD gzip */
-static void
-display_version(void)
-{
-
- fprintf(stderr, "%s\n", gzip_version);
- exit(0);
-}
-
-#ifndef NO_BZIP2_SUPPORT
-#include "unbzip2.c"
-#endif
-#ifndef NO_COMPRESS_SUPPORT
-#include "zuncompress.c"
-#endif
-
-static ssize_t
-read_retry(int fd, void *buf, size_t sz)
-{
- char *cp = buf;
- size_t left = MIN(sz, (size_t) SSIZE_MAX);
-
- while (left > 0) {
- ssize_t ret;
-
- ret = read(fd, cp, left);
- if (ret == -1) {
- return ret;
- } else if (ret == 0) {
- break; /* EOF */
- }
- cp += ret;
- left -= ret;
- }
-
- return sz - left;
-}
-
diff --git a/usr.bin/gzip/unbzip2.c b/usr.bin/gzip/unbzip2.c
deleted file mode 100644
index e8990d7..0000000
--- a/usr.bin/gzip/unbzip2.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/* $NetBSD: unbzip2.c,v 1.11 2008/04/28 20:24:13 martin Exp $ */
-
-/*-
- * Copyright (c) 2006 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Simon Burge.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/* This file is #included by gzip.c */
-
-static off_t
-unbzip2(int in, int out, char *pre, size_t prelen, off_t *bytes_in)
-{
- int ret, end_of_file;
- off_t bytes_out = 0;
- bz_stream bzs;
- static char *inbuf, *outbuf;
-
- if (inbuf == NULL)
- inbuf = malloc(BUFLEN);
- if (outbuf == NULL)
- outbuf = malloc(BUFLEN);
- if (inbuf == NULL || outbuf == NULL)
- maybe_err("malloc");
-
- bzs.bzalloc = NULL;
- bzs.bzfree = NULL;
- bzs.opaque = NULL;
-
- end_of_file = 0;
- ret = BZ2_bzDecompressInit(&bzs, 0, 0);
- if (ret != BZ_OK)
- maybe_errx("bzip2 init");
-
- /* Prepend. */
- bzs.avail_in = prelen;
- bzs.next_in = pre;
-
- if (bytes_in)
- *bytes_in = prelen;
-
- while (ret >= BZ_OK && ret != BZ_STREAM_END) {
- if (bzs.avail_in == 0 && !end_of_file) {
- ssize_t n;
-
- n = read(in, inbuf, BUFLEN);
- if (n < 0)
- maybe_err("read");
- if (n == 0)
- end_of_file = 1;
- bzs.next_in = inbuf;
- bzs.avail_in = n;
- if (bytes_in)
- *bytes_in += n;
- }
-
- bzs.next_out = outbuf;
- bzs.avail_out = BUFLEN;
- ret = BZ2_bzDecompress(&bzs);
-
- switch (ret) {
- case BZ_STREAM_END:
- case BZ_OK:
- if (ret == BZ_OK && end_of_file)
- maybe_err("read");
- if (!tflag) {
- ssize_t n;
-
- n = write(out, outbuf, BUFLEN - bzs.avail_out);
- if (n < 0)
- maybe_err("write");
- bytes_out += n;
- }
- break;
-
- case BZ_DATA_ERROR:
- maybe_warnx("bzip2 data integrity error");
- break;
-
- case BZ_DATA_ERROR_MAGIC:
- maybe_warnx("bzip2 magic number error");
- break;
-
- case BZ_MEM_ERROR:
- maybe_warnx("bzip2 out of memory");
- break;
-
- }
- }
-
- if (ret != BZ_STREAM_END || BZ2_bzDecompressEnd(&bzs) != BZ_OK)
- return (-1);
-
- return (bytes_out);
-}
-
diff --git a/usr.bin/gzip/zdiff b/usr.bin/gzip/zdiff
deleted file mode 100644
index 34caf2b..0000000
--- a/usr.bin/gzip/zdiff
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/bin/sh -
-#
-# $NetBSD: zdiff,v 1.3 2004/03/29 10:01:00 wiz Exp $
-# $OpenBSD: zdiff,v 1.2 2003/07/29 07:42:44 otto Exp $
-#
-#-
-# Copyright (c) 2003 Todd C. Miller <Todd.Miller@courtesan.com>
-#
-# Permission to use, copy, modify, and distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-#
-# Sponsored in part by the Defense Advanced Research Projects
-# Agency (DARPA) and Air Force Research Laboratory, Air Force
-# Materiel Command, USAF, under agreement number F39502-99-1-0512.
-#
-# $FreeBSD$
-
-# Set $prog based on $0
-case $0 in
- *cmp) prog=cmp
- ;;
- *) prog=diff
- ;;
-esac
-USAGE="usage: z$prog [options] file1 [file2]"
-
-# Pull out any command line flags so we can pass them to diff/cmp
-# XXX - assumes there is no optarg
-flags=
-while test $# -ne 0; do
- case "$1" in
- --)
- shift
- break
- ;;
- -*)
- flags="$flags $1"
- shift
- ;;
- *)
- break
- ;;
- esac
-done
-
-if [ $# -eq 1 ]; then
- # One file given, compare compressed to uncompressed
- files="$1"
- case "$1" in
- *[._-][Zz])
- files="${1%??}"
- ;;
- *[._-]gz)
- files="${1%???}"
- ;;
- *.t[ag]z)
- files="${1%??}"ar
- ;;
- *) echo "z$prog: unknown suffix" 1>&2
- exit 1
- esac
- gzip -cdfq "$1" | $prog $flags - "$files"
- status=$?
-elif [ $# -eq 2 ]; then
- # Two files given, compare the two uncompressing as needed
- case "$1" in
- *[._-][Zz]|*[._-]gz|*.t[ag]z)
- files=-
- filt="gzip -cdfq $1"
- ;;
- *)
- files="$1"
- ;;
- esac
- case "$2" in
- *[._-][Zz]|*[._-]gz|*.t[ag]z)
- if [ "$files" = "-" ]; then
- tmp=`mktemp -t z$prog.XXXXXXXXXX` || exit 1
- trap "rm -f $tmp" 0 1 2 3 13 15
- gzip -cdfq "$2" > $tmp
- files="$files $tmp"
- else
- files="$files -"
- filt="gzip -cdfq $2"
- fi
- ;;
- *)
- files="$files $2"
- ;;
- esac
- if [ -n "$filt" ]; then
- $filt | $prog $flags $files
- else
- $prog $flags $files
- fi
- status=$?
-else
- echo "$USAGE" 1>&2
- exit 1
-fi
-
-exit $status
diff --git a/usr.bin/gzip/zdiff.1 b/usr.bin/gzip/zdiff.1
deleted file mode 100644
index 2a6a4c8..0000000
--- a/usr.bin/gzip/zdiff.1
+++ /dev/null
@@ -1,109 +0,0 @@
-.\" $NetBSD: zdiff.1,v 1.3 2003/12/28 12:48:03 wiz Exp $
-.\" $OpenBSD: zdiff.1,v 1.2 2003/07/13 17:39:14 millert Exp $
-.\"
-.\" Copyright (c) 2003 Todd C. Miller <Todd.Miller@courtesan.com>
-.\"
-.\" Permission to use, copy, modify, and distribute this software for any
-.\" purpose with or without fee is hereby granted, provided that the above
-.\" copyright notice and this permission notice appear in all copies.
-.\"
-.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-.\"
-.\" Sponsored in part by the Defense Advanced Research Projects
-.\" Agency (DARPA) and Air Force Research Laboratory, Air Force
-.\" Materiel Command, USAF, under agreement number F39502-99-1-0512.
-.\"
-.\" $FreeBSD$
-.Dd January 26, 2007
-.Dt ZDIFF 1
-.Os
-.Sh NAME
-.Nm zcmp ,
-.Nm zdiff
-.Nd compare compressed files
-.Sh SYNOPSIS
-.Nm zcmp
-.Op Ar options
-.Ar file
-.Op Ar file2
-.Nm zdiff
-.Op Ar options
-.Ar file
-.Op Ar file2
-.Sh DESCRIPTION
-.Nm zcmp
-and
-.Nm zdiff
-are filters that invoke
-.Xr cmp 1
-or
-.Xr diff 1
-respectively to compare compressed files.
-Such files generally have a
-.Dq Z
-or
-.Dq gz
-extension (both the
-.Xr compress 1
-and
-.Xr gzip 1
-formats are supported).
-Any
-.Ar options
-that are specified are passed to
-.Xr cmp 1
-or
-.Xr diff 1 .
-.Pp
-If only
-.Ar file1
-is specified, it is compared against a file with the same name, but
-with the extension removed.
-When both
-.Ar file1
-or
-.Ar file2
-are specified, either file may be compressed.
-.Sh ENVIRONMENT
-.Bl -tag -width "TMPDIR"
-.It Ev TMPDIR
-Directory in which to place temporary files.
-If unset,
-.Pa /tmp
-is used.
-.El
-.Sh FILES
-.Bl -tag -width "/tmp/zdiff.XXXXXXXXXX" -compact
-.It Pa /tmp/zcmp.XXXXXXXXXX
-Temporary file for
-.Nm zcmp .
-.It Pa /tmp/zdiff.XXXXXXXXXX
-Temporary file for
-.Nm zdiff .
-.El
-.Sh SEE ALSO
-.Xr cmp 1 ,
-.Xr compress 1 ,
-.Xr diff 1
-.Sh CAVEATS
-.Nm zcmp
-and
-.Nm zdiff
-rely solely on the file extension to determine what is, or is not,
-a compressed file.
-Consequently, the following are not supported as arguments:
-.Bl -dash
-.It
-directories
-.It
-device special files
-.It
-filenames indicating the standard input
-.Pq Dq \-
-.El
diff --git a/usr.bin/gzip/zforce b/usr.bin/gzip/zforce
deleted file mode 100644
index 3b7324c..0000000
--- a/usr.bin/gzip/zforce
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/sh -
-#
-# $NetBSD: zforce,v 1.2 2003/12/28 12:43:43 wiz Exp $
-# $OpenBSD: zforce,v 1.2 2003/08/05 18:22:17 deraadt Exp $
-#
-#-
-# Copyright (c) 2003 Otto Moerbeek <otto@drijf.net>
-#
-# Permission to use, copy, modify, and distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-#
-# $FreeBSD$
-prog=`basename $0`
-USAGE="usage: $prog file ..."
-if test $# -eq 0; then
- echo $USAGE
- exit 1
-fi
-
-ret=0
-
-while test $# -ne 0; do
- case "$1" in
- *[._-]gz)
- shift
- ;;
- *.t[ag]z)
- shift
- ;;
- *)
- if file "$1" |
- grep -q "gzip compressed data" 2> /dev/null
- then
- n="$1".gz
- if mv "$1" "$n" 2> /dev/null; then
- echo "$1" -- renamed to "$n"
- else
- ret=1
- echo $prog: cannot rename "$1" to "$n"
- fi
- fi
- shift
- ;;
- esac
-done
-exit $ret
diff --git a/usr.bin/gzip/zforce.1 b/usr.bin/gzip/zforce.1
deleted file mode 100644
index efcc421..0000000
--- a/usr.bin/gzip/zforce.1
+++ /dev/null
@@ -1,53 +0,0 @@
-.\" $NetBSD: zforce.1,v 1.2 2003/12/28 12:43:43 wiz Exp $
-.\" $OpenBSD: zforce.1,v 1.1 2003/07/29 11:50:09 otto Exp $
-.\"
-.\" Copyright (c) 2003 Otto Moerbeek <otto@drijf.net>
-.\"
-.\" Permission to use, copy, modify, and distribute this software for any
-.\" purpose with or without fee is hereby granted, provided that the above
-.\" copyright notice and this permission notice appear in all copies.
-.\"
-.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-.\"
-.\" $FreeBSD$
-.Dd January 26, 2007
-.Dt ZFORCE 1
-.Os
-.Sh NAME
-.Nm zforce
-.Nd force gzip files to have a .gz suffix
-.Sh SYNOPSIS
-.Nm zforce
-.Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility renames
-.Xr gzip 1
-files to have a
-.Sq .gz
-suffix, so that
-.Xr gzip 1
-will not compress them twice.
-This can be useful if file names were truncated during a file transfer.
-Files that have an existing
-.Sq .gz ,
-.Sq -gz ,
-.Sq _gz ,
-.Sq .tgz
-or
-.Sq .taz
-suffix, or that have not been compressed by
-.Xr gzip 1 ,
-are ignored.
-.Sh SEE ALSO
-.Xr gzip 1
-.Sh CAVEATS
-.Nm
-overwrites existing files without warning.
diff --git a/usr.bin/gzip/zmore b/usr.bin/gzip/zmore
deleted file mode 100644
index 46a4eb4..0000000
--- a/usr.bin/gzip/zmore
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/bin/sh -
-#
-# $NetBSD: zmore,v 1.3 2004/03/29 09:59:42 wiz Exp $
-# $OpenBSD: zmore,v 1.4 2003/07/29 07:42:45 otto Exp $
-#
-#-
-# Copyright (c) 2003 Todd C. Miller <Todd.Miller@courtesan.com>
-#
-# Permission to use, copy, modify, and distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-#
-# Sponsored in part by the Defense Advanced Research Projects
-# Agency (DARPA) and Air Force Research Laboratory, Air Force
-# Materiel Command, USAF, under agreement number F39502-99-1-0512.
-#
-# $FreeBSD$
-
-# Pull out any command line flags so we can pass them to more/less
-flags=
-while test $# -ne 0; do
- case "$1" in
- --)
- shift
- break
- ;;
- -*)
- flags="$flags $1"
- shift
- ;;
- *)
- break
- ;;
- esac
-done
-
-# No files means read from stdin
-if [ $# -eq 0 ]; then
- gzip -cdfq 2>&1 | ${PAGER-more} $flags
- exit 0
-fi
-
-oterm=`stty -g 2>/dev/null`
-while test $# -ne 0; do
- gzip -cdfq "$1" 2>&1 | ${PAGER-more} $flags
- prev="$1"
- shift
- if tty -s && test -n "$oterm" -a $# -gt 0; then
- #echo -n "--More--(Next file: $1)"
- echo -n "$prev (END) - Next: $1 "
- trap "stty $oterm 2>/dev/null" 0 1 2 3 13 15
- stty cbreak -echo 2>/dev/null
- REPLY=`dd bs=1 count=1 2>/dev/null`
- stty $oterm 2>/dev/null
- trap - 0 1 2 3 13 15
- echo
- case "$REPLY" in
- s)
- shift
- ;;
- e|q)
- break
- ;;
- esac
- fi
-done
-exit 0
diff --git a/usr.bin/gzip/zmore.1 b/usr.bin/gzip/zmore.1
deleted file mode 100644
index 1bd349d..0000000
--- a/usr.bin/gzip/zmore.1
+++ /dev/null
@@ -1,94 +0,0 @@
-.\" $NetBSD: zmore.1,v 1.3 2003/12/28 12:47:52 wiz Exp $
-.\" $OpenBSD: zmore.1,v 1.3 2003/06/23 21:00:48 deraadt Exp $
-.\"
-.\" Copyright (c) 2003 Todd C. Miller <Todd.Miller@courtesan.com>
-.\"
-.\" Permission to use, copy, modify, and distribute this software for any
-.\" purpose with or without fee is hereby granted, provided that the above
-.\" copyright notice and this permission notice appear in all copies.
-.\"
-.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-.\"
-.\" Sponsored in part by the Defense Advanced Research Projects
-.\" Agency (DARPA) and Air Force Research Laboratory, Air Force
-.\" Materiel Command, USAF, under agreement number F39502-99-1-0512.
-.\"
-.\" $FreeBSD$
-.Dd January 26, 2007
-.Dt ZMORE 1
-.Os
-.Sh NAME
-.Nm zmore
-.Nd view compressed files on a CRT
-.Sh SYNOPSIS
-.Nm zmore
-.Op Ar flags
-.Op Ar file ...
-.Sh DESCRIPTION
-.Nm
-is a filter that allows the viewing of files compressed with Lempel-Ziv
-encoding.
-Such files generally have a
-.Dq Z
-or
-.Dq gz
-extension (both the
-.Xr compress 1
-and
-.Xr gzip 1
-formats are supported).
-Any
-.Ar flags
-that are specified are passed to the user's preferred
-.Ev PAGER
-(which is
-.Pa /usr/bin/more
-by default).
-.Pp
-When multiple files are specified,
-.Nm
-will pause at the end of each file and present the following prompt to the user:
-.Bd -literal -offset indent
-prev_file (END) - Next: next_file
-.Ed
-.Pp
-Where
-.Sy prev_file
-is the file that was just displayed and
-.Sy next_file
-is the next file to be displayed.
-The following keys are recognized at the prompt:
-.Bl -tag -width "e or q" -offset indent
-.It Ic e No or Ic q
-quit
-.Nm zmore .
-.It Ic s
-skip the next file (or exit if the next file is the last).
-.El
-.Pp
-If no files are specified,
-.Nm
-will read from the standard input.
-In this mode
-.Nm
-will assume
-.Xr gzip 1
-style compression since there is no suffix on which to make a decision.
-.Sh ENVIRONMENT
-.Bl -tag -width "PAGER"
-.It Ev PAGER
-Program used to display files.
-If unset,
-.Pa /usr/bin/more
-is used.
-.El
-.Sh SEE ALSO
-.Xr compress 1 ,
-.Xr less 1 ,
-.Xr more 1
diff --git a/usr.bin/gzip/znew b/usr.bin/gzip/znew
deleted file mode 100644
index 27bed94..0000000
--- a/usr.bin/gzip/znew
+++ /dev/null
@@ -1,137 +0,0 @@
-#!/bin/sh -
-#
-# $NetBSD: znew,v 1.3 2008/04/27 09:07:13 nakayama Exp $
-# $OpenBSD: znew,v 1.2 2003/08/05 18:22:17 deraadt Exp $
-#
-#-
-# Copyright (c) 2003 Otto Moerbeek <otto@drijf.net>
-#
-# Permission to use, copy, modify, and distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-#
-# $FreeBSD$
-
-# Return 0 if the first arg file size is smaller than the second, 1 otherwise.
-smaller () {
- a=`du -k "$1" | awk '{ print $1 }'`
- b=`du -k "$2" | awk '{ print $1 }'`
- test $a -lt $b
-}
-
-# Check gzip integrity if the -t flag is specified
-checkfile () {
- if test $tflag -eq 1; then
- gzip -qt < "$1"
- fi
-}
-
-# Decompress a file and then gzip it
-process () {
- prefix="${1%.Z}"
- filez="$prefix".Z
- filegz="$prefix".gz
-
- if test ! -e "$filez"; then
- echo "$prog: $filez does not exist"
- return 1
- fi
- if test ! -f "$filez"; then
- echo "$prog: $filez is not a regular file"
- return 1
- fi
- if test -e "$filegz" -a $fflag -eq 0; then
- echo "$prog: $filegz already exists"
- return 1
- fi
-
- tmp=`mktemp /tmp/znewXXXXXXXXXX` || {
- echo "$prog: cannot create tmp file"
- return 1
- }
- trap 'rm -f "$tmp"; exit 1' HUP INT QUIT PIPE TERM
-
- # Do the actual work, producing a file "$tmp"
- if uncompress -f -c < "$filez" | gzip -f -c $gzipflags > "$tmp"; then
- if test $kflag -eq 1 && smaller "$filez" "$tmp"; then
- echo -n "$prog: $filez is smaller than $filegz"
- echo "; keeping it"
- rm -f "$tmp"
- return 0
- fi
- if ! checkfile "$tmp"; then
- echo "$prog: integrity check of $tmp failed"
- rm -f "$tmp"
- return 1;
- fi
-
- # Try to keep the mode of the original file
- if ! cp -fp "$filez" "$filegz"; then
- echo "$prog: warning: could not keep mode of $filez"
- fi
- if ! cp "$tmp" "$filegz" 2> /dev/null; then
- echo "$prog: warning: could not keep mode of $filez"
- if ! cp -f "$tmp" "$filegz" 2> /dev/null; then
- echo "$prog: could not copy $tmp to $filegz"
- rm -f "$filegz" "$tmp"
- return 1
- fi
- fi
- if ! touch -fr "$filez" "$filegz"; then
- echo -n "$prog: warning: could not keep timestamp of "
- echo "$filez"
- fi
- rm -f "$filez" "$tmp"
- else
- echo "$prog: failed to process $filez"
- rm -f "$tmp"
- return 1
- fi
-}
-
-prog=`basename "$0"`
-usage="usage: $prog [-ftv9K] file ..."
-
-fflag=0
-tflag=0
-kflag=0
-gzipflags=
-
-# -P flag is recognized to maintain compatibility, but ignored. Pipe mode is
-# always used
-while getopts :ftv9PK i; do
- case $i in
- f) fflag=1;;
- t) tflag=1;;
- v) gzipflags="-v $gzipflags";;
- 9) gzipflags="-9 $gzipflags";;
- P) ;;
- K) kflag=1;;
- \?) echo "$usage"; exit 1;;
- esac
-done
-
-shift $((OPTIND - 1))
-
-if test $# -eq 0; then
- echo "$usage"
- exit 1
-fi
-
-rc=0
-
-while test $# -ne 0; do
- if ! process "$1"; then
- rc=$?
- fi
- shift
-done
-exit $rc
diff --git a/usr.bin/gzip/znew.1 b/usr.bin/gzip/znew.1
deleted file mode 100644
index 0da5a62..0000000
--- a/usr.bin/gzip/znew.1
+++ /dev/null
@@ -1,71 +0,0 @@
-.\" $NetBSD: znew.1,v 1.2 2003/12/28 12:43:43 wiz Exp $
-.\" $OpenBSD: znew.1,v 1.1 2003/08/02 20:52:50 otto Exp $
-.\"
-.\" Copyright (c) 2003 Otto Moerbeek <otto@drijf.net>
-.\"
-.\" Permission to use, copy, modify, and distribute this software for any
-.\" purpose with or without fee is hereby granted, provided that the above
-.\" copyright notice and this permission notice appear in all copies.
-.\"
-.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-.\"
-.\" $FreeBSD$
-.Dd January 26, 2007
-.Dt ZNEW 1
-.Os
-.Sh NAME
-.Nm znew
-.Nd convert compressed files to gzipped files
-.Sh SYNOPSIS
-.Nm
-.Op Fl ftv9K
-.Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility uncompresses files compressed by
-.Xr compress 1
-and recompresses them with
-.Xr gzip 1 .
-.Pp
-The options are as follows:
-.Bl -tag -width Ds
-.It Fl f
-Overwrite existing
-.Sq .gz
-files.
-Unless this option is specified,
-.Nm
-refuses to overwrite existing files.
-.It Fl t
-Test integrity of the gzipped file before deleting the original file.
-If the integrity check fails, the original
-.Sq .Z
-file is not removed.
-.It Fl v
-Print a report specifying the achieved compression ratios.
-.It Fl 9
-Use the -9 mode of
-.Xr gzip 1 ,
-achieving better compression at the cost of slower execution.
-.It Fl K
-Keep the original
-.Sq .Z
-file if it uses less disk blocks than the gzipped one.
-A disk block is 1024 bytes.
-.El
-.Sh SEE ALSO
-.Xr gzip 1
-.Sh CAVEATS
-The
-.Nm
-utility tries to maintain the file mode of the original file.
-If the original file is not writable, it is not able to do that and
-.Nm
-will print a warning.
diff --git a/usr.bin/gzip/zuncompress.c b/usr.bin/gzip/zuncompress.c
deleted file mode 100644
index 82b7a47..0000000
--- a/usr.bin/gzip/zuncompress.c
+++ /dev/null
@@ -1,390 +0,0 @@
-/* $NetBSD: zuncompress.c,v 1.6 2005/11/22 09:05:30 mrg Exp $ */
-
-/*-
- * Copyright (c) 1985, 1986, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Diomidis Spinellis and James A. Woods, derived from original
- * work by Spencer Thomas and Joseph Orost.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * from: NetBSD: zopen.c,v 1.8 2003/08/07 11:13:29 agc Exp
- * $FreeBSD$
- */
-
-/* This file is #included by gzip.c */
-
-static int zread(void *, char *, int);
-
-#define tab_prefixof(i) (zs->zs_codetab[i])
-#define tab_suffixof(i) ((char_type *)(zs->zs_htab))[i]
-#define de_stack ((char_type *)&tab_suffixof(1 << BITS))
-
-#define BITS 16 /* Default bits. */
-#define HSIZE 69001 /* 95% occupancy */ /* XXX may not need HSIZE */
-#define BIT_MASK 0x1f /* Defines for third byte of header. */
-#define BLOCK_MASK 0x80
-#define CHECK_GAP 10000 /* Ratio check interval. */
-#define BUFSIZE (64 * 1024)
-
-/*
- * Masks 0x40 and 0x20 are free. I think 0x20 should mean that there is
- * a fourth header byte (for expansion).
- */
-#define INIT_BITS 9 /* Initial number of bits/code. */
-
-/*
- * the next two codes should not be changed lightly, as they must not
- * lie within the contiguous general code space.
- */
-#define FIRST 257 /* First free entry. */
-#define CLEAR 256 /* Table clear output code. */
-
-
-#define MAXCODE(n_bits) ((1 << (n_bits)) - 1)
-
-typedef long code_int;
-typedef long count_int;
-typedef u_char char_type;
-
-static char_type magic_header[] =
- {'\037', '\235'}; /* 1F 9D */
-
-static char_type rmask[9] =
- {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff};
-
-/* XXX zuncompress global */
-off_t total_compressed_bytes;
-size_t compressed_prelen;
-char *compressed_pre;
-
-struct s_zstate {
- FILE *zs_fp; /* File stream for I/O */
- char zs_mode; /* r or w */
- enum {
- S_START, S_MIDDLE, S_EOF
- } zs_state; /* State of computation */
- int zs_n_bits; /* Number of bits/code. */
- int zs_maxbits; /* User settable max # bits/code. */
- code_int zs_maxcode; /* Maximum code, given n_bits. */
- code_int zs_maxmaxcode; /* Should NEVER generate this code. */
- count_int zs_htab [HSIZE];
- u_short zs_codetab [HSIZE];
- code_int zs_hsize; /* For dynamic table sizing. */
- code_int zs_free_ent; /* First unused entry. */
- /*
- * Block compression parameters -- after all codes are used up,
- * and compression rate changes, start over.
- */
- int zs_block_compress;
- int zs_clear_flg;
- long zs_ratio;
- count_int zs_checkpoint;
- int zs_offset;
- long zs_in_count; /* Length of input. */
- long zs_bytes_out; /* Length of compressed output. */
- long zs_out_count; /* # of codes output (for debugging). */
- char_type zs_buf[BITS];
- union {
- struct {
- long zs_fcode;
- code_int zs_ent;
- code_int zs_hsize_reg;
- int zs_hshift;
- } w; /* Write paramenters */
- struct {
- char_type *zs_stackp;
- int zs_finchar;
- code_int zs_code, zs_oldcode, zs_incode;
- int zs_roffset, zs_size;
- char_type zs_gbuf[BITS];
- } r; /* Read parameters */
- } u;
-};
-
-static code_int getcode(struct s_zstate *zs);
-
-static off_t
-zuncompress(FILE *in, FILE *out, char *pre, size_t prelen,
- off_t *compressed_bytes)
-{
- off_t bin, bout = 0;
- char *buf;
-
- buf = malloc(BUFSIZE);
- if (buf == NULL)
- return -1;
-
- /* XXX */
- compressed_prelen = prelen;
- if (prelen != 0)
- compressed_pre = pre;
- else
- compressed_pre = NULL;
-
- while ((bin = fread(buf, 1, sizeof(buf), in)) != 0) {
- if (tflag == 0 && fwrite(buf, 1, bin, out) != (size_t)bin) {
- free(buf);
- return -1;
- }
- bout += bin;
- }
-
- if (compressed_bytes)
- *compressed_bytes = total_compressed_bytes;
-
- free(buf);
- return bout;
-}
-
-static int
-zclose(void *zs)
-{
- free(zs);
- /* We leave the caller to close the fd passed to zdopen() */
- return 0;
-}
-
-FILE *
-zdopen(int fd)
-{
- struct s_zstate *zs;
-
- if ((zs = calloc(1, sizeof(struct s_zstate))) == NULL)
- return (NULL);
-
- zs->zs_state = S_START;
-
- /* XXX we can get rid of some of these */
- zs->zs_hsize = HSIZE; /* For dynamic table sizing. */
- zs->zs_free_ent = 0; /* First unused entry. */
- zs->zs_block_compress = BLOCK_MASK;
- zs->zs_clear_flg = 0; /* XXX we calloc()'d this structure why = 0? */
- zs->zs_ratio = 0;
- zs->zs_checkpoint = CHECK_GAP;
- zs->zs_in_count = 1; /* Length of input. */
- zs->zs_out_count = 0; /* # of codes output (for debugging). */
- zs->u.r.zs_roffset = 0;
- zs->u.r.zs_size = 0;
-
- /*
- * Layering compress on top of stdio in order to provide buffering,
- * and ensure that reads and write work with the data specified.
- */
- if ((zs->zs_fp = fdopen(fd, "r")) == NULL) {
- free(zs);
- return NULL;
- }
-
- return funopen(zs, zread, NULL, NULL, zclose);
-}
-
-/*
- * Decompress read. This routine adapts to the codes in the file building
- * the "string" table on-the-fly; requiring no table to be stored in the
- * compressed file. The tables used herein are shared with those of the
- * compress() routine. See the definitions above.
- */
-static int
-zread(void *cookie, char *rbp, int num)
-{
- u_int count, i;
- struct s_zstate *zs;
- u_char *bp, header[3];
-
- if (num == 0)
- return (0);
-
- zs = cookie;
- count = num;
- bp = (u_char *)rbp;
- switch (zs->zs_state) {
- case S_START:
- zs->zs_state = S_MIDDLE;
- break;
- case S_MIDDLE:
- goto middle;
- case S_EOF:
- goto eof;
- }
-
- /* Check the magic number */
- for (i = 0; i < 3 && compressed_prelen; i++, compressed_prelen--)
- header[i] = *compressed_pre++;
-
- if (fread(header + i, 1, sizeof(header) - i, zs->zs_fp) !=
- sizeof(header) - i ||
- memcmp(header, magic_header, sizeof(magic_header)) != 0) {
- errno = EFTYPE;
- return (-1);
- }
- total_compressed_bytes = 0;
- zs->zs_maxbits = header[2]; /* Set -b from file. */
- zs->zs_block_compress = zs->zs_maxbits & BLOCK_MASK;
- zs->zs_maxbits &= BIT_MASK;
- zs->zs_maxmaxcode = 1L << zs->zs_maxbits;
- if (zs->zs_maxbits > BITS) {
- errno = EFTYPE;
- return (-1);
- }
- /* As above, initialize the first 256 entries in the table. */
- zs->zs_maxcode = MAXCODE(zs->zs_n_bits = INIT_BITS);
- for (zs->u.r.zs_code = 255; zs->u.r.zs_code >= 0; zs->u.r.zs_code--) {
- tab_prefixof(zs->u.r.zs_code) = 0;
- tab_suffixof(zs->u.r.zs_code) = (char_type) zs->u.r.zs_code;
- }
- zs->zs_free_ent = zs->zs_block_compress ? FIRST : 256;
-
- zs->u.r.zs_finchar = zs->u.r.zs_oldcode = getcode(zs);
- if (zs->u.r.zs_oldcode == -1) /* EOF already? */
- return (0); /* Get out of here */
-
- /* First code must be 8 bits = char. */
- *bp++ = (u_char)zs->u.r.zs_finchar;
- count--;
- zs->u.r.zs_stackp = de_stack;
-
- while ((zs->u.r.zs_code = getcode(zs)) > -1) {
-
- if ((zs->u.r.zs_code == CLEAR) && zs->zs_block_compress) {
- for (zs->u.r.zs_code = 255; zs->u.r.zs_code >= 0;
- zs->u.r.zs_code--)
- tab_prefixof(zs->u.r.zs_code) = 0;
- zs->zs_clear_flg = 1;
- zs->zs_free_ent = FIRST - 1;
- if ((zs->u.r.zs_code = getcode(zs)) == -1) /* O, untimely death! */
- break;
- }
- zs->u.r.zs_incode = zs->u.r.zs_code;
-
- /* Special case for KwKwK string. */
- if (zs->u.r.zs_code >= zs->zs_free_ent) {
- *zs->u.r.zs_stackp++ = zs->u.r.zs_finchar;
- zs->u.r.zs_code = zs->u.r.zs_oldcode;
- }
-
- /* Generate output characters in reverse order. */
- while (zs->u.r.zs_code >= 256) {
- *zs->u.r.zs_stackp++ = tab_suffixof(zs->u.r.zs_code);
- zs->u.r.zs_code = tab_prefixof(zs->u.r.zs_code);
- }
- *zs->u.r.zs_stackp++ = zs->u.r.zs_finchar = tab_suffixof(zs->u.r.zs_code);
-
- /* And put them out in forward order. */
-middle: do {
- if (count-- == 0)
- return (num);
- *bp++ = *--zs->u.r.zs_stackp;
- } while (zs->u.r.zs_stackp > de_stack);
-
- /* Generate the new entry. */
- if ((zs->u.r.zs_code = zs->zs_free_ent) < zs->zs_maxmaxcode) {
- tab_prefixof(zs->u.r.zs_code) = (u_short) zs->u.r.zs_oldcode;
- tab_suffixof(zs->u.r.zs_code) = zs->u.r.zs_finchar;
- zs->zs_free_ent = zs->u.r.zs_code + 1;
- }
-
- /* Remember previous code. */
- zs->u.r.zs_oldcode = zs->u.r.zs_incode;
- }
- zs->zs_state = S_EOF;
-eof: return (num - count);
-}
-
-/*-
- * Read one code from the standard input. If EOF, return -1.
- * Inputs:
- * stdin
- * Outputs:
- * code or -1 is returned.
- */
-static code_int
-getcode(struct s_zstate *zs)
-{
- code_int gcode;
- int r_off, bits, i;
- char_type *bp;
-
- bp = zs->u.r.zs_gbuf;
- if (zs->zs_clear_flg > 0 || zs->u.r.zs_roffset >= zs->u.r.zs_size ||
- zs->zs_free_ent > zs->zs_maxcode) {
- /*
- * If the next entry will be too big for the current gcode
- * size, then we must increase the size. This implies reading
- * a new buffer full, too.
- */
- if (zs->zs_free_ent > zs->zs_maxcode) {
- zs->zs_n_bits++;
- if (zs->zs_n_bits == zs->zs_maxbits) /* Won't get any bigger now. */
- zs->zs_maxcode = zs->zs_maxmaxcode;
- else
- zs->zs_maxcode = MAXCODE(zs->zs_n_bits);
- }
- if (zs->zs_clear_flg > 0) {
- zs->zs_maxcode = MAXCODE(zs->zs_n_bits = INIT_BITS);
- zs->zs_clear_flg = 0;
- }
- /* XXX */
- for (i = 0; i < zs->zs_n_bits && compressed_prelen; i++, compressed_prelen--)
- zs->u.r.zs_gbuf[i] = *compressed_pre++;
- zs->u.r.zs_size = fread(zs->u.r.zs_gbuf + i, 1, zs->zs_n_bits - i, zs->zs_fp);
- zs->u.r.zs_size += i;
- if (zs->u.r.zs_size <= 0) /* End of file. */
- return (-1);
- zs->u.r.zs_roffset = 0;
-
- total_compressed_bytes += zs->u.r.zs_size;
-
- /* Round size down to integral number of codes. */
- zs->u.r.zs_size = (zs->u.r.zs_size << 3) - (zs->zs_n_bits - 1);
- }
- r_off = zs->u.r.zs_roffset;
- bits = zs->zs_n_bits;
-
- /* Get to the first byte. */
- bp += (r_off >> 3);
- r_off &= 7;
-
- /* Get first part (low order bits). */
- gcode = (*bp++ >> r_off);
- bits -= (8 - r_off);
- r_off = 8 - r_off; /* Now, roffset into gcode word. */
-
- /* Get any 8 bit parts in the middle (<=1 for up to 16 bits). */
- if (bits >= 8) {
- gcode |= *bp++ << r_off;
- r_off += 8;
- bits -= 8;
- }
-
- /* High order bits. */
- gcode |= (*bp & rmask[bits]) << r_off;
- zs->u.r.zs_roffset += zs->zs_n_bits;
-
- return (gcode);
-}
-
diff --git a/usr.bin/head/Makefile b/usr.bin/head/Makefile
deleted file mode 100644
index 002b3f3..0000000
--- a/usr.bin/head/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= head
-WARNS= 6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/head/head.1 b/usr.bin/head/head.1
deleted file mode 100644
index 8134618..0000000
--- a/usr.bin/head/head.1
+++ /dev/null
@@ -1,69 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)head.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 6, 1993
-.Dt HEAD 1
-.Os
-.Sh NAME
-.Nm head
-.Nd display first lines of a file
-.Sh SYNOPSIS
-.Nm
-.Op Fl n Ar count | Fl c Ar bytes
-.Op Ar
-.Sh DESCRIPTION
-This filter displays the first
-.Ar count
-lines or
-.Ar bytes
-of each of the specified files, or of the standard input if no
-files are specified.
-If
-.Ar count
-is omitted it defaults to 10.
-.Pp
-If more than a single file is specified, each file is preceded by a
-header consisting of the string
-.Dq ==> XXX <==
-where
-.Dq XXX
-is the name of the file.
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr tail 1
-.Sh HISTORY
-The
-.Nm
-command appeared in PWB UNIX.
diff --git a/usr.bin/head/head.c b/usr.bin/head/head.c
deleted file mode 100644
index 5de0cba..0000000
--- a/usr.bin/head/head.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright (c) 1980, 1987, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1987, 1992, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)head.c 8.2 (Berkeley) 5/4/95";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-/*
- * head - give the first few lines of a stream or of each of a set of files
- *
- * Bill Joy UCB August 24, 1977
- */
-
-static void head(FILE *, int);
-static void head_bytes(FILE *, off_t);
-static void obsolete(char *[]);
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- int ch;
- FILE *fp;
- int first, linecnt = -1, eval = 0;
- off_t bytecnt = -1;
- char *ep;
-
- obsolete(argv);
- while ((ch = getopt(argc, argv, "n:c:")) != -1)
- switch(ch) {
- case 'c':
- bytecnt = strtoimax(optarg, &ep, 10);
- if (*ep || bytecnt <= 0)
- errx(1, "illegal byte count -- %s", optarg);
- break;
- case 'n':
- linecnt = strtol(optarg, &ep, 10);
- if (*ep || linecnt <= 0)
- errx(1, "illegal line count -- %s", optarg);
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (linecnt != -1 && bytecnt != -1)
- errx(1, "can't combine line and byte counts");
- if (linecnt == -1 )
- linecnt = 10;
- if (*argv) {
- for (first = 1; *argv; ++argv) {
- if ((fp = fopen(*argv, "r")) == NULL) {
- warn("%s", *argv);
- eval = 1;
- continue;
- }
- if (argc > 1) {
- (void)printf("%s==> %s <==\n",
- first ? "" : "\n", *argv);
- first = 0;
- }
- if (bytecnt == -1)
- head(fp, linecnt);
- else
- head_bytes(fp, bytecnt);
- (void)fclose(fp);
- }
- } else if (bytecnt == -1)
- head(stdin, linecnt);
- else
- head_bytes(stdin, bytecnt);
-
- exit(eval);
-}
-
-static void
-head(FILE *fp, int cnt)
-{
- char *cp;
- size_t error, readlen;
-
- while (cnt && (cp = fgetln(fp, &readlen)) != NULL) {
- error = fwrite(cp, sizeof(char), readlen, stdout);
- if (error != readlen)
- err(1, "stdout");
- cnt--;
- }
-}
-
-static void
-head_bytes(FILE *fp, off_t cnt)
-{
- char buf[4096];
- size_t readlen;
-
- while (cnt) {
- if ((uintmax_t)cnt < sizeof(buf))
- readlen = cnt;
- else
- readlen = sizeof(buf);
- readlen = fread(buf, sizeof(char), readlen, fp);
- if (readlen == 0)
- break;
- if (fwrite(buf, sizeof(char), readlen, stdout) != readlen)
- err(1, "stdout");
- cnt -= readlen;
- }
-}
-
-static void
-obsolete(char *argv[])
-{
- char *ap;
-
- while ((ap = *++argv)) {
- /* Return if "--" or not "-[0-9]*". */
- if (ap[0] != '-' || ap[1] == '-' || !isdigit(ap[1]))
- return;
- if ((ap = malloc(strlen(*argv) + 2)) == NULL)
- err(1, NULL);
- ap[0] = '-';
- ap[1] = 'n';
- (void)strcpy(ap + 2, *argv + 1);
- *argv = ap;
- }
-}
-
-static void
-usage(void)
-{
-
- (void)fprintf(stderr, "usage: head [-n lines | -c bytes] [file ...]\n");
- exit(1);
-}
diff --git a/usr.bin/hesinfo/Makefile b/usr.bin/hesinfo/Makefile
deleted file mode 100644
index 870db28..0000000
--- a/usr.bin/hesinfo/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-PROG= hesinfo
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/hesinfo/hesinfo.1 b/usr.bin/hesinfo/hesinfo.1
deleted file mode 100644
index 7ab2d35..0000000
--- a/usr.bin/hesinfo/hesinfo.1
+++ /dev/null
@@ -1,198 +0,0 @@
-.\" $NetBSD: hesinfo.1,v 1.1 1999/01/25 22:45:55 lukem Exp $
-.\"
-.\" from: #Id: hesinfo.1,v 1.9 1996/11/07 01:57:12 ghudson Exp #
-.\"
-.\" Copyright 1987, 1996 by the Massachusetts Institute of Technology.
-.\"
-.\" Permission to use, copy, modify, and distribute this
-.\" software and its documentation for any purpose and without
-.\" fee is hereby granted, provided that the above copyright
-.\" notice appear in all copies and that both that copyright
-.\" notice and this permission notice appear in supporting
-.\" documentation, and that the name of M.I.T. not be used in
-.\" advertising or publicity pertaining to distribution of the
-.\" software without specific, written prior permission.
-.\" M.I.T. makes no representations about the suitability of
-.\" this software for any purpose. It is provided "as is"
-.\" without express or implied warranty.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd October 27, 1996
-.Dt HESINFO 1
-.Os
-.Sh NAME
-.Nm hesinfo
-.Nd "find out what is stored in the Hesiod database"
-.Sh SYNOPSIS
-.Nm
-.Op Fl bl
-.Ar HesiodName HesiodNameType
-.Sh DESCRIPTION
-The
-.Nm
-utility takes two arguments, a name to be resolved and a string, known
-as a
-.Ar HesiodNameType .
-It then prints the information returned by
-the Hesiod nameserver.
-.Pp
-The value returned by
-.Nm
-is of the type
-.Ar HesiodNameType .
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl l
-Selects long format.
-.It Fl b
-Prints the fully\-qualified string passed to the nameserver.
-.El
-.Ss VALID Hesiod_Names
-The following types of identifiers may be used in the
-.Ar HesiodName
-argument to
-.Nm .
-These values will be resolved by accessing the
-.Xr hesiod 3
-database.
-.Bl -tag -width indent
-.It Aq Ar username
-the 8\-character\-or\-less string used to identify users or classes
-(e.g.\& joeuser, root, 1.00, etc).
-Used with the
-.Ar Hesiod_Name_Types
-.Cm passwd ,
-.Cm pobox ,
-and
-.Cm filsys .
-.It Aq Ar uid
-the id number assigned to a user.
-.It Aq Ar groupid
-the id number assigned to a group.
-.It Aq Ar groupname
-a name identifying a unique group.
-.It Aq Ar file\-system\-name
-the name of an Athena file system.
-.It Xo
-.Ao Ar "rvd\-server" Ac : Ns Aq Ar pack
-.Xc
-the name of an rvd's server and pack separated by a colon.
-.It Xo
-.Ao Ar "nfs\-server" Ac : Ns Aq Ar partition
-.Xc
-the name of an
-.Tn NFS
-server and its partition separated by a colon.
-.It Aq Ar workstation\-name
-the machine name of an Athena workstation (e.g.\& E40\-343\-3).
-.It Aq Ar service\-name
-name of an Athena service (e.g.\& Zephyr).
-.It Aq Ar service\-type
-name of
-.Ux
-service (valid entries are defined in
-.Pa /etc/services ) .
-.It Aq Ar printer\-name
-name of a printer.
-.It Aq Ar printer\-cluster\-name
-name of an Athena print cluster.
-.It Aq Ar foo
-some
-.Nm
-calls (e.g.\&
-.Cm prclusterlist )
-do not require a specific
-.Ar HesiodName
-argument.
-However, you must include a dummy string (e.g.\&
-.Ql foo )
-for
-.Nm
-to work properly.
-.El
-.Ss VALID Hesiod_Name_Types
-The following symbols are valid substitutions for the
-.Ar HesiodNameType
-argument to
-.Nm .
-.Bl -tag -width indent
-.It Cm passwd
-returns string suitable for inclusion in
-.Pa /etc/passwd ,
-searching with
-.Aq Ar username .
-.It Cm pobox
-returns information on the pobox assigned to the user specified by
-.Ar HesiodName ,
-searching with
-.Aq Ar username .
-.It Cm uid
-returns string suitable for inclusion in
-.Pa /etc/passwd ,
-searching with
-.Aq Ar uid .
-.It Cm gid
-returns string suitable for inclusion in
-.Pa /etc/group ,
-searching with
-.Aq Ar groupid .
-.It Cm group
-returns string suitable for inclusion in
-.Pa /etc/group ,
-searching with
-.Aq Ar groupname .
-.It Cm grplist
-returns subgroups included in superset
-defined by
-.Aq Ar groupname .
-.It Cm filsys
-returns file system type, export point, server, mount mode, and import point
-for the following valid
-.Ar HesiodNames
-(see above) -
-.Aq Ar "file\-system\-name" ,
-.Aq Ar username ,
-.Ao Ar "rvd\-server" Ac : Ns Aq Ar pack ,
-and
-.Ao Ar "nfs\-server" Ac : Ns Aq Ar partition .
-.It Cm cluster
-returns information about the local cluster the workstation, specified by
-.Aq Ar "workstation\-name" .
-Included is information about the local file and print servers.
-This information is accesses by
-.Sy clusterinfo
-at boot time.
-.It Cm sloc
-returns network name of service host for
-.Aq Ar service\-name .
-.It Cm service
-returns Internet protocol type and protocol service port for
-.Aq Ar service\-type .
-.It Cm pcap
-returns a valid entry for
-.Pa /etc/printcap
-for
-.Aq Ar printer\-name .
-.It Cm prcluserlist
-returns a list of print clusters.
-.It Cm prcluster
-returns a list of printers in a cluster specified by
-.Aq Ar printer\-cluster\-name .
-.El
-.Sh FILES
-.Bl -tag -width /etc/hesiod.conf
-.It Pa /etc/hesiod.conf
-.El
-.Sh SEE ALSO
-.Xr hesiod 3 ,
-.Xr named 8
-.Rs
-.%T "Hesiod - Project Athena Technical Plan -- Name Service"
-.Re
-.Sh AUTHORS
-.An Steve Dyer ,
-IBM/Project Athena
-.Pp
-Copyright 1987, 1988, 1996 by the Massachusetts Institute of Technology.
diff --git a/usr.bin/hesinfo/hesinfo.c b/usr.bin/hesinfo/hesinfo.c
deleted file mode 100644
index fa81864..0000000
--- a/usr.bin/hesinfo/hesinfo.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/* $NetBSD: hesinfo.c,v 1.1 1999/01/25 22:45:55 lukem Exp $ */
-
-/* Copyright 1988, 1996 by the Massachusetts Institute of Technology.
- *
- * Permission to use, copy, modify, and distribute this
- * software and its documentation for any purpose and without
- * fee is hereby granted, provided that the above copyright
- * notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting
- * documentation, and that the name of M.I.T. not be used in
- * advertising or publicity pertaining to distribution of the
- * software without specific, written prior permission.
- * M.I.T. makes no representations about the suitability of
- * this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- */
-
-/* This file is a simple driver for the Hesiod library. */
-
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <errno.h>
-#include <hesiod.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-int
-main(int argc, char **argv)
-{
- char **list, **p, *bindname, *name, *type;
- int lflag = 0, errflg = 0, bflag = 0, c;
- void *context;
-
- while ((c = getopt(argc, argv, "lb")) != -1) {
- switch (c) {
- case 'l':
- lflag = 1;
- break;
- case 'b':
- bflag = 1;
- break;
- default:
- errflg++;
- break;
- }
- }
- if (argc - optind != 2 || errflg) {
- fprintf(stderr, "usage: hesinfo [-bl] name type\n");
- fprintf(stderr, "\t-l selects long format\n");
- fprintf(stderr, "\t-b also does hes_to_bind conversion\n");
- exit(2);
- }
- name = argv[optind];
- type = argv[optind + 1];
-
- if (hesiod_init(&context) < 0) {
- if (errno == ENOEXEC)
- warnx(
- "hesiod_init: Invalid Hesiod configuration file.");
- else
- warn("hesiod_init");
- }
- /* Display bind name if requested. */
- if (bflag) {
- if (lflag)
- printf("hes_to_bind(%s, %s) expands to\n", name, type);
- bindname = hesiod_to_bind(context, name, type);
- if (!bindname) {
- if (lflag)
- printf("nothing\n");
- if (errno == ENOENT)
- warnx("hesiod_to_bind: Unknown rhs-extension.");
- else
- warn("hesiod_to_bind");
- exit(1);
- }
- printf("%s\n", bindname);
- free(bindname);
- if (lflag)
- printf("which ");
- }
- if (lflag)
- printf("resolves to\n");
-
- /* Do the hesiod resolve and check for errors. */
- list = hesiod_resolve(context, name, type);
- if (!list) {
- if (lflag)
- printf("nothing\n");
- if (errno == ENOENT)
- warnx("hesiod_resolve: Hesiod name not found.");
- else
- warn("hesiod_resolve");
- exit(1);
- }
- /* Display the results. */
- for (p = list; *p; p++)
- printf("%s\n", *p);
-
- hesiod_free_list(context, list);
- hesiod_end(context);
- exit(0);
-}
diff --git a/usr.bin/hexdump/Makefile b/usr.bin/hexdump/Makefile
deleted file mode 100644
index 3252fc9..0000000
--- a/usr.bin/hexdump/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= hexdump
-SRCS= conv.c display.c hexdump.c hexsyntax.c odsyntax.c parse.c
-MAN= hexdump.1 od.1
-MLINKS= hexdump.1 hd.1
-LINKS= ${BINDIR}/hexdump ${BINDIR}/od
-LINKS+= ${BINDIR}/hexdump ${BINDIR}/hd
-WARNS?= 6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/hexdump/conv.c b/usr.bin/hexdump/conv.c
deleted file mode 100644
index 96dc2d6..0000000
--- a/usr.bin/hexdump/conv.c
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char sccsid[] = "@(#)conv.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <assert.h>
-#include <ctype.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <wchar.h>
-#include <wctype.h>
-#include "hexdump.h"
-
-void
-conv_c(PR *pr, u_char *p, size_t bufsize)
-{
- char buf[10];
- char const *str;
- wchar_t wc;
- size_t clen, oclen;
- int converr, pad, width;
- char peekbuf[MB_LEN_MAX];
-
- if (pr->mbleft > 0) {
- str = "**";
- pr->mbleft--;
- goto strpr;
- }
-
- switch(*p) {
- case '\0':
- str = "\\0";
- goto strpr;
- /* case '\a': */
- case '\007':
- str = "\\a";
- goto strpr;
- case '\b':
- str = "\\b";
- goto strpr;
- case '\f':
- str = "\\f";
- goto strpr;
- case '\n':
- str = "\\n";
- goto strpr;
- case '\r':
- str = "\\r";
- goto strpr;
- case '\t':
- str = "\\t";
- goto strpr;
- case '\v':
- str = "\\v";
- goto strpr;
- default:
- break;
- }
- /*
- * Multibyte characters are disabled for hexdump(1) for backwards
- * compatibility and consistency (none of its other output formats
- * recognize them correctly).
- */
- converr = 0;
- if (odmode && MB_CUR_MAX > 1) {
- oclen = 0;
-retry:
- clen = mbrtowc(&wc, p, bufsize, &pr->mbstate);
- if (clen == 0)
- clen = 1;
- else if (clen == (size_t)-1 || (clen == (size_t)-2 &&
- buf == peekbuf)) {
- memset(&pr->mbstate, 0, sizeof(pr->mbstate));
- wc = *p;
- clen = 1;
- converr = 1;
- } else if (clen == (size_t)-2) {
- /*
- * Incomplete character; peek ahead and see if we
- * can complete it.
- */
- oclen = bufsize;
- bufsize = peek(p = peekbuf, MB_CUR_MAX);
- goto retry;
- }
- clen += oclen;
- } else {
- wc = *p;
- clen = 1;
- }
- if (!converr && iswprint(wc)) {
- if (!odmode) {
- *pr->cchar = 'c';
- (void)printf(pr->fmt, (int)wc);
- } else {
- *pr->cchar = 'C';
- assert(strcmp(pr->fmt, "%3C") == 0);
- width = wcwidth(wc);
- assert(width >= 0);
- pad = 3 - width;
- if (pad < 0)
- pad = 0;
- (void)printf("%*s%C", pad, "", wc);
- pr->mbleft = clen - 1;
- }
- } else {
- (void)sprintf(buf, "%03o", (int)*p);
- str = buf;
-strpr: *pr->cchar = 's';
- (void)printf(pr->fmt, str);
- }
-}
-
-void
-conv_u(PR *pr, u_char *p)
-{
- static char const * list[] = {
- "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
- "bs", "ht", "lf", "vt", "ff", "cr", "so", "si",
- "dle", "dcl", "dc2", "dc3", "dc4", "nak", "syn", "etb",
- "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
- };
-
- /* od used nl, not lf */
- if (*p <= 0x1f) {
- *pr->cchar = 's';
- if (odmode && *p == 0x0a)
- (void)printf(pr->fmt, "nl");
- else
- (void)printf(pr->fmt, list[*p]);
- } else if (*p == 0x7f) {
- *pr->cchar = 's';
- (void)printf(pr->fmt, "del");
- } else if (odmode && *p == 0x20) { /* od replaced space with sp */
- *pr->cchar = 's';
- (void)printf(pr->fmt, " sp");
- } else if (isprint(*p)) {
- *pr->cchar = 'c';
- (void)printf(pr->fmt, *p);
- } else {
- *pr->cchar = 'x';
- (void)printf(pr->fmt, (int)*p);
- }
-}
diff --git a/usr.bin/hexdump/display.c b/usr.bin/hexdump/display.c
deleted file mode 100644
index db04c49..0000000
--- a/usr.bin/hexdump/display.c
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)display.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/stat.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "hexdump.h"
-
-enum _vflag vflag = FIRST;
-
-static off_t address; /* address/offset in stream */
-static off_t eaddress; /* end address */
-
-static void print(PR *, u_char *);
-
-void
-display(void)
-{
- FS *fs;
- FU *fu;
- PR *pr;
- int cnt;
- u_char *bp;
- off_t saveaddress;
- u_char savech, *savebp;
-
- savech = 0;
- while ((bp = get()))
- for (fs = fshead, savebp = bp, saveaddress = address; fs;
- fs = fs->nextfs, bp = savebp, address = saveaddress)
- for (fu = fs->nextfu; fu; fu = fu->nextfu) {
- if (fu->flags&F_IGNORE)
- break;
- for (cnt = fu->reps; cnt; --cnt)
- for (pr = fu->nextpr; pr; address += pr->bcnt,
- bp += pr->bcnt, pr = pr->nextpr) {
- if (eaddress && address >= eaddress &&
- !(pr->flags & (F_TEXT|F_BPAD)))
- bpad(pr);
- if (cnt == 1 && pr->nospace) {
- savech = *pr->nospace;
- *pr->nospace = '\0';
- }
- print(pr, bp);
- if (cnt == 1 && pr->nospace)
- *pr->nospace = savech;
- }
- }
- if (endfu) {
- /*
- * If eaddress not set, error or file size was multiple of
- * blocksize, and no partial block ever found.
- */
- if (!eaddress) {
- if (!address)
- return;
- eaddress = address;
- }
- for (pr = endfu->nextpr; pr; pr = pr->nextpr)
- switch(pr->flags) {
- case F_ADDRESS:
- (void)printf(pr->fmt, (quad_t)eaddress);
- break;
- case F_TEXT:
- (void)printf("%s", pr->fmt);
- break;
- }
- }
-}
-
-static void
-print(PR *pr, u_char *bp)
-{
- long double ldbl;
- double f8;
- float f4;
- int16_t s2;
- int8_t s8;
- int32_t s4;
- u_int16_t u2;
- u_int32_t u4;
- u_int64_t u8;
-
- switch(pr->flags) {
- case F_ADDRESS:
- (void)printf(pr->fmt, (quad_t)address);
- break;
- case F_BPAD:
- (void)printf(pr->fmt, "");
- break;
- case F_C:
- conv_c(pr, bp, eaddress ? eaddress - address :
- blocksize - address % blocksize);
- break;
- case F_CHAR:
- (void)printf(pr->fmt, *bp);
- break;
- case F_DBL:
- switch(pr->bcnt) {
- case 4:
- bcopy(bp, &f4, sizeof(f4));
- (void)printf(pr->fmt, f4);
- break;
- case 8:
- bcopy(bp, &f8, sizeof(f8));
- (void)printf(pr->fmt, f8);
- break;
- default:
- if (pr->bcnt == sizeof(long double)) {
- bcopy(bp, &ldbl, sizeof(ldbl));
- (void)printf(pr->fmt, ldbl);
- }
- break;
- }
- break;
- case F_INT:
- switch(pr->bcnt) {
- case 1:
- (void)printf(pr->fmt, (quad_t)(signed char)*bp);
- break;
- case 2:
- bcopy(bp, &s2, sizeof(s2));
- (void)printf(pr->fmt, (quad_t)s2);
- break;
- case 4:
- bcopy(bp, &s4, sizeof(s4));
- (void)printf(pr->fmt, (quad_t)s4);
- break;
- case 8:
- bcopy(bp, &s8, sizeof(s8));
- (void)printf(pr->fmt, s8);
- break;
- }
- break;
- case F_P:
- (void)printf(pr->fmt, isprint(*bp) ? *bp : '.');
- break;
- case F_STR:
- (void)printf(pr->fmt, (char *)bp);
- break;
- case F_TEXT:
- (void)printf("%s", pr->fmt);
- break;
- case F_U:
- conv_u(pr, bp);
- break;
- case F_UINT:
- switch(pr->bcnt) {
- case 1:
- (void)printf(pr->fmt, (u_quad_t)*bp);
- break;
- case 2:
- bcopy(bp, &u2, sizeof(u2));
- (void)printf(pr->fmt, (u_quad_t)u2);
- break;
- case 4:
- bcopy(bp, &u4, sizeof(u4));
- (void)printf(pr->fmt, (u_quad_t)u4);
- break;
- case 8:
- bcopy(bp, &u8, sizeof(u8));
- (void)printf(pr->fmt, u8);
- break;
- }
- break;
- }
-}
-
-void
-bpad(PR *pr)
-{
- static char const *spec = " -0+#";
- char *p1, *p2;
-
- /*
- * Remove all conversion flags; '-' is the only one valid
- * with %s, and it's not useful here.
- */
- pr->flags = F_BPAD;
- pr->cchar[0] = 's';
- pr->cchar[1] = '\0';
- for (p1 = pr->fmt; *p1 != '%'; ++p1);
- for (p2 = ++p1; *p1 && index(spec, *p1); ++p1);
- while ((*p2++ = *p1++));
-}
-
-static char **_argv;
-
-u_char *
-get(void)
-{
- static int ateof = 1;
- static u_char *curp, *savp;
- int n;
- int need, nread;
- int valid_save = 0;
- u_char *tmpp;
-
- if (!curp) {
- if ((curp = calloc(1, blocksize)) == NULL)
- err(1, NULL);
- if ((savp = calloc(1, blocksize)) == NULL)
- err(1, NULL);
- } else {
- tmpp = curp;
- curp = savp;
- savp = tmpp;
- address += blocksize;
- valid_save = 1;
- }
- for (need = blocksize, nread = 0;;) {
- /*
- * if read the right number of bytes, or at EOF for one file,
- * and no other files are available, zero-pad the rest of the
- * block and set the end flag.
- */
- if (!length || (ateof && !next((char **)NULL))) {
- if (odmode && address < skip)
- errx(1, "cannot skip past end of input");
- if (need == blocksize)
- return((u_char *)NULL);
- /*
- * XXX bcmp() is not quite right in the presence
- * of multibyte characters.
- */
- if (vflag != ALL &&
- valid_save &&
- bcmp(curp, savp, nread) == 0) {
- if (vflag != DUP)
- (void)printf("*\n");
- return((u_char *)NULL);
- }
- bzero((char *)curp + nread, need);
- eaddress = address + nread;
- return(curp);
- }
- n = fread((char *)curp + nread, sizeof(u_char),
- length == -1 ? need : MIN(length, need), stdin);
- if (!n) {
- if (ferror(stdin))
- warn("%s", _argv[-1]);
- ateof = 1;
- continue;
- }
- ateof = 0;
- if (length != -1)
- length -= n;
- if (!(need -= n)) {
- /*
- * XXX bcmp() is not quite right in the presence
- * of multibyte characters.
- */
- if (vflag == ALL || vflag == FIRST ||
- valid_save == 0 ||
- bcmp(curp, savp, blocksize) != 0) {
- if (vflag == DUP || vflag == FIRST)
- vflag = WAIT;
- return(curp);
- }
- if (vflag == WAIT)
- (void)printf("*\n");
- vflag = DUP;
- address += blocksize;
- need = blocksize;
- nread = 0;
- }
- else
- nread += n;
- }
-}
-
-size_t
-peek(u_char *buf, size_t nbytes)
-{
- size_t n, nread;
- int c;
-
- if (length != -1 && nbytes > (unsigned int)length)
- nbytes = length;
- nread = 0;
- while (nread < nbytes && (c = getchar()) != EOF) {
- *buf++ = c;
- nread++;
- }
- n = nread;
- while (n-- > 0) {
- c = *--buf;
- ungetc(c, stdin);
- }
- return (nread);
-}
-
-int
-next(char **argv)
-{
- static int done;
- int statok;
-
- if (argv) {
- _argv = argv;
- return(1);
- }
- for (;;) {
- if (*_argv) {
- done = 1;
- if (!(freopen(*_argv, "r", stdin))) {
- warn("%s", *_argv);
- exitval = 1;
- ++_argv;
- continue;
- }
- statok = 1;
- } else {
- if (done++)
- return(0);
- statok = 0;
- }
- if (skip)
- doskip(statok ? *_argv : "stdin", statok);
- if (*_argv)
- ++_argv;
- if (!skip)
- return(1);
- }
- /* NOTREACHED */
-}
-
-void
-doskip(const char *fname, int statok)
-{
- int cnt;
- struct stat sb;
-
- if (statok) {
- if (fstat(fileno(stdin), &sb))
- err(1, "%s", fname);
- if (S_ISREG(sb.st_mode) && skip >= sb.st_size) {
- address += sb.st_size;
- skip -= sb.st_size;
- return;
- }
- }
- if (S_ISREG(sb.st_mode)) {
- if (fseeko(stdin, skip, SEEK_SET))
- err(1, "%s", fname);
- address += skip;
- skip = 0;
- } else {
- for (cnt = 0; cnt < skip; ++cnt)
- if (getchar() == EOF)
- break;
- address += cnt;
- skip -= cnt;
- }
-}
diff --git a/usr.bin/hexdump/hexdump.1 b/usr.bin/hexdump/hexdump.1
deleted file mode 100644
index 4d8c2da..0000000
--- a/usr.bin/hexdump/hexdump.1
+++ /dev/null
@@ -1,351 +0,0 @@
-.\" Copyright (c) 1989, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)hexdump.1 8.2 (Berkeley) 4/18/94
-.\" $FreeBSD$
-.\"
-.Dd July 10, 2004
-.Dt HEXDUMP 1
-.Os
-.Sh NAME
-.Nm hexdump , hd
-.Nd ASCII, decimal, hexadecimal, octal dump
-.Sh SYNOPSIS
-.Nm
-.Op Fl bcCdovx
-.Op Fl e Ar format_string
-.Op Fl f Ar format_file
-.Op Fl n Ar length
-.Bk -words
-.Op Fl s Ar skip
-.Ek
-.Ar
-.Nm hd
-.Op Fl bcdovx
-.Op Fl e Ar format_string
-.Op Fl f Ar format_file
-.Op Fl n Ar length
-.Bk -words
-.Op Fl s Ar skip
-.Ek
-.Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility is a filter which displays the specified files, or
-the standard input, if no files are specified, in a user specified
-format.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl b
-.Em One-byte octal display .
-Display the input offset in hexadecimal, followed by sixteen
-space-separated, three column, zero-filled, bytes of input data,
-in octal, per line.
-.It Fl c
-.Em One-byte character display .
-Display the input offset in hexadecimal, followed by sixteen
-space-separated, three column, space-filled, characters of input
-data per line.
-.It Fl C
-.Em Canonical hex+ASCII display .
-Display the input offset in hexadecimal, followed by sixteen
-space-separated, two column, hexadecimal bytes, followed by the
-same sixteen bytes in %_p format enclosed in ``|'' characters.
-.Pp
-Calling the command
-.Nm hd
-implies this option.
-.It Fl d
-.Em Two-byte decimal display .
-Display the input offset in hexadecimal, followed by eight
-space-separated, five column, zero-filled, two-byte units
-of input data, in unsigned decimal, per line.
-.It Fl e Ar format_string
-Specify a format string to be used for displaying data.
-.It Fl f Ar format_file
-Specify a file that contains one or more newline separated format strings.
-Empty lines and lines whose first non-blank character is a hash mark
-.Pf ( Cm \&# )
-are ignored.
-.It Fl n Ar length
-Interpret only
-.Ar length
-bytes of input.
-.It Fl o
-.Em Two-byte octal display .
-Display the input offset in hexadecimal, followed by eight
-space-separated, six column, zero-filled, two byte quantities of
-input data, in octal, per line.
-.It Fl s Ar offset
-Skip
-.Ar offset
-bytes from the beginning of the input.
-By default,
-.Ar offset
-is interpreted as a decimal number.
-With a leading
-.Cm 0x
-or
-.Cm 0X ,
-.Ar offset
-is interpreted as a hexadecimal number,
-otherwise, with a leading
-.Cm 0 ,
-.Ar offset
-is interpreted as an octal number.
-Appending the character
-.Cm b ,
-.Cm k ,
-or
-.Cm m
-to
-.Ar offset
-causes it to be interpreted as a multiple of
-.Li 512 ,
-.Li 1024 ,
-or
-.Li 1048576 ,
-respectively.
-.It Fl v
-Cause
-.Nm
-to display all input data.
-Without the
-.Fl v
-option, any number of groups of output lines, which would be
-identical to the immediately preceding group of output lines (except
-for the input offsets), are replaced with a line comprised of a
-single asterisk.
-.It Fl x
-.Em Two-byte hexadecimal display .
-Display the input offset in hexadecimal, followed by eight, space
-separated, four column, zero-filled, two-byte quantities of input
-data, in hexadecimal, per line.
-.El
-.Pp
-For each input file,
-.Nm
-sequentially copies the input to standard output, transforming the
-data according to the format strings specified by the
-.Fl e
-and
-.Fl f
-options, in the order that they were specified.
-.Ss Formats
-A format string contains any number of format units, separated by
-whitespace.
-A format unit contains up to three items: an iteration count, a byte
-count, and a format.
-.Pp
-The iteration count is an optional positive integer, which defaults to
-one.
-Each format is applied iteration count times.
-.Pp
-The byte count is an optional positive integer.
-If specified it defines the number of bytes to be interpreted by
-each iteration of the format.
-.Pp
-If an iteration count and/or a byte count is specified, a single slash
-must be placed after the iteration count and/or before the byte count
-to disambiguate them.
-Any whitespace before or after the slash is ignored.
-.Pp
-The format is required and must be surrounded by double quote
-(" ") marks.
-It is interpreted as a fprintf-style format string (see
-.Xr fprintf 3 ) ,
-with the
-following exceptions:
-.Bl -bullet -offset indent
-.It
-An asterisk (*) may not be used as a field width or precision.
-.It
-A byte count or field precision
-.Em is
-required for each ``s'' conversion
-character (unlike the
-.Xr fprintf 3
-default which prints the entire string if the precision is unspecified).
-.It
-The conversion characters ``h'', ``l'', ``n'', ``p'' and ``q'' are
-not supported.
-.It
-The single character escape sequences
-described in the C standard are supported:
-.Bd -ragged -offset indent -compact
-.Bl -column <alert_character>
-.It "NUL \e0
-.It "<alert character> \ea
-.It "<backspace> \eb
-.It "<form-feed> \ef
-.It "<newline> \en
-.It "<carriage return> \er
-.It "<tab> \et
-.It "<vertical tab> \ev
-.El
-.Ed
-.El
-.Pp
-The
-.Nm
-utility also supports the following additional conversion strings:
-.Bl -tag -width Fl
-.It Cm \&_a Ns Op Cm dox
-Display the input offset, cumulative across input files, of the
-next byte to be displayed.
-The appended characters
-.Cm d ,
-.Cm o ,
-and
-.Cm x
-specify the display base
-as decimal, octal or hexadecimal respectively.
-.It Cm \&_A Ns Op Cm dox
-Identical to the
-.Cm \&_a
-conversion string except that it is only performed
-once, when all of the input data has been processed.
-.It Cm \&_c
-Output characters in the default character set.
-Nonprinting characters are displayed in three character, zero-padded
-octal, except for those representable by standard escape notation
-(see above),
-which are displayed as two character strings.
-.It Cm _p
-Output characters in the default character set.
-Nonprinting characters are displayed as a single
-.Dq Cm \&. .
-.It Cm _u
-Output US
-.Tn ASCII
-characters, with the exception that control characters are
-displayed using the following, lower-case, names.
-Characters greater than 0xff, hexadecimal, are displayed as hexadecimal
-strings.
-.Bl -column \&000_nu \&001_so \&002_st \&003_et \&004_eo
-.It "\&000\ NUL\t001\ SOH\t002\ STX\t003\ ETX\t004\ EOT\t005\ ENQ
-.It "\&006\ ACK\t007\ BEL\t008\ BS\t009\ HT\t00A\ LF\t00B\ VT
-.It "\&00C\ FF\t00D\ CR\t00E\ SO\t00F\ SI\t010\ DLE\t011\ DC1
-.It "\&012\ DC2\t013\ DC3\t014\ DC4\t015\ NAK\t016\ SYN\t017\ ETB
-.It "\&018\ CAN\t019\ EM\t01A\ SUB\t01B\ ESC\t01C\ FS\t01D\ GS
-.It "\&01E\ RS\t01F\ US\t0FF\ DEL
-.El
-.El
-.Pp
-The default and supported byte counts for the conversion characters
-are as follows:
-.Bl -tag -width "Xc,_Xc,_Xc,_Xc,_Xc,_Xc" -offset indent
-.It Li \&%_c , \&%_p , \&%_u , \&%c
-One byte counts only.
-.It Xo
-.Li \&%d , \&%i , \&%o ,
-.Li \&%u , \&%X , \&%x
-.Xc
-Four byte default, one, two and four byte counts supported.
-.It Xo
-.Li \&%E , \&%e , \&%f ,
-.Li \&%G , \&%g
-.Xc
-Eight byte default, four and twelve byte counts supported.
-.El
-.Pp
-The amount of data interpreted by each format string is the sum of the
-data required by each format unit, which is the iteration count times the
-byte count, or the iteration count times the number of bytes required by
-the format if the byte count is not specified.
-.Pp
-The input is manipulated in ``blocks'', where a block is defined as the
-largest amount of data specified by any format string.
-Format strings interpreting less than an input block's worth of data,
-whose last format unit both interprets some number of bytes and does
-not have a specified iteration count, have the iteration count
-incremented until the entire input block has been processed or there
-is not enough data remaining in the block to satisfy the format string.
-.Pp
-If, either as a result of user specification or
-.Nm
-modifying
-the iteration count as described above, an iteration count is
-greater than one, no trailing whitespace characters are output
-during the last iteration.
-.Pp
-It is an error to specify a byte count as well as multiple conversion
-characters or strings unless all but one of the conversion characters
-or strings is
-.Cm \&_a
-or
-.Cm \&_A .
-.Pp
-If, as a result of the specification of the
-.Fl n
-option or end-of-file being reached, input data only partially
-satisfies a format string, the input block is zero-padded sufficiently
-to display all available data (i.e., any format units overlapping the
-end of data will display some number of the zero bytes).
-.Pp
-Further output by such format strings is replaced by an equivalent
-number of spaces.
-An equivalent number of spaces is defined as the number of spaces
-output by an
-.Cm s
-conversion character with the same field width
-and precision as the original conversion character or conversion
-string but with any
-.Dq Li \&+ ,
-.Dq \&\ \& ,
-.Dq Li \&#
-conversion flag characters
-removed, and referencing a NULL string.
-.Pp
-If no format strings are specified, the default display is equivalent
-to specifying the
-.Fl x
-option.
-.Sh EXIT STATUS
-.Ex -std hexdump hd
-.Sh EXAMPLES
-Display the input in perusal format:
-.Bd -literal -offset indent
-"%06.6_ao " 12/1 "%3_u "
-"\et\et" "%_p "
-"\en"
-.Ed
-.Pp
-Implement the \-x option:
-.Bd -literal -offset indent
-"%07.7_Ax\en"
-"%07.7_ax " 8/2 "%04x " "\en"
-.Ed
-.Sh SEE ALSO
-.Xr gdb 1 ,
-.Xr od 1
diff --git a/usr.bin/hexdump/hexdump.c b/usr.bin/hexdump/hexdump.c
deleted file mode 100644
index 2ed7c4b..0000000
--- a/usr.bin/hexdump/hexdump.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1989, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)hexdump.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <locale.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include "hexdump.h"
-
-FS *fshead; /* head of format strings */
-int blocksize; /* data block size */
-int exitval; /* final exit value */
-int length = -1; /* max bytes to read */
-
-int
-main(int argc, char *argv[])
-{
- FS *tfs;
- char *p;
-
- (void)setlocale(LC_ALL, "");
-
- if (!(p = rindex(argv[0], 'o')) || strcmp(p, "od"))
- newsyntax(argc, &argv);
- else
- oldsyntax(argc, &argv);
-
- /* figure out the data block size */
- for (blocksize = 0, tfs = fshead; tfs; tfs = tfs->nextfs) {
- tfs->bcnt = size(tfs);
- if (blocksize < tfs->bcnt)
- blocksize = tfs->bcnt;
- }
- /* rewrite the rules, do syntax checking */
- for (tfs = fshead; tfs; tfs = tfs->nextfs)
- rewrite(tfs);
-
- (void)next(argv);
- display();
- exit(exitval);
-}
diff --git a/usr.bin/hexdump/hexdump.h b/usr.bin/hexdump/hexdump.h
deleted file mode 100644
index 9a1198f..0000000
--- a/usr.bin/hexdump/hexdump.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)hexdump.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#include <wchar.h>
-
-typedef struct _pr {
- struct _pr *nextpr; /* next print unit */
-#define F_ADDRESS 0x001 /* print offset */
-#define F_BPAD 0x002 /* blank pad */
-#define F_C 0x004 /* %_c */
-#define F_CHAR 0x008 /* %c */
-#define F_DBL 0x010 /* %[EefGf] */
-#define F_INT 0x020 /* %[di] */
-#define F_P 0x040 /* %_p */
-#define F_STR 0x080 /* %s */
-#define F_U 0x100 /* %_u */
-#define F_UINT 0x200 /* %[ouXx] */
-#define F_TEXT 0x400 /* no conversions */
- u_int flags; /* flag values */
- int bcnt; /* byte count */
- char *cchar; /* conversion character */
- char *fmt; /* printf format */
- char *nospace; /* no whitespace version */
- int mbleft; /* bytes left of multibyte char. */
- mbstate_t mbstate; /* conversion state */
-} PR;
-
-typedef struct _fu {
- struct _fu *nextfu; /* next format unit */
- struct _pr *nextpr; /* next print unit */
-#define F_IGNORE 0x01 /* %_A */
-#define F_SETREP 0x02 /* rep count set, not default */
- u_int flags; /* flag values */
- int reps; /* repetition count */
- int bcnt; /* byte count */
- char *fmt; /* format string */
-} FU;
-
-typedef struct _fs { /* format strings */
- struct _fs *nextfs; /* linked list of format strings */
- struct _fu *nextfu; /* linked list of format units */
- int bcnt;
-} FS;
-
-extern FS *fshead; /* head of format strings list */
-extern FU *endfu; /* format at end-of-data */
-extern int blocksize; /* data block size */
-extern int exitval; /* final exit value */
-extern int odmode; /* are we acting as od(1)? */
-extern int length; /* amount of data to read */
-extern off_t skip; /* amount of data to skip at start */
-enum _vflag { ALL, DUP, FIRST, WAIT }; /* -v values */
-extern enum _vflag vflag;
-
-void add(const char *);
-void addfile(char *);
-void badcnt(char *);
-void badconv(char *);
-void badfmt(const char *);
-void badsfmt(void);
-void bpad(PR *);
-void conv_c(PR *, u_char *, size_t);
-void conv_u(PR *, u_char *);
-void display(void);
-void doskip(const char *, int);
-void escape(char *);
-u_char *get(void);
-void newsyntax(int, char ***);
-int next(char **);
-void nomem(void);
-void oldsyntax(int, char ***);
-size_t peek(u_char *, size_t);
-void rewrite(FS *);
-int size(FS *);
-void usage(void);
diff --git a/usr.bin/hexdump/hexsyntax.c b/usr.bin/hexdump/hexsyntax.c
deleted file mode 100644
index 4d21611..0000000
--- a/usr.bin/hexdump/hexsyntax.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)hexsyntax.c 8.2 (Berkeley) 5/4/95";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "hexdump.h"
-
-off_t skip; /* bytes to skip */
-
-void
-newsyntax(int argc, char ***argvp)
-{
- int ch;
- char *p, **argv;
-
- argv = *argvp;
- if ((p = rindex(argv[0], 'h')) != NULL &&
- strcmp(p, "hd") == 0) {
- /* "Canonical" format, implies -C. */
- add("\"%08.8_Ax\n\"");
- add("\"%08.8_ax \" 8/1 \"%02x \" \" \" 8/1 \"%02x \" ");
- add("\" |\" 16/1 \"%_p\" \"|\\n\"");
- }
- while ((ch = getopt(argc, argv, "bcCde:f:n:os:vx")) != -1)
- switch (ch) {
- case 'b':
- add("\"%07.7_Ax\n\"");
- add("\"%07.7_ax \" 16/1 \"%03o \" \"\\n\"");
- break;
- case 'c':
- add("\"%07.7_Ax\n\"");
- add("\"%07.7_ax \" 16/1 \"%3_c \" \"\\n\"");
- break;
- case 'C':
- add("\"%08.8_Ax\n\"");
- add("\"%08.8_ax \" 8/1 \"%02x \" \" \" 8/1 \"%02x \" ");
- add("\" |\" 16/1 \"%_p\" \"|\\n\"");
- break;
- case 'd':
- add("\"%07.7_Ax\n\"");
- add("\"%07.7_ax \" 8/2 \" %05u \" \"\\n\"");
- break;
- case 'e':
- add(optarg);
- break;
- case 'f':
- addfile(optarg);
- break;
- case 'n':
- if ((length = atoi(optarg)) < 0)
- errx(1, "%s: bad length value", optarg);
- break;
- case 'o':
- add("\"%07.7_Ax\n\"");
- add("\"%07.7_ax \" 8/2 \" %06o \" \"\\n\"");
- break;
- case 's':
- if ((skip = strtoll(optarg, &p, 0)) < 0)
- errx(1, "%s: bad skip value", optarg);
- switch(*p) {
- case 'b':
- skip *= 512;
- break;
- case 'k':
- skip *= 1024;
- break;
- case 'm':
- skip *= 1048576;
- break;
- }
- break;
- case 'v':
- vflag = ALL;
- break;
- case 'x':
- add("\"%07.7_Ax\n\"");
- add("\"%07.7_ax \" 8/2 \" %04x \" \"\\n\"");
- break;
- case '?':
- usage();
- }
-
- if (!fshead) {
- add("\"%07.7_Ax\n\"");
- add("\"%07.7_ax \" 8/2 \"%04x \" \"\\n\"");
- }
-
- *argvp += optind;
-}
-
-void
-usage(void)
-{
- (void)fprintf(stderr, "%s\n%s\n%s\n%s\n",
-"usage: hexdump [-bcCdovx] [-e fmt] [-f fmt_file] [-n length]",
-" [-s skip] [file ...]",
-" hd [-bcdovx] [-e fmt] [-f fmt_file] [-n length]",
-" [-s skip] [file ...]");
- exit(1);
-}
diff --git a/usr.bin/hexdump/od.1 b/usr.bin/hexdump/od.1
deleted file mode 100644
index 9bf7967..0000000
--- a/usr.bin/hexdump/od.1
+++ /dev/null
@@ -1,268 +0,0 @@
-.\" Copyright (c) 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)od.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd December 24, 2006
-.Os
-.Dt OD 1
-.Sh NAME
-.Nm od
-.Nd octal, decimal, hex, ASCII dump
-.Sh SYNOPSIS
-.Nm
-.Op Fl aBbcDdeFfHhIiLlOosvXx
-.Op Fl A Ar base
-.Op Fl j Ar skip
-.Op Fl N Ar length
-.Op Fl t Ar type
-.Op Oo Cm + Oc Ns Ar offset Ns Oo Cm \&. Oc Ns Op Cm Bb
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility is a filter which displays the specified files, or standard
-input if no files are specified, in a user specified format.
-.Pp
-The options are as follows:
-.Bl -tag -width ".Fl I , L , l"
-.It Fl A Ar base
-Specify the input address base.
-The argument
-.Ar base
-may be one of
-.Cm d ,
-.Cm o ,
-.Cm x
-or
-.Cm n ,
-which specify decimal, octal, hexadecimal
-addresses or no address, respectively.
-.It Fl a
-Output named characters.
-Equivalent to
-.Fl t Cm a .
-.It Fl B , o
-Output octal shorts.
-Equivalent to
-.Fl t Cm o2 .
-.It Fl b
-Output octal bytes.
-Equivalent to
-.Fl t Cm o1 .
-.It Fl c
-Output C-style escaped characters.
-Equivalent to
-.Fl t Cm c .
-.It Fl D
-Output unsigned decimal ints.
-Equivalent to
-.Fl t Cm u4 .
-.It Fl d
-Output unsigned decimal shorts.
-Equivalent to
-.Fl t Cm u2 .
-.It Fl e , F
-Output double-precision floating point numbers.
-Equivalent to
-.Fl t Cm fD .
-.It Fl f
-Output single-precision floating point numbers.
-Equivalent to
-.Fl t Cm fF .
-.It Fl H , X
-Output hexadecimal ints.
-Equivalent to
-.Fl t Cm x4 .
-.It Fl h , x
-Output hexadecimal shorts.
-Equivalent to
-.Fl t Cm x2 .
-.It Fl I , L , l
-Output signed decimal longs.
-Equivalent to
-.Fl t Cm dL .
-.It Fl i
-Output signed decimal ints.
-Equivalent to
-.Fl t Cm dI .
-.It Fl j Ar skip
-Skip
-.Ar skip
-bytes of the combined input before dumping.
-The number may be followed by one
-of
-.Cm b , k
-or
-.Cm m
-which specify the units of the number as blocks (512 bytes), kilobytes and
-megabytes, respectively.
-.It Fl N Ar length
-Dump at most
-.Ar length
-bytes of input.
-.It Fl O
-Output octal ints.
-Equivalent to
-.Fl t Cm o4 .
-.It Fl s
-Output signed decimal shorts.
-Equivalent to
-.Fl t Cm d2 .
-.It Fl t Ar type
-Specify the output format.
-The
-.Ar type
-argument
-is a string containing one or more of the following kinds of type specifiers:
-.Bl -tag -width indent
-.It Cm a
-Named characters
-.Pq Tn ASCII .
-Control characters are displayed using the following names:
-.Bl -column "000 NUL" "001 SOH" "002 STX" "003 ETX" "004 EOT" "005 ENQ"
-.It "000 NUL 001 SOH 002 STX 003 ETX 004 EOT 005 ENQ"
-.It "006 ACK 007 BEL 008 BS 009 HT 00a NL 00b VT"
-.It "00c FF 00d CR 00e SO 00f SI 010 DLE 011 DC1"
-.It "012 DC2 013 DC3 014 DC4 015 NAK 016 SYN 017 ETB"
-.It "018 CAN 019 EM 01a SUB 01b ESC 01c FS 01d GS"
-.It "01e RS 01f US 020 SP 0ff DEL"
-.El
-.It Cm c
-Characters in the default character set.
-Non-printing characters are
-represented as 3-digit octal character codes, except the following
-characters, which are represented as C escapes:
-.Pp
-.Bl -tag -width carriage-return -compact
-.It NUL
-\e0
-.It alert
-\ea
-.It backspace
-\eb
-.It newline
-\en
-.It carriage-return
-\er
-.It tab
-\et
-.It vertical tab
-\ev
-.El
-.Pp
-Multi-byte characters are displayed in the area corresponding to the first
-byte of the character.
-The remaining bytes are shown as
-.Ql ** .
-.It Xo
-.Sm off
-.Op Cm d | o | u | x
-.Op Cm C | S | I | L | Ar n
-.Sm on
-.Xc
-Signed decimal
-.Pq Cm d ,
-octal
-.Pq Cm o ,
-unsigned decimal
-.Pq Cm u
-or
-hexadecimal
-.Pq Cm x .
-Followed by an optional size specifier, which may be either
-.Cm C
-.Pq Vt char ,
-.Cm S
-.Pq Vt short ,
-.Cm I
-.Pq Vt int ,
-.Cm L
-.Pq Vt long ,
-or a byte count as a decimal integer.
-.It Xo
-.Sm off
-.Cm f
-.Op Cm F | D | L | Ar n
-.Sm on
-.Xc
-Floating-point number.
-Followed by an optional size specifier, which may be either
-.Cm F
-.Pq Vt float ,
-.Cm D
-.Pq Vt double
-or
-.Cm L
-.Pq Vt "long double" .
-.El
-.It Fl v
-Write all input data, instead of replacing lines of duplicate values with a
-.Ql * .
-.El
-.Pp
-Multiple options that specify output format may be used; the output will
-contain one line for each format.
-.Pp
-If no output format is specified,
-.Fl t Cm oS
-is assumed.
-.Sh ENVIRONMENT
-The
-.Ev LANG , LC_ALL
-and
-.Ev LC_CTYPE
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Sh EXIT STATUS
-.Ex -std
-.Sh COMPATIBILITY
-The traditional
-.Fl s
-option to extract string constants is not supported; consider using
-.Xr strings 1
-instead.
-.Sh SEE ALSO
-.Xr hexdump 1 ,
-.Xr strings 1
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-.Sh HISTORY
-An
-.Nm
-command appeared in
-.At v1 .
diff --git a/usr.bin/hexdump/odsyntax.c b/usr.bin/hexdump/odsyntax.c
deleted file mode 100644
index e0f9283..0000000
--- a/usr.bin/hexdump/odsyntax.c
+++ /dev/null
@@ -1,442 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)odsyntax.c 8.2 (Berkeley) 5/4/95";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <float.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "hexdump.h"
-
-#define PADDING " "
-
-int odmode;
-
-static void odadd(const char *);
-static void odformat(const char *);
-static const char *odformatfp(char, const char *);
-static const char *odformatint(char, const char *);
-static void odoffset(int, char ***);
-static void odusage(void);
-
-void
-oldsyntax(int argc, char ***argvp)
-{
- static char empty[] = "", padding[] = PADDING;
- int ch;
- char **argv, *end;
-
- /* Add initial (default) address format. -A may change it later. */
-#define TYPE_OFFSET 7
- add("\"%07.7_Ao\n\"");
- add("\"%07.7_ao \"");
-
- odmode = 1;
- argv = *argvp;
- while ((ch = getopt(argc, argv, "A:aBbcDdeFfHhIij:LlN:Oost:vXx")) != -1)
- switch (ch) {
- case 'A':
- switch (*optarg) {
- case 'd': case 'o': case 'x':
- fshead->nextfu->fmt[TYPE_OFFSET] = *optarg;
- fshead->nextfs->nextfu->fmt[TYPE_OFFSET] =
- *optarg;
- break;
- case 'n':
- fshead->nextfu->fmt = empty;
- fshead->nextfs->nextfu->fmt = padding;
- break;
- default:
- errx(1, "%s: invalid address base", optarg);
- }
- break;
- case 'a':
- odformat("a");
- break;
- case 'B':
- case 'o':
- odformat("o2");
- break;
- case 'b':
- odformat("o1");
- break;
- case 'c':
- odformat("c");
- break;
- case 'd':
- odformat("u2");
- break;
- case 'D':
- odformat("u4");
- break;
- case 'e': /* undocumented in od */
- case 'F':
- odformat("fD");
- break;
- case 'f':
- odformat("fF");
- break;
- case 'H':
- case 'X':
- odformat("x4");
- break;
- case 'h':
- case 'x':
- odformat("x2");
- break;
- case 'I':
- case 'L':
- case 'l':
- odformat("dL");
- break;
- case 'i':
- odformat("dI");
- break;
- case 'j':
- errno = 0;
- skip = strtoll(optarg, &end, 0);
- if (*end == 'b')
- skip *= 512;
- else if (*end == 'k')
- skip *= 1024;
- else if (*end == 'm')
- skip *= 1048576L;
- if (errno != 0 || skip < 0 || strlen(end) > 1)
- errx(1, "%s: invalid skip amount", optarg);
- break;
- case 'N':
- if ((length = atoi(optarg)) <= 0)
- errx(1, "%s: invalid length", optarg);
- break;
- case 'O':
- odformat("o4");
- break;
- case 's':
- odformat("d2");
- break;
- case 't':
- odformat(optarg);
- break;
- case 'v':
- vflag = ALL;
- break;
- case '?':
- default:
- odusage();
- }
-
- if (fshead->nextfs->nextfs == NULL)
- odformat("oS");
-
- argc -= optind;
- *argvp += optind;
-
- if (argc)
- odoffset(argc, argvp);
-}
-
-static void
-odusage(void)
-{
-
- fprintf(stderr,
-"usage: od [-aBbcDdeFfHhIiLlOosvXx] [-A base] [-j skip] [-N length] [-t type]\n");
- fprintf(stderr,
-" [[+]offset[.][Bb]] [file ...]\n");
- exit(1);
-}
-
-static void
-odoffset(int argc, char ***argvp)
-{
- char *p, *num, *end;
- int base;
-
- /*
- * The offset syntax of od(1) was genuinely bizarre. First, if
- * it started with a plus it had to be an offset. Otherwise, if
- * there were at least two arguments, a number or lower-case 'x'
- * followed by a number makes it an offset. By default it was
- * octal; if it started with 'x' or '0x' it was hex. If it ended
- * in a '.', it was decimal. If a 'b' or 'B' was appended, it
- * multiplied the number by 512 or 1024 byte units. There was
- * no way to assign a block count to a hex offset.
- *
- * We assume it's a file if the offset is bad.
- */
- p = argc == 1 ? (*argvp)[0] : (*argvp)[1];
-
- if (*p != '+' && (argc < 2 ||
- (!isdigit(p[0]) && (p[0] != 'x' || !isxdigit(p[1])))))
- return;
-
- base = 0;
- /*
- * skip over leading '+', 'x[0-9a-fA-f]' or '0x', and
- * set base.
- */
- if (p[0] == '+')
- ++p;
- if (p[0] == 'x' && isxdigit(p[1])) {
- ++p;
- base = 16;
- } else if (p[0] == '0' && p[1] == 'x') {
- p += 2;
- base = 16;
- }
-
- /* skip over the number */
- if (base == 16)
- for (num = p; isxdigit(*p); ++p);
- else
- for (num = p; isdigit(*p); ++p);
-
- /* check for no number */
- if (num == p)
- return;
-
- /* if terminates with a '.', base is decimal */
- if (*p == '.') {
- if (base)
- return;
- base = 10;
- }
-
- skip = strtoll(num, &end, base ? base : 8);
-
- /* if end isn't the same as p, we got a non-octal digit */
- if (end != p) {
- skip = 0;
- return;
- }
-
- if (*p) {
- if (*p == 'B') {
- skip *= 1024;
- ++p;
- } else if (*p == 'b') {
- skip *= 512;
- ++p;
- }
- }
-
- if (*p) {
- skip = 0;
- return;
- }
-
- /*
- * If the offset uses a non-octal base, the base of the offset
- * is changed as well. This isn't pretty, but it's easy.
- */
- if (base == 16) {
- fshead->nextfu->fmt[TYPE_OFFSET] = 'x';
- fshead->nextfs->nextfu->fmt[TYPE_OFFSET] = 'x';
- } else if (base == 10) {
- fshead->nextfu->fmt[TYPE_OFFSET] = 'd';
- fshead->nextfs->nextfu->fmt[TYPE_OFFSET] = 'd';
- }
-
- /* Terminate file list. */
- (*argvp)[1] = NULL;
-}
-
-static void
-odformat(const char *fmt)
-{
- char fchar;
-
- while (*fmt != '\0') {
- switch ((fchar = *fmt++)) {
- case 'a':
- odadd("16/1 \"%3_u \" \"\\n\"");
- break;
- case 'c':
- odadd("16/1 \"%3_c \" \"\\n\"");
- break;
- case 'o': case 'u': case 'd': case 'x':
- fmt = odformatint(fchar, fmt);
- break;
- case 'f':
- fmt = odformatfp(fchar, fmt);
- break;
- default:
- errx(1, "%c: unrecognised format character", fchar);
- }
- }
-}
-
-static const char *
-odformatfp(char fchar __unused, const char *fmt)
-{
- size_t isize;
- int digits;
- char *end, *hdfmt;
-
- isize = sizeof(double);
- switch (*fmt) {
- case 'F':
- isize = sizeof(float);
- fmt++;
- break;
- case 'D':
- isize = sizeof(double);
- fmt++;
- break;
- case 'L':
- isize = sizeof(long double);
- fmt++;
- break;
- default:
- if (isdigit((unsigned char)*fmt)) {
- errno = 0;
- isize = (size_t)strtoul(fmt, &end, 10);
- if (errno != 0 || isize == 0)
- errx(1, "%s: invalid size", fmt);
- fmt = (const char *)end;
- }
- }
- switch (isize) {
- case sizeof(float):
- digits = FLT_DIG;
- break;
- case sizeof(double):
- digits = DBL_DIG;
- break;
- default:
- if (isize == sizeof(long double))
- digits = LDBL_DIG;
- else
- errx(1, "unsupported floating point size %lu",
- (u_long)isize);
- }
-
- asprintf(&hdfmt, "%lu/%lu \" %%%d.%de \" \"\\n\"",
- 16UL / (u_long)isize, (u_long)isize, digits + 8, digits);
- if (hdfmt == NULL)
- err(1, NULL);
- odadd(hdfmt);
- free(hdfmt);
-
- return (fmt);
-}
-
-static const char *
-odformatint(char fchar, const char *fmt)
-{
- unsigned long long n;
- size_t isize;
- int digits;
- char *end, *hdfmt;
-
- isize = sizeof(int);
- switch (*fmt) {
- case 'C':
- isize = sizeof(char);
- fmt++;
- break;
- case 'I':
- isize = sizeof(int);
- fmt++;
- break;
- case 'L':
- isize = sizeof(long);
- fmt++;
- break;
- case 'S':
- isize = sizeof(short);
- fmt++;
- break;
- default:
- if (isdigit((unsigned char)*fmt)) {
- errno = 0;
- isize = (size_t)strtoul(fmt, &end, 10);
- if (errno != 0 || isize == 0)
- errx(1, "%s: invalid size", fmt);
- if (isize != sizeof(char) && isize != sizeof(short) &&
- isize != sizeof(int) && isize != sizeof(long))
- errx(1, "unsupported int size %lu",
- (u_long)isize);
- fmt = (const char *)end;
- }
- }
-
- /*
- * Calculate the maximum number of digits we need to
- * fit the number. Overestimate for decimal with log
- * base 8. We need one extra space for signed numbers
- * to store the sign.
- */
- n = (1ULL << (8 * isize)) - 1;
- digits = 0;
- while (n != 0) {
- digits++;
- n >>= (fchar == 'x') ? 4 : 3;
- }
- if (fchar == 'd')
- digits++;
- asprintf(&hdfmt, "%lu/%lu \"%*s%%%s%d%c\" \"\\n\"",
- 16UL / (u_long)isize, (u_long)isize, (int)(4 * isize - digits),
- "", (fchar == 'd' || fchar == 'u') ? "" : "0", digits, fchar);
- if (hdfmt == NULL)
- err(1, NULL);
- odadd(hdfmt);
- free(hdfmt);
-
- return (fmt);
-}
-
-static void
-odadd(const char *fmt)
-{
- static int needpad;
-
- if (needpad)
- add("\""PADDING"\"");
- add(fmt);
- needpad = 1;
-}
diff --git a/usr.bin/hexdump/parse.c b/usr.bin/hexdump/parse.c
deleted file mode 100644
index ef19278..0000000
--- a/usr.bin/hexdump/parse.c
+++ /dev/null
@@ -1,515 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)parse.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <err.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <string.h>
-#include "hexdump.h"
-
-FU *endfu; /* format at end-of-data */
-
-void
-addfile(char *name)
-{
- unsigned char *p;
- FILE *fp;
- int ch;
- char buf[2048 + 1];
-
- if ((fp = fopen(name, "r")) == NULL)
- err(1, "%s", name);
- while (fgets(buf, sizeof(buf), fp)) {
- if (!(p = index(buf, '\n'))) {
- warnx("line too long");
- while ((ch = getchar()) != '\n' && ch != EOF);
- continue;
- }
- *p = '\0';
- for (p = buf; *p && isspace(*p); ++p);
- if (!*p || *p == '#')
- continue;
- add(p);
- }
- (void)fclose(fp);
-}
-
-void
-add(const char *fmt)
-{
- unsigned const char *p, *savep;
- static FS **nextfs;
- FS *tfs;
- FU *tfu, **nextfu;
-
- /* start new linked list of format units */
- if ((tfs = calloc(1, sizeof(FS))) == NULL)
- err(1, NULL);
- if (!fshead)
- fshead = tfs;
- else
- *nextfs = tfs;
- nextfs = &tfs->nextfs;
- nextfu = &tfs->nextfu;
-
- /* take the format string and break it up into format units */
- for (p = fmt;;) {
- /* skip leading white space */
- for (; isspace(*p); ++p);
- if (!*p)
- break;
-
- /* allocate a new format unit and link it in */
- if ((tfu = calloc(1, sizeof(FU))) == NULL)
- err(1, NULL);
- *nextfu = tfu;
- nextfu = &tfu->nextfu;
- tfu->reps = 1;
-
- /* if leading digit, repetition count */
- if (isdigit(*p)) {
- for (savep = p; isdigit(*p); ++p);
- if (!isspace(*p) && *p != '/')
- badfmt(fmt);
- /* may overwrite either white space or slash */
- tfu->reps = atoi(savep);
- tfu->flags = F_SETREP;
- /* skip trailing white space */
- for (++p; isspace(*p); ++p);
- }
-
- /* skip slash and trailing white space */
- if (*p == '/')
- while (isspace(*++p));
-
- /* byte count */
- if (isdigit(*p)) {
- for (savep = p; isdigit(*p); ++p);
- if (!isspace(*p))
- badfmt(fmt);
- tfu->bcnt = atoi(savep);
- /* skip trailing white space */
- for (++p; isspace(*p); ++p);
- }
-
- /* format */
- if (*p != '"')
- badfmt(fmt);
- for (savep = ++p; *p != '"';)
- if (*p++ == 0)
- badfmt(fmt);
- if (!(tfu->fmt = malloc(p - savep + 1)))
- err(1, NULL);
- (void) strncpy(tfu->fmt, savep, p - savep);
- tfu->fmt[p - savep] = '\0';
- escape(tfu->fmt);
- p++;
- }
-}
-
-static const char *spec = ".#-+ 0123456789";
-
-int
-size(FS *fs)
-{
- FU *fu;
- int bcnt, cursize;
- unsigned char *fmt;
- int prec;
-
- /* figure out the data block size needed for each format unit */
- for (cursize = 0, fu = fs->nextfu; fu; fu = fu->nextfu) {
- if (fu->bcnt) {
- cursize += fu->bcnt * fu->reps;
- continue;
- }
- for (bcnt = prec = 0, fmt = fu->fmt; *fmt; ++fmt) {
- if (*fmt != '%')
- continue;
- /*
- * skip any special chars -- save precision in
- * case it's a %s format.
- */
- while (index(spec + 1, *++fmt));
- if (*fmt == '.' && isdigit(*++fmt)) {
- prec = atoi(fmt);
- while (isdigit(*++fmt));
- }
- switch(*fmt) {
- case 'c':
- bcnt += 1;
- break;
- case 'd': case 'i': case 'o': case 'u':
- case 'x': case 'X':
- bcnt += 4;
- break;
- case 'e': case 'E': case 'f': case 'g': case 'G':
- bcnt += 8;
- break;
- case 's':
- bcnt += prec;
- break;
- case '_':
- switch(*++fmt) {
- case 'c': case 'p': case 'u':
- bcnt += 1;
- break;
- }
- }
- }
- cursize += bcnt * fu->reps;
- }
- return (cursize);
-}
-
-void
-rewrite(FS *fs)
-{
- enum { NOTOKAY, USEBCNT, USEPREC } sokay;
- PR *pr, **nextpr;
- FU *fu;
- unsigned char *p1, *p2, *fmtp;
- char savech, cs[3];
- int nconv, prec;
- size_t len;
-
- nextpr = NULL;
- prec = 0;
-
- for (fu = fs->nextfu; fu; fu = fu->nextfu) {
- /*
- * Break each format unit into print units; each conversion
- * character gets its own.
- */
- for (nconv = 0, fmtp = fu->fmt; *fmtp; nextpr = &pr->nextpr) {
- if ((pr = calloc(1, sizeof(PR))) == NULL)
- err(1, NULL);
- if (!fu->nextpr)
- fu->nextpr = pr;
- else
- *nextpr = pr;
-
- /* Skip preceding text and up to the next % sign. */
- for (p1 = fmtp; *p1 && *p1 != '%'; ++p1);
-
- /* Only text in the string. */
- if (!*p1) {
- pr->fmt = fmtp;
- pr->flags = F_TEXT;
- break;
- }
-
- /*
- * Get precision for %s -- if have a byte count, don't
- * need it.
- */
- if (fu->bcnt) {
- sokay = USEBCNT;
- /* Skip to conversion character. */
- for (++p1; index(spec, *p1); ++p1);
- } else {
- /* Skip any special chars, field width. */
- while (index(spec + 1, *++p1));
- if (*p1 == '.' && isdigit(*++p1)) {
- sokay = USEPREC;
- prec = atoi(p1);
- while (isdigit(*++p1));
- } else
- sokay = NOTOKAY;
- }
-
- p2 = p1 + 1; /* Set end pointer. */
- cs[0] = *p1; /* Set conversion string. */
- cs[1] = '\0';
-
- /*
- * Figure out the byte count for each conversion;
- * rewrite the format as necessary, set up blank-
- * padding for end of data.
- */
- switch(cs[0]) {
- case 'c':
- pr->flags = F_CHAR;
- switch(fu->bcnt) {
- case 0: case 1:
- pr->bcnt = 1;
- break;
- default:
- p1[1] = '\0';
- badcnt(p1);
- }
- break;
- case 'd': case 'i':
- pr->flags = F_INT;
- goto isint;
- case 'o': case 'u': case 'x': case 'X':
- pr->flags = F_UINT;
-isint: cs[2] = '\0';
- cs[1] = cs[0];
- cs[0] = 'q';
- switch(fu->bcnt) {
- case 0: case 4:
- pr->bcnt = 4;
- break;
- case 1:
- pr->bcnt = 1;
- break;
- case 2:
- pr->bcnt = 2;
- break;
- default:
- p1[1] = '\0';
- badcnt(p1);
- }
- break;
- case 'e': case 'E': case 'f': case 'g': case 'G':
- pr->flags = F_DBL;
- switch(fu->bcnt) {
- case 0: case 8:
- pr->bcnt = 8;
- break;
- case 4:
- pr->bcnt = 4;
- break;
- default:
- if (fu->bcnt == sizeof(long double)) {
- cs[2] = '\0';
- cs[1] = cs[0];
- cs[0] = 'L';
- pr->bcnt = sizeof(long double);
- } else {
- p1[1] = '\0';
- badcnt(p1);
- }
- }
- break;
- case 's':
- pr->flags = F_STR;
- switch(sokay) {
- case NOTOKAY:
- badsfmt();
- case USEBCNT:
- pr->bcnt = fu->bcnt;
- break;
- case USEPREC:
- pr->bcnt = prec;
- break;
- }
- break;
- case '_':
- ++p2;
- switch(p1[1]) {
- case 'A':
- endfu = fu;
- fu->flags |= F_IGNORE;
- /* FALLTHROUGH */
- case 'a':
- pr->flags = F_ADDRESS;
- ++p2;
- switch(p1[2]) {
- case 'd': case 'o': case'x':
- cs[0] = 'q';
- cs[1] = p1[2];
- cs[2] = '\0';
- break;
- default:
- p1[3] = '\0';
- badconv(p1);
- }
- break;
- case 'c':
- pr->flags = F_C;
- /* cs[0] = 'c'; set in conv_c */
- goto isint2;
- case 'p':
- pr->flags = F_P;
- cs[0] = 'c';
- goto isint2;
- case 'u':
- pr->flags = F_U;
- /* cs[0] = 'c'; set in conv_u */
-isint2: switch(fu->bcnt) {
- case 0: case 1:
- pr->bcnt = 1;
- break;
- default:
- p1[2] = '\0';
- badcnt(p1);
- }
- break;
- default:
- p1[2] = '\0';
- badconv(p1);
- }
- break;
- default:
- p1[1] = '\0';
- badconv(p1);
- }
-
- /*
- * Copy to PR format string, set conversion character
- * pointer, update original.
- */
- savech = *p2;
- p1[0] = '\0';
- len = strlen(fmtp) + strlen(cs) + 1;
- if ((pr->fmt = calloc(1, len)) == NULL)
- err(1, NULL);
- snprintf(pr->fmt, len, "%s%s", fmtp, cs);
- *p2 = savech;
- pr->cchar = pr->fmt + (p1 - fmtp);
- fmtp = p2;
-
- /* Only one conversion character if byte count. */
- if (!(pr->flags&F_ADDRESS) && fu->bcnt && nconv++)
- errx(1, "byte count with multiple conversion characters");
- }
- /*
- * If format unit byte count not specified, figure it out
- * so can adjust rep count later.
- */
- if (!fu->bcnt)
- for (pr = fu->nextpr; pr; pr = pr->nextpr)
- fu->bcnt += pr->bcnt;
- }
- /*
- * If the format string interprets any data at all, and it's
- * not the same as the blocksize, and its last format unit
- * interprets any data at all, and has no iteration count,
- * repeat it as necessary.
- *
- * If, rep count is greater than 1, no trailing whitespace
- * gets output from the last iteration of the format unit.
- */
- for (fu = fs->nextfu; fu; fu = fu->nextfu) {
- if (!fu->nextfu && fs->bcnt < blocksize &&
- !(fu->flags&F_SETREP) && fu->bcnt)
- fu->reps += (blocksize - fs->bcnt) / fu->bcnt;
- if (fu->reps > 1) {
- for (pr = fu->nextpr;; pr = pr->nextpr)
- if (!pr->nextpr)
- break;
- for (p1 = pr->fmt, p2 = NULL; *p1; ++p1)
- p2 = isspace(*p1) ? p1 : NULL;
- if (p2)
- pr->nospace = p2;
- }
- }
-#ifdef DEBUG
- for (fu = fs->nextfu; fu; fu = fu->nextfu) {
- (void)printf("fmt:");
- for (pr = fu->nextpr; pr; pr = pr->nextpr)
- (void)printf(" {%s}", pr->fmt);
- (void)printf("\n");
- }
-#endif
-}
-
-void
-escape(char *p1)
-{
- char *p2;
-
- /* alphabetic escape sequences have to be done in place */
- for (p2 = p1;; ++p1, ++p2) {
- if (!*p1) {
- *p2 = *p1;
- break;
- }
- if (*p1 == '\\')
- switch(*++p1) {
- case 'a':
- /* *p2 = '\a'; */
- *p2 = '\007';
- break;
- case 'b':
- *p2 = '\b';
- break;
- case 'f':
- *p2 = '\f';
- break;
- case 'n':
- *p2 = '\n';
- break;
- case 'r':
- *p2 = '\r';
- break;
- case 't':
- *p2 = '\t';
- break;
- case 'v':
- *p2 = '\v';
- break;
- default:
- *p2 = *p1;
- break;
- }
- }
-}
-
-void
-badcnt(char *s)
-{
- errx(1, "%s: bad byte count", s);
-}
-
-void
-badsfmt(void)
-{
- errx(1, "%%s: requires a precision or a byte count");
-}
-
-void
-badfmt(const char *fmt)
-{
- errx(1, "\"%s\": bad format", fmt);
-}
-
-void
-badconv(char *ch)
-{
- errx(1, "%%%s: bad conversion character", ch);
-}
diff --git a/usr.bin/host/Makefile b/usr.bin/host/Makefile
deleted file mode 100644
index 9861914..0000000
--- a/usr.bin/host/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-# $FreeBSD$
-
-BIND_DIR= ${.CURDIR}/../../contrib/bind9
-LIB_BIND_REL= ../../lib/bind
-LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
-SRCDIR= ${BIND_DIR}/bin/dig
-
-.include "${LIB_BIND_DIR}/config.mk"
-
-PROG= host
-
-.PATH: ${SRCDIR}
-SRCS+= dighost.c host.c
-
-CFLAGS+= -I${SRCDIR}/include
-CFLAGS+= -I${BIND_DIR}/lib/isc/${ISC_ATOMIC_ARCH}/include
-
-DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
-LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/id/Makefile b/usr.bin/id/Makefile
deleted file mode 100644
index 96c162f..0000000
--- a/usr.bin/id/Makefile
+++ /dev/null
@@ -1,18 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-.include <bsd.own.mk>
-
-PROG= id
-WARNS?= 6
-LINKS= ${BINDIR}/id ${BINDIR}/groups
-LINKS+= ${BINDIR}/id ${BINDIR}/whoami
-MAN= id.1 groups.1 whoami.1
-
-.if ${MK_AUDIT} != "no"
-CFLAGS+= -DUSE_BSM_AUDIT
-DPADD+= ${LIBBSM}
-LDADD+= -lbsm
-.endif
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/id/groups.1 b/usr.bin/id/groups.1
deleted file mode 100644
index 771b0d0..0000000
--- a/usr.bin/id/groups.1
+++ /dev/null
@@ -1,63 +0,0 @@
-.\" Copyright (c) 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)groups.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 6, 1993
-.Dt GROUPS 1
-.Os
-.Sh NAME
-.Nm groups
-.Nd show group memberships
-.Sh SYNOPSIS
-.Nm
-.Op Ar user
-.Sh DESCRIPTION
-The
-.Nm
-utility has been obsoleted by the
-.Xr id 1
-utility, and is equivalent to
-.Dq Nm id Fl Gn Op Ar user .
-The command
-.Dq Nm id Fl p
-is suggested for normal interactive use.
-.Pp
-The
-.Nm
-utility displays the groups to which you (or the optionally specified
-.Ar user )
-belong.
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr id 1
diff --git a/usr.bin/id/id.1 b/usr.bin/id/id.1
deleted file mode 100644
index b14e4e5..0000000
--- a/usr.bin/id/id.1
+++ /dev/null
@@ -1,162 +0,0 @@
-.\" Copyright (c) 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)id.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd September 26, 2006
-.Dt ID 1
-.Os
-.Sh NAME
-.Nm id
-.Nd return user identity
-.Sh SYNOPSIS
-.Nm
-.Op Ar user
-.Nm
-.Fl A
-.Nm
-.Fl G Op Fl n
-.Op Ar user
-.Nm
-.Fl M
-.Nm
-.Fl P
-.Op Ar user
-.Nm
-.Fl g Op Fl nr
-.Op Ar user
-.Nm
-.Fl p
-.Op Ar user
-.Nm
-.Fl u Op Fl nr
-.Op Ar user
-.Sh DESCRIPTION
-The
-.Nm
-utility displays the user and group names and numeric IDs, of the
-calling process, to the standard output.
-If the real and effective IDs are different, both are displayed,
-otherwise only the real ID is displayed.
-.Pp
-If a
-.Ar user
-(login name or user ID)
-is specified, the user and group IDs of that user are displayed.
-In this case, the real and effective IDs are assumed to be the same.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl A
-Display the process audit user ID and other process audit properties, which
-requires privilege.
-.It Fl G
-Display the different group IDs (effective, real and supplementary)
-as white-space separated numbers, in no particular order.
-.It Fl M
-Display the MAC label of the current process.
-.It Fl P
-Display the id as a password file entry.
-.It Fl a
-Ignored for compatibility with other
-.Nm
-implementations.
-.It Fl g
-Display the effective group ID as a number.
-.It Fl n
-Display the name of the user or group ID for the
-.Fl G ,
-.Fl g
-and
-.Fl u
-options instead of the number.
-If any of the ID numbers cannot be mapped into names, the number will be
-displayed as usual.
-.It Fl p
-Make the output human-readable.
-If the user name returned by
-.Xr getlogin 2
-is different from the login name referenced by the user ID, the name
-returned by
-.Xr getlogin 2
-is displayed, preceded by the keyword
-.Dq login .
-The user ID as a name is displayed, preceded by the keyword
-.Dq uid .
-If the effective user ID is different from the real user ID, the real user
-ID is displayed as a name, preceded by the keyword
-.Dq euid .
-If the effective group ID is different from the real group ID, the real group
-ID is displayed as a name, preceded by the keyword
-.Dq rgid .
-The list of groups to which the user belongs is then displayed as names,
-preceded by the keyword
-.Dq groups .
-Each display is on a separate line.
-.It Fl r
-Display the real ID for the
-.Fl g
-and
-.Fl u
-options instead of the effective ID.
-.It Fl u
-Display the effective user ID as a number.
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr who 1
-.Sh STANDARDS
-The
-.Nm
-function is expected to conform to
-.St -p1003.2 .
-.Sh HISTORY
-The
-historic
-.Xr groups 1
-command is equivalent to
-.Dq Nm id Fl Gn Op Ar user .
-.Pp
-The
-historic
-.Xr whoami 1
-command is equivalent to
-.Dq Nm id Fl un .
-.Pp
-The
-.Nm
-command appeared in
-.Bx 4.4 .
diff --git a/usr.bin/id/id.c b/usr.bin/id/id.c
deleted file mode 100644
index d18e8b0..0000000
--- a/usr.bin/id/id.c
+++ /dev/null
@@ -1,477 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1991, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)id.c 8.2 (Berkeley) 2/16/94";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/mac.h>
-
-#ifdef USE_BSM_AUDIT
-#include <bsm/audit.h>
-#endif
-
-#include <err.h>
-#include <errno.h>
-#include <grp.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-void id_print(struct passwd *, int, int, int);
-void pline(struct passwd *);
-void pretty(struct passwd *);
-void auditid(void);
-void group(struct passwd *, int);
-void maclabel(void);
-void usage(void);
-struct passwd *who(char *);
-
-int isgroups, iswhoami;
-
-int
-main(int argc, char *argv[])
-{
- struct group *gr;
- struct passwd *pw;
- int Gflag, Mflag, Pflag, ch, gflag, id, nflag, pflag, rflag, uflag;
- int Aflag;
- const char *myname;
-
- Gflag = Mflag = Pflag = gflag = nflag = pflag = rflag = uflag = 0;
- Aflag = 0;
-
- myname = strrchr(argv[0], '/');
- myname = (myname != NULL) ? myname + 1 : argv[0];
- if (strcmp(myname, "groups") == 0) {
- isgroups = 1;
- Gflag = nflag = 1;
- }
- else if (strcmp(myname, "whoami") == 0) {
- iswhoami = 1;
- uflag = nflag = 1;
- }
-
- while ((ch = getopt(argc, argv,
- (isgroups || iswhoami) ? "" : "APGMagnpru")) != -1)
- switch(ch) {
-#ifdef USE_BSM_AUDIT
- case 'A':
- Aflag = 1;
- break;
-#endif
- case 'G':
- Gflag = 1;
- break;
- case 'M':
- Mflag = 1;
- break;
- case 'P':
- Pflag = 1;
- break;
- case 'a':
- break;
- case 'g':
- gflag = 1;
- break;
- case 'n':
- nflag = 1;
- break;
- case 'p':
- pflag = 1;
- break;
- case 'r':
- rflag = 1;
- break;
- case 'u':
- uflag = 1;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (iswhoami && argc > 0)
- usage();
-
- switch(Aflag + Gflag + Mflag + Pflag + gflag + pflag + uflag) {
- case 1:
- break;
- case 0:
- if (!nflag && !rflag)
- break;
- /* FALLTHROUGH */
- default:
- usage();
- }
-
- pw = *argv ? who(*argv) : NULL;
-
- if (Mflag && pw != NULL)
- usage();
-
-#ifdef USE_BSM_AUDIT
- if (Aflag) {
- auditid();
- exit(0);
- }
-#endif
-
- if (gflag) {
- id = pw ? pw->pw_gid : rflag ? getgid() : getegid();
- if (nflag && (gr = getgrgid(id)))
- (void)printf("%s\n", gr->gr_name);
- else
- (void)printf("%u\n", id);
- exit(0);
- }
-
- if (uflag) {
- id = pw ? pw->pw_uid : rflag ? getuid() : geteuid();
- if (nflag && (pw = getpwuid(id)))
- (void)printf("%s\n", pw->pw_name);
- else
- (void)printf("%u\n", id);
- exit(0);
- }
-
- if (Gflag) {
- group(pw, nflag);
- exit(0);
- }
-
- if (Mflag) {
- maclabel();
- exit(0);
- }
-
- if (Pflag) {
- pline(pw);
- exit(0);
- }
-
- if (pflag) {
- pretty(pw);
- exit(0);
- }
-
- if (pw) {
- id_print(pw, 1, 0, 0);
- }
- else {
- id = getuid();
- pw = getpwuid(id);
- id_print(pw, 0, 1, 1);
- }
- exit(0);
-}
-
-void
-pretty(struct passwd *pw)
-{
- struct group *gr;
- u_int eid, rid;
- char *login;
-
- if (pw) {
- (void)printf("uid\t%s\n", pw->pw_name);
- (void)printf("groups\t");
- group(pw, 1);
- } else {
- if ((login = getlogin()) == NULL)
- err(1, "getlogin");
-
- pw = getpwuid(rid = getuid());
- if (pw == NULL || strcmp(login, pw->pw_name))
- (void)printf("login\t%s\n", login);
- if (pw)
- (void)printf("uid\t%s\n", pw->pw_name);
- else
- (void)printf("uid\t%u\n", rid);
-
- if ((eid = geteuid()) != rid) {
- if ((pw = getpwuid(eid)))
- (void)printf("euid\t%s\n", pw->pw_name);
- else
- (void)printf("euid\t%u\n", eid);
- }
- if ((rid = getgid()) != (eid = getegid())) {
- if ((gr = getgrgid(rid)))
- (void)printf("rgid\t%s\n", gr->gr_name);
- else
- (void)printf("rgid\t%u\n", rid);
- }
- (void)printf("groups\t");
- group(NULL, 1);
- }
-}
-
-void
-id_print(struct passwd *pw, int use_ggl, int p_euid, int p_egid)
-{
- struct group *gr;
- gid_t gid, egid, lastgid;
- uid_t uid, euid;
- int cnt, ngroups;
- gid_t groups[NGROUPS + 1];
- const char *fmt;
-
- if (pw != NULL) {
- uid = pw->pw_uid;
- gid = pw->pw_gid;
- }
- else {
- uid = getuid();
- gid = getgid();
- }
-
- if (use_ggl && pw != NULL) {
- ngroups = NGROUPS + 1;
- getgrouplist(pw->pw_name, gid, groups, &ngroups);
- }
- else {
- ngroups = getgroups(NGROUPS + 1, groups);
- }
-
- if (pw != NULL)
- printf("uid=%u(%s)", uid, pw->pw_name);
- else
- printf("uid=%u", getuid());
- printf(" gid=%u", gid);
- if ((gr = getgrgid(gid)))
- (void)printf("(%s)", gr->gr_name);
- if (p_euid && (euid = geteuid()) != uid) {
- (void)printf(" euid=%u", euid);
- if ((pw = getpwuid(euid)))
- (void)printf("(%s)", pw->pw_name);
- }
- if (p_egid && (egid = getegid()) != gid) {
- (void)printf(" egid=%u", egid);
- if ((gr = getgrgid(egid)))
- (void)printf("(%s)", gr->gr_name);
- }
- fmt = " groups=%u";
- for (lastgid = -1, cnt = 0; cnt < ngroups; ++cnt) {
- if (lastgid == (gid = groups[cnt]))
- continue;
- printf(fmt, gid);
- fmt = ",%u";
- if ((gr = getgrgid(gid)))
- printf("(%s)", gr->gr_name);
- lastgid = gid;
- }
- printf("\n");
-}
-
-#ifdef USE_BSM_AUDIT
-void
-auditid(void)
-{
- auditinfo_t auditinfo;
- auditinfo_addr_t ainfo_addr;
- int ret, extended;
-
- extended = 0;
- ret = getaudit(&auditinfo);
- if (ret < 0 && errno == E2BIG) {
- if (getaudit_addr(&ainfo_addr, sizeof(ainfo_addr)) < 0)
- err(1, "getaudit_addr");
- extended = 1;
- } else if (ret < 0)
- err(1, "getaudit");
- if (extended != 0) {
- (void) printf("auid=%d\n"
- "mask.success=0x%08x\n"
- "mask.failure=0x%08x\n"
- "asid=%d\n"
- "termid_addr.port=0x%08x\n"
- "termid_addr.addr[0]=0x%08x\n"
- "termid_addr.addr[1]=0x%08x\n"
- "termid_addr.addr[2]=0x%08x\n"
- "termid_addr.addr[3]=0x%08x\n",
- ainfo_addr.ai_auid, ainfo_addr.ai_mask.am_success,
- ainfo_addr.ai_mask.am_failure, ainfo_addr.ai_asid,
- ainfo_addr.ai_termid.at_port,
- ainfo_addr.ai_termid.at_addr[0],
- ainfo_addr.ai_termid.at_addr[1],
- ainfo_addr.ai_termid.at_addr[2],
- ainfo_addr.ai_termid.at_addr[3]);
- } else {
- (void) printf("auid=%d\n"
- "mask.success=0x%08x\n"
- "mask.failure=0x%08x\n"
- "asid=%d\n"
- "termid.port=0x%08x\n"
- "termid.machine=0x%08x\n",
- auditinfo.ai_auid, auditinfo.ai_mask.am_success,
- auditinfo.ai_mask.am_failure,
- auditinfo.ai_asid, auditinfo.ai_termid.port,
- auditinfo.ai_termid.machine);
- }
-}
-#endif
-
-void
-group(struct passwd *pw, int nflag)
-{
- struct group *gr;
- int cnt, id, lastid, ngroups;
- gid_t groups[NGROUPS + 1];
- const char *fmt;
-
- if (pw) {
- ngroups = NGROUPS + 1;
- (void) getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups);
- } else {
- groups[0] = getgid();
- ngroups = getgroups(NGROUPS, groups + 1) + 1;
- }
- fmt = nflag ? "%s" : "%u";
- for (lastid = -1, cnt = 0; cnt < ngroups; ++cnt) {
- if (lastid == (id = groups[cnt]))
- continue;
- if (nflag) {
- if ((gr = getgrgid(id)))
- (void)printf(fmt, gr->gr_name);
- else
- (void)printf(*fmt == ' ' ? " %u" : "%u",
- id);
- fmt = " %s";
- } else {
- (void)printf(fmt, id);
- fmt = " %u";
- }
- lastid = id;
- }
- (void)printf("\n");
-}
-
-void
-maclabel(void)
-{
- char *string;
- mac_t label;
- int error;
-
- error = mac_prepare_process_label(&label);
- if (error == -1)
- errx(1, "mac_prepare_type: %s", strerror(errno));
-
- error = mac_get_proc(label);
- if (error == -1)
- errx(1, "mac_get_proc: %s", strerror(errno));
-
- error = mac_to_text(label, &string);
- if (error == -1)
- errx(1, "mac_to_text: %s", strerror(errno));
-
- (void)printf("%s\n", string);
- mac_free(label);
- free(string);
-}
-
-struct passwd *
-who(char *u)
-{
- struct passwd *pw;
- long id;
- char *ep;
-
- /*
- * Translate user argument into a pw pointer. First, try to
- * get it as specified. If that fails, try it as a number.
- */
- if ((pw = getpwnam(u)))
- return(pw);
- id = strtol(u, &ep, 10);
- if (*u && !*ep && (pw = getpwuid(id)))
- return(pw);
- errx(1, "%s: no such user", u);
- /* NOTREACHED */
-}
-
-void
-pline(struct passwd *pw)
-{
-
- if (!pw) {
- if ((pw = getpwuid(getuid())) == NULL)
- err(1, "getpwuid");
- }
-
- (void)printf("%s:%s:%d:%d:%s:%ld:%ld:%s:%s:%s\n", pw->pw_name,
- pw->pw_passwd, pw->pw_uid, pw->pw_gid, pw->pw_class,
- (long)pw->pw_change, (long)pw->pw_expire, pw->pw_gecos,
- pw->pw_dir, pw->pw_shell);
-}
-
-
-void
-usage(void)
-{
-
- if (isgroups)
- (void)fprintf(stderr, "usage: groups [user]\n");
- else if (iswhoami)
- (void)fprintf(stderr, "usage: whoami\n");
- else
- (void)fprintf(stderr, "%s\n%s%s\n%s\n%s\n%s\n%s\n%s\n",
- "usage: id [user]",
-#ifdef USE_BSM_AUDIT
- " id -A\n",
-#else
- "",
-#endif
- " id -G [-n] [user]",
- " id -M",
- " id -P [user]",
- " id -g [-nr] [user]",
- " id -p [user]",
- " id -u [-nr] [user]");
- exit(1);
-}
diff --git a/usr.bin/id/whoami.1 b/usr.bin/id/whoami.1
deleted file mode 100644
index 958570d..0000000
--- a/usr.bin/id/whoami.1
+++ /dev/null
@@ -1,60 +0,0 @@
-.\" Copyright (c) 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)whoami.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 6, 1993
-.Dt WHOAMI 1
-.Os
-.Sh NAME
-.Nm whoami
-.Nd display effective user id
-.Sh SYNOPSIS
-.Nm
-.Sh DESCRIPTION
-The
-.Nm
-utility has been obsoleted by the
-.Xr id 1
-utility, and is equivalent to
-.Dq Nm id Fl un .
-The command
-.Dq Nm id Fl p
-is suggested for normal interactive use.
-.Pp
-The
-.Nm
-utility displays your effective user ID as a name.
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr id 1
diff --git a/usr.bin/indent/Makefile b/usr.bin/indent/Makefile
deleted file mode 100644
index 8d9ff94..0000000
--- a/usr.bin/indent/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-
-PROG= indent
-SRCS= indent.c io.c lexi.c parse.c pr_comment.c args.c
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/indent/README b/usr.bin/indent/README
deleted file mode 100644
index 03d5d3d..0000000
--- a/usr.bin/indent/README
+++ /dev/null
@@ -1,100 +0,0 @@
-
- $FreeBSD$
-
-This is the C indenter, it originally came from the University of Illinois
-via some distribution tape for PDP-11 Unix. It has subsequently been
-hacked upon by James Gosling @ CMU. It isn't very pretty, and really needs
-to be completely redone, but it is probably the nicest C pretty printer
-around.
-
-Further additions to provide "Kernel Normal Form" were contributed
-by the folks at Sun Microsystems.
-
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-> From mnetor!yunexus!oz@uunet.UU.NET Wed Mar 9 15:30:55 1988
-> Date: Tue, 8 Mar 88 18:36:25 EST
-> From: yunexus!oz@uunet.UU.NET (Ozan Yigit)
-> To: bostic@okeeffe.berkeley.edu
-> Cc: ccvaxa!willcox@uunet.UU.NET, jag@sun.com, rsalz@uunet.UU.NET
-> In-Reply-To: Keith Bostic's message of Tue, 16 Feb 88 16:09:06 PST
-> Subject: Re: Indent...
-
-Thank you for your response about indent. I was wrong in my original
-observation (or mis-observation :-). UCB did keep the Illinois
-copyright intact.
-
-The issue still is whether we can distribute indent, and if we can, which
-version. David Willcox (the author) states that:
-
-| Several people have asked me on what basis I claim that indent is in
-| the public domain. I knew I would be sorry I made that posting.
-|
-| Some history. Way back in 1976, the project I worked on at the
-| University of Illinois Center for Advanced Computation had a huge
-| battle about how to format C code. After about a week of fighting, I
-| got disgusted and wrote a program, which I called indent, to reformat C
-| code. It had a bunch of different options that would let you format
-| the output the way you liked. In particular, all of the different
-| formats being championed were supported.
-|
-| It was my first big C program. It was ugly. It wasn't designed, it
-| just sort of grew. But it pretty much worked, and it stopped most of
-| the fighting.
-|
-| As a matter of form, I included a University of Illinois Copyright
-| notice. However, my understanding was that, since the work was done
-| on an ARPA contract, it was in the public domain.
-|
-| Time passed. Some years later, indent showed up on one of the early
-| emacs distributions.
-|
-| Later still, someone from UC Berkeley called the UofI and asked if
-| indent was in the public domain. They wanted to include it in their
-| UNIX distributions, along with the emacs stuff. I was no longer at the
-| UofI, but Rob Kolstad, who was, asked me about it. I told him I didn't
-| care if they used it, and since then it has been on the BSD distributions.
-|
-| Somewhere along the way, several other unnamed people have had their
-| hands in it. It was converted to understand version 7 C. (The
-| original was version 6.) It was converted from its original filter
-| interface to its current "blow away the user's file" interface.
-| The $HOME/.indent.pro file parsing was added. Some more formatting
-| options were added.
-|
-| The source I have right now has two copyright notices. One is the
-| original from the UofI. One is from Berkeley.
-|
-| I am not a lawyer, and I certainly do not understand copyright law. As
-| far as I am concerned, the bulk of this program, everything covered by
-| the UofI copyright, is in the public domain, and worth every penny.
-| Berkeley's copyright probably should only cover their changes, and I
-| don't know their feelings about sending it out.
-
-In any case, there appears to be none at UofI to clarify/and change
-that copyright, but I am confident (based on the statements of its
-author) that the code, as it stands with its copyright, is
-distributable, and will not cause any legal problems.
-
-Hence, the issue reduces to *which* one to distribute through
-comp.sources.unix. I would suggest that with the permission of you
-folks (given that you have parts copyrighted), we distribute the 4.3
-version of indent, which appears to be the most up-to-date version. I
-happen to have just about every known version of indent, including the
-very original submission from the author to a unix tape, later the
-G-Emacs version, any 4.n version, sun version and the Unipress
-version. I still think we should not have to "go-back-in-time" and
-re-do all the work you people have done.
-
-I hope to hear from you as to what you think about this. You may of
-course send 4.3 version to the moderator directly, or you can let me
-know of your permission, and I will send the sources, or you can let
-me know that 4.3 version is off-limits, in which case we would probably
-have to revert to an older version. One way or another, I hope to get
-a version of indent to comp.sources.unix.
-
-regards.. oz
-
-cc: ccvaxa!willcox
- sun.com!jar
- uunet!rsalz
-
diff --git a/usr.bin/indent/args.c b/usr.bin/indent/args.c
deleted file mode 100644
index f139de5..0000000
--- a/usr.bin/indent/args.c
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Copyright (c) 1985 Sun Microsystems, Inc.
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)args.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Argument scanning and profile reading code. Default parameters are set
- * here as well.
- */
-
-#include <ctype.h>
-#include <err.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "indent_globs.h"
-#include "indent.h"
-
-/* profile types */
-#define PRO_SPECIAL 1 /* special case */
-#define PRO_BOOL 2 /* boolean */
-#define PRO_INT 3 /* integer */
-#define PRO_FONT 4 /* troff font */
-
-/* profile specials for booleans */
-#define ON 1 /* turn it on */
-#define OFF 0 /* turn it off */
-
-/* profile specials for specials */
-#define IGN 1 /* ignore it */
-#define CLI 2 /* case label indent (float) */
-#define STDIN 3 /* use stdin */
-#define KEY 4 /* type (keyword) */
-
-static void scan_profile(FILE *);
-
-const char *option_source = "?";
-
-/*
- * N.B.: because of the way the table here is scanned, options whose names are
- * substrings of other options must occur later; that is, with -lp vs -l, -lp
- * must be first. Also, while (most) booleans occur more than once, the last
- * default value is the one actually assigned.
- */
-struct pro {
- const char *p_name; /* name, e.g. -bl, -cli */
- int p_type; /* type (int, bool, special) */
- int p_default; /* the default value (if int) */
- int p_special; /* depends on type */
- int *p_obj; /* the associated variable */
-} pro[] = {
-
- {"T", PRO_SPECIAL, 0, KEY, 0},
- {"bacc", PRO_BOOL, false, ON, &blanklines_around_conditional_compilation},
- {"badp", PRO_BOOL, false, ON, &blanklines_after_declarations_at_proctop},
- {"bad", PRO_BOOL, false, ON, &blanklines_after_declarations},
- {"bap", PRO_BOOL, false, ON, &blanklines_after_procs},
- {"bbb", PRO_BOOL, false, ON, &blanklines_before_blockcomments},
- {"bc", PRO_BOOL, true, OFF, &ps.leave_comma},
- {"bl", PRO_BOOL, true, OFF, &btype_2},
- {"br", PRO_BOOL, true, ON, &btype_2},
- {"bs", PRO_BOOL, false, ON, &Bill_Shannon},
- {"cdb", PRO_BOOL, true, ON, &comment_delimiter_on_blankline},
- {"cd", PRO_INT, 0, 0, &ps.decl_com_ind},
- {"ce", PRO_BOOL, true, ON, &cuddle_else},
- {"ci", PRO_INT, 0, 0, &continuation_indent},
- {"cli", PRO_SPECIAL, 0, CLI, 0},
- {"c", PRO_INT, 33, 0, &ps.com_ind},
- {"di", PRO_INT, 16, 0, &ps.decl_indent},
- {"dj", PRO_BOOL, false, ON, &ps.ljust_decl},
- {"d", PRO_INT, 0, 0, &ps.unindent_displace},
- {"eei", PRO_BOOL, false, ON, &extra_expression_indent},
- {"ei", PRO_BOOL, true, ON, &ps.else_if},
- {"fbc", PRO_FONT, 0, 0, (int *) &blkcomf},
- {"fbs", PRO_BOOL, true, ON, &function_brace_split},
- {"fbx", PRO_FONT, 0, 0, (int *) &boxcomf},
- {"fb", PRO_FONT, 0, 0, (int *) &bodyf},
- {"fc1", PRO_BOOL, true, ON, &format_col1_comments},
- {"fcb", PRO_BOOL, true, ON, &format_block_comments},
- {"fc", PRO_FONT, 0, 0, (int *) &scomf},
- {"fk", PRO_FONT, 0, 0, (int *) &keywordf},
- {"fs", PRO_FONT, 0, 0, (int *) &stringf},
- {"ip", PRO_BOOL, true, ON, &ps.indent_parameters},
- {"i", PRO_INT, 8, 0, &ps.ind_size},
- {"lc", PRO_INT, 0, 0, &block_comment_max_col},
- {"ldi", PRO_INT, -1, 0, &ps.local_decl_indent},
- {"lp", PRO_BOOL, true, ON, &lineup_to_parens},
- {"l", PRO_INT, 78, 0, &max_col},
- {"nbacc", PRO_BOOL, false, OFF, &blanklines_around_conditional_compilation},
- {"nbadp", PRO_BOOL, false, OFF, &blanklines_after_declarations_at_proctop},
- {"nbad", PRO_BOOL, false, OFF, &blanklines_after_declarations},
- {"nbap", PRO_BOOL, false, OFF, &blanklines_after_procs},
- {"nbbb", PRO_BOOL, false, OFF, &blanklines_before_blockcomments},
- {"nbc", PRO_BOOL, true, ON, &ps.leave_comma},
- {"nbs", PRO_BOOL, false, OFF, &Bill_Shannon},
- {"ncdb", PRO_BOOL, true, OFF, &comment_delimiter_on_blankline},
- {"nce", PRO_BOOL, true, OFF, &cuddle_else},
- {"ndj", PRO_BOOL, false, OFF, &ps.ljust_decl},
- {"neei", PRO_BOOL, false, OFF, &extra_expression_indent},
- {"nei", PRO_BOOL, true, OFF, &ps.else_if},
- {"nfbs", PRO_BOOL, true, OFF, &function_brace_split},
- {"nfc1", PRO_BOOL, true, OFF, &format_col1_comments},
- {"nfcb", PRO_BOOL, true, OFF, &format_block_comments},
- {"nip", PRO_BOOL, true, OFF, &ps.indent_parameters},
- {"nlp", PRO_BOOL, true, OFF, &lineup_to_parens},
- {"npcs", PRO_BOOL, false, OFF, &proc_calls_space},
- {"npro", PRO_SPECIAL, 0, IGN, 0},
- {"npsl", PRO_BOOL, true, OFF, &procnames_start_line},
- {"nps", PRO_BOOL, false, OFF, &pointer_as_binop},
- {"nsc", PRO_BOOL, true, OFF, &star_comment_cont},
- {"nsob", PRO_BOOL, false, OFF, &swallow_optional_blanklines},
- {"nut", PRO_BOOL, true, OFF, &use_tabs},
- {"nv", PRO_BOOL, false, OFF, &verbose},
- {"pcs", PRO_BOOL, false, ON, &proc_calls_space},
- {"psl", PRO_BOOL, true, ON, &procnames_start_line},
- {"ps", PRO_BOOL, false, ON, &pointer_as_binop},
- {"sc", PRO_BOOL, true, ON, &star_comment_cont},
- {"sob", PRO_BOOL, false, ON, &swallow_optional_blanklines},
- {"st", PRO_SPECIAL, 0, STDIN, 0},
- {"troff", PRO_BOOL, false, ON, &troff},
- {"ut", PRO_BOOL, true, ON, &use_tabs},
- {"v", PRO_BOOL, false, ON, &verbose},
- /* whew! */
- {0, 0, 0, 0, 0}
-};
-
-/*
- * set_profile reads $HOME/.indent.pro and ./.indent.pro and handles arguments
- * given in these files.
- */
-void
-set_profile(void)
-{
- FILE *f;
- char fname[PATH_MAX];
- static char prof[] = ".indent.pro";
-
- snprintf(fname, sizeof(fname), "%s/%s", getenv("HOME"), prof);
- if ((f = fopen(option_source = fname, "r")) != NULL) {
- scan_profile(f);
- (void) fclose(f);
- }
- if ((f = fopen(option_source = prof, "r")) != NULL) {
- scan_profile(f);
- (void) fclose(f);
- }
- option_source = "Command line";
-}
-
-static void
-scan_profile(FILE *f)
-{
- int comment, i;
- char *p;
- char buf[BUFSIZ];
-
- while (1) {
- p = buf;
- comment = 0;
- while ((i = getc(f)) != EOF) {
- if (i == '*' && !comment && p > buf && p[-1] == '/') {
- comment = p - buf;
- *p++ = i;
- } else if (i == '/' && comment && p > buf && p[-1] == '*') {
- p = buf + comment - 1;
- comment = 0;
- } else if (isspace(i)) {
- if (p > buf && !comment)
- break;
- } else {
- *p++ = i;
- }
- }
- if (p != buf) {
- *p++ = 0;
- if (verbose)
- printf("profile: %s\n", buf);
- set_option(buf);
- }
- else if (i == EOF)
- return;
- }
-}
-
-const char *param_start;
-
-static int
-eqin(const char *s1, const char *s2)
-{
- while (*s1) {
- if (*s1++ != *s2++)
- return (false);
- }
- param_start = s2;
- return (true);
-}
-
-/*
- * Set the defaults.
- */
-void
-set_defaults(void)
-{
- struct pro *p;
-
- /*
- * Because ps.case_indent is a float, we can't initialize it from the
- * table:
- */
- ps.case_indent = 0.0; /* -cli0.0 */
- for (p = pro; p->p_name; p++)
- if (p->p_type != PRO_SPECIAL && p->p_type != PRO_FONT)
- *p->p_obj = p->p_default;
-}
-
-void
-set_option(char *arg)
-{
- struct pro *p;
-
- arg++; /* ignore leading "-" */
- for (p = pro; p->p_name; p++)
- if (*p->p_name == *arg && eqin(p->p_name, arg))
- goto found;
- errx(1, "%s: unknown parameter \"%s\"", option_source, arg - 1);
-found:
- switch (p->p_type) {
-
- case PRO_SPECIAL:
- switch (p->p_special) {
-
- case IGN:
- break;
-
- case CLI:
- if (*param_start == 0)
- goto need_param;
- ps.case_indent = atof(param_start);
- break;
-
- case STDIN:
- if (input == 0)
- input = stdin;
- if (output == 0)
- output = stdout;
- break;
-
- case KEY:
- if (*param_start == 0)
- goto need_param;
- {
- char *str = strdup(param_start);
- if (str == NULL)
- err(1, NULL);
- addkey(str, 4);
- }
- break;
-
- default:
- errx(1, "set_option: internal error: p_special %d", p->p_special);
- }
- break;
-
- case PRO_BOOL:
- if (p->p_special == OFF)
- *p->p_obj = false;
- else
- *p->p_obj = true;
- break;
-
- case PRO_INT:
- if (!isdigit(*param_start)) {
- need_param:
- errx(1, "%s: ``%s'' requires a parameter", option_source, arg - 1);
- }
- *p->p_obj = atoi(param_start);
- break;
-
- case PRO_FONT:
- parsefont((struct fstate *) p->p_obj, param_start);
- break;
-
- default:
- errx(1, "set_option: internal error: p_type %d", p->p_type);
- }
-}
diff --git a/usr.bin/indent/indent.1 b/usr.bin/indent/indent.1
deleted file mode 100644
index f04e13d..0000000
--- a/usr.bin/indent/indent.1
+++ /dev/null
@@ -1,539 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\" Copyright (c) 1976 Board of Trustees of the University of Illinois.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)indent.1 8.1 (Berkeley) 7/1/93
-.\" $FreeBSD$
-.\"
-.Dd June 29, 2004
-.Dt INDENT 1
-.Os
-.Sh NAME
-.Nm indent
-.Nd indent and format C program source
-.Sh SYNOPSIS
-.Nm
-.Op Ar input-file Op Ar output-file
-.Op Fl bad | Fl nbad
-.Op Fl bap | Fl nbap
-.Bk -words
-.Op Fl bbb | Fl nbbb
-.Ek
-.Op Fl \&bc | Fl nbc
-.Op Fl \&bl
-.Op Fl \&br
-.Op Fl c Ns Ar n
-.Op Fl \&cd Ns Ar n
-.Bk -words
-.Op Fl cdb | Fl ncdb
-.Ek
-.Op Fl \&ce | Fl nce
-.Op Fl \&ci Ns Ar n
-.Op Fl cli Ns Ar n
-.Op Fl d Ns Ar n
-.Op Fl \&di Ns Ar n
-.Bk -words
-.Op Fl fbs | Fl nfbs
-.Op Fl fc1 | Fl nfc1
-.Op Fl fcb | Fl nfcb
-.Ek
-.Op Fl i Ns Ar n
-.Op Fl \&ip | Fl nip
-.Op Fl l Ns Ar n
-.Op Fl \&lc Ns Ar n
-.Op Fl \&ldi Ns Ar n
-.Op Fl \&lp | Fl nlp
-.Op Fl npro
-.Op Fl pcs | Fl npcs
-.Op Fl psl | Fl npsl
-.Op Fl \&sc | Fl nsc
-.Bk -words
-.Op Fl sob | Fl nsob
-.Ek
-.Op Fl \&st
-.Op Fl troff
-.Op Fl ut | Fl nut
-.Op Fl v | Fl \&nv
-.Sh DESCRIPTION
-The
-.Nm
-utility is a
-.Em C
-program formatter.
-It reformats the
-.Em C
-program in the
-.Ar input-file
-according to the switches.
-The switches which can be
-specified are described below.
-They may appear before or after the file
-names.
-.Pp
-.Sy NOTE :
-If you only specify an
-.Ar input-file ,
-the formatting is
-done `in-place', that is, the formatted file is written back into
-.Ar input-file
-and a backup copy of
-.Ar input-file
-is written in the current directory.
-If
-.Ar input-file
-is named
-.Sq Pa /blah/blah/file ,
-the backup file is named
-.Sq Pa file.BAK .
-.Pp
-If
-.Ar output-file
-is specified,
-.Nm
-checks to make sure that it is different from
-.Ar input-file .
-.Pp
-The options listed below control the formatting style imposed by
-.Nm .
-.Bl -tag -width Op
-.It Fl bad , nbad
-If
-.Fl bad
-is specified, a blank line is forced after every block of
-declarations.
-Default:
-.Fl nbad .
-.It Fl bap , nbap
-If
-.Fl bap
-is specified, a blank line is forced after every procedure body.
-Default:
-.Fl nbap .
-.It Fl bbb , nbbb
-If
-.Fl bbb
-is specified, a blank line is forced before every block comment.
-Default:
-.Fl nbbb .
-.It Fl \&bc , nbc
-If
-.Fl \&bc
-is specified, then a newline is forced after each comma in a declaration.
-.Fl nbc
-turns off this option.
-Default:
-.Fl \&nbc .
-.It Fl \&br , \&bl
-Specifying
-.Fl \&bl
-lines-up compound statements like this:
-.Bd -literal -offset indent
-if (...)
-{
- code
-}
-.Ed
-.Pp
-Specifying
-.Fl \&br
-(the default) makes them look like this:
-.Bd -literal -offset indent
-if (...) {
- code
-}
-.Ed
-.Pp
-.It Fl c Ns Ar n
-The column in which comments on code start.
-The default is 33.
-.It Fl cd Ns Ar n
-The column in which comments on declarations start.
-The default
-is for these comments to start in the same column as those on code.
-.It Fl cdb , ncdb
-Enables (disables) the placement of comment delimiters on blank lines.
-With
-this option enabled, comments look like this:
-.Bd -literal -offset indent
- /*
- * this is a comment
- */
-.Ed
-.Pp
-Rather than like this:
-.Bd -literal -offset indent
- /* this is a comment */
-.Ed
-.Pp
-This only affects block comments, not comments to the right of
-code.
-The default is
-.Fl cdb .
-.It Fl ce , nce
-Enables (disables) forcing of `else's to cuddle up to the immediately preceding
-`}'.
-The default is
-.Fl \&ce .
-.It Fl \&ci Ns Ar n
-Sets the continuation indent to be
-.Ar n .
-Continuation
-lines will be indented that far from the beginning of the first line of the
-statement.
-Parenthesized expressions have extra indentation added to
-indicate the nesting, unless
-.Fl \&lp
-is in effect
-or the continuation indent is exactly half of the main indent.
-.Fl \&ci
-defaults to the same value as
-.Fl i .
-.It Fl cli Ns Ar n
-Causes case labels to be indented
-.Ar n
-tab stops to the right of the containing
-.Ic switch
-statement.
-.Fl cli0.5
-causes case labels to be indented half a tab stop.
-The
-default is
-.Fl cli0 .
-.It Fl d Ns Ar n
-Controls the placement of comments which are not to the
-right of code.
-For example,
-.Fl \&d\&1
-means that such comments are placed one indentation level to the
-left of code.
-Specifying the default
-.Fl \&d\&0
-lines-up these comments with the code.
-See the section on comment
-indentation below.
-.It Fl \&di Ns Ar n
-Specifies the indentation, in character positions,
-of global variable names and all struct/union member names
-relative to the beginning of their type declaration.
-The default is
-.Fl di16 .
-.It Fl dj , ndj
-.Fl \&dj
-left justifies declarations.
-.Fl ndj
-indents declarations the same as code.
-The default is
-.Fl ndj .
-.It Fl \&ei , nei
-Enables (disables) special
-.Ic else-if
-processing.
-If it is enabled, an
-.Ic if
-following an
-.Ic else
-will have the same indentation as the preceding
-.Ic \&if
-statement.
-The default is
-.Fl ei .
-.It Fl fbs , nfbs
-Enables (disables) splitting the function declaration and opening brace
-across two lines.
-The default is
-.Fl fbs .
-.It Fl fc1 , nfc1
-Enables (disables) the formatting of comments that start in column 1.
-Often, comments whose leading `/' is in column 1 have been carefully
-hand formatted by the programmer.
-In such cases,
-.Fl nfc1
-should be
-used.
-The default is
-.Fl fc1 .
-.It Fl fcb , nfcb
-Enables (disables) the formatting of block comments (ones that begin
-with `/*\\n').
-Often, block comments have been not so carefully hand formatted by the
-programmer, but reformatting that would just change the line breaks is not
-wanted.
-In such cases,
-.Fl nfcb
-should be used.
-Block comments are then handled like box comments.
-The default is
-.Fl fcb .
-.It Fl i Ns Ar n
-The number of spaces for one indentation level.
-The default is 8.
-.It Fl \&ip , nip
-Enables (disables) the indentation of parameter declarations from the left
-margin.
-The default is
-.Fl \&ip .
-.It Fl l Ns Ar n
-Maximum length of an output line.
-The default is 78.
-.It Fl \&ldi Ns Ar n
-Specifies the indentation, in character positions,
-of local variable names
-relative to the beginning of their type declaration.
-The default is for local variable names to be indented
-by the same amount as global ones.
-.It Fl \&lp , nlp
-Lines-up code surrounded by parenthesis in continuation lines.
-If a line
-has a left paren which is not closed on that line, then continuation lines
-will be lined up to start at the character position just after the left
-paren.
-For example, here is how a piece of continued code looks with
-.Fl nlp
-in effect:
-.Bd -literal -offset indent
-p1 = first_procedure(second_procedure(p2, p3),
-\ \ third_procedure(p4, p5));
-.Ed
-.Pp
-With
-.Fl lp
-in effect (the default) the code looks somewhat clearer:
-.Bd -literal -offset indent
-p1\ =\ first_procedure(second_procedure(p2,\ p3),
-\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ third_procedure(p4,\ p5));
-.Ed
-.Pp
-Inserting two more newlines we get:
-.Bd -literal -offset indent
-p1\ =\ first_procedure(second_procedure(p2,
-\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ p3),
-\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ third_procedure(p4,
-\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ p5));
-.Ed
-.It Fl npro
-Causes the profile files,
-.Sq Pa ./.indent.pro
-and
-.Sq Pa ~/.indent.pro ,
-to be ignored.
-.It Fl pcs , npcs
-If true
-.Pq Fl pcs
-all procedure calls will have a space inserted between
-the name and the `('.
-The default is
-.Fl npcs .
-.It Fl psl , npsl
-If true
-.Pq Fl psl
-the names of procedures being defined are placed in
-column 1 \- their types, if any, will be left on the previous lines.
-The
-default is
-.Fl psl .
-.It Fl \&sc , nsc
-Enables (disables) the placement of asterisks (`*'s) at the left edge of all
-comments.
-The default is
-.Fl sc .
-.It Fl sob , nsob
-If
-.Fl sob
-is specified, indent will swallow optional blank lines.
-You can use this to
-get rid of blank lines after declarations.
-Default:
-.Fl nsob .
-.It Fl \&st
-Causes
-.Nm
-to take its input from stdin and put its output to stdout.
-.It Fl T Ns Ar typename
-Adds
-.Ar typename
-to the list of type keywords.
-Names accumulate:
-.Fl T
-can be specified more than once.
-You need to specify all the typenames that
-appear in your program that are defined by
-.Ic typedef
-\- nothing will be
-harmed if you miss a few, but the program will not be formatted as nicely as
-it should.
-This sounds like a painful thing to have to do, but it is really
-a symptom of a problem in C:
-.Ic typedef
-causes a syntactic change in the
-language and
-.Nm
-cannot find all
-instances of
-.Ic typedef .
-.It Fl troff
-Causes
-.Nm
-to format the program for processing by
-.Xr troff 1 .
-It will produce a fancy
-listing in much the same spirit as
-.Xr vgrind 1 .
-If the output file is not specified, the default is standard output,
-rather than formatting in place.
-.It Fl ut , nut
-Enables (disables) the use of tab characters in the output.
-Tabs are assumed to be aligned on columns divisible by 8.
-The default is
-.Fl ut .
-.It Fl v , \&nv
-.Fl v
-turns on `verbose' mode;
-.Fl \&nv
-turns it off.
-When in verbose mode,
-.Nm
-reports when it splits one line of input into two or more lines of output,
-and gives some size statistics at completion.
-The default is
-.Fl \&nv .
-.El
-.Pp
-You may set up your own `profile' of defaults to
-.Nm
-by creating a file called
-.Pa .indent.pro
-in your login directory and/or the current directory and including
-whatever switches you like.
-A `.indent.pro' in the current directory takes
-precedence over the one in your login directory.
-If
-.Nm
-is run and a profile file exists, then it is read to set up the program's
-defaults.
-Switches on the command line, though, always override profile
-switches.
-The switches should be separated by spaces, tabs or newlines.
-.Pp
-.Ss Comments
-.Sq Em Box
-.Em comments .
-The
-.Nm
-utility
-assumes that any comment with a dash or star immediately after the start of
-comment (that is, `/*\-' or `/**') is a comment surrounded by a box of stars.
-Each line of such a comment is left unchanged, except that its indentation
-may be adjusted to account for the change in indentation of the first line
-of the comment.
-.Pp
-.Em Straight text .
-All other comments are treated as straight text.
-The
-.Nm
-utility fits as many words (separated by blanks, tabs, or newlines) on a
-line as possible.
-Blank lines break paragraphs.
-.Pp
-.Ss Comment indentation
-If a comment is on a line with code it is started in the `comment column',
-which is set by the
-.Fl c Ns Ns Ar n
-command line parameter.
-Otherwise, the comment is started at
-.Ar n
-indentation levels less than where code is currently being placed, where
-.Ar n
-is specified by the
-.Fl d Ns Ns Ar n
-command line parameter.
-If the code on a line extends past the comment
-column, the comment starts further to the right, and the right margin may be
-automatically extended in extreme cases.
-.Pp
-.Ss Preprocessor lines
-In general,
-.Nm
-leaves preprocessor lines alone.
-The only
-reformatting that it will do is to straighten up trailing comments.
-It
-leaves embedded comments alone.
-Conditional compilation
-.Pq Ic #ifdef...#endif
-is recognized and
-.Nm
-attempts to correctly
-compensate for the syntactic peculiarities introduced.
-.Pp
-.Ss C syntax
-The
-.Nm
-utility understands a substantial amount about the syntax of C, but it
-has a `forgiving' parser.
-It attempts to cope with the usual sorts of
-incomplete and misformed syntax.
-In particular, the use of macros like:
-.Pp
-.Dl #define forever for(;;)
-.Pp
-is handled properly.
-.Sh ENVIRONMENT
-The
-.Nm
-utility uses the
-.Ev HOME
-environment variable.
-.Sh FILES
-.Bl -tag -width "./.indent.pro" -compact
-.It Pa ./.indent.pro
-profile file
-.It Pa ~/.indent.pro
-profile file
-.El
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.2 .
-.Sh BUGS
-The
-.Nm
-utility has even more switches than
-.Xr ls 1 .
-.Pp
-A common mistake is to try to indent all the
-.Em C
-programs in a directory by typing:
-.Pp
-.Dl indent *.c
-.Pp
-This is probably a bug, not a feature.
diff --git a/usr.bin/indent/indent.c b/usr.bin/indent/indent.c
deleted file mode 100644
index 9917960..0000000
--- a/usr.bin/indent/indent.c
+++ /dev/null
@@ -1,1234 +0,0 @@
-/*
- * Copyright (c) 1985 Sun Microsystems, Inc.
- * Copyright (c) 1976 Board of Trustees of the University of Illinois.
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1985 Sun Microsystems, Inc.\n\
-@(#) Copyright (c) 1976 Board of Trustees of the University of Illinois.\n\
-@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)indent.c 5.17 (Berkeley) 6/7/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <err.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include "indent_globs.h"
-#include "indent_codes.h"
-#include "indent.h"
-
-static void bakcopy(void);
-
-const char *in_name = "Standard Input"; /* will always point to name of input
- * file */
-const char *out_name = "Standard Output"; /* will always point to name
- * of output file */
-char bakfile[MAXPATHLEN] = "";
-
-int
-main(int argc, char **argv)
-{
-
- int dec_ind; /* current indentation for declarations */
- int di_stack[20]; /* a stack of structure indentation levels */
- int flushed_nl; /* used when buffering up comments to remember
- * that a newline was passed over */
- int force_nl; /* when true, code must be broken */
- int hd_type = 0; /* used to store type of stmt for if (...),
- * for (...), etc */
- int i; /* local loop counter */
- int scase; /* set to true when we see a case, so we will
- * know what to do with the following colon */
- int sp_sw; /* when true, we are in the expression of
- * if(...), while(...), etc. */
- int squest; /* when this is positive, we have seen a ?
- * without the matching : in a <c>?<s>:<s>
- * construct */
- const char *t_ptr; /* used for copying tokens */
- int tabs_to_var; /* true if using tabs to indent to var name */
- int type_code; /* the type of token, returned by lexi */
-
- int last_else = 0; /* true iff last keyword was an else */
-
-
- /*-----------------------------------------------*\
- | INITIALIZATION |
- \*-----------------------------------------------*/
-
- found_err = 0;
-
- ps.p_stack[0] = stmt; /* this is the parser's stack */
- ps.last_nl = true; /* this is true if the last thing scanned was
- * a newline */
- ps.last_token = semicolon;
- combuf = (char *) malloc(bufsize);
- if (combuf == NULL)
- err(1, NULL);
- labbuf = (char *) malloc(bufsize);
- if (labbuf == NULL)
- err(1, NULL);
- codebuf = (char *) malloc(bufsize);
- if (codebuf == NULL)
- err(1, NULL);
- tokenbuf = (char *) malloc(bufsize);
- if (tokenbuf == NULL)
- err(1, NULL);
- l_com = combuf + bufsize - 5;
- l_lab = labbuf + bufsize - 5;
- l_code = codebuf + bufsize - 5;
- l_token = tokenbuf + bufsize - 5;
- combuf[0] = codebuf[0] = labbuf[0] = ' '; /* set up code, label, and
- * comment buffers */
- combuf[1] = codebuf[1] = labbuf[1] = '\0';
- ps.else_if = 1; /* Default else-if special processing to on */
- s_lab = e_lab = labbuf + 1;
- s_code = e_code = codebuf + 1;
- s_com = e_com = combuf + 1;
- s_token = e_token = tokenbuf + 1;
-
- in_buffer = (char *) malloc(10);
- if (in_buffer == NULL)
- err(1, NULL);
- in_buffer_limit = in_buffer + 8;
- buf_ptr = buf_end = in_buffer;
- line_no = 1;
- had_eof = ps.in_decl = ps.decl_on_line = break_comma = false;
- sp_sw = force_nl = false;
- ps.in_or_st = false;
- ps.bl_line = true;
- dec_ind = 0;
- di_stack[ps.dec_nest = 0] = 0;
- ps.want_blank = ps.in_stmt = ps.ind_stmt = false;
-
- scase = ps.pcase = false;
- squest = 0;
- sc_end = 0;
- bp_save = 0;
- be_save = 0;
-
- output = 0;
- tabs_to_var = 0;
-
- /*--------------------------------------------------*\
- | COMMAND LINE SCAN |
- \*--------------------------------------------------*/
-
-#ifdef undef
- max_col = 78; /* -l78 */
- lineup_to_parens = 1; /* -lp */
- ps.ljust_decl = 0; /* -ndj */
- ps.com_ind = 33; /* -c33 */
- star_comment_cont = 1; /* -sc */
- ps.ind_size = 8; /* -i8 */
- verbose = 0;
- ps.decl_indent = 16; /* -di16 */
- ps.local_decl_indent = -1; /* if this is not set to some nonnegative value
- * by an arg, we will set this equal to
- * ps.decl_ind */
- ps.indent_parameters = 1; /* -ip */
- ps.decl_com_ind = 0; /* if this is not set to some positive value
- * by an arg, we will set this equal to
- * ps.com_ind */
- btype_2 = 1; /* -br */
- cuddle_else = 1; /* -ce */
- ps.unindent_displace = 0; /* -d0 */
- ps.case_indent = 0; /* -cli0 */
- format_block_comments = 1; /* -fcb */
- format_col1_comments = 1; /* -fc1 */
- procnames_start_line = 1; /* -psl */
- proc_calls_space = 0; /* -npcs */
- comment_delimiter_on_blankline = 1; /* -cdb */
- ps.leave_comma = 1; /* -nbc */
-#endif
-
- for (i = 1; i < argc; ++i)
- if (strcmp(argv[i], "-npro") == 0)
- break;
- set_defaults();
- if (i >= argc)
- set_profile();
-
- for (i = 1; i < argc; ++i) {
-
- /*
- * look thru args (if any) for changes to defaults
- */
- if (argv[i][0] != '-') {/* no flag on parameter */
- if (input == 0) { /* we must have the input file */
- in_name = argv[i]; /* remember name of input file */
- input = fopen(in_name, "r");
- if (input == 0) /* check for open error */
- err(1, "%s", in_name);
- continue;
- }
- else if (output == 0) { /* we have the output file */
- out_name = argv[i]; /* remember name of output file */
- if (strcmp(in_name, out_name) == 0) { /* attempt to overwrite
- * the file */
- errx(1, "input and output files must be different");
- }
- output = fopen(out_name, "w");
- if (output == 0) /* check for create error */
- err(1, "%s", out_name);
- continue;
- }
- errx(1, "unknown parameter: %s", argv[i]);
- }
- else
- set_option(argv[i]);
- } /* end of for */
- if (input == 0)
- input = stdin;
- if (output == 0) {
- if (troff || input == stdin)
- output = stdout;
- else {
- out_name = in_name;
- bakcopy();
- }
- }
- if (ps.com_ind <= 1)
- ps.com_ind = 2; /* dont put normal comments before column 2 */
- if (troff) {
- if (bodyf.font[0] == 0)
- parsefont(&bodyf, "R");
- if (scomf.font[0] == 0)
- parsefont(&scomf, "I");
- if (blkcomf.font[0] == 0)
- blkcomf = scomf, blkcomf.size += 2;
- if (boxcomf.font[0] == 0)
- boxcomf = blkcomf;
- if (stringf.font[0] == 0)
- parsefont(&stringf, "L");
- if (keywordf.font[0] == 0)
- parsefont(&keywordf, "B");
- writefdef(&bodyf, 'B');
- writefdef(&scomf, 'C');
- writefdef(&blkcomf, 'L');
- writefdef(&boxcomf, 'X');
- writefdef(&stringf, 'S');
- writefdef(&keywordf, 'K');
- }
- if (block_comment_max_col <= 0)
- block_comment_max_col = max_col;
- if (ps.local_decl_indent < 0) /* if not specified by user, set this */
- ps.local_decl_indent = ps.decl_indent;
- if (ps.decl_com_ind <= 0) /* if not specified by user, set this */
- ps.decl_com_ind = ps.ljust_decl ? (ps.com_ind <= 10 ? 2 : ps.com_ind - 8) : ps.com_ind;
- if (continuation_indent == 0)
- continuation_indent = ps.ind_size;
- fill_buffer(); /* get first batch of stuff into input buffer */
-
- parse(semicolon);
- {
- char *p = buf_ptr;
- int col = 1;
-
- while (1) {
- if (*p == ' ')
- col++;
- else if (*p == '\t')
- col = ((col - 1) & ~7) + 9;
- else
- break;
- p++;
- }
- if (col > ps.ind_size)
- ps.ind_level = ps.i_l_follow = col / ps.ind_size;
- }
- if (troff) {
- const char *p = in_name,
- *beg = in_name;
-
- while (*p)
- if (*p++ == '/')
- beg = p;
- fprintf(output, ".Fn \"%s\"\n", beg);
- }
- /*
- * START OF MAIN LOOP
- */
-
- while (1) { /* this is the main loop. it will go until we
- * reach eof */
- int is_procname;
-
- type_code = lexi(); /* lexi reads one token. The actual
- * characters read are stored in "token". lexi
- * returns a code indicating the type of token */
- is_procname = ps.procname[0];
-
- /*
- * The following code moves everything following an if (), while (),
- * else, etc. up to the start of the following stmt to a buffer. This
- * allows proper handling of both kinds of brace placement.
- */
-
- flushed_nl = false;
- while (ps.search_brace) { /* if we scanned an if(), while(),
- * etc., we might need to copy stuff
- * into a buffer we must loop, copying
- * stuff into save_com, until we find
- * the start of the stmt which follows
- * the if, or whatever */
- switch (type_code) {
- case newline:
- ++line_no;
- flushed_nl = true;
- case form_feed:
- break; /* form feeds and newlines found here will be
- * ignored */
-
- case lbrace: /* this is a brace that starts the compound
- * stmt */
- if (sc_end == 0) { /* ignore buffering if a comment wasnt
- * stored up */
- ps.search_brace = false;
- goto check_type;
- }
- if (btype_2) {
- save_com[0] = '{'; /* we either want to put the brace
- * right after the if */
- goto sw_buffer; /* go to common code to get out of
- * this loop */
- }
- case comment: /* we have a comment, so we must copy it into
- * the buffer */
- if (!flushed_nl || sc_end != 0) {
- if (sc_end == 0) { /* if this is the first comment, we
- * must set up the buffer */
- save_com[0] = save_com[1] = ' ';
- sc_end = &(save_com[2]);
- }
- else {
- *sc_end++ = '\n'; /* add newline between
- * comments */
- *sc_end++ = ' ';
- --line_no;
- }
- *sc_end++ = '/'; /* copy in start of comment */
- *sc_end++ = '*';
-
- for (;;) { /* loop until we get to the end of the comment */
- *sc_end = *buf_ptr++;
- if (buf_ptr >= buf_end)
- fill_buffer();
-
- if (*sc_end++ == '*' && *buf_ptr == '/')
- break; /* we are at end of comment */
-
- if (sc_end >= &(save_com[sc_size])) { /* check for temp buffer
- * overflow */
- diag2(1, "Internal buffer overflow - Move big comment from right after if, while, or whatever");
- fflush(output);
- exit(1);
- }
- }
- *sc_end++ = '/'; /* add ending slash */
- if (++buf_ptr >= buf_end) /* get past / in buffer */
- fill_buffer();
- break;
- }
- default: /* it is the start of a normal statement */
- if (flushed_nl) /* if we flushed a newline, make sure it is
- * put back */
- force_nl = true;
- if ((type_code == sp_paren && *token == 'i'
- && last_else && ps.else_if)
- || (type_code == sp_nparen && *token == 'e'
- && e_code != s_code && e_code[-1] == '}'))
- force_nl = false;
-
- if (sc_end == 0) { /* ignore buffering if comment wasnt
- * saved up */
- ps.search_brace = false;
- goto check_type;
- }
- if (force_nl) { /* if we should insert a nl here, put it into
- * the buffer */
- force_nl = false;
- --line_no; /* this will be re-increased when the nl is
- * read from the buffer */
- *sc_end++ = '\n';
- *sc_end++ = ' ';
- if (verbose && !flushed_nl) /* print error msg if the line
- * was not already broken */
- diag2(0, "Line broken");
- flushed_nl = false;
- }
- for (t_ptr = token; *t_ptr; ++t_ptr)
- *sc_end++ = *t_ptr; /* copy token into temp buffer */
- ps.procname[0] = 0;
-
- sw_buffer:
- ps.search_brace = false; /* stop looking for start of
- * stmt */
- bp_save = buf_ptr; /* save current input buffer */
- be_save = buf_end;
- buf_ptr = save_com; /* fix so that subsequent calls to
- * lexi will take tokens out of
- * save_com */
- *sc_end++ = ' ';/* add trailing blank, just in case */
- buf_end = sc_end;
- sc_end = 0;
- break;
- } /* end of switch */
- if (type_code != 0) /* we must make this check, just in case there
- * was an unexpected EOF */
- type_code = lexi(); /* read another token */
- /* if (ps.search_brace) ps.procname[0] = 0; */
- if ((is_procname = ps.procname[0]) && flushed_nl
- && !procnames_start_line && ps.in_decl
- && type_code == ident)
- flushed_nl = 0;
- } /* end of while (search_brace) */
- last_else = 0;
-check_type:
- if (type_code == 0) { /* we got eof */
- if (s_lab != e_lab || s_code != e_code
- || s_com != e_com) /* must dump end of line */
- dump_line();
- if (ps.tos > 1) /* check for balanced braces */
- diag2(1, "Stuff missing from end of file");
-
- if (verbose) {
- printf("There were %d output lines and %d comments\n",
- ps.out_lines, ps.out_coms);
- printf("(Lines with comments)/(Lines with code): %6.3f\n",
- (1.0 * ps.com_lines) / code_lines);
- }
- fflush(output);
- exit(found_err);
- }
- if (
- (type_code != comment) &&
- (type_code != newline) &&
- (type_code != preesc) &&
- (type_code != form_feed)) {
- if (force_nl &&
- (type_code != semicolon) &&
- (type_code != lbrace || !btype_2)) {
- /* we should force a broken line here */
- if (verbose && !flushed_nl)
- diag2(0, "Line broken");
- flushed_nl = false;
- dump_line();
- ps.want_blank = false; /* dont insert blank at line start */
- force_nl = false;
- }
- ps.in_stmt = true; /* turn on flag which causes an extra level of
- * indentation. this is turned off by a ; or
- * '}' */
- if (s_com != e_com) { /* the turkey has embedded a comment
- * in a line. fix it */
- *e_code++ = ' ';
- for (t_ptr = s_com; *t_ptr; ++t_ptr) {
- CHECK_SIZE_CODE;
- *e_code++ = *t_ptr;
- }
- *e_code++ = ' ';
- *e_code = '\0'; /* null terminate code sect */
- ps.want_blank = false;
- e_com = s_com;
- }
- }
- else if (type_code != comment) /* preserve force_nl thru a comment */
- force_nl = false; /* cancel forced newline after newline, form
- * feed, etc */
-
-
-
- /*-----------------------------------------------------*\
- | do switch on type of token scanned |
- \*-----------------------------------------------------*/
- CHECK_SIZE_CODE;
- switch (type_code) { /* now, decide what to do with the token */
-
- case form_feed: /* found a form feed in line */
- ps.use_ff = true; /* a form feed is treated much like a newline */
- dump_line();
- ps.want_blank = false;
- break;
-
- case newline:
- if (ps.last_token != comma || ps.p_l_follow > 0
- || !ps.leave_comma || ps.block_init || !break_comma || s_com != e_com) {
- dump_line();
- ps.want_blank = false;
- }
- ++line_no; /* keep track of input line number */
- break;
-
- case lparen: /* got a '(' or '[' */
- ++ps.p_l_follow; /* count parens to make Healy happy */
- if (ps.want_blank && *token != '[' &&
- (ps.last_token != ident || proc_calls_space
- || (ps.its_a_keyword && (!ps.sizeof_keyword || Bill_Shannon))))
- *e_code++ = ' ';
- if (ps.in_decl && !ps.block_init)
- if (troff && !ps.dumped_decl_indent && !is_procname && ps.last_token == decl) {
- ps.dumped_decl_indent = 1;
- sprintf(e_code, "\n.Du %dp+\200p \"%s\"\n", dec_ind * 7, token);
- e_code += strlen(e_code);
- }
- else {
- while ((e_code - s_code) < dec_ind) {
- CHECK_SIZE_CODE;
- *e_code++ = ' ';
- }
- *e_code++ = token[0];
- }
- else
- *e_code++ = token[0];
- ps.paren_indents[ps.p_l_follow - 1] = e_code - s_code;
- if (sp_sw && ps.p_l_follow == 1 && extra_expression_indent
- && ps.paren_indents[0] < 2 * ps.ind_size)
- ps.paren_indents[0] = 2 * ps.ind_size;
- ps.want_blank = false;
- if (ps.in_or_st && *token == '(' && ps.tos <= 2) {
- /*
- * this is a kluge to make sure that declarations will be
- * aligned right if proc decl has an explicit type on it, i.e.
- * "int a(x) {..."
- */
- parse(semicolon); /* I said this was a kluge... */
- ps.in_or_st = false; /* turn off flag for structure decl or
- * initialization */
- }
- if (ps.sizeof_keyword)
- ps.sizeof_mask |= 1 << ps.p_l_follow;
- break;
-
- case rparen: /* got a ')' or ']' */
- rparen_count--;
- if (ps.cast_mask & (1 << ps.p_l_follow) & ~ps.sizeof_mask) {
- ps.last_u_d = true;
- ps.cast_mask &= (1 << ps.p_l_follow) - 1;
- ps.want_blank = false;
- } else
- ps.want_blank = true;
- ps.sizeof_mask &= (1 << ps.p_l_follow) - 1;
- if (--ps.p_l_follow < 0) {
- ps.p_l_follow = 0;
- diag3(0, "Extra %c", *token);
- }
- if (e_code == s_code) /* if the paren starts the line */
- ps.paren_level = ps.p_l_follow; /* then indent it */
-
- *e_code++ = token[0];
-
- if (sp_sw && (ps.p_l_follow == 0)) { /* check for end of if
- * (...), or some such */
- sp_sw = false;
- force_nl = true;/* must force newline after if */
- ps.last_u_d = true; /* inform lexi that a following
- * operator is unary */
- ps.in_stmt = false; /* dont use stmt continuation
- * indentation */
-
- parse(hd_type); /* let parser worry about if, or whatever */
- }
- ps.search_brace = btype_2; /* this should insure that constructs
- * such as main(){...} and int[]{...}
- * have their braces put in the right
- * place */
- break;
-
- case unary_op: /* this could be any unary operation */
- if (ps.want_blank)
- *e_code++ = ' ';
-
- if (troff && !ps.dumped_decl_indent && ps.in_decl && !is_procname) {
- sprintf(e_code, "\n.Du %dp+\200p \"%s\"\n", dec_ind * 7, token);
- ps.dumped_decl_indent = 1;
- e_code += strlen(e_code);
- }
- else {
- const char *res = token;
-
- if (ps.in_decl && !ps.block_init) { /* if this is a unary op
- * in a declaration, we
- * should indent this
- * token */
- for (i = 0; token[i]; ++i); /* find length of token */
- while ((e_code - s_code) < (dec_ind - i)) {
- CHECK_SIZE_CODE;
- *e_code++ = ' '; /* pad it */
- }
- }
- if (troff && token[0] == '-' && token[1] == '>')
- res = "\\(->";
- for (t_ptr = res; *t_ptr; ++t_ptr) {
- CHECK_SIZE_CODE;
- *e_code++ = *t_ptr;
- }
- }
- ps.want_blank = false;
- break;
-
- case binary_op: /* any binary operation */
- if (ps.want_blank)
- *e_code++ = ' ';
- {
- const char *res = token;
-
- if (troff)
- switch (token[0]) {
- case '<':
- if (token[1] == '=')
- res = "\\(<=";
- break;
- case '>':
- if (token[1] == '=')
- res = "\\(>=";
- break;
- case '!':
- if (token[1] == '=')
- res = "\\(!=";
- break;
- case '|':
- if (token[1] == '|')
- res = "\\(br\\(br";
- else if (token[1] == 0)
- res = "\\(br";
- break;
- }
- for (t_ptr = res; *t_ptr; ++t_ptr) {
- CHECK_SIZE_CODE;
- *e_code++ = *t_ptr; /* move the operator */
- }
- }
- ps.want_blank = true;
- break;
-
- case postop: /* got a trailing ++ or -- */
- *e_code++ = token[0];
- *e_code++ = token[1];
- ps.want_blank = true;
- break;
-
- case question: /* got a ? */
- squest++; /* this will be used when a later colon
- * appears so we can distinguish the
- * <c>?<n>:<n> construct */
- if (ps.want_blank)
- *e_code++ = ' ';
- *e_code++ = '?';
- ps.want_blank = true;
- break;
-
- case casestmt: /* got word 'case' or 'default' */
- scase = true; /* so we can process the later colon properly */
- goto copy_id;
-
- case colon: /* got a ':' */
- if (squest > 0) { /* it is part of the <c>?<n>: <n> construct */
- --squest;
- if (ps.want_blank)
- *e_code++ = ' ';
- *e_code++ = ':';
- ps.want_blank = true;
- break;
- }
- if (ps.in_decl) {
- *e_code++ = ':';
- ps.want_blank = false;
- break;
- }
- ps.in_stmt = false; /* seeing a label does not imply we are in a
- * stmt */
- for (t_ptr = s_code; *t_ptr; ++t_ptr)
- *e_lab++ = *t_ptr; /* turn everything so far into a label */
- e_code = s_code;
- *e_lab++ = ':';
- *e_lab++ = ' ';
- *e_lab = '\0';
-
- force_nl = ps.pcase = scase; /* ps.pcase will be used by
- * dump_line to decide how to
- * indent the label. force_nl
- * will force a case n: to be
- * on a line by itself */
- scase = false;
- ps.want_blank = false;
- break;
-
- case semicolon: /* got a ';' */
- ps.in_or_st = false;/* we are not in an initialization or
- * structure declaration */
- scase = false; /* these will only need resetting in an error */
- squest = 0;
- if (ps.last_token == rparen && rparen_count == 0)
- ps.in_parameter_declaration = 0;
- ps.cast_mask = 0;
- ps.sizeof_mask = 0;
- ps.block_init = 0;
- ps.block_init_level = 0;
- ps.just_saw_decl--;
-
- if (ps.in_decl && s_code == e_code && !ps.block_init)
- while ((e_code - s_code) < (dec_ind - 1)) {
- CHECK_SIZE_CODE;
- *e_code++ = ' ';
- }
-
- ps.in_decl = (ps.dec_nest > 0); /* if we were in a first level
- * structure declaration, we
- * arent any more */
-
- if ((!sp_sw || hd_type != forstmt) && ps.p_l_follow > 0) {
-
- /*
- * This should be true iff there were unbalanced parens in the
- * stmt. It is a bit complicated, because the semicolon might
- * be in a for stmt
- */
- diag2(1, "Unbalanced parens");
- ps.p_l_follow = 0;
- if (sp_sw) { /* this is a check for an if, while, etc. with
- * unbalanced parens */
- sp_sw = false;
- parse(hd_type); /* dont lose the if, or whatever */
- }
- }
- *e_code++ = ';';
- ps.want_blank = true;
- ps.in_stmt = (ps.p_l_follow > 0); /* we are no longer in the
- * middle of a stmt */
-
- if (!sp_sw) { /* if not if for (;;) */
- parse(semicolon); /* let parser know about end of stmt */
- force_nl = true;/* force newline after an end of stmt */
- }
- break;
-
- case lbrace: /* got a '{' */
- ps.in_stmt = false; /* dont indent the {} */
- if (!ps.block_init)
- force_nl = true;/* force other stuff on same line as '{' onto
- * new line */
- else if (ps.block_init_level <= 0)
- ps.block_init_level = 1;
- else
- ps.block_init_level++;
-
- if (s_code != e_code && !ps.block_init) {
- if (!btype_2) {
- dump_line();
- ps.want_blank = false;
- }
- else if (ps.in_parameter_declaration && !ps.in_or_st) {
- ps.i_l_follow = 0;
- if (function_brace_split) { /* dump the line prior to the
- * brace ... */
- dump_line();
- ps.want_blank = false;
- } else /* add a space between the decl and brace */
- ps.want_blank = true;
- }
- }
- if (ps.in_parameter_declaration)
- prefix_blankline_requested = 0;
-
- if (ps.p_l_follow > 0) { /* check for preceding unbalanced
- * parens */
- diag2(1, "Unbalanced parens");
- ps.p_l_follow = 0;
- if (sp_sw) { /* check for unclosed if, for, etc. */
- sp_sw = false;
- parse(hd_type);
- ps.ind_level = ps.i_l_follow;
- }
- }
- if (s_code == e_code)
- ps.ind_stmt = false; /* dont put extra indentation on line
- * with '{' */
- if (ps.in_decl && ps.in_or_st) { /* this is either a structure
- * declaration or an init */
- di_stack[ps.dec_nest++] = dec_ind;
- /* ? dec_ind = 0; */
- }
- else {
- ps.decl_on_line = false; /* we cant be in the middle of
- * a declaration, so dont do
- * special indentation of
- * comments */
- if (blanklines_after_declarations_at_proctop
- && ps.in_parameter_declaration)
- postfix_blankline_requested = 1;
- ps.in_parameter_declaration = 0;
- }
- dec_ind = 0;
- parse(lbrace); /* let parser know about this */
- if (ps.want_blank) /* put a blank before '{' if '{' is not at
- * start of line */
- *e_code++ = ' ';
- ps.want_blank = false;
- *e_code++ = '{';
- ps.just_saw_decl = 0;
- break;
-
- case rbrace: /* got a '}' */
- if (ps.p_stack[ps.tos] == decl && !ps.block_init) /* semicolons can be
- * omitted in
- * declarations */
- parse(semicolon);
- if (ps.p_l_follow) {/* check for unclosed if, for, else. */
- diag2(1, "Unbalanced parens");
- ps.p_l_follow = 0;
- sp_sw = false;
- }
- ps.just_saw_decl = 0;
- ps.block_init_level--;
- if (s_code != e_code && !ps.block_init) { /* '}' must be first on
- * line */
- if (verbose)
- diag2(0, "Line broken");
- dump_line();
- }
- *e_code++ = '}';
- ps.want_blank = true;
- ps.in_stmt = ps.ind_stmt = false;
- if (ps.dec_nest > 0) { /* we are in multi-level structure
- * declaration */
- dec_ind = di_stack[--ps.dec_nest];
- if (ps.dec_nest == 0 && !ps.in_parameter_declaration)
- ps.just_saw_decl = 2;
- ps.in_decl = true;
- }
- prefix_blankline_requested = 0;
- parse(rbrace); /* let parser know about this */
- ps.search_brace = cuddle_else && ps.p_stack[ps.tos] == ifhead
- && ps.il[ps.tos] >= ps.ind_level;
- if (ps.tos <= 1 && blanklines_after_procs && ps.dec_nest <= 0)
- postfix_blankline_requested = 1;
- break;
-
- case swstmt: /* got keyword "switch" */
- sp_sw = true;
- hd_type = swstmt; /* keep this for when we have seen the
- * expression */
- goto copy_id; /* go move the token into buffer */
-
- case sp_paren: /* token is if, while, for */
- sp_sw = true; /* the interesting stuff is done after the
- * expression is scanned */
- hd_type = (*token == 'i' ? ifstmt :
- (*token == 'w' ? whilestmt : forstmt));
-
- /*
- * remember the type of header for later use by parser
- */
- goto copy_id; /* copy the token into line */
-
- case sp_nparen: /* got else, do */
- ps.in_stmt = false;
- if (*token == 'e') {
- if (e_code != s_code && (!cuddle_else || e_code[-1] != '}')) {
- if (verbose)
- diag2(0, "Line broken");
- dump_line();/* make sure this starts a line */
- ps.want_blank = false;
- }
- force_nl = true;/* also, following stuff must go onto new line */
- last_else = 1;
- parse(elselit);
- }
- else {
- if (e_code != s_code) { /* make sure this starts a line */
- if (verbose)
- diag2(0, "Line broken");
- dump_line();
- ps.want_blank = false;
- }
- force_nl = true;/* also, following stuff must go onto new line */
- last_else = 0;
- parse(dolit);
- }
- goto copy_id; /* move the token into line */
-
- case decl: /* we have a declaration type (int, register,
- * etc.) */
- parse(decl); /* let parser worry about indentation */
- if (ps.last_token == rparen && ps.tos <= 1) {
- ps.in_parameter_declaration = 1;
- if (s_code != e_code) {
- dump_line();
- ps.want_blank = 0;
- }
- }
- if (ps.in_parameter_declaration && ps.indent_parameters && ps.dec_nest == 0) {
- ps.ind_level = ps.i_l_follow = 1;
- ps.ind_stmt = 0;
- }
- ps.in_or_st = true; /* this might be a structure or initialization
- * declaration */
- ps.in_decl = ps.decl_on_line = true;
- if ( /* !ps.in_or_st && */ ps.dec_nest <= 0)
- ps.just_saw_decl = 2;
- prefix_blankline_requested = 0;
- for (i = 0; token[i++];); /* get length of token */
-
- if (ps.ind_level == 0 || ps.dec_nest > 0) {
- /* global variable or struct member in local variable */
- dec_ind = ps.decl_indent > 0 ? ps.decl_indent : i;
- tabs_to_var = (use_tabs ? ps.decl_indent > 0 : 0);
- } else {
- /* local variable */
- dec_ind = ps.local_decl_indent > 0 ? ps.local_decl_indent : i;
- tabs_to_var = (use_tabs ? ps.local_decl_indent > 0 : 0);
- }
- goto copy_id;
-
- case ident: /* got an identifier or constant */
- if (ps.in_decl) { /* if we are in a declaration, we must indent
- * identifier */
- if (is_procname == 0 || !procnames_start_line) {
- if (!ps.block_init) {
- if (troff && !ps.dumped_decl_indent) {
- if (ps.want_blank)
- *e_code++ = ' ';
- ps.want_blank = false;
- sprintf(e_code, "\n.De %dp+\200p\n", dec_ind * 7);
- ps.dumped_decl_indent = 1;
- e_code += strlen(e_code);
- } else {
- int cur_dec_ind;
- int pos, startpos;
-
- /*
- * in order to get the tab math right for
- * indentations that are not multiples of 8 we
- * need to modify both startpos and dec_ind
- * (cur_dec_ind) here by eight minus the
- * remainder of the current starting column
- * divided by eight. This seems to be a
- * properly working fix
- */
- startpos = e_code - s_code;
- cur_dec_ind = dec_ind;
- pos = startpos;
- if ((ps.ind_level * ps.ind_size) % 8 != 0) {
- pos += (ps.ind_level * ps.ind_size) % 8;
- cur_dec_ind += (ps.ind_level * ps.ind_size) % 8;
- }
-
- if (tabs_to_var) {
- while ((pos & ~7) + 8 <= cur_dec_ind) {
- CHECK_SIZE_CODE;
- *e_code++ = '\t';
- pos = (pos & ~7) + 8;
- }
- }
- while (pos < cur_dec_ind) {
- CHECK_SIZE_CODE;
- *e_code++ = ' ';
- pos++;
- }
- if (ps.want_blank && e_code - s_code == startpos)
- *e_code++ = ' ';
- ps.want_blank = false;
- }
- }
- } else {
- if (ps.want_blank)
- *e_code++ = ' ';
- ps.want_blank = false;
- if (dec_ind && s_code != e_code)
- dump_line();
- dec_ind = 0;
- }
- }
- else if (sp_sw && ps.p_l_follow == 0) {
- sp_sw = false;
- force_nl = true;
- ps.last_u_d = true;
- ps.in_stmt = false;
- parse(hd_type);
- }
- copy_id:
- if (ps.want_blank)
- *e_code++ = ' ';
- if (troff && ps.its_a_keyword) {
- e_code = chfont(&bodyf, &keywordf, e_code);
- for (t_ptr = token; *t_ptr; ++t_ptr) {
- CHECK_SIZE_CODE;
- *e_code++ = keywordf.allcaps && islower(*t_ptr)
- ? toupper(*t_ptr) : *t_ptr;
- }
- e_code = chfont(&keywordf, &bodyf, e_code);
- }
- else
- for (t_ptr = token; *t_ptr; ++t_ptr) {
- CHECK_SIZE_CODE;
- *e_code++ = *t_ptr;
- }
- ps.want_blank = true;
- break;
-
- case period: /* treat a period kind of like a binary
- * operation */
- *e_code++ = '.'; /* move the period into line */
- ps.want_blank = false; /* dont put a blank after a period */
- break;
-
- case comma:
- ps.want_blank = (s_code != e_code); /* only put blank after comma
- * if comma does not start the
- * line */
- if (ps.in_decl && is_procname == 0 && !ps.block_init)
- while ((e_code - s_code) < (dec_ind - 1)) {
- CHECK_SIZE_CODE;
- *e_code++ = ' ';
- }
-
- *e_code++ = ',';
- if (ps.p_l_follow == 0) {
- if (ps.block_init_level <= 0)
- ps.block_init = 0;
- if (break_comma && (!ps.leave_comma || compute_code_target() + (e_code - s_code) > max_col - 8))
- force_nl = true;
- }
- break;
-
- case preesc: /* got the character '#' */
- if ((s_com != e_com) ||
- (s_lab != e_lab) ||
- (s_code != e_code))
- dump_line();
- *e_lab++ = '#'; /* move whole line to 'label' buffer */
- {
- int in_comment = 0;
- int com_start = 0;
- char quote = 0;
- int com_end = 0;
-
- while (*buf_ptr == ' ' || *buf_ptr == '\t') {
- buf_ptr++;
- if (buf_ptr >= buf_end)
- fill_buffer();
- }
- while (*buf_ptr != '\n' || (in_comment && !had_eof)) {
- CHECK_SIZE_LAB;
- *e_lab = *buf_ptr++;
- if (buf_ptr >= buf_end)
- fill_buffer();
- switch (*e_lab++) {
- case BACKSLASH:
- if (troff)
- *e_lab++ = BACKSLASH;
- if (!in_comment) {
- *e_lab++ = *buf_ptr++;
- if (buf_ptr >= buf_end)
- fill_buffer();
- }
- break;
- case '/':
- if (*buf_ptr == '*' && !in_comment && !quote) {
- in_comment = 1;
- *e_lab++ = *buf_ptr++;
- com_start = e_lab - s_lab - 2;
- }
- break;
- case '"':
- if (quote == '"')
- quote = 0;
- break;
- case '\'':
- if (quote == '\'')
- quote = 0;
- break;
- case '*':
- if (*buf_ptr == '/' && in_comment) {
- in_comment = 0;
- *e_lab++ = *buf_ptr++;
- com_end = e_lab - s_lab;
- }
- break;
- }
- }
-
- while (e_lab > s_lab && (e_lab[-1] == ' ' || e_lab[-1] == '\t'))
- e_lab--;
- if (e_lab - s_lab == com_end && bp_save == 0) { /* comment on
- * preprocessor line */
- if (sc_end == 0) /* if this is the first comment, we
- * must set up the buffer */
- sc_end = &(save_com[0]);
- else {
- *sc_end++ = '\n'; /* add newline between
- * comments */
- *sc_end++ = ' ';
- --line_no;
- }
- bcopy(s_lab + com_start, sc_end, com_end - com_start);
- sc_end += com_end - com_start;
- if (sc_end >= &save_com[sc_size])
- abort();
- e_lab = s_lab + com_start;
- while (e_lab > s_lab && (e_lab[-1] == ' ' || e_lab[-1] == '\t'))
- e_lab--;
- bp_save = buf_ptr; /* save current input buffer */
- be_save = buf_end;
- buf_ptr = save_com; /* fix so that subsequent calls to
- * lexi will take tokens out of
- * save_com */
- *sc_end++ = ' '; /* add trailing blank, just in case */
- buf_end = sc_end;
- sc_end = 0;
- }
- *e_lab = '\0'; /* null terminate line */
- ps.pcase = false;
- }
-
- if (strncmp(s_lab, "#if", 3) == 0) {
- if (blanklines_around_conditional_compilation) {
- int c;
- prefix_blankline_requested++;
- while ((c = getc(input)) == '\n');
- ungetc(c, input);
- }
- if ((size_t)ifdef_level < sizeof(state_stack)/sizeof(state_stack[0])) {
- match_state[ifdef_level].tos = -1;
- state_stack[ifdef_level++] = ps;
- }
- else
- diag2(1, "#if stack overflow");
- }
- else if (strncmp(s_lab, "#else", 5) == 0)
- if (ifdef_level <= 0)
- diag2(1, "Unmatched #else");
- else {
- match_state[ifdef_level - 1] = ps;
- ps = state_stack[ifdef_level - 1];
- }
- else if (strncmp(s_lab, "#endif", 6) == 0) {
- if (ifdef_level <= 0)
- diag2(1, "Unmatched #endif");
- else {
- ifdef_level--;
-
-#ifdef undef
- /*
- * This match needs to be more intelligent before the
- * message is useful
- */
- if (match_state[ifdef_level].tos >= 0
- && bcmp(&ps, &match_state[ifdef_level], sizeof ps))
- diag2(0, "Syntactically inconsistent #ifdef alternatives");
-#endif
- }
- if (blanklines_around_conditional_compilation) {
- postfix_blankline_requested++;
- n_real_blanklines = 0;
- }
- }
- break; /* subsequent processing of the newline
- * character will cause the line to be printed */
-
- case comment: /* we have gotten a / followed by * this is a biggie */
- if (flushed_nl) { /* we should force a broken line here */
- flushed_nl = false;
- dump_line();
- ps.want_blank = false; /* dont insert blank at line start */
- force_nl = false;
- }
- pr_comment();
- break;
- } /* end of big switch stmt */
-
- *e_code = '\0'; /* make sure code section is null terminated */
- if (type_code != comment && type_code != newline && type_code != preesc)
- ps.last_token = type_code;
- } /* end of main while (1) loop */
-}
-
-/*
- * copy input file to backup file if in_name is /blah/blah/blah/file, then
- * backup file will be ".Bfile" then make the backup file the input and
- * original input file the output
- */
-static void
-bakcopy(void)
-{
- int n,
- bakchn;
- char buff[8 * 1024];
- const char *p;
-
- /* construct file name .Bfile */
- for (p = in_name; *p; p++); /* skip to end of string */
- while (p > in_name && *p != '/') /* find last '/' */
- p--;
- if (*p == '/')
- p++;
- sprintf(bakfile, "%s.BAK", p);
-
- /* copy in_name to backup file */
- bakchn = creat(bakfile, 0600);
- if (bakchn < 0)
- err(1, "%s", bakfile);
- while ((n = read(fileno(input), buff, sizeof buff)) != 0)
- if (write(bakchn, buff, n) != n)
- err(1, "%s", bakfile);
- if (n < 0)
- err(1, "%s", in_name);
- close(bakchn);
- fclose(input);
-
- /* re-open backup file as the input file */
- input = fopen(bakfile, "r");
- if (input == 0)
- err(1, "%s", bakfile);
- /* now the original input file will be the output */
- output = fopen(in_name, "w");
- if (output == 0) {
- unlink(bakfile);
- err(1, "%s", in_name);
- }
-}
diff --git a/usr.bin/indent/indent.h b/usr.bin/indent/indent.h
deleted file mode 100644
index 4c52bf8..0000000
--- a/usr.bin/indent/indent.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2001 Jens Schweikhardt
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-__FBSDID("$FreeBSD$");
-#endif
-
-void addkey(char *, int);
-int compute_code_target(void);
-int compute_label_target(void);
-int count_spaces(int, char *);
-int lexi(void);
-void diag2(int, const char *);
-void diag3(int, const char *, int);
-void diag4(int, const char *, int, int);
-void dump_line(void);
-void fill_buffer(void);
-void parse(int);
-void parsefont(struct fstate *, const char *);
-void pr_comment(void);
-void set_defaults(void);
-void set_option(char *);
-void set_profile(void);
-void writefdef(struct fstate *f, int);
diff --git a/usr.bin/indent/indent_codes.h b/usr.bin/indent/indent_codes.h
deleted file mode 100644
index e1ff294..0000000
--- a/usr.bin/indent/indent_codes.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 1985 Sun Microsystems, Inc.
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)indent_codes.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#define newline 1
-#define lparen 2
-#define rparen 3
-#define unary_op 4
-#define binary_op 5
-#define postop 6
-#define question 7
-#define casestmt 8
-#define colon 9
-#define semicolon 10
-#define lbrace 11
-#define rbrace 12
-#define ident 13
-#define comma 14
-#define comment 15
-#define swstmt 16
-#define preesc 17
-#define form_feed 18
-#define decl 19
-#define sp_paren 20
-#define sp_nparen 21
-#define ifstmt 22
-#define whilestmt 23
-#define forstmt 24
-#define stmt 25
-#define stmtl 26
-#define elselit 27
-#define dolit 28
-#define dohead 29
-#define ifhead 30
-#define elsehead 31
-#define period 32
diff --git a/usr.bin/indent/indent_globs.h b/usr.bin/indent/indent_globs.h
deleted file mode 100644
index 11ea239..0000000
--- a/usr.bin/indent/indent_globs.h
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * Copyright (c) 1985 Sun Microsystems, Inc.
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)indent_globs.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#define BACKSLASH '\\'
-#define bufsize 200 /* size of internal buffers */
-#define sc_size 5000 /* size of save_com buffer */
-#define label_offset 2 /* number of levels a label is placed to left
- * of code */
-
-#define tabsize 8 /* the size of a tab */
-#define tabmask 0177770 /* mask used when figuring length of lines
- * with tabs */
-
-
-#define false 0
-#define true 1
-
-
-FILE *input; /* the fid for the input file */
-FILE *output; /* the output file */
-
-#define CHECK_SIZE_CODE \
- if (e_code >= l_code) { \
- int nsize = l_code-s_code+400; \
- codebuf = (char *) realloc(codebuf, nsize); \
- if (codebuf == NULL) \
- err(1, NULL); \
- e_code = codebuf + (e_code-s_code) + 1; \
- l_code = codebuf + nsize - 5; \
- s_code = codebuf + 1; \
- }
-#define CHECK_SIZE_COM \
- if (e_com >= l_com) { \
- int nsize = l_com-s_com+400; \
- combuf = (char *) realloc(combuf, nsize); \
- if (combuf == NULL) \
- err(1, NULL); \
- e_com = combuf + (e_com-s_com) + 1; \
- l_com = combuf + nsize - 5; \
- s_com = combuf + 1; \
- }
-#define CHECK_SIZE_LAB \
- if (e_lab >= l_lab) { \
- int nsize = l_lab-s_lab+400; \
- labbuf = (char *) realloc(labbuf, nsize); \
- if (labbuf == NULL) \
- err(1, NULL); \
- e_lab = labbuf + (e_lab-s_lab) + 1; \
- l_lab = labbuf + nsize - 5; \
- s_lab = labbuf + 1; \
- }
-#define CHECK_SIZE_TOKEN \
- if (e_token >= l_token) { \
- int nsize = l_token-s_token+400; \
- tokenbuf = (char *) realloc(tokenbuf, nsize); \
- if (tokenbuf == NULL) \
- err(1, NULL); \
- e_token = tokenbuf + (e_token-s_token) + 1; \
- l_token = tokenbuf + nsize - 5; \
- s_token = tokenbuf + 1; \
- }
-
-char *labbuf; /* buffer for label */
-char *s_lab; /* start ... */
-char *e_lab; /* .. and end of stored label */
-char *l_lab; /* limit of label buffer */
-
-char *codebuf; /* buffer for code section */
-char *s_code; /* start ... */
-char *e_code; /* .. and end of stored code */
-char *l_code; /* limit of code section */
-
-char *combuf; /* buffer for comments */
-char *s_com; /* start ... */
-char *e_com; /* ... and end of stored comments */
-char *l_com; /* limit of comment buffer */
-
-#define token s_token
-char *tokenbuf; /* the last token scanned */
-char *s_token;
-char *e_token;
-char *l_token;
-
-char *in_buffer; /* input buffer */
-char *in_buffer_limit; /* the end of the input buffer */
-char *buf_ptr; /* ptr to next character to be taken from
- * in_buffer */
-char *buf_end; /* ptr to first after last char in in_buffer */
-
-char save_com[sc_size]; /* input text is saved here when looking for
- * the brace after an if, while, etc */
-char *sc_end; /* pointer into save_com buffer */
-
-char *bp_save; /* saved value of buf_ptr when taking input
- * from save_com */
-char *be_save; /* similarly saved value of buf_end */
-
-
-int found_err;
-int pointer_as_binop;
-int blanklines_after_declarations;
-int blanklines_before_blockcomments;
-int blanklines_after_procs;
-int blanklines_around_conditional_compilation;
-int swallow_optional_blanklines;
-int n_real_blanklines;
-int prefix_blankline_requested;
-int postfix_blankline_requested;
-int break_comma; /* when true and not in parens, break after a
- * comma */
-int btype_2; /* when true, brace should be on same line as
- * if, while, etc */
-float case_ind; /* indentation level to be used for a "case
- * n:" */
-int code_lines; /* count of lines with code */
-int had_eof; /* set to true when input is exhausted */
-int line_no; /* the current line number. */
-int max_col; /* the maximum allowable line length */
-int verbose; /* when true, non-essential error messages are
- * printed */
-int cuddle_else; /* true if else should cuddle up to '}' */
-int star_comment_cont; /* true iff comment continuation lines should
- * have stars at the beginning of each line. */
-int comment_delimiter_on_blankline;
-int troff; /* true iff were generating troff input */
-int procnames_start_line; /* if true, the names of procedures
- * being defined get placed in column
- * 1 (ie. a newline is placed between
- * the type of the procedure and its
- * name) */
-int proc_calls_space; /* If true, procedure calls look like:
- * foo(bar) rather than foo (bar) */
-int format_block_comments; /* true if comments beginning with
- * `/ * \n' are to be reformatted */
-int format_col1_comments; /* If comments which start in column 1
- * are to be magically reformatted
- * (just like comments that begin in
- * later columns) */
-int inhibit_formatting; /* true if INDENT OFF is in effect */
-int suppress_blanklines;/* set iff following blanklines should be
- * suppressed */
-int continuation_indent;/* set to the indentation between the edge of
- * code and continuation lines */
-int lineup_to_parens; /* if true, continued code within parens will
- * be lined up to the open paren */
-int Bill_Shannon; /* true iff a blank should always be inserted
- * after sizeof */
-int blanklines_after_declarations_at_proctop; /* This is vaguely
- * similar to
- * blanklines_after_decla
- * rations except that
- * it only applies to
- * the first set of
- * declarations in a
- * procedure (just after
- * the first '{') and it
- * causes a blank line
- * to be generated even
- * if there are no
- * declarations */
-int block_comment_max_col;
-int extra_expression_indent; /* true if continuation lines from the
- * expression part of "if(e)",
- * "while(e)", "for(e;e;e)" should be
- * indented an extra tab stop so that
- * they don't conflict with the code
- * that follows */
-int function_brace_split; /* split function declaration and
- * brace onto separate lines */
-int use_tabs; /* set true to use tabs for spacing,
- * false uses all spaces */
-
-/* -troff font state information */
-
-struct fstate {
- char font[4];
- char size;
- int allcaps:1;
-};
-char *chfont(struct fstate *, struct fstate *, char *);
-
-struct fstate
- keywordf, /* keyword font */
- stringf, /* string font */
- boxcomf, /* Box comment font */
- blkcomf, /* Block comment font */
- scomf, /* Same line comment font */
- bodyf; /* major body font */
-
-
-#define STACKSIZE 150
-
-struct parser_state {
- int last_token;
- struct fstate cfont; /* Current font */
- int p_stack[STACKSIZE]; /* this is the parsers stack */
- int il[STACKSIZE]; /* this stack stores indentation levels */
- float cstk[STACKSIZE];/* used to store case stmt indentation levels */
- int box_com; /* set to true when we are in a "boxed"
- * comment. In that case, the first non-blank
- * char should be lined up with the / in / followed by * */
- int comment_delta,
- n_comment_delta;
- int cast_mask; /* indicates which close parens close off
- * casts */
- int sizeof_mask; /* indicates which close parens close off
- * sizeof''s */
- int block_init; /* true iff inside a block initialization */
- int block_init_level; /* The level of brace nesting in an
- * initialization */
- int last_nl; /* this is true if the last thing scanned was
- * a newline */
- int in_or_st; /* Will be true iff there has been a
- * declarator (e.g. int or char) and no left
- * paren since the last semicolon. When true,
- * a '{' is starting a structure definition or
- * an initialization list */
- int bl_line; /* set to 1 by dump_line if the line is blank */
- int col_1; /* set to true if the last token started in
- * column 1 */
- int com_col; /* this is the column in which the current
- * comment should start */
- int com_ind; /* the column in which comments to the right
- * of code should start */
- int com_lines; /* the number of lines with comments, set by
- * dump_line */
- int dec_nest; /* current nesting level for structure or init */
- int decl_com_ind; /* the column in which comments after
- * declarations should be put */
- int decl_on_line; /* set to true if this line of code has part
- * of a declaration on it */
- int i_l_follow; /* the level to which ind_level should be set
- * after the current line is printed */
- int in_decl; /* set to true when we are in a declaration
- * stmt. The processing of braces is then
- * slightly different */
- int in_stmt; /* set to 1 while in a stmt */
- int ind_level; /* the current indentation level */
- int ind_size; /* the size of one indentation level */
- int ind_stmt; /* set to 1 if next line should have an extra
- * indentation level because we are in the
- * middle of a stmt */
- int last_u_d; /* set to true after scanning a token which
- * forces a following operator to be unary */
- int leave_comma; /* if true, never break declarations after
- * commas */
- int ljust_decl; /* true if declarations should be left
- * justified */
- int out_coms; /* the number of comments processed, set by
- * pr_comment */
- int out_lines; /* the number of lines written, set by
- * dump_line */
- int p_l_follow; /* used to remember how to indent following
- * statement */
- int paren_level; /* parenthesization level. used to indent
- * within statements */
- short paren_indents[20]; /* column positions of each paren */
- int pcase; /* set to 1 if the current line label is a
- * case. It is printed differently from a
- * regular label */
- int search_brace; /* set to true by parse when it is necessary
- * to buffer up all info up to the start of a
- * stmt after an if, while, etc */
- int unindent_displace; /* comments not to the right of code
- * will be placed this many
- * indentation levels to the left of
- * code */
- int use_ff; /* set to one if the current line should be
- * terminated with a form feed */
- int want_blank; /* set to true when the following token should
- * be prefixed by a blank. (Said prefixing is
- * ignored in some cases.) */
- int else_if; /* True iff else if pairs should be handled
- * specially */
- int decl_indent; /* column to indent declared identifiers to */
- int local_decl_indent; /* like decl_indent but for locals */
- int its_a_keyword;
- int sizeof_keyword;
- int dumped_decl_indent;
- float case_indent; /* The distance to indent case labels from the
- * switch statement */
- int in_parameter_declaration;
- int indent_parameters;
- int tos; /* pointer to top of stack */
- char procname[100]; /* The name of the current procedure */
- int just_saw_decl;
-} ps;
-
-int ifdef_level;
-int rparen_count;
-struct parser_state state_stack[5];
-struct parser_state match_state[5];
diff --git a/usr.bin/indent/io.c b/usr.bin/indent/io.c
deleted file mode 100644
index 1e36582..0000000
--- a/usr.bin/indent/io.c
+++ /dev/null
@@ -1,667 +0,0 @@
-/*
- * Copyright (c) 1985 Sun Microsystems, Inc.
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)io.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <ctype.h>
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "indent_globs.h"
-#include "indent.h"
-
-int comment_open;
-static int paren_target;
-static int pad_output(int current, int target);
-
-void
-dump_line(void)
-{ /* dump_line is the routine that actually
- * effects the printing of the new source. It
- * prints the label section, followed by the
- * code section with the appropriate nesting
- * level, followed by any comments */
- int cur_col,
- target_col = 1;
- static int not_first_line;
-
- if (ps.procname[0]) {
- if (troff) {
- if (comment_open) {
- comment_open = 0;
- fprintf(output, ".*/\n");
- }
- fprintf(output, ".Pr \"%s\"\n", ps.procname);
- }
- ps.ind_level = 0;
- ps.procname[0] = 0;
- }
- if (s_code == e_code && s_lab == e_lab && s_com == e_com) {
- if (suppress_blanklines > 0)
- suppress_blanklines--;
- else {
- ps.bl_line = true;
- n_real_blanklines++;
- }
- }
- else if (!inhibit_formatting) {
- suppress_blanklines = 0;
- ps.bl_line = false;
- if (prefix_blankline_requested && not_first_line) {
- if (swallow_optional_blanklines) {
- if (n_real_blanklines == 1)
- n_real_blanklines = 0;
- }
- else {
- if (n_real_blanklines == 0)
- n_real_blanklines = 1;
- }
- }
- while (--n_real_blanklines >= 0)
- putc('\n', output);
- n_real_blanklines = 0;
- if (ps.ind_level == 0)
- ps.ind_stmt = 0; /* this is a class A kludge. dont do
- * additional statement indentation if we are
- * at bracket level 0 */
-
- if (e_lab != s_lab || e_code != s_code)
- ++code_lines; /* keep count of lines with code */
-
-
- if (e_lab != s_lab) { /* print lab, if any */
- if (comment_open) {
- comment_open = 0;
- fprintf(output, ".*/\n");
- }
- while (e_lab > s_lab && (e_lab[-1] == ' ' || e_lab[-1] == '\t'))
- e_lab--;
- cur_col = pad_output(1, compute_label_target());
- if (s_lab[0] == '#' && (strncmp(s_lab, "#else", 5) == 0
- || strncmp(s_lab, "#endif", 6) == 0)) {
- char *s = s_lab;
- if (e_lab[-1] == '\n') e_lab--;
- do putc(*s++, output);
- while (s < e_lab && 'a' <= *s && *s<='z');
- while ((*s == ' ' || *s == '\t') && s < e_lab)
- s++;
- if (s < e_lab)
- fprintf(output, s[0]=='/' && s[1]=='*' ? "\t%.*s" : "\t/* %.*s */",
- (int)(e_lab - s), s);
- }
- else fprintf(output, "%.*s", (int)(e_lab - s_lab), s_lab);
- cur_col = count_spaces(cur_col, s_lab);
- }
- else
- cur_col = 1; /* there is no label section */
-
- ps.pcase = false;
-
- if (s_code != e_code) { /* print code section, if any */
- char *p;
-
- if (comment_open) {
- comment_open = 0;
- fprintf(output, ".*/\n");
- }
- target_col = compute_code_target();
- {
- int i;
-
- for (i = 0; i < ps.p_l_follow; i++)
- if (ps.paren_indents[i] >= 0)
- ps.paren_indents[i] = -(ps.paren_indents[i] + target_col);
- }
- cur_col = pad_output(cur_col, target_col);
- for (p = s_code; p < e_code; p++)
- if (*p == (char) 0200)
- fprintf(output, "%d", target_col * 7);
- else
- putc(*p, output);
- cur_col = count_spaces(cur_col, s_code);
- }
- if (s_com != e_com) {
- if (troff) {
- int all_here = 0;
- char *p;
-
- if (e_com[-1] == '/' && e_com[-2] == '*')
- e_com -= 2, all_here++;
- while (e_com > s_com && e_com[-1] == ' ')
- e_com--;
- *e_com = 0;
- p = s_com;
- while (*p == ' ')
- p++;
- if (p[0] == '/' && p[1] == '*')
- p += 2, all_here++;
- else if (p[0] == '*')
- p += p[1] == '/' ? 2 : 1;
- while (*p == ' ')
- p++;
- if (*p == 0)
- goto inhibit_newline;
- if (comment_open < 2 && ps.box_com) {
- comment_open = 0;
- fprintf(output, ".*/\n");
- }
- if (comment_open == 0) {
- if ('a' <= *p && *p <= 'z')
- *p = *p + 'A' - 'a';
- if (e_com - p < 50 && all_here == 2) {
- char *follow = p;
- fprintf(output, "\n.nr C! \\w\1");
- while (follow < e_com) {
- switch (*follow) {
- case '\n':
- putc(' ', output);
- case 1:
- break;
- case '\\':
- putc('\\', output);
- default:
- putc(*follow, output);
- }
- follow++;
- }
- putc(1, output);
- }
- fprintf(output, "\n./* %dp %d %dp\n",
- ps.com_col * 7,
- (s_code != e_code || s_lab != e_lab) - ps.box_com,
- target_col * 7);
- }
- comment_open = 1 + ps.box_com;
- while (*p) {
- if (*p == BACKSLASH)
- putc(BACKSLASH, output);
- putc(*p++, output);
- }
- }
- else { /* print comment, if any */
- int target = ps.com_col;
- char *com_st = s_com;
-
- target += ps.comment_delta;
- while (*com_st == '\t')
- com_st++, target += 8; /* ? */
- while (target <= 0)
- if (*com_st == ' ')
- target++, com_st++;
- else if (*com_st == '\t')
- target = ((target - 1) & ~7) + 9, com_st++;
- else
- target = 1;
- if (cur_col > target) { /* if comment cant fit on this line,
- * put it on next line */
- putc('\n', output);
- cur_col = 1;
- ++ps.out_lines;
- }
- while (e_com > com_st && isspace(e_com[-1]))
- e_com--;
- cur_col = pad_output(cur_col, target);
- if (!ps.box_com) {
- if (star_comment_cont && (com_st[1] != '*' || e_com <= com_st + 1)) {
- if (com_st[1] == ' ' && com_st[0] == ' ' && e_com > com_st + 1)
- com_st[1] = '*';
- else
- fwrite(" * ", com_st[0] == '\t' ? 2 : com_st[0] == '*' ? 1 : 3, 1, output);
- }
- }
- fwrite(com_st, e_com - com_st, 1, output);
- ps.comment_delta = ps.n_comment_delta;
- cur_col = count_spaces(cur_col, com_st);
- ++ps.com_lines; /* count lines with comments */
- }
- }
- if (ps.use_ff)
- putc('\014', output);
- else
- putc('\n', output);
-inhibit_newline:
- ++ps.out_lines;
- if (ps.just_saw_decl == 1 && blanklines_after_declarations) {
- prefix_blankline_requested = 1;
- ps.just_saw_decl = 0;
- }
- else
- prefix_blankline_requested = postfix_blankline_requested;
- postfix_blankline_requested = 0;
- }
- ps.decl_on_line = ps.in_decl; /* if we are in the middle of a
- * declaration, remember that fact for
- * proper comment indentation */
- ps.ind_stmt = ps.in_stmt & ~ps.in_decl; /* next line should be
- * indented if we have not
- * completed this stmt and if
- * we are not in the middle of
- * a declaration */
- ps.use_ff = false;
- ps.dumped_decl_indent = 0;
- *(e_lab = s_lab) = '\0'; /* reset buffers */
- *(e_code = s_code) = '\0';
- *(e_com = s_com) = '\0';
- ps.ind_level = ps.i_l_follow;
- ps.paren_level = ps.p_l_follow;
- paren_target = -ps.paren_indents[ps.paren_level - 1];
- not_first_line = 1;
-}
-
-int
-compute_code_target(void)
-{
- int target_col = ps.ind_size * ps.ind_level + 1;
-
- if (ps.paren_level)
- if (!lineup_to_parens)
- target_col += continuation_indent
- * (2 * continuation_indent == ps.ind_size ? 1 : ps.paren_level);
- else {
- int w;
- int t = paren_target;
-
- if ((w = count_spaces(t, s_code) - max_col) > 0
- && count_spaces(target_col, s_code) <= max_col) {
- t -= w + 1;
- if (t > target_col)
- target_col = t;
- }
- else
- target_col = t;
- }
- else if (ps.ind_stmt)
- target_col += continuation_indent;
- return target_col;
-}
-
-int
-compute_label_target(void)
-{
- return
- ps.pcase ? (int) (case_ind * ps.ind_size) + 1
- : *s_lab == '#' ? 1
- : ps.ind_size * (ps.ind_level - label_offset) + 1;
-}
-
-
-/*
- * Copyright (C) 1976 by the Board of Trustees of the University of Illinois
- *
- * All rights reserved
- *
- *
- * NAME: fill_buffer
- *
- * FUNCTION: Reads one block of input into input_buffer
- *
- * HISTORY: initial coding November 1976 D A Willcox of CAC 1/7/77 A
- * Willcox of CAC Added check for switch back to partly full input
- * buffer from temporary buffer
- *
- */
-void
-fill_buffer(void)
-{ /* this routine reads stuff from the input */
- char *p;
- int i;
- FILE *f = input;
-
- if (bp_save != 0) { /* there is a partly filled input buffer left */
- buf_ptr = bp_save; /* dont read anything, just switch buffers */
- buf_end = be_save;
- bp_save = be_save = 0;
- if (buf_ptr < buf_end)
- return; /* only return if there is really something in
- * this buffer */
- }
- for (p = in_buffer;;) {
- if (p >= in_buffer_limit) {
- int size = (in_buffer_limit - in_buffer) * 2 + 10;
- int offset = p - in_buffer;
- in_buffer = realloc(in_buffer, size);
- if (in_buffer == NULL)
- errx(1, "input line too long");
- p = in_buffer + offset;
- in_buffer_limit = in_buffer + size - 2;
- }
- if ((i = getc(f)) == EOF) {
- *p++ = ' ';
- *p++ = '\n';
- had_eof = true;
- break;
- }
- *p++ = i;
- if (i == '\n')
- break;
- }
- buf_ptr = in_buffer;
- buf_end = p;
- if (p[-2] == '/' && p[-3] == '*') {
- if (in_buffer[3] == 'I' && strncmp(in_buffer, "/**INDENT**", 11) == 0)
- fill_buffer(); /* flush indent error message */
- else {
- int com = 0;
-
- p = in_buffer;
- while (*p == ' ' || *p == '\t')
- p++;
- if (*p == '/' && p[1] == '*') {
- p += 2;
- while (*p == ' ' || *p == '\t')
- p++;
- if (p[0] == 'I' && p[1] == 'N' && p[2] == 'D' && p[3] == 'E'
- && p[4] == 'N' && p[5] == 'T') {
- p += 6;
- while (*p == ' ' || *p == '\t')
- p++;
- if (*p == '*')
- com = 1;
- else if (*p == 'O') {
- if (*++p == 'N')
- p++, com = 1;
- else if (*p == 'F' && *++p == 'F')
- p++, com = 2;
- }
- while (*p == ' ' || *p == '\t')
- p++;
- if (p[0] == '*' && p[1] == '/' && p[2] == '\n' && com) {
- if (s_com != e_com || s_lab != e_lab || s_code != e_code)
- dump_line();
- if (!(inhibit_formatting = com - 1)) {
- n_real_blanklines = 0;
- postfix_blankline_requested = 0;
- prefix_blankline_requested = 0;
- suppress_blanklines = 1;
- }
- }
- }
- }
- }
- }
- if (inhibit_formatting) {
- p = in_buffer;
- do
- putc(*p, output);
- while (*p++ != '\n');
- }
-}
-
-/*
- * Copyright (C) 1976 by the Board of Trustees of the University of Illinois
- *
- * All rights reserved
- *
- *
- * NAME: pad_output
- *
- * FUNCTION: Writes tabs and spaces to move the current column up to the desired
- * position.
- *
- * ALGORITHM: Put tabs and/or blanks into pobuf, then write pobuf.
- *
- * PARAMETERS: current integer The current column target
- * nteger The desired column
- *
- * RETURNS: Integer value of the new column. (If current >= target, no action is
- * taken, and current is returned.
- *
- * GLOBALS: None
- *
- * CALLS: write (sys)
- *
- * CALLED BY: dump_line
- *
- * HISTORY: initial coding November 1976 D A Willcox of CAC
- *
- */
-static int
-pad_output(int current, int target)
- /* writes tabs and blanks (if necessary) to
- * get the current output position up to the
- * target column */
- /* current: the current column value */
- /* target: position we want it at */
-{
- int curr; /* internal column pointer */
- int tcur;
-
- if (troff)
- fprintf(output, "\\h'|%dp'", (target - 1) * 7);
- else {
- if (current >= target)
- return (current); /* line is already long enough */
- curr = current;
- if (use_tabs) {
- while ((tcur = ((curr - 1) & tabmask) + tabsize + 1) <= target) {
- putc('\t', output);
- curr = tcur;
- }
- }
- while (curr++ < target)
- putc(' ', output); /* pad with final blanks */
- }
- return (target);
-}
-
-/*
- * Copyright (C) 1976 by the Board of Trustees of the University of Illinois
- *
- * All rights reserved
- *
- *
- * NAME: count_spaces
- *
- * FUNCTION: Find out where printing of a given string will leave the current
- * character position on output.
- *
- * ALGORITHM: Run thru input string and add appropriate values to current
- * position.
- *
- * RETURNS: Integer value of position after printing "buffer" starting in column
- * "current".
- *
- * HISTORY: initial coding November 1976 D A Willcox of CAC
- *
- */
-int
-count_spaces(int current, char *buffer)
-/*
- * this routine figures out where the character position will be after
- * printing the text in buffer starting at column "current"
- */
-{
- char *buf; /* used to look thru buffer */
- int cur; /* current character counter */
-
- cur = current;
-
- for (buf = buffer; *buf != '\0'; ++buf) {
- switch (*buf) {
-
- case '\n':
- case 014: /* form feed */
- cur = 1;
- break;
-
- case '\t':
- cur = ((cur - 1) & tabmask) + tabsize + 1;
- break;
-
- case 010: /* backspace */
- --cur;
- break;
-
- default:
- ++cur;
- break;
- } /* end of switch */
- } /* end of for loop */
- return (cur);
-}
-
-void
-diag4(int level, const char *msg, int a, int b)
-{
- if (level)
- found_err = 1;
- if (output == stdout) {
- fprintf(stdout, "/**INDENT** %s@%d: ", level == 0 ? "Warning" : "Error", line_no);
- fprintf(stdout, msg, a, b);
- fprintf(stdout, " */\n");
- }
- else {
- fprintf(stderr, "%s@%d: ", level == 0 ? "Warning" : "Error", line_no);
- fprintf(stderr, msg, a, b);
- fprintf(stderr, "\n");
- }
-}
-
-void
-diag3(int level, const char *msg, int a)
-{
- if (level)
- found_err = 1;
- if (output == stdout) {
- fprintf(stdout, "/**INDENT** %s@%d: ", level == 0 ? "Warning" : "Error", line_no);
- fprintf(stdout, msg, a);
- fprintf(stdout, " */\n");
- }
- else {
- fprintf(stderr, "%s@%d: ", level == 0 ? "Warning" : "Error", line_no);
- fprintf(stderr, msg, a);
- fprintf(stderr, "\n");
- }
-}
-
-void
-diag2(int level, const char *msg)
-{
- if (level)
- found_err = 1;
- if (output == stdout) {
- fprintf(stdout, "/**INDENT** %s@%d: ", level == 0 ? "Warning" : "Error", line_no);
- fprintf(stdout, msg);
- fprintf(stdout, " */\n");
- }
- else {
- fprintf(stderr, "%s@%d: ", level == 0 ? "Warning" : "Error", line_no);
- fprintf(stderr, msg);
- fprintf(stderr, "\n");
- }
-}
-
-void
-writefdef(struct fstate *f, int nm)
-{
- fprintf(output, ".ds f%c %s\n.nr s%c %d\n",
- nm, f->font, nm, f->size);
-}
-
-char *
-chfont(struct fstate *of, struct fstate *nf, char *s)
-{
- if (of->font[0] != nf->font[0]
- || of->font[1] != nf->font[1]) {
- *s++ = '\\';
- *s++ = 'f';
- if (nf->font[1]) {
- *s++ = '(';
- *s++ = nf->font[0];
- *s++ = nf->font[1];
- }
- else
- *s++ = nf->font[0];
- }
- if (nf->size != of->size) {
- *s++ = '\\';
- *s++ = 's';
- if (nf->size < of->size) {
- *s++ = '-';
- *s++ = '0' + of->size - nf->size;
- }
- else {
- *s++ = '+';
- *s++ = '0' + nf->size - of->size;
- }
- }
- return s;
-}
-
-void
-parsefont(struct fstate *f, const char *s0)
-{
- const char *s = s0;
- int sizedelta = 0;
-
- bzero(f, sizeof *f);
- while (*s) {
- if (isdigit(*s))
- f->size = f->size * 10 + *s - '0';
- else if (isupper(*s))
- if (f->font[0])
- f->font[1] = *s;
- else
- f->font[0] = *s;
- else if (*s == 'c')
- f->allcaps = 1;
- else if (*s == '+')
- sizedelta++;
- else if (*s == '-')
- sizedelta--;
- else {
- errx(1, "bad font specification: %s", s0);
- }
- s++;
- }
- if (f->font[0] == 0)
- f->font[0] = 'R';
- if (bodyf.size == 0)
- bodyf.size = 11;
- if (f->size == 0)
- f->size = bodyf.size + sizedelta;
- else if (sizedelta > 0)
- f->size += bodyf.size;
- else
- f->size = bodyf.size - f->size;
-}
diff --git a/usr.bin/indent/lexi.c b/usr.bin/indent/lexi.c
deleted file mode 100644
index 60fc1ae..0000000
--- a/usr.bin/indent/lexi.c
+++ /dev/null
@@ -1,595 +0,0 @@
-/*
- * Copyright (c) 1985 Sun Microsystems, Inc.
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)lexi.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Here we have the token scanner for indent. It scans off one token and puts
- * it in the global variable "token". It returns a code, indicating the type
- * of token scanned.
- */
-
-#include <err.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include "indent_globs.h"
-#include "indent_codes.h"
-#include "indent.h"
-
-#define alphanum 1
-#define opchar 3
-
-struct templ {
- const char *rwd;
- int rwcode;
-};
-
-struct templ specials[1000] =
-{
- {"switch", 1},
- {"case", 2},
- {"break", 0},
- {"struct", 3},
- {"union", 3},
- {"enum", 3},
- {"default", 2},
- {"int", 4},
- {"char", 4},
- {"float", 4},
- {"double", 4},
- {"long", 4},
- {"short", 4},
- {"typdef", 4},
- {"unsigned", 4},
- {"register", 4},
- {"static", 4},
- {"global", 4},
- {"extern", 4},
- {"void", 4},
- {"const", 4},
- {"volatile", 4},
- {"goto", 0},
- {"return", 0},
- {"if", 5},
- {"while", 5},
- {"for", 5},
- {"else", 6},
- {"do", 6},
- {"sizeof", 7},
- {0, 0}
-};
-
-char chartype[128] =
-{ /* this is used to facilitate the decision of
- * what type (alphanumeric, operator) each
- * character is */
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 3, 0, 0, 1, 3, 3, 0,
- 0, 0, 3, 3, 0, 3, 0, 3,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 0, 0, 3, 3, 3, 3,
- 0, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 0, 0, 0, 3, 1,
- 0, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 0, 3, 0, 3, 0
-};
-
-int
-lexi(void)
-{
- int unary_delim; /* this is set to 1 if the current token
- * forces a following operator to be unary */
- static int last_code; /* the last token type returned */
- static int l_struct; /* set to 1 if the last token was 'struct' */
- int code; /* internal code to be returned */
- char qchar; /* the delimiter character for a string */
-
- e_token = s_token; /* point to start of place to save token */
- unary_delim = false;
- ps.col_1 = ps.last_nl; /* tell world that this token started in
- * column 1 iff the last thing scanned was nl */
- ps.last_nl = false;
-
- while (*buf_ptr == ' ' || *buf_ptr == '\t') { /* get rid of blanks */
- ps.col_1 = false; /* leading blanks imply token is not in column
- * 1 */
- if (++buf_ptr >= buf_end)
- fill_buffer();
- }
-
- /* Scan an alphanumeric token */
- if (chartype[(int)*buf_ptr] == alphanum || (buf_ptr[0] == '.' && isdigit(buf_ptr[1]))) {
- /*
- * we have a character or number
- */
- const char *j; /* used for searching thru list of
- *
- * reserved words */
- struct templ *p;
-
- if (isdigit(*buf_ptr) || (buf_ptr[0] == '.' && isdigit(buf_ptr[1]))) {
- int seendot = 0,
- seenexp = 0,
- seensfx = 0;
- if (*buf_ptr == '0' &&
- (buf_ptr[1] == 'x' || buf_ptr[1] == 'X')) {
- *e_token++ = *buf_ptr++;
- *e_token++ = *buf_ptr++;
- while (isxdigit(*buf_ptr)) {
- CHECK_SIZE_TOKEN;
- *e_token++ = *buf_ptr++;
- }
- }
- else
- while (1) {
- if (*buf_ptr == '.') {
- if (seendot)
- break;
- else
- seendot++;
- }
- CHECK_SIZE_TOKEN;
- *e_token++ = *buf_ptr++;
- if (!isdigit(*buf_ptr) && *buf_ptr != '.') {
- if ((*buf_ptr != 'E' && *buf_ptr != 'e') || seenexp)
- break;
- else {
- seenexp++;
- seendot++;
- CHECK_SIZE_TOKEN;
- *e_token++ = *buf_ptr++;
- if (*buf_ptr == '+' || *buf_ptr == '-')
- *e_token++ = *buf_ptr++;
- }
- }
- }
- while (1) {
- if (!(seensfx & 1) &&
- (*buf_ptr == 'U' || *buf_ptr == 'u')) {
- CHECK_SIZE_TOKEN;
- *e_token++ = *buf_ptr++;
- seensfx |= 1;
- continue;
- }
- if (!(seensfx & 2) &&
- (*buf_ptr == 'L' || *buf_ptr == 'l')) {
- CHECK_SIZE_TOKEN;
- if (buf_ptr[1] == buf_ptr[0])
- *e_token++ = *buf_ptr++;
- *e_token++ = *buf_ptr++;
- seensfx |= 2;
- continue;
- }
- break;
- }
- }
- else
- while (chartype[(int)*buf_ptr] == alphanum || *buf_ptr == BACKSLASH) {
- /* fill_buffer() terminates buffer with newline */
- if (*buf_ptr == BACKSLASH) {
- if (*(buf_ptr + 1) == '\n') {
- buf_ptr += 2;
- if (buf_ptr >= buf_end)
- fill_buffer();
- } else
- break;
- }
- CHECK_SIZE_TOKEN;
- /* copy it over */
- *e_token++ = *buf_ptr++;
- if (buf_ptr >= buf_end)
- fill_buffer();
- }
- *e_token++ = '\0';
- while (*buf_ptr == ' ' || *buf_ptr == '\t') { /* get rid of blanks */
- if (++buf_ptr >= buf_end)
- fill_buffer();
- }
- ps.its_a_keyword = false;
- ps.sizeof_keyword = false;
- if (l_struct && !ps.p_l_follow) {
- /* if last token was 'struct' and we're not
- * in parentheses, then this token
- * should be treated as a declaration */
- l_struct = false;
- last_code = ident;
- ps.last_u_d = true;
- return (decl);
- }
- ps.last_u_d = l_struct; /* Operator after identifier is binary
- * unless last token was 'struct' */
- l_struct = false;
- last_code = ident; /* Remember that this is the code we will
- * return */
-
- /*
- * This loop will check if the token is a keyword.
- */
- for (p = specials; (j = p->rwd) != 0; p++) {
- const char *q = s_token; /* point at scanned token */
- if (*j++ != *q++ || *j++ != *q++)
- continue; /* This test depends on the fact that
- * identifiers are always at least 1 character
- * long (ie. the first two bytes of the
- * identifier are always meaningful) */
- if (q[-1] == 0)
- break; /* If its a one-character identifier */
- while (*q++ == *j)
- if (*j++ == 0)
- goto found_keyword; /* I wish that C had a multi-level
- * break... */
- }
- if (p->rwd) { /* we have a keyword */
- found_keyword:
- ps.its_a_keyword = true;
- ps.last_u_d = true;
- switch (p->rwcode) {
- case 1: /* it is a switch */
- return (swstmt);
- case 2: /* a case or default */
- return (casestmt);
-
- case 3: /* a "struct" */
- /*
- * Next time around, we will want to know that we have had a
- * 'struct'
- */
- l_struct = true;
- /* FALLTHROUGH */
-
- case 4: /* one of the declaration keywords */
- if (ps.p_l_follow) {
- ps.cast_mask |= (1 << ps.p_l_follow) & ~ps.sizeof_mask;
- break; /* inside parens: cast, param list or sizeof */
- }
- last_code = decl;
- return (decl);
-
- case 5: /* if, while, for */
- return (sp_paren);
-
- case 6: /* do, else */
- return (sp_nparen);
-
- case 7:
- ps.sizeof_keyword = true;
- default: /* all others are treated like any other
- * identifier */
- return (ident);
- } /* end of switch */
- } /* end of if (found_it) */
- if (*buf_ptr == '(' && ps.tos <= 1 && ps.ind_level == 0) {
- char *tp = buf_ptr;
- while (tp < buf_end)
- if (*tp++ == ')' && (*tp == ';' || *tp == ','))
- goto not_proc;
- strncpy(ps.procname, token, sizeof ps.procname - 1);
- ps.in_parameter_declaration = 1;
- rparen_count = 1;
- not_proc:;
- }
- /*
- * The following hack attempts to guess whether or not the current
- * token is in fact a declaration keyword -- one that has been
- * typedefd
- */
- if (((*buf_ptr == '*' && buf_ptr[1] != '=') || isalpha(*buf_ptr) || *buf_ptr == '_')
- && !ps.p_l_follow
- && !ps.block_init
- && (ps.last_token == rparen || ps.last_token == semicolon ||
- ps.last_token == decl ||
- ps.last_token == lbrace || ps.last_token == rbrace)) {
- ps.its_a_keyword = true;
- ps.last_u_d = true;
- last_code = decl;
- return decl;
- }
- if (last_code == decl) /* if this is a declared variable, then
- * following sign is unary */
- ps.last_u_d = true; /* will make "int a -1" work */
- last_code = ident;
- return (ident); /* the ident is not in the list */
- } /* end of procesing for alpanum character */
-
- /* Scan a non-alphanumeric token */
-
- *e_token++ = *buf_ptr; /* if it is only a one-character token, it is
- * moved here */
- *e_token = '\0';
- if (++buf_ptr >= buf_end)
- fill_buffer();
-
- switch (*token) {
- case '\n':
- unary_delim = ps.last_u_d;
- ps.last_nl = true; /* remember that we just had a newline */
- code = (had_eof ? 0 : newline);
-
- /*
- * if data has been exhausted, the newline is a dummy, and we should
- * return code to stop
- */
- break;
-
- case '\'': /* start of quoted character */
- case '"': /* start of string */
- qchar = *token;
- if (troff) {
- e_token[-1] = '`';
- if (qchar == '"')
- *e_token++ = '`';
- e_token = chfont(&bodyf, &stringf, e_token);
- }
- do { /* copy the string */
- while (1) { /* move one character or [/<char>]<char> */
- if (*buf_ptr == '\n') {
- diag2(1, "Unterminated literal");
- goto stop_lit;
- }
- CHECK_SIZE_TOKEN; /* Only have to do this once in this loop,
- * since CHECK_SIZE guarantees that there
- * are at least 5 entries left */
- *e_token = *buf_ptr++;
- if (buf_ptr >= buf_end)
- fill_buffer();
- if (*e_token == BACKSLASH) { /* if escape, copy extra char */
- if (*buf_ptr == '\n') /* check for escaped newline */
- ++line_no;
- if (troff) {
- *++e_token = BACKSLASH;
- if (*buf_ptr == BACKSLASH)
- *++e_token = BACKSLASH;
- }
- *++e_token = *buf_ptr++;
- ++e_token; /* we must increment this again because we
- * copied two chars */
- if (buf_ptr >= buf_end)
- fill_buffer();
- }
- else
- break; /* we copied one character */
- } /* end of while (1) */
- } while (*e_token++ != qchar);
- if (troff) {
- e_token = chfont(&stringf, &bodyf, e_token - 1);
- if (qchar == '"')
- *e_token++ = '\'';
- }
-stop_lit:
- code = ident;
- break;
-
- case ('('):
- case ('['):
- unary_delim = true;
- code = lparen;
- break;
-
- case (')'):
- case (']'):
- code = rparen;
- break;
-
- case '#':
- unary_delim = ps.last_u_d;
- code = preesc;
- break;
-
- case '?':
- unary_delim = true;
- code = question;
- break;
-
- case (':'):
- code = colon;
- unary_delim = true;
- break;
-
- case (';'):
- unary_delim = true;
- code = semicolon;
- break;
-
- case ('{'):
- unary_delim = true;
-
- /*
- * if (ps.in_or_st) ps.block_init = 1;
- */
- /* ? code = ps.block_init ? lparen : lbrace; */
- code = lbrace;
- break;
-
- case ('}'):
- unary_delim = true;
- /* ? code = ps.block_init ? rparen : rbrace; */
- code = rbrace;
- break;
-
- case 014: /* a form feed */
- unary_delim = ps.last_u_d;
- ps.last_nl = true; /* remember this so we can set 'ps.col_1'
- * right */
- code = form_feed;
- break;
-
- case (','):
- unary_delim = true;
- code = comma;
- break;
-
- case '.':
- unary_delim = false;
- code = period;
- break;
-
- case '-':
- case '+': /* check for -, +, --, ++ */
- code = (ps.last_u_d ? unary_op : binary_op);
- unary_delim = true;
-
- if (*buf_ptr == token[0]) {
- /* check for doubled character */
- *e_token++ = *buf_ptr++;
- /* buffer overflow will be checked at end of loop */
- if (last_code == ident || last_code == rparen) {
- code = (ps.last_u_d ? unary_op : postop);
- /* check for following ++ or -- */
- unary_delim = false;
- }
- }
- else if (*buf_ptr == '=')
- /* check for operator += */
- *e_token++ = *buf_ptr++;
- else if (*buf_ptr == '>') {
- /* check for operator -> */
- *e_token++ = *buf_ptr++;
- if (!pointer_as_binop) {
- unary_delim = false;
- code = unary_op;
- ps.want_blank = false;
- }
- }
- break; /* buffer overflow will be checked at end of
- * switch */
-
- case '=':
- if (ps.in_or_st)
- ps.block_init = 1;
-#ifdef undef
- if (chartype[*buf_ptr] == opchar) { /* we have two char assignment */
- e_token[-1] = *buf_ptr++;
- if ((e_token[-1] == '<' || e_token[-1] == '>') && e_token[-1] == *buf_ptr)
- *e_token++ = *buf_ptr++;
- *e_token++ = '='; /* Flip =+ to += */
- *e_token = 0;
- }
-#else
- if (*buf_ptr == '=') {/* == */
- *e_token++ = '='; /* Flip =+ to += */
- buf_ptr++;
- *e_token = 0;
- }
-#endif
- code = binary_op;
- unary_delim = true;
- break;
- /* can drop thru!!! */
-
- case '>':
- case '<':
- case '!': /* ops like <, <<, <=, !=, etc */
- if (*buf_ptr == '>' || *buf_ptr == '<' || *buf_ptr == '=') {
- *e_token++ = *buf_ptr;
- if (++buf_ptr >= buf_end)
- fill_buffer();
- }
- if (*buf_ptr == '=')
- *e_token++ = *buf_ptr++;
- code = (ps.last_u_d ? unary_op : binary_op);
- unary_delim = true;
- break;
-
- default:
- if (token[0] == '/' && *buf_ptr == '*') {
- /* it is start of comment */
- *e_token++ = '*';
-
- if (++buf_ptr >= buf_end)
- fill_buffer();
-
- code = comment;
- unary_delim = ps.last_u_d;
- break;
- }
- while (*(e_token - 1) == *buf_ptr || *buf_ptr == '=') {
- /*
- * handle ||, &&, etc, and also things as in int *****i
- */
- *e_token++ = *buf_ptr;
- if (++buf_ptr >= buf_end)
- fill_buffer();
- }
- code = (ps.last_u_d ? unary_op : binary_op);
- unary_delim = true;
-
-
- } /* end of switch */
- if (code != newline) {
- l_struct = false;
- last_code = code;
- }
- if (buf_ptr >= buf_end) /* check for input buffer empty */
- fill_buffer();
- ps.last_u_d = unary_delim;
- *e_token = '\0'; /* null terminate the token */
- return (code);
-}
-
-/*
- * Add the given keyword to the keyword table, using val as the keyword type
- */
-void
-addkey(char *key, int val)
-{
- struct templ *p = specials;
- while (p->rwd)
- if (p->rwd[0] == key[0] && strcmp(p->rwd, key) == 0)
- return;
- else
- p++;
- if (p >= specials + sizeof specials / sizeof specials[0])
- return; /* For now, table overflows are silently
- * ignored */
- p->rwd = key;
- p->rwcode = val;
- p[1].rwd = 0;
- p[1].rwcode = 0;
-}
diff --git a/usr.bin/indent/parse.c b/usr.bin/indent/parse.c
deleted file mode 100644
index 65d9a6b..0000000
--- a/usr.bin/indent/parse.c
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * Copyright (c) 1985 Sun Microsystems, Inc.
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)parse.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdio.h>
-#include "indent_globs.h"
-#include "indent_codes.h"
-#include "indent.h"
-
-static void reduce(void);
-
-void
-parse(int tk) /* tk: the code for the construct scanned */
-{
- int i;
-
-#ifdef debug
- printf("%2d - %s\n", tk, token);
-#endif
-
- while (ps.p_stack[ps.tos] == ifhead && tk != elselit) {
- /* true if we have an if without an else */
- ps.p_stack[ps.tos] = stmt; /* apply the if(..) stmt ::= stmt
- * reduction */
- reduce(); /* see if this allows any reduction */
- }
-
-
- switch (tk) { /* go on and figure out what to do with the
- * input */
-
- case decl: /* scanned a declaration word */
- ps.search_brace = btype_2;
- /* indicate that following brace should be on same line */
- if (ps.p_stack[ps.tos] != decl) { /* only put one declaration
- * onto stack */
- break_comma = true; /* while in declaration, newline should be
- * forced after comma */
- ps.p_stack[++ps.tos] = decl;
- ps.il[ps.tos] = ps.i_l_follow;
-
- if (ps.ljust_decl) {/* only do if we want left justified
- * declarations */
- ps.ind_level = 0;
- for (i = ps.tos - 1; i > 0; --i)
- if (ps.p_stack[i] == decl)
- ++ps.ind_level; /* indentation is number of
- * declaration levels deep we are */
- ps.i_l_follow = ps.ind_level;
- }
- }
- break;
-
- case ifstmt: /* scanned if (...) */
- if (ps.p_stack[ps.tos] == elsehead && ps.else_if) /* "else if ..." */
- ps.i_l_follow = ps.il[ps.tos];
- case dolit: /* 'do' */
- case forstmt: /* for (...) */
- ps.p_stack[++ps.tos] = tk;
- ps.il[ps.tos] = ps.ind_level = ps.i_l_follow;
- ++ps.i_l_follow; /* subsequent statements should be indented 1 */
- ps.search_brace = btype_2;
- break;
-
- case lbrace: /* scanned { */
- break_comma = false; /* don't break comma in an initial list */
- if (ps.p_stack[ps.tos] == stmt || ps.p_stack[ps.tos] == decl
- || ps.p_stack[ps.tos] == stmtl)
- ++ps.i_l_follow; /* it is a random, isolated stmt group or a
- * declaration */
- else {
- if (s_code == e_code) {
- /*
- * only do this if there is nothing on the line
- */
- --ps.ind_level;
- /*
- * it is a group as part of a while, for, etc.
- */
- if (ps.p_stack[ps.tos] == swstmt && ps.case_indent >= 1)
- --ps.ind_level;
- /*
- * for a switch, brace should be two levels out from the code
- */
- }
- }
-
- ps.p_stack[++ps.tos] = lbrace;
- ps.il[ps.tos] = ps.ind_level;
- ps.p_stack[++ps.tos] = stmt;
- /* allow null stmt between braces */
- ps.il[ps.tos] = ps.i_l_follow;
- break;
-
- case whilestmt: /* scanned while (...) */
- if (ps.p_stack[ps.tos] == dohead) {
- /* it is matched with do stmt */
- ps.ind_level = ps.i_l_follow = ps.il[ps.tos];
- ps.p_stack[++ps.tos] = whilestmt;
- ps.il[ps.tos] = ps.ind_level = ps.i_l_follow;
- }
- else { /* it is a while loop */
- ps.p_stack[++ps.tos] = whilestmt;
- ps.il[ps.tos] = ps.i_l_follow;
- ++ps.i_l_follow;
- ps.search_brace = btype_2;
- }
-
- break;
-
- case elselit: /* scanned an else */
-
- if (ps.p_stack[ps.tos] != ifhead)
- diag2(1, "Unmatched 'else'");
- else {
- ps.ind_level = ps.il[ps.tos]; /* indentation for else should
- * be same as for if */
- ps.i_l_follow = ps.ind_level + 1; /* everything following should
- * be in 1 level */
- ps.p_stack[ps.tos] = elsehead;
- /* remember if with else */
- ps.search_brace = btype_2 | ps.else_if;
- }
- break;
-
- case rbrace: /* scanned a } */
- /* stack should have <lbrace> <stmt> or <lbrace> <stmtl> */
- if (ps.p_stack[ps.tos - 1] == lbrace) {
- ps.ind_level = ps.i_l_follow = ps.il[--ps.tos];
- ps.p_stack[ps.tos] = stmt;
- }
- else
- diag2(1, "Statement nesting error");
- break;
-
- case swstmt: /* had switch (...) */
- ps.p_stack[++ps.tos] = swstmt;
- ps.cstk[ps.tos] = case_ind;
- /* save current case indent level */
- ps.il[ps.tos] = ps.i_l_follow;
- case_ind = ps.i_l_follow + ps.case_indent; /* cases should be one
- * level down from
- * switch */
- ps.i_l_follow += ps.case_indent + 1; /* statements should be two
- * levels in */
- ps.search_brace = btype_2;
- break;
-
- case semicolon: /* this indicates a simple stmt */
- break_comma = false; /* turn off flag to break after commas in a
- * declaration */
- ps.p_stack[++ps.tos] = stmt;
- ps.il[ps.tos] = ps.ind_level;
- break;
-
- default: /* this is an error */
- diag2(1, "Unknown code to parser");
- return;
-
-
- } /* end of switch */
-
- reduce(); /* see if any reduction can be done */
-
-#ifdef debug
- for (i = 1; i <= ps.tos; ++i)
- printf("(%d %d)", ps.p_stack[i], ps.il[i]);
- printf("\n");
-#endif
-
- return;
-}
-
-/*
- * NAME: reduce
- *
- * FUNCTION: Implements the reduce part of the parsing algorithm
- *
- * ALGORITHM: The following reductions are done. Reductions are repeated
- * until no more are possible.
- *
- * Old TOS New TOS
- * <stmt> <stmt> <stmtl>
- * <stmtl> <stmt> <stmtl>
- * do <stmt> "dostmt"
- * if <stmt> "ifstmt"
- * switch <stmt> <stmt>
- * decl <stmt> <stmt>
- * "ifelse" <stmt> <stmt>
- * for <stmt> <stmt>
- * while <stmt> <stmt>
- * "dostmt" while <stmt>
- *
- * On each reduction, ps.i_l_follow (the indentation for the following line)
- * is set to the indentation level associated with the old TOS.
- *
- * PARAMETERS: None
- *
- * RETURNS: Nothing
- *
- * GLOBALS: ps.cstk ps.i_l_follow = ps.il ps.p_stack = ps.tos =
- *
- * CALLS: None
- *
- * CALLED BY: parse
- *
- * HISTORY: initial coding November 1976 D A Willcox of CAC
- *
- */
-/*----------------------------------------------*\
-| REDUCTION PHASE |
-\*----------------------------------------------*/
-static void
-reduce(void)
-{
- int i;
-
- for (;;) { /* keep looping until there is nothing left to
- * reduce */
-
- switch (ps.p_stack[ps.tos]) {
-
- case stmt:
- switch (ps.p_stack[ps.tos - 1]) {
-
- case stmt:
- case stmtl:
- /* stmtl stmt or stmt stmt */
- ps.p_stack[--ps.tos] = stmtl;
- break;
-
- case dolit: /* <do> <stmt> */
- ps.p_stack[--ps.tos] = dohead;
- ps.i_l_follow = ps.il[ps.tos];
- break;
-
- case ifstmt:
- /* <if> <stmt> */
- ps.p_stack[--ps.tos] = ifhead;
- for (i = ps.tos - 1;
- (
- ps.p_stack[i] != stmt
- &&
- ps.p_stack[i] != stmtl
- &&
- ps.p_stack[i] != lbrace
- );
- --i);
- ps.i_l_follow = ps.il[i];
- /*
- * for the time being, we will assume that there is no else on
- * this if, and set the indentation level accordingly. If an
- * else is scanned, it will be fixed up later
- */
- break;
-
- case swstmt:
- /* <switch> <stmt> */
- case_ind = ps.cstk[ps.tos - 1];
-
- case decl: /* finish of a declaration */
- case elsehead:
- /* <<if> <stmt> else> <stmt> */
- case forstmt:
- /* <for> <stmt> */
- case whilestmt:
- /* <while> <stmt> */
- ps.p_stack[--ps.tos] = stmt;
- ps.i_l_follow = ps.il[ps.tos];
- break;
-
- default: /* <anything else> <stmt> */
- return;
-
- } /* end of section for <stmt> on top of stack */
- break;
-
- case whilestmt: /* while (...) on top */
- if (ps.p_stack[ps.tos - 1] == dohead) {
- /* it is termination of a do while */
- ps.tos -= 2;
- break;
- }
- else
- return;
-
- default: /* anything else on top */
- return;
-
- }
- }
-}
diff --git a/usr.bin/indent/pr_comment.c b/usr.bin/indent/pr_comment.c
deleted file mode 100644
index 9524bf4..0000000
--- a/usr.bin/indent/pr_comment.c
+++ /dev/null
@@ -1,429 +0,0 @@
-/*
- * Copyright (c) 1985 Sun Microsystems, Inc.
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)pr_comment.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "indent_globs.h"
-#include "indent.h"
-/*
- * NAME:
- * pr_comment
- *
- * FUNCTION:
- * This routine takes care of scanning and printing comments.
- *
- * ALGORITHM:
- * 1) Decide where the comment should be aligned, and if lines should
- * be broken.
- * 2) If lines should not be broken and filled, just copy up to end of
- * comment.
- * 3) If lines should be filled, then scan thru input_buffer copying
- * characters to com_buf. Remember where the last blank, tab, or
- * newline was. When line is filled, print up to last blank and
- * continue copying.
- *
- * HISTORY:
- * November 1976 D A Willcox of CAC Initial coding
- * 12/6/76 D A Willcox of CAC Modification to handle
- * UNIX-style comments
- *
- */
-
-/*
- * this routine processes comments. It makes an attempt to keep comments from
- * going over the max line length. If a line is too long, it moves everything
- * from the last blank to the next comment line. Blanks and tabs from the
- * beginning of the input line are removed
- */
-
-void
-pr_comment(void)
-{
- int now_col; /* column we are in now */
- int adj_max_col; /* Adjusted max_col for when we decide to
- * spill comments over the right margin */
- char *last_bl; /* points to the last blank in the output
- * buffer */
- char *t_ptr; /* used for moving string */
- int unix_comment; /* tri-state variable used to decide if it is
- * a unix-style comment. 0 means only blanks
- * since /+*, 1 means regular style comment, 2
- * means unix style comment */
- int break_delim = comment_delimiter_on_blankline;
- int l_just_saw_decl = ps.just_saw_decl;
- /*
- * int ps.last_nl = 0; true iff the last significant thing
- * weve seen is a newline
- */
- int one_liner = 1; /* true iff this comment is a one-liner */
- adj_max_col = max_col;
- ps.just_saw_decl = 0;
- last_bl = 0; /* no blanks found so far */
- ps.box_com = false; /* at first, assume that we are not in
- * a boxed comment or some other
- * comment that should not be touched */
- ++ps.out_coms; /* keep track of number of comments */
- unix_comment = 1; /* set flag to let us figure out if there is a
- * unix-style comment ** DISABLED: use 0 to
- * reenable this hack! */
-
- /* Figure where to align and how to treat the comment */
-
- if (ps.col_1 && !format_col1_comments) { /* if comment starts in column
- * 1 it should not be touched */
- ps.box_com = true;
- ps.com_col = 1;
- }
- else {
- if (*buf_ptr == '-' || *buf_ptr == '*' ||
- (*buf_ptr == '\n' && !format_block_comments)) {
- ps.box_com = true; /* A comment with a '-' or '*' immediately
- * after the /+* is assumed to be a boxed
- * comment. A comment with a newline
- * immediately after the /+* is assumed to
- * be a block comment and is treated as a
- * box comment unless format_block_comments
- * is nonzero (the default). */
- break_delim = 0;
- }
- if ( /* ps.bl_line && */ (s_lab == e_lab) && (s_code == e_code)) {
- /* klg: check only if this line is blank */
- /*
- * If this (*and previous lines are*) blank, dont put comment way
- * out at left
- */
- ps.com_col = (ps.ind_level - ps.unindent_displace) * ps.ind_size + 1;
- adj_max_col = block_comment_max_col;
- if (ps.com_col <= 1)
- ps.com_col = 1 + !format_col1_comments;
- }
- else {
- int target_col;
- break_delim = 0;
- if (s_code != e_code)
- target_col = count_spaces(compute_code_target(), s_code);
- else {
- target_col = 1;
- if (s_lab != e_lab)
- target_col = count_spaces(compute_label_target(), s_lab);
- }
- ps.com_col = ps.decl_on_line || ps.ind_level == 0 ? ps.decl_com_ind : ps.com_ind;
- if (ps.com_col < target_col)
- ps.com_col = ((target_col + 7) & ~7) + 1;
- if (ps.com_col + 24 > adj_max_col)
- adj_max_col = ps.com_col + 24;
- }
- }
- if (ps.box_com) {
- buf_ptr[-2] = 0;
- ps.n_comment_delta = 1 - count_spaces(1, in_buffer);
- buf_ptr[-2] = '/';
- }
- else {
- ps.n_comment_delta = 0;
- while (*buf_ptr == ' ' || *buf_ptr == '\t')
- buf_ptr++;
- }
- ps.comment_delta = 0;
- *e_com++ = '/'; /* put '/' followed by '*' into buffer */
- *e_com++ = '*';
- if (*buf_ptr != ' ' && !ps.box_com)
- *e_com++ = ' ';
-
- *e_com = '\0';
- if (troff) {
- now_col = 1;
- adj_max_col = 80;
- }
- else
- now_col = count_spaces(ps.com_col, s_com); /* figure what column we
- * would be in if we
- * printed the comment
- * now */
-
- /* Start to copy the comment */
-
- while (1) { /* this loop will go until the comment is
- * copied */
- if (*buf_ptr > 040 && *buf_ptr != '*')
- ps.last_nl = 0;
- CHECK_SIZE_COM;
- switch (*buf_ptr) { /* this checks for various spcl cases */
- case 014: /* check for a form feed */
- if (!ps.box_com) { /* in a text comment, break the line here */
- ps.use_ff = true;
- /* fix so dump_line uses a form feed */
- dump_line();
- last_bl = 0;
- *e_com++ = ' ';
- *e_com++ = '*';
- *e_com++ = ' ';
- while (*++buf_ptr == ' ' || *buf_ptr == '\t');
- }
- else {
- if (++buf_ptr >= buf_end)
- fill_buffer();
- *e_com++ = 014;
- }
- break;
-
- case '\n':
- if (had_eof) { /* check for unexpected eof */
- printf("Unterminated comment\n");
- *e_com = '\0';
- dump_line();
- return;
- }
- one_liner = 0;
- if (ps.box_com || ps.last_nl) { /* if this is a boxed comment,
- * we dont ignore the newline */
- if (s_com == e_com) {
- *e_com++ = ' ';
- *e_com++ = ' ';
- }
- *e_com = '\0';
- if (!ps.box_com && e_com - s_com > 3) {
- if (break_delim == 1 && s_com[0] == '/'
- && s_com[1] == '*' && s_com[2] == ' ') {
- char *t = e_com;
- break_delim = 2;
- e_com = s_com + 2;
- *e_com = 0;
- if (blanklines_before_blockcomments)
- prefix_blankline_requested = 1;
- dump_line();
- e_com = t;
- s_com[0] = s_com[1] = s_com[2] = ' ';
- }
- dump_line();
- CHECK_SIZE_COM;
- *e_com++ = ' ';
- *e_com++ = ' ';
- }
- dump_line();
- now_col = ps.com_col;
- }
- else {
- ps.last_nl = 1;
- if (unix_comment != 1) { /* we not are in unix_style
- * comment */
- if (unix_comment == 0 && s_code == e_code) {
- /*
- * if it is a UNIX-style comment, ignore the
- * requirement that previous line be blank for
- * unindention
- */
- ps.com_col = (ps.ind_level - ps.unindent_displace) * ps.ind_size + 1;
- if (ps.com_col <= 1)
- ps.com_col = 2;
- }
- unix_comment = 2; /* permanently remember that we are in
- * this type of comment */
- dump_line();
- ++line_no;
- now_col = ps.com_col;
- *e_com++ = ' ';
- /*
- * fix so that the star at the start of the line will line
- * up
- */
- do /* flush leading white space */
- if (++buf_ptr >= buf_end)
- fill_buffer();
- while (*buf_ptr == ' ' || *buf_ptr == '\t');
- break;
- }
- if (*(e_com - 1) == ' ' || *(e_com - 1) == '\t')
- last_bl = e_com - 1;
- /*
- * if there was a space at the end of the last line, remember
- * where it was
- */
- else { /* otherwise, insert one */
- last_bl = e_com;
- CHECK_SIZE_COM;
- *e_com++ = ' ';
- ++now_col;
- }
- }
- ++line_no; /* keep track of input line number */
- if (!ps.box_com) {
- int nstar = 1;
- do { /* flush any blanks and/or tabs at start of
- * next line */
- if (++buf_ptr >= buf_end)
- fill_buffer();
- if (*buf_ptr == '*' && --nstar >= 0) {
- if (++buf_ptr >= buf_end)
- fill_buffer();
- if (*buf_ptr == '/')
- goto end_of_comment;
- }
- } while (*buf_ptr == ' ' || *buf_ptr == '\t');
- }
- else if (++buf_ptr >= buf_end)
- fill_buffer();
- break; /* end of case for newline */
-
- case '*': /* must check for possibility of being at end
- * of comment */
- if (++buf_ptr >= buf_end) /* get to next char after * */
- fill_buffer();
-
- if (unix_comment == 0) /* set flag to show we are not in
- * unix-style comment */
- unix_comment = 1;
-
- if (*buf_ptr == '/') { /* it is the end!!! */
- end_of_comment:
- if (++buf_ptr >= buf_end)
- fill_buffer();
-
- if (*(e_com - 1) != ' ' && !ps.box_com) { /* insure blank before
- * end */
- *e_com++ = ' ';
- ++now_col;
- }
- if (break_delim == 1 && !one_liner && s_com[0] == '/'
- && s_com[1] == '*' && s_com[2] == ' ') {
- char *t = e_com;
- break_delim = 2;
- e_com = s_com + 2;
- *e_com = 0;
- if (blanklines_before_blockcomments)
- prefix_blankline_requested = 1;
- dump_line();
- e_com = t;
- s_com[0] = s_com[1] = s_com[2] = ' ';
- }
- if (break_delim == 2 && e_com > s_com + 3
- /* now_col > adj_max_col - 2 && !ps.box_com */ ) {
- *e_com = '\0';
- dump_line();
- now_col = ps.com_col;
- }
- CHECK_SIZE_COM;
- *e_com++ = '*';
- *e_com++ = '/';
- *e_com = '\0';
- ps.just_saw_decl = l_just_saw_decl;
- return;
- }
- else { /* handle isolated '*' */
- *e_com++ = '*';
- ++now_col;
- }
- break;
- default: /* we have a random char */
- if (unix_comment == 0 && *buf_ptr != ' ' && *buf_ptr != '\t')
- unix_comment = 1; /* we are not in unix-style comment */
-
- *e_com = *buf_ptr++;
- if (buf_ptr >= buf_end)
- fill_buffer();
-
- if (*e_com == '\t') /* keep track of column */
- now_col = ((now_col - 1) & tabmask) + tabsize + 1;
- else if (*e_com == '\b') /* this is a backspace */
- --now_col;
- else
- ++now_col;
-
- if (*e_com == ' ' || *e_com == '\t')
- last_bl = e_com;
- /* remember we saw a blank */
-
- ++e_com;
- if (now_col > adj_max_col && !ps.box_com && unix_comment == 1 && e_com[-1] > ' ') {
- /*
- * the comment is too long, it must be broken up
- */
- if (break_delim == 1 && s_com[0] == '/'
- && s_com[1] == '*' && s_com[2] == ' ') {
- char *t = e_com;
- break_delim = 2;
- e_com = s_com + 2;
- *e_com = 0;
- if (blanklines_before_blockcomments)
- prefix_blankline_requested = 1;
- dump_line();
- e_com = t;
- s_com[0] = s_com[1] = s_com[2] = ' ';
- }
- if (last_bl == 0) { /* we have seen no blanks */
- last_bl = e_com; /* fake it */
- *e_com++ = ' ';
- }
- *e_com = '\0'; /* print what we have */
- *last_bl = '\0';
- while (last_bl > s_com && last_bl[-1] < 040)
- *--last_bl = 0;
- e_com = last_bl;
- dump_line();
-
- *e_com++ = ' '; /* add blanks for continuation */
- *e_com++ = ' ';
- *e_com++ = ' ';
-
- t_ptr = last_bl + 1;
- last_bl = 0;
- if (t_ptr >= e_com) {
- while (*t_ptr == ' ' || *t_ptr == '\t')
- t_ptr++;
- while (*t_ptr != '\0') { /* move unprinted part of
- * comment down in buffer */
- if (*t_ptr == ' ' || *t_ptr == '\t')
- last_bl = e_com;
- *e_com++ = *t_ptr++;
- }
- }
- *e_com = '\0';
- now_col = count_spaces(ps.com_col, s_com); /* recompute current
- * position */
- }
- break;
- }
- }
-}
diff --git a/usr.bin/ipcrm/Makefile b/usr.bin/ipcrm/Makefile
deleted file mode 100644
index 47e4ccc..0000000
--- a/usr.bin/ipcrm/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-# $FreeBSD$
-
-PROG= ipcrm
-SRCS= ipcrm.c ipc.c
-DPADD= ${LIBKVM}
-LDADD= -lkvm
-CFLAGS+=-I${.CURDIR}/../ipcs
-.PATH: ${.CURDIR}/../ipcs
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ipcrm/ipcrm.1 b/usr.bin/ipcrm/ipcrm.1
deleted file mode 100644
index 30378f2..0000000
--- a/usr.bin/ipcrm/ipcrm.1
+++ /dev/null
@@ -1,119 +0,0 @@
-.\" Copyright (c) 1994 Adam Glass
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. The name of the Author may not be used to endorse or promote products
-.\" derived from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY Adam Glass ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL Adam Glass BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\""
-.Dd December 12, 2007
-.Dt IPCRM 1
-.Os
-.Sh NAME
-.Nm ipcrm
-.Nd "remove the specified message queues, semaphore sets, and shared segments"
-.Sh SYNOPSIS
-.Nm
-.Op Fl W
-.Op Fl v
-.Op Fl q Ar msqid
-.Op Fl m Ar shmid
-.Op Fl s Ar semid
-.Op Fl Q Ar msgkey
-.Op Fl M Ar shmkey
-.Op Fl S Ar semkey
-.Ar ...
-.Sh DESCRIPTION
-The
-.Nm
-utility removes the specified message queues, semaphores and shared memory
-segments.
-These System V IPC objects can be specified by their
-creation ID or any associated key.
-.Pp
-The following options are generic:
-.Bl -tag -width indent
-.It Fl v
-If specified once with -W or with -1 for an object, it will show
-all removed objects.
-If specified twice with -W or with -1 for an objects, it will show
-all removed objects and all failed removals.
-.It Fl W
-Try to wipe all specified message queues, semaphores and shared
-memory segments.
-.It Fl y
-Use the
-.Xr kvm 3
-interface instead of the
-.Xr sysctl 3
-interface to extract the required information.
-If
-.Nm
-is to operate on the running system,
-using
-.Xr kvm 3
-will require read privileges to
-.Pa /dev/kmem .
-.El
-.Pp
-The following options are used to specify which IPC objects will be removed.
-Any number and combination of these options can be used:
-.Bl -tag -width indent
-.It Fl q Ar msqid
-Remove the message queue associated with the ID
-.Ar msqid
-from the system.
-.It Fl m Ar shmid
-Mark the shared memory segment associated with ID
-.Ar shmid
-for removal.
-This marked segment will be destroyed after the last detach.
-.It Fl s Ar semid
-Remove the semaphore set associated with ID
-.Ar semid
-from the system.
-.It Fl Q Ar msgkey
-Remove the message queue associated with key
-.Ar msgkey
-from the system.
-.It Fl M Ar shmkey
-Mark the shared memory segment associated with key
-.Ar shmkey
-for removal.
-This marked segment will be destroyed after the last detach.
-.It Fl S Ar semkey
-Remove the semaphore set associated with key
-.Ar semkey
-from the system.
-.El
-.Pp
-The identifiers and keys associated with these System V IPC objects can be
-determined by using
-.Xr ipcs 1 .
-If the identifier or the key is -1, it will remove all these objects.
-.Sh SEE ALSO
-.Xr ipcs 1
-.Sh HISTORY
-The wiping of all System V IPC objects was first implemented in
-.Fx 6.4 and 7.1.
-.Sh AUTHORS
-The original author was Adam Glass.
-The wiping of all System V IPC objects was thought up by Callum
-Gibson and extended and implemented by Edwin Groothuis.
diff --git a/usr.bin/ipcrm/ipcrm.c b/usr.bin/ipcrm/ipcrm.c
deleted file mode 100644
index 32887e0..0000000
--- a/usr.bin/ipcrm/ipcrm.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright (c) 1994 Adam Glass
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Adam Glass.
- * 4. The name of the Author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY Adam Glass ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL Adam Glass BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#define _KERNEL
-#include <sys/sem.h>
-#include <sys/shm.h>
-#include <sys/msg.h>
-#undef _KERNEL
-
-#include <ctype.h>
-#include <err.h>
-#include <grp.h>
-#include <kvm.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include "ipc.h"
-
-int signaled;
-int errflg;
-int rmverbose = 0;
-
-void usage(void);
-
-int msgrm(key_t, int);
-int shmrm(key_t, int);
-int semrm(key_t, int);
-void not_configured(int);
-
-void
-usage(void)
-{
-
- fprintf(stderr,
- "usage: ipcrm [-W] [-v[v]]\n"
- " [-q msqid] [-m shmid] [-s semid]\n"
- " [-Q msgkey] [-M shmkey] [-S semkey] ...\n");
- exit(1);
-}
-
-int
-msgrm(key_t key, int id)
-{
-
- if (key == -1 || id == -1) {
- struct msqid_kernel *kxmsqids;
- size_t kxmsqids_len;
- int num;
-
- kget(X_MSGINFO, &msginfo, sizeof(msginfo));
- kxmsqids_len = sizeof(struct msqid_kernel) * msginfo.msgmni;
- kxmsqids = malloc(kxmsqids_len);
- kget(X_MSQIDS, kxmsqids, kxmsqids_len);
- num = msginfo.msgmni;
- while (num-- && !signaled)
- if (kxmsqids[num].u.msg_qbytes != 0) {
- id = IXSEQ_TO_IPCID(num,
- kxmsqids[num].u.msg_perm);
- if (msgctl(id, IPC_RMID, NULL) < 0) {
- if (rmverbose > 1)
- warn("msqid(%d): ", id);
- errflg++;
- } else
- if (rmverbose)
- printf(
- "Removed %s %d\n",
- IPC_TO_STRING('Q'),
- id);
- }
- return signaled ? -1 : 0; /* errors maybe handled above */
- }
-
- if (key) {
- id = msgget(key, 0);
- if (id == -1)
- return -1;
- }
-
- return msgctl(id, IPC_RMID, NULL);
-}
-
-int
-shmrm(key_t key, int id)
-{
-
- if (key == -1 || id == -1) {
- struct shmid_kernel *kxshmids;
- size_t kxshmids_len;
- int num;
-
- kget(X_SHMINFO, &shminfo, sizeof(shminfo));
- kxshmids_len = sizeof(struct shmid_kernel) * shminfo.shmmni;
- kxshmids = malloc(kxshmids_len);
- kget(X_SHMSEGS, kxshmids, kxshmids_len);
- num = shminfo.shmmni;
- while (num-- && !signaled)
- if (kxshmids[num].u.shm_perm.mode & 0x0800) {
- id = IXSEQ_TO_IPCID(num,
- kxshmids[num].u.shm_perm);
- if (shmctl(id, IPC_RMID, NULL) < 0) {
- if (rmverbose > 1)
- warn("shmid(%d): ", id);
- errflg++;
- } else
- if (rmverbose)
- printf(
- "Removed %s %d\n",
- IPC_TO_STRING('M'),
- id);
- }
- return signaled ? -1 : 0; /* errors maybe handled above */
- }
-
- if (key) {
- id = shmget(key, 0, 0);
- if (id == -1)
- return -1;
- }
-
- return shmctl(id, IPC_RMID, NULL);
-}
-
-int
-semrm(key_t key, int id)
-{
- union semun arg;
-
- if (key == -1 || id == -1) {
- struct semid_kernel *kxsema;
- size_t kxsema_len;
- int num;
-
- kget(X_SEMINFO, &seminfo, sizeof(seminfo));
- kxsema_len = sizeof(struct semid_kernel) * seminfo.semmni;
- kxsema = malloc(kxsema_len);
- kget(X_SEMA, kxsema, kxsema_len);
- num = seminfo.semmni;
- while (num-- && !signaled)
- if ((kxsema[num].u.sem_perm.mode & SEM_ALLOC) != 0) {
- id = IXSEQ_TO_IPCID(num,
- kxsema[num].u.sem_perm);
- if (semctl(id, IPC_RMID, NULL) < 0) {
- if (rmverbose > 1)
- warn("semid(%d): ", id);
- errflg++;
- } else
- if (rmverbose)
- printf(
- "Removed %s %d\n",
- IPC_TO_STRING('S'),
- id);
- }
- return signaled ? -1 : 0; /* errors maybe handled above */
- }
-
- if (key) {
- id = semget(key, 0, 0);
- if (id == -1)
- return -1;
- }
-
- return semctl(id, 0, IPC_RMID, arg);
-}
-
-void
-not_configured(int signo __unused)
-{
-
- signaled++;
-}
-
-int
-main(int argc, char *argv[])
-{
- int c, result, target_id;
- key_t target_key;
-
- while ((c = getopt(argc, argv, "q:m:s:Q:M:S:vWy")) != -1) {
-
- signaled = 0;
- switch (c) {
- case 'v':
- rmverbose++;
- break;
- case 'y':
- use_sysctl = 0;
- break;
- }
- }
-
- optind = 1;
- errflg = 0;
- signal(SIGSYS, not_configured);
- while ((c = getopt(argc, argv, "q:m:s:Q:M:S:vWy")) != -1) {
-
- signaled = 0;
- switch (c) {
- case 'q':
- case 'm':
- case 's':
- target_id = atoi(optarg);
- if (c == 'q')
- result = msgrm(0, target_id);
- else if (c == 'm')
- result = shmrm(0, target_id);
- else
- result = semrm(0, target_id);
- if (result < 0) {
- errflg++;
- if (!signaled)
- warn("%sid(%d): ",
- IPC_TO_STR(toupper(c)), target_id);
- else
- warnx(
- "%ss are not configured "
- "in the running kernel",
- IPC_TO_STRING(toupper(c)));
- }
- break;
- case 'Q':
- case 'M':
- case 'S':
- target_key = atol(optarg);
- if (target_key == IPC_PRIVATE) {
- warnx("can't remove private %ss",
- IPC_TO_STRING(c));
- continue;
- }
- if (c == 'Q')
- result = msgrm(target_key, 0);
- else if (c == 'M')
- result = shmrm(target_key, 0);
- else
- result = semrm(target_key, 0);
- if (result < 0) {
- errflg++;
- if (!signaled)
- warn("%ss(%ld): ",
- IPC_TO_STR(c), target_key);
- else
- warnx("%ss are not configured "
- "in the running kernel",
- IPC_TO_STRING(c));
- }
- break;
- case 'v':
- case 'y':
- /* Handled in other getopt() loop */
- break;
- case 'W':
- msgrm(-1, 0);
- shmrm(-1, 0);
- semrm(-1, 0);
- break;
- case ':':
- fprintf(stderr,
- "option -%c requires an argument\n", optopt);
- usage();
- case '?':
- fprintf(stderr, "unrecognized option: -%c\n", optopt);
- usage();
- }
- }
-
- if (optind != argc) {
- fprintf(stderr, "unknown argument: %s\n", argv[optind]);
- usage();
- }
- exit(errflg);
-}
diff --git a/usr.bin/ipcs/Makefile b/usr.bin/ipcs/Makefile
deleted file mode 100644
index 8ee1d43..0000000
--- a/usr.bin/ipcs/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# $FreeBSD$
-
-PROG= ipcs
-SRCS= ipcs.c ipc.c
-DPADD= ${LIBKVM}
-LDADD= -lkvm
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ipcs/ipc.c b/usr.bin/ipcs/ipc.c
deleted file mode 100644
index dfb4bae..0000000
--- a/usr.bin/ipcs/ipc.c
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (c) 1994 SigmaSoft, Th. Lockert <tholo@sigmasoft.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The split of ipcs.c into ipcs.c and ipc.c to accomodate the
- * changes in ipcrm.c was done by Edwin Groothuis <edwin@FreeBSD.org>
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#define _KERNEL
-#include <sys/sem.h>
-#include <sys/shm.h>
-#include <sys/msg.h>
-#undef _KERNEL
-
-#include <assert.h>
-#include <err.h>
-#include <kvm.h>
-#include <nlist.h>
-#include <stddef.h>
-#include <stdio.h>
-
-#include "ipc.h"
-
-int use_sysctl = 1;
-struct semid_kernel *sema;
-struct seminfo seminfo;
-struct msginfo msginfo;
-struct msqid_kernel *msqids;
-struct shminfo shminfo;
-struct shmid_kernel *shmsegs;
-void kget(int idx, void *addr, size_t size);
-
-struct nlist symbols[] = {
- {"sema"},
- {"seminfo"},
- {"msginfo"},
- {"msqids"},
- {"shminfo"},
- {"shmsegs"},
- {NULL}
-};
-
-#define SHMINFO_XVEC X(shmmax, sizeof(u_long)) \
- X(shmmin, sizeof(u_long)) \
- X(shmmni, sizeof(u_long)) \
- X(shmseg, sizeof(u_long)) \
- X(shmall, sizeof(u_long))
-
-#define SEMINFO_XVEC X(semmap, sizeof(int)) \
- X(semmni, sizeof(int)) \
- X(semmns, sizeof(int)) \
- X(semmnu, sizeof(int)) \
- X(semmsl, sizeof(int)) \
- X(semopm, sizeof(int)) \
- X(semume, sizeof(int)) \
- X(semusz, sizeof(int)) \
- X(semvmx, sizeof(int)) \
- X(semaem, sizeof(int))
-
-#define MSGINFO_XVEC X(msgmax, sizeof(int)) \
- X(msgmni, sizeof(int)) \
- X(msgmnb, sizeof(int)) \
- X(msgtql, sizeof(int)) \
- X(msgssz, sizeof(int)) \
- X(msgseg, sizeof(int))
-
-#define X(a, b) { "kern.ipc." #a, offsetof(TYPEC, a), (b) },
-#define TYPEC struct shminfo
-struct scgs_vector shminfo_scgsv[] = { SHMINFO_XVEC { NULL } };
-#undef TYPEC
-#define TYPEC struct seminfo
-struct scgs_vector seminfo_scgsv[] = { SEMINFO_XVEC { NULL } };
-#undef TYPEC
-#define TYPEC struct msginfo
-struct scgs_vector msginfo_scgsv[] = { MSGINFO_XVEC { NULL } };
-#undef TYPEC
-#undef X
-
-kvm_t *kd;
-
-void
-sysctlgatherstruct(void *addr, size_t size, struct scgs_vector *vecarr)
-{
- struct scgs_vector *xp;
- size_t tsiz;
- int rv;
-
- for (xp = vecarr; xp->sysctl != NULL; xp++) {
- assert(xp->offset <= size);
- tsiz = xp->size;
- rv = sysctlbyname(xp->sysctl, (char *)addr + xp->offset,
- &tsiz, NULL, 0);
- if (rv == -1)
- err(1, "sysctlbyname: %s", xp->sysctl);
- if (tsiz != xp->size)
- errx(1, "%s size mismatch (expected %d, got %d)",
- xp->sysctl, xp->size, tsiz);
- }
-}
-
-void
-kget(int idx, void *addr, size_t size)
-{
- char *symn; /* symbol name */
- size_t tsiz;
- int rv;
- unsigned long kaddr;
- const char *sym2sysctl[] = { /* symbol to sysctl name table */
- "kern.ipc.sema",
- "kern.ipc.seminfo",
- "kern.ipc.msginfo",
- "kern.ipc.msqids",
- "kern.ipc.shminfo",
- "kern.ipc.shmsegs" };
-
- assert((unsigned)idx <= sizeof(sym2sysctl) / sizeof(*sym2sysctl));
- if (!use_sysctl) {
- symn = symbols[idx].n_name;
- if (*symn == '_')
- symn++;
- if (symbols[idx].n_type == 0 || symbols[idx].n_value == 0)
- errx(1, "symbol %s undefined", symn);
- /*
- * For some symbols, the value we retrieve is
- * actually a pointer; since we want the actual value,
- * we have to manually dereference it.
- */
- switch (idx) {
- case X_MSQIDS:
- tsiz = sizeof(msqids);
- rv = kvm_read(kd, symbols[idx].n_value,
- &msqids, tsiz);
- kaddr = (u_long)msqids;
- break;
- case X_SHMSEGS:
- tsiz = sizeof(shmsegs);
- rv = kvm_read(kd, symbols[idx].n_value,
- &shmsegs, tsiz);
- kaddr = (u_long)shmsegs;
- break;
- case X_SEMA:
- tsiz = sizeof(sema);
- rv = kvm_read(kd, symbols[idx].n_value,
- &sema, tsiz);
- kaddr = (u_long)sema;
- break;
- default:
- rv = tsiz = 0;
- kaddr = symbols[idx].n_value;
- break;
- }
- if ((unsigned)rv != tsiz)
- errx(1, "%s: %s", symn, kvm_geterr(kd));
- if ((unsigned)kvm_read(kd, kaddr, addr, size) != size)
- errx(1, "%s: %s", symn, kvm_geterr(kd));
- } else {
- switch (idx) {
- case X_SHMINFO:
- sysctlgatherstruct(addr, size, shminfo_scgsv);
- break;
- case X_SEMINFO:
- sysctlgatherstruct(addr, size, seminfo_scgsv);
- break;
- case X_MSGINFO:
- sysctlgatherstruct(addr, size, msginfo_scgsv);
- break;
- default:
- tsiz = size;
- rv = sysctlbyname(sym2sysctl[idx], addr, &tsiz,
- NULL, 0);
- if (rv == -1)
- err(1, "sysctlbyname: %s", sym2sysctl[idx]);
- if (tsiz != size)
- errx(1, "%s size mismatch "
- "(expected %d, got %d)",
- sym2sysctl[idx], size, tsiz);
- break;
- }
- }
-}
diff --git a/usr.bin/ipcs/ipc.h b/usr.bin/ipcs/ipc.h
deleted file mode 100644
index a7a70de..0000000
--- a/usr.bin/ipcs/ipc.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 1994 SigmaSoft, Th. Lockert <tholo@sigmasoft.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The split of ipcs.c into ipcs.c and ipc.c to accomodate the
- * changes in ipcrm.c was done by Edwin Groothuis <edwin@FreeBSD.org>
- *
- * $FreeBSD$
- */
-
-/* Part of struct nlist symbols[] */
-#define X_SEMA 0
-#define X_SEMINFO 1
-#define X_MSGINFO 2
-#define X_MSQIDS 3
-#define X_SHMINFO 4
-#define X_SHMSEGS 5
-
-#define SHMINFO 1
-#define SHMTOTAL 2
-#define MSGINFO 4
-#define MSGTOTAL 8
-#define SEMINFO 16
-#define SEMTOTAL 32
-
-#define IPC_TO_STR(x) (x == 'Q' ? "msq" : (x == 'M' ? "shm" : "sem"))
-#define IPC_TO_STRING(x) (x == 'Q' ? "message queue" : \
- (x == 'M' ? "shared memory segment" : "semaphore"))
-
-/* SysCtlGatherStruct structure. */
-struct scgs_vector {
- const char *sysctl;
- off_t offset;
- size_t size;
-};
-
-void kget(int idx, void *addr, size_t size);
-void sysctlgatherstruct(void *addr, size_t size, struct scgs_vector *vec);
-
-extern int use_sysctl;
-extern struct nlist symbols[];
-extern kvm_t *kd;
-
-extern struct semid_kernel *sema;
-extern struct seminfo seminfo;
-extern struct msginfo msginfo;
-extern struct msqid_kernel *msqids;
-extern struct shminfo shminfo;
-extern struct shmid_kernel *shmsegs;
diff --git a/usr.bin/ipcs/ipcs.1 b/usr.bin/ipcs/ipcs.1
deleted file mode 100644
index 7d23134..0000000
--- a/usr.bin/ipcs/ipcs.1
+++ /dev/null
@@ -1,176 +0,0 @@
-.\"
-.\" Copyright (c) 1994 SigmaSoft, Th. Lockert
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by SigmaSoft, Th. Lockert.
-.\" 3. The name of the author may not be used to endorse or promote products
-.\" derived from this software without specific prior written permission
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd March 24, 2004
-.Dt "IPCS" 1
-.Os
-.Sh NAME
-.Nm ipcs
-.Nd report System V interprocess communication facilities status
-.Sh SYNOPSIS
-.Nm
-.Op Fl abcmopqstMQSTy
-.Op Fl C Ar core
-.Op Fl N Ar system
-.Op Fl u Ar user
-.Sh DESCRIPTION
-The
-.Nm
-utility provides information on System V interprocess communication
-(IPC) facilities on the system.
-.Pp
-The options are as follows:
-.Bl -tag -width Ds
-.It Fl a
-Show the maximum amount of information possible when
-displaying active semaphores, message queues,
-and shared memory segments.
-(This is shorthand for specifying the
-.Fl b ,
-.Fl c ,
-.Fl o ,
-.Fl p ,
-and
-.Fl t
-options.)
-.It Fl b
-Show the maximum allowed sizes for active semaphores, message queues,
-and shared memory segments.
-The
-.Dq maximum allowed size
-is the maximum number of bytes in a message on a message queue,
-the size of a shared memory segment,
-or the number of semaphores in a set of semaphores.
-.It Fl c
-Show the creator's name and group for active semaphores, message queues,
-and shared memory segments.
-.It Fl m
-Display information about active shared memory segments.
-.It Fl o
-Show outstanding usage for active message queues,
-and shared memory segments.
-The
-.Dq outstanding usage
-is the number of messages in a message queue, or the number
-of processes attached to a shared memory segment.
-.It Fl p
-Show the process ID information for active semaphores, message queues,
-and shared memory segments.
-The
-.Dq process ID information
-is the last process to send a message to or receive a message from
-a message queue,
-the process that created a semaphore, or the last process to attach
-or detach a shared memory segment.
-.It Fl q
-Display information about active message queues.
-.It Fl s
-Display information about active semaphores.
-.It Fl t
-Show access times for active semaphores, message queues,
-and shared memory segments.
-The access times is the time
-of the last control operation on an IPC object,
-the last send or receive of a message,
-the last attach or detach of a shared memory segment,
-or the last operation on a semaphore.
-.It Fl C Ar core
-Extract values associated with the name list from the specified
-core instead of the default
-.Pa /dev/kmem .
-Implies
-.Fl y .
-.It Fl M
-Display system information about shared memory.
-.It Fl N Ar system
-Extract the name list from the specified system instead of the
-default
-.Pa /boot/kernel/kernel .
-Implies
-.Fl y .
-.It Fl Q
-Display system information about messages queues.
-.It Fl S
-Display system information about semaphores.
-.It Fl T
-Display system information about shared memory, message queues
-and semaphores.
-.It Fl y
-Use the
-.Xr kvm 3
-interface instead of the
-.Xr sysctl 3
-interface to extract the required information.
-If
-.Nm
-is to operate on the running system,
-using
-.Xr kvm 3
-will require read privileges to
-.Pa /dev/kmem .
-.It Fl u Ar user
-Display information about IPC mechanisms owned by
-.Pa user .
-User specification can be in the form of a numeric UID or
-a login name.
-.El
-.Pp
-If none of the
-.Fl M ,
-.Fl m ,
-.Fl Q ,
-.Fl q ,
-.Fl S ,
-or
-.Fl s
-options are specified, information about all active IPC facilities is
-listed.
-.Sh RESTRICTIONS
-System data structures may change while
-.Nm
-is running; the output of
-.Nm
-is not guaranteed to be consistent.
-.Sh FILES
-.Bl -tag -width /boot/kernel/kernel -compact
-.It Pa /dev/kmem
-default kernel memory
-.It Pa /boot/kernel/kernel
-default system name list
-.El
-.Sh SEE ALSO
-.Xr ipcrm 1
-.Sh AUTHORS
-.An Thorsten Lockert Aq tholo@sigmasoft.com
-.Sh BUGS
-This manual page is woefully incomplete, because it does not
-at all attempt to explain the information printed by
-.Nm .
diff --git a/usr.bin/ipcs/ipcs.c b/usr.bin/ipcs/ipcs.c
deleted file mode 100644
index eb50ed6..0000000
--- a/usr.bin/ipcs/ipcs.c
+++ /dev/null
@@ -1,571 +0,0 @@
-/*
- * Copyright (c) 1994 SigmaSoft, Th. Lockert <tholo@sigmasoft.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/proc.h>
-#define _KERNEL
-#include <sys/sem.h>
-#include <sys/shm.h>
-#include <sys/msg.h>
-#undef _KERNEL
-
-#include <err.h>
-#include <fcntl.h>
-#include <grp.h>
-#include <kvm.h>
-#include <limits.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "ipc.h"
-
-char *fmt_perm(u_short);
-void cvt_time(time_t, char *);
-void usage(void);
-uid_t user2uid(char *username);
-
-void print_kmsqtotal(struct msginfo msginfo);
-void print_kmsqheader(int option);
-void print_kmsqptr(int i, int option, struct msqid_kernel *kmsqptr);
-void print_kshmtotal(struct shminfo shminfo);
-void print_kshmheader(int option);
-void print_kshmptr(int i, int option, struct shmid_kernel *kshmptr);
-void print_ksemtotal(struct seminfo seminfo);
-void print_ksemheader(int option);
-void print_ksemptr(int i, int option, struct semid_kernel *ksemaptr);
-
-char *
-fmt_perm(u_short mode)
-{
- static char buffer[100];
-
- buffer[0] = '-';
- buffer[1] = '-';
- buffer[2] = ((mode & 0400) ? 'r' : '-');
- buffer[3] = ((mode & 0200) ? 'w' : '-');
- buffer[4] = ((mode & 0100) ? 'a' : '-');
- buffer[5] = ((mode & 0040) ? 'r' : '-');
- buffer[6] = ((mode & 0020) ? 'w' : '-');
- buffer[7] = ((mode & 0010) ? 'a' : '-');
- buffer[8] = ((mode & 0004) ? 'r' : '-');
- buffer[9] = ((mode & 0002) ? 'w' : '-');
- buffer[10] = ((mode & 0001) ? 'a' : '-');
- buffer[11] = '\0';
- return (&buffer[0]);
-}
-
-void
-cvt_time(time_t t, char *buf)
-{
- struct tm *tm;
-
- if (t == 0) {
- strcpy(buf, "no-entry");
- } else {
- tm = localtime(&t);
- sprintf(buf, "%2d:%02d:%02d",
- tm->tm_hour, tm->tm_min, tm->tm_sec);
- }
-}
-
-#define BIGGEST 1
-#define CREATOR 2
-#define OUTSTANDING 4
-#define PID 8
-#define TIME 16
-
-int
-main(int argc, char *argv[])
-{
- int display = SHMINFO | MSGINFO | SEMINFO;
- int option = 0;
- char *core = NULL, *user = NULL, *namelist = NULL;
- char kvmoferr[_POSIX2_LINE_MAX]; /* Error buf for kvm_openfiles. */
- int i;
- uid_t uid = 0;
-
- while ((i = getopt(argc, argv, "MmQqSsabC:cN:optTu:y")) != -1)
- switch (i) {
- case 'a':
- option |= BIGGEST | CREATOR | OUTSTANDING | PID | TIME;
- break;
- case 'b':
- option |= BIGGEST;
- break;
- case 'C':
- core = optarg;
- break;
- case 'c':
- option |= CREATOR;
- break;
- case 'M':
- display = SHMTOTAL;
- break;
- case 'm':
- display = SHMINFO;
- break;
- case 'N':
- namelist = optarg;
- break;
- case 'o':
- option |= OUTSTANDING;
- break;
- case 'p':
- option |= PID;
- break;
- case 'Q':
- display = MSGTOTAL;
- break;
- case 'q':
- display = MSGINFO;
- break;
- case 'S':
- display = SEMTOTAL;
- break;
- case 's':
- display = SEMINFO;
- break;
- case 'T':
- display = SHMTOTAL | MSGTOTAL | SEMTOTAL;
- break;
- case 't':
- option |= TIME;
- break;
- case 'u':
- user = optarg;
- uid = user2uid(user);
- break;
- case 'y':
- use_sysctl = 0;
- break;
- default:
- usage();
- }
-
- /*
- * If paths to the exec file or core file were specified, we
- * aren't operating on the running kernel, so we can't use
- * sysctl.
- */
- if (namelist != NULL || core != NULL)
- use_sysctl = 0;
-
- if (!use_sysctl) {
- kd = kvm_openfiles(namelist, core, NULL, O_RDONLY, kvmoferr);
- if (kd == NULL)
- errx(1, "kvm_openfiles: %s", kvmoferr);
- switch (kvm_nlist(kd, symbols)) {
- case 0:
- break;
- case -1:
- errx(1, "unable to read kernel symbol table");
- default:
- break;
- }
- }
-
- kget(X_MSGINFO, &msginfo, sizeof(msginfo));
- if ((display & (MSGINFO | MSGTOTAL))) {
- if (display & MSGTOTAL)
- print_kmsqtotal(msginfo);
-
- if (display & MSGINFO) {
- struct msqid_kernel *kxmsqids;
- size_t kxmsqids_len;
-
- kxmsqids_len =
- sizeof(struct msqid_kernel) * msginfo.msgmni;
- kxmsqids = malloc(kxmsqids_len);
- kget(X_MSQIDS, kxmsqids, kxmsqids_len);
-
- print_kmsqheader(option);
-
- for (i = 0; i < msginfo.msgmni; i += 1) {
- if (kxmsqids[i].u.msg_qbytes != 0) {
- if (user &&
- uid != kxmsqids[i].u.msg_perm.uid)
- continue;
-
- print_kmsqptr(i, option, &kxmsqids[i]);
- }
-
- }
-
- printf("\n");
- }
- } else
- if (display & (MSGINFO | MSGTOTAL)) {
- fprintf(stderr,
- "SVID messages facility "
- "not configured in the system\n");
- }
-
- kget(X_SHMINFO, &shminfo, sizeof(shminfo));
- if ((display & (SHMINFO | SHMTOTAL))) {
-
- if (display & SHMTOTAL)
- print_kshmtotal(shminfo);
-
- if (display & SHMINFO) {
- struct shmid_kernel *kxshmids;
- size_t kxshmids_len;
-
- kxshmids_len =
- sizeof(struct shmid_kernel) * shminfo.shmmni;
- kxshmids = malloc(kxshmids_len);
- kget(X_SHMSEGS, kxshmids, kxshmids_len);
-
- print_kshmheader(option);
-
- for (i = 0; i < shminfo.shmmni; i += 1) {
- if (kxshmids[i].u.shm_perm.mode & 0x0800) {
- if (user &&
- uid != kxshmids[i].u.shm_perm.uid)
- continue;
-
- print_kshmptr(i, option, &kxshmids[i]);
- }
- }
- printf("\n");
- }
- } else
- if (display & (SHMINFO | SHMTOTAL)) {
- fprintf(stderr,
- "SVID shared memory facility "
- "not configured in the system\n");
- }
-
- kget(X_SEMINFO, &seminfo, sizeof(seminfo));
- if ((display & (SEMINFO | SEMTOTAL))) {
- struct semid_kernel *kxsema;
- size_t kxsema_len;
-
- if (display & SEMTOTAL)
- print_ksemtotal(seminfo);
-
- if (display & SEMINFO) {
- kxsema_len =
- sizeof(struct semid_kernel) * seminfo.semmni;
- kxsema = malloc(kxsema_len);
- kget(X_SEMA, kxsema, kxsema_len);
-
- print_ksemheader(option);
-
- for (i = 0; i < seminfo.semmni; i += 1) {
- if ((kxsema[i].u.sem_perm.mode & SEM_ALLOC)
- != 0) {
- if (user &&
- uid != kxsema[i].u.sem_perm.uid)
- continue;
-
- print_ksemptr(i, option, &kxsema[i]);
-
- }
- }
-
- printf("\n");
- }
- } else
- if (display & (SEMINFO | SEMTOTAL)) {
- fprintf(stderr,
- "SVID semaphores facility "
- "not configured in the system\n");
- }
-
- if (!use_sysctl)
- kvm_close(kd);
-
- exit(0);
-}
-
-void
-print_kmsqtotal(struct msginfo msginfo)
-{
-
- printf("msginfo:\n");
- printf("\tmsgmax: %12d\t(max characters in a message)\n",
- msginfo.msgmax);
- printf("\tmsgmni: %12d\t(# of message queues)\n",
- msginfo.msgmni);
- printf("\tmsgmnb: %12d\t(max characters in a message queue)\n",
- msginfo.msgmnb);
- printf("\tmsgtql: %12d\t(max # of messages in system)\n",
- msginfo.msgtql);
- printf("\tmsgssz: %12d\t(size of a message segment)\n",
- msginfo.msgssz);
- printf("\tmsgseg: %12d\t(# of message segments in system)\n\n",
- msginfo.msgseg);
-}
-
-void print_kmsqheader(int option)
-{
-
- printf("Message Queues:\n");
- printf("T %12s %12s %-11s %-8s %-8s",
- "ID", "KEY", "MODE", "OWNER", "GROUP");
- if (option & CREATOR)
- printf(" %-8s %-8s", "CREATOR", "CGROUP");
- if (option & OUTSTANDING)
- printf(" %20s %20s", "CBYTES", "QNUM");
- if (option & BIGGEST)
- printf(" %20s", "QBYTES");
- if (option & PID)
- printf(" %12s %12s", "LSPID", "LRPID");
- if (option & TIME)
- printf(" %-8s %-8s %-8s", "STIME", "RTIME", "CTIME");
- printf("\n");
-}
-
-void
-print_kmsqptr(int i, int option, struct msqid_kernel *kmsqptr)
-{
- char stime_buf[100], rtime_buf[100], ctime_buf[100];
-
- cvt_time(kmsqptr->u.msg_stime, stime_buf);
- cvt_time(kmsqptr->u.msg_rtime, rtime_buf);
- cvt_time(kmsqptr->u.msg_ctime, ctime_buf);
-
- printf("q %12d %12d %s %-8s %-8s",
- IXSEQ_TO_IPCID(i, kmsqptr->u.msg_perm),
- (int)kmsqptr->u.msg_perm.key,
- fmt_perm(kmsqptr->u.msg_perm.mode),
- user_from_uid(kmsqptr->u.msg_perm.uid, 0),
- group_from_gid(kmsqptr->u.msg_perm.gid, 0));
-
- if (option & CREATOR)
- printf(" %-8s %-8s",
- user_from_uid(kmsqptr->u.msg_perm.cuid, 0),
- group_from_gid(kmsqptr->u.msg_perm.cgid, 0));
-
- if (option & OUTSTANDING)
- printf(" %12lu %12lu",
- kmsqptr->u.msg_cbytes,
- kmsqptr->u.msg_qnum);
-
- if (option & BIGGEST)
- printf(" %20lu", kmsqptr->u.msg_qbytes);
-
- if (option & PID)
- printf(" %12d %12d",
- kmsqptr->u.msg_lspid,
- kmsqptr->u.msg_lrpid);
-
- if (option & TIME)
- printf(" %s %s %s",
- stime_buf,
- rtime_buf,
- ctime_buf);
-
- printf("\n");
-}
-
-void
-print_kshmtotal(struct shminfo shminfo)
-{
-
- printf("shminfo:\n");
- printf("\tshmmax: %12d\t(max shared memory segment size)\n",
- shminfo.shmmax);
- printf("\tshmmin: %12d\t(min shared memory segment size)\n",
- shminfo.shmmin);
- printf("\tshmmni: %12d\t(max number of shared memory identifiers)\n",
- shminfo.shmmni);
- printf("\tshmseg: %12d\t(max shared memory segments per process)\n",
- shminfo.shmseg);
- printf("\tshmall: %12d\t(max amount of shared memory in pages)\n\n",
- shminfo.shmall);
-}
-
-void
-print_kshmheader(int option)
-{
-
- printf("Shared Memory:\n");
- printf("T %12s %12s %-11s %-8s %-8s",
- "ID", "KEY", "MODE", "OWNER", "GROUP");
- if (option & CREATOR)
- printf(" %-8s %-8s", "CREATOR", "CGROUP");
- if (option & OUTSTANDING)
- printf(" %12s", "NATTCH");
- if (option & BIGGEST)
- printf(" %12s", "SEGSZ");
- if (option & PID)
- printf(" %12s %12s", "CPID", "LPID");
- if (option & TIME)
- printf(" %-8s %-8s %-8s", "ATIME", "DTIME", "CTIME");
- printf("\n");
-}
-
-void
-print_kshmptr(int i, int option, struct shmid_kernel *kshmptr)
-{
- char atime_buf[100], dtime_buf[100], ctime_buf[100];
-
- cvt_time(kshmptr->u.shm_atime, atime_buf);
- cvt_time(kshmptr->u.shm_dtime, dtime_buf);
- cvt_time(kshmptr->u.shm_ctime, ctime_buf);
-
- printf("m %12d %12d %s %-8s %-8s",
- IXSEQ_TO_IPCID(i, kshmptr->u.shm_perm),
- (int)kshmptr->u.shm_perm.key,
- fmt_perm(kshmptr->u.shm_perm.mode),
- user_from_uid(kshmptr->u.shm_perm.uid, 0),
- group_from_gid(kshmptr->u.shm_perm.gid, 0));
-
- if (option & CREATOR)
- printf(" %-8s %-8s",
- user_from_uid(kshmptr->u.shm_perm.cuid, 0),
- group_from_gid(kshmptr->u.shm_perm.cgid, 0));
-
- if (option & OUTSTANDING)
- printf(" %12d",
- kshmptr->u.shm_nattch);
-
- if (option & BIGGEST)
- printf(" %12d",
- kshmptr->u.shm_segsz);
-
- if (option & PID)
- printf(" %12d %12d",
- kshmptr->u.shm_cpid,
- kshmptr->u.shm_lpid);
-
- if (option & TIME)
- printf(" %s %s %s",
- atime_buf,
- dtime_buf,
- ctime_buf);
-
- printf("\n");
-}
-
-void
-print_ksemtotal(struct seminfo seminfo)
-{
-
- printf("seminfo:\n");
- printf("\tsemmap: %12d\t(# of entries in semaphore map)\n",
- seminfo.semmap);
- printf("\tsemmni: %12d\t(# of semaphore identifiers)\n",
- seminfo.semmni);
- printf("\tsemmns: %12d\t(# of semaphores in system)\n",
- seminfo.semmns);
- printf("\tsemmnu: %12d\t(# of undo structures in system)\n",
- seminfo.semmnu);
- printf("\tsemmsl: %12d\t(max # of semaphores per id)\n",
- seminfo.semmsl);
- printf("\tsemopm: %12d\t(max # of operations per semop call)\n",
- seminfo.semopm);
- printf("\tsemume: %12d\t(max # of undo entries per process)\n",
- seminfo.semume);
- printf("\tsemusz: %12d\t(size in bytes of undo structure)\n",
- seminfo.semusz);
- printf("\tsemvmx: %12d\t(semaphore maximum value)\n",
- seminfo.semvmx);
- printf("\tsemaem: %12d\t(adjust on exit max value)\n\n",
- seminfo.semaem);
-}
-
-void
-print_ksemheader(int option)
-{
-
- printf("Semaphores:\n");
- printf("T %12s %12s %-11s %-8s %-8s",
- "ID", "KEY", "MODE", "OWNER", "GROUP");
- if (option & CREATOR)
- printf(" %-8s %-8s", "CREATOR", "CGROUP");
- if (option & BIGGEST)
- printf(" %12s", "NSEMS");
- if (option & TIME)
- printf(" %-8s %-8s", "OTIME", "CTIME");
- printf("\n");
-}
-
-void
-print_ksemptr(int i, int option, struct semid_kernel *ksemaptr)
-{
- char ctime_buf[100], otime_buf[100];
-
- cvt_time(ksemaptr->u.sem_otime, otime_buf);
- cvt_time(ksemaptr->u.sem_ctime, ctime_buf);
-
- printf("s %12d %12d %s %-8s %-8s",
- IXSEQ_TO_IPCID(i, ksemaptr->u.sem_perm),
- (int)ksemaptr->u.sem_perm.key,
- fmt_perm(ksemaptr->u.sem_perm.mode),
- user_from_uid(ksemaptr->u.sem_perm.uid, 0),
- group_from_gid(ksemaptr->u.sem_perm.gid, 0));
-
- if (option & CREATOR)
- printf(" %-8s %-8s",
- user_from_uid(ksemaptr->u.sem_perm.cuid, 0),
- group_from_gid(ksemaptr->u.sem_perm.cgid, 0));
-
- if (option & BIGGEST)
- printf(" %12d",
- ksemaptr->u.sem_nsems);
-
- if (option & TIME)
- printf(" %s %s",
- otime_buf,
- ctime_buf);
-
- printf("\n");
-}
-
-uid_t
-user2uid(char *username)
-{
- struct passwd *pwd;
- uid_t uid;
- char *r;
-
- uid = strtoul(username, &r, 0);
- if (!*r && r != username)
- return (uid);
- if ((pwd = getpwnam(username)) == NULL)
- errx(1, "getpwnam failed: No such user");
- endpwent();
- return (pwd->pw_uid);
-}
-
-void
-usage(void)
-{
-
- fprintf(stderr,
- "usage: "
- "ipcs [-abcmopqstyMQST] [-C corefile] [-N namelist] [-u user]\n");
- exit(1);
-}
diff --git a/usr.bin/join/Makefile b/usr.bin/join/Makefile
deleted file mode 100644
index 3fa8629..0000000
--- a/usr.bin/join/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-
-PROG= join
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/join/join.1 b/usr.bin/join/join.1
deleted file mode 100644
index ed828a7..0000000
--- a/usr.bin/join/join.1
+++ /dev/null
@@ -1,229 +0,0 @@
-.\" Copyright (c) 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)join.1 8.3 (Berkeley) 4/28/95
-.\" $FreeBSD$
-.\"
-.Dd July 5, 2004
-.Dt JOIN 1
-.Os
-.Sh NAME
-.Nm join
-.Nd relational database operator
-.Sh SYNOPSIS
-.Nm
-.Oo
-.Fl a Ar file_number | Fl v Ar file_number
-.Oc
-.Op Fl e Ar string
-.Op Fl o Ar list
-.Bk -words
-.Ek
-.Op Fl t Ar char
-.Op Fl 1 Ar field
-.Op Fl 2 Ar field
-.Ar file1
-.Ar file2
-.Sh DESCRIPTION
-The
-.Nm
-utility performs an
-.Dq equality join
-on the specified files
-and writes the result to the standard output.
-The
-.Dq join field
-is the field in each file by which the files are compared.
-The first field in each line is used by default.
-There is one line in the output for each pair of lines in
-.Ar file1
-and
-.Ar file2
-which have identical join fields.
-Each output line consists of the join field, the remaining fields from
-.Ar file1
-and then the remaining fields from
-.Ar file2 .
-.Pp
-The default field separators are tab and space characters.
-In this case, multiple tabs and spaces count as a single field separator,
-and leading tabs and spaces are ignored.
-The default output field separator is a single space character.
-.Pp
-Many of the options use file and field numbers.
-Both file numbers and field numbers are 1 based, i.e., the first file on
-the command line is file number 1 and the first field is field number 1.
-The following options are available:
-.Bl -tag -width indent
-.It Fl a Ar file_number
-In addition to the default output, produce a line for each unpairable
-line in file
-.Ar file_number .
-.It Fl e Ar string
-Replace empty output fields with
-.Ar string .
-.It Fl o Ar list
-The
-.Fl o
-option specifies the fields that will be output from each file for
-each line with matching join fields.
-Each element of
-.Ar list
-has either the form
-.Ar file_number . Ns Ar field ,
-where
-.Ar file_number
-is a file number and
-.Ar field
-is a field number, or the form
-.Ql 0
-.Pq zero ,
-representing the join field.
-The elements of list must be either comma
-.Pq Ql \&,
-or whitespace separated.
-(The latter requires quoting to protect it from the shell, or, a simpler
-approach is to use multiple
-.Fl o
-options.)
-.It Fl t Ar char
-Use character
-.Ar char
-as a field delimiter for both input and output.
-Every occurrence of
-.Ar char
-in a line is significant.
-.It Fl v Ar file_number
-Do not display the default output, but display a line for each unpairable
-line in file
-.Ar file_number .
-The options
-.Fl v Cm 1
-and
-.Fl v Cm 2
-may be specified at the same time.
-.It Fl 1 Ar field
-Join on the
-.Ar field Ns 'th
-field of
-.Ar file1 .
-.It Fl 2 Ar field
-Join on the
-.Ar field Ns 'th
-field of
-.Ar file2 .
-.El
-.Pp
-When the default field delimiter characters are used, the files to be joined
-should be ordered in the collating sequence of
-.Xr sort 1 ,
-using the
-.Fl b
-option, on the fields on which they are to be joined, otherwise
-.Nm
-may not report all field matches.
-When the field delimiter characters are specified by the
-.Fl t
-option, the collating sequence should be the same as
-.Xr sort 1
-without the
-.Fl b
-option.
-.Pp
-If one of the arguments
-.Ar file1
-or
-.Ar file2
-is
-.Sq Fl ,
-the standard input is used.
-.Sh EXIT STATUS
-.Ex -std
-.Sh COMPATIBILITY
-For compatibility with historic versions of
-.Nm ,
-the following options are available:
-.Bl -tag -width indent
-.It Fl a
-In addition to the default output, produce a line for each unpairable line
-in both
-.Ar file1
-and
-.Ar file2 .
-.It Fl j1 Ar field
-Join on the
-.Ar field Ns 'th
-field of
-.Ar file1 .
-.It Fl j2 Ar field
-Join on the
-.Ar field Ns 'th
-field of
-.Ar file2 .
-.It Fl j Ar field
-Join on the
-.Ar field Ns 'th
-field of both
-.Ar file1
-and
-.Ar file2 .
-.It Fl o Ar list ...
-Historical implementations of
-.Nm
-permitted multiple arguments to the
-.Fl o
-option.
-These arguments were of the form
-.Ar file_number . Ns Ar field_number
-as described
-for the current
-.Fl o
-option.
-This has obvious difficulties in the presence of files named
-.Pa 1.2 .
-.El
-.Pp
-These options are available only so historic shell scripts do not require
-modification and should not be used.
-.Sh SEE ALSO
-.Xr awk 1 ,
-.Xr comm 1 ,
-.Xr paste 1 ,
-.Xr sort 1 ,
-.Xr uniq 1
-.Sh STANDARDS
-The
-.Nm
-command conforms to
-.St -p1003.1-2001 .
diff --git a/usr.bin/join/join.c b/usr.bin/join/join.c
deleted file mode 100644
index 097ecbe..0000000
--- a/usr.bin/join/join.c
+++ /dev/null
@@ -1,669 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Steve Hayman of the Computer Science Department, Indiana University,
- * Michiro Hikida and David Goodenough.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1991, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)join.c 8.6 (Berkeley) 5/4/95";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-
-#include <err.h>
-#include <errno.h>
-#include <limits.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-
-/*
- * There's a structure per input file which encapsulates the state of the
- * file. We repeatedly read lines from each file until we've read in all
- * the consecutive lines from the file with a common join field. Then we
- * compare the set of lines with an equivalent set from the other file.
- */
-typedef struct {
- char *line; /* line */
- u_long linealloc; /* line allocated count */
- char **fields; /* line field(s) */
- u_long fieldcnt; /* line field(s) count */
- u_long fieldalloc; /* line field(s) allocated count */
-} LINE;
-
-typedef struct {
- FILE *fp; /* file descriptor */
- u_long joinf; /* join field (-1, -2, -j) */
- int unpair; /* output unpairable lines (-a) */
- u_long number; /* 1 for file 1, 2 for file 2 */
-
- LINE *set; /* set of lines with same field */
- int pushbool; /* if pushback is set */
- u_long pushback; /* line on the stack */
- u_long setcnt; /* set count */
- u_long setalloc; /* set allocated count */
-} INPUT;
-INPUT input1 = { NULL, 0, 0, 1, NULL, 0, 0, 0, 0 },
- input2 = { NULL, 0, 0, 2, NULL, 0, 0, 0, 0 };
-
-typedef struct {
- u_long filenum; /* file number */
- u_long fieldno; /* field number */
-} OLIST;
-OLIST *olist; /* output field list */
-u_long olistcnt; /* output field list count */
-u_long olistalloc; /* output field allocated count */
-
-int joinout = 1; /* show lines with matched join fields (-v) */
-int needsep; /* need separator character */
-int spans = 1; /* span multiple delimiters (-t) */
-char *empty; /* empty field replacement string (-e) */
-static wchar_t default_tabchar[] = L" \t";
-wchar_t *tabchar = default_tabchar;/* delimiter characters (-t) */
-
-int cmp(LINE *, u_long, LINE *, u_long);
-void fieldarg(char *);
-void joinlines(INPUT *, INPUT *);
-int mbscoll(const char *, const char *);
-char *mbssep(char **, const wchar_t *);
-void obsolete(char **);
-void outfield(LINE *, u_long, int);
-void outoneline(INPUT *, LINE *);
-void outtwoline(INPUT *, LINE *, INPUT *, LINE *);
-void slurp(INPUT *);
-wchar_t *towcs(const char *);
-void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- INPUT *F1, *F2;
- int aflag, ch, cval, vflag;
- char *end;
-
- setlocale(LC_ALL, "");
-
- F1 = &input1;
- F2 = &input2;
-
- aflag = vflag = 0;
- obsolete(argv);
- while ((ch = getopt(argc, argv, "\01a:e:j:1:2:o:t:v:")) != -1) {
- switch (ch) {
- case '\01': /* See comment in obsolete(). */
- aflag = 1;
- F1->unpair = F2->unpair = 1;
- break;
- case '1':
- if ((F1->joinf = strtol(optarg, &end, 10)) < 1)
- errx(1, "-1 option field number less than 1");
- if (*end)
- errx(1, "illegal field number -- %s", optarg);
- --F1->joinf;
- break;
- case '2':
- if ((F2->joinf = strtol(optarg, &end, 10)) < 1)
- errx(1, "-2 option field number less than 1");
- if (*end)
- errx(1, "illegal field number -- %s", optarg);
- --F2->joinf;
- break;
- case 'a':
- aflag = 1;
- switch(strtol(optarg, &end, 10)) {
- case 1:
- F1->unpair = 1;
- break;
- case 2:
- F2->unpair = 1;
- break;
- default:
- errx(1, "-a option file number not 1 or 2");
- break;
- }
- if (*end)
- errx(1, "illegal file number -- %s", optarg);
- break;
- case 'e':
- empty = optarg;
- break;
- case 'j':
- if ((F1->joinf = F2->joinf =
- strtol(optarg, &end, 10)) < 1)
- errx(1, "-j option field number less than 1");
- if (*end)
- errx(1, "illegal field number -- %s", optarg);
- --F1->joinf;
- --F2->joinf;
- break;
- case 'o':
- fieldarg(optarg);
- break;
- case 't':
- spans = 0;
- if (mbrtowc(&tabchar[0], optarg, MB_LEN_MAX, NULL) !=
- strlen(optarg))
- errx(1, "illegal tab character specification");
- tabchar[1] = L'\0';
- break;
- case 'v':
- vflag = 1;
- joinout = 0;
- switch (strtol(optarg, &end, 10)) {
- case 1:
- F1->unpair = 1;
- break;
- case 2:
- F2->unpair = 1;
- break;
- default:
- errx(1, "-v option file number not 1 or 2");
- break;
- }
- if (*end)
- errx(1, "illegal file number -- %s", optarg);
- break;
- case '?':
- default:
- usage();
- }
- }
- argc -= optind;
- argv += optind;
-
- if (aflag && vflag)
- errx(1, "the -a and -v options are mutually exclusive");
-
- if (argc != 2)
- usage();
-
- /* Open the files; "-" means stdin. */
- if (!strcmp(*argv, "-"))
- F1->fp = stdin;
- else if ((F1->fp = fopen(*argv, "r")) == NULL)
- err(1, "%s", *argv);
- ++argv;
- if (!strcmp(*argv, "-"))
- F2->fp = stdin;
- else if ((F2->fp = fopen(*argv, "r")) == NULL)
- err(1, "%s", *argv);
- if (F1->fp == stdin && F2->fp == stdin)
- errx(1, "only one input file may be stdin");
-
- slurp(F1);
- slurp(F2);
- while (F1->setcnt && F2->setcnt) {
- cval = cmp(F1->set, F1->joinf, F2->set, F2->joinf);
- if (cval == 0) {
- /* Oh joy, oh rapture, oh beauty divine! */
- if (joinout)
- joinlines(F1, F2);
- slurp(F1);
- slurp(F2);
- } else if (cval < 0) {
- /* File 1 takes the lead... */
- if (F1->unpair)
- joinlines(F1, NULL);
- slurp(F1);
- } else {
- /* File 2 takes the lead... */
- if (F2->unpair)
- joinlines(F2, NULL);
- slurp(F2);
- }
- }
-
- /*
- * Now that one of the files is used up, optionally output any
- * remaining lines from the other file.
- */
- if (F1->unpair)
- while (F1->setcnt) {
- joinlines(F1, NULL);
- slurp(F1);
- }
- if (F2->unpair)
- while (F2->setcnt) {
- joinlines(F2, NULL);
- slurp(F2);
- }
- exit(0);
-}
-
-void
-slurp(INPUT *F)
-{
- LINE *lp, *lastlp, tmp;
- size_t len;
- int cnt;
- char *bp, *fieldp;
-
- /*
- * Read all of the lines from an input file that have the same
- * join field.
- */
- F->setcnt = 0;
- for (lastlp = NULL;; ++F->setcnt) {
- /*
- * If we're out of space to hold line structures, allocate
- * more. Initialize the structure so that we know that this
- * is new space.
- */
- if (F->setcnt == F->setalloc) {
- cnt = F->setalloc;
- F->setalloc += 50;
- if ((F->set = realloc(F->set,
- F->setalloc * sizeof(LINE))) == NULL)
- err(1, NULL);
- memset(F->set + cnt, 0, 50 * sizeof(LINE));
-
- /* re-set lastlp in case it moved */
- if (lastlp != NULL)
- lastlp = &F->set[F->setcnt - 1];
- }
-
- /*
- * Get any pushed back line, else get the next line. Allocate
- * space as necessary. If taking the line from the stack swap
- * the two structures so that we don't lose space allocated to
- * either structure. This could be avoided by doing another
- * level of indirection, but it's probably okay as is.
- */
- lp = &F->set[F->setcnt];
- if (F->setcnt)
- lastlp = &F->set[F->setcnt - 1];
- if (F->pushbool) {
- tmp = F->set[F->setcnt];
- F->set[F->setcnt] = F->set[F->pushback];
- F->set[F->pushback] = tmp;
- F->pushbool = 0;
- continue;
- }
- if ((bp = fgetln(F->fp, &len)) == NULL)
- return;
- if (lp->linealloc <= len + 1) {
- lp->linealloc += MAX(100, len + 1 - lp->linealloc);
- if ((lp->line =
- realloc(lp->line, lp->linealloc)) == NULL)
- err(1, NULL);
- }
- memmove(lp->line, bp, len);
-
- /* Replace trailing newline, if it exists. */
- if (bp[len - 1] == '\n')
- lp->line[len - 1] = '\0';
- else
- lp->line[len] = '\0';
- bp = lp->line;
-
- /* Split the line into fields, allocate space as necessary. */
- lp->fieldcnt = 0;
- while ((fieldp = mbssep(&bp, tabchar)) != NULL) {
- if (spans && *fieldp == '\0')
- continue;
- if (lp->fieldcnt == lp->fieldalloc) {
- lp->fieldalloc += 50;
- if ((lp->fields = realloc(lp->fields,
- lp->fieldalloc * sizeof(char *))) == NULL)
- err(1, NULL);
- }
- lp->fields[lp->fieldcnt++] = fieldp;
- }
-
- /* See if the join field value has changed. */
- if (lastlp != NULL && cmp(lp, F->joinf, lastlp, F->joinf)) {
- F->pushbool = 1;
- F->pushback = F->setcnt;
- break;
- }
- }
-}
-
-char *
-mbssep(char **stringp, const wchar_t *delim)
-{
- char *s, *tok;
- const wchar_t *spanp;
- wchar_t c, sc;
- size_t n;
-
- if ((s = *stringp) == NULL)
- return (NULL);
- for (tok = s;;) {
- n = mbrtowc(&c, s, MB_LEN_MAX, NULL);
- if (n == (size_t)-1 || n == (size_t)-2)
- errc(1, EILSEQ, NULL); /* XXX */
- s += n;
- spanp = delim;
- do {
- if ((sc = *spanp++) == c) {
- if (c == 0)
- s = NULL;
- else
- s[-n] = '\0';
- *stringp = s;
- return (tok);
- }
- } while (sc != 0);
- }
-}
-
-int
-cmp(LINE *lp1, u_long fieldno1, LINE *lp2, u_long fieldno2)
-{
- if (lp1->fieldcnt <= fieldno1)
- return (lp2->fieldcnt <= fieldno2 ? 0 : 1);
- if (lp2->fieldcnt <= fieldno2)
- return (-1);
- return (mbscoll(lp1->fields[fieldno1], lp2->fields[fieldno2]));
-}
-
-int
-mbscoll(const char *s1, const char *s2)
-{
- wchar_t *w1, *w2;
- int ret;
-
- if (MB_CUR_MAX == 1)
- return (strcoll(s1, s2));
- if ((w1 = towcs(s1)) == NULL || (w2 = towcs(s2)) == NULL)
- err(1, NULL); /* XXX */
- ret = wcscoll(w1, w2);
- free(w1);
- free(w2);
- return (ret);
-}
-
-wchar_t *
-towcs(const char *s)
-{
- wchar_t *wcs;
- size_t n;
-
- if ((n = mbsrtowcs(NULL, &s, 0, NULL)) == (size_t)-1)
- return (NULL);
- if ((wcs = malloc((n + 1) * sizeof(*wcs))) == NULL)
- return (NULL);
- mbsrtowcs(wcs, &s, n + 1, NULL);
- return (wcs);
-}
-
-void
-joinlines(INPUT *F1, INPUT *F2)
-{
- u_long cnt1, cnt2;
-
- /*
- * Output the results of a join comparison. The output may be from
- * either file 1 or file 2 (in which case the first argument is the
- * file from which to output) or from both.
- */
- if (F2 == NULL) {
- for (cnt1 = 0; cnt1 < F1->setcnt; ++cnt1)
- outoneline(F1, &F1->set[cnt1]);
- return;
- }
- for (cnt1 = 0; cnt1 < F1->setcnt; ++cnt1)
- for (cnt2 = 0; cnt2 < F2->setcnt; ++cnt2)
- outtwoline(F1, &F1->set[cnt1], F2, &F2->set[cnt2]);
-}
-
-void
-outoneline(INPUT *F, LINE *lp)
-{
- u_long cnt;
-
- /*
- * Output a single line from one of the files, according to the
- * join rules. This happens when we are writing unmatched single
- * lines. Output empty fields in the right places.
- */
- if (olist)
- for (cnt = 0; cnt < olistcnt; ++cnt) {
- if (olist[cnt].filenum == (unsigned)F->number)
- outfield(lp, olist[cnt].fieldno, 0);
- else if (olist[cnt].filenum == 0)
- outfield(lp, F->joinf, 0);
- else
- outfield(lp, 0, 1);
- }
- else
- for (cnt = 0; cnt < lp->fieldcnt; ++cnt)
- outfield(lp, cnt, 0);
- (void)printf("\n");
- if (ferror(stdout))
- err(1, "stdout");
- needsep = 0;
-}
-
-void
-outtwoline(INPUT *F1, LINE *lp1, INPUT *F2, LINE *lp2)
-{
- u_long cnt;
-
- /* Output a pair of lines according to the join list (if any). */
- if (olist)
- for (cnt = 0; cnt < olistcnt; ++cnt)
- if (olist[cnt].filenum == 0) {
- if (lp1->fieldcnt >= F1->joinf)
- outfield(lp1, F1->joinf, 0);
- else
- outfield(lp2, F2->joinf, 0);
- } else if (olist[cnt].filenum == 1)
- outfield(lp1, olist[cnt].fieldno, 0);
- else /* if (olist[cnt].filenum == 2) */
- outfield(lp2, olist[cnt].fieldno, 0);
- else {
- /*
- * Output the join field, then the remaining fields from F1
- * and F2.
- */
- outfield(lp1, F1->joinf, 0);
- for (cnt = 0; cnt < lp1->fieldcnt; ++cnt)
- if (F1->joinf != cnt)
- outfield(lp1, cnt, 0);
- for (cnt = 0; cnt < lp2->fieldcnt; ++cnt)
- if (F2->joinf != cnt)
- outfield(lp2, cnt, 0);
- }
- (void)printf("\n");
- if (ferror(stdout))
- err(1, "stdout");
- needsep = 0;
-}
-
-void
-outfield(LINE *lp, u_long fieldno, int out_empty)
-{
- if (needsep++)
- (void)printf("%lc", *tabchar);
- if (!ferror(stdout)) {
- if (lp->fieldcnt <= fieldno || out_empty) {
- if (empty != NULL)
- (void)printf("%s", empty);
- } else {
- if (*lp->fields[fieldno] == '\0')
- return;
- (void)printf("%s", lp->fields[fieldno]);
- }
- }
- if (ferror(stdout))
- err(1, "stdout");
-}
-
-/*
- * Convert an output list argument "2.1, 1.3, 2.4" into an array of output
- * fields.
- */
-void
-fieldarg(char *option)
-{
- u_long fieldno, filenum;
- char *end, *token;
-
- while ((token = strsep(&option, ", \t")) != NULL) {
- if (*token == '\0')
- continue;
- if (token[0] == '0')
- filenum = fieldno = 0;
- else if ((token[0] == '1' || token[0] == '2') &&
- token[1] == '.') {
- filenum = token[0] - '0';
- fieldno = strtol(token + 2, &end, 10);
- if (*end)
- errx(1, "malformed -o option field");
- if (fieldno == 0)
- errx(1, "field numbers are 1 based");
- --fieldno;
- } else
- errx(1, "malformed -o option field");
- if (olistcnt == olistalloc) {
- olistalloc += 50;
- if ((olist = realloc(olist,
- olistalloc * sizeof(OLIST))) == NULL)
- err(1, NULL);
- }
- olist[olistcnt].filenum = filenum;
- olist[olistcnt].fieldno = fieldno;
- ++olistcnt;
- }
-}
-
-void
-obsolete(char **argv)
-{
- size_t len;
- char **p, *ap, *t;
-
- while ((ap = *++argv) != NULL) {
- /* Return if "--". */
- if (ap[0] == '-' && ap[1] == '-')
- return;
- /* skip if not an option */
- if (ap[0] != '-')
- continue;
- switch (ap[1]) {
- case 'a':
- /*
- * The original join allowed "-a", which meant the
- * same as -a1 plus -a2. POSIX 1003.2, Draft 11.2
- * only specifies this as "-a 1" and "a -2", so we
- * have to use another option flag, one that is
- * unlikely to ever be used or accidentally entered
- * on the command line. (Well, we could reallocate
- * the argv array, but that hardly seems worthwhile.)
- */
- if (ap[2] == '\0' && (argv[1] == NULL ||
- (strcmp(argv[1], "1") != 0 &&
- strcmp(argv[1], "2") != 0))) {
- ap[1] = '\01';
- warnx("-a option used without an argument; "
- "reverting to historical behavior");
- }
- break;
- case 'j':
- /*
- * The original join allowed "-j[12] arg" and "-j arg".
- * Convert the former to "-[12] arg". Don't convert
- * the latter since getopt(3) can handle it.
- */
- switch(ap[2]) {
- case '1':
- if (ap[3] != '\0')
- goto jbad;
- ap[1] = '1';
- ap[2] = '\0';
- break;
- case '2':
- if (ap[3] != '\0')
- goto jbad;
- ap[1] = '2';
- ap[2] = '\0';
- break;
- case '\0':
- break;
- default:
-jbad: errx(1, "illegal option -- %s", ap);
- usage();
- }
- break;
- case 'o':
- /*
- * The original join allowed "-o arg arg".
- * Convert to "-o arg -o arg".
- */
- if (ap[2] != '\0')
- break;
- for (p = argv + 2; *p; ++p) {
- if (p[0][0] == '0' || ((p[0][0] != '1' &&
- p[0][0] != '2') || p[0][1] != '.'))
- break;
- len = strlen(*p);
- if (len - 2 != strspn(*p + 2, "0123456789"))
- break;
- if ((t = malloc(len + 3)) == NULL)
- err(1, NULL);
- t[0] = '-';
- t[1] = 'o';
- memmove(t + 2, *p, len + 1);
- *p = t;
- }
- argv = p - 1;
- break;
- }
- }
-}
-
-void
-usage(void)
-{
- (void)fprintf(stderr, "%s %s\n%s\n",
- "usage: join [-a fileno | -v fileno ] [-e string] [-1 field]",
- "[-2 field]",
- " [-o list] [-t char] file1 file2");
- exit(1);
-}
diff --git a/usr.bin/jot/Makefile b/usr.bin/jot/Makefile
deleted file mode 100644
index 662600e..0000000
--- a/usr.bin/jot/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= jot
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/jot/jot.1 b/usr.bin/jot/jot.1
deleted file mode 100644
index 77cebb4..0000000
--- a/usr.bin/jot/jot.1
+++ /dev/null
@@ -1,250 +0,0 @@
-.\" Copyright (c) 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)jot.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd November 6, 2006
-.Dt JOT 1
-.Os
-.Sh NAME
-.Nm jot
-.Nd print sequential or random data
-.Sh SYNOPSIS
-.Nm
-.Op Fl cnr
-.Op Fl b Ar word
-.Op Fl w Ar word
-.Op Fl s Ar string
-.Op Fl p Ar precision
-.Op Ar reps Op Ar begin Op Ar end Op Ar s
-.Sh DESCRIPTION
-The
-.Nm
-utility is used to print out increasing, decreasing, random,
-or redundant data, usually numbers, one per line.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl r
-Generate random data instead of the default sequential data.
-.It Fl b Ar word
-Just print
-.Ar word
-repetitively.
-.It Fl w Ar word
-Print
-.Ar word
-with the generated data appended to it.
-Octal, hexadecimal, exponential,
-.Tn ASCII ,
-zero padded,
-and right-adjusted representations
-are possible by using the appropriate
-.Xr printf 3
-conversion specification inside
-.Ar word ,
-in which case the data are inserted rather than appended.
-.It Fl c
-This is an abbreviation for
-.Fl w Ar %c .
-.It Fl s Ar string
-Print data separated by
-.Ar string .
-Normally, newlines separate data.
-.It Fl n
-Do not print the final newline normally appended to the output.
-.It Fl p Ar precision
-Print only as many digits or characters of the data
-as indicated by the integer
-.Ar precision .
-In the absence of
-.Fl p ,
-the precision is the greater of the precisions of
-.Ar begin
-and
-.Ar end .
-The
-.Fl p
-option is overridden by whatever appears in a
-.Xr printf 3
-conversion following
-.Fl w .
-.El
-.Pp
-The last four arguments indicate, respectively,
-the number of data, the lower bound, the upper bound,
-and the step size or, for random data, the seed.
-While at least one of them must appear,
-any of the other three may be omitted, and
-will be considered as such if given as
-.Fl ""
-or as an empty string.
-Any three of these arguments determines the fourth.
-If four are specified and the given and computed values of
-.Ar reps
-conflict, the lower value is used.
-If fewer than three are specified, defaults are assigned
-left to right, except for
-.Ar s ,
-which assumes a default of 1 or -1 if both
-.Ar begin
-and
-.Ar end
-are given.
-.Pp
-Defaults for the four arguments are, respectively,
-100, 1, 100, and 1, except that when random data are requested,
-the seed,
-.Ar s ,
-is picked randomly.
-The
-.Ar reps
-argument is expected to be an unsigned integer,
-and if given as zero is taken to be infinite.
-The
-.Ar begin
-and
-.Ar end
-arguments may be given as real numbers or as characters
-representing the corresponding value in
-.Tn ASCII .
-The last argument must be a real number.
-.Pp
-Random numbers are obtained through
-.Xr arc4random 3
-when no seed is specified,
-and through
-.Xr random 3
-when a seed is given.
-When
-.Nm
-is asked to generate random integers or characters with begin
-and end values in the range of the random number generator function
-and no format is specified with one of the
-.Fl w ,
-.Fl b ,
-or
-.Fl p
-options,
-.Nm
-will arrange for all the values in the range to appear in the output
-with an equal probability.
-In all other cases be careful to ensure that the output format's
-rounding or truncation will not skew the distribution of output
-values in an unintended way.
-.Pp
-The name
-.Nm
-derives in part from
-.Nm iota ,
-a function in APL.
-.Sh EXIT STATUS
-.Ex -std
-.Sh EXAMPLES
-The command
-.Dl jot - 1 10
-.Pp
-prints the integers from 1 to 10,
-while the command
-.Dl jot 21 -1 1.00
-.Pp
-prints 21 evenly spaced numbers increasing from -1 to 1.
-The
-.Tn ASCII
-character set is generated with
-.Dl jot -c 128 0
-.Pp
-and the strings xaa through xaz with
-.Dl jot -w xa%c 26 a
-.Pp
-while 20 random 8-letter strings are produced with
-.Dl "jot -r -c 160 a z | rs -g 0 8"
-.Pp
-Infinitely many
-.Em yes Ns 's
-may be obtained through
-.Dl jot -b yes 0
-.Pp
-and thirty
-.Xr ed 1
-substitution commands applying to lines 2, 7, 12, etc.\& is
-the result of
-.Dl jot -w %ds/old/new/ 30 2 - 5
-.Pp
-The stuttering sequence 9, 9, 8, 8, 7, etc.\& can be
-produced by suitable choice of step size,
-as in
-.Dl jot - 9 0 -.5
-.Pp
-and a file containing exactly 1024 bytes is created with
-.Dl jot -b x 512 > block
-.Pp
-Finally, to set tabs four spaces apart starting
-from column 10 and ending in column 132, use
-.Dl expand -`jot -s, - 10 132 4`
-.Pp
-and to print all lines 80 characters or longer,
-.Dl grep `jot -s \&"\&" -b \&. 80`
-.Sh DIAGNOSTICS
-The following diagnostic messages deserve special explanation:
-.Bl -diag
-.It "illegal or unsupported format '%s'"
-The requested conversion format specifier for
-.Xr printf 3
-was not of the form
-.Dl %[#][ ][{+,-}][0-9]*[.[0-9]*]?
-where
-.Dq ?\&
-must be one of
-.Dl [l]{d,i,o,u,x}
-or
-.Dl {c,e,f,g,D,E,G,O,U,X}
-.It "range error in conversion"
-A value to be printed fell outside the range of the data type
-associated with the requested output format.
-.It "too many conversions"
-More than one conversion format specifier has been supplied,
-but only one is allowed.
-.El
-.Sh SEE ALSO
-.Xr ed 1 ,
-.Xr expand 1 ,
-.Xr rs 1 ,
-.Xr yes 1 ,
-.Xr arc4random 3 ,
-.Xr printf 3 ,
-.Xr random 3
-.Sh HISTORY
-The
-.Nm
-utility first appeared in
-.Bx 4.2 .
diff --git a/usr.bin/jot/jot.c b/usr.bin/jot/jot.c
deleted file mode 100644
index 2e58968..0000000
--- a/usr.bin/jot/jot.c
+++ /dev/null
@@ -1,490 +0,0 @@
-/*-
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)jot.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * jot - print sequential or random data
- *
- * Author: John Kunze, Office of Comp. Affairs, UCB
- */
-
-#include <ctype.h>
-#include <err.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <stdbool.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-/* Defaults */
-#define REPS_DEF 100
-#define BEGIN_DEF 1
-#define ENDER_DEF 100
-#define STEP_DEF 1
-
-/* Flags of options that have been set */
-#define HAVE_STEP 1
-#define HAVE_ENDER 2
-#define HAVE_BEGIN 4
-#define HAVE_REPS 8
-
-#define is_default(s) (*(s) == 0 || strcmp((s), "-") == 0)
-
-static bool boring;
-static int prec;
-static bool longdata;
-static bool intdata;
-static bool chardata;
-static bool nosign;
-static const char *sepstring = "\n";
-static char format[BUFSIZ];
-
-static void getformat(void);
-static int getprec(const char *);
-static int putdata(double, bool);
-static void usage(void);
-
-int
-main(int argc, char **argv)
-{
- bool have_format = false;
- bool infinity = false;
- bool nofinalnl = false;
- bool randomize = false;
- bool use_random = false;
- int ch;
- int mask = 0;
- int n = 0;
- double begin;
- double divisor;
- double ender;
- double s;
- double x, y;
- long i;
- long reps;
-
- while ((ch = getopt(argc, argv, "b:cnp:rs:w:")) != -1)
- switch (ch) {
- case 'b':
- boring = true;
- /* FALLTHROUGH */
- case 'w':
- if (strlcpy(format, optarg, sizeof(format)) >=
- sizeof(format))
- errx(1, "-%c word too long", ch);
- have_format = true;
- break;
- case 'c':
- chardata = true;
- break;
- case 'n':
- nofinalnl = true;
- break;
- case 'p':
- prec = atoi(optarg);
- if (prec <= 0)
- errx(1, "bad precision value");
- have_format = true;
- break;
- case 'r':
- randomize = true;
- break;
- case 's':
- sepstring = optarg;
- break;
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- switch (argc) { /* examine args right to left, falling thru cases */
- case 4:
- if (!is_default(argv[3])) {
- if (!sscanf(argv[3], "%lf", &s))
- errx(1, "bad s value: %s", argv[3]);
- mask |= HAVE_STEP;
- if (randomize)
- use_random = true;
- }
- /* FALLTHROUGH */
- case 3:
- if (!is_default(argv[2])) {
- if (!sscanf(argv[2], "%lf", &ender))
- ender = argv[2][strlen(argv[2])-1];
- mask |= HAVE_ENDER;
- if (!prec)
- n = getprec(argv[2]);
- }
- /* FALLTHROUGH */
- case 2:
- if (!is_default(argv[1])) {
- if (!sscanf(argv[1], "%lf", &begin))
- begin = argv[1][strlen(argv[1])-1];
- mask |= HAVE_BEGIN;
- if (!prec)
- prec = getprec(argv[1]);
- if (n > prec) /* maximum precision */
- prec = n;
- }
- /* FALLTHROUGH */
- case 1:
- if (!is_default(argv[0])) {
- if (!sscanf(argv[0], "%ld", &reps))
- errx(1, "bad reps value: %s", argv[0]);
- mask |= HAVE_REPS;
- }
- break;
- case 0:
- usage();
- default:
- errx(1, "too many arguments. What do you mean by %s?",
- argv[4]);
- }
- getformat();
- while (mask) /* 4 bit mask has 1's where last 4 args were given */
- switch (mask) { /* fill in the 0's by default or computation */
- case HAVE_STEP:
- case HAVE_ENDER:
- case HAVE_ENDER | HAVE_STEP:
- case HAVE_BEGIN:
- case HAVE_BEGIN | HAVE_STEP:
- reps = REPS_DEF;
- mask |= HAVE_REPS;
- break;
- case HAVE_BEGIN | HAVE_ENDER:
- s = ender > begin ? 1 : -1;
- mask |= HAVE_STEP;
- break;
- case HAVE_BEGIN | HAVE_ENDER | HAVE_STEP:
- if (randomize)
- reps = REPS_DEF;
- else if (s == 0.0)
- reps = 0;
- else
- reps = (ender - begin + s) / s;
- if (reps <= 0)
- errx(1, "impossible stepsize");
- mask = 0;
- break;
- case HAVE_REPS:
- case HAVE_REPS | HAVE_STEP:
- begin = BEGIN_DEF;
- mask |= HAVE_BEGIN;
- break;
- case HAVE_REPS | HAVE_ENDER:
- s = STEP_DEF;
- mask = HAVE_REPS | HAVE_ENDER | HAVE_STEP;
- break;
- case HAVE_REPS | HAVE_ENDER | HAVE_STEP:
- if (randomize)
- begin = BEGIN_DEF;
- else if (reps == 0)
- errx(1, "must specify begin if reps == 0");
- begin = ender - reps * s + s;
- mask = 0;
- break;
- case HAVE_REPS | HAVE_BEGIN:
- s = STEP_DEF;
- mask = HAVE_REPS | HAVE_BEGIN | HAVE_STEP;
- break;
- case HAVE_REPS | HAVE_BEGIN | HAVE_STEP:
- if (randomize)
- ender = ENDER_DEF;
- else
- ender = begin + reps * s - s;
- mask = 0;
- break;
- case HAVE_REPS | HAVE_BEGIN | HAVE_ENDER:
- if (reps == 0)
- errx(1, "infinite sequences cannot be bounded");
- else if (reps == 1)
- s = 0.0;
- else
- s = (ender - begin) / (reps - 1);
- mask = 0;
- break;
- case HAVE_REPS | HAVE_BEGIN | HAVE_ENDER | HAVE_STEP:
- /* if reps given and implied, */
- if (!randomize && s != 0.0) {
- long t = (ender - begin + s) / s;
- if (t <= 0)
- errx(1, "impossible stepsize");
- if (t < reps) /* take lesser */
- reps = t;
- }
- mask = 0;
- break;
- default:
- errx(1, "bad mask");
- }
- if (reps == 0)
- infinity = true;
- if (randomize) {
- if (use_random) {
- srandom((unsigned long)s);
- divisor = (double)INT32_MAX + 1;
- } else
- divisor = (double)UINT32_MAX + 1;
-
- /*
- * Attempt to DWIM when the user has specified an
- * integer range within that of the random number
- * generator: distribute the numbers equally in
- * the range [begin .. ender]. Jot's default %.0f
- * format would make the appearance of the first and
- * last specified value half as likely as the rest.
- */
- if (!have_format && prec == 0 &&
- begin >= 0 && begin < divisor &&
- ender >= 0 && ender < divisor) {
- ender += 1;
- nosign = true;
- intdata = true;
- (void)strlcpy(format,
- chardata ? "%c" : "%u", sizeof(format));
- }
- x = (ender - begin) * (ender > begin ? 1 : -1);
- for (i = 1; i <= reps || infinity; i++) {
- if (use_random)
- y = random() / divisor;
- else
- y = arc4random() / divisor;
- if (putdata(y * x + begin, !(reps - i)))
- errx(1, "range error in conversion");
- }
- } else
- for (i = 1, x = begin; i <= reps || infinity; i++, x += s)
- if (putdata(x, !(reps - i)))
- errx(1, "range error in conversion");
- if (!nofinalnl)
- putchar('\n');
- exit(0);
-}
-
-/*
- * Send x to stdout using the specified format.
- * Last is true if this is the set's last value.
- * Return 0 if OK, or a positive number if the number passed was
- * outside the range specified by the various flags.
- */
-static int
-putdata(double x, bool last)
-{
-
- if (boring)
- printf("%s", format);
- else if (longdata && nosign) {
- if (x <= (double)ULONG_MAX && x >= (double)0)
- printf(format, (unsigned long)x);
- else
- return (1);
- } else if (longdata) {
- if (x <= (double)LONG_MAX && x >= (double)LONG_MIN)
- printf(format, (long)x);
- else
- return (1);
- } else if (chardata || (intdata && !nosign)) {
- if (x <= (double)INT_MAX && x >= (double)INT_MIN)
- printf(format, (int)x);
- else
- return (1);
- } else if (intdata) {
- if (x <= (double)UINT_MAX && x >= (double)0)
- printf(format, (unsigned int)x);
- else
- return (1);
-
- } else
- printf(format, x);
- if (!last)
- fputs(sepstring, stdout);
-
- return (0);
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "%s\n%s\n",
- "usage: jot [-cnr] [-b word] [-w word] [-s string] [-p precision]",
- " [reps [begin [end [s]]]]");
- exit(1);
-}
-
-/*
- * Return the number of digits following the number's decimal point.
- * Return 0 if no decimal point is found.
- */
-static int
-getprec(const char *str)
-{
- const char *p;
- const char *q;
-
- for (p = str; *p; p++)
- if (*p == '.')
- break;
- if (!*p)
- return (0);
- for (q = ++p; *p; p++)
- if (!isdigit((unsigned char)*p))
- break;
- return (p - q);
-}
-
-/*
- * Set format, intdata, chardata, longdata, and nosign
- * based on the command line arguments.
- */
-static void
-getformat(void)
-{
- char *p, *p2;
- int dot, hash, space, sign, numbers = 0;
- size_t sz;
-
- if (boring) /* no need to bother */
- return;
- for (p = format; *p; p++) /* look for '%' */
- if (*p == '%') {
- if (p[1] == '%')
- p++; /* leave %% alone */
- else
- break;
- }
- sz = sizeof(format) - strlen(format) - 1;
- if (!*p && !chardata) {
- if (snprintf(p, sz, "%%.%df", prec) >= (int)sz)
- errx(1, "-w word too long");
- } else if (!*p && chardata) {
- if (strlcpy(p, "%c", sz) >= sz)
- errx(1, "-w word too long");
- intdata = true;
- } else if (!*(p+1)) {
- if (sz <= 0)
- errx(1, "-w word too long");
- strcat(format, "%"); /* cannot end in single '%' */
- } else {
- /*
- * Allow conversion format specifiers of the form
- * %[#][ ][{+,-}][0-9]*[.[0-9]*]? where ? must be one of
- * [l]{d,i,o,u,x} or {f,e,g,E,G,d,o,x,D,O,U,X,c,u}
- */
- p2 = p++;
- dot = hash = space = sign = numbers = 0;
- while (!isalpha((unsigned char)*p)) {
- if (isdigit((unsigned char)*p)) {
- numbers++;
- p++;
- } else if ((*p == '#' && !(numbers|dot|sign|space|
- hash++)) ||
- (*p == ' ' && !(numbers|dot|space++)) ||
- ((*p == '+' || *p == '-') && !(numbers|dot|sign++))
- || (*p == '.' && !(dot++)))
- p++;
- else
- goto fmt_broken;
- }
- if (*p == 'l') {
- longdata = true;
- if (*++p == 'l') {
- if (p[1] != '\0')
- p++;
- goto fmt_broken;
- }
- }
- switch (*p) {
- case 'o': case 'u': case 'x': case 'X':
- intdata = nosign = true;
- break;
- case 'd': case 'i':
- intdata = true;
- break;
- case 'D':
- if (!longdata) {
- intdata = true;
- break;
- }
- case 'O': case 'U':
- if (!longdata) {
- intdata = nosign = true;
- break;
- }
- case 'c':
- if (!(intdata | longdata)) {
- chardata = true;
- break;
- }
- case 'h': case 'n': case 'p': case 'q': case 's': case 'L':
- case '$': case '*':
- goto fmt_broken;
- case 'f': case 'e': case 'g': case 'E': case 'G':
- if (!longdata)
- break;
- /* FALLTHROUGH */
- default:
-fmt_broken:
- *++p = '\0';
- errx(1, "illegal or unsupported format '%s'", p2);
- /* NOTREACHED */
- }
- while (*++p)
- if (*p == '%' && *(p+1) && *(p+1) != '%')
- errx(1, "too many conversions");
- else if (*p == '%' && *(p+1) == '%')
- p++;
- else if (*p == '%' && !*(p+1)) {
- if (strlcat(format, "%", sizeof(format)) >=
- sizeof(format))
- errx(1, "-w word too long");
- break;
- }
- }
-}
diff --git a/usr.bin/kdump/Makefile b/usr.bin/kdump/Makefile
deleted file mode 100644
index 2ca8561..0000000
--- a/usr.bin/kdump/Makefile
+++ /dev/null
@@ -1,18 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-.PATH: ${.CURDIR}/../ktrace
-
-PROG= kdump
-SRCS= kdump.c ioctl.c kdump_subr.c subr.c
-CFLAGS+= -I${.CURDIR}/../ktrace -I${.CURDIR} -I${.CURDIR}/../..
-
-CLEANFILES= ioctl.c kdump_subr.c
-
-ioctl.c: mkioctls
- sh ${.CURDIR}/mkioctls ${DESTDIR}/usr/include > ${.TARGET}
-
-kdump_subr.c: mksubr
- sh ${.CURDIR}/mksubr ${DESTDIR}/usr/include > ${.TARGET}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/kdump/kdump.1 b/usr.bin/kdump/kdump.1
deleted file mode 100644
index 34b5bd4..0000000
--- a/usr.bin/kdump/kdump.1
+++ /dev/null
@@ -1,182 +0,0 @@
-.\" Copyright (c) 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)kdump.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd February 23, 2008
-.Dt KDUMP 1
-.Os
-.Sh NAME
-.Nm kdump
-.Nd display kernel trace data
-.Sh SYNOPSIS
-.Nm
-.Op Fl dEnlHRsT
-.Op Fl f Ar trfile
-.Op Fl m Ar maxdata
-.Op Fl p Ar pid
-.Op Fl t Ar trstr
-.Sh DESCRIPTION
-The
-.Nm
-command displays the kernel trace files produced with
-.Xr ktrace 1
-in human readable format.
-By default, the file
-.Pa ktrace.out
-in the current directory is displayed.
-.Pp
-The options are as follows:
-.Bl -tag -width Fl
-.It Fl d
-Display all numbers in decimal.
-.It Fl E
-Display elapsed timestamps (time since beginning of trace).
-.It Fl f Ar trfile
-Display the specified file instead of
-.Pa ktrace.out .
-.It Fl H
-List the thread ID (tid) of the thread with each trace record, if available.
-If no thread ID is available, 0 will be printed.
-.It Fl l
-Loop reading the trace file, once the end-of-file is reached, waiting for
-more data.
-.It Fl m Ar maxdata
-Display at most
-.Ar maxdata
-bytes when decoding
-.Tn I/O .
-.It Fl n
-Suppress ad hoc translations.
-Normally
-.Nm
-tries to decode many system calls into a more human readable format.
-For example,
-.Xr ioctl 2
-values are replaced with the macro name and
-.Va errno
-values are replaced with the
-.Xr strerror 3
-string.
-Suppressing this feature yields a more consistent output format and is
-easily amenable to further processing.
-.It Fl p Ar pid
-Display only trace events that correspond to the process
-.Ar pid .
-This may be useful when there are multiple processes recorded in the
-same trace file.
-.It Fl R
-Display relative timestamps (time since previous entry).
-.It Fl r
-When decoding STRU records, display structure members such as UIDs,
-GIDs, dates etc. symbolically instead of numerically.
-.It Fl s
-Suppress display of I/O data.
-.It Fl T
-Display absolute timestamps for each entry (seconds since epoch).
-.It Fl t Ar trstr
-See the
-.Fl t
-option of
-.Xr ktrace 1 .
-.El
-.Pp
-The output format of
-.Nm
-is line oriented with several fields.
-The example below shows a section of a kdump generated by the following
-commands:
-.Bd -literal -offset indent
-?> ktrace echo "ktrace"
-
-?> kdump
-
- 85045 echo CALL writev(0x1,0x804b030,0x2)
- 85045 echo GIO fd 1 wrote 7 bytes
- "ktrace
- "
- 85045 echo RET writev 7
-.Ed
-.Pp
-The first field is the PID of the process being traced.
-The second field is the name of the program being traced.
-The third field is the operation that the kernel performed
-on behalf of the process.
-If thread IDs are being printed, then an additional thread ID column will be
-added to the output between the PID field and program name field.
-.Pp
-In the first line above, the kernel executes the
-.Xr writev 2
-system call on behalf of the process so this is a
-.Li CALL
-operation.
-The fourth field shows the system call that was executed,
-including its arguments.
-The
-.Xr writev 2
-system call takes a file descriptor, in this case 1, or standard
-output, then a pointer to the iovector to write, and the number of
-iovectors that are to be written.
-In the second line we see the operation was
-.Li GIO ,
-for general I/O, and that file descriptor 1 had
-seven bytes written to it.
-This is followed by the seven bytes that were written, the string
-.Qq Li ktrace
-with a carriage return and line feed.
-The last line is the
-.Li RET
-operation, showing a return from the kernel, what system call we are
-returning from, and the return value that the process received.
-Seven bytes were written by the
-.Xr writev 2
-system call, so 7 is the return value.
-.Pp
-The possible operations are:
-.Bl -column -offset indent ".Li GENIO" ".No data from user process"
-.It Sy Name Ta Sy Operation Ta Sy Fourth field
-.It Li CALL Ta enter syscall Ta syscall name and arguments
-.It Li RET Ta return from syscall Ta syscall name and return value
-.It Li NAMI Ta file name lookup Ta path to file
-.It Li GENIO Ta general I/O Ta fd, read/write, number of bytes
-.It Li SIG Ta signal Ta signal name, handler, mask, code
-.It Li CSW Ta context switch Ta stop/resume user/kernel
-.It Li USER Ta data from user process Ta the data
-.It Li STRU Ta various syscalls Ta structure
-.El
-.Sh SEE ALSO
-.Xr ktrace 1
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.4 .
diff --git a/usr.bin/kdump/kdump.c b/usr.bin/kdump/kdump.c
deleted file mode 100644
index 72afdc8..0000000
--- a/usr.bin/kdump/kdump.c
+++ /dev/null
@@ -1,1364 +0,0 @@
-/*-
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1988, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)kdump.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#define _KERNEL
-extern int errno;
-#include <sys/errno.h>
-#undef _KERNEL
-#include <sys/param.h>
-#include <sys/errno.h>
-#define _KERNEL
-#include <sys/time.h>
-#undef _KERNEL
-#include <sys/uio.h>
-#include <sys/ktrace.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/un.h>
-#ifdef IPX
-#include <sys/types.h>
-#include <netipx/ipx.h>
-#endif
-#ifdef NETATALK
-#include <netatalk/at.h>
-#endif
-#include <netinet/in.h>
-#include <dlfcn.h>
-#include <err.h>
-#include <grp.h>
-#include <inttypes.h>
-#include <locale.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-#include <vis.h>
-#include "ktrace.h"
-#include "kdump_subr.h"
-
-int fread_tail(void *, int, int);
-void dumpheader(struct ktr_header *);
-void ktrsyscall(struct ktr_syscall *);
-void ktrsysret(struct ktr_sysret *);
-void ktrnamei(char *, int);
-void hexdump(char *, int, int);
-void visdump(char *, int, int);
-void ktrgenio(struct ktr_genio *, int);
-void ktrpsig(struct ktr_psig *);
-void ktrcsw(struct ktr_csw *);
-void ktruser(int, unsigned char *);
-void ktrsockaddr(struct sockaddr *);
-void ktrstat(struct stat *);
-void ktrstruct(char *, size_t);
-void usage(void);
-const char *ioctlname(u_long);
-
-int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata,
- resolv = 0;
-const char *tracefile = DEF_TRACEFILE;
-struct ktr_header ktr_header;
-
-#define TIME_FORMAT "%b %e %T %Y"
-#define eqs(s1, s2) (strcmp((s1), (s2)) == 0)
-
-int
-main(int argc, char *argv[])
-{
- int ch, ktrlen, size;
- void *m;
- int trpoints = ALL_POINTS;
- int drop_logged;
- pid_t pid = 0;
-
- (void) setlocale(LC_CTYPE, "");
-
- while ((ch = getopt(argc,argv,"f:dElm:np:HRrsTt:")) != -1)
- switch((char)ch) {
- case 'f':
- tracefile = optarg;
- break;
- case 'd':
- decimal = 1;
- break;
- case 'l':
- tail = 1;
- break;
- case 'm':
- maxdata = atoi(optarg);
- break;
- case 'n':
- fancy = 0;
- break;
- case 'p':
- pid = atoi(optarg);
- break;
- case 'r':
- resolv = 1;
- break;
- case 's':
- suppressdata = 1;
- break;
- case 'E':
- timestamp = 3; /* elapsed timestamp */
- break;
- case 'H':
- threads = 1;
- break;
- case 'R':
- timestamp = 2; /* relative timestamp */
- break;
- case 'T':
- timestamp = 1;
- break;
- case 't':
- trpoints = getpoints(optarg);
- if (trpoints < 0)
- errx(1, "unknown trace point in %s", optarg);
- break;
- default:
- usage();
- }
-
- if (argc > optind)
- usage();
-
- m = (void *)malloc(size = 1025);
- if (m == NULL)
- errx(1, "%s", strerror(ENOMEM));
- if (!freopen(tracefile, "r", stdin))
- err(1, "%s", tracefile);
- drop_logged = 0;
- while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) {
- if (ktr_header.ktr_type & KTR_DROP) {
- ktr_header.ktr_type &= ~KTR_DROP;
- if (!drop_logged && threads) {
- (void)printf("%6d %6d %-8.*s Events dropped.\n",
- ktr_header.ktr_pid, ktr_header.ktr_tid >
- 0 ? ktr_header.ktr_tid : 0, MAXCOMLEN,
- ktr_header.ktr_comm);
- drop_logged = 1;
- } else if (!drop_logged) {
- (void)printf("%6d %-8.*s Events dropped.\n",
- ktr_header.ktr_pid, MAXCOMLEN,
- ktr_header.ktr_comm);
- drop_logged = 1;
- }
- }
- if (trpoints & (1<<ktr_header.ktr_type))
- if (pid == 0 || ktr_header.ktr_pid == pid)
- dumpheader(&ktr_header);
- if ((ktrlen = ktr_header.ktr_len) < 0)
- errx(1, "bogus length 0x%x", ktrlen);
- if (ktrlen > size) {
- m = (void *)realloc(m, ktrlen+1);
- if (m == NULL)
- errx(1, "%s", strerror(ENOMEM));
- size = ktrlen;
- }
- if (ktrlen && fread_tail(m, ktrlen, 1) == 0)
- errx(1, "data too short");
- if (pid && ktr_header.ktr_pid != pid)
- continue;
- if ((trpoints & (1<<ktr_header.ktr_type)) == 0)
- continue;
- drop_logged = 0;
- switch (ktr_header.ktr_type) {
- case KTR_SYSCALL:
- ktrsyscall((struct ktr_syscall *)m);
- break;
- case KTR_SYSRET:
- ktrsysret((struct ktr_sysret *)m);
- break;
- case KTR_NAMEI:
- ktrnamei(m, ktrlen);
- break;
- case KTR_GENIO:
- ktrgenio((struct ktr_genio *)m, ktrlen);
- break;
- case KTR_PSIG:
- ktrpsig((struct ktr_psig *)m);
- break;
- case KTR_CSW:
- ktrcsw((struct ktr_csw *)m);
- break;
- case KTR_USER:
- ktruser(ktrlen, m);
- break;
- case KTR_STRUCT:
- ktrstruct(m, ktrlen);
- break;
- default:
- printf("\n");
- break;
- }
- if (tail)
- (void)fflush(stdout);
- }
- return 0;
-}
-
-int
-fread_tail(void *buf, int size, int num)
-{
- int i;
-
- while ((i = fread(buf, size, num, stdin)) == 0 && tail) {
- (void)sleep(1);
- clearerr(stdin);
- }
- return (i);
-}
-
-void
-dumpheader(struct ktr_header *kth)
-{
- static char unknown[64];
- static struct timeval prevtime, temp;
- const char *type;
-
- switch (kth->ktr_type) {
- case KTR_SYSCALL:
- type = "CALL";
- break;
- case KTR_SYSRET:
- type = "RET ";
- break;
- case KTR_NAMEI:
- type = "NAMI";
- break;
- case KTR_GENIO:
- type = "GIO ";
- break;
- case KTR_PSIG:
- type = "PSIG";
- break;
- case KTR_CSW:
- type = "CSW ";
- break;
- case KTR_USER:
- type = "USER";
- break;
- case KTR_STRUCT:
- type = "STRU";
- break;
- default:
- (void)sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
- type = unknown;
- }
-
- /*
- * The ktr_tid field was previously the ktr_buffer field, which held
- * the kernel pointer value for the buffer associated with data
- * following the record header. It now holds a threadid, but only
- * for trace files after the change. Older trace files still contain
- * kernel pointers. Detect this and suppress the results by printing
- * negative tid's as 0.
- */
- if (threads)
- (void)printf("%6d %6d %-8.*s ", kth->ktr_pid, kth->ktr_tid >
- 0 ? kth->ktr_tid : 0, MAXCOMLEN, kth->ktr_comm);
- else
- (void)printf("%6d %-8.*s ", kth->ktr_pid, MAXCOMLEN,
- kth->ktr_comm);
- if (timestamp) {
- if (timestamp == 3) {
- if (prevtime.tv_sec == 0)
- prevtime = kth->ktr_time;
- timevalsub(&kth->ktr_time, &prevtime);
- }
- if (timestamp == 2) {
- temp = kth->ktr_time;
- timevalsub(&kth->ktr_time, &prevtime);
- prevtime = temp;
- }
- (void)printf("%ld.%06ld ",
- kth->ktr_time.tv_sec, kth->ktr_time.tv_usec);
- }
- (void)printf("%s ", type);
-}
-
-#include <sys/syscall.h>
-#define KTRACE
-#include <sys/kern/syscalls.c>
-#undef KTRACE
-int nsyscalls = sizeof (syscallnames) / sizeof (syscallnames[0]);
-
-void
-ktrsyscall(struct ktr_syscall *ktr)
-{
- int narg = ktr->ktr_narg;
- register_t *ip;
-
- if (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0)
- (void)printf("[%d]", ktr->ktr_code);
- else
- (void)printf("%s", syscallnames[ktr->ktr_code]);
- ip = &ktr->ktr_args[0];
- if (narg) {
- char c = '(';
- if (fancy) {
-
-#define print_number(i,n,c) do { \
- if (decimal) \
- (void)printf("%c%ld", c, (long)*i); \
- else \
- (void)printf("%c%#lx", c, (long)*i); \
- i++; \
- n--; \
- c = ','; \
- } while (0);
-
- if (ktr->ktr_code == SYS_ioctl) {
- const char *cp;
- print_number(ip,narg,c);
- if ((cp = ioctlname(*ip)) != NULL)
- (void)printf(",%s", cp);
- else {
- if (decimal)
- (void)printf(",%ld", (long)*ip);
- else
- (void)printf(",%#lx ", (long)*ip);
- }
- c = ',';
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_ptrace) {
- (void)putchar('(');
- ptraceopname ((int)*ip);
- c = ',';
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_access ||
- ktr->ktr_code == SYS_eaccess) {
- print_number(ip,narg,c);
- (void)putchar(',');
- accessmodename ((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_open) {
- int flags;
- int mode;
- print_number(ip,narg,c);
- flags = *ip;
- mode = *++ip;
- (void)putchar(',');
- flagsandmodename (flags, mode, decimal);
- ip++;
- narg-=2;
- } else if (ktr->ktr_code == SYS_wait4) {
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- wait4optname ((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_chmod ||
- ktr->ktr_code == SYS_fchmod ||
- ktr->ktr_code == SYS_lchmod) {
- print_number(ip,narg,c);
- (void)putchar(',');
- modename ((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_mknod) {
- print_number(ip,narg,c);
- (void)putchar(',');
- modename ((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_getfsstat) {
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- getfsstatflagsname ((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_mount) {
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- mountflagsname ((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_unmount) {
- print_number(ip,narg,c);
- (void)putchar(',');
- mountflagsname ((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_recvmsg ||
- ktr->ktr_code == SYS_sendmsg) {
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- sendrecvflagsname ((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_recvfrom ||
- ktr->ktr_code == SYS_sendto) {
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- sendrecvflagsname ((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_chflags ||
- ktr->ktr_code == SYS_fchflags ||
- ktr->ktr_code == SYS_lchflags) {
- print_number(ip,narg,c);
- (void)putchar(',');
- modename((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_kill) {
- print_number(ip,narg,c);
- (void)putchar(',');
- signame((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_reboot) {
- (void)putchar('(');
- rebootoptname((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_umask) {
- (void)putchar('(');
- modename((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_msync) {
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- msyncflagsname((int)*ip);
- ip++;
- narg--;
-#ifdef SYS_freebsd6_mmap
- } else if (ktr->ktr_code == SYS_freebsd6_mmap) {
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- mmapprotname ((int)*ip);
- (void)putchar(',');
- ip++;
- narg--;
- mmapflagsname ((int)*ip);
- ip++;
- narg--;
-#endif
- } else if (ktr->ktr_code == SYS_mmap) {
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- mmapprotname ((int)*ip);
- (void)putchar(',');
- ip++;
- narg--;
- mmapflagsname ((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_mprotect) {
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- mmapprotname ((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_madvise) {
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- madvisebehavname((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_setpriority) {
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- prioname((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_fcntl) {
- int cmd;
- int arg;
- print_number(ip,narg,c);
- cmd = *ip;
- arg = *++ip;
- (void)putchar(',');
- fcntlcmdname(cmd, arg, decimal);
- ip++;
- narg-=2;
- } else if (ktr->ktr_code == SYS_socket) {
- int sockdomain;
- (void)putchar('(');
- sockdomain=(int)*ip;
- sockdomainname(sockdomain);
- ip++;
- narg--;
- (void)putchar(',');
- socktypename((int)*ip);
- ip++;
- narg--;
- if (sockdomain == PF_INET ||
- sockdomain == PF_INET6) {
- (void)putchar(',');
- sockipprotoname((int)*ip);
- ip++;
- narg--;
- }
- c = ',';
- } else if (ktr->ktr_code == SYS_setsockopt ||
- ktr->ktr_code == SYS_getsockopt) {
- print_number(ip,narg,c);
- (void)putchar(',');
- sockoptlevelname((int)*ip, decimal);
- if ((int)*ip == SOL_SOCKET) {
- ip++;
- narg--;
- (void)putchar(',');
- sockoptname((int)*ip);
- }
- ip++;
- narg--;
-#ifdef SYS_freebsd6_lseek
- } else if (ktr->ktr_code == SYS_freebsd6_lseek) {
- print_number(ip,narg,c);
- /* Hidden 'pad' argument, not in lseek(2) */
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- whencename ((int)*ip);
- ip++;
- narg--;
-#endif
- } else if (ktr->ktr_code == SYS_lseek) {
- print_number(ip,narg,c);
- /* Hidden 'pad' argument, not in lseek(2) */
- print_number(ip,narg,c);
- (void)putchar(',');
- whencename ((int)*ip);
- ip++;
- narg--;
-
- } else if (ktr->ktr_code == SYS_flock) {
- print_number(ip,narg,c);
- (void)putchar(',');
- flockname((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_mkfifo ||
- ktr->ktr_code == SYS_mkdir) {
- print_number(ip,narg,c);
- (void)putchar(',');
- modename((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_shutdown) {
- print_number(ip,narg,c);
- (void)putchar(',');
- shutdownhowname((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_socketpair) {
- (void)putchar('(');
- sockdomainname((int)*ip);
- ip++;
- narg--;
- (void)putchar(',');
- socktypename((int)*ip);
- ip++;
- narg--;
- c = ',';
- } else if (ktr->ktr_code == SYS_getrlimit ||
- ktr->ktr_code == SYS_setrlimit) {
- (void)putchar('(');
- rlimitname((int)*ip);
- ip++;
- narg--;
- c = ',';
- } else if (ktr->ktr_code == SYS_quotactl) {
- print_number(ip,narg,c);
- (void)putchar(',');
- quotactlname((int)*ip);
- ip++;
- narg--;
- c = ',';
- } else if (ktr->ktr_code == SYS_nfssvc) {
- (void)putchar('(');
- nfssvcname((int)*ip);
- ip++;
- narg--;
- c = ',';
- } else if (ktr->ktr_code == SYS_rtprio) {
- (void)putchar('(');
- rtprioname((int)*ip);
- ip++;
- narg--;
- c = ',';
- } else if (ktr->ktr_code == SYS___semctl) {
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- semctlname((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_semget) {
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- semgetname((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_msgctl) {
- print_number(ip,narg,c);
- (void)putchar(',');
- shmctlname((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_shmat) {
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- shmatname((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_shmctl) {
- print_number(ip,narg,c);
- (void)putchar(',');
- shmctlname((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_minherit) {
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- minheritname((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_rfork) {
- (void)putchar('(');
- rforkname((int)*ip);
- ip++;
- narg--;
- c = ',';
- } else if (ktr->ktr_code == SYS_lio_listio) {
- (void)putchar('(');
- lio_listioname((int)*ip);
- ip++;
- narg--;
- c = ',';
- } else if (ktr->ktr_code == SYS_mlockall) {
- (void)putchar('(');
- mlockallname((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_sched_setscheduler) {
- print_number(ip,narg,c);
- (void)putchar(',');
- schedpolicyname((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_sched_get_priority_max ||
- ktr->ktr_code == SYS_sched_get_priority_min) {
- (void)putchar('(');
- schedpolicyname((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_sendfile) {
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- sendfileflagsname((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_kldsym) {
- print_number(ip,narg,c);
- (void)putchar(',');
- kldsymcmdname((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_sigprocmask) {
- (void)putchar('(');
- sigprocmaskhowname((int)*ip);
- ip++;
- narg--;
- c = ',';
- } else if (ktr->ktr_code == SYS___acl_get_file ||
- ktr->ktr_code == SYS___acl_set_file ||
- ktr->ktr_code == SYS___acl_get_fd ||
- ktr->ktr_code == SYS___acl_set_fd ||
- ktr->ktr_code == SYS___acl_delete_file ||
- ktr->ktr_code == SYS___acl_delete_fd ||
- ktr->ktr_code == SYS___acl_aclcheck_file ||
- ktr->ktr_code == SYS___acl_aclcheck_fd ||
- ktr->ktr_code == SYS___acl_get_link ||
- ktr->ktr_code == SYS___acl_set_link ||
- ktr->ktr_code == SYS___acl_delete_link ||
- ktr->ktr_code == SYS___acl_aclcheck_link) {
- print_number(ip,narg,c);
- (void)putchar(',');
- acltypename((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_sigaction) {
- (void)putchar('(');
- signame((int)*ip);
- ip++;
- narg--;
- c = ',';
- } else if (ktr->ktr_code == SYS_extattrctl) {
- print_number(ip,narg,c);
- (void)putchar(',');
- extattrctlname((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_nmount) {
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- mountflagsname ((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_thr_create) {
- print_number(ip,narg,c);
- print_number(ip,narg,c);
- (void)putchar(',');
- thrcreateflagsname ((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_thr_kill) {
- print_number(ip,narg,c);
- (void)putchar(',');
- signame ((int)*ip);
- ip++;
- narg--;
- } else if (ktr->ktr_code == SYS_kldunloadf) {
- print_number(ip,narg,c);
- (void)putchar(',');
- kldunloadfflagsname ((int)*ip);
- ip++;
- narg--;
- }
- }
- while (narg) {
- print_number(ip,narg,c);
- }
- (void)putchar(')');
- }
- (void)putchar('\n');
-}
-
-void
-ktrsysret(struct ktr_sysret *ktr)
-{
- register_t ret = ktr->ktr_retval;
- int error = ktr->ktr_error;
- int code = ktr->ktr_code;
-
- if (code >= nsyscalls || code < 0)
- (void)printf("[%d] ", code);
- else
- (void)printf("%s ", syscallnames[code]);
-
- if (error == 0) {
- if (fancy) {
- (void)printf("%d", ret);
- if (ret < 0 || ret > 9)
- (void)printf("/%#lx", (long)ret);
- } else {
- if (decimal)
- (void)printf("%ld", (long)ret);
- else
- (void)printf("%#lx", (long)ret);
- }
- } else if (error == ERESTART)
- (void)printf("RESTART");
- else if (error == EJUSTRETURN)
- (void)printf("JUSTRETURN");
- else {
- (void)printf("-1 errno %d", ktr->ktr_error);
- if (fancy)
- (void)printf(" %s", strerror(ktr->ktr_error));
- }
- (void)putchar('\n');
-}
-
-void
-ktrnamei(char *cp, int len)
-{
- (void)printf("\"%.*s\"\n", len, cp);
-}
-
-void
-hexdump(char *p, int len, int screenwidth)
-{
- int n, i;
- int width;
-
- width = 0;
- do {
- width += 2;
- i = 13; /* base offset */
- i += (width / 2) + 1; /* spaces every second byte */
- i += (width * 2); /* width of bytes */
- i += 3; /* " |" */
- i += width; /* each byte */
- i += 1; /* "|" */
- } while (i < screenwidth);
- width -= 2;
-
- for (n = 0; n < len; n += width) {
- for (i = n; i < n + width; i++) {
- if ((i % width) == 0) { /* beginning of line */
- printf(" 0x%04x", i);
- }
- if ((i % 2) == 0) {
- printf(" ");
- }
- if (i < len)
- printf("%02x", p[i] & 0xff);
- else
- printf(" ");
- }
- printf(" |");
- for (i = n; i < n + width; i++) {
- if (i >= len)
- break;
- if (p[i] >= ' ' && p[i] <= '~')
- printf("%c", p[i]);
- else
- printf(".");
- }
- printf("|\n");
- }
- if ((i % width) != 0)
- printf("\n");
-}
-
-void
-visdump(char *dp, int datalen, int screenwidth)
-{
- int col = 0;
- char *cp;
- int width;
- char visbuf[5];
-
- (void)printf(" \"");
- col = 8;
- for (;datalen > 0; datalen--, dp++) {
- (void) vis(visbuf, *dp, VIS_CSTYLE, *(dp+1));
- cp = visbuf;
- /*
- * Keep track of printables and
- * space chars (like fold(1)).
- */
- if (col == 0) {
- (void)putchar('\t');
- col = 8;
- }
- switch(*cp) {
- case '\n':
- col = 0;
- (void)putchar('\n');
- continue;
- case '\t':
- width = 8 - (col&07);
- break;
- default:
- width = strlen(cp);
- }
- if (col + width > (screenwidth-2)) {
- (void)printf("\\\n\t");
- col = 8;
- }
- col += width;
- do {
- (void)putchar(*cp++);
- } while (*cp);
- }
- if (col == 0)
- (void)printf(" ");
- (void)printf("\"\n");
-}
-
-void
-ktrgenio(struct ktr_genio *ktr, int len)
-{
- int datalen = len - sizeof (struct ktr_genio);
- char *dp = (char *)ktr + sizeof (struct ktr_genio);
- static int screenwidth = 0;
- int i, binary;
-
- if (screenwidth == 0) {
- struct winsize ws;
-
- if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 &&
- ws.ws_col > 8)
- screenwidth = ws.ws_col;
- else
- screenwidth = 80;
- }
- printf("fd %d %s %d byte%s\n", ktr->ktr_fd,
- ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen,
- datalen == 1 ? "" : "s");
- if (suppressdata)
- return;
- if (maxdata && datalen > maxdata)
- datalen = maxdata;
-
- for (i = 0, binary = 0; i < datalen && binary == 0; i++) {
- if (dp[i] >= 32 && dp[i] < 127)
- continue;
- if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9)
- continue;
- binary = 1;
- }
- if (binary)
- hexdump(dp, datalen, screenwidth);
- else
- visdump(dp, datalen, screenwidth);
-}
-
-const char *signames[] = {
- "NULL", "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT", /* 1 - 6 */
- "EMT", "FPE", "KILL", "BUS", "SEGV", "SYS", /* 7 - 12 */
- "PIPE", "ALRM", "TERM", "URG", "STOP", "TSTP", /* 13 - 18 */
- "CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU", /* 19 - 24 */
- "XFSZ", "VTALRM", "PROF", "WINCH", "29", "USR1", /* 25 - 30 */
- "USR2", NULL, /* 31 - 32 */
-};
-
-void
-ktrpsig(struct ktr_psig *psig)
-{
- if (psig->signo > 0 && psig->signo < NSIG)
- (void)printf("SIG%s ", signames[psig->signo]);
- else
- (void)printf("SIG %d ", psig->signo);
- if (psig->action == SIG_DFL)
- (void)printf("SIG_DFL\n");
- else {
- (void)printf("caught handler=0x%lx mask=0x%x code=0x%x\n",
- (u_long)psig->action, psig->mask.__bits[0], psig->code);
- }
-}
-
-void
-ktrcsw(struct ktr_csw *cs)
-{
- (void)printf("%s %s\n", cs->out ? "stop" : "resume",
- cs->user ? "user" : "kernel");
-}
-
-#define UTRACE_DLOPEN_START 1
-#define UTRACE_DLOPEN_STOP 2
-#define UTRACE_DLCLOSE_START 3
-#define UTRACE_DLCLOSE_STOP 4
-#define UTRACE_LOAD_OBJECT 5
-#define UTRACE_UNLOAD_OBJECT 6
-#define UTRACE_ADD_RUNDEP 7
-#define UTRACE_PRELOAD_FINISHED 8
-#define UTRACE_INIT_CALL 9
-#define UTRACE_FINI_CALL 10
-
-struct utrace_rtld {
- char sig[4]; /* 'RTLD' */
- int event;
- void *handle;
- void *mapbase;
- size_t mapsize;
- int refcnt;
- char name[MAXPATHLEN];
-};
-
-void
-ktruser_rtld(int len, unsigned char *p)
-{
- struct utrace_rtld *ut = (struct utrace_rtld *)p;
- void *parent;
- int mode;
-
- switch (ut->event) {
- case UTRACE_DLOPEN_START:
- mode = ut->refcnt;
- printf("dlopen(%s, ", ut->name);
- switch (mode & RTLD_MODEMASK) {
- case RTLD_NOW:
- printf("RTLD_NOW");
- break;
- case RTLD_LAZY:
- printf("RTLD_LAZY");
- break;
- default:
- printf("%#x", mode & RTLD_MODEMASK);
- }
- if (mode & RTLD_GLOBAL)
- printf(" | RTLD_GLOBAL");
- if (mode & RTLD_TRACE)
- printf(" | RTLD_TRACE");
- if (mode & ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE))
- printf(" | %#x", mode &
- ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE));
- printf(")\n");
- break;
- case UTRACE_DLOPEN_STOP:
- printf("%p = dlopen(%s) ref %d\n", ut->handle, ut->name,
- ut->refcnt);
- break;
- case UTRACE_DLCLOSE_START:
- printf("dlclose(%p) (%s, %d)\n", ut->handle, ut->name,
- ut->refcnt);
- break;
- case UTRACE_DLCLOSE_STOP:
- printf("dlclose(%p) finished\n", ut->handle);
- break;
- case UTRACE_LOAD_OBJECT:
- printf("RTLD: loaded %p @ %p - %p (%s)\n", ut->handle,
- ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
- ut->name);
- break;
- case UTRACE_UNLOAD_OBJECT:
- printf("RTLD: unloaded %p @ %p - %p (%s)\n", ut->handle,
- ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
- ut->name);
- break;
- case UTRACE_ADD_RUNDEP:
- parent = ut->mapbase;
- printf("RTLD: %p now depends on %p (%s, %d)\n", parent,
- ut->handle, ut->name, ut->refcnt);
- break;
- case UTRACE_PRELOAD_FINISHED:
- printf("RTLD: LD_PRELOAD finished\n");
- break;
- case UTRACE_INIT_CALL:
- printf("RTLD: init %p for %p (%s)\n", ut->mapbase, ut->handle,
- ut->name);
- break;
- case UTRACE_FINI_CALL:
- printf("RTLD: fini %p for %p (%s)\n", ut->mapbase, ut->handle,
- ut->name);
- break;
- default:
- p += 4;
- len -= 4;
- printf("RTLD: %d ", len);
- while (len--)
- if (decimal)
- printf(" %d", *p++);
- else
- printf(" %02x", *p++);
- printf("\n");
- }
-}
-
-struct utrace_malloc {
- void *p;
- size_t s;
- void *r;
-};
-
-void
-ktruser_malloc(int len, unsigned char *p)
-{
- struct utrace_malloc *ut = (struct utrace_malloc *)p;
-
- if (ut->p == NULL) {
- if (ut->s == 0 && ut->r == NULL)
- printf("malloc_init()\n");
- else
- printf("%p = malloc(%zu)\n", ut->r, ut->s);
- } else {
- if (ut->s == 0)
- printf("free(%p)\n", ut->p);
- else
- printf("%p = realloc(%p, %zu)\n", ut->r, ut->p, ut->s);
- }
-}
-
-void
-ktruser(int len, unsigned char *p)
-{
-
- if (len >= 8 && bcmp(p, "RTLD", 4) == 0) {
- ktruser_rtld(len, p);
- return;
- }
-
- if (len == sizeof(struct utrace_malloc)) {
- ktruser_malloc(len, p);
- return;
- }
-
- (void)printf("%d ", len);
- while (len--)
- if (decimal)
- (void)printf(" %d", *p++);
- else
- (void)printf(" %02x", *p++);
- (void)printf("\n");
-}
-
-void
-ktrsockaddr(struct sockaddr *sa)
-{
-/*
- TODO: Support additional address families
- #include <netnatm/natm.h>
- struct sockaddr_natm *natm;
- #include <netsmb/netbios.h>
- struct sockaddr_nb *nb;
-*/
- char addr[64];
-
- /*
- * note: ktrstruct() has already verified that sa points to a
- * buffer at least sizeof(struct sockaddr) bytes long and exactly
- * sa->sa_len bytes long.
- */
- printf("struct sockaddr { ");
- sockfamilyname(sa->sa_family);
- printf(", ");
-
-#define check_sockaddr_len(n) \
- if (sa_##n->s##n##_len < sizeof(struct sockaddr_##n)) { \
- printf("invalid"); \
- break; \
- }
-
- switch(sa->sa_family) {
- case AF_INET: {
- struct sockaddr_in *sa_in;
-
- sa_in = (struct sockaddr_in *)sa;
- check_sockaddr_len(in);
- inet_ntop(AF_INET, &sa_in->sin_addr, addr, sizeof addr);
- printf("%s:%u", addr, ntohs(sa_in->sin_port));
- break;
- }
-#ifdef NETATALK
- case AF_APPLETALK: {
- struct sockaddr_at *sa_at;
- struct netrange *nr;
-
- sa_at = (struct sockaddr_at *)sa;
- check_sockaddr_len(at);
- nr = &sa_at->sat_range.r_netrange;
- printf("%d.%d, %d-%d, %d", ntohs(sa_at->sat_addr.s_net),
- sa_at->sat_addr.s_node, ntohs(nr->nr_firstnet),
- ntohs(nr->nr_lastnet), nr->nr_phase);
- break;
- }
-#endif
- case AF_INET6: {
- struct sockaddr_in6 *sa_in6;
-
- sa_in6 = (struct sockaddr_in6 *)sa;
- check_sockaddr_len(in6);
- inet_ntop(AF_INET6, &sa_in6->sin6_addr, addr, sizeof addr);
- printf("[%s]:%u", addr, htons(sa_in6->sin6_port));
- break;
- }
-#ifdef IPX
- case AF_IPX: {
- struct sockaddr_ipx *sa_ipx;
-
- sa_ipx = (struct sockaddr_ipx *)sa;
- check_sockaddr_len(ipx);
- /* XXX wish we had ipx_ntop */
- printf("%s", ipx_ntoa(sa_ipx->sipx_addr));
- break;
- }
-#endif
- case AF_UNIX: {
- struct sockaddr_un *sa_un;
-
- sa_un = (struct sockaddr_un *)sa;
- check_sockaddr_len(un);
- printf("%.*s", (int)sizeof(sa_un->sun_path), sa_un->sun_path);
- break;
- }
- default:
- printf("unknown address family");
- }
- printf(" }\n");
-}
-
-void
-ktrstat(struct stat *statp)
-{
- char mode[12], timestr[PATH_MAX + 4];
- struct passwd *pwd;
- struct group *grp;
- struct tm *tm;
-
- /*
- * note: ktrstruct() has already verified that statp points to a
- * buffer exactly sizeof(struct stat) bytes long.
- */
- printf("struct stat {");
- strmode(statp->st_mode, mode);
- printf("dev=%ju, ino=%ju, mode=%s, nlink=%ju, ",
- (uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino, mode,
- (uintmax_t)statp->st_nlink);
- if (resolv == 0 || (pwd = getpwuid(statp->st_uid)) == NULL)
- printf("uid=%ju, ", (uintmax_t)statp->st_uid);
- else
- printf("uid=\"%s\", ", pwd->pw_name);
- if (resolv == 0 || (grp = getgrgid(statp->st_gid)) == NULL)
- printf("gid=%ju, ", (uintmax_t)statp->st_gid);
- else
- printf("gid=\"%s\", ", grp->gr_name);
- printf("rdev=%ju, ", (uintmax_t)statp->st_rdev);
- printf("atime=");
- if (resolv == 0)
- printf("%ld", statp->st_atimespec.tv_sec);
- else {
- tm = localtime(&statp->st_atimespec.tv_sec);
- (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
- printf("\"%s\"", timestr);
- }
- if (statp->st_atimespec.tv_nsec != 0)
- printf(".%09ld, ", statp->st_atimespec.tv_nsec);
- else
- printf(", ");
- printf("stime=");
- if (resolv == 0)
- printf("%ld", statp->st_mtimespec.tv_sec);
- else {
- tm = localtime(&statp->st_mtimespec.tv_sec);
- (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
- printf("\"%s\"", timestr);
- }
- if (statp->st_mtimespec.tv_nsec != 0)
- printf(".%09ld, ", statp->st_mtimespec.tv_nsec);
- else
- printf(", ");
- printf("ctime=");
- if (resolv == 0)
- printf("%ld", statp->st_ctimespec.tv_sec);
- else {
- tm = localtime(&statp->st_ctimespec.tv_sec);
- (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
- printf("\"%s\"", timestr);
- }
- if (statp->st_ctimespec.tv_nsec != 0)
- printf(".%09ld, ", statp->st_ctimespec.tv_nsec);
- else
- printf(", ");
- printf("birthtime=");
- if (resolv == 0)
- printf("%ld", statp->st_birthtimespec.tv_sec);
- else {
- tm = localtime(&statp->st_birthtimespec.tv_sec);
- (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
- printf("\"%s\"", timestr);
- }
- if (statp->st_birthtimespec.tv_nsec != 0)
- printf(".%09ld, ", statp->st_birthtimespec.tv_nsec);
- else
- printf(", ");
- printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x",
- (uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize,
- (intmax_t)statp->st_blocks, statp->st_flags);
- printf(" }\n");
-}
-
-void
-ktrstruct(char *buf, size_t buflen)
-{
- char *name, *data;
- size_t namelen, datalen;
- int i;
-
- for (name = buf, namelen = 0;
- namelen < buflen && name[namelen] != '\0';
- ++namelen)
- /* nothing */;
- if (namelen == buflen)
- goto invalid;
- if (name[namelen] != '\0')
- goto invalid;
- data = buf + namelen + 1;
- datalen = buflen - namelen - 1;
- if (datalen == 0)
- goto invalid;
- /* sanity check */
- for (i = 0; i < namelen; ++i)
- if (!isalpha((unsigned char)name[i]))
- goto invalid;
- if (strcmp(name, "stat") == 0) {
- if (datalen != sizeof(struct stat))
- goto invalid;
- ktrstat((struct stat *)data);
- } else if (strcmp(name, "sockaddr") == 0) {
- if (datalen < sizeof(struct sockaddr) ||
- datalen != ((struct sockaddr *)(data))->sa_len)
- goto invalid;
- ktrsockaddr((struct sockaddr *)data);
- } else {
- printf("unknown structure\n");
- }
- return;
-invalid:
- printf("invalid record\n");
-}
-
-void
-usage(void)
-{
- fprintf(stderr, "usage: kdump [-dEnlHRrsT] [-f trfile] "
- "[-m maxdata] [-p pid] [-t trstr]\n");
- exit(1);
-}
diff --git a/usr.bin/kdump/kdump_subr.h b/usr.bin/kdump/kdump_subr.h
deleted file mode 100644
index 50cf9ee..0000000
--- a/usr.bin/kdump/kdump_subr.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* $FreeBSD$ */
-
-void signame (int);
-void semctlname (int);
-void shmctlname (int);
-void semgetname (int);
-void fcntlcmdname (int, int, int);
-void rtprioname (int);
-void modename (int);
-void flagsname (int);
-void flagsandmodename (int, int, int);
-void accessmodename (int);
-void mmapprotname (int);
-void mmapflagsname (int);
-void wait4optname (int);
-void sendrecvflagsname (int);
-void getfsstatflagsname (int);
-void mountflagsname (int);
-void rebootoptname (int);
-void flockname (int);
-void sockoptname (int);
-void sockoptlevelname (int, int);
-void sockdomainname (int);
-void sockipprotoname (int);
-void socktypename (int);
-void thrcreateflagsname (int);
-void mlockallname (int);
-void shmatname (int);
-void rforkname (int);
-void nfssvcname (int);
-void whencename (int);
-void rlimitname (int);
-void shutdownhowname (int);
-void prioname (int);
-void madvisebehavname (int);
-void msyncflagsname (int);
-void schedpolicyname (int);
-void kldunloadfflagsname (int);
-void extattrctlname (int);
-void kldsymcmdname (int);
-void sendfileflagsname (int);
-void acltypename (int);
-void sigprocmaskhowname (int);
-void lio_listioname (int);
-void minheritname (int);
-void quotactlname (int);
-void ptraceopname (int);
diff --git a/usr.bin/kdump/mkioctls b/usr.bin/kdump/mkioctls
deleted file mode 100644
index 5feae11..0000000
--- a/usr.bin/kdump/mkioctls
+++ /dev/null
@@ -1,89 +0,0 @@
-#!/bin/sh
-#
-# $FreeBSD$
-
-set -e
-
-if [ "x$1" = "x-s" ]; then
- use_switch=1
- shift
-else
- use_switch=0
-fi
-
-if [ -z "$1" ]; then
- echo "usage: sh $0 [-s] include-dir"
- exit 1
-fi
-
-LC_ALL=C; export LC_ALL
-
-# Build a list of headers that have ioctls in them.
-# XXX should we use an ANSI cpp?
-ioctl_includes=`
- cd $1
- find -H -s * -name '*.h' |
- xargs egrep -l \
-'^#[ ]*define[ ]+[A-Za-z_][A-Za-z0-9_]*[ ]+_IO[^a-z0-9_]' |
- awk '{printf("#include <%s>\\\\n", $1)}'
-`
-
-awk -v x="$ioctl_includes" 'BEGIN {print x}' |
- gcc -E -I$1 -dM - |
- awk -v ioctl_includes="$ioctl_includes" -v use_switch="$use_switch" '
-BEGIN {
- print "/* XXX obnoxious prerequisites. */"
- print "#define COMPAT_43"
- print "#include <sys/param.h>"
- print "#include <sys/devicestat.h>"
- print "#include <sys/disklabel.h>"
- print "#include <sys/socket.h>"
- print "#include <sys/time.h>"
- print "#include <sys/tty.h>"
- print "#include <bsm/audit.h>"
- print "#include <net/ethernet.h>"
- print "#include <net/if.h>"
- print "#include <net/if_var.h>"
- print "#include <net/pfvar.h>"
- print "#include <net/route.h>"
- print "#include <netinet/in.h>"
- print "#include <netinet/ip_mroute.h>"
- print "#include <netinet6/in6_var.h>"
- print "#include <netinet6/nd6.h>"
- print "#include <netinet6/ip6_mroute.h>"
- print "#include <stdio.h>"
- print "#include <cam/cam.h>"
- print ""
- print "const char *ioctlname(u_long val);"
- print ""
- print ioctl_includes
- print ""
- print "const char *"
- print "ioctlname(u_long val)"
- print "{"
- print ""
- if (use_switch)
- print "\tswitch(val) {"
-}
-
-/^#[ ]*define[ ]+[A-Za-z_][A-Za-z0-9_]*[ ]+_IO/ {
-
- # find where the name starts
- for (i = 1; i <= NF; i++)
- if ($i ~ /define/)
- break;
- ++i;
- #
- if (use_switch)
- printf("\tcase %s:\n\t\treturn(\"%s\");\n", $i, $i);
- else
- printf("\tif (val == %s)\n\t\treturn(\"%s\");\n", $i, $i);
-
-}
-END {
- if (use_switch)
- print "\t}"
- print "\n\treturn(NULL);"
- print "}"
-}
-'
diff --git a/usr.bin/kdump/mksubr b/usr.bin/kdump/mksubr
deleted file mode 100644
index 797c32c..0000000
--- a/usr.bin/kdump/mksubr
+++ /dev/null
@@ -1,445 +0,0 @@
-#!/bin/sh
-#
-# $FreeBSD$
-#
-# Generates kdump_subr.c
-# mkioctls is a special-purpose script, and works fine as it is
-# now, so it remains independent. The idea behind how it generates
-# its list was heavily borrowed here.
-#
-# Some functions here are automatically generated. This can mean
-# the user will see unusual kdump output or errors while building
-# if the underlying .h files are changed significantly.
-#
-# Key:
-# AUTO: Completely auto-generated with either the "or" or the "switch"
-# method.
-# AUTO - Special: Generated automatically, but with some extra commands
-# that the auto_*_type() functions are inappropriate for.
-# MANUAL: Manually entered and must therefore be manually updated.
-
-set -e
-
-LC_ALL=C; export LC_ALL
-
-if [ -z "$1" ]
-then
- echo "usage: sh $0 include-dir"
- exit 1
-fi
-include_dir=$1
-
-#
-# Automatically generates a C function that will print out the
-# numeric input as a pipe-delimited string of the appropriate
-# #define keys. ex:
-# S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH
-# The XOR is necessary to prevent including the "0"-value in every
-# line.
-#
-auto_or_type () {
- local name grep file
- name=$1
- grep=$2
- file=$3
-
- cat <<_EOF_
-/* AUTO */
-void
-$name (int arg)
-{
- int or = 0;
-_EOF_
- egrep "^#[[:space:]]*define[[:space:]]+"${grep}"[[:space:]]*" \
- $include_dir/$file | \
- awk '{ for (i = 1; i <= NF; i++) \
- if ($i ~ /define/) \
- break; \
- ++i; \
- printf "\tif(!((arg>0)^((%s)>0)))\n\t\tif_print_or(arg, %s, or);\n", $i, $i }'
-cat <<_EOF_
- if (or == 0)
- (void)printf("<invalid>%ld", (long)arg);
-}
-
-_EOF_
-}
-
-#
-# Automatically generates a C function used when the argument
-# maps to a single, specific #definition
-#
-auto_switch_type () {
- local name grep file
- name=$1
- grep=$2
- file=$3
-
- cat <<_EOF_
-/* AUTO */
-void
-$name (int arg)
-{
- switch (arg) {
-_EOF_
- egrep "^#[[:space:]]*define[[:space:]]+"${grep}"[[:space:]]*" \
- $include_dir/$file | \
- awk '{ for (i = 1; i <= NF; i++) \
- if ($i ~ /define/) \
- break; \
- ++i; \
- printf "\tcase %s:\n\t\t(void)printf(\"%s\");\n\t\tbreak;\n", $i, $i }'
-cat <<_EOF_
- default: /* Should not reach */
- (void)printf("<invalid=%ld>", (long)arg);
- }
-}
-
-_EOF_
-}
-
-#
-# Automatically generates a C function used when the argument
-# maps to a #definition
-#
-auto_if_type () {
- local name grep file
- name=$1
- grep=$2
- file=$3
-
- cat <<_EOF_
-/* AUTO */
-void
-$name (int arg)
-{
-_EOF_
- egrep "^#[[:space:]]*define[[:space:]]+"${grep}"[[:space:]]*" \
- $include_dir/$file | \
- awk '{ printf "\t"; \
- if (NR > 1) \
- printf "else " ; \
- printf "if (arg == %s) \n\t\tprintf(\"%s\");\n", $2, $2 }'
-cat <<_EOF_
- else /* Should not reach */
- (void)printf("<invalid=%ld>", (long)arg);
-}
-
-_EOF_
-}
-
-# C start
-
-cat <<_EOF_
-#include <stdio.h>
-#include <sys/fcntl.h>
-#include <sys/stat.h>
-#include <sys/unistd.h>
-#include <sys/mman.h>
-#include <sys/wait.h>
-#define _KERNEL
-#include <sys/socket.h>
-#undef _KERNEL
-#include <netinet/in.h>
-#include <sys/param.h>
-#include <sys/mount.h>
-#include <sys/ptrace.h>
-#include <sys/resource.h>
-#include <sys/reboot.h>
-#include <sched.h>
-#include <sys/linker.h>
-#define _KERNEL
-#include <sys/thr.h>
-#undef _KERNEL
-#include <sys/extattr.h>
-#include <sys/acl.h>
-#include <aio.h>
-#include <sys/sem.h>
-#include <sys/ipc.h>
-#include <sys/rtprio.h>
-#include <sys/shm.h>
-#include <nfsserver/nfs.h>
-#include <ufs/ufs/quota.h>
-
-#include "kdump_subr.h"
-
-/*
- * These are simple support macros. print_or utilizes a variable
- * defined in the calling function to track whether or not it should
- * print a logical-OR character ('|') before a string. if_print_or
- * simply handles the necessary "if" statement used in many lines
- * of this file.
- */
-#define print_or(str,orflag) do { \\
- if (orflag) putchar('|'); else orflag = 1; \\
- printf (str); } \\
- while (0)
-#define if_print_or(i,flag,orflag) do { \\
- if ((i & flag) == flag) \\
- print_or(#flag,orflag); } \\
- while (0)
-
-/* MANUAL */
-extern char *signames[]; /* from kdump.c */
-void
-signame (int sig)
-{
- if (sig > 0 && sig < NSIG)
- (void)printf("SIG%s",signames[sig]);
- else
- (void)printf("SIG %d", sig);
-}
-
-/* MANUAL */
-void
-semctlname (int cmd)
-{
- switch (cmd) {
- case GETNCNT:
- (void)printf("GETNCNT");
- break;
- case GETPID:
- (void)printf("GETPID");
- break;
- case GETVAL:
- (void)printf("GETVAL");
- break;
- case GETALL:
- (void)printf("GETALL");
- break;
- case GETZCNT:
- (void)printf("GETZCNT");
- break;
- case SETVAL:
- (void)printf("SETVAL");
- break;
- case SETALL:
- (void)printf("SETALL");
- break;
- case IPC_RMID:
- (void)printf("IPC_RMID");
- break;
- case IPC_SET:
- (void)printf("IPC_SET");
- break;
- case IPC_STAT:
- (void)printf("IPC_STAT");
- break;
- default: /* Should not reach */
- (void)printf("<invalid=%ld>", (long)cmd);
- }
-}
-
-/* MANUAL */
-void
-shmctlname (int cmd) {
- switch (cmd) {
- case IPC_RMID:
- (void)printf("IPC_RMID");
- break;
- case IPC_SET:
- (void)printf("IPC_SET");
- break;
- case IPC_STAT:
- (void)printf("IPC_STAT");
- break;
- default: /* Should not reach */
- (void)printf("<invalid=%ld>", (long)cmd);
- }
-}
-
-/* MANUAL */
-void
-semgetname (int flag) {
- int or = 0;
- if_print_or(flag, SEM_R, or);
- if_print_or(flag, SEM_A, or);
- if_print_or(flag, (SEM_R>>3), or);
- if_print_or(flag, (SEM_A>>3), or);
- if_print_or(flag, (SEM_R>>6), or);
- if_print_or(flag, (SEM_A>>6), or);
-}
-
-/*
- * MANUAL
- *
- * Only used by SYS_open. Unless O_CREAT is set in flags, the
- * mode argument is unused (and often bogus and misleading).
- */
-void
-flagsandmodename (int flags, int mode, int decimal) {
- flagsname (flags);
- (void)putchar(',');
- if ((flags & O_CREAT) == O_CREAT) {
- modename (mode);
- } else {
- if (decimal) {
- (void)printf("<unused>%ld", (long)mode);
- } else {
- (void)printf("<unused>%#lx", (long)mode);
- }
- }
-}
-
-/*
- * MANUAL
- *
- * [g|s]etsockopt's level argument can either be SOL_SOCKET or a value
- * referring to a line in /etc/protocols . It might be appropriate
- * to use getprotoent(3) here.
- */
-void
-sockoptlevelname (int level, int decimal)
-{
- if (level == SOL_SOCKET) {
- (void)printf("SOL_SOCKET");
- } else {
- if (decimal) {
- (void)printf("%ld", (long)level);
- } else {
- (void)printf("%#lx", (long)level);
- }
- }
-}
-
-_EOF_
-
-auto_or_type "modename" "S_[A-Z]+[[:space:]]+[0-6]{7}" "sys/stat.h"
-auto_or_type "flagsname" "O_[A-Z]+[[:space:]]+0x[0-9A-Fa-f]+" "sys/fcntl.h"
-auto_or_type "accessmodename" "[A-Z]_OK[[:space:]]+0?x?[0-9A-Fa-f]+" "sys/unistd.h"
-auto_or_type "mmapprotname" "PROT_[A-Z]+[[:space:]]+0x[0-9A-Fa-f]+" "sys/mman.h"
-auto_or_type "mmapflagsname" "MAP_[A-Z]+[[:space:]]+0x[0-9A-Fa-f]+" "sys/mman.h"
-auto_or_type "wait4optname" "W[A-Z]+[[:space:]]+[0-9]+" "sys/wait.h"
-auto_or_type "getfsstatflagsname" "MNT_[A-Z]+[[:space:]]+[1-9][0-9]*" "sys/mount.h"
-auto_or_type "mountflagsname" "MNT_[A-Z]+[[:space:]]+0x[0-9]+" "sys/mount.h"
-auto_or_type "rebootoptname" "RB_[A-Z]+[[:space:]]+0x[0-9]+" "sys/reboot.h"
-auto_or_type "flockname" "LOCK_[A-Z]+[[:space:]]+0x[0-9]+" "sys/fcntl.h"
-auto_or_type "thrcreateflagsname" "THR_[A-Z]+[[:space:]]+0x[0-9]+" "sys/thr.h"
-auto_or_type "mlockallname" "MCL_[A-Z]+[[:space:]]+0x[0-9]+" "sys/mman.h"
-auto_or_type "shmatname" "SHM_[A-Z]+[[:space:]]+[0-9]{6}+" "sys/shm.h"
-auto_or_type "rforkname" "RF[A-Z]+[[:space:]]+\([0-9]+<<[0-9]+\)" "sys/unistd.h"
-auto_or_type "nfssvcname" "NFSSVC_[A-Z]+[[:space:]]+0x[0-9]+" "nfsserver/nfs.h"
-
-auto_switch_type "whencename" "SEEK_[A-Z]+[[:space:]]+[0-9]+" "sys/unistd.h"
-auto_switch_type "rlimitname" "RLIMIT_[A-Z]+[[:space:]]+[0-9]+" "sys/resource.h"
-auto_switch_type "shutdownhowname" "SHUT_[A-Z]+[[:space:]]+0x[0-9]+" "sys/socket.h"
-auto_switch_type "prioname" "PRIO_[A-Z]+[[:space:]]+[0-9]" "sys/resource.h"
-auto_switch_type "madvisebehavname" "_?MADV_[A-Z]+[[:space:]]+[0-9]+" "sys/mman.h"
-auto_switch_type "msyncflagsname" "MS_[A-Z]+[[:space:]]+0x[0-9]+" "sys/mman.h"
-auto_switch_type "schedpolicyname" "SCHED_[A-Z]+[[:space:]]+[0-9]+" "sched.h"
-auto_switch_type "kldunloadfflagsname" "LINKER_UNLOAD_[A-Z]+[[:space:]]+[0-9]+" "sys/linker.h"
-auto_switch_type "extattrctlname" "EXTATTR_NAMESPACE_[A-Z]+[[:space:]]+0x[0-9]+" "sys/extattr.h"
-auto_switch_type "kldsymcmdname" "KLDSYM_[A-Z]+[[:space:]]+[0-9]+" "sys/linker.h"
-auto_switch_type "sendfileflagsname" "SF_[A-Z]+[[:space:]]+[0-9]+" "sys/socket.h"
-auto_switch_type "acltypename" "ACL_TYPE_[A-Z]+[[:space:]]+0x[0-9]+" "sys/acl.h"
-auto_switch_type "sigprocmaskhowname" "SIG_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
-auto_switch_type "lio_listioname" "LIO_(NO)?WAIT[[:space:]]+[0-9]+" "aio.h"
-auto_switch_type "minheritname" "INHERIT_[A-Z]+[[:space:]]+[0-9]+" "sys/mman.h"
-auto_switch_type "quotactlname" "Q_[A-Z]+[[:space:]]+0x[0-9]+" "ufs/ufs/quota.h"
-auto_if_type "sockdomainname" "PF_[[:alnum:]]+[[:space:]]+" "sys/socket.h"
-auto_if_type "sockfamilyname" "AF_[[:alnum:]]+[[:space:]]+" "sys/socket.h"
-auto_if_type "sockipprotoname" "IPPROTO_[[:alnum:]]+[[:space:]]+" "netinet/in.h"
-auto_switch_type "sockoptname" "SO_[A-Z]+[[:space:]]+0x[0-9]+" "sys/socket.h"
-auto_switch_type "socktypename" "SOCK_[A-Z]+[[:space:]]+[1-9]+[0-9]*" "sys/socket.h"
-auto_switch_type "ptraceopname" "PT_[[:alnum:]]+[[:space:]]+[0-9]+" "sys/ptrace.h"
-
-cat <<_EOF_
-/*
- * AUTO - Special
- * F_ is used to specify fcntl commands as well as arguments. Both sets are
- * grouped in fcntl.h, and this awk script grabs the first group.
- */
-void
-fcntlcmdname (int cmd, int arg, int decimal)
-{
- switch (cmd) {
-_EOF_
-egrep "^#[[:space:]]*define[[:space:]]+F_[A-Z]+[[:space:]]+[0-9]+[[:space:]]*" \
- $include_dir/sys/fcntl.h | \
- awk 'BEGIN { o=0 } { for (i = 1; i <= NF; i++) \
- if ($i ~ /define/) \
- break; \
- ++i; \
- if (o <= $(i+1)) \
- printf "\tcase %s:\n\t\t(void)printf(\"%s\");\n\t\tbreak;\n", $i, $i; \
- else \
- exit; \
- o = $(i+1) }'
-cat <<_EOF_
- default: /* Should not reach */
- (void)printf("<invalid=%ld>", (long)cmd);
- }
- (void)putchar(',');
- if (cmd == F_GETFD || cmd == F_SETFD) {
- if (arg == FD_CLOEXEC)
- (void)printf("FD_CLOEXEC");
- else if (arg == 0)
- (void)printf("0");
- else {
- if (decimal)
- (void)printf("<invalid>%ld", (long)arg);
- else
- (void)printf("<invalid>%#lx", (long)arg);
- }
- } else if (cmd == F_SETFL) {
- flagsname(arg);
- } else {
- if (decimal)
- (void)printf("%ld", (long)arg);
- else
- (void)printf("%#lx", (long)arg);
- }
-}
-
-/*
- * AUTO - Special
- *
- * The only reason this is not fully automated is due to the
- * grep -v RTP_PRIO statement. A better egrep line should
- * make this capable of being a auto_switch_type() function.
- */
-void
-rtprioname (int func)
-{
- switch (func) {
-_EOF_
-egrep "^#[[:space:]]*define[[:space:]]+RTP_[A-Z]+[[:space:]]+0x[0-9]+[[:space:]]*" \
- $include_dir/sys/rtprio.h | grep -v RTP_PRIO | \
- awk '{ for (i = 1; i <= NF; i++) \
- if ($i ~ /define/) \
- break; \
- ++i; \
- printf "\tcase %s:\n\t\t(void)printf(\"%s\");\n\t\tbreak;\n", $i, $i }'
-cat <<_EOF_
- default: /* Should not reach */
- (void)printf("<invalid=%ld>", (long)func);
- }
-}
-
-/*
- * AUTO - Special
- *
- * The send and recv functions have a flags argument which can be
- * set to 0. There is no corresponding #define. The auto_ functions
- * detect this as "invalid", which is incorrect here.
- */
-void
-sendrecvflagsname (int flags)
-{
- int or = 0;
-
- if (flags == 0) {
- (void)printf("0");
- return;
- }
-_EOF_
-egrep "^#[[:space:]]*define[[:space:]]+MSG_[A-Z]+[[:space:]]+0x[0-9]+[[:space:]]*" $include_dir/sys/socket.h | \
- awk '{ for (i = 1; i <= NF; i++) \
- if ($i ~ /define/) \
- break; \
- ++i; \
- printf "\tif(!((flags>0)^((%s)>0)))\n\t\tif_print_or(flags, %s, or);\n", $i, $i }'
-cat <<_EOF_
-}
-
-_EOF_
diff --git a/usr.bin/keylogin/Makefile b/usr.bin/keylogin/Makefile
deleted file mode 100644
index bf279eb..0000000
--- a/usr.bin/keylogin/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# $FreeBSD$
-
-PROG= keylogin
-
-DPADD= ${LIBRPCSVC}
-LDADD= -lrpcsvc
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/keylogin/keylogin.1 b/usr.bin/keylogin/keylogin.1
deleted file mode 100644
index 8a3927d..0000000
--- a/usr.bin/keylogin/keylogin.1
+++ /dev/null
@@ -1,30 +0,0 @@
-.\" @(#)keylogin.1 1.5 91/03/11 TIRPC 1.0;
-.\" Copyright (c) 1988 Sun Microsystems, Inc. - All Rights Reserved.
-.\" $FreeBSD$
-.\"
-.Dd September 9, 1987
-.Dt KEYLOGIN 1
-.Os
-.Sh NAME
-.Nm keylogin
-.Nd decrypt and store secret key
-.Sh SYNOPSIS
-.Nm
-.Sh DESCRIPTION
-The
-.Nm
-utility prompts the user for their login password, and uses it to decrypt
-the user's secret key stored in the
-.Xr publickey 5
-database.
-Once decrypted, the user's key is stored by the local
-key server process
-.Xr keyserv 8
-to be used by any secure network services, such as NFS.
-.Sh SEE ALSO
-.Xr chkey 1 ,
-.Xr keylogout 1 ,
-.Xr login 1 ,
-.Xr publickey 5 ,
-.Xr keyserv 8 ,
-.Xr newkey 8
diff --git a/usr.bin/keylogin/keylogin.c b/usr.bin/keylogin/keylogin.c
deleted file mode 100644
index 8e10d95..0000000
--- a/usr.bin/keylogin/keylogin.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user or with the express written consent of
- * Sun Microsystems, Inc.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-#if !defined(lint) && defined(SCCSIDS)
-static char sccsid[] = "@(#)keylogin.c 1.4 91/03/11 Copyr 1986 Sun Micro";
-#endif
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Copyright (C) 1986, Sun Microsystems, Inc.
- */
-
-/*
- * Set secret key on local machine
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <pwd.h>
-#include <unistd.h>
-#include <rpc/rpc.h>
-#include <rpc/key_prot.h>
-
-int
-main()
-{
- char fullname[MAXNETNAMELEN + 1];
- struct key_netstarg netst;
-
- if (!getnetname(fullname)) {
- fprintf(stderr, "netname lookup failed -- make sure the ");
- fprintf(stderr, "system domain name is set.\n");
- exit(1);
- }
-
- if (! getsecretkey(fullname, (char *)&(netst.st_priv_key),
- getpass("Password:"))) {
- fprintf(stderr, "Can't find %s's secret key\n", fullname);
- exit(1);
- }
- if (netst.st_priv_key[0] == 0) {
- fprintf(stderr, "Password incorrect for %s\n", fullname);
- exit(1);
- }
-
- netst.st_pub_key[0] = 0;
- netst.st_netname = strdup(fullname);
-
- if (key_setnet(&netst) < 0) {
- fprintf(stderr, "Could not set %s's secret key\n", fullname);
- fprintf(stderr, "Maybe the keyserver is down?\n");
- exit(1);
- }
- exit(0);
- /* NOTREACHED */
-}
diff --git a/usr.bin/keylogout/Makefile b/usr.bin/keylogout/Makefile
deleted file mode 100644
index 1f5feec..0000000
--- a/usr.bin/keylogout/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-PROG= keylogout
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/keylogout/keylogout.1 b/usr.bin/keylogout/keylogout.1
deleted file mode 100644
index 6d643c9..0000000
--- a/usr.bin/keylogout/keylogout.1
+++ /dev/null
@@ -1,42 +0,0 @@
-.\" $FreeBSD$
-.\" @(#)keylogout.1 1.4 91/03/11 TIRPC 1.0; from 1.3 89/07/26 SMI;
-.Dd April 15, 1989
-.Dt KEYLOGOUT 1
-.Os
-.Sh NAME
-.Nm keylogout
-.Nd delete stored secret key
-.Sh SYNOPSIS
-.Nm
-.Op Fl f
-.Sh DESCRIPTION
-The
-.Nm
-utility deletes the key stored by the key server process
-.Xr keyserv 8
-to be used by any secure network services, such as NFS.
-Further access to the key is revoked,
-however current session keys may remain valid till they expire,
-or are refreshed.
-This option will cause any background jobs that need secure RPC
-services to fail, and any scheduled
-.Nm at
-jobs that need the key to fail.
-Also since only one copy is kept on a machine of the key,
-it is a bad idea to place this in your
-.Pa .logout
-file since it will affect other sessions on the same machine.
-.Pp
-The following option is available:
-.Bl -tag -width indent
-.It Fl f
-Forget the rootkey.
-This will break secure NFS if it is done on a server.
-.El
-.Sh SEE ALSO
-.Xr chkey 1 ,
-.Xr keylogin 1 ,
-.Xr login 1 ,
-.Xr publickey 5 ,
-.Xr keyserv 8 ,
-.Xr newkey 8
diff --git a/usr.bin/keylogout/keylogout.c b/usr.bin/keylogout/keylogout.c
deleted file mode 100644
index e4fcf21..0000000
--- a/usr.bin/keylogout/keylogout.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user or with the express written consent of
- * Sun Microsystems, Inc.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-/*
- * Copyright (C) 1986, Sun Microsystems, Inc.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * unset the secret key on local machine
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <rpc/key_prot.h>
-
-int
-main(argc,argv)
- int argc;
- char *argv[];
-{
- static char secret[HEXKEYBYTES + 1];
-
- if (geteuid() == 0) {
- if ((argc != 2 ) || (strcmp(argv[1], "-f") != 0)) {
- fprintf(stderr,
-"keylogout by root would break all servers that use secure rpc!\n");
- fprintf(stderr,
-"root may use keylogout -f to do this (at your own risk)!\n");
- exit(1);
- }
- }
-
- if (key_setsecret(secret) < 0) {
- fprintf(stderr, "Could not unset your secret key.\n");
- fprintf(stderr, "Maybe the keyserver is down?\n");
- exit(1);
- }
- exit(0);
- /* NOTREACHED */
-}
diff --git a/usr.bin/killall/Makefile b/usr.bin/killall/Makefile
deleted file mode 100644
index ff772a8..0000000
--- a/usr.bin/killall/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-PROG= killall
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/killall/killall.1 b/usr.bin/killall/killall.1
deleted file mode 100644
index 816ea81..0000000
--- a/usr.bin/killall/killall.1
+++ /dev/null
@@ -1,161 +0,0 @@
-.\" Copyright (C) 1995 by Joerg Wunsch, Dresden
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-.\" DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT,
-.\" INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
-.\" IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-.\" POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd November 9, 2007
-.Os
-.Dt KILLALL 1
-.Sh NAME
-.Nm killall
-.Nd kill processes by name
-.Sh SYNOPSIS
-.Nm
-.Op Fl delmsvz
-.Op Fl help
-.Op Fl j Ar jid
-.Op Fl u Ar user
-.Op Fl t Ar tty
-.Op Fl c Ar procname
-.Op Fl Ar SIGNAL
-.Op Ar procname ...
-.Sh DESCRIPTION
-The
-.Nm
-utility kills processes selected by name, as opposed to the selection by PID
-as done by
-.Xr kill 1 .
-By default, it will send a
-.Dv TERM
-signal to all processes with a real UID identical to the
-caller of
-.Nm
-that match the name
-.Ar procname .
-The super-user is allowed to kill any process.
-.Pp
-The options are as follows:
-.Bl -tag -width ".Fl c Ar procname"
-.It Fl d | v
-Be more verbose about what will be done.
-For a single
-.Fl d
-option, a list of the processes that will be sent the signal will be
-printed, or a message indicating that no matching processes have been
-found.
-.It Fl e
-Use the effective user ID instead of the (default) real user ID for matching
-processes specified with the
-.Fl u
-option.
-.It Fl help
-Give a help on the command usage and exit.
-.It Fl l
-List the names of the available signals and exit, like in
-.Xr kill 1 .
-.It Fl m
-Match the argument
-.Ar procname
-as a (case sensitive) regular expression against the names
-of processes found.
-CAUTION!
-This is dangerous, a single dot will match any process
-running under the real UID of the caller.
-.It Fl s
-Show only what would be done, but do not send any signal.
-.It Fl Ar SIGNAL
-Send a different signal instead of the default
-.Dv TERM .
-The signal may be specified either as a name
-(with or without a leading
-.Dq Li SIG ) ,
-or numerically.
-.It Fl j Ar jid
-Kill processes in the jail specified by
-.Ar jid .
-.It Fl u Ar user
-Limit potentially matching processes to those belonging to
-the specified
-.Ar user .
-.It Fl t Ar tty
-Limit potentially matching processes to those running on
-the specified
-.Ar tty .
-.It Fl c Ar procname
-Limit potentially matching processes to those matching
-the specified
-.Ar procname .
-.It Fl z
-Do not skip zombies.
-This should not have any effect except to print a few error messages
-if there are zombie processes that match the specified pattern.
-.El
-.Sh ALL PROCESSES
-Sending a signal to all processes with the given UID
-is already supported by
-.Xr kill 1 .
-So use
-.Xr kill 1
-for this job (e.g.\&
-.Dq Li "kill -TERM -1
-or as root
-.Dq Li "echo kill -TERM -1 | su -m <user>" ) .
-.Sh EXIT STATUS
-The
-.Nm
-utility exits 0 if some processes have been found and
-signalled successfully.
-Otherwise, a status of 1 will be
-returned.
-.Sh DIAGNOSTICS
-Diagnostic messages will only be printed if requested by
-.Fl d
-options.
-.Sh SEE ALSO
-.Xr kill 1 ,
-.Xr pkill 1 ,
-.Xr sysctl 3 ,
-.Xr jail 8
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Fx 2.1 .
-It has been modeled after the
-.Nm
-command as available on other platforms.
-.Sh AUTHORS
-.An -nosplit
-The
-.Nm
-program was originally written in Perl and was contributed by
-.An Wolfram Schneider ,
-this manual page has been written by
-.An J\(:org Wunsch .
-The current version of
-.Nm
-was rewritten in C by
-.An Peter Wemm
-using
-.Xr sysctl 3 .
diff --git a/usr.bin/killall/killall.c b/usr.bin/killall/killall.c
deleted file mode 100644
index b991b15..0000000
--- a/usr.bin/killall/killall.c
+++ /dev/null
@@ -1,422 +0,0 @@
-/*-
- * Copyright (c) 2000 Peter Wemm <peter@FreeBSD.org>
- * Copyright (c) 2000 Paul Saab <ps@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/jail.h>
-#include <sys/stat.h>
-#include <sys/user.h>
-#include <sys/sysctl.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <pwd.h>
-#include <signal.h>
-#include <regex.h>
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <unistd.h>
-#include <locale.h>
-
-static void __dead2
-usage(void)
-{
-
- fprintf(stderr, "usage: killall [-delmsvz] [-help] [-j jid]\n");
- fprintf(stderr,
- " [-u user] [-t tty] [-c cmd] [-SIGNAL] [cmd]...\n");
- fprintf(stderr, "At least one option or argument to specify processes must be given.\n");
- exit(1);
-}
-
-static char *
-upper(const char *str)
-{
- static char buf[80];
- char *s;
-
- strncpy(buf, str, sizeof(buf));
- buf[sizeof(buf) - 1] = '\0';
- for (s = buf; *s; s++)
- *s = toupper((unsigned char)*s);
- return buf;
-}
-
-
-static void
-printsig(FILE *fp)
-{
- const char *const * p;
- int cnt;
- int offset = 0;
-
- for (cnt = NSIG, p = sys_signame + 1; --cnt; ++p) {
- offset += fprintf(fp, "%s ", upper(*p));
- if (offset >= 75 && cnt > 1) {
- offset = 0;
- fprintf(fp, "\n");
- }
- }
- fprintf(fp, "\n");
-}
-
-static void
-nosig(char *name)
-{
-
- warnx("unknown signal %s; valid signals:", name);
- printsig(stderr);
- exit(1);
-}
-
-int
-main(int ac, char **av)
-{
- struct kinfo_proc *procs = NULL, *newprocs;
- struct stat sb;
- struct passwd *pw;
- regex_t rgx;
- regmatch_t pmatch;
- int i, j;
- char buf[256];
- char *user = NULL;
- char *tty = NULL;
- char *cmd = NULL;
- int vflag = 0;
- int sflag = 0;
- int dflag = 0;
- int eflag = 0;
- int jflag = 0;
- int mflag = 0;
- int zflag = 0;
- uid_t uid = 0;
- dev_t tdev = 0;
- pid_t mypid;
- char thiscmd[MAXCOMLEN + 1];
- pid_t thispid;
- uid_t thisuid;
- dev_t thistdev;
- int sig = SIGTERM;
- const char *const *p;
- char *ep;
- int errors = 0;
- int jid;
- int mib[4];
- size_t miblen;
- int st, nprocs;
- size_t size;
- int matched;
- int killed = 0;
-
- setlocale(LC_ALL, "");
-
- av++;
- ac--;
-
- while (ac > 0) {
- if (strcmp(*av, "-l") == 0) {
- printsig(stdout);
- exit(0);
- }
- if (strcmp(*av, "-help") == 0)
- usage();
- if (**av == '-') {
- ++*av;
- switch (**av) {
- case 'j':
- ++*av;
- if (**av == '\0') {
- ++av;
- --ac;
- }
- jflag++;
- if (*av == NULL)
- errx(1, "must specify jid");
- jid = strtol(*av, &ep, 10);
- if (!*av || *ep)
- errx(1, "illegal jid: %s", *av);
- if (jail_attach(jid) == -1)
- err(1, "jail_attach(): %d", jid);
- break;
- case 'u':
- ++*av;
- if (**av == '\0') {
- ++av;
- --ac;
- }
- if (*av == NULL)
- errx(1, "must specify user");
- user = *av;
- break;
- case 't':
- ++*av;
- if (**av == '\0') {
- ++av;
- --ac;
- }
- if (*av == NULL)
- errx(1, "must specify tty");
- tty = *av;
- break;
- case 'c':
- ++*av;
- if (**av == '\0') {
- ++av;
- --ac;
- }
- if (*av == NULL)
- errx(1, "must specify procname");
- cmd = *av;
- break;
- case 'v':
- vflag++;
- break;
- case 's':
- sflag++;
- break;
- case 'd':
- dflag++;
- break;
- case 'e':
- eflag++;
- break;
- case 'm':
- mflag++;
- break;
- case 'z':
- zflag++;
- break;
- default:
- if (isalpha((unsigned char)**av)) {
- if (strncasecmp(*av, "sig", 3) == 0)
- *av += 3;
- for (sig = NSIG, p = sys_signame + 1;
- --sig; ++p)
- if (strcasecmp(*p, *av) == 0) {
- sig = p - sys_signame;
- break;
- }
- if (!sig)
- nosig(*av);
- } else if (isdigit((unsigned char)**av)) {
- sig = strtol(*av, &ep, 10);
- if (!*av || *ep)
- errx(1, "illegal signal number: %s", *av);
- if (sig < 0 || sig >= NSIG)
- nosig(*av);
- } else
- nosig(*av);
- }
- ++av;
- --ac;
- } else {
- break;
- }
- }
-
- if (user == NULL && tty == NULL && cmd == NULL && !jflag && ac == 0)
- usage();
-
- if (tty) {
- if (strncmp(tty, "/dev/", 5) == 0)
- snprintf(buf, sizeof(buf), "%s", tty);
- else if (strncmp(tty, "tty", 3) == 0)
- snprintf(buf, sizeof(buf), "/dev/%s", tty);
- else
- snprintf(buf, sizeof(buf), "/dev/tty%s", tty);
- if (stat(buf, &sb) < 0)
- err(1, "stat(%s)", buf);
- if (!S_ISCHR(sb.st_mode))
- errx(1, "%s: not a character device", buf);
- tdev = sb.st_rdev;
- if (dflag)
- printf("ttydev:0x%x\n", tdev);
- }
- if (user) {
- uid = strtol(user, &ep, 10);
- if (*user == '\0' || *ep != '\0') { /* was it a number? */
- pw = getpwnam(user);
- if (pw == NULL)
- errx(1, "user %s does not exist", user);
- uid = pw->pw_uid;
- if (dflag)
- printf("uid:%d\n", uid);
- }
- } else {
- uid = getuid();
- if (uid != 0) {
- pw = getpwuid(uid);
- if (pw)
- user = pw->pw_name;
- if (dflag)
- printf("uid:%d\n", uid);
- }
- }
- size = 0;
- mib[0] = CTL_KERN;
- mib[1] = KERN_PROC;
- mib[2] = KERN_PROC_PROC;
- mib[3] = 0;
- miblen = 3;
-
- if (user) {
- mib[2] = eflag ? KERN_PROC_UID : KERN_PROC_RUID;
- mib[3] = uid;
- miblen = 4;
- } else if (tty) {
- mib[2] = KERN_PROC_TTY;
- mib[3] = tdev;
- miblen = 4;
- }
-
- st = sysctl(mib, miblen, NULL, &size, NULL, 0);
- do {
- size += size / 10;
- newprocs = realloc(procs, size);
- if (newprocs == 0) {
- if (procs)
- free(procs);
- errx(1, "could not reallocate memory");
- }
- procs = newprocs;
- st = sysctl(mib, miblen, procs, &size, NULL, 0);
- } while (st == -1 && errno == ENOMEM);
- if (st == -1)
- err(1, "could not sysctl(KERN_PROC)");
- if (size % sizeof(struct kinfo_proc) != 0) {
- fprintf(stderr, "proc size mismatch (%zu total, %zu chunks)\n",
- size, sizeof(struct kinfo_proc));
- fprintf(stderr, "userland out of sync with kernel, recompile libkvm etc\n");
- exit(1);
- }
- nprocs = size / sizeof(struct kinfo_proc);
- if (dflag)
- printf("nprocs %d\n", nprocs);
- mypid = getpid();
-
- for (i = 0; i < nprocs; i++) {
- if ((procs[i].ki_stat & SZOMB) == SZOMB && !zflag)
- continue;
- thispid = procs[i].ki_pid;
- strncpy(thiscmd, procs[i].ki_comm, MAXCOMLEN);
- thiscmd[MAXCOMLEN] = '\0';
- thistdev = procs[i].ki_tdev;
- if (eflag)
- thisuid = procs[i].ki_uid; /* effective uid */
- else
- thisuid = procs[i].ki_ruid; /* real uid */
-
- if (thispid == mypid)
- continue;
- matched = 1;
- if (user) {
- if (thisuid != uid)
- matched = 0;
- }
- if (tty) {
- if (thistdev != tdev)
- matched = 0;
- }
- if (cmd) {
- if (mflag) {
- if (regcomp(&rgx, cmd,
- REG_EXTENDED|REG_NOSUB) != 0) {
- mflag = 0;
- warnx("%s: illegal regexp", cmd);
- }
- }
- if (mflag) {
- pmatch.rm_so = 0;
- pmatch.rm_eo = strlen(thiscmd);
- if (regexec(&rgx, thiscmd, 0, &pmatch,
- REG_STARTEND) != 0)
- matched = 0;
- regfree(&rgx);
- } else {
- if (strncmp(thiscmd, cmd, MAXCOMLEN) != 0)
- matched = 0;
- }
- }
- if (jflag && thispid == getpid())
- matched = 0;
- if (matched == 0)
- continue;
- if (ac > 0)
- matched = 0;
- for (j = 0; j < ac; j++) {
- if (mflag) {
- if (regcomp(&rgx, av[j],
- REG_EXTENDED|REG_NOSUB) != 0) {
- mflag = 0;
- warnx("%s: illegal regexp", av[j]);
- }
- }
- if (mflag) {
- pmatch.rm_so = 0;
- pmatch.rm_eo = strlen(thiscmd);
- if (regexec(&rgx, thiscmd, 0, &pmatch,
- REG_STARTEND) == 0)
- matched = 1;
- regfree(&rgx);
- } else {
- if (strcmp(thiscmd, av[j]) == 0)
- matched = 1;
- }
- if (matched)
- break;
- }
- if (matched == 0)
- continue;
- if (dflag)
- printf("sig:%d, cmd:%s, pid:%d, dev:0x%x uid:%d\n", sig,
- thiscmd, thispid, thistdev, thisuid);
-
- if (vflag || sflag)
- printf("kill -%s %d\n", upper(sys_signame[sig]),
- thispid);
-
- killed++;
- if (!dflag && !sflag) {
- if (kill(thispid, sig) < 0 /* && errno != ESRCH */ ) {
- warn("warning: kill -%s %d",
- upper(sys_signame[sig]), thispid);
- errors = 1;
- }
- }
- }
- if (killed == 0) {
- fprintf(stderr, "No matching processes %swere found\n",
- getuid() != 0 ? "belonging to you " : "");
- errors = 1;
- }
- exit(errors);
-}
diff --git a/usr.bin/ktrace/Makefile b/usr.bin/ktrace/Makefile
deleted file mode 100644
index c00bb75..0000000
--- a/usr.bin/ktrace/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# @(#)Makefile 1.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= ktrace
-SRCS= ktrace.c subr.c
-MLINKS= ktrace.1 trace.1
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ktrace/ktrace.1 b/usr.bin/ktrace/ktrace.1
deleted file mode 100644
index 83c80c9..0000000
--- a/usr.bin/ktrace/ktrace.1
+++ /dev/null
@@ -1,181 +0,0 @@
-.\" Copyright (c) 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)ktrace.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd February 23, 2008
-.Dt KTRACE 1
-.Os
-.Sh NAME
-.Nm ktrace
-.Nd enable kernel process tracing
-.Sh SYNOPSIS
-.Nm
-.Op Fl aCcdi
-.Op Fl f Ar trfile
-.Op Fl g Ar pgrp | Fl p Ar pid
-.Op Fl t Ar trstr
-.Nm
-.Op Fl adi
-.Op Fl f Ar trfile
-.Op Fl t Ar trstr
-.Ar command
-.Sh DESCRIPTION
-The
-.Nm
-utility enables kernel trace logging for the specified processes.
-Kernel trace data is logged to the file
-.Pa ktrace.out .
-The kernel operations that are traced include system calls, namei
-translations, signal processing, and
-.Tn I/O .
-.Pp
-Once tracing is enabled on a process, trace data will be logged until
-either the process exits or the trace point is cleared.
-A traced process can generate enormous amounts of log data quickly;
-It is strongly suggested that users memorize how to disable tracing before
-attempting to trace a process.
-The following command is sufficient to disable tracing on all user-owned
-processes, and, if executed by root, all processes:
-.Pp
-.Dl \&$ ktrace -C
-.Pp
-The trace file is not human readable; use
-.Xr kdump 1
-to decode it.
-.Pp
-The utility may be used only with a kernel that has been built with the
-.Dq KTRACE
-option in the kernel configuration file.
-.Pp
-The options are:
-.Bl -tag -width indent
-.It Fl a
-Append to the trace file instead of recreating it.
-.It Fl C
-Disable tracing on all user-owned processes, and, if executed by root, all
-processes in the system.
-.It Fl c
-Clear the trace points associated with the specified file or processes.
-.It Fl d
-Descendants; perform the operation for all current children of the
-designated processes.
-.It Fl f Ar trfile
-Log trace records to
-.Ar trfile
-instead of
-.Pa ktrace.out .
-.It Fl g Ar pgid
-Enable (disable) tracing on all processes in the process group (only one
-.Fl g
-flag is permitted).
-.It Fl i
-Inherit; pass the trace flags to all future children of the designated
-processes.
-.It Fl p Ar pid
-Enable (disable) tracing on the indicated process id (only one
-.Fl p
-flag is permitted).
-.It Fl t Ar trstr
-The string argument represents the kernel trace points, one per letter.
-The following table equates the letters with the tracepoints:
-.Pp
-.Bl -tag -width flag -compact
-.It Cm c
-trace system calls
-.It Cm n
-trace namei translations
-.It Cm i
-trace
-.Tn I/O
-.It Cm s
-trace signal processing
-.It Cm t
-trace various structures
-.It Cm u
-userland traces
-.It Cm w
-context switches
-.It Cm +
-trace the default set of trace points -
-.Cm c , n , i , s , t , u
-.El
-.It Ar command
-Execute
-.Ar command
-with the specified trace flags.
-.El
-.Pp
-The
-.Fl p ,
-.Fl g ,
-and
-.Ar command
-options are mutually exclusive.
-.Sh EXAMPLES
-# trace all kernel operations of process id 34
-.Dl $ ktrace -p 34
-.Pp
-# trace all kernel operations of processes in process group 15 and
-# pass the trace flags to all current and future children
-.Dl $ ktrace -idg 15
-.Pp
-# disable all tracing of process 65
-.Dl $ ktrace -cp 65
-.Pp
-# disable tracing signals on process 70 and all current children
-.Dl $ ktrace -t s -cdp 70
-.Pp
-# enable tracing of
-.Tn I/O
-on process 67
-.Dl $ ktrace -ti -p 67
-.Pp
-# run the command "w", tracing only system calls
-.Dl $ ktrace -tc w
-.Pp
-# disable all tracing to the file "tracedata"
-.Dl $ ktrace -c -f tracedata
-.Pp
-# disable tracing of all user-owned processes
-.Dl $ ktrace -C
-.Sh SEE ALSO
-.Xr kdump 1
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.4 .
-.Sh BUGS
-Only works if
-.Ar trfile
-is a regular file.
diff --git a/usr.bin/ktrace/ktrace.c b/usr.bin/ktrace/ktrace.c
deleted file mode 100644
index 397852b..0000000
--- a/usr.bin/ktrace/ktrace.c
+++ /dev/null
@@ -1,208 +0,0 @@
-/*-
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1988, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)ktrace.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/file.h>
-#include <sys/time.h>
-#include <sys/errno.h>
-#include <sys/uio.h>
-#include <sys/ktrace.h>
-
-#include <err.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include "ktrace.h"
-
-static char def_tracefile[] = DEF_TRACEFILE;
-
-static void no_ktrace(int);
-static int rpid(char *);
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- enum { NOTSET, CLEAR, CLEARALL } clear;
- int append, ch, fd, inherit, ops, pid, pidset, trpoints;
- const char *tracefile;
- mode_t omask;
- struct stat sb;
-
- clear = NOTSET;
- append = ops = pidset = inherit = 0;
- trpoints = DEF_POINTS;
- tracefile = def_tracefile;
- while ((ch = getopt(argc,argv,"aCcdf:g:ip:t:")) != -1)
- switch((char)ch) {
- case 'a':
- append = 1;
- break;
- case 'C':
- clear = CLEARALL;
- pidset = 1;
- break;
- case 'c':
- clear = CLEAR;
- break;
- case 'd':
- ops |= KTRFLAG_DESCEND;
- break;
- case 'f':
- tracefile = optarg;
- break;
- case 'g':
- pid = -rpid(optarg);
- pidset = 1;
- break;
- case 'i':
- inherit = 1;
- break;
- case 'p':
- pid = rpid(optarg);
- pidset = 1;
- break;
- case 't':
- trpoints = getpoints(optarg);
- if (trpoints < 0) {
- warnx("unknown facility in %s", optarg);
- usage();
- }
- break;
- default:
- usage();
- }
- argv += optind;
- argc -= optind;
-
- if ((pidset && *argv) || (!pidset && clear == NOTSET && !*argv))
- usage();
-
- if (inherit)
- trpoints |= KTRFAC_INHERIT;
-
- (void)signal(SIGSYS, no_ktrace);
- if (clear != NOTSET) {
- if (clear == CLEARALL) {
- ops = KTROP_CLEAR | KTRFLAG_DESCEND;
- trpoints = ALL_POINTS;
- pid = 1;
- } else
- ops |= pidset ? KTROP_CLEAR : KTROP_CLEARFILE;
-
- if (ktrace(tracefile, ops, trpoints, pid) < 0)
- err(1, "%s", tracefile);
- exit(0);
- }
-
- omask = umask(S_IRWXG|S_IRWXO);
- if (append) {
- if ((fd = open(tracefile, O_CREAT | O_WRONLY | O_NONBLOCK,
- DEFFILEMODE)) < 0)
- err(1, "%s", tracefile);
- if (fstat(fd, &sb) != 0 || sb.st_uid != getuid())
- errx(1, "refuse to append to %s not owned by you",
- tracefile);
- if (!(S_ISREG(sb.st_mode)))
- errx(1, "%s not regular file", tracefile);
- } else {
- if (unlink(tracefile) == -1 && errno != ENOENT)
- err(1, "unlink %s", tracefile);
- if ((fd = open(tracefile, O_CREAT | O_EXCL | O_WRONLY,
- DEFFILEMODE)) < 0)
- err(1, "%s", tracefile);
- }
- (void)umask(omask);
- (void)close(fd);
-
- if (*argv) {
- if (ktrace(tracefile, ops, trpoints, getpid()) < 0)
- err(1, "%s", tracefile);
- execvp(argv[0], &argv[0]);
- err(1, "exec of '%s' failed", argv[0]);
- }
- else if (ktrace(tracefile, ops, trpoints, pid) < 0)
- err(1, "%s", tracefile);
- exit(0);
-}
-
-static int
-rpid(char *p)
-{
- static int first;
-
- if (first++) {
- warnx("only one -g or -p flag is permitted");
- usage();
- }
- if (!*p) {
- warnx("illegal process id");
- usage();
- }
- return(atoi(p));
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "%s\n%s\n",
-"usage: ktrace [-aCcdi] [-f trfile] [-g pgrp | -p pid] [-t trstr]",
-" ktrace [-adi] [-f trfile] [-t trstr] command");
- exit(1);
-}
-
-static void
-no_ktrace(int sig __unused)
-{
- (void)fprintf(stderr,
-"error:\tktrace() system call not supported in the running kernel\n\tre-compile kernel with 'options KTRACE'\n");
- exit(1);
-}
diff --git a/usr.bin/ktrace/ktrace.h b/usr.bin/ktrace/ktrace.h
deleted file mode 100644
index 51d85ee..0000000
--- a/usr.bin/ktrace/ktrace.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*-
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ktrace.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#define DEF_POINTS (KTRFAC_SYSCALL | KTRFAC_SYSRET | KTRFAC_NAMEI | \
- KTRFAC_GENIO | KTRFAC_PSIG | KTRFAC_USER | KTRFAC_STRUCT)
-
-#define ALL_POINTS (DEF_POINTS | KTRFAC_CSW)
-
-#define DEF_TRACEFILE "ktrace.out"
-
-int getpoints(char *);
diff --git a/usr.bin/ktrace/subr.c b/usr.bin/ktrace/subr.c
deleted file mode 100644
index cfc4f3a..0000000
--- a/usr.bin/ktrace/subr.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/*-
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)subr.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/file.h>
-#include <sys/proc.h>
-#include <sys/time.h>
-#include <sys/uio.h>
-#include <sys/ktrace.h>
-
-#include <stdio.h>
-
-#include "ktrace.h"
-
-void timevaladd(struct timeval *, struct timeval *);
-void timevalsub(struct timeval *, struct timeval *);
-void timevalfix(struct timeval *);
-
-int
-getpoints(char *s)
-{
- int facs = 0;
-
- while (*s) {
- switch(*s) {
- case 'c':
- facs |= KTRFAC_SYSCALL | KTRFAC_SYSRET;
- break;
- case 'n':
- facs |= KTRFAC_NAMEI;
- break;
- case 'i':
- facs |= KTRFAC_GENIO;
- break;
- case 's':
- facs |= KTRFAC_PSIG;
- break;
- case 't':
- facs |= KTRFAC_STRUCT;
- break;
- case 'u':
- facs |= KTRFAC_USER;
- break;
- case 'w':
- facs |= KTRFAC_CSW;
- break;
- case '+':
- facs |= DEF_POINTS;
- break;
- default:
- return (-1);
- }
- s++;
- }
- return (facs);
-}
-
-void
-timevaladd(struct timeval *t1, struct timeval *t2)
-{
- t1->tv_sec += t2->tv_sec;
- t1->tv_usec += t2->tv_usec;
- timevalfix(t1);
-}
-
-void
-timevalsub(struct timeval *t1, struct timeval *t2)
-{
- t1->tv_sec -= t2->tv_sec;
- t1->tv_usec -= t2->tv_usec;
- timevalfix(t1);
-}
-
-void
-timevalfix(struct timeval *t1)
-{
- if (t1->tv_usec < 0) {
- t1->tv_sec--;
- t1->tv_usec += 1000000;
- }
- if (t1->tv_usec >= 1000000) {
- t1->tv_sec++;
- t1->tv_usec -= 1000000;
- }
-}
diff --git a/usr.bin/ktrdump/Makefile b/usr.bin/ktrdump/Makefile
deleted file mode 100644
index 6b5ff12..0000000
--- a/usr.bin/ktrdump/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# $FreeBSD$
-
-PROG= ktrdump
-DPADD= ${LIBKVM}
-LDADD= -lkvm
-MAN= ktrdump.8
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ktrdump/ktrdump.8 b/usr.bin/ktrdump/ktrdump.8
deleted file mode 100644
index 1e0e8c9..0000000
--- a/usr.bin/ktrdump/ktrdump.8
+++ /dev/null
@@ -1,90 +0,0 @@
-.\"-
-.\" Copyright (c) 2002 Chad David
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd March 8, 2005
-.Dt KTRDUMP 8
-.Os
-.Sh NAME
-.Nm ktrdump
-.Nd print kernel ktr trace buffer
-.Sh SYNOPSIS
-.Nm
-.Op Fl cfqrt
-.Op Fl e Ar execfile
-.Op Fl i Ar ktrfile
-.Op Fl m Ar corefile
-.Op Fl o Ar outfile
-.Sh DESCRIPTION
-The
-.Nm
-utility is used to dump the contents of the kernel ktr trace buffer.
-.Pp
-The following options are available:
-.Bl -tag -width ".Fl e Ar execfile"
-.It Fl c
-Print the CPU number that each entry was logged from.
-.It Fl f
-Print the file and line number that each entry was logged from.
-.It Fl q
-Quiet mode; do not print the column header.
-.It Fl r
-Print relative timestamps rather than absolute timestamps.
-.It Fl t
-Print the timestamp for each entry.
-.It Fl i Ar ktrfile
-File containing saved ktr trace events; for more information see the
-.Xr ktr 4
-manual page.
-.It Fl e Ar execfile
-The kernel image to resolve symbols from.
-The default is the value returned via
-.Xr getbootfile 3 .
-.It Fl m Ar corefile
-The core file or memory image to read from.
-The default is
-.Pa /dev/mem .
-.It Fl o Ar outfile
-The file to write the output to.
-The default is standard output.
-.El
-.Sh SEE ALSO
-.Xr ktr 4 ,
-.Xr ktr 9
-.Sh HISTORY
-The
-.Nm
-utility first appeared in
-.Fx 5.0 .
-.Sh AUTHORS
-.An -nosplit
-The
-.Nm
-utility was implemented by
-.An Jake Burkholder Aq jake@FreeBSD.org .
-.Pp
-This manual page was written by
-.An Chad David Aq davidc@FreeBSD.org .
diff --git a/usr.bin/ktrdump/ktrdump.c b/usr.bin/ktrdump/ktrdump.c
deleted file mode 100644
index 69a1bf1..0000000
--- a/usr.bin/ktrdump/ktrdump.c
+++ /dev/null
@@ -1,298 +0,0 @@
-/*-
- * Copyright (c) 2002 Jake Burkholder
- * Copyright (c) 2004 Robert Watson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/ktr.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <fcntl.h>
-#include <kvm.h>
-#include <limits.h>
-#include <nlist.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#define SBUFLEN 128
-#define USAGE \
- "usage: ktrdump [-cfqrt] [-e execfile] [-i ktrfile] [-m corefile] [-o outfile]\n"
-
-extern char *optarg;
-extern int optind;
-
-static void usage(void);
-
-static struct nlist nl[] = {
- { "_ktr_version" },
- { "_ktr_entries" },
- { "_ktr_idx" },
- { "_ktr_buf" },
- { NULL }
-};
-
-static int cflag;
-static int eflag;
-static int fflag;
-static int mflag;
-static int qflag;
-static int rflag;
-static int tflag;
-static int iflag;
-
-static char corefile[PATH_MAX];
-static char execfile[PATH_MAX];
-
-static char desc[SBUFLEN];
-static char errbuf[_POSIX2_LINE_MAX];
-static char fbuf[PATH_MAX];
-static char obuf[PATH_MAX];
-static char sbuf[KTR_PARMS][SBUFLEN];
-
-/*
- * Reads the ktr trace buffer from kernel memory and prints the trace entries.
- */
-int
-main(int ac, char **av)
-{
- u_long parms[KTR_PARMS];
- struct ktr_entry *buf;
- uintmax_t tlast, tnow;
- struct stat sb;
- kvm_t *kd;
- FILE *out;
- char *p;
- int version;
- int entries;
- int index;
- int parm;
- int in;
- int c;
- int i = 0;
-
- /*
- * Parse commandline arguments.
- */
- out = stdout;
- while ((c = getopt(ac, av, "cfqrte:i:m:o:")) != -1)
- switch (c) {
- case 'c':
- cflag = 1;
- break;
- case 'e':
- if (strlcpy(execfile, optarg, sizeof(execfile))
- >= sizeof(execfile))
- errx(1, "%s: File name too long", optarg);
- eflag = 1;
- break;
- case 'f':
- fflag = 1;
- break;
- case 'i':
- iflag = 1;
- if ((in = open(optarg, O_RDONLY)) == -1)
- err(1, "%s", optarg);
- break;
- case 'm':
- if (strlcpy(corefile, optarg, sizeof(corefile))
- >= sizeof(corefile))
- errx(1, "%s: File name too long", optarg);
- mflag = 1;
- break;
- case 'o':
- if ((out = fopen(optarg, "w")) == NULL)
- err(1, "%s", optarg);
- break;
- case 'q':
- qflag++;
- break;
- case 'r':
- rflag = 1;
- break;
- case 't':
- tflag = 1;
- break;
- case '?':
- default:
- usage();
- }
- ac -= optind;
- av += optind;
- if (ac != 0)
- usage();
-
- /*
- * Open our execfile and corefile, resolve needed symbols and read in
- * the trace buffer.
- */
- if ((kd = kvm_openfiles(eflag ? execfile : NULL,
- mflag ? corefile : NULL, NULL, O_RDONLY, errbuf)) == NULL)
- errx(1, "%s", errbuf);
- if (kvm_nlist(kd, nl) != 0 ||
- kvm_read(kd, nl[0].n_value, &version, sizeof(version)) == -1)
- errx(1, "%s", kvm_geterr(kd));
- if (version != KTR_VERSION)
- errx(1, "ktr version mismatch");
- if (iflag) {
- if (fstat(in, &sb) == -1)
- errx(1, "stat");
- entries = sb.st_size / sizeof(*buf);
- index = 0;
- buf = mmap(NULL, sb.st_size, PROT_READ, MAP_SHARED, in, 0);
- if (buf == MAP_FAILED)
- errx(1, "mmap");
- } else {
- if (kvm_read(kd, nl[1].n_value, &entries, sizeof(entries))
- == -1)
- errx(1, "%s", kvm_geterr(kd));
- if ((buf = malloc(sizeof(*buf) * entries)) == NULL)
- err(1, NULL);
- if (kvm_read(kd, nl[2].n_value, &index, sizeof(index)) == -1 ||
- kvm_read(kd, nl[3].n_value, buf, sizeof(*buf) * entries)
- == -1)
- errx(1, "%s", kvm_geterr(kd));
- }
-
- /*
- * Print a nice header.
- */
- if (!qflag) {
- fprintf(out, "%-6s ", "index");
- if (cflag)
- fprintf(out, "%-3s ", "cpu");
- if (tflag)
- fprintf(out, "%-16s ", "timestamp");
- if (fflag)
- fprintf(out, "%-40s ", "file and line");
- fprintf(out, "%s", "trace");
- fprintf(out, "\n");
-
- fprintf(out, "------ ");
- if (cflag)
- fprintf(out, "--- ");
- if (tflag)
- fprintf(out, "---------------- ");
- if (fflag)
- fprintf(out,
- "---------------------------------------- ");
- fprintf(out, "----- ");
- fprintf(out, "\n");
- }
-
- /*
- * Now tear through the trace buffer.
- */
- if (!iflag)
- i = (index - 1) & (entries - 1);
- tlast = -1;
- for (;;) {
- if (buf[i].ktr_desc == NULL)
- break;
- if (kvm_read(kd, (u_long)buf[i].ktr_desc, desc,
- sizeof(desc)) == -1)
- errx(1, "%s", kvm_geterr(kd));
- desc[sizeof(desc) - 1] = '\0';
- parm = 0;
- for (p = desc; (c = *p++) != '\0';) {
- if (c != '%')
- continue;
-next: if ((c = *p++) == '\0')
- break;
- if (parm == KTR_PARMS)
- errx(1, "too many parameters");
- switch (c) {
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- case '#': case '-': case ' ': case '+': case '\'':
- case 'h': case 'l': case 'j': case 't': case 'z':
- case 'q': case 'L': case '.':
- goto next;
- case 's':
- if (kvm_read(kd, (u_long)buf[i].ktr_parms[parm],
- sbuf[parm], sizeof(sbuf[parm])) == -1)
- strcpy(sbuf[parm], "(null)");
- sbuf[parm][sizeof(sbuf[0]) - 1] = '\0';
- parms[parm] = (u_long)sbuf[parm];
- parm++;
- break;
- default:
- parms[parm] = buf[i].ktr_parms[parm];
- parm++;
- break;
- }
- }
- fprintf(out, "%6d ", i);
- if (cflag)
- fprintf(out, "%3d ", buf[i].ktr_cpu);
- if (tflag) {
- tnow = (uintmax_t)buf[i].ktr_timestamp;
- if (rflag) {
- if (tlast == -1)
- tlast = tnow;
- fprintf(out, "%16ju ", !iflag ? tlast - tnow :
- tnow - tlast);
- tlast = tnow;
- } else
- fprintf(out, "%16ju ", tnow);
- }
- if (fflag) {
- if (kvm_read(kd, (u_long)buf[i].ktr_file, fbuf,
- sizeof(fbuf)) == -1)
- strcpy(fbuf, "(null)");
- snprintf(obuf, sizeof(obuf), "%s:%d", fbuf,
- buf[i].ktr_line);
- fprintf(out, "%-40s ", obuf);
- }
- fprintf(out, desc, parms[0], parms[1], parms[2], parms[3],
- parms[4], parms[5]);
- fprintf(out, "\n");
- if (!iflag) {
- if (i == index)
- break;
- i = (i - 1) & (entries - 1);
- } else {
- if (++i == entries)
- break;
- }
- }
-
- return (0);
-}
-
-static void
-usage(void)
-{
-
- fprintf(stderr, USAGE);
- exit(1);
-}
diff --git a/usr.bin/lam/Makefile b/usr.bin/lam/Makefile
deleted file mode 100644
index 08b7328..0000000
--- a/usr.bin/lam/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= lam
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/lam/lam.1 b/usr.bin/lam/lam.1
deleted file mode 100644
index 67dee07..0000000
--- a/usr.bin/lam/lam.1
+++ /dev/null
@@ -1,146 +0,0 @@
-.\" Copyright (c) 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)lam.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd August 12, 2004
-.Dt LAM 1
-.Os
-.Sh NAME
-.Nm lam
-.Nd laminate files
-.Sh SYNOPSIS
-.Nm
-.Op Fl f Ar min . Ns Ar max
-.Op Fl s Ar sepstring
-.Op Fl t Ar c
-.Ar
-.Nm
-.Op Fl p Ar min . Ns Ar max
-.Op Fl s Ar sepstring
-.Op Fl t Ar c
-.Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility copies the named files side by side onto the standard output.
-The
-.Em n-th
-input lines from the input
-.Ar files
-are considered fragments of the single long
-.Em n-th
-output line into which they are assembled.
-The name `\fB\-\fP' means the standard input, and may be repeated.
-.Pp
-Normally, each option affects only the
-.Ar file
-after it.
-If the option letter is capitalized it affects all subsequent files
-until it appears again uncapitalized.
-The options are described below:
-.Bl -tag -width indent
-.It Fl f Ar min . Ns Ar max
-Print line fragments according to the format string
-.Ar min . Ns Ar max ,
-where
-.Ar min
-is the minimum field width and
-.Ar max
-the maximum field width.
-If
-.Ar min
-begins with a zero, zeros will be added to make up the field width,
-and if it begins with a `\-', the fragment will be left-adjusted
-within the field.
-.It Fl p Ar min . Ns Ar max
-Like
-.Fl f ,
-but pad this file's field when end-of-file is reached
-and other files are still active.
-.It Fl s Ar sepstring
-Print
-.Ar sepstring
-before printing line fragments from the next file.
-This option may appear after the last file.
-.It Fl t Ar c
-The input line terminator is
-.Ar c
-instead of a newline.
-The newline normally appended to each output line is omitted.
-.El
-.Pp
-To print files simultaneously for easy viewing use
-.Xr pr 1 .
-.Sh EXAMPLES
-The command
-.Bd -literal
-lam file1 file2 file3 file4
-.Ed
-.Pp
-joins 4 files together along each line.
-To merge the lines from four different files use
-.Bd -literal
-lam file1 \-S "\\
-" file2 file3 file4
-.Ed
-.Pp
-Every 2 lines of a file may be joined on one line with
-.Bd -literal
-lam \- \- < file
-.Ed
-.Pp
-and a form letter with substitutions keyed by `@' can be done with
-.Bd -literal
-lam \-t @ letter changes
-.Ed
-.Sh SEE ALSO
-.Xr join 1 ,
-.Xr paste 1 ,
-.Xr pr 1 ,
-.Xr printf 3
-.Sh STANDARDS
-Some of the functionality of
-.Nm
-is standardized as the
-.Xr paste 1
-utility by
-.St -p1003.2 .
-.Sh HISTORY
-The
-.Nm
-utility first appeared in
-.Bx 4.2 .
-.Sh BUGS
-The
-.Nm
-utility does not recognize multibyte characters.
diff --git a/usr.bin/lam/lam.c b/usr.bin/lam/lam.c
deleted file mode 100644
index 333549f..0000000
--- a/usr.bin/lam/lam.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/*-
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)lam.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * lam - laminate files
- * Author: John Kunze, UCB
- */
-
-#include <ctype.h>
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define MAXOFILES 20
-#define BIGBUFSIZ 5 * BUFSIZ
-
-struct openfile { /* open file structure */
- FILE *fp; /* file pointer */
- short eof; /* eof flag */
- short pad; /* pad flag for missing columns */
- char eol; /* end of line character */
- const char *sepstring; /* string to print before each line */
- const char *format; /* printf(3) style string spec. */
-} input[MAXOFILES];
-
-int morefiles; /* set by getargs(), changed by gatherline() */
-int nofinalnl; /* normally append \n to each output line */
-char line[BIGBUFSIZ];
-char *linep;
-
-static char *gatherline(struct openfile *);
-static void getargs(char *[]);
-static char *pad(struct openfile *);
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- struct openfile *ip;
-
- if (argc == 1)
- usage();
- getargs(argv);
- if (!morefiles)
- usage();
- for (;;) {
- linep = line;
- for (ip = input; ip->fp != NULL; ip++)
- linep = gatherline(ip);
- if (!morefiles)
- exit(0);
- fputs(line, stdout);
- fputs(ip->sepstring, stdout);
- if (!nofinalnl)
- putchar('\n');
- }
-}
-
-static void
-getargs(char *av[])
-{
- struct openfile *ip = input;
- char *p, *c;
- static char fmtbuf[BUFSIZ];
- char *fmtp = fmtbuf;
- int P, S, F, T;
-
- P = S = F = T = 0; /* capitalized options */
- while ((p = *++av) != NULL) {
- if (*p != '-' || !p[1]) {
- if (++morefiles >= MAXOFILES)
- errx(1, "too many input files");
- if (*p == '-')
- ip->fp = stdin;
- else if ((ip->fp = fopen(p, "r")) == NULL) {
- err(1, "%s", p);
- }
- ip->pad = P;
- if (!ip->sepstring)
- ip->sepstring = (S ? (ip-1)->sepstring : "");
- if (!ip->format)
- ip->format = ((P || F) ? (ip-1)->format : "%s");
- if (!ip->eol)
- ip->eol = (T ? (ip-1)->eol : '\n');
- ip++;
- continue;
- }
- c = ++p;
- switch (tolower((unsigned char)*c)) {
- case 's':
- if (*++p || (p = *++av))
- ip->sepstring = p;
- else
- usage();
- S = (*c == 'S' ? 1 : 0);
- break;
- case 't':
- if (*++p || (p = *++av))
- ip->eol = *p;
- else
- usage();
- T = (*c == 'T' ? 1 : 0);
- nofinalnl = 1;
- break;
- case 'p':
- ip->pad = 1;
- P = (*c == 'P' ? 1 : 0);
- /* FALLTHROUGH */
- case 'f':
- F = (*c == 'F' ? 1 : 0);
- if (*++p || (p = *++av)) {
- fmtp += strlen(fmtp) + 1;
- if (fmtp >= fmtbuf + sizeof(fmtbuf))
- errx(1, "no more format space");
- /* restrict format string to only valid width formatters */
- if (strspn(p, "-.0123456789") != strlen(p))
- errx(1, "invalid format string `%s'", p);
- if (snprintf(fmtp, fmtbuf + sizeof(fmtbuf) - fmtp, "%%%ss", p)
- >= fmtbuf + sizeof(fmtbuf) - fmtp)
- errx(1, "no more format space");
- ip->format = fmtp;
- }
- else
- usage();
- break;
- default:
- usage();
- }
- }
- ip->fp = NULL;
- if (!ip->sepstring)
- ip->sepstring = "";
-}
-
-static char *
-pad(struct openfile *ip)
-{
- char *lp = linep;
-
- strlcpy(lp, ip->sepstring, line + sizeof(line) - lp);
- lp += strlen(lp);
- if (ip->pad) {
- snprintf(lp, line + sizeof(line) - lp, ip->format, "");
- lp += strlen(lp);
- }
- return (lp);
-}
-
-static char *
-gatherline(struct openfile *ip)
-{
- char s[BUFSIZ];
- int c;
- char *p;
- char *lp = linep;
- char *end = s + sizeof(s) - 1;
-
- if (ip->eof)
- return (pad(ip));
- for (p = s; (c = fgetc(ip->fp)) != EOF && p < end; p++)
- if ((*p = c) == ip->eol)
- break;
- *p = '\0';
- if (c == EOF) {
- ip->eof = 1;
- if (ip->fp == stdin)
- fclose(stdin);
- morefiles--;
- return (pad(ip));
- }
- strlcpy(lp, ip->sepstring, line + sizeof(line) - lp);
- lp += strlen(lp);
- snprintf(lp, line + sizeof(line) - lp, ip->format, s);
- lp += strlen(lp);
- return (lp);
-}
-
-static void
-usage()
-{
- fprintf(stderr, "%s\n%s\n",
-"usage: lam [ -f min.max ] [ -s sepstring ] [ -t c ] file ...",
-" lam [ -p min.max ] [ -s sepstring ] [ -t c ] file ...");
- exit(1);
-}
diff --git a/usr.bin/last/Makefile b/usr.bin/last/Makefile
deleted file mode 100644
index f7e8811..0000000
--- a/usr.bin/last/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= last
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/last/last.1 b/usr.bin/last/last.1
deleted file mode 100644
index f838c4a..0000000
--- a/usr.bin/last/last.1
+++ /dev/null
@@ -1,219 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)last.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd July 27, 2003
-.Dt LAST 1
-.Os
-.Sh NAME
-.Nm last
-.Nd indicate last logins of users and ttys
-.Sh SYNOPSIS
-.Nm
-.Op Fl swy
-.Oo
-.Fl d
-.Sm off
-.Op Oo Ar CC Oc Ar YY
-.Op Ar MM DD
-.Ar hh mm
-.Op Ar .SS
-.Sm on
-.Oc
-.Op Fl f Ar file
-.Op Fl h Ar host
-.Op Fl n Ar maxrec
-.Op Fl t Ar tty
-.Op Ar user ...
-.Sh DESCRIPTION
-The
-.Nm
-utility will either list the sessions of specified
-.Ar users ,
-.Ar ttys ,
-and
-.Ar hosts ,
-in reverse time order,
-or list the users logged in at a specified date and time.
-Each line of output contains
-the user name, the tty from which the session was conducted, any
-hostname, the start and stop times for the session, and the duration
-of the session.
-If the session is still continuing or was cut short by
-a crash or shutdown,
-.Nm
-will so indicate.
-.Pp
-The following options are available:
-.Bl -tag -width indent-two
-.It Fl d Ar date
-Specify the snapshot date and time.
-All users logged in at the snapshot date and time will
-be reported.
-This may be used with the
-.Fl f
-option to derive the results from stored
-.Pa wtmp
-files.
-When this argument is provided, all other options except for
-.Fl f
-and
-.Fl n
-are ignored.
-The argument should be in the form
-.Sm off
-.Op Oo Ar CC Oc Ar YY
-.Op Ar MM DD
-.Ar hh mm
-.Op Ar .SS
-.Sm on
-where each pair of letters represents the following:
-.Pp
-.Bl -tag -width Ds -compact -offset indent
-.It Ar CC
-The first two digits of the year (the century).
-.It Ar YY
-The second two digits of the year.
-If
-.Ar YY
-is specified, but
-.Ar CC
-is not, a value for
-.Ar YY
-between 69 and 99 results in a
-.Ar CC
-value of 19.
-Otherwise, a
-.Ar CC
-value of 20 is used.
-.It Ar MM
-Month of the year, from 1 to 12.
-.It Ar DD
-Day of the month, from 1 to 31.
-.It Ar hh
-Hour of the day, from 0 to 23.
-.It Ar mm
-Minute of the hour, from 0 to 59.
-.It Ar SS
-Second of the minute, from 0 to 61.
-.El
-.Pp
-If the
-.Ar CC
-and
-.Ar YY
-letter pairs are not specified, the values default to the current
-year.
-If the
-.Ar SS
-letter pair is not specified, the value defaults to 0.
-.It Fl f Ar file
-Read the file
-.Ar file
-instead of the default,
-.Pa /var/log/wtmp .
-.It Fl h Ar host
-.Ar Host
-names may be names or internet numbers.
-.It Fl n Ar maxrec
-Limit the report to
-.Ar maxrec
-lines.
-.It Fl s
-Report the duration of the login session in seconds, instead of the
-default days, hours and minutes.
-.It Fl t Ar tty
-Specify the
-.Ar tty .
-Tty names may be given fully or abbreviated, for example,
-.Dq Li "last -t 03"
-is
-equivalent to
-.Dq Li "last -t tty03" .
-.It Fl w
-Widen the duration field to show seconds, as well as the
-default days, hours and minutes.
-.It Fl y
-Report the year in the session start time.
-.El
-.Pp
-If multiple arguments are given,
-and a snapshot time is not specified,
-the information which applies to any of the
-arguments is printed, e.g.,
-.Dq Li "last root -t console"
-would list all of
-.Dq Li root Ns 's
-sessions as well as all sessions on the console terminal.
-If no
-users, hostnames or terminals are specified,
-.Nm
-prints a record of
-all logins and logouts.
-.Pp
-The pseudo-user
-.Ar reboot
-logs in at reboots of the system, thus
-.Dq Li last reboot
-will give an indication of mean time between reboot.
-.Pp
-If
-.Nm
-is interrupted, it indicates to what date the search has
-progressed.
-If interrupted with a quit signal
-.Nm
-indicates how
-far the search has progressed and then continues.
-.Sh FILES
-.Bl -tag -width /var/log/wtmp -compact
-.It Pa /var/log/wtmp
-login data base
-.El
-.Sh SEE ALSO
-.Xr lastcomm 1 ,
-.Xr utmp 5 ,
-.Xr ac 8
-.Sh HISTORY
-A
-.Nm
-utility appeared in
-.Bx 3.0 .
-.Sh BUGS
-If a login shell should terminate abnormally for some reason, it is likely
-that a logout record will not be written to the
-.Pa wtmp
-file.
-In this case,
-.Nm
-will indicate the logout time as "shutdown".
diff --git a/usr.bin/last/last.c b/usr.bin/last/last.c
deleted file mode 100644
index d9877b4..0000000
--- a/usr.bin/last/last.c
+++ /dev/null
@@ -1,576 +0,0 @@
-/*
- * Copyright (c) 1987, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1987, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static const char sccsid[] = "@(#)last.c 8.2 (Berkeley) 4/2/94";
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <langinfo.h>
-#include <locale.h>
-#include <paths.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <timeconv.h>
-#include <unistd.h>
-#include <utmp.h>
-#include <sys/queue.h>
-
-#define NO 0 /* false/no */
-#define YES 1 /* true/yes */
-#define ATOI2(ar) ((ar)[0] - '0') * 10 + ((ar)[1] - '0'); (ar) += 2;
-
-static struct utmp buf[1024]; /* utmp read buffer */
-
-typedef struct arg {
- char *name; /* argument */
-#define HOST_TYPE -2
-#define TTY_TYPE -3
-#define USER_TYPE -4
- int type; /* type of arg */
- struct arg *next; /* linked list pointer */
-} ARG;
-ARG *arglist; /* head of linked list */
-
-LIST_HEAD(ttylisthead, ttytab) ttylist;
-
-struct ttytab {
- time_t logout; /* log out time */
- char tty[UT_LINESIZE + 1]; /* terminal name */
- LIST_ENTRY(ttytab) list;
-};
-
-static const char *crmsg; /* cause of last reboot */
-static long currentout, /* current logout value */
- maxrec; /* records to display */
-static const char *file = _PATH_WTMP; /* wtmp file */
-static int sflag = 0; /* show delta in seconds */
-static int width = 5; /* show seconds in delta */
-static int yflag; /* show year */
-static int d_first;
-static int snapfound = 0; /* found snapshot entry? */
-static time_t snaptime; /* if != 0, we will only
- * report users logged in
- * at this snapshot time
- */
-
-void addarg(int, char *);
-time_t dateconv(char *);
-void doentry(struct utmp *);
-void hostconv(char *);
-void onintr(int);
-void printentry(struct utmp *, struct ttytab *);
-char *ttyconv(char *);
-int want(struct utmp *);
-void usage(void);
-void wtmp(void);
-
-void
-usage(void)
-{
- (void)fprintf(stderr,
-"usage: last [-swy] [-d [[CC]YY][MMDD]hhmm[.SS]] [-f file] [-h host]\n"
-" [-n maxrec] [-t tty] [user ...]\n");
- exit(1);
-}
-
-int
-main(int argc, char *argv[])
-{
- int ch;
- char *p;
-
- (void) setlocale(LC_TIME, "");
- d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
-
- maxrec = -1;
- snaptime = 0;
- while ((ch = getopt(argc, argv, "0123456789d:f:h:n:st:wy")) != -1)
- switch (ch) {
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- /*
- * kludge: last was originally designed to take
- * a number after a dash.
- */
- if (maxrec == -1) {
- p = strchr(argv[optind - 1], ch);
- if (p == NULL)
- p = strchr(argv[optind], ch);
- maxrec = atol(p);
- if (!maxrec)
- exit(0);
- }
- break;
- case 'd':
- snaptime = dateconv(optarg);
- break;
- case 'f':
- file = optarg;
- break;
- case 'h':
- hostconv(optarg);
- addarg(HOST_TYPE, optarg);
- break;
- case 'n':
- errno = 0;
- maxrec = strtol(optarg, &p, 10);
- if (p == optarg || *p != '\0' || errno != 0 ||
- maxrec <= 0)
- errx(1, "%s: bad line count", optarg);
- break;
- case 's':
- sflag++; /* Show delta as seconds */
- break;
- case 't':
- addarg(TTY_TYPE, ttyconv(optarg));
- break;
- case 'w':
- width = 8;
- break;
- case 'y':
- yflag++;
- break;
- case '?':
- default:
- usage();
- }
-
- if (sflag && width == 8) usage();
-
- if (argc) {
- setlinebuf(stdout);
- for (argv += optind; *argv; ++argv) {
-#define COMPATIBILITY
-#ifdef COMPATIBILITY
- /* code to allow "last p5" to work */
- addarg(TTY_TYPE, ttyconv(*argv));
-#endif
- addarg(USER_TYPE, *argv);
- }
- }
- wtmp();
- exit(0);
-}
-
-/*
- * wtmp --
- * read through the wtmp file
- */
-void
-wtmp(void)
-{
- struct utmp *bp; /* current structure */
- struct stat stb; /* stat of file for size */
- long bl;
- int bytes, wfd;
- char ct[80];
- struct tm *tm;
- time_t t;
-
- LIST_INIT(&ttylist);
-
- if ((wfd = open(file, O_RDONLY, 0)) < 0 || fstat(wfd, &stb) == -1)
- err(1, "%s", file);
- bl = (stb.st_size + sizeof(buf) - 1) / sizeof(buf);
-
- (void)time(&t);
- buf[0].ut_time = _time_to_int(t);
- (void)signal(SIGINT, onintr);
- (void)signal(SIGQUIT, onintr);
-
- while (--bl >= 0) {
- if (lseek(wfd, (off_t)(bl * sizeof(buf)), L_SET) == -1 ||
- (bytes = read(wfd, buf, sizeof(buf))) == -1)
- err(1, "%s", file);
- for (bp = &buf[bytes / sizeof(buf[0]) - 1]; bp >= buf; --bp)
- doentry(bp);
- }
- t = _int_to_time(buf[0].ut_time);
- tm = localtime(&t);
- (void) strftime(ct, sizeof(ct), "\nwtmp begins %+\n", tm);
- printf("%s", ct);
-}
-
-/*
- * doentry --
- * process a single wtmp entry
- */
-void
-doentry(struct utmp *bp)
-{
- struct ttytab *tt, *ttx; /* ttylist entry */
-
- /*
- * if the terminal line is '~', the machine stopped.
- * see utmp(5) for more info.
- */
- if (bp->ut_line[0] == '~' && !bp->ut_line[1]) {
- /* everybody just logged out */
- for (tt = LIST_FIRST(&ttylist); tt;) {
- LIST_REMOVE(tt, list);
- ttx = tt;
- tt = LIST_NEXT(tt, list);
- free(ttx);
- }
- currentout = -bp->ut_time;
- crmsg = strncmp(bp->ut_name, "shutdown", UT_NAMESIZE) ?
- "crash" : "shutdown";
- /*
- * if we're in snapshot mode, we want to exit if this
- * shutdown/reboot appears while we we are tracking the
- * active range
- */
- if (snaptime && snapfound)
- exit(0);
- /*
- * don't print shutdown/reboot entries unless flagged for
- */
- if (!snaptime && want(bp))
- printentry(bp, NULL);
- return;
- }
- /*
- * if the line is '{' or '|', date got set; see
- * utmp(5) for more info.
- */
- if ((bp->ut_line[0] == '{' || bp->ut_line[0] == '|') &&
- !bp->ut_line[1]) {
- if (want(bp) && !snaptime)
- printentry(bp, NULL);
- return;
- }
- /* find associated tty */
- LIST_FOREACH(tt, &ttylist, list)
- if (!strncmp(tt->tty, bp->ut_line, UT_LINESIZE))
- break;
-
- if (tt == NULL) {
- /* add new one */
- tt = malloc(sizeof(struct ttytab));
- if (tt == NULL)
- errx(1, "malloc failure");
- tt->logout = currentout;
- strncpy(tt->tty, bp->ut_line, UT_LINESIZE);
- LIST_INSERT_HEAD(&ttylist, tt, list);
- }
-
- /*
- * print record if not in snapshot mode and wanted
- * or in snapshot mode and in snapshot range
- */
- if (bp->ut_name[0] && (want(bp) || (bp->ut_time < snaptime &&
- (tt->logout > snaptime || tt->logout < 1)))) {
- snapfound = 1;
- /*
- * when uucp and ftp log in over a network, the entry in
- * the utmp file is the name plus their process id. See
- * etc/ftpd.c and usr.bin/uucp/uucpd.c for more information.
- */
- if (!strncmp(bp->ut_line, "ftp", sizeof("ftp") - 1))
- bp->ut_line[3] = '\0';
- else if (!strncmp(bp->ut_line, "uucp", sizeof("uucp") - 1))
- bp->ut_line[4] = '\0';
- printentry(bp, tt);
- }
- tt->logout = bp->ut_time;
-}
-
-/*
- * printentry --
- * output an entry
- *
- * If `tt' is non-NULL, use it and `crmsg' to print the logout time or
- * logout type (crash/shutdown) as appropriate.
- */
-void
-printentry(struct utmp *bp, struct ttytab *tt)
-{
- char ct[80];
- struct tm *tm;
- time_t delta; /* time difference */
- time_t t;
-
- if (maxrec != -1 && !maxrec--)
- exit(0);
- t = _int_to_time(bp->ut_time);
- tm = localtime(&t);
- (void) strftime(ct, sizeof(ct), d_first ?
- (yflag ? "%a %e %b %Y %R" : "%a %e %b %R") :
- (yflag ? "%a %b %e %Y %R" : "%a %b %e %R"), tm);
- printf("%-*.*s %-*.*s %-*.*s %s%c",
- UT_NAMESIZE, UT_NAMESIZE, bp->ut_name,
- UT_LINESIZE, UT_LINESIZE, bp->ut_line,
- UT_HOSTSIZE, UT_HOSTSIZE, bp->ut_host,
- ct, tt == NULL ? '\n' : ' ');
- if (tt == NULL)
- return;
- if (!tt->logout) {
- puts(" still logged in");
- return;
- }
- if (tt->logout < 0) {
- tt->logout = -tt->logout;
- printf("- %s", crmsg);
- } else {
- tm = localtime(&tt->logout);
- (void) strftime(ct, sizeof(ct), "%R", tm);
- printf("- %s", ct);
- }
- delta = tt->logout - bp->ut_time;
- if (sflag) {
- printf(" (%8ld)\n", (long)delta);
- } else {
- tm = gmtime(&delta);
- (void) strftime(ct, sizeof(ct), width >= 8 ? "%T" : "%R", tm);
- if (delta < 86400)
- printf(" (%s)\n", ct);
- else
- printf(" (%ld+%s)\n", (long)delta / 86400, ct);
- }
-}
-
-/*
- * want --
- * see if want this entry
- */
-int
-want(struct utmp *bp)
-{
- ARG *step;
-
- if (snaptime)
- return (NO);
-
- if (!arglist)
- return (YES);
-
- for (step = arglist; step; step = step->next)
- switch(step->type) {
- case HOST_TYPE:
- if (!strncasecmp(step->name, bp->ut_host, UT_HOSTSIZE))
- return (YES);
- break;
- case TTY_TYPE:
- if (!strncmp(step->name, bp->ut_line, UT_LINESIZE))
- return (YES);
- break;
- case USER_TYPE:
- if (!strncmp(step->name, bp->ut_name, UT_NAMESIZE))
- return (YES);
- break;
- }
- return (NO);
-}
-
-/*
- * addarg --
- * add an entry to a linked list of arguments
- */
-void
-addarg(int type, char *arg)
-{
- ARG *cur;
-
- if ((cur = malloc(sizeof(ARG))) == NULL)
- errx(1, "malloc failure");
- cur->next = arglist;
- cur->type = type;
- cur->name = arg;
- arglist = cur;
-}
-
-/*
- * hostconv --
- * convert the hostname to search pattern; if the supplied host name
- * has a domain attached that is the same as the current domain, rip
- * off the domain suffix since that's what login(1) does.
- */
-void
-hostconv(char *arg)
-{
- static int first = 1;
- static char *hostdot, name[MAXHOSTNAMELEN];
- char *argdot;
-
- if (!(argdot = strchr(arg, '.')))
- return;
- if (first) {
- first = 0;
- if (gethostname(name, sizeof(name)))
- err(1, "gethostname");
- hostdot = strchr(name, '.');
- }
- if (hostdot && !strcasecmp(hostdot, argdot))
- *argdot = '\0';
-}
-
-/*
- * ttyconv --
- * convert tty to correct name.
- */
-char *
-ttyconv(char *arg)
-{
- char *mval;
-
- /*
- * kludge -- we assume that all tty's end with
- * a two character suffix.
- */
- if (strlen(arg) == 2) {
- /* either 6 for "ttyxx" or 8 for "console" */
- if ((mval = malloc(8)) == NULL)
- errx(1, "malloc failure");
- if (!strcmp(arg, "co"))
- (void)strcpy(mval, "console");
- else {
- (void)strcpy(mval, "tty");
- (void)strcpy(mval + 3, arg);
- }
- return (mval);
- }
- if (!strncmp(arg, _PATH_DEV, sizeof(_PATH_DEV) - 1))
- return (arg + 5);
- return (arg);
-}
-
-/*
- * dateconv --
- * Convert the snapshot time in command line given in the format
- * [[CC]YY]MMDDhhmm[.SS]] to a time_t.
- * Derived from atime_arg1() in usr.bin/touch/touch.c
- */
-time_t
-dateconv(char *arg)
-{
- time_t timet;
- struct tm *t;
- int yearset;
- char *p;
-
- /* Start with the current time. */
- if (time(&timet) < 0)
- err(1, "time");
- if ((t = localtime(&timet)) == NULL)
- err(1, "localtime");
-
- /* [[CC]YY]MMDDhhmm[.SS] */
- if ((p = strchr(arg, '.')) == NULL)
- t->tm_sec = 0; /* Seconds defaults to 0. */
- else {
- if (strlen(p + 1) != 2)
- goto terr;
- *p++ = '\0';
- t->tm_sec = ATOI2(p);
- }
-
- yearset = 0;
- switch (strlen(arg)) {
- case 12: /* CCYYMMDDhhmm */
- t->tm_year = ATOI2(arg);
- t->tm_year *= 100;
- yearset = 1;
- /* FALLTHROUGH */
- case 10: /* YYMMDDhhmm */
- if (yearset) {
- yearset = ATOI2(arg);
- t->tm_year += yearset;
- } else {
- yearset = ATOI2(arg);
- if (yearset < 69)
- t->tm_year = yearset + 2000;
- else
- t->tm_year = yearset + 1900;
- }
- t->tm_year -= 1900; /* Convert to UNIX time. */
- /* FALLTHROUGH */
- case 8: /* MMDDhhmm */
- t->tm_mon = ATOI2(arg);
- --t->tm_mon; /* Convert from 01-12 to 00-11 */
- t->tm_mday = ATOI2(arg);
- t->tm_hour = ATOI2(arg);
- t->tm_min = ATOI2(arg);
- break;
- case 4: /* hhmm */
- t->tm_hour = ATOI2(arg);
- t->tm_min = ATOI2(arg);
- break;
- default:
- goto terr;
- }
- t->tm_isdst = -1; /* Figure out DST. */
- timet = mktime(t);
- if (timet == -1)
-terr: errx(1,
- "out of range or illegal time specification: [[CC]YY]MMDDhhmm[.SS]");
- return timet;
-}
-
-
-/*
- * onintr --
- * on interrupt, we inform the user how far we've gotten
- */
-void
-onintr(int signo)
-{
- char ct[80];
- struct tm *tm;
- time_t t = _int_to_time(buf[0].ut_time);
-
- tm = localtime(&t);
- (void) strftime(ct, sizeof(ct),
- d_first ? "%a %e %b %R" : "%a %b %e %R",
- tm);
- printf("\ninterrupted %s\n", ct);
- if (signo == SIGINT)
- exit(1);
- (void)fflush(stdout); /* fix required for rsh */
-}
diff --git a/usr.bin/lastcomm/Makefile b/usr.bin/lastcomm/Makefile
deleted file mode 100644
index c79cd74..0000000
--- a/usr.bin/lastcomm/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= lastcomm
-SRCS= lastcomm.c readrec.c
-WARNS?= 6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/lastcomm/lastcomm.1 b/usr.bin/lastcomm/lastcomm.1
deleted file mode 100644
index 1d714c5..0000000
--- a/usr.bin/lastcomm/lastcomm.1
+++ /dev/null
@@ -1,178 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" From: @(#)lastcomm.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd May 14, 2007
-.Dt LASTCOMM 1
-.Os
-.Sh NAME
-.Nm lastcomm
-.Nd show last commands executed
-.Sh SYNOPSIS
-.Nm
-.Op Fl EScesu
-.Op Fl f Ar file
-.Op Ar command ...\&
-.Op Ar user ...\&
-.Op Ar terminal ...\&
-.Sh DESCRIPTION
-The
-.Nm
-utility gives information on previously executed commands.
-With no arguments,
-.Nm
-prints information about all the commands recorded
-during the current accounting file's lifetime.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl E
-Print the time the process exited.
-.It Fl S
-Print the time the process started.
-.It Fl c
-Print the amount of cpu time used by the process.
-.It Fl e
-Print the amount of elapsed time used by the process.
-.It Fl s
-Print the amount of system time used by the process.
-.It Fl u
-Print the amount of user time used by the process.
-.It Fl f Ar file
-Read from
-.Ar file
-rather than the default
-.Pa /var/account/acct .
-If
-.Ar file
-is a single dash
-.Pq Sq \&-
-.Nm
-reads accounting entries from the standard input.
-.El
-.Pp
-If no options are specified,
-.Fl cS
-is assumed.
-If
-.Nm
-is invoked with arguments, only accounting entries with a
-matching
-.Ar command
-name,
-.Ar user
-name,
-or
-.Ar terminal
-name
-are printed.
-For example:
-.Pp
-.Dl lastcomm a.out root ttyd0
-.Pp
-would produce a listing of all the
-executions of commands named
-.Pa a.out
-by user
-.Ar root
-on the terminal
-.Ar ttyd0 .
-.Pp
-For each process entry, the following are printed.
-.Pp
-.Bl -bullet -offset indent -compact
-.It
-The name of the user who ran the process.
-.It
-Flags, as accumulated by the accounting facilities in the system.
-.It
-The command name under which the process was called.
-.It
-The amount of
-CPU
-.Pq Fl c ,
-wall
-.Pq Fl e ,
-system
-.Pq Fl s ,
-or user
-.Pq Fl u
-time used by the process (in seconds).
-.It
-The time the process started
-.Pq Fl S
-or exited
-.Pq Fl E .
-.El
-.Pp
-The flags are encoded as follows: ``S'' indicates the command was
-executed by the super-user, ``F'' indicates the command ran after
-a fork, but without a following
-.Xr exec 3 ,
-.\" ``C'' indicates the command was run in PDP-11 compatibility mode
-.\" (VAX only),
-``D'' indicates the command terminated with the generation of a
-.Pa core
-file, and ``X'' indicates the command was terminated with a signal.
-.Pp
-By default, accounting entries are printed going backwards in time,
-starting from the time
-.Nm
-was executed.
-However, if
-.Nm
-reads entries from its standard input, then entries are printed in
-the order they are read.
-.Sh FILES
-.Bl -tag -width /var/account/acct -compact
-.It Pa /var/account/acct
-default accounting file
-.El
-.Sh EXAMPLES
-The command
-.Dl lastcomm -Ee
-will print the exit time and elapsed time of each command logged in
-.Pa /var/account/acct ,
-while
-.Dl tail -f -c 0 /var/account/acct | lastcomm -f -
-will print details of each terminating command.
-.Sh SEE ALSO
-.Xr last 1 ,
-.Xr sigvec 2 ,
-.Xr acct 5 ,
-.Xr core 5
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3.0 .
diff --git a/usr.bin/lastcomm/lastcomm.c b/usr.bin/lastcomm/lastcomm.c
deleted file mode 100644
index 8c55123..0000000
--- a/usr.bin/lastcomm/lastcomm.c
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)lastcomm.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/acct.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <grp.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <utmp.h>
-#include "pathnames.h"
-
-/*XXX*/#include <inttypes.h>
-
-time_t expand(u_int);
-char *flagbits(int);
-const char *getdev(dev_t);
-int readrec_forward(FILE *f, struct acctv2 *av2);
-int readrec_backward(FILE *f, struct acctv2 *av2);
-int requested(char *[], struct acctv2 *);
-static void usage(void);
-
-#define AC_UTIME 1 /* user */
-#define AC_STIME 2 /* system */
-#define AC_ETIME 4 /* elapsed */
-#define AC_CTIME 8 /* user + system time, default */
-
-#define AC_BTIME 16 /* starting time */
-#define AC_FTIME 32 /* exit time (starting time + elapsed time )*/
-
-int
-main(int argc, char *argv[])
-{
- struct acctv2 ab;
- char *p;
- FILE *fp;
- int (*readrec)(FILE *f, struct acctv2 *av2);
- time_t t;
- int ch, rv;
- const char *acctfile;
- int flags = 0;
-
- acctfile = _PATH_ACCT;
- while ((ch = getopt(argc, argv, "f:usecSE")) != -1)
- switch((char)ch) {
- case 'f':
- acctfile = optarg;
- break;
-
- case 'u':
- flags |= AC_UTIME; /* user time */
- break;
- case 's':
- flags |= AC_STIME; /* system time */
- break;
- case 'e':
- flags |= AC_ETIME; /* elapsed time */
- break;
- case 'c':
- flags |= AC_CTIME; /* user + system time */
- break;
-
- case 'S':
- flags |= AC_BTIME; /* starting time */
- break;
- case 'E':
- /* exit time (starting time + elapsed time )*/
- flags |= AC_FTIME;
- break;
-
- case '?':
- default:
- usage();
- }
-
- /* default user + system time and starting time */
- if (!flags) {
- flags = AC_CTIME | AC_BTIME;
- }
-
- argc -= optind;
- argv += optind;
-
- if (strcmp(acctfile, "-") == 0) {
- fp = stdin;
- readrec = readrec_forward;
- } else {
- /* Open the file. */
- if ((fp = fopen(acctfile, "r")) == NULL)
- err(1, "could not open %s", acctfile);
- if (fseek(fp, 0l, SEEK_END) == -1)
- err(1, "seek to end of %s failed", acctfile);
- readrec = readrec_backward;
- }
-
- while ((rv = readrec(fp, &ab)) == 1) {
- for (p = &ab.ac_comm[0];
- p < &ab.ac_comm[AC_COMM_LEN] && *p; ++p)
- if (!isprint(*p))
- *p = '?';
-
- if (*argv && !requested(argv, &ab))
- continue;
-
- (void)printf("%-*.*s %-7s %-*s %-*s",
- AC_COMM_LEN, AC_COMM_LEN, ab.ac_comm,
- flagbits(ab.ac_flagx),
- UT_NAMESIZE, user_from_uid(ab.ac_uid, 0),
- UT_LINESIZE, getdev(ab.ac_tty));
-
-
- /* user + system time */
- if (flags & AC_CTIME) {
- (void)printf(" %6.3f secs",
- (ab.ac_utime + ab.ac_stime) / 1000000);
- }
-
- /* usr time */
- if (flags & AC_UTIME) {
- (void)printf(" %6.3f us", ab.ac_utime / 1000000);
- }
-
- /* system time */
- if (flags & AC_STIME) {
- (void)printf(" %6.3f sy", ab.ac_stime / 1000000);
- }
-
- /* elapsed time */
- if (flags & AC_ETIME) {
- (void)printf(" %8.3f es", ab.ac_etime / 1000000);
- }
-
- /* starting time */
- if (flags & AC_BTIME) {
- (void)printf(" %.16s", ctime(&ab.ac_btime));
- }
-
- /* exit time (starting time + elapsed time )*/
- if (flags & AC_FTIME) {
- t = ab.ac_btime;
- t += (time_t)(ab.ac_etime / 1000000);
- (void)printf(" %.16s", ctime(&t));
- }
- printf("\n");
- }
- if (rv == EOF)
- err(1, "read record from %s failed", acctfile);
-
- if (fflush(stdout))
- err(1, "stdout");
- exit(0);
-}
-
-char *
-flagbits(int f)
-{
- static char flags[20] = "-";
- char *p;
-
-#define BIT(flag, ch) if (f & flag) *p++ = ch
-
- p = flags + 1;
- BIT(ASU, 'S');
- BIT(AFORK, 'F');
- BIT(ACOMPAT, 'C');
- BIT(ACORE, 'D');
- BIT(AXSIG, 'X');
- *p = '\0';
- return (flags);
-}
-
-int
-requested(char *argv[], struct acctv2 *acp)
-{
- const char *p;
-
- do {
- p = user_from_uid(acp->ac_uid, 0);
- if (!strcmp(p, *argv))
- return (1);
- if ((p = getdev(acp->ac_tty)) && !strcmp(p, *argv))
- return (1);
- if (!strncmp(acp->ac_comm, *argv, AC_COMM_LEN))
- return (1);
- } while (*++argv);
- return (0);
-}
-
-const char *
-getdev(dev_t dev)
-{
- static dev_t lastdev = (dev_t)-1;
- static const char *lastname;
-
- if (dev == NODEV) /* Special case. */
- return ("__");
- if (dev == lastdev) /* One-element cache. */
- return (lastname);
- lastdev = dev;
- lastname = devname(dev, S_IFCHR);
- return (lastname);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr,
-"usage: lastcomm [-EScesu] [-f file] [command ...] [user ...] [terminal ...]\n");
- exit(1);
-}
diff --git a/usr.bin/lastcomm/pathnames.h b/usr.bin/lastcomm/pathnames.h
deleted file mode 100644
index 0737970..0000000
--- a/usr.bin/lastcomm/pathnames.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)pathnames.h 8.1 (Berkeley) 6/6/93
- */
-
-#include <paths.h>
-
-#define _PATH_ACCT "/var/account/acct"
diff --git a/usr.bin/lastcomm/readrec.c b/usr.bin/lastcomm/readrec.c
deleted file mode 100644
index 4883b2a..0000000
--- a/usr.bin/lastcomm/readrec.c
+++ /dev/null
@@ -1,231 +0,0 @@
-/*-
- * Copyright (c) 2007 Diomidis Spinellis
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/acct.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-int readrec_forward(FILE *f, struct acctv2 *av2);
-int readrec_backward(FILE *f, struct acctv2 *av2);
-
-/*
- * Reverse offsetof: return the offset of field f
- * from the end of the structure s.
- */
-#define roffsetof(s, f) (sizeof(s) - offsetof(s, f))
-
-/*
- * Read exactly one record of size size from stream f into ptr.
- * Failure to read the complete record is considered a file format error,
- * and will set errno to EFTYPE.
- * Return 0 on success, EOF on end of file or error.
- */
-static int
-fread_record(void *ptr, size_t size, FILE *f)
-{
- size_t rv;
-
- if ((rv = fread(ptr, 1, size, f)) == size)
- return (0);
- else if (ferror(f) || rv == 0)
- return (EOF);
- else {
- /* Short read. */
- errno = EFTYPE;
- return (EOF);
- }
-}
-
-/*
- * Return the value of a comp_t field.
- */
-static float
-decode_comp(comp_t v)
-{
- int result, exp;
-
- result = v & 017777;
- for (exp = v >> 13; exp; exp--)
- result <<= 3;
- return ((double)result / AHZV1);
-}
-
-/*
- * Read a v1 accounting record stored at the current
- * position of stream f.
- * Convert the data to the current record format.
- * Return EOF on error or end-of-file.
- */
-static int
-readrec_v1(FILE *f, struct acctv2 *av2)
-{
- struct acctv1 av1;
- int rv;
-
- if ((rv = fread_record(&av1, sizeof(av1), f)) == EOF)
- return (EOF);
- av2->ac_zero = 0;
- av2->ac_version = 2;
- av2->ac_len = av2->ac_len2 = sizeof(*av2);
- memcpy(av2->ac_comm, av1.ac_comm, AC_COMM_LEN);
- av2->ac_utime = decode_comp(av1.ac_utime) * 1000000;
- av2->ac_stime = decode_comp(av1.ac_stime) * 1000000;
- av2->ac_etime = decode_comp(av1.ac_etime) * 1000000;
- av2->ac_btime = av1.ac_btime;
- av2->ac_uid = av1.ac_uid;
- av2->ac_gid = av1.ac_gid;
- av2->ac_mem = av1.ac_mem;
- av2->ac_io = decode_comp(av1.ac_io);
- av2->ac_tty = av1.ac_tty;
- av2->ac_flagx = av1.ac_flag | ANVER;
- return (0);
-}
-
-/*
- * Read an v2 accounting record stored at the current
- * position of stream f.
- * Return EOF on error or end-of-file.
- */
-static int
-readrec_v2(FILE *f, struct acctv2 *av2)
-{
- return (fread_record(av2, sizeof(*av2), f));
-}
-
-/*
- * Read a new-style (post-v1) accounting record stored at
- * the current position of stream f.
- * Convert the data to the current record format.
- * Return EOF on error or end-of-file.
- */
-static int
-readrec_vx(FILE *f, struct acctv2 *av2)
-{
- uint8_t magic, version;
-
- if (fread_record(&magic, sizeof(magic), f) == EOF ||
- fread_record(&version, sizeof(version), f) == EOF ||
- ungetc(version, f) == EOF ||
- ungetc(magic, f) == EOF)
- return (EOF);
- switch (version) {
- case 2:
- return (readrec_v2(f, av2));
-
- /* Add handling for more versions here. */
-
- default:
- errno = EFTYPE;
- return (EOF);
- }
-}
-
-/*
- * Read an accounting record stored at the current
- * position of stream f.
- * Old-format records are converted to the current record
- * format.
- * Return the number of records read (1 or 0 at the end-of-file),
- * or EOF on error.
- */
-int
-readrec_forward(FILE *f, struct acctv2 *av2)
-{
- int magic, rv;
-
- if ((magic = getc(f)) == EOF)
- return (ferror(f) ? EOF : 0);
- if (ungetc(magic, f) == EOF)
- return (EOF);
- if (magic != 0)
- /* Old record format. */
- rv = readrec_v1(f, av2);
- else
- /* New record formats. */
- rv = readrec_vx(f, av2);
- return (rv == EOF ? EOF : 1);
-}
-
-/*
- * Read an accounting record ending at the current
- * position of stream f.
- * Old-format records are converted to the current record
- * format.
- * The file pointer is positioned at the beginning of the
- * record read.
- * Return the number of records read (1 or 0 at the end-of-file),
- * or EOF on error.
- */
-int
-readrec_backward(FILE *f, struct acctv2 *av2)
-{
- off_t pos;
- int c;
- uint16_t len;
-
- if ((pos = ftell(f)) == -1)
- return (EOF);
- if (pos == 0)
- return (0);
- if (fseek(f, -roffsetof(struct acctv2, ac_trailer),
- SEEK_CUR) == EOF ||
- (c = getc(f)) == EOF)
- return (EOF);
- if (c & ANVER) {
- /* New record formats. */
- if (fseeko(f, pos - roffsetof(struct acctv2, ac_len2),
- SEEK_SET) == EOF ||
- fread_record(&len, sizeof(len), f) == EOF ||
- fseeko(f, pos - len, SEEK_SET) == EOF ||
- readrec_vx(f, av2) == EOF ||
- fseeko(f, pos - len, SEEK_SET) == EOF)
- return (EOF);
- else
- return (1);
- } else {
- /* Old record format. */
- if (fseeko(f, pos - sizeof(struct acctv1), SEEK_SET) == EOF ||
- readrec_v1(f, av2) == EOF ||
- fseeko(f, pos - sizeof(struct acctv1), SEEK_SET) == EOF)
- return (EOF);
- else
- return (1);
- }
-}
diff --git a/usr.bin/ldd/Makefile b/usr.bin/ldd/Makefile
deleted file mode 100644
index 357f9f3..0000000
--- a/usr.bin/ldd/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-# $FreeBSD$
-
-PROG?= ldd
-SRCS= ldd.c
-.if ${MACHINE_ARCH} == "i386"
-SRCS+= sods.c
-.endif
-WARNS?= 6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ldd/extern.h b/usr.bin/ldd/extern.h
deleted file mode 100644
index 4df6759..0000000
--- a/usr.bin/ldd/extern.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2002 FreeBSD, Inc
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-extern void dump_file(const char *);
-extern int error_count;
-
diff --git a/usr.bin/ldd/ldd.1 b/usr.bin/ldd/ldd.1
deleted file mode 100644
index 72afb39..0000000
--- a/usr.bin/ldd/ldd.1
+++ /dev/null
@@ -1,80 +0,0 @@
-.\" $FreeBSD$
-.\"
-.Dd May 15, 2008
-.Dt LDD 1
-.Os
-.Sh NAME
-.Nm ldd
-.Nd list dynamic object dependencies
-.Sh SYNOPSIS
-.Nm
-.Op Fl a
-.Op Fl v
-.Op Fl f Ar format
-.Ar program ...
-.Sh DESCRIPTION
-The
-.Nm
-utility displays all shared objects that are needed to run the given program or
-to load the given shared object.
-Contrary to
-.Xr nm 1 ,
-the list includes
-.Dq indirect
-dependencies that are the result of needed shared objects which themselves
-depend on yet other shared objects.
-.Pp
-Zero, one or two
-.Fl f
-options may be given.
-The argument is a format string passed to
-.Xr rtld 1
-and allows customization of
-.Nm Ns 's
-output.
-If one is given, it sets
-.Ev LD_TRACE_LOADED_OBJECTS_FMT1 .
-If two are given, they set
-.Ev LD_TRACE_LOADED_OBJECTS_FMT1
-and
-.Ev LD_TRACE_LOADED_OBJECTS_FMT2 ,
-respectively.
-See
-.Xr rtld 1
-for details, including a list of recognized conversion characters.
-.Pp
-The
-.Fl a
-option displays the list of all objects that are needed by each loaded
-object.
-This option does not work with
-.Xr a.out 5
-binaries.
-.Pp
-The
-.Fl v
-option displays a verbose listing of the dynamic linking headers
-encoded in the executable.
-See the source code and include
-files for the definitive meaning of all the fields.
-.Sh EXAMPLES
-The following is an example of a shell pipeline which uses the
-.Fl f
-option.
-It will print a report of all ELF binaries in the current directory,
-which link against libc.so.6:
-.Dl "find . -type f | xargs -n1 file -F " " | grep ELF | cut -f1 -d' ' | xargs ldd -f '%A %o\en' | grep libc.so.6"
-.Sh SEE ALSO
-.Xr ld 1 ,
-.Xr nm 1 ,
-.Xr rtld 1
-.Sh HISTORY
-A
-.Nm
-utility first appeared in SunOS 4.0, it appeared in its current form in
-.Fx 1.1 .
-.Pp
-The
-.Fl v
-support is based on code written by
-.An John Polstra Aq jdp@polstra.com
diff --git a/usr.bin/ldd/ldd.c b/usr.bin/ldd/ldd.c
deleted file mode 100644
index f83632a..0000000
--- a/usr.bin/ldd/ldd.c
+++ /dev/null
@@ -1,389 +0,0 @@
-/*
- * Copyright (c) 1993 Paul Kranenburg
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Paul Kranenburg.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/wait.h>
-
-#include <machine/elf.h>
-
-#include <arpa/inet.h>
-
-#include <a.out.h>
-#include <dlfcn.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-#ifdef COMPAT_32BIT
-#define LD_ "LD_32_"
-#else
-#define LD_ "LD_"
-#endif
-
-/*
- * 32-bit ELF data structures can only be used if the system header[s] declare
- * them. There is no official macro for determining whether they are declared,
- * so check for the existence of one of the 32-macros defined in elf(5).
- */
-#ifdef ELF32_R_TYPE
-#define ELF32_SUPPORTED
-#endif
-
-static int is_executable(const char *fname, int fd, int *is_shlib,
- int *type);
-static void usage(void);
-
-#define TYPE_UNKNOWN 0
-#define TYPE_AOUT 1
-#define TYPE_ELF 2 /* Architecture default */
-#if __ELF_WORD_SIZE > 32 && defined(ELF32_SUPPORTED)
-#define TYPE_ELF32 3 /* Explicit 32 bits on architectures >32 bits */
-
-#define _PATH_LDD32 "/usr/bin/ldd32"
-
-static int
-execldd32(char *file, char *fmt1, char *fmt2, int aflag, int vflag)
-{
- char *argv[8];
- int i, rval, status;
-
- unsetenv(LD_ "TRACE_LOADED_OBJECTS");
- rval = 0;
- i = 0;
- argv[i++] = strdup(_PATH_LDD32);
- if (aflag)
- argv[i++] = strdup("-a");
- if (vflag)
- argv[i++] = strdup("-v");
- if (fmt1 != NULL) {
- argv[i++] = strdup("-f");
- argv[i++] = strdup(fmt1);
- }
- if (fmt2 != NULL) {
- argv[i++] = strdup("-f");
- argv[i++] = strdup(fmt2);
- }
- argv[i++] = strdup(file);
- argv[i++] = NULL;
-
- switch (fork()) {
- case -1:
- err(1, "fork");
- break;
- case 0:
- execv(_PATH_LDD32, argv);
- warn("%s", _PATH_LDD32);
- _exit(127);
- break;
- default:
- if (wait(&status) < 0)
- rval = 1;
- else if (WIFSIGNALED(status))
- rval = 1;
- else if (WIFEXITED(status) && WEXITSTATUS(status) != 0)
- rval = 1;
- break;
- }
- while (i--)
- free(argv[i]);
- setenv(LD_ "TRACE_LOADED_OBJECTS", "yes", 1);
- return (rval);
-}
-#endif
-
-int
-main(int argc, char *argv[])
-{
- char *fmt1, *fmt2;
- int rval, c, aflag, vflag;
-
- aflag = vflag = 0;
- fmt1 = fmt2 = NULL;
-
- while ((c = getopt(argc, argv, "af:v")) != -1) {
- switch (c) {
- case 'a':
- aflag++;
- break;
- case 'f':
- if (fmt1 != NULL) {
- if (fmt2 != NULL)
- errx(1, "too many formats");
- fmt2 = optarg;
- } else
- fmt1 = optarg;
- break;
- case 'v':
- vflag++;
- break;
- default:
- usage();
- /* NOTREACHED */
- }
- }
- argc -= optind;
- argv += optind;
-
- if (vflag && fmt1 != NULL)
- errx(1, "-v may not be used with -f");
-
- if (argc <= 0) {
- usage();
- /* NOTREACHED */
- }
-
-#ifdef __i386__
- if (vflag) {
- for (c = 0; c < argc; c++)
- dump_file(argv[c]);
- exit(error_count == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
- }
-#endif
-
- rval = 0;
- for (; argc > 0; argc--, argv++) {
- int fd, status, is_shlib, rv, type;
-
- if ((fd = open(*argv, O_RDONLY, 0)) < 0) {
- warn("%s", *argv);
- rval |= 1;
- continue;
- }
- rv = is_executable(*argv, fd, &is_shlib, &type);
- close(fd);
- if (rv == 0) {
- rval |= 1;
- continue;
- }
-
- switch (type) {
- case TYPE_ELF:
- case TYPE_AOUT:
- break;
-#if __ELF_WORD_SIZE > 32 && defined(ELF32_SUPPORTED)
- case TYPE_ELF32:
- rval |= execldd32(*argv, fmt1, fmt2, aflag, vflag);
- continue;
-#endif
- case TYPE_UNKNOWN:
- default:
- /*
- * This shouldn't happen unless is_executable()
- * is broken.
- */
- errx(EDOOFUS, "unknown executable type");
- }
-
- /* ld.so magic */
- setenv(LD_ "TRACE_LOADED_OBJECTS", "yes", 1);
- if (fmt1 != NULL)
- setenv(LD_ "TRACE_LOADED_OBJECTS_FMT1", fmt1, 1);
- if (fmt2 != NULL)
- setenv(LD_ "TRACE_LOADED_OBJECTS_FMT2", fmt2, 1);
-
- setenv(LD_ "TRACE_LOADED_OBJECTS_PROGNAME", *argv, 1);
- if (aflag)
- setenv(LD_ "TRACE_LOADED_OBJECTS_ALL", "1", 1);
- else if (fmt1 == NULL && fmt2 == NULL)
- /* Default formats */
- printf("%s:\n", *argv);
- fflush(stdout);
-
- switch (fork()) {
- case -1:
- err(1, "fork");
- break;
- default:
- if (wait(&status) < 0) {
- warn("wait");
- rval |= 1;
- } else if (WIFSIGNALED(status)) {
- fprintf(stderr, "%s: signal %d\n", *argv,
- WTERMSIG(status));
- rval |= 1;
- } else if (WIFEXITED(status) &&
- WEXITSTATUS(status) != 0) {
- fprintf(stderr, "%s: exit status %d\n", *argv,
- WEXITSTATUS(status));
- rval |= 1;
- }
- break;
- case 0:
- if (is_shlib == 0) {
- execl(*argv, *argv, (char *)NULL);
- warn("%s", *argv);
- } else {
- dlopen(*argv, RTLD_TRACE);
- warnx("%s: %s", *argv, dlerror());
- }
- _exit(1);
- }
- }
-
- return rval;
-}
-
-static void
-usage(void)
-{
-
- fprintf(stderr, "usage: ldd [-a] [-v] [-f format] program ...\n");
- exit(1);
-}
-
-static int
-is_executable(const char *fname, int fd, int *is_shlib, int *type)
-{
- union {
- struct exec aout;
-#if __ELF_WORD_SIZE > 32 && defined(ELF32_SUPPORTED)
- Elf32_Ehdr elf32;
-#endif
- Elf_Ehdr elf;
- } hdr;
- int n;
-
- *is_shlib = 0;
- *type = TYPE_UNKNOWN;
-
- if ((n = read(fd, &hdr, sizeof(hdr))) == -1) {
- warn("%s: can't read program header", fname);
- return (0);
- }
-
- if ((size_t)n >= sizeof(hdr.aout) && !N_BADMAG(hdr.aout)) {
- /* a.out file */
- if ((N_GETFLAG(hdr.aout) & EX_DPMASK) != EX_DYNAMIC
-#if 1 /* Compatibility */
- || hdr.aout.a_entry < __LDPGSZ
-#endif
- ) {
- warnx("%s: not a dynamic executable", fname);
- return (0);
- }
- *type = TYPE_AOUT;
- return (1);
- }
-
-#if __ELF_WORD_SIZE > 32 && defined(ELF32_SUPPORTED)
- if ((size_t)n >= sizeof(hdr.elf32) && IS_ELF(hdr.elf32) &&
- hdr.elf32.e_ident[EI_CLASS] == ELFCLASS32) {
- /* Handle 32 bit ELF objects */
- Elf32_Phdr phdr;
- int dynamic, i;
-
- dynamic = 0;
- *type = TYPE_ELF32;
-
- if (lseek(fd, hdr.elf32.e_phoff, SEEK_SET) == -1) {
- warnx("%s: header too short", fname);
- return (0);
- }
- for (i = 0; i < hdr.elf32.e_phnum; i++) {
- if (read(fd, &phdr, hdr.elf32.e_phentsize) !=
- sizeof(phdr)) {
- warnx("%s: can't read program header", fname);
- return (0);
- }
- if (phdr.p_type == PT_DYNAMIC) {
- dynamic = 1;
- break;
- }
- }
-
- if (!dynamic) {
- warnx("%s: not a dynamic ELF executable", fname);
- return (0);
- }
- if (hdr.elf32.e_type == ET_DYN) {
- if (hdr.elf32.e_ident[EI_OSABI] & ELFOSABI_FREEBSD) {
- *is_shlib = 1;
- return (1);
- }
- warnx("%s: not a FreeBSD ELF shared object", fname);
- return (0);
- }
-
- return (1);
- }
-#endif
-
- if ((size_t)n >= sizeof(hdr.elf) && IS_ELF(hdr.elf) &&
- hdr.elf.e_ident[EI_CLASS] == ELF_TARG_CLASS) {
- /* Handle default ELF objects on this architecture */
- Elf_Phdr phdr;
- int dynamic, i;
-
- dynamic = 0;
- *type = TYPE_ELF;
-
- if (lseek(fd, hdr.elf.e_phoff, SEEK_SET) == -1) {
- warnx("%s: header too short", fname);
- return (0);
- }
- for (i = 0; i < hdr.elf.e_phnum; i++) {
- if (read(fd, &phdr, hdr.elf.e_phentsize)
- != sizeof(phdr)) {
- warnx("%s: can't read program header", fname);
- return (0);
- }
- if (phdr.p_type == PT_DYNAMIC) {
- dynamic = 1;
- break;
- }
- }
-
- if (!dynamic) {
- warnx("%s: not a dynamic ELF executable", fname);
- return (0);
- }
- if (hdr.elf.e_type == ET_DYN) {
- if (hdr.elf.e_ident[EI_OSABI] & ELFOSABI_FREEBSD) {
- *is_shlib = 1;
- return (1);
- }
- warnx("%s: not a FreeBSD ELF shared object", fname);
- return (0);
- }
-
- return (1);
- }
-
- warnx("%s: not a dynamic executable", fname);
- return (0);
-}
diff --git a/usr.bin/ldd/sods.c b/usr.bin/ldd/sods.c
deleted file mode 100644
index e6de90f..0000000
--- a/usr.bin/ldd/sods.c
+++ /dev/null
@@ -1,550 +0,0 @@
-/*
- * Copyright (C) 1996-1997 John D. Polstra. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY JOHN D. POLSTRA AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL JOHN D. POLSTRA OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-
-#include <machine/elf.h>
-
-#include <arpa/inet.h>
-
-#include <a.out.h>
-#include <assert.h>
-#include <ctype.h>
-#include <err.h>
-#include <fcntl.h>
-#include <sys/link_aout.h>
-#include <stab.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-#define PAGE_SIZE 4096 /* i386 specific */
-
-#ifndef N_SETA
-#define N_SETA 0x14 /* Absolute set element symbol */
-#endif /* This is input to LD, in a .o file. */
-
-#ifndef N_SETT
-#define N_SETT 0x16 /* Text set element symbol */
-#endif /* This is input to LD, in a .o file. */
-
-#ifndef N_SETD
-#define N_SETD 0x18 /* Data set element symbol */
-#endif /* This is input to LD, in a .o file. */
-
-#ifndef N_SETB
-#define N_SETB 0x1A /* Bss set element symbol */
-#endif /* This is input to LD, in a .o file. */
-
-#ifndef N_SETV
-#define N_SETV 0x1C /* Pointer to set vector in data area. */
-#endif /* This is output from LD. */
-
-#ifdef STANDALONE
-static
-#endif
-
-static void dump_rels(const char *, const struct relocation_info *,
- unsigned long, const char *(*)(unsigned long), unsigned char *);
-static void dump_segs(void);
-static void dump_sods(void);
-static void dump_sym(const struct nlist *);
-static void dump_syms(void);
-
-static void dump_rtsyms(void);
-
-static const char *rtsym_name(unsigned long);
-static const char *sym_name(unsigned long);
-
-#ifdef STANDALONE
-static
-#endif
-int error_count;
-
-/*
- * Variables ending in _base are pointers to things in our address space,
- * i.e., in the file itself.
- *
- * Variables ending in _addr are adjusted according to where things would
- * actually appear in memory if the file were loaded.
- */
-static const char *file_base;
-static const char *text_base;
-static const char *data_base;
-static const struct relocation_info *rel_base;
-static const struct nlist *sym_base;
-static const char *str_base;
-
-static const struct relocation_info *rtrel_base;
-static const struct nzlist *rtsym_base;
-static const char *rtstr_base;
-
-static const struct exec *ex;
-static const struct _dynamic *dyn;
-static const struct section_dispatch_table *sdt;
-
-static const char *text_addr;
-static const char *data_addr;
-
-static unsigned long rel_count;
-static unsigned long sym_count;
-
-static unsigned long rtrel_count;
-static unsigned long rtsym_count;
-
-/* Dynamically allocated flags, 1 byte per symbol, to record whether each
- symbol was referenced by a relocation entry. */
-static unsigned char *sym_used;
-static unsigned char *rtsym_used;
-
-static unsigned long origin; /* What values are relocated relative to */
-
-#ifdef STANDALONE
-int
-main(int argc, char *argv[])
-{
- int i;
-
- for (i = 1; i < argc; ++i)
- dump_file(argv[i]);
-
- return error_count == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
-}
-#endif
-
-#ifdef STANDALONE
-static
-#endif
-void
-dump_file(const char *fname)
-{
- int fd;
- struct stat sb;
- caddr_t objbase;
-
- if (stat(fname, &sb) == -1) {
- warnx("cannot stat \"%s\"", fname);
- ++error_count;
- return;
- }
-
- if ((sb.st_mode & S_IFMT) != S_IFREG) {
- warnx("\"%s\" is not a regular file", fname);
- ++error_count;
- return;
- }
-
- if ((fd = open(fname, O_RDONLY, 0)) == -1) {
- warnx("cannot open \"%s\"", fname);
- ++error_count;
- return;
- }
-
- objbase = mmap(0, sb.st_size, PROT_READ, MAP_SHARED, fd, 0);
- if (objbase == (caddr_t) -1) {
- warnx("cannot mmap \"%s\"", fname);
- ++error_count;
- close(fd);
- return;
- }
-
- close(fd);
-
- file_base = (const char *) objbase; /* Makes address arithmetic easier */
-
- if (IS_ELF(*(const Elf32_Ehdr*) file_base)) {
- warnx("%s: this is an ELF program; use objdump to examine", fname);
- ++error_count;
- munmap(objbase, sb.st_size);
- close(fd);
- return;
- }
-
- ex = (const struct exec *) file_base;
-
- printf("%s: a_midmag = 0x%lx\n", fname, (long)ex->a_midmag);
- printf(" magic = 0x%lx = 0%lo, netmagic = 0x%lx = 0%lo\n",
- (long)N_GETMAGIC(*ex), (long)N_GETMAGIC(*ex),
- (long)N_GETMAGIC_NET(*ex), (long)N_GETMAGIC_NET(*ex));
-
- if (N_BADMAG(*ex)) {
- warnx("%s: bad magic number", fname);
- ++error_count;
- munmap(objbase, sb.st_size);
- return;
- }
-
- printf(" a_text = 0x%lx\n", (long)ex->a_text);
- printf(" a_data = 0x%lx\n", (long)ex->a_data);
- printf(" a_bss = 0x%lx\n", (long)ex->a_bss);
- printf(" a_syms = 0x%lx\n", (long)ex->a_syms);
- printf(" a_entry = 0x%lx\n", (long)ex->a_entry);
- printf(" a_trsize = 0x%lx\n", (long)ex->a_trsize);
- printf(" a_drsize = 0x%lx\n", (long)ex->a_drsize);
-
- text_base = file_base + N_TXTOFF(*ex);
- data_base = file_base + N_DATOFF(*ex);
- rel_base = (const struct relocation_info *) (file_base + N_RELOFF(*ex));
- sym_base = (const struct nlist *) (file_base + N_SYMOFF(*ex));
- str_base = file_base + N_STROFF(*ex);
-
- rel_count = (ex->a_trsize + ex->a_drsize) / sizeof rel_base[0];
- assert(rel_count * sizeof rel_base[0] == ex->a_trsize + ex->a_drsize);
- sym_count = ex->a_syms / sizeof sym_base[0];
- assert(sym_count * sizeof sym_base[0] == ex->a_syms);
-
- if (sym_count != 0) {
- sym_used = (unsigned char *) calloc(sym_count, sizeof(unsigned char));
- assert(sym_used != NULL);
- }
-
- printf(" Entry = 0x%lx\n", (long)ex->a_entry);
- printf(" Text offset = %x, address = %lx\n", N_TXTOFF(*ex),
- (long)N_TXTADDR(*ex));
- printf(" Data offset = %lx, address = %lx\n", (long)N_DATOFF(*ex),
- (long)N_DATADDR(*ex));
-
- /*
- * In an executable program file, everything is relocated relative to
- * the assumed run-time load address, i.e., N_TXTADDR(*ex), i.e., 0x1000.
- *
- * In a shared library file, everything is relocated relative to the
- * start of the file, i.e., N_TXTOFF(*ex), i.e., 0.
- *
- * The way to tell the difference is by looking at ex->a_entry. If it
- * is >= 0x1000, then we have an executable program. Otherwise, we
- * have a shared library.
- *
- * When a program is executed, the entire file is mapped into memory,
- * including the a.out header and so forth. But it is not mapped at
- * address 0; rather it is mapped at address 0x1000. The first page
- * of the user's address space is left unmapped in order to catch null
- * pointer dereferences.
- *
- * In this program, when we map in an executable program, we have to
- * simulate the empty page by decrementing our assumed base address by
- * a pagesize.
- */
-
- text_addr = text_base;
- data_addr = data_base;
- origin = 0;
-
- if (ex->a_entry >= PAGE_SIZE) { /* Executable, not a shared library */
- /*
- * The fields in the object have already been relocated on the
- * assumption that the object will be loaded at N_TXTADDR(*ex).
- * We have to compensate for that.
- */
- text_addr -= PAGE_SIZE;
- data_addr -= PAGE_SIZE;
- origin = PAGE_SIZE;
- printf(" Program, origin = %lx\n", origin);
- } else if (N_GETFLAG(*ex) & EX_DYNAMIC)
- printf(" Shared library, origin = %lx\n", origin);
- else
- printf(" Object file, origin = %lx\n", origin);
-
- if (N_GETFLAG(*ex) & EX_DYNAMIC) {
- dyn = (const struct _dynamic *) data_base;
- printf(" Dynamic version = %d\n", dyn->d_version);
-
- sdt = (const struct section_dispatch_table *)
- (text_addr + (unsigned long) dyn->d_un.d_sdt);
-
- rtrel_base =
- (const struct relocation_info *) (text_addr + sdt->sdt_rel);
- rtrel_count = (sdt->sdt_hash - sdt->sdt_rel) / sizeof rtrel_base[0];
- assert(rtrel_count * sizeof rtrel_base[0] ==
- (size_t)(sdt->sdt_hash - sdt->sdt_rel));
-
- rtsym_base = (const struct nzlist *) (text_addr + sdt->sdt_nzlist);
- rtsym_count = (sdt->sdt_strings - sdt->sdt_nzlist) /
- sizeof rtsym_base[0];
- assert(rtsym_count * sizeof rtsym_base[0] ==
- (size_t)(sdt->sdt_strings - sdt->sdt_nzlist));
-
- if (rtsym_count != 0) {
- rtsym_used = (unsigned char *) calloc(rtsym_count,
- sizeof(unsigned char));
- assert(rtsym_used != NULL);
- }
-
- rtstr_base = text_addr + sdt->sdt_strings;
- }
-
- dump_segs();
- dump_sods();
- dump_rels("Relocations", rel_base, rel_count, sym_name, sym_used);
- dump_syms();
-
- dump_rels("Run-time relocations", rtrel_base, rtrel_count, rtsym_name,
- rtsym_used);
- dump_rtsyms();
-
- if (rtsym_used != NULL) {
- free(rtsym_used);
- rtsym_used = NULL;
- }
- if (sym_used != NULL) {
- free(sym_used);
- sym_used = NULL;
- }
- munmap(objbase, sb.st_size);
-}
-
-static void
-dump_rels(const char *label, const struct relocation_info *base,
- unsigned long count, const char *(*name)(unsigned long),
- unsigned char *sym_used_flags)
-{
- unsigned long i;
-
- printf(" %s:\n", label);
- for (i = 0; i < count; ++i) {
- const struct relocation_info *r = &base[i];
- unsigned int size;
- char contents[16];
-
- size = 1u << r->r_length;
-
- if (origin <= (unsigned long)r->r_address
- && (unsigned long)r->r_address < origin + ex->a_text + ex->a_data
- && 1 <= size && size <= 4) {
- /*
- * XXX - This can cause unaligned accesses. OK for the
- * i386, not so for other architectures.
- */
- switch (size) {
- case 1:
- snprintf(contents, sizeof contents, " [%02x]",
- *(unsigned const char *)(text_addr + r->r_address));
- break;
- case 2:
- snprintf(contents, sizeof contents, " [%04x]",
- *(unsigned const short *)(text_addr + r->r_address));
- break;
- case 4:
- snprintf(contents, sizeof contents, "[%08lx]",
- *(unsigned const long *)(text_addr + r->r_address));
- break;
- }
- } else
- snprintf(contents, sizeof contents, " ");
-
- printf(" %6lu %8x/%u %s %c%c%c%c%c%c", i,
- r->r_address, size,
- contents,
- r->r_extern ? 'e' : '-',
- r->r_jmptable ? 'j' : '-',
- r->r_relative ? 'r' : '-',
- r->r_baserel ? 'b' : '-',
- r->r_pcrel ? 'p' : '-',
- r->r_copy ? 'c' : '-');
-
- if (r->r_extern || r->r_baserel || r->r_jmptable || r->r_copy) {
- printf(" %4u %s", r->r_symbolnum, name(r->r_symbolnum));
- sym_used_flags[r->r_symbolnum] = 1;
- }
-
- printf("\n");
- }
-}
-
-static void
-dump_rtsyms(void)
-{
- unsigned long i;
-
- printf(" Run-time symbols:\n");
- for (i = 0; i < rtsym_count; ++i) {
- printf(" %6lu%c ", i, rtsym_used[i] ? '*' : ' ');
- dump_sym(&rtsym_base[i].nlist);
- printf("/%-5ld %s\n", rtsym_base[i].nz_size, rtsym_name(i));
- }
-}
-
-static void
-dump_segs(void)
-{
- printf(" Text segment starts at address %lx\n", origin + N_TXTOFF(*ex));
- if (N_GETFLAG(*ex) & EX_DYNAMIC) {
- printf(" rel starts at %lx\n", sdt->sdt_rel);
- printf(" hash starts at %lx\n", sdt->sdt_hash);
- printf(" nzlist starts at %lx\n", sdt->sdt_nzlist);
- printf(" strings starts at %lx\n", sdt->sdt_strings);
- }
-
- printf(" Data segment starts at address %lx\n", origin + N_DATOFF(*ex));
- if (N_GETFLAG(*ex) & EX_DYNAMIC) {
- printf(" _dynamic starts at %lx\n", origin + N_DATOFF(*ex));
- printf(" so_debug starts at %lx\n", (unsigned long) dyn->d_debug);
- printf(" sdt starts at %lx\n", (unsigned long) dyn->d_un.d_sdt);
- printf(" got starts at %lx\n", sdt->sdt_got);
- printf(" plt starts at %lx\n", sdt->sdt_plt);
- printf(" rest of stuff starts at %lx\n",
- sdt->sdt_plt + sdt->sdt_plt_sz);
- }
-}
-
-static void
-dump_sods(void)
-{
- long sod_offset;
- long paths_offset;
-
- if (dyn == NULL) /* Not a shared object */
- return;
-
- sod_offset = sdt->sdt_sods;
- printf(" Shared object dependencies:\n");
- while (sod_offset != 0) {
- const struct sod *sodp = (const struct sod *) (text_addr + sod_offset);
- const char *name = (const char *) (text_addr + sodp->sod_name);
-
- if (sodp->sod_library)
- printf(" -l%-16s version %d.%d\n", name, sodp->sod_major,
- sodp->sod_minor);
- else
- printf(" %s\n", name);
- sod_offset = sodp->sod_next;
- }
- paths_offset = sdt->sdt_paths;
- printf(" Shared object additional paths:\n");
- if (paths_offset != 0) {
- printf(" %s\n", (const char *)(text_addr + paths_offset));
- } else {
- printf(" (none)\n");
- }
-}
-
-static void
-dump_sym(const struct nlist *np)
-{
- char type[8];
- char aux[8];
- char weak;
- char *p;
-
- switch (np->n_type & ~N_EXT) {
- case N_UNDF: strcpy(type, "undf"); break;
- case N_ABS: strcpy(type, "abs"); break;
- case N_TEXT: strcpy(type, "text"); break;
- case N_DATA: strcpy(type, "data"); break;
- case N_BSS: strcpy(type, "bss"); break;
- case N_INDR: strcpy(type, "indr"); break;
- case N_SIZE: strcpy(type, "size"); break;
- case N_COMM: strcpy(type, "comm"); break;
- case N_SETA: strcpy(type, "seta"); break;
- case N_SETT: strcpy(type, "sett"); break;
- case N_SETD: strcpy(type, "setd"); break;
- case N_SETB: strcpy(type, "setb"); break;
- case N_SETV: strcpy(type, "setv"); break;
- case N_FN: strcpy(type, np->n_type&N_EXT ? "fn" : "warn"); break;
- case N_GSYM: strcpy(type, "gsym"); break;
- case N_FNAME: strcpy(type, "fname"); break;
- case N_FUN: strcpy(type, "fun"); break;
- case N_STSYM: strcpy(type, "stsym"); break;
- case N_LCSYM: strcpy(type, "lcsym"); break;
- case N_MAIN: strcpy(type, "main"); break;
- case N_PC: strcpy(type, "pc"); break;
- case N_RSYM: strcpy(type, "rsym"); break;
- case N_SLINE: strcpy(type, "sline"); break;
- case N_DSLINE: strcpy(type, "dsline"); break;
- case N_BSLINE: strcpy(type, "bsline"); break;
- case N_SSYM: strcpy(type, "ssym"); break;
- case N_SO: strcpy(type, "so"); break;
- case N_LSYM: strcpy(type, "lsym"); break;
- case N_BINCL: strcpy(type, "bincl"); break;
- case N_SOL: strcpy(type, "sol"); break;
- case N_PSYM: strcpy(type, "psym"); break;
- case N_EINCL: strcpy(type, "eincl"); break;
- case N_ENTRY: strcpy(type, "entry"); break;
- case N_LBRAC: strcpy(type, "lbrac"); break;
- case N_EXCL: strcpy(type, "excl"); break;
- case N_RBRAC: strcpy(type, "rbrac"); break;
- case N_BCOMM: strcpy(type, "bcomm"); break;
- case N_ECOMM: strcpy(type, "ecomm"); break;
- case N_ECOML: strcpy(type, "ecoml"); break;
- case N_LENG: strcpy(type, "leng"); break;
- default:
- snprintf(type, sizeof type, "%#02x", np->n_type);
- break;
- }
-
- if (np->n_type & N_EXT && type[0] != '0')
- for (p = type; *p != '\0'; ++p)
- *p = toupper(*p);
-
- switch (N_AUX(np)) {
- case 0: strcpy(aux, ""); break;
- case AUX_OBJECT: strcpy(aux, "objt"); break;
- case AUX_FUNC: strcpy(aux, "func"); break;
- default: snprintf(aux, sizeof aux, "%#01x", N_AUX(np)); break;
- }
-
- weak = N_BIND(np) == BIND_WEAK ? 'w' : ' ';
-
- printf("%c%-6s %-4s %8lx", weak, type, aux, np->n_value);
-}
-
-static void
-dump_syms(void)
-{
- unsigned long i;
-
- printf(" Symbols:\n");
- for (i = 0; i < sym_count; ++i) {
- printf(" %6lu%c ", i, sym_used[i] ? '*' : ' ');
- dump_sym(&sym_base[i]);
- printf(" %s\n", sym_name(i));
- }
-}
-
-static const char *
-rtsym_name(unsigned long n)
-{
- assert(n < rtsym_count);
- if (rtsym_base[n].nz_strx == 0)
- return "";
- return rtstr_base + rtsym_base[n].nz_strx;
-}
-
-static const char *
-sym_name(unsigned long n)
-{
- assert(n < sym_count);
- if (sym_base[n].n_un.n_strx == 0)
- return "";
- return str_base + sym_base[n].n_un.n_strx;
-}
diff --git a/usr.bin/leave/Makefile b/usr.bin/leave/Makefile
deleted file mode 100644
index 859c11c..0000000
--- a/usr.bin/leave/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= leave
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/leave/leave.1 b/usr.bin/leave/leave.1
deleted file mode 100644
index 6c33367..0000000
--- a/usr.bin/leave/leave.1
+++ /dev/null
@@ -1,100 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)leave.1 8.3 (Berkeley) 4/28/95
-.\" $FreeBSD$
-.\"
-.Dd April 28, 1995
-.Dt LEAVE 1
-.Os
-.Sh NAME
-.Nm leave
-.Nd remind you when you have to leave
-.Sh SYNOPSIS
-.Nm
-.Op Oo Cm \&+ Oc Ns Ar hhmm
-.Sh DESCRIPTION
-The
-.Nm
-utility waits until the specified time, then reminds you that you
-have to leave.
-You are reminded 5 minutes and 1 minute before the actual
-time, at the time, and every minute thereafter.
-When you log off,
-.Nm
-exits just before it would have
-printed the next message.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Ar hhmm
-The time of day is in the form
-.Ar hhmm
-where
-.Ar hh
-is a time in
-hours (on a 12 or 24 hour clock), and
-.Ar mm
-are minutes.
-All times are converted to a 12 hour clock, and assumed to
-be in the next 12 hours.
-.It Cm \&+
-If the time is preceded by
-.Sq Cm \&+ ,
-the alarm will go off in hours and minutes
-from the current time.
-.El
-.Pp
-If no argument is given,
-.Nm
-prompts with "When do you
-have to leave?".
-A reply of newline causes
-.Nm
-to exit,
-otherwise the reply is assumed to be a time.
-This form is suitable for inclusion in a
-.Pa .login
-or
-.Pa .profile .
-.Pp
-To get rid of
-.Nm
-you should either log off or use
-.Ql kill \-s KILL
-giving its process id.
-.Sh SEE ALSO
-.Xr calendar 1
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3.0 .
diff --git a/usr.bin/leave/leave.c b/usr.bin/leave/leave.c
deleted file mode 100644
index 89c3f52..0000000
--- a/usr.bin/leave/leave.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (c) 1980, 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1988, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)leave.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <ctype.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <unistd.h>
-
-void doalarm(u_int);
-static void usage(void);
-
-/*
- * leave [[+]hhmm]
- *
- * Reminds you when you have to leave.
- * Leave prompts for input and goes away if you hit return.
- * It nags you like a mother hen.
- */
-int
-main(int argc, char **argv)
-{
- u_int secs;
- int hours, minutes;
- char c, *cp = NULL;
- struct tm *t;
- time_t now;
- int plusnow, t_12_hour;
- char buf[50];
-
- if (setlocale(LC_TIME, "") == NULL)
- warn("setlocale");
-
- if (argc < 2) {
-#define MSG1 "When do you have to leave? "
- (void)write(STDOUT_FILENO, MSG1, sizeof(MSG1) - 1);
- cp = fgets(buf, sizeof(buf), stdin);
- if (cp == NULL || *cp == '\n')
- exit(0);
- } else if (argc > 2)
- usage();
- else
- cp = argv[1];
-
- if (*cp == '+') {
- plusnow = 1;
- ++cp;
- } else
- plusnow = 0;
-
- for (hours = 0; (c = *cp) && c != '\n'; ++cp) {
- if (!isdigit(c))
- usage();
- hours = hours * 10 + (c - '0');
- }
- minutes = hours % 100;
- hours /= 100;
-
- if (minutes < 0 || minutes > 59)
- usage();
- if (plusnow)
- secs = hours * 60 * 60 + minutes * 60;
- else {
- (void)time(&now);
- t = localtime(&now);
-
- if (hours > 23)
- usage();
-
- /* Convert tol to 12 hr time (0:00...11:59) */
- if (hours > 11)
- hours -= 12;
-
- /* Convert tm to 12 hr time (0:00...11:59) */
- if (t->tm_hour > 11)
- t_12_hour = t->tm_hour - 12;
- else
- t_12_hour = t->tm_hour;
-
- if (hours < t_12_hour ||
- (hours == t_12_hour && minutes <= t->tm_min))
- /* Leave time is in the past so we add 12 hrs */
- hours += 12;
-
- secs = (hours - t_12_hour) * 60 * 60;
- secs += (minutes - t->tm_min) * 60;
- secs -= now % 60; /* truncate (now + secs) to min */
- }
- doalarm(secs);
- exit(0);
-}
-
-void
-doalarm(u_int secs)
-{
- int bother;
- time_t daytime;
- char tb[80];
- int pid;
-
- if ((pid = fork())) {
- (void)time(&daytime);
- daytime += secs;
- strftime(tb, sizeof(tb), "%+", localtime(&daytime));
- printf("Alarm set for %s. (pid %d)\n", tb, pid);
- exit(0);
- }
- sleep((u_int)2); /* let parent print set message */
- if (secs >= 2)
- secs -= 2;
-
- /*
- * if write fails, we've lost the terminal through someone else
- * causing a vhangup by logging in.
- */
-#define FIVEMIN (5 * 60)
-#define MSG2 "\07\07You have to leave in 5 minutes.\n"
- if (secs >= FIVEMIN) {
- sleep(secs - FIVEMIN);
- if (write(STDOUT_FILENO, MSG2, sizeof(MSG2) - 1) != sizeof(MSG2) - 1)
- exit(0);
- secs = FIVEMIN;
- }
-
-#define ONEMIN (60)
-#define MSG3 "\07\07Just one more minute!\n"
- if (secs >= ONEMIN) {
- sleep(secs - ONEMIN);
- if (write(STDOUT_FILENO, MSG3, sizeof(MSG3) - 1) != sizeof(MSG3) - 1)
- exit(0);
- }
-
-#define MSG4 "\07\07Time to leave!\n"
- for (bother = 10; bother--;) {
- sleep((u_int)ONEMIN);
- if (write(STDOUT_FILENO, MSG4, sizeof(MSG4) - 1) != sizeof(MSG4) - 1)
- exit(0);
- }
-
-#define MSG5 "\07\07That was the last time I'll tell you. Bye.\n"
- (void)write(STDOUT_FILENO, MSG5, sizeof(MSG5) - 1);
- exit(0);
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: leave [[+]hhmm]\n");
- exit(1);
-}
diff --git a/usr.bin/less/Makefile b/usr.bin/less/Makefile
deleted file mode 100644
index 663ee26..0000000
--- a/usr.bin/less/Makefile
+++ /dev/null
@@ -1,18 +0,0 @@
-# $FreeBSD$
-
-PROG= less
-SRCS= main.c screen.c brac.c ch.c charset.c cmdbuf.c command.c decode.c \
- edit.c filename.c forwback.c help.c ifile.c input.c jump.c line.c \
- linenum.c lsystem.c mark.c optfunc.c option.c opttbl.c os.c output.c \
- position.c prompt.c search.c signal.c tags.c ttyin.c version.c
-SCRIPTS=lesspipe.sh zless.sh
-SCRIPTSNAME_lesspipe.sh=lesspipe.sh
-DPADD= ${LIBTERMCAP}
-LDADD= -ltermcap
-LINKS= ${BINDIR}/less ${BINDIR}/more \
- ${BINDIR}/zless ${BINDIR}/bzless
-MLINKS= less.1 more.1
-CLEANFILES= less.1
-
-.include "Makefile.common"
-.include <bsd.prog.mk>
diff --git a/usr.bin/less/Makefile.common b/usr.bin/less/Makefile.common
deleted file mode 100644
index fcc6ccf..0000000
--- a/usr.bin/less/Makefile.common
+++ /dev/null
@@ -1,11 +0,0 @@
-# $FreeBSD$
-
-LSDIR= ${.CURDIR}/../../contrib/less
-.PATH: ${LSDIR}
-
-CFLAGS+=-I${.CURDIR}/../less -I${LSDIR}
-
-.SUFFIXES: .nro .1
-
-.nro.1:
- cat ${.IMPSRC} > ${.TARGET}
diff --git a/usr.bin/less/defines.h b/usr.bin/less/defines.h
deleted file mode 100644
index bc1b717..0000000
--- a/usr.bin/less/defines.h
+++ /dev/null
@@ -1,422 +0,0 @@
-/* $FreeBSD$ */
-/* defines.h. Generated from defines.h.in by configure. */
-/* defines.h.in. Generated from configure.ac by autoheader. */
-
-
-/* Unix definition file for less. -*- C -*-
- *
- * This file has 3 sections:
- * User preferences.
- * Settings always true on Unix.
- * Settings automatically determined by configure.
- *
- * * * * * * WARNING * * * * * *
- * If you edit defines.h by hand, do "touch stamp-h" before you run make
- * so config.status doesn't overwrite your changes.
- */
-
-/* User preferences. */
-
-/*
- * SECURE is 1 if you wish to disable a bunch of features in order to
- * be safe to run by unprivileged users.
- * SECURE_COMPILE is set by the --with-secure configure option.
- */
-#define SECURE SECURE_COMPILE
-
-/*
- * SHELL_ESCAPE is 1 if you wish to allow shell escapes.
- * (This is possible only if your system supplies the system() function.)
- */
-#define SHELL_ESCAPE (!SECURE)
-
-/*
- * EXAMINE is 1 if you wish to allow examining files by name from within less.
- */
-#define EXAMINE (!SECURE)
-
-/*
- * TAB_COMPLETE_FILENAME is 1 if you wish to allow the TAB key
- * to complete filenames at prompts.
- */
-#define TAB_COMPLETE_FILENAME (!SECURE)
-
-/*
- * CMD_HISTORY is 1 if you wish to allow keys to cycle through
- * previous commands at prompts.
- */
-#define CMD_HISTORY 1
-
-/*
- * HILITE_SEARCH is 1 if you wish to have search targets to be
- * displayed in standout mode.
- */
-#define HILITE_SEARCH 1
-
-/*
- * EDITOR is 1 if you wish to allow editor invocation (the "v" command).
- * (This is possible only if your system supplies the system() function.)
- * EDIT_PGM is the name of the (default) editor to be invoked.
- */
-#define EDITOR (!SECURE)
-
-/*
- * TAGS is 1 if you wish to support tag files.
- */
-#define TAGS (!SECURE)
-
-/*
- * USERFILE is 1 if you wish to allow a .less file to specify
- * user-defined key bindings.
- */
-#define USERFILE (!SECURE)
-
-/*
- * GLOB is 1 if you wish to have shell metacharacters expanded in filenames.
- * This will generally work if your system provides the "popen" function
- * and the "echo" shell command.
- */
-#define GLOB (!SECURE)
-
-/*
- * PIPEC is 1 if you wish to have the "|" command
- * which allows the user to pipe data into a shell command.
- */
-#define PIPEC (!SECURE)
-
-/*
- * LOGFILE is 1 if you wish to allow the -l option (to create log files).
- */
-#define LOGFILE (!SECURE)
-
-/*
- * GNU_OPTIONS is 1 if you wish to support the GNU-style command
- * line options --help and --version.
- */
-#define GNU_OPTIONS 1
-
-/*
- * ONLY_RETURN is 1 if you want RETURN to be the only input which
- * will continue past an error message.
- * Otherwise, any key will continue past an error message.
- */
-#define ONLY_RETURN 0
-
-/*
- * LESSKEYFILE is the filename of the default lesskey output file
- * (in the HOME directory).
- * LESSKEYFILE_SYS is the filename of the system-wide lesskey output file.
- * DEF_LESSKEYINFILE is the filename of the default lesskey input
- * (in the HOME directory).
- * LESSHISTFILE is the filename of the history file
- * (in the HOME directory).
- */
-#define LESSKEYFILE ".less"
-#define LESSKEYFILE_SYS "/etc/lesskey"
-#define DEF_LESSKEYINFILE ".lesskey"
-#define LESSHISTFILE ".lesshst"
-
-
-/* Settings always true on Unix. */
-
-/*
- * Define MSDOS_COMPILER if compiling under Microsoft C.
- */
-#define MSDOS_COMPILER 0
-
-/*
- * Pathname separator character.
- */
-#define PATHNAME_SEP "/"
-
-/*
- * The value returned from tgetent on success.
- * Some HP-UX systems return 0 on success.
- */
-#define TGETENT_OK 1
-
-/*
- * HAVE_SYS_TYPES_H is 1 if your system has <sys/types.h>.
- */
-#define HAVE_SYS_TYPES_H 1
-
-/*
- * Define if you have the <sgstat.h> header file.
- */
-/* #undef HAVE_SGSTAT_H */
-
-/*
- * HAVE_PERROR is 1 if your system has the perror() call.
- * (Actually, if it has sys_errlist, sys_nerr and errno.)
- */
-#define HAVE_PERROR 1
-
-/*
- * HAVE_TIME is 1 if your system has the time() call.
- */
-#define HAVE_TIME 1
-
-/*
- * HAVE_SHELL is 1 if your system supports a SHELL command interpreter.
- */
-#define HAVE_SHELL 1
-
-/*
- * Default shell metacharacters and meta-escape character.
- */
-#define DEF_METACHARS "; *?\t\n'\"()<>[]|&^`#\\$%=~"
-#define DEF_METAESCAPE "\\"
-
-/*
- * HAVE_DUP is 1 if your system has the dup() call.
- */
-#define HAVE_DUP 1
-
-/* Define to 1 if you have the memcpy() function. */
-#define HAVE_MEMCPY 1
-
-/* Define to 1 if you have the strchr() function. */
-#define HAVE_STRCHR 1
-
-/* Define to 1 if you have the strstr() function. */
-#define HAVE_STRSTR 1
-
-/*
- * Sizes of various buffers.
- */
-#define CMDBUF_SIZE 512 /* Buffer for multichar commands */
-#define UNGOT_SIZE 100 /* Max chars to unget() */
-#define LINEBUF_SIZE 1024 /* Max size of line in input file */
-#define OUTBUF_SIZE 1024 /* Output buffer */
-#define PROMPT_SIZE 200 /* Max size of prompt string */
-#define TERMBUF_SIZE 2048 /* Termcap buffer for tgetent */
-#define TERMSBUF_SIZE 1024 /* Buffer to hold termcap strings */
-#define TAGLINE_SIZE 512 /* Max size of line in tags file */
-#define TABSTOP_MAX 32 /* Max number of custom tab stops */
-
-/* Settings automatically determined by configure. */
-
-
-/* Define EDIT_PGM to your editor. */
-#define EDIT_PGM "vi"
-
-/* Define HAVE_CONST if your compiler supports the "const" modifier. */
-#define HAVE_CONST 1
-
-/* Define to 1 if you have the <ctype.h> header file. */
-#define HAVE_CTYPE_H 1
-
-/* Define HAVE_ERRNO if you have the errno variable. */
-#define HAVE_ERRNO 1
-
-/* Define to 1 if you have the <errno.h> header file. */
-#define HAVE_ERRNO_H 1
-
-/* Define to 1 if you have the `fchmod' function. */
-#define HAVE_FCHMOD 1
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#define HAVE_FCNTL_H 1
-
-/* Define HAVE_FILENO if you have the fileno() macro. */
-#define HAVE_FILENO 1
-
-/* Define to 1 if you have the `fsync' function. */
-#define HAVE_FSYNC 1
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define to 1 if you have the `gen' library (-lgen). */
-/* #undef HAVE_LIBGEN */
-
-/* Define to 1 if you have the `intl' library (-lintl). */
-/* #undef HAVE_LIBINTL */
-
-/* Define to 1 if you have the `PW' library (-lPW). */
-/* #undef HAVE_LIBPW */
-
-/* Define to 1 if you have the <limits.h> header file. */
-#define HAVE_LIMITS_H 1
-
-/* Define HAVE_LOCALE if you have locale.h and setlocale. */
-#define HAVE_LOCALE 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define HAVE_OSPEED if your termcap library has the ospeed variable. */
-#define HAVE_OSPEED 1
-
-/* PCRE (Perl-compatible regular expression) library */
-/* #undef HAVE_PCRE */
-
-/* Define to 1 if you have the `popen' function. */
-#define HAVE_POPEN 1
-
-/* POSIX regcomp() and regex.h */
-#define HAVE_POSIX_REGCOMP 1
-
-/* System V regcmp() */
-/* #undef HAVE_REGCMP */
-
-/* */
-/* #undef HAVE_REGEXEC2 */
-
-/* BSD re_comp() */
-/* #undef HAVE_RE_COMP */
-
-/* Define HAVE_SIGEMPTYSET if you have the sigemptyset macro. */
-#define HAVE_SIGEMPTYSET 1
-
-/* Define to 1 if you have the `sigprocmask' function. */
-#define HAVE_SIGPROCMASK 1
-
-/* Define to 1 if you have the `sigsetmask' function. */
-#define HAVE_SIGSETMASK 1
-
-/* Define to 1 if the system has the type `sigset_t'. */
-#define HAVE_SIGSET_T 1
-
-/* Define to 1 if you have the `snprintf' function. */
-#define HAVE_SNPRINTF 1
-
-/* Define to 1 if you have the `stat' function. */
-#define HAVE_STAT 1
-
-/* Define HAVE_STAT_INO if your struct stat has st_ino and st_dev. */
-#define HAVE_STAT_INO 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdio.h> header file. */
-#define HAVE_STDIO_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define HAVE_STRERROR if you have the strerror() function. */
-#define HAVE_STRERROR 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the `system' function. */
-#define HAVE_SYSTEM 1
-
-/* Define HAVE_SYS_ERRLIST if you have the sys_errlist[] variable. */
-#define HAVE_SYS_ERRLIST 1
-
-/* Define to 1 if you have the <sys/ioctl.h> header file. */
-#define HAVE_SYS_IOCTL_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/stream.h> header file. */
-/* #undef HAVE_SYS_STREAM_H */
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <termcap.h> header file. */
-#define HAVE_TERMCAP_H 1
-
-/* Define HAVE_TERMIOS_FUNCS if you have tcgetattr/tcsetattr. */
-#define HAVE_TERMIOS_FUNCS 1
-
-/* Define to 1 if you have the <termios.h> header file. */
-#define HAVE_TERMIOS_H 1
-
-/* Define to 1 if you have the <termio.h> header file. */
-/* #undef HAVE_TERMIO_H */
-
-/* Define to 1 if you have the <time.h> header file. */
-#define HAVE_TIME_H 1
-
-/* Define HAVE_TIME_T if your system supports the "time_t" type. */
-#define HAVE_TIME_T 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define HAVE_UPPER_LOWER if you have isupper, islower, toupper, tolower. */
-#define HAVE_UPPER_LOWER 1
-
-/* Henry Spencer V8 regcomp() and regexp.h */
-/* #undef HAVE_V8_REGCOMP */
-
-/* Define to 1 if you have the <values.h> header file. */
-/* #undef HAVE_VALUES_H */
-
-/* Define HAVE_VOID if your compiler supports the "void" type. */
-#define HAVE_VOID 1
-
-/* Define HAVE_WCTYPE if you have iswupper, iswlower, towupper, towlower. */
-#define HAVE_WCTYPE 1
-
-/* Define to 1 if you have the <wctype.h> header file. */
-#define HAVE_WCTYPE_H 1
-
-/* Define to 1 if you have the `_setjmp' function. */
-#define HAVE__SETJMP 1
-
-/* Define MUST_DEFINE_ERRNO if you have errno but it is not define in errno.h.
- */
-/* #undef MUST_DEFINE_ERRNO */
-
-/* Define MUST_DEFINE_OSPEED if you have ospeed but it is not defined in
- termcap.h. */
-/* #undef MUST_DEFINE_OSPEED */
-
-/* pattern matching is supported, but without metacharacters. */
-/* #undef NO_REGEX */
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT ""
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "less"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "less 1"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "less"
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "1"
-
-/* Define as the return type of signal handlers (`int' or `void'). */
-#define RETSIGTYPE void
-
-/* Define SECURE_COMPILE=1 to build a secure version of less. */
-#define SECURE_COMPILE 0
-
-/* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
-/* #undef STAT_MACROS_BROKEN */
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#define TIME_WITH_SYS_TIME 1
-
-/* Number of bits in a file offset, on hosts where this is settable. */
-/* #undef _FILE_OFFSET_BITS */
-
-/* Define for large files, on AIX-style hosts. */
-/* #undef _LARGE_FILES */
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef const */
-
-/* Define to `long int' if <sys/types.h> does not define. */
-/* #undef off_t */
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-/* #undef size_t */
diff --git a/usr.bin/less/lesspipe.sh b/usr.bin/less/lesspipe.sh
deleted file mode 100644
index f8202ff..0000000
--- a/usr.bin/less/lesspipe.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#! /bin/sh
-# ex:ts=8
-
-# $FreeBSD$
-
-case "$1" in
- *.Z)
- exec uncompress -c "$1" 2>/dev/null
- ;;
- *.gz)
- exec gzip -d -c "$1" 2>/dev/null
- ;;
- *.bz2)
- exec bzip2 -d -c "$1" 2>/dev/null
- ;;
-esac
diff --git a/usr.bin/less/zless.sh b/usr.bin/less/zless.sh
deleted file mode 100644
index b947b81..0000000
--- a/usr.bin/less/zless.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-#
-# $FreeBSD$
-#
-
-export LESSOPEN="|/usr/bin/lesspipe.sh %s"
-exec /usr/bin/less "$@"
diff --git a/usr.bin/lessecho/Makefile b/usr.bin/lessecho/Makefile
deleted file mode 100644
index bb8d1a6..0000000
--- a/usr.bin/lessecho/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# $FreeBSD$
-
-PROG= lessecho
-SRCS= lessecho.c version.c
-CLEANFILES= lessecho.1
-
-.include "${.CURDIR}/../less/Makefile.common"
-.include <bsd.prog.mk>
diff --git a/usr.bin/lesskey/Makefile b/usr.bin/lesskey/Makefile
deleted file mode 100644
index b10bf6d..0000000
--- a/usr.bin/lesskey/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# $FreeBSD$
-
-PROG= lesskey
-SRCS= lesskey.c version.c
-CLEANFILES= lesskey.1
-
-.include "${.CURDIR}/../less/Makefile.common"
-.include <bsd.prog.mk>
diff --git a/usr.bin/lex/COPYING b/usr.bin/lex/COPYING
deleted file mode 100644
index dcb775e..0000000
--- a/usr.bin/lex/COPYING
+++ /dev/null
@@ -1,38 +0,0 @@
-Flex carries the copyright used for BSD software, slightly modified
-because it originated at the Lawrence Berkeley (not Livermore!) Laboratory,
-which operates under a contract with the Department of Energy:
-
- Copyright (c) 1990 The Regents of the University of California.
- All rights reserved.
-
- This code is derived from software contributed to Berkeley by
- Vern Paxson.
-
- The United States Government has rights in this work pursuant
- to contract no. DE-AC03-76SF00098 between the United States
- Department of Energy and the University of California.
-
- Redistribution and use in source and binary forms are permitted
- provided that: (1) source distributions retain this entire
- copyright notice and comment, and (2) distributions including
- binaries display the following acknowledgement: ``This product
- includes software developed by the University of California,
- Berkeley and its contributors'' in the documentation or other
- materials provided with the distribution and in all advertising
- materials mentioning features or use of this software. Neither the
- name of the University nor the names of its contributors may be
- used to endorse or promote products derived from this software
- without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE.
-
-This basically says "do whatever you please with this software except
-remove this notice or take advantage of the University's (or the flex
-authors') name".
-
-Note that the "flex.skl" scanner skeleton carries no copyright notice.
-You are free to do whatever you please with scanners generated using flex;
-for them, you are not even bound by the above copyright.
diff --git a/usr.bin/lex/FlexLexer.h b/usr.bin/lex/FlexLexer.h
deleted file mode 100644
index 12e8ec3..0000000
--- a/usr.bin/lex/FlexLexer.h
+++ /dev/null
@@ -1,186 +0,0 @@
-// $Header: /home/daffy/u0/vern/flex/RCS/FlexLexer.h,v 1.19 96/05/25 20:43:02 vern Exp $
-// $FreeBSD$
-
-// FlexLexer.h -- define interfaces for lexical analyzer classes generated
-// by flex
-
-// Copyright (c) 1993 The Regents of the University of California.
-// All rights reserved.
-//
-// This code is derived from software contributed to Berkeley by
-// Kent Williams and Tom Epperly.
-//
-// Redistribution and use in source and binary forms are permitted provided
-// that: (1) source distributions retain this entire copyright notice and
-// comment, and (2) distributions including binaries display the following
-// acknowledgement: ``This product includes software developed by the
-// University of California, Berkeley and its contributors'' in the
-// documentation or other materials provided with the distribution and in
-// all advertising materials mentioning features or use of this software.
-// Neither the name of the University nor the names of its contributors may
-// be used to endorse or promote products derived from this software without
-// specific prior written permission.
-// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
-// WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
-// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-
-// This file defines FlexLexer, an abstract class which specifies the
-// external interface provided to flex C++ lexer objects, and yyFlexLexer,
-// which defines a particular lexer class.
-//
-// If you want to create multiple lexer classes, you use the -P flag
-// to rename each yyFlexLexer to some other xxFlexLexer. You then
-// include <FlexLexer.h> in your other sources once per lexer class:
-//
-// #undef yyFlexLexer
-// #define yyFlexLexer xxFlexLexer
-// #include <FlexLexer.h>
-//
-// #undef yyFlexLexer
-// #define yyFlexLexer zzFlexLexer
-// #include <FlexLexer.h>
-// ...
-
-#ifndef __FLEX_LEXER_H
-// Never included before - need to define base class.
-#define __FLEX_LEXER_H
-#include <iostream>
-
-extern "C++" {
-
-struct yy_buffer_state;
-typedef int yy_state_type;
-
-class FlexLexer {
-public:
- virtual ~FlexLexer() { }
-
- const char* YYText() { return yytext; }
- int YYLeng() { return yyleng; }
-
- virtual void
- yy_switch_to_buffer( struct yy_buffer_state* new_buffer ) = 0;
- virtual struct yy_buffer_state*
- yy_create_buffer( std::istream* s, int size ) = 0;
- virtual void yy_delete_buffer( struct yy_buffer_state* b ) = 0;
- virtual void yyrestart( std::istream* s ) = 0;
-
- virtual int yylex() = 0;
-
- // Call yylex with new input/output sources.
- int yylex( std::istream* new_in, std::ostream* new_out = 0 )
- {
- switch_streams( new_in, new_out );
- return yylex();
- }
-
- // Switch to new input/output streams. A nil stream pointer
- // indicates "keep the current one".
- virtual void switch_streams( std::istream* new_in = 0,
- std::ostream* new_out = 0 ) = 0;
-
- int lineno() const { return yylineno; }
-
- int debug() const { return yy_flex_debug; }
- void set_debug( int flag ) { yy_flex_debug = flag; }
-
-protected:
- char* yytext;
- int yyleng;
- int yylineno; // only maintained if you use %option yylineno
- int yy_flex_debug; // only has effect with -d or "%option debug"
-};
-
-}
-#endif
-
-#if defined(yyFlexLexer) || ! defined(yyFlexLexerOnce)
-// Either this is the first time through (yyFlexLexerOnce not defined),
-// or this is a repeated include to define a different flavor of
-// yyFlexLexer, as discussed in the flex man page.
-#define yyFlexLexerOnce
-
-class yyFlexLexer : public FlexLexer {
-public:
- // arg_yyin and arg_yyout default to the cin and cout, but we
- // only make that assignment when initializing in yylex().
- yyFlexLexer( std::istream* arg_yyin = 0, std::ostream* arg_yyout = 0 );
-
- virtual ~yyFlexLexer();
-
- void yy_switch_to_buffer( struct yy_buffer_state* new_buffer );
- struct yy_buffer_state* yy_create_buffer( std::istream* s, int size );
- void yy_delete_buffer( struct yy_buffer_state* b );
- void yyrestart( std::istream* s );
-
- virtual int yylex();
- virtual void switch_streams( std::istream* new_in, std::ostream* new_out );
-
-protected:
- virtual int LexerInput( char* buf, int max_size );
- virtual void LexerOutput( const char* buf, int size );
- virtual void LexerError( const char* msg );
-
- void yyunput( int c, char* buf_ptr );
- int yyinput();
-
- void yy_load_buffer_state();
- void yy_init_buffer( struct yy_buffer_state* b, std::istream* s );
- void yy_flush_buffer( struct yy_buffer_state* b );
-
- int yy_start_stack_ptr;
- int yy_start_stack_depth;
- int* yy_start_stack;
-
- void yy_push_state( int new_state );
- void yy_pop_state();
- int yy_top_state();
-
- yy_state_type yy_get_previous_state();
- yy_state_type yy_try_NUL_trans( yy_state_type current_state );
- int yy_get_next_buffer();
-
- std::istream* yyin; // input source for default LexerInput
- std::ostream* yyout; // output sink for default LexerOutput
-
- struct yy_buffer_state* yy_current_buffer;
-
- // yy_hold_char holds the character lost when yytext is formed.
- char yy_hold_char;
-
- // Number of characters read into yy_ch_buf.
- int yy_n_chars;
-
- // Points to current character in buffer.
- char* yy_c_buf_p;
-
- int yy_init; // whether we need to initialize
- int yy_start; // start state number
-
- // Flag which is used to allow yywrap()'s to do buffer switches
- // instead of setting up a fresh yyin. A bit of a hack ...
- int yy_did_buffer_switch_on_eof;
-
- // The following are not always needed, but may be depending
- // on use of certain flex features (like REJECT or yymore()).
-
- yy_state_type yy_last_accepting_state;
- char* yy_last_accepting_cpos;
-
- yy_state_type* yy_state_buf;
- yy_state_type* yy_state_ptr;
-
- char* yy_full_match;
- int* yy_full_state;
- int yy_full_lp;
-
- int yy_lp;
- int yy_looking_for_trail_begin;
-
- int yy_more_flag;
- int yy_more_len;
- int yy_more_offset;
- int yy_prev_more_offset;
-};
-
-#endif
diff --git a/usr.bin/lex/Makefile b/usr.bin/lex/Makefile
deleted file mode 100644
index 6d0ea5b..0000000
--- a/usr.bin/lex/Makefile
+++ /dev/null
@@ -1,48 +0,0 @@
-# $FreeBSD$
-#
-# By default, flex will be configured to generate 8-bit scanners only if the
-# -8 flag is given. If you want it to always generate 8-bit scanners, add
-# "-DDEFAULT_CSIZE=256" to CFLAGS. Note that doing so will double the size
-# of all uncompressed scanners.
-#
-# Bootstrapping of lex is handled automatically.
-# Also note that flex.skel no longer gets installed.
-#
-
-PROG= lex
-LINKS+= ${BINDIR}/lex ${BINDIR}/lex++
-LINKS+= ${BINDIR}/lex ${BINDIR}/flex
-LINKS+= ${BINDIR}/lex ${BINDIR}/flex++
-
-SRCS= scan.c ccl.c dfa.c ecs.c gen.c main.c misc.c nfa.c parse.y \
- skel.c sym.c tblcmp.c yylex.c
-LFLAGS+= -is
-CFLAGS+= -I. -I${.CURDIR}
-INCS= FlexLexer.h
-INCSDIR= ${INCLUDEDIR}
-MLINKS+= lex.1 flex.1
-MLINKS+= lex.1 flex++.1
-MLINKS+= lex.1 lex++.1
-
-CLEANFILES= scan.c skel.c
-
-SUBDIR= lib
-
-skel.c: mkskel.sh flex.skl
- sh ${.CURDIR}/mkskel.sh ${.CURDIR}/flex.skl > skel.c
-
-bootstrap: initscan.c
- @cmp -s ${.CURDIR}/initscan.c scan.c || { \
- echo "Bootstrapping flex" ; \
- rm -f scan.c ; \
- cp -f ${.CURDIR}/initscan.c scan.c ; \
- }
-
-test: check
-check: $(PROG)
- ./$(PROG) $(LFLAGS) -t $(COMPRESSION) $(.CURDIR)/scan.l \
- | sed s,\"$(.CURDIR)/scan.l",\"scan.l", \
- | diff $(.CURDIR)/initscan.c -
- @echo "Check successful"
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/lex/NEWS b/usr.bin/lex/NEWS
deleted file mode 100644
index 3e23e7d..0000000
--- a/usr.bin/lex/NEWS
+++ /dev/null
@@ -1,1233 +0,0 @@
-Changes between release 2.5.4 (11Sep96) and release 2.5.3:
-
- - Fixed a bug introduced in 2.5.3 that blew it when a call
- to input() occurred at the end of an input file.
-
- - Fixed scanner skeleton so the example in the man page of
- scanning strings using exclusive start conditions works.
-
- - Minor Makefile tweaks.
-
-
-Changes between release 2.5.3 (29May96) and release 2.5.2:
-
- - Some serious bugs in yymore() have been fixed. In particular,
- when using AT&T-lex-compatibility or %array, you can intermix
- calls to input(), unput(), and yymore(). (This still doesn't
- work for %pointer, and isn't likely to in the future.)
-
- - A bug in handling NUL's in the input stream of scanners using
- REJECT has been fixed.
-
- - The default main() in libfl.a now repeatedly calls yylex() until
- it returns 0, rather than just calling it once.
-
- - Minor tweak for Windows NT Makefile, MISC/NT/Makefile.
-
-
-Changes between release 2.5.2 (25Apr95) and release 2.5.1:
-
- - The --prefix configuration option now works.
-
- - A bug that completely broke the "-Cf" table compression
- option has been fixed.
-
- - A major headache involving "const" declarators and Solaris
- systems has been fixed.
-
- - An octal escape sequence in a flex regular expression must
- now contain only the digits 0-7.
-
- - You can now use "--" on the flex command line to mark the
- end of flex options.
-
- - You can now specify the filename '-' as a synonym for stdin.
-
- - By default, the scanners generated by flex no longer
- statically initialize yyin and yyout to stdin and stdout.
- This change is necessary because in some ANSI environments,
- stdin and stdout are not compile-time constant. You can
- force the initialization using "%option stdinit" in the first
- section of your flex input.
-
- - "%option nounput" now correctly omits the unput() routine
- from the output.
-
- - "make clean" now removes config.log, config.cache, and the
- flex binary. The fact that it removes the flex binary means
- you should take care if making changes to scan.l, to make
- sure you don't wind up in a bootstrap problem.
-
- - In general, the Makefile has been reworked somewhat (thanks
- to Francois Pinard) for added flexibility - more changes will
- follow in subsequent releases.
-
- - The .texi and .info files in MISC/texinfo/ have been updated,
- thanks also to Francois Pinard.
-
- - The FlexLexer::yylex(istream* new_in, ostream* new_out) method
- now does not have a default for the first argument, to disambiguate
- it from FlexLexer::yylex().
-
- - A bug in destructing a FlexLexer object before doing any scanning
- with it has been fixed.
-
- - A problem with including FlexLexer.h multiple times has been fixed.
-
- - The alloca() chud necessary to accommodate bison has grown
- even uglier, but hopefully more correct.
-
- - A portability tweak has been added to accommodate compilers that
- use char* generic pointers.
-
- - EBCDIC contact information in the file MISC/EBCDIC has been updated.
-
- - An OS/2 Makefile and config.h for flex 2.5 is now available in
- MISC/OS2/, contributed by Kai Uwe Rommel.
-
- - The descrip.mms file for building flex under VMS has been updated,
- thanks to Pat Rankin.
-
- - The notes on building flex for the Amiga have been updated for
- flex 2.5, contributed by Andreas Scherer.
-
-
-Changes between release 2.5.1 (28Mar95) and release 2.4.7:
-
- - A new concept of "start condition" scope has been introduced.
- A start condition scope is begun with:
-
- <SCs>{
-
- where SCs is a list of one or more start conditions. Inside
- the start condition scope, every rule automatically has the
- prefix <SCs> applied to it, until a '}' which matches the
- initial '{'. So, for example:
-
- <ESC>{
- "\\n" return '\n';
- "\\r" return '\r';
- "\\f" return '\f';
- "\\0" return '\0';
- }
-
- is equivalent to:
-
- <ESC>"\\n" return '\n';
- <ESC>"\\r" return '\r';
- <ESC>"\\f" return '\f';
- <ESC>"\\0" return '\0';
-
- As indicated in this example, rules inside start condition scopes
- (and any rule, actually, other than the first) can be indented,
- to better show the extent of the scope.
-
- Start condition scopes may be nested.
-
- - The new %option directive can be used in the first section of
- a flex scanner to control scanner-generation options. Most
- options are given simply as names, optionally preceded by the
- word "no" (with no intervening whitespace) to negate their
- meaning. Some are equivalent to flex flags, so putting them
- in your scanner source is equivalent to always specifying
- the flag (%option's take precedence over flags):
-
- 7bit -7 option
- 8bit -8 option
- align -Ca option
- backup -b option
- batch -B option
- c++ -+ option
- caseful opposite of -i option (caseful is the default);
- case-sensitive same as above
- caseless -i option;
- case-insensitive same as above
- debug -d option
- default opposite of -s option
- ecs -Ce option
- fast -F option
- full -f option
- interactive -I option
- lex-compat -l option
- meta-ecs -Cm option
- perf-report -p option
- read -Cr option
- stdout -t option
- verbose -v option
- warn opposite of -w option (so use "%option nowarn" for -w)
-
- array equivalent to "%array"
- pointer equivalent to "%pointer" (default)
-
- Some provide new features:
-
- always-interactive generate a scanner which always
- considers its input "interactive" (no call to isatty()
- will be made when the scanner runs)
- main supply a main program for the scanner, which
- simply calls yylex(). Implies %option noyywrap.
- never-interactive generate a scanner which never
- considers its input "interactive" (no call to isatty()
- will be made when the scanner runs)
- stack if set, enable start condition stacks (see below)
- stdinit if unset ("%option nostdinit"), initialize yyin
- and yyout statically to nil FILE* pointers, instead
- of stdin and stdout
- yylineno if set, keep track of the current line
- number in global yylineno (this option is expensive
- in terms of performance). The line number is available
- to C++ scanning objects via the new member function
- lineno().
- yywrap if unset ("%option noyywrap"), scanner does not
- call yywrap() upon EOF but simply assumes there
- are no more files to scan
-
- Flex scans your rule actions to determine whether you use the
- REJECT or yymore features (this is not new). Two %options can be
- used to override its decision, either by setting them to indicate
- the feature is indeed used, or unsetting them to indicate it
- actually is not used:
-
- reject
- yymore
-
- Three %option's take string-delimited values, offset with '=':
-
- outfile="<name>" equivalent to -o<name>
- prefix="<name>" equivalent to -P<name>
- yyclass="<name>" set the name of the C++ scanning class
- (see below)
-
- A number of %option's are available for lint purists who
- want to suppress the appearance of unneeded routines in
- the generated scanner. Each of the following, if unset,
- results in the corresponding routine not appearing in the
- generated scanner:
-
- input, unput
- yy_push_state, yy_pop_state, yy_top_state
- yy_scan_buffer, yy_scan_bytes, yy_scan_string
-
- You can specify multiple options with a single %option directive,
- and multiple directives in the first section of your flex input file.
-
- - The new function:
-
- YY_BUFFER_STATE yy_scan_string( const char *str )
-
- returns a YY_BUFFER_STATE (which also becomes the current input
- buffer) for scanning the given string, which occurs starting
- with the next call to yylex(). The string must be NUL-terminated.
- A related function:
-
- YY_BUFFER_STATE yy_scan_bytes( const char *bytes, int len )
-
- creates a buffer for scanning "len" bytes (including possibly NUL's)
- starting at location "bytes".
-
- Note that both of these functions create and scan a *copy* of
- the string/bytes. (This may be desirable, since yylex() modifies
- the contents of the buffer it is scanning.) You can avoid the
- copy by using:
-
- YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
-
- which scans in place the buffer starting at "base", consisting
- of "size" bytes, the last two bytes of which *must* be
- YY_END_OF_BUFFER_CHAR (these bytes are not scanned; thus, scanning
- consists of base[0] through base[size-2], inclusive). If you
- fail to set up "base" in this manner, yy_scan_buffer returns a
- nil pointer instead of creating a new input buffer.
-
- The type yy_size_t is an integral type to which you can cast
- an integer expression reflecting the size of the buffer.
-
- - Three new routines are available for manipulating stacks of
- start conditions:
-
- void yy_push_state( int new_state )
-
- pushes the current start condition onto the top of the stack
- and BEGIN's "new_state" (recall that start condition names are
- also integers).
-
- void yy_pop_state()
-
- pops the top of the stack and BEGIN's to it, and
-
- int yy_top_state()
-
- returns the top of the stack without altering the stack's
- contents.
-
- The start condition stack grows dynamically and so has no built-in
- size limitation. If memory is exhausted, program execution
- is aborted.
-
- To use start condition stacks, your scanner must include
- a "%option stack" directive.
-
- - flex now supports POSIX character class expressions. These
- are expressions enclosed inside "[:" and ":]" delimiters (which
- themselves must appear between the '[' and ']' of a character
- class; other elements may occur inside the character class, too).
- The expressions flex recognizes are:
-
- [:alnum:] [:alpha:] [:blank:] [:cntrl:] [:digit:] [:graph:]
- [:lower:] [:print:] [:punct:] [:space:] [:upper:] [:xdigit:]
-
- These expressions all designate a set of characters equivalent to
- the corresponding isXXX function (for example, [:alnum:] designates
- those characters for which isalnum() returns true - i.e., any
- alphabetic or numeric). Some systems don't provide isblank(),
- so flex defines [:blank:] as a blank or a tab.
-
- For example, the following character classes are all equivalent:
-
- [[:alnum:]]
- [[:alpha:][:digit:]
- [[:alpha:]0-9]
- [a-zA-Z0-9]
-
- If your scanner is case-insensitive (-i flag), then [:upper:]
- and [:lower:] are equivalent to [:alpha:].
-
- - The promised rewrite of the C++ FlexLexer class has not yet
- been done. Support for FlexLexer is limited at the moment to
- fixing show-stopper bugs, so, for example, the new functions
- yy_scan_string() & friends are not available to FlexLexer
- objects.
-
- - The new macro
-
- yy_set_interactive(is_interactive)
-
- can be used to control whether the current buffer is considered
- "interactive". An interactive buffer is processed more slowly,
- but must be used when the scanner's input source is indeed
- interactive to avoid problems due to waiting to fill buffers
- (see the discussion of the -I flag in flex.1). A non-zero value
- in the macro invocation marks the buffer as interactive, a zero
- value as non-interactive. Note that use of this macro overrides
- "%option always-interactive" or "%option never-interactive".
-
- yy_set_interactive() must be invoked prior to beginning to
- scan the buffer.
-
- - The new macro
-
- yy_set_bol(at_bol)
-
- can be used to control whether the current buffer's scanning
- context for the next token match is done as though at the
- beginning of a line (non-zero macro argument; makes '^' anchored
- rules active) or not at the beginning of a line (zero argument,
- '^' rules inactive).
-
- - Related to this change, the mechanism for determining when a scan is
- starting at the beginning of a line has changed. It used to be
- that '^' was active iff the character prior to that at which the
- scan started was a newline. The mechanism now is that '^' is
- active iff the last token ended in a newline (or the last call to
- input() returned a newline). For most users, the difference in
- mechanisms is negligible. Where it will make a difference,
- however, is if unput() or yyless() is used to alter the input
- stream. When in doubt, use yy_set_bol().
-
- - The new beginning-of-line mechanism involved changing some fairly
- twisted code, so it may have introduced bugs - beware ...
-
- - The macro YY_AT_BOL() returns true if the next token scanned from
- the current buffer will have '^' rules active, false otherwise.
-
- - The new function
-
- void yy_flush_buffer( struct yy_buffer_state* b )
-
- flushes the contents of the current buffer (i.e., next time
- the scanner attempts to match a token using b as the current
- buffer, it will begin by invoking YY_INPUT to fill the buffer).
- This routine is also available to C++ scanners (unlike some
- of the other new routines).
-
- The related macro
-
- YY_FLUSH_BUFFER
-
- flushes the contents of the current buffer.
-
- - A new "-ooutput" option writes the generated scanner to "output".
- If used with -t, the scanner is still written to stdout, but
- its internal #line directives (see previous item) use "output".
-
- - Flex now generates #line directives relating the code it
- produces to the output file; this means that error messages
- in the flex-generated code should be correctly pinpointed.
-
- - When generating #line directives, filenames with embedded '\'s
- have those characters escaped (i.e., turned into '\\'). This
- feature helps with reporting filenames for some MS-DOS and OS/2
- systems.
-
- - The FlexLexer class includes two new public member functions:
-
- virtual void switch_streams( istream* new_in = 0,
- ostream* new_out = 0 )
-
- reassigns yyin to new_in (if non-nil) and yyout to new_out
- (ditto), deleting the previous input buffer if yyin is
- reassigned. It is used by:
-
- int yylex( istream* new_in = 0, ostream* new_out = 0 )
-
- which first calls switch_streams() and then returns the value
- of calling yylex().
-
- - C++ scanners now have yy_flex_debug as a member variable of
- FlexLexer rather than a global, and member functions for testing
- and setting it.
-
- - When generating a C++ scanning class, you can now use
-
- %option yyclass="foo"
-
- to inform flex that you have derived "foo" as a subclass of
- yyFlexLexer, so flex will place your actions in the member
- function foo::yylex() instead of yyFlexLexer::yylex(). It also
- generates a yyFlexLexer::yylex() member function that generates a
- run-time error if called (by invoking yyFlexLexer::LexerError()).
- This feature is necessary if your subclass "foo" introduces some
- additional member functions or variables that you need to access
- from yylex().
-
- - Current texinfo files in MISC/texinfo, contributed by Francois
- Pinard.
-
- - You can now change the name "flex" to something else (e.g., "lex")
- by redefining $(FLEX) in the Makefile.
-
- - Two bugs (one serious) that could cause "bigcheck" to fail have
- been fixed.
-
- - A number of portability/configuration changes have been made
- for easier portability.
-
- - You can use "YYSTATE" in your scanner as an alias for YY_START
- (for AT&T lex compatibility).
-
- - input() now maintains yylineno.
-
- - input() no longer trashes yytext.
-
- - interactive scanners now read characters in YY_INPUT up to a
- newline, a large performance gain.
-
- - C++ scanner objects now work with the -P option. You include
- <FlexLexer.h> once per scanner - see comments in <FlexLexer.h>
- (or flex.1) for details.
-
- - C++ FlexLexer objects now use the "cerr" stream to report -d output
- instead of stdio.
-
- - The -c flag now has its full glorious POSIX interpretation (do
- nothing), rather than being interpreted as an old-style -C flag.
-
- - Scanners generated by flex now include two #define's giving
- the major and minor version numbers (YY_FLEX_MAJOR_VERSION,
- YY_FLEX_MINOR_VERSION). These can then be tested to see
- whether certain flex features are available.
-
- - Scanners generated using -l lex compatibility now have the symbol
- YY_FLEX_LEX_COMPAT #define'd.
-
- - When initializing (i.e., yy_init is non-zero on entry to yylex()),
- generated scanners now set yy_init to zero before executing
- YY_USER_INIT. This means that you can set yy_init back to a
- non-zero value in YY_USER_INIT if you need the scanner to be
- reinitialized on the next call.
-
- - You can now use "#line" directives in the first section of your
- scanner specification.
-
- - When generating full-table scanners (-Cf), flex now puts braces
- around each row of the 2-d array initialization, to silence warnings
- on over-zealous compilers.
-
- - Improved support for MS-DOS. The flex sources have been successfully
- built, unmodified, for Borland 4.02 (all that's required is a
- Borland Makefile and config.h file, which are supplied in
- MISC/Borland - contributed by Terrence O Kane).
-
- - Improved support for Macintosh using Think C - the sources should
- build for this platform "out of the box". Contributed by Scott
- Hofmann.
-
- - Improved support for VMS, in MISC/VMS/, contributed by Pat Rankin.
-
- - Support for the Amiga, in MISC/Amiga/, contributed by Andreas
- Scherer. Note that the contributed files were developed for
- flex 2.4 and have not been tested with flex 2.5.
-
- - Some notes on support for the NeXT, in MISC/NeXT, contributed
- by Raf Schietekat.
-
- - The MISC/ directory now includes a preformatted version of flex.1
- in flex.man, and pre-yacc'd versions of parse.y in parse.{c,h}.
-
- - The flex.1 and flexdoc.1 manual pages have been merged. There
- is now just one document, flex.1, which includes an overview
- at the beginning to help you find the section you need.
-
- - Documentation now clarifies that start conditions persist across
- switches to new input files or different input buffers. If you
- want to e.g., return to INITIAL, you must explicitly do so.
-
- - The "Performance Considerations" section of the manual has been
- updated.
-
- - Documented the "yy_act" variable, which when YY_USER_ACTION is
- invoked holds the number of the matched rule, and added an
- example of using yy_act to profile how often each rule is matched.
-
- - Added YY_NUM_RULES, a definition that gives the total number
- of rules in the file, including the default rule (even if you
- use -s).
-
- - Documentation now clarifies that you can pass a nil FILE* pointer
- to yy_create_buffer() or yyrestart() if you've arrange YY_INPUT
- to not need yyin.
-
- - Documentation now clarifies that YY_BUFFER_STATE is a pointer to
- an opaque "struct yy_buffer_state".
-
- - Documentation now stresses that you gain the benefits of removing
- backing-up states only if you remove *all* of them.
-
- - Documentation now points out that traditional lex allows you
- to put the action on a separate line from the rule pattern if
- the pattern has trailing whitespace (ugh!), but flex doesn't
- support this.
-
- - A broken example in documentation of the difference between
- inclusive and exclusive start conditions is now fixed.
-
- - Usage (-h) report now goes to stdout.
-
- - Version (-V) info now goes to stdout.
-
- - More #ifdef chud has been added to the parser in attempt to
- deal with bison's use of alloca().
-
- - "make clean" no longer deletes emacs backup files (*~).
-
- - Some memory leaks have been fixed.
-
- - A bug was fixed in which dynamically-expanded buffers were
- reallocated a couple of bytes too small.
-
- - A bug was fixed which could cause flex to read and write beyond
- the end of the input buffer.
-
- - -S will not be going away.
-
-
-Changes between release 2.4.7 (03Aug94) and release 2.4.6:
-
- - Fixed serious bug in reading multiple files.
-
- - Fixed bug in scanning NUL's.
-
- - Fixed bug in input() returning 8-bit characters.
-
- - Fixed bug in matching text with embedded NUL's when
- using %array or lex compatibility.
-
- - Fixed multiple invocations of YY_USER_ACTION when using '|'
- continuation action.
-
- - Minor prototyping fixes.
-
-Changes between release 2.4.6 (04Jan94) and release 2.4.5:
-
- - Linking with -lfl no longer required if your program includes
- its own yywrap() and main() functions. (This change will cause
- problems if you have a non-ANSI compiler on a system for which
- sizeof(int) != sizeof(void*) or sizeof(int) != sizeof(size_t).)
-
- - The use of 'extern "C++"' in FlexLexer.h has been modified to
- get around an incompatibility with g++'s header files.
-
-Changes between release 2.4.5 (11Dec93) and release 2.4.4:
-
- - Fixed bug breaking C++ scanners that use REJECT or variable
- trailing context.
-
- - Fixed serious input problem for interactive scanners on
- systems for which char is unsigned.
-
- - Fixed bug in incorrectly treating '$' operator as variable
- trailing context.
-
- - Fixed bug in -CF table representation that could lead to
- corrupt tables.
-
- - Fixed fairly benign memory leak.
-
- - Added `extern "C++"' wrapper to FlexLexer.h header. This
- should overcome the g++ 2.5.X problems mentioned in the
- NEWS for release 2.4.3.
-
- - Changed #include of FlexLexer.h to use <> instead of "".
-
- - Added feature to control whether the scanner attempts to
- refill the input buffer once it's exhausted. This feature
- will be documented in the 2.5 release.
-
-
-Changes between release 2.4.4 (07Dec93) and release 2.4.3:
-
- - Fixed two serious bugs in scanning 8-bit characters.
-
- - Fixed bug in YY_USER_ACTION that caused it to be executed
- inappropriately (on the scanner's own internal actions, and
- with incorrect yytext/yyleng values).
-
- - Fixed bug in pointing yyin at a new file and resuming scanning.
-
- - Portability fix regarding min/max/abs macros conflicting with
- function definitions in standard header files.
-
- - Added a virtual LexerError() method to the C++ yyFlexLexer class
- for reporting error messages instead of always using cerr.
-
- - Added warning in flexdoc that the C++ scanning class is presently
- experimental and subject to considerable change between major
- releases.
-
-
-Changes between release 2.4.3 (03Dec93) and release 2.4.2:
-
- - Fixed bug causing fatal scanner messages to fail to print.
-
- - Fixed things so FlexLexer.h can be included in other C++
- sources. One side-effect of this change is that -+ and -CF
- are now incompatible.
-
- - libfl.a now supplies private versions of the the <string.h>/
- <strings.h> string routines needed by flex and the scanners
- it generates, to enhance portability to some BSD systems.
-
- - More robust solution to 2.4.2's flexfatal() bug fix.
-
- - Added ranlib of installed libfl.a.
-
- - Some lint tweaks.
-
- - NOTE: problems have been encountered attempting to build flex
- C++ scanners using g++ version 2.5.X. The problem is due to an
- unfortunate heuristic in g++ 2.5.X that attempts to discern between
- C and C++ headers. Because FlexLexer.h is installed (by default)
- in /usr/local/include and not /usr/local/lib/g++-include, g++ 2.5.X
- decides that it's a C header :-(. So if you have problems, install
- the header in /usr/local/lib/g++-include instead.
-
-
-Changes between release 2.4.2 (01Dec93) and release 2.4.1:
-
- - Fixed bug in libfl.a referring to non-existent "flexfatal" function.
-
- - Modified to produce both compress'd and gzip'd tar files for
- distributions (you probably don't care about this change!).
-
-
-Changes between release 2.4.1 (30Nov93) and release 2.3.8:
-
- - The new '-+' flag instructs flex to generate a C++ scanner class
- (thanks to Kent Williams). flex writes an implementation of the
- class defined in FlexLexer.h to lex.yy.cc. You may include
- multiple scanner classes in your program using the -P flag. Note
- that the scanner class also provides a mechanism for creating
- reentrant scanners. The scanner class uses C++ streams for I/O
- instead of FILE*'s (thanks to Tom Epperly). If the flex executable's
- name ends in '+' then the '-+' flag is automatically on, so creating
- a symlink or copy of "flex" to "flex++" results in a version of
- flex that can be used exclusively for C++ scanners.
-
- Note that without the '-+' flag, flex-generated scanners can still
- be compiled using C++ compilers, though they use FILE*'s for I/O
- instead of streams.
-
- See the "GENERATING C++ SCANNERS" section of flexdoc for details.
-
- - The new '-l' flag turns on maximum AT&T lex compatibility. In
- particular, -l includes support for "yylineno" and makes yytext
- be an array instead of a pointer. It does not, however, do away
- with all incompatibilities. See the "INCOMPATIBILITIES WITH LEX
- AND POSIX" section of flexdoc for details.
-
- - The new '-P' option specifies a prefix to use other than "yy"
- for the scanner's globally-visible variables, and for the
- "lex.yy.c" filename. Using -P you can link together multiple
- flex scanners in the same executable.
-
- - The distribution includes a "texinfo" version of flexdoc.1,
- contributed by Roland Pesch (thanks also to Marq Kole, who
- contributed another version). It has not been brought up to
- date, but reflects version 2.3. See MISC/flex.texinfo.
-
- The flex distribution will soon include G.T. Nicol's flex
- manual; he is presently bringing it up-to-date for version 2.4.
-
- - yywrap() is now a function, and you now *must* link flex scanners
- with libfl.a.
-
- - Site-configuration is now done via an autoconf-generated
- "configure" script contributed by Francois Pinard.
-
- - Scanners now use fread() (or getc(), if interactive) and not
- read() for input. A new "table compression" option, -Cr,
- overrides this change and causes the scanner to use read()
- (because read() is a bit faster than fread()). -f and -F
- are now equivalent to -Cfr and -CFr; i.e., they imply the
- -Cr option.
-
- - In the blessed name of POSIX compliance, flex supports "%array"
- and "%pointer" directives in the definitions (first) section of
- the scanner specification. The former specifies that yytext
- should be an array (of size YYLMAX), the latter, that it should
- be a pointer. The array version of yytext is universally slower
- than the pointer version, but has the advantage that its contents
- remain unmodified across calls to input() and unput() (the pointer
- version of yytext is, still, trashed by such calls).
-
- "%array" cannot be used with the '-+' C++ scanner class option.
-
- - The new '-Ca' option directs flex to trade off memory for
- natural alignment when generating a scanner's tables. In
- particular, table entries that would otherwise be "short"
- become "long".
-
- - The new '-h' option produces a summary of the flex flags.
-
- - The new '-V' option reports the flex version number and exits.
-
- - The new scanner macro YY_START returns an integer value
- corresponding to the current start condition. You can return
- to that start condition by passing the value to a subsequent
- "BEGIN" action. You also can implement "start condition stacks"
- by storing the values in an integer stack.
-
- - You can now redefine macros such as YY_INPUT by just #define'ing
- them to some other value in the first section of the flex input;
- no need to first #undef them.
-
- - flex now generates warnings for rules that can't be matched.
- These warnings can be turned off using the new '-w' flag. If
- your scanner uses REJECT then you will not get these warnings.
-
- - If you specify the '-s' flag but the default rule can be matched,
- flex now generates a warning.
-
- - "yyleng" is now a global, and may be modified by the user (though
- doing so and then using yymore() will yield weird results).
-
- - Name definitions in the first section of a scanner specification
- can now include a leading '^' or trailing '$' operator. In this
- case, the definition is *not* pushed back inside of parentheses.
-
- - Scanners with compressed tables are now "interactive" (-I option)
- by default. You can suppress this attribute (which makes them
- run slightly slower) using the new '-B' flag.
-
- - Flex now generates 8-bit scanners by default, unless you use the
- -Cf or -CF compression options (-Cfe and -CFe result in 8-bit
- scanners). You can force it to generate a 7-bit scanner using
- the new '-7' flag. You can build flex to generate 8-bit scanners
- for -Cf and -CF, too, by adding -DDEFAULT_CSIZE=256 to CFLAGS
- in the Makefile.
-
- - You no longer need to call the scanner routine yyrestart() to
- inform the scanner that you have switched to a new file after
- having seen an EOF on the current input file. Instead, just
- point yyin at the new file and continue scanning.
-
- - You no longer need to invoke YY_NEW_FILE in an <<EOF>> action
- to indicate you wish to continue scanning. Simply point yyin
- at a new file.
-
- - A leading '#' no longer introduces a comment in a flex input.
-
- - flex no longer considers formfeed ('\f') a whitespace character.
-
- - %t, I'm happy to report, has been nuked.
-
- - The '-p' option may be given twice ('-pp') to instruct flex to
- report minor performance problems as well as major ones.
-
- - The '-v' verbose output no longer includes start/finish time
- information.
-
- - Newlines in flex inputs can optionally include leading or
- trailing carriage-returns ('\r'), in support of several PC/Mac
- run-time libraries that automatically include these.
-
- - A start condition of the form "<*>" makes the following rule
- active in every start condition, whether exclusive or inclusive.
-
- - The following items have been corrected in the flex documentation:
-
- - '-C' table compression options *are* cumulative.
-
- - You may modify yytext but not lengthen it by appending
- characters to the end. Modifying its final character
- will affect '^' anchoring for the next rule matched
- if the character is changed to or from a newline.
-
- - The term "backtracking" has been renamed "backing up",
- since it is a one-time repositioning and not a repeated
- search. What used to be the "lex.backtrack" file is now
- "lex.backup".
-
- - Unindented "/* ... */" comments are allowed in the first
- flex input section, but not in the second.
-
- - yyless() can only be used in the flex input source, not
- externally.
-
- - You can use "yyrestart(yyin)" to throw away the
- current contents of the input buffer.
-
- - To write high-speed scanners, attempt to match as much
- text as possible with each rule. See MISC/fastwc/README
- for more information.
-
- - Using the beginning-of-line operator ('^') is fairly
- cheap. Using unput() is expensive. Using yyless() is
- cheap.
-
- - An example of scanning strings with embedded escape
- sequences has been added.
-
- - The example of backing-up in flexdoc was erroneous; it
- has been corrected.
-
- - A flex scanner's internal buffer now dynamically grows if needed
- to match large tokens. Note that growing the buffer presently
- requires rescanning the (large) token, so consuming a lot of
- text this way is a slow process. Also note that presently the
- buffer does *not* grow if you unput() more text than can fit
- into the buffer.
-
- - The MISC/ directory has been reorganized; see MISC/README for
- details.
-
- - yyless() can now be used in the third (user action) section
- of a scanner specification, thanks to Ceriel Jacobs. yyless()
- remains a macro and cannot be used outside of the scanner source.
-
- - The skeleton file is no longer opened at run-time, but instead
- compiled into a large string array (thanks to John Gilmore and
- friends at Cygnus). You can still use the -S flag to point flex
- at a different skeleton file.
-
- - flex no longer uses a temporary file to store the scanner's
- actions.
-
- - A number of changes have been made to decrease porting headaches.
- In particular, flex no longer uses memset() or ctime(), and
- provides a single simple mechanism for dealing with C compilers
- that still define malloc() as returning char* instead of void*.
-
- - Flex now detects if the scanner specification requires the -8 flag
- but the flag was not given or on by default.
-
- - A number of table-expansion fencepost bugs have been fixed,
- making flex more robust for generating large scanners.
-
- - flex more consistently identifies the location of errors in
- its input.
-
- - YY_USER_ACTION is now invoked only for "real" actions, not for
- internal actions used by the scanner for things like filling
- the buffer or handling EOF.
-
- - The rule "[^]]" now matches any character other than a ']';
- formerly it matched any character at all followed by a ']'.
- This change was made for compatibility with AT&T lex.
-
- - A large number of miscellaneous bugs have been found and fixed
- thanks to Gerhard Wilhelms.
-
- - The source code has been heavily reformatted, making patches
- relative to previous flex releases no longer accurate.
-
-
-Changes between 2.3 Patch #8 (21Feb93) and 2.3 Patch #7:
-
- - Fixed bugs in dynamic memory allocation leading to grievous
- fencepost problems when generating large scanners.
- - Fixed bug causing infinite loops on character classes with 8-bit
- characters in them.
- - Fixed bug in matching repetitions with a lower bound of 0.
- - Fixed bug in scanning NUL characters using an "interactive" scanner.
- - Fixed bug in using yymore() at the end of a file.
- - Fixed bug in misrecognizing rules with variable trailing context.
- - Fixed bug compiling flex on Suns using gcc 2.
- - Fixed bug in not recognizing that input files with the character
- ASCII 128 in them require the -8 flag.
- - Fixed bug that could cause an infinite loop writing out
- error messages.
- - Fixed bug in not recognizing old-style lex % declarations if
- followed by a tab instead of a space.
- - Fixed potential crash when flex terminated early (usually due
- to a bad flag) and the -v flag had been given.
- - Added some missing declarations of void functions.
- - Changed to only use '\a' for __STDC__ compilers.
- - Updated mailing addresses.
-
-
-Changes between 2.3 Patch #7 (28Mar91) and 2.3 Patch #6:
-
- - Fixed out-of-bounds array access that caused bad tables
- to be produced on machines where the bad reference happened
- to yield a 1. This caused problems installing or running
- flex on some Suns, in particular.
-
-
-Changes between 2.3 Patch #6 (29Aug90) and 2.3 Patch #5:
-
- - Fixed a serious bug in yymore() which basically made it
- completely broken. Thanks goes to Jean Christophe of
- the Nethack development team for finding the problem
- and passing along the fix.
-
-
-Changes between 2.3 Patch #5 (16Aug90) and 2.3 Patch #4:
-
- - An up-to-date version of initscan.c so "make test" will
- work after applying the previous patches
-
-
-Changes between 2.3 Patch #4 (14Aug90) and 2.3 Patch #3:
-
- - Fixed bug in hexadecimal escapes which allowed only digits,
- not letters, in escapes
- - Fixed bug in previous "Changes" file!
-
-
-Changes between 2.3 Patch #3 (03Aug90) and 2.3 Patch #2:
-
- - Correction to patch #2 for gcc compilation; thanks goes to
- Paul Eggert for catching this.
-
-
-Changes between 2.3 Patch #2 (02Aug90) and original 2.3 release:
-
- - Fixed (hopefully) headaches involving declaring malloc()
- and free() for gcc, which defines __STDC__ but (often) doesn't
- come with the standard include files such as <stdlib.h>.
- Reordered #ifdef maze in the scanner skeleton in the hope of
- getting the declarations right for cfront and g++, too.
-
- - Note that this patch supercedes patch #1 for release 2.3,
- which was never announced but was available briefly for
- anonymous ftp.
-
-
-Changes between 2.3 (full) release of 28Jun90 and 2.2 (alpha) release:
-
- User-visible:
-
- - A lone <<EOF>> rule (that is, one which is not qualified with
- a list of start conditions) now specifies the EOF action for
- *all* start conditions which haven't already had <<EOF>> actions
- given. To specify an end-of-file action for just the initial
- state, use <INITIAL><<EOF>>.
-
- - -d debug output is now contigent on the global yy_flex_debug
- being set to a non-zero value, which it is by default.
-
- - A new macro, YY_USER_INIT, is provided for the user to specify
- initialization action to be taken on the first call to the
- scanner. This action is done before the scanner does its
- own initialization.
-
- - yy_new_buffer() has been added as an alias for yy_create_buffer()
-
- - Comments beginning with '#' and extending to the end of the line
- now work, but have been deprecated (in anticipation of making
- flex recognize #line directives).
-
- - The funky restrictions on when semi-colons could follow the
- YY_NEW_FILE and yyless macros have been removed. They now
- behave identically to functions.
-
- - A bug in the sample redefinition of YY_INPUT in the documentation
- has been corrected.
-
- - A bug in the sample simple tokener in the documentation has
- been corrected.
-
- - The documentation on the incompatibilities between flex and
- lex has been reordered so that the discussion of yylineno
- and input() come first, as it's anticipated that these will
- be the most common source of headaches.
-
-
- Things which didn't used to be documented but now are:
-
- - flex interprets "^foo|bar" differently from lex. flex interprets
- it as "match either a 'foo' or a 'bar', providing it comes at the
- beginning of a line", whereas lex interprets it as "match either
- a 'foo' at the beginning of a line, or a 'bar' anywhere".
-
- - flex initializes the global "yyin" on the first call to the
- scanner, while lex initializes it at compile-time.
-
- - yy_switch_to_buffer() can be used in the yywrap() macro/routine.
-
- - flex scanners do not use stdio for their input, and hence when
- writing an interactive scanner one must explictly call fflush()
- after writing out a prompt.
-
- - flex scanner can be made reentrant (after a fashion) by using
- "yyrestart( yyin );". This is useful for interactive scanners
- which have interrupt handlers that long-jump out of the scanner.
-
- - a defense of why yylineno is not supported is included, along
- with a suggestion on how to convert scanners which rely on it.
-
-
- Other changes:
-
- - Prototypes and proper declarations of void routines have
- been added to the flex source code, courtesy of Kevin B. Kenny.
-
- - Routines dealing with memory allocation now use void* pointers
- instead of char* - see Makefile for porting implications.
-
- - Error-checking is now done when flex closes a file.
-
- - Various lint tweaks were added to reduce the number of gripes.
-
- - Makefile has been further parameterized to aid in porting.
-
- - Support for SCO Unix added.
-
- - Flex now sports the latest & greatest UC copyright notice
- (which is only slightly different from the previous one).
-
- - A note has been added to flexdoc.1 mentioning work in progress
- on modifying flex to generate straight C code rather than a
- table-driven automaton, with an email address of whom to contact
- if you are working along similar lines.
-
-
-Changes between 2.2 Patch #3 (30Mar90) and 2.2 Patch #2:
-
- - fixed bug which caused -I scanners to bomb
-
-
-Changes between 2.2 Patch #2 (27Mar90) and 2.2 Patch #1:
-
- - fixed bug writing past end of input buffer in yyunput()
- - fixed bug detecting NUL's at the end of a buffer
-
-
-Changes between 2.2 Patch #1 (23Mar90) and 2.2 (alpha) release:
-
- - Makefile fixes: definition of MAKE variable for systems
- which don't have it; installation of flexdoc.1 along with
- flex.1; fixed two bugs which could cause "bigtest" to fail.
-
- - flex.skel fix for compiling with g++.
-
- - README and flexdoc.1 no longer list an out-of-date BITNET address
- for contacting me.
-
- - minor typos and formatting changes to flex.1 and flexdoc.1.
-
-
-Changes between 2.2 (alpha) release of March '90 and previous release:
-
- User-visible:
-
- - Full user documentation now available.
-
- - Support for 8-bit scanners.
-
- - Scanners now accept NUL's.
-
- - A facility has been added for dealing with multiple
- input buffers.
-
- - Two manual entries now. One which fully describes flex
- (rather than just its differences from lex), and the
- other for quick(er) reference.
-
- - A number of changes to bring flex closer into compliance
- with the latest POSIX lex draft:
-
- %t support
- flex now accepts multiple input files and concatenates
- them together to form its input
- previous -c (compress) flag renamed -C
- do-nothing -c and -n flags added
- Any indented code or code within %{}'s in section 2 is
- now copied to the output
-
- - yyleng is now a bona fide global integer.
-
- - -d debug information now gives the line number of the
- matched rule instead of which number rule it was from
- the beginning of the file.
-
- - -v output now includes a summary of the flags used to generate
- the scanner.
-
- - unput() and yyrestart() are now globally callable.
-
- - yyrestart() no longer closes the previous value of yyin.
-
- - C++ support; generated scanners can be compiled with C++ compiler.
-
- - Primitive -lfl library added, containing default main()
- which calls yylex(). A number of routines currently living
- in the scanner skeleton will probably migrate to here
- in the future (in particular, yywrap() will probably cease
- to be a macro and instead be a function in the -lfl library).
-
- - Hexadecimal (\x) escape sequences added.
-
- - Support for MS-DOS, VMS, and Turbo-C integrated.
-
- - The %used/%unused operators have been deprecated. They
- may go away soon.
-
-
- Other changes:
-
- - Makefile enhanced for easier testing and installation.
- - The parser has been tweaked to detect some erroneous
- constructions which previously were missed.
- - Scanner input buffer overflow is now detected.
- - Bugs with missing "const" declarations fixed.
- - Out-of-date Minix/Atari patches provided.
- - Scanners no longer require printf() unless FLEX_DEBUG is being used.
- - A subtle input() bug has been fixed.
- - Line numbers for "continued action" rules (those following
- the special '|' action) are now correct.
- - unput() bug fixed; had been causing problems porting flex to VMS.
- - yymore() handling rewritten to fix bug with interaction
- between yymore() and trailing context.
- - EOF in actions now generates an error message.
- - Bug involving -CFe and generating equivalence classes fixed.
- - Bug which made -CF be treated as -Cf fixed.
- - Support for SysV tmpnam() added.
- - Unused #define's for scanner no longer generated.
- - Error messages which are associated with a particular input
- line are now all identified with their input line in standard
- format.
- - % directives which are valid to lex but not to flex are
- now ignored instead of generating warnings.
- - -DSYS_V flag can now also be specified -DUSG for System V
- compilation.
-
-
-Changes between 2.1 beta-test release of June '89 and previous release:
-
- User-visible:
-
- - -p flag generates a performance report to stderr. The report
- consists of comments regarding features of the scanner rules
- which result in slower scanners.
-
- - -b flag generates backtracking information to lex.backtrack.
- This is a list of scanner states which require backtracking
- and the characters on which they do so. By adding rules
- one can remove backtracking states. If all backtracking states
- are eliminated, the generated scanner will run faster.
- Backtracking is not yet documented in the manual entry.
-
- - Variable trailing context now works, i.e., one can have
- rules like "(foo)*/[ \t]*bletch". Some trailing context
- patterns still cannot be properly matched and generate
- error messages. These are patterns where the ending of the
- first part of the rule matches the beginning of the second
- part, such as "zx*/xy*", where the 'x*' matches the 'x' at
- the beginning of the trailing context. Lex won't get these
- patterns right either.
-
- - Faster scanners.
-
- - End-of-file rules. The special rule "<<EOF>>" indicates
- actions which are to be taken when an end-of-file is
- encountered and yywrap() returns non-zero (i.e., indicates
- no further files to process). See manual entry for example.
-
- - The -r (reject used) flag is gone. flex now scans the input
- for occurrences of the string "REJECT" to determine if the
- action is needed. It tries to be intelligent about this but
- can be fooled. One can force the presence or absence of
- REJECT by adding a line in the first section of the form
- "%used REJECT" or "%unused REJECT".
-
- - yymore() has been implemented. Similarly to REJECT, flex
- detects the use of yymore(), which can be overridden using
- "%used" or "%unused".
-
- - Patterns like "x{0,3}" now work (i.e., with lower-limit == 0).
-
- - Removed '\^x' for ctrl-x misfeature.
-
- - Added '\a' and '\v' escape sequences.
-
- - \<digits> now works for octal escape sequences; previously
- \0<digits> was required.
-
- - Better error reporting; line numbers are associated with rules.
-
- - yyleng is a macro; it cannot be accessed outside of the
- scanner source file.
-
- - yytext and yyleng should not be modified within a flex action.
-
- - Generated scanners #define the name FLEX_SCANNER.
-
- - Rules are internally separated by YY_BREAK in lex.yy.c rather
- than break, to allow redefinition.
-
- - The macro YY_USER_ACTION can be redefined to provide an action
- which is always executed prior to the matched rule's action.
-
- - yyrestart() is a new action which can be used to restart
- the scanner after it has seen an end-of-file (a "real" one,
- that is, one for which yywrap() returned non-zero). It takes
- a FILE* argument indicating a new file to scan and sets
- things up so that a subsequent call to yylex() will start
- scanning that file.
-
- - Internal scanner names all preceded by "yy_"
-
- - lex.yy.c is deleted if errors are encountered during processing.
-
- - Comments may be put in the first section of the input by preceding
- them with '#'.
-
-
-
- Other changes:
-
- - Some portability-related bugs fixed, in particular for machines
- with unsigned characters or sizeof( int* ) != sizeof( int ).
- Also, tweaks for VMS and Microsoft C (MS-DOS), and identifiers all
- trimmed to be 31 or fewer characters. Shortened file names
- for dinosaur OS's. Checks for allocating > 64K memory
- on 16 bit'ers. Amiga tweaks. Compiles using gcc on a Sun-3.
- - Compressed and fast scanner skeletons merged.
- - Skeleton header files done away with.
- - Generated scanner uses prototypes and "const" for __STDC__.
- - -DSV flag is now -DSYS_V for System V compilation.
- - Removed all references to FTL language.
- - Software now covered by BSD Copyright.
- - flex will replace lex in subsequent BSD releases.
diff --git a/usr.bin/lex/README b/usr.bin/lex/README
deleted file mode 100644
index 7a4224d..0000000
--- a/usr.bin/lex/README
+++ /dev/null
@@ -1,60 +0,0 @@
-This is release 2.5 of flex. See "version.h" for the exact patch-level.
-
-See the file "NEWS" to find out what is new in this Flex release.
-
-Read the file "INSTALL" for general installation directives. Peek near
-the beginning of the file "Makefile.in" for special DEFS values. On most
-systems, you can just run the "configure" script and type "make" to build
-flex; then "make check" to test whether it built correctly; and if it did,
-then "make install" to install it.
-
-If you're feeling adventurous, you can also issue "make bigcheck" (be
-prepared to wait a while).
-
-Note that flex is distributed under a copyright very similar to that of
-BSD Unix, and not under the GNU General Public License (GPL), except for
-the "configure" script, which is covered by the GPL.
-
-Many thanks to the 2.5 beta-testers for finding bugs and helping test and
-increase portability: Stan Adermann, Scott David Daniels, Charles Elliott,
-Joe Gayda, Chris Meier, James Nordby, Terrence O'Kane, Karsten Pahnke,
-Francois Pinard, Pat Rankin, Andreas Scherer, Marc Wiese, Nathan Zelle.
-
-Please send bug reports and feedback to: Vern Paxson (vern@ee.lbl.gov).
-
-
-The flex distribution consists of the following files:
-
- README This message
-
- NEWS Differences between the various releases
-
- INSTALL General installation information
-
- COPYING flex's copyright
-
- conf.in, configure.in, configure, Makefile.in, install.sh,
- mkinstalldirs
- elements of the "autoconf" auto-configuration process
-
- flexdef.h, parse.y, scan.l, ccl.c, dfa.c, ecs.c, gen.c, main.c,
- misc.c, nfa.c, sym.c, tblcmp.c, yylex.c
- source files
-
- version.h version of this flex release
-
- flex.skl flex scanner skeleton
- mkskel.sh script for converting flex.skl to C source file skel.c
- skel.c pre-converted C version of flex.skl
-
- libmain.c flex library (-lfl) sources
- libyywrap.c
-
- initscan.c pre-flex'd version of scan.l
-
- FlexLexer.h header file for C++ lexer class
-
- flex.1 user documentation
-
- MISC/ a directory containing miscellaneous contributions.
- See MISC/README for details.
diff --git a/usr.bin/lex/ccl.c b/usr.bin/lex/ccl.c
deleted file mode 100644
index f2607bf..0000000
--- a/usr.bin/lex/ccl.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/* ccl - routines for character classes */
-
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Vern Paxson.
- *
- * The United States Government has rights in this work pursuant
- * to contract no. DE-AC03-76SF00098 between the United States
- * Department of Energy and the University of California.
- *
- * Redistribution and use in source and binary forms are permitted provided
- * that: (1) source distributions retain this entire copyright notice and
- * comment, and (2) distributions including binaries display the following
- * acknowledgement: ``This product includes software developed by the
- * University of California, Berkeley and its contributors'' in the
- * documentation or other materials provided with the distribution and in
- * all advertising materials mentioning features or use of this software.
- * Neither the name of the University nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/* $Header: /home/daffy/u0/vern/flex/RCS/ccl.c,v 2.9 93/09/16 20:32:14 vern Exp $ */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "flexdef.h"
-
-/* ccladd - add a single character to a ccl */
-
-void ccladd( cclp, ch )
-int cclp;
-int ch;
- {
- int ind, len, newpos, i;
-
- check_char( ch );
-
- len = ccllen[cclp];
- ind = cclmap[cclp];
-
- /* check to see if the character is already in the ccl */
-
- for ( i = 0; i < len; ++i )
- if ( ccltbl[ind + i] == ch )
- return;
-
- newpos = ind + len;
-
- if ( newpos >= current_max_ccl_tbl_size )
- {
- current_max_ccl_tbl_size += MAX_CCL_TBL_SIZE_INCREMENT;
-
- ++num_reallocs;
-
- ccltbl = reallocate_Character_array( ccltbl,
- current_max_ccl_tbl_size );
- }
-
- ccllen[cclp] = len + 1;
- ccltbl[newpos] = ch;
- }
-
-
-/* cclinit - return an empty ccl */
-
-int cclinit()
- {
- if ( ++lastccl >= current_maxccls )
- {
- current_maxccls += MAX_CCLS_INCREMENT;
-
- ++num_reallocs;
-
- cclmap = reallocate_integer_array( cclmap, current_maxccls );
- ccllen = reallocate_integer_array( ccllen, current_maxccls );
- cclng = reallocate_integer_array( cclng, current_maxccls );
- }
-
- if ( lastccl == 1 )
- /* we're making the first ccl */
- cclmap[lastccl] = 0;
-
- else
- /* The new pointer is just past the end of the last ccl.
- * Since the cclmap points to the \first/ character of a
- * ccl, adding the length of the ccl to the cclmap pointer
- * will produce a cursor to the first free space.
- */
- cclmap[lastccl] = cclmap[lastccl - 1] + ccllen[lastccl - 1];
-
- ccllen[lastccl] = 0;
- cclng[lastccl] = 0; /* ccl's start out life un-negated */
-
- return lastccl;
- }
-
-
-/* cclnegate - negate the given ccl */
-
-void cclnegate( cclp )
-int cclp;
- {
- cclng[cclp] = 1;
- }
-
-
-/* list_character_set - list the members of a set of characters in CCL form
- *
- * Writes to the given file a character-class representation of those
- * characters present in the given CCL. A character is present if it
- * has a non-zero value in the cset array.
- */
-
-void list_character_set( file, cset )
-FILE *file;
-int cset[];
- {
- int i;
-
- putc( '[', file );
-
- for ( i = 0; i < csize; ++i )
- {
- if ( cset[i] )
- {
- int start_char = i;
-
- putc( ' ', file );
-
- fputs( readable_form( i ), file );
-
- while ( ++i < csize && cset[i] )
- ;
-
- if ( i - 1 > start_char )
- /* this was a run */
- fprintf( file, "-%s", readable_form( i - 1 ) );
-
- putc( ' ', file );
- }
- }
-
- putc( ']', file );
- }
diff --git a/usr.bin/lex/config.h b/usr.bin/lex/config.h
deleted file mode 100644
index 2e0b5b4..0000000
--- a/usr.bin/lex/config.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* config.h. Generated automatically by configure. */
-/* $FreeBSD$ */
-
-/* Define to empty if the keyword does not work. */
-/* #undef const */
-
-/* Define to `unsigned' if <sys/types.h> doesn't define. */
-/* #undef size_t */
-
-/* Define if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define if you have the <malloc.h> header file. */
-/* #undef HAVE_MALLOC_H */
-
-/* Define if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
-/* #undef HAVE_ALLOCA_H */
-
-/* Define if platform-specific command line handling is necessary. */
-/* #undef NEED_ARGV_FIXUP */
diff --git a/usr.bin/lex/dfa.c b/usr.bin/lex/dfa.c
deleted file mode 100644
index 5a86af1..0000000
--- a/usr.bin/lex/dfa.c
+++ /dev/null
@@ -1,1097 +0,0 @@
-/* dfa - DFA construction routines */
-
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Vern Paxson.
- *
- * The United States Government has rights in this work pursuant
- * to contract no. DE-AC03-76SF00098 between the United States
- * Department of Energy and the University of California.
- *
- * Redistribution and use in source and binary forms are permitted provided
- * that: (1) source distributions retain this entire copyright notice and
- * comment, and (2) distributions including binaries display the following
- * acknowledgement: ``This product includes software developed by the
- * University of California, Berkeley and its contributors'' in the
- * documentation or other materials provided with the distribution and in
- * all advertising materials mentioning features or use of this software.
- * Neither the name of the University nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/* $Header: /home/daffy/u0/vern/flex/RCS/dfa.c,v 2.26 95/04/20 13:53:14 vern Exp $ */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "flexdef.h"
-
-
-/* declare functions that have forward references */
-
-void dump_associated_rules PROTO((FILE*, int));
-void dump_transitions PROTO((FILE*, int[]));
-void sympartition PROTO((int[], int, int[], int[]));
-int symfollowset PROTO((int[], int, int, int[]));
-
-
-/* check_for_backing_up - check a DFA state for backing up
- *
- * synopsis
- * void check_for_backing_up( int ds, int state[numecs] );
- *
- * ds is the number of the state to check and state[] is its out-transitions,
- * indexed by equivalence class.
- */
-
-void check_for_backing_up( ds, state )
-int ds;
-int state[];
- {
- if ( (reject && ! dfaacc[ds].dfaacc_set) ||
- (! reject && ! dfaacc[ds].dfaacc_state) )
- { /* state is non-accepting */
- ++num_backing_up;
-
- if ( backing_up_report )
- {
- fprintf( backing_up_file,
- _( "State #%d is non-accepting -\n" ), ds );
-
- /* identify the state */
- dump_associated_rules( backing_up_file, ds );
-
- /* Now identify it further using the out- and
- * jam-transitions.
- */
- dump_transitions( backing_up_file, state );
-
- putc( '\n', backing_up_file );
- }
- }
- }
-
-
-/* check_trailing_context - check to see if NFA state set constitutes
- * "dangerous" trailing context
- *
- * synopsis
- * void check_trailing_context( int nfa_states[num_states+1], int num_states,
- * int accset[nacc+1], int nacc );
- *
- * NOTES
- * Trailing context is "dangerous" if both the head and the trailing
- * part are of variable size \and/ there's a DFA state which contains
- * both an accepting state for the head part of the rule and NFA states
- * which occur after the beginning of the trailing context.
- *
- * When such a rule is matched, it's impossible to tell if having been
- * in the DFA state indicates the beginning of the trailing context or
- * further-along scanning of the pattern. In these cases, a warning
- * message is issued.
- *
- * nfa_states[1 .. num_states] is the list of NFA states in the DFA.
- * accset[1 .. nacc] is the list of accepting numbers for the DFA state.
- */
-
-void check_trailing_context( nfa_states, num_states, accset, nacc )
-int *nfa_states, num_states;
-int *accset;
-int nacc;
- {
- int i, j;
-
- for ( i = 1; i <= num_states; ++i )
- {
- int ns = nfa_states[i];
- int type = state_type[ns];
- int ar = assoc_rule[ns];
-
- if ( type == STATE_NORMAL || rule_type[ar] != RULE_VARIABLE )
- { /* do nothing */
- }
-
- else if ( type == STATE_TRAILING_CONTEXT )
- {
- /* Potential trouble. Scan set of accepting numbers
- * for the one marking the end of the "head". We
- * assume that this looping will be fairly cheap
- * since it's rare that an accepting number set
- * is large.
- */
- for ( j = 1; j <= nacc; ++j )
- if ( accset[j] & YY_TRAILING_HEAD_MASK )
- {
- line_warning(
- _( "dangerous trailing context" ),
- rule_linenum[ar] );
- return;
- }
- }
- }
- }
-
-
-/* dump_associated_rules - list the rules associated with a DFA state
- *
- * Goes through the set of NFA states associated with the DFA and
- * extracts the first MAX_ASSOC_RULES unique rules, sorts them,
- * and writes a report to the given file.
- */
-
-void dump_associated_rules( file, ds )
-FILE *file;
-int ds;
- {
- int i, j;
- int num_associated_rules = 0;
- int rule_set[MAX_ASSOC_RULES + 1];
- int *dset = dss[ds];
- int size = dfasiz[ds];
-
- for ( i = 1; i <= size; ++i )
- {
- int rule_num = rule_linenum[assoc_rule[dset[i]]];
-
- for ( j = 1; j <= num_associated_rules; ++j )
- if ( rule_num == rule_set[j] )
- break;
-
- if ( j > num_associated_rules )
- { /* new rule */
- if ( num_associated_rules < MAX_ASSOC_RULES )
- rule_set[++num_associated_rules] = rule_num;
- }
- }
-
- bubble( rule_set, num_associated_rules );
-
- fprintf( file, _( " associated rule line numbers:" ) );
-
- for ( i = 1; i <= num_associated_rules; ++i )
- {
- if ( i % 8 == 1 )
- putc( '\n', file );
-
- fprintf( file, "\t%d", rule_set[i] );
- }
-
- putc( '\n', file );
- }
-
-
-/* dump_transitions - list the transitions associated with a DFA state
- *
- * synopsis
- * dump_transitions( FILE *file, int state[numecs] );
- *
- * Goes through the set of out-transitions and lists them in human-readable
- * form (i.e., not as equivalence classes); also lists jam transitions
- * (i.e., all those which are not out-transitions, plus EOF). The dump
- * is done to the given file.
- */
-
-void dump_transitions( file, state )
-FILE *file;
-int state[];
- {
- int i, ec;
- int out_char_set[CSIZE];
-
- for ( i = 0; i < csize; ++i )
- {
- ec = ABS( ecgroup[i] );
- out_char_set[i] = state[ec];
- }
-
- fprintf( file, _( " out-transitions: " ) );
-
- list_character_set( file, out_char_set );
-
- /* now invert the members of the set to get the jam transitions */
- for ( i = 0; i < csize; ++i )
- out_char_set[i] = ! out_char_set[i];
-
- fprintf( file, _( "\n jam-transitions: EOF " ) );
-
- list_character_set( file, out_char_set );
-
- putc( '\n', file );
- }
-
-
-/* epsclosure - construct the epsilon closure of a set of ndfa states
- *
- * synopsis
- * int *epsclosure( int t[num_states], int *numstates_addr,
- * int accset[num_rules+1], int *nacc_addr,
- * int *hashval_addr );
- *
- * NOTES
- * The epsilon closure is the set of all states reachable by an arbitrary
- * number of epsilon transitions, which themselves do not have epsilon
- * transitions going out, unioned with the set of states which have non-null
- * accepting numbers. t is an array of size numstates of nfa state numbers.
- * Upon return, t holds the epsilon closure and *numstates_addr is updated.
- * accset holds a list of the accepting numbers, and the size of accset is
- * given by *nacc_addr. t may be subjected to reallocation if it is not
- * large enough to hold the epsilon closure.
- *
- * hashval is the hash value for the dfa corresponding to the state set.
- */
-
-int *epsclosure( t, ns_addr, accset, nacc_addr, hv_addr )
-int *t, *ns_addr, accset[], *nacc_addr, *hv_addr;
- {
- int stkpos, ns, tsp;
- int numstates = *ns_addr, nacc, hashval, transsym, nfaccnum;
- int stkend, nstate;
- static int did_stk_init = false, *stk;
-
-#define MARK_STATE(state) \
-trans1[state] = trans1[state] - MARKER_DIFFERENCE;
-
-#define IS_MARKED(state) (trans1[state] < 0)
-
-#define UNMARK_STATE(state) \
-trans1[state] = trans1[state] + MARKER_DIFFERENCE;
-
-#define CHECK_ACCEPT(state) \
-{ \
-nfaccnum = accptnum[state]; \
-if ( nfaccnum != NIL ) \
-accset[++nacc] = nfaccnum; \
-}
-
-#define DO_REALLOCATION \
-{ \
-current_max_dfa_size += MAX_DFA_SIZE_INCREMENT; \
-++num_reallocs; \
-t = reallocate_integer_array( t, current_max_dfa_size ); \
-stk = reallocate_integer_array( stk, current_max_dfa_size ); \
-} \
-
-#define PUT_ON_STACK(state) \
-{ \
-if ( ++stkend >= current_max_dfa_size ) \
-DO_REALLOCATION \
-stk[stkend] = state; \
-MARK_STATE(state) \
-}
-
-#define ADD_STATE(state) \
-{ \
-if ( ++numstates >= current_max_dfa_size ) \
-DO_REALLOCATION \
-t[numstates] = state; \
-hashval += state; \
-}
-
-#define STACK_STATE(state) \
-{ \
-PUT_ON_STACK(state) \
-CHECK_ACCEPT(state) \
-if ( nfaccnum != NIL || transchar[state] != SYM_EPSILON ) \
-ADD_STATE(state) \
-}
-
-
- if ( ! did_stk_init )
- {
- stk = allocate_integer_array( current_max_dfa_size );
- did_stk_init = true;
- }
-
- nacc = stkend = hashval = 0;
-
- for ( nstate = 1; nstate <= numstates; ++nstate )
- {
- ns = t[nstate];
-
- /* The state could be marked if we've already pushed it onto
- * the stack.
- */
- if ( ! IS_MARKED(ns) )
- {
- PUT_ON_STACK(ns)
- CHECK_ACCEPT(ns)
- hashval += ns;
- }
- }
-
- for ( stkpos = 1; stkpos <= stkend; ++stkpos )
- {
- ns = stk[stkpos];
- transsym = transchar[ns];
-
- if ( transsym == SYM_EPSILON )
- {
- tsp = trans1[ns] + MARKER_DIFFERENCE;
-
- if ( tsp != NO_TRANSITION )
- {
- if ( ! IS_MARKED(tsp) )
- STACK_STATE(tsp)
-
- tsp = trans2[ns];
-
- if ( tsp != NO_TRANSITION && ! IS_MARKED(tsp) )
- STACK_STATE(tsp)
- }
- }
- }
-
- /* Clear out "visit" markers. */
-
- for ( stkpos = 1; stkpos <= stkend; ++stkpos )
- {
- if ( IS_MARKED(stk[stkpos]) )
- UNMARK_STATE(stk[stkpos])
- else
- flexfatal(
- _( "consistency check failed in epsclosure()" ) );
- }
-
- *ns_addr = numstates;
- *hv_addr = hashval;
- *nacc_addr = nacc;
-
- return t;
- }
-
-
-/* increase_max_dfas - increase the maximum number of DFAs */
-
-void increase_max_dfas()
- {
- current_max_dfas += MAX_DFAS_INCREMENT;
-
- ++num_reallocs;
-
- base = reallocate_integer_array( base, current_max_dfas );
- def = reallocate_integer_array( def, current_max_dfas );
- dfasiz = reallocate_integer_array( dfasiz, current_max_dfas );
- accsiz = reallocate_integer_array( accsiz, current_max_dfas );
- dhash = reallocate_integer_array( dhash, current_max_dfas );
- dss = reallocate_int_ptr_array( dss, current_max_dfas );
- dfaacc = reallocate_dfaacc_union( dfaacc, current_max_dfas );
-
- if ( nultrans )
- nultrans =
- reallocate_integer_array( nultrans, current_max_dfas );
- }
-
-
-/* ntod - convert an ndfa to a dfa
- *
- * Creates the dfa corresponding to the ndfa we've constructed. The
- * dfa starts out in state #1.
- */
-
-void ntod()
- {
- int *accset, ds, nacc, newds;
- int sym, hashval, numstates, dsize;
- int num_full_table_rows; /* used only for -f */
- int *nset, *dset;
- int targptr, totaltrans, i, comstate, comfreq, targ;
- int symlist[CSIZE + 1];
- int num_start_states;
- int todo_head, todo_next;
-
- /* Note that the following are indexed by *equivalence classes*
- * and not by characters. Since equivalence classes are indexed
- * beginning with 1, even if the scanner accepts NUL's, this
- * means that (since every character is potentially in its own
- * equivalence class) these arrays must have room for indices
- * from 1 to CSIZE, so their size must be CSIZE + 1.
- */
- int duplist[CSIZE + 1], state[CSIZE + 1];
- int targfreq[CSIZE + 1], targstate[CSIZE + 1];
-
- accset = allocate_integer_array( num_rules + 1 );
- nset = allocate_integer_array( current_max_dfa_size );
-
- /* The "todo" queue is represented by the head, which is the DFA
- * state currently being processed, and the "next", which is the
- * next DFA state number available (not in use). We depend on the
- * fact that snstods() returns DFA's \in increasing order/, and thus
- * need only know the bounds of the dfas to be processed.
- */
- todo_head = todo_next = 0;
-
- for ( i = 0; i <= csize; ++i )
- {
- duplist[i] = NIL;
- symlist[i] = false;
- }
-
- for ( i = 0; i <= num_rules; ++i )
- accset[i] = NIL;
-
- if ( trace )
- {
- dumpnfa( scset[1] );
- fputs( _( "\n\nDFA Dump:\n\n" ), stderr );
- }
-
- inittbl();
-
- /* Check to see whether we should build a separate table for
- * transitions on NUL characters. We don't do this for full-speed
- * (-F) scanners, since for them we don't have a simple state
- * number lying around with which to index the table. We also
- * don't bother doing it for scanners unless (1) NUL is in its own
- * equivalence class (indicated by a positive value of
- * ecgroup[NUL]), (2) NUL's equivalence class is the last
- * equivalence class, and (3) the number of equivalence classes is
- * the same as the number of characters. This latter case comes
- * about when useecs is false or when it's true but every character
- * still manages to land in its own class (unlikely, but it's
- * cheap to check for). If all these things are true then the
- * character code needed to represent NUL's equivalence class for
- * indexing the tables is going to take one more bit than the
- * number of characters, and therefore we won't be assured of
- * being able to fit it into a YY_CHAR variable. This rules out
- * storing the transitions in a compressed table, since the code
- * for interpreting them uses a YY_CHAR variable (perhaps it
- * should just use an integer, though; this is worth pondering ...
- * ###).
- *
- * Finally, for full tables, we want the number of entries in the
- * table to be a power of two so the array references go fast (it
- * will just take a shift to compute the major index). If
- * encoding NUL's transitions in the table will spoil this, we
- * give it its own table (note that this will be the case if we're
- * not using equivalence classes).
- */
-
- /* Note that the test for ecgroup[0] == numecs below accomplishes
- * both (1) and (2) above
- */
- if ( ! fullspd && ecgroup[0] == numecs )
- {
- /* NUL is alone in its equivalence class, which is the
- * last one.
- */
- int use_NUL_table = (numecs == csize);
-
- if ( fulltbl && ! use_NUL_table )
- {
- /* We still may want to use the table if numecs
- * is a power of 2.
- */
- int power_of_two;
-
- for ( power_of_two = 1; power_of_two <= csize;
- power_of_two *= 2 )
- if ( numecs == power_of_two )
- {
- use_NUL_table = true;
- break;
- }
- }
-
- if ( use_NUL_table )
- nultrans = allocate_integer_array( current_max_dfas );
-
- /* From now on, nultrans != nil indicates that we're
- * saving null transitions for later, separate encoding.
- */
- }
-
-
- if ( fullspd )
- {
- for ( i = 0; i <= numecs; ++i )
- state[i] = 0;
-
- place_state( state, 0, 0 );
- dfaacc[0].dfaacc_state = 0;
- }
-
- else if ( fulltbl )
- {
- if ( nultrans )
- /* We won't be including NUL's transitions in the
- * table, so build it for entries from 0 .. numecs - 1.
- */
- num_full_table_rows = numecs;
-
- else
- /* Take into account the fact that we'll be including
- * the NUL entries in the transition table. Build it
- * from 0 .. numecs.
- */
- num_full_table_rows = numecs + 1;
-
- /* Unless -Ca, declare it "short" because it's a real
- * long-shot that that won't be large enough.
- */
- out_str_dec( "static yyconst %s yy_nxt[][%d] =\n {\n",
- /* '}' so vi doesn't get too confused */
- long_align ? "long" : "short", num_full_table_rows );
-
- outn( " {" );
-
- /* Generate 0 entries for state #0. */
- for ( i = 0; i < num_full_table_rows; ++i )
- mk2data( 0 );
-
- dataflush();
- outn( " },\n" );
- }
-
- /* Create the first states. */
-
- num_start_states = lastsc * 2;
-
- for ( i = 1; i <= num_start_states; ++i )
- {
- numstates = 1;
-
- /* For each start condition, make one state for the case when
- * we're at the beginning of the line (the '^' operator) and
- * one for the case when we're not.
- */
- if ( i % 2 == 1 )
- nset[numstates] = scset[(i / 2) + 1];
- else
- nset[numstates] =
- mkbranch( scbol[i / 2], scset[i / 2] );
-
- nset = epsclosure( nset, &numstates, accset, &nacc, &hashval );
-
- if ( snstods( nset, numstates, accset, nacc, hashval, &ds ) )
- {
- numas += nacc;
- totnst += numstates;
- ++todo_next;
-
- if ( variable_trailing_context_rules && nacc > 0 )
- check_trailing_context( nset, numstates,
- accset, nacc );
- }
- }
-
- if ( ! fullspd )
- {
- if ( ! snstods( nset, 0, accset, 0, 0, &end_of_buffer_state ) )
- flexfatal(
- _( "could not create unique end-of-buffer state" ) );
-
- ++numas;
- ++num_start_states;
- ++todo_next;
- }
-
- while ( todo_head < todo_next )
- {
- targptr = 0;
- totaltrans = 0;
-
- for ( i = 1; i <= numecs; ++i )
- state[i] = 0;
-
- ds = ++todo_head;
-
- dset = dss[ds];
- dsize = dfasiz[ds];
-
- if ( trace )
- fprintf( stderr, _( "state # %d:\n" ), ds );
-
- sympartition( dset, dsize, symlist, duplist );
-
- for ( sym = 1; sym <= numecs; ++sym )
- {
- if ( symlist[sym] )
- {
- symlist[sym] = 0;
-
- if ( duplist[sym] == NIL )
- {
- /* Symbol has unique out-transitions. */
- numstates = symfollowset( dset, dsize,
- sym, nset );
- nset = epsclosure( nset, &numstates,
- accset, &nacc, &hashval );
-
- if ( snstods( nset, numstates, accset,
- nacc, hashval, &newds ) )
- {
- totnst = totnst + numstates;
- ++todo_next;
- numas += nacc;
-
- if (
- variable_trailing_context_rules &&
- nacc > 0 )
- check_trailing_context(
- nset, numstates,
- accset, nacc );
- }
-
- state[sym] = newds;
-
- if ( trace )
- fprintf( stderr, "\t%d\t%d\n",
- sym, newds );
-
- targfreq[++targptr] = 1;
- targstate[targptr] = newds;
- ++numuniq;
- }
-
- else
- {
- /* sym's equivalence class has the same
- * transitions as duplist(sym)'s
- * equivalence class.
- */
- targ = state[duplist[sym]];
- state[sym] = targ;
-
- if ( trace )
- fprintf( stderr, "\t%d\t%d\n",
- sym, targ );
-
- /* Update frequency count for
- * destination state.
- */
-
- i = 0;
- while ( targstate[++i] != targ )
- ;
-
- ++targfreq[i];
- ++numdup;
- }
-
- ++totaltrans;
- duplist[sym] = NIL;
- }
- }
-
- if ( caseins && ! useecs )
- {
- int j;
-
- for ( i = 'A', j = 'a'; i <= 'Z'; ++i, ++j )
- {
- if ( state[i] == 0 && state[j] != 0 )
- /* We're adding a transition. */
- ++totaltrans;
-
- else if ( state[i] != 0 && state[j] == 0 )
- /* We're taking away a transition. */
- --totaltrans;
-
- state[i] = state[j];
- }
- }
-
- numsnpairs += totaltrans;
-
- if ( ds > num_start_states )
- check_for_backing_up( ds, state );
-
- if ( nultrans )
- {
- nultrans[ds] = state[NUL_ec];
- state[NUL_ec] = 0; /* remove transition */
- }
-
- if ( fulltbl )
- {
- outn( " {" );
-
- /* Supply array's 0-element. */
- if ( ds == end_of_buffer_state )
- mk2data( -end_of_buffer_state );
- else
- mk2data( end_of_buffer_state );
-
- for ( i = 1; i < num_full_table_rows; ++i )
- /* Jams are marked by negative of state
- * number.
- */
- mk2data( state[i] ? state[i] : -ds );
-
- dataflush();
- outn( " },\n" );
- }
-
- else if ( fullspd )
- place_state( state, ds, totaltrans );
-
- else if ( ds == end_of_buffer_state )
- /* Special case this state to make sure it does what
- * it's supposed to, i.e., jam on end-of-buffer.
- */
- stack1( ds, 0, 0, JAMSTATE );
-
- else /* normal, compressed state */
- {
- /* Determine which destination state is the most
- * common, and how many transitions to it there are.
- */
-
- comfreq = 0;
- comstate = 0;
-
- for ( i = 1; i <= targptr; ++i )
- if ( targfreq[i] > comfreq )
- {
- comfreq = targfreq[i];
- comstate = targstate[i];
- }
-
- bldtbl( state, ds, totaltrans, comstate, comfreq );
- }
- }
-
- if ( fulltbl )
- dataend();
-
- else if ( ! fullspd )
- {
- cmptmps(); /* create compressed template entries */
-
- /* Create tables for all the states with only one
- * out-transition.
- */
- while ( onesp > 0 )
- {
- mk1tbl( onestate[onesp], onesym[onesp], onenext[onesp],
- onedef[onesp] );
- --onesp;
- }
-
- mkdeftbl();
- }
-
- flex_free( (void *) accset );
- flex_free( (void *) nset );
- }
-
-
-/* snstods - converts a set of ndfa states into a dfa state
- *
- * synopsis
- * is_new_state = snstods( int sns[numstates], int numstates,
- * int accset[num_rules+1], int nacc,
- * int hashval, int *newds_addr );
- *
- * On return, the dfa state number is in newds.
- */
-
-int snstods( sns, numstates, accset, nacc, hashval, newds_addr )
-int sns[], numstates, accset[], nacc, hashval, *newds_addr;
- {
- int didsort = 0;
- int i, j;
- int newds, *oldsns;
-
- for ( i = 1; i <= lastdfa; ++i )
- if ( hashval == dhash[i] )
- {
- if ( numstates == dfasiz[i] )
- {
- oldsns = dss[i];
-
- if ( ! didsort )
- {
- /* We sort the states in sns so we
- * can compare it to oldsns quickly.
- * We use bubble because there probably
- * aren't very many states.
- */
- bubble( sns, numstates );
- didsort = 1;
- }
-
- for ( j = 1; j <= numstates; ++j )
- if ( sns[j] != oldsns[j] )
- break;
-
- if ( j > numstates )
- {
- ++dfaeql;
- *newds_addr = i;
- return 0;
- }
-
- ++hshcol;
- }
-
- else
- ++hshsave;
- }
-
- /* Make a new dfa. */
-
- if ( ++lastdfa >= current_max_dfas )
- increase_max_dfas();
-
- newds = lastdfa;
-
- dss[newds] = allocate_integer_array( numstates + 1 );
-
- /* If we haven't already sorted the states in sns, we do so now,
- * so that future comparisons with it can be made quickly.
- */
-
- if ( ! didsort )
- bubble( sns, numstates );
-
- for ( i = 1; i <= numstates; ++i )
- dss[newds][i] = sns[i];
-
- dfasiz[newds] = numstates;
- dhash[newds] = hashval;
-
- if ( nacc == 0 )
- {
- if ( reject )
- dfaacc[newds].dfaacc_set = (int *) 0;
- else
- dfaacc[newds].dfaacc_state = 0;
-
- accsiz[newds] = 0;
- }
-
- else if ( reject )
- {
- /* We sort the accepting set in increasing order so the
- * disambiguating rule that the first rule listed is considered
- * match in the event of ties will work. We use a bubble
- * sort since the list is probably quite small.
- */
-
- bubble( accset, nacc );
-
- dfaacc[newds].dfaacc_set = allocate_integer_array( nacc + 1 );
-
- /* Save the accepting set for later */
- for ( i = 1; i <= nacc; ++i )
- {
- dfaacc[newds].dfaacc_set[i] = accset[i];
-
- if ( accset[i] <= num_rules )
- /* Who knows, perhaps a REJECT can yield
- * this rule.
- */
- rule_useful[accset[i]] = true;
- }
-
- accsiz[newds] = nacc;
- }
-
- else
- {
- /* Find lowest numbered rule so the disambiguating rule
- * will work.
- */
- j = num_rules + 1;
-
- for ( i = 1; i <= nacc; ++i )
- if ( accset[i] < j )
- j = accset[i];
-
- dfaacc[newds].dfaacc_state = j;
-
- if ( j <= num_rules )
- rule_useful[j] = true;
- }
-
- *newds_addr = newds;
-
- return 1;
- }
-
-
-/* symfollowset - follow the symbol transitions one step
- *
- * synopsis
- * numstates = symfollowset( int ds[current_max_dfa_size], int dsize,
- * int transsym, int nset[current_max_dfa_size] );
- */
-
-int symfollowset( ds, dsize, transsym, nset )
-int ds[], dsize, transsym, nset[];
- {
- int ns, tsp, sym, i, j, lenccl, ch, numstates, ccllist;
-
- numstates = 0;
-
- for ( i = 1; i <= dsize; ++i )
- { /* for each nfa state ns in the state set of ds */
- ns = ds[i];
- sym = transchar[ns];
- tsp = trans1[ns];
-
- if ( sym < 0 )
- { /* it's a character class */
- sym = -sym;
- ccllist = cclmap[sym];
- lenccl = ccllen[sym];
-
- if ( cclng[sym] )
- {
- for ( j = 0; j < lenccl; ++j )
- {
- /* Loop through negated character
- * class.
- */
- ch = ccltbl[ccllist + j];
-
- if ( ch == 0 )
- ch = NUL_ec;
-
- if ( ch > transsym )
- /* Transsym isn't in negated
- * ccl.
- */
- break;
-
- else if ( ch == transsym )
- /* next 2 */ goto bottom;
- }
-
- /* Didn't find transsym in ccl. */
- nset[++numstates] = tsp;
- }
-
- else
- for ( j = 0; j < lenccl; ++j )
- {
- ch = ccltbl[ccllist + j];
-
- if ( ch == 0 )
- ch = NUL_ec;
-
- if ( ch > transsym )
- break;
- else if ( ch == transsym )
- {
- nset[++numstates] = tsp;
- break;
- }
- }
- }
-
- else if ( sym >= 'A' && sym <= 'Z' && caseins )
- flexfatal(
- _( "consistency check failed in symfollowset" ) );
-
- else if ( sym == SYM_EPSILON )
- { /* do nothing */
- }
-
- else if ( ABS( ecgroup[sym] ) == transsym )
- nset[++numstates] = tsp;
-
- bottom: ;
- }
-
- return numstates;
- }
-
-
-/* sympartition - partition characters with same out-transitions
- *
- * synopsis
- * sympartition( int ds[current_max_dfa_size], int numstates,
- * int symlist[numecs], int duplist[numecs] );
- */
-
-void sympartition( ds, numstates, symlist, duplist )
-int ds[], numstates;
-int symlist[], duplist[];
- {
- int tch, i, j, k, ns, dupfwd[CSIZE + 1], lenccl, cclp, ich;
-
- /* Partitioning is done by creating equivalence classes for those
- * characters which have out-transitions from the given state. Thus
- * we are really creating equivalence classes of equivalence classes.
- */
-
- for ( i = 1; i <= numecs; ++i )
- { /* initialize equivalence class list */
- duplist[i] = i - 1;
- dupfwd[i] = i + 1;
- }
-
- duplist[1] = NIL;
- dupfwd[numecs] = NIL;
-
- for ( i = 1; i <= numstates; ++i )
- {
- ns = ds[i];
- tch = transchar[ns];
-
- if ( tch != SYM_EPSILON )
- {
- if ( tch < -lastccl || tch >= csize )
- {
- flexfatal(
- _( "bad transition character detected in sympartition()" ) );
- }
-
- if ( tch >= 0 )
- { /* character transition */
- int ec = ecgroup[tch];
-
- mkechar( ec, dupfwd, duplist );
- symlist[ec] = 1;
- }
-
- else
- { /* character class */
- tch = -tch;
-
- lenccl = ccllen[tch];
- cclp = cclmap[tch];
- mkeccl( ccltbl + cclp, lenccl, dupfwd,
- duplist, numecs, NUL_ec );
-
- if ( cclng[tch] )
- {
- j = 0;
-
- for ( k = 0; k < lenccl; ++k )
- {
- ich = ccltbl[cclp + k];
-
- if ( ich == 0 )
- ich = NUL_ec;
-
- for ( ++j; j < ich; ++j )
- symlist[j] = 1;
- }
-
- for ( ++j; j <= numecs; ++j )
- symlist[j] = 1;
- }
-
- else
- for ( k = 0; k < lenccl; ++k )
- {
- ich = ccltbl[cclp + k];
-
- if ( ich == 0 )
- ich = NUL_ec;
-
- symlist[ich] = 1;
- }
- }
- }
- }
- }
diff --git a/usr.bin/lex/ecs.c b/usr.bin/lex/ecs.c
deleted file mode 100644
index 4f7748d..0000000
--- a/usr.bin/lex/ecs.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/* ecs - equivalence class routines */
-
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Vern Paxson.
- *
- * The United States Government has rights in this work pursuant
- * to contract no. DE-AC03-76SF00098 between the United States
- * Department of Energy and the University of California.
- *
- * Redistribution and use in source and binary forms are permitted provided
- * that: (1) source distributions retain this entire copyright notice and
- * comment, and (2) distributions including binaries display the following
- * acknowledgement: ``This product includes software developed by the
- * University of California, Berkeley and its contributors'' in the
- * documentation or other materials provided with the distribution and in
- * all advertising materials mentioning features or use of this software.
- * Neither the name of the University nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/* $Header: /home/daffy/u0/vern/flex/RCS/ecs.c,v 2.9 93/12/07 10:18:20 vern Exp $ */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "flexdef.h"
-
-/* ccl2ecl - convert character classes to set of equivalence classes */
-
-void ccl2ecl()
- {
- int i, ich, newlen, cclp, ccls, cclmec;
-
- for ( i = 1; i <= lastccl; ++i )
- {
- /* We loop through each character class, and for each character
- * in the class, add the character's equivalence class to the
- * new "character" class we are creating. Thus when we are all
- * done, character classes will really consist of collections
- * of equivalence classes
- */
-
- newlen = 0;
- cclp = cclmap[i];
-
- for ( ccls = 0; ccls < ccllen[i]; ++ccls )
- {
- ich = ccltbl[cclp + ccls];
- cclmec = ecgroup[ich];
-
- if ( cclmec > 0 )
- {
- ccltbl[cclp + newlen] = cclmec;
- ++newlen;
- }
- }
-
- ccllen[i] = newlen;
- }
- }
-
-
-/* cre8ecs - associate equivalence class numbers with class members
- *
- * fwd is the forward linked-list of equivalence class members. bck
- * is the backward linked-list, and num is the number of class members.
- *
- * Returned is the number of classes.
- */
-
-int cre8ecs( fwd, bck, num )
-int fwd[], bck[], num;
- {
- int i, j, numcl;
-
- numcl = 0;
-
- /* Create equivalence class numbers. From now on, ABS( bck(x) )
- * is the equivalence class number for object x. If bck(x)
- * is positive, then x is the representative of its equivalence
- * class.
- */
- for ( i = 1; i <= num; ++i )
- if ( bck[i] == NIL )
- {
- bck[i] = ++numcl;
- for ( j = fwd[i]; j != NIL; j = fwd[j] )
- bck[j] = -numcl;
- }
-
- return numcl;
- }
-
-
-/* mkeccl - update equivalence classes based on character class xtions
- *
- * synopsis
- * Char ccls[];
- * int lenccl, fwd[llsiz], bck[llsiz], llsiz, NUL_mapping;
- * void mkeccl( Char ccls[], int lenccl, int fwd[llsiz], int bck[llsiz],
- * int llsiz, int NUL_mapping );
- *
- * ccls contains the elements of the character class, lenccl is the
- * number of elements in the ccl, fwd is the forward link-list of equivalent
- * characters, bck is the backward link-list, and llsiz size of the link-list.
- *
- * NUL_mapping is the value which NUL (0) should be mapped to.
- */
-
-void mkeccl( ccls, lenccl, fwd, bck, llsiz, NUL_mapping )
-Char ccls[];
-int lenccl, fwd[], bck[], llsiz, NUL_mapping;
- {
- int cclp, oldec, newec;
- int cclm, i, j;
- static unsigned char cclflags[CSIZE]; /* initialized to all '\0' */
-
- /* Note that it doesn't matter whether or not the character class is
- * negated. The same results will be obtained in either case.
- */
-
- cclp = 0;
-
- while ( cclp < lenccl )
- {
- cclm = ccls[cclp];
-
- if ( NUL_mapping && cclm == 0 )
- cclm = NUL_mapping;
-
- oldec = bck[cclm];
- newec = cclm;
-
- j = cclp + 1;
-
- for ( i = fwd[cclm]; i != NIL && i <= llsiz; i = fwd[i] )
- { /* look for the symbol in the character class */
- for ( ; j < lenccl; ++j )
- {
- int ccl_char;
-
- if ( NUL_mapping && ccls[j] == 0 )
- ccl_char = NUL_mapping;
- else
- ccl_char = ccls[j];
-
- if ( ccl_char > i )
- break;
-
- if ( ccl_char == i && ! cclflags[j] )
- {
- /* We found an old companion of cclm
- * in the ccl. Link it into the new
- * equivalence class and flag it as
- * having been processed.
- */
-
- bck[i] = newec;
- fwd[newec] = i;
- newec = i;
- /* Set flag so we don't reprocess. */
- cclflags[j] = 1;
-
- /* Get next equivalence class member. */
- /* continue 2 */
- goto next_pt;
- }
- }
-
- /* Symbol isn't in character class. Put it in the old
- * equivalence class.
- */
-
- bck[i] = oldec;
-
- if ( oldec != NIL )
- fwd[oldec] = i;
-
- oldec = i;
-
- next_pt: ;
- }
-
- if ( bck[cclm] != NIL || oldec != bck[cclm] )
- {
- bck[cclm] = NIL;
- fwd[oldec] = NIL;
- }
-
- fwd[newec] = NIL;
-
- /* Find next ccl member to process. */
-
- for ( ++cclp; cclflags[cclp] && cclp < lenccl; ++cclp )
- {
- /* Reset "doesn't need processing" flag. */
- cclflags[cclp] = 0;
- }
- }
- }
-
-
-/* mkechar - create equivalence class for single character */
-
-void mkechar( tch, fwd, bck )
-int tch, fwd[], bck[];
- {
- /* If until now the character has been a proper subset of
- * an equivalence class, break it away to create a new ec
- */
-
- if ( fwd[tch] != NIL )
- bck[fwd[tch]] = bck[tch];
-
- if ( bck[tch] != NIL )
- fwd[bck[tch]] = fwd[tch];
-
- fwd[tch] = NIL;
- bck[tch] = NIL;
- }
diff --git a/usr.bin/lex/flex.skl b/usr.bin/lex/flex.skl
deleted file mode 100644
index 460b2fa..0000000
--- a/usr.bin/lex/flex.skl
+++ /dev/null
@@ -1,1550 +0,0 @@
-/* A lexical scanner generated by flex */
-
-/* Scanner skeleton version:
- * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $
- * $FreeBSD$
- */
-
-#if defined(__FreeBSD__)
-#include <sys/cdefs.h>
-#else
-#define __unused
-#define __dead2
-#endif
-
-#define FLEX_SCANNER
-#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-
-%-
-#include <stdio.h>
-%*
-
-
-/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
-#ifdef c_plusplus
-#ifndef __cplusplus
-#define __cplusplus
-#endif
-#endif
-
-
-#ifdef __cplusplus
-
-#include <stdlib.h>
-%+
-#include <iosfwd>
-using namespace std;
-%*
-#include <unistd.h>
-
-/* Use prototypes in function declarations. */
-#define YY_USE_PROTOS
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else /* ! __cplusplus */
-
-#if __STDC__
-
-#define YY_USE_PROTOS
-#define YY_USE_CONST
-
-#endif /* __STDC__ */
-#endif /* ! __cplusplus */
-
-#ifdef __TURBOC__
- #pragma warn -rch
- #pragma warn -use
-#include <io.h>
-#include <stdlib.h>
-#define YY_USE_CONST
-#define YY_USE_PROTOS
-#endif
-
-#ifdef YY_USE_CONST
-#define yyconst const
-#else
-#define yyconst
-#endif
-
-
-#ifdef YY_USE_PROTOS
-#define YY_PROTO(proto) proto
-#else
-#define YY_PROTO(proto) ()
-#endif
-
-/* Returned upon end-of-file. */
-#define YY_NULL 0
-
-/* Promotes a possibly negative, possibly signed char to an unsigned
- * integer for use as an array index. If the signed char is negative,
- * we want to instead treat it as an 8-bit unsigned char, hence the
- * double cast.
- */
-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
-
-/* Enter a start condition. This macro really ought to take a parameter,
- * but we do it the disgusting crufty way forced on us by the ()-less
- * definition of BEGIN.
- */
-#define BEGIN yy_start = 1 + 2 *
-
-/* Translate the current start state into a value that can be later handed
- * to BEGIN to return to the state. The YYSTATE alias is for lex
- * compatibility.
- */
-#define YY_START ((yy_start - 1) / 2)
-#define YYSTATE YY_START
-
-/* Action number for EOF rule of a given start state. */
-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
-
-/* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE yyrestart( yyin )
-
-#define YY_END_OF_BUFFER_CHAR 0
-
-/* Size of default input buffer. */
-#define YY_BUF_SIZE 16384
-
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-
-extern int yyleng;
-%-
-extern FILE *yyin, *yyout;
-%*
-
-#define EOB_ACT_CONTINUE_SCAN 0
-#define EOB_ACT_END_OF_FILE 1
-#define EOB_ACT_LAST_MATCH 2
-
-/* The funky do-while in the following #define is used to turn the definition
- * int a single C statement (which needs a semi-colon terminator). This
- * avoids problems with code like:
- *
- * if ( condition_holds )
- * yyless( 5 );
- * else
- * do_something_else();
- *
- * Prior to using the do-while the compiler would get upset at the
- * "else" because it interpreted the "if" statement as being all
- * done when it reached the ';' after the yyless() call.
- */
-
-/* Return all but the first 'n' matched characters back to the input stream. */
-
-#define yyless(n) \
- do \
- { \
- /* Undo effects of setting up yytext. */ \
- *yy_cp = yy_hold_char; \
- YY_RESTORE_YY_MORE_OFFSET \
- yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
- YY_DO_BEFORE_ACTION; /* set up yytext again */ \
- } \
- while ( 0 )
-
-#define unput(c) yyunput( c, yytext_ptr )
-
-/* The following is because we cannot portably get our hands on size_t
- * (without autoconf's help, which isn't available because we want
- * flex-generated scanners to compile on their own).
- */
-typedef unsigned int yy_size_t;
-
-
-struct yy_buffer_state
- {
-%-
- FILE *yy_input_file;
-%+
- istream* yy_input_file;
-%*
-
- char *yy_ch_buf; /* input buffer */
- char *yy_buf_pos; /* current position in input buffer */
-
- /* Size of input buffer in bytes, not including room for EOB
- * characters.
- */
- yy_size_t yy_buf_size;
-
- /* Number of characters read into yy_ch_buf, not including EOB
- * characters.
- */
- int yy_n_chars;
-
- /* Whether we "own" the buffer - i.e., we know we created it,
- * and can realloc() it to grow it, and should free() it to
- * delete it.
- */
- int yy_is_our_buffer;
-
- /* Whether this is an "interactive" input source; if so, and
- * if we're using stdio for input, then we want to use getc()
- * instead of fread(), to make sure we stop fetching input after
- * each newline.
- */
- int yy_is_interactive;
-
- /* Whether we're considered to be at the beginning of a line.
- * If so, '^' rules will be active on the next match, otherwise
- * not.
- */
- int yy_at_bol;
-
- /* Whether to try to fill the input buffer when we reach the
- * end of it.
- */
- int yy_fill_buffer;
-
- int yy_buffer_status;
-#define YY_BUFFER_NEW 0
-#define YY_BUFFER_NORMAL 1
- /* When an EOF's been seen but there's still some text to process
- * then we mark the buffer as YY_EOF_PENDING, to indicate that we
- * shouldn't try reading from the input source any more. We might
- * still have a bunch of tokens to match, though, because of
- * possible backing-up.
- *
- * When we actually see the EOF, we change the status to "new"
- * (via yyrestart()), so that the user can continue scanning by
- * just pointing yyin at a new input file.
- */
-#define YY_BUFFER_EOF_PENDING 2
- };
-
-%- Standard (non-C++) definition
-static YY_BUFFER_STATE yy_current_buffer = 0;
-%*
-
-/* We provide macros for accessing buffer states in case in the
- * future we want to put the buffer states in a more general
- * "scanner state".
- */
-#define YY_CURRENT_BUFFER yy_current_buffer
-
-
-%- Standard (non-C++) definition
-/* yy_hold_char holds the character lost when yytext is formed. */
-static char yy_hold_char;
-
-static int yy_n_chars; /* number of characters read into yy_ch_buf */
-
-
-int yyleng;
-
-/* Points to current character in buffer. */
-static char *yy_c_buf_p = (char *) 0;
-static int yy_init = 1; /* whether we need to initialize */
-static int yy_start = 0; /* start state number */
-
-/* Flag which is used to allow yywrap()'s to do buffer switches
- * instead of setting up a fresh yyin. A bit of a hack ...
- */
-static int yy_did_buffer_switch_on_eof;
-
-void yyrestart YY_PROTO(( FILE *input_file ));
-
-void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
-void yy_load_buffer_state YY_PROTO(( void ));
-YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
-void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
-void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
-void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
-#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
-
-YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
-YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
-YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
-%*
-
-static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
-static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )) __unused;
-static void yy_flex_free YY_PROTO(( void * ));
-
-#define yy_new_buffer yy_create_buffer
-
-#define yy_set_interactive(is_interactive) \
- { \
- if ( ! yy_current_buffer ) \
- yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
- yy_current_buffer->yy_is_interactive = is_interactive; \
- }
-
-#define yy_set_bol(at_bol) \
- { \
- if ( ! yy_current_buffer ) \
- yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
- yy_current_buffer->yy_at_bol = at_bol; \
- }
-
-#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
-
-%% yytext/yyin/yyout/yy_state_type/yylineno etc. def's & init go here
-
-%- Standard (non-C++) definition
-static yy_state_type yy_get_previous_state YY_PROTO(( void ));
-static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
-static int yy_get_next_buffer YY_PROTO(( void ));
-static void yy_fatal_error YY_PROTO(( yyconst char msg[] )) __dead2;
-%*
-
-/* Done after the current pattern has been matched and before the
- * corresponding action - sets up yytext.
- */
-#define YY_DO_BEFORE_ACTION \
- yytext_ptr = yy_bp; \
-%% code to fiddle yytext and yyleng for yymore() goes here
- yy_hold_char = *yy_cp; \
- *yy_cp = '\0'; \
-%% code to copy yytext_ptr to yytext[] goes here, if %array
- yy_c_buf_p = yy_cp;
-
-%% data tables for the DFA and the user's section 1 definitions go here
-
-/* Macros after this point can all be overridden by user definitions in
- * section 1.
- */
-
-#ifndef YY_SKIP_YYWRAP
-#ifdef __cplusplus
-extern "C" int yywrap YY_PROTO(( void ));
-#else
-extern int yywrap YY_PROTO(( void ));
-#endif
-#endif
-
-%-
-#ifndef YY_NO_UNPUT
-static void yyunput YY_PROTO(( int c, char *buf_ptr ));
-#endif
-%*
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen YY_PROTO(( yyconst char * ));
-#endif
-
-#ifndef YY_NO_INPUT
-%- Standard (non-C++) definition
-#ifdef __cplusplus
-static int yyinput YY_PROTO(( void ));
-#else
-static int input YY_PROTO(( void ));
-#endif
-%*
-#endif
-
-#if YY_STACK_USED
-static int yy_start_stack_ptr = 0;
-static int yy_start_stack_depth = 0;
-static int *yy_start_stack = 0;
-#ifndef YY_NO_PUSH_STATE
-static void yy_push_state YY_PROTO(( int new_state ));
-#endif
-#ifndef YY_NO_POP_STATE
-static void yy_pop_state YY_PROTO(( void ));
-#endif
-#ifndef YY_NO_TOP_STATE
-static int yy_top_state YY_PROTO(( void ));
-#endif
-
-#else
-#define YY_NO_PUSH_STATE 1
-#define YY_NO_POP_STATE 1
-#define YY_NO_TOP_STATE 1
-#endif
-
-#ifdef YY_MALLOC_DECL
-YY_MALLOC_DECL
-#else
-#if __STDC__
-#ifndef __cplusplus
-#include <stdlib.h>
-#endif
-#else
-/* Just try to get by without declaring the routines. This will fail
- * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
- * or sizeof(void*) != sizeof(int).
- */
-#endif
-#endif
-
-/* Amount of stuff to slurp up with each read. */
-#ifndef YY_READ_BUF_SIZE
-#define YY_READ_BUF_SIZE 8192
-#endif
-
-/* Copy whatever the last rule matched to the standard output. */
-
-#ifndef ECHO
-%- Standard (non-C++) definition
-/* This used to be an fputs(), but since the string might contain NUL's,
- * we now use fwrite().
- */
-#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
-%+ C++ definition
-#define ECHO LexerOutput( yytext, yyleng )
-%*
-#endif
-
-/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
- * is returned in "result".
- */
-#ifndef YY_INPUT
-#define YY_INPUT(buf,result,max_size) \
-%% fread()/read() definition of YY_INPUT goes here unless we're doing C++
-%+ C++ definition
- if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \
- YY_FATAL_ERROR( "input in flex scanner failed" );
-%*
-#endif
-
-/* No semi-colon after return; correct usage is to write "yyterminate();" -
- * we don't want an extra ';' after the "return" because that will cause
- * some compilers to complain about unreachable statements.
- */
-#ifndef yyterminate
-#define yyterminate() return YY_NULL
-#endif
-
-/* Number of entries by which start-condition stack grows. */
-#ifndef YY_START_STACK_INCR
-#define YY_START_STACK_INCR 25
-#endif
-
-/* Report a fatal error. */
-#ifndef YY_FATAL_ERROR
-%-
-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
-%+
-#define YY_FATAL_ERROR(msg) LexerError( msg )
-%*
-#endif
-
-/* Default declaration of generated scanner - a define so the user can
- * easily add parameters.
- */
-#ifndef YY_DECL
-%- Standard (non-C++) definition
-#define YY_DECL int yylex YY_PROTO(( void ))
-%+ C++ definition
-#define YY_DECL int yyFlexLexer::yylex()
-%*
-#endif
-
-/* Code executed at the beginning of each rule, after yytext and yyleng
- * have been set up.
- */
-#ifndef YY_USER_ACTION
-#define YY_USER_ACTION
-#endif
-
-/* Code executed at the end of each rule. */
-#ifndef YY_BREAK
-#define YY_BREAK break;
-#endif
-
-%% YY_RULE_SETUP definition goes here
-
-YY_DECL
- {
- yy_state_type yy_current_state;
- char *yy_cp, *yy_bp;
- int yy_act;
-
-%% user's declarations go here
-
- if ( yy_init )
- {
- yy_init = 0;
-
-#ifdef YY_USER_INIT
- YY_USER_INIT;
-#endif
-
- if ( ! yy_start )
- yy_start = 1; /* first start state */
-
- if ( ! yyin )
-%-
- yyin = stdin;
-%+
- yyin = &cin;
-%*
-
- if ( ! yyout )
-%-
- yyout = stdout;
-%+
- yyout = &cout;
-%*
-
- if ( ! yy_current_buffer )
- yy_current_buffer =
- yy_create_buffer( yyin, YY_BUF_SIZE );
-
- yy_load_buffer_state();
- }
-
- while ( 1 ) /* loops until end-of-file is reached */
- {
-%% yymore()-related code goes here
- yy_cp = yy_c_buf_p;
-
- /* Support of yytext. */
- *yy_cp = yy_hold_char;
-
- /* yy_bp points to the position in yy_ch_buf of the start of
- * the current run.
- */
- yy_bp = yy_cp;
-
-%% code to set up and find next match goes here
-
-yy_find_action:
-%% code to find the action number goes here
-
- YY_DO_BEFORE_ACTION;
-
-%% code for yylineno update goes here
-
-do_action: /* This label is used only to access EOF actions. */
-
-%% debug code goes here
-
- switch ( yy_act )
- { /* beginning of action switch */
-%% actions go here
-
- case YY_END_OF_BUFFER:
- {
- /* Amount of text matched not including the EOB char. */
- int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
-
- /* Undo the effects of YY_DO_BEFORE_ACTION. */
- *yy_cp = yy_hold_char;
- YY_RESTORE_YY_MORE_OFFSET
-
- if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
- {
- /* We're scanning a new file or input source. It's
- * possible that this happened because the user
- * just pointed yyin at a new source and called
- * yylex(). If so, then we have to assure
- * consistency between yy_current_buffer and our
- * globals. Here is the right place to do so, because
- * this is the first action (other than possibly a
- * back-up) that will match for the new input source.
- */
- yy_n_chars = yy_current_buffer->yy_n_chars;
- yy_current_buffer->yy_input_file = yyin;
- yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
- }
-
- /* Note that here we test for yy_c_buf_p "<=" to the position
- * of the first EOB in the buffer, since yy_c_buf_p will
- * already have been incremented past the NUL character
- * (since all states make transitions on EOB to the
- * end-of-buffer state). Contrast this with the test
- * in input().
- */
- if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
- { /* This was really a NUL. */
- yy_state_type yy_next_state;
-
- yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
-
- yy_current_state = yy_get_previous_state();
-
- /* Okay, we're now positioned to make the NUL
- * transition. We couldn't have
- * yy_get_previous_state() go ahead and do it
- * for us because it doesn't know how to deal
- * with the possibility of jamming (and we don't
- * want to build jamming into it because then it
- * will run more slowly).
- */
-
- yy_next_state = yy_try_NUL_trans( yy_current_state );
-
- yy_bp = yytext_ptr + YY_MORE_ADJ;
-
- if ( yy_next_state )
- {
- /* Consume the NUL. */
- yy_cp = ++yy_c_buf_p;
- yy_current_state = yy_next_state;
- goto yy_match;
- }
-
- else
- {
-%% code to do back-up for compressed tables and set up yy_cp goes here
- goto yy_find_action;
- }
- }
-
- else switch ( yy_get_next_buffer() )
- {
- case EOB_ACT_END_OF_FILE:
- {
- yy_did_buffer_switch_on_eof = 0;
-
- if ( yywrap() )
- {
- /* Note: because we've taken care in
- * yy_get_next_buffer() to have set up
- * yytext, we can now set up
- * yy_c_buf_p so that if some total
- * hoser (like flex itself) wants to
- * call the scanner after we return the
- * YY_NULL, it'll still work - another
- * YY_NULL will get returned.
- */
- yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
-
- yy_act = YY_STATE_EOF(YY_START);
- goto do_action;
- }
-
- else
- {
- if ( ! yy_did_buffer_switch_on_eof )
- YY_NEW_FILE;
- }
- break;
- }
-
- case EOB_ACT_CONTINUE_SCAN:
- yy_c_buf_p =
- yytext_ptr + yy_amount_of_matched_text;
-
- yy_current_state = yy_get_previous_state();
-
- yy_cp = yy_c_buf_p;
- yy_bp = yytext_ptr + YY_MORE_ADJ;
- goto yy_match;
-
- case EOB_ACT_LAST_MATCH:
- yy_c_buf_p =
- &yy_current_buffer->yy_ch_buf[yy_n_chars];
-
- yy_current_state = yy_get_previous_state();
-
- yy_cp = yy_c_buf_p;
- yy_bp = yytext_ptr + YY_MORE_ADJ;
- goto yy_find_action;
- }
- break;
- }
-
- default:
- YY_FATAL_ERROR(
- "fatal flex scanner internal error--no action found" );
- } /* end of action switch */
- } /* end of scanning one token */
- } /* end of yylex */
-
-%+
-yyFlexLexer::yyFlexLexer( istream* arg_yyin, ostream* arg_yyout )
- {
- yyin = arg_yyin;
- yyout = arg_yyout;
- yy_c_buf_p = 0;
- yy_init = 1;
- yy_start = 0;
- yy_flex_debug = 0;
- yylineno = 1; // this will only get updated if %option yylineno
-
- yy_did_buffer_switch_on_eof = 0;
-
- yy_looking_for_trail_begin = 0;
- yy_more_flag = 0;
- yy_more_len = 0;
- yy_more_offset = yy_prev_more_offset = 0;
-
- yy_start_stack_ptr = yy_start_stack_depth = 0;
- yy_start_stack = 0;
-
- yy_current_buffer = 0;
-
-#ifdef YY_USES_REJECT
- yy_state_buf = new yy_state_type[YY_BUF_SIZE + 2];
-#else
- yy_state_buf = 0;
-#endif
- }
-
-yyFlexLexer::~yyFlexLexer()
- {
- delete yy_state_buf;
- yy_delete_buffer( yy_current_buffer );
- }
-
-void yyFlexLexer::switch_streams( istream* new_in, ostream* new_out )
- {
- if ( new_in )
- {
- yy_delete_buffer( yy_current_buffer );
- yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) );
- }
-
- if ( new_out )
- yyout = new_out;
- }
-
-#ifdef YY_INTERACTIVE
-int yyFlexLexer::LexerInput( char* buf, int /* max_size */ )
-#else
-int yyFlexLexer::LexerInput( char* buf, int max_size )
-#endif
- {
- if ( yyin->eof() || yyin->fail() )
- return 0;
-
-#ifdef YY_INTERACTIVE
- yyin->get( buf[0] );
-
- if ( yyin->eof() )
- return 0;
-
- if ( yyin->bad() )
- return -1;
-
- return 1;
-
-#else
- (void) yyin->read( buf, max_size );
-
- if ( yyin->bad() )
- return -1;
- else
- return yyin->gcount();
-#endif
- }
-
-void yyFlexLexer::LexerOutput( const char* buf, int size )
- {
- (void) yyout->write( buf, size );
- }
-%*
-
-/* yy_get_next_buffer - try to read in a new buffer
- *
- * Returns a code representing an action:
- * EOB_ACT_LAST_MATCH -
- * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
- * EOB_ACT_END_OF_FILE - end of file
- */
-
-%-
-static int yy_get_next_buffer()
-%+
-int yyFlexLexer::yy_get_next_buffer()
-%*
- {
- char *dest = yy_current_buffer->yy_ch_buf;
- char *source = yytext_ptr;
- int number_to_move, i;
- int ret_val;
-
- if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
- YY_FATAL_ERROR(
- "fatal flex scanner internal error--end of buffer missed" );
-
- if ( yy_current_buffer->yy_fill_buffer == 0 )
- { /* Don't try to fill the buffer, so this is an EOF. */
- if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
- {
- /* We matched a single character, the EOB, so
- * treat this as a final EOF.
- */
- return EOB_ACT_END_OF_FILE;
- }
-
- else
- {
- /* We matched some text prior to the EOB, first
- * process it.
- */
- return EOB_ACT_LAST_MATCH;
- }
- }
-
- /* Try to read more data. */
-
- /* First move last chars to start of buffer. */
- number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
-
- for ( i = 0; i < number_to_move; ++i )
- *(dest++) = *(source++);
-
- if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
- /* don't do the read, it's not guaranteed to return an EOF,
- * just force an EOF
- */
- yy_current_buffer->yy_n_chars = yy_n_chars = 0;
-
- else
- {
- int num_to_read =
- yy_current_buffer->yy_buf_size - number_to_move - 1;
-
- while ( num_to_read <= 0 )
- { /* Not enough room in the buffer - grow it. */
-#ifdef YY_USES_REJECT
- YY_FATAL_ERROR(
-"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
-#else
-
- /* just a shorter name for the current buffer */
- YY_BUFFER_STATE b = yy_current_buffer;
-
- int yy_c_buf_p_offset =
- (int) (yy_c_buf_p - b->yy_ch_buf);
-
- if ( b->yy_is_our_buffer )
- {
- int new_size = b->yy_buf_size * 2;
-
- if ( new_size <= 0 )
- b->yy_buf_size += b->yy_buf_size / 8;
- else
- b->yy_buf_size *= 2;
-
- b->yy_ch_buf = (char *)
- /* Include room in for 2 EOB chars. */
- yy_flex_realloc( (void *) b->yy_ch_buf,
- b->yy_buf_size + 2 );
- }
- else
- /* Can't grow it, we don't own it. */
- b->yy_ch_buf = 0;
-
- if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR(
- "fatal error - scanner input buffer overflow" );
-
- yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
-
- num_to_read = yy_current_buffer->yy_buf_size -
- number_to_move - 1;
-#endif
- }
-
- if ( num_to_read > YY_READ_BUF_SIZE )
- num_to_read = YY_READ_BUF_SIZE;
-
- /* Read in more data. */
- YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
- yy_n_chars, num_to_read );
-
- yy_current_buffer->yy_n_chars = yy_n_chars;
- }
-
- if ( yy_n_chars == 0 )
- {
- if ( number_to_move == YY_MORE_ADJ )
- {
- ret_val = EOB_ACT_END_OF_FILE;
- yyrestart( yyin );
- }
-
- else
- {
- ret_val = EOB_ACT_LAST_MATCH;
- yy_current_buffer->yy_buffer_status =
- YY_BUFFER_EOF_PENDING;
- }
- }
-
- else
- ret_val = EOB_ACT_CONTINUE_SCAN;
-
- yy_n_chars += number_to_move;
- yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
- yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
-
- yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
-
- return ret_val;
- }
-
-
-/* yy_get_previous_state - get the state just before the EOB char was reached */
-
-%-
-static yy_state_type yy_get_previous_state()
-%+
-yy_state_type yyFlexLexer::yy_get_previous_state()
-%*
- {
- yy_state_type yy_current_state;
- char *yy_cp;
-
-%% code to get the start state into yy_current_state goes here
-
- for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
- {
-%% code to find the next state goes here
- }
-
- return yy_current_state;
- }
-
-
-/* yy_try_NUL_trans - try to make a transition on the NUL character
- *
- * synopsis
- * next_state = yy_try_NUL_trans( current_state );
- */
-
-%-
-#ifdef YY_USE_PROTOS
-static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
-#else
-static yy_state_type yy_try_NUL_trans( yy_current_state )
-yy_state_type yy_current_state;
-#endif
-%+
-yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state )
-%*
- {
- int yy_is_jam;
-%% code to find the next state, and perhaps do backing up, goes here
-
- return yy_is_jam ? 0 : yy_current_state;
- }
-
-
-%-
-#ifndef YY_NO_UNPUT
-#ifdef YY_USE_PROTOS
-static void yyunput( int c, char *yy_bp )
-#else
-static void yyunput( c, yy_bp )
-int c;
-char *yy_bp;
-#endif
-%+
-void yyFlexLexer::yyunput( int c, char* yy_bp )
-%*
- {
- char *yy_cp = yy_c_buf_p;
-
- /* undo effects of setting up yytext */
- *yy_cp = yy_hold_char;
-
- if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
- { /* need to shift things up to make room */
- /* +2 for EOB chars. */
- int number_to_move = yy_n_chars + 2;
- char *dest = &yy_current_buffer->yy_ch_buf[
- yy_current_buffer->yy_buf_size + 2];
- char *source =
- &yy_current_buffer->yy_ch_buf[number_to_move];
-
- while ( source > yy_current_buffer->yy_ch_buf )
- *--dest = *--source;
-
- yy_cp += (int) (dest - source);
- yy_bp += (int) (dest - source);
- yy_current_buffer->yy_n_chars =
- yy_n_chars = yy_current_buffer->yy_buf_size;
-
- if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
- YY_FATAL_ERROR( "flex scanner push-back overflow" );
- }
-
- *--yy_cp = (char) c;
-
-%% update yylineno here
-
- yytext_ptr = yy_bp;
- yy_hold_char = *yy_cp;
- yy_c_buf_p = yy_cp;
- }
-%-
-#endif /* ifndef YY_NO_UNPUT */
-%*
-
-
-%-
-#ifdef __cplusplus
-static int yyinput()
-#else
-static int input()
-#endif
-%+
-int yyFlexLexer::yyinput()
-%*
- {
- int c;
-
- *yy_c_buf_p = yy_hold_char;
-
- if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
- {
- /* yy_c_buf_p now points to the character we want to return.
- * If this occurs *before* the EOB characters, then it's a
- * valid NUL; if not, then we've hit the end of the buffer.
- */
- if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
- /* This was really a NUL. */
- *yy_c_buf_p = '\0';
-
- else
- { /* need more input */
- int offset = yy_c_buf_p - yytext_ptr;
- ++yy_c_buf_p;
-
- switch ( yy_get_next_buffer() )
- {
- case EOB_ACT_LAST_MATCH:
- /* This happens because yy_g_n_b()
- * sees that we've accumulated a
- * token and flags that we need to
- * try matching the token before
- * proceeding. But for input(),
- * there's no matching to consider.
- * So convert the EOB_ACT_LAST_MATCH
- * to EOB_ACT_END_OF_FILE.
- */
-
- /* Reset buffer status. */
- yyrestart( yyin );
-
- /* fall through */
-
- case EOB_ACT_END_OF_FILE:
- {
- if ( yywrap() )
- return EOF;
-
- if ( ! yy_did_buffer_switch_on_eof )
- YY_NEW_FILE;
-#ifdef __cplusplus
- return yyinput();
-#else
- return input();
-#endif
- }
-
- case EOB_ACT_CONTINUE_SCAN:
- yy_c_buf_p = yytext_ptr + offset;
- break;
- }
- }
- }
-
- c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */
- *yy_c_buf_p = '\0'; /* preserve yytext */
- yy_hold_char = *++yy_c_buf_p;
-
-%% update BOL and yylineno
-
- return c;
- }
-
-
-%-
-#ifdef YY_USE_PROTOS
-void yyrestart( FILE *input_file )
-#else
-void yyrestart( input_file )
-FILE *input_file;
-#endif
-%+
-void yyFlexLexer::yyrestart( istream* input_file )
-%*
- {
- if ( ! yy_current_buffer )
- yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
-
- yy_init_buffer( yy_current_buffer, input_file );
- yy_load_buffer_state();
- }
-
-
-%-
-#ifdef YY_USE_PROTOS
-void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
-#else
-void yy_switch_to_buffer( new_buffer )
-YY_BUFFER_STATE new_buffer;
-#endif
-%+
-void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
-%*
- {
- if ( yy_current_buffer == new_buffer )
- return;
-
- if ( yy_current_buffer )
- {
- /* Flush out information for old buffer. */
- *yy_c_buf_p = yy_hold_char;
- yy_current_buffer->yy_buf_pos = yy_c_buf_p;
- yy_current_buffer->yy_n_chars = yy_n_chars;
- }
-
- yy_current_buffer = new_buffer;
- yy_load_buffer_state();
-
- /* We don't actually know whether we did this switch during
- * EOF (yywrap()) processing, but the only time this flag
- * is looked at is after yywrap() is called, so it's safe
- * to go ahead and always set it.
- */
- yy_did_buffer_switch_on_eof = 1;
- }
-
-
-%-
-#ifdef YY_USE_PROTOS
-void yy_load_buffer_state( void )
-#else
-void yy_load_buffer_state()
-#endif
-%+
-void yyFlexLexer::yy_load_buffer_state()
-%*
- {
- yy_n_chars = yy_current_buffer->yy_n_chars;
- yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
- yyin = yy_current_buffer->yy_input_file;
- yy_hold_char = *yy_c_buf_p;
- }
-
-
-%-
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
-#else
-YY_BUFFER_STATE yy_create_buffer( file, size )
-FILE *file;
-int size;
-#endif
-%+
-YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( istream* file, int size )
-%*
- {
- YY_BUFFER_STATE b;
-
- b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
- if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-
- b->yy_buf_size = size;
-
- /* yy_ch_buf has to be 2 characters longer than the size given because
- * we need to put in 2 end-of-buffer characters.
- */
- b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
- if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-
- b->yy_is_our_buffer = 1;
-
- yy_init_buffer( b, file );
-
- return b;
- }
-
-
-%-
-#ifdef YY_USE_PROTOS
-void yy_delete_buffer( YY_BUFFER_STATE b )
-#else
-void yy_delete_buffer( b )
-YY_BUFFER_STATE b;
-#endif
-%+
-void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b )
-%*
- {
- if ( ! b )
- return;
-
- if ( b == yy_current_buffer )
- yy_current_buffer = (YY_BUFFER_STATE) 0;
-
- if ( b->yy_is_our_buffer )
- yy_flex_free( (void *) b->yy_ch_buf );
-
- yy_flex_free( (void *) b );
- }
-
-
-%-
-#ifndef YY_ALWAYS_INTERACTIVE
-#ifndef YY_NEVER_INTERACTIVE
-extern int isatty YY_PROTO(( int ));
-#endif
-#endif
-
-#ifdef YY_USE_PROTOS
-void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
-#else
-void yy_init_buffer( b, file )
-YY_BUFFER_STATE b;
-FILE *file;
-#endif
-
-%+
-extern "C" int isatty YY_PROTO(( int ));
-void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, istream* file )
-%*
-
- {
- yy_flush_buffer( b );
-
- b->yy_input_file = file;
- b->yy_fill_buffer = 1;
-
-%-
-#if YY_ALWAYS_INTERACTIVE
- b->yy_is_interactive = 1;
-#else
-#if YY_NEVER_INTERACTIVE
- b->yy_is_interactive = 0;
-#else
- b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-#endif
-#endif
-%+
- b->yy_is_interactive = 0;
-%*
- }
-
-
-%-
-#ifdef YY_USE_PROTOS
-void yy_flush_buffer( YY_BUFFER_STATE b )
-#else
-void yy_flush_buffer( b )
-YY_BUFFER_STATE b;
-#endif
-
-%+
-void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b )
-%*
- {
- if ( ! b )
- return;
-
- b->yy_n_chars = 0;
-
- /* We always need two end-of-buffer characters. The first causes
- * a transition to the end-of-buffer state. The second causes
- * a jam in that state.
- */
- b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
- b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
-
- b->yy_buf_pos = &b->yy_ch_buf[0];
-
- b->yy_at_bol = 1;
- b->yy_buffer_status = YY_BUFFER_NEW;
-
- if ( b == yy_current_buffer )
- yy_load_buffer_state();
- }
-%*
-
-
-#ifndef YY_NO_SCAN_BUFFER
-%-
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
-#else
-YY_BUFFER_STATE yy_scan_buffer( base, size )
-char *base;
-yy_size_t size;
-#endif
- {
- YY_BUFFER_STATE b;
-
- if ( size < 2 ||
- base[size-2] != YY_END_OF_BUFFER_CHAR ||
- base[size-1] != YY_END_OF_BUFFER_CHAR )
- /* They forgot to leave room for the EOB's. */
- return 0;
-
- b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
- if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
-
- b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
- b->yy_buf_pos = b->yy_ch_buf = base;
- b->yy_is_our_buffer = 0;
- b->yy_input_file = 0;
- b->yy_n_chars = b->yy_buf_size;
- b->yy_is_interactive = 0;
- b->yy_at_bol = 1;
- b->yy_fill_buffer = 0;
- b->yy_buffer_status = YY_BUFFER_NEW;
-
- yy_switch_to_buffer( b );
-
- return b;
- }
-%*
-#endif
-
-
-#ifndef YY_NO_SCAN_STRING
-%-
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
-#else
-YY_BUFFER_STATE yy_scan_string( yy_str )
-yyconst char *yy_str;
-#endif
- {
- int len;
- for ( len = 0; yy_str[len]; ++len )
- ;
-
- return yy_scan_bytes( yy_str, len );
- }
-%*
-#endif
-
-
-#ifndef YY_NO_SCAN_BYTES
-%-
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
-#else
-YY_BUFFER_STATE yy_scan_bytes( bytes, len )
-yyconst char *bytes;
-int len;
-#endif
- {
- YY_BUFFER_STATE b;
- char *buf;
- yy_size_t n;
- int i;
-
- /* Get memory for full buffer, including space for trailing EOB's. */
- n = len + 2;
- buf = (char *) yy_flex_alloc( n );
- if ( ! buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
-
- for ( i = 0; i < len; ++i )
- buf[i] = bytes[i];
-
- buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
-
- b = yy_scan_buffer( buf, n );
- if ( ! b )
- YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
-
- /* It's okay to grow etc. this buffer, and we should throw it
- * away when we're done.
- */
- b->yy_is_our_buffer = 1;
-
- return b;
- }
-%*
-#endif
-
-
-#ifndef YY_NO_PUSH_STATE
-%-
-#ifdef YY_USE_PROTOS
-static void yy_push_state( int new_state )
-#else
-static void yy_push_state( new_state )
-int new_state;
-#endif
-%+
-void yyFlexLexer::yy_push_state( int new_state )
-%*
- {
- if ( yy_start_stack_ptr >= yy_start_stack_depth )
- {
- yy_size_t new_size;
-
- yy_start_stack_depth += YY_START_STACK_INCR;
- new_size = yy_start_stack_depth * sizeof( int );
-
- if ( ! yy_start_stack )
- yy_start_stack = (int *) yy_flex_alloc( new_size );
-
- else
- yy_start_stack = (int *) yy_flex_realloc(
- (void *) yy_start_stack, new_size );
-
- if ( ! yy_start_stack )
- YY_FATAL_ERROR(
- "out of memory expanding start-condition stack" );
- }
-
- yy_start_stack[yy_start_stack_ptr++] = YY_START;
-
- BEGIN(new_state);
- }
-#endif
-
-
-#ifndef YY_NO_POP_STATE
-%-
-static void yy_pop_state()
-%+
-void yyFlexLexer::yy_pop_state()
-%*
- {
- if ( --yy_start_stack_ptr < 0 )
- YY_FATAL_ERROR( "start-condition stack underflow" );
-
- BEGIN(yy_start_stack[yy_start_stack_ptr]);
- }
-#endif
-
-
-#ifndef YY_NO_TOP_STATE
-%-
-static int yy_top_state()
-%+
-int yyFlexLexer::yy_top_state()
-%*
- {
- return yy_start_stack[yy_start_stack_ptr - 1];
- }
-#endif
-
-#ifndef YY_EXIT_FAILURE
-#define YY_EXIT_FAILURE 2
-#endif
-
-%-
-#ifdef YY_USE_PROTOS
-static void yy_fatal_error( yyconst char msg[] )
-#else
-static void yy_fatal_error( msg )
-char msg[];
-#endif
- {
- (void) fprintf( stderr, "%s\n", msg );
- exit( YY_EXIT_FAILURE );
- }
-
-%+
-
-void yyFlexLexer::LexerError( yyconst char msg[] )
- {
- cerr << msg << '\n';
- exit( YY_EXIT_FAILURE );
- }
-%*
-
-
-/* Redefine yyless() so it works in section 3 code. */
-
-#undef yyless
-#define yyless(n) \
- do \
- { \
- /* Undo effects of setting up yytext. */ \
- yytext[yyleng] = yy_hold_char; \
- yy_c_buf_p = yytext + n; \
- yy_hold_char = *yy_c_buf_p; \
- *yy_c_buf_p = '\0'; \
- yyleng = n; \
- } \
- while ( 0 )
-
-
-/* Internal utility routines. */
-
-#ifndef yytext_ptr
-#ifdef YY_USE_PROTOS
-static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
-#else
-static void yy_flex_strncpy( s1, s2, n )
-char *s1;
-yyconst char *s2;
-int n;
-#endif
- {
- int i;
- for ( i = 0; i < n; ++i )
- s1[i] = s2[i];
- }
-#endif
-
-#ifdef YY_NEED_STRLEN
-#ifdef YY_USE_PROTOS
-static int yy_flex_strlen( yyconst char *s )
-#else
-static int yy_flex_strlen( s )
-yyconst char *s;
-#endif
- {
- int n;
- for ( n = 0; s[n]; ++n )
- ;
-
- return n;
- }
-#endif
-
-
-#ifdef YY_USE_PROTOS
-static void *yy_flex_alloc( yy_size_t size )
-#else
-static void *yy_flex_alloc( size )
-yy_size_t size;
-#endif
- {
- return (void *) malloc( size );
- }
-
-#ifdef YY_USE_PROTOS
-static void *yy_flex_realloc( void *ptr, yy_size_t size )
-#else
-static void *yy_flex_realloc( ptr, size )
-void *ptr;
-yy_size_t size;
-#endif
- {
- /* The cast to (char *) in the following accommodates both
- * implementations that use char* generic pointers, and those
- * that use void* generic pointers. It works with the latter
- * because both ANSI C and C++ allow castless assignment from
- * any pointer type to void*, and deal with argument conversions
- * as though doing an assignment.
- */
- return (void *) realloc( (char *) ptr, size );
- }
-
-#ifdef YY_USE_PROTOS
-static void yy_flex_free( void *ptr )
-#else
-static void yy_flex_free( ptr )
-void *ptr;
-#endif
- {
- free( ptr );
- }
-
-#if YY_MAIN
-int main()
- {
- yylex();
- return 0;
- }
-#endif
diff --git a/usr.bin/lex/flexdef.h b/usr.bin/lex/flexdef.h
deleted file mode 100644
index ddc8768..0000000
--- a/usr.bin/lex/flexdef.h
+++ /dev/null
@@ -1,1049 +0,0 @@
-/* flexdef - definitions file for flex */
-
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Vern Paxson.
- *
- * The United States Government has rights in this work pursuant
- * to contract no. DE-AC03-76SF00098 between the United States
- * Department of Energy and the University of California.
- *
- * Redistribution and use in source and binary forms are permitted provided
- * that: (1) source distributions retain this entire copyright notice and
- * comment, and (2) distributions including binaries display the following
- * acknowledgement: ``This product includes software developed by the
- * University of California, Berkeley and its contributors'' in the
- * documentation or other materials provided with the distribution and in
- * all advertising materials mentioning features or use of this software.
- * Neither the name of the University nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/* @(#) $Header: /home/daffy/u0/vern/flex/RCS/flexdef.h,v 2.53 95/04/20 11:17:36 vern Exp $ (LBL) */
-/* $FreeBSD$ */
-
-#include <stdio.h>
-#include <ctype.h>
-
-#include "config.h"
-
-#ifdef __TURBOC__
-#define HAVE_STRING_H 1
-#define MS_DOS 1
-#ifndef __STDC__
-#define __STDC__ 1
-#endif
- #pragma warn -pro
- #pragma warn -rch
- #pragma warn -use
- #pragma warn -aus
- #pragma warn -par
- #pragma warn -pia
-#endif
-
-#ifdef HAVE_STRING_H
-#include <string.h>
-#else
-#include <strings.h>
-#endif
-
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-
-#ifdef HAVE_MALLOC_H
-#include <malloc.h>
-#endif
-
-#ifdef STDC_HEADERS
-#include <stdlib.h>
-#endif
-
-/* As an aid for the internationalization patch to flex, which
- * is maintained outside this distribution for copyright reasons.
- */
-#define _(String) (String)
-
-/* Always be prepared to generate an 8-bit scanner. */
-#define CSIZE 256
-#define Char unsigned char
-
-/* Size of input alphabet - should be size of ASCII set. */
-#ifndef DEFAULT_CSIZE
-#define DEFAULT_CSIZE 128
-#endif
-
-#ifndef PROTO
-#if __STDC__
-#define PROTO(proto) proto
-#else
-#define PROTO(proto) ()
-#endif
-#endif
-
-#ifdef VMS
-#ifndef __VMS_POSIX
-#define unlink remove
-#define SHORT_FILE_NAMES
-#endif
-#endif
-
-#ifdef MS_DOS
-#define SHORT_FILE_NAMES
-#endif
-
-
-/* Maximum line length we'll have to deal with. */
-#define MAXLINE 2048
-
-#ifndef MIN
-#define MIN(x,y) ((x) < (y) ? (x) : (y))
-#endif
-#ifndef MAX
-#define MAX(x,y) ((x) > (y) ? (x) : (y))
-#endif
-#ifndef ABS
-#define ABS(x) ((x) < 0 ? -(x) : (x))
-#endif
-
-
-/* ANSI C does not guarantee that isascii() is defined */
-#ifndef isascii
-#define isascii(c) ((c) <= 0177)
-#endif
-
-
-#define true 1
-#define false 0
-#define unspecified -1
-
-
-/* Special chk[] values marking the slots taking by end-of-buffer and action
- * numbers.
- */
-#define EOB_POSITION -1
-#define ACTION_POSITION -2
-
-/* Number of data items per line for -f output. */
-#define NUMDATAITEMS 10
-
-/* Number of lines of data in -f output before inserting a blank line for
- * readability.
- */
-#define NUMDATALINES 10
-
-/* transition_struct_out() definitions. */
-#define TRANS_STRUCT_PRINT_LENGTH 14
-
-/* Returns true if an nfa state has an epsilon out-transition slot
- * that can be used. This definition is currently not used.
- */
-#define FREE_EPSILON(state) \
- (transchar[state] == SYM_EPSILON && \
- trans2[state] == NO_TRANSITION && \
- finalst[state] != state)
-
-/* Returns true if an nfa state has an epsilon out-transition character
- * and both slots are free
- */
-#define SUPER_FREE_EPSILON(state) \
- (transchar[state] == SYM_EPSILON && \
- trans1[state] == NO_TRANSITION) \
-
-/* Maximum number of NFA states that can comprise a DFA state. It's real
- * big because if there's a lot of rules, the initial state will have a
- * huge epsilon closure.
- */
-#define INITIAL_MAX_DFA_SIZE 750
-#define MAX_DFA_SIZE_INCREMENT 750
-
-
-/* A note on the following masks. They are used to mark accepting numbers
- * as being special. As such, they implicitly limit the number of accepting
- * numbers (i.e., rules) because if there are too many rules the rule numbers
- * will overload the mask bits. Fortunately, this limit is \large/ (0x2000 ==
- * 8192) so unlikely to actually cause any problems. A check is made in
- * new_rule() to ensure that this limit is not reached.
- */
-
-/* Mask to mark a trailing context accepting number. */
-#define YY_TRAILING_MASK 0x2000
-
-/* Mask to mark the accepting number of the "head" of a trailing context
- * rule.
- */
-#define YY_TRAILING_HEAD_MASK 0x4000
-
-/* Maximum number of rules, as outlined in the above note. */
-#define MAX_RULE (YY_TRAILING_MASK - 1)
-
-
-/* NIL must be 0. If not, its special meaning when making equivalence classes
- * (it marks the representative of a given e.c.) will be unidentifiable.
- */
-#define NIL 0
-
-#define JAM -1 /* to mark a missing DFA transition */
-#define NO_TRANSITION NIL
-#define UNIQUE -1 /* marks a symbol as an e.c. representative */
-#define INFINITY -1 /* for x{5,} constructions */
-
-#define INITIAL_MAX_CCLS 100 /* max number of unique character classes */
-#define MAX_CCLS_INCREMENT 100
-
-/* Size of table holding members of character classes. */
-#define INITIAL_MAX_CCL_TBL_SIZE 500
-#define MAX_CCL_TBL_SIZE_INCREMENT 250
-
-#define INITIAL_MAX_RULES 100 /* default maximum number of rules */
-#define MAX_RULES_INCREMENT 100
-
-#define INITIAL_MNS 2000 /* default maximum number of nfa states */
-#define MNS_INCREMENT 1000 /* amount to bump above by if it's not enough */
-
-#define INITIAL_MAX_DFAS 1000 /* default maximum number of dfa states */
-#define MAX_DFAS_INCREMENT 1000
-
-#define JAMSTATE -32766 /* marks a reference to the state that always jams */
-
-/* Maximum number of NFA states. */
-#define MAXIMUM_MNS 31999
-
-/* Enough so that if it's subtracted from an NFA state number, the result
- * is guaranteed to be negative.
- */
-#define MARKER_DIFFERENCE (MAXIMUM_MNS+2)
-
-/* Maximum number of nxt/chk pairs for non-templates. */
-#define INITIAL_MAX_XPAIRS 2000
-#define MAX_XPAIRS_INCREMENT 2000
-
-/* Maximum number of nxt/chk pairs needed for templates. */
-#define INITIAL_MAX_TEMPLATE_XPAIRS 2500
-#define MAX_TEMPLATE_XPAIRS_INCREMENT 2500
-
-#define SYM_EPSILON (CSIZE + 1) /* to mark transitions on the symbol epsilon */
-
-#define INITIAL_MAX_SCS 40 /* maximum number of start conditions */
-#define MAX_SCS_INCREMENT 40 /* amount to bump by if it's not enough */
-
-#define ONE_STACK_SIZE 500 /* stack of states with only one out-transition */
-#define SAME_TRANS -1 /* transition is the same as "default" entry for state */
-
-/* The following percentages are used to tune table compression:
-
- * The percentage the number of out-transitions a state must be of the
- * number of equivalence classes in order to be considered for table
- * compaction by using protos.
- */
-#define PROTO_SIZE_PERCENTAGE 15
-
-/* The percentage the number of homogeneous out-transitions of a state
- * must be of the number of total out-transitions of the state in order
- * that the state's transition table is first compared with a potential
- * template of the most common out-transition instead of with the first
- * proto in the proto queue.
- */
-#define CHECK_COM_PERCENTAGE 50
-
-/* The percentage the number of differences between a state's transition
- * table and the proto it was first compared with must be of the total
- * number of out-transitions of the state in order to keep the first
- * proto as a good match and not search any further.
- */
-#define FIRST_MATCH_DIFF_PERCENTAGE 10
-
-/* The percentage the number of differences between a state's transition
- * table and the most similar proto must be of the state's total number
- * of out-transitions to use the proto as an acceptable close match.
- */
-#define ACCEPTABLE_DIFF_PERCENTAGE 50
-
-/* The percentage the number of homogeneous out-transitions of a state
- * must be of the number of total out-transitions of the state in order
- * to consider making a template from the state.
- */
-#define TEMPLATE_SAME_PERCENTAGE 60
-
-/* The percentage the number of differences between a state's transition
- * table and the most similar proto must be of the state's total number
- * of out-transitions to create a new proto from the state.
- */
-#define NEW_PROTO_DIFF_PERCENTAGE 20
-
-/* The percentage the total number of out-transitions of a state must be
- * of the number of equivalence classes in order to consider trying to
- * fit the transition table into "holes" inside the nxt/chk table.
- */
-#define INTERIOR_FIT_PERCENTAGE 15
-
-/* Size of region set aside to cache the complete transition table of
- * protos on the proto queue to enable quick comparisons.
- */
-#define PROT_SAVE_SIZE 2000
-
-#define MSP 50 /* maximum number of saved protos (protos on the proto queue) */
-
-/* Maximum number of out-transitions a state can have that we'll rummage
- * around through the interior of the internal fast table looking for a
- * spot for it.
- */
-#define MAX_XTIONS_FULL_INTERIOR_FIT 4
-
-/* Maximum number of rules which will be reported as being associated
- * with a DFA state.
- */
-#define MAX_ASSOC_RULES 100
-
-/* Number that, if used to subscript an array, has a good chance of producing
- * an error; should be small enough to fit into a short.
- */
-#define BAD_SUBSCRIPT -32767
-
-/* Absolute value of largest number that can be stored in a short, with a
- * bit of slop thrown in for general paranoia.
- */
-#define MAX_SHORT 32700
-
-
-/* Declarations for global variables. */
-
-/* Variables for symbol tables:
- * sctbl - start-condition symbol table
- * ndtbl - name-definition symbol table
- * ccltab - character class text symbol table
- */
-
-struct hash_entry
- {
- struct hash_entry *prev, *next;
- char *name;
- char *str_val;
- int int_val;
- } ;
-
-typedef struct hash_entry **hash_table;
-
-#define NAME_TABLE_HASH_SIZE 101
-#define START_COND_HASH_SIZE 101
-#define CCL_HASH_SIZE 101
-
-extern struct hash_entry *ndtbl[NAME_TABLE_HASH_SIZE];
-extern struct hash_entry *sctbl[START_COND_HASH_SIZE];
-extern struct hash_entry *ccltab[CCL_HASH_SIZE];
-
-
-/* Variables for flags:
- * printstats - if true (-v), dump statistics
- * syntaxerror - true if a syntax error has been found
- * eofseen - true if we've seen an eof in the input file
- * ddebug - if true (-d), make a "debug" scanner
- * trace - if true (-T), trace processing
- * nowarn - if true (-w), do not generate warnings
- * spprdflt - if true (-s), suppress the default rule
- * interactive - if true (-I), generate an interactive scanner
- * caseins - if true (-i), generate a case-insensitive scanner
- * lex_compat - if true (-l), maximize compatibility with AT&T lex
- * do_yylineno - if true, generate code to maintain yylineno
- * useecs - if true (-Ce flag), use equivalence classes
- * fulltbl - if true (-Cf flag), don't compress the DFA state table
- * usemecs - if true (-Cm flag), use meta-equivalence classes
- * fullspd - if true (-F flag), use Jacobson method of table representation
- * gen_line_dirs - if true (i.e., no -L flag), generate #line directives
- * performance_report - if > 0 (i.e., -p flag), generate a report relating
- * to scanner performance; if > 1 (-p -p), report on minor performance
- * problems, too
- * backing_up_report - if true (i.e., -b flag), generate "lex.backup" file
- * listing backing-up states
- * C_plus_plus - if true (i.e., -+ flag), generate a C++ scanner class;
- * otherwise, a standard C scanner
- * long_align - if true (-Ca flag), favor long-word alignment.
- * use_read - if true (-f, -F, or -Cr) then use read() for scanner input;
- * otherwise, use fread().
- * yytext_is_array - if true (i.e., %array directive), then declare
- * yytext as an array instead of a character pointer. Nice and inefficient.
- * do_yywrap - do yywrap() processing on EOF. If false, EOF treated as
- * "no more files".
- * csize - size of character set for the scanner we're generating;
- * 128 for 7-bit chars and 256 for 8-bit
- * yymore_used - if true, yymore() is used in input rules
- * reject - if true, generate back-up tables for REJECT macro
- * real_reject - if true, scanner really uses REJECT (as opposed to just
- * having "reject" set for variable trailing context)
- * continued_action - true if this rule's action is to "fall through" to
- * the next rule's action (i.e., the '|' action)
- * in_rule - true if we're inside an individual rule, false if not.
- * yymore_really_used - whether to treat yymore() as really used, regardless
- * of what we think based on references to it in the user's actions.
- * reject_really_used - same for REJECT
- */
-
-extern int printstats, syntaxerror, eofseen, ddebug, trace, nowarn, spprdflt;
-extern int interactive, caseins, lex_compat, do_yylineno;
-extern int useecs, fulltbl, usemecs, fullspd;
-extern int gen_line_dirs, performance_report, backing_up_report;
-extern int C_plus_plus, long_align, use_read, yytext_is_array, do_yywrap;
-extern int csize;
-extern int yymore_used, reject, real_reject, continued_action, in_rule;
-
-extern int yymore_really_used, reject_really_used;
-
-
-/* Variables used in the flex input routines:
- * datapos - characters on current output line
- * dataline - number of contiguous lines of data in current data
- * statement. Used to generate readable -f output
- * linenum - current input line number
- * out_linenum - current output line number
- * skelfile - the skeleton file
- * skel - compiled-in skeleton array
- * skel_ind - index into "skel" array, if skelfile is nil
- * yyin - input file
- * backing_up_file - file to summarize backing-up states to
- * infilename - name of input file
- * outfilename - name of output file
- * did_outfilename - whether outfilename was explicitly set
- * prefix - the prefix used for externally visible names ("yy" by default)
- * yyclass - yyFlexLexer subclass to use for YY_DECL
- * do_stdinit - whether to initialize yyin/yyout to stdin/stdout
- * use_stdout - the -t flag
- * input_files - array holding names of input files
- * num_input_files - size of input_files array
- * program_name - name with which program was invoked
- *
- * action_array - array to hold the rule actions
- * action_size - size of action_array
- * defs1_offset - index where the user's section 1 definitions start
- * in action_array
- * prolog_offset - index where the prolog starts in action_array
- * action_offset - index where the non-prolog starts in action_array
- * action_index - index where the next action should go, with respect
- * to "action_array"
- */
-
-extern int datapos, dataline, linenum, out_linenum;
-extern FILE *skelfile, *yyin, *backing_up_file;
-extern const char *skel[];
-extern int skel_ind;
-extern char *infilename, *outfilename;
-extern int did_outfilename;
-extern char *prefix, *yyclass;
-extern int do_stdinit, use_stdout;
-extern char **input_files;
-extern int num_input_files;
-extern char *program_name;
-
-extern char *action_array;
-extern int action_size;
-extern int defs1_offset, prolog_offset, action_offset, action_index;
-
-
-/* Variables for stack of states having only one out-transition:
- * onestate - state number
- * onesym - transition symbol
- * onenext - target state
- * onedef - default base entry
- * onesp - stack pointer
- */
-
-extern int onestate[ONE_STACK_SIZE], onesym[ONE_STACK_SIZE];
-extern int onenext[ONE_STACK_SIZE], onedef[ONE_STACK_SIZE], onesp;
-
-
-/* Variables for nfa machine data:
- * current_mns - current maximum on number of NFA states
- * num_rules - number of the last accepting state; also is number of
- * rules created so far
- * num_eof_rules - number of <<EOF>> rules
- * default_rule - number of the default rule
- * current_max_rules - current maximum number of rules
- * lastnfa - last nfa state number created
- * firstst - physically the first state of a fragment
- * lastst - last physical state of fragment
- * finalst - last logical state of fragment
- * transchar - transition character
- * trans1 - transition state
- * trans2 - 2nd transition state for epsilons
- * accptnum - accepting number
- * assoc_rule - rule associated with this NFA state (or 0 if none)
- * state_type - a STATE_xxx type identifying whether the state is part
- * of a normal rule, the leading state in a trailing context
- * rule (i.e., the state which marks the transition from
- * recognizing the text-to-be-matched to the beginning of
- * the trailing context), or a subsequent state in a trailing
- * context rule
- * rule_type - a RULE_xxx type identifying whether this a ho-hum
- * normal rule or one which has variable head & trailing
- * context
- * rule_linenum - line number associated with rule
- * rule_useful - true if we've determined that the rule can be matched
- */
-
-extern int current_mns, current_max_rules;
-extern int num_rules, num_eof_rules, default_rule, lastnfa;
-extern int *firstst, *lastst, *finalst, *transchar, *trans1, *trans2;
-extern int *accptnum, *assoc_rule, *state_type;
-extern int *rule_type, *rule_linenum, *rule_useful;
-
-/* Different types of states; values are useful as masks, as well, for
- * routines like check_trailing_context().
- */
-#define STATE_NORMAL 0x1
-#define STATE_TRAILING_CONTEXT 0x2
-
-/* Global holding current type of state we're making. */
-
-extern int current_state_type;
-
-/* Different types of rules. */
-#define RULE_NORMAL 0
-#define RULE_VARIABLE 1
-
-/* True if the input rules include a rule with both variable-length head
- * and trailing context, false otherwise.
- */
-extern int variable_trailing_context_rules;
-
-
-/* Variables for protos:
- * numtemps - number of templates created
- * numprots - number of protos created
- * protprev - backlink to a more-recently used proto
- * protnext - forward link to a less-recently used proto
- * prottbl - base/def table entry for proto
- * protcomst - common state of proto
- * firstprot - number of the most recently used proto
- * lastprot - number of the least recently used proto
- * protsave contains the entire state array for protos
- */
-
-extern int numtemps, numprots, protprev[MSP], protnext[MSP], prottbl[MSP];
-extern int protcomst[MSP], firstprot, lastprot, protsave[PROT_SAVE_SIZE];
-
-
-/* Variables for managing equivalence classes:
- * numecs - number of equivalence classes
- * nextecm - forward link of Equivalence Class members
- * ecgroup - class number or backward link of EC members
- * nummecs - number of meta-equivalence classes (used to compress
- * templates)
- * tecfwd - forward link of meta-equivalence classes members
- * tecbck - backward link of MEC's
- */
-
-/* Reserve enough room in the equivalence class arrays so that we
- * can use the CSIZE'th element to hold equivalence class information
- * for the NUL character. Later we'll move this information into
- * the 0th element.
- */
-extern int numecs, nextecm[CSIZE + 1], ecgroup[CSIZE + 1], nummecs;
-
-/* Meta-equivalence classes are indexed starting at 1, so it's possible
- * that they will require positions from 1 .. CSIZE, i.e., CSIZE + 1
- * slots total (since the arrays are 0-based). nextecm[] and ecgroup[]
- * don't require the extra position since they're indexed from 1 .. CSIZE - 1.
- */
-extern int tecfwd[CSIZE + 1], tecbck[CSIZE + 1];
-
-
-/* Variables for start conditions:
- * lastsc - last start condition created
- * current_max_scs - current limit on number of start conditions
- * scset - set of rules active in start condition
- * scbol - set of rules active only at the beginning of line in a s.c.
- * scxclu - true if start condition is exclusive
- * sceof - true if start condition has EOF rule
- * scname - start condition name
- */
-
-extern int lastsc, *scset, *scbol, *scxclu, *sceof;
-extern int current_max_scs;
-extern char **scname;
-
-
-/* Variables for dfa machine data:
- * current_max_dfa_size - current maximum number of NFA states in DFA
- * current_max_xpairs - current maximum number of non-template xtion pairs
- * current_max_template_xpairs - current maximum number of template pairs
- * current_max_dfas - current maximum number DFA states
- * lastdfa - last dfa state number created
- * nxt - state to enter upon reading character
- * chk - check value to see if "nxt" applies
- * tnxt - internal nxt table for templates
- * base - offset into "nxt" for given state
- * def - where to go if "chk" disallows "nxt" entry
- * nultrans - NUL transition for each state
- * NUL_ec - equivalence class of the NUL character
- * tblend - last "nxt/chk" table entry being used
- * firstfree - first empty entry in "nxt/chk" table
- * dss - nfa state set for each dfa
- * dfasiz - size of nfa state set for each dfa
- * dfaacc - accepting set for each dfa state (if using REJECT), or accepting
- * number, if not
- * accsiz - size of accepting set for each dfa state
- * dhash - dfa state hash value
- * numas - number of DFA accepting states created; note that this
- * is not necessarily the same value as num_rules, which is the analogous
- * value for the NFA
- * numsnpairs - number of state/nextstate transition pairs
- * jambase - position in base/def where the default jam table starts
- * jamstate - state number corresponding to "jam" state
- * end_of_buffer_state - end-of-buffer dfa state number
- */
-
-extern int current_max_dfa_size, current_max_xpairs;
-extern int current_max_template_xpairs, current_max_dfas;
-extern int lastdfa, *nxt, *chk, *tnxt;
-extern int *base, *def, *nultrans, NUL_ec, tblend, firstfree, **dss, *dfasiz;
-extern union dfaacc_union
- {
- int *dfaacc_set;
- int dfaacc_state;
- } *dfaacc;
-extern int *accsiz, *dhash, numas;
-extern int numsnpairs, jambase, jamstate;
-extern int end_of_buffer_state;
-
-/* Variables for ccl information:
- * lastccl - ccl index of the last created ccl
- * current_maxccls - current limit on the maximum number of unique ccl's
- * cclmap - maps a ccl index to its set pointer
- * ccllen - gives the length of a ccl
- * cclng - true for a given ccl if the ccl is negated
- * cclreuse - counts how many times a ccl is re-used
- * current_max_ccl_tbl_size - current limit on number of characters needed
- * to represent the unique ccl's
- * ccltbl - holds the characters in each ccl - indexed by cclmap
- */
-
-extern int lastccl, *cclmap, *ccllen, *cclng, cclreuse;
-extern int current_maxccls, current_max_ccl_tbl_size;
-extern Char *ccltbl;
-
-
-/* Variables for miscellaneous information:
- * nmstr - last NAME scanned by the scanner
- * sectnum - section number currently being parsed
- * nummt - number of empty nxt/chk table entries
- * hshcol - number of hash collisions detected by snstods
- * dfaeql - number of times a newly created dfa was equal to an old one
- * numeps - number of epsilon NFA states created
- * eps2 - number of epsilon states which have 2 out-transitions
- * num_reallocs - number of times it was necessary to realloc() a group
- * of arrays
- * tmpuses - number of DFA states that chain to templates
- * totnst - total number of NFA states used to make DFA states
- * peakpairs - peak number of transition pairs we had to store internally
- * numuniq - number of unique transitions
- * numdup - number of duplicate transitions
- * hshsave - number of hash collisions saved by checking number of states
- * num_backing_up - number of DFA states requiring backing up
- * bol_needed - whether scanner needs beginning-of-line recognition
- */
-
-extern char nmstr[MAXLINE];
-extern int sectnum, nummt, hshcol, dfaeql, numeps, eps2, num_reallocs;
-extern int tmpuses, totnst, peakpairs, numuniq, numdup, hshsave;
-extern int num_backing_up, bol_needed;
-
-void *allocate_array PROTO((int, size_t));
-void *reallocate_array PROTO((void*, int, size_t));
-
-void *flex_alloc PROTO((size_t));
-void *flex_realloc PROTO((void*, size_t));
-void flex_free PROTO((void*));
-
-#define allocate_integer_array(size) \
- (int *) allocate_array( size, sizeof( int ) )
-
-#define reallocate_integer_array(array,size) \
- (int *) reallocate_array( (void *) array, size, sizeof( int ) )
-
-#define allocate_int_ptr_array(size) \
- (int **) allocate_array( size, sizeof( int * ) )
-
-#define allocate_char_ptr_array(size) \
- (char **) allocate_array( size, sizeof( char * ) )
-
-#define allocate_dfaacc_union(size) \
- (union dfaacc_union *) \
- allocate_array( size, sizeof( union dfaacc_union ) )
-
-#define reallocate_int_ptr_array(array,size) \
- (int **) reallocate_array( (void *) array, size, sizeof( int * ) )
-
-#define reallocate_char_ptr_array(array,size) \
- (char **) reallocate_array( (void *) array, size, sizeof( char * ) )
-
-#define reallocate_dfaacc_union(array, size) \
- (union dfaacc_union *) \
- reallocate_array( (void *) array, size, sizeof( union dfaacc_union ) )
-
-#define allocate_character_array(size) \
- (char *) allocate_array( size, sizeof( char ) )
-
-#define reallocate_character_array(array,size) \
- (char *) reallocate_array( (void *) array, size, sizeof( char ) )
-
-#define allocate_Character_array(size) \
- (Char *) allocate_array( size, sizeof( Char ) )
-
-#define reallocate_Character_array(array,size) \
- (Char *) reallocate_array( (void *) array, size, sizeof( Char ) )
-
-
-/* Used to communicate between scanner and parser. The type should really
- * be YYSTYPE, but we can't easily get our hands on it.
- */
-extern int yylval;
-
-
-/* External functions that are cross-referenced among the flex source files. */
-
-
-/* from file ccl.c */
-
-extern void ccladd PROTO((int, int)); /* add a single character to a ccl */
-extern int cclinit PROTO((void)); /* make an empty ccl */
-extern void cclnegate PROTO((int)); /* negate a ccl */
-
-/* List the members of a set of characters in CCL form. */
-extern void list_character_set PROTO((FILE*, int[]));
-
-
-/* from file dfa.c */
-
-/* Check a DFA state for backing up. */
-extern void check_for_backing_up PROTO((int, int[]));
-
-/* Check to see if NFA state set constitutes "dangerous" trailing context. */
-extern void check_trailing_context PROTO((int*, int, int*, int));
-
-/* Construct the epsilon closure of a set of ndfa states. */
-extern int *epsclosure PROTO((int*, int*, int[], int*, int*));
-
-/* Increase the maximum number of dfas. */
-extern void increase_max_dfas PROTO((void));
-
-extern void ntod PROTO((void)); /* convert a ndfa to a dfa */
-
-/* Converts a set of ndfa states into a dfa state. */
-extern int snstods PROTO((int[], int, int[], int, int, int*));
-
-
-/* from file ecs.c */
-
-/* Convert character classes to set of equivalence classes. */
-extern void ccl2ecl PROTO((void));
-
-/* Associate equivalence class numbers with class members. */
-extern int cre8ecs PROTO((int[], int[], int));
-
-/* Update equivalence classes based on character class transitions. */
-extern void mkeccl PROTO((Char[], int, int[], int[], int, int));
-
-/* Create equivalence class for single character. */
-extern void mkechar PROTO((int, int[], int[]));
-
-
-/* from file gen.c */
-
-extern void do_indent PROTO((void)); /* indent to the current level */
-
-/* Generate the code to keep backing-up information. */
-extern void gen_backing_up PROTO((void));
-
-/* Generate the code to perform the backing up. */
-extern void gen_bu_action PROTO((void));
-
-/* Generate full speed compressed transition table. */
-extern void genctbl PROTO((void));
-
-/* Generate the code to find the action number. */
-extern void gen_find_action PROTO((void));
-
-extern void genftbl PROTO((void)); /* generate full transition table */
-
-/* Generate the code to find the next compressed-table state. */
-extern void gen_next_compressed_state PROTO((char*));
-
-/* Generate the code to find the next match. */
-extern void gen_next_match PROTO((void));
-
-/* Generate the code to find the next state. */
-extern void gen_next_state PROTO((int));
-
-/* Generate the code to make a NUL transition. */
-extern void gen_NUL_trans PROTO((void));
-
-/* Generate the code to find the start state. */
-extern void gen_start_state PROTO((void));
-
-/* Generate data statements for the transition tables. */
-extern void gentabs PROTO((void));
-
-/* Write out a formatted string at the current indentation level. */
-extern void indent_put2s PROTO((char[], char[]));
-
-/* Write out a string + newline at the current indentation level. */
-extern void indent_puts PROTO((char[]));
-
-extern void make_tables PROTO((void)); /* generate transition tables */
-
-
-/* from file main.c */
-
-extern void check_options PROTO((void));
-extern void flexend PROTO((int));
-extern void usage PROTO((void));
-
-
-/* from file misc.c */
-
-/* Add a #define to the action file. */
-extern void action_define PROTO(( char *defname, int value ));
-
-/* Add the given text to the stored actions. */
-extern void add_action PROTO(( char *new_text ));
-
-/* True if a string is all lower case. */
-extern int all_lower PROTO((char *));
-
-/* True if a string is all upper case. */
-extern int all_upper PROTO((char *));
-
-/* Bubble sort an integer array. */
-extern void bubble PROTO((int [], int));
-
-/* Check a character to make sure it's in the expected range. */
-extern void check_char PROTO((int c));
-
-/* Replace upper-case letter to lower-case. */
-extern Char clower PROTO((int));
-
-/* Returns a dynamically allocated copy of a string. */
-extern char *copy_string PROTO((const char *));
-
-/* Returns a dynamically allocated copy of a (potentially) unsigned string. */
-extern Char *copy_unsigned_string PROTO((Char *));
-
-/* Shell sort a character array. */
-extern void cshell PROTO((Char [], int, int));
-
-/* Finish up a block of data declarations. */
-extern void dataend PROTO((void));
-
-/* Flush generated data statements. */
-extern void dataflush PROTO((void));
-
-/* Report an error message and terminate. */
-extern void flexerror PROTO((const char[]));
-
-/* Report a fatal error message and terminate. */
-extern void flexfatal PROTO((const char[]));
-
-/* Convert a hexadecimal digit string to an integer value. */
-extern int htoi PROTO((Char[]));
-
-/* Report an error message formatted with one integer argument. */
-extern void lerrif PROTO((const char[], int));
-
-/* Report an error message formatted with one string argument. */
-extern void lerrsf PROTO((const char[], const char[]));
-
-/* Spit out a "#line" statement. */
-extern void line_directive_out PROTO((FILE*, int));
-
-/* Mark the current position in the action array as the end of the section 1
- * user defs.
- */
-extern void mark_defs1 PROTO((void));
-
-/* Mark the current position in the action array as the end of the prolog. */
-extern void mark_prolog PROTO((void));
-
-/* Generate a data statment for a two-dimensional array. */
-extern void mk2data PROTO((int));
-
-extern void mkdata PROTO((int)); /* generate a data statement */
-
-/* Return the integer represented by a string of digits. */
-extern int myctoi PROTO((char []));
-
-/* Return character corresponding to escape sequence. */
-extern Char myesc PROTO((Char[]));
-
-/* Convert an octal digit string to an integer value. */
-extern int otoi PROTO((Char [] ));
-
-/* Output a (possibly-formatted) string to the generated scanner. */
-extern void out PROTO((const char []));
-extern void out_dec PROTO((const char [], int));
-extern void out_dec2 PROTO((const char [], int, int));
-extern void out_hex PROTO((const char [], unsigned int));
-extern void out_line_count PROTO((const char []));
-extern void out_str PROTO((const char [], const char []));
-extern void out_str3
- PROTO((const char [], const char [], const char [], const char []));
-extern void out_str_dec PROTO((const char [], const char [], int));
-extern void outc PROTO((int));
-extern void outn PROTO((const char []));
-
-/* Return a printable version of the given character, which might be
- * 8-bit.
- */
-extern char *readable_form PROTO((int));
-
-/* Write out one section of the skeleton file. */
-extern void skelout PROTO((void));
-
-/* Output a yy_trans_info structure. */
-extern void transition_struct_out PROTO((int, int));
-
-/* Only needed when using certain broken versions of bison to build parse.c. */
-extern void *yy_flex_xmalloc PROTO(( int ));
-
-/* Set a region of memory to 0. */
-extern void zero_out PROTO((char *, size_t));
-
-
-/* from file nfa.c */
-
-/* Add an accepting state to a machine. */
-extern void add_accept PROTO((int, int));
-
-/* Make a given number of copies of a singleton machine. */
-extern int copysingl PROTO((int, int));
-
-/* Debugging routine to write out an nfa. */
-extern void dumpnfa PROTO((int));
-
-/* Finish up the processing for a rule. */
-extern void finish_rule PROTO((int, int, int, int));
-
-/* Connect two machines together. */
-extern int link_machines PROTO((int, int));
-
-/* Mark each "beginning" state in a machine as being a "normal" (i.e.,
- * not trailing context associated) state.
- */
-extern void mark_beginning_as_normal PROTO((int));
-
-/* Make a machine that branches to two machines. */
-extern int mkbranch PROTO((int, int));
-
-extern int mkclos PROTO((int)); /* convert a machine into a closure */
-extern int mkopt PROTO((int)); /* make a machine optional */
-
-/* Make a machine that matches either one of two machines. */
-extern int mkor PROTO((int, int));
-
-/* Convert a machine into a positive closure. */
-extern int mkposcl PROTO((int));
-
-extern int mkrep PROTO((int, int, int)); /* make a replicated machine */
-
-/* Create a state with a transition on a given symbol. */
-extern int mkstate PROTO((int));
-
-extern void new_rule PROTO((void)); /* initialize for a new rule */
-
-
-/* from file parse.y */
-
-/* Build the "<<EOF>>" action for the active start conditions. */
-extern void build_eof_action PROTO((void));
-
-/* Write out a message formatted with one string, pinpointing its location. */
-extern void format_pinpoint_message PROTO((char[], char[]));
-
-/* Write out a message, pinpointing its location. */
-extern void pinpoint_message PROTO((char[]));
-
-/* Write out a warning, pinpointing it at the given line. */
-extern void line_warning PROTO(( char[], int ));
-
-/* Write out a message, pinpointing it at the given line. */
-extern void line_pinpoint PROTO(( char[], int ));
-
-/* Report a formatted syntax error. */
-extern void format_synerr PROTO((char [], char[]));
-extern void synerr PROTO((char [])); /* report a syntax error */
-extern void format_warn PROTO((char [], char[]));
-extern void warn PROTO((char [])); /* report a warning */
-extern void yyerror PROTO((char [])); /* report a parse error */
-extern int yyparse PROTO((void)); /* the YACC parser */
-
-
-/* from file scan.l */
-
-/* The Flex-generated scanner for flex. */
-extern int flexscan PROTO((void));
-
-/* Open the given file (if NULL, stdin) for scanning. */
-extern void set_input_file PROTO((char*));
-
-/* Wrapup a file in the lexical analyzer. */
-extern int yywrap PROTO((void));
-
-
-/* from file sym.c */
-
-/* Add symbol and definitions to symbol table. */
-extern int addsym PROTO((char[], char*, int, hash_table, int));
-
-/* Save the text of a character class. */
-extern void cclinstal PROTO ((Char [], int));
-
-/* Lookup the number associated with character class. */
-extern int ccllookup PROTO((Char []));
-
-/* Find symbol in symbol table. */
-extern struct hash_entry *findsym PROTO((char[], hash_table, int ));
-
-extern void ndinstal PROTO((char[], Char[])); /* install a name definition */
-extern Char *ndlookup PROTO((char[])); /* lookup a name definition */
-
-/* Increase maximum number of SC's. */
-extern void scextend PROTO((void));
-extern void scinstal PROTO((char[], int)); /* make a start condition */
-
-/* Lookup the number associated with a start condition. */
-extern int sclookup PROTO((char[]));
-
-
-/* from file tblcmp.c */
-
-/* Build table entries for dfa state. */
-extern void bldtbl PROTO((int[], int, int, int, int));
-
-extern void cmptmps PROTO((void)); /* compress template table entries */
-extern void expand_nxt_chk PROTO((void)); /* increase nxt/chk arrays */
-/* Finds a space in the table for a state to be placed. */
-extern int find_table_space PROTO((int*, int));
-extern void inittbl PROTO((void)); /* initialize transition tables */
-/* Make the default, "jam" table entries. */
-extern void mkdeftbl PROTO((void));
-
-/* Create table entries for a state (or state fragment) which has
- * only one out-transition.
- */
-extern void mk1tbl PROTO((int, int, int, int));
-
-/* Place a state into full speed transition table. */
-extern void place_state PROTO((int*, int, int));
-
-/* Save states with only one out-transition to be processed later. */
-extern void stack1 PROTO((int, int, int, int));
-
-
-/* from file yylex.c */
-
-extern int yylex PROTO((void));
diff --git a/usr.bin/lex/gen.c b/usr.bin/lex/gen.c
deleted file mode 100644
index b72688b..0000000
--- a/usr.bin/lex/gen.c
+++ /dev/null
@@ -1,1629 +0,0 @@
-/* gen - actual generation (writing) of flex scanners */
-
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Vern Paxson.
- *
- * The United States Government has rights in this work pursuant
- * to contract no. DE-AC03-76SF00098 between the United States
- * Department of Energy and the University of California.
- *
- * Redistribution and use in source and binary forms are permitted provided
- * that: (1) source distributions retain this entire copyright notice and
- * comment, and (2) distributions including binaries display the following
- * acknowledgement: ``This product includes software developed by the
- * University of California, Berkeley and its contributors'' in the
- * documentation or other materials provided with the distribution and in
- * all advertising materials mentioning features or use of this software.
- * Neither the name of the University nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/* $Header: /home/daffy/u0/vern/flex/RCS/gen.c,v 2.56 96/05/25 20:43:38 vern Exp $ */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "flexdef.h"
-
-
-/* declare functions that have forward references */
-
-void gen_next_state PROTO((int));
-void genecs PROTO((void));
-void indent_put2s PROTO((char [], char []));
-void indent_puts PROTO((char []));
-
-
-static int indent_level = 0; /* each level is 8 spaces */
-
-#define indent_up() (++indent_level)
-#define indent_down() (--indent_level)
-#define set_indent(indent_val) indent_level = indent_val
-
-/* Almost everything is done in terms of arrays starting at 1, so provide
- * a null entry for the zero element of all C arrays. (The exception
- * to this is that the fast table representation generally uses the
- * 0 elements of its arrays, too.)
- */
-static char C_int_decl[] = "static yyconst int %s[%d] =\n { 0,\n";
-static char C_short_decl[] = "static yyconst short int %s[%d] =\n { 0,\n";
-static char C_long_decl[] = "static yyconst long int %s[%d] =\n { 0,\n";
-static char C_state_decl[] =
- "static yyconst yy_state_type %s[%d] =\n { 0,\n";
-
-
-/* Indent to the current level. */
-
-void do_indent()
- {
- int i = indent_level * 8;
-
- while ( i >= 8 )
- {
- outc( '\t' );
- i -= 8;
- }
-
- while ( i > 0 )
- {
- outc( ' ' );
- --i;
- }
- }
-
-
-/* Generate the code to keep backing-up information. */
-
-void gen_backing_up()
- {
- if ( reject || num_backing_up == 0 )
- return;
-
- if ( fullspd )
- indent_puts( "if ( yy_current_state[-1].yy_nxt )" );
- else
- indent_puts( "if ( yy_accept[yy_current_state] )" );
-
- indent_up();
- indent_puts( "{" );
- indent_puts( "yy_last_accepting_state = yy_current_state;" );
- indent_puts( "yy_last_accepting_cpos = yy_cp;" );
- indent_puts( "}" );
- indent_down();
- }
-
-
-/* Generate the code to perform the backing up. */
-
-void gen_bu_action()
- {
- if ( reject || num_backing_up == 0 )
- return;
-
- set_indent( 3 );
-
- indent_puts( "case 0: /* must back up */" );
- indent_puts( "/* undo the effects of YY_DO_BEFORE_ACTION */" );
- indent_puts( "*yy_cp = yy_hold_char;" );
-
- if ( fullspd || fulltbl )
- indent_puts( "yy_cp = yy_last_accepting_cpos + 1;" );
- else
- /* Backing-up info for compressed tables is taken \after/
- * yy_cp has been incremented for the next state.
- */
- indent_puts( "yy_cp = yy_last_accepting_cpos;" );
-
- indent_puts( "yy_current_state = yy_last_accepting_state;" );
- indent_puts( "goto yy_find_action;" );
- outc( '\n' );
-
- set_indent( 0 );
- }
-
-
-/* genctbl - generates full speed compressed transition table */
-
-void genctbl()
- {
- int i;
- int end_of_buffer_action = num_rules + 1;
-
- /* Table of verify for transition and offset to next state. */
- out_dec( "static yyconst struct yy_trans_info yy_transition[%d] =\n",
- tblend + numecs + 1 );
- outn( " {" );
-
- /* We want the transition to be represented as the offset to the
- * next state, not the actual state number, which is what it currently
- * is. The offset is base[nxt[i]] - (base of current state)]. That's
- * just the difference between the starting points of the two involved
- * states (to - from).
- *
- * First, though, we need to find some way to put in our end-of-buffer
- * flags and states. We do this by making a state with absolutely no
- * transitions. We put it at the end of the table.
- */
-
- /* We need to have room in nxt/chk for two more slots: One for the
- * action and one for the end-of-buffer transition. We now *assume*
- * that we're guaranteed the only character we'll try to index this
- * nxt/chk pair with is EOB, i.e., 0, so we don't have to make sure
- * there's room for jam entries for other characters.
- */
-
- while ( tblend + 2 >= current_max_xpairs )
- expand_nxt_chk();
-
- while ( lastdfa + 1 >= current_max_dfas )
- increase_max_dfas();
-
- base[lastdfa + 1] = tblend + 2;
- nxt[tblend + 1] = end_of_buffer_action;
- chk[tblend + 1] = numecs + 1;
- chk[tblend + 2] = 1; /* anything but EOB */
-
- /* So that "make test" won't show arb. differences. */
- nxt[tblend + 2] = 0;
-
- /* Make sure every state has an end-of-buffer transition and an
- * action #.
- */
- for ( i = 0; i <= lastdfa; ++i )
- {
- int anum = dfaacc[i].dfaacc_state;
- int offset = base[i];
-
- chk[offset] = EOB_POSITION;
- chk[offset - 1] = ACTION_POSITION;
- nxt[offset - 1] = anum; /* action number */
- }
-
- for ( i = 0; i <= tblend; ++i )
- {
- if ( chk[i] == EOB_POSITION )
- transition_struct_out( 0, base[lastdfa + 1] - i );
-
- else if ( chk[i] == ACTION_POSITION )
- transition_struct_out( 0, nxt[i] );
-
- else if ( chk[i] > numecs || chk[i] == 0 )
- transition_struct_out( 0, 0 ); /* unused slot */
-
- else /* verify, transition */
- transition_struct_out( chk[i],
- base[nxt[i]] - (i - chk[i]) );
- }
-
-
- /* Here's the final, end-of-buffer state. */
- transition_struct_out( chk[tblend + 1], nxt[tblend + 1] );
- transition_struct_out( chk[tblend + 2], nxt[tblend + 2] );
-
- outn( " };\n" );
-
- /* Table of pointers to start states. */
- out_dec(
- "static yyconst struct yy_trans_info *yy_start_state_list[%d] =\n",
- lastsc * 2 + 1 );
- outn( " {" ); /* } so vi doesn't get confused */
-
- for ( i = 0; i <= lastsc * 2; ++i )
- out_dec( " &yy_transition[%d],\n", base[i] );
-
- dataend();
-
- if ( useecs )
- genecs();
- }
-
-
-/* Generate equivalence-class tables. */
-
-void genecs()
- {
- int i, j;
- int numrows;
-
- out_str_dec( C_int_decl, "yy_ec", csize );
-
- for ( i = 1; i < csize; ++i )
- {
- if ( caseins && (i >= 'A') && (i <= 'Z') )
- ecgroup[i] = ecgroup[clower( i )];
-
- ecgroup[i] = ABS( ecgroup[i] );
- mkdata( ecgroup[i] );
- }
-
- dataend();
-
- if ( trace )
- {
- fputs( _( "\n\nEquivalence Classes:\n\n" ), stderr );
-
- numrows = csize / 8;
-
- for ( j = 0; j < numrows; ++j )
- {
- for ( i = j; i < csize; i = i + numrows )
- {
- fprintf( stderr, "%4s = %-2d",
- readable_form( i ), ecgroup[i] );
-
- putc( ' ', stderr );
- }
-
- putc( '\n', stderr );
- }
- }
- }
-
-
-/* Generate the code to find the action number. */
-
-void gen_find_action()
- {
- if ( fullspd )
- indent_puts( "yy_act = yy_current_state[-1].yy_nxt;" );
-
- else if ( fulltbl )
- indent_puts( "yy_act = yy_accept[yy_current_state];" );
-
- else if ( reject )
- {
- indent_puts( "yy_current_state = *--yy_state_ptr;" );
- indent_puts( "yy_lp = yy_accept[yy_current_state];" );
-
- outn(
- "goto find_rule; /* avoid `defined but not used' warning */");
- outn(
- "find_rule: /* we branch to this label when backing up */" );
-
- indent_puts(
- "for ( ; ; ) /* until we find what rule we matched */" );
-
- indent_up();
-
- indent_puts( "{" );
-
- indent_puts(
- "if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] )" );
- indent_up();
- indent_puts( "{" );
- indent_puts( "yy_act = yy_acclist[yy_lp];" );
-
- if ( variable_trailing_context_rules )
- {
- indent_puts( "if ( yy_act & YY_TRAILING_HEAD_MASK ||" );
- indent_puts( " yy_looking_for_trail_begin )" );
- indent_up();
- indent_puts( "{" );
-
- indent_puts(
- "if ( yy_act == yy_looking_for_trail_begin )" );
- indent_up();
- indent_puts( "{" );
- indent_puts( "yy_looking_for_trail_begin = 0;" );
- indent_puts( "yy_act &= ~YY_TRAILING_HEAD_MASK;" );
- indent_puts( "break;" );
- indent_puts( "}" );
- indent_down();
-
- indent_puts( "}" );
- indent_down();
-
- indent_puts( "else if ( yy_act & YY_TRAILING_MASK )" );
- indent_up();
- indent_puts( "{" );
- indent_puts(
- "yy_looking_for_trail_begin = yy_act & ~YY_TRAILING_MASK;" );
- indent_puts(
- "yy_looking_for_trail_begin |= YY_TRAILING_HEAD_MASK;" );
-
- if ( real_reject )
- {
- /* Remember matched text in case we back up
- * due to REJECT.
- */
- indent_puts( "yy_full_match = yy_cp;" );
- indent_puts( "yy_full_state = yy_state_ptr;" );
- indent_puts( "yy_full_lp = yy_lp;" );
- }
-
- indent_puts( "}" );
- indent_down();
-
- indent_puts( "else" );
- indent_up();
- indent_puts( "{" );
- indent_puts( "yy_full_match = yy_cp;" );
- indent_puts( "yy_full_state = yy_state_ptr;" );
- indent_puts( "yy_full_lp = yy_lp;" );
- indent_puts( "break;" );
- indent_puts( "}" );
- indent_down();
-
- indent_puts( "++yy_lp;" );
- indent_puts( "goto find_rule;" );
- }
-
- else
- {
- /* Remember matched text in case we back up due to
- * trailing context plus REJECT.
- */
- indent_up();
- indent_puts( "{" );
- indent_puts( "yy_full_match = yy_cp;" );
- indent_puts( "break;" );
- indent_puts( "}" );
- indent_down();
- }
-
- indent_puts( "}" );
- indent_down();
-
- indent_puts( "--yy_cp;" );
-
- /* We could consolidate the following two lines with those at
- * the beginning, but at the cost of complaints that we're
- * branching inside a loop.
- */
- indent_puts( "yy_current_state = *--yy_state_ptr;" );
- indent_puts( "yy_lp = yy_accept[yy_current_state];" );
-
- indent_puts( "}" );
-
- indent_down();
- }
-
- else
- { /* compressed */
- indent_puts( "yy_act = yy_accept[yy_current_state];" );
-
- if ( interactive && ! reject )
- {
- /* Do the guaranteed-needed backing up to figure out
- * the match.
- */
- indent_puts( "if ( yy_act == 0 )" );
- indent_up();
- indent_puts( "{ /* have to back up */" );
- indent_puts( "yy_cp = yy_last_accepting_cpos;" );
- indent_puts(
- "yy_current_state = yy_last_accepting_state;" );
- indent_puts( "yy_act = yy_accept[yy_current_state];" );
- indent_puts( "}" );
- indent_down();
- }
- }
- }
-
-
-/* genftbl - generate full transition table */
-
-void genftbl()
- {
- int i;
- int end_of_buffer_action = num_rules + 1;
-
- out_str_dec( long_align ? C_long_decl : C_short_decl,
- "yy_accept", lastdfa + 1 );
-
- dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action;
-
- for ( i = 1; i <= lastdfa; ++i )
- {
- int anum = dfaacc[i].dfaacc_state;
-
- mkdata( anum );
-
- if ( trace && anum )
- fprintf( stderr, _( "state # %d accepts: [%d]\n" ),
- i, anum );
- }
-
- dataend();
-
- if ( useecs )
- genecs();
-
- /* Don't have to dump the actual full table entries - they were
- * created on-the-fly.
- */
- }
-
-
-/* Generate the code to find the next compressed-table state. */
-
-void gen_next_compressed_state( char_map )
-char *char_map;
- {
- indent_put2s( "YY_CHAR yy_c = %s;", char_map );
-
- /* Save the backing-up info \before/ computing the next state
- * because we always compute one more state than needed - we
- * always proceed until we reach a jam state
- */
- gen_backing_up();
-
- indent_puts(
-"while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )" );
- indent_up();
- indent_puts( "{" );
- indent_puts( "yy_current_state = (int) yy_def[yy_current_state];" );
-
- if ( usemecs )
- {
- /* We've arrange it so that templates are never chained
- * to one another. This means we can afford to make a
- * very simple test to see if we need to convert to
- * yy_c's meta-equivalence class without worrying
- * about erroneously looking up the meta-equivalence
- * class twice
- */
- do_indent();
-
- /* lastdfa + 2 is the beginning of the templates */
- out_dec( "if ( yy_current_state >= %d )\n", lastdfa + 2 );
-
- indent_up();
- indent_puts( "yy_c = yy_meta[(unsigned int) yy_c];" );
- indent_down();
- }
-
- indent_puts( "}" );
- indent_down();
-
- indent_puts(
-"yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];" );
- }
-
-
-/* Generate the code to find the next match. */
-
-void gen_next_match()
- {
- /* NOTE - changes in here should be reflected in gen_next_state() and
- * gen_NUL_trans().
- */
- char *char_map = useecs ?
- "yy_ec[YY_SC_TO_UI(*yy_cp)]" :
- "YY_SC_TO_UI(*yy_cp)";
-
- char *char_map_2 = useecs ?
- "yy_ec[YY_SC_TO_UI(*++yy_cp)]" :
- "YY_SC_TO_UI(*++yy_cp)";
-
- if ( fulltbl )
- {
- indent_put2s(
- "while ( (yy_current_state = yy_nxt[yy_current_state][%s]) > 0 )",
- char_map );
-
- indent_up();
-
- if ( num_backing_up > 0 )
- {
- indent_puts( "{" ); /* } for vi */
- gen_backing_up();
- outc( '\n' );
- }
-
- indent_puts( "++yy_cp;" );
-
- if ( num_backing_up > 0 )
- /* { for vi */
- indent_puts( "}" );
-
- indent_down();
-
- outc( '\n' );
- indent_puts( "yy_current_state = -yy_current_state;" );
- }
-
- else if ( fullspd )
- {
- indent_puts( "{" ); /* } for vi */
- indent_puts(
- "yyconst struct yy_trans_info *yy_trans_info;\n" );
- indent_puts( "YY_CHAR yy_c;\n" );
- indent_put2s( "for ( yy_c = %s;", char_map );
- indent_puts(
- " (yy_trans_info = &yy_current_state[(unsigned int) yy_c])->" );
- indent_puts( "yy_verify == yy_c;" );
- indent_put2s( " yy_c = %s )", char_map_2 );
-
- indent_up();
-
- if ( num_backing_up > 0 )
- indent_puts( "{" ); /* } for vi */
-
- indent_puts( "yy_current_state += yy_trans_info->yy_nxt;" );
-
- if ( num_backing_up > 0 )
- {
- outc( '\n' );
- gen_backing_up(); /* { for vi */
- indent_puts( "}" );
- }
-
- indent_down(); /* { for vi */
- indent_puts( "}" );
- }
-
- else
- { /* compressed */
- indent_puts( "do" );
-
- indent_up();
- indent_puts( "{" ); /* } for vi */
-
- gen_next_state( false );
-
- indent_puts( "++yy_cp;" );
-
- /* { for vi */
- indent_puts( "}" );
- indent_down();
-
- do_indent();
-
- if ( interactive )
- out_dec( "while ( yy_base[yy_current_state] != %d );\n",
- jambase );
- else
- out_dec( "while ( yy_current_state != %d );\n",
- jamstate );
-
- if ( ! reject && ! interactive )
- {
- /* Do the guaranteed-needed backing up to figure out
- * the match.
- */
- indent_puts( "yy_cp = yy_last_accepting_cpos;" );
- indent_puts(
- "yy_current_state = yy_last_accepting_state;" );
- }
- }
- }
-
-
-/* Generate the code to find the next state. */
-
-void gen_next_state( worry_about_NULs )
-int worry_about_NULs;
- { /* NOTE - changes in here should be reflected in gen_next_match() */
- char char_map[256];
-
- if ( worry_about_NULs && ! nultrans )
- {
- if ( useecs )
- (void) sprintf( char_map,
- "(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : %d)",
- NUL_ec );
- else
- (void) sprintf( char_map,
- "(*yy_cp ? YY_SC_TO_UI(*yy_cp) : %d)", NUL_ec );
- }
-
- else
- strcpy( char_map, useecs ?
- "yy_ec[YY_SC_TO_UI(*yy_cp)]" : "YY_SC_TO_UI(*yy_cp)" );
-
- if ( worry_about_NULs && nultrans )
- {
- if ( ! fulltbl && ! fullspd )
- /* Compressed tables back up *before* they match. */
- gen_backing_up();
-
- indent_puts( "if ( *yy_cp )" );
- indent_up();
- indent_puts( "{" ); /* } for vi */
- }
-
- if ( fulltbl )
- indent_put2s(
- "yy_current_state = yy_nxt[yy_current_state][%s];",
- char_map );
-
- else if ( fullspd )
- indent_put2s(
- "yy_current_state += yy_current_state[%s].yy_nxt;",
- char_map );
-
- else
- gen_next_compressed_state( char_map );
-
- if ( worry_about_NULs && nultrans )
- {
- /* { for vi */
- indent_puts( "}" );
- indent_down();
- indent_puts( "else" );
- indent_up();
- indent_puts(
- "yy_current_state = yy_NUL_trans[yy_current_state];" );
- indent_down();
- }
-
- if ( fullspd || fulltbl )
- gen_backing_up();
-
- if ( reject )
- indent_puts( "*yy_state_ptr++ = yy_current_state;" );
- }
-
-
-/* Generate the code to make a NUL transition. */
-
-void gen_NUL_trans()
- { /* NOTE - changes in here should be reflected in gen_next_match() */
- /* Only generate a definition for "yy_cp" if we'll generate code
- * that uses it. Otherwise lint and the like complain.
- */
- int need_backing_up = (num_backing_up > 0 && ! reject);
-
- if ( need_backing_up && (! nultrans || fullspd || fulltbl) )
- /* We're going to need yy_cp lying around for the call
- * below to gen_backing_up().
- */
- indent_puts( "char *yy_cp = yy_c_buf_p;" );
-
- outc( '\n' );
-
- if ( nultrans )
- {
- indent_puts(
- "yy_current_state = yy_NUL_trans[yy_current_state];" );
- indent_puts( "yy_is_jam = (yy_current_state == 0);" );
- }
-
- else if ( fulltbl )
- {
- do_indent();
- out_dec( "yy_current_state = yy_nxt[yy_current_state][%d];\n",
- NUL_ec );
- indent_puts( "yy_is_jam = (yy_current_state <= 0);" );
- }
-
- else if ( fullspd )
- {
- do_indent();
- out_dec( "int yy_c = %d;\n", NUL_ec );
-
- indent_puts(
- "yyconst struct yy_trans_info *yy_trans_info;\n" );
- indent_puts(
- "yy_trans_info = &yy_current_state[(unsigned int) yy_c];" );
- indent_puts( "yy_current_state += yy_trans_info->yy_nxt;" );
-
- indent_puts(
- "yy_is_jam = (yy_trans_info->yy_verify != yy_c);" );
- }
-
- else
- {
- char NUL_ec_str[20];
-
- (void) sprintf( NUL_ec_str, "%d", NUL_ec );
- gen_next_compressed_state( NUL_ec_str );
-
- do_indent();
- out_dec( "yy_is_jam = (yy_current_state == %d);\n", jamstate );
-
- if ( reject )
- {
- /* Only stack this state if it's a transition we
- * actually make. If we stack it on a jam, then
- * the state stack and yy_c_buf_p get out of sync.
- */
- indent_puts( "if ( ! yy_is_jam )" );
- indent_up();
- indent_puts( "*yy_state_ptr++ = yy_current_state;" );
- indent_down();
- }
- }
-
- /* If we've entered an accepting state, back up; note that
- * compressed tables have *already* done such backing up, so
- * we needn't bother with it again.
- */
- if ( need_backing_up && (fullspd || fulltbl) )
- {
- outc( '\n' );
- indent_puts( "if ( ! yy_is_jam )" );
- indent_up();
- indent_puts( "{" );
- gen_backing_up();
- indent_puts( "}" );
- indent_down();
- }
- }
-
-
-/* Generate the code to find the start state. */
-
-void gen_start_state()
- {
- if ( fullspd )
- {
- if ( bol_needed )
- {
- indent_puts(
- "yy_current_state = yy_start_state_list[yy_start + YY_AT_BOL()];" );
- }
- else
- indent_puts(
- "yy_current_state = yy_start_state_list[yy_start];" );
- }
-
- else
- {
- indent_puts( "yy_current_state = yy_start;" );
-
- if ( bol_needed )
- indent_puts( "yy_current_state += YY_AT_BOL();" );
-
- if ( reject )
- {
- /* Set up for storing up states. */
- indent_puts( "yy_state_ptr = yy_state_buf;" );
- indent_puts( "*yy_state_ptr++ = yy_current_state;" );
- }
- }
- }
-
-
-/* gentabs - generate data statements for the transition tables */
-
-void gentabs()
- {
- int i, j, k, *accset, nacc, *acc_array, total_states;
- int end_of_buffer_action = num_rules + 1;
-
- acc_array = allocate_integer_array( current_max_dfas );
- nummt = 0;
-
- /* The compressed table format jams by entering the "jam state",
- * losing information about the previous state in the process.
- * In order to recover the previous state, we effectively need
- * to keep backing-up information.
- */
- ++num_backing_up;
-
- if ( reject )
- {
- /* Write out accepting list and pointer list.
- *
- * First we generate the "yy_acclist" array. In the process,
- * we compute the indices that will go into the "yy_accept"
- * array, and save the indices in the dfaacc array.
- */
- int EOB_accepting_list[2];
-
- /* Set up accepting structures for the End Of Buffer state. */
- EOB_accepting_list[0] = 0;
- EOB_accepting_list[1] = end_of_buffer_action;
- accsiz[end_of_buffer_state] = 1;
- dfaacc[end_of_buffer_state].dfaacc_set = EOB_accepting_list;
-
- out_str_dec( long_align ? C_long_decl : C_short_decl,
- "yy_acclist", MAX( numas, 1 ) + 1 );
-
- j = 1; /* index into "yy_acclist" array */
-
- for ( i = 1; i <= lastdfa; ++i )
- {
- acc_array[i] = j;
-
- if ( accsiz[i] != 0 )
- {
- accset = dfaacc[i].dfaacc_set;
- nacc = accsiz[i];
-
- if ( trace )
- fprintf( stderr,
- _( "state # %d accepts: " ),
- i );
-
- for ( k = 1; k <= nacc; ++k )
- {
- int accnum = accset[k];
-
- ++j;
-
- if ( variable_trailing_context_rules &&
- ! (accnum & YY_TRAILING_HEAD_MASK) &&
- accnum > 0 && accnum <= num_rules &&
- rule_type[accnum] == RULE_VARIABLE )
- {
- /* Special hack to flag
- * accepting number as part
- * of trailing context rule.
- */
- accnum |= YY_TRAILING_MASK;
- }
-
- mkdata( accnum );
-
- if ( trace )
- {
- fprintf( stderr, "[%d]",
- accset[k] );
-
- if ( k < nacc )
- fputs( ", ", stderr );
- else
- putc( '\n', stderr );
- }
- }
- }
- }
-
- /* add accepting number for the "jam" state */
- acc_array[i] = j;
-
- dataend();
- }
-
- else
- {
- dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action;
-
- for ( i = 1; i <= lastdfa; ++i )
- acc_array[i] = dfaacc[i].dfaacc_state;
-
- /* add accepting number for jam state */
- acc_array[i] = 0;
- }
-
- /* Spit out "yy_accept" array. If we're doing "reject", it'll be
- * pointers into the "yy_acclist" array. Otherwise it's actual
- * accepting numbers. In either case, we just dump the numbers.
- */
-
- /* "lastdfa + 2" is the size of "yy_accept"; includes room for C arrays
- * beginning at 0 and for "jam" state.
- */
- k = lastdfa + 2;
-
- if ( reject )
- /* We put a "cap" on the table associating lists of accepting
- * numbers with state numbers. This is needed because we tell
- * where the end of an accepting list is by looking at where
- * the list for the next state starts.
- */
- ++k;
-
- out_str_dec( long_align ? C_long_decl : C_short_decl, "yy_accept", k );
-
- for ( i = 1; i <= lastdfa; ++i )
- {
- mkdata( acc_array[i] );
-
- if ( ! reject && trace && acc_array[i] )
- fprintf( stderr, _( "state # %d accepts: [%d]\n" ),
- i, acc_array[i] );
- }
-
- /* Add entry for "jam" state. */
- mkdata( acc_array[i] );
-
- if ( reject )
- /* Add "cap" for the list. */
- mkdata( acc_array[i] );
-
- dataend();
-
- if ( useecs )
- genecs();
-
- if ( usemecs )
- {
- /* Write out meta-equivalence classes (used to index
- * templates with).
- */
-
- if ( trace )
- fputs( _( "\n\nMeta-Equivalence Classes:\n" ),
- stderr );
-
- out_str_dec( C_int_decl, "yy_meta", numecs + 1 );
-
- for ( i = 1; i <= numecs; ++i )
- {
- if ( trace )
- fprintf( stderr, "%d = %d\n",
- i, ABS( tecbck[i] ) );
-
- mkdata( ABS( tecbck[i] ) );
- }
-
- dataend();
- }
-
- total_states = lastdfa + numtemps;
-
- out_str_dec( (tblend >= MAX_SHORT || long_align) ?
- C_long_decl : C_short_decl,
- "yy_base", total_states + 1 );
-
- for ( i = 1; i <= lastdfa; ++i )
- {
- int d = def[i];
-
- if ( base[i] == JAMSTATE )
- base[i] = jambase;
-
- if ( d == JAMSTATE )
- def[i] = jamstate;
-
- else if ( d < 0 )
- {
- /* Template reference. */
- ++tmpuses;
- def[i] = lastdfa - d + 1;
- }
-
- mkdata( base[i] );
- }
-
- /* Generate jam state's base index. */
- mkdata( base[i] );
-
- for ( ++i /* skip jam state */; i <= total_states; ++i )
- {
- mkdata( base[i] );
- def[i] = jamstate;
- }
-
- dataend();
-
- out_str_dec( (total_states >= MAX_SHORT || long_align) ?
- C_long_decl : C_short_decl,
- "yy_def", total_states + 1 );
-
- for ( i = 1; i <= total_states; ++i )
- mkdata( def[i] );
-
- dataend();
-
- out_str_dec( (total_states >= MAX_SHORT || long_align) ?
- C_long_decl : C_short_decl,
- "yy_nxt", tblend + 1 );
-
- for ( i = 1; i <= tblend; ++i )
- {
- /* Note, the order of the following test is important.
- * If chk[i] is 0, then nxt[i] is undefined.
- */
- if ( chk[i] == 0 || nxt[i] == 0 )
- nxt[i] = jamstate; /* new state is the JAM state */
-
- mkdata( nxt[i] );
- }
-
- dataend();
-
- out_str_dec( (total_states >= MAX_SHORT || long_align) ?
- C_long_decl : C_short_decl,
- "yy_chk", tblend + 1 );
-
- for ( i = 1; i <= tblend; ++i )
- {
- if ( chk[i] == 0 )
- ++nummt;
-
- mkdata( chk[i] );
- }
-
- dataend();
- }
-
-
-/* Write out a formatted string (with a secondary string argument) at the
- * current indentation level, adding a final newline.
- */
-
-void indent_put2s( fmt, arg )
-char fmt[], arg[];
- {
- do_indent();
- out_str( fmt, arg );
- outn( "" );
- }
-
-
-/* Write out a string at the current indentation level, adding a final
- * newline.
- */
-
-void indent_puts( str )
-char str[];
- {
- do_indent();
- outn( str );
- }
-
-
-/* make_tables - generate transition tables and finishes generating output file
- */
-
-void make_tables()
- {
- int i;
- int did_eof_rule = false;
-
- skelout();
-
- /* First, take care of YY_DO_BEFORE_ACTION depending on yymore
- * being used.
- */
- set_indent( 1 );
-
- if ( yymore_used && ! yytext_is_array )
- {
- indent_puts( "yytext_ptr -= yy_more_len; \\" );
- indent_puts( "yyleng = (int) (yy_cp - yytext_ptr); \\" );
- }
-
- else
- indent_puts( "yyleng = (int) (yy_cp - yy_bp); \\" );
-
- /* Now also deal with copying yytext_ptr to yytext if needed. */
- skelout();
- if ( yytext_is_array )
- {
- if ( yymore_used )
- indent_puts(
- "if ( yyleng + yy_more_offset >= YYLMAX ) \\" );
- else
- indent_puts( "if ( yyleng >= YYLMAX ) \\" );
-
- indent_up();
- indent_puts(
- "YY_FATAL_ERROR( \"token too large, exceeds YYLMAX\" ); \\" );
- indent_down();
-
- if ( yymore_used )
- {
- indent_puts(
-"yy_flex_strncpy( &yytext[yy_more_offset], yytext_ptr, yyleng + 1 ); \\" );
- indent_puts( "yyleng += yy_more_offset; \\" );
- indent_puts(
- "yy_prev_more_offset = yy_more_offset; \\" );
- indent_puts( "yy_more_offset = 0; \\" );
- }
- else
- {
- indent_puts(
- "yy_flex_strncpy( yytext, yytext_ptr, yyleng + 1 ); \\" );
- }
- }
-
- set_indent( 0 );
-
- skelout();
-
-
- out_dec( "#define YY_NUM_RULES %d\n", num_rules );
- out_dec( "#define YY_END_OF_BUFFER %d\n", num_rules + 1 );
-
- if ( fullspd )
- {
- /* Need to define the transet type as a size large
- * enough to hold the biggest offset.
- */
- int total_table_size = tblend + numecs + 1;
- char *trans_offset_type =
- (total_table_size >= MAX_SHORT || long_align) ?
- "long" : "short";
-
- set_indent( 0 );
- indent_puts( "struct yy_trans_info" );
- indent_up();
- indent_puts( "{" ); /* } for vi */
-
- if ( long_align )
- indent_puts( "long yy_verify;" );
- else
- indent_puts( "short yy_verify;" );
-
- /* In cases where its sister yy_verify *is* a "yes, there is
- * a transition", yy_nxt is the offset (in records) to the
- * next state. In most cases where there is no transition,
- * the value of yy_nxt is irrelevant. If yy_nxt is the -1th
- * record of a state, though, then yy_nxt is the action number
- * for that state.
- */
-
- indent_put2s( "%s yy_nxt;", trans_offset_type );
- indent_puts( "};" );
- indent_down();
- }
-
- if ( fullspd )
- genctbl();
- else if ( fulltbl )
- genftbl();
- else
- gentabs();
-
- /* Definitions for backing up. We don't need them if REJECT
- * is being used because then we use an alternative backin-up
- * technique instead.
- */
- if ( num_backing_up > 0 && ! reject )
- {
- if ( ! C_plus_plus )
- {
- indent_puts(
- "static yy_state_type yy_last_accepting_state;" );
- indent_puts(
- "static char *yy_last_accepting_cpos;\n" );
- }
- }
-
- if ( nultrans )
- {
- out_str_dec( C_state_decl, "yy_NUL_trans", lastdfa + 1 );
-
- for ( i = 1; i <= lastdfa; ++i )
- {
- if ( fullspd )
- out_dec( " &yy_transition[%d],\n", base[i] );
- else
- mkdata( nultrans[i] );
- }
-
- dataend();
- }
-
- if ( ddebug )
- { /* Spit out table mapping rules to line numbers. */
- if ( ! C_plus_plus )
- {
- indent_puts( "extern int yy_flex_debug;" );
- indent_puts( "int yy_flex_debug = 1;\n" );
- }
-
- out_str_dec( long_align ? C_long_decl : C_short_decl,
- "yy_rule_linenum", num_rules );
- for ( i = 1; i < num_rules; ++i )
- mkdata( rule_linenum[i] );
- dataend();
- }
-
- if ( reject )
- {
- /* Declare state buffer variables. */
- if ( ! C_plus_plus )
- {
- outn(
- "static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr;" );
- outn( "static char *yy_full_match;" );
- outn( "static int yy_lp;" );
- }
-
- if ( variable_trailing_context_rules )
- {
- if ( ! C_plus_plus )
- {
- outn(
- "static int yy_looking_for_trail_begin = 0;" );
- outn( "static int yy_full_lp;" );
- outn( "static int *yy_full_state;" );
- }
-
- out_hex( "#define YY_TRAILING_MASK 0x%x\n",
- (unsigned int) YY_TRAILING_MASK );
- out_hex( "#define YY_TRAILING_HEAD_MASK 0x%x\n",
- (unsigned int) YY_TRAILING_HEAD_MASK );
- }
-
- outn( "#define REJECT \\" );
- outn( "{ \\" ); /* } for vi */
- outn(
- "*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \\" );
- outn(
- "yy_cp = yy_full_match; /* restore poss. backed-over text */ \\" );
-
- if ( variable_trailing_context_rules )
- {
- outn(
- "yy_lp = yy_full_lp; /* restore orig. accepting pos. */ \\" );
- outn(
- "yy_state_ptr = yy_full_state; /* restore orig. state */ \\" );
- outn(
- "yy_current_state = *yy_state_ptr; /* restore curr. state */ \\" );
- }
-
- outn( "++yy_lp; \\" );
- outn( "goto find_rule; \\" );
- /* { for vi */
- outn( "}" );
- }
-
- else
- {
- outn(
- "/* The intent behind this definition is that it'll catch" );
- outn( " * any uses of REJECT which flex missed." );
- outn( " */" );
- outn( "#define REJECT reject_used_but_not_detected" );
- }
-
- if ( yymore_used )
- {
- if ( ! C_plus_plus )
- {
- if ( yytext_is_array )
- {
- indent_puts( "static int yy_more_offset = 0;" );
- indent_puts(
- "static int yy_prev_more_offset = 0;" );
- }
- else
- {
- indent_puts( "static int yy_more_flag = 0;" );
- indent_puts( "static int yy_more_len = 0;" );
- }
- }
-
- if ( yytext_is_array )
- {
- indent_puts(
- "#define yymore() (yy_more_offset = yy_flex_strlen( yytext ))" );
- indent_puts( "#define YY_NEED_STRLEN" );
- indent_puts( "#define YY_MORE_ADJ 0" );
- indent_puts( "#define YY_RESTORE_YY_MORE_OFFSET \\" );
- indent_up();
- indent_puts( "{ \\" );
- indent_puts( "yy_more_offset = yy_prev_more_offset; \\" );
- indent_puts( "yyleng -= yy_more_offset; \\" );
- indent_puts( "}" );
- indent_down();
- }
- else
- {
- indent_puts( "#define yymore() (yy_more_flag = 1)" );
- indent_puts( "#define YY_MORE_ADJ yy_more_len" );
- indent_puts( "#define YY_RESTORE_YY_MORE_OFFSET" );
- }
- }
-
- else
- {
- indent_puts( "#define yymore() yymore_used_but_not_detected" );
- indent_puts( "#define YY_MORE_ADJ 0" );
- indent_puts( "#define YY_RESTORE_YY_MORE_OFFSET" );
- }
-
- if ( ! C_plus_plus )
- {
- if ( yytext_is_array )
- {
- outn( "#ifndef YYLMAX" );
- outn( "#define YYLMAX 8192" );
- outn( "#endif\n" );
- outn( "char yytext[YYLMAX];" );
- outn( "char *yytext_ptr;" );
- }
-
- else
- outn( "char *yytext;" );
- }
-
- out( &action_array[defs1_offset] );
-
- line_directive_out( stdout, 0 );
-
- skelout();
-
- if ( ! C_plus_plus )
- {
- if ( use_read )
- {
- outn(
-"\tif ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \\" );
- outn(
- "\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" );" );
- }
-
- else
- {
- outn(
- "\tif ( yy_current_buffer->yy_is_interactive ) \\" );
- outn( "\t\t{ \\" );
- outn( "\t\tint c = '*', n; \\" );
- outn( "\t\tfor ( n = 0; n < max_size && \\" );
- outn( "\t\t\t (c = getc( yyin )) != EOF && c != '\\n'; ++n ) \\" );
- outn( "\t\t\tbuf[n] = (char) c; \\" );
- outn( "\t\tif ( c == '\\n' ) \\" );
- outn( "\t\t\tbuf[n++] = (char) c; \\" );
- outn( "\t\tif ( c == EOF && ferror( yyin ) ) \\" );
- outn(
- "\t\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" ); \\" );
- outn( "\t\tresult = n; \\" );
- outn( "\t\t} \\" );
- outn(
- "\telse if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \\" );
- outn( "\t\t && ferror( yyin ) ) \\" );
- outn(
- "\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" );" );
- }
- }
-
- skelout();
-
- indent_puts( "#define YY_RULE_SETUP \\" );
- indent_up();
- if ( bol_needed )
- {
- indent_puts( "if ( yyleng > 0 ) \\" );
- indent_up();
- indent_puts( "yy_current_buffer->yy_at_bol = \\" );
- indent_puts( "\t\t(yytext[yyleng - 1] == '\\n'); \\" );
- indent_down();
- }
- indent_puts( "YY_USER_ACTION" );
- indent_down();
-
- skelout();
-
- /* Copy prolog to output file. */
- out( &action_array[prolog_offset] );
-
- line_directive_out( stdout, 0 );
-
- skelout();
-
- set_indent( 2 );
-
- if ( yymore_used && ! yytext_is_array )
- {
- indent_puts( "yy_more_len = 0;" );
- indent_puts( "if ( yy_more_flag )" );
- indent_up();
- indent_puts( "{" );
- indent_puts( "yy_more_len = yy_c_buf_p - yytext_ptr;" );
- indent_puts( "yy_more_flag = 0;" );
- indent_puts( "}" );
- indent_down();
- }
-
- skelout();
-
- gen_start_state();
-
- /* Note, don't use any indentation. */
- outn( "yy_match:" );
- gen_next_match();
-
- skelout();
- set_indent( 2 );
- gen_find_action();
-
- skelout();
- if ( do_yylineno )
- {
- indent_puts( "if ( yy_act != YY_END_OF_BUFFER )" );
- indent_up();
- indent_puts( "{" );
- indent_puts( "int yyl;" );
- indent_puts( "for ( yyl = 0; yyl < yyleng; ++yyl )" );
- indent_up();
- indent_puts( "if ( yytext[yyl] == '\\n' )" );
- indent_up();
- indent_puts( "++yylineno;" );
- indent_down();
- indent_down();
- indent_puts( "}" );
- indent_down();
- }
-
- skelout();
- if ( ddebug )
- {
- indent_puts( "if ( yy_flex_debug )" );
- indent_up();
-
- indent_puts( "{" );
- indent_puts( "if ( yy_act == 0 )" );
- indent_up();
- indent_puts( C_plus_plus ?
- "cerr << \"--scanner backing up\\n\";" :
- "fprintf( stderr, \"--scanner backing up\\n\" );" );
- indent_down();
-
- do_indent();
- out_dec( "else if ( yy_act < %d )\n", num_rules );
- indent_up();
-
- if ( C_plus_plus )
- {
- indent_puts(
- "cerr << \"--accepting rule at line \" << yy_rule_linenum[yy_act] <<" );
- indent_puts(
- " \"(\\\"\" << yytext << \"\\\")\\n\";" );
- }
- else
- {
- indent_puts(
- "fprintf( stderr, \"--accepting rule at line %d (\\\"%s\\\")\\n\"," );
-
- indent_puts(
- " yy_rule_linenum[yy_act], yytext );" );
- }
-
- indent_down();
-
- do_indent();
- out_dec( "else if ( yy_act == %d )\n", num_rules );
- indent_up();
-
- if ( C_plus_plus )
- {
- indent_puts(
-"cerr << \"--accepting default rule (\\\"\" << yytext << \"\\\")\\n\";" );
- }
- else
- {
- indent_puts(
- "fprintf( stderr, \"--accepting default rule (\\\"%s\\\")\\n\"," );
- indent_puts( " yytext );" );
- }
-
- indent_down();
-
- do_indent();
- out_dec( "else if ( yy_act == %d )\n", num_rules + 1 );
- indent_up();
-
- indent_puts( C_plus_plus ?
- "cerr << \"--(end of buffer or a NUL)\\n\";" :
- "fprintf( stderr, \"--(end of buffer or a NUL)\\n\" );" );
-
- indent_down();
-
- do_indent();
- outn( "else" );
- indent_up();
-
- if ( C_plus_plus )
- {
- indent_puts(
- "cerr << \"--EOF (start condition \" << YY_START << \")\\n\";" );
- }
- else
- {
- indent_puts(
- "fprintf( stderr, \"--EOF (start condition %d)\\n\", YY_START );" );
- }
-
- indent_down();
-
- indent_puts( "}" );
- indent_down();
- }
-
- /* Copy actions to output file. */
- skelout();
- indent_up();
- gen_bu_action();
- out( &action_array[action_offset] );
-
- line_directive_out( stdout, 0 );
-
- /* generate cases for any missing EOF rules */
- for ( i = 1; i <= lastsc; ++i )
- if ( ! sceof[i] )
- {
- do_indent();
- out_str( "case YY_STATE_EOF(%s):\n", scname[i] );
- did_eof_rule = true;
- }
-
- if ( did_eof_rule )
- {
- indent_up();
- indent_puts( "yyterminate();" );
- indent_down();
- }
-
-
- /* Generate code for handling NUL's, if needed. */
-
- /* First, deal with backing up and setting up yy_cp if the scanner
- * finds that it should JAM on the NUL.
- */
- skelout();
- set_indent( 4 );
-
- if ( fullspd || fulltbl )
- indent_puts( "yy_cp = yy_c_buf_p;" );
-
- else
- { /* compressed table */
- if ( ! reject && ! interactive )
- {
- /* Do the guaranteed-needed backing up to figure
- * out the match.
- */
- indent_puts( "yy_cp = yy_last_accepting_cpos;" );
- indent_puts(
- "yy_current_state = yy_last_accepting_state;" );
- }
-
- else
- /* Still need to initialize yy_cp, though
- * yy_current_state was set up by
- * yy_get_previous_state().
- */
- indent_puts( "yy_cp = yy_c_buf_p;" );
- }
-
-
- /* Generate code for yy_get_previous_state(). */
- set_indent( 1 );
- skelout();
-
- gen_start_state();
-
- set_indent( 2 );
- skelout();
- gen_next_state( true );
-
- set_indent( 1 );
- skelout();
- gen_NUL_trans();
-
- skelout();
- if ( do_yylineno )
- { /* update yylineno inside of unput() */
- indent_puts( "if ( c == '\\n' )" );
- indent_up();
- indent_puts( "--yylineno;" );
- indent_down();
- }
-
- skelout();
- /* Update BOL and yylineno inside of input(). */
- if ( bol_needed )
- {
- indent_puts( "yy_current_buffer->yy_at_bol = (c == '\\n');" );
- if ( do_yylineno )
- {
- indent_puts( "if ( yy_current_buffer->yy_at_bol )" );
- indent_up();
- indent_puts( "++yylineno;" );
- indent_down();
- }
- }
-
- else if ( do_yylineno )
- {
- indent_puts( "if ( c == '\\n' )" );
- indent_up();
- indent_puts( "++yylineno;" );
- indent_down();
- }
-
- skelout();
-
- /* Copy remainder of input to output. */
-
- line_directive_out( stdout, 1 );
-
- if ( sectnum == 3 )
- (void) flexscan(); /* copy remainder of input to output */
- }
diff --git a/usr.bin/lex/initscan.c b/usr.bin/lex/initscan.c
deleted file mode 100644
index 7617c69..0000000
--- a/usr.bin/lex/initscan.c
+++ /dev/null
@@ -1,3704 +0,0 @@
-#line 2 "scan.c"
-/* A lexical scanner generated by flex */
-
-/* Scanner skeleton version:
- * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $
- */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#define FLEX_SCANNER
-#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-
-#include <stdio.h>
-
-
-/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
-#ifdef c_plusplus
-#ifndef __cplusplus
-#define __cplusplus
-#endif
-#endif
-
-
-#ifdef __cplusplus
-
-#include <stdlib.h>
-#include <unistd.h>
-
-/* Use prototypes in function declarations. */
-#define YY_USE_PROTOS
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else /* ! __cplusplus */
-
-#if __STDC__
-
-#define YY_USE_PROTOS
-#define YY_USE_CONST
-
-#endif /* __STDC__ */
-#endif /* ! __cplusplus */
-
-#ifdef __TURBOC__
- #pragma warn -rch
- #pragma warn -use
-#include <io.h>
-#include <stdlib.h>
-#define YY_USE_CONST
-#define YY_USE_PROTOS
-#endif
-
-#ifdef YY_USE_CONST
-#define yyconst const
-#else
-#define yyconst
-#endif
-
-
-#ifdef YY_USE_PROTOS
-#define YY_PROTO(proto) proto
-#else
-#define YY_PROTO(proto) ()
-#endif
-
-/* Returned upon end-of-file. */
-#define YY_NULL 0
-
-/* Promotes a possibly negative, possibly signed char to an unsigned
- * integer for use as an array index. If the signed char is negative,
- * we want to instead treat it as an 8-bit unsigned char, hence the
- * double cast.
- */
-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
-
-/* Enter a start condition. This macro really ought to take a parameter,
- * but we do it the disgusting crufty way forced on us by the ()-less
- * definition of BEGIN.
- */
-#define BEGIN yy_start = 1 + 2 *
-
-/* Translate the current start state into a value that can be later handed
- * to BEGIN to return to the state. The YYSTATE alias is for lex
- * compatibility.
- */
-#define YY_START ((yy_start - 1) / 2)
-#define YYSTATE YY_START
-
-/* Action number for EOF rule of a given start state. */
-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
-
-/* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE yyrestart( yyin )
-
-#define YY_END_OF_BUFFER_CHAR 0
-
-/* Size of default input buffer. */
-#define YY_BUF_SIZE 16384
-
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-
-extern int yyleng;
-extern FILE *yyin, *yyout;
-
-#define EOB_ACT_CONTINUE_SCAN 0
-#define EOB_ACT_END_OF_FILE 1
-#define EOB_ACT_LAST_MATCH 2
-
-/* The funky do-while in the following #define is used to turn the definition
- * int a single C statement (which needs a semi-colon terminator). This
- * avoids problems with code like:
- *
- * if ( condition_holds )
- * yyless( 5 );
- * else
- * do_something_else();
- *
- * Prior to using the do-while the compiler would get upset at the
- * "else" because it interpreted the "if" statement as being all
- * done when it reached the ';' after the yyless() call.
- */
-
-/* Return all but the first 'n' matched characters back to the input stream. */
-
-#define yyless(n) \
- do \
- { \
- /* Undo effects of setting up yytext. */ \
- *yy_cp = yy_hold_char; \
- YY_RESTORE_YY_MORE_OFFSET \
- yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
- YY_DO_BEFORE_ACTION; /* set up yytext again */ \
- } \
- while ( 0 )
-
-#define unput(c) yyunput( c, yytext_ptr )
-
-/* The following is because we cannot portably get our hands on size_t
- * (without autoconf's help, which isn't available because we want
- * flex-generated scanners to compile on their own).
- */
-typedef unsigned int yy_size_t;
-
-
-struct yy_buffer_state
- {
- FILE *yy_input_file;
-
- char *yy_ch_buf; /* input buffer */
- char *yy_buf_pos; /* current position in input buffer */
-
- /* Size of input buffer in bytes, not including room for EOB
- * characters.
- */
- yy_size_t yy_buf_size;
-
- /* Number of characters read into yy_ch_buf, not including EOB
- * characters.
- */
- int yy_n_chars;
-
- /* Whether we "own" the buffer - i.e., we know we created it,
- * and can realloc() it to grow it, and should free() it to
- * delete it.
- */
- int yy_is_our_buffer;
-
- /* Whether this is an "interactive" input source; if so, and
- * if we're using stdio for input, then we want to use getc()
- * instead of fread(), to make sure we stop fetching input after
- * each newline.
- */
- int yy_is_interactive;
-
- /* Whether we're considered to be at the beginning of a line.
- * If so, '^' rules will be active on the next match, otherwise
- * not.
- */
- int yy_at_bol;
-
- /* Whether to try to fill the input buffer when we reach the
- * end of it.
- */
- int yy_fill_buffer;
-
- int yy_buffer_status;
-#define YY_BUFFER_NEW 0
-#define YY_BUFFER_NORMAL 1
- /* When an EOF's been seen but there's still some text to process
- * then we mark the buffer as YY_EOF_PENDING, to indicate that we
- * shouldn't try reading from the input source any more. We might
- * still have a bunch of tokens to match, though, because of
- * possible backing-up.
- *
- * When we actually see the EOF, we change the status to "new"
- * (via yyrestart()), so that the user can continue scanning by
- * just pointing yyin at a new input file.
- */
-#define YY_BUFFER_EOF_PENDING 2
- };
-
-static YY_BUFFER_STATE yy_current_buffer = 0;
-
-/* We provide macros for accessing buffer states in case in the
- * future we want to put the buffer states in a more general
- * "scanner state".
- */
-#define YY_CURRENT_BUFFER yy_current_buffer
-
-
-/* yy_hold_char holds the character lost when yytext is formed. */
-static char yy_hold_char;
-
-static int yy_n_chars; /* number of characters read into yy_ch_buf */
-
-
-int yyleng;
-
-/* Points to current character in buffer. */
-static char *yy_c_buf_p = (char *) 0;
-static int yy_init = 1; /* whether we need to initialize */
-static int yy_start = 0; /* start state number */
-
-/* Flag which is used to allow yywrap()'s to do buffer switches
- * instead of setting up a fresh yyin. A bit of a hack ...
- */
-static int yy_did_buffer_switch_on_eof;
-
-void yyrestart YY_PROTO(( FILE *input_file ));
-
-void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
-void yy_load_buffer_state YY_PROTO(( void ));
-YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
-void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
-void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
-void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
-#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
-
-YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
-YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
-YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
-
-static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
-static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
-static void yy_flex_free YY_PROTO(( void * ));
-
-#define yy_new_buffer yy_create_buffer
-
-#define yy_set_interactive(is_interactive) \
- { \
- if ( ! yy_current_buffer ) \
- yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
- yy_current_buffer->yy_is_interactive = is_interactive; \
- }
-
-#define yy_set_bol(at_bol) \
- { \
- if ( ! yy_current_buffer ) \
- yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
- yy_current_buffer->yy_at_bol = at_bol; \
- }
-
-#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
-
-typedef unsigned char YY_CHAR;
-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
-typedef int yy_state_type;
-extern char *yytext;
-#define yytext_ptr yytext
-
-static yy_state_type yy_get_previous_state YY_PROTO(( void ));
-static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
-static int yy_get_next_buffer YY_PROTO(( void ));
-static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
-
-/* Done after the current pattern has been matched and before the
- * corresponding action - sets up yytext.
- */
-#define YY_DO_BEFORE_ACTION \
- yytext_ptr = yy_bp; \
- yyleng = (int) (yy_cp - yy_bp); \
- yy_hold_char = *yy_cp; \
- *yy_cp = '\0'; \
- yy_c_buf_p = yy_cp;
-
-#define YY_NUM_RULES 165
-#define YY_END_OF_BUFFER 166
-static yyconst short int yy_accept[769] =
- { 0,
- 0, 0, 0, 0, 87, 87, 163, 163, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 166, 164,
- 7, 18, 164, 16, 1, 17, 164, 164, 164, 164,
- 15, 108, 100, 101, 108, 93, 108, 107, 108, 108,
- 108, 107, 99, 89, 108, 108, 91, 92, 87, 88,
- 87, 86, 85, 86, 86, 163, 163, 28, 29, 28,
- 28, 28, 28, 28, 28, 31, 30, 32, 31, 113,
- 109, 110, 112, 114, 141, 142, 141, 139, 138, 140,
-
- 115, 117, 115, 116, 115, 120, 120, 120, 120, 122,
- 124, 122, 122, 122, 122, 123, 151, 155, 151, 154,
- 156, 156, 152, 152, 152, 149, 150, 164, 82, 164,
- 21, 22, 21, 20, 157, 159, 157, 160, 161, 147,
- 147, 148, 147, 147, 147, 147, 147, 147, 147, 81,
- 34, 33, 81, 81, 81, 81, 35, 81, 81, 81,
- 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
- 81, 81, 81, 81, 81, 81, 26, 23, 26, 24,
- 7, 18, 0, 16, 1, 17, 0, 0, 0, 14,
- 8, 0, 0, 0, 0, 4, 5, 0, 2, 15,
-
- 100, 101, 0, 0, 0, 95, 0, 0, 105, 105,
- 0, 162, 162, 162, 94, 0, 99, 89, 0, 0,
- 0, 91, 92, 104, 90, 0, 87, 88, 86, 85,
- 85, 83, 84, 163, 163, 28, 29, 28, 28, 28,
- 28, 31, 30, 32, 111, 112, 142, 138, 117, 0,
- 118, 119, 124, 121, 151, 155, 0, 153, 0, 144,
- 152, 152, 152, 0, 82, 0, 21, 22, 21, 19,
- 157, 159, 158, 147, 147, 147, 148, 143, 147, 147,
- 147, 34, 33, 0, 80, 0, 0, 81, 81, 81,
- 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
-
- 81, 81, 81, 36, 81, 81, 81, 81, 81, 81,
- 81, 81, 81, 81, 0, 25, 24, 0, 14, 8,
- 0, 12, 0, 0, 0, 0, 0, 4, 5, 0,
- 6, 0, 96, 0, 97, 0, 0, 105, 105, 0,
- 105, 105, 105, 162, 162, 0, 106, 90, 98, 0,
- 104, 0, 83, 84, 28, 28, 28, 27, 28, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 152, 152, 143, 143, 147, 147, 0, 0, 81,
- 81, 81, 81, 81, 44, 81, 81, 81, 49, 81,
- 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
-
- 81, 81, 81, 81, 81, 81, 81, 81, 0, 81,
- 81, 81, 81, 0, 0, 0, 12, 0, 0, 0,
- 0, 0, 0, 4, 5, 0, 105, 105, 105, 105,
- 105, 105, 162, 0, 0, 28, 28, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 152, 152, 147, 147, 37, 38, 81, 81, 81, 81,
- 81, 81, 81, 81, 50, 51, 81, 81, 81, 55,
- 81, 81, 81, 81, 81, 81, 60, 81, 81, 81,
- 81, 81, 81, 67, 0, 0, 0, 81, 81, 81,
- 81, 0, 13, 0, 0, 0, 0, 0, 0, 105,
-
- 105, 105, 105, 105, 105, 0, 0, 28, 28, 137,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 152, 152, 147, 147, 39, 81, 41, 81,
- 43, 81, 81, 81, 47, 81, 52, 81, 81, 81,
- 81, 81, 81, 81, 81, 81, 62, 81, 81, 65,
- 81, 0, 0, 0, 0, 81, 81, 81, 81, 3,
- 0, 0, 0, 0, 105, 105, 105, 0, 0, 28,
- 28, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 145, 146, 145, 146, 81, 42, 81,
- 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
-
- 81, 78, 61, 81, 64, 81, 0, 0, 0, 0,
- 81, 81, 69, 70, 0, 10, 0, 11, 0, 103,
- 0, 102, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 81, 81, 81, 45, 81, 48,
- 81, 81, 81, 81, 77, 81, 59, 63, 66, 0,
- 0, 0, 0, 79, 81, 0, 102, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 81,
- 81, 81, 46, 81, 81, 56, 81, 81, 0, 0,
- 0, 0, 68, 0, 9, 0, 125, 126, 127, 128,
- 129, 130, 131, 132, 133, 134, 135, 0, 81, 81,
-
- 81, 81, 81, 81, 81, 0, 0, 0, 0, 0,
- 136, 81, 81, 81, 81, 54, 81, 81, 0, 0,
- 0, 0, 0, 0, 81, 81, 81, 53, 81, 58,
- 0, 0, 0, 0, 0, 0, 81, 81, 81, 81,
- 72, 0, 0, 0, 0, 73, 81, 81, 81, 81,
- 71, 0, 75, 0, 81, 81, 81, 74, 76, 81,
- 81, 81, 81, 81, 81, 57, 40, 0
- } ;
-
-static yyconst int yy_ec[256] =
- { 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
- 1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 2, 1, 5, 6, 7, 8, 1, 9, 10,
- 10, 11, 12, 13, 14, 10, 15, 16, 16, 16,
- 16, 16, 16, 16, 17, 18, 19, 20, 1, 21,
- 22, 23, 10, 1, 31, 32, 33, 34, 35, 36,
- 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
- 47, 48, 49, 50, 51, 52, 53, 54, 55, 47,
- 26, 27, 28, 29, 30, 1, 31, 32, 33, 34,
-
- 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
- 55, 47, 56, 57, 58, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1
- } ;
-
-static yyconst int yy_meta[59] =
- { 0,
- 1, 1, 2, 1, 3, 1, 1, 1, 4, 1,
- 5, 6, 1, 7, 4, 8, 8, 8, 8, 1,
- 1, 1, 1, 9, 10, 1, 11, 12, 1, 13,
- 14, 14, 14, 14, 14, 14, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 4, 1, 16
- } ;
-
-static yyconst short int yy_base[858] =
- { 0,
- 0, 58, 115, 172, 120, 129, 2712, 2711, 230, 2705,
- 136, 141, 288, 0, 2683, 2682, 144, 151, 185, 191,
- 178, 188, 344, 347, 375, 0, 125, 131, 147, 216,
- 431, 434, 461, 0, 519, 0, 205, 349, 2710, 2716,
- 353, 2716, 2706, 0, 360, 2716, 2705, 144, 570, 2696,
- 0, 2716, 577, 2716, 2703, 2716, 438, 2716, 2684, 126,
- 149, 427, 591, 2716, 2701, 141, 2682, 2716, 0, 2716,
- 2699, 0, 2699, 2697, 155, 2696, 2716, 0, 2716, 2695,
- 2716, 0, 2662, 2641, 2637, 0, 2692, 2716, 2690, 2716,
- 2716, 2663, 0, 2716, 2716, 2716, 2688, 2716, 431, 2716,
-
- 2716, 2716, 2687, 2716, 567, 2716, 2669, 571, 164, 2716,
- 2716, 2685, 0, 2667, 573, 2716, 0, 2716, 2683, 2716,
- 573, 2674, 0, 2649, 2628, 2716, 2716, 222, 2716, 356,
- 448, 2716, 450, 2667, 0, 2716, 2678, 2716, 0, 0,
- 198, 2716, 2677, 2621, 2716, 2667, 0, 2642, 2621, 2716,
- 2673, 2716, 2671, 2668, 2640, 2639, 2716, 544, 2639, 579,
- 2634, 2635, 318, 0, 2623, 2631, 424, 562, 2614, 587,
- 2629, 2613, 2618, 2626, 2629, 2604, 2716, 2716, 2653, 612,
- 634, 2716, 2654, 0, 637, 2716, 2653, 600, 2616, 0,
- 0, 641, 647, 651, 669, 0, 0, 453, 2716, 0,
-
- 672, 2716, 2651, 2597, 605, 2716, 2649, 2616, 620, 657,
- 645, 2716, 662, 0, 2716, 2592, 688, 2716, 2646, 2592,
- 2636, 2625, 2716, 0, 2716, 2610, 0, 2716, 0, 0,
- 2642, 0, 0, 2640, 2716, 0, 2716, 0, 2602, 2598,
- 745, 0, 2638, 2716, 2716, 0, 2716, 688, 2716, 773,
- 2716, 2716, 2716, 2716, 0, 2716, 673, 2716, 0, 2716,
- 0, 2599, 2595, 690, 2716, 698, 707, 2716, 709, 2716,
- 0, 2716, 2716, 0, 596, 2579, 2716, 827, 0, 2596,
- 2592, 2632, 2716, 2628, 2716, 2593, 2592, 0, 642, 2582,
- 563, 2617, 2579, 620, 2578, 2577, 2583, 669, 2570, 2584,
-
- 2572, 0, 2569, 2716, 2570, 2571, 2579, 2582, 685, 125,
- 2570, 2567, 2566, 688, 2608, 2716, 716, 2568, 0, 0,
- 720, 2716, 2608, 884, 2562, 2559, 2569, 0, 0, 723,
- 2716, 739, 2716, 805, 2716, 808, 2562, 787, 869, 876,
- 930, 881, 973, 800, 0, 2548, 2716, 2716, 2716, 2570,
- 0, 2559, 0, 0, 2568, 2557, 0, 2716, 0, 1009,
- 2581, 678, 870, 871, 874, 879, 913, 992, 974, 1013,
- 885, 2565, 2554, 0, 1067, 2563, 2552, 2546, 2545, 2557,
- 2562, 2561, 2550, 2557, 0, 2554, 2537, 2556, 0, 2536,
- 2543, 2533, 2548, 2568, 2537, 2549, 2544, 2542, 2541, 2532,
-
- 2539, 2540, 2538, 2539, 578, 2520, 2538, 2525, 860, 2526,
- 2528, 2521, 2517, 2529, 817, 1044, 2716, 822, 1095, 914,
- 2532, 2523, 2517, 0, 0, 2524, 1102, 1025, 1142, 2539,
- 1028, 1163, 2716, 2513, 2521, 2523, 2507, 0, 2526, 1058,
- 891, 1014, 1019, 894, 1038, 1080, 1072, 1086, 1083, 1081,
- 2520, 2504, 2518, 2502, 2716, 2716, 2505, 2493, 2492, 2495,
- 2507, 1148, 2507, 2492, 0, 0, 2492, 2493, 2507, 0,
- 2525, 2490, 2498, 2522, 2485, 2495, 0, 2500, 2491, 2487,
- 2479, 2479, 2483, 0, 875, 2494, 2481, 2494, 2480, 2475,
- 2491, 2519, 2716, 920, 999, 2465, 2474, 2468, 2494, 2496,
-
- 1105, 1184, 1081, 902, 969, 2479, 2491, 2463, 2477, 2716,
- 165, 1090, 1144, 1143, 1147, 1163, 1095, 1145, 1037, 1085,
- 1150, 1173, 2461, 2475, 2459, 2473, 0, 2458, 0, 2460,
- 0, 1165, 2454, 2469, 0, 2461, 0, 2471, 2410, 2414,
- 2434, 2400, 2393, 2405, 2385, 2382, 0, 2383, 2335, 0,
- 2335, 2330, 2326, 2309, 2278, 2259, 2269, 2268, 2256, 2297,
- 1046, 2238, 2242, 2253, 1179, 1142, 1145, 2247, 2246, 0,
- 0, 1191, 1192, 1172, 1201, 1202, 1204, 1205, 1206, 1207,
- 1209, 1210, 1208, 0, 0, 0, 0, 2254, 0, 2221,
- 2229, 2218, 2208, 2200, 2209, 2198, 2195, 2165, 2168, 2149,
-
- 2132, 0, 0, 2129, 0, 2139, 2143, 2134, 2124, 2137,
- 2117, 2116, 0, 0, 1228, 2716, 1232, 2716, 2111, 2716,
- 2117, 2716, 2115, 2114, 2108, 2107, 2106, 2103, 2102, 2098,
- 2095, 2063, 2047, 1213, 2012, 1986, 1975, 0, 1954, 0,
- 1947, 1950, 1941, 1945, 0, 1942, 0, 0, 0, 1938,
- 1940, 1934, 1905, 0, 1872, 1234, 2716, 1888, 1882, 1881,
- 1864, 1848, 1832, 1828, 1827, 1826, 1823, 1806, 1809, 1784,
- 1787, 1772, 0, 1781, 1786, 0, 1766, 1767, 1759, 1744,
- 1213, 1736, 0, 1236, 2716, 1245, 2716, 2716, 2716, 2716,
- 2716, 2716, 2716, 2716, 2716, 2716, 2716, 1750, 1727, 1720,
-
- 1701, 1687, 1670, 1681, 1667, 1679, 1659, 689, 1658, 1671,
- 2716, 1657, 1627, 1621, 1635, 0, 1603, 1596, 1595, 1608,
- 1602, 1587, 1586, 1583, 1581, 1587, 1555, 0, 1547, 0,
- 1527, 1507, 1520, 1503, 1483, 1482, 1485, 1443, 1440, 1228,
- 2716, 1225, 1224, 1206, 1210, 2716, 1213, 1202, 1018, 948,
- 2716, 945, 2716, 884, 780, 771, 779, 2716, 2716, 689,
- 673, 581, 408, 318, 86, 0, 0, 2716, 1263, 1279,
- 1295, 1311, 1327, 1343, 1359, 1375, 1391, 1407, 1423, 1439,
- 1455, 1471, 1481, 1496, 1505, 1520, 1536, 1545, 1560, 1576,
- 1592, 1608, 1624, 1634, 1649, 1659, 1674, 1690, 1706, 1718,
-
- 1728, 1743, 1759, 1775, 1791, 1807, 1817, 1832, 1843, 1236,
- 1858, 1874, 1890, 1898, 1905, 1920, 1936, 1952, 1968, 1977,
- 1985, 2001, 2017, 2033, 2049, 2065, 2081, 2097, 2113, 2123,
- 2138, 2148, 2155, 2170, 2182, 2192, 2207, 2223, 2239, 2255,
- 2265, 2280, 2291, 2306, 2322, 2338, 2354, 2364, 2373, 2388,
- 2404, 2420, 2429, 2437, 2453, 2469, 2485
- } ;
-
-static yyconst short int yy_def[858] =
- { 0,
- 768, 768, 769, 769, 770, 771, 772, 772, 768, 9,
- 773, 773, 768, 13, 774, 774, 775, 775, 776, 776,
- 777, 777, 778, 778, 768, 25, 779, 779, 780, 780,
- 781, 781, 768, 33, 768, 35, 782, 782, 768, 768,
- 768, 768, 768, 783, 768, 768, 768, 768, 784, 768,
- 785, 768, 768, 768, 768, 768, 768, 768, 768, 786,
- 787, 788, 768, 768, 768, 768, 768, 768, 789, 768,
- 789, 790, 791, 790, 790, 792, 768, 793, 768, 793,
- 768, 794, 794, 794, 793, 795, 768, 768, 795, 768,
- 768, 768, 796, 768, 768, 768, 768, 768, 768, 768,
-
- 768, 768, 768, 768, 787, 768, 768, 787, 797, 768,
- 768, 768, 798, 768, 787, 768, 799, 768, 799, 768,
- 800, 768, 801, 801, 801, 768, 768, 802, 768, 802,
- 803, 768, 803, 768, 804, 768, 804, 768, 805, 806,
- 806, 768, 806, 806, 768, 806, 807, 807, 807, 768,
- 768, 768, 768, 808, 768, 768, 768, 809, 809, 809,
- 809, 809, 809, 809, 809, 809, 809, 810, 809, 809,
- 809, 809, 809, 809, 809, 809, 768, 768, 811, 768,
- 768, 768, 768, 783, 768, 768, 768, 768, 768, 812,
- 813, 768, 768, 768, 768, 814, 815, 816, 768, 785,
-
- 768, 768, 768, 768, 817, 768, 768, 768, 818, 818,
- 819, 768, 768, 820, 768, 821, 768, 768, 768, 768,
- 768, 768, 768, 822, 768, 768, 823, 768, 824, 825,
- 825, 826, 827, 828, 768, 829, 768, 830, 830, 830,
- 768, 831, 768, 768, 768, 832, 768, 768, 768, 833,
- 768, 768, 768, 768, 834, 768, 835, 768, 835, 768,
- 836, 836, 836, 837, 768, 837, 838, 768, 838, 768,
- 839, 768, 768, 840, 840, 840, 768, 768, 841, 841,
- 841, 768, 768, 842, 768, 768, 768, 843, 843, 843,
- 843, 843, 843, 843, 843, 843, 843, 843, 843, 843,
-
- 843, 843, 843, 768, 843, 843, 843, 843, 843, 843,
- 843, 843, 843, 843, 844, 768, 768, 768, 845, 846,
- 847, 768, 768, 768, 768, 768, 768, 848, 849, 850,
- 768, 850, 768, 851, 768, 851, 768, 852, 852, 852,
- 768, 852, 852, 768, 853, 854, 768, 768, 768, 768,
- 855, 768, 826, 827, 830, 830, 241, 768, 241, 241,
- 833, 833, 833, 833, 833, 833, 833, 833, 833, 833,
- 833, 836, 836, 278, 278, 841, 841, 768, 768, 843,
- 843, 843, 843, 843, 843, 843, 843, 843, 843, 843,
- 843, 843, 843, 843, 843, 843, 843, 843, 843, 843,
-
- 843, 843, 843, 843, 843, 843, 843, 843, 768, 843,
- 843, 843, 843, 768, 847, 847, 768, 847, 847, 768,
- 768, 768, 768, 848, 849, 768, 341, 852, 343, 341,
- 852, 343, 768, 768, 768, 830, 830, 360, 768, 833,
- 833, 833, 833, 833, 833, 833, 833, 833, 833, 833,
- 836, 836, 841, 841, 768, 768, 843, 843, 843, 843,
- 843, 843, 843, 843, 843, 843, 843, 843, 843, 843,
- 843, 843, 843, 843, 843, 843, 843, 843, 843, 843,
- 843, 843, 843, 843, 768, 768, 768, 843, 843, 843,
- 843, 768, 768, 847, 847, 768, 768, 768, 768, 427,
-
- 852, 343, 852, 852, 852, 768, 768, 830, 830, 768,
- 833, 833, 833, 833, 833, 833, 833, 833, 833, 833,
- 833, 833, 836, 836, 841, 841, 843, 843, 843, 843,
- 843, 843, 843, 843, 843, 843, 843, 843, 843, 843,
- 843, 843, 843, 843, 843, 843, 843, 843, 843, 843,
- 843, 768, 768, 768, 768, 843, 843, 843, 843, 768,
- 856, 768, 768, 768, 852, 852, 852, 768, 768, 830,
- 830, 833, 833, 833, 833, 833, 833, 833, 833, 833,
- 833, 833, 833, 836, 836, 841, 841, 843, 843, 843,
- 843, 843, 843, 843, 843, 843, 843, 843, 843, 843,
-
- 843, 843, 843, 843, 843, 843, 768, 768, 768, 768,
- 843, 843, 843, 843, 856, 768, 856, 768, 768, 768,
- 768, 768, 833, 833, 833, 833, 833, 833, 833, 833,
- 833, 833, 833, 833, 843, 843, 843, 843, 843, 843,
- 843, 843, 843, 843, 843, 843, 843, 843, 843, 768,
- 768, 768, 768, 843, 843, 857, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 833, 843,
- 843, 843, 843, 843, 843, 843, 843, 843, 768, 768,
- 768, 768, 843, 857, 768, 857, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 843, 843,
-
- 843, 843, 843, 843, 843, 768, 768, 768, 768, 768,
- 768, 843, 843, 843, 843, 843, 843, 843, 768, 768,
- 768, 768, 768, 768, 843, 843, 843, 843, 843, 843,
- 768, 768, 768, 768, 768, 768, 843, 843, 843, 843,
- 768, 768, 768, 768, 768, 768, 843, 843, 843, 843,
- 768, 768, 768, 768, 843, 843, 843, 768, 768, 843,
- 843, 843, 843, 843, 843, 843, 843, 0, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
-
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768
- } ;
-
-static yyconst short int yy_nxt[2775] =
- { 0,
- 40, 41, 42, 43, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 44, 44, 40, 40, 40, 40, 44,
- 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 44, 44, 44, 40, 40, 40, 40, 45,
- 46, 47, 40, 48, 40, 49, 40, 40, 40, 40,
- 40, 40, 50, 40, 40, 40, 40, 40, 40, 40,
- 40, 51, 51, 40, 40, 40, 40, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 40, 40, 40, 53, 54, 55, 56,
- 767, 57, 70, 71, 58, 58, 58, 129, 130, 58,
- 73, 70, 74, 129, 130, 59, 75, 87, 88, 89,
- 60, 61, 87, 88, 89, 188, 96, 97, 224, 132,
- 133, 210, 211, 96, 97, 404, 98, 134, 405, 99,
- 99, 99, 99, 98, 213, 213, 99, 99, 99, 99,
- 62, 58, 58, 63, 64, 65, 56, 252, 57, 66,
- 40, 58, 58, 58, 439, 189, 58, 102, 103, 104,
- 40, 252, 67, 102, 103, 104, 225, 60, 61, 275,
-
- 68, 100, 214, 107, 108, 276, 109, 178, 100, 179,
- 232, 105, 233, 107, 108, 572, 109, 105, 132, 133,
- 180, 180, 180, 180, 265, 266, 134, 62, 58, 58,
- 78, 78, 79, 80, 78, 78, 78, 78, 78, 78,
- 81, 78, 78, 78, 78, 78, 78, 78, 78, 78,
- 78, 78, 78, 82, 82, 78, 78, 78, 78, 82,
- 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
- 82, 82, 82, 82, 82, 82, 82, 83, 82, 82,
- 82, 82, 82, 82, 84, 78, 78, 78, 90, 90,
- 40, 90, 90, 90, 90, 90, 90, 90, 91, 90,
-
- 91, 90, 90, 90, 90, 90, 90, 90, 90, 90,
- 92, 93, 93, 90, 90, 90, 90, 93, 93, 93,
- 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
- 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
- 93, 93, 93, 90, 90, 90, 111, 112, 296, 111,
- 112, 178, 766, 179, 181, 182, 183, 113, 265, 266,
- 113, 185, 186, 187, 180, 180, 180, 180, 297, 114,
- 115, 116, 114, 115, 116, 117, 117, 118, 119, 120,
- 117, 117, 117, 121, 117, 117, 117, 117, 117, 122,
- 117, 117, 117, 117, 117, 117, 117, 117, 123, 123,
-
- 117, 117, 117, 117, 123, 123, 123, 123, 123, 123,
- 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
- 123, 123, 124, 123, 123, 123, 123, 123, 123, 125,
- 126, 117, 127, 136, 137, 138, 136, 137, 138, 206,
- 206, 207, 215, 215, 215, 215, 248, 248, 248, 248,
- 268, 269, 268, 269, 300, 331, 332, 139, 301, 765,
- 139, 140, 141, 142, 143, 140, 140, 140, 144, 140,
- 140, 145, 140, 140, 140, 146, 140, 140, 140, 140,
- 140, 140, 140, 140, 147, 147, 140, 140, 140, 140,
- 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
-
- 147, 147, 147, 147, 147, 147, 147, 147, 148, 147,
- 147, 147, 147, 147, 147, 149, 140, 140, 140, 150,
- 151, 152, 153, 154, 150, 150, 150, 150, 150, 150,
- 150, 150, 150, 150, 150, 155, 156, 150, 150, 150,
- 157, 150, 150, 150, 150, 150, 150, 150, 150, 158,
- 159, 160, 161, 162, 163, 164, 164, 165, 164, 164,
- 166, 167, 168, 169, 170, 164, 171, 172, 164, 173,
- 174, 175, 164, 176, 150, 150, 150, 191, 201, 202,
- 203, 258, 213, 213, 204, 289, 213, 213, 213, 213,
- 292, 290, 217, 218, 219, 383, 303, 275, 220, 259,
-
- 192, 188, 193, 276, 193, 221, 304, 335, 336, 293,
- 193, 222, 384, 193, 194, 195, 480, 193, 196, 223,
- 214, 306, 481, 197, 214, 198, 214, 317, 317, 317,
- 317, 307, 764, 205, 308, 181, 182, 183, 185, 186,
- 187, 189, 321, 322, 323, 339, 340, 205, 321, 322,
- 323, 387, 321, 322, 323, 388, 324, 324, 324, 324,
- 342, 342, 324, 324, 324, 324, 324, 324, 324, 324,
- 321, 322, 323, 201, 202, 203, 341, 344, 344, 204,
- 380, 258, 339, 340, 324, 324, 324, 324, 325, 217,
- 218, 219, 265, 266, 381, 220, 326, 439, 343, 259,
-
- 265, 266, 221, 248, 248, 248, 248, 673, 222, 268,
- 269, 268, 269, 327, 392, 402, 223, 409, 393, 440,
- 410, 416, 417, 418, 403, 331, 332, 763, 205, 411,
- 412, 317, 317, 317, 317, 419, 419, 419, 419, 721,
- 413, 331, 332, 722, 205, 357, 357, 358, 359, 357,
- 357, 357, 357, 357, 357, 360, 357, 357, 357, 357,
- 357, 357, 357, 357, 357, 357, 357, 357, 360, 360,
- 357, 357, 357, 357, 360, 360, 360, 360, 360, 360,
- 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
- 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
-
- 357, 357, 357, 362, 363, 364, 365, 335, 336, 366,
- 335, 336, 339, 340, 367, 212, 212, 762, 368, 493,
- 494, 369, 761, 370, 417, 494, 371, 374, 374, 760,
- 374, 374, 374, 374, 374, 374, 374, 375, 374, 374,
- 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
- 375, 375, 374, 374, 374, 374, 375, 375, 375, 375,
- 375, 375, 375, 375, 375, 375, 375, 375, 375, 375,
- 375, 375, 375, 375, 375, 375, 375, 375, 375, 375,
- 375, 375, 374, 374, 374, 420, 322, 323, 427, 439,
- 439, 428, 428, 439, 339, 340, 431, 431, 439, 324,
-
- 324, 324, 324, 338, 439, 485, 339, 340, 486, 487,
- 439, 441, 443, 439, 442, 420, 322, 323, 450, 552,
- 759, 513, 493, 494, 516, 553, 444, 339, 340, 429,
- 338, 338, 439, 338, 338, 338, 338, 338, 338, 338,
- 338, 338, 338, 338, 338, 338, 338, 338, 338, 338,
- 338, 338, 338, 430, 430, 339, 340, 445, 338, 338,
- 430, 430, 430, 430, 430, 430, 430, 430, 430, 430,
- 430, 430, 430, 430, 430, 430, 430, 430, 430, 430,
- 430, 430, 430, 430, 430, 338, 338, 338, 432, 432,
- 432, 432, 758, 439, 339, 340, 432, 757, 339, 340,
-
- 495, 417, 418, 432, 432, 432, 432, 432, 432, 360,
- 360, 439, 438, 360, 360, 360, 360, 360, 360, 448,
- 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
- 360, 360, 439, 439, 360, 360, 360, 360, 439, 446,
- 501, 501, 447, 504, 504, 416, 417, 418, 616, 617,
- 339, 340, 638, 339, 340, 515, 439, 439, 449, 419,
- 419, 419, 419, 514, 360, 360, 360, 375, 375, 580,
- 375, 375, 375, 375, 375, 375, 375, 439, 375, 375,
- 375, 375, 375, 375, 375, 375, 375, 375, 375, 375,
- 517, 439, 375, 375, 375, 375, 495, 417, 418, 439,
-
- 439, 511, 439, 512, 439, 439, 339, 340, 209, 439,
- 419, 419, 419, 419, 439, 519, 520, 581, 518, 522,
- 566, 566, 375, 375, 375, 500, 500, 573, 521, 578,
- 339, 340, 500, 500, 500, 500, 500, 500, 500, 500,
- 500, 500, 500, 500, 500, 500, 500, 500, 500, 500,
- 500, 500, 500, 500, 500, 500, 500, 502, 502, 502,
- 502, 532, 439, 439, 439, 502, 439, 339, 340, 439,
- 339, 340, 502, 502, 502, 502, 502, 502, 505, 505,
- 505, 505, 439, 533, 582, 576, 505, 574, 579, 534,
- 575, 439, 439, 505, 505, 505, 505, 505, 505, 567,
-
- 567, 567, 567, 590, 339, 340, 338, 567, 577, 583,
- 439, 439, 625, 591, 567, 567, 567, 567, 567, 567,
- 439, 439, 624, 439, 439, 439, 439, 439, 439, 439,
- 616, 617, 439, 623, 616, 617, 685, 686, 685, 686,
- 756, 628, 626, 632, 708, 755, 634, 685, 686, 302,
- 302, 627, 629, 754, 753, 630, 631, 633, 752, 751,
- 750, 709, 669, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52, 52, 69,
- 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
- 69, 69, 69, 69, 69, 72, 72, 72, 72, 72,
-
- 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
- 72, 76, 76, 76, 76, 76, 76, 76, 76, 76,
- 76, 76, 76, 76, 76, 76, 76, 86, 86, 86,
- 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
- 86, 86, 86, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 40, 40, 40, 40, 95,
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
- 95, 95, 95, 95, 95, 101, 101, 101, 101, 101,
- 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
- 101, 106, 106, 106, 106, 106, 106, 106, 106, 106,
-
- 106, 106, 106, 106, 106, 106, 106, 110, 110, 110,
- 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
- 110, 110, 110, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 131,
- 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
- 131, 131, 131, 131, 131, 135, 135, 135, 135, 135,
- 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
- 135, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 184, 184, 184,
- 184, 749, 748, 184, 184, 184, 190, 190, 190, 190,
-
- 190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
- 190, 200, 200, 200, 200, 747, 746, 200, 200, 200,
- 209, 745, 209, 209, 209, 209, 209, 209, 209, 209,
- 209, 209, 209, 209, 209, 209, 212, 744, 212, 212,
- 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
- 212, 212, 216, 216, 216, 743, 742, 216, 216, 216,
- 227, 741, 227, 227, 227, 227, 227, 227, 227, 227,
- 227, 227, 227, 227, 227, 227, 229, 740, 229, 229,
- 229, 229, 229, 229, 229, 229, 229, 229, 229, 229,
- 229, 229, 230, 739, 230, 230, 230, 230, 230, 230,
-
- 230, 230, 230, 230, 230, 230, 230, 230, 234, 234,
- 234, 234, 234, 234, 234, 234, 234, 234, 234, 234,
- 234, 234, 234, 234, 236, 738, 236, 236, 737, 236,
- 236, 236, 736, 735, 236, 236, 734, 733, 732, 236,
- 238, 238, 238, 238, 731, 730, 238, 238, 238, 242,
- 729, 242, 242, 242, 242, 242, 242, 242, 242, 242,
- 242, 242, 242, 242, 242, 246, 246, 246, 246, 728,
- 727, 246, 246, 246, 251, 726, 251, 251, 251, 251,
- 251, 251, 251, 251, 251, 251, 251, 251, 251, 251,
- 254, 725, 254, 254, 254, 254, 254, 254, 254, 254,
-
- 254, 724, 254, 254, 254, 254, 255, 723, 720, 719,
- 255, 255, 255, 255, 718, 717, 255, 255, 257, 716,
- 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
- 257, 257, 257, 257, 261, 261, 261, 261, 715, 714,
- 261, 261, 261, 264, 264, 264, 264, 264, 264, 264,
- 264, 264, 264, 264, 264, 264, 264, 264, 264, 267,
- 267, 267, 267, 713, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 271, 712, 711, 271, 271,
- 271, 271, 271, 271, 271, 710, 271, 271, 271, 271,
- 271, 273, 707, 273, 273, 273, 273, 273, 273, 273,
-
- 273, 273, 273, 273, 273, 273, 273, 274, 706, 274,
- 274, 705, 274, 274, 274, 704, 703, 274, 274, 702,
- 701, 700, 274, 279, 279, 279, 279, 699, 698, 279,
- 279, 279, 284, 697, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284, 288, 288,
- 696, 288, 288, 695, 694, 693, 288, 288, 315, 692,
- 315, 315, 315, 315, 315, 315, 315, 315, 315, 315,
- 315, 315, 315, 315, 319, 691, 319, 319, 319, 319,
- 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
- 320, 690, 320, 320, 320, 320, 320, 320, 320, 320,
-
- 320, 320, 320, 320, 320, 320, 328, 328, 689, 688,
- 328, 328, 328, 329, 329, 687, 683, 329, 329, 329,
- 330, 330, 330, 330, 330, 330, 330, 330, 330, 330,
- 330, 330, 330, 330, 330, 330, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 334, 334, 338, 682, 338, 338, 338, 338, 338, 338,
- 338, 338, 338, 681, 338, 338, 338, 338, 209, 680,
- 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
- 209, 209, 209, 209, 345, 345, 679, 678, 677, 676,
- 345, 346, 346, 346, 346, 675, 674, 346, 346, 346,
-
- 346, 351, 673, 351, 351, 351, 351, 351, 351, 351,
- 351, 351, 351, 351, 351, 351, 351, 227, 672, 227,
- 227, 227, 227, 227, 227, 227, 227, 227, 227, 227,
- 227, 227, 227, 229, 671, 229, 229, 229, 229, 229,
- 229, 229, 229, 229, 229, 229, 229, 229, 229, 230,
- 670, 230, 230, 230, 230, 230, 230, 230, 230, 230,
- 230, 230, 230, 230, 230, 353, 668, 353, 353, 353,
- 353, 353, 353, 353, 353, 353, 353, 353, 353, 353,
- 353, 354, 667, 354, 354, 354, 354, 354, 354, 354,
- 354, 354, 354, 354, 354, 354, 354, 234, 234, 234,
-
- 234, 234, 234, 234, 234, 234, 234, 234, 234, 234,
- 234, 234, 234, 236, 666, 236, 236, 665, 236, 236,
- 236, 664, 663, 236, 236, 662, 661, 660, 236, 238,
- 238, 238, 238, 659, 658, 238, 238, 238, 242, 657,
- 242, 242, 242, 242, 242, 242, 242, 242, 242, 242,
- 242, 242, 242, 242, 246, 246, 246, 246, 656, 655,
- 246, 246, 246, 361, 361, 654, 653, 652, 361, 361,
- 255, 651, 650, 649, 255, 255, 255, 255, 648, 647,
- 255, 255, 257, 646, 257, 257, 257, 257, 257, 257,
- 257, 257, 257, 257, 257, 257, 257, 257, 261, 261,
-
- 261, 261, 645, 644, 261, 261, 261, 264, 264, 264,
- 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
- 264, 264, 264, 267, 267, 267, 267, 643, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267, 267, 271,
- 642, 641, 271, 271, 271, 271, 271, 271, 271, 640,
- 271, 271, 271, 271, 271, 274, 639, 274, 274, 638,
- 274, 274, 274, 637, 636, 274, 274, 635, 622, 621,
- 274, 279, 279, 279, 279, 620, 619, 279, 279, 279,
- 284, 618, 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 288, 288, 560, 288,
-
- 288, 614, 613, 612, 288, 288, 315, 611, 315, 315,
- 315, 315, 315, 315, 315, 315, 315, 315, 315, 315,
- 315, 315, 319, 610, 319, 319, 319, 319, 319, 319,
- 319, 319, 319, 319, 319, 319, 319, 319, 320, 609,
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
- 320, 320, 320, 320, 415, 415, 415, 415, 415, 415,
- 415, 415, 415, 415, 415, 415, 415, 415, 415, 415,
- 424, 424, 424, 424, 608, 607, 424, 424, 424, 425,
- 425, 425, 425, 606, 605, 425, 425, 425, 330, 330,
- 330, 330, 330, 330, 330, 330, 330, 330, 330, 330,
-
- 330, 330, 330, 330, 334, 334, 334, 334, 334, 334,
- 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
- 338, 604, 338, 338, 338, 338, 338, 338, 338, 338,
- 338, 603, 338, 338, 338, 338, 433, 433, 602, 601,
- 600, 599, 433, 346, 346, 346, 346, 598, 597, 346,
- 346, 346, 346, 351, 596, 351, 351, 351, 351, 351,
- 351, 351, 351, 351, 351, 351, 351, 351, 351, 615,
- 615, 615, 615, 615, 615, 615, 615, 615, 615, 615,
- 615, 615, 615, 615, 615, 684, 684, 684, 684, 684,
- 684, 684, 684, 684, 684, 684, 684, 684, 684, 684,
-
- 684, 595, 594, 593, 592, 589, 588, 587, 586, 585,
- 584, 571, 570, 569, 568, 565, 564, 563, 562, 561,
- 560, 559, 558, 557, 556, 555, 554, 551, 550, 549,
- 548, 547, 546, 545, 544, 543, 542, 541, 540, 539,
- 538, 537, 536, 535, 531, 530, 529, 528, 527, 526,
- 525, 524, 523, 510, 509, 508, 507, 506, 503, 499,
- 498, 497, 496, 492, 491, 490, 489, 488, 484, 483,
- 482, 479, 478, 477, 476, 475, 474, 473, 472, 471,
- 470, 469, 468, 467, 466, 465, 464, 463, 462, 461,
- 460, 459, 458, 457, 456, 455, 454, 453, 452, 451,
-
- 439, 437, 436, 435, 434, 347, 426, 423, 422, 421,
- 322, 414, 316, 408, 407, 406, 401, 400, 399, 398,
- 397, 396, 395, 394, 391, 390, 389, 386, 385, 382,
- 379, 378, 285, 282, 377, 376, 278, 373, 372, 243,
- 356, 355, 235, 231, 352, 350, 349, 348, 218, 347,
- 337, 206, 333, 202, 318, 186, 182, 316, 314, 313,
- 312, 311, 310, 309, 305, 299, 298, 295, 294, 291,
- 287, 286, 285, 283, 282, 281, 280, 260, 278, 277,
- 272, 270, 263, 262, 260, 256, 250, 253, 250, 249,
- 247, 245, 244, 243, 241, 240, 239, 237, 235, 228,
-
- 231, 228, 226, 218, 208, 202, 199, 186, 182, 768,
- 94, 94, 85, 77, 77, 39, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768
- } ;
-
-static yyconst short int yy_chk[2775] =
- { 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,
- 765, 3, 5, 5, 3, 3, 3, 27, 27, 3,
- 6, 6, 6, 28, 28, 3, 6, 11, 11, 11,
- 3, 3, 12, 12, 12, 48, 17, 17, 66, 29,
- 29, 60, 60, 18, 18, 310, 17, 29, 310, 17,
- 17, 17, 17, 18, 61, 61, 18, 18, 18, 18,
- 3, 3, 3, 4, 4, 4, 4, 109, 4, 4,
- 21, 4, 4, 4, 511, 48, 4, 19, 19, 19,
- 22, 109, 4, 20, 20, 20, 66, 4, 4, 141,
-
- 4, 17, 61, 21, 21, 141, 21, 37, 18, 37,
- 75, 19, 75, 22, 22, 511, 22, 20, 30, 30,
- 37, 37, 37, 37, 128, 128, 30, 4, 4, 4,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 23, 23, 163, 24,
- 24, 38, 764, 38, 41, 41, 41, 23, 130, 130,
- 24, 45, 45, 45, 38, 38, 38, 38, 163, 23,
- 23, 23, 24, 24, 24, 25, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 31, 31, 31, 32, 32, 32, 57,
- 57, 57, 62, 62, 62, 62, 99, 99, 99, 99,
- 131, 131, 133, 133, 167, 198, 198, 31, 167, 763,
- 32, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
-
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 49, 53, 53,
- 53, 121, 105, 105, 53, 158, 108, 108, 115, 115,
- 160, 158, 63, 63, 63, 291, 168, 275, 63, 121,
-
- 49, 188, 49, 275, 49, 63, 168, 205, 205, 160,
- 49, 63, 291, 49, 49, 49, 405, 49, 49, 63,
- 105, 170, 405, 49, 108, 49, 115, 180, 180, 180,
- 180, 170, 762, 53, 170, 181, 181, 181, 185, 185,
- 185, 188, 192, 192, 192, 209, 209, 63, 193, 193,
- 193, 294, 194, 194, 194, 294, 192, 192, 192, 192,
- 211, 211, 193, 193, 193, 193, 194, 194, 194, 194,
- 195, 195, 195, 201, 201, 201, 210, 213, 213, 201,
- 289, 257, 210, 210, 195, 195, 195, 195, 192, 217,
- 217, 217, 264, 264, 289, 217, 194, 362, 211, 257,
-
- 266, 266, 217, 248, 248, 248, 248, 761, 217, 267,
- 267, 269, 269, 195, 298, 309, 217, 314, 298, 362,
- 314, 321, 321, 321, 309, 330, 330, 760, 201, 314,
- 314, 317, 317, 317, 317, 321, 321, 321, 321, 708,
- 314, 332, 332, 708, 217, 241, 241, 241, 241, 241,
- 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
- 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
- 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
- 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
- 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
-
- 241, 241, 241, 250, 250, 250, 250, 334, 334, 250,
- 336, 336, 338, 338, 250, 344, 344, 757, 250, 415,
- 415, 250, 756, 250, 418, 418, 250, 278, 278, 755,
- 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
- 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
- 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
- 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
- 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
- 278, 278, 278, 278, 278, 324, 324, 324, 339, 363,
- 364, 340, 340, 365, 339, 339, 342, 342, 366, 324,
-
- 324, 324, 324, 340, 371, 409, 342, 342, 409, 409,
- 441, 363, 365, 444, 364, 420, 420, 420, 371, 485,
- 754, 441, 494, 494, 444, 485, 366, 504, 504, 340,
- 341, 341, 367, 341, 341, 341, 341, 341, 341, 341,
- 341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
- 341, 341, 341, 341, 341, 341, 341, 367, 341, 341,
- 341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
- 341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
- 341, 341, 341, 341, 341, 341, 341, 341, 343, 343,
- 343, 343, 752, 369, 505, 505, 343, 750, 343, 343,
-
- 495, 495, 495, 343, 343, 343, 343, 343, 343, 360,
- 360, 368, 360, 360, 360, 360, 360, 360, 360, 369,
- 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
- 360, 360, 370, 442, 360, 360, 360, 360, 443, 368,
- 428, 428, 368, 431, 431, 416, 416, 416, 561, 561,
- 428, 428, 749, 431, 431, 443, 519, 445, 370, 416,
- 416, 416, 416, 442, 360, 360, 360, 375, 375, 519,
- 375, 375, 375, 375, 375, 375, 375, 440, 375, 375,
- 375, 375, 375, 375, 375, 375, 375, 375, 375, 375,
- 445, 447, 375, 375, 375, 375, 419, 419, 419, 446,
-
- 450, 440, 449, 440, 520, 448, 503, 503, 503, 512,
- 419, 419, 419, 419, 517, 447, 448, 520, 446, 450,
- 501, 501, 375, 375, 375, 427, 427, 512, 449, 517,
- 501, 501, 427, 427, 427, 427, 427, 427, 427, 427,
- 427, 427, 427, 427, 427, 427, 427, 427, 427, 427,
- 427, 427, 427, 427, 427, 427, 427, 429, 429, 429,
- 429, 462, 514, 513, 518, 429, 515, 566, 566, 521,
- 567, 567, 429, 429, 429, 429, 429, 429, 432, 432,
- 432, 432, 516, 462, 521, 515, 432, 513, 518, 462,
- 514, 574, 522, 432, 432, 432, 432, 432, 432, 502,
-
- 502, 502, 502, 532, 565, 565, 565, 502, 516, 522,
- 572, 573, 574, 532, 502, 502, 502, 502, 502, 502,
- 575, 576, 573, 577, 578, 579, 580, 583, 581, 582,
- 615, 615, 634, 572, 617, 617, 656, 656, 684, 684,
- 748, 577, 575, 581, 681, 747, 583, 686, 686, 810,
- 810, 576, 578, 745, 744, 579, 580, 582, 743, 742,
- 740, 681, 634, 769, 769, 769, 769, 769, 769, 769,
- 769, 769, 769, 769, 769, 769, 769, 769, 769, 770,
- 770, 770, 770, 770, 770, 770, 770, 770, 770, 770,
- 770, 770, 770, 770, 770, 771, 771, 771, 771, 771,
-
- 771, 771, 771, 771, 771, 771, 771, 771, 771, 771,
- 771, 772, 772, 772, 772, 772, 772, 772, 772, 772,
- 772, 772, 772, 772, 772, 772, 772, 773, 773, 773,
- 773, 773, 773, 773, 773, 773, 773, 773, 773, 773,
- 773, 773, 773, 774, 774, 774, 774, 774, 774, 774,
- 774, 774, 774, 774, 774, 774, 774, 774, 774, 775,
- 775, 775, 775, 775, 775, 775, 775, 775, 775, 775,
- 775, 775, 775, 775, 775, 776, 776, 776, 776, 776,
- 776, 776, 776, 776, 776, 776, 776, 776, 776, 776,
- 776, 777, 777, 777, 777, 777, 777, 777, 777, 777,
-
- 777, 777, 777, 777, 777, 777, 777, 778, 778, 778,
- 778, 778, 778, 778, 778, 778, 778, 778, 778, 778,
- 778, 778, 778, 779, 779, 779, 779, 779, 779, 779,
- 779, 779, 779, 779, 779, 779, 779, 779, 779, 780,
- 780, 780, 780, 780, 780, 780, 780, 780, 780, 780,
- 780, 780, 780, 780, 780, 781, 781, 781, 781, 781,
- 781, 781, 781, 781, 781, 781, 781, 781, 781, 781,
- 781, 782, 782, 782, 782, 782, 782, 782, 782, 782,
- 782, 782, 782, 782, 782, 782, 782, 783, 783, 783,
- 783, 739, 738, 783, 783, 783, 784, 784, 784, 784,
-
- 784, 784, 784, 784, 784, 784, 784, 784, 784, 784,
- 784, 785, 785, 785, 785, 737, 736, 785, 785, 785,
- 786, 735, 786, 786, 786, 786, 786, 786, 786, 786,
- 786, 786, 786, 786, 786, 786, 787, 734, 787, 787,
- 787, 787, 787, 787, 787, 787, 787, 787, 787, 787,
- 787, 787, 788, 788, 788, 733, 732, 788, 788, 788,
- 789, 731, 789, 789, 789, 789, 789, 789, 789, 789,
- 789, 789, 789, 789, 789, 789, 790, 729, 790, 790,
- 790, 790, 790, 790, 790, 790, 790, 790, 790, 790,
- 790, 790, 791, 727, 791, 791, 791, 791, 791, 791,
-
- 791, 791, 791, 791, 791, 791, 791, 791, 792, 792,
- 792, 792, 792, 792, 792, 792, 792, 792, 792, 792,
- 792, 792, 792, 792, 793, 726, 793, 793, 725, 793,
- 793, 793, 724, 723, 793, 793, 722, 721, 720, 793,
- 794, 794, 794, 794, 719, 718, 794, 794, 794, 795,
- 717, 795, 795, 795, 795, 795, 795, 795, 795, 795,
- 795, 795, 795, 795, 795, 796, 796, 796, 796, 715,
- 714, 796, 796, 796, 797, 713, 797, 797, 797, 797,
- 797, 797, 797, 797, 797, 797, 797, 797, 797, 797,
- 798, 712, 798, 798, 798, 798, 798, 798, 798, 798,
-
- 798, 710, 798, 798, 798, 798, 799, 709, 707, 706,
- 799, 799, 799, 799, 705, 704, 799, 799, 800, 703,
- 800, 800, 800, 800, 800, 800, 800, 800, 800, 800,
- 800, 800, 800, 800, 801, 801, 801, 801, 702, 701,
- 801, 801, 801, 802, 802, 802, 802, 802, 802, 802,
- 802, 802, 802, 802, 802, 802, 802, 802, 802, 803,
- 803, 803, 803, 700, 803, 803, 803, 803, 803, 803,
- 803, 803, 803, 803, 803, 804, 699, 698, 804, 804,
- 804, 804, 804, 804, 804, 682, 804, 804, 804, 804,
- 804, 805, 680, 805, 805, 805, 805, 805, 805, 805,
-
- 805, 805, 805, 805, 805, 805, 805, 806, 679, 806,
- 806, 678, 806, 806, 806, 677, 675, 806, 806, 674,
- 672, 671, 806, 807, 807, 807, 807, 670, 669, 807,
- 807, 807, 808, 668, 808, 808, 808, 808, 808, 808,
- 808, 808, 808, 808, 808, 808, 808, 808, 809, 809,
- 667, 809, 809, 666, 665, 664, 809, 809, 811, 663,
- 811, 811, 811, 811, 811, 811, 811, 811, 811, 811,
- 811, 811, 811, 811, 812, 662, 812, 812, 812, 812,
- 812, 812, 812, 812, 812, 812, 812, 812, 812, 812,
- 813, 661, 813, 813, 813, 813, 813, 813, 813, 813,
-
- 813, 813, 813, 813, 813, 813, 814, 814, 660, 659,
- 814, 814, 814, 815, 815, 658, 655, 815, 815, 815,
- 816, 816, 816, 816, 816, 816, 816, 816, 816, 816,
- 816, 816, 816, 816, 816, 816, 817, 817, 817, 817,
- 817, 817, 817, 817, 817, 817, 817, 817, 817, 817,
- 817, 817, 818, 653, 818, 818, 818, 818, 818, 818,
- 818, 818, 818, 652, 818, 818, 818, 818, 819, 651,
- 819, 819, 819, 819, 819, 819, 819, 819, 819, 819,
- 819, 819, 819, 819, 820, 820, 650, 646, 644, 643,
- 820, 821, 821, 821, 821, 642, 641, 821, 821, 821,
-
- 821, 822, 639, 822, 822, 822, 822, 822, 822, 822,
- 822, 822, 822, 822, 822, 822, 822, 823, 637, 823,
- 823, 823, 823, 823, 823, 823, 823, 823, 823, 823,
- 823, 823, 823, 824, 636, 824, 824, 824, 824, 824,
- 824, 824, 824, 824, 824, 824, 824, 824, 824, 825,
- 635, 825, 825, 825, 825, 825, 825, 825, 825, 825,
- 825, 825, 825, 825, 825, 826, 633, 826, 826, 826,
- 826, 826, 826, 826, 826, 826, 826, 826, 826, 826,
- 826, 827, 632, 827, 827, 827, 827, 827, 827, 827,
- 827, 827, 827, 827, 827, 827, 827, 828, 828, 828,
-
- 828, 828, 828, 828, 828, 828, 828, 828, 828, 828,
- 828, 828, 828, 829, 631, 829, 829, 630, 829, 829,
- 829, 629, 628, 829, 829, 627, 626, 625, 829, 830,
- 830, 830, 830, 624, 623, 830, 830, 830, 831, 621,
- 831, 831, 831, 831, 831, 831, 831, 831, 831, 831,
- 831, 831, 831, 831, 832, 832, 832, 832, 619, 612,
- 832, 832, 832, 833, 833, 611, 610, 609, 833, 833,
- 834, 608, 607, 606, 834, 834, 834, 834, 604, 601,
- 834, 834, 835, 600, 835, 835, 835, 835, 835, 835,
- 835, 835, 835, 835, 835, 835, 835, 835, 836, 836,
-
- 836, 836, 599, 598, 836, 836, 836, 837, 837, 837,
- 837, 837, 837, 837, 837, 837, 837, 837, 837, 837,
- 837, 837, 837, 838, 838, 838, 838, 597, 838, 838,
- 838, 838, 838, 838, 838, 838, 838, 838, 838, 839,
- 596, 595, 839, 839, 839, 839, 839, 839, 839, 594,
- 839, 839, 839, 839, 839, 840, 593, 840, 840, 592,
- 840, 840, 840, 591, 590, 840, 840, 588, 569, 568,
- 840, 841, 841, 841, 841, 564, 563, 841, 841, 841,
- 842, 562, 842, 842, 842, 842, 842, 842, 842, 842,
- 842, 842, 842, 842, 842, 842, 843, 843, 560, 843,
-
- 843, 559, 558, 557, 843, 843, 844, 556, 844, 844,
- 844, 844, 844, 844, 844, 844, 844, 844, 844, 844,
- 844, 844, 845, 555, 845, 845, 845, 845, 845, 845,
- 845, 845, 845, 845, 845, 845, 845, 845, 846, 554,
- 846, 846, 846, 846, 846, 846, 846, 846, 846, 846,
- 846, 846, 846, 846, 847, 847, 847, 847, 847, 847,
- 847, 847, 847, 847, 847, 847, 847, 847, 847, 847,
- 848, 848, 848, 848, 553, 552, 848, 848, 848, 849,
- 849, 849, 849, 551, 549, 849, 849, 849, 850, 850,
- 850, 850, 850, 850, 850, 850, 850, 850, 850, 850,
-
- 850, 850, 850, 850, 851, 851, 851, 851, 851, 851,
- 851, 851, 851, 851, 851, 851, 851, 851, 851, 851,
- 852, 548, 852, 852, 852, 852, 852, 852, 852, 852,
- 852, 546, 852, 852, 852, 852, 853, 853, 545, 544,
- 543, 542, 853, 854, 854, 854, 854, 541, 540, 854,
- 854, 854, 854, 855, 539, 855, 855, 855, 855, 855,
- 855, 855, 855, 855, 855, 855, 855, 855, 855, 856,
- 856, 856, 856, 856, 856, 856, 856, 856, 856, 856,
- 856, 856, 856, 856, 856, 857, 857, 857, 857, 857,
- 857, 857, 857, 857, 857, 857, 857, 857, 857, 857,
-
- 857, 538, 536, 534, 533, 530, 528, 526, 525, 524,
- 523, 509, 508, 507, 506, 500, 499, 498, 497, 496,
- 492, 491, 490, 489, 488, 487, 486, 483, 482, 481,
- 480, 479, 478, 476, 475, 474, 473, 472, 471, 469,
- 468, 467, 464, 463, 461, 460, 459, 458, 457, 454,
- 453, 452, 451, 439, 437, 436, 435, 434, 430, 426,
- 423, 422, 421, 414, 413, 412, 411, 410, 408, 407,
- 406, 404, 403, 402, 401, 400, 399, 398, 397, 396,
- 395, 394, 393, 392, 391, 390, 388, 387, 386, 384,
- 383, 382, 381, 380, 379, 378, 377, 376, 373, 372,
-
- 361, 356, 355, 352, 350, 346, 337, 327, 326, 325,
- 323, 318, 315, 313, 312, 311, 308, 307, 306, 305,
- 303, 301, 300, 299, 297, 296, 295, 293, 292, 290,
- 287, 286, 284, 282, 281, 280, 276, 263, 262, 243,
- 240, 239, 234, 231, 226, 222, 221, 220, 219, 216,
- 208, 207, 204, 203, 189, 187, 183, 179, 176, 175,
- 174, 173, 172, 171, 169, 166, 165, 162, 161, 159,
- 156, 155, 154, 153, 151, 149, 148, 146, 144, 143,
- 137, 134, 125, 124, 122, 119, 114, 112, 107, 103,
- 97, 92, 89, 87, 85, 84, 83, 80, 76, 74,
-
- 73, 71, 67, 65, 59, 55, 50, 47, 43, 39,
- 16, 15, 10, 8, 7, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768
- } ;
-
-static yy_state_type yy_last_accepting_state;
-static char *yy_last_accepting_cpos;
-
-/* The intent behind this definition is that it'll catch
- * any uses of REJECT which flex missed.
- */
-#define REJECT reject_used_but_not_detected
-#define yymore() yymore_used_but_not_detected
-#define YY_MORE_ADJ 0
-#define YY_RESTORE_YY_MORE_OFFSET
-char *yytext;
-#line 1 "scan.l"
-#define INITIAL 0
-/* scan.l - scanner for flex input */
-#line 4 "scan.l"
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Vern Paxson.
- *
- * The United States Government has rights in this work pursuant
- * to contract no. DE-AC03-76SF00098 between the United States
- * Department of Energy and the University of California.
- *
- * Redistribution and use in source and binary forms are permitted provided
- * that: (1) source distributions retain this entire copyright notice and
- * comment, and (2) distributions including binaries display the following
- * acknowledgement: ``This product includes software developed by the
- * University of California, Berkeley and its contributors'' in the
- * documentation or other materials provided with the distribution and in
- * all advertising materials mentioning features or use of this software.
- * Neither the name of the University nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/* $Header: /home/daffy/u0/vern/flex/RCS/scan.l,v 2.56 95/04/24 12:17:19 vern Exp $ */
-
-#ifndef lint
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "flexdef.h"
-#include "parse.h"
-
-#define ACTION_ECHO add_action( yytext )
-#define ACTION_IFDEF(def, should_define) \
- { \
- if ( should_define ) \
- action_define( def, 1 ); \
- }
-
-#define MARK_END_OF_PROLOG mark_prolog();
-
-#define YY_DECL \
- int flexscan()
-
-#define RETURNCHAR \
- yylval = (unsigned char) yytext[0]; \
- return CHAR;
-
-#define RETURNNAME \
- strcpy( nmstr, yytext ); \
- return NAME;
-
-#define PUT_BACK_STRING(str, start) \
- for ( i = strlen( str ) - 1; i >= start; --i ) \
- unput((str)[i])
-
-#define CHECK_REJECT(str) \
- if ( all_upper( str ) ) \
- reject = true;
-
-#define CHECK_YYMORE(str) \
- if ( all_lower( str ) ) \
- yymore_used = true;
-#define YY_STACK_USED 1
-#define YY_NO_TOP_STATE 1
-#define SECT2 1
-#define SECT2PROLOG 2
-#define SECT3 3
-#define CODEBLOCK 4
-#define PICKUPDEF 5
-#define SC 6
-#define CARETISBOL 7
-#define NUM 8
-#define QUOTE 9
-
-#define FIRSTCCL 10
-#define CCL 11
-#define ACTION 12
-#define RECOVER 13
-#define COMMENT 14
-#define ACTION_STRING 15
-#define PERCENT_BRACE_ACTION 16
-
-#define OPTION 17
-#define LINEDIR 18
-
-#line 1333 "scan.c"
-
-/* Macros after this point can all be overridden by user definitions in
- * section 1.
- */
-
-#ifndef YY_SKIP_YYWRAP
-#ifdef __cplusplus
-extern "C" int yywrap YY_PROTO(( void ));
-#else
-extern int yywrap YY_PROTO(( void ));
-#endif
-#endif
-
-#ifndef YY_NO_UNPUT
-static void yyunput YY_PROTO(( int c, char *buf_ptr ));
-#endif
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen YY_PROTO(( yyconst char * ));
-#endif
-
-#ifndef YY_NO_INPUT
-#ifdef __cplusplus
-static int yyinput YY_PROTO(( void ));
-#else
-static int input YY_PROTO(( void ));
-#endif
-#endif
-
-#if YY_STACK_USED
-static int yy_start_stack_ptr = 0;
-static int yy_start_stack_depth = 0;
-static int *yy_start_stack = 0;
-#ifndef YY_NO_PUSH_STATE
-static void yy_push_state YY_PROTO(( int new_state ));
-#endif
-#ifndef YY_NO_POP_STATE
-static void yy_pop_state YY_PROTO(( void ));
-#endif
-#ifndef YY_NO_TOP_STATE
-static int yy_top_state YY_PROTO(( void ));
-#endif
-
-#else
-#define YY_NO_PUSH_STATE 1
-#define YY_NO_POP_STATE 1
-#define YY_NO_TOP_STATE 1
-#endif
-
-#ifdef YY_MALLOC_DECL
-YY_MALLOC_DECL
-#else
-#if __STDC__
-#ifndef __cplusplus
-#include <stdlib.h>
-#endif
-#else
-/* Just try to get by without declaring the routines. This will fail
- * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
- * or sizeof(void*) != sizeof(int).
- */
-#endif
-#endif
-
-/* Amount of stuff to slurp up with each read. */
-#ifndef YY_READ_BUF_SIZE
-#define YY_READ_BUF_SIZE 8192
-#endif
-
-/* Copy whatever the last rule matched to the standard output. */
-
-#ifndef ECHO
-/* This used to be an fputs(), but since the string might contain NUL's,
- * we now use fwrite().
- */
-#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
-#endif
-
-/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
- * is returned in "result".
- */
-#ifndef YY_INPUT
-#define YY_INPUT(buf,result,max_size) \
- if ( yy_current_buffer->yy_is_interactive ) \
- { \
- int c = '*', n; \
- for ( n = 0; n < max_size && \
- (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
- buf[n] = (char) c; \
- if ( c == '\n' ) \
- buf[n++] = (char) c; \
- if ( c == EOF && ferror( yyin ) ) \
- YY_FATAL_ERROR( "input in flex scanner failed" ); \
- result = n; \
- } \
- else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
- && ferror( yyin ) ) \
- YY_FATAL_ERROR( "input in flex scanner failed" );
-#endif
-
-/* No semi-colon after return; correct usage is to write "yyterminate();" -
- * we don't want an extra ';' after the "return" because that will cause
- * some compilers to complain about unreachable statements.
- */
-#ifndef yyterminate
-#define yyterminate() return YY_NULL
-#endif
-
-/* Number of entries by which start-condition stack grows. */
-#ifndef YY_START_STACK_INCR
-#define YY_START_STACK_INCR 25
-#endif
-
-/* Report a fatal error. */
-#ifndef YY_FATAL_ERROR
-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
-#endif
-
-/* Default declaration of generated scanner - a define so the user can
- * easily add parameters.
- */
-#ifndef YY_DECL
-#define YY_DECL int yylex YY_PROTO(( void ))
-#endif
-
-/* Code executed at the beginning of each rule, after yytext and yyleng
- * have been set up.
- */
-#ifndef YY_USER_ACTION
-#define YY_USER_ACTION
-#endif
-
-/* Code executed at the end of each rule. */
-#ifndef YY_BREAK
-#define YY_BREAK break;
-#endif
-
-#define YY_RULE_SETUP \
- if ( yyleng > 0 ) \
- yy_current_buffer->yy_at_bol = \
- (yytext[yyleng - 1] == '\n'); \
- YY_USER_ACTION
-
-YY_DECL
- {
- yy_state_type yy_current_state;
- char *yy_cp, *yy_bp;
- int yy_act;
-
-#line 94 "scan.l"
-
- static int bracelevel, didadef, indented_code;
- static int doing_rule_action = false;
- static int option_sense;
-
- int doing_codeblock = false;
- int i;
- Char nmdef[MAXLINE], myesc();
-
-
-#line 1498 "scan.c"
-
- if ( yy_init )
- {
- yy_init = 0;
-
-#ifdef YY_USER_INIT
- YY_USER_INIT;
-#endif
-
- if ( ! yy_start )
- yy_start = 1; /* first start state */
-
- if ( ! yyin )
- yyin = stdin;
-
- if ( ! yyout )
- yyout = stdout;
-
- if ( ! yy_current_buffer )
- yy_current_buffer =
- yy_create_buffer( yyin, YY_BUF_SIZE );
-
- yy_load_buffer_state();
- }
-
- while ( 1 ) /* loops until end-of-file is reached */
- {
- yy_cp = yy_c_buf_p;
-
- /* Support of yytext. */
- *yy_cp = yy_hold_char;
-
- /* yy_bp points to the position in yy_ch_buf of the start of
- * the current run.
- */
- yy_bp = yy_cp;
-
- yy_current_state = yy_start;
- yy_current_state += YY_AT_BOL();
-yy_match:
- do
- {
- YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
- if ( yy_accept[yy_current_state] )
- {
- yy_last_accepting_state = yy_current_state;
- yy_last_accepting_cpos = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 769 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- ++yy_cp;
- }
- while ( yy_base[yy_current_state] != 2716 );
-
-yy_find_action:
- yy_act = yy_accept[yy_current_state];
- if ( yy_act == 0 )
- { /* have to back up */
- yy_cp = yy_last_accepting_cpos;
- yy_current_state = yy_last_accepting_state;
- yy_act = yy_accept[yy_current_state];
- }
-
- YY_DO_BEFORE_ACTION;
-
-
-do_action: /* This label is used only to access EOF actions. */
-
-
- switch ( yy_act )
- { /* beginning of action switch */
- case 0: /* must back up */
- /* undo the effects of YY_DO_BEFORE_ACTION */
- *yy_cp = yy_hold_char;
- yy_cp = yy_last_accepting_cpos;
- yy_current_state = yy_last_accepting_state;
- goto yy_find_action;
-
-
-case 1:
-YY_RULE_SETUP
-#line 105 "scan.l"
-indented_code = true; BEGIN(CODEBLOCK);
- YY_BREAK
-case 2:
-YY_RULE_SETUP
-#line 106 "scan.l"
-ACTION_ECHO; yy_push_state( COMMENT );
- YY_BREAK
-case 3:
-YY_RULE_SETUP
-#line 107 "scan.l"
-yy_push_state( LINEDIR );
- YY_BREAK
-case 4:
-YY_RULE_SETUP
-#line 108 "scan.l"
-return SCDECL;
- YY_BREAK
-case 5:
-YY_RULE_SETUP
-#line 109 "scan.l"
-return XSCDECL;
- YY_BREAK
-case 6:
-YY_RULE_SETUP
-#line 110 "scan.l"
-{
- ++linenum;
- line_directive_out( (FILE *) 0, 1 );
- indented_code = false;
- BEGIN(CODEBLOCK);
- }
- YY_BREAK
-case 7:
-YY_RULE_SETUP
-#line 117 "scan.l"
-/* discard */
- YY_BREAK
-case 8:
-YY_RULE_SETUP
-#line 119 "scan.l"
-{
- sectnum = 2;
- bracelevel = 0;
- mark_defs1();
- line_directive_out( (FILE *) 0, 1 );
- BEGIN(SECT2PROLOG);
- return SECTEND;
- }
- YY_BREAK
-case 9:
-YY_RULE_SETUP
-#line 128 "scan.l"
-yytext_is_array = false; ++linenum;
- YY_BREAK
-case 10:
-YY_RULE_SETUP
-#line 129 "scan.l"
-yytext_is_array = true; ++linenum;
- YY_BREAK
-case 11:
-YY_RULE_SETUP
-#line 131 "scan.l"
-BEGIN(OPTION); return OPTION_OP;
- YY_BREAK
-case 12:
-YY_RULE_SETUP
-#line 133 "scan.l"
-++linenum; /* ignore */
- YY_BREAK
-case 13:
-YY_RULE_SETUP
-#line 134 "scan.l"
-++linenum; /* ignore */
- YY_BREAK
-case 14:
-YY_RULE_SETUP
-#line 136 "scan.l"
-synerr( _( "unrecognized '%' directive" ) );
- YY_BREAK
-case 15:
-YY_RULE_SETUP
-#line 138 "scan.l"
-{
- strcpy( nmstr, yytext );
- didadef = false;
- BEGIN(PICKUPDEF);
- }
- YY_BREAK
-case 16:
-YY_RULE_SETUP
-#line 144 "scan.l"
-RETURNNAME;
- YY_BREAK
-case 17:
-YY_RULE_SETUP
-#line 145 "scan.l"
-++linenum; /* allows blank lines in section 1 */
- YY_BREAK
-case 18:
-YY_RULE_SETUP
-#line 146 "scan.l"
-ACTION_ECHO; ++linenum; /* maybe end of comment line */
- YY_BREAK
-
-
-case 19:
-YY_RULE_SETUP
-#line 151 "scan.l"
-ACTION_ECHO; yy_pop_state();
- YY_BREAK
-case 20:
-YY_RULE_SETUP
-#line 152 "scan.l"
-ACTION_ECHO;
- YY_BREAK
-case 21:
-YY_RULE_SETUP
-#line 153 "scan.l"
-ACTION_ECHO;
- YY_BREAK
-case 22:
-YY_RULE_SETUP
-#line 154 "scan.l"
-++linenum; ACTION_ECHO;
- YY_BREAK
-
-
-case 23:
-YY_RULE_SETUP
-#line 158 "scan.l"
-yy_pop_state();
- YY_BREAK
-case 24:
-YY_RULE_SETUP
-#line 159 "scan.l"
-linenum = myctoi( yytext );
- YY_BREAK
-case 25:
-YY_RULE_SETUP
-#line 161 "scan.l"
-{
- flex_free( (void *) infilename );
- infilename = copy_string( yytext + 1 );
- infilename[strlen( infilename ) - 1] = '\0';
- }
- YY_BREAK
-case 26:
-YY_RULE_SETUP
-#line 166 "scan.l"
-/* ignore spurious characters */
- YY_BREAK
-
-
-case 27:
-YY_RULE_SETUP
-#line 170 "scan.l"
-++linenum; BEGIN(INITIAL);
- YY_BREAK
-case 28:
-YY_RULE_SETUP
-#line 172 "scan.l"
-ACTION_ECHO;
- YY_BREAK
-case 29:
-YY_RULE_SETUP
-#line 174 "scan.l"
-{
- ++linenum;
- ACTION_ECHO;
- if ( indented_code )
- BEGIN(INITIAL);
- }
- YY_BREAK
-
-
-case 30:
-YY_RULE_SETUP
-#line 184 "scan.l"
-/* separates name and definition */
- YY_BREAK
-case 31:
-YY_RULE_SETUP
-#line 186 "scan.l"
-{
- strcpy( (char *) nmdef, yytext );
-
- /* Skip trailing whitespace. */
- for ( i = strlen( (char *) nmdef ) - 1;
- i >= 0 && (nmdef[i] == ' ' || nmdef[i] == '\t');
- --i )
- ;
-
- nmdef[i + 1] = '\0';
-
- ndinstal( nmstr, nmdef );
- didadef = true;
- }
- YY_BREAK
-case 32:
-YY_RULE_SETUP
-#line 201 "scan.l"
-{
- if ( ! didadef )
- synerr( _( "incomplete name definition" ) );
- BEGIN(INITIAL);
- ++linenum;
- }
- YY_BREAK
-
-
-case 33:
-YY_RULE_SETUP
-#line 211 "scan.l"
-++linenum; BEGIN(INITIAL);
- YY_BREAK
-case 34:
-YY_RULE_SETUP
-#line 212 "scan.l"
-option_sense = true;
- YY_BREAK
-case 35:
-YY_RULE_SETUP
-#line 214 "scan.l"
-return '=';
- YY_BREAK
-case 36:
-YY_RULE_SETUP
-#line 216 "scan.l"
-option_sense = ! option_sense;
- YY_BREAK
-case 37:
-YY_RULE_SETUP
-#line 218 "scan.l"
-csize = option_sense ? 128 : 256;
- YY_BREAK
-case 38:
-YY_RULE_SETUP
-#line 219 "scan.l"
-csize = option_sense ? 256 : 128;
- YY_BREAK
-case 39:
-YY_RULE_SETUP
-#line 221 "scan.l"
-long_align = option_sense;
- YY_BREAK
-case 40:
-YY_RULE_SETUP
-#line 222 "scan.l"
-{
- action_define( "YY_ALWAYS_INTERACTIVE", option_sense );
- }
- YY_BREAK
-case 41:
-YY_RULE_SETUP
-#line 225 "scan.l"
-yytext_is_array = option_sense;
- YY_BREAK
-case 42:
-YY_RULE_SETUP
-#line 226 "scan.l"
-backing_up_report = option_sense;
- YY_BREAK
-case 43:
-YY_RULE_SETUP
-#line 227 "scan.l"
-interactive = ! option_sense;
- YY_BREAK
-case 44:
-YY_RULE_SETUP
-#line 228 "scan.l"
-C_plus_plus = option_sense;
- YY_BREAK
-case 45:
-YY_RULE_SETUP
-#line 229 "scan.l"
-caseins = ! option_sense;
- YY_BREAK
-case 46:
-YY_RULE_SETUP
-#line 230 "scan.l"
-caseins = option_sense;
- YY_BREAK
-case 47:
-YY_RULE_SETUP
-#line 231 "scan.l"
-ddebug = option_sense;
- YY_BREAK
-case 48:
-YY_RULE_SETUP
-#line 232 "scan.l"
-spprdflt = ! option_sense;
- YY_BREAK
-case 49:
-YY_RULE_SETUP
-#line 233 "scan.l"
-useecs = option_sense;
- YY_BREAK
-case 50:
-YY_RULE_SETUP
-#line 234 "scan.l"
-{
- useecs = usemecs = false;
- use_read = fullspd = true;
- }
- YY_BREAK
-case 51:
-YY_RULE_SETUP
-#line 238 "scan.l"
-{
- useecs = usemecs = false;
- use_read = fulltbl = true;
- }
- YY_BREAK
-case 52:
-YY_RULE_SETUP
-#line 242 "scan.l"
-ACTION_IFDEF("YY_NO_INPUT", ! option_sense);
- YY_BREAK
-case 53:
-YY_RULE_SETUP
-#line 243 "scan.l"
-interactive = option_sense;
- YY_BREAK
-case 54:
-YY_RULE_SETUP
-#line 244 "scan.l"
-lex_compat = option_sense;
- YY_BREAK
-case 55:
-YY_RULE_SETUP
-#line 245 "scan.l"
-{
- action_define( "YY_MAIN", option_sense );
- do_yywrap = ! option_sense;
- }
- YY_BREAK
-case 56:
-YY_RULE_SETUP
-#line 249 "scan.l"
-usemecs = option_sense;
- YY_BREAK
-case 57:
-YY_RULE_SETUP
-#line 250 "scan.l"
-{
- action_define( "YY_NEVER_INTERACTIVE", option_sense );
- }
- YY_BREAK
-case 58:
-YY_RULE_SETUP
-#line 253 "scan.l"
-performance_report += option_sense ? 1 : -1;
- YY_BREAK
-case 59:
-YY_RULE_SETUP
-#line 254 "scan.l"
-yytext_is_array = ! option_sense;
- YY_BREAK
-case 60:
-YY_RULE_SETUP
-#line 255 "scan.l"
-use_read = option_sense;
- YY_BREAK
-case 61:
-YY_RULE_SETUP
-#line 256 "scan.l"
-reject_really_used = option_sense;
- YY_BREAK
-case 62:
-YY_RULE_SETUP
-#line 257 "scan.l"
-action_define( "YY_STACK_USED", option_sense );
- YY_BREAK
-case 63:
-YY_RULE_SETUP
-#line 258 "scan.l"
-do_stdinit = option_sense;
- YY_BREAK
-case 64:
-YY_RULE_SETUP
-#line 259 "scan.l"
-use_stdout = option_sense;
- YY_BREAK
-case 65:
-YY_RULE_SETUP
-#line 260 "scan.l"
-ACTION_IFDEF("YY_NO_UNPUT", ! option_sense);
- YY_BREAK
-case 66:
-YY_RULE_SETUP
-#line 261 "scan.l"
-printstats = option_sense;
- YY_BREAK
-case 67:
-YY_RULE_SETUP
-#line 262 "scan.l"
-nowarn = ! option_sense;
- YY_BREAK
-case 68:
-YY_RULE_SETUP
-#line 263 "scan.l"
-do_yylineno = option_sense;
- YY_BREAK
-case 69:
-YY_RULE_SETUP
-#line 264 "scan.l"
-yymore_really_used = option_sense;
- YY_BREAK
-case 70:
-YY_RULE_SETUP
-#line 265 "scan.l"
-do_yywrap = option_sense;
- YY_BREAK
-case 71:
-YY_RULE_SETUP
-#line 267 "scan.l"
-ACTION_IFDEF("YY_NO_PUSH_STATE", ! option_sense);
- YY_BREAK
-case 72:
-YY_RULE_SETUP
-#line 268 "scan.l"
-ACTION_IFDEF("YY_NO_POP_STATE", ! option_sense);
- YY_BREAK
-case 73:
-YY_RULE_SETUP
-#line 269 "scan.l"
-ACTION_IFDEF("YY_NO_TOP_STATE", ! option_sense);
- YY_BREAK
-case 74:
-YY_RULE_SETUP
-#line 271 "scan.l"
-ACTION_IFDEF("YY_NO_SCAN_BUFFER", ! option_sense);
- YY_BREAK
-case 75:
-YY_RULE_SETUP
-#line 272 "scan.l"
-ACTION_IFDEF("YY_NO_SCAN_BYTES", ! option_sense);
- YY_BREAK
-case 76:
-YY_RULE_SETUP
-#line 273 "scan.l"
-ACTION_IFDEF("YY_NO_SCAN_STRING", ! option_sense);
- YY_BREAK
-case 77:
-YY_RULE_SETUP
-#line 275 "scan.l"
-return OPT_OUTFILE;
- YY_BREAK
-case 78:
-YY_RULE_SETUP
-#line 276 "scan.l"
-return OPT_PREFIX;
- YY_BREAK
-case 79:
-YY_RULE_SETUP
-#line 277 "scan.l"
-return OPT_YYCLASS;
- YY_BREAK
-case 80:
-YY_RULE_SETUP
-#line 279 "scan.l"
-{
- strcpy( nmstr, yytext + 1 );
- nmstr[strlen( nmstr ) - 1] = '\0';
- return NAME;
- }
- YY_BREAK
-case 81:
-YY_RULE_SETUP
-#line 285 "scan.l"
-{
- format_synerr( _( "unrecognized %%option: %s" ),
- yytext );
- BEGIN(RECOVER);
- }
- YY_BREAK
-
-case 82:
-YY_RULE_SETUP
-#line 292 "scan.l"
-++linenum; BEGIN(INITIAL);
- YY_BREAK
-
-case 83:
-YY_RULE_SETUP
-#line 296 "scan.l"
-++bracelevel; yyless( 2 ); /* eat only %{ */
- YY_BREAK
-case 84:
-YY_RULE_SETUP
-#line 297 "scan.l"
---bracelevel; yyless( 2 ); /* eat only %} */
- YY_BREAK
-case 85:
-YY_RULE_SETUP
-#line 299 "scan.l"
-ACTION_ECHO; /* indented code in prolog */
- YY_BREAK
-case 86:
-YY_RULE_SETUP
-#line 301 "scan.l"
-{ /* non-indented code */
- if ( bracelevel <= 0 )
- { /* not in %{ ... %} */
- yyless( 0 ); /* put it all back */
- yy_set_bol( 1 );
- mark_prolog();
- BEGIN(SECT2);
- }
- else
- ACTION_ECHO;
- }
- YY_BREAK
-case 87:
-YY_RULE_SETUP
-#line 313 "scan.l"
-ACTION_ECHO;
- YY_BREAK
-case 88:
-YY_RULE_SETUP
-#line 314 "scan.l"
-++linenum; ACTION_ECHO;
- YY_BREAK
-case YY_STATE_EOF(SECT2PROLOG):
-#line 316 "scan.l"
-{
- mark_prolog();
- sectnum = 0;
- yyterminate(); /* to stop the parser */
- }
- YY_BREAK
-
-
-case 89:
-YY_RULE_SETUP
-#line 324 "scan.l"
-++linenum; /* allow blank lines in section 2 */
- YY_BREAK
-case 90:
-YY_RULE_SETUP
-#line 326 "scan.l"
-{
- indented_code = false;
- doing_codeblock = true;
- bracelevel = 1;
- BEGIN(PERCENT_BRACE_ACTION);
- }
- YY_BREAK
-case 91:
-YY_RULE_SETUP
-#line 333 "scan.l"
-BEGIN(SC); return '<';
- YY_BREAK
-case 92:
-YY_RULE_SETUP
-#line 334 "scan.l"
-return '^';
- YY_BREAK
-case 93:
-YY_RULE_SETUP
-#line 335 "scan.l"
-BEGIN(QUOTE); return '"';
- YY_BREAK
-case 94:
-*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
-yy_c_buf_p = yy_cp = yy_bp + 1;
-YY_DO_BEFORE_ACTION; /* set up yytext again */
-YY_RULE_SETUP
-#line 336 "scan.l"
-BEGIN(NUM); return '{';
- YY_BREAK
-case 95:
-*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
-yy_c_buf_p = yy_cp = yy_bp + 1;
-YY_DO_BEFORE_ACTION; /* set up yytext again */
-YY_RULE_SETUP
-#line 337 "scan.l"
-return '$';
- YY_BREAK
-case 96:
-YY_RULE_SETUP
-#line 339 "scan.l"
-{
- bracelevel = 1;
- BEGIN(PERCENT_BRACE_ACTION);
-
- if ( in_rule )
- {
- doing_rule_action = true;
- in_rule = false;
- return '\n';
- }
- }
- YY_BREAK
-case 97:
-YY_RULE_SETUP
-#line 350 "scan.l"
-continued_action = true; ++linenum; return '\n';
- YY_BREAK
-case 98:
-YY_RULE_SETUP
-#line 352 "scan.l"
-{
- yyless( yyleng - 2 ); /* put back '/', '*' */
- bracelevel = 0;
- continued_action = false;
- BEGIN(ACTION);
- }
- YY_BREAK
-case 99:
-YY_RULE_SETUP
-#line 359 "scan.l"
-/* allow indented rules */
- YY_BREAK
-case 100:
-YY_RULE_SETUP
-#line 361 "scan.l"
-{
- /* This rule is separate from the one below because
- * otherwise we get variable trailing context, so
- * we can't build the scanner using -{f,F}.
- */
- bracelevel = 0;
- continued_action = false;
- BEGIN(ACTION);
-
- if ( in_rule )
- {
- doing_rule_action = true;
- in_rule = false;
- return '\n';
- }
- }
- YY_BREAK
-case 101:
-YY_RULE_SETUP
-#line 378 "scan.l"
-{
- bracelevel = 0;
- continued_action = false;
- BEGIN(ACTION);
- unput( '\n' ); /* so <ACTION> sees it */
-
- if ( in_rule )
- {
- doing_rule_action = true;
- in_rule = false;
- return '\n';
- }
- }
- YY_BREAK
-case 102:
-#line 393 "scan.l"
-case 103:
-YY_RULE_SETUP
-#line 393 "scan.l"
-return EOF_OP;
- YY_BREAK
-case 104:
-YY_RULE_SETUP
-#line 395 "scan.l"
-{
- sectnum = 3;
- BEGIN(SECT3);
- yyterminate(); /* to stop the parser */
- }
- YY_BREAK
-case 105:
-YY_RULE_SETUP
-#line 401 "scan.l"
-{
- int cclval;
-
- strcpy( nmstr, yytext );
-
- /* Check to see if we've already encountered this
- * ccl.
- */
- if ( (cclval = ccllookup( (Char *) nmstr )) != 0 )
- {
- if ( input() != ']' )
- synerr( _( "bad character class" ) );
-
- yylval = cclval;
- ++cclreuse;
- return PREVCCL;
- }
- else
- {
- /* We fudge a bit. We know that this ccl will
- * soon be numbered as lastccl + 1 by cclinit.
- */
- cclinstal( (Char *) nmstr, lastccl + 1 );
-
- /* Push back everything but the leading bracket
- * so the ccl can be rescanned.
- */
- yyless( 1 );
-
- BEGIN(FIRSTCCL);
- return '[';
- }
- }
- YY_BREAK
-case 106:
-YY_RULE_SETUP
-#line 435 "scan.l"
-{
- Char *nmdefptr;
- Char *ndlookup();
-
- strcpy( nmstr, yytext + 1 );
- nmstr[yyleng - 2] = '\0'; /* chop trailing brace */
-
- if ( (nmdefptr = ndlookup( nmstr )) == 0 )
- format_synerr(
- _( "undefined definition {%s}" ),
- nmstr );
-
- else
- { /* push back name surrounded by ()'s */
- int len = strlen( (char *) nmdefptr );
-
- if ( lex_compat || nmdefptr[0] == '^' ||
- (len > 0 && nmdefptr[len - 1] == '$') )
- { /* don't use ()'s after all */
- PUT_BACK_STRING((char *) nmdefptr, 0);
-
- if ( nmdefptr[0] == '^' )
- BEGIN(CARETISBOL);
- }
-
- else
- {
- unput(')');
- PUT_BACK_STRING((char *) nmdefptr, 0);
- unput('(');
- }
- }
- }
- YY_BREAK
-case 107:
-YY_RULE_SETUP
-#line 469 "scan.l"
-return (unsigned char) yytext[0];
- YY_BREAK
-case 108:
-YY_RULE_SETUP
-#line 470 "scan.l"
-RETURNCHAR;
- YY_BREAK
-
-
-case 109:
-YY_RULE_SETUP
-#line 475 "scan.l"
-return (unsigned char) yytext[0];
- YY_BREAK
-case 110:
-YY_RULE_SETUP
-#line 476 "scan.l"
-BEGIN(SECT2); return '>';
- YY_BREAK
-case 111:
-*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
-yy_c_buf_p = yy_cp = yy_bp + 1;
-YY_DO_BEFORE_ACTION; /* set up yytext again */
-YY_RULE_SETUP
-#line 477 "scan.l"
-BEGIN(CARETISBOL); return '>';
- YY_BREAK
-case 112:
-YY_RULE_SETUP
-#line 478 "scan.l"
-RETURNNAME;
- YY_BREAK
-case 113:
-YY_RULE_SETUP
-#line 479 "scan.l"
-{
- format_synerr( _( "bad <start condition>: %s" ),
- yytext );
- }
- YY_BREAK
-
-case 114:
-YY_RULE_SETUP
-#line 485 "scan.l"
-BEGIN(SECT2); return '^';
- YY_BREAK
-
-case 115:
-YY_RULE_SETUP
-#line 489 "scan.l"
-RETURNCHAR;
- YY_BREAK
-case 116:
-YY_RULE_SETUP
-#line 490 "scan.l"
-BEGIN(SECT2); return '"';
- YY_BREAK
-case 117:
-YY_RULE_SETUP
-#line 492 "scan.l"
-{
- synerr( _( "missing quote" ) );
- BEGIN(SECT2);
- ++linenum;
- return '"';
- }
- YY_BREAK
-
-
-case 118:
-*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
-yy_c_buf_p = yy_cp = yy_bp + 1;
-YY_DO_BEFORE_ACTION; /* set up yytext again */
-YY_RULE_SETUP
-#line 502 "scan.l"
-BEGIN(CCL); return '^';
- YY_BREAK
-case 119:
-*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
-yy_c_buf_p = yy_cp = yy_bp + 1;
-YY_DO_BEFORE_ACTION; /* set up yytext again */
-YY_RULE_SETUP
-#line 503 "scan.l"
-return '^';
- YY_BREAK
-case 120:
-YY_RULE_SETUP
-#line 504 "scan.l"
-BEGIN(CCL); RETURNCHAR;
- YY_BREAK
-
-
-case 121:
-*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
-yy_c_buf_p = yy_cp = yy_bp + 1;
-YY_DO_BEFORE_ACTION; /* set up yytext again */
-YY_RULE_SETUP
-#line 508 "scan.l"
-return '-';
- YY_BREAK
-case 122:
-YY_RULE_SETUP
-#line 509 "scan.l"
-RETURNCHAR;
- YY_BREAK
-case 123:
-YY_RULE_SETUP
-#line 510 "scan.l"
-BEGIN(SECT2); return ']';
- YY_BREAK
-case 124:
-YY_RULE_SETUP
-#line 511 "scan.l"
-{
- synerr( _( "bad character class" ) );
- BEGIN(SECT2);
- return ']';
- }
- YY_BREAK
-
-
-case 125:
-YY_RULE_SETUP
-#line 519 "scan.l"
-BEGIN(CCL); return CCE_ALNUM;
- YY_BREAK
-case 126:
-YY_RULE_SETUP
-#line 520 "scan.l"
-BEGIN(CCL); return CCE_ALPHA;
- YY_BREAK
-case 127:
-YY_RULE_SETUP
-#line 521 "scan.l"
-BEGIN(CCL); return CCE_BLANK;
- YY_BREAK
-case 128:
-YY_RULE_SETUP
-#line 522 "scan.l"
-BEGIN(CCL); return CCE_CNTRL;
- YY_BREAK
-case 129:
-YY_RULE_SETUP
-#line 523 "scan.l"
-BEGIN(CCL); return CCE_DIGIT;
- YY_BREAK
-case 130:
-YY_RULE_SETUP
-#line 524 "scan.l"
-BEGIN(CCL); return CCE_GRAPH;
- YY_BREAK
-case 131:
-YY_RULE_SETUP
-#line 525 "scan.l"
-BEGIN(CCL); return CCE_LOWER;
- YY_BREAK
-case 132:
-YY_RULE_SETUP
-#line 526 "scan.l"
-BEGIN(CCL); return CCE_PRINT;
- YY_BREAK
-case 133:
-YY_RULE_SETUP
-#line 527 "scan.l"
-BEGIN(CCL); return CCE_PUNCT;
- YY_BREAK
-case 134:
-YY_RULE_SETUP
-#line 528 "scan.l"
-BEGIN(CCL); return CCE_SPACE;
- YY_BREAK
-case 135:
-YY_RULE_SETUP
-#line 529 "scan.l"
-BEGIN(CCL); return CCE_UPPER;
- YY_BREAK
-case 136:
-YY_RULE_SETUP
-#line 530 "scan.l"
-BEGIN(CCL); return CCE_XDIGIT;
- YY_BREAK
-case 137:
-YY_RULE_SETUP
-#line 531 "scan.l"
-{
- format_synerr(
- _( "bad character class expression: %s" ),
- yytext );
- BEGIN(CCL); return CCE_ALNUM;
- }
- YY_BREAK
-
-
-case 138:
-YY_RULE_SETUP
-#line 540 "scan.l"
-{
- yylval = myctoi( yytext );
- return NUMBER;
- }
- YY_BREAK
-case 139:
-YY_RULE_SETUP
-#line 545 "scan.l"
-return ',';
- YY_BREAK
-case 140:
-YY_RULE_SETUP
-#line 546 "scan.l"
-BEGIN(SECT2); return '}';
- YY_BREAK
-case 141:
-YY_RULE_SETUP
-#line 548 "scan.l"
-{
- synerr( _( "bad character inside {}'s" ) );
- BEGIN(SECT2);
- return '}';
- }
- YY_BREAK
-case 142:
-YY_RULE_SETUP
-#line 554 "scan.l"
-{
- synerr( _( "missing }" ) );
- BEGIN(SECT2);
- ++linenum;
- return '}';
- }
- YY_BREAK
-
-
-case 143:
-YY_RULE_SETUP
-#line 564 "scan.l"
-bracelevel = 0;
- YY_BREAK
-case 144:
-YY_RULE_SETUP
-#line 566 "scan.l"
-ACTION_ECHO; yy_push_state( COMMENT );
- YY_BREAK
-
-case 145:
-YY_RULE_SETUP
-#line 569 "scan.l"
-{
- ACTION_ECHO;
- CHECK_REJECT(yytext);
- }
- YY_BREAK
-case 146:
-YY_RULE_SETUP
-#line 573 "scan.l"
-{
- ACTION_ECHO;
- CHECK_YYMORE(yytext);
- }
- YY_BREAK
-
-case 147:
-YY_RULE_SETUP
-#line 579 "scan.l"
-ACTION_ECHO;
- YY_BREAK
-case 148:
-YY_RULE_SETUP
-#line 580 "scan.l"
-{
- ++linenum;
- ACTION_ECHO;
- if ( bracelevel == 0 ||
- (doing_codeblock && indented_code) )
- {
- if ( doing_rule_action )
- add_action( "\tYY_BREAK\n" );
-
- doing_rule_action = doing_codeblock = false;
- BEGIN(SECT2);
- }
- }
- YY_BREAK
-
-/* Reject and YYmore() are checked for above, in PERCENT_BRACE_ACTION */
-
-case 149:
-YY_RULE_SETUP
-#line 598 "scan.l"
-ACTION_ECHO; ++bracelevel;
- YY_BREAK
-case 150:
-YY_RULE_SETUP
-#line 599 "scan.l"
-ACTION_ECHO; --bracelevel;
- YY_BREAK
-case 151:
-YY_RULE_SETUP
-#line 600 "scan.l"
-ACTION_ECHO;
- YY_BREAK
-case 152:
-YY_RULE_SETUP
-#line 601 "scan.l"
-ACTION_ECHO;
- YY_BREAK
-case 153:
-YY_RULE_SETUP
-#line 602 "scan.l"
-ACTION_ECHO; /* character constant */
- YY_BREAK
-case 154:
-YY_RULE_SETUP
-#line 603 "scan.l"
-ACTION_ECHO; BEGIN(ACTION_STRING);
- YY_BREAK
-case 155:
-YY_RULE_SETUP
-#line 604 "scan.l"
-{
- ++linenum;
- ACTION_ECHO;
- if ( bracelevel == 0 )
- {
- if ( doing_rule_action )
- add_action( "\tYY_BREAK\n" );
-
- doing_rule_action = false;
- BEGIN(SECT2);
- }
- }
- YY_BREAK
-case 156:
-YY_RULE_SETUP
-#line 616 "scan.l"
-ACTION_ECHO;
- YY_BREAK
-
-
-case 157:
-YY_RULE_SETUP
-#line 620 "scan.l"
-ACTION_ECHO;
- YY_BREAK
-case 158:
-YY_RULE_SETUP
-#line 621 "scan.l"
-ACTION_ECHO;
- YY_BREAK
-case 159:
-YY_RULE_SETUP
-#line 622 "scan.l"
-++linenum; ACTION_ECHO;
- YY_BREAK
-case 160:
-YY_RULE_SETUP
-#line 623 "scan.l"
-ACTION_ECHO; BEGIN(ACTION);
- YY_BREAK
-case 161:
-YY_RULE_SETUP
-#line 624 "scan.l"
-ACTION_ECHO;
- YY_BREAK
-
-case YY_STATE_EOF(COMMENT):
-case YY_STATE_EOF(ACTION):
-case YY_STATE_EOF(ACTION_STRING):
-#line 627 "scan.l"
-{
- synerr( _( "EOF encountered inside an action" ) );
- yyterminate();
- }
- YY_BREAK
-case 162:
-YY_RULE_SETUP
-#line 633 "scan.l"
-{
- yylval = myesc( (Char *) yytext );
-
- if ( YY_START == FIRSTCCL )
- BEGIN(CCL);
-
- return CHAR;
- }
- YY_BREAK
-
-case 163:
-YY_RULE_SETUP
-#line 644 "scan.l"
-ECHO;
- YY_BREAK
-case YY_STATE_EOF(SECT3):
-#line 645 "scan.l"
-sectnum = 0; yyterminate();
- YY_BREAK
-
-case 164:
-YY_RULE_SETUP
-#line 648 "scan.l"
-format_synerr( _( "bad character: %s" ), yytext );
- YY_BREAK
-case 165:
-YY_RULE_SETUP
-#line 650 "scan.l"
-YY_FATAL_ERROR( "flex scanner jammed" );
- YY_BREAK
-#line 2736 "scan.c"
-case YY_STATE_EOF(INITIAL):
-case YY_STATE_EOF(SECT2):
-case YY_STATE_EOF(CODEBLOCK):
-case YY_STATE_EOF(PICKUPDEF):
-case YY_STATE_EOF(SC):
-case YY_STATE_EOF(CARETISBOL):
-case YY_STATE_EOF(NUM):
-case YY_STATE_EOF(QUOTE):
-case YY_STATE_EOF(FIRSTCCL):
-case YY_STATE_EOF(CCL):
-case YY_STATE_EOF(RECOVER):
-case YY_STATE_EOF(PERCENT_BRACE_ACTION):
-case YY_STATE_EOF(OPTION):
-case YY_STATE_EOF(LINEDIR):
- yyterminate();
-
- case YY_END_OF_BUFFER:
- {
- /* Amount of text matched not including the EOB char. */
- int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
-
- /* Undo the effects of YY_DO_BEFORE_ACTION. */
- *yy_cp = yy_hold_char;
- YY_RESTORE_YY_MORE_OFFSET
-
- if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
- {
- /* We're scanning a new file or input source. It's
- * possible that this happened because the user
- * just pointed yyin at a new source and called
- * yylex(). If so, then we have to assure
- * consistency between yy_current_buffer and our
- * globals. Here is the right place to do so, because
- * this is the first action (other than possibly a
- * back-up) that will match for the new input source.
- */
- yy_n_chars = yy_current_buffer->yy_n_chars;
- yy_current_buffer->yy_input_file = yyin;
- yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
- }
-
- /* Note that here we test for yy_c_buf_p "<=" to the position
- * of the first EOB in the buffer, since yy_c_buf_p will
- * already have been incremented past the NUL character
- * (since all states make transitions on EOB to the
- * end-of-buffer state). Contrast this with the test
- * in input().
- */
- if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
- { /* This was really a NUL. */
- yy_state_type yy_next_state;
-
- yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
-
- yy_current_state = yy_get_previous_state();
-
- /* Okay, we're now positioned to make the NUL
- * transition. We couldn't have
- * yy_get_previous_state() go ahead and do it
- * for us because it doesn't know how to deal
- * with the possibility of jamming (and we don't
- * want to build jamming into it because then it
- * will run more slowly).
- */
-
- yy_next_state = yy_try_NUL_trans( yy_current_state );
-
- yy_bp = yytext_ptr + YY_MORE_ADJ;
-
- if ( yy_next_state )
- {
- /* Consume the NUL. */
- yy_cp = ++yy_c_buf_p;
- yy_current_state = yy_next_state;
- goto yy_match;
- }
-
- else
- {
- yy_cp = yy_c_buf_p;
- goto yy_find_action;
- }
- }
-
- else switch ( yy_get_next_buffer() )
- {
- case EOB_ACT_END_OF_FILE:
- {
- yy_did_buffer_switch_on_eof = 0;
-
- if ( yywrap() )
- {
- /* Note: because we've taken care in
- * yy_get_next_buffer() to have set up
- * yytext, we can now set up
- * yy_c_buf_p so that if some total
- * hoser (like flex itself) wants to
- * call the scanner after we return the
- * YY_NULL, it'll still work - another
- * YY_NULL will get returned.
- */
- yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
-
- yy_act = YY_STATE_EOF(YY_START);
- goto do_action;
- }
-
- else
- {
- if ( ! yy_did_buffer_switch_on_eof )
- YY_NEW_FILE;
- }
- break;
- }
-
- case EOB_ACT_CONTINUE_SCAN:
- yy_c_buf_p =
- yytext_ptr + yy_amount_of_matched_text;
-
- yy_current_state = yy_get_previous_state();
-
- yy_cp = yy_c_buf_p;
- yy_bp = yytext_ptr + YY_MORE_ADJ;
- goto yy_match;
-
- case EOB_ACT_LAST_MATCH:
- yy_c_buf_p =
- &yy_current_buffer->yy_ch_buf[yy_n_chars];
-
- yy_current_state = yy_get_previous_state();
-
- yy_cp = yy_c_buf_p;
- yy_bp = yytext_ptr + YY_MORE_ADJ;
- goto yy_find_action;
- }
- break;
- }
-
- default:
- YY_FATAL_ERROR(
- "fatal flex scanner internal error--no action found" );
- } /* end of action switch */
- } /* end of scanning one token */
- } /* end of yylex */
-
-
-/* yy_get_next_buffer - try to read in a new buffer
- *
- * Returns a code representing an action:
- * EOB_ACT_LAST_MATCH -
- * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
- * EOB_ACT_END_OF_FILE - end of file
- */
-
-static int yy_get_next_buffer()
- {
- char *dest = yy_current_buffer->yy_ch_buf;
- char *source = yytext_ptr;
- int number_to_move, i;
- int ret_val;
-
- if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
- YY_FATAL_ERROR(
- "fatal flex scanner internal error--end of buffer missed" );
-
- if ( yy_current_buffer->yy_fill_buffer == 0 )
- { /* Don't try to fill the buffer, so this is an EOF. */
- if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
- {
- /* We matched a single character, the EOB, so
- * treat this as a final EOF.
- */
- return EOB_ACT_END_OF_FILE;
- }
-
- else
- {
- /* We matched some text prior to the EOB, first
- * process it.
- */
- return EOB_ACT_LAST_MATCH;
- }
- }
-
- /* Try to read more data. */
-
- /* First move last chars to start of buffer. */
- number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
-
- for ( i = 0; i < number_to_move; ++i )
- *(dest++) = *(source++);
-
- if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
- /* don't do the read, it's not guaranteed to return an EOF,
- * just force an EOF
- */
- yy_current_buffer->yy_n_chars = yy_n_chars = 0;
-
- else
- {
- int num_to_read =
- yy_current_buffer->yy_buf_size - number_to_move - 1;
-
- while ( num_to_read <= 0 )
- { /* Not enough room in the buffer - grow it. */
-#ifdef YY_USES_REJECT
- YY_FATAL_ERROR(
-"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
-#else
-
- /* just a shorter name for the current buffer */
- YY_BUFFER_STATE b = yy_current_buffer;
-
- int yy_c_buf_p_offset =
- (int) (yy_c_buf_p - b->yy_ch_buf);
-
- if ( b->yy_is_our_buffer )
- {
- int new_size = b->yy_buf_size * 2;
-
- if ( new_size <= 0 )
- b->yy_buf_size += b->yy_buf_size / 8;
- else
- b->yy_buf_size *= 2;
-
- b->yy_ch_buf = (char *)
- /* Include room in for 2 EOB chars. */
- yy_flex_realloc( (void *) b->yy_ch_buf,
- b->yy_buf_size + 2 );
- }
- else
- /* Can't grow it, we don't own it. */
- b->yy_ch_buf = 0;
-
- if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR(
- "fatal error - scanner input buffer overflow" );
-
- yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
-
- num_to_read = yy_current_buffer->yy_buf_size -
- number_to_move - 1;
-#endif
- }
-
- if ( num_to_read > YY_READ_BUF_SIZE )
- num_to_read = YY_READ_BUF_SIZE;
-
- /* Read in more data. */
- YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
- yy_n_chars, num_to_read );
-
- yy_current_buffer->yy_n_chars = yy_n_chars;
- }
-
- if ( yy_n_chars == 0 )
- {
- if ( number_to_move == YY_MORE_ADJ )
- {
- ret_val = EOB_ACT_END_OF_FILE;
- yyrestart( yyin );
- }
-
- else
- {
- ret_val = EOB_ACT_LAST_MATCH;
- yy_current_buffer->yy_buffer_status =
- YY_BUFFER_EOF_PENDING;
- }
- }
-
- else
- ret_val = EOB_ACT_CONTINUE_SCAN;
-
- yy_n_chars += number_to_move;
- yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
- yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
-
- yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
-
- return ret_val;
- }
-
-
-/* yy_get_previous_state - get the state just before the EOB char was reached */
-
-static yy_state_type yy_get_previous_state()
- {
- yy_state_type yy_current_state;
- char *yy_cp;
-
- yy_current_state = yy_start;
- yy_current_state += YY_AT_BOL();
-
- for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
- {
- YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
- if ( yy_accept[yy_current_state] )
- {
- yy_last_accepting_state = yy_current_state;
- yy_last_accepting_cpos = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 769 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- }
-
- return yy_current_state;
- }
-
-
-/* yy_try_NUL_trans - try to make a transition on the NUL character
- *
- * synopsis
- * next_state = yy_try_NUL_trans( current_state );
- */
-
-#ifdef YY_USE_PROTOS
-static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
-#else
-static yy_state_type yy_try_NUL_trans( yy_current_state )
-yy_state_type yy_current_state;
-#endif
- {
- int yy_is_jam;
- char *yy_cp = yy_c_buf_p;
-
- YY_CHAR yy_c = 1;
- if ( yy_accept[yy_current_state] )
- {
- yy_last_accepting_state = yy_current_state;
- yy_last_accepting_cpos = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 769 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- yy_is_jam = (yy_current_state == 768);
-
- return yy_is_jam ? 0 : yy_current_state;
- }
-
-
-#ifndef YY_NO_UNPUT
-#ifdef YY_USE_PROTOS
-static void yyunput( int c, char *yy_bp )
-#else
-static void yyunput( c, yy_bp )
-int c;
-char *yy_bp;
-#endif
- {
- char *yy_cp = yy_c_buf_p;
-
- /* undo effects of setting up yytext */
- *yy_cp = yy_hold_char;
-
- if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
- { /* need to shift things up to make room */
- /* +2 for EOB chars. */
- int number_to_move = yy_n_chars + 2;
- char *dest = &yy_current_buffer->yy_ch_buf[
- yy_current_buffer->yy_buf_size + 2];
- char *source =
- &yy_current_buffer->yy_ch_buf[number_to_move];
-
- while ( source > yy_current_buffer->yy_ch_buf )
- *--dest = *--source;
-
- yy_cp += (int) (dest - source);
- yy_bp += (int) (dest - source);
- yy_current_buffer->yy_n_chars =
- yy_n_chars = yy_current_buffer->yy_buf_size;
-
- if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
- YY_FATAL_ERROR( "flex scanner push-back overflow" );
- }
-
- *--yy_cp = (char) c;
-
-
- yytext_ptr = yy_bp;
- yy_hold_char = *yy_cp;
- yy_c_buf_p = yy_cp;
- }
-#endif /* ifndef YY_NO_UNPUT */
-
-
-#ifdef __cplusplus
-static int yyinput()
-#else
-static int input()
-#endif
- {
- int c;
-
- *yy_c_buf_p = yy_hold_char;
-
- if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
- {
- /* yy_c_buf_p now points to the character we want to return.
- * If this occurs *before* the EOB characters, then it's a
- * valid NUL; if not, then we've hit the end of the buffer.
- */
- if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
- /* This was really a NUL. */
- *yy_c_buf_p = '\0';
-
- else
- { /* need more input */
- int offset = yy_c_buf_p - yytext_ptr;
- ++yy_c_buf_p;
-
- switch ( yy_get_next_buffer() )
- {
- case EOB_ACT_LAST_MATCH:
- /* This happens because yy_g_n_b()
- * sees that we've accumulated a
- * token and flags that we need to
- * try matching the token before
- * proceeding. But for input(),
- * there's no matching to consider.
- * So convert the EOB_ACT_LAST_MATCH
- * to EOB_ACT_END_OF_FILE.
- */
-
- /* Reset buffer status. */
- yyrestart( yyin );
-
- /* FALLTHROUGH */
-
- case EOB_ACT_END_OF_FILE:
- {
- if ( yywrap() )
- return EOF;
-
- if ( ! yy_did_buffer_switch_on_eof )
- YY_NEW_FILE;
-#ifdef __cplusplus
- return yyinput();
-#else
- return input();
-#endif
- }
-
- case EOB_ACT_CONTINUE_SCAN:
- yy_c_buf_p = yytext_ptr + offset;
- break;
- }
- }
- }
-
- c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */
- *yy_c_buf_p = '\0'; /* preserve yytext */
- yy_hold_char = *++yy_c_buf_p;
-
- yy_current_buffer->yy_at_bol = (c == '\n');
-
- return c;
- }
-
-
-#ifdef YY_USE_PROTOS
-void yyrestart( FILE *input_file )
-#else
-void yyrestart( input_file )
-FILE *input_file;
-#endif
- {
- if ( ! yy_current_buffer )
- yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
-
- yy_init_buffer( yy_current_buffer, input_file );
- yy_load_buffer_state();
- }
-
-
-#ifdef YY_USE_PROTOS
-void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
-#else
-void yy_switch_to_buffer( new_buffer )
-YY_BUFFER_STATE new_buffer;
-#endif
- {
- if ( yy_current_buffer == new_buffer )
- return;
-
- if ( yy_current_buffer )
- {
- /* Flush out information for old buffer. */
- *yy_c_buf_p = yy_hold_char;
- yy_current_buffer->yy_buf_pos = yy_c_buf_p;
- yy_current_buffer->yy_n_chars = yy_n_chars;
- }
-
- yy_current_buffer = new_buffer;
- yy_load_buffer_state();
-
- /* We don't actually know whether we did this switch during
- * EOF (yywrap()) processing, but the only time this flag
- * is looked at is after yywrap() is called, so it's safe
- * to go ahead and always set it.
- */
- yy_did_buffer_switch_on_eof = 1;
- }
-
-
-#ifdef YY_USE_PROTOS
-void yy_load_buffer_state( void )
-#else
-void yy_load_buffer_state()
-#endif
- {
- yy_n_chars = yy_current_buffer->yy_n_chars;
- yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
- yyin = yy_current_buffer->yy_input_file;
- yy_hold_char = *yy_c_buf_p;
- }
-
-
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
-#else
-YY_BUFFER_STATE yy_create_buffer( file, size )
-FILE *file;
-int size;
-#endif
- {
- YY_BUFFER_STATE b;
-
- b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
- if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-
- b->yy_buf_size = size;
-
- /* yy_ch_buf has to be 2 characters longer than the size given because
- * we need to put in 2 end-of-buffer characters.
- */
- b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
- if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-
- b->yy_is_our_buffer = 1;
-
- yy_init_buffer( b, file );
-
- return b;
- }
-
-
-#ifdef YY_USE_PROTOS
-void yy_delete_buffer( YY_BUFFER_STATE b )
-#else
-void yy_delete_buffer( b )
-YY_BUFFER_STATE b;
-#endif
- {
- if ( ! b )
- return;
-
- if ( b == yy_current_buffer )
- yy_current_buffer = (YY_BUFFER_STATE) 0;
-
- if ( b->yy_is_our_buffer )
- yy_flex_free( (void *) b->yy_ch_buf );
-
- yy_flex_free( (void *) b );
- }
-
-
-#ifndef YY_ALWAYS_INTERACTIVE
-#ifndef YY_NEVER_INTERACTIVE
-extern int isatty YY_PROTO(( int ));
-#endif
-#endif
-
-#ifdef YY_USE_PROTOS
-void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
-#else
-void yy_init_buffer( b, file )
-YY_BUFFER_STATE b;
-FILE *file;
-#endif
-
-
- {
- yy_flush_buffer( b );
-
- b->yy_input_file = file;
- b->yy_fill_buffer = 1;
-
-#if YY_ALWAYS_INTERACTIVE
- b->yy_is_interactive = 1;
-#else
-#if YY_NEVER_INTERACTIVE
- b->yy_is_interactive = 0;
-#else
- b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-#endif
-#endif
- }
-
-
-#ifdef YY_USE_PROTOS
-void yy_flush_buffer( YY_BUFFER_STATE b )
-#else
-void yy_flush_buffer( b )
-YY_BUFFER_STATE b;
-#endif
-
- {
- if ( ! b )
- return;
-
- b->yy_n_chars = 0;
-
- /* We always need two end-of-buffer characters. The first causes
- * a transition to the end-of-buffer state. The second causes
- * a jam in that state.
- */
- b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
- b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
-
- b->yy_buf_pos = &b->yy_ch_buf[0];
-
- b->yy_at_bol = 1;
- b->yy_buffer_status = YY_BUFFER_NEW;
-
- if ( b == yy_current_buffer )
- yy_load_buffer_state();
- }
-
-
-#ifndef YY_NO_SCAN_BUFFER
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
-#else
-YY_BUFFER_STATE yy_scan_buffer( base, size )
-char *base;
-yy_size_t size;
-#endif
- {
- YY_BUFFER_STATE b;
-
- if ( size < 2 ||
- base[size-2] != YY_END_OF_BUFFER_CHAR ||
- base[size-1] != YY_END_OF_BUFFER_CHAR )
- /* They forgot to leave room for the EOB's. */
- return 0;
-
- b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
- if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
-
- b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
- b->yy_buf_pos = b->yy_ch_buf = base;
- b->yy_is_our_buffer = 0;
- b->yy_input_file = 0;
- b->yy_n_chars = b->yy_buf_size;
- b->yy_is_interactive = 0;
- b->yy_at_bol = 1;
- b->yy_fill_buffer = 0;
- b->yy_buffer_status = YY_BUFFER_NEW;
-
- yy_switch_to_buffer( b );
-
- return b;
- }
-#endif
-
-
-#ifndef YY_NO_SCAN_STRING
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
-#else
-YY_BUFFER_STATE yy_scan_string( yy_str )
-yyconst char *yy_str;
-#endif
- {
- int len;
- for ( len = 0; yy_str[len]; ++len )
- ;
-
- return yy_scan_bytes( yy_str, len );
- }
-#endif
-
-
-#ifndef YY_NO_SCAN_BYTES
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
-#else
-YY_BUFFER_STATE yy_scan_bytes( bytes, len )
-yyconst char *bytes;
-int len;
-#endif
- {
- YY_BUFFER_STATE b;
- char *buf;
- yy_size_t n;
- int i;
-
- /* Get memory for full buffer, including space for trailing EOB's. */
- n = len + 2;
- buf = (char *) yy_flex_alloc( n );
- if ( ! buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
-
- for ( i = 0; i < len; ++i )
- buf[i] = bytes[i];
-
- buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
-
- b = yy_scan_buffer( buf, n );
- if ( ! b )
- YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
-
- /* It's okay to grow etc. this buffer, and we should throw it
- * away when we're done.
- */
- b->yy_is_our_buffer = 1;
-
- return b;
- }
-#endif
-
-
-#ifndef YY_NO_PUSH_STATE
-#ifdef YY_USE_PROTOS
-static void yy_push_state( int new_state )
-#else
-static void yy_push_state( new_state )
-int new_state;
-#endif
- {
- if ( yy_start_stack_ptr >= yy_start_stack_depth )
- {
- yy_size_t new_size;
-
- yy_start_stack_depth += YY_START_STACK_INCR;
- new_size = yy_start_stack_depth * sizeof( int );
-
- if ( ! yy_start_stack )
- yy_start_stack = (int *) yy_flex_alloc( new_size );
-
- else
- yy_start_stack = (int *) yy_flex_realloc(
- (void *) yy_start_stack, new_size );
-
- if ( ! yy_start_stack )
- YY_FATAL_ERROR(
- "out of memory expanding start-condition stack" );
- }
-
- yy_start_stack[yy_start_stack_ptr++] = YY_START;
-
- BEGIN(new_state);
- }
-#endif
-
-
-#ifndef YY_NO_POP_STATE
-static void yy_pop_state()
- {
- if ( --yy_start_stack_ptr < 0 )
- YY_FATAL_ERROR( "start-condition stack underflow" );
-
- BEGIN(yy_start_stack[yy_start_stack_ptr]);
- }
-#endif
-
-
-#ifndef YY_NO_TOP_STATE
-static int yy_top_state()
- {
- return yy_start_stack[yy_start_stack_ptr - 1];
- }
-#endif
-
-#ifndef YY_EXIT_FAILURE
-#define YY_EXIT_FAILURE 2
-#endif
-
-#ifdef YY_USE_PROTOS
-static void yy_fatal_error( yyconst char msg[] )
-#else
-static void yy_fatal_error( msg )
-char msg[];
-#endif
- {
- (void) fprintf( stderr, "%s\n", msg );
- exit( YY_EXIT_FAILURE );
- }
-
-
-
-/* Redefine yyless() so it works in section 3 code. */
-
-#undef yyless
-#define yyless(n) \
- do \
- { \
- /* Undo effects of setting up yytext. */ \
- yytext[yyleng] = yy_hold_char; \
- yy_c_buf_p = yytext + n; \
- yy_hold_char = *yy_c_buf_p; \
- *yy_c_buf_p = '\0'; \
- yyleng = n; \
- } \
- while ( 0 )
-
-
-/* Internal utility routines. */
-
-#ifndef yytext_ptr
-#ifdef YY_USE_PROTOS
-static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
-#else
-static void yy_flex_strncpy( s1, s2, n )
-char *s1;
-yyconst char *s2;
-int n;
-#endif
- {
- int i;
- for ( i = 0; i < n; ++i )
- s1[i] = s2[i];
- }
-#endif
-
-#ifdef YY_NEED_STRLEN
-#ifdef YY_USE_PROTOS
-static int yy_flex_strlen( yyconst char *s )
-#else
-static int yy_flex_strlen( s )
-yyconst char *s;
-#endif
- {
- int n;
- for ( n = 0; s[n]; ++n )
- ;
-
- return n;
- }
-#endif
-
-
-#ifdef YY_USE_PROTOS
-static void *yy_flex_alloc( yy_size_t size )
-#else
-static void *yy_flex_alloc( size )
-yy_size_t size;
-#endif
- {
- return (void *) malloc( size );
- }
-
-#ifdef YY_USE_PROTOS
-static void *yy_flex_realloc( void *ptr, yy_size_t size )
-#else
-static void *yy_flex_realloc( ptr, size )
-void *ptr;
-yy_size_t size;
-#endif
- {
- /* The cast to (char *) in the following accommodates both
- * implementations that use char* generic pointers, and those
- * that use void* generic pointers. It works with the latter
- * because both ANSI C and C++ allow castless assignment from
- * any pointer type to void*, and deal with argument conversions
- * as though doing an assignment.
- */
- return (void *) realloc( (char *) ptr, size );
- }
-
-#ifdef YY_USE_PROTOS
-static void yy_flex_free( void *ptr )
-#else
-static void yy_flex_free( ptr )
-void *ptr;
-#endif
- {
- free( ptr );
- }
-
-#if YY_MAIN
-int main()
- {
- yylex();
- return 0;
- }
-#endif
-#line 650 "scan.l"
-
-
-
-int yywrap()
- {
- if ( --num_input_files > 0 )
- {
- set_input_file( *++input_files );
- return 0;
- }
-
- else
- return 1;
- }
-
-
-/* set_input_file - open the given file (if NULL, stdin) for scanning */
-
-void set_input_file( file )
-char *file;
- {
- if ( file && strcmp( file, "-" ) )
- {
- infilename = copy_string( file );
- yyin = fopen( infilename, "r" );
-
- if ( yyin == NULL )
- lerrsf( _( "can't open %s" ), file );
- }
-
- else
- {
- yyin = stdin;
- infilename = copy_string( "<stdin>" );
- }
-
- linenum = 1;
- }
-
-
-/* Wrapper routines for accessing the scanner's malloc routines. */
-
-void *flex_alloc( size )
-size_t size;
- {
- return (void *) malloc( size );
- }
-
-void *flex_realloc( ptr, size )
-void *ptr;
-size_t size;
- {
- return (void *) realloc( ptr, size );
- }
-
-void flex_free( ptr )
-void *ptr;
- {
- if ( ptr )
- free( ptr );
- }
diff --git a/usr.bin/lex/lex.1 b/usr.bin/lex/lex.1
deleted file mode 100644
index 38eecf1..0000000
--- a/usr.bin/lex/lex.1
+++ /dev/null
@@ -1,4068 +0,0 @@
-.\" $FreeBSD$
-.\"
-.TH FLEX 1 "April 1995" "Version 2.5"
-.SH NAME
-flex \- fast lexical analyzer generator
-.SH SYNOPSIS
-.B flex
-.B [\-bcdfhilnpstvwBFILTV78+? \-C[aefFmr] \-ooutput \-Pprefix \-Sskeleton]
-.B [\-\-help \-\-version]
-.I [filename ...]
-.SH OVERVIEW
-This manual describes
-.I flex,
-a tool for generating programs that perform pattern-matching on text. The
-manual includes both tutorial and reference sections:
-.nf
-
- Description
- a brief overview of the tool
-
- Some Simple Examples
-
- Format Of The Input File
-
- Patterns
- the extended regular expressions used by flex
-
- How The Input Is Matched
- the rules for determining what has been matched
-
- Actions
- how to specify what to do when a pattern is matched
-
- The Generated Scanner
- details regarding the scanner that flex produces;
- how to control the input source
-
- Start Conditions
- introducing context into your scanners, and
- managing "mini-scanners"
-
- Multiple Input Buffers
- how to manipulate multiple input sources; how to
- scan from strings instead of files
-
- End-of-file Rules
- special rules for matching the end of the input
-
- Miscellaneous Macros
- a summary of macros available to the actions
-
- Values Available To The User
- a summary of values available to the actions
-
- Interfacing With Yacc
- connecting flex scanners together with yacc parsers
-
- Options
- flex command-line options, and the "%option"
- directive
-
- Performance Considerations
- how to make your scanner go as fast as possible
-
- Generating C++ Scanners
- the (experimental) facility for generating C++
- scanner classes
-
- Incompatibilities With Lex And POSIX
- how flex differs from AT&T lex and the POSIX lex
- standard
-
- Diagnostics
- those error messages produced by flex (or scanners
- it generates) whose meanings might not be apparent
-
- Files
- files used by flex
-
- Deficiencies / Bugs
- known problems with flex
-
- See Also
- other documentation, related tools
-
- Author
- includes contact information
-
-.fi
-.SH DESCRIPTION
-.I flex
-is a tool for generating
-.I scanners:
-programs which recognize lexical patterns in text.
-.I flex
-reads
-the given input files, or its standard input if no file names are given,
-for a description of a scanner to generate. The description is in
-the form of pairs
-of regular expressions and C code, called
-.I rules. flex
-generates as output a C source file,
-.B lex.yy.c,
-which defines a routine
-.B yylex().
-This file is compiled and linked with the
-.B \-ll
-library to produce an executable. When the executable is run,
-it analyzes its input for occurrences
-of the regular expressions. Whenever it finds one, it executes
-the corresponding C code.
-.SH SOME SIMPLE EXAMPLES
-First some simple examples to get the flavor of how one uses
-.I flex.
-The following
-.I flex
-input specifies a scanner which whenever it encounters the string
-"username" will replace it with the user's login name:
-.nf
-
- %%
- username printf( "%s", getlogin() );
-
-.fi
-By default, any text not matched by a
-.I flex
-scanner
-is copied to the output, so the net effect of this scanner is
-to copy its input file to its output with each occurrence
-of "username" expanded.
-In this input, there is just one rule. "username" is the
-.I pattern
-and the "printf" is the
-.I action.
-The "%%" marks the beginning of the rules.
-.PP
-Here's another simple example:
-.nf
-
- %{
- int num_lines = 0, num_chars = 0;
- %}
-
- %%
- \\n ++num_lines; ++num_chars;
- . ++num_chars;
-
- %%
- main()
- {
- yylex();
- printf( "# of lines = %d, # of chars = %d\\n",
- num_lines, num_chars );
- }
-
-.fi
-This scanner counts the number of characters and the number
-of lines in its input (it produces no output other than the
-final report on the counts). The first line
-declares two globals, "num_lines" and "num_chars", which are accessible
-both inside
-.B yylex()
-and in the
-.B main()
-routine declared after the second "%%". There are two rules, one
-which matches a newline ("\\n") and increments both the line count and
-the character count, and one which matches any character other than
-a newline (indicated by the "." regular expression).
-.PP
-A somewhat more complicated example:
-.nf
-
- /* scanner for a toy Pascal-like language */
-
- %{
- /* need this for the call to atof() below */
- #include <math.h>
- %}
-
- DIGIT [0-9]
- ID [a-z][a-z0-9]*
-
- %%
-
- {DIGIT}+ {
- printf( "An integer: %s (%d)\\n", yytext,
- atoi( yytext ) );
- }
-
- {DIGIT}+"."{DIGIT}* {
- printf( "A float: %s (%g)\\n", yytext,
- atof( yytext ) );
- }
-
- if|then|begin|end|procedure|function {
- printf( "A keyword: %s\\n", yytext );
- }
-
- {ID} printf( "An identifier: %s\\n", yytext );
-
- "+"|"-"|"*"|"/" printf( "An operator: %s\\n", yytext );
-
- "{"[^}\\n]*"}" /* eat up one-line comments */
-
- [ \\t\\n]+ /* eat up whitespace */
-
- . printf( "Unrecognized character: %s\\n", yytext );
-
- %%
-
- main( argc, argv )
- int argc;
- char **argv;
- {
- ++argv, --argc; /* skip over program name */
- if ( argc > 0 )
- yyin = fopen( argv[0], "r" );
- else
- yyin = stdin;
-
- yylex();
- }
-
-.fi
-This is the beginnings of a simple scanner for a language like
-Pascal. It identifies different types of
-.I tokens
-and reports on what it has seen.
-.PP
-The details of this example will be explained in the following
-sections.
-.SH FORMAT OF THE INPUT FILE
-The
-.I flex
-input file consists of three sections, separated by a line with just
-.B %%
-in it:
-.nf
-
- definitions
- %%
- rules
- %%
- user code
-
-.fi
-The
-.I definitions
-section contains declarations of simple
-.I name
-definitions to simplify the scanner specification, and declarations of
-.I start conditions,
-which are explained in a later section.
-.PP
-Name definitions have the form:
-.nf
-
- name definition
-
-.fi
-The "name" is a word beginning with a letter or an underscore ('_')
-followed by zero or more letters, digits, '_', or '-' (dash).
-The definition is taken to begin at the first non-white-space character
-following the name and continuing to the end of the line.
-The definition can subsequently be referred to using "{name}", which
-will expand to "(definition)". For example,
-.nf
-
- DIGIT [0-9]
- ID [a-z][a-z0-9]*
-
-.fi
-defines "DIGIT" to be a regular expression which matches a
-single digit, and
-"ID" to be a regular expression which matches a letter
-followed by zero-or-more letters-or-digits.
-A subsequent reference to
-.nf
-
- {DIGIT}+"."{DIGIT}*
-
-.fi
-is identical to
-.nf
-
- ([0-9])+"."([0-9])*
-
-.fi
-and matches one-or-more digits followed by a '.' followed
-by zero-or-more digits.
-.PP
-The
-.I rules
-section of the
-.I flex
-input contains a series of rules of the form:
-.nf
-
- pattern action
-
-.fi
-where the pattern must be unindented and the action must begin
-on the same line.
-.PP
-See below for a further description of patterns and actions.
-.PP
-Finally, the user code section is simply copied to
-.B lex.yy.c
-verbatim.
-It is used for companion routines which call or are called
-by the scanner. The presence of this section is optional;
-if it is missing, the second
-.B %%
-in the input file may be skipped, too.
-.PP
-In the definitions and rules sections, any
-.I indented
-text or text enclosed in
-.B %{
-and
-.B %}
-is copied verbatim to the output (with the %{}'s removed).
-The %{}'s must appear unindented on lines by themselves.
-.PP
-In the rules section,
-any indented or %{} text appearing before the
-first rule may be used to declare variables
-which are local to the scanning routine and (after the declarations)
-code which is to be executed whenever the scanning routine is entered.
-Other indented or %{} text in the rule section is still copied to the output,
-but its meaning is not well-defined and it may well cause compile-time
-errors (this feature is present for
-.I POSIX
-compliance; see below for other such features).
-.PP
-In the definitions section (but not in the rules section),
-an unindented comment (i.e., a line
-beginning with "/*") is also copied verbatim to the output up
-to the next "*/".
-.SH PATTERNS
-The patterns in the input are written using an extended set of regular
-expressions. These are:
-.nf
-
- x match the character 'x'
- . any character (byte) except newline
- [xyz] a "character class"; in this case, the pattern
- matches either an 'x', a 'y', or a 'z'
- [abj-oZ] a "character class" with a range in it; matches
- an 'a', a 'b', any letter from 'j' through 'o',
- or a 'Z'
- [^A-Z] a "negated character class", i.e., any character
- but those in the class. In this case, any
- character EXCEPT an uppercase letter.
- [^A-Z\\n] any character EXCEPT an uppercase letter or
- a newline
- r* zero or more r's, where r is any regular expression
- r+ one or more r's
- r? zero or one r's (that is, "an optional r")
- r{2,5} anywhere from two to five r's
- r{2,} two or more r's
- r{4} exactly 4 r's
- {name} the expansion of the "name" definition
- (see above)
- "[xyz]\\"foo"
- the literal string: [xyz]"foo
- \\X if X is an 'a', 'b', 'f', 'n', 'r', 't', or 'v',
- then the ANSI-C interpretation of \\x.
- Otherwise, a literal 'X' (used to escape
- operators such as '*')
- \\0 a NUL character (ASCII code 0)
- \\123 the character with octal value 123
- \\x2a the character with hexadecimal value 2a
- (r) match an r; parentheses are used to override
- precedence (see below)
-
-
- rs the regular expression r followed by the
- regular expression s; called "concatenation"
-
-
- r|s either an r or an s
-
-
- r/s an r but only if it is followed by an s. The
- text matched by s is included when determining
- whether this rule is the "longest match",
- but is then returned to the input before
- the action is executed. So the action only
- sees the text matched by r. This type
- of pattern is called trailing context".
- (There are some combinations of r/s that flex
- cannot match correctly; see notes in the
- Deficiencies / Bugs section below regarding
- "dangerous trailing context".)
- ^r an r, but only at the beginning of a line (i.e.,
- when just starting to scan, or right after a
- newline has been scanned).
- r$ an r, but only at the end of a line (i.e., just
- before a newline). Equivalent to "r/\\n".
-
- Note that flex's notion of "newline" is exactly
- whatever the C compiler used to compile flex
- interprets '\\n' as; in particular, on some DOS
- systems you must either filter out \\r's in the
- input yourself, or explicitly use r/\\r\\n for "r$".
-
-
- <s>r an r, but only in start condition s (see
- below for discussion of start conditions)
- <s1,s2,s3>r
- same, but in any of start conditions s1,
- s2, or s3
- <*>r an r in any start condition, even an exclusive one.
-
-
- <<EOF>> an end-of-file
- <s1,s2><<EOF>>
- an end-of-file when in start condition s1 or s2
-
-.fi
-Note that inside of a character class, all regular expression operators
-lose their special meaning except escape ('\\') and the character class
-operators, '-', ']', and, at the beginning of the class, '^'.
-.PP
-The regular expressions listed above are grouped according to
-precedence, from highest precedence at the top to lowest at the bottom.
-Those grouped together have equal precedence. For example,
-.nf
-
- foo|bar*
-
-.fi
-is the same as
-.nf
-
- (foo)|(ba(r*))
-
-.fi
-since the '*' operator has higher precedence than concatenation,
-and concatenation higher than alternation ('|'). This pattern
-therefore matches
-.I either
-the string "foo"
-.I or
-the string "ba" followed by zero-or-more r's.
-To match "foo" or zero-or-more "bar"'s, use:
-.nf
-
- foo|(bar)*
-
-.fi
-and to match zero-or-more "foo"'s-or-"bar"'s:
-.nf
-
- (foo|bar)*
-
-.fi
-.PP
-In addition to characters and ranges of characters, character classes
-can also contain character class
-.I expressions.
-These are expressions enclosed inside
-.B [:
-and
-.B :]
-delimiters (which themselves must appear between the '[' and ']' of the
-character class; other elements may occur inside the character class, too).
-The valid expressions are:
-.nf
-
- [:alnum:] [:alpha:] [:blank:]
- [:cntrl:] [:digit:] [:graph:]
- [:lower:] [:print:] [:punct:]
- [:space:] [:upper:] [:xdigit:]
-
-.fi
-These expressions all designate a set of characters equivalent to
-the corresponding standard C
-.B isXXX
-function. For example,
-.B [:alnum:]
-designates those characters for which
-.B isalnum()
-returns true - i.e., any alphabetic or numeric.
-Some systems don't provide
-.B isblank(),
-so flex defines
-.B [:blank:]
-as a blank or a tab.
-.PP
-For example, the following character classes are all equivalent:
-.nf
-
- [[:alnum:]]
- [[:alpha:][:digit:]]
- [[:alpha:]0-9]
- [a-zA-Z0-9]
-
-.fi
-If your scanner is case-insensitive (the
-.B \-i
-flag), then
-.B [:upper:]
-and
-.B [:lower:]
-are equivalent to
-.B [:alpha:].
-.PP
-Some notes on patterns:
-.IP -
-A negated character class such as the example "[^A-Z]"
-above
-.I will match a newline
-unless "\\n" (or an equivalent escape sequence) is one of the
-characters explicitly present in the negated character class
-(e.g., "[^A-Z\\n]"). This is unlike how many other regular
-expression tools treat negated character classes, but unfortunately
-the inconsistency is historically entrenched.
-Matching newlines means that a pattern like [^"]* can match the entire
-input unless there's another quote in the input.
-.IP -
-A rule can have at most one instance of trailing context (the '/' operator
-or the '$' operator). The start condition, '^', and "<<EOF>>" patterns
-can only occur at the beginning of a pattern, and, as well as with '/' and '$',
-cannot be grouped inside parentheses. A '^' which does not occur at
-the beginning of a rule or a '$' which does not occur at the end of
-a rule loses its special properties and is treated as a normal character.
-.IP
-The following are illegal:
-.nf
-
- foo/bar$
- <sc1>foo<sc2>bar
-
-.fi
-Note that the first of these, can be written "foo/bar\\n".
-.IP
-The following will result in '$' or '^' being treated as a normal character:
-.nf
-
- foo|(bar$)
- foo|^bar
-
-.fi
-If what's wanted is a "foo" or a bar-followed-by-a-newline, the following
-could be used (the special '|' action is explained below):
-.nf
-
- foo |
- bar$ /* action goes here */
-
-.fi
-A similar trick will work for matching a foo or a
-bar-at-the-beginning-of-a-line.
-.SH HOW THE INPUT IS MATCHED
-When the generated scanner is run, it analyzes its input looking
-for strings which match any of its patterns. If it finds more than
-one match, it takes the one matching the most text (for trailing
-context rules, this includes the length of the trailing part, even
-though it will then be returned to the input). If it finds two
-or more matches of the same length, the
-rule listed first in the
-.I flex
-input file is chosen.
-.PP
-Once the match is determined, the text corresponding to the match
-(called the
-.I token)
-is made available in the global character pointer
-.B yytext,
-and its length in the global integer
-.B yyleng.
-The
-.I action
-corresponding to the matched pattern is then executed (a more
-detailed description of actions follows), and then the remaining
-input is scanned for another match.
-.PP
-If no match is found, then the
-.I default rule
-is executed: the next character in the input is considered matched and
-copied to the standard output. Thus, the simplest legal
-.I flex
-input is:
-.nf
-
- %%
-
-.fi
-which generates a scanner that simply copies its input (one character
-at a time) to its output.
-.PP
-Note that
-.B yytext
-can be defined in two different ways: either as a character
-.I pointer
-or as a character
-.I array.
-You can control which definition
-.I flex
-uses by including one of the special directives
-.B %pointer
-or
-.B %array
-in the first (definitions) section of your flex input. The default is
-.B %pointer,
-unless you use the
-.B -l
-lex compatibility option, in which case
-.B yytext
-will be an array.
-The advantage of using
-.B %pointer
-is substantially faster scanning and no buffer overflow when matching
-very large tokens (unless you run out of dynamic memory). The disadvantage
-is that you are restricted in how your actions can modify
-.B yytext
-(see the next section), and calls to the
-.B unput()
-function destroys the present contents of
-.B yytext,
-which can be a considerable porting headache when moving between different
-.I lex
-versions.
-.PP
-The advantage of
-.B %array
-is that you can then modify
-.B yytext
-to your heart's content, and calls to
-.B unput()
-do not destroy
-.B yytext
-(see below). Furthermore, existing
-.I lex
-programs sometimes access
-.B yytext
-externally using declarations of the form:
-.nf
- extern char yytext[];
-.fi
-This definition is erroneous when used with
-.B %pointer,
-but correct for
-.B %array.
-.PP
-.B %array
-defines
-.B yytext
-to be an array of
-.B YYLMAX
-characters, which defaults to a fairly large value. You can change
-the size by simply #define'ing
-.B YYLMAX
-to a different value in the first section of your
-.I flex
-input. As mentioned above, with
-.B %pointer
-yytext grows dynamically to accommodate large tokens. While this means your
-.B %pointer
-scanner can accommodate very large tokens (such as matching entire blocks
-of comments), bear in mind that each time the scanner must resize
-.B yytext
-it also must rescan the entire token from the beginning, so matching such
-tokens can prove slow.
-.B yytext
-presently does
-.I not
-dynamically grow if a call to
-.B unput()
-results in too much text being pushed back; instead, a run-time error results.
-.PP
-Also note that you cannot use
-.B %array
-with C++ scanner classes
-(the
-.B c++
-option; see below).
-.SH ACTIONS
-Each pattern in a rule has a corresponding action, which can be any
-arbitrary C statement. The pattern ends at the first non-escaped
-whitespace character; the remainder of the line is its action. If the
-action is empty, then when the pattern is matched the input token
-is simply discarded. For example, here is the specification for a program
-which deletes all occurrences of "zap me" from its input:
-.nf
-
- %%
- "zap me"
-
-.fi
-(It will copy all other characters in the input to the output since
-they will be matched by the default rule.)
-.PP
-Here is a program which compresses multiple blanks and tabs down to
-a single blank, and throws away whitespace found at the end of a line:
-.nf
-
- %%
- [ \\t]+ putchar( ' ' );
- [ \\t]+$ /* ignore this token */
-
-.fi
-.PP
-If the action contains a '{', then the action spans till the balancing '}'
-is found, and the action may cross multiple lines.
-.I flex
-knows about C strings and comments and won't be fooled by braces found
-within them, but also allows actions to begin with
-.B %{
-and will consider the action to be all the text up to the next
-.B %}
-(regardless of ordinary braces inside the action).
-.PP
-An action consisting solely of a vertical bar ('|') means "same as
-the action for the next rule." See below for an illustration.
-.PP
-Actions can include arbitrary C code, including
-.B return
-statements to return a value to whatever routine called
-.B yylex().
-Each time
-.B yylex()
-is called it continues processing tokens from where it last left
-off until it either reaches
-the end of the file or executes a return.
-.PP
-Actions are free to modify
-.B yytext
-except for lengthening it (adding
-characters to its end--these will overwrite later characters in the
-input stream). This however does not apply when using
-.B %array
-(see above); in that case,
-.B yytext
-may be freely modified in any way.
-.PP
-Actions are free to modify
-.B yyleng
-except they should not do so if the action also includes use of
-.B yymore()
-(see below).
-.PP
-There are a number of special directives which can be included within
-an action:
-.IP -
-.B ECHO
-copies yytext to the scanner's output.
-.IP -
-.B BEGIN
-followed by the name of a start condition places the scanner in the
-corresponding start condition (see below).
-.IP -
-.B REJECT
-directs the scanner to proceed on to the "second best" rule which matched the
-input (or a prefix of the input). The rule is chosen as described
-above in "How the Input is Matched", and
-.B yytext
-and
-.B yyleng
-set up appropriately.
-It may either be one which matched as much text
-as the originally chosen rule but came later in the
-.I flex
-input file, or one which matched less text.
-For example, the following will both count the
-words in the input and call the routine special() whenever "frob" is seen:
-.nf
-
- int word_count = 0;
- %%
-
- frob special(); REJECT;
- [^ \\t\\n]+ ++word_count;
-
-.fi
-Without the
-.B REJECT,
-any "frob"'s in the input would not be counted as words, since the
-scanner normally executes only one action per token.
-Multiple
-.B REJECT's
-are allowed, each one finding the next best choice to the currently
-active rule. For example, when the following scanner scans the token
-"abcd", it will write "abcdabcaba" to the output:
-.nf
-
- %%
- a |
- ab |
- abc |
- abcd ECHO; REJECT;
- .|\\n /* eat up any unmatched character */
-
-.fi
-(The first three rules share the fourth's action since they use
-the special '|' action.)
-.B REJECT
-is a particularly expensive feature in terms of scanner performance;
-if it is used in
-.I any
-of the scanner's actions it will slow down
-.I all
-of the scanner's matching. Furthermore,
-.B REJECT
-cannot be used with the
-.I -Cf
-or
-.I -CF
-options (see below).
-.IP
-Note also that unlike the other special actions,
-.B REJECT
-is a
-.I branch;
-code immediately following it in the action will
-.I not
-be executed.
-.IP -
-.B yymore()
-tells the scanner that the next time it matches a rule, the corresponding
-token should be
-.I appended
-onto the current value of
-.B yytext
-rather than replacing it. For example, given the input "mega-kludge"
-the following will write "mega-mega-kludge" to the output:
-.nf
-
- %%
- mega- ECHO; yymore();
- kludge ECHO;
-
-.fi
-First "mega-" is matched and echoed to the output. Then "kludge"
-is matched, but the previous "mega-" is still hanging around at the
-beginning of
-.B yytext
-so the
-.B ECHO
-for the "kludge" rule will actually write "mega-kludge".
-.PP
-Two notes regarding use of
-.B yymore().
-First,
-.B yymore()
-depends on the value of
-.I yyleng
-correctly reflecting the size of the current token, so you must not
-modify
-.I yyleng
-if you are using
-.B yymore().
-Second, the presence of
-.B yymore()
-in the scanner's action entails a minor performance penalty in the
-scanner's matching speed.
-.IP -
-.B yyless(n)
-returns all but the first
-.I n
-characters of the current token back to the input stream, where they
-will be rescanned when the scanner looks for the next match.
-.B yytext
-and
-.B yyleng
-are adjusted appropriately (e.g.,
-.B yyleng
-will now be equal to
-.I n
-). For example, on the input "foobar" the following will write out
-"foobarbar":
-.nf
-
- %%
- foobar ECHO; yyless(3);
- [a-z]+ ECHO;
-
-.fi
-An argument of 0 to
-.B yyless
-will cause the entire current input string to be scanned again. Unless you've
-changed how the scanner will subsequently process its input (using
-.B BEGIN,
-for example), this will result in an endless loop.
-.PP
-Note that
-.B yyless
-is a macro and can only be used in the flex input file, not from
-other source files.
-.IP -
-.B unput(c)
-puts the character
-.I c
-back onto the input stream. It will be the next character scanned.
-The following action will take the current token and cause it
-to be rescanned enclosed in parentheses.
-.nf
-
- {
- int i;
- /* Copy yytext because unput() trashes yytext */
- char *yycopy = strdup( yytext );
- unput( ')' );
- for ( i = yyleng - 1; i >= 0; --i )
- unput( yycopy[i] );
- unput( '(' );
- free( yycopy );
- }
-
-.fi
-Note that since each
-.B unput()
-puts the given character back at the
-.I beginning
-of the input stream, pushing back strings must be done back-to-front.
-.PP
-An important potential problem when using
-.B unput()
-is that if you are using
-.B %pointer
-(the default), a call to
-.B unput()
-.I destroys
-the contents of
-.I yytext,
-starting with its rightmost character and devouring one character to
-the left with each call. If you need the value of yytext preserved
-after a call to
-.B unput()
-(as in the above example),
-you must either first copy it elsewhere, or build your scanner using
-.B %array
-instead (see How The Input Is Matched).
-.PP
-Finally, note that you cannot put back
-.B EOF
-to attempt to mark the input stream with an end-of-file.
-.IP -
-.B input()
-reads the next character from the input stream. For example,
-the following is one way to eat up C comments:
-.nf
-
- %%
- "/*" {
- int c;
-
- for ( ; ; )
- {
- while ( (c = input()) != '*' &&
- c != EOF )
- ; /* eat up text of comment */
-
- if ( c == '*' )
- {
- while ( (c = input()) == '*' )
- ;
- if ( c == '/' )
- break; /* found the end */
- }
-
- if ( c == EOF )
- {
- error( "EOF in comment" );
- break;
- }
- }
- }
-
-.fi
-(Note that if the scanner is compiled using
-.B C++,
-then
-.B input()
-is instead referred to as
-.B yyinput(),
-in order to avoid a name clash with the
-.B C++
-stream by the name of
-.I input.)
-.IP -
-.B YY_FLUSH_BUFFER
-flushes the scanner's internal buffer
-so that the next time the scanner attempts to match a token, it will
-first refill the buffer using
-.B YY_INPUT
-(see The Generated Scanner, below). This action is a special case
-of the more general
-.B yy_flush_buffer()
-function, described below in the section Multiple Input Buffers.
-.IP -
-.B yyterminate()
-can be used in lieu of a return statement in an action. It terminates
-the scanner and returns a 0 to the scanner's caller, indicating "all done".
-By default,
-.B yyterminate()
-is also called when an end-of-file is encountered. It is a macro and
-may be redefined.
-.SH THE GENERATED SCANNER
-The output of
-.I flex
-is the file
-.B lex.yy.c,
-which contains the scanning routine
-.B yylex(),
-a number of tables used by it for matching tokens, and a number
-of auxiliary routines and macros. By default,
-.B yylex()
-is declared as follows:
-.nf
-
- int yylex()
- {
- ... various definitions and the actions in here ...
- }
-
-.fi
-(If your environment supports function prototypes, then it will
-be "int yylex( void )".) This definition may be changed by defining
-the "YY_DECL" macro. For example, you could use:
-.nf
-
- #define YY_DECL float lexscan( a, b ) float a, b;
-
-.fi
-to give the scanning routine the name
-.I lexscan,
-returning a float, and taking two floats as arguments. Note that
-if you give arguments to the scanning routine using a
-K&R-style/non-prototyped function declaration, you must terminate
-the definition with a semi-colon (;).
-.PP
-Whenever
-.B yylex()
-is called, it scans tokens from the global input file
-.I yyin
-(which defaults to stdin). It continues until it either reaches
-an end-of-file (at which point it returns the value 0) or
-one of its actions executes a
-.I return
-statement.
-.PP
-If the scanner reaches an end-of-file, subsequent calls are undefined
-unless either
-.I yyin
-is pointed at a new input file (in which case scanning continues from
-that file), or
-.B yyrestart()
-is called.
-.B yyrestart()
-takes one argument, a
-.B FILE *
-pointer (which can be nil, if you've set up
-.B YY_INPUT
-to scan from a source other than
-.I yyin),
-and initializes
-.I yyin
-for scanning from that file. Essentially there is no difference between
-just assigning
-.I yyin
-to a new input file or using
-.B yyrestart()
-to do so; the latter is available for compatibility with previous versions
-of
-.I flex,
-and because it can be used to switch input files in the middle of scanning.
-It can also be used to throw away the current input buffer, by calling
-it with an argument of
-.I yyin;
-but better is to use
-.B YY_FLUSH_BUFFER
-(see above).
-Note that
-.B yyrestart()
-does
-.I not
-reset the start condition to
-.B INITIAL
-(see Start Conditions, below).
-.PP
-If
-.B yylex()
-stops scanning due to executing a
-.I return
-statement in one of the actions, the scanner may then be called again and it
-will resume scanning where it left off.
-.PP
-By default (and for purposes of efficiency), the scanner uses
-block-reads rather than simple
-.I getc()
-calls to read characters from
-.I yyin.
-The nature of how it gets its input can be controlled by defining the
-.B YY_INPUT
-macro.
-YY_INPUT's calling sequence is "YY_INPUT(buf,result,max_size)". Its
-action is to place up to
-.I max_size
-characters in the character array
-.I buf
-and return in the integer variable
-.I result
-either the
-number of characters read or the constant YY_NULL (0 on Unix systems)
-to indicate EOF. The default YY_INPUT reads from the
-global file-pointer "yyin".
-.PP
-A sample definition of YY_INPUT (in the definitions
-section of the input file):
-.nf
-
- %{
- #define YY_INPUT(buf,result,max_size) \\
- { \\
- int c = getchar(); \\
- result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \\
- }
- %}
-
-.fi
-This definition will change the input processing to occur
-one character at a time.
-.PP
-When the scanner receives an end-of-file indication from YY_INPUT,
-it then checks the
-.B yywrap()
-function. If
-.B yywrap()
-returns false (zero), then it is assumed that the
-function has gone ahead and set up
-.I yyin
-to point to another input file, and scanning continues. If it returns
-true (non-zero), then the scanner terminates, returning 0 to its
-caller. Note that in either case, the start condition remains unchanged;
-it does
-.I not
-revert to
-.B INITIAL.
-.PP
-If you do not supply your own version of
-.B yywrap(),
-then you must either use
-.B %option noyywrap
-(in which case the scanner behaves as though
-.B yywrap()
-returned 1), or you must link with
-.B \-ll
-to obtain the default version of the routine, which always returns 1.
-.PP
-Three routines are available for scanning from in-memory buffers rather
-than files:
-.B yy_scan_string(), yy_scan_bytes(),
-and
-.B yy_scan_buffer().
-See the discussion of them below in the section Multiple Input Buffers.
-.PP
-The scanner writes its
-.B ECHO
-output to the
-.I yyout
-global (default, stdout), which may be redefined by the user simply
-by assigning it to some other
-.B FILE
-pointer.
-.SH START CONDITIONS
-.I flex
-provides a mechanism for conditionally activating rules. Any rule
-whose pattern is prefixed with "<sc>" will only be active when
-the scanner is in the start condition named "sc". For example,
-.nf
-
- <STRING>[^"]* { /* eat up the string body ... */
- ...
- }
-
-.fi
-will be active only when the scanner is in the "STRING" start
-condition, and
-.nf
-
- <INITIAL,STRING,QUOTE>\\. { /* handle an escape ... */
- ...
- }
-
-.fi
-will be active only when the current start condition is
-either "INITIAL", "STRING", or "QUOTE".
-.PP
-Start conditions
-are declared in the definitions (first) section of the input
-using unindented lines beginning with either
-.B %s
-or
-.B %x
-followed by a list of names.
-The former declares
-.I inclusive
-start conditions, the latter
-.I exclusive
-start conditions. A start condition is activated using the
-.B BEGIN
-action. Until the next
-.B BEGIN
-action is executed, rules with the given start
-condition will be active and
-rules with other start conditions will be inactive.
-If the start condition is
-.I inclusive,
-then rules with no start conditions at all will also be active.
-If it is
-.I exclusive,
-then
-.I only
-rules qualified with the start condition will be active.
-A set of rules contingent on the same exclusive start condition
-describe a scanner which is independent of any of the other rules in the
-.I flex
-input. Because of this,
-exclusive start conditions make it easy to specify "mini-scanners"
-which scan portions of the input that are syntactically different
-from the rest (e.g., comments).
-.PP
-If the distinction between inclusive and exclusive start conditions
-is still a little vague, here's a simple example illustrating the
-connection between the two. The set of rules:
-.nf
-
- %s example
- %%
-
- <example>foo do_something();
-
- bar something_else();
-
-.fi
-is equivalent to
-.nf
-
- %x example
- %%
-
- <example>foo do_something();
-
- <INITIAL,example>bar something_else();
-
-.fi
-Without the
-.B <INITIAL,example>
-qualifier, the
-.I bar
-pattern in the second example wouldn't be active (i.e., couldn't match)
-when in start condition
-.B example.
-If we just used
-.B <example>
-to qualify
-.I bar,
-though, then it would only be active in
-.B example
-and not in
-.B INITIAL,
-while in the first example it's active in both, because in the first
-example the
-.B example
-start condition is an
-.I inclusive
-.B (%s)
-start condition.
-.PP
-Also note that the special start-condition specifier
-.B <*>
-matches every start condition. Thus, the above example could also
-have been written;
-.nf
-
- %x example
- %%
-
- <example>foo do_something();
-
- <*>bar something_else();
-
-.fi
-.PP
-The default rule (to
-.B ECHO
-any unmatched character) remains active in start conditions. It
-is equivalent to:
-.nf
-
- <*>.|\\n ECHO;
-
-.fi
-.PP
-.B BEGIN(0)
-returns to the original state where only the rules with
-no start conditions are active. This state can also be
-referred to as the start-condition "INITIAL", so
-.B BEGIN(INITIAL)
-is equivalent to
-.B BEGIN(0).
-(The parentheses around the start condition name are not required but
-are considered good style.)
-.PP
-.B BEGIN
-actions can also be given as indented code at the beginning
-of the rules section. For example, the following will cause
-the scanner to enter the "SPECIAL" start condition whenever
-.B yylex()
-is called and the global variable
-.I enter_special
-is true:
-.nf
-
- int enter_special;
-
- %x SPECIAL
- %%
- if ( enter_special )
- BEGIN(SPECIAL);
-
- <SPECIAL>blahblahblah
- ...more rules follow...
-
-.fi
-.PP
-To illustrate the uses of start conditions,
-here is a scanner which provides two different interpretations
-of a string like "123.456". By default it will treat it as
-three tokens, the integer "123", a dot ('.'), and the integer "456".
-But if the string is preceded earlier in the line by the string
-"expect-floats"
-it will treat it as a single token, the floating-point number
-123.456:
-.nf
-
- %{
- #include <math.h>
- %}
- %s expect
-
- %%
- expect-floats BEGIN(expect);
-
- <expect>[0-9]+"."[0-9]+ {
- printf( "found a float, = %f\\n",
- atof( yytext ) );
- }
- <expect>\\n {
- /* that's the end of the line, so
- * we need another "expect-number"
- * before we'll recognize any more
- * numbers
- */
- BEGIN(INITIAL);
- }
-
- [0-9]+ {
- printf( "found an integer, = %d\\n",
- atoi( yytext ) );
- }
-
- "." printf( "found a dot\\n" );
-
-.fi
-Here is a scanner which recognizes (and discards) C comments while
-maintaining a count of the current input line.
-.nf
-
- %x comment
- %%
- int line_num = 1;
-
- "/*" BEGIN(comment);
-
- <comment>[^*\\n]* /* eat anything that's not a '*' */
- <comment>"*"+[^*/\\n]* /* eat up '*'s not followed by '/'s */
- <comment>\\n ++line_num;
- <comment>"*"+"/" BEGIN(INITIAL);
-
-.fi
-This scanner goes to a bit of trouble to match as much
-text as possible with each rule. In general, when attempting to write
-a high-speed scanner try to match as much possible in each rule, as
-it's a big win.
-.PP
-Note that start-conditions names are really integer values and
-can be stored as such. Thus, the above could be extended in the
-following fashion:
-.nf
-
- %x comment foo
- %%
- int line_num = 1;
- int comment_caller;
-
- "/*" {
- comment_caller = INITIAL;
- BEGIN(comment);
- }
-
- ...
-
- <foo>"/*" {
- comment_caller = foo;
- BEGIN(comment);
- }
-
- <comment>[^*\\n]* /* eat anything that's not a '*' */
- <comment>"*"+[^*/\\n]* /* eat up '*'s not followed by '/'s */
- <comment>\\n ++line_num;
- <comment>"*"+"/" BEGIN(comment_caller);
-
-.fi
-Furthermore, you can access the current start condition using
-the integer-valued
-.B YY_START
-macro. For example, the above assignments to
-.I comment_caller
-could instead be written
-.nf
-
- comment_caller = YY_START;
-
-.fi
-Flex provides
-.B YYSTATE
-as an alias for
-.B YY_START
-(since that is what's used by AT&T
-.I lex).
-.PP
-Note that start conditions do not have their own name-space; %s's and %x's
-declare names in the same fashion as #define's.
-.PP
-Finally, here's an example of how to match C-style quoted strings using
-exclusive start conditions, including expanded escape sequences (but
-not including checking for a string that's too long):
-.nf
-
- %x str
-
- %%
- char string_buf[MAX_STR_CONST];
- char *string_buf_ptr;
-
-
- \\" string_buf_ptr = string_buf; BEGIN(str);
-
- <str>\\" { /* saw closing quote - all done */
- BEGIN(INITIAL);
- *string_buf_ptr = '\\0';
- /* return string constant token type and
- * value to parser
- */
- }
-
- <str>\\n {
- /* error - unterminated string constant */
- /* generate error message */
- }
-
- <str>\\\\[0-7]{1,3} {
- /* octal escape sequence */
- int result;
-
- (void) sscanf( yytext + 1, "%o", &result );
-
- if ( result > 0xff )
- /* error, constant is out-of-bounds */
-
- *string_buf_ptr++ = result;
- }
-
- <str>\\\\[0-9]+ {
- /* generate error - bad escape sequence; something
- * like '\\48' or '\\0777777'
- */
- }
-
- <str>\\\\n *string_buf_ptr++ = '\\n';
- <str>\\\\t *string_buf_ptr++ = '\\t';
- <str>\\\\r *string_buf_ptr++ = '\\r';
- <str>\\\\b *string_buf_ptr++ = '\\b';
- <str>\\\\f *string_buf_ptr++ = '\\f';
-
- <str>\\\\(.|\\n) *string_buf_ptr++ = yytext[1];
-
- <str>[^\\\\\\n\\"]+ {
- char *yptr = yytext;
-
- while ( *yptr )
- *string_buf_ptr++ = *yptr++;
- }
-
-.fi
-.PP
-Often, such as in some of the examples above, you wind up writing a
-whole bunch of rules all preceded by the same start condition(s). Flex
-makes this a little easier and cleaner by introducing a notion of
-start condition
-.I scope.
-A start condition scope is begun with:
-.nf
-
- <SCs>{
-
-.fi
-where
-.I SCs
-is a list of one or more start conditions. Inside the start condition
-scope, every rule automatically has the prefix
-.I <SCs>
-applied to it, until a
-.I '}'
-which matches the initial
-.I '{'.
-So, for example,
-.nf
-
- <ESC>{
- "\\\\n" return '\\n';
- "\\\\r" return '\\r';
- "\\\\f" return '\\f';
- "\\\\0" return '\\0';
- }
-
-.fi
-is equivalent to:
-.nf
-
- <ESC>"\\\\n" return '\\n';
- <ESC>"\\\\r" return '\\r';
- <ESC>"\\\\f" return '\\f';
- <ESC>"\\\\0" return '\\0';
-
-.fi
-Start condition scopes may be nested.
-.PP
-Three routines are available for manipulating stacks of start conditions:
-.TP
-.B void yy_push_state(int new_state)
-pushes the current start condition onto the top of the start condition
-stack and switches to
-.I new_state
-as though you had used
-.B BEGIN new_state
-(recall that start condition names are also integers).
-.TP
-.B void yy_pop_state()
-pops the top of the stack and switches to it via
-.B BEGIN.
-.TP
-.B int yy_top_state()
-returns the top of the stack without altering the stack's contents.
-.PP
-The start condition stack grows dynamically and so has no built-in
-size limitation. If memory is exhausted, program execution aborts.
-.PP
-To use start condition stacks, your scanner must include a
-.B %option stack
-directive (see Options below).
-.SH MULTIPLE INPUT BUFFERS
-Some scanners (such as those which support "include" files)
-require reading from several input streams. As
-.I flex
-scanners do a large amount of buffering, one cannot control
-where the next input will be read from by simply writing a
-.B YY_INPUT
-which is sensitive to the scanning context.
-.B YY_INPUT
-is only called when the scanner reaches the end of its buffer, which
-may be a long time after scanning a statement such as an "include"
-which requires switching the input source.
-.PP
-To negotiate these sorts of problems,
-.I flex
-provides a mechanism for creating and switching between multiple
-input buffers. An input buffer is created by using:
-.nf
-
- YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
-
-.fi
-which takes a
-.I FILE
-pointer and a size and creates a buffer associated with the given
-file and large enough to hold
-.I size
-characters (when in doubt, use
-.B YY_BUF_SIZE
-for the size). It returns a
-.B YY_BUFFER_STATE
-handle, which may then be passed to other routines (see below). The
-.B YY_BUFFER_STATE
-type is a pointer to an opaque
-.B struct yy_buffer_state
-structure, so you may safely initialize YY_BUFFER_STATE variables to
-.B ((YY_BUFFER_STATE) 0)
-if you wish, and also refer to the opaque structure in order to
-correctly declare input buffers in source files other than that
-of your scanner. Note that the
-.I FILE
-pointer in the call to
-.B yy_create_buffer
-is only used as the value of
-.I yyin
-seen by
-.B YY_INPUT;
-if you redefine
-.B YY_INPUT
-so it no longer uses
-.I yyin,
-then you can safely pass a nil
-.I FILE
-pointer to
-.B yy_create_buffer.
-You select a particular buffer to scan from using:
-.nf
-
- void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
-
-.fi
-switches the scanner's input buffer so subsequent tokens will
-come from
-.I new_buffer.
-Note that
-.B yy_switch_to_buffer()
-may be used by yywrap() to set things up for continued scanning, instead
-of opening a new file and pointing
-.I yyin
-at it. Note also that switching input sources via either
-.B yy_switch_to_buffer()
-or
-.B yywrap()
-does
-.I not
-change the start condition.
-.nf
-
- void yy_delete_buffer( YY_BUFFER_STATE buffer )
-
-.fi
-is used to reclaim the storage associated with a buffer. (
-.B buffer
-can be nil, in which case the routine does nothing.)
-You can also clear the current contents of a buffer using:
-.nf
-
- void yy_flush_buffer( YY_BUFFER_STATE buffer )
-
-.fi
-This function discards the buffer's contents,
-so the next time the scanner attempts to match a token from the
-buffer, it will first fill the buffer anew using
-.B YY_INPUT.
-.PP
-.B yy_new_buffer()
-is an alias for
-.B yy_create_buffer(),
-provided for compatibility with the C++ use of
-.I new
-and
-.I delete
-for creating and destroying dynamic objects.
-.PP
-Finally, the
-.B YY_CURRENT_BUFFER
-macro returns a
-.B YY_BUFFER_STATE
-handle to the current buffer.
-.PP
-Here is an example of using these features for writing a scanner
-which expands include files (the
-.B <<EOF>>
-feature is discussed below):
-.nf
-
- /* the "incl" state is used for picking up the name
- * of an include file
- */
- %x incl
-
- %{
- #define MAX_INCLUDE_DEPTH 10
- YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
- int include_stack_ptr = 0;
- %}
-
- %%
- include BEGIN(incl);
-
- [a-z]+ ECHO;
- [^a-z\\n]*\\n? ECHO;
-
- <incl>[ \\t]* /* eat the whitespace */
- <incl>[^ \\t\\n]+ { /* got the include file name */
- if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
- {
- fprintf( stderr, "Includes nested too deeply" );
- exit( 1 );
- }
-
- include_stack[include_stack_ptr++] =
- YY_CURRENT_BUFFER;
-
- yyin = fopen( yytext, "r" );
-
- if ( ! yyin )
- error( ... );
-
- yy_switch_to_buffer(
- yy_create_buffer( yyin, YY_BUF_SIZE ) );
-
- BEGIN(INITIAL);
- }
-
- <<EOF>> {
- if ( --include_stack_ptr < 0 )
- {
- yyterminate();
- }
-
- else
- {
- yy_delete_buffer( YY_CURRENT_BUFFER );
- yy_switch_to_buffer(
- include_stack[include_stack_ptr] );
- }
- }
-
-.fi
-Three routines are available for setting up input buffers for
-scanning in-memory strings instead of files. All of them create
-a new input buffer for scanning the string, and return a corresponding
-.B YY_BUFFER_STATE
-handle (which you should delete with
-.B yy_delete_buffer()
-when done with it). They also switch to the new buffer using
-.B yy_switch_to_buffer(),
-so the next call to
-.B yylex()
-will start scanning the string.
-.TP
-.B yy_scan_string(const char *str)
-scans a NUL-terminated string.
-.TP
-.B yy_scan_bytes(const char *bytes, int len)
-scans
-.I len
-bytes (including possibly NUL's)
-starting at location
-.I bytes.
-.PP
-Note that both of these functions create and scan a
-.I copy
-of the string or bytes. (This may be desirable, since
-.B yylex()
-modifies the contents of the buffer it is scanning.) You can avoid the
-copy by using:
-.TP
-.B yy_scan_buffer(char *base, yy_size_t size)
-which scans in place the buffer starting at
-.I base,
-consisting of
-.I size
-bytes, the last two bytes of which
-.I must
-be
-.B YY_END_OF_BUFFER_CHAR
-(ASCII NUL).
-These last two bytes are not scanned; thus, scanning
-consists of
-.B base[0]
-through
-.B base[size-2],
-inclusive.
-.IP
-If you fail to set up
-.I base
-in this manner (i.e., forget the final two
-.B YY_END_OF_BUFFER_CHAR
-bytes), then
-.B yy_scan_buffer()
-returns a nil pointer instead of creating a new input buffer.
-.IP
-The type
-.B yy_size_t
-is an integral type to which you can cast an integer expression
-reflecting the size of the buffer.
-.SH END-OF-FILE RULES
-The special rule "<<EOF>>" indicates
-actions which are to be taken when an end-of-file is
-encountered and yywrap() returns non-zero (i.e., indicates
-no further files to process). The action must finish
-by doing one of four things:
-.IP -
-assigning
-.I yyin
-to a new input file (in previous versions of flex, after doing the
-assignment you had to call the special action
-.B YY_NEW_FILE;
-this is no longer necessary);
-.IP -
-executing a
-.I return
-statement;
-.IP -
-executing the special
-.B yyterminate()
-action;
-.IP -
-or, switching to a new buffer using
-.B yy_switch_to_buffer()
-as shown in the example above.
-.PP
-<<EOF>> rules may not be used with other
-patterns; they may only be qualified with a list of start
-conditions. If an unqualified <<EOF>> rule is given, it
-applies to
-.I all
-start conditions which do not already have <<EOF>> actions. To
-specify an <<EOF>> rule for only the initial start condition, use
-.nf
-
- <INITIAL><<EOF>>
-
-.fi
-.PP
-These rules are useful for catching things like unclosed comments.
-An example:
-.nf
-
- %x quote
- %%
-
- ...other rules for dealing with quotes...
-
- <quote><<EOF>> {
- error( "unterminated quote" );
- yyterminate();
- }
- <<EOF>> {
- if ( *++filelist )
- yyin = fopen( *filelist, "r" );
- else
- yyterminate();
- }
-
-.fi
-.SH MISCELLANEOUS MACROS
-The macro
-.B YY_USER_ACTION
-can be defined to provide an action
-which is always executed prior to the matched rule's action. For example,
-it could be #define'd to call a routine to convert yytext to lower-case.
-When
-.B YY_USER_ACTION
-is invoked, the variable
-.I yy_act
-gives the number of the matched rule (rules are numbered starting with 1).
-Suppose you want to profile how often each of your rules is matched. The
-following would do the trick:
-.nf
-
- #define YY_USER_ACTION ++ctr[yy_act]
-
-.fi
-where
-.I ctr
-is an array to hold the counts for the different rules. Note that
-the macro
-.B YY_NUM_RULES
-gives the total number of rules (including the default rule, even if
-you use
-.B \-s),
-so a correct declaration for
-.I ctr
-is:
-.nf
-
- int ctr[YY_NUM_RULES];
-
-.fi
-.PP
-The macro
-.B YY_USER_INIT
-may be defined to provide an action which is always executed before
-the first scan (and before the scanner's internal initializations are done).
-For example, it could be used to call a routine to read
-in a data table or open a logging file.
-.PP
-The macro
-.B yy_set_interactive(is_interactive)
-can be used to control whether the current buffer is considered
-.I interactive.
-An interactive buffer is processed more slowly,
-but must be used when the scanner's input source is indeed
-interactive to avoid problems due to waiting to fill buffers
-(see the discussion of the
-.B \-I
-flag below). A non-zero value
-in the macro invocation marks the buffer as interactive, a zero
-value as non-interactive. Note that use of this macro overrides
-.B %option interactive ,
-.B %option always-interactive
-or
-.B %option never-interactive
-(see Options below).
-.B yy_set_interactive()
-must be invoked prior to beginning to scan the buffer that is
-(or is not) to be considered interactive.
-.PP
-The macro
-.B yy_set_bol(at_bol)
-can be used to control whether the current buffer's scanning
-context for the next token match is done as though at the
-beginning of a line. A non-zero macro argument makes rules anchored with
-\&'^' active, while a zero argument makes '^' rules inactive.
-.PP
-The macro
-.B YY_AT_BOL()
-returns true if the next token scanned from the current buffer
-will have '^' rules active, false otherwise.
-.PP
-In the generated scanner, the actions are all gathered in one large
-switch statement and separated using
-.B YY_BREAK,
-which may be redefined. By default, it is simply a "break", to separate
-each rule's action from the following rule's.
-Redefining
-.B YY_BREAK
-allows, for example, C++ users to
-#define YY_BREAK to do nothing (while being very careful that every
-rule ends with a "break" or a "return"!) to avoid suffering from
-unreachable statement warnings where because a rule's action ends with
-"return", the
-.B YY_BREAK
-is inaccessible.
-.SH VALUES AVAILABLE TO THE USER
-This section summarizes the various values available to the user
-in the rule actions.
-.IP -
-.B char *yytext
-holds the text of the current token. It may be modified but not lengthened
-(you cannot append characters to the end).
-.IP
-If the special directive
-.B %array
-appears in the first section of the scanner description, then
-.B yytext
-is instead declared
-.B char yytext[YYLMAX],
-where
-.B YYLMAX
-is a macro definition that you can redefine in the first section
-if you don't like the default value (generally 8KB). Using
-.B %array
-results in somewhat slower scanners, but the value of
-.B yytext
-becomes immune to calls to
-.I input()
-and
-.I unput(),
-which potentially destroy its value when
-.B yytext
-is a character pointer. The opposite of
-.B %array
-is
-.B %pointer,
-which is the default.
-.IP
-You cannot use
-.B %array
-when generating C++ scanner classes
-(the
-.B \-+
-flag).
-.IP -
-.B int yyleng
-holds the length of the current token.
-.IP -
-.B FILE *yyin
-is the file which by default
-.I flex
-reads from. It may be redefined but doing so only makes sense before
-scanning begins or after an EOF has been encountered. Changing it in
-the midst of scanning will have unexpected results since
-.I flex
-buffers its input; use
-.B yyrestart()
-instead.
-Once scanning terminates because an end-of-file
-has been seen, you can assign
-.I yyin
-at the new input file and then call the scanner again to continue scanning.
-.IP -
-.B void yyrestart( FILE *new_file )
-may be called to point
-.I yyin
-at the new input file. The switch-over to the new file is immediate
-(any previously buffered-up input is lost). Note that calling
-.B yyrestart()
-with
-.I yyin
-as an argument thus throws away the current input buffer and continues
-scanning the same input file.
-.IP -
-.B FILE *yyout
-is the file to which
-.B ECHO
-actions are done. It can be reassigned by the user.
-.IP -
-.B YY_CURRENT_BUFFER
-returns a
-.B YY_BUFFER_STATE
-handle to the current buffer.
-.IP -
-.B YY_START
-returns an integer value corresponding to the current start
-condition. You can subsequently use this value with
-.B BEGIN
-to return to that start condition.
-.SH INTERFACING WITH YACC
-One of the main uses of
-.I flex
-is as a companion to the
-.I yacc
-parser-generator.
-.I yacc
-parsers expect to call a routine named
-.B yylex()
-to find the next input token. The routine is supposed to
-return the type of the next token as well as putting any associated
-value in the global
-.B yylval.
-To use
-.I flex
-with
-.I yacc,
-one specifies the
-.B \-d
-option to
-.I yacc
-to instruct it to generate the file
-.B y.tab.h
-containing definitions of all the
-.B %tokens
-appearing in the
-.I yacc
-input. This file is then included in the
-.I flex
-scanner. For example, if one of the tokens is "TOK_NUMBER",
-part of the scanner might look like:
-.nf
-
- %{
- #include "y.tab.h"
- %}
-
- %%
-
- [0-9]+ yylval = atoi( yytext ); return TOK_NUMBER;
-
-.fi
-.SH OPTIONS
-.I flex
-has the following options:
-.TP
-.B \-b
-Generate backing-up information to
-.I lex.backup.
-This is a list of scanner states which require backing up
-and the input characters on which they do so. By adding rules one
-can remove backing-up states. If
-.I all
-backing-up states are eliminated and
-.B \-Cf
-or
-.B \-CF
-is used, the generated scanner will run faster (see the
-.B \-p
-flag). Only users who wish to squeeze every last cycle out of their
-scanners need worry about this option. (See the section on Performance
-Considerations below.)
-.TP
-.B \-c
-is a do-nothing, deprecated option included for POSIX compliance.
-.TP
-.B \-d
-makes the generated scanner run in
-.I debug
-mode. Whenever a pattern is recognized and the global
-.B yy_flex_debug
-is non-zero (which is the default),
-the scanner will write to
-.I stderr
-a line of the form:
-.nf
-
- --accepting rule at line 53 ("the matched text")
-
-.fi
-The line number refers to the location of the rule in the file
-defining the scanner (i.e., the file that was fed to flex). Messages
-are also generated when the scanner backs up, accepts the
-default rule, reaches the end of its input buffer (or encounters
-a NUL; at this point, the two look the same as far as the scanner's concerned),
-or reaches an end-of-file.
-.TP
-.B \-f
-specifies
-.I fast scanner.
-No table compression is done and stdio is bypassed.
-The result is large but fast. This option is equivalent to
-.B \-Cfr
-(see below).
-.TP
-.B \-h
-generates a "help" summary of
-.I flex's
-options to
-.I stdout
-and then exits.
-.B \-?
-and
-.B \-\-help
-are synonyms for
-.B \-h.
-.TP
-.B \-i
-instructs
-.I flex
-to generate a
-.I case-insensitive
-scanner. The case of letters given in the
-.I flex
-input patterns will
-be ignored, and tokens in the input will be matched regardless of case. The
-matched text given in
-.I yytext
-will have the preserved case (i.e., it will not be folded).
-.TP
-.B \-l
-turns on maximum compatibility with the original AT&T
-.I lex
-implementation. Note that this does not mean
-.I full
-compatibility. Use of this option costs a considerable amount of
-performance, and it cannot be used with the
-.B \-+, -f, -F, -Cf,
-or
-.B -CF
-options. For details on the compatibilities it provides, see the section
-"Incompatibilities With Lex And POSIX" below. This option also results
-in the name
-.B YY_FLEX_LEX_COMPAT
-being #define'd in the generated scanner.
-.TP
-.B \-n
-is another do-nothing, deprecated option included only for
-POSIX compliance.
-.TP
-.B \-p
-generates a performance report to stderr. The report
-consists of comments regarding features of the
-.I flex
-input file which will cause a serious loss of performance in the resulting
-scanner. If you give the flag twice, you will also get comments regarding
-features that lead to minor performance losses.
-.IP
-Note that the use of
-.B REJECT,
-.B %option yylineno,
-and variable trailing context (see the Deficiencies / Bugs section below)
-entails a substantial performance penalty; use of
-.I yymore(),
-the
-.B ^
-operator,
-and the
-.B \-I
-flag entail minor performance penalties.
-.TP
-.B \-s
-causes the
-.I default rule
-(that unmatched scanner input is echoed to
-.I stdout)
-to be suppressed. If the scanner encounters input that does not
-match any of its rules, it aborts with an error. This option is
-useful for finding holes in a scanner's rule set.
-.TP
-.B \-t
-instructs
-.I flex
-to write the scanner it generates to standard output instead
-of
-.B lex.yy.c.
-.TP
-.B \-v
-specifies that
-.I flex
-should write to
-.I stderr
-a summary of statistics regarding the scanner it generates.
-Most of the statistics are meaningless to the casual
-.I flex
-user, but the first line identifies the version of
-.I flex
-(same as reported by
-.B \-V),
-and the next line the flags used when generating the scanner, including
-those that are on by default.
-.TP
-.B \-w
-suppresses warning messages.
-.TP
-.B \-B
-instructs
-.I flex
-to generate a
-.I batch
-scanner, the opposite of
-.I interactive
-scanners generated by
-.B \-I
-(see below). In general, you use
-.B \-B
-when you are
-.I certain
-that your scanner will never be used interactively, and you want to
-squeeze a
-.I little
-more performance out of it. If your goal is instead to squeeze out a
-.I lot
-more performance, you should be using the
-.B \-Cf
-or
-.B \-CF
-options (discussed below), which turn on
-.B \-B
-automatically anyway.
-.TP
-.B \-F
-specifies that the
-.ul
-fast
-scanner table representation should be used (and stdio
-bypassed). This representation is
-about as fast as the full table representation
-.B (-f),
-and for some sets of patterns will be considerably smaller (and for
-others, larger). In general, if the pattern set contains both "keywords"
-and a catch-all, "identifier" rule, such as in the set:
-.nf
-
- "case" return TOK_CASE;
- "switch" return TOK_SWITCH;
- ...
- "default" return TOK_DEFAULT;
- [a-z]+ return TOK_ID;
-
-.fi
-then you're better off using the full table representation. If only
-the "identifier" rule is present and you then use a hash table or some such
-to detect the keywords, you're better off using
-.B -F.
-.IP
-This option is equivalent to
-.B \-CFr
-(see below). It cannot be used with
-.B \-+.
-.TP
-.B \-I
-instructs
-.I flex
-to generate an
-.I interactive
-scanner. An interactive scanner is one that only looks ahead to decide
-what token has been matched if it absolutely must. It turns out that
-always looking one extra character ahead, even if the scanner has already
-seen enough text to disambiguate the current token, is a bit faster than
-only looking ahead when necessary. But scanners that always look ahead
-give dreadful interactive performance; for example, when a user types
-a newline, it is not recognized as a newline token until they enter
-.I another
-token, which often means typing in another whole line.
-.IP
-.I Flex
-scanners default to
-.I interactive
-unless you use the
-.B \-Cf
-or
-.B \-CF
-table-compression options (see below). That's because if you're looking
-for high-performance you should be using one of these options, so if you
-didn't,
-.I flex
-assumes you'd rather trade off a bit of run-time performance for intuitive
-interactive behavior. Note also that you
-.I cannot
-use
-.B \-I
-in conjunction with
-.B \-Cf
-or
-.B \-CF.
-Thus, this option is not really needed; it is on by default for all those
-cases in which it is allowed.
-.IP
-Note that if
-.B isatty()
-returns false for the scanner input, flex will revert to batch mode, even if
-.B \-I
-was specified. To force interactive mode no matter what, use
-.B %option always-interactive
-(see Options below).
-.IP
-You can force a scanner to
-.I not
-be interactive by using
-.B \-B
-(see above).
-.TP
-.B \-L
-instructs
-.I flex
-not to generate
-.B #line
-directives. Without this option,
-.I flex
-peppers the generated scanner
-with #line directives so error messages in the actions will be correctly
-located with respect to either the original
-.I flex
-input file (if the errors are due to code in the input file), or
-.B lex.yy.c
-(if the errors are
-.I flex's
-fault -- you should report these sorts of errors to the email address
-given below).
-.TP
-.B \-T
-makes
-.I flex
-run in
-.I trace
-mode. It will generate a lot of messages to
-.I stderr
-concerning
-the form of the input and the resultant non-deterministic and deterministic
-finite automata. This option is mostly for use in maintaining
-.I flex.
-.TP
-.B \-V
-prints the version number to
-.I stdout
-and exits.
-.B \-\-version
-is a synonym for
-.B \-V.
-.TP
-.B \-7
-instructs
-.I flex
-to generate a 7-bit scanner, i.e., one which can only recognize 7-bit
-characters in its input. The advantage of using
-.B \-7
-is that the scanner's tables can be up to half the size of those generated
-using the
-.B \-8
-option (see below). The disadvantage is that such scanners often hang
-or crash if their input contains an 8-bit character.
-.IP
-Note, however, that unless you generate your scanner using the
-.B \-Cf
-or
-.B \-CF
-table compression options, use of
-.B \-7
-will save only a small amount of table space, and make your scanner
-considerably less portable.
-.I Flex's
-default behavior is to generate an 8-bit scanner unless you use the
-.B \-Cf
-or
-.B \-CF,
-in which case
-.I flex
-defaults to generating 7-bit scanners unless your site was always
-configured to generate 8-bit scanners (as will often be the case
-with non-USA sites). You can tell whether flex generated a 7-bit
-or an 8-bit scanner by inspecting the flag summary in the
-.B \-v
-output as described above.
-.IP
-Note that if you use
-.B \-Cfe
-or
-.B \-CFe
-(those table compression options, but also using equivalence classes as
-discussed see below), flex still defaults to generating an 8-bit
-scanner, since usually with these compression options full 8-bit tables
-are not much more expensive than 7-bit tables.
-.TP
-.B \-8
-instructs
-.I flex
-to generate an 8-bit scanner, i.e., one which can recognize 8-bit
-characters. This flag is only needed for scanners generated using
-.B \-Cf
-or
-.B \-CF,
-as otherwise flex defaults to generating an 8-bit scanner anyway.
-.IP
-See the discussion of
-.B \-7
-above for flex's default behavior and the tradeoffs between 7-bit
-and 8-bit scanners.
-.TP
-.B \-+
-specifies that you want flex to generate a C++
-scanner class. See the section on Generating C++ Scanners below for
-details.
-.TP
-.B \-C[aefFmr]
-controls the degree of table compression and, more generally, trade-offs
-between small scanners and fast scanners.
-.IP
-.B \-Ca
-("align") instructs flex to trade off larger tables in the
-generated scanner for faster performance because the elements of
-the tables are better aligned for memory access and computation. On some
-RISC architectures, fetching and manipulating longwords is more efficient
-than with smaller-sized units such as shortwords. This option can
-double the size of the tables used by your scanner.
-.IP
-.B \-Ce
-directs
-.I flex
-to construct
-.I equivalence classes,
-i.e., sets of characters
-which have identical lexical properties (for example, if the only
-appearance of digits in the
-.I flex
-input is in the character class
-"[0-9]" then the digits '0', '1', ..., '9' will all be put
-in the same equivalence class). Equivalence classes usually give
-dramatic reductions in the final table/object file sizes (typically
-a factor of 2-5) and are pretty cheap performance-wise (one array
-look-up per character scanned).
-.IP
-.B \-Cf
-specifies that the
-.I full
-scanner tables should be generated -
-.I flex
-should not compress the
-tables by taking advantages of similar transition functions for
-different states.
-.IP
-.B \-CF
-specifies that the alternate fast scanner representation (described
-above under the
-.B \-F
-flag)
-should be used. This option cannot be used with
-.B \-+.
-.IP
-.B \-Cm
-directs
-.I flex
-to construct
-.I meta-equivalence classes,
-which are sets of equivalence classes (or characters, if equivalence
-classes are not being used) that are commonly used together. Meta-equivalence
-classes are often a big win when using compressed tables, but they
-have a moderate performance impact (one or two "if" tests and one
-array look-up per character scanned).
-.IP
-.B \-Cr
-causes the generated scanner to
-.I bypass
-use of the standard I/O library (stdio) for input. Instead of calling
-.B fread()
-or
-.B getc(),
-the scanner will use the
-.B read()
-system call, resulting in a performance gain which varies from system
-to system, but in general is probably negligible unless you are also using
-.B \-Cf
-or
-.B \-CF.
-Using
-.B \-Cr
-can cause strange behavior if, for example, you read from
-.I yyin
-using stdio prior to calling the scanner (because the scanner will miss
-whatever text your previous reads left in the stdio input buffer).
-.IP
-.B \-Cr
-has no effect if you define
-.B YY_INPUT
-(see The Generated Scanner above).
-.IP
-A lone
-.B \-C
-specifies that the scanner tables should be compressed but neither
-equivalence classes nor meta-equivalence classes should be used.
-.IP
-The options
-.B \-Cf
-or
-.B \-CF
-and
-.B \-Cm
-do not make sense together - there is no opportunity for meta-equivalence
-classes if the table is not being compressed. Otherwise the options
-may be freely mixed, and are cumulative.
-.IP
-The default setting is
-.B \-Cem,
-which specifies that
-.I flex
-should generate equivalence classes
-and meta-equivalence classes. This setting provides the highest
-degree of table compression. You can trade off
-faster-executing scanners at the cost of larger tables with
-the following generally being true:
-.nf
-
- slowest & smallest
- -Cem
- -Cm
- -Ce
- -C
- -C{f,F}e
- -C{f,F}
- -C{f,F}a
- fastest & largest
-
-.fi
-Note that scanners with the smallest tables are usually generated and
-compiled the quickest, so
-during development you will usually want to use the default, maximal
-compression.
-.IP
-.B \-Cfe
-is often a good compromise between speed and size for production
-scanners.
-.TP
-.B \-ooutput
-directs flex to write the scanner to the file
-.B output
-instead of
-.B lex.yy.c.
-If you combine
-.B \-o
-with the
-.B \-t
-option, then the scanner is written to
-.I stdout
-but its
-.B #line
-directives (see the
-.B \\-L
-option above) refer to the file
-.B output.
-.TP
-.B \-Pprefix
-changes the default
-.I "yy"
-prefix used by
-.I flex
-for all globally-visible variable and function names to instead be
-.I prefix.
-For example,
-.B \-Pfoo
-changes the name of
-.B yytext
-to
-.B footext.
-It also changes the name of the default output file from
-.B lex.yy.c
-to
-.B lex.foo.c.
-Here are all of the names affected:
-.nf
-
- yy_create_buffer
- yy_delete_buffer
- yy_flex_debug
- yy_init_buffer
- yy_flush_buffer
- yy_load_buffer_state
- yy_switch_to_buffer
- yyin
- yyleng
- yylex
- yylineno
- yyout
- yyrestart
- yytext
- yywrap
-
-.fi
-(If you are using a C++ scanner, then only
-.B yywrap
-and
-.B yyFlexLexer
-are affected.)
-Within your scanner itself, you can still refer to the global variables
-and functions using either version of their name; but externally, they
-have the modified name.
-.IP
-This option lets you easily link together multiple
-.I flex
-programs into the same executable. Note, though, that using this
-option also renames
-.B yywrap(),
-so you now
-.I must
-either
-provide your own (appropriately-named) version of the routine for your
-scanner, or use
-.B %option noyywrap,
-as linking with
-.B \-ll
-no longer provides one for you by default.
-.TP
-.B \-Sskeleton_file
-overrides the default skeleton file from which
-.I flex
-constructs its scanners. You'll never need this option unless you are doing
-.I flex
-maintenance or development.
-.PP
-.I flex
-also provides a mechanism for controlling options within the
-scanner specification itself, rather than from the flex command-line.
-This is done by including
-.B %option
-directives in the first section of the scanner specification.
-You can specify multiple options with a single
-.B %option
-directive, and multiple directives in the first section of your flex input
-file.
-.PP
-Most options are given simply as names, optionally preceded by the
-word "no" (with no intervening whitespace) to negate their meaning.
-A number are equivalent to flex flags or their negation:
-.nf
-
- 7bit -7 option
- 8bit -8 option
- align -Ca option
- backup -b option
- batch -B option
- c++ -+ option
-
- caseful or
- case-sensitive opposite of -i (default)
-
- case-insensitive or
- caseless -i option
-
- debug -d option
- default opposite of -s option
- ecs -Ce option
- fast -F option
- full -f option
- interactive -I option
- lex-compat -l option
- meta-ecs -Cm option
- perf-report -p option
- read -Cr option
- stdout -t option
- verbose -v option
- warn opposite of -w option
- (use "%option nowarn" for -w)
-
- array equivalent to "%array"
- pointer equivalent to "%pointer" (default)
-
-.fi
-Some
-.B %option's
-provide features otherwise not available:
-.TP
-.B always-interactive
-instructs flex to generate a scanner which always considers its input
-"interactive". Normally, on each new input file the scanner calls
-.B isatty()
-in an attempt to determine whether
-the scanner's input source is interactive and thus should be read a
-character at a time. When this option is used, however, then no
-such call is made.
-.TP
-.B main
-directs flex to provide a default
-.B main()
-program for the scanner, which simply calls
-.B yylex().
-This option implies
-.B noyywrap
-(see below).
-.TP
-.B never-interactive
-instructs flex to generate a scanner which never considers its input
-"interactive" (again, no call made to
-.B isatty()).
-This is the opposite of
-.B always-interactive.
-.TP
-.B stack
-enables the use of start condition stacks (see Start Conditions above).
-.TP
-.B stdinit
-if set (i.e.,
-.B %option stdinit)
-initializes
-.I yyin
-and
-.I yyout
-to
-.I stdin
-and
-.I stdout,
-instead of the default of
-.I nil.
-Some existing
-.I lex
-programs depend on this behavior, even though it is not compliant with
-ANSI C, which does not require
-.I stdin
-and
-.I stdout
-to be compile-time constant.
-.TP
-.B yylineno
-directs
-.I flex
-to generate a scanner that maintains the number of the current line
-read from its input in the global variable
-.B yylineno.
-This option is implied by
-.B %option lex-compat.
-.TP
-.B yywrap
-if unset (i.e.,
-.B %option noyywrap),
-makes the scanner not call
-.B yywrap()
-upon an end-of-file, but simply assume that there are no more
-files to scan (until the user points
-.I yyin
-at a new file and calls
-.B yylex()
-again).
-.PP
-.I flex
-scans your rule actions to determine whether you use the
-.B REJECT
-or
-.B yymore()
-features. The
-.B reject
-and
-.B yymore
-options are available to override its decision as to whether you use the
-options, either by setting them (e.g.,
-.B %option reject)
-to indicate the feature is indeed used, or
-unsetting them to indicate it actually is not used
-(e.g.,
-.B %option noyymore).
-.PP
-Three options take string-delimited values, offset with '=':
-.nf
-
- %option outfile="ABC"
-
-.fi
-is equivalent to
-.B -oABC,
-and
-.nf
-
- %option prefix="XYZ"
-
-.fi
-is equivalent to
-.B -PXYZ.
-Finally,
-.nf
-
- %option yyclass="foo"
-
-.fi
-only applies when generating a C++ scanner (
-.B \-+
-option). It informs
-.I flex
-that you have derived
-.B foo
-as a subclass of
-.B yyFlexLexer,
-so
-.I flex
-will place your actions in the member function
-.B foo::yylex()
-instead of
-.B yyFlexLexer::yylex().
-It also generates a
-.B yyFlexLexer::yylex()
-member function that emits a run-time error (by invoking
-.B yyFlexLexer::LexerError())
-if called.
-See Generating C++ Scanners, below, for additional information.
-.PP
-A number of options are available for lint purists who want to suppress
-the appearance of unneeded routines in the generated scanner. Each of the
-following, if unset
-(e.g.,
-.B %option nounput
-), results in the corresponding routine not appearing in
-the generated scanner:
-.nf
-
- input, unput
- yy_push_state, yy_pop_state, yy_top_state
- yy_scan_buffer, yy_scan_bytes, yy_scan_string
-
-.fi
-(though
-.B yy_push_state()
-and friends won't appear anyway unless you use
-.B %option stack).
-.SH PERFORMANCE CONSIDERATIONS
-The main design goal of
-.I flex
-is that it generate high-performance scanners. It has been optimized
-for dealing well with large sets of rules. Aside from the effects on
-scanner speed of the table compression
-.B \-C
-options outlined above,
-there are a number of options/actions which degrade performance. These
-are, from most expensive to least:
-.nf
-
- REJECT
- %option yylineno
- arbitrary trailing context
-
- pattern sets that require backing up
- %array
- %option interactive
- %option always-interactive
-
- '^' beginning-of-line operator
- yymore()
-
-.fi
-with the first three all being quite expensive and the last two
-being quite cheap. Note also that
-.B unput()
-is implemented as a routine call that potentially does quite a bit of
-work, while
-.B yyless()
-is a quite-cheap macro; so if just putting back some excess text you
-scanned, use
-.B yyless().
-.PP
-.B REJECT
-should be avoided at all costs when performance is important.
-It is a particularly expensive option.
-.PP
-Getting rid of backing up is messy and often may be an enormous
-amount of work for a complicated scanner. In principal, one begins
-by using the
-.B \-b
-flag to generate a
-.I lex.backup
-file. For example, on the input
-.nf
-
- %%
- foo return TOK_KEYWORD;
- foobar return TOK_KEYWORD;
-
-.fi
-the file looks like:
-.nf
-
- State #6 is non-accepting -
- associated rule line numbers:
- 2 3
- out-transitions: [ o ]
- jam-transitions: EOF [ \\001-n p-\\177 ]
-
- State #8 is non-accepting -
- associated rule line numbers:
- 3
- out-transitions: [ a ]
- jam-transitions: EOF [ \\001-` b-\\177 ]
-
- State #9 is non-accepting -
- associated rule line numbers:
- 3
- out-transitions: [ r ]
- jam-transitions: EOF [ \\001-q s-\\177 ]
-
- Compressed tables always back up.
-
-.fi
-The first few lines tell us that there's a scanner state in
-which it can make a transition on an 'o' but not on any other
-character, and that in that state the currently scanned text does not match
-any rule. The state occurs when trying to match the rules found
-at lines 2 and 3 in the input file.
-If the scanner is in that state and then reads
-something other than an 'o', it will have to back up to find
-a rule which is matched. With
-a bit of headscratching one can see that this must be the
-state it's in when it has seen "fo". When this has happened,
-if anything other than another 'o' is seen, the scanner will
-have to back up to simply match the 'f' (by the default rule).
-.PP
-The comment regarding State #8 indicates there's a problem
-when "foob" has been scanned. Indeed, on any character other
-than an 'a', the scanner will have to back up to accept "foo".
-Similarly, the comment for State #9 concerns when "fooba" has
-been scanned and an 'r' does not follow.
-.PP
-The final comment reminds us that there's no point going to
-all the trouble of removing backing up from the rules unless
-we're using
-.B \-Cf
-or
-.B \-CF,
-since there's no performance gain doing so with compressed scanners.
-.PP
-The way to remove the backing up is to add "error" rules:
-.nf
-
- %%
- foo return TOK_KEYWORD;
- foobar return TOK_KEYWORD;
-
- fooba |
- foob |
- fo {
- /* false alarm, not really a keyword */
- return TOK_ID;
- }
-
-.fi
-.PP
-Eliminating backing up among a list of keywords can also be
-done using a "catch-all" rule:
-.nf
-
- %%
- foo return TOK_KEYWORD;
- foobar return TOK_KEYWORD;
-
- [a-z]+ return TOK_ID;
-
-.fi
-This is usually the best solution when appropriate.
-.PP
-Backing up messages tend to cascade.
-With a complicated set of rules it's not uncommon to get hundreds
-of messages. If one can decipher them, though, it often
-only takes a dozen or so rules to eliminate the backing up (though
-it's easy to make a mistake and have an error rule accidentally match
-a valid token. A possible future
-.I flex
-feature will be to automatically add rules to eliminate backing up).
-.PP
-It's important to keep in mind that you gain the benefits of eliminating
-backing up only if you eliminate
-.I every
-instance of backing up. Leaving just one means you gain nothing.
-.PP
-.I Variable
-trailing context (where both the leading and trailing parts do not have
-a fixed length) entails almost the same performance loss as
-.B REJECT
-(i.e., substantial). So when possible a rule like:
-.nf
-
- %%
- mouse|rat/(cat|dog) run();
-
-.fi
-is better written:
-.nf
-
- %%
- mouse/cat|dog run();
- rat/cat|dog run();
-
-.fi
-or as
-.nf
-
- %%
- mouse|rat/cat run();
- mouse|rat/dog run();
-
-.fi
-Note that here the special '|' action does
-.I not
-provide any savings, and can even make things worse (see
-Deficiencies / Bugs below).
-.LP
-Another area where the user can increase a scanner's performance
-(and one that's easier to implement) arises from the fact that
-the longer the tokens matched, the faster the scanner will run.
-This is because with long tokens the processing of most input
-characters takes place in the (short) inner scanning loop, and
-does not often have to go through the additional work of setting up
-the scanning environment (e.g.,
-.B yytext)
-for the action. Recall the scanner for C comments:
-.nf
-
- %x comment
- %%
- int line_num = 1;
-
- "/*" BEGIN(comment);
-
- <comment>[^*\\n]*
- <comment>"*"+[^*/\\n]*
- <comment>\\n ++line_num;
- <comment>"*"+"/" BEGIN(INITIAL);
-
-.fi
-This could be sped up by writing it as:
-.nf
-
- %x comment
- %%
- int line_num = 1;
-
- "/*" BEGIN(comment);
-
- <comment>[^*\\n]*
- <comment>[^*\\n]*\\n ++line_num;
- <comment>"*"+[^*/\\n]*
- <comment>"*"+[^*/\\n]*\\n ++line_num;
- <comment>"*"+"/" BEGIN(INITIAL);
-
-.fi
-Now instead of each newline requiring the processing of another
-action, recognizing the newlines is "distributed" over the other rules
-to keep the matched text as long as possible. Note that
-.I adding
-rules does
-.I not
-slow down the scanner! The speed of the scanner is independent
-of the number of rules or (modulo the considerations given at the
-beginning of this section) how complicated the rules are with
-regard to operators such as '*' and '|'.
-.PP
-A final example in speeding up a scanner: suppose you want to scan
-through a file containing identifiers and keywords, one per line
-and with no other extraneous characters, and recognize all the
-keywords. A natural first approach is:
-.nf
-
- %%
- asm |
- auto |
- break |
- ... etc ...
- volatile |
- while /* it's a keyword */
-
- .|\\n /* it's not a keyword */
-
-.fi
-To eliminate the back-tracking, introduce a catch-all rule:
-.nf
-
- %%
- asm |
- auto |
- break |
- ... etc ...
- volatile |
- while /* it's a keyword */
-
- [a-z]+ |
- .|\\n /* it's not a keyword */
-
-.fi
-Now, if it's guaranteed that there's exactly one word per line,
-then we can reduce the total number of matches by a half by
-merging in the recognition of newlines with that of the other
-tokens:
-.nf
-
- %%
- asm\\n |
- auto\\n |
- break\\n |
- ... etc ...
- volatile\\n |
- while\\n /* it's a keyword */
-
- [a-z]+\\n |
- .|\\n /* it's not a keyword */
-
-.fi
-One has to be careful here, as we have now reintroduced backing up
-into the scanner. In particular, while
-.I we
-know that there will never be any characters in the input stream
-other than letters or newlines,
-.I flex
-can't figure this out, and it will plan for possibly needing to back up
-when it has scanned a token like "auto" and then the next character
-is something other than a newline or a letter. Previously it would
-then just match the "auto" rule and be done, but now it has no "auto"
-rule, only an "auto\\n" rule. To eliminate the possibility of backing up,
-we could either duplicate all rules but without final newlines, or,
-since we never expect to encounter such an input and therefore don't
-how it's classified, we can introduce one more catch-all rule, this
-one which doesn't include a newline:
-.nf
-
- %%
- asm\\n |
- auto\\n |
- break\\n |
- ... etc ...
- volatile\\n |
- while\\n /* it's a keyword */
-
- [a-z]+\\n |
- [a-z]+ |
- .|\\n /* it's not a keyword */
-
-.fi
-Compiled with
-.B \-Cf,
-this is about as fast as one can get a
-.I flex
-scanner to go for this particular problem.
-.PP
-A final note:
-.I flex
-is slow when matching NUL's, particularly when a token contains
-multiple NUL's.
-It's best to write rules which match
-.I short
-amounts of text if it's anticipated that the text will often include NUL's.
-.PP
-Another final note regarding performance: as mentioned above in the section
-How the Input is Matched, dynamically resizing
-.B yytext
-to accommodate huge tokens is a slow process because it presently requires that
-the (huge) token be rescanned from the beginning. Thus if performance is
-vital, you should attempt to match "large" quantities of text but not
-"huge" quantities, where the cutoff between the two is at about 8K
-characters/token.
-.SH GENERATING C++ SCANNERS
-.I flex
-provides two different ways to generate scanners for use with C++. The
-first way is to simply compile a scanner generated by
-.I flex
-using a C++ compiler instead of a C compiler. You should not encounter
-any compilations errors (please report any you find to the email address
-given in the Author section below). You can then use C++ code in your
-rule actions instead of C code. Note that the default input source for
-your scanner remains
-.I yyin,
-and default echoing is still done to
-.I yyout.
-Both of these remain
-.I FILE *
-variables and not C++
-.I streams.
-.PP
-You can also use
-.I flex
-to generate a C++ scanner class, using the
-.B \-+
-option (or, equivalently,
-.B %option c++),
-which is automatically specified if the name of the flex
-executable ends in a '+', such as
-.I flex++.
-When using this option, flex defaults to generating the scanner to the file
-.B lex.yy.cc
-instead of
-.B lex.yy.c.
-The generated scanner includes the header file
-.I FlexLexer.h,
-which defines the interface to two C++ classes.
-.PP
-The first class,
-.B FlexLexer,
-provides an abstract base class defining the general scanner class
-interface. It provides the following member functions:
-.TP
-.B const char* YYText()
-returns the text of the most recently matched token, the equivalent of
-.B yytext.
-.TP
-.B int YYLeng()
-returns the length of the most recently matched token, the equivalent of
-.B yyleng.
-.TP
-.B int lineno() const
-returns the current input line number
-(see
-.B %option yylineno),
-or
-.B 1
-if
-.B %option yylineno
-was not used.
-.TP
-.B void set_debug( int flag )
-sets the debugging flag for the scanner, equivalent to assigning to
-.B yy_flex_debug
-(see the Options section above). Note that you must build the scanner
-using
-.B %option debug
-to include debugging information in it.
-.TP
-.B int debug() const
-returns the current setting of the debugging flag.
-.PP
-Also provided are member functions equivalent to
-.B yy_switch_to_buffer(),
-.B yy_create_buffer()
-(though the first argument is an
-.B istream*
-object pointer and not a
-.B FILE*),
-.B yy_flush_buffer(),
-.B yy_delete_buffer(),
-and
-.B yyrestart()
-(again, the first argument is a
-.B istream*
-object pointer).
-.PP
-The second class defined in
-.I FlexLexer.h
-is
-.B yyFlexLexer,
-which is derived from
-.B FlexLexer.
-It defines the following additional member functions:
-.TP
-.B
-yyFlexLexer( istream* arg_yyin = 0, ostream* arg_yyout = 0 )
-constructs a
-.B yyFlexLexer
-object using the given streams for input and output. If not specified,
-the streams default to
-.B cin
-and
-.B cout,
-respectively.
-.TP
-.B virtual int yylex()
-performs the same role is
-.B yylex()
-does for ordinary flex scanners: it scans the input stream, consuming
-tokens, until a rule's action returns a value. If you derive a subclass
-.B S
-from
-.B yyFlexLexer
-and want to access the member functions and variables of
-.B S
-inside
-.B yylex(),
-then you need to use
-.B %option yyclass="S"
-to inform
-.I flex
-that you will be using that subclass instead of
-.B yyFlexLexer.
-In this case, rather than generating
-.B yyFlexLexer::yylex(),
-.I flex
-generates
-.B S::yylex()
-(and also generates a dummy
-.B yyFlexLexer::yylex()
-that calls
-.B yyFlexLexer::LexerError()
-if called).
-.TP
-.B
-virtual void switch_streams(istream* new_in = 0,
-.B
-ostream* new_out = 0)
-reassigns
-.B yyin
-to
-.B new_in
-(if non-nil)
-and
-.B yyout
-to
-.B new_out
-(ditto), deleting the previous input buffer if
-.B yyin
-is reassigned.
-.TP
-.B
-int yylex( istream* new_in, ostream* new_out = 0 )
-first switches the input streams via
-.B switch_streams( new_in, new_out )
-and then returns the value of
-.B yylex().
-.PP
-In addition,
-.B yyFlexLexer
-defines the following protected virtual functions which you can redefine
-in derived classes to tailor the scanner:
-.TP
-.B
-virtual int LexerInput( char* buf, int max_size )
-reads up to
-.B max_size
-characters into
-.B buf
-and returns the number of characters read. To indicate end-of-input,
-return 0 characters. Note that "interactive" scanners (see the
-.B \-B
-and
-.B \-I
-flags) define the macro
-.B YY_INTERACTIVE.
-If you redefine
-.B LexerInput()
-and need to take different actions depending on whether or not
-the scanner might be scanning an interactive input source, you can
-test for the presence of this name via
-.B #ifdef.
-.TP
-.B
-virtual void LexerOutput( const char* buf, int size )
-writes out
-.B size
-characters from the buffer
-.B buf,
-which, while NUL-terminated, may also contain "internal" NUL's if
-the scanner's rules can match text with NUL's in them.
-.TP
-.B
-virtual void LexerError( const char* msg )
-reports a fatal error message. The default version of this function
-writes the message to the stream
-.B cerr
-and exits.
-.PP
-Note that a
-.B yyFlexLexer
-object contains its
-.I entire
-scanning state. Thus you can use such objects to create reentrant
-scanners. You can instantiate multiple instances of the same
-.B yyFlexLexer
-class, and you can also combine multiple C++ scanner classes together
-in the same program using the
-.B \-P
-option discussed above.
-.PP
-Finally, note that the
-.B %array
-feature is not available to C++ scanner classes; you must use
-.B %pointer
-(the default).
-.PP
-Here is an example of a simple C++ scanner:
-.nf
-
- // An example of using the flex C++ scanner class.
-
- %{
- int mylineno = 0;
- %}
-
- string \\"[^\\n"]+\\"
-
- ws [ \\t]+
-
- alpha [A-Za-z]
- dig [0-9]
- name ({alpha}|{dig}|\\$)({alpha}|{dig}|[_.\\-/$])*
- num1 [-+]?{dig}+\\.?([eE][-+]?{dig}+)?
- num2 [-+]?{dig}*\\.{dig}+([eE][-+]?{dig}+)?
- number {num1}|{num2}
-
- %%
-
- {ws} /* skip blanks and tabs */
-
- "/*" {
- int c;
-
- while((c = yyinput()) != 0)
- {
- if(c == '\\n')
- ++mylineno;
-
- else if(c == '*')
- {
- if((c = yyinput()) == '/')
- break;
- else
- unput(c);
- }
- }
- }
-
- {number} cout << "number " << YYText() << '\\n';
-
- \\n mylineno++;
-
- {name} cout << "name " << YYText() << '\\n';
-
- {string} cout << "string " << YYText() << '\\n';
-
- %%
-
- int main( int /* argc */, char** /* argv */ )
- {
- FlexLexer* lexer = new yyFlexLexer;
- while(lexer->yylex() != 0)
- ;
- return 0;
- }
-.fi
-If you want to create multiple (different) lexer classes, you use the
-.B \-P
-flag (or the
-.B prefix=
-option) to rename each
-.B yyFlexLexer
-to some other
-.B xxFlexLexer.
-You then can include
-.B <FlexLexer.h>
-in your other sources once per lexer class, first renaming
-.B yyFlexLexer
-as follows:
-.nf
-
- #undef yyFlexLexer
- #define yyFlexLexer xxFlexLexer
- #include <FlexLexer.h>
-
- #undef yyFlexLexer
- #define yyFlexLexer zzFlexLexer
- #include <FlexLexer.h>
-
-.fi
-if, for example, you used
-.B %option prefix="xx"
-for one of your scanners and
-.B %option prefix="zz"
-for the other.
-.PP
-IMPORTANT: the present form of the scanning class is
-.I experimental
-and may change considerably between major releases.
-.SH INCOMPATIBILITIES WITH LEX AND POSIX
-.I flex
-is a rewrite of the AT&T Unix
-.I lex
-tool (the two implementations do not share any code, though),
-with some extensions and incompatibilities, both of which
-are of concern to those who wish to write scanners acceptable
-to either implementation. Flex is fully compliant with the POSIX
-.I lex
-specification, except that when using
-.B %pointer
-(the default), a call to
-.B unput()
-destroys the contents of
-.B yytext,
-which is counter to the POSIX specification.
-.PP
-In this section we discuss all of the known areas of incompatibility
-between flex, AT&T lex, and the POSIX specification.
-.PP
-.I flex's
-.B \-l
-option turns on maximum compatibility with the original AT&T
-.I lex
-implementation, at the cost of a major loss in the generated scanner's
-performance. We note below which incompatibilities can be overcome
-using the
-.B \-l
-option.
-.PP
-.I flex
-is fully compatible with
-.I lex
-with the following exceptions:
-.IP -
-The undocumented
-.I lex
-scanner internal variable
-.B yylineno
-is not supported unless
-.B \-l
-or
-.B %option yylineno
-is used.
-.IP
-.B yylineno
-should be maintained on a per-buffer basis, rather than a per-scanner
-(single global variable) basis.
-.IP
-.B yylineno
-is not part of the POSIX specification.
-.IP -
-The
-.B input()
-routine is not redefinable, though it may be called to read characters
-following whatever has been matched by a rule. If
-.B input()
-encounters an end-of-file the normal
-.B yywrap()
-processing is done. A ``real'' end-of-file is returned by
-.B input()
-as
-.I EOF.
-.IP
-Input is instead controlled by defining the
-.B YY_INPUT
-macro.
-.IP
-The
-.I flex
-restriction that
-.B input()
-cannot be redefined is in accordance with the POSIX specification,
-which simply does not specify any way of controlling the
-scanner's input other than by making an initial assignment to
-.I yyin.
-.IP -
-The
-.B unput()
-routine is not redefinable. This restriction is in accordance with POSIX.
-.IP -
-.I flex
-scanners are not as reentrant as
-.I lex
-scanners. In particular, if you have an interactive scanner and
-an interrupt handler which long-jumps out of the scanner, and
-the scanner is subsequently called again, you may get the following
-message:
-.nf
-
- fatal flex scanner internal error--end of buffer missed
-
-.fi
-To reenter the scanner, first use
-.nf
-
- yyrestart( yyin );
-
-.fi
-Note that this call will throw away any buffered input; usually this
-isn't a problem with an interactive scanner.
-.IP
-Also note that flex C++ scanner classes
-.I are
-reentrant, so if using C++ is an option for you, you should use
-them instead. See "Generating C++ Scanners" above for details.
-.IP -
-.B output()
-is not supported.
-Output from the
-.B ECHO
-macro is done to the file-pointer
-.I yyout
-(default
-.I stdout).
-.IP
-.B output()
-is not part of the POSIX specification.
-.IP -
-.I lex
-does not support exclusive start conditions (%x), though they
-are in the POSIX specification.
-.IP -
-When definitions are expanded,
-.I flex
-encloses them in parentheses.
-With lex, the following:
-.nf
-
- NAME [A-Z][A-Z0-9]*
- %%
- foo{NAME}? printf( "Found it\\n" );
- %%
-
-.fi
-will not match the string "foo" because when the macro
-is expanded the rule is equivalent to "foo[A-Z][A-Z0-9]*?"
-and the precedence is such that the '?' is associated with
-"[A-Z0-9]*". With
-.I flex,
-the rule will be expanded to
-"foo([A-Z][A-Z0-9]*)?" and so the string "foo" will match.
-.IP
-Note that if the definition begins with
-.B ^
-or ends with
-.B $
-then it is
-.I not
-expanded with parentheses, to allow these operators to appear in
-definitions without losing their special meanings. But the
-.B <s>, /,
-and
-.B <<EOF>>
-operators cannot be used in a
-.I flex
-definition.
-.IP
-Using
-.B \-l
-results in the
-.I lex
-behavior of no parentheses around the definition.
-.IP
-The POSIX specification is that the definition be enclosed in parentheses.
-.IP -
-Some implementations of
-.I lex
-allow a rule's action to begin on a separate line, if the rule's pattern
-has trailing whitespace:
-.nf
-
- %%
- foo|bar<space here>
- { foobar_action(); }
-
-.fi
-.I flex
-does not support this feature.
-.IP -
-The
-.I lex
-.B %r
-(generate a Ratfor scanner) option is not supported. It is not part
-of the POSIX specification.
-.IP -
-After a call to
-.B unput(),
-.I yytext
-is undefined until the next token is matched, unless the scanner
-was built using
-.B %array.
-This is not the case with
-.I lex
-or the POSIX specification. The
-.B \-l
-option does away with this incompatibility.
-.IP -
-The precedence of the
-.B {}
-(numeric range) operator is different.
-.I lex
-interprets "abc{1,3}" as "match one, two, or
-three occurrences of 'abc'", whereas
-.I flex
-interprets it as "match 'ab'
-followed by one, two, or three occurrences of 'c'". The latter is
-in agreement with the POSIX specification.
-.IP -
-The precedence of the
-.B ^
-operator is different.
-.I lex
-interprets "^foo|bar" as "match either 'foo' at the beginning of a line,
-or 'bar' anywhere", whereas
-.I flex
-interprets it as "match either 'foo' or 'bar' if they come at the beginning
-of a line". The latter is in agreement with the POSIX specification.
-.IP -
-The special table-size declarations such as
-.B %a
-supported by
-.I lex
-are not required by
-.I flex
-scanners;
-.I flex
-ignores them.
-.IP -
-The name
-.B FLEX_SCANNER
-is #define'd so scanners may be written for use with either
-.I flex
-or
-.I lex.
-Scanners also include
-.B YY_FLEX_MAJOR_VERSION
-and
-.B YY_FLEX_MINOR_VERSION
-indicating which version of
-.I flex
-generated the scanner
-(for example, for the 2.5 release, these defines would be 2 and 5
-respectively).
-.PP
-The following
-.I flex
-features are not included in
-.I lex
-or the POSIX specification:
-.nf
-
- C++ scanners
- %option
- start condition scopes
- start condition stacks
- interactive/non-interactive scanners
- yy_scan_string() and friends
- yyterminate()
- yy_set_interactive()
- yy_set_bol()
- YY_AT_BOL()
- <<EOF>>
- <*>
- YY_DECL
- YY_START
- YY_USER_ACTION
- YY_USER_INIT
- #line directives
- %{}'s around actions
- multiple actions on a line
-
-.fi
-plus almost all of the flex flags.
-The last feature in the list refers to the fact that with
-.I flex
-you can put multiple actions on the same line, separated with
-semi-colons, while with
-.I lex,
-the following
-.nf
-
- foo handle_foo(); ++num_foos_seen;
-
-.fi
-is (rather surprisingly) truncated to
-.nf
-
- foo handle_foo();
-
-.fi
-.I flex
-does not truncate the action. Actions that are not enclosed in
-braces are simply terminated at the end of the line.
-.SH DIAGNOSTICS
-.I warning, rule cannot be matched
-indicates that the given rule
-cannot be matched because it follows other rules that will
-always match the same text as it. For
-example, in the following "foo" cannot be matched because it comes after
-an identifier "catch-all" rule:
-.nf
-
- [a-z]+ got_identifier();
- foo got_foo();
-
-.fi
-Using
-.B REJECT
-in a scanner suppresses this warning.
-.PP
-.I warning,
-.B \-s
-.I
-option given but default rule can be matched
-means that it is possible (perhaps only in a particular start condition)
-that the default rule (match any single character) is the only one
-that will match a particular input. Since
-.B \-s
-was given, presumably this is not intended.
-.PP
-.I reject_used_but_not_detected undefined
-or
-.I yymore_used_but_not_detected undefined -
-These errors can occur at compile time. They indicate that the
-scanner uses
-.B REJECT
-or
-.B yymore()
-but that
-.I flex
-failed to notice the fact, meaning that
-.I flex
-scanned the first two sections looking for occurrences of these actions
-and failed to find any, but somehow you snuck some in (via a #include
-file, for example). Use
-.B %option reject
-or
-.B %option yymore
-to indicate to flex that you really do use these features.
-.PP
-.I flex scanner jammed -
-a scanner compiled with
-.B \-s
-has encountered an input string which wasn't matched by
-any of its rules. This error can also occur due to internal problems.
-.PP
-.I token too large, exceeds YYLMAX -
-your scanner uses
-.B %array
-and one of its rules matched a string longer than the
-.B YYLMAX
-constant (8K bytes by default). You can increase the value by
-#define'ing
-.B YYLMAX
-in the definitions section of your
-.I flex
-input.
-.PP
-.I scanner requires \-8 flag to
-.I use the character 'x' -
-Your scanner specification includes recognizing the 8-bit character
-.I 'x'
-and you did not specify the \-8 flag, and your scanner defaulted to 7-bit
-because you used the
-.B \-Cf
-or
-.B \-CF
-table compression options. See the discussion of the
-.B \-7
-flag for details.
-.PP
-.I flex scanner push-back overflow -
-you used
-.B unput()
-to push back so much text that the scanner's buffer could not hold
-both the pushed-back text and the current token in
-.B yytext.
-Ideally the scanner should dynamically resize the buffer in this case, but at
-present it does not.
-.PP
-.I
-input buffer overflow, can't enlarge buffer because scanner uses REJECT -
-the scanner was working on matching an extremely large token and needed
-to expand the input buffer. This doesn't work with scanners that use
-.B
-REJECT.
-.PP
-.I
-fatal flex scanner internal error--end of buffer missed -
-This can occur in a scanner which is reentered after a long-jump
-has jumped out (or over) the scanner's activation frame. Before
-reentering the scanner, use:
-.nf
-
- yyrestart( yyin );
-
-.fi
-or, as noted above, switch to using the C++ scanner class.
-.PP
-.I too many start conditions in <> construct! -
-you listed more start conditions in a <> construct than exist (so
-you must have listed at least one of them twice).
-.SH FILES
-.TP
-.B \-ll
-library with which scanners must be linked.
-.TP
-.I lex.yy.c
-generated scanner (called
-.I lexyy.c
-on some systems).
-.TP
-.I lex.yy.cc
-generated C++ scanner class, when using
-.B -+.
-.TP
-.I <FlexLexer.h>
-header file defining the C++ scanner base class,
-.B FlexLexer,
-and its derived class,
-.B yyFlexLexer.
-.TP
-.I flex.skl
-skeleton scanner. This file is only used when building flex, not when
-flex executes.
-.TP
-.I lex.backup
-backing-up information for
-.B \-b
-flag (called
-.I lex.bck
-on some systems).
-.SH DEFICIENCIES / BUGS
-Some trailing context
-patterns cannot be properly matched and generate
-warning messages ("dangerous trailing context"). These are
-patterns where the ending of the
-first part of the rule matches the beginning of the second
-part, such as "zx*/xy*", where the 'x*' matches the 'x' at
-the beginning of the trailing context. (Note that the POSIX draft
-states that the text matched by such patterns is undefined.)
-.PP
-For some trailing context rules, parts which are actually fixed-length are
-not recognized as such, leading to the above mentioned performance loss.
-In particular, parts using '|' or {n} (such as "foo{3}") are always
-considered variable-length.
-.PP
-Combining trailing context with the special '|' action can result in
-.I fixed
-trailing context being turned into the more expensive
-.I variable
-trailing context. For example, in the following:
-.nf
-
- %%
- abc |
- xyz/def
-
-.fi
-.PP
-Use of
-.B unput()
-invalidates yytext and yyleng, unless the
-.B %array
-directive
-or the
-.B \-l
-option has been used.
-.PP
-Pattern-matching of NUL's is substantially slower than matching other
-characters.
-.PP
-Dynamic resizing of the input buffer is slow, as it entails rescanning
-all the text matched so far by the current (generally huge) token.
-.PP
-Due to both buffering of input and read-ahead, you cannot intermix
-calls to <stdio.h> routines, such as, for example,
-.B getchar(),
-with
-.I flex
-rules and expect it to work. Call
-.B input()
-instead.
-.PP
-The total table entries listed by the
-.B \-v
-flag excludes the number of table entries needed to determine
-what rule has been matched. The number of entries is equal
-to the number of DFA states if the scanner does not use
-.B REJECT,
-and somewhat greater than the number of states if it does.
-.PP
-.B REJECT
-cannot be used with the
-.B \-f
-or
-.B \-F
-options.
-.PP
-The
-.I flex
-internal algorithms need documentation.
-.SH SEE ALSO
-lex(1), yacc(1), sed(1), awk(1).
-.PP
-John Levine, Tony Mason, and Doug Brown,
-.I Lex & Yacc,
-O'Reilly and Associates. Be sure to get the 2nd edition.
-.PP
-M. E. Lesk and E. Schmidt,
-.I LEX \- Lexical Analyzer Generator
-.PP
-Alfred Aho, Ravi Sethi and Jeffrey Ullman,
-.I Compilers: Principles, Techniques and Tools,
-Addison-Wesley (1986). Describes the pattern-matching techniques used by
-.I flex
-(deterministic finite automata).
-.SH AUTHOR
-Vern Paxson, with the help of many ideas and much inspiration from
-Van Jacobson. Original version by Jef Poskanzer. The fast table
-representation is a partial implementation of a design done by Van
-Jacobson. The implementation was done by Kevin Gong and Vern Paxson.
-.PP
-Thanks to the many
-.I flex
-beta-testers, feedbackers, and contributors, especially Francois Pinard,
-Casey Leedom,
-Robert Abramovitz,
-Stan Adermann, Terry Allen, David Barker-Plummer, John Basrai,
-Neal Becker, Nelson H.F. Beebe, benson@odi.com,
-Karl Berry, Peter A. Bigot, Simon Blanchard,
-Keith Bostic, Frederic Brehm, Ian Brockbank, Kin Cho, Nick Christopher,
-Brian Clapper, J.T. Conklin,
-Jason Coughlin, Bill Cox, Nick Cropper, Dave Curtis, Scott David
-Daniels, Chris G. Demetriou, Theo Deraadt,
-Mike Donahue, Chuck Doucette, Tom Epperly, Leo Eskin,
-Chris Faylor, Chris Flatters, Jon Forrest, Jeffrey Friedl,
-Joe Gayda, Kaveh R. Ghazi, Wolfgang Glunz,
-Eric Goldman, Christopher M. Gould, Ulrich Grepel, Peer Griebel,
-Jan Hajic, Charles Hemphill, NORO Hideo,
-Jarkko Hietaniemi, Scott Hofmann,
-Jeff Honig, Dana Hudes, Eric Hughes, John Interrante,
-Ceriel Jacobs, Michal Jaegermann, Sakari Jalovaara, Jeffrey R. Jones,
-Henry Juengst, Klaus Kaempf, Jonathan I. Kamens, Terrence O Kane,
-Amir Katz, ken@ken.hilco.com, Kevin B. Kenny,
-Steve Kirsch, Winfried Koenig, Marq Kole, Ronald Lamprecht,
-Greg Lee, Rohan Lenard, Craig Leres, John Levine, Steve Liddle,
-David Loffredo, Mike Long,
-Mohamed el Lozy, Brian Madsen, Malte, Joe Marshall,
-Bengt Martensson, Chris Metcalf,
-Luke Mewburn, Jim Meyering, R. Alexander Milowski, Erik Naggum,
-G.T. Nicol, Landon Noll, James Nordby, Marc Nozell,
-Richard Ohnemus, Karsten Pahnke,
-Sven Panne, Roland Pesch, Walter Pelissero, Gaumond
-Pierre, Esmond Pitt, Jef Poskanzer, Joe Rahmeh, Jarmo Raiha,
-Frederic Raimbault, Pat Rankin, Rick Richardson,
-Kevin Rodgers, Kai Uwe Rommel, Jim Roskind, Alberto Santini,
-Andreas Scherer, Darrell Schiebel, Raf Schietekat,
-Doug Schmidt, Philippe Schnoebelen, Andreas Schwab,
-Larry Schwimmer, Alex Siegel, Eckehard Stolz, Jan-Erik Strvmquist,
-Mike Stump, Paul Stuart, Dave Tallman, Ian Lance Taylor,
-Chris Thewalt, Richard M. Timoney, Jodi Tsai,
-Paul Tuinenga, Gary Weik, Frank Whaley, Gerhard Wilhelms, Kent Williams, Ken
-Yap, Ron Zellar, Nathan Zelle, David Zuhn,
-and those whose names have slipped my marginal
-mail-archiving skills but whose contributions are appreciated all the
-same.
-.PP
-Thanks to Keith Bostic, Jon Forrest, Noah Friedman,
-John Gilmore, Craig Leres, John Levine, Bob Mulcahy, G.T.
-Nicol, Francois Pinard, Rich Salz, and Richard Stallman for help with various
-distribution headaches.
-.PP
-Thanks to Esmond Pitt and Earle Horton for 8-bit character support; to
-Benson Margulies and Fred Burke for C++ support; to Kent Williams and Tom
-Epperly for C++ class support; to Ove Ewerlid for support of NUL's; and to
-Eric Hughes for support of multiple buffers.
-.PP
-This work was primarily done when I was with the Real Time Systems Group
-at the Lawrence Berkeley Laboratory in Berkeley, CA. Many thanks to all there
-for the support I received.
-.PP
-Send comments to vern@ee.lbl.gov.
diff --git a/usr.bin/lex/lib/Makefile b/usr.bin/lex/lib/Makefile
deleted file mode 100644
index dcc7518..0000000
--- a/usr.bin/lex/lib/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-# $FreeBSD$
-
-.include <bsd.own.mk>
-
-LIB= ln
-SRCS= libmain.c libyywrap.c
-NO_PIC=
-
-.if ${MK_INSTALLLIB} != "no"
-LINKS= ${LIBDIR}/libln.a ${LIBDIR}/libl.a
-LINKS+= ${LIBDIR}/libln.a ${LIBDIR}/libfl.a
-.endif
-
-.if ${MK_PROFILE} != "no"
-LINKS+= ${LIBDIR}/libln_p.a ${LIBDIR}/libl_p.a
-LINKS+= ${LIBDIR}/libln_p.a ${LIBDIR}/libfl_p.a
-.endif
-
-.include <bsd.lib.mk>
-
diff --git a/usr.bin/lex/lib/libmain.c b/usr.bin/lex/lib/libmain.c
deleted file mode 100644
index 426eb98..0000000
--- a/usr.bin/lex/lib/libmain.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/* libmain - flex run-time support library "main" function */
-
-/* $Header: /home/daffy/u0/vern/flex/RCS/libmain.c,v 1.4 95/09/27 12:47:55 vern Exp $
- * $FreeBSD$ */
-
-extern int yylex();
-
-int main( argc, argv )
-int argc;
-char *argv[];
- {
- while ( yylex() != 0 )
- ;
-
- return 0;
- }
diff --git a/usr.bin/lex/lib/libyywrap.c b/usr.bin/lex/lib/libyywrap.c
deleted file mode 100644
index 75c669c..0000000
--- a/usr.bin/lex/lib/libyywrap.c
+++ /dev/null
@@ -1,9 +0,0 @@
-/* libyywrap - flex run-time support library "yywrap" function */
-
-/* $Header: /home/daffy/u0/vern/flex/RCS/libyywrap.c,v 1.1 93/10/02 15:23:09 vern Exp $
- * $FreeBSD$ */
-
-int yywrap()
- {
- return 1;
- }
diff --git a/usr.bin/lex/main.c b/usr.bin/lex/main.c
deleted file mode 100644
index f6adaa7..0000000
--- a/usr.bin/lex/main.c
+++ /dev/null
@@ -1,1179 +0,0 @@
-/* flex - tool to generate fast lexical analyzers */
-
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Vern Paxson.
- *
- * The United States Government has rights in this work pursuant
- * to contract no. DE-AC03-76SF00098 between the United States
- * Department of Energy and the University of California.
- *
- * Redistribution and use in source and binary forms are permitted provided
- * that: (1) source distributions retain this entire copyright notice and
- * comment, and (2) distributions including binaries display the following
- * acknowledgement: ``This product includes software developed by the
- * University of California, Berkeley and its contributors'' in the
- * documentation or other materials provided with the distribution and in
- * all advertising materials mentioning features or use of this software.
- * Neither the name of the University nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#ifndef lint
-char copyright[] =
-"@(#) Copyright (c) 1990 The Regents of the University of California.\n\
- All rights reserved.\n";
-#endif /* not lint */
-
-/* $Header: /home/daffy/u0/vern/flex/RCS/main.c,v 2.64 96/05/25 20:42:42 vern Exp $ */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-
-#include "flexdef.h"
-#include "version.h"
-
-static char flex_version[] = FLEX_VERSION;
-
-
-/* declare functions that have forward references */
-
-void flexinit PROTO((int, char**));
-void readin PROTO((void));
-void set_up_initial_allocations PROTO((void));
-
-#ifdef NEED_ARGV_FIXUP
-extern void argv_fixup PROTO((int *, char ***));
-#endif
-
-
-/* these globals are all defined and commented in flexdef.h */
-int printstats, syntaxerror, eofseen, ddebug, trace, nowarn, spprdflt;
-int interactive, caseins, lex_compat, do_yylineno, useecs, fulltbl, usemecs;
-int fullspd, gen_line_dirs, performance_report, backing_up_report;
-int C_plus_plus, long_align, use_read, yytext_is_array, do_yywrap, csize;
-int yymore_used, reject, real_reject, continued_action, in_rule;
-int yymore_really_used, reject_really_used;
-int datapos, dataline, linenum, out_linenum;
-FILE *skelfile = NULL;
-int skel_ind = 0;
-char *action_array;
-int action_size, defs1_offset, prolog_offset, action_offset, action_index;
-char *infilename = NULL, *outfilename = NULL;
-int did_outfilename;
-char *prefix, *yyclass;
-int do_stdinit, use_stdout;
-int onestate[ONE_STACK_SIZE], onesym[ONE_STACK_SIZE];
-int onenext[ONE_STACK_SIZE], onedef[ONE_STACK_SIZE], onesp;
-int current_mns, current_max_rules;
-int num_rules, num_eof_rules, default_rule, lastnfa;
-int *firstst, *lastst, *finalst, *transchar, *trans1, *trans2;
-int *accptnum, *assoc_rule, *state_type;
-int *rule_type, *rule_linenum, *rule_useful;
-int current_state_type;
-int variable_trailing_context_rules;
-int numtemps, numprots, protprev[MSP], protnext[MSP], prottbl[MSP];
-int protcomst[MSP], firstprot, lastprot, protsave[PROT_SAVE_SIZE];
-int numecs, nextecm[CSIZE + 1], ecgroup[CSIZE + 1], nummecs, tecfwd[CSIZE + 1];
-int tecbck[CSIZE + 1];
-int lastsc, *scset, *scbol, *scxclu, *sceof;
-int current_max_scs;
-char **scname;
-int current_max_dfa_size, current_max_xpairs;
-int current_max_template_xpairs, current_max_dfas;
-int lastdfa, *nxt, *chk, *tnxt;
-int *base, *def, *nultrans, NUL_ec, tblend, firstfree, **dss, *dfasiz;
-union dfaacc_union *dfaacc;
-int *accsiz, *dhash, numas;
-int numsnpairs, jambase, jamstate;
-int lastccl, *cclmap, *ccllen, *cclng, cclreuse;
-int current_maxccls, current_max_ccl_tbl_size;
-Char *ccltbl;
-char nmstr[MAXLINE];
-int sectnum, nummt, hshcol, dfaeql, numeps, eps2, num_reallocs;
-int tmpuses, totnst, peakpairs, numuniq, numdup, hshsave;
-int num_backing_up, bol_needed;
-FILE *backing_up_file;
-int end_of_buffer_state;
-char **input_files;
-int num_input_files;
-
-/* Make sure program_name is initialized so we don't crash if writing
- * out an error message before getting the program name from argv[0].
- */
-char *program_name = "flex";
-
-#ifndef SHORT_FILE_NAMES
-static char *outfile_template = "lex.%s.%s";
-static char *backing_name = "lex.backup";
-#else
-static char *outfile_template = "lex%s.%s";
-static char *backing_name = "lex.bck";
-#endif
-
-#ifdef THINK_C
-#include <console.h>
-#endif
-
-#ifdef MS_DOS
-extern unsigned _stklen = 16384;
-#endif
-
-static char outfile_path[MAXLINE];
-static int outfile_created = 0;
-static char *skelname = NULL;
-
-
-int main( argc, argv )
-int argc;
-char **argv;
- {
- int i;
-
-#ifdef THINK_C
- argc = ccommand( &argv );
-#endif
-#ifdef NEED_ARGV_FIXUP
- argv_fixup( &argc, &argv );
-#endif
-
- flexinit( argc, argv );
-
- readin();
-
- ntod();
-
- for ( i = 1; i <= num_rules; ++i )
- if ( ! rule_useful[i] && i != default_rule )
- line_warning( _( "rule cannot be matched" ),
- rule_linenum[i] );
-
- if ( spprdflt && ! reject && rule_useful[default_rule] )
- line_warning(
- _( "-s option given but default rule can be matched" ),
- rule_linenum[default_rule] );
-
- /* Generate the C state transition tables from the DFA. */
- make_tables();
-
- /* Note, flexend does not return. It exits with its argument
- * as status.
- */
- flexend( 0 );
-
- return 0; /* keep compilers/lint happy */
- }
-
-
-/* check_options - check user-specified options */
-
-void check_options()
- {
- int i;
-
- if ( lex_compat )
- {
- if ( C_plus_plus )
- flexerror( _( "Can't use -+ with -l option" ) );
-
- if ( fulltbl || fullspd )
- flexerror( _( "Can't use -f or -F with -l option" ) );
-
- /* Don't rely on detecting use of yymore() and REJECT,
- * just assume they'll be used.
- */
- yymore_really_used = reject_really_used = true;
-
- yytext_is_array = true;
- do_yylineno = true;
- use_read = false;
- }
-
- if ( do_yylineno )
- /* This should really be "maintain_backup_tables = true" */
- reject_really_used = true;
-
- if ( csize == unspecified )
- {
- if ( (fulltbl || fullspd) && ! useecs )
- csize = DEFAULT_CSIZE;
- else
- csize = CSIZE;
- }
-
- if ( interactive == unspecified )
- {
- if ( fulltbl || fullspd )
- interactive = false;
- else
- interactive = true;
- }
-
- if ( fulltbl || fullspd )
- {
- if ( usemecs )
- flexerror(
- _( "-Cf/-CF and -Cm don't make sense together" ) );
-
- if ( interactive )
- flexerror( _( "-Cf/-CF and -I are incompatible" ) );
-
- if ( lex_compat )
- flexerror(
- _( "-Cf/-CF are incompatible with lex-compatibility mode" ) );
-
- if ( do_yylineno )
- flexerror(
- _( "-Cf/-CF and %option yylineno are incompatible" ) );
-
- if ( fulltbl && fullspd )
- flexerror( _( "-Cf and -CF are mutually exclusive" ) );
- }
-
- if ( C_plus_plus && fullspd )
- flexerror( _( "Can't use -+ with -CF option" ) );
-
- if ( C_plus_plus && yytext_is_array )
- {
- warn( _( "%array incompatible with -+ option" ) );
- yytext_is_array = false;
- }
-
- if ( useecs )
- { /* Set up doubly-linked equivalence classes. */
-
- /* We loop all the way up to csize, since ecgroup[csize] is
- * the position used for NUL characters.
- */
- ecgroup[1] = NIL;
-
- for ( i = 2; i <= csize; ++i )
- {
- ecgroup[i] = i - 1;
- nextecm[i - 1] = i;
- }
-
- nextecm[csize] = NIL;
- }
-
- else
- {
- /* Put everything in its own equivalence class. */
- for ( i = 1; i <= csize; ++i )
- {
- ecgroup[i] = i;
- nextecm[i] = BAD_SUBSCRIPT; /* to catch errors */
- }
- }
-
- if ( ! use_stdout )
- {
- FILE *prev_stdout;
-
- if ( ! did_outfilename )
- {
- char *suffix;
-
- if ( C_plus_plus )
- suffix = "cc";
- else
- suffix = "c";
-
- sprintf( outfile_path, outfile_template,
- prefix, suffix );
-
- outfilename = outfile_path;
- }
-
- prev_stdout = freopen( outfilename, "w", stdout );
-
- if ( prev_stdout == NULL )
- lerrsf( _( "could not create %s" ), outfilename );
-
- outfile_created = 1;
- }
-
- if ( skelname && (skelfile = fopen( skelname, "r" )) == NULL )
- lerrsf( _( "can't open skeleton file %s" ), skelname );
-
- if ( strcmp( prefix, "yy" ) )
- {
-#define GEN_PREFIX(name) out_str3( "#define yy%s %s%s\n", name, prefix, name )
- if ( C_plus_plus )
- GEN_PREFIX( "FlexLexer" );
- else
- {
- GEN_PREFIX( "_create_buffer" );
- GEN_PREFIX( "_delete_buffer" );
- GEN_PREFIX( "_scan_buffer" );
- GEN_PREFIX( "_scan_string" );
- GEN_PREFIX( "_scan_bytes" );
- GEN_PREFIX( "_flex_debug" );
- GEN_PREFIX( "_init_buffer" );
- GEN_PREFIX( "_flush_buffer" );
- GEN_PREFIX( "_load_buffer_state" );
- GEN_PREFIX( "_switch_to_buffer" );
- GEN_PREFIX( "in" );
- GEN_PREFIX( "leng" );
- GEN_PREFIX( "lex" );
- GEN_PREFIX( "out" );
- GEN_PREFIX( "restart" );
- GEN_PREFIX( "text" );
-
- if ( do_yylineno )
- GEN_PREFIX( "lineno" );
- }
-
- if ( do_yywrap )
- GEN_PREFIX( "wrap" );
-
- outn( "" );
- }
-
- if ( did_outfilename )
- line_directive_out( stdout, 0 );
-
- skelout();
- }
-
-
-/* flexend - terminate flex
- *
- * note
- * This routine does not return.
- */
-
-void flexend( exit_status )
-int exit_status;
-
- {
- int tblsiz;
- int unlink();
-
- if ( skelfile != NULL )
- {
- if ( ferror( skelfile ) )
- lerrsf( _( "input error reading skeleton file %s" ),
- skelname );
-
- else if ( fclose( skelfile ) )
- lerrsf( _( "error closing skeleton file %s" ),
- skelname );
- }
-
- if ( exit_status != 0 && outfile_created )
- {
- if ( ferror( stdout ) )
- lerrsf( _( "error writing output file %s" ),
- outfilename );
-
- else if ( fclose( stdout ) )
- lerrsf( _( "error closing output file %s" ),
- outfilename );
-
- else if ( unlink( outfilename ) )
- lerrsf( _( "error deleting output file %s" ),
- outfilename );
- }
-
- if ( backing_up_report && backing_up_file )
- {
- if ( num_backing_up == 0 )
- fprintf( backing_up_file, _( "No backing up.\n" ) );
- else if ( fullspd || fulltbl )
- fprintf( backing_up_file,
- _( "%d backing up (non-accepting) states.\n" ),
- num_backing_up );
- else
- fprintf( backing_up_file,
- _( "Compressed tables always back up.\n" ) );
-
- if ( ferror( backing_up_file ) )
- lerrsf( _( "error writing backup file %s" ),
- backing_name );
-
- else if ( fclose( backing_up_file ) )
- lerrsf( _( "error closing backup file %s" ),
- backing_name );
- }
-
- if ( printstats )
- {
- fprintf( stderr, _( "%s version %s usage statistics:\n" ),
- program_name, flex_version );
-
- fprintf( stderr, _( " scanner options: -" ) );
-
- if ( C_plus_plus )
- putc( '+', stderr );
- if ( backing_up_report )
- putc( 'b', stderr );
- if ( ddebug )
- putc( 'd', stderr );
- if ( caseins )
- putc( 'i', stderr );
- if ( lex_compat )
- putc( 'l', stderr );
- if ( performance_report > 0 )
- putc( 'p', stderr );
- if ( performance_report > 1 )
- putc( 'p', stderr );
- if ( spprdflt )
- putc( 's', stderr );
- if ( use_stdout )
- putc( 't', stderr );
- if ( printstats )
- putc( 'v', stderr ); /* always true! */
- if ( nowarn )
- putc( 'w', stderr );
- if ( interactive == false )
- putc( 'B', stderr );
- if ( interactive == true )
- putc( 'I', stderr );
- if ( ! gen_line_dirs )
- putc( 'L', stderr );
- if ( trace )
- putc( 'T', stderr );
-
- if ( csize == unspecified )
- /* We encountered an error fairly early on, so csize
- * never got specified. Define it now, to prevent
- * bogus table sizes being written out below.
- */
- csize = 256;
-
- if ( csize == 128 )
- putc( '7', stderr );
- else
- putc( '8', stderr );
-
- fprintf( stderr, " -C" );
-
- if ( long_align )
- putc( 'a', stderr );
- if ( fulltbl )
- putc( 'f', stderr );
- if ( fullspd )
- putc( 'F', stderr );
- if ( useecs )
- putc( 'e', stderr );
- if ( usemecs )
- putc( 'm', stderr );
- if ( use_read )
- putc( 'r', stderr );
-
- if ( did_outfilename )
- fprintf( stderr, " -o%s", outfilename );
-
- if ( skelname )
- fprintf( stderr, " -S%s", skelname );
-
- if ( strcmp( prefix, "yy" ) )
- fprintf( stderr, " -P%s", prefix );
-
- putc( '\n', stderr );
-
- fprintf( stderr, _( " %d/%d NFA states\n" ),
- lastnfa, current_mns );
- fprintf( stderr, _( " %d/%d DFA states (%d words)\n" ),
- lastdfa, current_max_dfas, totnst );
- fprintf( stderr, _( " %d rules\n" ),
- num_rules + num_eof_rules - 1 /* - 1 for def. rule */ );
-
- if ( num_backing_up == 0 )
- fprintf( stderr, _( " No backing up\n" ) );
- else if ( fullspd || fulltbl )
- fprintf( stderr,
- _( " %d backing-up (non-accepting) states\n" ),
- num_backing_up );
- else
- fprintf( stderr,
- _( " Compressed tables always back-up\n" ) );
-
- if ( bol_needed )
- fprintf( stderr,
- _( " Beginning-of-line patterns used\n" ) );
-
- fprintf( stderr, _( " %d/%d start conditions\n" ), lastsc,
- current_max_scs );
- fprintf( stderr,
- _( " %d epsilon states, %d double epsilon states\n" ),
- numeps, eps2 );
-
- if ( lastccl == 0 )
- fprintf( stderr, _( " no character classes\n" ) );
- else
- fprintf( stderr,
-_( " %d/%d character classes needed %d/%d words of storage, %d reused\n" ),
- lastccl, current_maxccls,
- cclmap[lastccl] + ccllen[lastccl],
- current_max_ccl_tbl_size, cclreuse );
-
- fprintf( stderr, _( " %d state/nextstate pairs created\n" ),
- numsnpairs );
- fprintf( stderr, _( " %d/%d unique/duplicate transitions\n" ),
- numuniq, numdup );
-
- if ( fulltbl )
- {
- tblsiz = lastdfa * numecs;
- fprintf( stderr, _( " %d table entries\n" ), tblsiz );
- }
-
- else
- {
- tblsiz = 2 * (lastdfa + numtemps) + 2 * tblend;
-
- fprintf( stderr,
- _( " %d/%d base-def entries created\n" ),
- lastdfa + numtemps, current_max_dfas );
- fprintf( stderr,
- _( " %d/%d (peak %d) nxt-chk entries created\n" ),
- tblend, current_max_xpairs, peakpairs );
- fprintf( stderr,
- _( " %d/%d (peak %d) template nxt-chk entries created\n" ),
- numtemps * nummecs,
- current_max_template_xpairs,
- numtemps * numecs );
- fprintf( stderr, _( " %d empty table entries\n" ),
- nummt );
- fprintf( stderr, _( " %d protos created\n" ),
- numprots );
- fprintf( stderr,
- _( " %d templates created, %d uses\n" ),
- numtemps, tmpuses );
- }
-
- if ( useecs )
- {
- tblsiz = tblsiz + csize;
- fprintf( stderr,
- _( " %d/%d equivalence classes created\n" ),
- numecs, csize );
- }
-
- if ( usemecs )
- {
- tblsiz = tblsiz + numecs;
- fprintf( stderr,
- _( " %d/%d meta-equivalence classes created\n" ),
- nummecs, csize );
- }
-
- fprintf( stderr,
- _( " %d (%d saved) hash collisions, %d DFAs equal\n" ),
- hshcol, hshsave, dfaeql );
- fprintf( stderr, _( " %d sets of reallocations needed\n" ),
- num_reallocs );
- fprintf( stderr, _( " %d total table entries needed\n" ),
- tblsiz );
- }
-
- exit( exit_status );
- }
-
-
-/* flexinit - initialize flex */
-
-void flexinit( argc, argv )
-int argc;
-char **argv;
- {
- int i, sawcmpflag;
- char *arg;
-
- printstats = syntaxerror = trace = spprdflt = caseins = false;
- lex_compat = C_plus_plus = backing_up_report = ddebug = fulltbl = false;
- fullspd = long_align = nowarn = yymore_used = continued_action = false;
- do_yylineno = yytext_is_array = in_rule = reject = do_stdinit = false;
- yymore_really_used = reject_really_used = unspecified;
- interactive = csize = unspecified;
- do_yywrap = gen_line_dirs = usemecs = useecs = true;
- performance_report = 0;
- did_outfilename = 0;
- prefix = "yy";
- yyclass = 0;
- use_read = use_stdout = false;
-
- sawcmpflag = false;
-
- /* Initialize dynamic array for holding the rule actions. */
- action_size = 2048; /* default size of action array in bytes */
- action_array = allocate_character_array( action_size );
- defs1_offset = prolog_offset = action_offset = action_index = 0;
- action_array[0] = '\0';
-
- program_name = argv[0];
-
- if ( program_name[0] != '\0' &&
- program_name[strlen( program_name ) - 1] == '+' )
- C_plus_plus = true;
-
- /* read flags */
- for ( --argc, ++argv; argc ; --argc, ++argv )
- {
- arg = argv[0];
-
- if ( arg[0] != '-' || arg[1] == '\0' )
- break;
-
- if ( arg[1] == '-' )
- { /* --option */
- if ( ! strcmp( arg, "--help" ) )
- arg = "-h";
-
- else if ( ! strcmp( arg, "--version" ) )
- arg = "-V";
-
- else if ( ! strcmp( arg, "--" ) )
- { /* end of options */
- --argc;
- ++argv;
- break;
- }
- }
-
- for ( i = 1; arg[i] != '\0'; ++i )
- switch ( arg[i] )
- {
- case '+':
- C_plus_plus = true;
- break;
-
- case 'B':
- interactive = false;
- break;
-
- case 'b':
- backing_up_report = true;
- break;
-
- case 'c':
- break;
-
- case 'C':
- if ( i != 1 )
- flexerror(
- _( "-C flag must be given separately" ) );
-
- if ( ! sawcmpflag )
- {
- useecs = false;
- usemecs = false;
- fulltbl = false;
- sawcmpflag = true;
- }
-
- for ( ++i; arg[i] != '\0'; ++i )
- switch ( arg[i] )
- {
- case 'a':
- long_align =
- true;
- break;
-
- case 'e':
- useecs = true;
- break;
-
- case 'F':
- fullspd = true;
- break;
-
- case 'f':
- fulltbl = true;
- break;
-
- case 'm':
- usemecs = true;
- break;
-
- case 'r':
- use_read = true;
- break;
-
- default:
- lerrif(
- _( "unknown -C option '%c'" ),
- (int) arg[i] );
- break;
- }
-
- goto get_next_arg;
-
- case 'd':
- ddebug = true;
- break;
-
- case 'f':
- useecs = usemecs = false;
- use_read = fulltbl = true;
- break;
-
- case 'F':
- useecs = usemecs = false;
- use_read = fullspd = true;
- break;
-
- case '?':
- case 'h':
- usage();
- exit( 0 );
-
- case 'I':
- interactive = true;
- break;
-
- case 'i':
- caseins = true;
- break;
-
- case 'l':
- lex_compat = true;
- break;
-
- case 'L':
- gen_line_dirs = false;
- break;
-
- case 'n':
- /* Stupid do-nothing deprecated
- * option.
- */
- break;
-
- case 'o':
- if ( i != 1 )
- flexerror(
- _( "-o flag must be given separately" ) );
-
- outfilename = arg + i + 1;
- did_outfilename = 1;
- goto get_next_arg;
-
- case 'P':
- if ( i != 1 )
- flexerror(
- _( "-P flag must be given separately" ) );
-
- prefix = arg + i + 1;
- goto get_next_arg;
-
- case 'p':
- ++performance_report;
- break;
-
- case 'S':
- if ( i != 1 )
- flexerror(
- _( "-S flag must be given separately" ) );
-
- skelname = arg + i + 1;
- goto get_next_arg;
-
- case 's':
- spprdflt = true;
- break;
-
- case 't':
- use_stdout = true;
- break;
-
- case 'T':
- trace = true;
- break;
-
- case 'v':
- printstats = true;
- break;
-
- case 'V':
- printf( _( "%s version %s\n" ),
- program_name, flex_version );
- exit( 0 );
-
- case 'w':
- nowarn = true;
- break;
-
- case '7':
- csize = 128;
- break;
-
- case '8':
- csize = CSIZE;
- break;
-
- default:
- fprintf( stderr,
- _( "%s: unknown flag '%c'. For usage, try\n\t%s --help\n" ),
- program_name, (int) arg[i],
- program_name );
- exit( 1 );
- }
-
- /* Used by -C, -S, -o, and -P flags in lieu of a "continue 2"
- * control.
- */
- get_next_arg: ;
- }
-
- num_input_files = argc;
- input_files = argv;
- set_input_file( num_input_files > 0 ? input_files[0] : NULL );
-
- lastccl = lastsc = lastdfa = lastnfa = 0;
- num_rules = num_eof_rules = default_rule = 0;
- numas = numsnpairs = tmpuses = 0;
- numecs = numeps = eps2 = num_reallocs = hshcol = dfaeql = totnst = 0;
- numuniq = numdup = hshsave = eofseen = datapos = dataline = 0;
- num_backing_up = onesp = numprots = 0;
- variable_trailing_context_rules = bol_needed = false;
-
- out_linenum = linenum = sectnum = 1;
- firstprot = NIL;
-
- /* Used in mkprot() so that the first proto goes in slot 1
- * of the proto queue.
- */
- lastprot = 1;
-
- set_up_initial_allocations();
- }
-
-
-/* readin - read in the rules section of the input file(s) */
-
-void readin()
- {
- static char yy_stdinit[] = "FILE *yyin = stdin, *yyout = stdout;";
- static char yy_nostdinit[] =
- "FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;";
-
- line_directive_out( (FILE *) 0, 1 );
-
- if ( yyparse() )
- {
- pinpoint_message( _( "fatal parse error" ) );
- flexend( 1 );
- }
-
- if ( syntaxerror )
- flexend( 1 );
-
- if ( backing_up_report )
- {
- backing_up_file = fopen( backing_name, "w" );
- if ( backing_up_file == NULL )
- lerrsf(
- _( "could not create backing-up info file %s" ),
- backing_name );
- }
-
- else
- backing_up_file = NULL;
-
- if ( yymore_really_used == true )
- yymore_used = true;
- else if ( yymore_really_used == false )
- yymore_used = false;
-
- if ( reject_really_used == true )
- reject = true;
- else if ( reject_really_used == false )
- reject = false;
-
- if ( performance_report > 0 )
- {
- if ( lex_compat )
- {
- fprintf( stderr,
-_( "-l AT&T lex compatibility option entails a large performance penalty\n" ) );
- fprintf( stderr,
-_( " and may be the actual source of other reported performance penalties\n" ) );
- }
-
- else if ( do_yylineno )
- {
- fprintf( stderr,
- _( "%%option yylineno entails a large performance penalty\n" ) );
- }
-
- if ( performance_report > 1 )
- {
- if ( interactive )
- fprintf( stderr,
- _( "-I (interactive) entails a minor performance penalty\n" ) );
-
- if ( yymore_used )
- fprintf( stderr,
- _( "yymore() entails a minor performance penalty\n" ) );
- }
-
- if ( reject )
- fprintf( stderr,
- _( "REJECT entails a large performance penalty\n" ) );
-
- if ( variable_trailing_context_rules )
- fprintf( stderr,
-_( "Variable trailing context rules entail a large performance penalty\n" ) );
- }
-
- if ( reject )
- real_reject = true;
-
- if ( variable_trailing_context_rules )
- reject = true;
-
- if ( (fulltbl || fullspd) && reject )
- {
- if ( real_reject )
- flexerror(
- _( "REJECT cannot be used with -f or -F" ) );
- else if ( do_yylineno )
- flexerror(
- _( "%option yylineno cannot be used with -f or -F" ) );
- else
- flexerror(
- _( "variable trailing context rules cannot be used with -f or -F" ) );
- }
-
- if ( reject )
- outn( "\n#define YY_USES_REJECT" );
-
- if ( ! do_yywrap )
- {
- outn( "\n#define yywrap() 1" );
- outn( "#define YY_SKIP_YYWRAP" );
- }
-
- if ( ddebug )
- outn( "\n#define FLEX_DEBUG" );
-
- if ( csize == 256 )
- outn( "typedef unsigned char YY_CHAR;" );
- else
- outn( "typedef char YY_CHAR;" );
-
- if ( C_plus_plus )
- {
- outn( "#define yytext_ptr yytext" );
-
- if ( interactive )
- outn( "#define YY_INTERACTIVE" );
- }
-
- else
- {
- if ( do_stdinit )
- {
- outn( "#ifdef VMS" );
- outn( "#ifndef __VMS_POSIX" );
- outn( yy_nostdinit );
- outn( "#else" );
- outn( yy_stdinit );
- outn( "#endif" );
- outn( "#else" );
- outn( yy_stdinit );
- outn( "#endif" );
- }
-
- else
- outn( yy_nostdinit );
- }
-
- if ( fullspd )
- outn( "typedef yyconst struct yy_trans_info *yy_state_type;" );
- else if ( ! C_plus_plus )
- outn( "typedef int yy_state_type;" );
-
- if ( ddebug )
- outn( "\n#define FLEX_DEBUG" );
-
- if ( lex_compat )
- outn( "#define YY_FLEX_LEX_COMPAT" );
-
- if ( do_yylineno && ! C_plus_plus )
- {
- outn( "extern int yylineno;" );
- outn( "int yylineno = 1;" );
- }
-
- if ( C_plus_plus )
- {
- outn( "\n#include <FlexLexer.h>" );
-
- if ( yyclass )
- {
- outn( "int yyFlexLexer::yylex()" );
- outn( "\t{" );
- outn(
-"\tLexerError( \"yyFlexLexer::yylex invoked but %option yyclass used\" );" );
- outn( "\treturn 0;" );
- outn( "\t}" );
-
- out_str( "\n#define YY_DECL int %s::yylex()\n",
- yyclass );
- }
- }
-
- else
- {
- if ( yytext_is_array )
- outn( "extern char yytext[];\n" );
-
- else
- {
- outn( "extern char *yytext;" );
- outn( "#define yytext_ptr yytext" );
- }
-
- if ( yyclass )
- flexerror(
- _( "%option yyclass only meaningful for C++ scanners" ) );
- }
-
- if ( useecs )
- numecs = cre8ecs( nextecm, ecgroup, csize );
- else
- numecs = csize;
-
- /* Now map the equivalence class for NUL to its expected place. */
- ecgroup[0] = ecgroup[csize];
- NUL_ec = ABS( ecgroup[0] );
-
- if ( useecs )
- ccl2ecl();
- }
-
-
-/* set_up_initial_allocations - allocate memory for internal tables */
-
-void set_up_initial_allocations()
- {
- current_mns = INITIAL_MNS;
- firstst = allocate_integer_array( current_mns );
- lastst = allocate_integer_array( current_mns );
- finalst = allocate_integer_array( current_mns );
- transchar = allocate_integer_array( current_mns );
- trans1 = allocate_integer_array( current_mns );
- trans2 = allocate_integer_array( current_mns );
- accptnum = allocate_integer_array( current_mns );
- assoc_rule = allocate_integer_array( current_mns );
- state_type = allocate_integer_array( current_mns );
-
- current_max_rules = INITIAL_MAX_RULES;
- rule_type = allocate_integer_array( current_max_rules );
- rule_linenum = allocate_integer_array( current_max_rules );
- rule_useful = allocate_integer_array( current_max_rules );
-
- current_max_scs = INITIAL_MAX_SCS;
- scset = allocate_integer_array( current_max_scs );
- scbol = allocate_integer_array( current_max_scs );
- scxclu = allocate_integer_array( current_max_scs );
- sceof = allocate_integer_array( current_max_scs );
- scname = allocate_char_ptr_array( current_max_scs );
-
- current_maxccls = INITIAL_MAX_CCLS;
- cclmap = allocate_integer_array( current_maxccls );
- ccllen = allocate_integer_array( current_maxccls );
- cclng = allocate_integer_array( current_maxccls );
-
- current_max_ccl_tbl_size = INITIAL_MAX_CCL_TBL_SIZE;
- ccltbl = allocate_Character_array( current_max_ccl_tbl_size );
-
- current_max_dfa_size = INITIAL_MAX_DFA_SIZE;
-
- current_max_xpairs = INITIAL_MAX_XPAIRS;
- nxt = allocate_integer_array( current_max_xpairs );
- chk = allocate_integer_array( current_max_xpairs );
-
- current_max_template_xpairs = INITIAL_MAX_TEMPLATE_XPAIRS;
- tnxt = allocate_integer_array( current_max_template_xpairs );
-
- current_max_dfas = INITIAL_MAX_DFAS;
- base = allocate_integer_array( current_max_dfas );
- def = allocate_integer_array( current_max_dfas );
- dfasiz = allocate_integer_array( current_max_dfas );
- accsiz = allocate_integer_array( current_max_dfas );
- dhash = allocate_integer_array( current_max_dfas );
- dss = allocate_int_ptr_array( current_max_dfas );
- dfaacc = allocate_dfaacc_union( current_max_dfas );
-
- nultrans = (int *) 0;
- }
-
-
-void usage()
- {
- FILE *f = stdout;
-
- fprintf( f,
-_( "%s [-bcdfhilnpstvwBFILTV78+? -C[aefFmr] -ooutput -Pprefix -Sskeleton]\n" ),
- program_name );
- fprintf( f, _( "\t[--help --version] [file ...]\n" ) );
-
- fprintf( f, _( "\t-b generate backing-up information to %s\n" ),
- backing_name );
- fprintf( f, _( "\t-c do-nothing POSIX option\n" ) );
- fprintf( f, _( "\t-d turn on debug mode in generated scanner\n" ) );
- fprintf( f, _( "\t-f generate fast, large scanner\n" ) );
- fprintf( f, _( "\t-h produce this help message\n" ) );
- fprintf( f, _( "\t-i generate case-insensitive scanner\n" ) );
- fprintf( f, _( "\t-l maximal compatibility with original lex\n" ) );
- fprintf( f, _( "\t-n do-nothing POSIX option\n" ) );
- fprintf( f, _( "\t-p generate performance report to stderr\n" ) );
- fprintf( f,
- _( "\t-s suppress default rule to ECHO unmatched text\n" ) );
-
- if ( ! did_outfilename )
- {
- sprintf( outfile_path, outfile_template,
- prefix, C_plus_plus ? "cc" : "c" );
- outfilename = outfile_path;
- }
-
- fprintf( f,
- _( "\t-t write generated scanner on stdout instead of %s\n" ),
- outfilename );
-
- fprintf( f,
- _( "\t-v write summary of scanner statistics to f\n" ) );
- fprintf( f, _( "\t-w do not generate warnings\n" ) );
- fprintf( f, _( "\t-B generate batch scanner (opposite of -I)\n" ) );
- fprintf( f,
- _( "\t-F use alternative fast scanner representation\n" ) );
- fprintf( f,
- _( "\t-I generate interactive scanner (opposite of -B)\n" ) );
- fprintf( f, _( "\t-L suppress #line directives in scanner\n" ) );
- fprintf( f, _( "\t-T %s should run in trace mode\n" ), program_name );
- fprintf( f, _( "\t-V report %s version\n" ), program_name );
- fprintf( f, _( "\t-7 generate 7-bit scanner\n" ) );
- fprintf( f, _( "\t-8 generate 8-bit scanner\n" ) );
- fprintf( f, _( "\t-+ generate C++ scanner class\n" ) );
- fprintf( f, _( "\t-? produce this help message\n" ) );
- fprintf( f,
-_( "\t-C specify degree of table compression (default is -Cem):\n" ) );
- fprintf( f,
-_( "\t\t-Ca trade off larger tables for better memory alignment\n" ) );
- fprintf( f, _( "\t\t-Ce construct equivalence classes\n" ) );
- fprintf( f,
-_( "\t\t-Cf do not compress scanner tables; use -f representation\n" ) );
- fprintf( f,
-_( "\t\t-CF do not compress scanner tables; use -F representation\n" ) );
- fprintf( f, _( "\t\t-Cm construct meta-equivalence classes\n" ) );
- fprintf( f,
- _( "\t\t-Cr use read() instead of stdio for scanner input\n" ) );
- fprintf( f, _( "\t-o specify output filename\n" ) );
- fprintf( f, _( "\t-P specify scanner prefix other than \"yy\"\n" ) );
- fprintf( f, _( "\t-S specify skeleton file\n" ) );
- fprintf( f, _( "\t--help produce this help message\n" ) );
- fprintf( f, _( "\t--version report %s version\n" ), program_name );
- }
diff --git a/usr.bin/lex/misc.c b/usr.bin/lex/misc.c
deleted file mode 100644
index 6048f5d..0000000
--- a/usr.bin/lex/misc.c
+++ /dev/null
@@ -1,888 +0,0 @@
-/* misc - miscellaneous flex routines */
-
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Vern Paxson.
- *
- * The United States Government has rights in this work pursuant
- * to contract no. DE-AC03-76SF00098 between the United States
- * Department of Energy and the University of California.
- *
- * Redistribution and use in source and binary forms are permitted provided
- * that: (1) source distributions retain this entire copyright notice and
- * comment, and (2) distributions including binaries display the following
- * acknowledgement: ``This product includes software developed by the
- * University of California, Berkeley and its contributors'' in the
- * documentation or other materials provided with the distribution and in
- * all advertising materials mentioning features or use of this software.
- * Neither the name of the University nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/* $Header: /home/daffy/u0/vern/flex/RCS/misc.c,v 2.47 95/04/28 11:39:39 vern Exp $ */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "flexdef.h"
-
-
-void action_define( defname, value )
-char *defname;
-int value;
- {
- char buf[MAXLINE];
-
- if ( (int) strlen( defname ) > MAXLINE / 2 )
- {
- format_pinpoint_message( _( "name \"%s\" ridiculously long" ),
- defname );
- return;
- }
-
- sprintf( buf, "#define %s %d\n", defname, value );
- add_action( buf );
- }
-
-
-void add_action( new_text )
-char *new_text;
- {
- int len = strlen( new_text );
-
- while ( len + action_index >= action_size - 10 /* slop */ )
- {
- int new_size = action_size * 2;
-
- if ( new_size <= 0 )
- /* Increase just a little, to try to avoid overflow
- * on 16-bit machines.
- */
- action_size += action_size / 8;
- else
- action_size = new_size;
-
- action_array =
- reallocate_character_array( action_array, action_size );
- }
-
- strcpy( &action_array[action_index], new_text );
-
- action_index += len;
- }
-
-
-/* allocate_array - allocate memory for an integer array of the given size */
-
-void *allocate_array( size, element_size )
-int size;
-size_t element_size;
- {
- void *mem;
- size_t num_bytes = element_size * size;
-
- mem = flex_alloc( num_bytes );
- if ( ! mem )
- flexfatal(
- _( "memory allocation failed in allocate_array()" ) );
-
- return mem;
- }
-
-
-/* all_lower - true if a string is all lower-case */
-
-int all_lower( str )
-char *str;
- {
- while ( *str )
- {
- if ( ! isascii( (Char) *str ) || ! islower( *str ) )
- return 0;
- ++str;
- }
-
- return 1;
- }
-
-
-/* all_upper - true if a string is all upper-case */
-
-int all_upper( str )
-char *str;
- {
- while ( *str )
- {
- if ( ! isascii( (Char) *str ) || ! isupper( *str ) )
- return 0;
- ++str;
- }
-
- return 1;
- }
-
-
-/* bubble - bubble sort an integer array in increasing order
- *
- * synopsis
- * int v[n], n;
- * void bubble( v, n );
- *
- * description
- * sorts the first n elements of array v and replaces them in
- * increasing order.
- *
- * passed
- * v - the array to be sorted
- * n - the number of elements of 'v' to be sorted
- */
-
-void bubble( v, n )
-int v[], n;
- {
- int i, j, k;
-
- for ( i = n; i > 1; --i )
- for ( j = 1; j < i; ++j )
- if ( v[j] > v[j + 1] ) /* compare */
- {
- k = v[j]; /* exchange */
- v[j] = v[j + 1];
- v[j + 1] = k;
- }
- }
-
-
-/* check_char - checks a character to make sure it's within the range
- * we're expecting. If not, generates fatal error message
- * and exits.
- */
-
-void check_char( c )
-int c;
- {
- if ( c >= CSIZE )
- lerrsf( _( "bad character '%s' detected in check_char()" ),
- readable_form( c ) );
-
- if ( c >= csize )
- lerrsf(
- _( "scanner requires -8 flag to use the character %s" ),
- readable_form( c ) );
- }
-
-
-
-/* clower - replace upper-case letter to lower-case */
-
-Char clower( c )
-int c;
- {
- return (Char) ((isascii( c ) && isupper( c )) ? tolower( c ) : c);
- }
-
-
-/* copy_string - returns a dynamically allocated copy of a string */
-
-char *copy_string( str )
-const char *str;
- {
- const char *c1;
- char *c2;
- char *copy;
- unsigned int size;
-
- /* find length */
- for ( c1 = str; *c1; ++c1 )
- ;
-
- size = (c1 - str + 1) * sizeof( char );
- copy = (char *) flex_alloc( size );
-
- if ( copy == NULL )
- flexfatal( _( "dynamic memory failure in copy_string()" ) );
-
- for ( c2 = copy; (*c2++ = *str++) != 0; )
- ;
-
- return copy;
- }
-
-
-/* copy_unsigned_string -
- * returns a dynamically allocated copy of a (potentially) unsigned string
- */
-
-Char *copy_unsigned_string( str )
-Char *str;
- {
- Char *c;
- Char *copy;
-
- /* find length */
- for ( c = str; *c; ++c )
- ;
-
- copy = allocate_Character_array( c - str + 1 );
-
- for ( c = copy; (*c++ = *str++) != 0; )
- ;
-
- return copy;
- }
-
-
-/* cshell - shell sort a character array in increasing order
- *
- * synopsis
- *
- * Char v[n];
- * int n, special_case_0;
- * cshell( v, n, special_case_0 );
- *
- * description
- * Does a shell sort of the first n elements of array v.
- * If special_case_0 is true, then any element equal to 0
- * is instead assumed to have infinite weight.
- *
- * passed
- * v - array to be sorted
- * n - number of elements of v to be sorted
- */
-
-void cshell( v, n, special_case_0 )
-Char v[];
-int n, special_case_0;
- {
- int gap, i, j, jg;
- Char k;
-
- for ( gap = n / 2; gap > 0; gap = gap / 2 )
- for ( i = gap; i < n; ++i )
- for ( j = i - gap; j >= 0; j = j - gap )
- {
- jg = j + gap;
-
- if ( special_case_0 )
- {
- if ( v[jg] == 0 )
- break;
-
- else if ( v[j] != 0 && v[j] <= v[jg] )
- break;
- }
-
- else if ( v[j] <= v[jg] )
- break;
-
- k = v[j];
- v[j] = v[jg];
- v[jg] = k;
- }
- }
-
-
-/* dataend - finish up a block of data declarations */
-
-void dataend()
- {
- if ( datapos > 0 )
- dataflush();
-
- /* add terminator for initialization; { for vi */
- outn( " } ;\n" );
-
- dataline = 0;
- datapos = 0;
- }
-
-
-/* dataflush - flush generated data statements */
-
-void dataflush()
- {
- outc( '\n' );
-
- if ( ++dataline >= NUMDATALINES )
- {
- /* Put out a blank line so that the table is grouped into
- * large blocks that enable the user to find elements easily.
- */
- outc( '\n' );
- dataline = 0;
- }
-
- /* Reset the number of characters written on the current line. */
- datapos = 0;
- }
-
-
-/* flexerror - report an error message and terminate */
-
-void flexerror( msg )
-const char msg[];
- {
- fprintf( stderr, "%s: %s\n", program_name, msg );
- flexend( 1 );
- }
-
-
-/* flexfatal - report a fatal error message and terminate */
-
-void flexfatal( msg )
-const char msg[];
- {
- fprintf( stderr, _( "%s: fatal internal error, %s\n" ),
- program_name, msg );
- exit( 1 );
- }
-
-
-/* htoi - convert a hexadecimal digit string to an integer value */
-
-int htoi( str )
-Char str[];
- {
- unsigned int result;
-
- (void) sscanf( (char *) str, "%x", &result );
-
- return result;
- }
-
-
-/* lerrif - report an error message formatted with one integer argument */
-
-void lerrif( msg, arg )
-const char msg[];
-int arg;
- {
- char errmsg[MAXLINE];
- (void) sprintf( errmsg, msg, arg );
- flexerror( errmsg );
- }
-
-
-/* lerrsf - report an error message formatted with one string argument */
-
-void lerrsf( msg, arg )
-const char msg[], arg[];
- {
- char errmsg[MAXLINE];
-
- (void) sprintf( errmsg, msg, arg );
- flexerror( errmsg );
- }
-
-
-/* line_directive_out - spit out a "#line" statement */
-
-void line_directive_out( output_file, do_infile )
-FILE *output_file;
-int do_infile;
- {
- char directive[MAXLINE], filename[MAXLINE];
- char *s1, *s2, *s3;
- static char line_fmt[] = "#line %d \"%s\"\n";
-
- if ( ! gen_line_dirs )
- return;
-
- if ( (do_infile && ! infilename) || (! do_infile && ! outfilename) )
- /* don't know the filename to use, skip */
- return;
-
- s1 = do_infile ? infilename : outfilename;
- s2 = filename;
- s3 = &filename[sizeof( filename ) - 2];
-
- while ( s2 < s3 && *s1 )
- {
- if ( *s1 == '\\' )
- /* Escape the '\' */
- *s2++ = '\\';
-
- *s2++ = *s1++;
- }
-
- *s2 = '\0';
-
- if ( do_infile )
- sprintf( directive, line_fmt, linenum, filename );
- else
- {
- if ( output_file == stdout )
- /* Account for the line directive itself. */
- ++out_linenum;
-
- sprintf( directive, line_fmt, out_linenum, filename );
- }
-
- /* If output_file is nil then we should put the directive in
- * the accumulated actions.
- */
- if ( output_file )
- {
- fputs( directive, output_file );
- }
- else
- add_action( directive );
- }
-
-
-/* mark_defs1 - mark the current position in the action array as
- * representing where the user's section 1 definitions end
- * and the prolog begins
- */
-void mark_defs1()
- {
- defs1_offset = 0;
- action_array[action_index++] = '\0';
- action_offset = prolog_offset = action_index;
- action_array[action_index] = '\0';
- }
-
-
-/* mark_prolog - mark the current position in the action array as
- * representing the end of the action prolog
- */
-void mark_prolog()
- {
- action_array[action_index++] = '\0';
- action_offset = action_index;
- action_array[action_index] = '\0';
- }
-
-
-/* mk2data - generate a data statement for a two-dimensional array
- *
- * Generates a data statement initializing the current 2-D array to "value".
- */
-void mk2data( value )
-int value;
- {
- if ( datapos >= NUMDATAITEMS )
- {
- outc( ',' );
- dataflush();
- }
-
- if ( datapos == 0 )
- /* Indent. */
- out( " " );
-
- else
- outc( ',' );
-
- ++datapos;
-
- out_dec( "%5d", value );
- }
-
-
-/* mkdata - generate a data statement
- *
- * Generates a data statement initializing the current array element to
- * "value".
- */
-void mkdata( value )
-int value;
- {
- if ( datapos >= NUMDATAITEMS )
- {
- outc( ',' );
- dataflush();
- }
-
- if ( datapos == 0 )
- /* Indent. */
- out( " " );
- else
- outc( ',' );
-
- ++datapos;
-
- out_dec( "%5d", value );
- }
-
-
-/* myctoi - return the integer represented by a string of digits */
-
-int myctoi( array )
-char array[];
- {
- int val = 0;
-
- (void) sscanf( array, "%d", &val );
-
- return val;
- }
-
-
-/* myesc - return character corresponding to escape sequence */
-
-Char myesc( array )
-Char array[];
- {
- Char c, esc_char;
-
- switch ( array[1] )
- {
- case 'b': return '\b';
- case 'f': return '\f';
- case 'n': return '\n';
- case 'r': return '\r';
- case 't': return '\t';
-
-#if __STDC__
- case 'a': return '\a';
- case 'v': return '\v';
-#else
- case 'a': return '\007';
- case 'v': return '\013';
-#endif
-
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- { /* \<octal> */
- int sptr = 1;
-
- while ( isascii( array[sptr] ) &&
- isdigit( array[sptr] ) )
- /* Don't increment inside loop control
- * because if isdigit() is a macro it might
- * expand into multiple increments ...
- */
- ++sptr;
-
- c = array[sptr];
- array[sptr] = '\0';
-
- esc_char = otoi( array + 1 );
-
- array[sptr] = c;
-
- return esc_char;
- }
-
- case 'x':
- { /* \x<hex> */
- int sptr = 2;
-
- while ( isascii( array[sptr] ) &&
- isxdigit( (char) array[sptr] ) )
- /* Don't increment inside loop control
- * because if isdigit() is a macro it might
- * expand into multiple increments ...
- */
- ++sptr;
-
- c = array[sptr];
- array[sptr] = '\0';
-
- esc_char = htoi( array + 2 );
-
- array[sptr] = c;
-
- return esc_char;
- }
-
- default:
- return array[1];
- }
- }
-
-
-/* otoi - convert an octal digit string to an integer value */
-
-int otoi( str )
-Char str[];
- {
- unsigned int result;
-
- (void) sscanf( (char *) str, "%o", &result );
- return result;
- }
-
-
-/* out - various flavors of outputing a (possibly formatted) string for the
- * generated scanner, keeping track of the line count.
- */
-
-void out( str )
-const char str[];
- {
- fputs( str, stdout );
- out_line_count( str );
- }
-
-void out_dec( fmt, n )
-const char fmt[];
-int n;
- {
- printf( fmt, n );
- out_line_count( fmt );
- }
-
-void out_dec2( fmt, n1, n2 )
-const char fmt[];
-int n1, n2;
- {
- printf( fmt, n1, n2 );
- out_line_count( fmt );
- }
-
-void out_hex( fmt, x )
-const char fmt[];
-unsigned int x;
- {
- printf( fmt, x );
- out_line_count( fmt );
- }
-
-void out_line_count( str )
-const char str[];
- {
- int i;
-
- for ( i = 0; str[i]; ++i )
- if ( str[i] == '\n' )
- ++out_linenum;
- }
-
-void out_str( fmt, str )
-const char fmt[], str[];
- {
- printf( fmt, str );
- out_line_count( fmt );
- out_line_count( str );
- }
-
-void out_str3( fmt, s1, s2, s3 )
-const char fmt[], s1[], s2[], s3[];
- {
- printf( fmt, s1, s2, s3 );
- out_line_count( fmt );
- out_line_count( s1 );
- out_line_count( s2 );
- out_line_count( s3 );
- }
-
-void out_str_dec( fmt, str, n )
-const char fmt[], str[];
-int n;
- {
- printf( fmt, str, n );
- out_line_count( fmt );
- out_line_count( str );
- }
-
-void outc( c )
-int c;
- {
- putc( c, stdout );
-
- if ( c == '\n' )
- ++out_linenum;
- }
-
-void outn( str )
-const char str[];
- {
- puts( str );
- out_line_count( str );
- ++out_linenum;
- }
-
-
-/* readable_form - return the the human-readable form of a character
- *
- * The returned string is in static storage.
- */
-
-char *readable_form( c )
-int c;
- {
- static char rform[10];
-
- if ( (c >= 0 && c < 32) || c >= 127 )
- {
- switch ( c )
- {
- case '\b': return "\\b";
- case '\f': return "\\f";
- case '\n': return "\\n";
- case '\r': return "\\r";
- case '\t': return "\\t";
-
-#if __STDC__
- case '\a': return "\\a";
- case '\v': return "\\v";
-#endif
-
- default:
- (void) sprintf( rform, "\\%.3o",
- (unsigned int) c );
- return rform;
- }
- }
-
- else if ( c == ' ' )
- return "' '";
-
- else
- {
- rform[0] = c;
- rform[1] = '\0';
-
- return rform;
- }
- }
-
-
-/* reallocate_array - increase the size of a dynamic array */
-
-void *reallocate_array( array, size, element_size )
-void *array;
-int size;
-size_t element_size;
- {
- void *new_array;
- size_t num_bytes = element_size * size;
-
- new_array = flex_realloc( array, num_bytes );
- if ( ! new_array )
- flexfatal( _( "attempt to increase array size failed" ) );
-
- return new_array;
- }
-
-
-/* skelout - write out one section of the skeleton file
- *
- * Description
- * Copies skelfile or skel array to stdout until a line beginning with
- * "%%" or EOF is found.
- */
-void skelout()
- {
- char buf_storage[MAXLINE];
- char *buf = buf_storage;
- int do_copy = 1;
-
- /* Loop pulling lines either from the skelfile, if we're using
- * one, or from the skel[] array.
- */
- while ( skelfile ?
- (fgets( buf, MAXLINE, skelfile ) != NULL) :
- ((buf = (char *) skel[skel_ind++]) != 0) )
- { /* copy from skel array */
- if ( buf[0] == '%' )
- { /* control line */
- switch ( buf[1] )
- {
- case '%':
- return;
-
- case '+':
- do_copy = C_plus_plus;
- break;
-
- case '-':
- do_copy = ! C_plus_plus;
- break;
-
- case '*':
- do_copy = 1;
- break;
-
- default:
- flexfatal(
- _( "bad line in skeleton file" ) );
- }
- }
-
- else if ( do_copy )
- {
- if ( skelfile )
- /* Skeleton file reads include final
- * newline, skel[] array does not.
- */
- out( buf );
- else
- outn( buf );
- }
- }
- }
-
-
-/* transition_struct_out - output a yy_trans_info structure
- *
- * outputs the yy_trans_info structure with the two elements, element_v and
- * element_n. Formats the output with spaces and carriage returns.
- */
-
-void transition_struct_out( element_v, element_n )
-int element_v, element_n;
- {
- out_dec2( " {%4d,%4d },", element_v, element_n );
-
- datapos += TRANS_STRUCT_PRINT_LENGTH;
-
- if ( datapos >= 79 - TRANS_STRUCT_PRINT_LENGTH )
- {
- outc( '\n' );
-
- if ( ++dataline % 10 == 0 )
- outc( '\n' );
-
- datapos = 0;
- }
- }
-
-
-/* The following is only needed when building flex's parser using certain
- * broken versions of bison.
- */
-void *yy_flex_xmalloc( size )
-int size;
- {
- void *result = flex_alloc( (size_t) size );
-
- if ( ! result )
- flexfatal(
- _( "memory allocation failed in yy_flex_xmalloc()" ) );
-
- return result;
- }
-
-
-/* zero_out - set a region of memory to 0
- *
- * Sets region_ptr[0] through region_ptr[size_in_bytes - 1] to zero.
- */
-
-void zero_out( region_ptr, size_in_bytes )
-char *region_ptr;
-size_t size_in_bytes;
- {
- char *rp, *rp_end;
-
- rp = region_ptr;
- rp_end = region_ptr + size_in_bytes;
-
- while ( rp < rp_end )
- *rp++ = 0;
- }
diff --git a/usr.bin/lex/mkskel.sh b/usr.bin/lex/mkskel.sh
deleted file mode 100755
index a03a11a..0000000
--- a/usr.bin/lex/mkskel.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#! /bin/sh
-
-cat <<!
-/* File created from flex.skl via mkskel.sh */
-
-#include "flexdef.h"
-
-const char *skel[] = {
-!
-
-sed 's/\\/&&/g' $* | sed 's/"/\\"/g' | sed 's/.*/ "&",/'
-
-cat <<!
- 0
-};
-!
diff --git a/usr.bin/lex/nfa.c b/usr.bin/lex/nfa.c
deleted file mode 100644
index 99b4ecf..0000000
--- a/usr.bin/lex/nfa.c
+++ /dev/null
@@ -1,711 +0,0 @@
-/* nfa - NFA construction routines */
-
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Vern Paxson.
- *
- * The United States Government has rights in this work pursuant
- * to contract no. DE-AC03-76SF00098 between the United States
- * Department of Energy and the University of California.
- *
- * Redistribution and use in source and binary forms are permitted provided
- * that: (1) source distributions retain this entire copyright notice and
- * comment, and (2) distributions including binaries display the following
- * acknowledgement: ``This product includes software developed by the
- * University of California, Berkeley and its contributors'' in the
- * documentation or other materials provided with the distribution and in
- * all advertising materials mentioning features or use of this software.
- * Neither the name of the University nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/* $Header: /home/daffy/u0/vern/flex/RCS/nfa.c,v 2.17 95/03/04 16:11:42 vern Exp $ */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "flexdef.h"
-
-
-/* declare functions that have forward references */
-
-int dupmachine PROTO((int));
-void mkxtion PROTO((int, int));
-
-
-/* add_accept - add an accepting state to a machine
- *
- * accepting_number becomes mach's accepting number.
- */
-
-void add_accept( mach, accepting_number )
-int mach, accepting_number;
- {
- /* Hang the accepting number off an epsilon state. if it is associated
- * with a state that has a non-epsilon out-transition, then the state
- * will accept BEFORE it makes that transition, i.e., one character
- * too soon.
- */
-
- if ( transchar[finalst[mach]] == SYM_EPSILON )
- accptnum[finalst[mach]] = accepting_number;
-
- else
- {
- int astate = mkstate( SYM_EPSILON );
- accptnum[astate] = accepting_number;
- (void) link_machines( mach, astate );
- }
- }
-
-
-/* copysingl - make a given number of copies of a singleton machine
- *
- * synopsis
- *
- * newsng = copysingl( singl, num );
- *
- * newsng - a new singleton composed of num copies of singl
- * singl - a singleton machine
- * num - the number of copies of singl to be present in newsng
- */
-
-int copysingl( singl, num )
-int singl, num;
- {
- int copy, i;
-
- copy = mkstate( SYM_EPSILON );
-
- for ( i = 1; i <= num; ++i )
- copy = link_machines( copy, dupmachine( singl ) );
-
- return copy;
- }
-
-
-/* dumpnfa - debugging routine to write out an nfa */
-
-void dumpnfa( state1 )
-int state1;
-
- {
- int sym, tsp1, tsp2, anum, ns;
-
- fprintf( stderr,
- _( "\n\n********** beginning dump of nfa with start state %d\n" ),
- state1 );
-
- /* We probably should loop starting at firstst[state1] and going to
- * lastst[state1], but they're not maintained properly when we "or"
- * all of the rules together. So we use our knowledge that the machine
- * starts at state 1 and ends at lastnfa.
- */
-
- /* for ( ns = firstst[state1]; ns <= lastst[state1]; ++ns ) */
- for ( ns = 1; ns <= lastnfa; ++ns )
- {
- fprintf( stderr, _( "state # %4d\t" ), ns );
-
- sym = transchar[ns];
- tsp1 = trans1[ns];
- tsp2 = trans2[ns];
- anum = accptnum[ns];
-
- fprintf( stderr, "%3d: %4d, %4d", sym, tsp1, tsp2 );
-
- if ( anum != NIL )
- fprintf( stderr, " [%d]", anum );
-
- fprintf( stderr, "\n" );
- }
-
- fprintf( stderr, _( "********** end of dump\n" ) );
- }
-
-
-/* dupmachine - make a duplicate of a given machine
- *
- * synopsis
- *
- * copy = dupmachine( mach );
- *
- * copy - holds duplicate of mach
- * mach - machine to be duplicated
- *
- * note that the copy of mach is NOT an exact duplicate; rather, all the
- * transition states values are adjusted so that the copy is self-contained,
- * as the original should have been.
- *
- * also note that the original MUST be contiguous, with its low and high
- * states accessible by the arrays firstst and lastst
- */
-
-int dupmachine( mach )
-int mach;
- {
- int i, init, state_offset;
- int state = 0;
- int last = lastst[mach];
-
- for ( i = firstst[mach]; i <= last; ++i )
- {
- state = mkstate( transchar[i] );
-
- if ( trans1[i] != NO_TRANSITION )
- {
- mkxtion( finalst[state], trans1[i] + state - i );
-
- if ( transchar[i] == SYM_EPSILON &&
- trans2[i] != NO_TRANSITION )
- mkxtion( finalst[state],
- trans2[i] + state - i );
- }
-
- accptnum[state] = accptnum[i];
- }
-
- if ( state == 0 )
- flexfatal( _( "empty machine in dupmachine()" ) );
-
- state_offset = state - i + 1;
-
- init = mach + state_offset;
- firstst[init] = firstst[mach] + state_offset;
- finalst[init] = finalst[mach] + state_offset;
- lastst[init] = lastst[mach] + state_offset;
-
- return init;
- }
-
-
-/* finish_rule - finish up the processing for a rule
- *
- * An accepting number is added to the given machine. If variable_trail_rule
- * is true then the rule has trailing context and both the head and trail
- * are variable size. Otherwise if headcnt or trailcnt is non-zero then
- * the machine recognizes a pattern with trailing context and headcnt is
- * the number of characters in the matched part of the pattern, or zero
- * if the matched part has variable length. trailcnt is the number of
- * trailing context characters in the pattern, or zero if the trailing
- * context has variable length.
- */
-
-void finish_rule( mach, variable_trail_rule, headcnt, trailcnt )
-int mach, variable_trail_rule, headcnt, trailcnt;
- {
- char action_text[MAXLINE];
-
- add_accept( mach, num_rules );
-
- /* We did this in new_rule(), but it often gets the wrong
- * number because we do it before we start parsing the current rule.
- */
- rule_linenum[num_rules] = linenum;
-
- /* If this is a continued action, then the line-number has already
- * been updated, giving us the wrong number.
- */
- if ( continued_action )
- --rule_linenum[num_rules];
-
- sprintf( action_text, "case %d:\n", num_rules );
- add_action( action_text );
-
- if ( variable_trail_rule )
- {
- rule_type[num_rules] = RULE_VARIABLE;
-
- if ( performance_report > 0 )
- fprintf( stderr,
- _( "Variable trailing context rule at line %d\n" ),
- rule_linenum[num_rules] );
-
- variable_trailing_context_rules = true;
- }
-
- else
- {
- rule_type[num_rules] = RULE_NORMAL;
-
- if ( headcnt > 0 || trailcnt > 0 )
- {
- /* Do trailing context magic to not match the trailing
- * characters.
- */
- char *scanner_cp = "yy_c_buf_p = yy_cp";
- char *scanner_bp = "yy_bp";
-
- add_action(
- "*yy_cp = yy_hold_char; /* undo effects of setting up yytext */\n" );
-
- if ( headcnt > 0 )
- {
- sprintf( action_text, "%s = %s + %d;\n",
- scanner_cp, scanner_bp, headcnt );
- add_action( action_text );
- }
-
- else
- {
- sprintf( action_text, "%s -= %d;\n",
- scanner_cp, trailcnt );
- add_action( action_text );
- }
-
- add_action(
- "YY_DO_BEFORE_ACTION; /* set up yytext again */\n" );
- }
- }
-
- /* Okay, in the action code at this point yytext and yyleng have
- * their proper final values for this rule, so here's the point
- * to do any user action. But don't do it for continued actions,
- * as that'll result in multiple YY_RULE_SETUP's.
- */
- if ( ! continued_action )
- add_action( "YY_RULE_SETUP\n" );
-
- line_directive_out( (FILE *) 0, 1 );
- }
-
-
-/* link_machines - connect two machines together
- *
- * synopsis
- *
- * new = link_machines( first, last );
- *
- * new - a machine constructed by connecting first to last
- * first - the machine whose successor is to be last
- * last - the machine whose predecessor is to be first
- *
- * note: this routine concatenates the machine first with the machine
- * last to produce a machine new which will pattern-match first first
- * and then last, and will fail if either of the sub-patterns fails.
- * FIRST is set to new by the operation. last is unmolested.
- */
-
-int link_machines( first, last )
-int first, last;
- {
- if ( first == NIL )
- return last;
-
- else if ( last == NIL )
- return first;
-
- else
- {
- mkxtion( finalst[first], last );
- finalst[first] = finalst[last];
- lastst[first] = MAX( lastst[first], lastst[last] );
- firstst[first] = MIN( firstst[first], firstst[last] );
-
- return first;
- }
- }
-
-
-/* mark_beginning_as_normal - mark each "beginning" state in a machine
- * as being a "normal" (i.e., not trailing context-
- * associated) states
- *
- * The "beginning" states are the epsilon closure of the first state
- */
-
-void mark_beginning_as_normal( mach )
-int mach;
- {
- switch ( state_type[mach] )
- {
- case STATE_NORMAL:
- /* Oh, we've already visited here. */
- return;
-
- case STATE_TRAILING_CONTEXT:
- state_type[mach] = STATE_NORMAL;
-
- if ( transchar[mach] == SYM_EPSILON )
- {
- if ( trans1[mach] != NO_TRANSITION )
- mark_beginning_as_normal(
- trans1[mach] );
-
- if ( trans2[mach] != NO_TRANSITION )
- mark_beginning_as_normal(
- trans2[mach] );
- }
- break;
-
- default:
- flexerror(
- _( "bad state type in mark_beginning_as_normal()" ) );
- break;
- }
- }
-
-
-/* mkbranch - make a machine that branches to two machines
- *
- * synopsis
- *
- * branch = mkbranch( first, second );
- *
- * branch - a machine which matches either first's pattern or second's
- * first, second - machines whose patterns are to be or'ed (the | operator)
- *
- * Note that first and second are NEITHER destroyed by the operation. Also,
- * the resulting machine CANNOT be used with any other "mk" operation except
- * more mkbranch's. Compare with mkor()
- */
-
-int mkbranch( first, second )
-int first, second;
- {
- int eps;
-
- if ( first == NO_TRANSITION )
- return second;
-
- else if ( second == NO_TRANSITION )
- return first;
-
- eps = mkstate( SYM_EPSILON );
-
- mkxtion( eps, first );
- mkxtion( eps, second );
-
- return eps;
- }
-
-
-/* mkclos - convert a machine into a closure
- *
- * synopsis
- * new = mkclos( state );
- *
- * new - a new state which matches the closure of "state"
- */
-
-int mkclos( state )
-int state;
- {
- return mkopt( mkposcl( state ) );
- }
-
-
-/* mkopt - make a machine optional
- *
- * synopsis
- *
- * new = mkopt( mach );
- *
- * new - a machine which optionally matches whatever mach matched
- * mach - the machine to make optional
- *
- * notes:
- * 1. mach must be the last machine created
- * 2. mach is destroyed by the call
- */
-
-int mkopt( mach )
-int mach;
- {
- int eps;
-
- if ( ! SUPER_FREE_EPSILON(finalst[mach]) )
- {
- eps = mkstate( SYM_EPSILON );
- mach = link_machines( mach, eps );
- }
-
- /* Can't skimp on the following if FREE_EPSILON(mach) is true because
- * some state interior to "mach" might point back to the beginning
- * for a closure.
- */
- eps = mkstate( SYM_EPSILON );
- mach = link_machines( eps, mach );
-
- mkxtion( mach, finalst[mach] );
-
- return mach;
- }
-
-
-/* mkor - make a machine that matches either one of two machines
- *
- * synopsis
- *
- * new = mkor( first, second );
- *
- * new - a machine which matches either first's pattern or second's
- * first, second - machines whose patterns are to be or'ed (the | operator)
- *
- * note that first and second are both destroyed by the operation
- * the code is rather convoluted because an attempt is made to minimize
- * the number of epsilon states needed
- */
-
-int mkor( first, second )
-int first, second;
- {
- int eps, orend;
-
- if ( first == NIL )
- return second;
-
- else if ( second == NIL )
- return first;
-
- else
- {
- /* See comment in mkopt() about why we can't use the first
- * state of "first" or "second" if they satisfy "FREE_EPSILON".
- */
- eps = mkstate( SYM_EPSILON );
-
- first = link_machines( eps, first );
-
- mkxtion( first, second );
-
- if ( SUPER_FREE_EPSILON(finalst[first]) &&
- accptnum[finalst[first]] == NIL )
- {
- orend = finalst[first];
- mkxtion( finalst[second], orend );
- }
-
- else if ( SUPER_FREE_EPSILON(finalst[second]) &&
- accptnum[finalst[second]] == NIL )
- {
- orend = finalst[second];
- mkxtion( finalst[first], orend );
- }
-
- else
- {
- eps = mkstate( SYM_EPSILON );
-
- first = link_machines( first, eps );
- orend = finalst[first];
-
- mkxtion( finalst[second], orend );
- }
- }
-
- finalst[first] = orend;
- return first;
- }
-
-
-/* mkposcl - convert a machine into a positive closure
- *
- * synopsis
- * new = mkposcl( state );
- *
- * new - a machine matching the positive closure of "state"
- */
-
-int mkposcl( state )
-int state;
- {
- int eps;
-
- if ( SUPER_FREE_EPSILON(finalst[state]) )
- {
- mkxtion( finalst[state], state );
- return state;
- }
-
- else
- {
- eps = mkstate( SYM_EPSILON );
- mkxtion( eps, state );
- return link_machines( state, eps );
- }
- }
-
-
-/* mkrep - make a replicated machine
- *
- * synopsis
- * new = mkrep( mach, lb, ub );
- *
- * new - a machine that matches whatever "mach" matched from "lb"
- * number of times to "ub" number of times
- *
- * note
- * if "ub" is INFINITY then "new" matches "lb" or more occurrences of "mach"
- */
-
-int mkrep( mach, lb, ub )
-int mach, lb, ub;
- {
- int base_mach, tail, copy, i;
-
- base_mach = copysingl( mach, lb - 1 );
-
- if ( ub == INFINITY )
- {
- copy = dupmachine( mach );
- mach = link_machines( mach,
- link_machines( base_mach, mkclos( copy ) ) );
- }
-
- else
- {
- tail = mkstate( SYM_EPSILON );
-
- for ( i = lb; i < ub; ++i )
- {
- copy = dupmachine( mach );
- tail = mkopt( link_machines( copy, tail ) );
- }
-
- mach = link_machines( mach, link_machines( base_mach, tail ) );
- }
-
- return mach;
- }
-
-
-/* mkstate - create a state with a transition on a given symbol
- *
- * synopsis
- *
- * state = mkstate( sym );
- *
- * state - a new state matching sym
- * sym - the symbol the new state is to have an out-transition on
- *
- * note that this routine makes new states in ascending order through the
- * state array (and increments LASTNFA accordingly). The routine DUPMACHINE
- * relies on machines being made in ascending order and that they are
- * CONTIGUOUS. Change it and you will have to rewrite DUPMACHINE (kludge
- * that it admittedly is)
- */
-
-int mkstate( sym )
-int sym;
- {
- if ( ++lastnfa >= current_mns )
- {
- if ( (current_mns += MNS_INCREMENT) >= MAXIMUM_MNS )
- lerrif(
- _( "input rules are too complicated (>= %d NFA states)" ),
- current_mns );
-
- ++num_reallocs;
-
- firstst = reallocate_integer_array( firstst, current_mns );
- lastst = reallocate_integer_array( lastst, current_mns );
- finalst = reallocate_integer_array( finalst, current_mns );
- transchar = reallocate_integer_array( transchar, current_mns );
- trans1 = reallocate_integer_array( trans1, current_mns );
- trans2 = reallocate_integer_array( trans2, current_mns );
- accptnum = reallocate_integer_array( accptnum, current_mns );
- assoc_rule =
- reallocate_integer_array( assoc_rule, current_mns );
- state_type =
- reallocate_integer_array( state_type, current_mns );
- }
-
- firstst[lastnfa] = lastnfa;
- finalst[lastnfa] = lastnfa;
- lastst[lastnfa] = lastnfa;
- transchar[lastnfa] = sym;
- trans1[lastnfa] = NO_TRANSITION;
- trans2[lastnfa] = NO_TRANSITION;
- accptnum[lastnfa] = NIL;
- assoc_rule[lastnfa] = num_rules;
- state_type[lastnfa] = current_state_type;
-
- /* Fix up equivalence classes base on this transition. Note that any
- * character which has its own transition gets its own equivalence
- * class. Thus only characters which are only in character classes
- * have a chance at being in the same equivalence class. E.g. "a|b"
- * puts 'a' and 'b' into two different equivalence classes. "[ab]"
- * puts them in the same equivalence class (barring other differences
- * elsewhere in the input).
- */
-
- if ( sym < 0 )
- {
- /* We don't have to update the equivalence classes since
- * that was already done when the ccl was created for the
- * first time.
- */
- }
-
- else if ( sym == SYM_EPSILON )
- ++numeps;
-
- else
- {
- check_char( sym );
-
- if ( useecs )
- /* Map NUL's to csize. */
- mkechar( sym ? sym : csize, nextecm, ecgroup );
- }
-
- return lastnfa;
- }
-
-
-/* mkxtion - make a transition from one state to another
- *
- * synopsis
- *
- * mkxtion( statefrom, stateto );
- *
- * statefrom - the state from which the transition is to be made
- * stateto - the state to which the transition is to be made
- */
-
-void mkxtion( statefrom, stateto )
-int statefrom, stateto;
- {
- if ( trans1[statefrom] == NO_TRANSITION )
- trans1[statefrom] = stateto;
-
- else if ( (transchar[statefrom] != SYM_EPSILON) ||
- (trans2[statefrom] != NO_TRANSITION) )
- flexfatal( _( "found too many transitions in mkxtion()" ) );
-
- else
- { /* second out-transition for an epsilon state */
- ++eps2;
- trans2[statefrom] = stateto;
- }
- }
-
-/* new_rule - initialize for a new rule */
-
-void new_rule()
- {
- if ( ++num_rules >= current_max_rules )
- {
- ++num_reallocs;
- current_max_rules += MAX_RULES_INCREMENT;
- rule_type = reallocate_integer_array( rule_type,
- current_max_rules );
- rule_linenum = reallocate_integer_array( rule_linenum,
- current_max_rules );
- rule_useful = reallocate_integer_array( rule_useful,
- current_max_rules );
- }
-
- if ( num_rules > MAX_RULE )
- lerrif( _( "too many rules (> %d)!" ), MAX_RULE );
-
- rule_linenum[num_rules] = linenum;
- rule_useful[num_rules] = false;
- }
diff --git a/usr.bin/lex/parse.y b/usr.bin/lex/parse.y
deleted file mode 100644
index f3b56d8..0000000
--- a/usr.bin/lex/parse.y
+++ /dev/null
@@ -1,914 +0,0 @@
-/* parse.y - parser for flex input */
-
-%token CHAR NUMBER SECTEND SCDECL XSCDECL NAME PREVCCL EOF_OP
-%token OPTION_OP OPT_OUTFILE OPT_PREFIX OPT_YYCLASS
-
-%token CCE_ALNUM CCE_ALPHA CCE_BLANK CCE_CNTRL CCE_DIGIT CCE_GRAPH
-%token CCE_LOWER CCE_PRINT CCE_PUNCT CCE_SPACE CCE_UPPER CCE_XDIGIT
-
-%{
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Vern Paxson.
- *
- * The United States Government has rights in this work pursuant
- * to contract no. DE-AC03-76SF00098 between the United States
- * Department of Energy and the University of California.
- *
- * Redistribution and use in source and binary forms are permitted provided
- * that: (1) source distributions retain this entire copyright notice and
- * comment, and (2) distributions including binaries display the following
- * acknowledgement: ``This product includes software developed by the
- * University of California, Berkeley and its contributors'' in the
- * documentation or other materials provided with the distribution and in
- * all advertising materials mentioning features or use of this software.
- * Neither the name of the University nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/* $Header: /home/daffy/u0/vern/flex/RCS/parse.y,v 2.28 95/04/21 11:51:51 vern Exp $ */
-/* $FreeBSD$ */
-
-
-/* Some versions of bison are broken in that they use alloca() but don't
- * declare it properly. The following is the patented (just kidding!)
- * #ifdef chud to fix the problem, courtesy of Francois Pinard.
- */
-#ifdef YYBISON
-/* AIX requires this to be the first thing in the file. What a piece. */
-# ifdef _AIX
- #pragma alloca
-# endif
-#endif
-
-#include "flexdef.h"
-
-/* The remainder of the alloca() cruft has to come after including flexdef.h,
- * so HAVE_ALLOCA_H is (possibly) defined.
- */
-#ifdef YYBISON
-# ifdef __GNUC__
-# ifndef alloca
-# define alloca __builtin_alloca
-# endif
-# else
-# if HAVE_ALLOCA_H
-# include <alloca.h>
-# else
-# ifdef __hpux
-void *alloca ();
-# else
-# ifdef __TURBOC__
-# include <malloc.h>
-# else
-char *alloca ();
-# endif
-# endif
-# endif
-# endif
-#endif
-
-/* Bletch, ^^^^ that was ugly! */
-
-
-int pat, scnum, eps, headcnt, trailcnt, anyccl, lastchar, i, rulelen;
-int trlcontxt, xcluflg, currccl, cclsorted, varlength, variable_trail_rule;
-
-int *scon_stk;
-int scon_stk_ptr;
-
-static int madeany = false; /* whether we've made the '.' character class */
-int previous_continued_action; /* whether the previous rule's action was '|' */
-
-/* Expand a POSIX character class expression. */
-#define CCL_EXPR(func) \
- { \
- int c; \
- for ( c = 0; c < csize; ++c ) \
- if ( isascii(c) && func(c) ) \
- ccladd( currccl, c ); \
- }
-
-/* While POSIX defines isblank(), it's not ANSI C. */
-#define IS_BLANK(c) ((c) == ' ' || (c) == '\t')
-
-/* On some over-ambitious machines, such as DEC Alpha's, the default
- * token type is "long" instead of "int"; this leads to problems with
- * declaring yylval in flexdef.h. But so far, all the yacc's I've seen
- * wrap their definitions of YYSTYPE with "#ifndef YYSTYPE"'s, so the
- * following should ensure that the default token type is "int".
- */
-#define YYSTYPE int
-
-%}
-
-%%
-goal : initlex sect1 sect1end sect2 initforrule
- { /* add default rule */
- int def_rule;
-
- pat = cclinit();
- cclnegate( pat );
-
- def_rule = mkstate( -pat );
-
- /* Remember the number of the default rule so we
- * don't generate "can't match" warnings for it.
- */
- default_rule = num_rules;
-
- finish_rule( def_rule, false, 0, 0 );
-
- for ( i = 1; i <= lastsc; ++i )
- scset[i] = mkbranch( scset[i], def_rule );
-
- if ( spprdflt )
- add_action(
- "YY_FATAL_ERROR( \"flex scanner jammed\" )" );
- else
- add_action( "ECHO" );
-
- add_action( ";\n\tYY_BREAK\n" );
- }
- ;
-
-initlex :
- { /* initialize for processing rules */
-
- /* Create default DFA start condition. */
- scinstal( "INITIAL", false );
- }
- ;
-
-sect1 : sect1 startconddecl namelist1
- | sect1 options
- |
- | error
- { synerr( "unknown error processing section 1" ); }
- ;
-
-sect1end : SECTEND
- {
- check_options();
- scon_stk = allocate_integer_array( lastsc + 1 );
- scon_stk_ptr = 0;
- }
- ;
-
-startconddecl : SCDECL
- { xcluflg = false; }
-
- | XSCDECL
- { xcluflg = true; }
- ;
-
-namelist1 : namelist1 NAME
- { scinstal( nmstr, xcluflg ); }
-
- | NAME
- { scinstal( nmstr, xcluflg ); }
-
- | error
- { synerr( "bad start condition list" ); }
- ;
-
-options : OPTION_OP optionlist
- ;
-
-optionlist : optionlist option
- |
- ;
-
-option : OPT_OUTFILE '=' NAME
- {
- outfilename = copy_string( nmstr );
- did_outfilename = 1;
- }
- | OPT_PREFIX '=' NAME
- { prefix = copy_string( nmstr ); }
- | OPT_YYCLASS '=' NAME
- { yyclass = copy_string( nmstr ); }
- ;
-
-sect2 : sect2 scon initforrule flexrule '\n'
- { scon_stk_ptr = $2; }
- | sect2 scon '{' sect2 '}'
- { scon_stk_ptr = $2; }
- |
- ;
-
-initforrule :
- {
- /* Initialize for a parse of one rule. */
- trlcontxt = variable_trail_rule = varlength = false;
- trailcnt = headcnt = rulelen = 0;
- current_state_type = STATE_NORMAL;
- previous_continued_action = continued_action;
- in_rule = true;
-
- new_rule();
- }
- ;
-
-flexrule : '^' rule
- {
- pat = $2;
- finish_rule( pat, variable_trail_rule,
- headcnt, trailcnt );
-
- if ( scon_stk_ptr > 0 )
- {
- for ( i = 1; i <= scon_stk_ptr; ++i )
- scbol[scon_stk[i]] =
- mkbranch( scbol[scon_stk[i]],
- pat );
- }
-
- else
- {
- /* Add to all non-exclusive start conditions,
- * including the default (0) start condition.
- */
-
- for ( i = 1; i <= lastsc; ++i )
- if ( ! scxclu[i] )
- scbol[i] = mkbranch( scbol[i],
- pat );
- }
-
- if ( ! bol_needed )
- {
- bol_needed = true;
-
- if ( performance_report > 1 )
- pinpoint_message(
- "'^' operator results in sub-optimal performance" );
- }
- }
-
- | rule
- {
- pat = $1;
- finish_rule( pat, variable_trail_rule,
- headcnt, trailcnt );
-
- if ( scon_stk_ptr > 0 )
- {
- for ( i = 1; i <= scon_stk_ptr; ++i )
- scset[scon_stk[i]] =
- mkbranch( scset[scon_stk[i]],
- pat );
- }
-
- else
- {
- for ( i = 1; i <= lastsc; ++i )
- if ( ! scxclu[i] )
- scset[i] =
- mkbranch( scset[i],
- pat );
- }
- }
-
- | EOF_OP
- {
- if ( scon_stk_ptr > 0 )
- build_eof_action();
-
- else
- {
- /* This EOF applies to all start conditions
- * which don't already have EOF actions.
- */
- for ( i = 1; i <= lastsc; ++i )
- if ( ! sceof[i] )
- scon_stk[++scon_stk_ptr] = i;
-
- if ( scon_stk_ptr == 0 )
- warn(
- "all start conditions already have <<EOF>> rules" );
-
- else
- build_eof_action();
- }
- }
-
- | error
- { synerr( "unrecognized rule" ); }
- ;
-
-scon_stk_ptr :
- { $$ = scon_stk_ptr; }
- ;
-
-scon : '<' scon_stk_ptr namelist2 '>'
- { $$ = $2; }
-
- | '<' '*' '>'
- {
- $$ = scon_stk_ptr;
-
- for ( i = 1; i <= lastsc; ++i )
- {
- int j;
-
- for ( j = 1; j <= scon_stk_ptr; ++j )
- if ( scon_stk[j] == i )
- break;
-
- if ( j > scon_stk_ptr )
- scon_stk[++scon_stk_ptr] = i;
- }
- }
-
- |
- { $$ = scon_stk_ptr; }
- ;
-
-namelist2 : namelist2 ',' sconname
-
- | sconname
-
- | error
- { synerr( "bad start condition list" ); }
- ;
-
-sconname : NAME
- {
- if ( (scnum = sclookup( nmstr )) == 0 )
- format_pinpoint_message(
- "undeclared start condition %s",
- nmstr );
- else
- {
- for ( i = 1; i <= scon_stk_ptr; ++i )
- if ( scon_stk[i] == scnum )
- {
- format_warn(
- "<%s> specified twice",
- scname[scnum] );
- break;
- }
-
- if ( i > scon_stk_ptr )
- scon_stk[++scon_stk_ptr] = scnum;
- }
- }
- ;
-
-rule : re2 re
- {
- if ( transchar[lastst[$2]] != SYM_EPSILON )
- /* Provide final transition \now/ so it
- * will be marked as a trailing context
- * state.
- */
- $2 = link_machines( $2,
- mkstate( SYM_EPSILON ) );
-
- mark_beginning_as_normal( $2 );
- current_state_type = STATE_NORMAL;
-
- if ( previous_continued_action )
- {
- /* We need to treat this as variable trailing
- * context so that the backup does not happen
- * in the action but before the action switch
- * statement. If the backup happens in the
- * action, then the rules "falling into" this
- * one's action will *also* do the backup,
- * erroneously.
- */
- if ( ! varlength || headcnt != 0 )
- warn(
- "trailing context made variable due to preceding '|' action" );
-
- /* Mark as variable. */
- varlength = true;
- headcnt = 0;
- }
-
- if ( lex_compat || (varlength && headcnt == 0) )
- { /* variable trailing context rule */
- /* Mark the first part of the rule as the
- * accepting "head" part of a trailing
- * context rule.
- *
- * By the way, we didn't do this at the
- * beginning of this production because back
- * then current_state_type was set up for a
- * trail rule, and add_accept() can create
- * a new state ...
- */
- add_accept( $1,
- num_rules | YY_TRAILING_HEAD_MASK );
- variable_trail_rule = true;
- }
-
- else
- trailcnt = rulelen;
-
- $$ = link_machines( $1, $2 );
- }
-
- | re2 re '$'
- { synerr( "trailing context used twice" ); }
-
- | re '$'
- {
- headcnt = 0;
- trailcnt = 1;
- rulelen = 1;
- varlength = false;
-
- current_state_type = STATE_TRAILING_CONTEXT;
-
- if ( trlcontxt )
- {
- synerr( "trailing context used twice" );
- $$ = mkstate( SYM_EPSILON );
- }
-
- else if ( previous_continued_action )
- {
- /* See the comment in the rule for "re2 re"
- * above.
- */
- warn(
- "trailing context made variable due to preceding '|' action" );
-
- varlength = true;
- }
-
- if ( lex_compat || varlength )
- {
- /* Again, see the comment in the rule for
- * "re2 re" above.
- */
- add_accept( $1,
- num_rules | YY_TRAILING_HEAD_MASK );
- variable_trail_rule = true;
- }
-
- trlcontxt = true;
-
- eps = mkstate( SYM_EPSILON );
- $$ = link_machines( $1,
- link_machines( eps, mkstate( '\n' ) ) );
- }
-
- | re
- {
- $$ = $1;
-
- if ( trlcontxt )
- {
- if ( lex_compat || (varlength && headcnt == 0) )
- /* Both head and trail are
- * variable-length.
- */
- variable_trail_rule = true;
- else
- trailcnt = rulelen;
- }
- }
- ;
-
-
-re : re '|' series
- {
- varlength = true;
- $$ = mkor( $1, $3 );
- }
-
- | series
- { $$ = $1; }
- ;
-
-
-re2 : re '/'
- {
- /* This rule is written separately so the
- * reduction will occur before the trailing
- * series is parsed.
- */
-
- if ( trlcontxt )
- synerr( "trailing context used twice" );
- else
- trlcontxt = true;
-
- if ( varlength )
- /* We hope the trailing context is
- * fixed-length.
- */
- varlength = false;
- else
- headcnt = rulelen;
-
- rulelen = 0;
-
- current_state_type = STATE_TRAILING_CONTEXT;
- $$ = $1;
- }
- ;
-
-series : series singleton
- {
- /* This is where concatenation of adjacent patterns
- * gets done.
- */
- $$ = link_machines( $1, $2 );
- }
-
- | singleton
- { $$ = $1; }
- ;
-
-singleton : singleton '*'
- {
- varlength = true;
-
- $$ = mkclos( $1 );
- }
-
- | singleton '+'
- {
- varlength = true;
- $$ = mkposcl( $1 );
- }
-
- | singleton '?'
- {
- varlength = true;
- $$ = mkopt( $1 );
- }
-
- | singleton '{' NUMBER ',' NUMBER '}'
- {
- varlength = true;
-
- if ( $3 > $5 || $3 < 0 )
- {
- synerr( "bad iteration values" );
- $$ = $1;
- }
- else
- {
- if ( $3 == 0 )
- {
- if ( $5 <= 0 )
- {
- synerr(
- "bad iteration values" );
- $$ = $1;
- }
- else
- $$ = mkopt(
- mkrep( $1, 1, $5 ) );
- }
- else
- $$ = mkrep( $1, $3, $5 );
- }
- }
-
- | singleton '{' NUMBER ',' '}'
- {
- varlength = true;
-
- if ( $3 <= 0 )
- {
- synerr( "iteration value must be positive" );
- $$ = $1;
- }
-
- else
- $$ = mkrep( $1, $3, INFINITY );
- }
-
- | singleton '{' NUMBER '}'
- {
- /* The singleton could be something like "(foo)",
- * in which case we have no idea what its length
- * is, so we punt here.
- */
- varlength = true;
-
- if ( $3 <= 0 )
- {
- synerr( "iteration value must be positive" );
- $$ = $1;
- }
-
- else
- $$ = link_machines( $1,
- copysingl( $1, $3 - 1 ) );
- }
-
- | '.'
- {
- if ( ! madeany )
- {
- /* Create the '.' character class. */
- anyccl = cclinit();
- ccladd( anyccl, '\n' );
- cclnegate( anyccl );
-
- if ( useecs )
- mkeccl( ccltbl + cclmap[anyccl],
- ccllen[anyccl], nextecm,
- ecgroup, csize, csize );
-
- madeany = true;
- }
-
- ++rulelen;
-
- $$ = mkstate( -anyccl );
- }
-
- | fullccl
- {
- if ( ! cclsorted )
- /* Sort characters for fast searching. We
- * use a shell sort since this list could
- * be large.
- */
- cshell( ccltbl + cclmap[$1], ccllen[$1], true );
-
- if ( useecs )
- mkeccl( ccltbl + cclmap[$1], ccllen[$1],
- nextecm, ecgroup, csize, csize );
-
- ++rulelen;
-
- $$ = mkstate( -$1 );
- }
-
- | PREVCCL
- {
- ++rulelen;
-
- $$ = mkstate( -$1 );
- }
-
- | '"' string '"'
- { $$ = $2; }
-
- | '(' re ')'
- { $$ = $2; }
-
- | CHAR
- {
- ++rulelen;
-
- if ( caseins && $1 >= 'A' && $1 <= 'Z' )
- $1 = clower( $1 );
-
- $$ = mkstate( $1 );
- }
- ;
-
-fullccl : '[' ccl ']'
- { $$ = $2; }
-
- | '[' '^' ccl ']'
- {
- cclnegate( $3 );
- $$ = $3;
- }
- ;
-
-ccl : ccl CHAR '-' CHAR
- {
- if ( caseins )
- {
- if ( $2 >= 'A' && $2 <= 'Z' )
- $2 = clower( $2 );
- if ( $4 >= 'A' && $4 <= 'Z' )
- $4 = clower( $4 );
- }
-
- if ( $2 > $4 )
- synerr( "negative range in character class" );
-
- else
- {
- for ( i = $2; i <= $4; ++i )
- ccladd( $1, i );
-
- /* Keep track if this ccl is staying in
- * alphabetical order.
- */
- cclsorted = cclsorted && ($2 > lastchar);
- lastchar = $4;
- }
-
- $$ = $1;
- }
-
- | ccl CHAR
- {
- if ( caseins && $2 >= 'A' && $2 <= 'Z' )
- $2 = clower( $2 );
-
- ccladd( $1, $2 );
- cclsorted = cclsorted && ($2 > lastchar);
- lastchar = $2;
- $$ = $1;
- }
-
- | ccl ccl_expr
- {
- /* Too hard to properly maintain cclsorted. */
- cclsorted = false;
- $$ = $1;
- }
-
- |
- {
- cclsorted = true;
- lastchar = 0;
- currccl = $$ = cclinit();
- }
- ;
-
-ccl_expr: CCE_ALNUM { CCL_EXPR(isalnum) }
- | CCE_ALPHA { CCL_EXPR(isalpha) }
- | CCE_BLANK { CCL_EXPR(IS_BLANK) }
- | CCE_CNTRL { CCL_EXPR(iscntrl) }
- | CCE_DIGIT { CCL_EXPR(isdigit) }
- | CCE_GRAPH { CCL_EXPR(isgraph) }
- | CCE_LOWER { CCL_EXPR(islower) }
- | CCE_PRINT { CCL_EXPR(isprint) }
- | CCE_PUNCT { CCL_EXPR(ispunct) }
- | CCE_SPACE { CCL_EXPR(isspace) }
- | CCE_UPPER {
- if ( caseins )
- CCL_EXPR(islower)
- else
- CCL_EXPR(isupper)
- }
- | CCE_XDIGIT { CCL_EXPR(isxdigit) }
- ;
-
-string : string CHAR
- {
- if ( caseins && $2 >= 'A' && $2 <= 'Z' )
- $2 = clower( $2 );
-
- ++rulelen;
-
- $$ = link_machines( $1, mkstate( $2 ) );
- }
-
- |
- { $$ = mkstate( SYM_EPSILON ); }
- ;
-
-%%
-
-
-/* build_eof_action - build the "<<EOF>>" action for the active start
- * conditions
- */
-
-void build_eof_action()
- {
- int i;
- char action_text[MAXLINE];
-
- for ( i = 1; i <= scon_stk_ptr; ++i )
- {
- if ( sceof[scon_stk[i]] )
- format_pinpoint_message(
- "multiple <<EOF>> rules for start condition %s",
- scname[scon_stk[i]] );
-
- else
- {
- sceof[scon_stk[i]] = true;
- sprintf( action_text, "case YY_STATE_EOF(%s):\n",
- scname[scon_stk[i]] );
- add_action( action_text );
- }
- }
-
- line_directive_out( (FILE *) 0, 1 );
-
- /* This isn't a normal rule after all - don't count it as
- * such, so we don't have any holes in the rule numbering
- * (which make generating "rule can never match" warnings
- * more difficult.
- */
- --num_rules;
- ++num_eof_rules;
- }
-
-
-/* format_synerr - write out formatted syntax error */
-
-void format_synerr( msg, arg )
-char msg[], arg[];
- {
- char errmsg[MAXLINE];
-
- (void) sprintf( errmsg, msg, arg );
- synerr( errmsg );
- }
-
-
-/* synerr - report a syntax error */
-
-void synerr( str )
-char str[];
- {
- syntaxerror = true;
- pinpoint_message( str );
- }
-
-
-/* format_warn - write out formatted warning */
-
-void format_warn( msg, arg )
-char msg[], arg[];
- {
- char warn_msg[MAXLINE];
-
- (void) sprintf( warn_msg, msg, arg );
- warn( warn_msg );
- }
-
-
-/* warn - report a warning, unless -w was given */
-
-void warn( str )
-char str[];
- {
- line_warning( str, linenum );
- }
-
-/* format_pinpoint_message - write out a message formatted with one string,
- * pinpointing its location
- */
-
-void format_pinpoint_message( msg, arg )
-char msg[], arg[];
- {
- char errmsg[MAXLINE];
-
- (void) sprintf( errmsg, msg, arg );
- pinpoint_message( errmsg );
- }
-
-
-/* pinpoint_message - write out a message, pinpointing its location */
-
-void pinpoint_message( str )
-char str[];
- {
- line_pinpoint( str, linenum );
- }
-
-
-/* line_warning - report a warning at a given line, unless -w was given */
-
-void line_warning( str, line )
-char str[];
-int line;
- {
- char warning[MAXLINE];
-
- if ( ! nowarn )
- {
- sprintf( warning, "warning, %s", str );
- line_pinpoint( warning, line );
- }
- }
-
-
-/* line_pinpoint - write out a message, pinpointing it at the given line */
-
-void line_pinpoint( str, line )
-char str[];
-int line;
- {
- fprintf( stderr, "\"%s\", line %d: %s\n", infilename, line, str );
- }
-
-
-/* yyerror - eat up an error message from the parser;
- * currently, messages are ignore
- */
-
-void yyerror( msg )
-char msg[];
- {
- }
diff --git a/usr.bin/lex/scan.l b/usr.bin/lex/scan.l
deleted file mode 100644
index b109a50..0000000
--- a/usr.bin/lex/scan.l
+++ /dev/null
@@ -1,711 +0,0 @@
-/* scan.l - scanner for flex input */
-
-%{
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Vern Paxson.
- *
- * The United States Government has rights in this work pursuant
- * to contract no. DE-AC03-76SF00098 between the United States
- * Department of Energy and the University of California.
- *
- * Redistribution and use in source and binary forms are permitted provided
- * that: (1) source distributions retain this entire copyright notice and
- * comment, and (2) distributions including binaries display the following
- * acknowledgement: ``This product includes software developed by the
- * University of California, Berkeley and its contributors'' in the
- * documentation or other materials provided with the distribution and in
- * all advertising materials mentioning features or use of this software.
- * Neither the name of the University nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/* $Header: /home/daffy/u0/vern/flex/RCS/scan.l,v 2.56 95/04/24 12:17:19 vern Exp $ */
-/* $FreeBSD$ */
-
-#include "flexdef.h"
-#include "parse.h"
-
-#define ACTION_ECHO add_action( yytext )
-#define ACTION_IFDEF(def, should_define) \
- { \
- if ( should_define ) \
- action_define( def, 1 ); \
- }
-
-#define MARK_END_OF_PROLOG mark_prolog();
-
-#define YY_DECL \
- int flexscan()
-
-#define RETURNCHAR \
- yylval = (unsigned char) yytext[0]; \
- return CHAR;
-
-#define RETURNNAME \
- strcpy( nmstr, yytext ); \
- return NAME;
-
-#define PUT_BACK_STRING(str, start) \
- for ( i = strlen( str ) - 1; i >= start; --i ) \
- unput((str)[i])
-
-#define CHECK_REJECT(str) \
- if ( all_upper( str ) ) \
- reject = true;
-
-#define CHECK_YYMORE(str) \
- if ( all_lower( str ) ) \
- yymore_used = true;
-%}
-
-%option caseless nodefault outfile="scan.c" stack noyy_top_state
-%option nostdinit
-
-%x SECT2 SECT2PROLOG SECT3 CODEBLOCK PICKUPDEF SC CARETISBOL NUM QUOTE
-%x FIRSTCCL CCL ACTION RECOVER COMMENT ACTION_STRING PERCENT_BRACE_ACTION
-%x OPTION LINEDIR
-
-WS [[:blank:]]+
-OPTWS [[:blank:]]*
-NOT_WS [^[:blank:]\n]
-
-NL \r?\n
-
-NAME ([[:alpha:]_][[:alnum:]_-]*)
-NOT_NAME [^[:alpha:]_*\n]+
-
-SCNAME {NAME}
-
-ESCSEQ (\\([^\n]|[0-7]{1,3}|x[[:xdigit:]]{1,2}))
-
-FIRST_CCL_CHAR ([^\\\n]|{ESCSEQ})
-CCL_CHAR ([^\\\n\]]|{ESCSEQ})
-CCL_EXPR ("[:"[[:alpha:]]+":]")
-
-LEXOPT [aceknopr]
-
-%%
- static int bracelevel, didadef, indented_code;
- static int doing_rule_action = false;
- static int option_sense;
-
- int doing_codeblock = false;
- int i;
- Char nmdef[MAXLINE], myesc();
-
-
-<INITIAL>{
- ^{WS} indented_code = true; BEGIN(CODEBLOCK);
- ^"/*" ACTION_ECHO; yy_push_state( COMMENT );
- ^#{OPTWS}line{WS} yy_push_state( LINEDIR );
- ^"%s"{NAME}? return SCDECL;
- ^"%x"{NAME}? return XSCDECL;
- ^"%{".*{NL} {
- ++linenum;
- line_directive_out( (FILE *) 0, 1 );
- indented_code = false;
- BEGIN(CODEBLOCK);
- }
-
- {WS} /* discard */
-
- ^"%%".* {
- sectnum = 2;
- bracelevel = 0;
- mark_defs1();
- line_directive_out( (FILE *) 0, 1 );
- BEGIN(SECT2PROLOG);
- return SECTEND;
- }
-
- ^"%pointer".*{NL} yytext_is_array = false; ++linenum;
- ^"%array".*{NL} yytext_is_array = true; ++linenum;
-
- ^"%option" BEGIN(OPTION); return OPTION_OP;
-
- ^"%"{LEXOPT}{OPTWS}[[:digit:]]*{OPTWS}{NL} ++linenum; /* ignore */
- ^"%"{LEXOPT}{WS}.*{NL} ++linenum; /* ignore */
-
- ^"%"[^sxaceknopr{}].* synerr( _( "unrecognized '%' directive" ) );
-
- ^{NAME} {
- strcpy( nmstr, yytext );
- didadef = false;
- BEGIN(PICKUPDEF);
- }
-
- {SCNAME} RETURNNAME;
- ^{OPTWS}{NL} ++linenum; /* allows blank lines in section 1 */
- {OPTWS}{NL} ACTION_ECHO; ++linenum; /* maybe end of comment line */
-}
-
-
-<COMMENT>{
- "*/" ACTION_ECHO; yy_pop_state();
- "*" ACTION_ECHO;
- [^*\n]+ ACTION_ECHO;
- [^*\n]*{NL} ++linenum; ACTION_ECHO;
-}
-
-<LINEDIR>{
- \n yy_pop_state();
- [[:digit:]]+ linenum = myctoi( yytext );
-
- \"[^"\n]*\" {
- flex_free( (void *) infilename );
- infilename = copy_string( yytext + 1 );
- infilename[strlen( infilename ) - 1] = '\0';
- }
- . /* ignore spurious characters */
-}
-
-<CODEBLOCK>{
- ^"%}".*{NL} ++linenum; BEGIN(INITIAL);
-
- {NAME}|{NOT_NAME}|. ACTION_ECHO;
-
- {NL} {
- ++linenum;
- ACTION_ECHO;
- if ( indented_code )
- BEGIN(INITIAL);
- }
-}
-
-
-<PICKUPDEF>{
- {WS} /* separates name and definition */
-
- {NOT_WS}.* {
- strcpy( (char *) nmdef, yytext );
-
- /* Skip trailing whitespace. */
- for ( i = strlen( (char *) nmdef ) - 1;
- i >= 0 && (nmdef[i] == ' ' || nmdef[i] == '\t');
- --i )
- ;
-
- nmdef[i + 1] = '\0';
-
- ndinstal( nmstr, nmdef );
- didadef = true;
- }
-
- {NL} {
- if ( ! didadef )
- synerr( _( "incomplete name definition" ) );
- BEGIN(INITIAL);
- ++linenum;
- }
-}
-
-
-<OPTION>{
- {NL} ++linenum; BEGIN(INITIAL);
- {WS} option_sense = true;
-
- "=" return '=';
-
- no option_sense = ! option_sense;
-
- 7bit csize = option_sense ? 128 : 256;
- 8bit csize = option_sense ? 256 : 128;
-
- align long_align = option_sense;
- always-interactive {
- action_define( "YY_ALWAYS_INTERACTIVE", option_sense );
- }
- array yytext_is_array = option_sense;
- backup backing_up_report = option_sense;
- batch interactive = ! option_sense;
- "c++" C_plus_plus = option_sense;
- caseful|case-sensitive caseins = ! option_sense;
- caseless|case-insensitive caseins = option_sense;
- debug ddebug = option_sense;
- default spprdflt = ! option_sense;
- ecs useecs = option_sense;
- fast {
- useecs = usemecs = false;
- use_read = fullspd = true;
- }
- full {
- useecs = usemecs = false;
- use_read = fulltbl = true;
- }
- input ACTION_IFDEF("YY_NO_INPUT", ! option_sense);
- interactive interactive = option_sense;
- lex-compat lex_compat = option_sense;
- main {
- action_define( "YY_MAIN", option_sense );
- do_yywrap = ! option_sense;
- }
- meta-ecs usemecs = option_sense;
- never-interactive {
- action_define( "YY_NEVER_INTERACTIVE", option_sense );
- }
- perf-report performance_report += option_sense ? 1 : -1;
- pointer yytext_is_array = ! option_sense;
- read use_read = option_sense;
- reject reject_really_used = option_sense;
- stack action_define( "YY_STACK_USED", option_sense );
- stdinit do_stdinit = option_sense;
- stdout use_stdout = option_sense;
- unput ACTION_IFDEF("YY_NO_UNPUT", ! option_sense);
- verbose printstats = option_sense;
- warn nowarn = ! option_sense;
- yylineno do_yylineno = option_sense;
- yymore yymore_really_used = option_sense;
- yywrap do_yywrap = option_sense;
-
- yy_push_state ACTION_IFDEF("YY_NO_PUSH_STATE", ! option_sense);
- yy_pop_state ACTION_IFDEF("YY_NO_POP_STATE", ! option_sense);
- yy_top_state ACTION_IFDEF("YY_NO_TOP_STATE", ! option_sense);
-
- yy_scan_buffer ACTION_IFDEF("YY_NO_SCAN_BUFFER", ! option_sense);
- yy_scan_bytes ACTION_IFDEF("YY_NO_SCAN_BYTES", ! option_sense);
- yy_scan_string ACTION_IFDEF("YY_NO_SCAN_STRING", ! option_sense);
-
- outfile return OPT_OUTFILE;
- prefix return OPT_PREFIX;
- yyclass return OPT_YYCLASS;
-
- \"[^"\n]*\" {
- strcpy( nmstr, yytext + 1 );
- nmstr[strlen( nmstr ) - 1] = '\0';
- return NAME;
- }
-
- (([a-mo-z]|n[a-np-z])[[:alpha:]\-+]*)|. {
- format_synerr( _( "unrecognized %%option: %s" ),
- yytext );
- BEGIN(RECOVER);
- }
-}
-
-<RECOVER>.*{NL} ++linenum; BEGIN(INITIAL);
-
-
-<SECT2PROLOG>{
- ^"%{".* ++bracelevel; yyless( 2 ); /* eat only %{ */
- ^"%}".* --bracelevel; yyless( 2 ); /* eat only %} */
-
- ^{WS}.* ACTION_ECHO; /* indented code in prolog */
-
- ^{NOT_WS}.* { /* non-indented code */
- if ( bracelevel <= 0 )
- { /* not in %{ ... %} */
- yyless( 0 ); /* put it all back */
- yy_set_bol( 1 );
- mark_prolog();
- BEGIN(SECT2);
- }
- else
- ACTION_ECHO;
- }
-
- .* ACTION_ECHO;
- {NL} ++linenum; ACTION_ECHO;
-
- <<EOF>> {
- mark_prolog();
- sectnum = 0;
- yyterminate(); /* to stop the parser */
- }
-}
-
-<SECT2>{
- ^{OPTWS}{NL} ++linenum; /* allow blank lines in section 2 */
-
- ^{OPTWS}"%{" {
- indented_code = false;
- doing_codeblock = true;
- bracelevel = 1;
- BEGIN(PERCENT_BRACE_ACTION);
- }
-
- ^{OPTWS}"<" BEGIN(SC); return '<';
- ^{OPTWS}"^" return '^';
- \" BEGIN(QUOTE); return '"';
- "{"/[[:digit:]] BEGIN(NUM); return '{';
- "$"/([[:blank:]]|{NL}) return '$';
-
- {WS}"%{" {
- bracelevel = 1;
- BEGIN(PERCENT_BRACE_ACTION);
-
- if ( in_rule )
- {
- doing_rule_action = true;
- in_rule = false;
- return '\n';
- }
- }
- {WS}"|".*{NL} continued_action = true; ++linenum; return '\n';
-
- ^{WS}"/*" {
- yyless( yyleng - 2 ); /* put back '/', '*' */
- bracelevel = 0;
- continued_action = false;
- BEGIN(ACTION);
- }
-
- ^{WS} /* allow indented rules */
-
- {WS} {
- /* This rule is separate from the one below because
- * otherwise we get variable trailing context, so
- * we can't build the scanner using -{f,F}.
- */
- bracelevel = 0;
- continued_action = false;
- BEGIN(ACTION);
-
- if ( in_rule )
- {
- doing_rule_action = true;
- in_rule = false;
- return '\n';
- }
- }
-
- {OPTWS}{NL} {
- bracelevel = 0;
- continued_action = false;
- BEGIN(ACTION);
- unput( '\n' ); /* so <ACTION> sees it */
-
- if ( in_rule )
- {
- doing_rule_action = true;
- in_rule = false;
- return '\n';
- }
- }
-
- ^{OPTWS}"<<EOF>>" |
- "<<EOF>>" return EOF_OP;
-
- ^"%%".* {
- sectnum = 3;
- BEGIN(SECT3);
- yyterminate(); /* to stop the parser */
- }
-
- "["({FIRST_CCL_CHAR}|{CCL_EXPR})({CCL_CHAR}|{CCL_EXPR})* {
- int cclval;
-
- strcpy( nmstr, yytext );
-
- /* Check to see if we've already encountered this
- * ccl.
- */
- if ( (cclval = ccllookup( (Char *) nmstr )) != 0 )
- {
- if ( input() != ']' )
- synerr( _( "bad character class" ) );
-
- yylval = cclval;
- ++cclreuse;
- return PREVCCL;
- }
- else
- {
- /* We fudge a bit. We know that this ccl will
- * soon be numbered as lastccl + 1 by cclinit.
- */
- cclinstal( (Char *) nmstr, lastccl + 1 );
-
- /* Push back everything but the leading bracket
- * so the ccl can be rescanned.
- */
- yyless( 1 );
-
- BEGIN(FIRSTCCL);
- return '[';
- }
- }
-
- "{"{NAME}"}" {
- Char *nmdefptr;
- Char *ndlookup();
-
- strcpy( nmstr, yytext + 1 );
- nmstr[yyleng - 2] = '\0'; /* chop trailing brace */
-
- if ( (nmdefptr = ndlookup( nmstr )) == 0 )
- format_synerr(
- _( "undefined definition {%s}" ),
- nmstr );
-
- else
- { /* push back name surrounded by ()'s */
- int len = strlen( (char *) nmdefptr );
-
- if ( lex_compat || nmdefptr[0] == '^' ||
- (len > 0 && nmdefptr[len - 1] == '$') )
- { /* don't use ()'s after all */
- PUT_BACK_STRING((char *) nmdefptr, 0);
-
- if ( nmdefptr[0] == '^' )
- BEGIN(CARETISBOL);
- }
-
- else
- {
- unput(')');
- PUT_BACK_STRING((char *) nmdefptr, 0);
- unput('(');
- }
- }
- }
-
- [/|*+?.(){}] return (unsigned char) yytext[0];
- . RETURNCHAR;
-}
-
-
-<SC>{
- [,*] return (unsigned char) yytext[0];
- ">" BEGIN(SECT2); return '>';
- ">"/^ BEGIN(CARETISBOL); return '>';
- {SCNAME} RETURNNAME;
- . {
- format_synerr( _( "bad <start condition>: %s" ),
- yytext );
- }
-}
-
-<CARETISBOL>"^" BEGIN(SECT2); return '^';
-
-
-<QUOTE>{
- [^"\n] RETURNCHAR;
- \" BEGIN(SECT2); return '"';
-
- {NL} {
- synerr( _( "missing quote" ) );
- BEGIN(SECT2);
- ++linenum;
- return '"';
- }
-}
-
-
-<FIRSTCCL>{
- "^"/[^-\]\n] BEGIN(CCL); return '^';
- "^"/("-"|"]") return '^';
- . BEGIN(CCL); RETURNCHAR;
-}
-
-<CCL>{
- -/[^\]\n] return '-';
- [^\]\n] RETURNCHAR;
- "]" BEGIN(SECT2); return ']';
- .|{NL} {
- synerr( _( "bad character class" ) );
- BEGIN(SECT2);
- return ']';
- }
-}
-
-<FIRSTCCL,CCL>{
- "[:alnum:]" BEGIN(CCL); return CCE_ALNUM;
- "[:alpha:]" BEGIN(CCL); return CCE_ALPHA;
- "[:blank:]" BEGIN(CCL); return CCE_BLANK;
- "[:cntrl:]" BEGIN(CCL); return CCE_CNTRL;
- "[:digit:]" BEGIN(CCL); return CCE_DIGIT;
- "[:graph:]" BEGIN(CCL); return CCE_GRAPH;
- "[:lower:]" BEGIN(CCL); return CCE_LOWER;
- "[:print:]" BEGIN(CCL); return CCE_PRINT;
- "[:punct:]" BEGIN(CCL); return CCE_PUNCT;
- "[:space:]" BEGIN(CCL); return CCE_SPACE;
- "[:upper:]" BEGIN(CCL); return CCE_UPPER;
- "[:xdigit:]" BEGIN(CCL); return CCE_XDIGIT;
- {CCL_EXPR} {
- format_synerr(
- _( "bad character class expression: %s" ),
- yytext );
- BEGIN(CCL); return CCE_ALNUM;
- }
-}
-
-<NUM>{
- [[:digit:]]+ {
- yylval = myctoi( yytext );
- return NUMBER;
- }
-
- "," return ',';
- "}" BEGIN(SECT2); return '}';
-
- . {
- synerr( _( "bad character inside {}'s" ) );
- BEGIN(SECT2);
- return '}';
- }
-
- {NL} {
- synerr( _( "missing }" ) );
- BEGIN(SECT2);
- ++linenum;
- return '}';
- }
-}
-
-
-<PERCENT_BRACE_ACTION>{
- {OPTWS}"%}".* bracelevel = 0;
-
- <ACTION>"/*" ACTION_ECHO; yy_push_state( COMMENT );
-
- <CODEBLOCK,ACTION>{
- "reject" {
- ACTION_ECHO;
- CHECK_REJECT(yytext);
- }
- "yymore" {
- ACTION_ECHO;
- CHECK_YYMORE(yytext);
- }
- }
-
- {NAME}|{NOT_NAME}|. ACTION_ECHO;
- {NL} {
- ++linenum;
- ACTION_ECHO;
- if ( bracelevel == 0 ||
- (doing_codeblock && indented_code) )
- {
- if ( doing_rule_action )
- add_action( "\tYY_BREAK\n" );
-
- doing_rule_action = doing_codeblock = false;
- BEGIN(SECT2);
- }
- }
-}
-
-
- /* Reject and YYmore() are checked for above, in PERCENT_BRACE_ACTION */
-<ACTION>{
- "{" ACTION_ECHO; ++bracelevel;
- "}" ACTION_ECHO; --bracelevel;
- [^[:alpha:]_{}"'/\n]+ ACTION_ECHO;
- {NAME} ACTION_ECHO;
- "'"([^'\\\n]|\\.)*"'" ACTION_ECHO; /* character constant */
- \" ACTION_ECHO; BEGIN(ACTION_STRING);
- {NL} {
- ++linenum;
- ACTION_ECHO;
- if ( bracelevel == 0 )
- {
- if ( doing_rule_action )
- add_action( "\tYY_BREAK\n" );
-
- doing_rule_action = false;
- BEGIN(SECT2);
- }
- }
- . ACTION_ECHO;
-}
-
-<ACTION_STRING>{
- [^"\\\n]+ ACTION_ECHO;
- \\. ACTION_ECHO;
- {NL} ++linenum; ACTION_ECHO;
- \" ACTION_ECHO; BEGIN(ACTION);
- . ACTION_ECHO;
-}
-
-<COMMENT,ACTION,ACTION_STRING><<EOF>> {
- synerr( _( "EOF encountered inside an action" ) );
- yyterminate();
- }
-
-
-<SECT2,QUOTE,FIRSTCCL,CCL>{ESCSEQ} {
- yylval = myesc( (Char *) yytext );
-
- if ( YY_START == FIRSTCCL )
- BEGIN(CCL);
-
- return CHAR;
- }
-
-
-<SECT3>{
- .*(\n?) ECHO;
- <<EOF>> sectnum = 0; yyterminate();
-}
-
-<*>.|\n format_synerr( _( "bad character: %s" ), yytext );
-
-%%
-
-
-int yywrap()
- {
- if ( --num_input_files > 0 )
- {
- set_input_file( *++input_files );
- return 0;
- }
-
- else
- return 1;
- }
-
-
-/* set_input_file - open the given file (if NULL, stdin) for scanning */
-
-void set_input_file( file )
-char *file;
- {
- if ( file && strcmp( file, "-" ) )
- {
- infilename = copy_string( file );
- yyin = fopen( infilename, "r" );
-
- if ( yyin == NULL )
- lerrsf( _( "can't open %s" ), file );
- }
-
- else
- {
- yyin = stdin;
- infilename = copy_string( "<stdin>" );
- }
-
- linenum = 1;
- }
-
-
-/* Wrapper routines for accessing the scanner's malloc routines. */
-
-void *flex_alloc( size )
-size_t size;
- {
- return (void *) malloc( size );
- }
-
-void *flex_realloc( ptr, size )
-void *ptr;
-size_t size;
- {
- return (void *) realloc( ptr, size );
- }
-
-void flex_free( ptr )
-void *ptr;
- {
- if ( ptr )
- free( ptr );
- }
diff --git a/usr.bin/lex/sym.c b/usr.bin/lex/sym.c
deleted file mode 100644
index 2f43b50..0000000
--- a/usr.bin/lex/sym.c
+++ /dev/null
@@ -1,264 +0,0 @@
-/* sym - symbol table routines */
-
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Vern Paxson.
- *
- * The United States Government has rights in this work pursuant
- * to contract no. DE-AC03-76SF00098 between the United States
- * Department of Energy and the University of California.
- *
- * Redistribution and use in source and binary forms are permitted provided
- * that: (1) source distributions retain this entire copyright notice and
- * comment, and (2) distributions including binaries display the following
- * acknowledgement: ``This product includes software developed by the
- * University of California, Berkeley and its contributors'' in the
- * documentation or other materials provided with the distribution and in
- * all advertising materials mentioning features or use of this software.
- * Neither the name of the University nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/* $Header: /home/daffy/u0/vern/flex/RCS/sym.c,v 2.19 95/03/04 16:11:04 vern Exp $ */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "flexdef.h"
-
-
-/* declare functions that have forward references */
-
-int hashfunct PROTO((char[], int));
-
-
-struct hash_entry *ndtbl[NAME_TABLE_HASH_SIZE];
-struct hash_entry *sctbl[START_COND_HASH_SIZE];
-struct hash_entry *ccltab[CCL_HASH_SIZE];
-
-struct hash_entry *findsym();
-
-
-/* addsym - add symbol and definitions to symbol table
- *
- * -1 is returned if the symbol already exists, and the change not made.
- */
-
-int addsym( sym, str_def, int_def, table, table_size )
-char sym[];
-char *str_def;
-int int_def;
-hash_table table;
-int table_size;
- {
- int hash_val = hashfunct( sym, table_size );
- struct hash_entry *sym_entry = table[hash_val];
- struct hash_entry *new_entry;
- struct hash_entry *successor;
-
- while ( sym_entry )
- {
- if ( ! strcmp( sym, sym_entry->name ) )
- { /* entry already exists */
- return -1;
- }
-
- sym_entry = sym_entry->next;
- }
-
- /* create new entry */
- new_entry = (struct hash_entry *)
- flex_alloc( sizeof( struct hash_entry ) );
-
- if ( new_entry == NULL )
- flexfatal( _( "symbol table memory allocation failed" ) );
-
- if ( (successor = table[hash_val]) != 0 )
- {
- new_entry->next = successor;
- successor->prev = new_entry;
- }
- else
- new_entry->next = NULL;
-
- new_entry->prev = NULL;
- new_entry->name = sym;
- new_entry->str_val = str_def;
- new_entry->int_val = int_def;
-
- table[hash_val] = new_entry;
-
- return 0;
- }
-
-
-/* cclinstal - save the text of a character class */
-
-void cclinstal( ccltxt, cclnum )
-Char ccltxt[];
-int cclnum;
- {
- /* We don't bother checking the return status because we are not
- * called unless the symbol is new.
- */
- Char *copy_unsigned_string();
-
- (void) addsym( (char *) copy_unsigned_string( ccltxt ),
- (char *) 0, cclnum,
- ccltab, CCL_HASH_SIZE );
- }
-
-
-/* ccllookup - lookup the number associated with character class text
- *
- * Returns 0 if there's no CCL associated with the text.
- */
-
-int ccllookup( ccltxt )
-Char ccltxt[];
- {
- return findsym( (char *) ccltxt, ccltab, CCL_HASH_SIZE )->int_val;
- }
-
-
-/* findsym - find symbol in symbol table */
-
-struct hash_entry *findsym( sym, table, table_size )
-char sym[];
-hash_table table;
-int table_size;
- {
- static struct hash_entry empty_entry =
- {
- (struct hash_entry *) 0, (struct hash_entry *) 0,
- (char *) 0, (char *) 0, 0,
- } ;
- struct hash_entry *sym_entry =
- table[hashfunct( sym, table_size )];
-
- while ( sym_entry )
- {
- if ( ! strcmp( sym, sym_entry->name ) )
- return sym_entry;
- sym_entry = sym_entry->next;
- }
-
- return &empty_entry;
- }
-
-
-/* hashfunct - compute the hash value for "str" and hash size "hash_size" */
-
-int hashfunct( str, hash_size )
-char str[];
-int hash_size;
- {
- int hashval;
- int locstr;
-
- hashval = 0;
- locstr = 0;
-
- while ( str[locstr] )
- {
- hashval = (hashval << 1) + (unsigned char) str[locstr++];
- hashval %= hash_size;
- }
-
- return hashval;
- }
-
-
-/* ndinstal - install a name definition */
-
-void ndinstal( name, definition )
-char name[];
-Char definition[];
- {
- char *copy_string();
- Char *copy_unsigned_string();
-
- if ( addsym( copy_string( name ),
- (char *) copy_unsigned_string( definition ), 0,
- ndtbl, NAME_TABLE_HASH_SIZE ) )
- synerr( _( "name defined twice" ) );
- }
-
-
-/* ndlookup - lookup a name definition
- *
- * Returns a nil pointer if the name definition does not exist.
- */
-
-Char *ndlookup( nd )
-char nd[];
- {
- return (Char *) findsym( nd, ndtbl, NAME_TABLE_HASH_SIZE )->str_val;
- }
-
-
-/* scextend - increase the maximum number of start conditions */
-
-void scextend()
- {
- current_max_scs += MAX_SCS_INCREMENT;
-
- ++num_reallocs;
-
- scset = reallocate_integer_array( scset, current_max_scs );
- scbol = reallocate_integer_array( scbol, current_max_scs );
- scxclu = reallocate_integer_array( scxclu, current_max_scs );
- sceof = reallocate_integer_array( sceof, current_max_scs );
- scname = reallocate_char_ptr_array( scname, current_max_scs );
- }
-
-
-/* scinstal - make a start condition
- *
- * NOTE
- * The start condition is "exclusive" if xcluflg is true.
- */
-
-void scinstal( str, xcluflg )
-char str[];
-int xcluflg;
- {
- char *copy_string();
-
- /* Generate start condition definition, for use in BEGIN et al. */
- action_define( str, lastsc );
-
- if ( ++lastsc >= current_max_scs )
- scextend();
-
- scname[lastsc] = copy_string( str );
-
- if ( addsym( scname[lastsc], (char *) 0, lastsc,
- sctbl, START_COND_HASH_SIZE ) )
- format_pinpoint_message(
- _( "start condition %s declared twice" ),
- str );
-
- scset[lastsc] = mkstate( SYM_EPSILON );
- scbol[lastsc] = mkstate( SYM_EPSILON );
- scxclu[lastsc] = xcluflg;
- sceof[lastsc] = false;
- }
-
-
-/* sclookup - lookup the number associated with a start condition
- *
- * Returns 0 if no such start condition.
- */
-
-int sclookup( str )
-char str[];
- {
- return findsym( str, sctbl, START_COND_HASH_SIZE )->int_val;
- }
diff --git a/usr.bin/lex/tblcmp.c b/usr.bin/lex/tblcmp.c
deleted file mode 100644
index 12af3dc..0000000
--- a/usr.bin/lex/tblcmp.c
+++ /dev/null
@@ -1,889 +0,0 @@
-/* tblcmp - table compression routines */
-
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Vern Paxson.
- *
- * The United States Government has rights in this work pursuant
- * to contract no. DE-AC03-76SF00098 between the United States
- * Department of Energy and the University of California.
- *
- * Redistribution and use in source and binary forms are permitted provided
- * that: (1) source distributions retain this entire copyright notice and
- * comment, and (2) distributions including binaries display the following
- * acknowledgement: ``This product includes software developed by the
- * University of California, Berkeley and its contributors'' in the
- * documentation or other materials provided with the distribution and in
- * all advertising materials mentioning features or use of this software.
- * Neither the name of the University nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/* $Header: /home/daffy/u0/vern/flex/RCS/tblcmp.c,v 2.11 94/11/05 17:08:28 vern Exp $ */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "flexdef.h"
-
-
-/* declarations for functions that have forward references */
-
-void mkentry PROTO((int*, int, int, int, int));
-void mkprot PROTO((int[], int, int));
-void mktemplate PROTO((int[], int, int));
-void mv2front PROTO((int));
-int tbldiff PROTO((int[], int, int[]));
-
-
-/* bldtbl - build table entries for dfa state
- *
- * synopsis
- * int state[numecs], statenum, totaltrans, comstate, comfreq;
- * bldtbl( state, statenum, totaltrans, comstate, comfreq );
- *
- * State is the statenum'th dfa state. It is indexed by equivalence class and
- * gives the number of the state to enter for a given equivalence class.
- * totaltrans is the total number of transitions out of the state. Comstate
- * is that state which is the destination of the most transitions out of State.
- * Comfreq is how many transitions there are out of State to Comstate.
- *
- * A note on terminology:
- * "protos" are transition tables which have a high probability of
- * either being redundant (a state processed later will have an identical
- * transition table) or nearly redundant (a state processed later will have
- * many of the same out-transitions). A "most recently used" queue of
- * protos is kept around with the hope that most states will find a proto
- * which is similar enough to be usable, and therefore compacting the
- * output tables.
- * "templates" are a special type of proto. If a transition table is
- * homogeneous or nearly homogeneous (all transitions go to the same
- * destination) then the odds are good that future states will also go
- * to the same destination state on basically the same character set.
- * These homogeneous states are so common when dealing with large rule
- * sets that they merit special attention. If the transition table were
- * simply made into a proto, then (typically) each subsequent, similar
- * state will differ from the proto for two out-transitions. One of these
- * out-transitions will be that character on which the proto does not go
- * to the common destination, and one will be that character on which the
- * state does not go to the common destination. Templates, on the other
- * hand, go to the common state on EVERY transition character, and therefore
- * cost only one difference.
- */
-
-void bldtbl( state, statenum, totaltrans, comstate, comfreq )
-int state[], statenum, totaltrans, comstate, comfreq;
- {
- int extptr, extrct[2][CSIZE + 1];
- int mindiff, minprot, i, d;
-
- /* If extptr is 0 then the first array of extrct holds the result
- * of the "best difference" to date, which is those transitions
- * which occur in "state" but not in the proto which, to date,
- * has the fewest differences between itself and "state". If
- * extptr is 1 then the second array of extrct hold the best
- * difference. The two arrays are toggled between so that the
- * best difference to date can be kept around and also a difference
- * just created by checking against a candidate "best" proto.
- */
-
- extptr = 0;
-
- /* If the state has too few out-transitions, don't bother trying to
- * compact its tables.
- */
-
- if ( (totaltrans * 100) < (numecs * PROTO_SIZE_PERCENTAGE) )
- mkentry( state, numecs, statenum, JAMSTATE, totaltrans );
-
- else
- {
- /* "checkcom" is true if we should only check "state" against
- * protos which have the same "comstate" value.
- */
- int checkcom =
- comfreq * 100 > totaltrans * CHECK_COM_PERCENTAGE;
-
- minprot = firstprot;
- mindiff = totaltrans;
-
- if ( checkcom )
- {
- /* Find first proto which has the same "comstate". */
- for ( i = firstprot; i != NIL; i = protnext[i] )
- if ( protcomst[i] == comstate )
- {
- minprot = i;
- mindiff = tbldiff( state, minprot,
- extrct[extptr] );
- break;
- }
- }
-
- else
- {
- /* Since we've decided that the most common destination
- * out of "state" does not occur with a high enough
- * frequency, we set the "comstate" to zero, assuring
- * that if this state is entered into the proto list,
- * it will not be considered a template.
- */
- comstate = 0;
-
- if ( firstprot != NIL )
- {
- minprot = firstprot;
- mindiff = tbldiff( state, minprot,
- extrct[extptr] );
- }
- }
-
- /* We now have the first interesting proto in "minprot". If
- * it matches within the tolerances set for the first proto,
- * we don't want to bother scanning the rest of the proto list
- * to see if we have any other reasonable matches.
- */
-
- if ( mindiff * 100 > totaltrans * FIRST_MATCH_DIFF_PERCENTAGE )
- {
- /* Not a good enough match. Scan the rest of the
- * protos.
- */
- for ( i = minprot; i != NIL; i = protnext[i] )
- {
- d = tbldiff( state, i, extrct[1 - extptr] );
- if ( d < mindiff )
- {
- extptr = 1 - extptr;
- mindiff = d;
- minprot = i;
- }
- }
- }
-
- /* Check if the proto we've decided on as our best bet is close
- * enough to the state we want to match to be usable.
- */
-
- if ( mindiff * 100 > totaltrans * ACCEPTABLE_DIFF_PERCENTAGE )
- {
- /* No good. If the state is homogeneous enough,
- * we make a template out of it. Otherwise, we
- * make a proto.
- */
-
- if ( comfreq * 100 >=
- totaltrans * TEMPLATE_SAME_PERCENTAGE )
- mktemplate( state, statenum, comstate );
-
- else
- {
- mkprot( state, statenum, comstate );
- mkentry( state, numecs, statenum,
- JAMSTATE, totaltrans );
- }
- }
-
- else
- { /* use the proto */
- mkentry( extrct[extptr], numecs, statenum,
- prottbl[minprot], mindiff );
-
- /* If this state was sufficiently different from the
- * proto we built it from, make it, too, a proto.
- */
-
- if ( mindiff * 100 >=
- totaltrans * NEW_PROTO_DIFF_PERCENTAGE )
- mkprot( state, statenum, comstate );
-
- /* Since mkprot added a new proto to the proto queue,
- * it's possible that "minprot" is no longer on the
- * proto queue (if it happened to have been the last
- * entry, it would have been bumped off). If it's
- * not there, then the new proto took its physical
- * place (though logically the new proto is at the
- * beginning of the queue), so in that case the
- * following call will do nothing.
- */
-
- mv2front( minprot );
- }
- }
- }
-
-
-/* cmptmps - compress template table entries
- *
- * Template tables are compressed by using the 'template equivalence
- * classes', which are collections of transition character equivalence
- * classes which always appear together in templates - really meta-equivalence
- * classes.
- */
-
-void cmptmps()
- {
- int tmpstorage[CSIZE + 1];
- int *tmp = tmpstorage, i, j;
- int totaltrans, trans;
-
- peakpairs = numtemps * numecs + tblend;
-
- if ( usemecs )
- {
- /* Create equivalence classes based on data gathered on
- * template transitions.
- */
- nummecs = cre8ecs( tecfwd, tecbck, numecs );
- }
-
- else
- nummecs = numecs;
-
- while ( lastdfa + numtemps + 1 >= current_max_dfas )
- increase_max_dfas();
-
- /* Loop through each template. */
-
- for ( i = 1; i <= numtemps; ++i )
- {
- /* Number of non-jam transitions out of this template. */
- totaltrans = 0;
-
- for ( j = 1; j <= numecs; ++j )
- {
- trans = tnxt[numecs * i + j];
-
- if ( usemecs )
- {
- /* The absolute value of tecbck is the
- * meta-equivalence class of a given
- * equivalence class, as set up by cre8ecs().
- */
- if ( tecbck[j] > 0 )
- {
- tmp[tecbck[j]] = trans;
-
- if ( trans > 0 )
- ++totaltrans;
- }
- }
-
- else
- {
- tmp[j] = trans;
-
- if ( trans > 0 )
- ++totaltrans;
- }
- }
-
- /* It is assumed (in a rather subtle way) in the skeleton
- * that if we're using meta-equivalence classes, the def[]
- * entry for all templates is the jam template, i.e.,
- * templates never default to other non-jam table entries
- * (e.g., another template)
- */
-
- /* Leave room for the jam-state after the last real state. */
- mkentry( tmp, nummecs, lastdfa + i + 1, JAMSTATE, totaltrans );
- }
- }
-
-
-
-/* expand_nxt_chk - expand the next check arrays */
-
-void expand_nxt_chk()
- {
- int old_max = current_max_xpairs;
-
- current_max_xpairs += MAX_XPAIRS_INCREMENT;
-
- ++num_reallocs;
-
- nxt = reallocate_integer_array( nxt, current_max_xpairs );
- chk = reallocate_integer_array( chk, current_max_xpairs );
-
- zero_out( (char *) (chk + old_max),
- (size_t) (MAX_XPAIRS_INCREMENT * sizeof( int )) );
- }
-
-
-/* find_table_space - finds a space in the table for a state to be placed
- *
- * synopsis
- * int *state, numtrans, block_start;
- * int find_table_space();
- *
- * block_start = find_table_space( state, numtrans );
- *
- * State is the state to be added to the full speed transition table.
- * Numtrans is the number of out-transitions for the state.
- *
- * find_table_space() returns the position of the start of the first block (in
- * chk) able to accommodate the state
- *
- * In determining if a state will or will not fit, find_table_space() must take
- * into account the fact that an end-of-buffer state will be added at [0],
- * and an action number will be added in [-1].
- */
-
-int find_table_space( state, numtrans )
-int *state, numtrans;
- {
- /* Firstfree is the position of the first possible occurrence of two
- * consecutive unused records in the chk and nxt arrays.
- */
- int i;
- int *state_ptr, *chk_ptr;
- int *ptr_to_last_entry_in_state;
-
- /* If there are too many out-transitions, put the state at the end of
- * nxt and chk.
- */
- if ( numtrans > MAX_XTIONS_FULL_INTERIOR_FIT )
- {
- /* If table is empty, return the first available spot in
- * chk/nxt, which should be 1.
- */
- if ( tblend < 2 )
- return 1;
-
- /* Start searching for table space near the end of
- * chk/nxt arrays.
- */
- i = tblend - numecs;
- }
-
- else
- /* Start searching for table space from the beginning
- * (skipping only the elements which will definitely not
- * hold the new state).
- */
- i = firstfree;
-
- while ( 1 ) /* loops until a space is found */
- {
- while ( i + numecs >= current_max_xpairs )
- expand_nxt_chk();
-
- /* Loops until space for end-of-buffer and action number
- * are found.
- */
- while ( 1 )
- {
- /* Check for action number space. */
- if ( chk[i - 1] == 0 )
- {
- /* Check for end-of-buffer space. */
- if ( chk[i] == 0 )
- break;
-
- else
- /* Since i != 0, there is no use
- * checking to see if (++i) - 1 == 0,
- * because that's the same as i == 0,
- * so we skip a space.
- */
- i += 2;
- }
-
- else
- ++i;
-
- while ( i + numecs >= current_max_xpairs )
- expand_nxt_chk();
- }
-
- /* If we started search from the beginning, store the new
- * firstfree for the next call of find_table_space().
- */
- if ( numtrans <= MAX_XTIONS_FULL_INTERIOR_FIT )
- firstfree = i + 1;
-
- /* Check to see if all elements in chk (and therefore nxt)
- * that are needed for the new state have not yet been taken.
- */
-
- state_ptr = &state[1];
- ptr_to_last_entry_in_state = &chk[i + numecs + 1];
-
- for ( chk_ptr = &chk[i + 1];
- chk_ptr != ptr_to_last_entry_in_state; ++chk_ptr )
- if ( *(state_ptr++) != 0 && *chk_ptr != 0 )
- break;
-
- if ( chk_ptr == ptr_to_last_entry_in_state )
- return i;
-
- else
- ++i;
- }
- }
-
-
-/* inittbl - initialize transition tables
- *
- * Initializes "firstfree" to be one beyond the end of the table. Initializes
- * all "chk" entries to be zero.
- */
-void inittbl()
- {
- int i;
-
- zero_out( (char *) chk, (size_t) (current_max_xpairs * sizeof( int )) );
-
- tblend = 0;
- firstfree = tblend + 1;
- numtemps = 0;
-
- if ( usemecs )
- {
- /* Set up doubly-linked meta-equivalence classes; these
- * are sets of equivalence classes which all have identical
- * transitions out of TEMPLATES.
- */
-
- tecbck[1] = NIL;
-
- for ( i = 2; i <= numecs; ++i )
- {
- tecbck[i] = i - 1;
- tecfwd[i - 1] = i;
- }
-
- tecfwd[numecs] = NIL;
- }
- }
-
-
-/* mkdeftbl - make the default, "jam" table entries */
-
-void mkdeftbl()
- {
- int i;
-
- jamstate = lastdfa + 1;
-
- ++tblend; /* room for transition on end-of-buffer character */
-
- while ( tblend + numecs >= current_max_xpairs )
- expand_nxt_chk();
-
- /* Add in default end-of-buffer transition. */
- nxt[tblend] = end_of_buffer_state;
- chk[tblend] = jamstate;
-
- for ( i = 1; i <= numecs; ++i )
- {
- nxt[tblend + i] = 0;
- chk[tblend + i] = jamstate;
- }
-
- jambase = tblend;
-
- base[jamstate] = jambase;
- def[jamstate] = 0;
-
- tblend += numecs;
- ++numtemps;
- }
-
-
-/* mkentry - create base/def and nxt/chk entries for transition array
- *
- * synopsis
- * int state[numchars + 1], numchars, statenum, deflink, totaltrans;
- * mkentry( state, numchars, statenum, deflink, totaltrans );
- *
- * "state" is a transition array "numchars" characters in size, "statenum"
- * is the offset to be used into the base/def tables, and "deflink" is the
- * entry to put in the "def" table entry. If "deflink" is equal to
- * "JAMSTATE", then no attempt will be made to fit zero entries of "state"
- * (i.e., jam entries) into the table. It is assumed that by linking to
- * "JAMSTATE" they will be taken care of. In any case, entries in "state"
- * marking transitions to "SAME_TRANS" are treated as though they will be
- * taken care of by whereever "deflink" points. "totaltrans" is the total
- * number of transitions out of the state. If it is below a certain threshold,
- * the tables are searched for an interior spot that will accommodate the
- * state array.
- */
-
-void mkentry( state, numchars, statenum, deflink, totaltrans )
-int *state;
-int numchars, statenum, deflink, totaltrans;
- {
- int minec, maxec, i, baseaddr;
- int tblbase, tbllast;
-
- if ( totaltrans == 0 )
- { /* there are no out-transitions */
- if ( deflink == JAMSTATE )
- base[statenum] = JAMSTATE;
- else
- base[statenum] = 0;
-
- def[statenum] = deflink;
- return;
- }
-
- for ( minec = 1; minec <= numchars; ++minec )
- {
- if ( state[minec] != SAME_TRANS )
- if ( state[minec] != 0 || deflink != JAMSTATE )
- break;
- }
-
- if ( totaltrans == 1 )
- {
- /* There's only one out-transition. Save it for later to fill
- * in holes in the tables.
- */
- stack1( statenum, minec, state[minec], deflink );
- return;
- }
-
- for ( maxec = numchars; maxec > 0; --maxec )
- {
- if ( state[maxec] != SAME_TRANS )
- if ( state[maxec] != 0 || deflink != JAMSTATE )
- break;
- }
-
- /* Whether we try to fit the state table in the middle of the table
- * entries we have already generated, or if we just take the state
- * table at the end of the nxt/chk tables, we must make sure that we
- * have a valid base address (i.e., non-negative). Note that
- * negative base addresses dangerous at run-time (because indexing
- * the nxt array with one and a low-valued character will access
- * memory before the start of the array.
- */
-
- /* Find the first transition of state that we need to worry about. */
- if ( totaltrans * 100 <= numchars * INTERIOR_FIT_PERCENTAGE )
- {
- /* Attempt to squeeze it into the middle of the tables. */
- baseaddr = firstfree;
-
- while ( baseaddr < minec )
- {
- /* Using baseaddr would result in a negative base
- * address below; find the next free slot.
- */
- for ( ++baseaddr; chk[baseaddr] != 0; ++baseaddr )
- ;
- }
-
- while ( baseaddr + maxec - minec + 1 >= current_max_xpairs )
- expand_nxt_chk();
-
- for ( i = minec; i <= maxec; ++i )
- if ( state[i] != SAME_TRANS &&
- (state[i] != 0 || deflink != JAMSTATE) &&
- chk[baseaddr + i - minec] != 0 )
- { /* baseaddr unsuitable - find another */
- for ( ++baseaddr;
- baseaddr < current_max_xpairs &&
- chk[baseaddr] != 0; ++baseaddr )
- ;
-
- while ( baseaddr + maxec - minec + 1 >=
- current_max_xpairs )
- expand_nxt_chk();
-
- /* Reset the loop counter so we'll start all
- * over again next time it's incremented.
- */
-
- i = minec - 1;
- }
- }
-
- else
- {
- /* Ensure that the base address we eventually generate is
- * non-negative.
- */
- baseaddr = MAX( tblend + 1, minec );
- }
-
- tblbase = baseaddr - minec;
- tbllast = tblbase + maxec;
-
- while ( tbllast + 1 >= current_max_xpairs )
- expand_nxt_chk();
-
- base[statenum] = tblbase;
- def[statenum] = deflink;
-
- for ( i = minec; i <= maxec; ++i )
- if ( state[i] != SAME_TRANS )
- if ( state[i] != 0 || deflink != JAMSTATE )
- {
- nxt[tblbase + i] = state[i];
- chk[tblbase + i] = statenum;
- }
-
- if ( baseaddr == firstfree )
- /* Find next free slot in tables. */
- for ( ++firstfree; chk[firstfree] != 0; ++firstfree )
- ;
-
- tblend = MAX( tblend, tbllast );
- }
-
-
-/* mk1tbl - create table entries for a state (or state fragment) which
- * has only one out-transition
- */
-
-void mk1tbl( state, sym, onenxt, onedef )
-int state, sym, onenxt, onedef;
- {
- if ( firstfree < sym )
- firstfree = sym;
-
- while ( chk[firstfree] != 0 )
- if ( ++firstfree >= current_max_xpairs )
- expand_nxt_chk();
-
- base[state] = firstfree - sym;
- def[state] = onedef;
- chk[firstfree] = state;
- nxt[firstfree] = onenxt;
-
- if ( firstfree > tblend )
- {
- tblend = firstfree++;
-
- if ( firstfree >= current_max_xpairs )
- expand_nxt_chk();
- }
- }
-
-
-/* mkprot - create new proto entry */
-
-void mkprot( state, statenum, comstate )
-int state[], statenum, comstate;
- {
- int i, slot, tblbase;
-
- if ( ++numprots >= MSP || numecs * numprots >= PROT_SAVE_SIZE )
- {
- /* Gotta make room for the new proto by dropping last entry in
- * the queue.
- */
- slot = lastprot;
- lastprot = protprev[lastprot];
- protnext[lastprot] = NIL;
- }
-
- else
- slot = numprots;
-
- protnext[slot] = firstprot;
-
- if ( firstprot != NIL )
- protprev[firstprot] = slot;
-
- firstprot = slot;
- prottbl[slot] = statenum;
- protcomst[slot] = comstate;
-
- /* Copy state into save area so it can be compared with rapidly. */
- tblbase = numecs * (slot - 1);
-
- for ( i = 1; i <= numecs; ++i )
- protsave[tblbase + i] = state[i];
- }
-
-
-/* mktemplate - create a template entry based on a state, and connect the state
- * to it
- */
-
-void mktemplate( state, statenum, comstate )
-int state[], statenum, comstate;
- {
- int i, numdiff, tmpbase, tmp[CSIZE + 1];
- Char transset[CSIZE + 1];
- int tsptr;
-
- ++numtemps;
-
- tsptr = 0;
-
- /* Calculate where we will temporarily store the transition table
- * of the template in the tnxt[] array. The final transition table
- * gets created by cmptmps().
- */
-
- tmpbase = numtemps * numecs;
-
- if ( tmpbase + numecs >= current_max_template_xpairs )
- {
- current_max_template_xpairs += MAX_TEMPLATE_XPAIRS_INCREMENT;
-
- ++num_reallocs;
-
- tnxt = reallocate_integer_array( tnxt,
- current_max_template_xpairs );
- }
-
- for ( i = 1; i <= numecs; ++i )
- if ( state[i] == 0 )
- tnxt[tmpbase + i] = 0;
- else
- {
- transset[tsptr++] = i;
- tnxt[tmpbase + i] = comstate;
- }
-
- if ( usemecs )
- mkeccl( transset, tsptr, tecfwd, tecbck, numecs, 0 );
-
- mkprot( tnxt + tmpbase, -numtemps, comstate );
-
- /* We rely on the fact that mkprot adds things to the beginning
- * of the proto queue.
- */
-
- numdiff = tbldiff( state, firstprot, tmp );
- mkentry( tmp, numecs, statenum, -numtemps, numdiff );
- }
-
-
-/* mv2front - move proto queue element to front of queue */
-
-void mv2front( qelm )
-int qelm;
- {
- if ( firstprot != qelm )
- {
- if ( qelm == lastprot )
- lastprot = protprev[lastprot];
-
- protnext[protprev[qelm]] = protnext[qelm];
-
- if ( protnext[qelm] != NIL )
- protprev[protnext[qelm]] = protprev[qelm];
-
- protprev[qelm] = NIL;
- protnext[qelm] = firstprot;
- protprev[firstprot] = qelm;
- firstprot = qelm;
- }
- }
-
-
-/* place_state - place a state into full speed transition table
- *
- * State is the statenum'th state. It is indexed by equivalence class and
- * gives the number of the state to enter for a given equivalence class.
- * Transnum is the number of out-transitions for the state.
- */
-
-void place_state( state, statenum, transnum )
-int *state, statenum, transnum;
- {
- int i;
- int *state_ptr;
- int position = find_table_space( state, transnum );
-
- /* "base" is the table of start positions. */
- base[statenum] = position;
-
- /* Put in action number marker; this non-zero number makes sure that
- * find_table_space() knows that this position in chk/nxt is taken
- * and should not be used for another accepting number in another
- * state.
- */
- chk[position - 1] = 1;
-
- /* Put in end-of-buffer marker; this is for the same purposes as
- * above.
- */
- chk[position] = 1;
-
- /* Place the state into chk and nxt. */
- state_ptr = &state[1];
-
- for ( i = 1; i <= numecs; ++i, ++state_ptr )
- if ( *state_ptr != 0 )
- {
- chk[position + i] = i;
- nxt[position + i] = *state_ptr;
- }
-
- if ( position + numecs > tblend )
- tblend = position + numecs;
- }
-
-
-/* stack1 - save states with only one out-transition to be processed later
- *
- * If there's room for another state on the "one-transition" stack, the
- * state is pushed onto it, to be processed later by mk1tbl. If there's
- * no room, we process the sucker right now.
- */
-
-void stack1( statenum, sym, nextstate, deflink )
-int statenum, sym, nextstate, deflink;
- {
- if ( onesp >= ONE_STACK_SIZE - 1 )
- mk1tbl( statenum, sym, nextstate, deflink );
-
- else
- {
- ++onesp;
- onestate[onesp] = statenum;
- onesym[onesp] = sym;
- onenext[onesp] = nextstate;
- onedef[onesp] = deflink;
- }
- }
-
-
-/* tbldiff - compute differences between two state tables
- *
- * "state" is the state array which is to be extracted from the pr'th
- * proto. "pr" is both the number of the proto we are extracting from
- * and an index into the save area where we can find the proto's complete
- * state table. Each entry in "state" which differs from the corresponding
- * entry of "pr" will appear in "ext".
- *
- * Entries which are the same in both "state" and "pr" will be marked
- * as transitions to "SAME_TRANS" in "ext". The total number of differences
- * between "state" and "pr" is returned as function value. Note that this
- * number is "numecs" minus the number of "SAME_TRANS" entries in "ext".
- */
-
-int tbldiff( state, pr, ext )
-int state[], pr, ext[];
- {
- int i, *sp = state, *ep = ext, *protp;
- int numdiff = 0;
-
- protp = &protsave[numecs * (pr - 1)];
-
- for ( i = numecs; i > 0; --i )
- {
- if ( *++protp == *++sp )
- *++ep = SAME_TRANS;
- else
- {
- *++ep = *sp;
- ++numdiff;
- }
- }
-
- return numdiff;
- }
diff --git a/usr.bin/lex/version.h b/usr.bin/lex/version.h
deleted file mode 100644
index 5dbdf94..0000000
--- a/usr.bin/lex/version.h
+++ /dev/null
@@ -1,3 +0,0 @@
-/* $FreeBSD$ */
-
-#define FLEX_VERSION "2.5.4"
diff --git a/usr.bin/lex/yylex.c b/usr.bin/lex/yylex.c
deleted file mode 100644
index e90c5d4f..0000000
--- a/usr.bin/lex/yylex.c
+++ /dev/null
@@ -1,218 +0,0 @@
-/* yylex - scanner front-end for flex */
-
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Vern Paxson.
- *
- * The United States Government has rights in this work pursuant
- * to contract no. DE-AC03-76SF00098 between the United States
- * Department of Energy and the University of California.
- *
- * Redistribution and use in source and binary forms are permitted provided
- * that: (1) source distributions retain this entire copyright notice and
- * comment, and (2) distributions including binaries display the following
- * acknowledgement: ``This product includes software developed by the
- * University of California, Berkeley and its contributors'' in the
- * documentation or other materials provided with the distribution and in
- * all advertising materials mentioning features or use of this software.
- * Neither the name of the University nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/* $Header: /home/daffy/u0/vern/flex/RCS/yylex.c,v 2.13 95/03/04 16:10:41 vern Exp $ */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <ctype.h>
-#include "flexdef.h"
-#include "parse.h"
-
-
-/* yylex - scan for a regular expression token */
-
-int yylex()
- {
- int toktype;
- static int beglin = false;
- extern char *yytext;
-
- if ( eofseen )
- toktype = EOF;
- else
- toktype = flexscan();
-
- if ( toktype == EOF || toktype == 0 )
- {
- eofseen = 1;
-
- if ( sectnum == 1 )
- {
- synerr( _( "premature EOF" ) );
- sectnum = 2;
- toktype = SECTEND;
- }
-
- else
- toktype = 0;
- }
-
- if ( trace )
- {
- if ( beglin )
- {
- fprintf( stderr, "%d\t", num_rules + 1 );
- beglin = 0;
- }
-
- switch ( toktype )
- {
- case '<':
- case '>':
- case '^':
- case '$':
- case '"':
- case '[':
- case ']':
- case '{':
- case '}':
- case '|':
- case '(':
- case ')':
- case '-':
- case '/':
- case '\\':
- case '?':
- case '.':
- case '*':
- case '+':
- case ',':
- (void) putc( toktype, stderr );
- break;
-
- case '\n':
- (void) putc( '\n', stderr );
-
- if ( sectnum == 2 )
- beglin = 1;
-
- break;
-
- case SCDECL:
- fputs( "%s", stderr );
- break;
-
- case XSCDECL:
- fputs( "%x", stderr );
- break;
-
- case SECTEND:
- fputs( "%%\n", stderr );
-
- /* We set beglin to be true so we'll start
- * writing out numbers as we echo rules.
- * flexscan() has already assigned sectnum.
- */
- if ( sectnum == 2 )
- beglin = 1;
-
- break;
-
- case NAME:
- fprintf( stderr, "'%s'", nmstr );
- break;
-
- case CHAR:
- switch ( yylval )
- {
- case '<':
- case '>':
- case '^':
- case '$':
- case '"':
- case '[':
- case ']':
- case '{':
- case '}':
- case '|':
- case '(':
- case ')':
- case '-':
- case '/':
- case '\\':
- case '?':
- case '.':
- case '*':
- case '+':
- case ',':
- fprintf( stderr, "\\%c",
- yylval );
- break;
-
- default:
- if ( ! isascii( yylval ) ||
- ! isprint( yylval ) )
- fprintf( stderr,
- "\\%.3o",
- (unsigned int) yylval );
- else
- (void) putc( yylval,
- stderr );
- break;
- }
-
- break;
-
- case NUMBER:
- fprintf( stderr, "%d", yylval );
- break;
-
- case PREVCCL:
- fprintf( stderr, "[%d]", yylval );
- break;
-
- case EOF_OP:
- fprintf( stderr, "<<EOF>>" );
- break;
-
- case OPTION_OP:
- fprintf( stderr, "%s ", yytext );
- break;
-
- case OPT_OUTFILE:
- case OPT_PREFIX:
- case CCE_ALNUM:
- case CCE_ALPHA:
- case CCE_BLANK:
- case CCE_CNTRL:
- case CCE_DIGIT:
- case CCE_GRAPH:
- case CCE_LOWER:
- case CCE_PRINT:
- case CCE_PUNCT:
- case CCE_SPACE:
- case CCE_UPPER:
- case CCE_XDIGIT:
- fprintf( stderr, "%s", yytext );
- break;
-
- case 0:
- fprintf( stderr, _( "End Marker\n" ) );
- break;
-
- default:
- fprintf( stderr,
- _( "*Something Weird* - tok: %d val: %d\n" ),
- toktype, yylval );
- break;
- }
- }
-
- return toktype;
- }
diff --git a/usr.bin/limits/Makefile b/usr.bin/limits/Makefile
deleted file mode 100644
index 5999cdb..0000000
--- a/usr.bin/limits/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# $FreeBSD$
-
-PROG= limits
-DPADD= ${LIBUTIL}
-LDADD= -lutil
-WARNS?= 6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/limits/limits.1 b/usr.bin/limits/limits.1
deleted file mode 100644
index edc6bb9..0000000
--- a/usr.bin/limits/limits.1
+++ /dev/null
@@ -1,404 +0,0 @@
-.\" Copyright (c) 1996 David Nugent <davidn@blaze.net.au>
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, is permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice immediately at the beginning of the file, without modification,
-.\" this list of conditions, and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. This work was done expressly for inclusion into FreeBSD. Other use
-.\" is permitted provided this notation is included.
-.\" 4. Absolutely no warranty of function or purpose is made by the author
-.\" David Nugent.
-.\" 5. Modifications may be freely made to this file providing the above
-.\" conditions are met.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd September 18, 2002
-.Dt LIMITS 1
-.Os
-.Sh NAME
-.Nm limits
-.Nd set or display process resource limits
-.Sh SYNOPSIS
-.Nm
-.Op Fl C Ar class | Fl U Ar user
-.Op Fl SHB
-.Op Fl ea
-.Op Fl bcdflmnstuvp Op Ar val
-.Nm
-.Op Fl C Ar class | Fl U Ar user
-.Op Fl SHB
-.Op Fl bcdflmnstuvp Op Ar val
-.Op Fl E
-.Oo
-.Op Ar name Ns = Ns Ar value ...
-.Ar command
-.Oc
-.Sh DESCRIPTION
-The
-.Nm
-utility either prints or sets kernel resource limits, and may optionally set
-environment variables like
-.Xr env 1
-and run a program with the selected resources.
-Three uses of the
-.Nm
-utility are possible:
-.Bl -tag -width indent
-.It Xo
-.Nm
-.Op Ar limitflags
-.Op Ar name Ns = Ns Ar value ...
-.Ar command
-.Xc
-This usage sets limits according to
-.Ar limitflags ,
-optionally sets environment variables given as
-.Ar name Ns = Ns Ar value
-pairs, and then runs the specified
-.Ar command .
-.It Nm Op Ar limitflags
-This usage determines values of resource settings according to
-.Ar limitflags ,
-does not attempt to set them and outputs these values to
-standard output.
-By default, this will output the current kernel resource settings
-active for the calling process.
-Using the
-.Fl C Ar class
-or
-.Fl U Ar user
-options, you may also display the current resource settings modified
-by the appropriate login class resource limit entries from
-the
-.Xr login.conf 5
-login capabilities database.
-.It Nm Fl e Op Ar limitflags
-This usage determines values of resource settings according to
-.Ar limitflags ,
-but does not set them itself.
-Like the previous usage, it outputs these values to standard
-output, except that it will emit them in
-.Ic eval
-format, suitable for the calling shell.
-The calling shell is determined by examining the entries in the
-.Pa /proc
-file system for the parent process.
-If the shell is known (i.e., it is one of
-.Nm sh , csh , bash , tcsh , ksh , pdksh
-or
-.Nm rc ) ,
-.Nm
-emits
-.Ic limit
-or
-.Ic ulimit
-commands in the format understood by
-that shell.
-If the name of the shell cannot be determined, then the
-.Ic ulimit
-format used by
-.Xr sh 1
-is used.
-.Pp
-This is very useful for setting limits used by scripts, or prior
-launching of daemons and other background tasks with specific
-resource limit settings, and provides the benefit of allowing
-global configuration of maximum resource usage by maintaining a
-central database of settings in the login class database.
-.Pp
-Within a shell script,
-.Nm
-will normally be used with eval within backticks as follows:
-.Pp
-.Dl "eval `limits -e -C daemon`"
-.Pp
-which causes the output of
-.Nm
-to be evaluated and set by the current shell.
-.El
-.Pp
-The value of
-.Ar limitflags
-specified in the above contains one or more of the following options:
-.Bl -tag -width ".Fl C Ar class"
-.It Fl C Ar class
-Use current resource values, modified by the resource entries applicable
-for the login class
-.Ar class .
-.It Fl U Ar user
-Use current resource values, modified by the resource entries applicable
-to the login class the
-.Ar user
-belongs to.
-If user does not belong to any class, then the resource capabilities
-for the
-.Dq Li default
-class are used, if it exists, or the
-.Dq Li root
-class if the user is a superuser account.
-.It Fl S
-Select display or setting of
-.Dq soft
-(or current) resource limits.
-If specific limits settings follow this switch, only soft limits are
-affected unless overridden later with either the
-.Fl H
-or
-.Fl B
-options.
-.It Fl H
-Select display or setting of
-.Dq hard
-(or maximum) resource limits.
-If specific limits settings follow this switch, only hard limits are
-affected until overridden later with either the
-.Fl S
-or
-.Fl B
-options.
-.It Fl B
-Select display or setting of both
-.Dq soft
-(current) or
-.Dq hard
-(maximum)
-resource limits.
-If specific limits settings follow this switch, both soft and hard
-limits are affected until overridden later with either the
-.Fl S
-or
-.Fl H
-options.
-.Fl e
-Select
-.Dq "eval mode"
-formatting for output.
-This is valid only on display mode and cannot be used when running a
-command.
-The exact syntax used for output depends upon the type of shell from
-which
-.Nm
-is invoked.
-.It Fl b Op Ar val
-Select or set the
-.Va sbsize
-resource limit.
-.It Fl c Op Ar val
-Select or set (if
-.Ar val
-is specified) the
-.Va coredumpsize
-resource limit.
-A value of 0 disables core dumps.
-.It Fl d Op Ar val
-Select or set (if
-.Ar val
-is specified) the
-.Va datasize
-resource limit.
-.It Fl f Op Ar val
-Select or set the
-.Va filesize
-resource limit.
-.It Fl l Op Ar val
-Select or set the
-.Va memorylocked
-resource limit.
-.It Fl m Op Ar val
-Select or set the
-.Va memoryuse
-size limit.
-.It Fl n Op Ar val
-Select or set the
-.Va openfiles
-resource limit.
-The system-wide limit on the maximum number of
-open files per process can be viewed by examining the
-.Va kern.maxfilesperproc
-.Xr sysctl 8
-variable.
-The total number of simultaneously open files in the entire
-system is limited to the value displayed by the
-.Va kern.maxfiles
-.Xr sysctl 8
-variable.
-.It Fl s Op Ar val
-Select or set the
-.Va stacksize
-resource limit.
-.It Fl t Op Ar val
-Select or set the
-.Va cputime
-resource limit.
-.It Fl u Op Ar val
-Select or set the
-.Va maxproc
-resource limit.
-The system-wide limit on the maximum number of processes
-allowed per UID can be viewed by examining the
-.Va kern.maxprocperuid
-.Xr sysctl 8
-variable.
-The maximum number of processes that can be running simultaneously
-in the entire system is limited to the value of the
-.Va kern.maxproc
-.Xr sysctl 8
-variable.
-.It Fl v Op Ar val
-Select or set the
-.Va virtualmem
-resource limit.
-This limit encompasses the entire VM space for the user process
-and is inclusive of text, data, bss, stack,
-.Xr brk 2 ,
-.Xr sbrk 2
-and
-.Xr mmap 2 Ns 'd
-space.
-.It Fl p Op Ar val
-Select or set the
-.Va pseudoterminals
-resource limit.
-.El
-.Pp
-Valid values for
-.Ar val
-in the above set of options consist of either the
-string
-.Dq Li infinity ,
-.Dq Li inf ,
-.Dq Li unlimited
-or
-.Dq Li unlimit
-for an infinite (or kernel-defined maximum)
-limit, or a numeric value optionally followed by a suffix.
-Values which relate to size default to a value in bytes, or one of the
-following suffixes may be used as a multiplier:
-.Pp
-.Bl -tag -offset indent -width 4n -compact
-.It Li b
-512 byte blocks.
-.It Li k
-kilobytes (1024 bytes).
-.It Li m
-megabytes (1024*1024 bytes).
-.It Li g
-gigabytes.
-.It Li t
-terabytes.
-.El
-.Pp
-The
-.Va cputime
-resource defaults to a number of seconds, but a multiplier may be
-used, and as with size values, multiple values separated by a valid
-suffix are added together:
-.Pp
-.Bl -tag -offset indent -width 4n -compact
-.It Li s
-seconds.
-.It Li m
-minutes.
-.It Li h
-hours.
-.It Li d
-days.
-.It Li w
-weeks.
-.It Li y
-365 day years.
-.El
-.Bl -tag -width ".Fl C Ar class"
-.It Fl E
-Cause
-.Nm
-to completely ignore the environment it inherits.
-.It Fl a
-Force all resource settings to be displayed even if
-other specific resource settings have been specified.
-For example, if you wish to disable core dumps when starting up
-the Usenet News system, but wish to set all other resource settings
-as well that apply to the
-.Dq Li news
-account, you might use:
-.Pp
-.Dl "eval `limits -U news -aBec 0`"
-.Pp
-As with the
-.Xr setrlimit 2
-call, only the superuser may raise process
-.Dq hard
-resource limits.
-Non-root users may, however, lower them or change
-.Dq soft
-resource limits
-within to any value below the hard limit.
-When invoked to execute a program, the failure of
-.Nm
-to raise a hard limit is considered a fatal error.
-.El
-.Sh EXIT STATUS
-The
-.Nm
-utility
-exits with
-.Dv EXIT_FAILURE
-if usage is incorrect in any way; i.e., an invalid
-option, or set/display options are selected in the same invocation,
-.Fl e
-is used when running a program, etc.
-When run in display or eval mode,
-.Nm
-exits with a status of
-.Dv EXIT_SUCCESS .
-When run in command mode and execution of the command succeeds, the exit status
-will be whatever the executed program returns.
-.Sh SEE ALSO
-.Xr csh 1 ,
-.Xr env 1 ,
-.Xr limit 1 ,
-.Xr sh 1 ,
-.Xr getrlimit 2 ,
-.Xr setrlimit 2 ,
-.Xr login_cap 3 ,
-.Xr login.conf 5 ,
-.Xr sysctl 8
-.Sh BUGS
-The
-.Nm
-utility does not handle commands with equal
-.Pq Ql =
-signs in their
-names, for obvious reasons.
-.Pp
-When eval output is selected, the
-.Pa /proc
-file system must be installed
-and mounted for the shell to be correctly determined, and therefore
-output syntax correct for the running shell.
-The default output is valid for
-.Xr sh 1 ,
-so this means that any
-usage of
-.Nm
-in eval mode prior mounting
-.Pa /proc
-may only occur in standard bourne
-shell scripts.
-.Pp
-The
-.Nm
-utility makes no effort to ensure that resource settings emitted or displayed
-are valid and settable by the current user.
-Only a superuser account may raise hard limits, and when doing so
-the
-.Fx
-kernel will silently lower limits to values less than
-specified if the values given are too high.
diff --git a/usr.bin/limits/limits.c b/usr.bin/limits/limits.c
deleted file mode 100644
index 1440250..0000000
--- a/usr.bin/limits/limits.c
+++ /dev/null
@@ -1,669 +0,0 @@
-/*-
- * Copyright (c) 1997 by
- * David L. Nugent <davidn@blaze.net.au>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, is permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice immediately at the beginning of the file, without modification,
- * this list of conditions, and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. This work was done expressly for inclusion into FreeBSD. Other use
- * is permitted provided this notation is included.
- * 4. Absolutely no warranty of function or purpose is made by the authors.
- * 5. Modifications may be freely made to this file providing the above
- * conditions are met.
- *
- * Display/change(+runprogram)/eval resource limits.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/param.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <stdarg.h>
-#include <stdint.h>
-#include <ctype.h>
-#include <errno.h>
-#include <pwd.h>
-#include <login_cap.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-
-enum
-{
- SH_NONE,
- SH_SH, /* sh */
- SH_CSH, /* csh */
- SH_BASH, /* gnu bash */
- SH_TCSH, /* tcsh */
- SH_KSH, /* (pd)ksh */
- SH_ZSH, /* zsh */
- SH_RC, /* rc or es */
- SH_NUMBER
-};
-
-
-/* eval emitter for popular shells.
- * Why aren't there any standards here? Most shells support either
- * the csh 'limit' or sh 'ulimit' command, but each varies just
- * enough that they aren't very compatible from one to the other.
- */
-static struct {
- const char * name; /* Name of shell */
- const char * inf; /* Name used for 'unlimited' resource */
- const char * cmd; /* Intro text */
- const char * hard; /* Hard limit text */
- const char * soft; /* Soft limit text */
- const char * both; /* Hard+Soft limit text */
- struct {
- const char * pfx;
- const char * sfx;
- int divisor;
- } lprm[RLIM_NLIMITS];
-} shellparm[] =
-{
- { "", "infinity", "Resource limits%s%s:\n", "-max", "-cur", "",
- {
- { " cputime%-4s %8s", " secs\n", 1 },
- { " filesize%-4s %8s", " kB\n", 1024 },
- { " datasize%-4s %8s", " kB\n", 1024 },
- { " stacksize%-4s %8s", " kB\n", 1024 },
- { " coredumpsize%-4s %8s", " kB\n", 1024 },
- { " memoryuse%-4s %8s", " kB\n", 1024 },
- { " memorylocked%-4s %8s", " kB\n", 1024 },
- { " maxprocesses%-4s %8s", "\n", 1 },
- { " openfiles%-4s %8s", "\n", 1 },
- { " sbsize%-4s %8s", " bytes\n", 1 },
- { " vmemoryuse%-4s %8s", " kB\n", 1024 },
- { " pseudo-terminals%-4s %8s", "\n", 1 }
- }
- },
- { "sh", "unlimited", "", " -H", " -S", "",
- {
- { "ulimit%s -t %s", ";\n", 1 },
- { "ulimit%s -f %s", ";\n", 512 },
- { "ulimit%s -d %s", ";\n", 1024 },
- { "ulimit%s -s %s", ";\n", 1024 },
- { "ulimit%s -c %s", ";\n", 512 },
- { "ulimit%s -m %s", ";\n", 1024 },
- { "ulimit%s -l %s", ";\n", 1024 },
- { "ulimit%s -u %s", ";\n", 1 },
- { "ulimit%s -n %s", ";\n", 1 },
- { "ulimit%s -b %s", ";\n", 1 },
- { "ulimit%s -v %s", ";\n", 1024 },
- { "ulimit%s -p %s", ";\n", 1 }
- }
- },
- { "csh", "unlimited", "", " -h", "", NULL,
- {
- { "limit%s cputime %s", ";\n", 1 },
- { "limit%s filesize %s", ";\n", 1024 },
- { "limit%s datasize %s", ";\n", 1024 },
- { "limit%s stacksize %s", ";\n", 1024 },
- { "limit%s coredumpsize %s", ";\n", 1024 },
- { "limit%s memoryuse %s", ";\n", 1024 },
- { "limit%s memorylocked %s", ";\n", 1024 },
- { "limit%s maxproc %s", ";\n", 1 },
- { "limit%s openfiles %s", ";\n", 1 },
- { "limit%s sbsize %s", ";\n", 1 },
- { "limit%s vmemoryuse %s", ";\n", 1024 },
- { "limit%s pseudoterminals %s", ";\n", 1 }
- }
- },
- { "bash|bash2", "unlimited", "", " -H", " -S", "",
- {
- { "ulimit%s -t %s", ";\n", 1 },
- { "ulimit%s -f %s", ";\n", 1024 },
- { "ulimit%s -d %s", ";\n", 1024 },
- { "ulimit%s -s %s", ";\n", 1024 },
- { "ulimit%s -c %s", ";\n", 1024 },
- { "ulimit%s -m %s", ";\n", 1024 },
- { "ulimit%s -l %s", ";\n", 1024 },
- { "ulimit%s -u %s", ";\n", 1 },
- { "ulimit%s -n %s", ";\n", 1 },
- { "ulimit%s -b %s", ";\n", 1 },
- { "ulimit%s -v %s", ";\n", 1024 },
- { "ulimit%s -p %s", ";\n", 1 }
- }
- },
- { "tcsh", "unlimited", "", " -h", "", NULL,
- {
- { "limit%s cputime %s", ";\n", 1 },
- { "limit%s filesize %s", ";\n", 1024 },
- { "limit%s datasize %s", ";\n", 1024 },
- { "limit%s stacksize %s", ";\n", 1024 },
- { "limit%s coredumpsize %s", ";\n", 1024 },
- { "limit%s memoryuse %s", ";\n", 1024 },
- { "limit%s memorylocked %s", ";\n", 1024 },
- { "limit%s maxproc %s", ";\n", 1 },
- { "limit%s descriptors %s", ";\n", 1 },
- { "limit%s sbsize %s", ";\n", 1 },
- { "limit%s vmemoryuse %s", ";\n", 1024 },
- { "limit%s pseudoterminals %s", ";\n", 1 }
- }
- },
- { "ksh|pdksh", "unlimited", "", " -H", " -S", "",
- {
- { "ulimit%s -t %s", ";\n", 1 },
- { "ulimit%s -f %s", ";\n", 512 },
- { "ulimit%s -d %s", ";\n", 1024 },
- { "ulimit%s -s %s", ";\n", 1024 },
- { "ulimit%s -c %s", ";\n", 512 },
- { "ulimit%s -m %s", ";\n", 1024 },
- { "ulimit%s -l %s", ";\n", 1024 },
- { "ulimit%s -p %s", ";\n", 1 },
- { "ulimit%s -n %s", ";\n", 1 },
- { "ulimit%s -b %s", ";\n", 1 },
- { "ulimit%s -v %s", ";\n", 1024 },
- { "ulimit%s -p %s", ";\n", 1 }
- }
- },
- { "zsh", "unlimited", "", " -H", " -S", "",
- {
- { "ulimit%s -t %s", ";\n", 1 },
- { "ulimit%s -f %s", ";\n", 512 },
- { "ulimit%s -d %s", ";\n", 1024 },
- { "ulimit%s -s %s", ";\n", 1024 },
- { "ulimit%s -c %s", ";\n", 512 },
- { "ulimit%s -m %s", ";\n", 1024 },
- { "ulimit%s -l %s", ";\n", 1024 },
- { "ulimit%s -u %s", ";\n", 1 },
- { "ulimit%s -n %s", ";\n", 1 },
- { "ulimit%s -b %s", ";\n", 1 },
- { "ulimit%s -v %s", ";\n", 1024 },
- { "ulimit%s -p %s", ";\n", 1 }
- }
- },
- { "rc|es", "unlimited", "", " -h", "", NULL,
- {
- { "limit%s cputime %s", ";\n", 1 },
- { "limit%s filesize %s", ";\n", 1024 },
- { "limit%s datasize %s", ";\n", 1024 },
- { "limit%s stacksize %s", ";\n", 1024 },
- { "limit%s coredumpsize %s", ";\n", 1024 },
- { "limit%s memoryuse %s", ";\n", 1024 },
- { "limit%s lockedmemory %s", ";\n", 1024 },
- { "limit%s processes %s", ";\n", 1 },
- { "limit%s descriptors %s", ";\n", 1 },
- { "limit%s sbsize %s", ";\n", 1 },
- { "limit%s vmemoryuse %s", ";\n", 1024 },
- { "limit%s pseudoterminals %s", ";\n", 1 }
- }
- },
- { NULL, NULL, NULL, NULL, NULL, NULL,
- { }
- }
-};
-
-static struct {
- const char * cap;
- rlim_t (*func)(login_cap_t *, const char *, rlim_t, rlim_t);
-} resources[RLIM_NLIMITS] = {
- { "cputime", login_getcaptime },
- { "filesize", login_getcapsize },
- { "datasize", login_getcapsize },
- { "stacksize", login_getcapsize },
- { "coredumpsize", login_getcapsize },
- { "memoryuse", login_getcapsize },
- { "memorylocked", login_getcapsize },
- { "maxproc", login_getcapnum },
- { "openfiles", login_getcapnum },
- { "sbsize", login_getcapsize },
- { "vmemoryuse", login_getcapsize },
- { "pseudoterminals",login_getcapnum },
-};
-
-/*
- * One letter for each resource levels.
- * NOTE: There is a dependancy on the corresponding
- * letter index being equal to the resource number.
- * If sys/resource.h defines are changed, this needs
- * to be modified accordingly!
- */
-
-#define RCS_STRING "tfdscmlunbvp"
-
-static rlim_t resource_num(int which, int ch, const char *str);
-static void usage(void);
-static int getshelltype(void);
-static void print_limit(rlim_t limit, unsigned divisor, const char *inf,
- const char *pfx, const char *sfx, const char *which);
-extern char **environ;
-
-static const char rcs_string[] = RCS_STRING;
-
-int
-main(int argc, char *argv[])
-{
- char *p, *cls = NULL;
- char *cleanenv[1];
- struct passwd * pwd = NULL;
- int rcswhich, shelltype;
- int i, num_limits = 0;
- int ch, doeval = 0, doall = 0;
- int rtrn;
- login_cap_t * lc = NULL;
- enum { ANY=0, SOFT=1, HARD=2, BOTH=3, DISPLAYONLY=4 } type = ANY;
- enum { RCSUNKNOWN=0, RCSSET=1, RCSSEL=2 } todo = RCSUNKNOWN;
- int which_limits[RLIM_NLIMITS];
- rlim_t set_limits[RLIM_NLIMITS];
- struct rlimit limits[RLIM_NLIMITS];
-
- /* init resource tables */
- for (i = 0; i < RLIM_NLIMITS; i++) {
- which_limits[i] = 0; /* Don't set/display any */
- set_limits[i] = RLIM_INFINITY;
- /* Get current resource values */
- getrlimit(i, &limits[i]);
- }
-
- optarg = NULL;
- while ((ch = getopt(argc, argv, ":EeC:U:BSHab:c:d:f:l:m:n:s:t:u:v:p:")) != -1) {
- switch(ch) {
- case 'a':
- doall = 1;
- break;
- case 'E':
- environ = cleanenv;
- cleanenv[0] = NULL;
- break;
- case 'e':
- doeval = 1;
- break;
- case 'C':
- cls = optarg;
- break;
- case 'U':
- if ((pwd = getpwnam(optarg)) == NULL) {
- if (!isdigit(*optarg) ||
- (pwd = getpwuid(atoi(optarg))) == NULL) {
- warnx("invalid user `%s'", optarg);
- usage();
- }
- }
- break;
- case 'H':
- type = HARD;
- break;
- case 'S':
- type = SOFT;
- break;
- case 'B':
- type = SOFT|HARD;
- break;
- default:
- case ':': /* Without arg */
- if ((p = strchr(rcs_string, optopt)) != NULL) {
- int rcswhich1 = p - rcs_string;
- if (optarg && *optarg == '-') { /* 'arg' is actually a switch */
- --optind; /* back one arg, and make arg NULL */
- optarg = NULL;
- }
- todo = optarg == NULL ? RCSSEL : RCSSET;
- if (type == ANY)
- type = BOTH;
- which_limits[rcswhich1] = optarg ? type : DISPLAYONLY;
- set_limits[rcswhich1] = resource_num(rcswhich1, optopt, optarg);
- num_limits++;
- break;
- }
- /* FALLTHRU */
- case '?':
- usage();
- }
- optarg = NULL;
- }
-
- /* If user was specified, get class from that */
- if (pwd != NULL)
- lc = login_getpwclass(pwd);
- else if (cls != NULL && *cls != '\0') {
- lc = login_getclassbyname(cls, NULL);
- if (lc == NULL || strcmp(cls, lc->lc_class) != 0)
- fprintf(stderr, "login class '%s' non-existent, using %s\n",
- cls, lc?lc->lc_class:"current settings");
- }
-
- /* If we have a login class, update resource table from that */
- if (lc != NULL) {
- for (rcswhich = 0; rcswhich < RLIM_NLIMITS; rcswhich++) {
- char str[40];
- rlim_t val;
-
- /* current value overridden by resourcename or resourcename-cur */
- sprintf(str, "%s-cur", resources[rcswhich].cap);
- val = resources[rcswhich].func(lc, resources[rcswhich].cap, limits[rcswhich].rlim_cur, limits[rcswhich].rlim_cur);
- limits[rcswhich].rlim_cur = resources[rcswhich].func(lc, str, val, val);
- /* maximum value overridden by resourcename or resourcename-max */
- sprintf(str, "%s-max", resources[rcswhich].cap);
- val = resources[rcswhich].func(lc, resources[rcswhich].cap, limits[rcswhich].rlim_max, limits[rcswhich].rlim_max);
- limits[rcswhich].rlim_max = resources[rcswhich].func(lc, str, val, val);
- }
- }
-
- /* now, let's determine what we wish to do with all this */
-
- argv += optind;
-
- /* If we're setting limits or doing an eval (ie. we're not just
- * displaying), then check that hard limits are not lower than
- * soft limits, and force rasing the hard limit if we need to if
- * we are raising the soft limit, or lower the soft limit if we
- * are lowering the hard limit.
- */
- if ((*argv || doeval) && getuid() == 0) {
-
- for (rcswhich = 0; rcswhich < RLIM_NLIMITS; rcswhich++) {
- if (limits[rcswhich].rlim_max != RLIM_INFINITY) {
- if (limits[rcswhich].rlim_cur == RLIM_INFINITY) {
- limits[rcswhich].rlim_max = RLIM_INFINITY;
- which_limits[rcswhich] |= HARD;
- } else if (limits[rcswhich].rlim_cur > limits[rcswhich].rlim_max) {
- if (which_limits[rcswhich] == SOFT) {
- limits[rcswhich].rlim_max = limits[rcswhich].rlim_cur;
- which_limits[rcswhich] |= HARD;
- } else if (which_limits[rcswhich] == HARD) {
- limits[rcswhich].rlim_cur = limits[rcswhich].rlim_max;
- which_limits[rcswhich] |= SOFT;
- } else {
- /* else.. if we're specifically setting both to
- * silly values, then let it error out.
- */
- }
- }
- }
- }
- }
-
- /* See if we've overridden anything specific on the command line */
- if (num_limits && todo == RCSSET) {
- for (rcswhich = 0; rcswhich < RLIM_NLIMITS; rcswhich++) {
- if (which_limits[rcswhich] & HARD)
- limits[rcswhich].rlim_max = set_limits[rcswhich];
- if (which_limits[rcswhich] & SOFT)
- limits[rcswhich].rlim_cur = set_limits[rcswhich];
- }
- }
-
- /* If *argv is not NULL, then we are being asked to
- * (perhaps) set environment variables and run a program
- */
- if (*argv) {
- if (doeval) {
- warnx("-e cannot be used with `cmd' option");
- usage();
- }
-
- login_close(lc);
-
- /* set leading environment variables, like eval(1) */
- while (*argv && (p = strchr(*argv, '='))) {
- *p = '\0';
- rtrn = setenv(*argv++, p + 1, 1);
- *p = '=';
- if (rtrn == -1)
- err(EXIT_FAILURE, "setenv %s", *argv);
- }
-
- /* Set limits */
- for (rcswhich = 0; rcswhich < RLIM_NLIMITS; rcswhich++) {
- if (doall || num_limits == 0 || which_limits[rcswhich] != 0)
- if (setrlimit(rcswhich, &limits[rcswhich]) == -1)
- err(1, "setrlimit %s", resources[rcswhich].cap);
- }
-
- if (*argv == NULL)
- usage();
-
- execvp(*argv, argv);
- err(1, "%s", *argv);
- }
-
- shelltype = doeval ? getshelltype() : SH_NONE;
-
- if (type == ANY) /* Default to soft limits */
- type = SOFT;
-
- /* Display limits */
- printf(shellparm[shelltype].cmd,
- lc ? " for class " : " (current)",
- lc ? lc->lc_class : "");
-
- for (rcswhich = 0; rcswhich < RLIM_NLIMITS; rcswhich++) {
- if (doall || num_limits == 0 || which_limits[rcswhich] != 0) {
- if (which_limits[rcswhich] == ANY || which_limits[rcswhich])
- which_limits[rcswhich] = type;
- if (shellparm[shelltype].lprm[rcswhich].pfx) {
- if (shellparm[shelltype].both && limits[rcswhich].rlim_cur == limits[rcswhich].rlim_max) {
- print_limit(limits[rcswhich].rlim_max,
- shellparm[shelltype].lprm[rcswhich].divisor,
- shellparm[shelltype].inf,
- shellparm[shelltype].lprm[rcswhich].pfx,
- shellparm[shelltype].lprm[rcswhich].sfx,
- shellparm[shelltype].both);
- } else {
- if (which_limits[rcswhich] & HARD) {
- print_limit(limits[rcswhich].rlim_max,
- shellparm[shelltype].lprm[rcswhich].divisor,
- shellparm[shelltype].inf,
- shellparm[shelltype].lprm[rcswhich].pfx,
- shellparm[shelltype].lprm[rcswhich].sfx,
- shellparm[shelltype].hard);
- }
- if (which_limits[rcswhich] & SOFT) {
- print_limit(limits[rcswhich].rlim_cur,
- shellparm[shelltype].lprm[rcswhich].divisor,
- shellparm[shelltype].inf,
- shellparm[shelltype].lprm[rcswhich].pfx,
- shellparm[shelltype].lprm[rcswhich].sfx,
- shellparm[shelltype].soft);
- }
- }
- }
- }
- }
-
- login_close(lc);
- exit(EXIT_SUCCESS);
-}
-
-
-static void
-usage(void)
-{
- (void)fprintf(stderr,
-"usage: limits [-C class|-U user] [-eaSHBE] [-bcdflmnstuvp [val]] [[name=val ...] cmd]\n");
- exit(EXIT_FAILURE);
-}
-
-static void
-print_limit(rlim_t limit, unsigned divisor, const char * inf, const char * pfx, const char * sfx, const char * which)
-{
- char numbr[64];
-
- if (limit == RLIM_INFINITY)
- strcpy(numbr, inf);
- else
- sprintf(numbr, "%jd", (intmax_t)((limit + divisor/2) / divisor));
- printf(pfx, which, numbr);
- printf(sfx, which);
-
-}
-
-
-static rlim_t
-resource_num(int which, int ch, const char *str)
-{
- rlim_t res = RLIM_INFINITY;
-
- if (str != NULL &&
- !(strcasecmp(str, "inf") == 0 ||
- strcasecmp(str, "infinity") == 0 ||
- strcasecmp(str, "unlimit") == 0 ||
- strcasecmp(str, "unlimited") == 0)) {
- const char * s = str;
- char *e;
-
- switch (which) {
- case RLIMIT_CPU: /* time values */
- errno = 0;
- res = 0;
- while (*s) {
- rlim_t tim = strtoq(s, &e, 0);
- if (e == NULL || e == s || errno)
- break;
- switch (*e++) {
- case 0: /* end of string */
- e--;
- default:
- case 's': case 'S': /* seconds */
- break;
- case 'm': case 'M': /* minutes */
- tim *= 60L;
- break;
- case 'h': case 'H': /* hours */
- tim *= (60L * 60L);
- break;
- case 'd': case 'D': /* days */
- tim *= (60L * 60L * 24L);
- break;
- case 'w': case 'W': /* weeks */
- tim *= (60L * 60L * 24L * 7L);
- case 'y': case 'Y': /* Years */
- tim *= (60L * 60L * 24L * 365L);
- }
- s = e;
- res += tim;
- }
- break;
- case RLIMIT_FSIZE: /* Size values */
- case RLIMIT_DATA:
- case RLIMIT_STACK:
- case RLIMIT_CORE:
- case RLIMIT_RSS:
- case RLIMIT_MEMLOCK:
- case RLIMIT_SBSIZE:
- case RLIMIT_VMEM:
- errno = 0;
- res = 0;
- while (*s) {
- rlim_t mult, tim = strtoq(s, &e, 0);
- if (e == NULL || e == s || errno)
- break;
- switch (*e++) {
- case 0: /* end of string */
- e--;
- default:
- mult = 1;
- break;
- case 'b': case 'B': /* 512-byte blocks */
- mult = 512;
- break;
- case 'k': case 'K': /* 1024-byte Kilobytes */
- mult = 1024;
- break;
- case 'm': case 'M': /* 1024-k kbytes */
- mult = 1024 * 1024;
- break;
- case 'g': case 'G': /* 1Gbyte */
- mult = 1024 * 1024 * 1024;
- break;
- case 't': case 'T': /* 1TBte */
- mult = 1024LL * 1024LL * 1024LL * 1024LL;
- break;
- }
- s = e;
- res += (tim * mult);
- }
- break;
- case RLIMIT_NPROC:
- case RLIMIT_NOFILE:
- case RLIMIT_NPTS:
- res = strtoq(s, &e, 0);
- s = e;
- break;
- }
- if (*s) {
- warnx("invalid value -%c `%s'", ch, str);
- usage();
- }
- }
- return res;
-}
-
-
-static int
-getshellbyname(const char * shell)
-{
- int i;
- const char * q;
- const char * p = strrchr(shell, '/');
-
- p = p ? p+1 : shell;
- for (i = 0; (q = shellparm[i].name) != NULL; i++) {
- while (*q) {
- int j = strcspn(q, "|");
-
- if (j == 0)
- break;
- if (strncmp(p, q, j) == 0)
- return i;
- if (*(q += j))
- ++q;
- }
- }
- return SH_SH;
-}
-
-
-/*
- * Determine the type of shell our parent process is
- * This is quite tricky, not 100% reliable and probably
- * not nearly as thorough as it should be. Basically, this
- * is a "best guess" only, but hopefully will work in
- * most cases.
- */
-
-static int
-getshelltype(void)
-{
- pid_t ppid = getppid();
-
- if (ppid != 1) {
- FILE * fp;
- struct stat st;
- char procdir[MAXPATHLEN], buf[128];
- int l = sprintf(procdir, "/proc/%ld/", (long)ppid);
- char * shell = getenv("SHELL");
-
- if (shell != NULL && stat(shell, &st) != -1) {
- struct stat st1;
-
- strcpy(procdir+l, "file");
- /* $SHELL is actual shell? */
- if (stat(procdir, &st1) != -1 && memcmp(&st, &st1, sizeof st) == 0)
- return getshellbyname(shell);
- }
- strcpy(procdir+l, "status");
- if (stat(procdir, &st) == 0 && (fp = fopen(procdir, "r")) != NULL) {
- char * p = fgets(buf, sizeof buf, fp)==NULL ? NULL : strtok(buf, " \t");
- fclose(fp);
- if (p != NULL)
- return getshellbyname(p);
- }
- }
- return SH_SH;
-}
-
diff --git a/usr.bin/locale/Makefile b/usr.bin/locale/Makefile
deleted file mode 100644
index d7f67e1..0000000
--- a/usr.bin/locale/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# $FreeBSD$
-
-PROG = locale
-CFLAGS += -I${.CURDIR}/../../lib/libc/locale
-WARNS ?= 1
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/locale/locale.1 b/usr.bin/locale/locale.1
deleted file mode 100644
index e6b6451..0000000
--- a/usr.bin/locale/locale.1
+++ /dev/null
@@ -1,97 +0,0 @@
-.\"
-.\" Copyright (c) 2003 Alexey Zelkin <phantom@FreeBSD.org>
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd November 1, 2005
-.Dt LOCALE 1
-.Os
-.Sh NAME
-.Nm locale
-.Nd get locale-specific information
-.Sh SYNOPSIS
-.Nm
-.Op Fl a | m
-.Nm
-.Op Fl ck
-.Op Ar keyword ...
-.Sh DESCRIPTION
-The
-.Nm
-utility is supposed to provide most locale specific information to
-the standard output.
-.Pp
-When
-.Nm
-is invoked without arguments, it will print out a summary of the current
-locale environment, subject to the environment settings and
-internal status.
-.Pp
-When
-.Nm
-is invoked with the
-.Ar keyword
-arguments, and no options are specified, it will print out the
-values of all keywords specified, using the current locale settings.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl a
-Print names of all available locales.
-While looking for locales,
-.Nm
-will respect the
-.Ev PATH_LOCALE
-environment variable, and use it instead of the system's default locale
-directory.
-.It Fl m
-Print names of all available charmaps.
-.It Fl k
-Print the names and values of all selected keywords.
-.It Fl c
-Print the category name for all selected keywords.
-.El
-.Sh IMPLEMENTATION NOTES
-The special
-.Pf ( Fx
-specific) keyword
-.Cm list
-can be used to retrieve the human readable list of all available keywords.
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr setlocale 3
-.Sh BUGS
-Since
-.Fx
-does not support
-.Em charmap Ns s
-in their
-.Tn POSIX
-meaning,
-.Nm
-emulates the
-.Fl m
-option using the CODESETs listing of all available locales.
diff --git a/usr.bin/locale/locale.c b/usr.bin/locale/locale.c
deleted file mode 100644
index a4b6b40..0000000
--- a/usr.bin/locale/locale.c
+++ /dev/null
@@ -1,658 +0,0 @@
-/*-
- * Copyright (c) 2002, 2003 Alexey Zelkin <phantom@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/*
- * XXX: implement missing era_* (LC_TIME) keywords (require libc &
- * nl_langinfo(3) extensions)
- *
- * XXX: correctly handle reserved 'charmap' keyword and '-m' option (require
- * localedef(1) implementation). Currently it's handled via
- * nl_langinfo(CODESET).
- */
-
-#include <sys/types.h>
-#include <dirent.h>
-#include <err.h>
-#include <locale.h>
-#include <langinfo.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stringlist.h>
-#include <unistd.h>
-#include "setlocale.h"
-
-/* Local prototypes */
-void init_locales_list(void);
-void list_charmaps(void);
-void list_locales(void);
-const char *lookup_localecat(int);
-char *kwval_lconv(int);
-int kwval_lookup(char *, char **, int *, int *);
-void showdetails(char *);
-void showkeywordslist(void);
-void showlocale(void);
-void usage(void);
-
-/* Global variables */
-static StringList *locales = NULL;
-
-int all_locales = 0;
-int all_charmaps = 0;
-int prt_categories = 0;
-int prt_keywords = 0;
-int more_params = 0;
-
-struct _lcinfo {
- const char *name;
- int id;
-} lcinfo [] = {
- { "LC_CTYPE", LC_CTYPE },
- { "LC_COLLATE", LC_COLLATE },
- { "LC_TIME", LC_TIME },
- { "LC_NUMERIC", LC_NUMERIC },
- { "LC_MONETARY", LC_MONETARY },
- { "LC_MESSAGES", LC_MESSAGES }
-};
-#define NLCINFO (sizeof(lcinfo)/sizeof(lcinfo[0]))
-
-/* ids for values not referenced by nl_langinfo() */
-#define KW_ZERO 10000
-#define KW_GROUPING (KW_ZERO+1)
-#define KW_INT_CURR_SYMBOL (KW_ZERO+2)
-#define KW_CURRENCY_SYMBOL (KW_ZERO+3)
-#define KW_MON_DECIMAL_POINT (KW_ZERO+4)
-#define KW_MON_THOUSANDS_SEP (KW_ZERO+5)
-#define KW_MON_GROUPING (KW_ZERO+6)
-#define KW_POSITIVE_SIGN (KW_ZERO+7)
-#define KW_NEGATIVE_SIGN (KW_ZERO+8)
-#define KW_INT_FRAC_DIGITS (KW_ZERO+9)
-#define KW_FRAC_DIGITS (KW_ZERO+10)
-#define KW_P_CS_PRECEDES (KW_ZERO+11)
-#define KW_P_SEP_BY_SPACE (KW_ZERO+12)
-#define KW_N_CS_PRECEDES (KW_ZERO+13)
-#define KW_N_SEP_BY_SPACE (KW_ZERO+14)
-#define KW_P_SIGN_POSN (KW_ZERO+15)
-#define KW_N_SIGN_POSN (KW_ZERO+16)
-#define KW_INT_P_CS_PRECEDES (KW_ZERO+17)
-#define KW_INT_P_SEP_BY_SPACE (KW_ZERO+18)
-#define KW_INT_N_CS_PRECEDES (KW_ZERO+19)
-#define KW_INT_N_SEP_BY_SPACE (KW_ZERO+20)
-#define KW_INT_P_SIGN_POSN (KW_ZERO+21)
-#define KW_INT_N_SIGN_POSN (KW_ZERO+22)
-
-struct _kwinfo {
- const char *name;
- int isstr; /* true - string, false - number */
- int catid; /* LC_* */
- int value_ref;
- const char *comment;
-} kwinfo [] = {
- { "charmap", 1, LC_CTYPE, CODESET, "" }, /* hack */
-
- { "decimal_point", 1, LC_NUMERIC, RADIXCHAR, "" },
- { "thousands_sep", 1, LC_NUMERIC, THOUSEP, "" },
- { "grouping", 1, LC_NUMERIC, KW_GROUPING, "" },
- { "radixchar", 1, LC_NUMERIC, RADIXCHAR,
- "Same as decimal_point (FreeBSD only)" }, /* compat */
- { "thousep", 1, LC_NUMERIC, THOUSEP,
- "Same as thousands_sep (FreeBSD only)" }, /* compat */
-
- { "int_curr_symbol", 1, LC_MONETARY, KW_INT_CURR_SYMBOL, "" },
- { "currency_symbol", 1, LC_MONETARY, KW_CURRENCY_SYMBOL, "" },
- { "mon_decimal_point", 1, LC_MONETARY, KW_MON_DECIMAL_POINT, "" },
- { "mon_thousands_sep", 1, LC_MONETARY, KW_MON_THOUSANDS_SEP, "" },
- { "mon_grouping", 1, LC_MONETARY, KW_MON_GROUPING, "" },
- { "positive_sign", 1, LC_MONETARY, KW_POSITIVE_SIGN, "" },
- { "negative_sign", 1, LC_MONETARY, KW_NEGATIVE_SIGN, "" },
-
- { "int_frac_digits", 0, LC_MONETARY, KW_INT_FRAC_DIGITS, "" },
- { "frac_digits", 0, LC_MONETARY, KW_FRAC_DIGITS, "" },
- { "p_cs_precedes", 0, LC_MONETARY, KW_P_CS_PRECEDES, "" },
- { "p_sep_by_space", 0, LC_MONETARY, KW_P_SEP_BY_SPACE, "" },
- { "n_cs_precedes", 0, LC_MONETARY, KW_N_CS_PRECEDES, "" },
- { "n_sep_by_space", 0, LC_MONETARY, KW_N_SEP_BY_SPACE, "" },
- { "p_sign_posn", 0, LC_MONETARY, KW_P_SIGN_POSN, "" },
- { "n_sign_posn", 0, LC_MONETARY, KW_N_SIGN_POSN, "" },
- { "int_p_cs_precedes", 0, LC_MONETARY, KW_INT_P_CS_PRECEDES, "" },
- { "int_p_sep_by_space", 0, LC_MONETARY, KW_INT_P_SEP_BY_SPACE, "" },
- { "int_n_cs_precedes", 0, LC_MONETARY, KW_INT_N_CS_PRECEDES, "" },
- { "int_n_sep_by_space", 0, LC_MONETARY, KW_INT_N_SEP_BY_SPACE, "" },
- { "int_p_sign_posn", 0, LC_MONETARY, KW_INT_P_SIGN_POSN, "" },
- { "int_n_sign_posn", 0, LC_MONETARY, KW_INT_N_SIGN_POSN, "" },
-
- { "d_t_fmt", 1, LC_TIME, D_T_FMT, "" },
- { "d_fmt", 1, LC_TIME, D_FMT, "" },
- { "t_fmt", 1, LC_TIME, T_FMT, "" },
- { "am_str", 1, LC_TIME, AM_STR, "" },
- { "pm_str", 1, LC_TIME, PM_STR, "" },
- { "t_fmt_ampm", 1, LC_TIME, T_FMT_AMPM, "" },
- { "day_1", 1, LC_TIME, DAY_1, "" },
- { "day_2", 1, LC_TIME, DAY_2, "" },
- { "day_3", 1, LC_TIME, DAY_3, "" },
- { "day_4", 1, LC_TIME, DAY_4, "" },
- { "day_5", 1, LC_TIME, DAY_5, "" },
- { "day_6", 1, LC_TIME, DAY_6, "" },
- { "day_7", 1, LC_TIME, DAY_7, "" },
- { "abday_1", 1, LC_TIME, ABDAY_1, "" },
- { "abday_2", 1, LC_TIME, ABDAY_2, "" },
- { "abday_3", 1, LC_TIME, ABDAY_3, "" },
- { "abday_4", 1, LC_TIME, ABDAY_4, "" },
- { "abday_5", 1, LC_TIME, ABDAY_5, "" },
- { "abday_6", 1, LC_TIME, ABDAY_6, "" },
- { "abday_7", 1, LC_TIME, ABDAY_7, "" },
- { "mon_1", 1, LC_TIME, MON_1, "" },
- { "mon_2", 1, LC_TIME, MON_2, "" },
- { "mon_3", 1, LC_TIME, MON_3, "" },
- { "mon_4", 1, LC_TIME, MON_4, "" },
- { "mon_5", 1, LC_TIME, MON_5, "" },
- { "mon_6", 1, LC_TIME, MON_6, "" },
- { "mon_7", 1, LC_TIME, MON_7, "" },
- { "mon_8", 1, LC_TIME, MON_8, "" },
- { "mon_9", 1, LC_TIME, MON_9, "" },
- { "mon_10", 1, LC_TIME, MON_10, "" },
- { "mon_11", 1, LC_TIME, MON_11, "" },
- { "mon_12", 1, LC_TIME, MON_12, "" },
- { "abmon_1", 1, LC_TIME, ABMON_1, "" },
- { "abmon_2", 1, LC_TIME, ABMON_2, "" },
- { "abmon_3", 1, LC_TIME, ABMON_3, "" },
- { "abmon_4", 1, LC_TIME, ABMON_4, "" },
- { "abmon_5", 1, LC_TIME, ABMON_5, "" },
- { "abmon_6", 1, LC_TIME, ABMON_6, "" },
- { "abmon_7", 1, LC_TIME, ABMON_7, "" },
- { "abmon_8", 1, LC_TIME, ABMON_8, "" },
- { "abmon_9", 1, LC_TIME, ABMON_9, "" },
- { "abmon_10", 1, LC_TIME, ABMON_10, "" },
- { "abmon_11", 1, LC_TIME, ABMON_11, "" },
- { "abmon_12", 1, LC_TIME, ABMON_12, "" },
- { "era", 1, LC_TIME, ERA, "(unavailable)" },
- { "era_d_fmt", 1, LC_TIME, ERA_D_FMT, "(unavailable)" },
- { "era_d_t_fmt", 1, LC_TIME, ERA_D_T_FMT, "(unavailable)" },
- { "era_t_fmt", 1, LC_TIME, ERA_T_FMT, "(unavailable)" },
- { "alt_digits", 1, LC_TIME, ALT_DIGITS, "" },
- { "d_md_order", 1, LC_TIME, D_MD_ORDER,
- "(FreeBSD only)" }, /* local */
-
- { "yesexpr", 1, LC_MESSAGES, YESEXPR, "" },
- { "noexpr", 1, LC_MESSAGES, NOEXPR, "" },
- { "yesstr", 1, LC_MESSAGES, YESSTR,
- "(POSIX legacy)" }, /* compat */
- { "nostr", 1, LC_MESSAGES, NOSTR,
- "(POSIX legacy)" } /* compat */
-
-};
-#define NKWINFO (sizeof(kwinfo)/sizeof(kwinfo[0]))
-
-const char *boguslocales[] = { "UTF-8" };
-#define NBOGUS (sizeof(boguslocales)/sizeof(boguslocales[0]))
-
-int
-main(int argc, char *argv[])
-{
- int ch;
- int tmp;
-
- while ((ch = getopt(argc, argv, "ackm")) != -1) {
- switch (ch) {
- case 'a':
- all_locales = 1;
- break;
- case 'c':
- prt_categories = 1;
- break;
- case 'k':
- prt_keywords = 1;
- break;
- case 'm':
- all_charmaps = 1;
- break;
- default:
- usage();
- }
- }
- argc -= optind;
- argv += optind;
-
- /* validate arguments */
- if (all_locales && all_charmaps)
- usage();
- if ((all_locales || all_charmaps) && argc > 0)
- usage();
- if ((all_locales || all_charmaps) && (prt_categories || prt_keywords))
- usage();
- if ((prt_categories || prt_keywords) && argc <= 0)
- usage();
-
- /* process '-a' */
- if (all_locales) {
- list_locales();
- exit(0);
- }
-
- /* process '-m' */
- if (all_charmaps) {
- list_charmaps();
- exit(0);
- }
-
- /* check for special case '-k list' */
- tmp = 0;
- if (prt_keywords && argc > 0)
- while (tmp < argc)
- if (strcasecmp(argv[tmp++], "list") == 0) {
- showkeywordslist();
- exit(0);
- }
-
- /* process '-c' and/or '-k' */
- if (prt_categories || prt_keywords || argc > 0) {
- setlocale(LC_ALL, "");
- while (argc > 0) {
- showdetails(*argv);
- argv++;
- argc--;
- }
- exit(0);
- }
-
- /* no arguments, show current locale state */
- showlocale();
-
- return (0);
-}
-
-void
-usage(void)
-{
- printf("Usage: locale [ -a | -m ]\n"
- " locale [ -ck ] name ...\n");
- exit(1);
-}
-
-/*
- * Output information about all available locales
- *
- * XXX actually output of this function does not guarantee that locale
- * is really available to application, since it can be broken or
- * inconsistent thus setlocale() will fail. Maybe add '-V' function to
- * also validate these locales?
- */
-void
-list_locales(void)
-{
- size_t i;
-
- init_locales_list();
- for (i = 0; i < locales->sl_cur; i++) {
- printf("%s\n", locales->sl_str[i]);
- }
-}
-
-/*
- * qsort() helper function
- */
-static int
-scmp(const void *s1, const void *s2)
-{
- return strcmp(*(const char **)s1, *(const char **)s2);
-}
-
-/*
- * Output information about all available charmaps
- *
- * XXX this function is doing a task in hackish way, i.e. by scaning
- * list of locales, spliting their codeset part and building list of
- * them.
- */
-void
-list_charmaps(void)
-{
- size_t i;
- char *s, *cs;
- StringList *charmaps;
-
- /* initialize StringList */
- charmaps = sl_init();
- if (charmaps == NULL)
- err(1, "could not allocate memory");
-
- /* fetch locales list */
- init_locales_list();
-
- /* split codesets and build their list */
- for (i = 0; i < locales->sl_cur; i++) {
- s = locales->sl_str[i];
- if ((cs = strchr(s, '.')) != NULL) {
- cs++;
- if (sl_find(charmaps, cs) == NULL)
- sl_add(charmaps, cs);
- }
- }
-
- /* add US-ASCII, if not yet added */
- if (sl_find(charmaps, "US-ASCII") == NULL)
- sl_add(charmaps, "US-ASCII");
-
- /* sort the list */
- qsort(charmaps->sl_str, charmaps->sl_cur, sizeof(char *), scmp);
-
- /* print results */
- for (i = 0; i < charmaps->sl_cur; i++) {
- printf("%s\n", charmaps->sl_str[i]);
- }
-}
-
-/*
- * Retrieve sorted list of system locales (or user locales, if PATH_LOCALE
- * environment variable is set)
- */
-void
-init_locales_list(void)
-{
- DIR *dirp;
- struct dirent *dp;
- size_t i;
- int bogus;
-
- /* why call this function twice ? */
- if (locales != NULL)
- return;
-
- /* initialize StringList */
- locales = sl_init();
- if (locales == NULL)
- err(1, "could not allocate memory");
-
- /* get actual locales directory name */
- if (__detect_path_locale() != 0)
- err(1, "unable to find locales storage");
-
- /* open locales directory */
- dirp = opendir(_PathLocale);
- if (dirp == NULL)
- err(1, "could not open directory '%s'", _PathLocale);
-
- /* scan directory and store its contents except "." and ".." */
- while ((dp = readdir(dirp)) != NULL) {
- if (*(dp->d_name) == '.')
- continue; /* exclude "." and ".." */
- for (bogus = i = 0; i < NBOGUS; i++)
- if (strncmp(dp->d_name, boguslocales[i],
- strlen(boguslocales[i])) == 0)
- bogus = 1;
- if (!bogus)
- sl_add(locales, strdup(dp->d_name));
- }
- closedir(dirp);
-
- /* make sure that 'POSIX' and 'C' locales are present in the list.
- * POSIX 1003.1-2001 requires presence of 'POSIX' name only here, but
- * we also list 'C' for constistency
- */
- if (sl_find(locales, "POSIX") == NULL)
- sl_add(locales, "POSIX");
-
- if (sl_find(locales, "C") == NULL)
- sl_add(locales, "C");
-
- /* make output nicer, sort the list */
- qsort(locales->sl_str, locales->sl_cur, sizeof(char *), scmp);
-}
-
-/*
- * Show current locale status, depending on environment variables
- */
-void
-showlocale(void)
-{
- size_t i;
- const char *lang, *vval, *eval;
-
- setlocale(LC_ALL, "");
-
- lang = getenv("LANG");
- if (lang == NULL) {
- lang = "";
- }
- printf("LANG=%s\n", lang);
- /* XXX: if LANG is null, then set it to "C" to get implied values? */
-
- for (i = 0; i < NLCINFO; i++) {
- vval = setlocale(lcinfo[i].id, NULL);
- eval = getenv(lcinfo[i].name);
- if (eval != NULL && !strcmp(eval, vval)
- && strcmp(lang, vval)) {
- /*
- * Appropriate environment variable set, its value
- * is valid and not overriden by LC_ALL
- *
- * XXX: possible side effect: if both LANG and
- * overriden environment variable are set into same
- * value, then it'll be assumed as 'implied'
- */
- printf("%s=%s\n", lcinfo[i].name, vval);
- } else {
- printf("%s=\"%s\"\n", lcinfo[i].name, vval);
- }
- }
-
- vval = getenv("LC_ALL");
- if (vval == NULL) {
- vval = "";
- }
- printf("LC_ALL=%s\n", vval);
-}
-
-/*
- * keyword value lookup helper (via localeconv())
- */
-char *
-kwval_lconv(int id)
-{
- struct lconv *lc;
- char *rval;
-
- rval = NULL;
- lc = localeconv();
- switch (id) {
- case KW_GROUPING:
- rval = lc->grouping;
- break;
- case KW_INT_CURR_SYMBOL:
- rval = lc->int_curr_symbol;
- break;
- case KW_CURRENCY_SYMBOL:
- rval = lc->currency_symbol;
- break;
- case KW_MON_DECIMAL_POINT:
- rval = lc->mon_decimal_point;
- break;
- case KW_MON_THOUSANDS_SEP:
- rval = lc->mon_thousands_sep;
- break;
- case KW_MON_GROUPING:
- rval = lc->mon_grouping;
- break;
- case KW_POSITIVE_SIGN:
- rval = lc->positive_sign;
- break;
- case KW_NEGATIVE_SIGN:
- rval = lc->negative_sign;
- break;
- case KW_INT_FRAC_DIGITS:
- rval = &(lc->int_frac_digits);
- break;
- case KW_FRAC_DIGITS:
- rval = &(lc->frac_digits);
- break;
- case KW_P_CS_PRECEDES:
- rval = &(lc->p_cs_precedes);
- break;
- case KW_P_SEP_BY_SPACE:
- rval = &(lc->p_sep_by_space);
- break;
- case KW_N_CS_PRECEDES:
- rval = &(lc->n_cs_precedes);
- break;
- case KW_N_SEP_BY_SPACE:
- rval = &(lc->n_sep_by_space);
- break;
- case KW_P_SIGN_POSN:
- rval = &(lc->p_sign_posn);
- break;
- case KW_N_SIGN_POSN:
- rval = &(lc->n_sign_posn);
- break;
- case KW_INT_P_CS_PRECEDES:
- rval = &(lc->int_p_cs_precedes);
- break;
- case KW_INT_P_SEP_BY_SPACE:
- rval = &(lc->int_p_sep_by_space);
- break;
- case KW_INT_N_CS_PRECEDES:
- rval = &(lc->int_n_cs_precedes);
- break;
- case KW_INT_N_SEP_BY_SPACE:
- rval = &(lc->int_n_sep_by_space);
- break;
- case KW_INT_P_SIGN_POSN:
- rval = &(lc->int_p_sign_posn);
- break;
- case KW_INT_N_SIGN_POSN:
- rval = &(lc->int_n_sign_posn);
- break;
- default:
- break;
- }
- return (rval);
-}
-
-/*
- * keyword value and properties lookup
- */
-int
-kwval_lookup(char *kwname, char **kwval, int *cat, int *isstr)
-{
- int rval;
- size_t i;
-
- rval = 0;
- for (i = 0; i < NKWINFO; i++) {
- if (strcasecmp(kwname, kwinfo[i].name) == 0) {
- rval = 1;
- *cat = kwinfo[i].catid;
- *isstr = kwinfo[i].isstr;
- if (kwinfo[i].value_ref < KW_ZERO) {
- *kwval = nl_langinfo(kwinfo[i].value_ref);
- } else {
- *kwval = kwval_lconv(kwinfo[i].value_ref);
- }
- break;
- }
- }
-
- return (rval);
-}
-
-/*
- * Show details about requested keyword according to '-k' and/or '-c'
- * command line options specified.
- */
-void
-showdetails(char *kw)
-{
- int isstr, cat, tmpval;
- char *kwval;
-
- if (kwval_lookup(kw, &kwval, &cat, &isstr) == 0) {
- /*
- * invalid keyword specified.
- * XXX: any actions?
- */
- return;
- }
-
- if (prt_categories) {
- printf("%s\n", lookup_localecat(cat));
- }
-
- if (prt_keywords) {
- if (isstr) {
- printf("%s=\"%s\"\n", kw, kwval);
- } else {
- tmpval = (char) *kwval;
- printf("%s=%d\n", kw, tmpval);
- }
- }
-
- if (!prt_categories && !prt_keywords) {
- if (isstr) {
- printf("%s\n", kwval);
- } else {
- tmpval = (char) *kwval;
- printf("%d\n", tmpval);
- }
- }
-}
-
-/*
- * Convert locale category id into string
- */
-const char *
-lookup_localecat(int cat)
-{
- size_t i;
-
- for (i = 0; i < NLCINFO; i++)
- if (lcinfo[i].id == cat) {
- return (lcinfo[i].name);
- }
- return ("UNKNOWN");
-}
-
-/*
- * Show list of keywords
- */
-void
-showkeywordslist(void)
-{
- size_t i;
-
-#define FMT "%-20s %-12s %-7s %-20s\n"
-
- printf("List of available keywords\n\n");
- printf(FMT, "Keyword", "Category", "Type", "Comment");
- printf("-------------------- ------------ ------- --------------------\n");
- for (i = 0; i < NKWINFO; i++) {
- printf(FMT,
- kwinfo[i].name,
- lookup_localecat(kwinfo[i].catid),
- (kwinfo[i].isstr == 0) ? "number" : "string",
- kwinfo[i].comment);
- }
-}
diff --git a/usr.bin/locate/Makefile b/usr.bin/locate/Makefile
deleted file mode 100644
index 05b1358..0000000
--- a/usr.bin/locate/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-
-SUBDIR= bigram code locate
-
-.include <bsd.subdir.mk>
diff --git a/usr.bin/locate/Makefile.inc b/usr.bin/locate/Makefile.inc
deleted file mode 100644
index 4817408..0000000
--- a/usr.bin/locate/Makefile.inc
+++ /dev/null
@@ -1,3 +0,0 @@
-# $FreeBSD$
-
-LIBEXECDIR?= /usr/libexec
diff --git a/usr.bin/locate/bigram/Makefile b/usr.bin/locate/bigram/Makefile
deleted file mode 100644
index eb39dd1..0000000
--- a/usr.bin/locate/bigram/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= locate.bigram
-NO_MAN=
-BINDIR= ${LIBEXECDIR}
-CFLAGS+= -I${.CURDIR}/../locate
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/locate/bigram/locate.bigram.c b/usr.bin/locate/bigram/locate.bigram.c
deleted file mode 100644
index 208824f..0000000
--- a/usr.bin/locate/bigram/locate.bigram.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (c) 1995 Wolfram Schneider <wosch@FreeBSD.org>. Berlin.
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * James A. Woods.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1989, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static char sccsid[] = "@(#)locate.bigram.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-
-/*
- * bigram < sorted_file_names | sort -nr |
- * awk 'NR <= 128 { printf $2 }' > bigrams
- *
- * List bigrams for 'updatedb' script.
- * Use 'code' to encode a file using this output.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/param.h> /* for MAXPATHLEN */
-#include "locate.h"
-
-u_char buf1[MAXPATHLEN] = " ";
-u_char buf2[MAXPATHLEN];
-u_int bigram[UCHAR_MAX + 1][UCHAR_MAX + 1];
-
-int
-main(void)
-{
- register u_char *cp;
- register u_char *oldpath = buf1, *path = buf2;
- register u_int i, j;
-
- while (fgets(path, sizeof(buf2), stdin) != NULL) {
-
- /*
- * We don't need remove newline character '\n'.
- * '\n' is less than ASCII_MIN and will be later
- * ignored at output.
- */
-
-
- /* skip longest common prefix */
- for (cp = path; *cp == *oldpath; cp++, oldpath++)
- if (*cp == '\0')
- break;
-
- while (*cp != '\0' && *(cp + 1) != '\0') {
- bigram[(u_char)*cp][(u_char)*(cp + 1)]++;
- cp += 2;
- }
-
- /* swap pointers */
- if (path == buf1) {
- path = buf2;
- oldpath = buf1;
- } else {
- path = buf1;
- oldpath = buf2;
- }
- }
-
- /* output, boundary check */
- for (i = ASCII_MIN; i <= ASCII_MAX; i++)
- for (j = ASCII_MIN; j <= ASCII_MAX; j++)
- if (bigram[i][j] != 0)
- (void)printf("%4u %c%c\n", bigram[i][j], i, j);
-
- exit(0);
-}
diff --git a/usr.bin/locate/code/Makefile b/usr.bin/locate/code/Makefile
deleted file mode 100644
index 20eef8c..0000000
--- a/usr.bin/locate/code/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= locate.code
-CFLAGS+=-I${.CURDIR}/../locate
-NO_MAN=
-BINDIR= ${LIBEXECDIR}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/locate/code/locate.code.c b/usr.bin/locate/code/locate.code.c
deleted file mode 100644
index 6290c67..0000000
--- a/usr.bin/locate/code/locate.code.c
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Copyright (c) 1995 Wolfram Schneider <wosch@FreeBSD.org>. Berlin.
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * James A. Woods.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1989, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static char sccsid[] = "@(#)locate.code.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-
-/*
- * PURPOSE: sorted list compressor (works with a modified 'find'
- * to encode/decode a filename database)
- *
- * USAGE: bigram < list > bigrams
- * process bigrams (see updatedb) > common_bigrams
- * code common_bigrams < list > squozen_list
- *
- * METHOD: Uses 'front compression' (see ";login:", Volume 8, Number 1
- * February/March 1983, p. 8). Output format is, per line, an
- * offset differential count byte followed by a partially bigram-
- * encoded ascii residue. A bigram is a two-character sequence,
- * the first 128 most common of which are encoded in one byte.
- *
- * EXAMPLE: For simple front compression with no bigram encoding,
- * if the input is... then the output is...
- *
- * /usr/src 0 /usr/src
- * /usr/src/cmd/aardvark.c 8 /cmd/aardvark.c
- * /usr/src/cmd/armadillo.c 14 armadillo.c
- * /usr/tmp/zoo 5 tmp/zoo
- *
- * The codes are:
- *
- * 0-28 likeliest differential counts + offset to make nonnegative
- * 30 switch code for out-of-range count to follow in next word
- * 31 an 8 bit char followed
- * 128-255 bigram codes (128 most common, as determined by 'updatedb')
- * 32-127 single character (printable) ascii residue (ie, literal)
- *
- * The locate database store any character except newline ('\n')
- * and NUL ('\0'). The 8-bit character support don't wast extra
- * space until you have characters in file names less than 32
- * or greather than 127.
- *
- *
- * SEE ALSO: updatedb.sh, ../bigram/locate.bigram.c
- *
- * AUTHOR: James A. Woods, Informatics General Corp.,
- * NASA Ames Research Center, 10/82
- * 8-bit file names characters:
- * Wolfram Schneider, Berlin September 1996
- */
-
-#include <sys/param.h>
-#include <err.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <unistd.h>
-#include "locate.h"
-
-#define BGBUFSIZE (NBG * 2) /* size of bigram buffer */
-
-u_char buf1[MAXPATHLEN] = " ";
-u_char buf2[MAXPATHLEN];
-u_char bigrams[BGBUFSIZE + 1] = { 0 };
-
-#define LOOKUP 1 /* use a lookup array instead a function, 3x faster */
-
-#ifdef LOOKUP
-#define BGINDEX(x) (big[(u_char)*x][(u_char)*(x + 1)])
-typedef short bg_t;
-bg_t big[UCHAR_MAX + 1][UCHAR_MAX + 1];
-#else
-#define BGINDEX(x) bgindex(x)
-typedef int bg_t;
-int bgindex(char *);
-#endif /* LOOKUP */
-
-
-void usage(void);
-
-int
-main(argc, argv)
- int argc;
- char *argv[];
-{
- register u_char *cp, *oldpath, *path;
- int ch, code, count, diffcount, oldcount;
- FILE *fp;
- register int i, j;
-
- while ((ch = getopt(argc, argv, "")) != -1)
- switch(ch) {
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (argc != 1)
- usage();
-
- if ((fp = fopen(argv[0], "r")) == NULL)
- err(1, "%s", argv[0]);
-
- /* First copy bigram array to stdout. */
- (void)fgets(bigrams, BGBUFSIZE + 1, fp);
-
- if (fwrite(bigrams, 1, BGBUFSIZE, stdout) != BGBUFSIZE)
- err(1, "stdout");
- (void)fclose(fp);
-
-#ifdef LOOKUP
- /* init lookup table */
- for (i = 0; i < UCHAR_MAX + 1; i++)
- for (j = 0; j < UCHAR_MAX + 1; j++)
- big[i][j] = (bg_t)-1;
-
- for (cp = bigrams, i = 0; *cp != '\0'; i += 2, cp += 2)
- big[(u_char)*cp][(u_char)*(cp + 1)] = (bg_t)i;
-
-#endif /* LOOKUP */
-
- oldpath = buf1;
- path = buf2;
- oldcount = 0;
-
- while (fgets(path, sizeof(buf2), stdin) != NULL) {
-
- /* skip empty lines */
- if (*path == '\n')
- continue;
-
- /* remove newline */
- for (cp = path; *cp != '\0'; cp++) {
-#ifndef LOCATE_CHAR30
- /* old locate implementations core'd for char 30 */
- if (*cp == SWITCH)
- *cp = '?';
- else
-#endif /* !LOCATE_CHAR30 */
-
- /* chop newline */
- if (*cp == '\n')
- *cp = '\0';
- }
-
- /* Skip longest common prefix. */
- for (cp = path; *cp == *oldpath; cp++, oldpath++)
- if (*cp == '\0')
- break;
-
- count = cp - path;
- diffcount = count - oldcount + OFFSET;
- oldcount = count;
- if (diffcount < 0 || diffcount > 2 * OFFSET) {
- if (putchar(SWITCH) == EOF ||
- putw(diffcount, stdout) == EOF)
- err(1, "stdout");
- } else
- if (putchar(diffcount) == EOF)
- err(1, "stdout");
-
- while (*cp != '\0') {
- /* print *two* characters */
-
- if ((code = BGINDEX(cp)) != (bg_t)-1) {
- /*
- * print *one* as bigram
- * Found, so mark byte with
- * parity bit.
- */
- if (putchar((code / 2) | PARITY) == EOF)
- err(1, "stdout");
- cp += 2;
- }
-
- else {
- for (i = 0; i < 2; i++) {
- if (*cp == '\0')
- break;
-
- /* print umlauts in file names */
- if (*cp < ASCII_MIN ||
- *cp > ASCII_MAX) {
- if (putchar(UMLAUT) == EOF ||
- putchar(*cp++) == EOF)
- err(1, "stdout");
- }
-
- else {
- /* normal character */
- if(putchar(*cp++) == EOF)
- err(1, "stdout");
- }
- }
-
- }
- }
-
- if (path == buf1) { /* swap pointers */
- path = buf2;
- oldpath = buf1;
- } else {
- path = buf1;
- oldpath = buf2;
- }
- }
- /* Non-zero status if there were errors */
- if (fflush(stdout) != 0 || ferror(stdout))
- exit(1);
- exit(0);
-}
-
-#ifndef LOOKUP
-int
-bgindex(bg) /* Return location of bg in bigrams or -1. */
- char *bg;
-{
- register char bg0, bg1, *p;
-
- bg0 = bg[0];
- bg1 = bg[1];
- for (p = bigrams; *p != NULL; p++)
- if (*p++ == bg0 && *p == bg1)
- break;
- return (*p == NULL ? -1 : (--p - bigrams));
-}
-#endif /* !LOOKUP */
-
-void
-usage()
-{
- (void)fprintf(stderr,
- "usage: locate.code common_bigrams < list > squozen_list\n");
- exit(1);
-}
diff --git a/usr.bin/locate/locate/Makefile b/usr.bin/locate/locate/Makefile
deleted file mode 100644
index 9a618da..0000000
--- a/usr.bin/locate/locate/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= locate
-SRCS= util.c locate.c
-CFLAGS+= -I${.CURDIR} -DMMAP # -DDEBUG (print time) -O2 (10% faster)
-SCRIPTS=updatedb.sh mklocatedb.sh concatdb.sh
-MAN= locate.1 locate.updatedb.8
-
-SCRIPTSDIR= ${LIBEXECDIR}
-.for script in ${SCRIPTS}
-SCRIPTSNAME_${script}= locate.${script:R}
-.endfor
-MLINKS+= locate.updatedb.8 updatedb.8
-
-# only /usr/src/etc/Makefile install files in /etc
-# ${INSTALL} -o root -g wheel -m 644 \
-# ${.CURDIR}/locate.rc ${DESTDIR}/etc
-
-.include "../../Makefile.inc"
-.include <bsd.prog.mk>
diff --git a/usr.bin/locate/locate/concatdb.sh b/usr.bin/locate/locate/concatdb.sh
deleted file mode 100644
index 156f21a..0000000
--- a/usr.bin/locate/locate/concatdb.sh
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) September 1995 Wolfram Schneider <wosch@FreeBSD.org>. Berlin.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# concatdb - concatenate locate databases
-#
-# usage: concatdb database1 ... databaseN > newdb
-#
-# Sequence of databases is important.
-#
-# $FreeBSD$
-
-# The directory containing locate subprograms
-: ${LIBEXECDIR:=/usr/libexec}; export LIBEXECDIR
-
-PATH=$LIBEXECDIR:/bin:/usr/bin:$PATH; export PATH
-
-umask 077 # protect temp files
-
-: ${TMPDIR:=/var/tmp}; export TMPDIR;
-test -d "$TMPDIR" || TMPDIR=/var/tmp
-
-# utilities to built locate database
-: ${bigram:=locate.bigram}
-: ${code:=locate.code}
-: ${sort:=sort}
-: ${locate:=locate}
-
-
-case $# in
- [01]) echo 'usage: concatdb databases1 ... databaseN > newdb'
- exit 1
- ;;
-esac
-
-
-bigrams=`mktemp ${TMPDIR=/tmp}/_bigrams.XXXXXXXXXX` || exit 1
-trap 'rm -f $bigrams' 0 1 2 3 5 10 15
-
-for db
-do
- $locate -d $db /
-done | $bigram | $sort -nr | awk 'NR <= 128 { printf $2 }' > $bigrams
-
-for db
-do
- $locate -d $db /
-done | $code $bigrams
diff --git a/usr.bin/locate/locate/fastfind.c b/usr.bin/locate/locate/fastfind.c
deleted file mode 100644
index e132dbd..0000000
--- a/usr.bin/locate/locate/fastfind.c
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * Copyright (c) 1995 Wolfram Schneider <wosch@FreeBSD.org>. Berlin.
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * James A. Woods.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-
-#ifndef _LOCATE_STATISTIC_
-#define _LOCATE_STATISTIC_
-
-void
-statistic (fp, path_fcodes)
- FILE *fp; /* open database */
- char *path_fcodes; /* for error message */
-{
- register int lines, chars, size, big, zwerg;
- register u_char *p, *s;
- register int c;
- int count, umlaut;
- u_char bigram1[NBG], bigram2[NBG], path[MAXPATHLEN];
-
- for (c = 0, p = bigram1, s = bigram2; c < NBG; c++) {
- p[c] = check_bigram_char(getc(fp));
- s[c] = check_bigram_char(getc(fp));
- }
-
- lines = chars = big = zwerg = umlaut = 0;
- size = NBG + NBG;
-
- for (c = getc(fp), count = 0; c != EOF; size++) {
- if (c == SWITCH) {
- count += getwf(fp) - OFFSET;
- size += sizeof(int);
- zwerg++;
- } else
- count += c - OFFSET;
-
- for (p = path + count; (c = getc(fp)) > SWITCH; size++)
- if (c < PARITY) {
- if (c == UMLAUT) {
- c = getc(fp);
- size++;
- umlaut++;
- }
- p++;
- } else {
- /* bigram char */
- big++;
- p += 2;
- }
-
- p++;
- lines++;
- chars += (p - path);
- }
-
- (void)printf("\nDatabase: %s\n", path_fcodes);
- (void)printf("Compression: Front: %2.2f%%, ",
- (size + big - (2 * NBG)) / (chars / (float)100));
- (void)printf("Bigram: %2.2f%%, ", (size - big) / (size / (float)100));
- (void)printf("Total: %2.2f%%\n",
- (size - (2 * NBG)) / (chars / (float)100));
- (void)printf("Filenames: %d, ", lines);
- (void)printf("Characters: %d, ", chars);
- (void)printf("Database size: %d\n", size);
- (void)printf("Bigram characters: %d, ", big);
- (void)printf("Integers: %d, ", zwerg);
- (void)printf("8-Bit characters: %d\n", umlaut);
-
-}
-#endif /* _LOCATE_STATISTIC_ */
-
-extern char separator;
-
-void
-#ifdef FF_MMAP
-
-
-#ifdef FF_ICASE
-fastfind_mmap_icase
-#else
-fastfind_mmap
-#endif /* FF_ICASE */
-(pathpart, paddr, len, database)
- char *pathpart; /* search string */
- caddr_t paddr; /* mmap pointer */
- int len; /* length of database */
- char *database; /* for error message */
-
-
-#else /* MMAP */
-
-
-#ifdef FF_ICASE
-fastfind_icase
-#else
-fastfind
-#endif /* FF_ICASE */
-
-(fp, pathpart, database)
- FILE *fp; /* open database */
- char *pathpart; /* search string */
- char *database; /* for error message */
-
-
-#endif /* MMAP */
-
-{
- register u_char *p, *s, *patend, *q, *foundchar;
- register int c, cc;
- int count, found, globflag;
- u_char *cutoff;
- u_char bigram1[NBG], bigram2[NBG], path[MAXPATHLEN];
-
-#ifdef FF_ICASE
- /* use a lookup table for case insensitive search */
- u_char table[UCHAR_MAX + 1];
-
- tolower_word(pathpart);
-#endif /* FF_ICASE*/
-
- /* init bigram table */
-#ifdef FF_MMAP
- if (len < (2*NBG))
- errx(1, "database too small: %s", database);
-
- for (c = 0, p = bigram1, s = bigram2; c < NBG; c++, len-= 2) {
- p[c] = check_bigram_char(*paddr++);
- s[c] = check_bigram_char(*paddr++);
- }
-#else
- for (c = 0, p = bigram1, s = bigram2; c < NBG; c++) {
- p[c] = check_bigram_char(getc(fp));
- s[c] = check_bigram_char(getc(fp));
- }
-#endif /* FF_MMAP */
-
- /* find optimal (last) char for searching */
- for (p = pathpart; *p != '\0'; p++)
- if (index(LOCATE_REG, *p) != NULL)
- break;
-
- if (*p == '\0')
- globflag = 0;
- else
- globflag = 1;
-
- p = pathpart;
- patend = patprep(p);
- cc = *patend;
-
-#ifdef FF_ICASE
- /* set patend char to true */
- for (c = 0; c < UCHAR_MAX + 1; c++)
- table[c] = 0;
-
- table[TOLOWER(*patend)] = 1;
- table[toupper(*patend)] = 1;
-#endif /* FF_ICASE */
-
-
- /* main loop */
- found = count = 0;
- foundchar = 0;
-
-#ifdef FF_MMAP
- c = (u_char)*paddr++; len--;
- for (; len > 0; ) {
-#else
- c = getc(fp);
- for (; c != EOF; ) {
-#endif /* FF_MMAP */
-
- /* go forward or backward */
- if (c == SWITCH) { /* big step, an integer */
-#ifdef FF_MMAP
- count += getwm(paddr) - OFFSET;
- len -= INTSIZE; paddr += INTSIZE;
-#else
- count += getwf(fp) - OFFSET;
-#endif /* FF_MMAP */
- } else { /* slow step, =< 14 chars */
- count += c - OFFSET;
- }
-
- /* overlay old path */
- p = path + count;
- foundchar = p - 1;
-
-#ifdef FF_MMAP
- for (; len > 0;) {
- c = (u_char)*paddr++;
- len--;
-#else
- for (;;) {
- c = getc(fp);
-#endif /* FF_MMAP */
- /*
- * == UMLAUT: 8 bit char followed
- * <= SWITCH: offset
- * >= PARITY: bigram
- * rest: single ascii char
- *
- * offset < SWITCH < UMLAUT < ascii < PARITY < bigram
- */
- if (c < PARITY) {
- if (c <= UMLAUT) {
- if (c == UMLAUT) {
-#ifdef FF_MMAP
- c = (u_char)*paddr++;
- len--;
-#else
- c = getc(fp);
-#endif /* FF_MMAP */
-
- } else
- break; /* SWITCH */
- }
-#ifdef FF_ICASE
- if (table[c])
-#else
- if (c == cc)
-#endif /* FF_ICASE */
- foundchar = p;
- *p++ = c;
- }
- else {
- /* bigrams are parity-marked */
- TO7BIT(c);
-
-#ifndef FF_ICASE
- if (bigram1[c] == cc ||
- bigram2[c] == cc)
-#else
-
- if (table[bigram1[c]] ||
- table[bigram2[c]])
-#endif /* FF_ICASE */
- foundchar = p + 1;
-
- *p++ = bigram1[c];
- *p++ = bigram2[c];
- }
- }
-
- if (found) { /* previous line matched */
- cutoff = path;
- *p-- = '\0';
- foundchar = p;
- } else if (foundchar >= path + count) { /* a char matched */
- *p-- = '\0';
- cutoff = path + count;
- } else /* nothing to do */
- continue;
-
- found = 0;
- for (s = foundchar; s >= cutoff; s--) {
- if (*s == cc
-#ifdef FF_ICASE
- || TOLOWER(*s) == cc
-#endif /* FF_ICASE */
- ) { /* fast first char check */
- for (p = patend - 1, q = s - 1; *p != '\0';
- p--, q--)
- if (*q != *p
-#ifdef FF_ICASE
- && TOLOWER(*q) != *p
-#endif /* FF_ICASE */
- )
- break;
- if (*p == '\0') { /* fast match success */
- found = 1;
- if (!globflag ||
-#ifndef FF_ICASE
- !fnmatch(pathpart, path, 0))
-#else
- !fnmatch(pathpart, path,
- FNM_CASEFOLD))
-#endif /* !FF_ICASE */
- {
- if (f_silent)
- counter++;
- else if (f_limit) {
- counter++;
- if (f_limit >= counter)
- (void)printf("%s%c",path,separator);
- else
- errx(0, "[show only %d lines]", counter - 1);
- } else
- (void)printf("%s%c",path,separator);
- }
- break;
- }
- }
- }
- }
-}
diff --git a/usr.bin/locate/locate/locate.1 b/usr.bin/locate/locate/locate.1
deleted file mode 100644
index c436cd4..0000000
--- a/usr.bin/locate/locate/locate.1
+++ /dev/null
@@ -1,276 +0,0 @@
-.\" Copyright (c) 1995 Wolfram Schneider <wosch@FreeBSD.org>. Berlin.
-.\" Copyright (c) 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)locate.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd August 17, 2006
-.Dt LOCATE 1
-.Os
-.Sh NAME
-.Nm locate
-.Nd find filenames quickly
-.Sh SYNOPSIS
-.Nm
-.Op Fl 0Scims
-.Op Fl l Ar limit
-.Op Fl d Ar database
-.Ar pattern ...
-.Sh DESCRIPTION
-The
-.Nm
-program searches a database for all pathnames which match the specified
-.Ar pattern .
-The database is recomputed periodically (usually weekly or daily),
-and contains the pathnames
-of all files which are publicly accessible.
-.Pp
-Shell globbing and quoting characters
-.Dq ( * ,
-.Dq \&? ,
-.Dq \e ,
-.Dq \&[
-and
-.Dq \&] )
-may be used in
-.Ar pattern ,
-although they will have to be escaped from the shell.
-Preceding any character with a backslash
-.Pq Dq \e
-eliminates any special
-meaning which it may have.
-The matching differs in that no characters must be matched explicitly,
-including slashes
-.Pq Dq / .
-.Pp
-As a special case, a pattern containing no globbing characters
-.Pq Dq foo
-is matched as though it were
-.Dq *foo* .
-.Pp
-Historically, locate only stored characters between 32 and 127.
-The
-current implementation store any character except newline
-.Pq Sq \en
-and
-.Dv NUL
-.Pq Sq \e0 .
-The 8-bit character support does not waste extra space for
-plain ASCII file names.
-Characters less than 32 or greater than 127
-are stored in 2 bytes.
-.Pp
-The following options are available:
-.Bl -tag -width 10n
-.It Fl 0
-Print pathnames separated by an
-.Tn ASCII
-.Dv NUL
-character (character code 0) instead of default NL
-(newline, character code 10).
-.It Fl S
-Print some statistics about the database and exit.
-.It Fl c
-Suppress normal output; instead print a count of matching file names.
-.It Fl d Ar database
-Search in
-.Ar database
-instead of the default file name database.
-Multiple
-.Fl d
-options are allowed.
-Each additional
-.Fl d
-option adds the specified database to the list
-of databases to be searched.
-.Pp
-The option
-.Ar database
-may be a colon-separated list of databases.
-A single colon is a reference
-to the default database.
-.Bd -literal
-$ locate -d $HOME/lib/mydb: foo
-.Ed
-.Pp
-will first search string
-.Dq foo
-in
-.Pa $HOME/lib/mydb
-and then in
-.Pa /var/db/locate.database .
-.Bd -literal
-$ locate -d $HOME/lib/mydb::/cdrom/locate.database foo
-.Ed
-.Pp
-will first search string
-.Dq foo
-in
-.Pa $HOME/lib/mydb
-and then in
-.Pa /var/db/locate.database
-and then in
-.Pa /cdrom/locate.database .
-.Pp
-.Dl "$ locate -d db1 -d db2 -d db3 pattern"
-.Pp
-is the same as
-.Pp
-.Dl "$ locate -d db1:db2:db3 pattern"
-.Pp
-or
-.Pp
-.Dl "$ locate -d db1:db2 -d db3 pattern"
-.Pp
-If
-.Fl
-is given as the database name, standard input will be read instead.
-For example, you can compress your database
-and use:
-.Bd -literal
-$ zcat database.gz | locate -d - pattern
-.Ed
-.Pp
-This might be useful on machines with a fast CPU and little RAM and slow
-I/O.
-Note: you can only use
-.Em one
-pattern for stdin.
-.It Fl i
-Ignore case distinctions in both the pattern and the database.
-.It Fl l Ar number
-Limit output to
-.Ar number
-of file names and exit.
-.It Fl m
-Use
-.Xr mmap 2
-instead of the
-.Xr stdio 3
-library.
-This is the default behavior
-and is faster in most cases.
-.It Fl s
-Use the
-.Xr stdio 3
-library instead of
-.Xr mmap 2 .
-.El
-.Sh ENVIRONMENT
-.Bl -tag -width LOCATE_PATH -compact
-.It Pa LOCATE_PATH
-path to the locate database if set and not empty, ignored if the
-.Fl d
-option was specified.
-.El
-.Sh FILES
-.Bl -tag -width /etc/periodic/weekly/310.locate -compact
-.It Pa /var/db/locate.database
-locate database
-.It Pa /usr/libexec/locate.updatedb
-Script to update the locate database
-.It Pa /etc/periodic/weekly/310.locate
-Script that starts the database rebuild
-.El
-.Sh SEE ALSO
-.Xr find 1 ,
-.Xr whereis 1 ,
-.Xr which 1 ,
-.Xr fnmatch 3 ,
-.Xr locate.updatedb 8
-.Rs
-.%A Woods, James A.
-.%D 1983
-.%T "Finding Files Fast"
-.%J ";login"
-.%V 8:1
-.%P pp. 8-10
-.Re
-.Sh HISTORY
-The
-.Nm
-command first appeared in
-.Bx 4.4 .
-Many new features were
-added in
-.Fx 2.2 .
-.Sh BUGS
-The
-.Nm
-program may fail to list some files that are present, or may
-list files that have been removed from the system.
-This is because
-locate only reports files that are present in the database, which is
-typically only regenerated once a week by the
-.Pa /etc/periodic/weekly/310.locate
-script.
-Use
-.Xr find 1
-to locate files that are of a more transitory nature.
-.Pp
-The
-.Nm
-database is typically built by user
-.Dq nobody
-and the
-.Xr locate.updatedb 8
-utility skips directories
-which are not readable for user
-.Dq nobody ,
-group
-.Dq nobody ,
-or
-world.
-For example, if your HOME directory is not world-readable,
-.Em none
-of your files are
-in the database.
-.Pp
-The
-.Nm
-database is not byte order independent.
-It is not possible
-to share the databases between machines with different byte order.
-The current
-.Nm
-implementation understands databases in host byte order or
-network byte order if both architectures use the same integer size.
-So on a
-.Fx Ns /i386
-machine
-(little endian), you can read
-a locate database which was built on SunOS/sparc machine
-(big endian, net).
-.Pp
-The
-.Nm
-utility does not recognize multibyte characters.
diff --git a/usr.bin/locate/locate/locate.c b/usr.bin/locate/locate/locate.c
deleted file mode 100644
index d7529fb..0000000
--- a/usr.bin/locate/locate/locate.c
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- * Copyright (c) 1995 Wolfram Schneider <wosch@FreeBSD.org>. Berlin.
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * James A. Woods.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1995-1996 Wolfram Schneider, Berlin.\n\
-@(#) Copyright (c) 1989, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)locate.c 8.1 (Berkeley) 6/6/93";
-#endif
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-/*
- * Ref: Usenix ;login:, Vol 8, No 1, February/March, 1983, p. 8.
- *
- * Locate scans a file list for the full pathname of a file given only part
- * of the name. The list has been processed with with "front-compression"
- * and bigram coding. Front compression reduces space by a factor of 4-5,
- * bigram coding by a further 20-25%.
- *
- * The codes are:
- *
- * 0-28 likeliest differential counts + offset to make nonnegative
- * 30 switch code for out-of-range count to follow in next word
- * 31 an 8 bit char followed
- * 128-255 bigram codes (128 most common, as determined by 'updatedb')
- * 32-127 single character (printable) ascii residue (ie, literal)
- *
- * A novel two-tiered string search technique is employed:
- *
- * First, a metacharacter-free subpattern and partial pathname is matched
- * BACKWARDS to avoid full expansion of the pathname list. The time savings
- * is 40-50% over forward matching, which cannot efficiently handle
- * overlapped search patterns and compressed path residue.
- *
- * Then, the actual shell glob-style regular expression (if in this form) is
- * matched against the candidate pathnames using the slower routines provided
- * in the standard 'find'.
- */
-
-#include <sys/param.h>
-#include <ctype.h>
-#include <err.h>
-#include <fnmatch.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifdef MMAP
-# include <sys/types.h>
-# include <sys/stat.h>
-# include <sys/mman.h>
-# include <fcntl.h>
-#endif
-
-
-#include "locate.h"
-#include "pathnames.h"
-
-#ifdef DEBUG
-# include <sys/time.h>
-# include <sys/types.h>
-# include <sys/resource.h>
-#endif
-
-int f_mmap; /* use mmap */
-int f_icase; /* ignore case */
-int f_stdin; /* read database from stdin */
-int f_statistic; /* print statistic */
-int f_silent; /* suppress output, show only count of matches */
-int f_limit; /* limit number of output lines, 0 == infinite */
-u_int counter; /* counter for matches [-c] */
-char separator='\n'; /* line separator */
-
-
-void usage(void);
-void statistic(FILE *, char *);
-void fastfind(FILE *, char *, char *);
-void fastfind_icase(FILE *, char *, char *);
-void fastfind_mmap(char *, caddr_t, int, char *);
-void fastfind_mmap_icase(char *, caddr_t, int, char *);
-void search_mmap(char *, char **);
-void search_fopen(char *, char **);
-unsigned long cputime(void);
-
-extern char **colon(char **, char*, char*);
-extern void print_matches(u_int);
-extern int getwm(caddr_t);
-extern int getwf(FILE *);
-extern u_char *tolower_word(u_char *);
-extern int check_bigram_char(int);
-extern char *patprep(char *);
-
-int
-main(argc, argv)
- int argc;
- char **argv;
-{
- register int ch;
- char **dbv = NULL;
- char *path_fcodes; /* locate database */
-#ifdef MMAP
- f_mmap = 1; /* mmap is default */
-#endif
- (void) setlocale(LC_ALL, "");
-
- while ((ch = getopt(argc, argv, "0Scd:il:ms")) != -1)
- switch(ch) {
- case '0': /* 'find -print0' style */
- separator = '\0';
- break;
- case 'S': /* statistic lines */
- f_statistic = 1;
- break;
- case 'l': /* limit number of output lines, 0 == infinite */
- f_limit = atoi(optarg);
- break;
- case 'd': /* database */
- dbv = colon(dbv, optarg, _PATH_FCODES);
- break;
- case 'i': /* ignore case */
- f_icase = 1;
- break;
- case 'm': /* mmap */
-#ifdef MMAP
- f_mmap = 1;
-#else
- warnx("mmap(2) not implemented");
-#endif
- break;
- case 's': /* stdio lib */
- f_mmap = 0;
- break;
- case 'c': /* suppress output, show only count of matches */
- f_silent = 1;
- break;
- default:
- usage();
- }
- argv += optind;
- argc -= optind;
-
- /* to few arguments */
- if (argc < 1 && !(f_statistic))
- usage();
-
- /* no (valid) database as argument */
- if (dbv == NULL || *dbv == NULL) {
- /* try to read database from enviroment */
- if ((path_fcodes = getenv("LOCATE_PATH")) == NULL ||
- *path_fcodes == '\0')
- /* use default database */
- dbv = colon(dbv, _PATH_FCODES, _PATH_FCODES);
- else /* $LOCATE_PATH */
- dbv = colon(dbv, path_fcodes, _PATH_FCODES);
- }
-
- if (f_icase && UCHAR_MAX < 4096) /* init tolower lookup table */
- for (ch = 0; ch < UCHAR_MAX + 1; ch++)
- myctype[ch] = tolower(ch);
-
- /* foreach database ... */
- while((path_fcodes = *dbv) != NULL) {
- dbv++;
-
- if (!strcmp(path_fcodes, "-"))
- f_stdin = 1;
- else
- f_stdin = 0;
-
-#ifndef MMAP
- f_mmap = 0; /* be paranoid */
-#endif
- if (!f_mmap || f_stdin || f_statistic)
- search_fopen(path_fcodes, argv);
- else
- search_mmap(path_fcodes, argv);
- }
-
- if (f_silent)
- print_matches(counter);
- exit(0);
-}
-
-
-void
-search_fopen(db, s)
- char *db; /* database */
- char **s; /* search strings */
-{
- FILE *fp;
-#ifdef DEBUG
- long t0;
-#endif
-
- /* can only read stdin once */
- if (f_stdin) {
- fp = stdin;
- if (*(s+1) != NULL) {
- warnx("read database from stdin, use only `%s' as pattern", *s);
- *(s+1) = NULL;
- }
- }
- else if ((fp = fopen(db, "r")) == NULL)
- err(1, "`%s'", db);
-
- /* count only chars or lines */
- if (f_statistic) {
- statistic(fp, db);
- (void)fclose(fp);
- return;
- }
-
- /* foreach search string ... */
- while(*s != NULL) {
-#ifdef DEBUG
- t0 = cputime();
-#endif
- if (!f_stdin &&
- fseek(fp, (long)0, SEEK_SET) == -1)
- err(1, "fseek to begin of ``%s''\n", db);
-
- if (f_icase)
- fastfind_icase(fp, *s, db);
- else
- fastfind(fp, *s, db);
-#ifdef DEBUG
- warnx("fastfind %ld ms", cputime () - t0);
-#endif
- s++;
- }
- (void)fclose(fp);
-}
-
-#ifdef MMAP
-void
-search_mmap(db, s)
- char *db; /* database */
- char **s; /* search strings */
-{
- struct stat sb;
- int fd;
- caddr_t p;
- off_t len;
-#ifdef DEBUG
- long t0;
-#endif
- if ((fd = open(db, O_RDONLY)) == -1 ||
- fstat(fd, &sb) == -1)
- err(1, "`%s'", db);
- len = sb.st_size;
-
- if ((p = mmap((caddr_t)0, (size_t)len,
- PROT_READ, MAP_SHARED,
- fd, (off_t)0)) == MAP_FAILED)
- err(1, "mmap ``%s''", db);
-
- /* foreach search string ... */
- while (*s != NULL) {
-#ifdef DEBUG
- t0 = cputime();
-#endif
- if (f_icase)
- fastfind_mmap_icase(*s, p, (int)len, db);
- else
- fastfind_mmap(*s, p, (int)len, db);
-#ifdef DEBUG
- warnx("fastfind %ld ms", cputime () - t0);
-#endif
- s++;
- }
-
- if (munmap(p, (size_t)len) == -1)
- warn("munmap %s\n", db);
-
- (void)close(fd);
-}
-#endif /* MMAP */
-
-#ifdef DEBUG
-unsigned long
-cputime ()
-{
- struct rusage rus;
-
- getrusage(RUSAGE_SELF, &rus);
- return(rus.ru_utime.tv_sec * 1000 + rus.ru_utime.tv_usec / 1000);
-}
-#endif /* DEBUG */
-
-void
-usage ()
-{
- (void)fprintf(stderr,
- "usage: locate [-0Scims] [-l limit] [-d database] pattern ...\n\n");
- (void)fprintf(stderr,
- "default database: `%s' or $LOCATE_PATH\n", _PATH_FCODES);
- exit(1);
-}
-
-
-/* load fastfind functions */
-
-/* statistic */
-/* fastfind_mmap, fastfind_mmap_icase */
-#ifdef MMAP
-#undef FF_MMAP
-#undef FF_ICASE
-
-#define FF_MMAP
-#include "fastfind.c"
-#define FF_ICASE
-#include "fastfind.c"
-#endif /* MMAP */
-
-/* fopen */
-/* fastfind, fastfind_icase */
-#undef FF_MMAP
-#undef FF_ICASE
-#include "fastfind.c"
-#define FF_ICASE
-#include "fastfind.c"
diff --git a/usr.bin/locate/locate/locate.h b/usr.bin/locate/locate/locate.h
deleted file mode 100644
index 24df8d4..0000000
--- a/usr.bin/locate/locate/locate.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 1995 Wolfram Schneider <wosch@FreeBSD.org>. Berlin.
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)locate.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-/* Symbolic constants shared by locate.c and code.c */
-
-#define NBG 128 /* number of bigrams considered */
-#define OFFSET 14 /* abs value of max likely diff */
-#define PARITY 0200 /* parity bit */
-#define SWITCH 30 /* switch code */
-#define UMLAUT 31 /* an 8 bit char followed */
-
-/* 0-28 likeliest differential counts + offset to make nonnegative */
-#define LDC_MIN 0
-#define LDC_MAX 28
-
-/* 128-255 bigram codes (128 most common, as determined by 'updatedb') */
-#define BIGRAM_MIN (UCHAR_MAX - CHAR_MAX)
-#define BIGRAM_MAX UCHAR_MAX
-
-/* 32-127 single character (printable) ascii residue (ie, literal) */
-#define ASCII_MIN 32
-#define ASCII_MAX CHAR_MAX
-
-/* #define TO7BIT(x) (x = ( ((u_char)x) & CHAR_MAX )) */
-#define TO7BIT(x) (x = x & CHAR_MAX )
-
-
-#if UCHAR_MAX >= 4096
- define TOLOWER(ch) tolower(ch)
-#else
-
-u_char myctype[UCHAR_MAX + 1];
-#define TOLOWER(ch) (myctype[ch])
-#endif
-
-#define INTSIZE (sizeof(int))
-
-#define LOCATE_REG "*?[]\\" /* fnmatch(3) meta characters */
diff --git a/usr.bin/locate/locate/locate.rc b/usr.bin/locate/locate/locate.rc
deleted file mode 100644
index 54cc6d8..0000000
--- a/usr.bin/locate/locate/locate.rc
+++ /dev/null
@@ -1,30 +0,0 @@
-#
-# /etc/locate.rc - command script for updatedb(8)
-#
-# $FreeBSD$
-
-#
-# All commented values are the defaults
-#
-# temp directory
-#TMPDIR="/tmp"
-
-# the actual database
-#FCODES="/var/db/locate.database"
-
-# directories to be put in the database
-#SEARCHPATHS="/"
-
-# directories unwanted in output
-#PRUNEPATHS="/tmp /usr/tmp /var/tmp /var/db/portsnap"
-
-# filesystems allowed. Beware: a non-listed filesystem will be pruned
-# and if the SEARCHPATHS starts in such a filesystem locate will build
-# an empty database.
-#
-# the default list contains all local file systems that are not synthetic,
-# loopback mounts, or read-only, according to lsvfs.
-#
-# be careful if you add 'nfs' or other network file system types or file
-# systems that generally reside on slow or removable devices like cd9660
-#FILESYSTEMS="ufs ext2fs zfs xfs"
diff --git a/usr.bin/locate/locate/locate.updatedb.8 b/usr.bin/locate/locate/locate.updatedb.8
deleted file mode 100644
index 2e2248f..0000000
--- a/usr.bin/locate/locate/locate.updatedb.8
+++ /dev/null
@@ -1,75 +0,0 @@
-.\" Copyright (c) 1996
-.\" Mike Pritchard <mpp@FreeBSD.org>. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by Mike Pritchard.
-.\" 4. Neither the name of the author nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd February 11, 1996
-.Dt LOCATE.UPDATEDB 8
-.Os
-.Sh NAME
-.Nm locate.updatedb
-.Nd update locate database
-.Sh SYNOPSIS
-.Nm /usr/libexec/locate.updatedb
-.Sh DESCRIPTION
-The
-.Nm
-utility updates the database used by
-.Xr locate 1 .
-It is typically run once a week by the
-.Pa /etc/periodic/weekly/310.locate
-script.
-.Pp
-The contents of the newly built database can be controlled by the
-.Pa /etc/locate.rc
-file.
-.Sh ENVIRONMENT
-.Bl -tag -width /var/db/locate.database -compact
-.It Pa LOCATE_CONFIG
-path to the configuration file
-.El
-.Sh FILES
-.Bl -tag -width /var/db/locate.database -compact
-.It Pa /var/db/locate.database
-the default database
-.It Pa /etc/locate.rc
-the configuration file
-.El
-.Sh SEE ALSO
-.Xr locate 1 ,
-.Xr periodic 8
-.Rs
-.%A Woods, James A.
-.%D 1983
-.%T "Finding Files Fast"
-.%J ";login"
-.%V 8:1
-.%P pp. 8-10
-.Re
diff --git a/usr.bin/locate/locate/mklocatedb.sh b/usr.bin/locate/locate/mklocatedb.sh
deleted file mode 100644
index 39d15d7..0000000
--- a/usr.bin/locate/locate/mklocatedb.sh
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) September 1995 Wolfram Schneider <wosch@FreeBSD.org>. Berlin.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# mklocatedb - build locate database
-#
-# usage: mklocatedb [-presort] < filelist > database
-#
-# $FreeBSD$
-
-# The directory containing locate subprograms
-: ${LIBEXECDIR:=/usr/libexec}; export LIBEXECDIR
-
-PATH=$LIBEXECDIR:/bin:/usr/bin:$PATH; export PATH
-
-umask 077 # protect temp files
-
-: ${TMPDIR:=/tmp}; export TMPDIR
-test -d "$TMPDIR" || TMPDIR=/tmp
-if ! TMPDIR=`mktemp -d $TMPDIR/mklocateXXXXXXXXXX`; then
- exit 1
-fi
-
-
-# utilities to built locate database
-: ${bigram:=locate.bigram}
-: ${code:=locate.code}
-: ${sort:=sort}
-
-
-sortopt="-u -T $TMPDIR"
-sortcmd=$sort
-
-
-bigrams=$TMPDIR/_mklocatedb$$.bigrams
-filelist=$TMPDIR/_mklocatedb$$.list
-
-trap 'rm -f $bigrams $filelist; rmdir $TMPDIR' 0 1 2 3 5 10 15
-
-
-# Input already sorted
-if [ X"$1" = "X-presort" ]; then
- shift;
-
- # create an empty file
- true > $bigrams
-
- # Locate database bootstrapping
- # 1. first build a temp database without bigram compression
- # 2. create the bigram from the temp database
- # 3. create the real locate database with bigram compression.
- #
- # This scheme avoid large temporary files in /tmp
-
- $code $bigrams > $filelist || exit 1
- locate -d $filelist / | $bigram | $sort -nr | head -128 |
- awk '{if (/^[ ]*[0-9]+[ ]+..$/) {printf("%s",$2)} else {exit 1}}' > $bigrams || exit 1
- locate -d $filelist / | $code $bigrams || exit 1
- exit
-
-else
- if $sortcmd $sortopt > $filelist; then
- $bigram < $filelist | $sort -nr |
- awk '{if (/^[ ]*[0-9]+[ ]+..$/) {printf("%s",$2)} else {exit 1}}' > $bigrams || exit 1
- $code $bigrams < $filelist || exit 1
- else
- echo "`basename $0`: cannot build locate database" >&2
- exit 1
- fi
-fi
diff --git a/usr.bin/locate/locate/pathnames.h b/usr.bin/locate/locate/pathnames.h
deleted file mode 100644
index 8fb0e8c..0000000
--- a/usr.bin/locate/locate/pathnames.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)pathnames.h 8.1 (Berkeley) 6/6/93
- */
-
-#define _PATH_FCODES "/var/db/locate.database"
diff --git a/usr.bin/locate/locate/updatedb.sh b/usr.bin/locate/locate/updatedb.sh
deleted file mode 100644
index d828438..0000000
--- a/usr.bin/locate/locate/updatedb.sh
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) September 1995 Wolfram Schneider <wosch@FreeBSD.org>. Berlin.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# updatedb - update locate database for local mounted filesystems
-#
-# $FreeBSD$
-
-if [ "$(id -u)" = "0" ]; then
- echo ">>> WARNING" 1>&2
- echo ">>> Executing updatedb as root. This WILL reveal all filenames" 1>&2
- echo ">>> on your machine to all login users, which is a security risk." 1>&2
-fi
-: ${LOCATE_CONFIG="/etc/locate.rc"}
-if [ -f "$LOCATE_CONFIG" -a -r "$LOCATE_CONFIG" ]; then
- . $LOCATE_CONFIG
-fi
-
-# The directory containing locate subprograms
-: ${LIBEXECDIR:=/usr/libexec}; export LIBEXECDIR
-: ${TMPDIR:=/tmp}; export TMPDIR
-if ! TMPDIR=`mktemp -d $TMPDIR/locateXXXXXXXXXX`; then
- exit 1
-fi
-
-PATH=$LIBEXECDIR:/bin:/usr/bin:$PATH; export PATH
-
-
-: ${mklocatedb:=locate.mklocatedb} # make locate database program
-: ${FCODES:=/var/db/locate.database} # the database
-: ${SEARCHPATHS:="/"} # directories to be put in the database
-: ${PRUNEPATHS:="/tmp /usr/tmp /var/tmp /var/db/portsnap"} # unwanted directories
-: ${FILESYSTEMS:="$(lsvfs | tail -n +3 | \
- egrep -vw "loopback|network|synthetic|read-only|0" | \
- cut -d " " -f1)"} # allowed filesystems
-: ${find:=find}
-
-case X"$SEARCHPATHS" in
- X) echo "$0: empty variable SEARCHPATHS"; exit 1;; esac
-case X"$FILESYSTEMS" in
- X) echo "$0: empty variable FILESYSTEMS"; exit 1;; esac
-
-# Make a list a paths to exclude in the locate run
-excludes="! (" or=""
-for fstype in $FILESYSTEMS
-do
- excludes="$excludes $or -fstype $fstype"
- or="-or"
-done
-excludes="$excludes ) -prune"
-
-case X"$PRUNEPATHS" in
- X) ;;
- *) for path in $PRUNEPATHS
- do
- excludes="$excludes -or -path $path -prune"
- done;;
-esac
-
-tmp=$TMPDIR/_updatedb$$
-trap 'rm -f $tmp; rmdir $TMPDIR' 0 1 2 3 5 10 15
-
-# search locally
-# echo $find $SEARCHPATHS $excludes -or -print && exit
-if $find -s $SEARCHPATHS $excludes -or -print 2>/dev/null |
- $mklocatedb -presort > $tmp
-then
- case X"`$find $tmp -size -257c -print`" in
- X) cat $tmp > $FCODES;;
- *) echo "updatedb: locate database $tmp is empty"
- exit 1
- esac
-fi
diff --git a/usr.bin/locate/locate/util.c b/usr.bin/locate/locate/util.c
deleted file mode 100644
index 944ca88..0000000
--- a/usr.bin/locate/locate/util.c
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Copyright (c) 1995 Wolfram Schneider <wosch@FreeBSD.org>. Berlin.
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * James A. Woods.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-
-#include <stdlib.h>
-#include <string.h>
-#include <err.h>
-#include <sys/param.h>
-#include <arpa/inet.h>
-#include <stdio.h>
-
-#include "locate.h"
-
-char **colon(char **, char*, char*);
-char *patprep(char *);
-void print_matches(u_int);
-u_char *tolower_word(u_char *);
-int getwm(caddr_t);
-int getwf(FILE *);
-int check_bigram_char(int);
-
-/*
- * Validate bigram chars. If the test failed the database is corrupt
- * or the database is obviously not a locate database.
- */
-int
-check_bigram_char(ch)
- int ch;
-{
- /* legal bigram: 0, ASCII_MIN ... ASCII_MAX */
- if (ch == 0 ||
- (ch >= ASCII_MIN && ch <= ASCII_MAX))
- return(ch);
-
- errx(1,
- "locate database header corrupt, bigram char outside 0, %d-%d: %d",
- ASCII_MIN, ASCII_MAX, ch);
- exit(1);
-}
-
-/* split a colon separated string into a char vector
- *
- * "bla:foo" -> {"foo", "bla"}
- * "bla:" -> {"foo", dot}
- * "bla" -> {"bla"}
- * "" -> do nothing
- *
- */
-char **
-colon(dbv, path, dot)
- char **dbv;
- char *path;
- char *dot; /* default for single ':' */
-{
- int vlen, slen;
- char *c, *ch, *p;
- char **pv;
-
- if (dbv == NULL) {
- if ((dbv = malloc(sizeof(char **))) == NULL)
- err(1, "malloc");
- *dbv = NULL;
- }
-
- /* empty string */
- if (*path == '\0') {
- warnx("empty database name, ignored");
- return(dbv);
- }
-
- /* length of string vector */
- for(vlen = 0, pv = dbv; *pv != NULL; pv++, vlen++);
-
- for (ch = c = path; ; ch++) {
- if (*ch == ':' ||
- (!*ch && !(*(ch - 1) == ':' && ch == 1+ path))) {
- /* single colon -> dot */
- if (ch == c)
- p = dot;
- else {
- /* a string */
- slen = ch - c;
- if ((p = malloc(sizeof(char) * (slen + 1)))
- == NULL)
- err(1, "malloc");
- bcopy(c, p, slen);
- *(p + slen) = '\0';
- }
- /* increase dbv with element p */
- if ((dbv = realloc(dbv, sizeof(char **) * (vlen + 2)))
- == NULL)
- err(1, "realloc");
- *(dbv + vlen) = p;
- *(dbv + ++vlen) = NULL;
- c = ch + 1;
- }
- if (*ch == '\0')
- break;
- }
- return (dbv);
-}
-
-void
-print_matches(counter)
- u_int counter;
-{
- (void)printf("%d\n", counter);
-}
-
-
-/*
- * extract last glob-free subpattern in name for fast pre-match; prepend
- * '\0' for backwards match; return end of new pattern
- */
-static char globfree[100];
-
-char *
-patprep(name)
- char *name;
-{
- register char *endmark, *p, *subp;
-
- subp = globfree;
- *subp++ = '\0'; /* set first element to '\0' */
- p = name + strlen(name) - 1;
-
- /* skip trailing metacharacters */
- for (; p >= name; p--)
- if (index(LOCATE_REG, *p) == NULL)
- break;
-
- /*
- * check if maybe we are in a character class
- *
- * 'foo.[ch]'
- * |----< p
- */
- if (p >= name &&
- (index(p, '[') != NULL || index(p, ']') != NULL)) {
- for (p = name; *p != '\0'; p++)
- if (*p == ']' || *p == '[')
- break;
- p--;
-
- /*
- * cannot find a non-meta character, give up
- * '*\*[a-z]'
- * |-------< p
- */
- if (p >= name && index(LOCATE_REG, *p) != NULL)
- p = name - 1;
- }
-
- if (p < name)
- /* only meta chars: "???", force '/' search */
- *subp++ = '/';
-
- else {
- for (endmark = p; p >= name; p--)
- if (index(LOCATE_REG, *p) != NULL)
- break;
- for (++p;
- (p <= endmark) && subp < (globfree + sizeof(globfree));)
- *subp++ = *p++;
- }
- *subp = '\0';
- return(--subp);
-}
-
-/* tolower word */
-u_char *
-tolower_word(word)
- u_char *word;
-{
- register u_char *p;
-
- for(p = word; *p != '\0'; p++)
- *p = TOLOWER(*p);
-
- return(word);
-}
-
-
-/*
- * Read integer from mmap pointer.
- * Essential a simple ``return *(int *)p'' but avoid sigbus
- * for integer alignment (SunOS 4.x, 5.x).
- *
- * Convert network byte order to host byte order if neccessary.
- * So we can read on FreeBSD/i386 (little endian) a locate database
- * which was built on SunOS/sparc (big endian).
- */
-
-int
-getwm(p)
- caddr_t p;
-{
- union {
- char buf[INTSIZE];
- int i;
- } u;
- register int i;
-
- for (i = 0; i < INTSIZE; i++)
- u.buf[i] = *p++;
-
- i = u.i;
-
- if (i > MAXPATHLEN || i < -(MAXPATHLEN)) {
- i = ntohl(i);
- if (i > MAXPATHLEN || i < -(MAXPATHLEN))
- errx(1, "integer out of +-MAXPATHLEN (%d): %d",
- MAXPATHLEN, abs(i) < abs(htonl(i)) ? i : htonl(i));
- }
- return(i);
-}
-
-/*
- * Read integer from stream.
- *
- * Convert network byte order to host byte order if neccessary.
- * So we can read on FreeBSD/i386 (little endian) a locate database
- * which was built on SunOS/sparc (big endian).
- */
-
-int
-getwf(fp)
- FILE *fp;
-{
- register int word;
-
- word = getw(fp);
-
- if (word > MAXPATHLEN || word < -(MAXPATHLEN)) {
- word = ntohl(word);
- if (word > MAXPATHLEN || word < -(MAXPATHLEN))
- errx(1, "integer out of +-MAXPATHLEN (%d): %d",
- MAXPATHLEN, abs(word) < abs(htonl(word)) ? word :
- htonl(word));
- }
- return(word);
-}
diff --git a/usr.bin/lock/Makefile b/usr.bin/lock/Makefile
deleted file mode 100644
index dc09a87..0000000
--- a/usr.bin/lock/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= lock
-BINOWN= root
-BINMODE=4555
-DPADD= ${LIBCRYPT}
-LDADD= -lcrypt
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/lock/lock.1 b/usr.bin/lock/lock.1
deleted file mode 100644
index 7c9c650..0000000
--- a/usr.bin/lock/lock.1
+++ /dev/null
@@ -1,85 +0,0 @@
-.\" Copyright (c) 1987, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)lock.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd July 10, 2002
-.Dt LOCK 1
-.Os
-.Sh NAME
-.Nm lock
-.Nd reserve a terminal
-.Sh SYNOPSIS
-.Nm
-.Op Fl npv
-.Op Fl t Ar timeout
-.Sh DESCRIPTION
-The
-.Nm
-utility requests a password from the user, reads it again for verification
-and then will normally not relinquish the terminal until the password is
-repeated.
-There are two other conditions under which it will terminate: it
-will timeout after some interval of time and it may be killed by someone
-with the appropriate permission.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl n
-Do not use a timeout value.
-Terminal will be locked forever.
-.It Fl p
-A password is not requested, instead the user's current login password
-is used.
-.It Fl t Ar timeout
-The time limit (default 15 minutes) is changed to
-.Ar timeout
-minutes.
-.It Fl v
-Disable switching virtual terminals while this terminal is locked.
-This option is implemented in a way similar to the
-.Fl S
-option of
-.Xr vidcontrol 1 ,
-and thus has the same restrictions.
-It is only available if the terminal in question is a
-.Xr syscons 4
-virtual terminal.
-.El
-.Sh SEE ALSO
-.Xr vidcontrol 1 ,
-.Xr syscons 4
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3.0 .
diff --git a/usr.bin/lock/lock.c b/usr.bin/lock/lock.c
deleted file mode 100644
index 3b19e35..0000000
--- a/usr.bin/lock/lock.c
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * Copyright (c) 1980, 1987, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Bob Toxen.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1987, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)lock.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Lock a terminal up until the given key is entered or the given
- * interval times out.
- *
- * Timeout interval is by default TIMEOUT, it can be changed with
- * an argument of the form -time where time is in minutes
- */
-
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/signal.h>
-#include <sys/consio.h>
-#include <err.h>
-#include <ctype.h>
-#include <errno.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-#include <termios.h>
-#include <unistd.h>
-
-#define TIMEOUT 15
-
-void quit(int);
-void bye(int);
-void hi(int);
-static void usage(void);
-
-struct timeval timeout;
-struct timeval zerotime;
-struct termios tty, ntty;
-long nexttime; /* keep the timeout time */
-int no_timeout; /* lock terminal forever */
-int vtyunlock; /* Unlock flag and code. */
-
-/*ARGSUSED*/
-int
-main(int argc, char **argv)
-{
- struct passwd *pw;
- struct timeval timval;
- time_t timval_sec;
- struct itimerval ntimer, otimer;
- struct tm *timp;
- int ch, failures, sectimeout, usemine, vtylock;
- char *ap, *mypw, *ttynam, *tzn;
- char hostname[MAXHOSTNAMELEN], s[BUFSIZ], s1[BUFSIZ];
-
- openlog("lock", LOG_ODELAY, LOG_AUTH);
-
- sectimeout = TIMEOUT;
- mypw = NULL;
- usemine = 0;
- no_timeout = 0;
- vtylock = 0;
- while ((ch = getopt(argc, argv, "npt:v")) != -1)
- switch((char)ch) {
- case 't':
- if ((sectimeout = atoi(optarg)) <= 0)
- errx(1, "illegal timeout value");
- break;
- case 'p':
- usemine = 1;
- if (!(pw = getpwuid(getuid())))
- errx(1, "unknown uid %d", getuid());
- mypw = strdup(pw->pw_passwd);
- break;
- case 'n':
- no_timeout = 1;
- break;
- case 'v':
- vtylock = 1;
- break;
- case '?':
- default:
- usage();
- }
- timeout.tv_sec = sectimeout * 60;
-
- setuid(getuid()); /* discard privs */
-
- if (tcgetattr(0, &tty)) /* get information for header */
- exit(1);
- gethostname(hostname, sizeof(hostname));
- if (!(ttynam = ttyname(0)))
- errx(1, "not a terminal?");
- if (gettimeofday(&timval, (struct timezone *)NULL))
- err(1, "gettimeofday");
- nexttime = timval.tv_sec + (sectimeout * 60);
- timval_sec = timval.tv_sec;
- timp = localtime(&timval_sec);
- ap = asctime(timp);
- tzn = timp->tm_zone;
-
- (void)signal(SIGINT, quit);
- (void)signal(SIGQUIT, quit);
- ntty = tty; ntty.c_lflag &= ~ECHO;
- (void)tcsetattr(0, TCSADRAIN|TCSASOFT, &ntty);
-
- if (!mypw) {
- /* get key and check again */
- (void)printf("Key: ");
- if (!fgets(s, sizeof(s), stdin) || *s == '\n')
- quit(0);
- (void)printf("\nAgain: ");
- /*
- * Don't need EOF test here, if we get EOF, then s1 != s
- * and the right things will happen.
- */
- (void)fgets(s1, sizeof(s1), stdin);
- (void)putchar('\n');
- if (strcmp(s1, s)) {
- (void)printf("\07lock: passwords didn't match.\n");
- (void)tcsetattr(0, TCSADRAIN|TCSASOFT, &tty);
- exit(1);
- }
- s[0] = '\0';
- mypw = s1;
- }
-
- /* set signal handlers */
- (void)signal(SIGINT, hi);
- (void)signal(SIGQUIT, hi);
- (void)signal(SIGTSTP, hi);
- (void)signal(SIGALRM, bye);
-
- ntimer.it_interval = zerotime;
- ntimer.it_value = timeout;
- if (!no_timeout)
- setitimer(ITIMER_REAL, &ntimer, &otimer);
- if (vtylock) {
- /*
- * If this failed, we want to err out; warn isn't good
- * enough, since we don't want the user to think that
- * everything is nice and locked because they got a
- * "Key:" prompt.
- */
- if (ioctl(0, VT_LOCKSWITCH, &vtylock) == -1) {
- (void)tcsetattr(0, TCSADRAIN|TCSASOFT, &tty);
- err(1, "locking vty");
- }
- vtyunlock = 0x2;
- }
-
- /* header info */
- (void)printf("lock: %s on %s.", ttynam, hostname);
- if (no_timeout)
- (void)printf(" no timeout.");
- else
- (void)printf(" timeout in %d minute%s.", sectimeout,
- sectimeout != 1 ? "s" : "");
- if (vtylock)
- (void)printf(" vty locked.");
- (void)printf("\ntime now is %.20s%s%s", ap, tzn, ap + 19);
-
- failures = 0;
-
- for (;;) {
- (void)printf("Key: ");
- if (!fgets(s, sizeof(s), stdin)) {
- clearerr(stdin);
- hi(0);
- goto tryagain;
- }
- if (usemine) {
- s[strlen(s) - 1] = '\0';
- if (!strcmp(mypw, crypt(s, mypw)))
- break;
- }
- else if (!strcmp(s, s1))
- break;
- (void)printf("\07\n");
- failures++;
- if (getuid() == 0)
- syslog(LOG_NOTICE, "%d ROOT UNLOCK FAILURE%s (%s on %s)",
- failures, failures > 1 ? "S": "", ttynam, hostname);
-tryagain:
- if (tcgetattr(0, &ntty) && (errno != EINTR))
- exit(1);
- sleep(1); /* to discourage guessing */
- }
- if (getuid() == 0)
- syslog(LOG_NOTICE, "ROOT UNLOCK ON hostname %s port %s",
- hostname, ttynam);
- quit(0);
- return(0); /* not reached */
-}
-
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "usage: lock [-npv] [-t timeout]\n");
- exit(1);
-}
-
-void
-hi(int signo __unused)
-{
- struct timeval timval;
-
- if (!gettimeofday(&timval, (struct timezone *)NULL)) {
- (void)printf("lock: type in the unlock key. ");
- if (no_timeout) {
- (void)putchar('\n');
- } else {
- (void)printf("timeout in %ld:%ld minutes\n",
- (nexttime - timval.tv_sec) / 60,
- (nexttime - timval.tv_sec) % 60);
- }
- }
-}
-
-void
-quit(int signo __unused)
-{
- (void)putchar('\n');
- (void)tcsetattr(0, TCSADRAIN|TCSASOFT, &tty);
- if (vtyunlock)
- (void)ioctl(0, VT_LOCKSWITCH, &vtyunlock);
- exit(0);
-}
-
-void
-bye(int signo __unused)
-{
- if (!no_timeout) {
- (void)tcsetattr(0, TCSADRAIN|TCSASOFT, &tty);
- if (vtyunlock)
- (void)ioctl(0, VT_LOCKSWITCH, &vtyunlock);
- (void)printf("lock: timeout\n");
- exit(1);
- }
-}
diff --git a/usr.bin/lockf/Makefile b/usr.bin/lockf/Makefile
deleted file mode 100644
index 7baff7c..0000000
--- a/usr.bin/lockf/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-PROG= lockf
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/lockf/lockf.1 b/usr.bin/lockf/lockf.1
deleted file mode 100644
index 6e2e06e..0000000
--- a/usr.bin/lockf/lockf.1
+++ /dev/null
@@ -1,156 +0,0 @@
-.\"
-.\" Copyright (C) 1998 John D. Polstra. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY JOHN D. POLSTRA AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL JOHN D. POLSTRA OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd July 7, 1998
-.Os
-.Dt LOCKF 1
-.Sh NAME
-.Nm lockf
-.Nd execute a command while holding a file lock
-.Sh SYNOPSIS
-.Nm
-.Op Fl ks
-.Op Fl t Ar seconds
-.Ar file
-.Ar command
-.Op Ar arguments
-.Sh DESCRIPTION
-The
-.Nm
-utility acquires an exclusive lock on a
-.Ar file ,
-creating it if necessary,
-.Bf Em
-and removing the file on exit unless explicitly told not to.
-.Ef
-While holding the lock, it executes a
-.Ar command
-with optional
-.Ar arguments .
-After the
-.Ar command
-completes,
-.Nm
-releases the lock, and removes the
-.Ar file
-unless the
-.Fl k
-option is specified.
-.Bx Ns -style
-locking is used, as described in
-.Xr flock 2 ;
-the mere existence of the
-.Ar file
-is not considered to constitute a lock.
-.Pp
-If the
-.Nm
-utility is being used to facilitate concurrency between a number
-of processes, it is recommended that the
-.Fl k
-option be used.
-This will guarantee lock ordering, as well as implement
-a performance enhanced algorithm which minimizes CPU load associated
-with concurrent unlink, drop and re-acquire activity.
-It should be noted
-that if the
-.Fl k
-option is not used, then no guarantees around lock ordering can be made.
-.Pp
-The following options are supported:
-.Bl -tag -width ".Fl t Ar seconds"
-.It Fl k
-Causes the lock file to be kept (not removed) after the command
-completes.
-.It Fl s
-Causes
-.Nm
-to operate silently.
-Failure to acquire the lock is indicated only in the exit status.
-.It Fl t Ar seconds
-Specifies a timeout for waiting for the lock.
-By default,
-.Nm
-waits indefinitely to acquire the lock.
-If a timeout is specified with this option,
-.Nm
-will wait at most the given number of
-.Ar seconds
-before giving up.
-A timeout of 0 may be given, in which case
-.Nm
-will fail unless it can acquire the lock immediately.
-When a lock times out,
-.Ar command
-is
-.Em not
-executed.
-.El
-.Pp
-In no event will
-.Nm
-break a lock that is held by another process.
-.Sh EXIT STATUS
-If
-.Nm
-successfully acquires the lock, it returns the exit status produced by
-.Ar command .
-Otherwise, it returns one of the exit codes defined in
-.Xr sysexits 3 ,
-as follows:
-.Bl -tag -width ".Dv EX_CANTCREAT"
-.It Dv EX_TEMPFAIL
-The specified lock file was already locked by another process.
-.It Dv EX_CANTCREAT
-The
-.Nm
-utility
-was unable to create the lock file, e.g., because of insufficient access
-privileges.
-.It Dv EX_USAGE
-There was an error on the
-.Nm
-command line.
-.It Dv EX_OSERR
-A system call (e.g.,
-.Xr fork 2 )
-failed unexpectedly.
-.It Dv EX_SOFTWARE
-The
-.Ar command
-did not exit normally,
-but may have been signaled or stopped.
-.El
-.Sh SEE ALSO
-.Xr flock 2 ,
-.Xr sysexits 3
-.Sh HISTORY
-A
-.Nm
-utility first appeared in
-.Fx 2.2 .
-.Sh AUTHORS
-.An John Polstra Aq jdp@polstra.com
diff --git a/usr.bin/lockf/lockf.c b/usr.bin/lockf/lockf.c
deleted file mode 100644
index 368eed0..0000000
--- a/usr.bin/lockf/lockf.c
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Copyright (C) 1997 John D. Polstra. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY JOHN D. POLSTRA AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL JOHN D. POLSTRA OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/wait.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sysexits.h>
-#include <unistd.h>
-
-static int acquire_lock(const char *name, int flags);
-static void cleanup(void);
-static void killed(int sig);
-static void timeout(int sig);
-static void usage(void);
-static void wait_for_lock(const char *name);
-
-static const char *lockname;
-static int lockfd = -1;
-static int keep;
-static volatile sig_atomic_t timed_out;
-
-/*
- * Execute an arbitrary command while holding a file lock.
- */
-int
-main(int argc, char **argv)
-{
- int ch, silent, status, waitsec;
- pid_t child;
-
- silent = keep = 0;
- waitsec = -1; /* Infinite. */
- while ((ch = getopt(argc, argv, "skt:")) != -1) {
- switch (ch) {
- case 'k':
- keep = 1;
- break;
- case 's':
- silent = 1;
- break;
- case 't':
- {
- char *endptr;
- waitsec = strtol(optarg, &endptr, 0);
- if (*optarg == '\0' || *endptr != '\0' || waitsec < 0)
- errx(EX_USAGE,
- "invalid timeout \"%s\"", optarg);
- }
- break;
- default:
- usage();
- }
- }
- if (argc - optind < 2)
- usage();
- lockname = argv[optind++];
- argc -= optind;
- argv += optind;
- if (waitsec > 0) { /* Set up a timeout. */
- struct sigaction act;
-
- act.sa_handler = timeout;
- sigemptyset(&act.sa_mask);
- act.sa_flags = 0; /* Note that we do not set SA_RESTART. */
- sigaction(SIGALRM, &act, NULL);
- alarm(waitsec);
- }
- /*
- * If the "-k" option is not given, then we must not block when
- * acquiring the lock. If we did, then the lock holder would
- * unlink the file upon releasing the lock, and we would acquire
- * a lock on a file with no directory entry. Then another
- * process could come along and acquire the same lock. To avoid
- * this problem, we separate out the actions of waiting for the
- * lock to be available and of actually acquiring the lock.
- *
- * That approach produces behavior that is technically correct;
- * however, it causes some performance & ordering problems for
- * locks that have a lot of contention. First, it is unfair in
- * the sense that a released lock isn't necessarily granted to
- * the process that has been waiting the longest. A waiter may
- * be starved out indefinitely. Second, it creates a thundering
- * herd situation each time the lock is released.
- *
- * When the "-k" option is used, the unlink race no longer
- * exists. In that case we can block while acquiring the lock,
- * avoiding the separate step of waiting for the lock. This
- * yields fairness and improved performance.
- */
- lockfd = acquire_lock(lockname, O_NONBLOCK);
- while (lockfd == -1 && !timed_out && waitsec != 0) {
- if (keep)
- lockfd = acquire_lock(lockname, 0);
- else {
- wait_for_lock(lockname);
- lockfd = acquire_lock(lockname, O_NONBLOCK);
- }
- }
- if (waitsec > 0)
- alarm(0);
- if (lockfd == -1) { /* We failed to acquire the lock. */
- if (silent)
- exit(EX_TEMPFAIL);
- errx(EX_TEMPFAIL, "%s: already locked", lockname);
- }
- /* At this point, we own the lock. */
- if (atexit(cleanup) == -1)
- err(EX_OSERR, "atexit failed");
- if ((child = fork()) == -1)
- err(EX_OSERR, "cannot fork");
- if (child == 0) { /* The child process. */
- close(lockfd);
- execvp(argv[0], argv);
- warn("%s", argv[0]);
- _exit(1);
- }
- /* This is the parent process. */
- signal(SIGINT, SIG_IGN);
- signal(SIGQUIT, SIG_IGN);
- signal(SIGTERM, killed);
- if (waitpid(child, &status, 0) == -1)
- err(EX_OSERR, "waitpid failed");
- return (WIFEXITED(status) ? WEXITSTATUS(status) : EX_SOFTWARE);
-}
-
-/*
- * Try to acquire a lock on the given file, creating the file if
- * necessary. The flags argument is O_NONBLOCK or 0, depending on
- * whether we should wait for the lock. Returns an open file descriptor
- * on success, or -1 on failure.
- */
-static int
-acquire_lock(const char *name, int flags)
-{
- int fd;
-
- if ((fd = open(name, O_RDONLY|O_CREAT|O_EXLOCK|flags, 0666)) == -1) {
- if (errno == EAGAIN || errno == EINTR)
- return (-1);
- err(EX_CANTCREAT, "cannot open %s", name);
- }
- return (fd);
-}
-
-/*
- * Remove the lock file.
- */
-static void
-cleanup(void)
-{
-
- if (keep)
- flock(lockfd, LOCK_UN);
- else
- unlink(lockname);
-}
-
-/*
- * Signal handler for SIGTERM. Cleans up the lock file, then re-raises
- * the signal.
- */
-static void
-killed(int sig)
-{
-
- cleanup();
- signal(sig, SIG_DFL);
- if (kill(getpid(), sig) == -1)
- err(EX_OSERR, "kill failed");
-}
-
-/*
- * Signal handler for SIGALRM.
- */
-static void
-timeout(int sig __unused)
-{
-
- timed_out = 1;
-}
-
-static void
-usage(void)
-{
-
- fprintf(stderr,
- "usage: lockf [-ks] [-t seconds] file command [arguments]\n");
- exit(EX_USAGE);
-}
-
-/*
- * Wait until it might be possible to acquire a lock on the given file.
- * If the file does not exist, return immediately without creating it.
- */
-static void
-wait_for_lock(const char *name)
-{
- int fd;
-
- if ((fd = open(name, O_RDONLY|O_EXLOCK, 0666)) == -1) {
- if (errno == ENOENT || errno == EINTR)
- return;
- err(EX_CANTCREAT, "cannot open %s", name);
- }
- close(fd);
-}
diff --git a/usr.bin/logger/Makefile b/usr.bin/logger/Makefile
deleted file mode 100644
index 6ff7224..0000000
--- a/usr.bin/logger/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-.include <bsd.own.mk>
-
-PROG= logger
-WARNS?= 6
-
-.if ${MK_INET6_SUPPORT} != "no"
-CFLAGS+= -DINET6
-.endif
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/logger/logger.1 b/usr.bin/logger/logger.1
deleted file mode 100644
index d7e28b1..0000000
--- a/usr.bin/logger/logger.1
+++ /dev/null
@@ -1,132 +0,0 @@
-.\" Copyright (c) 1983, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)logger.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd August 2, 2006
-.Dt LOGGER 1
-.Os
-.Sh NAME
-.Nm logger
-.Nd make entries in the system log
-.Sh SYNOPSIS
-.Nm
-.Op Fl 46Ais
-.Op Fl f Ar file
-.Op Fl h Ar host
-.Op Fl P Ar port
-.Op Fl p Ar pri
-.Op Fl t Ar tag
-.Op Ar message ...
-.Sh DESCRIPTION
-The
-.Nm
-utility provides a shell command interface to the
-.Xr syslog 3
-system log module.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl 4
-Force
-.Nm
-to use IPv4 addresses only.
-.It Fl 6
-Force
-.Nm
-to use IPv6 addresses only.
-.It Fl A
-By default,
-.Nm
-tries to send the message to only one address,
-even if the host has more than one A or AAAA record.
-If this option is specified,
-.Nm
-tries to send the message to all addresses.
-.It Fl i
-Log the process id of the logger process
-with each line.
-.It Fl s
-Log the message to standard error, as well as the system log.
-.It Fl f Ar file
-Log the specified file.
-.It Fl h Ar host
-Send the message to the remote system
-.Ar host
-instead of logging it locally.
-.It Fl P Ar port
-Send the message to the specified
-.Ar port
-number on a remote system,
-which can be specified as a service name
-or as a decimal number.
-The default is
-.Dq Li syslog .
-If an unknown service name is used,
-.Nm
-prints a warning and falls back to port 514.
-.It Fl p Ar pri
-Enter the message with the specified priority.
-The priority may be specified numerically or as a ``facility.level''
-pair.
-For example, ``\-p local3.info'' logs the message(s) as
-.Ar info Ns rmational
-level in the
-.Ar local3
-facility.
-The default is ``user.notice.''
-.It Fl t Ar tag
-Mark every line in the log with the specified
-.Ar tag .
-.It Ar message
-Write the message to log; if not specified, and the
-.Fl f
-flag is not
-provided, standard input is logged.
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh EXAMPLES
-.Bd -literal -offset indent -compact
-logger System rebooted
-
-logger \-p local0.notice \-t HOSTIDM \-f /dev/idmc
-.Ed
-.Sh SEE ALSO
-.Xr syslog 3 ,
-.Xr syslogd 8
-.Sh STANDARDS
-The
-.Nm
-command is expected to be
-.St -p1003.2
-compatible.
diff --git a/usr.bin/logger/logger.c b/usr.bin/logger/logger.c
deleted file mode 100644
index 5d9ec4d..0000000
--- a/usr.bin/logger/logger.c
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1983, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)logger.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#define SYSLOG_NAMES
-#include <syslog.h>
-
-int decode(char *, CODE *);
-int pencode(char *);
-static void logmessage(int, const char *, const char *, const char *);
-static void usage(void);
-
-struct socks {
- int sock;
- int addrlen;
- struct sockaddr_storage addr;
-};
-
-#ifdef INET6
-int family = PF_UNSPEC; /* protocol family (IPv4, IPv6 or both) */
-#else
-int family = PF_INET; /* protocol family (IPv4 only) */
-#endif
-int send_to_all = 0; /* send message to all IPv4/IPv6 addresses */
-
-/*
- * logger -- read and log utility
- *
- * Reads from an input and arranges to write the result on the system
- * log.
- */
-int
-main(int argc, char *argv[])
-{
- int ch, logflags, pri;
- char *tag, *host, buf[1024];
- const char *svcname;
-
- tag = NULL;
- host = NULL;
- svcname = "syslog";
- pri = LOG_USER | LOG_NOTICE;
- logflags = 0;
- unsetenv("TZ");
- while ((ch = getopt(argc, argv, "46Af:h:iP:p:st:")) != -1)
- switch((char)ch) {
- case '4':
- family = PF_INET;
- break;
-#ifdef INET6
- case '6':
- family = PF_INET6;
- break;
-#endif
- case 'A':
- send_to_all++;
- break;
- case 'f': /* file to log */
- if (freopen(optarg, "r", stdin) == NULL)
- err(1, "%s", optarg);
- break;
- case 'h': /* hostname to deliver to */
- host = optarg;
- break;
- case 'i': /* log process id also */
- logflags |= LOG_PID;
- break;
- case 'P': /* service name or port number */
- svcname = optarg;
- break;
- case 'p': /* priority */
- pri = pencode(optarg);
- break;
- case 's': /* log to standard error */
- logflags |= LOG_PERROR;
- break;
- case 't': /* tag */
- tag = optarg;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- /* setup for logging */
- openlog(tag ? tag : getlogin(), logflags, 0);
- (void) fclose(stdout);
-
- /* log input line if appropriate */
- if (argc > 0) {
- char *p, *endp;
- size_t len;
-
- for (p = buf, endp = buf + sizeof(buf) - 2; *argv;) {
- len = strlen(*argv);
- if (p + len > endp && p > buf) {
- logmessage(pri, host, svcname, buf);
- p = buf;
- }
- if (len > sizeof(buf) - 1)
- logmessage(pri, host, svcname, *argv++);
- else {
- if (p != buf)
- *p++ = ' ';
- bcopy(*argv++, p, len);
- *(p += len) = '\0';
- }
- }
- if (p != buf)
- logmessage(pri, host, svcname, buf);
- } else
- while (fgets(buf, sizeof(buf), stdin) != NULL)
- logmessage(pri, host, svcname, buf);
- exit(0);
-}
-
-/*
- * Send the message to syslog, either on the local host, or on a remote host
- */
-void
-logmessage(int pri, const char *host, const char *svcname, const char *buf)
-{
- static struct socks *socks;
- static int nsock = 0;
- struct addrinfo hints, *res, *r;
- char *line;
- int maxs, len, sock, error, i, lsent;
-
- if (host == NULL) {
- syslog(pri, "%s", buf);
- return;
- }
-
- if (nsock <= 0) { /* set up socket stuff */
- /* resolve hostname */
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = family;
- hints.ai_socktype = SOCK_DGRAM;
- error = getaddrinfo(host, svcname, &hints, &res);
- if (error == EAI_SERVICE) {
- warnx("%s/udp: unknown service", svcname);
- error = getaddrinfo(host, "514", &hints, &res);
- }
- if (error)
- errx(1, "%s: %s", gai_strerror(error), host);
- /* count max number of sockets we may open */
- for (maxs = 0, r = res; r; r = r->ai_next, maxs++);
- socks = malloc(maxs * sizeof(struct socks));
- if (!socks)
- errx(1, "couldn't allocate memory for sockets");
- for (r = res; r; r = r->ai_next) {
- sock = socket(r->ai_family, r->ai_socktype,
- r->ai_protocol);
- if (sock < 0)
- continue;
- memcpy(&socks[nsock].addr, r->ai_addr, r->ai_addrlen);
- socks[nsock].addrlen = r->ai_addrlen;
- socks[nsock++].sock = sock;
- }
- freeaddrinfo(res);
- if (nsock <= 0)
- errx(1, "socket");
- }
-
- if ((len = asprintf(&line, "<%d>%s", pri, buf)) == -1)
- errx(1, "asprintf");
-
- lsent = -1;
- for (i = 0; i < nsock; ++i) {
- lsent = sendto(socks[i].sock, line, len, 0,
- (struct sockaddr *)&socks[i].addr,
- socks[i].addrlen);
- if (lsent == len && !send_to_all)
- break;
- }
- if (lsent != len) {
- if (lsent == -1)
- warn ("sendto");
- else
- warnx ("sendto: short send - %d bytes", lsent);
- }
-
- free(line);
-}
-
-/*
- * Decode a symbolic name to a numeric value
- */
-int
-pencode(char *s)
-{
- char *save;
- int fac, lev;
-
- for (save = s; *s && *s != '.'; ++s);
- if (*s) {
- *s = '\0';
- fac = decode(save, facilitynames);
- if (fac < 0)
- errx(1, "unknown facility name: %s", save);
- *s++ = '.';
- }
- else {
- fac = 0;
- s = save;
- }
- lev = decode(s, prioritynames);
- if (lev < 0)
- errx(1, "unknown priority name: %s", save);
- return ((lev & LOG_PRIMASK) | (fac & LOG_FACMASK));
-}
-
-int
-decode(char *name, CODE *codetab)
-{
- CODE *c;
-
- if (isdigit(*name))
- return (atoi(name));
-
- for (c = codetab; c->c_name; c++)
- if (!strcasecmp(name, c->c_name))
- return (c->c_val);
-
- return (-1);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "usage: %s\n",
- "logger [-46Ais] [-f file] [-h host] [-P port] [-p pri] [-t tag]\n"
- " [message ...]"
- );
- exit(1);
-}
diff --git a/usr.bin/login/Makefile b/usr.bin/login/Makefile
deleted file mode 100644
index 22c73b9..0000000
--- a/usr.bin/login/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 7/19/93
-# $FreeBSD$
-
-.include <bsd.own.mk>
-
-PROG= login
-SRCS= login.c login_fbtab.c
-CFLAGS+=-DLOGALL
-DPADD= ${LIBUTIL} ${LIBPAM}
-LDADD= -lutil ${MINUSLPAM}
-
-.if ${MK_AUDIT} != "no"
-SRCS+= login_audit.c
-CFLAGS+= -DUSE_BSM_AUDIT
-DPADD+= ${LIBBSM}
-LDADD+= -lbsm
-.endif
-
-.if ${MK_SETUID_LOGIN} != "no"
-BINOWN= root
-BINMODE=4555
-PRECIOUSPROG=
-.endif
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/login/README b/usr.bin/login/README
deleted file mode 100644
index 192534d..0000000
--- a/usr.bin/login/README
+++ /dev/null
@@ -1,12 +0,0 @@
-This login has additional functionalities. They are all based on (part of)
-Wietse Venema's logdaemon package.
-
-
-The following defines can be used:
-
-- LOGALL to log all logins
-
-
--Guido
-
-$FreeBSD$
diff --git a/usr.bin/login/login.1 b/usr.bin/login/login.1
deleted file mode 100644
index 68bf840..0000000
--- a/usr.bin/login/login.1
+++ /dev/null
@@ -1,170 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)login.1 8.2 (Berkeley) 5/5/94
-.\" $FreeBSD$
-.\"
-.Dd September 13, 2006
-.Dt LOGIN 1
-.Os
-.Sh NAME
-.Nm login
-.Nd log into the computer
-.Sh SYNOPSIS
-.Nm
-.Op Fl fp
-.Op Fl h Ar hostname
-.Op Ar user
-.Sh DESCRIPTION
-The
-.Nm
-utility logs users (and pseudo-users) into the computer system.
-.Pp
-If no user is specified, or if a user is specified and authentication
-of the user fails,
-.Nm
-prompts for a user name.
-Authentication of users is configurable via
-.Xr pam 8 .
-Password authentication is the default.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl f
-When a user name is specified, this option indicates that proper
-authentication has already been done and that no password need be
-requested.
-This option may only be used by the super-user or when an already
-logged in user is logging in as themselves.
-.It Fl h
-Specify the host from which the connection was received.
-It is used by various daemons such as
-.Xr telnetd 8 .
-This option may only be used by the super-user.
-.It Fl p
-By default,
-.Nm
-discards any previous environment.
-The
-.Fl p
-option disables this behavior.
-.El
-.Pp
-Login access can be controlled via
-.Xr login.access 5
-or the login class in
-.Xr login.conf 5 ,
-which provides
-allow and deny records based on time, tty and remote host name.
-.Pp
-If the file
-.Pa /etc/fbtab
-exists,
-.Nm
-changes the protection and ownership of certain devices specified in this
-file.
-.Pp
-Immediately after logging a user in,
-.Nm
-displays the system copyright notice, the date and time the user last
-logged in, the message of the day as well as other information.
-If the file
-.Pa .hushlogin
-exists in the user's home directory, all of these messages are suppressed.
-This is to simplify logins for non-human users, such as
-.Xr uucp 1 .
-.Pp
-The
-.Nm
-utility enters information into the environment (see
-.Xr environ 7 )
-specifying the user's home directory (HOME), command interpreter (SHELL),
-search path (PATH), terminal type (TERM) and user name (both LOGNAME and
-USER).
-Other environment variables may be set due to entries in the login
-class capabilities database, for the login class assigned in the
-user's system passwd record.
-The login class also controls the maximum and current process resource
-limits granted to a login, process priorities and many other aspects of
-a user's login environment.
-.Pp
-Some shells may provide a builtin
-.Nm
-command which is similar or identical to this utility.
-Consult the
-.Xr builtin 1
-manual page.
-.Pp
-The
-.Nm
-utility will submit an audit record when login succeeds or fails.
-Failure to determine the current auditing state will
-result in an error exit from
-.Nm .
-.Sh FILES
-.Bl -tag -width ".Pa /etc/security/audit_control" -compact
-.It Pa /etc/fbtab
-changes device protections
-.It Pa /etc/login.conf
-login class capabilities database
-.It Pa /etc/motd
-message-of-the-day
-.It Pa /var/mail/user
-system mailboxes
-.It Pa \&.hushlogin
-makes login quieter
-.It Pa /etc/auth.conf
-configure authentication services
-.It Pa /etc/pam.d/login
-.Xr pam 8
-configuration file
-.It Pa /etc/security/audit_user
-user flags for auditing
-.It Pa /etc/security/audit_control
-global flags for auditing
-.El
-.Sh SEE ALSO
-.Xr builtin 1 ,
-.Xr chpass 1 ,
-.Xr csh 1 ,
-.Xr newgrp 1 ,
-.Xr passwd 1 ,
-.Xr rlogin 1 ,
-.Xr getpass 3 ,
-.Xr fbtab 5 ,
-.Xr login.access 5 ,
-.Xr login.conf 5 ,
-.Xr environ 7
-.Sh HISTORY
-A
-.Nm
-utility appeared in
-.At v6 .
diff --git a/usr.bin/login/login.c b/usr.bin/login/login.c
deleted file mode 100644
index 549e015..0000000
--- a/usr.bin/login/login.c
+++ /dev/null
@@ -1,979 +0,0 @@
-/*-
- * Copyright (c) 1980, 1987, 1988, 1991, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 2002 Networks Associates Technologies, Inc.
- * All rights reserved.
- *
- * Portions of this software were developed for the FreeBSD Project by
- * ThinkSec AS and NAI Labs, the Security Research Division of Network
- * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
- * ("CBOSS"), as part of the DARPA CHATS research program.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)login.c 8.4 (Berkeley) 4/2/94";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * login [ name ]
- * login -h hostname (for telnetd, etc.)
- * login -f name (for pre-authenticated login: datakit, xterm, etc.)
- */
-
-#include <sys/copyright.h>
-#include <sys/param.h>
-#include <sys/file.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/wait.h>
-
-#include <err.h>
-#include <errno.h>
-#include <grp.h>
-#include <libutil.h>
-#include <login_cap.h>
-#include <pwd.h>
-#include <setjmp.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-#include <ttyent.h>
-#include <unistd.h>
-
-#include <security/pam_appl.h>
-#include <security/openpam.h>
-
-#include "login.h"
-#include "pathnames.h"
-
-static int auth_pam(void);
-static void bail(int, int);
-static int export(const char *);
-static void export_pam_environment(void);
-static int motd(const char *);
-static void badlogin(char *);
-static char *getloginname(void);
-static void pam_syslog(const char *);
-static void pam_cleanup(void);
-static void refused(const char *, const char *, int);
-static const char *stypeof(char *);
-static void sigint(int);
-static void timedout(int);
-static void usage(void);
-
-#define TTYGRPNAME "tty" /* group to own ttys */
-#define DEFAULT_BACKOFF 3
-#define DEFAULT_RETRIES 10
-#define DEFAULT_PROMPT "login: "
-#define DEFAULT_PASSWD_PROMPT "Password:"
-#define TERM_UNKNOWN "su"
-#define DEFAULT_WARN (2L * 7L * 86400L) /* Two weeks */
-#define NO_SLEEP_EXIT 0
-#define SLEEP_EXIT 5
-
-/*
- * This bounds the time given to login. Not a define so it can
- * be patched on machines where it's too small.
- */
-static u_int timeout = 300;
-
-/* Buffer for signal handling of timeout */
-static jmp_buf timeout_buf;
-
-struct passwd *pwd;
-static int failures;
-
-static char *envinit[1]; /* empty environment list */
-
-/*
- * Command line flags and arguments
- */
-static int fflag; /* -f: do not perform authentication */
-static int hflag; /* -h: login from remote host */
-static char *hostname; /* hostname from command line */
-static int pflag; /* -p: preserve environment */
-
-/*
- * User name
- */
-static char *username; /* user name */
-static char *olduser; /* previous user name */
-
-/*
- * Prompts
- */
-static char default_prompt[] = DEFAULT_PROMPT;
-static const char *prompt;
-static char default_passwd_prompt[] = DEFAULT_PASSWD_PROMPT;
-static const char *passwd_prompt;
-
-static char *tty;
-
-/*
- * PAM data
- */
-static pam_handle_t *pamh = NULL;
-static struct pam_conv pamc = { openpam_ttyconv, NULL };
-static int pam_err;
-static int pam_silent = PAM_SILENT;
-static int pam_cred_established;
-static int pam_session_established;
-
-int
-main(int argc, char *argv[])
-{
- struct group *gr;
- struct stat st;
- int retries, backoff;
- int ask, ch, cnt, quietlog, rootlogin, rval;
- uid_t uid, euid;
- gid_t egid;
- char *term;
- char *p, *ttyn;
- char tname[sizeof(_PATH_TTY) + 10];
- char *arg0;
- const char *tp;
- const char *shell = NULL;
- login_cap_t *lc = NULL;
- login_cap_t *lc_user = NULL;
- pid_t pid;
-#ifdef USE_BSM_AUDIT
- char auditsuccess = 1;
-#endif
-
- (void)signal(SIGQUIT, SIG_IGN);
- (void)signal(SIGINT, SIG_IGN);
- (void)signal(SIGHUP, SIG_IGN);
- if (setjmp(timeout_buf)) {
- if (failures)
- badlogin(username);
- (void)fprintf(stderr, "Login timed out after %d seconds\n",
- timeout);
- bail(NO_SLEEP_EXIT, 0);
- }
- (void)signal(SIGALRM, timedout);
- (void)alarm(timeout);
- (void)setpriority(PRIO_PROCESS, 0, 0);
-
- openlog("login", LOG_ODELAY, LOG_AUTH);
-
- uid = getuid();
- euid = geteuid();
- egid = getegid();
-
- while ((ch = getopt(argc, argv, "fh:p")) != -1)
- switch (ch) {
- case 'f':
- fflag = 1;
- break;
- case 'h':
- if (uid != 0)
- errx(1, "-h option: %s", strerror(EPERM));
- if (strlen(optarg) >= MAXHOSTNAMELEN)
- errx(1, "-h option: %s: exceeds maximum "
- "hostname size", optarg);
- hflag = 1;
- hostname = optarg;
- break;
- case 'p':
- pflag = 1;
- break;
- case '?':
- default:
- if (uid == 0)
- syslog(LOG_ERR, "invalid flag %c", ch);
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (argc > 0) {
- username = strdup(*argv);
- if (username == NULL)
- err(1, "strdup()");
- ask = 0;
- } else {
- ask = 1;
- }
-
- setproctitle("-%s", getprogname());
-
- for (cnt = getdtablesize(); cnt > 2; cnt--)
- (void)close(cnt);
-
- /*
- * Get current TTY
- */
- ttyn = ttyname(STDIN_FILENO);
- if (ttyn == NULL || *ttyn == '\0') {
- (void)snprintf(tname, sizeof(tname), "%s??", _PATH_TTY);
- ttyn = tname;
- }
- if ((tty = strrchr(ttyn, '/')) != NULL)
- ++tty;
- else
- tty = ttyn;
-
- /*
- * Get "login-retries" & "login-backoff" from default class
- */
- lc = login_getclass(NULL);
- prompt = login_getcapstr(lc, "login_prompt",
- default_prompt, default_prompt);
- passwd_prompt = login_getcapstr(lc, "passwd_prompt",
- default_passwd_prompt, default_passwd_prompt);
- retries = login_getcapnum(lc, "login-retries",
- DEFAULT_RETRIES, DEFAULT_RETRIES);
- backoff = login_getcapnum(lc, "login-backoff",
- DEFAULT_BACKOFF, DEFAULT_BACKOFF);
- login_close(lc);
- lc = NULL;
-
- /*
- * Try to authenticate the user until we succeed or time out.
- */
- for (cnt = 0;; ask = 1) {
- if (ask) {
- fflag = 0;
- if (olduser != NULL)
- free(olduser);
- olduser = username;
- username = getloginname();
- }
- rootlogin = 0;
-
- /*
- * Note if trying multiple user names; log failures for
- * previous user name, but don't bother logging one failure
- * for nonexistent name (mistyped username).
- */
- if (failures && strcmp(olduser, username) != 0) {
- if (failures > (pwd ? 0 : 1))
- badlogin(olduser);
- }
-
- /*
- * Load the PAM policy and set some variables
- */
- pam_err = pam_start("login", username, &pamc, &pamh);
- if (pam_err != PAM_SUCCESS) {
- pam_syslog("pam_start()");
-#ifdef USE_BSM_AUDIT
- au_login_fail("PAM Error", 1);
-#endif
- bail(NO_SLEEP_EXIT, 1);
- }
- pam_err = pam_set_item(pamh, PAM_TTY, tty);
- if (pam_err != PAM_SUCCESS) {
- pam_syslog("pam_set_item(PAM_TTY)");
-#ifdef USE_BSM_AUDIT
- au_login_fail("PAM Error", 1);
-#endif
- bail(NO_SLEEP_EXIT, 1);
- }
- pam_err = pam_set_item(pamh, PAM_RHOST, hostname);
- if (pam_err != PAM_SUCCESS) {
- pam_syslog("pam_set_item(PAM_RHOST)");
-#ifdef USE_BSM_AUDIT
- au_login_fail("PAM Error", 1);
-#endif
- bail(NO_SLEEP_EXIT, 1);
- }
-
- pwd = getpwnam(username);
- if (pwd != NULL && pwd->pw_uid == 0)
- rootlogin = 1;
-
- /*
- * If the -f option was specified and the caller is
- * root or the caller isn't changing their uid, don't
- * authenticate.
- */
- if (pwd != NULL && fflag &&
- (uid == (uid_t)0 || uid == (uid_t)pwd->pw_uid)) {
- /* already authenticated */
- rval = 0;
-#ifdef USE_BSM_AUDIT
- auditsuccess = 0; /* opened a terminal window only */
-#endif
- } else {
- fflag = 0;
- (void)setpriority(PRIO_PROCESS, 0, -4);
- rval = auth_pam();
- (void)setpriority(PRIO_PROCESS, 0, 0);
- }
-
- if (pwd && rval == 0)
- break;
-
- pam_cleanup();
-
- /*
- * We are not exiting here, but this corresponds to a failed
- * login event, so set exitstatus to 1.
- */
-#ifdef USE_BSM_AUDIT
- au_login_fail("Login incorrect", 1);
-#endif
-
- (void)printf("Login incorrect\n");
- failures++;
-
- pwd = NULL;
-
- /*
- * Allow up to 'retry' (10) attempts, but start
- * backing off after 'backoff' (3) attempts.
- */
- if (++cnt > backoff) {
- if (cnt >= retries) {
- badlogin(username);
- bail(SLEEP_EXIT, 1);
- }
- sleep((u_int)((cnt - backoff) * 5));
- }
- }
-
- /* committed to login -- turn off timeout */
- (void)alarm((u_int)0);
- (void)signal(SIGHUP, SIG_DFL);
-
- endpwent();
-
-#ifdef USE_BSM_AUDIT
- /* Audit successful login. */
- if (auditsuccess)
- au_login_success();
-#endif
-
- /*
- * Establish the login class.
- */
- lc = login_getpwclass(pwd);
- lc_user = login_getuserclass(pwd);
-
- if (!(quietlog = login_getcapbool(lc_user, "hushlogin", 0)))
- quietlog = login_getcapbool(lc, "hushlogin", 0);
-
- /*
- * Switching needed for NFS with root access disabled.
- *
- * XXX: This change fails to modify the additional groups for the
- * process, and as such, may restrict rights normally granted
- * through those groups.
- */
- (void)setegid(pwd->pw_gid);
- (void)seteuid(rootlogin ? 0 : pwd->pw_uid);
- if (!*pwd->pw_dir || chdir(pwd->pw_dir) < 0) {
- if (login_getcapbool(lc, "requirehome", 0))
- refused("Home directory not available", "HOMEDIR", 1);
- if (chdir("/") < 0)
- refused("Cannot find root directory", "ROOTDIR", 1);
- if (!quietlog || *pwd->pw_dir)
- printf("No home directory.\nLogging in with home = \"/\".\n");
- pwd->pw_dir = strdup("/");
- if (pwd->pw_dir == NULL) {
- syslog(LOG_NOTICE, "strdup(): %m");
- bail(SLEEP_EXIT, 1);
- }
- }
- (void)seteuid(euid);
- (void)setegid(egid);
- if (!quietlog) {
- quietlog = access(_PATH_HUSHLOGIN, F_OK) == 0;
- if (!quietlog)
- pam_silent = 0;
- }
-
- shell = login_getcapstr(lc, "shell", pwd->pw_shell, pwd->pw_shell);
- if (*pwd->pw_shell == '\0')
- pwd->pw_shell = strdup(_PATH_BSHELL);
- if (pwd->pw_shell == NULL) {
- syslog(LOG_NOTICE, "strdup(): %m");
- bail(SLEEP_EXIT, 1);
- }
- if (*shell == '\0') /* Not overridden */
- shell = pwd->pw_shell;
- if ((shell = strdup(shell)) == NULL) {
- syslog(LOG_NOTICE, "strdup(): %m");
- bail(SLEEP_EXIT, 1);
- }
-
- /*
- * Set device protections, depending on what terminal the
- * user is logged in. This feature is used on Suns to give
- * console users better privacy.
- */
- login_fbtab(tty, pwd->pw_uid, pwd->pw_gid);
-
- /*
- * Clear flags of the tty. None should be set, and when the
- * user sets them otherwise, this can cause the chown to fail.
- * Since it isn't clear that flags are useful on character
- * devices, we just clear them.
- *
- * We don't log in the case of EOPNOTSUPP because dev might be
- * on NFS, which doesn't support chflags.
- *
- * We don't log in the EROFS because that means that /dev is on
- * a read only file system and we assume that the permissions there
- * are sane.
- */
- if (ttyn != tname && chflags(ttyn, 0))
- if (errno != EOPNOTSUPP && errno != EROFS)
- syslog(LOG_ERR, "chflags(%s): %m", ttyn);
- if (ttyn != tname && chown(ttyn, pwd->pw_uid,
- (gr = getgrnam(TTYGRPNAME)) ? gr->gr_gid : pwd->pw_gid))
- if (errno != EROFS)
- syslog(LOG_ERR, "chown(%s): %m", ttyn);
-
- /*
- * Exclude cons/vt/ptys only, assume dialup otherwise
- * TODO: Make dialup tty determination a library call
- * for consistency (finger etc.)
- */
- if (hflag && isdialuptty(tty))
- syslog(LOG_INFO, "DIALUP %s, %s", tty, pwd->pw_name);
-
-#ifdef LOGALL
- /*
- * Syslog each successful login, so we don't have to watch
- * hundreds of wtmp or lastlogin files.
- */
- if (hflag)
- syslog(LOG_INFO, "login from %s on %s as %s",
- hostname, tty, pwd->pw_name);
- else
- syslog(LOG_INFO, "login on %s as %s",
- tty, pwd->pw_name);
-#endif
-
- /*
- * If fflag is on, assume caller/authenticator has logged root
- * login.
- */
- if (rootlogin && fflag == 0) {
- if (hflag)
- syslog(LOG_NOTICE, "ROOT LOGIN (%s) ON %s FROM %s",
- username, tty, hostname);
- else
- syslog(LOG_NOTICE, "ROOT LOGIN (%s) ON %s",
- username, tty);
- }
-
- /*
- * Destroy environment unless user has requested its
- * preservation - but preserve TERM in all cases
- */
- term = getenv("TERM");
- if (!pflag)
- environ = envinit;
- if (term != NULL)
- setenv("TERM", term, 0);
-
- /*
- * PAM modules might add supplementary groups during pam_setcred().
- */
- if (setusercontext(lc, pwd, pwd->pw_uid, LOGIN_SETGROUP) != 0) {
- syslog(LOG_ERR, "setusercontext() failed - exiting");
- bail(NO_SLEEP_EXIT, 1);
- }
-
- pam_err = pam_setcred(pamh, pam_silent|PAM_ESTABLISH_CRED);
- if (pam_err != PAM_SUCCESS) {
- pam_syslog("pam_setcred()");
- bail(NO_SLEEP_EXIT, 1);
- }
- pam_cred_established = 1;
-
- pam_err = pam_open_session(pamh, pam_silent);
- if (pam_err != PAM_SUCCESS) {
- pam_syslog("pam_open_session()");
- bail(NO_SLEEP_EXIT, 1);
- }
- pam_session_established = 1;
-
- /*
- * We must fork() before setuid() because we need to call
- * pam_close_session() as root.
- */
- pid = fork();
- if (pid < 0) {
- err(1, "fork");
- } else if (pid != 0) {
- /*
- * Parent: wait for child to finish, then clean up
- * session.
- */
- int status;
- setproctitle("-%s [pam]", getprogname());
- waitpid(pid, &status, 0);
- bail(NO_SLEEP_EXIT, 0);
- }
-
- /*
- * NOTICE: We are now in the child process!
- */
-
- /*
- * Add any environment variables the PAM modules may have set.
- */
- export_pam_environment();
-
- /*
- * We're done with PAM now; our parent will deal with the rest.
- */
- pam_end(pamh, 0);
- pamh = NULL;
-
- /*
- * We don't need to be root anymore, so set the login name and
- * the UID.
- */
- if (setlogin(username) != 0) {
- syslog(LOG_ERR, "setlogin(%s): %m - exiting", username);
- bail(NO_SLEEP_EXIT, 1);
- }
- if (setusercontext(lc, pwd, pwd->pw_uid,
- LOGIN_SETALL & ~(LOGIN_SETLOGIN|LOGIN_SETGROUP)) != 0) {
- syslog(LOG_ERR, "setusercontext() failed - exiting");
- exit(1);
- }
-
- (void)setenv("SHELL", pwd->pw_shell, 1);
- (void)setenv("HOME", pwd->pw_dir, 1);
- /* Overwrite "term" from login.conf(5) for any known TERM */
- if (term == NULL && (tp = stypeof(tty)) != NULL)
- (void)setenv("TERM", tp, 1);
- else
- (void)setenv("TERM", TERM_UNKNOWN, 0);
- (void)setenv("LOGNAME", username, 1);
- (void)setenv("USER", username, 1);
- (void)setenv("PATH", rootlogin ? _PATH_STDPATH : _PATH_DEFPATH, 0);
-
- if (!quietlog) {
- const char *cw;
-
- cw = login_getcapstr(lc, "copyright", NULL, NULL);
- if (cw == NULL || motd(cw) == -1)
- (void)printf("%s", copyright);
-
- (void)printf("\n");
-
- cw = login_getcapstr(lc, "welcome", NULL, NULL);
- if (cw != NULL && access(cw, F_OK) == 0)
- motd(cw);
- else
- motd(_PATH_MOTDFILE);
-
- if (login_getcapbool(lc_user, "nocheckmail", 0) == 0 &&
- login_getcapbool(lc, "nocheckmail", 0) == 0) {
- char *cx;
-
- /* $MAIL may have been set by class. */
- cx = getenv("MAIL");
- if (cx == NULL) {
- asprintf(&cx, "%s/%s",
- _PATH_MAILDIR, pwd->pw_name);
- }
- if (cx && stat(cx, &st) == 0 && st.st_size != 0)
- (void)printf("You have %smail.\n",
- (st.st_mtime > st.st_atime) ? "new " : "");
- if (getenv("MAIL") == NULL)
- free(cx);
- }
- }
-
- login_close(lc_user);
- login_close(lc);
-
- (void)signal(SIGALRM, SIG_DFL);
- (void)signal(SIGQUIT, SIG_DFL);
- (void)signal(SIGINT, SIG_DFL);
- (void)signal(SIGTSTP, SIG_IGN);
-
- /*
- * Login shells have a leading '-' in front of argv[0]
- */
- p = strrchr(pwd->pw_shell, '/');
- if (asprintf(&arg0, "-%s", p ? p + 1 : pwd->pw_shell) >= MAXPATHLEN) {
- syslog(LOG_ERR, "user: %s: shell exceeds maximum pathname size",
- username);
- errx(1, "shell exceeds maximum pathname size");
- } else if (arg0 == NULL) {
- err(1, "asprintf()");
- }
-
- execlp(shell, arg0, (char *)0);
- err(1, "%s", shell);
-
- /*
- * That's it, folks!
- */
-}
-
-/*
- * Attempt to authenticate the user using PAM. Returns 0 if the user is
- * authenticated, or 1 if not authenticated. If some sort of PAM system
- * error occurs (e.g., the "/etc/pam.conf" file is missing) then this
- * function returns -1. This can be used as an indication that we should
- * fall back to a different authentication mechanism.
- */
-static int
-auth_pam(void)
-{
- const char *tmpl_user;
- const void *item;
- int rval;
-
- pam_err = pam_authenticate(pamh, pam_silent);
- switch (pam_err) {
-
- case PAM_SUCCESS:
- /*
- * With PAM we support the concept of a "template"
- * user. The user enters a login name which is
- * authenticated by PAM, usually via a remote service
- * such as RADIUS or TACACS+. If authentication
- * succeeds, a different but related "template" name
- * is used for setting the credentials, shell, and
- * home directory. The name the user enters need only
- * exist on the remote authentication server, but the
- * template name must be present in the local password
- * database.
- *
- * This is supported by two various mechanisms in the
- * individual modules. However, from the application's
- * point of view, the template user is always passed
- * back as a changed value of the PAM_USER item.
- */
- pam_err = pam_get_item(pamh, PAM_USER, &item);
- if (pam_err == PAM_SUCCESS) {
- tmpl_user = (const char *)item;
- if (strcmp(username, tmpl_user) != 0)
- pwd = getpwnam(tmpl_user);
- } else {
- pam_syslog("pam_get_item(PAM_USER)");
- }
- rval = 0;
- break;
-
- case PAM_AUTH_ERR:
- case PAM_USER_UNKNOWN:
- case PAM_MAXTRIES:
- rval = 1;
- break;
-
- default:
- pam_syslog("pam_authenticate()");
- rval = -1;
- break;
- }
-
- if (rval == 0) {
- pam_err = pam_acct_mgmt(pamh, pam_silent);
- switch (pam_err) {
- case PAM_SUCCESS:
- break;
- case PAM_NEW_AUTHTOK_REQD:
- pam_err = pam_chauthtok(pamh,
- pam_silent|PAM_CHANGE_EXPIRED_AUTHTOK);
- if (pam_err != PAM_SUCCESS) {
- pam_syslog("pam_chauthtok()");
- rval = 1;
- }
- break;
- default:
- pam_syslog("pam_acct_mgmt()");
- rval = 1;
- break;
- }
- }
-
- if (rval != 0) {
- pam_end(pamh, pam_err);
- pamh = NULL;
- }
- return (rval);
-}
-
-/*
- * Export any environment variables PAM modules may have set
- */
-static void
-export_pam_environment()
-{
- char **pam_env;
- char **pp;
-
- pam_env = pam_getenvlist(pamh);
- if (pam_env != NULL) {
- for (pp = pam_env; *pp != NULL; pp++) {
- (void)export(*pp);
- free(*pp);
- }
- }
-}
-
-/*
- * Perform sanity checks on an environment variable:
- * - Make sure there is an '=' in the string.
- * - Make sure the string doesn't run on too long.
- * - Do not export certain variables. This list was taken from the
- * Solaris pam_putenv(3) man page.
- * Then export it.
- */
-static int
-export(const char *s)
-{
- static const char *noexport[] = {
- "SHELL", "HOME", "LOGNAME", "MAIL", "CDPATH",
- "IFS", "PATH", NULL
- };
- char *p;
- const char **pp;
- size_t n;
-
- if (strlen(s) > 1024 || (p = strchr(s, '=')) == NULL)
- return (0);
- if (strncmp(s, "LD_", 3) == 0)
- return (0);
- for (pp = noexport; *pp != NULL; pp++) {
- n = strlen(*pp);
- if (s[n] == '=' && strncmp(s, *pp, n) == 0)
- return (0);
- }
- *p = '\0';
- (void)setenv(s, p + 1, 1);
- *p = '=';
- return (1);
-}
-
-static void
-usage()
-{
-
- (void)fprintf(stderr, "usage: login [-fp] [-h hostname] [username]\n");
- exit(1);
-}
-
-/*
- * Prompt user and read login name from stdin.
- */
-static char *
-getloginname()
-{
- char *nbuf, *p;
- int ch;
-
- nbuf = malloc(MAXLOGNAME);
- if (nbuf == NULL)
- err(1, "malloc()");
- do {
- (void)printf("%s", prompt);
- for (p = nbuf; (ch = getchar()) != '\n'; ) {
- if (ch == EOF) {
- badlogin(username);
- bail(NO_SLEEP_EXIT, 0);
- }
- if (p < nbuf + MAXLOGNAME - 1)
- *p++ = ch;
- }
- } while (p == nbuf);
-
- *p = '\0';
- if (nbuf[0] == '-') {
- pam_silent = 0;
- memmove(nbuf, nbuf + 1, strlen(nbuf));
- } else {
- pam_silent = PAM_SILENT;
- }
- return nbuf;
-}
-
-/*
- * SIGINT handler for motd().
- */
-static volatile int motdinterrupt;
-static void
-sigint(int signo __unused)
-{
- motdinterrupt = 1;
-}
-
-/*
- * Display the contents of a file (such as /etc/motd).
- */
-static int
-motd(const char *motdfile)
-{
- sig_t oldint;
- FILE *f;
- int ch;
-
- if ((f = fopen(motdfile, "r")) == NULL)
- return (-1);
- motdinterrupt = 0;
- oldint = signal(SIGINT, sigint);
- while ((ch = fgetc(f)) != EOF && !motdinterrupt)
- putchar(ch);
- signal(SIGINT, oldint);
- if (ch != EOF || ferror(f)) {
- fclose(f);
- return (-1);
- }
- fclose(f);
- return (0);
-}
-
-/*
- * SIGALRM handler, to enforce login prompt timeout.
- *
- * XXX This can potentially confuse the hell out of PAM. We should
- * XXX instead implement a conversation function that returns
- * XXX PAM_CONV_ERR when interrupted by a signal, and have the signal
- * XXX handler just set a flag.
- */
-static void
-timedout(int signo __unused)
-{
-
- longjmp(timeout_buf, signo);
-}
-
-static void
-badlogin(char *name)
-{
-
- if (failures == 0)
- return;
- if (hflag) {
- syslog(LOG_NOTICE, "%d LOGIN FAILURE%s FROM %s",
- failures, failures > 1 ? "S" : "", hostname);
- syslog(LOG_AUTHPRIV|LOG_NOTICE,
- "%d LOGIN FAILURE%s FROM %s, %s",
- failures, failures > 1 ? "S" : "", hostname, name);
- } else {
- syslog(LOG_NOTICE, "%d LOGIN FAILURE%s ON %s",
- failures, failures > 1 ? "S" : "", tty);
- syslog(LOG_AUTHPRIV|LOG_NOTICE,
- "%d LOGIN FAILURE%s ON %s, %s",
- failures, failures > 1 ? "S" : "", tty, name);
- }
- failures = 0;
-}
-
-const char *
-stypeof(char *ttyid)
-{
- struct ttyent *t;
-
- if (ttyid != NULL && *ttyid != '\0') {
- t = getttynam(ttyid);
- if (t != NULL && t->ty_type != NULL)
- return (t->ty_type);
- }
- return (NULL);
-}
-
-static void
-refused(const char *msg, const char *rtype, int lout)
-{
-
- if (msg != NULL)
- printf("%s.\n", msg);
- if (hflag)
- syslog(LOG_NOTICE, "LOGIN %s REFUSED (%s) FROM %s ON TTY %s",
- pwd->pw_name, rtype, hostname, tty);
- else
- syslog(LOG_NOTICE, "LOGIN %s REFUSED (%s) ON TTY %s",
- pwd->pw_name, rtype, tty);
- if (lout)
- bail(SLEEP_EXIT, 1);
-}
-
-/*
- * Log a PAM error
- */
-static void
-pam_syslog(const char *msg)
-{
- syslog(LOG_ERR, "%s: %s", msg, pam_strerror(pamh, pam_err));
-}
-
-/*
- * Shut down PAM
- */
-static void
-pam_cleanup()
-{
-
- if (pamh != NULL) {
- if (pam_session_established) {
- pam_err = pam_close_session(pamh, 0);
- if (pam_err != PAM_SUCCESS)
- pam_syslog("pam_close_session()");
- }
- pam_session_established = 0;
- if (pam_cred_established) {
- pam_err = pam_setcred(pamh, pam_silent|PAM_DELETE_CRED);
- if (pam_err != PAM_SUCCESS)
- pam_syslog("pam_setcred()");
- }
- pam_cred_established = 0;
- pam_end(pamh, pam_err);
- pamh = NULL;
- }
-}
-
-/*
- * Exit, optionally after sleeping a few seconds
- */
-void
-bail(int sec, int eval)
-{
-
- pam_cleanup();
-#ifdef USE_BSM_AUDIT
- if (pwd != NULL)
- audit_logout();
-#endif
- (void)sleep(sec);
- exit(eval);
-}
diff --git a/usr.bin/login/login.h b/usr.bin/login/login.h
deleted file mode 100644
index 48ef31b..0000000
--- a/usr.bin/login/login.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*-
- * Copyright (c) 2001 FreeBSD, Inc
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-void login_fbtab(char *, uid_t, gid_t);
-
-#ifdef USE_BSM_AUDIT
-void au_login_success(void);
-void au_login_fail(const char *errmsg, int na);
-void audit_logout(void);
-#endif
-
-extern char **environ;
-extern struct passwd *pwd;
diff --git a/usr.bin/login/login_audit.c b/usr.bin/login/login_audit.c
deleted file mode 100644
index a50a158..0000000
--- a/usr.bin/login/login_audit.c
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (c) 2005 Apple Computer, Inc.
- * All rights reserved.
- *
- * @APPLE_BSD_LICENSE_HEADER_START@
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * @APPLE_BSD_LICENSE_HEADER_END@
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <bsm/libbsm.h>
-#include <bsm/audit_uevents.h>
-
-#include <err.h>
-#include <errno.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <strings.h>
-#include <unistd.h>
-
-#include "login.h"
-
-/*
- * Audit data
- */
-static au_tid_t tid;
-
-/*
- * The following tokens are included in the audit record for a successful
- * login: header, subject, return.
- */
-void
-au_login_success(void)
-{
- token_t *tok;
- int aufd;
- au_mask_t aumask;
- auditinfo_t auinfo;
- uid_t uid = pwd->pw_uid;
- gid_t gid = pwd->pw_gid;
- pid_t pid = getpid();
- long au_cond;
-
- /* If we are not auditing, don't cut an audit record; just return. */
- if (auditon(A_GETCOND, &au_cond, sizeof(long)) < 0) {
- if (errno == ENOSYS)
- return;
- errx(1, "login: Could not determine audit condition");
- }
- if (au_cond == AUC_NOAUDIT)
- return;
-
- /* Compute and set the user's preselection mask. */
- if (au_user_mask(pwd->pw_name, &aumask) == -1)
- errx(1, "login: Could not set audit mask\n");
-
- /* Set the audit info for the user. */
- auinfo.ai_auid = uid;
- auinfo.ai_asid = pid;
- bcopy(&tid, &auinfo.ai_termid, sizeof(auinfo.ai_termid));
- bcopy(&aumask, &auinfo.ai_mask, sizeof(auinfo.ai_mask));
- if (setaudit(&auinfo) != 0)
- err(1, "login: setaudit failed");
-
- if ((aufd = au_open()) == -1)
- errx(1,"login: Audit Error: au_open() failed");
-
- if ((tok = au_to_subject32(uid, geteuid(), getegid(), uid, gid, pid,
- pid, &tid)) == NULL)
- errx(1, "login: Audit Error: au_to_subject32() failed");
- au_write(aufd, tok);
-
- if ((tok = au_to_return32(0, 0)) == NULL)
- errx(1, "login: Audit Error: au_to_return32() failed");
- au_write(aufd, tok);
-
- if (au_close(aufd, 1, AUE_login) == -1)
- errx(1, "login: Audit Record was not committed.");
-}
-
-/*
- * The following tokens are included in the audit record for failed
- * login attempts: header, subject, text, return.
- */
-void
-au_login_fail(const char *errmsg, int na)
-{
- token_t *tok;
- int aufd;
- long au_cond;
- uid_t uid;
- gid_t gid;
- pid_t pid = getpid();
-
- /* If we are not auditing, don't cut an audit record; just return. */
- if (auditon(A_GETCOND, &au_cond, sizeof(long)) < 0) {
- if (errno == ENOSYS)
- return;
- errx(1, "login: Could not determine audit condition");
- }
- if (au_cond == AUC_NOAUDIT)
- return;
-
- if ((aufd = au_open()) == -1)
- errx(1, "login: Audit Error: au_open() failed");
-
- if (na) {
- /*
- * Non attributable event. Assuming that login is not called
- * within a user's session => auid,asid == -1.
- */
- if ((tok = au_to_subject32(-1, geteuid(), getegid(), -1, -1,
- pid, -1, &tid)) == NULL)
- errx(1, "login: Audit Error: au_to_subject32() failed");
- } else {
- /* We know the subject -- so use its value instead. */
- uid = pwd->pw_uid;
- gid = pwd->pw_gid;
- if ((tok = au_to_subject32(uid, geteuid(), getegid(), uid,
- gid, pid, pid, &tid)) == NULL)
- errx(1, "login: Audit Error: au_to_subject32() failed");
- }
- au_write(aufd, tok);
-
- /* Include the error message. */
- if ((tok = au_to_text(errmsg)) == NULL)
- errx(1, "login: Audit Error: au_to_text() failed");
- au_write(aufd, tok);
-
- if ((tok = au_to_return32(1, errno)) == NULL)
- errx(1, "login: Audit Error: au_to_return32() failed");
- au_write(aufd, tok);
-
- if (au_close(aufd, 1, AUE_login) == -1)
- errx(1, "login: Audit Error: au_close() was not committed");
-}
-
-/*
- * The following tokens are included in the audit record for a logout:
- * header, subject, return.
- */
-void
-audit_logout(void)
-{
- token_t *tok;
- int aufd;
- uid_t uid = pwd->pw_uid;
- gid_t gid = pwd->pw_gid;
- pid_t pid = getpid();
- long au_cond;
-
- /* If we are not auditing, don't cut an audit record; just return. */
- if (auditon(A_GETCOND, &au_cond, sizeof(long)) < 0) {
- if (errno == ENOSYS)
- return;
- errx(1, "login: Could not determine audit condition");
- }
- if (au_cond == AUC_NOAUDIT)
- return;
-
- if ((aufd = au_open()) == -1)
- errx(1, "login: Audit Error: au_open() failed");
-
- /* The subject that is created (euid, egid of the current process). */
- if ((tok = au_to_subject32(uid, geteuid(), getegid(), uid, gid, pid,
- pid, &tid)) == NULL)
- errx(1, "login: Audit Error: au_to_subject32() failed");
- au_write(aufd, tok);
-
- if ((tok = au_to_return32(0, 0)) == NULL)
- errx(1, "login: Audit Error: au_to_return32() failed");
- au_write(aufd, tok);
-
- if (au_close(aufd, 1, AUE_logout) == -1)
- errx(1, "login: Audit Record was not committed.");
-}
diff --git a/usr.bin/login/login_fbtab.c b/usr.bin/login/login_fbtab.c
deleted file mode 100644
index f6111a1..0000000
--- a/usr.bin/login/login_fbtab.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/************************************************************************
-* Copyright 1995 by Wietse Venema. All rights reserved.
-*
-* This material was originally written and compiled by Wietse Venema at
-* Eindhoven University of Technology, The Netherlands, in 1990, 1991,
-* 1992, 1993, 1994 and 1995.
-*
-* Redistribution and use in source and binary forms are permitted
-* provided that this entire copyright notice is duplicated in all such
-* copies.
-*
-* This software is provided "as is" and without any expressed or implied
-* warranties, including, without limitation, the implied warranties of
-* merchantibility and fitness for any particular purpose.
-************************************************************************/
-/*
- SYNOPSIS
- void login_fbtab(tty, uid, gid)
- char *tty;
- uid_t uid;
- gid_t gid;
-
- DESCRIPTION
- This module implements device security as described in the
- SunOS 4.1.x fbtab(5) and SunOS 5.x logindevperm(4) manual
- pages. The program first looks for /etc/fbtab. If that file
- cannot be opened it attempts to process /etc/logindevperm.
- We expect entries with the folowing format:
-
- Comments start with a # and extend to the end of the line.
-
- Blank lines or lines with only a comment are ignored.
-
- All other lines consist of three fields delimited by
- whitespace: a login device (/dev/console), an octal
- permission number (0600), and a ":"-delimited list of
- devices (/dev/kbd:/dev/mouse). All device names are
- absolute paths. A path that ends in "*" refers to all
- directory entries except "." and "..".
-
- If the tty argument (relative path) matches a login device
- name (absolute path), the permissions of the devices in the
- ":"-delimited list are set as specified in the second
- field, and their ownership is changed to that of the uid
- and gid arguments.
-
- DIAGNOSTICS
- Problems are reported via the syslog daemon with severity
- LOG_ERR.
-
- BUGS
- This module uses strtok(3), which may cause conflicts with other
- uses of that same routine.
-
- AUTHOR
- Wietse Venema (wietse@wzv.win.tue.nl)
- Eindhoven University of Technology
- The Netherlands
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <glob.h>
-#include <paths.h>
-#include <stdio.h>
-#include <string.h>
-#include <syslog.h>
-#include <unistd.h>
-
-#include "login.h"
-#include "pathnames.h"
-
-static void login_protect(const char *, char *, int, uid_t, gid_t);
-
-#define WSPACE " \t\n"
-
-/* login_fbtab - apply protections specified in /etc/fbtab or logindevperm */
-
-void
-login_fbtab(tty, uid, gid)
-char *tty;
-uid_t uid;
-gid_t gid;
-{
- FILE *fp;
- char buf[BUFSIZ];
- char *devname;
- char *cp;
- int prot;
- const char *table;
-
- if ((fp = fopen(table = _PATH_FBTAB, "r")) == NULL
- && (fp = fopen(table = _PATH_LOGINDEVPERM, "r")) == NULL)
- return;
-
- while (fgets(buf, sizeof(buf), fp)) {
- if ((cp = strchr(buf, '#')))
- *cp = 0; /* strip comment */
- if ((cp = devname = strtok(buf, WSPACE)) == 0)
- continue; /* empty or comment */
- if (strncmp(devname, _PATH_DEV, sizeof _PATH_DEV - 1) != 0
- || (cp = strtok((char *) 0, WSPACE)) == 0
- || *cp != '0'
- || sscanf(cp, "%o", &prot) == 0
- || prot == 0
- || (prot & 0777) != prot
- || (cp = strtok((char *) 0, WSPACE)) == 0) {
- syslog(LOG_ERR, "%s: bad entry: %s", table, cp ? cp : "(null)");
- continue;
- }
- if (strcmp(devname + 5, tty) == 0) {
- for (cp = strtok(cp, ":"); cp; cp = strtok((char *) 0, ":")) {
- login_protect(table, cp, prot, uid, gid);
- }
- }
- }
- fclose(fp);
-}
-
-/* login_protect - protect one device entry */
-
-void
-login_protect(table, pattern, mask, uid, gid)
-const char *table;
-char *pattern;
-int mask;
-uid_t uid;
-gid_t gid;
-{
- glob_t gl;
- char *path;
- unsigned int i;
-
- if (glob(pattern, GLOB_NOSORT, NULL, &gl) != 0)
- return;
- for (i = 0; i < gl.gl_pathc; i++) {
- path = gl.gl_pathv[i];
- /* clear flags of the device */
- if (chflags(path, 0) && errno != ENOENT && errno != EOPNOTSUPP)
- syslog(LOG_ERR, "%s: chflags(%s): %m", table, path);
- if (chmod(path, mask) && errno != ENOENT)
- syslog(LOG_ERR, "%s: chmod(%s): %m", table, path);
- if (chown(path, uid, gid) && errno != ENOENT)
- syslog(LOG_ERR, "%s: chown(%s): %m", table, path);
- }
- globfree(&gl);
-}
diff --git a/usr.bin/login/pathnames.h b/usr.bin/login/pathnames.h
deleted file mode 100644
index 60fecc2..0000000
--- a/usr.bin/login/pathnames.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*-
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)pathnames.h 8.1 (Berkeley) 6/9/93
- * $FreeBSD$
- */
-
-#include <paths.h>
-
-#define _PATH_HUSHLOGIN ".hushlogin"
-#define _PATH_MOTDFILE "/etc/motd"
-#define _PATH_FBTAB "/etc/fbtab"
-#define _PATH_LOGINDEVPERM "/etc/logindevperm"
diff --git a/usr.bin/logins/Makefile b/usr.bin/logins/Makefile
deleted file mode 100644
index 42840fb..0000000
--- a/usr.bin/logins/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# $FreeBSD$
-
-PROG= logins
-WARNS?= 6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/logins/logins.1 b/usr.bin/logins/logins.1
deleted file mode 100644
index fcd12b3..0000000
--- a/usr.bin/logins/logins.1
+++ /dev/null
@@ -1,104 +0,0 @@
-.\"-
-.\" Copyright (c) 2004 Dag-Erling Coïdan Smørgrav
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. The name of the author may not be used to endorse or promote products
-.\" derived from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd March 6, 2004
-.Dt LOGINS 1
-.Os
-.Sh NAME
-.Nm logins
-.Nd display account information
-.Sh SYNOPSIS
-.Nm
-.Op Fl admopstux
-.Op Fl g Ar groups
-.Op Fl l Ar logins
-.Sh DESCRIPTION
-The
-.Nm
-utility displays information about user and system accounts.
-.Pp
-The following options are available:
-.Bl -tag -width ".Fl g Ar groups"
-.It Fl a
-Display information about the password change and account expiration
-times for each account.
-.It Fl d
-Select accounts with duplicate UIDs.
-.It Fl g Ar groups
-Select accounts that are members of the specified groups.
-If multiple group names are specified, they must be separated with
-commas.
-.It Fl l Ar logins
-Select accounts matching the specified login names.
-If multiple names are specified, they must be separated with commas.
-.It Fl m
-Show information about secondary groups.
-.It Fl o
-Display the information for each account on a single line of
-colon-separated fields.
-.It Fl p
-Select accounts with no password.
-.It Fl s
-Select system accounts.
-These are currently defined as accounts with UIDs below 1000, plus the
-.Dq Li nobody
-account (UID 65534).
-.It Fl t
-Sort selected accounts by name rather than by UID.
-.It Fl u
-Select user accounts.
-These are currently defined as accounts with UIDs above 1000, except
-the
-.Dq Li nobody
-account (UID 65534).
-.It Fl x
-Display information about each account's home directory and shell.
-.El
-.Pp
-If multiple selection options are specified, all accounts matching any
-of the selection criteria will be displayed.
-.Pp
-If no selection options are specified, all accounts will be displayed.
-.Sh SEE ALSO
-.Xr getgrent 3 ,
-.Xr getpwent 3 ,
-.Xr group 5 ,
-.Xr passwd 5 ,
-.Xr pw 8
-.Sh HISTORY
-The
-.Nm
-utility appeared in
-.Fx 4.10 .
-.Sh AUTHORS
-The
-.Nm
-utility was written by
-.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org
-based on similar utilities in other operating systems.
diff --git a/usr.bin/logins/logins.c b/usr.bin/logins/logins.c
deleted file mode 100644
index abf342e..0000000
--- a/usr.bin/logins/logins.c
+++ /dev/null
@@ -1,408 +0,0 @@
-/*-
- * Copyright (c) 2004 Dag-Erling Coïdan Smørgrav
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <grp.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-struct xpasswd {
- char *pw_name;
- char *pw_passwd;
- uid_t pw_uid;
- gid_t pw_gid;
- time_t pw_change;
- char *pw_class;
- char *pw_gecos;
- char *pw_dir;
- char *pw_shell;
- time_t pw_expire;
- int pw_selected;
-};
-
-struct xgroup {
- char *gr_name;
- char *gr_passwd;
- gid_t gr_gid;
- char *gr_mem;
-};
-
-static int everything = 1;
-static int a_flag;
-static int d_flag;
-static const char *g_args;
-static const char *l_args;
-static int m_flag;
-static int o_flag;
-static int p_flag;
-static int s_flag;
-static int t_flag;
-static int u_flag;
-static int x_flag;
-
-static int
-member(const char *elem, const char *list)
-{
- char *p;
- int len;
-
- p = strstr(list, elem);
- len = strlen(elem);
-
- return (p != NULL &&
- (p == list || p[-1] == ',') &&
- (p[len] == '\0' || p[len] == ','));
-}
-
-static void *
-xmalloc(size_t size)
-{
- void *newptr;
-
- if ((newptr = malloc(size)) == NULL)
- err(1, "malloc()");
- return (newptr);
-}
-
-static void *
-xrealloc(void *ptr, size_t size)
-{
- void *newptr;
-
- if ((newptr = realloc(ptr, size)) == NULL)
- err(1, "realloc()");
- return (newptr);
-}
-
-static char *
-xstrdup(const char *str)
-{
- char *dupstr;
-
- if ((dupstr = strdup(str)) == NULL)
- err(1, "strdup()");
- return (dupstr);
-}
-
-static struct xgroup *grps;
-static size_t grpsz;
-static size_t ngrps;
-
-static void
-get_groups(void)
-{
- struct group *grp;
- size_t len;
- int i;
-
- setgrent();
- for (;;) {
- if (ngrps == grpsz) {
- grpsz += grpsz ? grpsz : 128;
- grps = xrealloc(grps, grpsz * sizeof *grps);
- }
- if ((grp = getgrent()) == NULL)
- break;
- grps[ngrps].gr_name = xstrdup(grp->gr_name);
- grps[ngrps].gr_passwd = xstrdup(grp->gr_passwd);
- grps[ngrps].gr_gid = grp->gr_gid;
- grps[ngrps].gr_mem = xstrdup("");
- for (i = 0, len = 1; grp->gr_mem[i] != NULL; ++i)
- len += strlen(grp->gr_mem[i]) + 1;
- grps[ngrps].gr_mem = xmalloc(len);
- for (i = 0, len = 0; grp->gr_mem[i] != NULL; ++i)
- len += sprintf(grps[ngrps].gr_mem + len,
- i ? ",%s" : "%s", grp->gr_mem[i]);
- grps[ngrps].gr_mem[len] = '\0';
- ngrps++;
- }
- endgrent();
-}
-
-static struct xgroup *
-find_group_bygid(gid_t gid)
-{
- unsigned int i;
-
- for (i = 0; i < ngrps; ++i)
- if (grps[i].gr_gid == gid)
- return (&grps[i]);
- return (NULL);
-}
-
-#if 0
-static struct xgroup *
-find_group_byname(const char *name)
-{
- unsigned int i;
-
- for (i = 0; i < ngrps; ++i)
- if (strcmp(grps[i].gr_name, name) == 0)
- return (&grps[i]);
- return (NULL);
-}
-#endif
-
-static struct xpasswd *pwds;
-static size_t pwdsz;
-static size_t npwds;
-
-static int
-pwd_cmp_byname(const void *ap, const void *bp)
-{
- const struct passwd *a = ap;
- const struct passwd *b = bp;
-
- return (strcmp(a->pw_name, b->pw_name));
-}
-
-static int
-pwd_cmp_byuid(const void *ap, const void *bp)
-{
- const struct passwd *a = ap;
- const struct passwd *b = bp;
-
- return (a->pw_uid - b->pw_uid);
-}
-
-static void
-get_users(void)
-{
- struct passwd *pwd;
-
- setpwent();
- for (;;) {
- if (npwds == pwdsz) {
- pwdsz += pwdsz ? pwdsz : 128;
- pwds = xrealloc(pwds, pwdsz * sizeof *pwds);
- }
- if ((pwd = getpwent()) == NULL)
- break;
- pwds[npwds].pw_name = xstrdup(pwd->pw_name);
- pwds[npwds].pw_passwd = xstrdup(pwd->pw_passwd);
- pwds[npwds].pw_uid = pwd->pw_uid;
- pwds[npwds].pw_gid = pwd->pw_gid;
- pwds[npwds].pw_change = pwd->pw_change;
- pwds[npwds].pw_class = xstrdup(pwd->pw_class);
- pwds[npwds].pw_gecos = xstrdup(pwd->pw_gecos);
- pwds[npwds].pw_dir = xstrdup(pwd->pw_dir);
- pwds[npwds].pw_shell = xstrdup(pwd->pw_shell);
- pwds[npwds].pw_expire = pwd->pw_expire;
- pwds[npwds].pw_selected = 0;
- npwds++;
- }
- endpwent();
-}
-
-static void
-select_users(void)
-{
- unsigned int i, j;
- struct xgroup *grp;
- struct xpasswd *pwd;
-
- for (i = 0, pwd = pwds; i < npwds; ++i, ++pwd) {
- if (everything) {
- pwd->pw_selected = 1;
- continue;
- }
- if (d_flag)
- if ((i > 0 && pwd->pw_uid == pwd[-1].pw_uid) ||
- (i < npwds - 1 && pwd->pw_uid == pwd[1].pw_uid)) {
- pwd->pw_selected = 1;
- continue;
- }
- if (g_args) {
- for (j = 0, grp = grps; j < ngrps; ++j, ++grp) {
- if (member(grp->gr_name, g_args) &&
- member(pwd->pw_name, grp->gr_mem)) {
- pwd->pw_selected = 1;
- break;
- }
- }
- if (pwd->pw_selected)
- continue;
- }
- if (l_args)
- if (member(pwd->pw_name, l_args)) {
- pwd->pw_selected = 1;
- continue;
- }
- if (p_flag)
- if (pwd->pw_passwd[0] == '\0') {
- pwd->pw_selected = 1;
- continue;
- }
- if (s_flag)
- if (pwd->pw_uid < 1000 || pwd->pw_uid == 65534) {
- pwd->pw_selected = 1;
- continue;
- }
- if (u_flag)
- if (pwd->pw_uid >= 1000 && pwd->pw_uid != 65534) {
- pwd->pw_selected = 1;
- continue;
- }
- }
-}
-
-static void
-sort_users(void)
-{
- if (t_flag)
- mergesort(pwds, npwds, sizeof *pwds, pwd_cmp_byname);
- else
- mergesort(pwds, npwds, sizeof *pwds, pwd_cmp_byuid);
-}
-
-static void
-display_user(struct xpasswd *pwd)
-{
- struct xgroup *grp;
- unsigned int i;
- char cbuf[16], ebuf[16];
- struct tm *tm;
-
- grp = find_group_bygid(pwd->pw_gid);
- printf(o_flag ? "%s:%ld:%s:%ld:%s" : "%-15s %-7ld %-15s %-7ld %s\n",
- pwd->pw_name, (long)pwd->pw_uid, grp ? grp->gr_name : "",
- (long)pwd->pw_gid, pwd->pw_gecos);
- if (m_flag) {
- for (i = 0, grp = grps; i < ngrps; ++i, ++grp) {
- if (grp->gr_gid == pwd->pw_gid ||
- !member(pwd->pw_name, grp->gr_mem))
- continue;
- printf(o_flag ? "%s:%s:%ld" : "%24s%-15s %-7ld\n",
- "", grp->gr_name, (long)grp->gr_gid);
- }
- }
- if (x_flag) {
- printf(o_flag ? "%s:%s" : "%24s%s\n", "", pwd->pw_dir);
- printf(o_flag ? "%s:%s" : "%24s%s\n", "", pwd->pw_shell);
- }
- if (a_flag) {
- tm = gmtime(&pwd->pw_change);
- strftime(cbuf, sizeof(cbuf), pwd->pw_change ? "%F" : "0", tm);
- tm = gmtime(&pwd->pw_expire);
- strftime(ebuf, sizeof(ebuf), pwd->pw_expire ? "%F" : "0", tm);
- printf(o_flag ? "%s:%s:%s" : "%24s%s %s\n", "", cbuf, ebuf);
- }
- if (o_flag)
- printf("\n");
-}
-
-static void
-list_users(void)
-{
- struct xpasswd *pwd;
- unsigned int i;
-
- for (i = 0, pwd = pwds; i < npwds; ++i, ++pwd)
- if (pwd->pw_selected)
- display_user(pwd);
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: logins [-admopstux] [-g group] [-l login]\n");
- exit(1);
-}
-
-int
-main(int argc, char * const argv[])
-{
- int o;
-
- while ((o = getopt(argc, argv, "adg:l:mopstux")) != -1)
- switch (o) {
- case 'a':
- a_flag = 1;
- break;
- case 'd':
- everything = 0;
- d_flag = 1;
- break;
- case 'g':
- everything = 0;
- g_args = optarg;
- break;
- case 'l':
- everything = 0;
- l_args = optarg;
- break;
- case 'm':
- m_flag = 1;
- break;
- case 'o':
- o_flag = 1;
- break;
- case 'p':
- everything = 0;
- p_flag = 1;
- break;
- case 's':
- everything = 0;
- s_flag = 1;
- break;
- case 't':
- t_flag = 1;
- break;
- case 'u':
- everything = 0;
- u_flag = 1;
- break;
- case 'x':
- x_flag = 1;
- break;
- default:
- usage();
- }
-
- argc -= optind;
- argv += optind;
-
- if (argc > 0)
- usage();
-
- get_groups();
- get_users();
- select_users();
- sort_users();
- list_users();
- exit(0);
-}
diff --git a/usr.bin/logname/Makefile b/usr.bin/logname/Makefile
deleted file mode 100644
index 4e910ce..0000000
--- a/usr.bin/logname/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/9/93
-# $FreeBSD$
-
-PROG= logname
-WARNS?= 6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/logname/logname.1 b/usr.bin/logname/logname.1
deleted file mode 100644
index e247471..0000000
--- a/usr.bin/logname/logname.1
+++ /dev/null
@@ -1,75 +0,0 @@
-.\" Copyright (c) 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)logname.1 8.1 (Berkeley) 6/9/93
-.\" $FreeBSD$
-.\"
-.Dd June 9, 1993
-.Dt LOGNAME 1
-.Os
-.Sh NAME
-.Nm logname
-.Nd display user's login name
-.Sh SYNOPSIS
-.Nm
-.Sh DESCRIPTION
-The
-.Nm
-utility writes the user's login name to standard output followed by
-a newline.
-.Pp
-The
-.Nm
-utility explicitly ignores the
-.Ev LOGNAME
-and
-.Ev USER
-environment variables
-because the environment cannot be trusted.
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr who 1 ,
-.Xr whoami 1 ,
-.Xr getlogin 2
-.Sh STANDARDS
-The
-.Nm
-utility is expected to conform to
-.St -p1003.2 .
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.4 .
diff --git a/usr.bin/logname/logname.c b/usr.bin/logname/logname.c
deleted file mode 100644
index 8f98b8a..0000000
--- a/usr.bin/logname/logname.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1991, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static const char sccsid[] = "@(#)logname.c 8.2 (Berkeley) 4/3/94";
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-void usage(void);
-
-int
-main(int argc, char *argv[] __unused)
-{
- char *p;
-
- if (argc != 1)
- usage();
- if ((p = getlogin()) == NULL)
- err(1, NULL);
- (void)printf("%s\n", p);
- exit(0);
-}
-
-void
-usage(void)
-{
- (void)fprintf(stderr, "usage: logname\n");
- exit(1);
-}
diff --git a/usr.bin/look/Makefile b/usr.bin/look/Makefile
deleted file mode 100644
index 64d7788..0000000
--- a/usr.bin/look/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/9/93
-
-PROG= look
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/look/look.1 b/usr.bin/look/look.1
deleted file mode 100644
index ecc19a6..0000000
--- a/usr.bin/look/look.1
+++ /dev/null
@@ -1,124 +0,0 @@
-.\" Copyright (c) 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)look.1 8.1 (Berkeley) 6/14/93
-.\" $FreeBSD$
-.\"
-.Dd July 17, 2004
-.Dt LOOK 1
-.Os
-.Sh NAME
-.Nm look
-.Nd display lines beginning with a given string
-.Sh SYNOPSIS
-.Nm
-.Op Fl df
-.Op Fl t Ar termchar
-.Ar string
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility displays any lines in
-.Ar file
-which contain
-.Ar string
-as a prefix.
-As
-.Nm
-performs a binary search, the lines in
-.Ar file
-must be sorted.
-.Pp
-If
-.Ar file
-is not specified, the file
-.Pa /usr/share/dict/words
-is used, only alphanumeric characters are compared and the case of
-alphabetic characters is ignored.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl d
-Dictionary character set and order, i.e., only alphanumeric characters
-are compared.
-.It Fl f
-Ignore the case of alphabetic characters.
-.It Fl t
-Specify a string termination character, i.e., only the characters
-in
-.Ar string
-up to and including the first occurrence of
-.Ar termchar
-are compared.
-.El
-.Sh ENVIRONMENT
-The
-.Ev LANG , LC_ALL
-and
-.Ev LC_CTYPE
-environment variables affect the execution of the
-.Nm
-utility.
-Their effect is described in
-.Xr environ 7 .
-.Sh FILES
-.Bl -tag -width /usr/share/dict/words -compact
-.It Pa /usr/share/dict/words
-the dictionary
-.El
-.Sh EXIT STATUS
-The
-.Nm
-utility exits 0 if one or more lines were found and displayed,
-1 if no lines were found, and >1 if an error occurred.
-.Sh COMPATIBILITY
-The original manual page stated that tabs and blank characters participated
-in comparisons when the
-.Fl d
-option was specified.
-This was incorrect and the current man page matches the historic
-implementation.
-.Sh SEE ALSO
-.Xr grep 1 ,
-.Xr sort 1
-.Sh HISTORY
-A
-.Nm
-utility appeared in
-.At v7 .
-.Sh BUGS
-Lines are not compared according to the current locale's collating
-order.
-Input files must be sorted with
-.Ev LC_COLLATE
-set to
-.Ql C .
diff --git a/usr.bin/look/look.c b/usr.bin/look/look.c
deleted file mode 100644
index e6fd1b8..0000000
--- a/usr.bin/look/look.c
+++ /dev/null
@@ -1,348 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * David Hitz of Auspex Systems, Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1991, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)look.c 8.2 (Berkeley) 5/4/95";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * look -- find lines in a sorted list.
- *
- * The man page said that TABs and SPACEs participate in -d comparisons.
- * In fact, they were ignored. This implements historic practice, not
- * the manual page.
- */
-
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-#include <wctype.h>
-
-#include "pathnames.h"
-
-static char _path_words[] = _PATH_WORDS;
-
-#define EQUAL 0
-#define GREATER 1
-#define LESS (-1)
-
-int dflag, fflag;
-
-char *binary_search(wchar_t *, unsigned char *, unsigned char *);
-int compare(wchar_t *, unsigned char *, unsigned char *);
-char *linear_search(wchar_t *, unsigned char *, unsigned char *);
-int look(wchar_t *, unsigned char *, unsigned char *);
-wchar_t *prepkey(const char *, wchar_t);
-void print_from(wchar_t *, unsigned char *, unsigned char *);
-
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- struct stat sb;
- int ch, fd, match;
- wchar_t termchar;
- unsigned char *back, *front;
- unsigned const char *file;
- wchar_t *key;
-
- (void) setlocale(LC_CTYPE, "");
-
- file = _path_words;
- termchar = L'\0';
- while ((ch = getopt(argc, argv, "dft:")) != -1)
- switch(ch) {
- case 'd':
- dflag = 1;
- break;
- case 'f':
- fflag = 1;
- break;
- case 't':
- if (mbrtowc(&termchar, optarg, MB_LEN_MAX, NULL) !=
- strlen(optarg))
- errx(2, "invalid termination character");
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (argc == 0)
- usage();
- if (argc == 1) /* But set -df by default. */
- dflag = fflag = 1;
- key = prepkey(*argv++, termchar);
- if (argc >= 2)
- file = *argv++;
-
- match = 1;
-
- do {
- if ((fd = open(file, O_RDONLY, 0)) < 0 || fstat(fd, &sb))
- err(2, "%s", file);
- if (sb.st_size > SIZE_T_MAX)
- errx(2, "%s: %s", file, strerror(EFBIG));
- if ((front = mmap(NULL, (size_t)sb.st_size, PROT_READ, MAP_SHARED, fd, (off_t)0)) == MAP_FAILED)
- err(2, "%s", file);
- back = front + sb.st_size;
- match *= (look(key, front, back));
- close(fd);
- } while (argc-- > 2 && (file = *argv++));
-
- exit(match);
-}
-
-wchar_t *
-prepkey(const char *string, wchar_t termchar)
-{
- const char *readp;
- wchar_t *key, *writep;
- wchar_t ch;
- size_t clen;
-
- /*
- * Reformat search string and convert to wide character representation
- * to avoid doing it multiple times later.
- */
- if ((key = malloc(sizeof(wchar_t) * (strlen(string) + 1))) == NULL)
- err(2, NULL);
- readp = string;
- writep = key;
- while ((clen = mbrtowc(&ch, readp, MB_LEN_MAX, NULL)) != 0) {
- if (clen == (size_t)-1 || clen == (size_t)-2)
- errc(2, EILSEQ, NULL);
- if (fflag)
- ch = towlower(ch);
- if (!dflag || iswalnum(ch))
- *writep++ = ch;
- readp += clen;
- }
- *writep = L'\0';
- if (termchar != L'\0' && (writep = wcschr(key, termchar)) != NULL)
- *++writep = L'\0';
- return (key);
-}
-
-int
-look(wchar_t *string, unsigned char *front, unsigned char *back)
-{
-
- front = binary_search(string, front, back);
- front = linear_search(string, front, back);
-
- if (front)
- print_from(string, front, back);
- return (front ? 0 : 1);
-}
-
-
-/*
- * Binary search for "string" in memory between "front" and "back".
- *
- * This routine is expected to return a pointer to the start of a line at
- * *or before* the first word matching "string". Relaxing the constraint
- * this way simplifies the algorithm.
- *
- * Invariants:
- * front points to the beginning of a line at or before the first
- * matching string.
- *
- * back points to the beginning of a line at or after the first
- * matching line.
- *
- * Base of the Invariants.
- * front = NULL;
- * back = EOF;
- *
- * Advancing the Invariants:
- *
- * p = first newline after halfway point from front to back.
- *
- * If the string at "p" is not greater than the string to match,
- * p is the new front. Otherwise it is the new back.
- *
- * Termination:
- *
- * The definition of the routine allows it return at any point,
- * since front is always at or before the line to print.
- *
- * In fact, it returns when the chosen "p" equals "back". This
- * implies that there exists a string is least half as long as
- * (back - front), which in turn implies that a linear search will
- * be no more expensive than the cost of simply printing a string or two.
- *
- * Trying to continue with binary search at this point would be
- * more trouble than it's worth.
- */
-#define SKIP_PAST_NEWLINE(p, back) \
- while (p < back && *p++ != '\n');
-
-char *
-binary_search(wchar_t *string, unsigned char *front, unsigned char *back)
-{
- unsigned char *p;
-
- p = front + (back - front) / 2;
- SKIP_PAST_NEWLINE(p, back);
-
- /*
- * If the file changes underneath us, make sure we don't
- * infinitely loop.
- */
- while (p < back && back > front) {
- if (compare(string, p, back) == GREATER)
- front = p;
- else
- back = p;
- p = front + (back - front) / 2;
- SKIP_PAST_NEWLINE(p, back);
- }
- return (front);
-}
-
-/*
- * Find the first line that starts with string, linearly searching from front
- * to back.
- *
- * Return NULL for no such line.
- *
- * This routine assumes:
- *
- * o front points at the first character in a line.
- * o front is before or at the first line to be printed.
- */
-char *
-linear_search(wchar_t *string, unsigned char *front, unsigned char *back)
-{
- while (front < back) {
- switch (compare(string, front, back)) {
- case EQUAL: /* Found it. */
- return (front);
- case LESS: /* No such string. */
- return (NULL);
- case GREATER: /* Keep going. */
- break;
- }
- SKIP_PAST_NEWLINE(front, back);
- }
- return (NULL);
-}
-
-/*
- * Print as many lines as match string, starting at front.
- */
-void
-print_from(wchar_t *string, unsigned char *front, unsigned char *back)
-{
- for (; front < back && compare(string, front, back) == EQUAL; ++front) {
- for (; front < back && *front != '\n'; ++front)
- if (putchar(*front) == EOF)
- err(2, "stdout");
- if (putchar('\n') == EOF)
- err(2, "stdout");
- }
-}
-
-/*
- * Return LESS, GREATER, or EQUAL depending on how the string1 compares with
- * string2 (s1 ??? s2).
- *
- * o Matches up to len(s1) are EQUAL.
- * o Matches up to len(s2) are GREATER.
- *
- * Compare understands about the -f and -d flags, and treats comparisons
- * appropriately.
- *
- * The string "s1" is null terminated. The string s2 is '\n' terminated (or
- * "back" terminated).
- */
-int
-compare(wchar_t *s1, unsigned char *s2, unsigned char *back)
-{
- wchar_t ch1, ch2;
- size_t len2;
-
- for (; *s1 && s2 < back && *s2 != '\n'; ++s1, s2 += len2) {
- ch1 = *s1;
- len2 = mbrtowc(&ch2, s2, back - s2, NULL);
- if (len2 == (size_t)-1 || len2 == (size_t)-2) {
- ch2 = *s2;
- len2 = 1;
- }
- if (fflag)
- ch2 = towlower(ch2);
- if (dflag && !iswalnum(ch2)) {
- /* Ignore character in comparison. */
- --s1;
- continue;
- }
- if (ch1 != ch2)
- return (ch1 < ch2 ? LESS : GREATER);
- }
- return (*s1 ? GREATER : EQUAL);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "usage: look [-df] [-t char] string [file ...]\n");
- exit(2);
-}
diff --git a/usr.bin/look/pathnames.h b/usr.bin/look/pathnames.h
deleted file mode 100644
index 586e36a..0000000
--- a/usr.bin/look/pathnames.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)pathnames.h 8.1 (Berkeley) 6/9/93
- */
-
-#define _PATH_WORDS "/usr/share/dict/words"
diff --git a/usr.bin/lorder/Makefile b/usr.bin/lorder/Makefile
deleted file mode 100644
index 6199682..0000000
--- a/usr.bin/lorder/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-SCRIPTS=lorder.sh
-MAN= lorder.1
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/lorder/lorder.1 b/usr.bin/lorder/lorder.1
deleted file mode 100644
index f3222c4..0000000
--- a/usr.bin/lorder/lorder.1
+++ /dev/null
@@ -1,91 +0,0 @@
-.\" Copyright (c) 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)lorder.1 8.2 (Berkeley) 4/28/95
-.\" $FreeBSD$
-.\"
-.Dd October 25, 2006
-.Dt LORDER 1
-.Os
-.Sh NAME
-.Nm lorder
-.Nd list dependencies for object files
-.Sh SYNOPSIS
-.Nm
-.Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility uses
-.Xr nm 1
-to determine interdependencies in the list of object files
-and library archives
-specified on the command line.
-The
-.Nm
-utility outputs a list of file names where the first file contains a symbol
-which is defined by the second file.
-.Pp
-The output is normally used with
-.Xr tsort 1
-when a library is created to determine the optimum ordering of the
-object modules so that all references may be resolved in a single
-pass of the loader.
-.Pp
-When linking static binaries,
-.Nm
-and
-.Xr tsort 1
-can be used to properly order library archives automatically.
-.Sh ENVIRONMENT
-.Bl -tag -width indent
-.It Ev NM
-Path to the
-.Xr nm 1
-binary, defaults to
-.Dq Li nm .
-.El
-.Sh EXAMPLES
-.Bd -literal -offset indent
-ar cr library.a `lorder ${OBJS} | tsort`
-cc -o foo ${OBJS} `lorder ${STATIC_LIBS} | tsort`
-.Ed
-.Sh SEE ALSO
-.Xr ar 1 ,
-.Xr ld 1 ,
-.Xr nm 1 ,
-.Xr ranlib 1 ,
-.Xr tsort 1
-.Sh HISTORY
-A
-.Nm
-utility appeared in
-.At v7 .
diff --git a/usr.bin/lorder/lorder.sh b/usr.bin/lorder/lorder.sh
deleted file mode 100644
index 958e95d..0000000
--- a/usr.bin/lorder/lorder.sh
+++ /dev/null
@@ -1,94 +0,0 @@
-#!/bin/sh -
-#
-# Copyright (c) 1990, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 4. Neither the name of the University nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# @(#)lorder.sh 8.1 (Berkeley) 6/6/93
-#
-# $FreeBSD$
-#
-
-# only one argument is a special case, just output the name twice
-case $# in
- 0)
- echo "usage: lorder file ...";
- exit ;;
- 1)
- echo $1 $1;
- exit ;;
-esac
-
-# temporary files
-R=$(mktemp -t _reference_)
-S=$(mktemp -t _symbol_)
-NM=${NM:-nm}
-
-# remove temporary files on HUP, INT, QUIT, PIPE, TERM
-trap "rm -f $R $S $T; exit 1" 1 2 3 13 15
-
-# make sure all the files get into the output
-for i in $*; do
- echo $i $i
-done
-
-# if the line has " [TDW] " it's a globally defined symbol, put it
-# into the symbol file.
-#
-# if the line has " U " it's a globally undefined symbol, put it into
-# the reference file.
-${NM} -go $* | sed "
- / [TDW] / {
- s/:.* [TDW] / /
- w $S
- d
- }
- / U / {
- s/:.* U / /
- w $R
- }
- d
-"
-
-# eliminate references that can be resolved by the same library.
-if [ $(expr "$*" : '.*\.a[[:>:]]') -ne 0 ]; then
- sort -u -o $S $S
- sort -u -o $R $R
- T=$(mktemp -t _temp_)
- comm -23 $R $S >$T
- mv $T $R
-fi
-
-# sort references and symbols on the second field (the symbol),
-# join on that field, and print out the file names.
-sort -k 2 -o $R $R
-sort -k 2 -o $S $S
-join -j 2 -o 1.1 2.1 $R $S
-rm -f $R $S
diff --git a/usr.bin/lsvfs/Makefile b/usr.bin/lsvfs/Makefile
deleted file mode 100644
index 0c33583..0000000
--- a/usr.bin/lsvfs/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# $FreeBSD$
-
-PROG= lsvfs
-WARNS?= 6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/lsvfs/lsvfs.1 b/usr.bin/lsvfs/lsvfs.1
deleted file mode 100644
index ed4b44e..0000000
--- a/usr.bin/lsvfs/lsvfs.1
+++ /dev/null
@@ -1,52 +0,0 @@
-.\" $FreeBSD$
-.\" Garrett A. Wollman, September 1994
-.\" This file is in the public domain.
-.\"
-.Dd March 16, 1995
-.Dt LSVFS 1
-.Os
-.Sh NAME
-.Nm lsvfs
-.Nd list installed virtual file systems
-.Sh SYNOPSIS
-.Nm
-.Op Ar vfsname Ar ...
-.Sh DESCRIPTION
-The
-.Nm
-command lists information about the currently loaded virtual file system
-modules.
-When
-.Ar vfsname
-arguments are given,
-.Nm
-lists information about the specified VFS modules.
-Otherwise,
-.Nm
-lists all currently loaded modules.
-The information is as follows:
-.Pp
-.Bl -tag -compact -width Filesystem
-.It Filesystem
-the name of the file system, as would be used in the
-.Ar type
-parameter to
-.Xr mount 2
-and the
-.Fl t
-option to
-.Xr mount 8
-.It Refs
-the number of references to this VFS; i.e., the number of currently
-mounted file systems of this type
-.It Flags
-flag bits.
-.El
-.Sh SEE ALSO
-.Xr mount 2 ,
-.Xr mount 8
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.Fx 2.0 .
diff --git a/usr.bin/lsvfs/lsvfs.c b/usr.bin/lsvfs/lsvfs.c
deleted file mode 100644
index a091282..0000000
--- a/usr.bin/lsvfs/lsvfs.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * lsvfs - list loaded VFSes
- * Garrett A. Wollman, September 1994
- * This file is in the public domain.
- *
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/mount.h>
-#include <sys/sysctl.h>
-
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define FMT "%-32.32s %5d %s\n"
-#define HDRFMT "%-32.32s %5.5s %s\n"
-#define DASHES "-------------------------------- ----- ---------------\n"
-
-static const char *fmt_flags(int);
-
-int
-main(int argc, char **argv)
-{
- int cnt, rv = 0, i;
- struct xvfsconf vfc, *xvfsp;
- size_t buflen;
- argc--, argv++;
-
- printf(HDRFMT, "Filesystem", "Refs", "Flags");
- fputs(DASHES, stdout);
-
- if(argc) {
- for(; argc; argc--, argv++) {
- if (getvfsbyname(*argv, &vfc) == 0) {
- printf(FMT, vfc.vfc_name, vfc.vfc_refcount, fmt_flags(vfc.vfc_flags));
- } else {
- warnx("VFS %s unknown or not loaded", *argv);
- rv++;
- }
- }
- } else {
- if (sysctlbyname("vfs.conflist", NULL, &buflen, NULL, 0) < 0)
- err(1, "sysctl(vfs.conflist)");
- xvfsp = malloc(buflen);
- if (xvfsp == NULL)
- errx(1, "malloc failed");
- if (sysctlbyname("vfs.conflist", xvfsp, &buflen, NULL, 0) < 0)
- err(1, "sysctl(vfs.conflist)");
- cnt = buflen / sizeof(struct xvfsconf);
-
- for (i = 0; i < cnt; i++) {
- printf(FMT, xvfsp[i].vfc_name, xvfsp[i].vfc_refcount,
- fmt_flags(xvfsp[i].vfc_flags));
- }
- free(xvfsp);
- }
-
- return rv;
-}
-
-static const char *
-fmt_flags(int flags)
-{
- /*
- * NB: if you add new flags, don't forget to add them here vvvvvv too.
- */
- static char buf[sizeof
- "static, network, read-only, synthetic, loopback, unicode, jail"];
- int comma = 0;
-
- buf[0] = '\0';
-
- if(flags & VFCF_STATIC) {
- if(comma++) strcat(buf, ", ");
- strcat(buf, "static");
- }
-
- if(flags & VFCF_NETWORK) {
- if(comma++) strcat(buf, ", ");
- strcat(buf, "network");
- }
-
- if(flags & VFCF_READONLY) {
- if(comma++) strcat(buf, ", ");
- strcat(buf, "read-only");
- }
-
- if(flags & VFCF_SYNTHETIC) {
- if(comma++) strcat(buf, ", ");
- strcat(buf, "synthetic");
- }
-
- if(flags & VFCF_LOOPBACK) {
- if(comma++) strcat(buf, ", ");
- strcat(buf, "loopback");
- }
-
- if(flags & VFCF_UNICODE) {
- if(comma++) strcat(buf, ", ");
- strcat(buf, "unicode");
- }
-
- if(flags & VFCF_JAIL) {
- if(comma++) strcat(buf, ", ");
- strcat(buf, "jail");
- }
-
- return buf;
-}
diff --git a/usr.bin/m4/Makefile b/usr.bin/m4/Makefile
deleted file mode 100644
index 702b3f3..0000000
--- a/usr.bin/m4/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-# $OpenBSD: Makefile,v 1.10 2002/04/26 13:13:41 espie Exp $
-# $FreeBSD$
-
-# -DEXTENDED
-# if you want the paste & spaste macros.
-
-PROG= m4
-CFLAGS+=-DEXTENDED
-
-SRCS= eval.c expr.c look.c main.c misc.c gnum4.c trace.c
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/m4/NOTES b/usr.bin/m4/NOTES
deleted file mode 100644
index d60f80e..0000000
--- a/usr.bin/m4/NOTES
+++ /dev/null
@@ -1,64 +0,0 @@
-m4 - macro processor
-
-PD m4 is based on the macro tool distributed with the software
-tools (VOS) package, and described in the "SOFTWARE TOOLS" and
-"SOFTWARE TOOLS IN PASCAL" books. It has been expanded to include
-most of the command set of SysV m4, the standard UN*X macro processor.
-
-Since both PD m4 and UN*X m4 are based on SOFTWARE TOOLS macro,
-there may be certain implementation similarities between
-the two. The PD m4 was produced without ANY references to m4
-sources.
-
-written by: Ozan S. Yigit
-
-References:
-
- Software Tools distribution: macro
-
- Kernighan, Brian W. and P. J. Plauger, SOFTWARE
- TOOLS IN PASCAL, Addison-Wesley, Mass. 1981
-
- Kernighan, Brian W. and P. J. Plauger, SOFTWARE
- TOOLS, Addison-Wesley, Mass. 1976
-
- Kernighan, Brian W. and Dennis M. Ritchie,
- THE M4 MACRO PROCESSOR, Unix Programmer's Manual,
- Seventh Edition, Vol. 2, Bell Telephone Labs, 1979
-
- System V man page for M4
-
-
-Implementation Notes:
-
-[1] PD m4 uses a different (and simpler) stack mechanism than the one
- described in Software Tools and Software Tools in Pascal books.
- The triple stack thing is replaced with a single stack containing
- the call frames and the arguments. Each frame is back-linked to a
- previous stack frame, which enables us to rewind the stack after
- each nested call is completed. Each argument is a character pointer
- to the beginning of the argument string within the string space.
- The only exceptions to this are (*) arg 0 and arg 1, which are
- the macro definition and macro name strings, stored dynamically
- for the hash table.
-
- . .
- | . | <-- sp | . |
- +-------+ +-----+
- | arg 3 ------------------------------->| str |
- +-------+ | . |
- | arg 2 --------------+ .
- +-------+ |
- * | | |
- +-------+ | +-----+
- | plev | <-- fp +---------------->| str |
- +-------+ | . |
- | type | .
- +-------+
- | prcf -----------+ plev: paren level
- +-------+ | type: call type
- | . | | prcf: prev. call frame
- . |
- +-------+ |
- | <----------+
- +-------+
diff --git a/usr.bin/m4/TEST/ack.m4 b/usr.bin/m4/TEST/ack.m4
deleted file mode 100644
index ef0b5ef..0000000
--- a/usr.bin/m4/TEST/ack.m4
+++ /dev/null
@@ -1,42 +0,0 @@
-# $OpenBSD: ack.m4,v 1.2 1996/06/26 05:36:18 deraadt Exp $
-# $NetBSD: ack.m4,v 1.4 1995/09/28 05:37:54 tls Exp $
-#
-# Copyright (c) 1989, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# This code is derived from software contributed to Berkeley by
-# Ozan Yigit.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 4. Neither the name of the University nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# @(#)ack.m4 8.1 (Berkeley) 6/6/93
-#
-
-define(ack, `ifelse($1,0,incr($2),$2,0,`ack(DECR($1),1)',
-`ack(DECR($1), ack($1,DECR($2)))')')
diff --git a/usr.bin/m4/TEST/hanoi.m4 b/usr.bin/m4/TEST/hanoi.m4
deleted file mode 100644
index d16f922..0000000
--- a/usr.bin/m4/TEST/hanoi.m4
+++ /dev/null
@@ -1,47 +0,0 @@
-# $OpenBSD: hanoi.m4,v 1.2 1996/06/26 05:36:19 deraadt Exp $
-# $NetBSD: hanoi.m4,v 1.4 1995/09/28 05:37:56 tls Exp $
-#
-# Copyright (c) 1989, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# This code is derived from software contributed to Berkeley by
-# Ozan Yigit.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 4. Neither the name of the University nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# @(#)hanoi.m4 8.1 (Berkeley) 6/6/93
-#
-
-define(hanoi, `trans(A, B, C, $1)')
-
-define(moved,`move disk from $1 to $2
-')
-
-define(trans, `ifelse($4,1,`moved($1,$2)',
- `trans($1,$3,$2,DECR($4))moved($1,$2)trans($3,$2,$1,DECR($4))')')
diff --git a/usr.bin/m4/TEST/hash.m4 b/usr.bin/m4/TEST/hash.m4
deleted file mode 100644
index 21b40e1..0000000
--- a/usr.bin/m4/TEST/hash.m4
+++ /dev/null
@@ -1,57 +0,0 @@
-# $OpenBSD: hash.m4,v 1.2 1996/06/26 05:36:19 deraadt Exp $
-# $NetBSD: hash.m4,v 1.4 1995/09/28 05:37:58 tls Exp $
-#
-# Copyright (c) 1989, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# This code is derived from software contributed to Berkeley by
-# Ozan Yigit.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 4. Neither the name of the University nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# @(#)hash.m4 8.1 (Berkeley) 6/6/93
-#
-
-dnl This probably will not run on any m4 that cannot
-dnl handle char constants in eval.
-dnl
-changequote(<,>) define(HASHVAL,99) dnl
-define(hash,<eval(str(substr($1,1),0)%HASHVAL)>) dnl
-define(str,
- <ifelse($1,",$2,
- <str(substr(<$1>,1),<eval($2+'substr($1,0,1)')>)>)
- >) dnl
-define(KEYWORD,<$1,hash($1),>) dnl
-define(TSTART,
-<struct prehash {
- char *keyword;
- int hashval;
-} keytab[] = {>) dnl
-define(TEND,< "",0
-};>) dnl
diff --git a/usr.bin/m4/TEST/math.m4 b/usr.bin/m4/TEST/math.m4
deleted file mode 100644
index 0262af6..0000000
--- a/usr.bin/m4/TEST/math.m4
+++ /dev/null
@@ -1,181 +0,0 @@
-dnl $FreeBSD$
-dnl A regression test for m4 C operators (ksb,petef)
-dnl If you think you have a short-circuiting m4, run us m4 -DSHORCIRCUIT=yes
-dnl
-dnl first level of precedence
-ifelse(expr(-7),-7,,`failed -
-')dnl
-ifelse(expr(- -2),2,,`failed -
-')dnl
-ifelse(expr(!0),1,,`failed !
-')dnl
-ifelse(expr(!7),0,,`failed !
-')dnl
-ifelse(expr(~-1),0,,`failed ~
-')dnl
-dnl next level of precedence
-ifelse(expr(3*5),15,,`failed *
-')dnl
-ifelse(expr(3*0),0,,`failed *
-')dnl
-ifelse(expr(11/2),5,,`failed /
-')dnl
-ifelse(expr(1/700),0,,`failed /
-')dnl
-ifelse(expr(10%5),0,,`failed %
-')dnl
-ifelse(expr(2%5),2,,`failed %
-')dnl
-ifelse(expr(2%-1),0,,`failed %
-')dnl
-dnl next level of precedence
-ifelse(expr(2+2),4,,`failed +
-')dnl
-ifelse(expr(2+-2),0,,`failed +
-')dnl
-ifelse(expr(2- -2),4,,`failed -
-')dnl
-ifelse(expr(2-2),0,,`failed -
-')dnl
-dnl next level of precedence
-ifelse(expr(1<<4),16,,`failed <<
-')dnl
-ifelse(expr(16>>4),1,,`failed >>
-')dnl
-dnl next level of precedence
-ifelse(expr(4<4),0,,`failed <
-')dnl
-ifelse(expr(4<5),1,,`failed <
-')dnl
-ifelse(expr(4<3),0,,`failed <
-')dnl
-ifelse(expr(4>4),0,,`failed >
-')dnl
-ifelse(expr(4>5),0,,`failed >
-')dnl
-ifelse(expr(4>3),1,,`failed >
-')dnl
-ifelse(expr(4<=4),1,,`failed <=
-')dnl
-ifelse(expr(4<=5),1,,`failed <=
-')dnl
-ifelse(expr(4<=3),0,,`failed <=
-')dnl
-ifelse(expr(4>=4),1,,`failed >=
-')dnl
-ifelse(expr(4>=5),0,,`failed >=
-')dnl
-ifelse(expr(4>=3),1,,`failed >=
-')dnl
-dnl next level of precedence
-ifelse(expr(1==1),1,,`failed ==
-')dnl
-ifelse(expr(1==-1),0,,`failed ==
-')dnl
-ifelse(expr(1!=1),0,,`failed !=
-')dnl
-ifelse(expr(1!=2),1,,`failed !=
-')dnl
-dnl next level of precedence
-ifelse(expr(3&5),1,,`failed &
-')dnl
-ifelse(expr(8&7),0,,`failed &
-')dnl
-dnl next level of precedence
-ifelse(expr(1^1),0,,`failed ^
-')dnl
-ifelse(expr(21^5),16,,`failed ^
-')dnl
-dnl next level of precedence
-ifelse(expr(1|1),1,,`failed |
-')dnl
-ifelse(expr(21|5),21,,`failed |
-')dnl
-ifelse(expr(100|1),101,,`failed |
-')dnl
-dnl next level of precedence
-ifelse(expr(1&&1),1,,`failed &&
-')dnl
-ifelse(expr(0&&1),0,,`failed &&
-')dnl
-ifelse(expr(1&&0),0,,`failed &&
-')dnl
-ifelse(SHORTCIRCUIT,`yes',`ifelse(expr(0&&10/0),0,,`failed && shortcircuit
-')')dnl
-dnl next level of precedence
-ifelse(expr(1||1),1,,`failed ||
-')dnl
-ifelse(expr(1||0),1,,`failed ||
-')dnl
-ifelse(expr(0||0),0,,`failed ||
-')dnl
-ifelse(SHORTCIRCUIT,`yes',`ifelse(expr(1||10/0),1,,`failed || shortcircuit
-')')dnl
-dnl next level of precedence
-ifelse(expr(0 ? 2 : 5),5,,`failed ?:
-')dnl
-ifelse(expr(1 ? 2 : 5),2,,`failed ?:
-')dnl
-ifelse(SHORTCIRCUIT,`yes',`ifelse(expr(0 ? 10/0 : 7),7,,`failed ?: shortcircuit
-')')dnl
-ifelse(SHORTCIRCUIT,`yes',`ifelse(expr(1 ? 7 : 10/0),7,,`failed ?: shortcircuit
-')')dnl
-dnl operator precedence
-ifelse(expr(!0*-2),-2,,`precedence wrong, ! *
-')dnl
-ifelse(expr(~8/~2),3,,`precedence wrong ~ /
-')dnl
-ifelse(expr(~-20%7),5,,`precedence wrong ~ %
-')dnl
-ifelse(expr(3*2+100),106,,`precedence wrong * +
-')dnl
-ifelse(expr(3+2*100),203,,`precedence wrong + *
-')dnl
-ifelse(expr(2%5-6/3),0,,`precedence wrong % -
-')dnl
-ifelse(expr(2/5-5%3),-2,,`precedence wrong / -
-')dnl
-ifelse(expr(2+5%5+1),3,,`precedence wrong % +
-')dnl
-ifelse(expr(7+9<<1),32,,`precedence wrong + <<
-')dnl
-ifelse(expr(35-3>>2),8,,`precedence wrong - >>
-')dnl
-ifelse(expr(9<10<<5),1,,`precedence wrong << <
-')dnl
-ifelse(expr(9>10<<5),0,,`precedence wrong << >
-')dnl
-ifelse(expr(32>>2<32),1,,`precedence wrong >> <
-')dnl
-ifelse(expr(9<=10<<5),1,,`precedence wrong << <
-')dnl
-ifelse(expr(5<<1<=20>>1),1,,`precedence wrong << <=
-')dnl
-ifelse(expr(5<<1>=20>>1),1,,`precedence wrong << >=
-')dnl
-ifelse(expr(0<7==5>=5),1,,`precedence wrong < ==
-')dnl
-ifelse(expr(0<7!=5>=5),0,,`precedence wrong < !=
-')dnl
-ifelse(expr(0>7==5>=5),0,,`precedence wrong > ==
-')dnl
-ifelse(expr(0>7!=5>=5),1,,`precedence wrong > !=
-')dnl
-ifelse(expr(1&7==7),1,,`precedence wrong & ==
-')dnl
-ifelse(expr(0&7!=6),0,,`precedence wrong & !=
-')dnl
-ifelse(expr(9&1|5),5,,`precedence wrong & |
-')dnl
-ifelse(expr(9&1^5),4,,`precedence wrong & ^
-')dnl
-ifelse(expr(9^1|5),13,,`precedence wrong ^ |
-')dnl
-ifelse(expr(5|0&&1),1,,`precedence wrong | &&
-')dnl
-ifelse(expr(5&&0||0&&5||5),1,,`precedence wrong && ||
-')dnl
-ifelse(expr(0 || 1 ? 0 : 1),0,,`precedence wrong || ?:
-')dnl
-ifelse(expr(5&&(0||0)&&(5||5)),0,,`precedence wrong || parens
-')dnl
diff --git a/usr.bin/m4/TEST/sqroot.m4 b/usr.bin/m4/TEST/sqroot.m4
deleted file mode 100644
index d01789b..0000000
--- a/usr.bin/m4/TEST/sqroot.m4
+++ /dev/null
@@ -1,47 +0,0 @@
-# $OpenBSD: sqroot.m4,v 1.2 1996/06/26 05:36:20 deraadt Exp $
-# $NetBSD: sqroot.m4,v 1.4 1995/09/28 05:38:01 tls Exp $
-#
-# Copyright (c) 1989, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# This code is derived from software contributed to Berkeley by
-# Ozan Yigit.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 4. Neither the name of the University nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# @(#)sqroot.m4 8.1 (Berkeley) 6/6/93
-#
-
-define(square_root,
- `ifelse(eval($1<0),1,negative-square-root,
- `square_root_aux($1, 1, eval(($1+1)/2))')')
-define(square_root_aux,
- `ifelse($3, $2, $3,
- $3, eval($1/$2), $3,
- `square_root_aux($1, $3, eval(($3+($1/$3))/2))')')
diff --git a/usr.bin/m4/TEST/string.m4 b/usr.bin/m4/TEST/string.m4
deleted file mode 100644
index bb0bba4..0000000
--- a/usr.bin/m4/TEST/string.m4
+++ /dev/null
@@ -1,47 +0,0 @@
-# $OpenBSD: string.m4,v 1.2 1996/06/26 05:36:20 deraadt Exp $
-# $NetBSD: string.m4,v 1.4 1995/09/28 05:38:03 tls Exp $
-#
-# Copyright (c) 1989, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# This code is derived from software contributed to Berkeley by
-# Ozan Yigit.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 4. Neither the name of the University nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# @(#)string.m4 8.1 (Berkeley) 6/6/93
-#
-
-define(string,`integer $1(len(substr($2,1)))
-str($1,substr($2,1),0)
-data $1(len(substr($2,1)))/EOS/
-')
-
-define(str,`ifelse($2,",,data $1(incr($3))/`LET'substr($2,0,1)/
-`str($1,substr($2,1),incr($3))')')
diff --git a/usr.bin/m4/TEST/test.m4 b/usr.bin/m4/TEST/test.m4
deleted file mode 100644
index 1c77b9b..0000000
--- a/usr.bin/m4/TEST/test.m4
+++ /dev/null
@@ -1,245 +0,0 @@
-# $OpenBSD: test.m4,v 1.2 1996/06/26 05:36:21 deraadt Exp $
-# $NetBSD: test.m4,v 1.4 1995/09/28 05:38:05 tls Exp $
-#
-# Copyright (c) 1989, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# This code is derived from software contributed to Berkeley by
-# Ozan Yigit.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 4. Neither the name of the University nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# @(#)test.m4 8.1 (Berkeley) 6/6/93
-#
-
-# test file for mp (not comprehensive)
-#
-# v7 m4 does not have `decr'.
-#
-define(DECR,`eval($1-1)')
-#
-# include string macros
-#
-include(string.m4)
-#
-# create some fortrash strings for an even uglier language
-#
-string(TEXT, "text")
-string(DATA, "data")
-string(BEGIN, "begin")
-string(END, "end")
-string(IF, "if")
-string(THEN, "then")
-string(ELSE, "else")
-string(CASE, "case")
-string(REPEAT, "repeat")
-string(WHILE, "while")
-string(DEFAULT, "default")
-string(UNTIL, "until")
-string(FUNCTION, "function")
-string(PROCEDURE, "procedure")
-string(EXTERNAL, "external")
-string(FORWARD, "forward")
-string(TYPE, "type")
-string(VAR, "var")
-string(CONST, "const")
-string(PROGRAM, "program")
-string(INPUT, "input")
-string(OUTPUT, "output")
-#
-divert(2)
-diversion #1
-divert(3)
-diversion #2
-divert(4)
-diversion #3
-divert(5)
-diversion #4
-divert(0)
-define(abc,xxx)
-ifdef(`abc',defined,undefined)
-#
-# v7 m4 does this wrong. The right output is
-# this is A vEry lon sEntEnCE
-# see m4 documentation for translit.
-#
-translit(`this is a very long sentence', abcdefg, ABCDEF)
-#
-# include towers-of-hanoi
-#
-include(hanoi.m4)
-#
-# some reasonable set of disks
-#
-hanoi(6)
-#
-# include ackermann's function
-#
-include(ack.m4)
-#
-# something like (3,3) will blow away un*x m4.
-#
-ack(2,3)
-#
-# include a square_root function for fixed nums
-#
-include(sqroot.m4)
-#
-# some square roots.
-#
-square_root(15)
-square_root(100)
-square_root(-4)
-square_root(21372)
-#
-# some textual material for enjoyment.
-#
-[taken from the 'Clemson University Computer Newsletter',
- September 1981, pp. 6-7]
-
-I am a wizard in the magical Kingdom of Transformation and I
-slay dragons for a living. Actually, I am a systems programmer.
-One of the problems with systems programming is explaining to
-non-computer enthusiasts what that is. All of the terms I use to
-describe my job are totally meaningless to them. Usually my response
-to questions about my work is to say as little as possible. For
-instance, if someone asks what happened at work this week, I say
-"Nothing much" and then I change the subject.
-
-With the assistance of my brother, a mechanical engineer, I have devised
-an analogy that everyone can understand. The analogy describes the
-"Kingdom of Transformation" where travelers wander and are magically
-transformed. This kingdom is the computer and the travelers are information.
-The purpose of the computer is to change information to a more meaningful
-forma. The law of conservation applies here: The computer never creates
-and never intentionally destroys data. With no further ado, let us travel
-to the Kingdom of Transformation:
-
-In a land far, far away, there is a magical kingdom called the Kingdom of
-Transformation. A king rules over this land and employs a Council of
-Wizardry. The main purpose of this kingdom is to provide a way for
-neighboring kingdoms to transform citizens into more useful citizens. This
-is done by allowing the citizens to enter the kingdom at one of its ports
-and to travel any of the many routes in the kingdom. They are magically
-transformed along the way. The income of the Kingdom of Transformation
-comes from the many toll roads within its boundaries.
-
-The Kingdom of Transformation was created when several kingdoms got
-together and discovered a mutual need for new talents and abilities for
-citizens. They employed CTK, Inc. (Creators of Transformation, Inc.) to
-create this kingdom. CTK designed the country, its transportation routes,
-and its laws of transformation, and created the major highway system.
-
-Hazards
-=======
-
-Because magic is not truly controllable, CTK invariably, but unknowingly,
-creates dragons. Dragons are huge fire-breathing beasts which sometimes
-injure or kill travelers. Fortunately, they do not travel, but always
-remain near their den.
-
-Other hazards also exist which are potentially harmful. As the roads
-become older and more weatherbeaten, pot-holes will develop, trees will
-fall on travelers, etc. CTK maintenance men are called to fix these
-problems.
-
-Wizards
-=======
-
-The wizards play a major role in creating and maintaining the kingdom but
-get little credit for their work because it is performed secretly. The
-wizards do not wan the workers or travelers to learn their incantations
-because many laws would be broken and chaos would result.
-
-CTK's grand design is always general enough to be applicable in many
-different situations. As a result, it is often difficult to use. The
-first duty of the wizards is to tailor the transformation laws so as to be
-more beneficial and easier to use in their particular environment.
-
-After creation of the kingdom, a major duty of the wizards is to search for
-and kill dragons. If travelers do not return on time or if they return
-injured, the ruler of the country contacts the wizards. If the wizards
-determine that the injury or death occurred due to the traveler's
-negligence, they provide the traveler's country with additional warnings.
-If not, they must determine if the cause was a road hazard or a dragon. If
-the suspect a road hazard, they call in a CTK maintenance man to locate the
-hazard and to eliminate it, as in repairing the pothole in the road. If
-they think that cause was a dragon, then they must find and slay it.
-
-The most difficult part of eliminating a dragon is finding it. Sometimes
-the wizard magically knows where the dragon's lair it, but often the wizard
-must send another traveler along the same route and watch to see where he
-disappears. This sounds like a failsafe method for finding dragons (and a
-suicide mission for thr traveler) but the second traveler does not always
-disappear. Some dragons eat any traveler who comes too close; others are
-very picky.
-
-The wizards may call in CTK who designed the highway system and
-transformation laws to help devise a way to locate the dragon. CTK also
-helps provide the right spell or incantation to slay the dragon. (There is
-no general spell to slay dragons; each dragon must be eliminated with a
-different spell.)
-
-Because neither CTK nor wizards are perfect, spells to not always work
-correctly. At best, nothing happens when the wrong spell is uttered. At
-worst, the dragon becomes a much larger dragon or multiplies into several
-smaller ones. In either case, new spells must be found.
-
-If all existing dragons are quiet (i.e. have eaten sufficiently), wizards
-have time to do other things. They hide in castles and practice spells and
-incatations. They also devise shortcuts for travelers and new laws of
-transformation.
-
-Changes in the Kingdom
-======================
-
-As new transformation kingdoms are created and old ones are maintained,
-CTK, Inc. is constantly learning new things. It learns ways to avoid
-creating some of the dragons that they have previously created. It also
-discovers new and better laws of transformation. As a result, CTK will
-periodically create a new grand design which is far better than the old.
-The wizards determine when is a good time to implement this new design.
-This is when the tourist season is slow or when no important travelers
-(VIPs) are to arrive. The kingdom must be closed for the actual
-implementation and is leter reopened as a new and better place to go.
-
-A final question you might ask is what happens when the number of tourists
-becomes too great for the kingdom to handle in a reasonable period of time
-(i.e., the tourist lines at the ports are too long). The Kingdom of
-Transformation has three options: (1) shorten the paths that a tourist must
-travel, or (2) convince CTK to develop a faster breed of horses so that the
-travelers can finish sooner, or (3) annex more territories so that the
-kingdom can handle more travelers.
-
-Thus ends the story of the Kingdom of Transformation. I hope this has
-explained my job to you: I slay dragons for a living.
-
-#
-#should do an automatic undivert..
-#
diff --git a/usr.bin/m4/eval.c b/usr.bin/m4/eval.c
deleted file mode 100644
index 060ce03..0000000
--- a/usr.bin/m4/eval.c
+++ /dev/null
@@ -1,1063 +0,0 @@
-/* $OpenBSD: eval.c,v 1.44 2002/04/26 16:15:16 espie Exp $ */
-/* $NetBSD: eval.c,v 1.7 1996/11/10 21:21:29 pk Exp $ */
-
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ozan Yigit at York University.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)eval.c 8.2 (Berkeley) 4/27/95";
-#else
-#if 0
-static char rcsid[] = "$OpenBSD: eval.c,v 1.44 2002/04/26 16:15:16 espie Exp $";
-#endif
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * eval.c
- * Facility: m4 macro processor
- * by: oz
- */
-
-#include <sys/types.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include <fcntl.h>
-#include <err.h>
-#include "mdef.h"
-#include "stdd.h"
-#include "extern.h"
-#include "pathnames.h"
-
-#define BUILTIN_MARKER "__builtin_"
-
-static void dodefn(const char *);
-static void dopushdef(const char *, const char *);
-static void dodump(const char *[], int);
-static void dotrace(const char *[], int, int);
-static void doifelse(const char *[], int);
-static int doincl(const char *);
-static int dopaste(const char *);
-static void gnu_dochq(const char *[], int);
-static void dochq(const char *[], int);
-static void gnu_dochc(const char *[], int);
-static void dochc(const char *[], int);
-static void dodiv(int);
-static void doundiv(const char *[], int);
-static void dosub(const char *[], int);
-static void map(char *, const char *, const char *, const char *);
-static const char *handledash(char *, char *, const char *);
-static void expand_builtin(const char *[], int, int);
-static void expand_macro(const char *[], int);
-static void dump_one_def(ndptr);
-
-unsigned long expansion_id;
-
-/*
- * eval - eval all macros and builtins calls
- * argc - number of elements in argv.
- * argv - element vector :
- * argv[0] = definition of a user
- * macro or nil if built-in.
- * argv[1] = name of the macro or
- * built-in.
- * argv[2] = parameters to user-defined
- * . macro or built-in.
- * .
- *
- * A call in the form of macro-or-builtin() will result in:
- * argv[0] = nullstr
- * argv[1] = macro-or-builtin
- * argv[2] = nullstr
- *
- * argc is 3 for macro-or-builtin() and 2 for macro-or-builtin
- */
-void
-eval(const char *argv[], int argc, int td)
-{
- ssize_t mark = -1;
-
- expansion_id++;
- if (td & RECDEF)
- errx(1, "%s at line %lu: expanding recursive definition for %s",
- CURRENT_NAME, CURRENT_LINE, argv[1]);
- if (traced_macros && is_traced(argv[1]))
- mark = trace(argv, argc, infile+ilevel);
- if (td == MACRTYPE)
- expand_macro(argv, argc);
- else
- expand_builtin(argv, argc, td);
- if (mark != -1)
- finish_trace(mark);
-}
-
-/*
- * expand_builtin - evaluate built-in macros.
- */
-void
-expand_builtin(const char *argv[], int argc, int td)
-{
- int c, n;
- int ac;
- static int sysval = 0;
-
-#ifdef DEBUG
- printf("argc = %d\n", argc);
- for (n = 0; n < argc; n++)
- printf("argv[%d] = %s\n", n, argv[n]);
- fflush(stdout);
-#endif
-
- /*
- * if argc == 3 and argv[2] is null, then we
- * have macro-or-builtin() type call. We adjust
- * argc to avoid further checking..
- */
- ac = argc;
-
- if (argc == 3 && !*(argv[2]))
- argc--;
-
- switch (td & TYPEMASK) {
-
- case DEFITYPE:
- if (argc > 2)
- dodefine(argv[2], (argc > 3) ? argv[3] : null);
- break;
-
- case PUSDTYPE:
- if (argc > 2)
- dopushdef(argv[2], (argc > 3) ? argv[3] : null);
- break;
-
- case DUMPTYPE:
- dodump(argv, argc);
- break;
-
- case TRACEONTYPE:
- dotrace(argv, argc, 1);
- break;
-
- case TRACEOFFTYPE:
- dotrace(argv, argc, 0);
- break;
-
- case EXPRTYPE:
- /*
- * doexpr - evaluate arithmetic
- * expression
- */
- if (argc > 2)
- pbnum(expr(argv[2]));
- break;
-
- case IFELTYPE:
- if (argc > 4)
- doifelse(argv, argc);
- break;
-
- case IFDFTYPE:
- /*
- * doifdef - select one of two
- * alternatives based on the existence of
- * another definition
- */
- if (argc > 3) {
- if (lookup(argv[2]) != nil)
- pbstr(argv[3]);
- else if (argc > 4)
- pbstr(argv[4]);
- }
- break;
-
- case LENGTYPE:
- /*
- * dolen - find the length of the
- * argument
- */
- pbnum((argc > 2) ? strlen(argv[2]) : 0);
- break;
-
- case INCRTYPE:
- /*
- * doincr - increment the value of the
- * argument
- */
- if (argc > 2)
- pbnum(atoi(argv[2]) + 1);
- break;
-
- case DECRTYPE:
- /*
- * dodecr - decrement the value of the
- * argument
- */
- if (argc > 2)
- pbnum(atoi(argv[2]) - 1);
- break;
-
- case SYSCTYPE:
- /*
- * dosys - execute system command
- */
- if (argc > 2) {
- fflush(NULL);
- sysval = system(argv[2]);
- }
- break;
-
- case SYSVTYPE:
- /*
- * dosysval - return value of the last
- * system call.
- *
- */
- pbnum(sysval);
- break;
-
- case ESYSCMDTYPE:
- if (argc > 2)
- doesyscmd(argv[2]);
- break;
- case INCLTYPE:
- if (argc > 2)
- if (!doincl(argv[2]))
- err(1, "%s at line %lu: include(%s)",
- CURRENT_NAME, CURRENT_LINE, argv[2]);
- break;
-
- case SINCTYPE:
- if (argc > 2)
- (void) doincl(argv[2]);
- break;
-#ifdef EXTENDED
- case PASTTYPE:
- if (argc > 2)
- if (!dopaste(argv[2]))
- err(1, "%s at line %lu: paste(%s)",
- CURRENT_NAME, CURRENT_LINE, argv[2]);
- break;
-
- case SPASTYPE:
- if (argc > 2)
- (void) dopaste(argv[2]);
- break;
-#endif
- case CHNQTYPE:
- if (mimic_gnu)
- gnu_dochq(argv, ac);
- else
- dochq(argv, argc);
- break;
-
- case CHNCTYPE:
- if (mimic_gnu)
- gnu_dochc(argv, ac);
- else
- dochc(argv, argc);
- break;
-
- case SUBSTYPE:
- /*
- * dosub - select substring
- *
- */
- if (argc > 3)
- dosub(argv, argc);
- break;
-
- case SHIFTYPE:
- /*
- * doshift - push back all arguments
- * except the first one (i.e. skip
- * argv[2])
- */
- if (argc > 3) {
- for (n = argc - 1; n > 3; n--) {
- pbstr(rquote);
- pbstr(argv[n]);
- pbstr(lquote);
- putback(COMMA);
- }
- pbstr(rquote);
- pbstr(argv[3]);
- pbstr(lquote);
- }
- break;
-
- case DIVRTYPE:
- if (argc > 2 && (n = atoi(argv[2])) != 0)
- dodiv(n);
- else {
- active = stdout;
- oindex = 0;
- }
- break;
-
- case UNDVTYPE:
- doundiv(argv, argc);
- break;
-
- case DIVNTYPE:
- /*
- * dodivnum - return the number of
- * current output diversion
- */
- pbnum(oindex);
- break;
-
- case UNDFTYPE:
- /*
- * doundefine - undefine a previously
- * defined macro(s) or m4 keyword(s).
- */
- if (argc > 2)
- for (n = 2; n < argc; n++)
- remhash(argv[n], ALL);
- break;
-
- case POPDTYPE:
- /*
- * dopopdef - remove the topmost
- * definitions of macro(s) or m4
- * keyword(s).
- */
- if (argc > 2)
- for (n = 2; n < argc; n++)
- remhash(argv[n], TOP);
- break;
-
- case MKTMTYPE:
- /*
- * dotemp - create a temporary file
- */
- if (argc > 2) {
- int fd;
- char *temp;
-
- temp = xstrdup(argv[2]);
-
- fd = mkstemp(temp);
- if (fd == -1)
- err(1,
- "%s at line %lu: couldn't make temp file %s",
- CURRENT_NAME, CURRENT_LINE, argv[2]);
- close(fd);
- pbstr(temp);
- free(temp);
- }
- break;
-
- case TRNLTYPE:
- /*
- * dotranslit - replace all characters in
- * the source string that appears in the
- * "from" string with the corresponding
- * characters in the "to" string.
- */
- if (argc > 3) {
- char *temp;
-
- temp = xalloc(strlen(argv[2])+1);
- if (argc > 4)
- map(temp, argv[2], argv[3], argv[4]);
- else
- map(temp, argv[2], argv[3], null);
- pbstr(temp);
- free(temp);
- } else if (argc > 2)
- pbstr(argv[2]);
- break;
-
- case INDXTYPE:
- /*
- * doindex - find the index of the second
- * argument string in the first argument
- * string. -1 if not present.
- */
- pbnum((argc > 3) ? indx(argv[2], argv[3]) : -1);
- break;
-
- case ERRPTYPE:
- /*
- * doerrp - print the arguments to stderr
- * file
- */
- if (argc > 2) {
- for (n = 2; n < argc; n++)
- fprintf(stderr, "%s ", argv[n]);
- fprintf(stderr, "\n");
- }
- break;
-
- case DNLNTYPE:
- /*
- * dodnl - eat-up-to and including
- * newline
- */
- while ((c = gpbc()) != '\n' && c != EOF)
- ;
- break;
-
- case M4WRTYPE:
- /*
- * dom4wrap - set up for
- * wrap-up/wind-down activity
- */
- m4wraps = (argc > 2) ? xstrdup(argv[2]) : null;
- break;
-
- case EXITTYPE:
- /*
- * doexit - immediate exit from m4.
- */
- killdiv();
- exit((argc > 2) ? atoi(argv[2]) : 0);
- break;
-
- case DEFNTYPE:
- if (argc > 2)
- for (n = 2; n < argc; n++)
- dodefn(argv[n]);
- break;
-
- case INDIRTYPE: /* Indirect call */
- if (argc > 2)
- doindir(argv, argc);
- break;
-
- case BUILTINTYPE: /* Builtins only */
- if (argc > 2)
- dobuiltin(argv, argc);
- break;
-
- case PATSTYPE:
- if (argc > 2)
- dopatsubst(argv, argc);
- break;
- case REGEXPTYPE:
- if (argc > 2)
- doregexp(argv, argc);
- break;
- case LINETYPE:
- doprintlineno(infile+ilevel);
- break;
- case FILENAMETYPE:
- doprintfilename(infile+ilevel);
- break;
- case SELFTYPE:
- pbstr(rquote);
- pbstr(argv[1]);
- pbstr(lquote);
- break;
- default:
- errx(1, "%s at line %lu: eval: major botch.",
- CURRENT_NAME, CURRENT_LINE);
- break;
- }
-}
-
-/*
- * expand_macro - user-defined macro expansion
- */
-void
-expand_macro(const char *argv[], int argc)
-{
- const char *t;
- const char *p;
- int n;
- int argno;
-
- t = argv[0]; /* defn string as a whole */
- p = t;
- while (*p)
- p++;
- p--; /* last character of defn */
- while (p > t) {
- if (*(p - 1) != ARGFLAG)
- PUTBACK(*p);
- else {
- switch (*p) {
-
- case '#':
- pbnum(argc - 2);
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- if ((argno = *p - '0') < argc - 1)
- pbstr(argv[argno + 1]);
- break;
- case '*':
- if (argc > 2) {
- for (n = argc - 1; n > 2; n--) {
- pbstr(argv[n]);
- putback(COMMA);
- }
- pbstr(argv[2]);
- }
- break;
- case '@':
- if (argc > 2) {
- for (n = argc - 1; n > 2; n--) {
- pbstr(rquote);
- pbstr(argv[n]);
- pbstr(lquote);
- putback(COMMA);
- }
- pbstr(rquote);
- pbstr(argv[2]);
- pbstr(lquote);
- }
- break;
- default:
- PUTBACK(*p);
- PUTBACK('$');
- break;
- }
- p--;
- }
- p--;
- }
- if (p == t) /* do last character */
- PUTBACK(*p);
-}
-
-/*
- * dodefine - install definition in the table
- */
-void
-dodefine(const char *name, const char *defn)
-{
- ndptr p;
- int n;
-
- if (!*name)
- errx(1, "%s at line %lu: null definition.", CURRENT_NAME,
- CURRENT_LINE);
- if ((p = lookup(name)) == nil)
- p = addent(name);
- else if (p->defn != null)
- free((char *) p->defn);
- if (strncmp(defn, BUILTIN_MARKER, sizeof(BUILTIN_MARKER)-1) == 0) {
- n = builtin_type(defn+sizeof(BUILTIN_MARKER)-1);
- if (n != -1) {
- p->type = n & TYPEMASK;
- if ((n & NOARGS) == 0)
- p->type |= NEEDARGS;
- p->defn = null;
- return;
- }
- }
- if (!*defn)
- p->defn = null;
- else
- p->defn = xstrdup(defn);
- p->type = MACRTYPE;
- if (STREQ(name, defn))
- p->type |= RECDEF;
-}
-
-/*
- * dodefn - push back a quoted definition of
- * the given name.
- */
-static void
-dodefn(const char *name)
-{
- ndptr p;
- const char *real;
-
- if ((p = lookup(name)) != nil) {
- if (p->defn != null) {
- pbstr(rquote);
- pbstr(p->defn);
- pbstr(lquote);
- } else if ((real = builtin_realname(p->type)) != NULL) {
- pbstr(real);
- pbstr(BUILTIN_MARKER);
- }
- }
-}
-
-/*
- * dopushdef - install a definition in the hash table
- * without removing a previous definition. Since
- * each new entry is entered in *front* of the
- * hash bucket, it hides a previous definition from
- * lookup.
- */
-static void
-dopushdef(const char *name, const char *defn)
-{
- ndptr p;
-
- if (!*name)
- errx(1, "%s at line %lu: null definition", CURRENT_NAME,
- CURRENT_LINE);
- p = addent(name);
- if (!*defn)
- p->defn = null;
- else
- p->defn = xstrdup(defn);
- p->type = MACRTYPE;
- if (STREQ(name, defn))
- p->type |= RECDEF;
-}
-
-/*
- * dump_one_def - dump the specified definition.
- */
-static void
-dump_one_def(ndptr p)
-{
- const char *real;
-
- if (mimic_gnu) {
- if ((p->type & TYPEMASK) == MACRTYPE)
- fprintf(traceout, "%s:\t%s\n", p->name, p->defn);
- else {
- real = builtin_realname(p->type);
- if (real == NULL)
- real = null;
- fprintf(traceout, "%s:\t<%s>\n", p->name, real);
- }
- } else
- fprintf(traceout, "`%s'\t`%s'\n", p->name, p->defn);
-}
-
-/*
- * dodumpdef - dump the specified definitions in the hash
- * table to stderr. If nothing is specified, the entire
- * hash table is dumped.
- */
-static void
-dodump(const char *argv[], int argc)
-{
- int n;
- ndptr p;
-
- if (argc > 2) {
- for (n = 2; n < argc; n++)
- if ((p = lookup(argv[n])) != nil)
- dump_one_def(p);
- } else {
- for (n = 0; n < HASHSIZE; n++)
- for (p = hashtab[n]; p != nil; p = p->nxtptr)
- dump_one_def(p);
- }
-}
-
-/*
- * dotrace - mark some macros as traced/untraced depending upon on.
- */
-static void
-dotrace(const char *argv[], int argc, int on)
-{
- int n;
-
- if (argc > 2) {
- for (n = 2; n < argc; n++)
- mark_traced(argv[n], on);
- } else
- mark_traced(NULL, on);
-}
-
-/*
- * doifelse - select one of two alternatives - loop.
- */
-static void
-doifelse(const char *argv[], int argc)
-{
- cycle {
- if (STREQ(argv[2], argv[3]))
- pbstr(argv[4]);
- else if (argc == 6)
- pbstr(argv[5]);
- else if (argc > 6) {
- argv += 3;
- argc -= 3;
- continue;
- }
- break;
- }
-}
-
-/*
- * doinclude - include a given file.
- */
-static int
-doincl(const char *ifile)
-{
- if (ilevel + 1 == MAXINP)
- errx(1, "%s at line %lu: too many include files.",
- CURRENT_NAME, CURRENT_LINE);
- if (fopen_trypath(infile+ilevel+1, ifile) != NULL) {
- ilevel++;
- if ((inname[ilevel] = strdup(ifile)) == NULL)
- err(1, NULL);
- inlineno[ilevel] = 1;
- bbase[ilevel] = bufbase = bp;
- emitline();
- return (1);
- } else
- return (0);
-}
-
-#ifdef EXTENDED
-/*
- * dopaste - include a given file without any
- * macro processing.
- */
-static int
-dopaste(const char *pfile)
-{
- FILE *pf;
- int c;
-
- if ((pf = fopen(pfile, "r")) != NULL) {
- fprintf(active, "#line 1 \"%s\"\n", pfile);
- while ((c = getc(pf)) != EOF)
- putc(c, active);
- (void) fclose(pf);
- emitline();
- return (1);
- } else
- return (0);
-}
-#endif
-
-static void
-gnu_dochq(const char *argv[], int ac)
-{
- /* In gnu-m4 mode, the only way to restore quotes is to have no
- * arguments at all. */
- if (ac == 2) {
- lquote[0] = LQUOTE, lquote[1] = EOS;
- rquote[0] = RQUOTE, rquote[1] = EOS;
- } else {
- strlcpy(lquote, argv[2], sizeof(lquote));
- if(ac > 3)
- strlcpy(rquote, argv[3], sizeof(rquote));
- else
- rquote[0] = EOS;
- }
-}
-
-/*
- * dochq - change quote characters
- */
-static void
-dochq(const char *argv[], int argc)
-{
- if (argc > 2) {
- if (*argv[2])
- strlcpy(lquote, argv[2], sizeof(lquote));
- else {
- lquote[0] = LQUOTE;
- lquote[1] = EOS;
- }
- if (argc > 3) {
- if (*argv[3])
- strlcpy(rquote, argv[3], sizeof(rquote));
- } else
- strcpy(rquote, lquote);
- } else {
- lquote[0] = LQUOTE, lquote[1] = EOS;
- rquote[0] = RQUOTE, rquote[1] = EOS;
- }
-}
-
-static void
-gnu_dochc(const char *argv[], int ac)
-{
- /* In gnu-m4 mode, no arguments mean no comment
- * arguments at all. */
- if (ac == 2) {
- scommt[0] = EOS;
- ecommt[0] = EOS;
- } else {
- if (*argv[2])
- strlcpy(scommt, argv[2], sizeof(scommt));
- else
- scommt[0] = SCOMMT, scommt[1] = EOS;
- if(ac > 3 && *argv[3])
- strlcpy(ecommt, argv[3], sizeof(ecommt));
- else
- ecommt[0] = ECOMMT, ecommt[1] = EOS;
- }
-}
-/*
- * dochc - change comment characters
- */
-static void
-dochc(const char *argv[], int argc)
-{
- if (argc > 2) {
- if (*argv[2])
- strlcpy(scommt, argv[2], sizeof(scommt));
- if (argc > 3) {
- if (*argv[3])
- strlcpy(ecommt, argv[3], sizeof(ecommt));
- }
- else
- ecommt[0] = ECOMMT, ecommt[1] = EOS;
- }
- else {
- scommt[0] = SCOMMT, scommt[1] = EOS;
- ecommt[0] = ECOMMT, ecommt[1] = EOS;
- }
-}
-
-/*
- * dodivert - divert the output to a temporary file
- */
-static void
-dodiv(int n)
-{
- int fd;
-
- oindex = n;
- if (n >= maxout) {
- if (mimic_gnu)
- resizedivs(n + 10);
- else
- n = 0; /* bitbucket */
- }
-
- if (n < 0)
- n = 0; /* bitbucket */
- if (outfile[n] == NULL) {
- char fname[] = _PATH_DIVNAME;
-
- if ((fd = mkstemp(fname)) < 0 ||
- (outfile[n] = fdopen(fd, "w+")) == NULL)
- err(1, "%s: cannot divert", fname);
- if (unlink(fname) == -1)
- err(1, "%s: cannot unlink", fname);
- }
- active = outfile[n];
-}
-
-/*
- * doundivert - undivert a specified output, or all
- * other outputs, in numerical order.
- */
-static void
-doundiv(const char *argv[], int argc)
-{
- int ind;
- int n;
-
- if (argc > 2) {
- for (ind = 2; ind < argc; ind++) {
- n = atoi(argv[ind]);
- if (n > 0 && n < maxout && outfile[n] != NULL)
- getdiv(n);
-
- }
- }
- else
- for (n = 1; n < maxout; n++)
- if (outfile[n] != NULL)
- getdiv(n);
-}
-
-/*
- * dosub - select substring
- */
-static void
-dosub(const char *argv[], int argc)
-{
- const char *ap, *fc, *k;
- int nc;
-
- ap = argv[2]; /* target string */
-#ifdef EXPR
- fc = ap + expr(argv[3]); /* first char */
-#else
- fc = ap + atoi(argv[3]); /* first char */
-#endif
- nc = strlen(fc);
- if (argc >= 5)
-#ifdef EXPR
- nc = min(nc, expr(argv[4]));
-#else
- nc = min(nc, atoi(argv[4]));
-#endif
- if (fc >= ap && fc < ap + strlen(ap))
- for (k = fc + nc - 1; k >= fc; k--)
- putback(*k);
-}
-
-/*
- * map:
- * map every character of s1 that is specified in from
- * into s3 and replace in s. (source s1 remains untouched)
- *
- * This is a standard implementation of map(s,from,to) function of ICON
- * language. Within mapvec, we replace every character of "from" with
- * the corresponding character in "to". If "to" is shorter than "from",
- * than the corresponding entries are null, which means that those
- * characters dissapear altogether. Furthermore, imagine
- * map(dest, "sourcestring", "srtin", "rn..*") type call. In this case,
- * `s' maps to `r', `r' maps to `n' and `n' maps to `*'. Thus, `s'
- * ultimately maps to `*'. In order to achieve this effect in an efficient
- * manner (i.e. without multiple passes over the destination string), we
- * loop over mapvec, starting with the initial source character. if the
- * character value (dch) in this location is different than the source
- * character (sch), sch becomes dch, once again to index into mapvec, until
- * the character value stabilizes (i.e. sch = dch, in other words
- * mapvec[n] == n). Even if the entry in the mapvec is null for an ordinary
- * character, it will stabilize, since mapvec[0] == 0 at all times. At the
- * end, we restore mapvec* back to normal where mapvec[n] == n for
- * 0 <= n <= 127. This strategy, along with the restoration of mapvec, is
- * about 5 times faster than any algorithm that makes multiple passes over
- * destination string.
- */
-static void
-map(char *dest, const char *src, const char *from, const char *to)
-{
- const char *tmp;
- unsigned char sch, dch;
- static char frombis[257];
- static char tobis[257];
- static unsigned char mapvec[256] = {
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
- 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
- 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
- 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
- 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
- 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102,
- 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
- 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
- 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141,
- 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154,
- 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167,
- 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180,
- 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193,
- 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206,
- 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
- 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232,
- 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245,
- 246, 247, 248, 249, 250, 251, 252, 253, 254, 255
- };
-
- if (*src) {
- if (mimic_gnu) {
- /*
- * expand character ranges on the fly
- */
- from = handledash(frombis, frombis + 256, from);
- to = handledash(tobis, tobis + 256, to);
- }
- tmp = from;
- /*
- * create a mapping between "from" and
- * "to"
- */
- while (*from)
- mapvec[(unsigned char)(*from++)] = (*to) ?
- (unsigned char)(*to++) : 0;
-
- while (*src) {
- sch = (unsigned char)(*src++);
- dch = mapvec[sch];
- while (dch != sch) {
- sch = dch;
- dch = mapvec[sch];
- }
- if ((*dest = (char)dch))
- dest++;
- }
- /*
- * restore all the changed characters
- */
- while (*tmp) {
- mapvec[(unsigned char)(*tmp)] = (unsigned char)(*tmp);
- tmp++;
- }
- }
- *dest = '\0';
-}
-
-
-/*
- * handledash:
- * use buffer to copy the src string, expanding character ranges
- * on the way.
- */
-static const char *
-handledash(char *buffer, char *end, const char *src)
-{
- char *p;
-
- p = buffer;
- while(*src) {
- if (src[1] == '-' && src[2]) {
- unsigned char i;
- for (i = (unsigned char)src[0];
- i <= (unsigned char)src[2]; i++) {
- *p++ = i;
- if (p == end) {
- *p = '\0';
- return buffer;
- }
- }
- src += 3;
- } else
- *p++ = *src++;
- if (p == end)
- break;
- }
- *p = '\0';
- return buffer;
-}
diff --git a/usr.bin/m4/expr.c b/usr.bin/m4/expr.c
deleted file mode 100644
index 2c0284b..0000000
--- a/usr.bin/m4/expr.c
+++ /dev/null
@@ -1,645 +0,0 @@
-/* $OpenBSD: expr.c,v 1.14 2002/04/26 16:15:16 espie Exp $ */
-/* $NetBSD: expr.c,v 1.7 1995/09/28 05:37:31 tls Exp $ */
-
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ozan Yigit at York University.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)expr.c 8.2 (Berkeley) 4/29/95";
-#else
-#if 0
-static char rcsid[] = "$OpenBSD: expr.c,v 1.14 2002/04/26 16:15:16 espie Exp $";
-#endif
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <ctype.h>
-#include <err.h>
-#include <stddef.h>
-#include <stdio.h>
-#include "mdef.h"
-#include "extern.h"
-
-/*
- * expression evaluator: performs a standard recursive
- * descent parse to evaluate any expression permissible
- * within the following grammar:
- *
- * expr : query EOS
- * query : lor
- * | lor "?" query ":" query
- * lor : land { "||" land }
- * land : bor { "&&" bor }
- * bor : xor { "|" xor }
- * xor : band { "^" eqrel }
- * band : eqrel { "&" eqrel }
- * eqrel : nerel { ("==" | "!=") nerel }
- * nerel : shift { ("<" | ">" | "<=" | ">=") shift }
- * shift : primary { ("<<" | ">>") primary }
- * primary : term { ("+" | "-") term }
- * term : exp { ("*" | "/" | "%") exp }
- * exp : unary { "**" unary }
- * unary : factor
- * | ("+" | "-" | "~" | "!") unary
- * factor : constant
- * | "(" query ")"
- * constant: num
- * | "'" CHAR "'"
- * num : DIGIT
- * | DIGIT num
- *
- *
- * This expression evaluator is lifted from a public-domain
- * C Pre-Processor included with the DECUS C Compiler distribution.
- * It is hacked somewhat to be suitable for m4.
- *
- * Originally by: Mike Lutz
- * Bob Harper
- */
-
-#define EQL 0
-#define NEQ 1
-#define LSS 2
-#define LEQ 3
-#define GTR 4
-#define GEQ 5
-#define OCTAL 8
-#define DECIMAL 10
-#define HEX 16
-
-static const char *nxtch; /* Parser scan pointer */
-static const char *where;
-
-static int query(int mayeval);
-static int lor(int mayeval);
-static int land(int mayeval);
-static int bor(int mayeval);
-static int xor(int mayeval);
-static int band(int mayeval);
-static int eqrel(int mayeval);
-static int nerel(int mayeval);
-static int shift(int mayeval);
-static int primary(int mayeval);
-static int term(int mayeval);
-static int exp(int mayeval);
-static int unary(int mayeval);
-static int factor(int mayeval);
-static int constant(int mayeval);
-static int num(int mayeval);
-static int geteqrel(int mayeval);
-static int skipws(void);
-static void experr(const char *);
-
-/*
- * For longjmp
- */
-#include <setjmp.h>
-static jmp_buf expjump;
-
-/*
- * macros:
- * ungetch - Put back the last character examined.
- * getch - return the next character from expr string.
- */
-#define ungetch() nxtch--
-#define getch() *nxtch++
-
-int
-expr(const char *expbuf)
-{
- int rval;
-
- nxtch = expbuf;
- where = expbuf;
- if (setjmp(expjump) != 0)
- return FALSE;
-
- rval = query(1);
- if (skipws() == EOS)
- return rval;
-
- printf("m4: ill-formed expression.\n");
- return FALSE;
-}
-
-/*
- * query : lor | lor '?' query ':' query
- */
-static int
-query(int mayeval)
-{
- int result, true_val, false_val;
-
- result = lor(mayeval);
- if (skipws() != '?') {
- ungetch();
- return result;
- }
-
- true_val = query(result);
- if (skipws() != ':')
- experr("bad query: missing \":\"");
-
- false_val = query(!result);
- return result ? true_val : false_val;
-}
-
-/*
- * lor : land { '||' land }
- */
-static int
-lor(int mayeval)
-{
- int c, vl, vr;
-
- vl = land(mayeval);
- while ((c = skipws()) == '|') {
- if (getch() != '|') {
- ungetch();
- break;
- }
- if (vl != 0)
- mayeval = 0;
- vr = land(mayeval);
- vl = vl || vr;
- }
-
- ungetch();
- return vl;
-}
-
-/*
- * land : not { '&&' not }
- */
-static int
-land(int mayeval)
-{
- int c, vl, vr;
-
- vl = bor(mayeval);
- while ((c = skipws()) == '&') {
- if (getch() != '&') {
- ungetch();
- break;
- }
- if (vl == 0)
- mayeval = 0;
- vr = bor(mayeval);
- vl = vl && vr;
- }
-
- ungetch();
- return vl;
-}
-
-/*
- * bor : xor { "|" xor }
- */
-static int
-bor(int mayeval)
-{
- int vl, vr, c, cr;
-
- vl = xor(mayeval);
- while ((c = skipws()) == '|') {
- cr = getch();
- ungetch();
- if (cr == '|')
- break;
- vr = xor(mayeval);
- vl |= vr;
- }
- ungetch();
- return (vl);
-}
-
-/*
- * xor : band { "^" band }
- */
-static int
-xor(int mayeval)
-{
- int vl, vr, c;
-
- vl = band(mayeval);
- while ((c = skipws()) == '^') {
- vr = band(mayeval);
- vl ^= vr;
- }
- ungetch();
- return (vl);
-}
-
-/*
- * band : eqrel { "&" eqrel }
- */
-static int
-band(int mayeval)
-{
- int c, cr, vl, vr;
-
- vl = eqrel(mayeval);
- while ((c = skipws()) == '&') {
- cr = getch();
- ungetch();
- if (cr == '&')
- break;
- vr = eqrel(mayeval);
- vl &= vr;
- }
- ungetch();
- return vl;
-}
-
-/*
- * eqrel : nerel { ("==" | "!=" ) nerel }
- */
-static int
-eqrel(int mayeval)
-{
- int vl, vr, c, cr;
-
- vl = nerel(mayeval);
- while ((c = skipws()) == '!' || c == '=') {
- if ((cr = getch()) != '=') {
- ungetch();
- break;
- }
- vr = nerel(mayeval);
- switch (c) {
- case '=':
- vl = (vl == vr);
- break;
- case '!':
- vl = (vl != vr);
- break;
- }
- }
- ungetch();
- return vl;
-}
-
-/*
- * nerel : shift { ("<=" | ">=" | "<" | ">") shift }
- */
-static int
-nerel(int mayeval)
-{
- int vl, vr, c, cr;
-
- vl = shift(mayeval);
- while ((c = skipws()) == '<' || c == '>') {
- if ((cr = getch()) != '=') {
- ungetch();
- cr = '\0';
- }
- vr = shift(mayeval);
- switch (c) {
- case '<':
- vl = (cr == '\0') ? (vl < vr) : (vl <= vr);
- break;
- case '>':
- vl = (cr == '\0') ? (vl > vr) : (vl >= vr);
- break;
- }
- }
- ungetch();
- return vl;
-}
-
-/*
- * shift : primary { ("<<" | ">>") primary }
- */
-static int
-shift(int mayeval)
-{
- int vl, vr, c;
-
- vl = primary(mayeval);
- while (((c = skipws()) == '<' || c == '>') && getch() == c) {
- vr = primary(mayeval);
-
- if (c == '<')
- vl <<= vr;
- else
- vl >>= vr;
- }
-
- if (c == '<' || c == '>')
- ungetch();
- ungetch();
- return vl;
-}
-
-/*
- * primary : term { ("+" | "-") term }
- */
-static int
-primary(int mayeval)
-{
- int c, vl, vr;
-
- vl = term(mayeval);
- while ((c = skipws()) == '+' || c == '-') {
- vr = term(mayeval);
-
- if (c == '+')
- vl += vr;
- else
- vl -= vr;
- }
-
- ungetch();
- return vl;
-}
-
-/*
- * term : exp { ("*" | "/" | "%") exp }
- */
-static int
-term(int mayeval)
-{
- int c, vl, vr;
-
- vl = exp(mayeval);
- while ((c = skipws()) == '*' || c == '/' || c == '%') {
- vr = exp(mayeval);
-
- switch (c) {
- case '*':
- vl *= vr;
- break;
- case '/':
- if (!mayeval)
- /* short-circuit */;
- else if (vr == 0)
- errx(1, "division by zero in eval.");
- else
- vl /= vr;
- break;
- case '%':
- if (!mayeval)
- /* short-circuit */;
- else if (vr == 0)
- errx(1, "modulo zero in eval.");
- else
- vl %= vr;
- break;
- }
- }
- ungetch();
- return vl;
-}
-
-/*
- * exp : unary { "**" exp }
- */
-static int
-exp(int mayeval)
-{
- int c, vl, vr, n;
-
- vl = unary(mayeval);
- while ((c = skipws()) == '*') {
- if (getch() != '*') {
- ungetch();
- break;
- }
- vr = unary(mayeval);
- n = 1;
- while (vr-- > 0)
- n *= vl;
- return n;
- }
-
- ungetch();
- return vl;
-}
-
-/*
- * unary : factor | ("+" | "-" | "~" | "!") unary
- */
-static int
-unary(int mayeval)
-{
- int val, c;
-
- if ((c = skipws()) == '+' || c == '-' || c == '~' || c == '!') {
- val = unary(mayeval);
-
- switch (c) {
- case '+':
- return val;
- case '-':
- return -val;
- case '~':
- return ~val;
- case '!':
- return !val;
- }
- }
-
- ungetch();
- return factor(mayeval);
-}
-
-/*
- * factor : constant | '(' query ')'
- */
-static int
-factor(int mayeval)
-{
- int val;
-
- if (skipws() == '(') {
- val = query(mayeval);
- if (skipws() != ')')
- experr("bad factor: missing \")\"");
- return val;
- }
-
- ungetch();
- return constant(mayeval);
-}
-
-/*
- * constant: num | 'char'
- * Note: constant() handles multi-byte constants
- */
-static int
-constant(int mayeval)
-{
- int i;
- int value;
- int c;
- int v[sizeof(int)];
-
- if (skipws() != '\'') {
- ungetch();
- return num(mayeval);
- }
- for (i = 0; i < (ssize_t)sizeof(int); i++) {
- if ((c = getch()) == '\'') {
- ungetch();
- break;
- }
- if (c == '\\') {
- switch (c = getch()) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- ungetch();
- c = num(mayeval);
- break;
- case 'n':
- c = 012;
- break;
- case 'r':
- c = 015;
- break;
- case 't':
- c = 011;
- break;
- case 'b':
- c = 010;
- break;
- case 'f':
- c = 014;
- break;
- }
- }
- v[i] = c;
- }
- if (i == 0 || getch() != '\'')
- experr("illegal character constant");
- for (value = 0; --i >= 0;) {
- value <<= 8;
- value += v[i];
- }
- return value;
-}
-
-/*
- * num : digit | num digit
- */
-static int
-num(int mayeval)
-{
- int rval, c, base;
- int ndig;
-
- rval = 0;
- ndig = 0;
- c = skipws();
- if (c == '0') {
- c = skipws();
- if (c == 'x' || c == 'X') {
- base = HEX;
- c = skipws();
- } else {
- base = OCTAL;
- ndig++;
- }
- } else
- base = DECIMAL;
- for(;;) {
- switch(c) {
- case '8': case '9':
- if (base == OCTAL)
- goto bad_digit;
- /*FALLTHRU*/
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- rval *= base;
- rval += c - '0';
- break;
- case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
- c = tolower(c);
- case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
- if (base == HEX) {
- rval *= base;
- rval += c - 'a' + 10;
- break;
- }
- /*FALLTHRU*/
- default:
- goto bad_digit;
- }
- c = getch();
- ndig++;
- }
-bad_digit:
- ungetch();
-
- if (ndig == 0)
- experr("bad constant");
-
- return rval;
-}
-
-/*
- * Skip over any white space and return terminating char.
- */
-static int
-skipws(void)
-{
- int c;
-
- while ((c = getch()) <= ' ' && c > EOS)
- ;
- return c;
-}
-
-/*
- * resets environment to eval(), prints an error
- * and forces eval to return FALSE.
- */
-static void
-experr(const char *msg)
-{
- printf("m4: %s in expr %s.\n", msg, where);
- longjmp(expjump, -1);
-}
diff --git a/usr.bin/m4/extern.h b/usr.bin/m4/extern.h
deleted file mode 100644
index e96870b..0000000
--- a/usr.bin/m4/extern.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/* $OpenBSD: extern.h,v 1.29 2002/02/16 21:27:48 millert Exp $ */
-/* $NetBSD: extern.h,v 1.3 1996/01/13 23:25:24 pk Exp $ */
-
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ozan Yigit at York University.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-/* eval.c */
-extern void eval(const char *[], int, int);
-extern void dodefine(const char *, const char *);
-extern unsigned long expansion_id;
-
-/* expr.c */
-extern int expr(const char *);
-
-/* gnum4.c */
-extern void addtoincludepath(const char *);
-extern struct input_file *fopen_trypath(struct input_file *, const char *);
-extern void doindir(const char *[], int);
-extern void dobuiltin(const char *[], int);
-extern void dopatsubst(const char *[], int);
-extern void doregexp(const char *[], int);
-
-extern void doprintlineno(struct input_file *);
-extern void doprintfilename(struct input_file *);
-
-extern void doesyscmd(const char *);
-
-
-/* look.c */
-extern ndptr addent(const char *);
-extern unsigned hash(const char *);
-extern ndptr lookup(const char *);
-extern void remhash(const char *, int);
-
-/* main.c */
-extern void outputstr(const char *);
-extern int builtin_type(const char *);
-extern const char *builtin_realname(int);
-extern void emitline(void);
-
-/* misc.c */
-extern void chrsave(int);
-extern char *compute_prevep(void);
-extern void getdiv(int);
-extern ptrdiff_t indx(const char *, const char *);
-extern void initspaces(void);
-extern void killdiv(void);
-extern void onintr(int);
-extern void pbnum(int);
-extern void pbunsigned(unsigned long);
-extern void pbstr(const char *);
-extern void putback(int);
-extern void *xalloc(size_t);
-extern char *xstrdup(const char *);
-extern void usage(void);
-extern void resizedivs(int);
-extern size_t buffer_mark(void);
-extern void dump_buffer(FILE *, size_t);
-
-extern int obtain_char(struct input_file *);
-extern void set_input(struct input_file *, FILE *, const char *);
-extern void release_input(struct input_file *);
-
-/* speeded-up versions of chrsave/putback */
-#define PUTBACK(c) \
- do { \
- if (bp >= endpbb) \
- enlarge_bufspace(); \
- *bp++ = (c); \
- } while(0)
-
-#define CHRSAVE(c) \
- do { \
- if (ep >= endest) \
- enlarge_strspace(); \
- *ep++ = (c); \
- } while(0)
-
-/* and corresponding exposure for local symbols */
-extern void enlarge_bufspace(void);
-extern void enlarge_strspace(void);
-extern char *endpbb;
-extern char *endest;
-
-/* trace.c */
-extern void mark_traced(const char *, int);
-extern int is_traced(const char *);
-extern void trace_file(const char *);
-extern ssize_t trace(const char **, int, struct input_file *);
-extern void finish_trace(size_t);
-extern int traced_macros;
-extern void set_trace_flags(const char *);
-extern FILE *traceout;
-
-extern ndptr hashtab[]; /* hash table for macros etc. */
-extern stae *mstack; /* stack of m4 machine */
-extern char *sstack; /* shadow stack, for string space extension */
-extern FILE *active; /* active output file pointer */
-extern struct input_file infile[];/* input file stack (0=stdin) */
-extern char *inname[]; /* names of these input files */
-extern int inlineno[]; /* current number in each input file */
-extern FILE **outfile; /* diversion array(0=bitbucket) */
-extern int maxout; /* maximum number of diversions */
-extern int fp; /* m4 call frame pointer */
-extern int ilevel; /* input file stack pointer */
-extern int oindex; /* diversion index. */
-extern int sp; /* current m4 stack pointer */
-extern char *bp; /* first available character */
-extern char *buf; /* push-back buffer */
-extern char *bufbase; /* buffer base for this ilevel */
-extern char *bbase[]; /* buffer base per ilevel */
-extern char ecommt[MAXCCHARS+1];/* end character for comment */
-extern char *ep; /* first free char in strspace */
-extern char lquote[MAXCCHARS+1];/* left quote character (`) */
-extern const char *m4wraps; /* m4wrap string default. */
-extern char null[]; /* as it says.. just a null. */
-extern char rquote[MAXCCHARS+1];/* right quote character (') */
-extern char scommt[MAXCCHARS+1];/* start character for comment */
-extern int synccpp; /* Line synchronisation for C preprocessor */
-
-extern int mimic_gnu; /* behaves like gnu-m4 */
-
-/* get a possibly pushed-back-character, increment lineno if need be */
-static __inline int gpbc(void)
-{
- int chscratch; /* Scratch space. */
-
- if (bp > bufbase) {
- if (*--bp)
- return ((unsigned char)*bp);
- else
- return (EOF);
- }
- chscratch = obtain_char(infile+ilevel);
- if (chscratch == '\n')
- ++inlineno[ilevel];
- return (chscratch);
-}
diff --git a/usr.bin/m4/gnum4.c b/usr.bin/m4/gnum4.c
deleted file mode 100644
index f4cfa77..0000000
--- a/usr.bin/m4/gnum4.c
+++ /dev/null
@@ -1,520 +0,0 @@
-/* $OpenBSD: gnum4.c,v 1.18 2002/04/26 16:15:16 espie Exp $ */
-
-/*
- * Copyright (c) 1999 Marc Espie
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * functions needed to support gnu-m4 extensions, including a fake freezing
- */
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <ctype.h>
-#include <paths.h>
-#include <regex.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <err.h>
-#include <errno.h>
-#include <unistd.h>
-#include "mdef.h"
-#include "stdd.h"
-#include "extern.h"
-
-
-int mimic_gnu = 0;
-
-/*
- * Support for include path search
- * First search in the the current directory.
- * If not found, and the path is not absolute, include path kicks in.
- * First, -I options, in the order found on the command line.
- * Then M4PATH env variable
- */
-
-struct path_entry {
- char *name;
- struct path_entry *next;
-} *first, *last;
-
-static struct path_entry *new_path_entry(const char *);
-static void ensure_m4path(void);
-static struct input_file *dopath(struct input_file *, const char *);
-
-static struct path_entry *
-new_path_entry(const char *dirname)
-{
- struct path_entry *n;
-
- n = malloc(sizeof(struct path_entry));
- if (!n)
- errx(1, "out of memory");
- n->name = strdup(dirname);
- if (!n->name)
- errx(1, "out of memory");
- n->next = 0;
- return n;
-}
-
-void
-addtoincludepath(const char *dirname)
-{
- struct path_entry *n;
-
- n = new_path_entry(dirname);
-
- if (last) {
- last->next = n;
- last = n;
- }
- else
- last = first = n;
-}
-
-static void
-ensure_m4path(void)
-{
- static int envpathdone = 0;
- char *envpath;
- char *sweep;
- char *path;
-
- if (envpathdone)
- return;
- envpathdone = TRUE;
- envpath = getenv("M4PATH");
- if (!envpath)
- return;
- /* for portability: getenv result is read-only */
- envpath = strdup(envpath);
- if (!envpath)
- errx(1, "out of memory");
- for (sweep = envpath;
- (path = strsep(&sweep, ":")) != NULL;)
- addtoincludepath(path);
- free(envpath);
-}
-
-static
-struct input_file *
-dopath(struct input_file *i, const char *filename)
-{
- char path[MAXPATHLEN];
- struct path_entry *pe;
- FILE *f;
-
- for (pe = first; pe; pe = pe->next) {
- snprintf(path, sizeof(path), "%s/%s", pe->name, filename);
- if ((f = fopen(path, "r")) != NULL) {
- set_input(i, f, path);
- return i;
- }
- }
- return NULL;
-}
-
-struct input_file *
-fopen_trypath(struct input_file *i, const char *filename)
-{
- FILE *f;
-
- f = fopen(filename, "r");
- if (f != NULL) {
- set_input(i, f, filename);
- return i;
- }
- if (filename[0] == '/')
- return NULL;
-
- ensure_m4path();
-
- return dopath(i, filename);
-}
-
-void
-doindir(const char *argv[], int argc)
-{
- ndptr p;
-
- p = lookup(argv[2]);
- if (p == NULL)
- errx(1, "undefined macro %s", argv[2]);
- argv[1] = p->defn;
- eval(argv+1, argc-1, p->type);
-}
-
-void
-dobuiltin(const char *argv[], int argc)
-{
- int n;
- argv[1] = NULL;
- n = builtin_type(argv[2]);
- if (n != -1)
- eval(argv+1, argc-1, n);
- else
- errx(1, "unknown builtin %s", argv[2]);
-}
-
-
-/* We need some temporary buffer space, as pb pushes BACK and substitution
- * proceeds forward... */
-static char *buffer;
-static size_t bufsize = 0;
-static size_t current = 0;
-
-static void addchars(const char *, size_t);
-static void addchar(int);
-static char *twiddle(const char *);
-static char *getstring(void);
-static void exit_regerror(int, regex_t *);
-static void do_subst(const char *, regex_t *, const char *, regmatch_t *);
-static void do_regexpindex(const char *, regex_t *, regmatch_t *);
-static void do_regexp(const char *, regex_t *, const char *, regmatch_t *);
-static void add_sub(size_t, const char *, regex_t *, regmatch_t *);
-static void add_replace(const char *, regex_t *, const char *, regmatch_t *);
-#define addconstantstring(s) addchars((s), sizeof(s)-1)
-
-static void
-addchars(const char *c, size_t n)
-{
- if (n == 0)
- return;
- while (current + n > bufsize) {
- if (bufsize == 0)
- bufsize = 1024;
- else
- bufsize *= 2;
- buffer = realloc(buffer, bufsize);
- if (buffer == NULL)
- errx(1, "out of memory");
- }
- memcpy(buffer+current, c, n);
- current += n;
-}
-
-static void
-addchar(int c)
-{
- if (current +1 > bufsize) {
- if (bufsize == 0)
- bufsize = 1024;
- else
- bufsize *= 2;
- buffer = realloc(buffer, bufsize);
- if (buffer == NULL)
- errx(1, "out of memory");
- }
- buffer[current++] = c;
-}
-
-static char *
-getstring(void)
-{
- addchar('\0');
- current = 0;
- return buffer;
-}
-
-
-static void
-exit_regerror(int er, regex_t *re)
-{
- size_t errlen;
- char *errbuf;
-
- errlen = regerror(er, re, NULL, 0);
- errbuf = xalloc(errlen);
- regerror(er, re, errbuf, errlen);
- errx(1, "regular expression error: %s", errbuf);
-}
-
-static void
-add_sub(size_t n, const char *string, regex_t *re, regmatch_t *pm)
-{
- if (n > re->re_nsub)
- warnx("No subexpression %zu", n);
- /* Subexpressions that did not match are
- * not an error. */
- else if (pm[n].rm_so != -1 &&
- pm[n].rm_eo != -1) {
- addchars(string + pm[n].rm_so,
- pm[n].rm_eo - pm[n].rm_so);
- }
-}
-
-/* Add replacement string to the output buffer, recognizing special
- * constructs and replacing them with substrings of the original string.
- */
-static void
-add_replace(const char *string, regex_t *re, const char *replace, regmatch_t *pm)
-{
- const char *p;
-
- for (p = replace; *p != '\0'; p++) {
- if (*p == '&' && !mimic_gnu) {
- add_sub(0, string, re, pm);
- continue;
- }
- if (*p == '\\') {
- if (p[1] == '\\') {
- addchar(p[1]);
- p++;
- continue;
- }
- if (p[1] == '&') {
- if (mimic_gnu)
- add_sub(0, string, re, pm);
- else
- addchar(p[1]);
- p++;
- continue;
- }
- if (isdigit(p[1])) {
- add_sub(*(++p) - '0', string, re, pm);
- continue;
- }
- }
- addchar(*p);
- }
-}
-
-static void
-do_subst(const char *string, regex_t *re, const char *replace, regmatch_t *pm)
-{
- int error;
- int flags = 0;
- const char *last_match = NULL;
-
- while ((error = regexec(re, string, re->re_nsub+1, pm, flags)) == 0) {
- if (pm[0].rm_eo != 0) {
- if (string[pm[0].rm_eo-1] == '\n')
- flags = 0;
- else
- flags = REG_NOTBOL;
- }
-
- /* NULL length matches are special... We use the `vi-mode'
- * rule: don't allow a NULL-match at the last match
- * position.
- */
- if (pm[0].rm_so == pm[0].rm_eo &&
- string + pm[0].rm_so == last_match) {
- if (*string == '\0')
- return;
- addchar(*string);
- if (*string++ == '\n')
- flags = 0;
- else
- flags = REG_NOTBOL;
- continue;
- }
- last_match = string + pm[0].rm_so;
- addchars(string, pm[0].rm_so);
- add_replace(string, re, replace, pm);
- string += pm[0].rm_eo;
- }
- if (error != REG_NOMATCH)
- exit_regerror(error, re);
- pbstr(string);
-}
-
-static void
-do_regexp(const char *string, regex_t *re, const char *replace, regmatch_t *pm)
-{
- int error;
-
- switch(error = regexec(re, string, re->re_nsub+1, pm, 0)) {
- case 0:
- add_replace(string, re, replace, pm);
- pbstr(getstring());
- break;
- case REG_NOMATCH:
- break;
- default:
- exit_regerror(error, re);
- }
-}
-
-static void
-do_regexpindex(const char *string, regex_t *re, regmatch_t *pm)
-{
- int error;
-
- switch(error = regexec(re, string, re->re_nsub+1, pm, 0)) {
- case 0:
- pbunsigned(pm[0].rm_so);
- break;
- case REG_NOMATCH:
- pbnum(-1);
- break;
- default:
- exit_regerror(error, re);
- }
-}
-
-/* In Gnu m4 mode, parentheses for backmatch don't work like POSIX 1003.2
- * says. So we twiddle with the regexp before passing it to regcomp.
- */
-static char *
-twiddle(const char *p)
-{
- /* This could use strcspn for speed... */
- while (*p != '\0') {
- if (*p == '\\') {
- switch(p[1]) {
- case '(':
- case ')':
- case '|':
- addchar(p[1]);
- break;
- case 'w':
- addconstantstring("[_a-zA-Z0-9]");
- break;
- case 'W':
- addconstantstring("[^_a-zA-Z0-9]");
- break;
- case '<':
- addconstantstring("[[:<:]]");
- break;
- case '>':
- addconstantstring("[[:>:]]");
- break;
- default:
- addchars(p, 2);
- break;
- }
- p+=2;
- continue;
- }
- if (*p == '(' || *p == ')' || *p == '|')
- addchar('\\');
-
- addchar(*p);
- p++;
- }
- return getstring();
-}
-
-/* patsubst(string, regexp, opt replacement) */
-/* argv[2]: string
- * argv[3]: regexp
- * argv[4]: opt rep
- */
-void
-dopatsubst(const char *argv[], int argc)
-{
- int error;
- regex_t re;
- regmatch_t *pmatch;
-
- if (argc <= 3) {
- warnx("Too few arguments to patsubst");
- return;
- }
- error = regcomp(&re, mimic_gnu ? twiddle(argv[3]) : argv[3],
- REG_NEWLINE | REG_EXTENDED);
- if (error != 0)
- exit_regerror(error, &re);
-
- pmatch = xalloc(sizeof(regmatch_t) * (re.re_nsub+1));
- do_subst(argv[2], &re,
- argc != 4 && argv[4] != NULL ? argv[4] : "", pmatch);
- pbstr(getstring());
- free(pmatch);
- regfree(&re);
-}
-
-void
-doregexp(const char *argv[], int argc)
-{
- int error;
- regex_t re;
- regmatch_t *pmatch;
-
- if (argc <= 3) {
- warnx("Too few arguments to regexp");
- return;
- }
- error = regcomp(&re, mimic_gnu ? twiddle(argv[3]) : argv[3],
- REG_EXTENDED);
- if (error != 0)
- exit_regerror(error, &re);
-
- pmatch = xalloc(sizeof(regmatch_t) * (re.re_nsub+1));
- if (argv[4] == NULL || argc == 4)
- do_regexpindex(argv[2], &re, pmatch);
- else
- do_regexp(argv[2], &re, argv[4], pmatch);
- free(pmatch);
- regfree(&re);
-}
-
-void
-doesyscmd(const char *cmd)
-{
- int p[2];
- pid_t pid, cpid;
- int cc;
- int status;
-
- /* Follow gnu m4 documentation: first flush buffers. */
- fflush(NULL);
-
- /* Just set up standard output, share stderr and stdin with m4 */
- if (pipe(p) == -1)
- err(1, "bad pipe");
- switch(cpid = fork()) {
- case -1:
- err(1, "bad fork");
- /* NOTREACHED */
- case 0:
- (void) close(p[0]);
- (void) dup2(p[1], 1);
- (void) close(p[1]);
- execl(_PATH_BSHELL, "sh", "-c", cmd, (char *)NULL);
- exit(1);
- default:
- /* Read result in two stages, since m4's buffer is
- * pushback-only. */
- (void) close(p[1]);
- do {
- char result[BUFSIZE];
- cc = read(p[0], result, sizeof result);
- if (cc > 0)
- addchars(result, cc);
- } while (cc > 0 || (cc == -1 && errno == EINTR));
-
- (void) close(p[0]);
- while ((pid = wait(&status)) != cpid && pid >= 0)
- continue;
- pbstr(getstring());
- }
-}
diff --git a/usr.bin/m4/look.c b/usr.bin/m4/look.c
deleted file mode 100644
index bafaa2a..0000000
--- a/usr.bin/m4/look.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/* $OpenBSD: look.c,v 1.10 2002/04/26 16:15:16 espie Exp $ */
-
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ozan Yigit at York University.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)look.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * look.c
- * Facility: m4 macro processor
- * by: oz
- */
-
-#include <sys/types.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include "mdef.h"
-#include "stdd.h"
-#include "extern.h"
-
-static void freent(ndptr);
-
-unsigned int
-hash(const char *name)
-{
- unsigned int h = 0;
- while (*name)
- h = (h << 5) + h + *name++;
- return (h);
-}
-
-/*
- * find name in the hash table
- */
-ndptr
-lookup(const char *name)
-{
- ndptr p;
- unsigned int h;
-
- h = hash(name);
- for (p = hashtab[h % HASHSIZE]; p != nil; p = p->nxtptr)
- if (h == p->hv && STREQ(name, p->name))
- break;
- return (p);
-}
-
-/*
- * hash and create an entry in the hash table.
- * The new entry is added in front of a hash bucket.
- */
-ndptr
-addent(const char *name)
-{
- unsigned int h;
- ndptr p;
-
- h = hash(name);
- p = (ndptr) xalloc(sizeof(struct ndblock));
- p->nxtptr = hashtab[h % HASHSIZE];
- hashtab[h % HASHSIZE] = p;
- p->name = xstrdup(name);
- p->hv = h;
- return p;
-}
-
-static void
-freent(ndptr p)
-{
- free((char *) p->name);
- if (p->defn != null)
- free((char *) p->defn);
- free((char *) p);
-}
-
-/*
- * remove an entry from the hashtable
- */
-void
-remhash(const char *name, int all)
-{
- unsigned int h;
- ndptr xp, tp, mp;
-
- h = hash(name);
- mp = hashtab[h % HASHSIZE];
- tp = nil;
- while (mp != nil) {
- if (mp->hv == h && STREQ(mp->name, name)) {
- mp = mp->nxtptr;
- if (tp == nil) {
- freent(hashtab[h % HASHSIZE]);
- hashtab[h % HASHSIZE] = mp;
- }
- else {
- xp = tp->nxtptr;
- tp->nxtptr = mp;
- freent(xp);
- }
- if (!all)
- break;
- }
- else {
- tp = mp;
- mp = mp->nxtptr;
- }
- }
-}
diff --git a/usr.bin/m4/m4.1 b/usr.bin/m4/m4.1
deleted file mode 100644
index 0c492a9..0000000
--- a/usr.bin/m4/m4.1
+++ /dev/null
@@ -1,421 +0,0 @@
-.\" @(#) $OpenBSD: m4.1,v 1.24 2002/04/18 18:57:23 espie Exp $
-.\" $FreeBSD$
-.\"
-.Dd July 3, 2004
-.Dt M4 1
-.Os
-.Sh NAME
-.Nm m4
-.Nd macro language processor
-.Sh SYNOPSIS
-.Nm
-.Op Fl d Ar flags
-.Op Fl t Ar name
-.Op Fl gs
-.Op Fl D Ar name Ns Op = Ns Ar value
-.Op Fl U Ar name
-.Op Fl I Ar dirname
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility is a macro processor that can be used as a front end to any
-language (e.g., C, ratfor, fortran, lex, and yacc).
-The
-.Nm
-utility reads from the standard input and writes
-the processed text to the standard output.
-.Pp
-Macro calls have the form
-.Ic name Ns Pq Ar argument1 Ns Op , Ar argument2 , ... , argumentN .
-.Pp
-There cannot be any space following the macro name and the open
-parenthesis
-.Pq Ql \&( .
-If the macro name is not followed by an open
-parenthesis it is processed with no arguments.
-.Pp
-Macro names consist of a leading alphabetic or underscore
-possibly followed by alphanumeric or underscore characters, e.g.,
-valid macro names match the pattern
-.Dq Li [a-zA-Z_][a-zA-Z0-9_]* .
-.Pp
-In arguments to macros, leading unquoted space, tab, and newline
-.Pq Ql \en
-characters are ignored.
-To quote strings, use left and right single
-quotes (e.g.,
-.Sq "\ this is a string with a leading space" ) .
-You can change the quote characters with the
-.Ic changequote
-built-in macro.
-.Pp
-Most built-ins do not make any sense without arguments, and hence are not
-recognized as special when not followed by an open parenthesis.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl s
-Emit
-.Ic #line
-directives for
-.Xr cpp 1 .
-.It Fl D Ar name Ns Op = Ns Ar value
-Define the symbol
-.Ar name
-to have some value (or
-.Dv NULL ) .
-.It Fl U Ar name
-Undefine the symbol
-.Ar name .
-.It Fl I Ar dirname
-Add directory
-.Ar dirname
-to the include path.
-.It Fl d Ar flags
-Set trace flags.
-The
-.Ar flags
-argument may hold the following:
-.Pp
-.Bl -tag -width indent -compact
-.It Cm a
-print macro arguments
-.It Cm c
-print macro expansion over several lines
-.It Cm e
-print result of macro expansion
-.It Cm f
-print filename location
-.It Cm l
-print line number
-.It Cm q
-quote arguments and expansion with the current quotes
-.It Cm t
-start with all macros traced
-.It Cm x
-number macro expansions
-.It Cm V
-turn on all options
-.El
-.Pp
-By default, trace is set to
-.Cm eq .
-.It Fl t Ar macro
-Turn tracing on for
-.Ar macro .
-.It Fl g
-Activate GNU-m4 compatibility mode.
-In this mode,
-.Ic changequote
-with two empty parameters deactivates quotes,
-.Ic translit
-handles simple character ranges (e.g.,
-.Li a-z ) ,
-regular expressions mimic
-.Xr emacs 1
-behavior,
-and the number of diversions is unlimited.
-.El
-.Sh SYNTAX
-The
-.Nm
-utility provides the following built-in macros.
-They may be redefined, losing their original meaning.
-Return values are null unless otherwise stated.
-.Bl -tag -width ".Ic changequote"
-.It Ic builtin
-Calls a built-in by its name, overriding possible redefinitions.
-.It Ic changecom
-Changes the start and end comment sequences.
-The default is the pound sign
-.Pq Ql #
-and the newline character.
-With no arguments, the comment sequence is reset to the default,
-in GNU
-.Nm
-mode, comments are turned off.
-The maximum length for a comment marker is five characters.
-.It Ic changequote
-Defines the quote symbols to be the first and second arguments.
-The symbols may be up to five characters long.
-If no arguments are
-given it restores the default open and close single quotes.
-.It Ic decr
-Decrements the argument by 1.
-The argument must be a valid numeric string.
-.It Ic define
-Define a new macro named by the first argument to have the
-value of the second argument.
-Each occurrence of
-.Sq Li $ Ns Ar n
-(where
-.Ar n
-is 0 through 9) is replaced by the
-.Ar n Ns 'th
-argument.
-.Ql $0
-is the name of the calling macro.
-Undefined arguments are replaced by a null string.
-.Ql $#
-is replaced by the number of arguments;
-.Ql $*
-is replaced by all arguments comma separated;
-.Ql $@
-is the same as
-.Ql $*
-but all arguments are quoted against further expansion.
-.It Ic defn
-Returns the quoted definition for each argument.
-This can be used to rename
-macro definitions (even for built-in macros).
-.It Ic divert
-There are 10 output queues (numbered 0-9).
-At the end of processing
-.Nm
-concatenates all the queues in numerical order to produce the
-final output.
-Initially the output queue is 0.
-The
-.Ic divert
-macro allows you to select a new output queue (an invalid argument
-passed to
-.Ic divert
-causes output to be discarded).
-.It Ic divnum
-Returns the current output queue number.
-.It Ic dnl
-Discards input characters up to and including the next newline.
-.It Ic dumpdef
-Prints the names and definitions for the named items, or for everything
-if no arguments are passed.
-.It Ic errprint
-Prints the first argument on the standard error output stream.
-.It Ic esyscmd
-Passes its first argument to a shell and returns the shell's standard output.
-Note that the shell shares its standard input and standard error with
-.Nm .
-.It Ic eval
-Computes the first argument as an arithmetic expression using 32-bit
-arithmetic.
-Operators are the standard C ternary, arithmetic, logical,
-shift, relational, bitwise, and parentheses operators.
-You can specify
-octal, decimal, and hexadecimal numbers as in C.
-The second argument (if any)
-specifies the radix for the result, and the third argument (if any)
-specifies the minimum number of digits in the result.
-.It Ic expr
-This is an alias for
-.Ic eval .
-.It Ic ifdef
-If the macro named by the first argument is defined then return the second
-argument, otherwise the third.
-If there is no third argument, the value is
-.Dv NULL .
-The word
-.Ic unix
-is predefined.
-.It Ic ifelse
-If the first argument matches the second argument then
-.Ic ifelse
-returns
-the third argument.
-If the match fails, the three arguments are
-discarded and the next three arguments are used until there is
-zero or one arguments left, either this last argument or
-.Dv NULL
-is returned if no other matches were found.
-.It Ic include
-Returns the contents of the file specified in the first argument.
-If the file is not found as is, look through the include path:
-first the directories specified with
-.Fl I
-on the command line, then the environment variable
-.Ev M4PATH ,
-as a colon-separated list of directories.
-Aborts with an error message if the file cannot be included.
-.It Ic incr
-Increments the argument by 1.
-The argument must be a valid numeric string.
-.It Ic index
-Returns the index of the second argument in the first argument (e.g.,
-.Fn index "the quick brown fox jumped" fox
-returns 16).
-If the second
-argument is not found,
-.Ic index
-returns \-1.
-.It Ic indir
-Indirectly calls the macro whose name is passed as the first arguments,
-with the remaining arguments passed as first, etc.\& arguments.
-.It Ic len
-Returns the number of characters in the first argument.
-Extra arguments
-are ignored.
-.It Ic m4exit
-Immediately exits with the return value specified by the first argument,
-0 if none.
-.It Ic m4wrap
-Allows you to define what happens at the final
-.Dv EOF ,
-usually for cleanup purposes (e.g.,
-.Fn m4wrap cleanup(tempfile)
-causes the macro
-.Ic cleanup
-to be
-invoked after all other processing is done).
-.It Ic maketemp
-Translates the string
-.Dq Li XXXXX
-in the first argument with the current process
-ID leaving other characters alone.
-This can be used to create unique
-temporary file names.
-.It Ic paste
-Includes the contents of the file specified by the first argument without
-any macro processing.
-Aborts with an error message if the file cannot be
-included.
-.It Ic patsubst
-Substitutes a regular expression in a string with a replacement string.
-Usual substitution patterns apply: an ampersand
-.Pq Ql &
-is replaced by the string matching the regular expression.
-The string
-.Sq \e Ns Ar # ,
-where
-.Ar #
-is a digit, is replaced by the corresponding back-reference.
-.It Ic popdef
-Restores the
-.Ic pushdef Ns ed
-definition for each argument.
-.It Ic pushdef
-Takes the same arguments as
-.Ic define ,
-but it saves the definition on a
-stack for later retrieval by
-.Ic popdef .
-.It Ic regexp
-Finds a regular expression in a string.
-If no further arguments are given,
-it returns the first match position or \-1 if no match.
-If a third argument
-is provided, it returns the replacement string, with sub-patterns replaced.
-.It Ic shift
-Returns all but the first argument, the remaining arguments are
-quoted and pushed back with commas in between.
-The quoting
-nullifies the effect of the extra scan that will subsequently be
-performed.
-.It Ic sinclude
-Similar to
-.Ic include ,
-except it ignores any errors.
-.It Ic spaste
-Similar to
-.Ic paste ,
-except it ignores any errors.
-.It Ic substr
-Returns a substring of the first argument starting at the offset specified
-by the second argument and the length specified by the third argument.
-If no third argument is present it returns the rest of the string.
-.It Ic syscmd
-Passes the first argument to the shell.
-Nothing is returned.
-.It Ic sysval
-Returns the return value from the last
-.Ic syscmd .
-.It Ic traceon
-Enables tracing of macro expansions for the given arguments, or for all
-macros if no argument is given.
-.It Ic traceoff
-Disables tracing of macro expansions for the given arguments, or for all
-macros if no argument is given.
-.It Ic translit
-Transliterate the characters in the first argument from the set
-given by the second argument to the set given by the third.
-You cannot use
-.Xr tr 1
-style abbreviations.
-.It Ic undefine
-Removes the definition for the macros specified by its arguments.
-.It Ic undivert
-Flushes the named output queues (or all queues if no arguments).
-.It Ic unix
-A pre-defined macro for testing the OS platform.
-.It Ic __line__
-Returns the current file's line number.
-.It Ic __file__
-Returns the current file's name.
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Pp
-The
-.Ic m4exit
-macro may be used to change the exit status from the input file.
-.Sh COMPATIBILITY
-The
-.Nm
-utility follows the
-.St -susv2 ,
-along with a few extensions taken from GNU-m4.
-Flags
-.Fl I , d ,
-and
-.Fl t
-are non-standard.
-.Pp
-The output format of tracing and of
-.Ic dumpdef
-are not specified in any standard,
-are likely to change and should not be relied upon.
-The current format of tracing is closely modeled on GNU-m4,
-to allow
-.Nm autoconf
-to work.
-.Pp
-For portability, one should not use the macros
-.Ic builtin ,
-.Ic esyscmd ,
-.Ic expr ,
-.Ic indir ,
-.Ic paste ,
-.Ic patsubst ,
-.Ic regexp ,
-.Ic spaste ,
-.Ic unix ,
-.Ic __line__ ,
-and
-.Ic __file__ .
-.Pp
-All built-ins do expand without arguments in many other
-.Nm
-implementations.
-.Pp
-Many other
-.Nm
-implementations have dire size limitations with respect to buffer sizes.
-.Sh STANDARDS
-The
-.Nm
-utility
-conforms to
-.St -p1003.1-2001 .
-.Sh HISTORY
-An
-.Nm
-command appeared in PWB UNIX.
-.Sh AUTHORS
-.An -nosplit
-.An Ozan Yigit Aq oz@sis.yorku.ca
-and
-.An Richard A. O'Keefe Aq ok@goanna.cs.rmit.OZ.AU .
-GNU-m4 compatibility extensions by
-.An Marc Espie Aq espie@cvs.openbsd.org .
-.Sh BUGS
-The
-.Nm
-utility does not recognize multibyte characters.
diff --git a/usr.bin/m4/main.c b/usr.bin/m4/main.c
deleted file mode 100644
index 847a372..0000000
--- a/usr.bin/m4/main.c
+++ /dev/null
@@ -1,661 +0,0 @@
-/* $OpenBSD: main.c,v 1.53 2002/04/26 16:15:16 espie Exp $ */
-/* $NetBSD: main.c,v 1.12 1997/02/08 23:54:49 cgd Exp $ */
-
-/*-
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ozan Yigit at York University.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1989, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/6/93";
-#else
-#if 0
-static char rcsid[] = "$OpenBSD: main.c,v 1.53 2002/04/26 16:15:16 espie Exp $";
-#endif
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * main.c
- * Facility: m4 macro processor
- * by: oz
- */
-
-#include <sys/types.h>
-#include <assert.h>
-#include <signal.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <string.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <err.h>
-#include <locale.h>
-#include "mdef.h"
-#include "stdd.h"
-#include "extern.h"
-#include "pathnames.h"
-
-ndptr hashtab[HASHSIZE]; /* hash table for macros etc. */
-stae *mstack; /* stack of m4 machine */
-char *sstack; /* shadow stack, for string space extension */
-static size_t STACKMAX; /* current maximum size of stack */
-int sp; /* current m4 stack pointer */
-int fp; /* m4 call frame pointer */
-struct input_file infile[MAXINP];/* input file stack (0=stdin) */
-char *inname[MAXINP]; /* names of these input files */
-int inlineno[MAXINP]; /* current number in each input file */
-FILE **outfile; /* diversion array(0=bitbucket)*/
-int maxout;
-FILE *active; /* active output file pointer */
-int ilevel = 0; /* input file stack pointer */
-int oindex = 0; /* diversion index.. */
-char null[] = ""; /* as it says.. just a null.. */
-const char *m4wraps = ""; /* m4wrap string default.. */
-char lquote[MAXCCHARS+1] = {LQUOTE}; /* left quote character (`) */
-char rquote[MAXCCHARS+1] = {RQUOTE}; /* right quote character (') */
-char scommt[MAXCCHARS+1] = {SCOMMT}; /* start character for comment */
-char ecommt[MAXCCHARS+1] = {ECOMMT}; /* end character for comment */
-int synccpp; /* Line synchronisation for C preprocessor */
-
-struct keyblk keywrds[] = { /* m4 keywords to be installed */
- { "include", INCLTYPE },
- { "sinclude", SINCTYPE },
- { "define", DEFITYPE },
- { "defn", DEFNTYPE },
- { "divert", DIVRTYPE | NOARGS },
- { "expr", EXPRTYPE },
- { "eval", EXPRTYPE },
- { "substr", SUBSTYPE },
- { "ifelse", IFELTYPE },
- { "ifdef", IFDFTYPE },
- { "len", LENGTYPE },
- { "incr", INCRTYPE },
- { "decr", DECRTYPE },
- { "dnl", DNLNTYPE | NOARGS },
- { "changequote", CHNQTYPE | NOARGS },
- { "changecom", CHNCTYPE | NOARGS },
- { "index", INDXTYPE },
-#ifdef EXTENDED
- { "paste", PASTTYPE },
- { "spaste", SPASTYPE },
- /* Newer extensions, needed to handle gnu-m4 scripts */
- { "indir", INDIRTYPE},
- { "builtin", BUILTINTYPE},
- { "patsubst", PATSTYPE},
- { "regexp", REGEXPTYPE},
- { "esyscmd", ESYSCMDTYPE},
- { "__file__", FILENAMETYPE | NOARGS},
- { "__line__", LINETYPE | NOARGS},
-#endif
- { "popdef", POPDTYPE },
- { "pushdef", PUSDTYPE },
- { "dumpdef", DUMPTYPE | NOARGS },
- { "shift", SHIFTYPE | NOARGS },
- { "translit", TRNLTYPE },
- { "undefine", UNDFTYPE },
- { "undivert", UNDVTYPE | NOARGS },
- { "divnum", DIVNTYPE | NOARGS },
- { "maketemp", MKTMTYPE },
- { "errprint", ERRPTYPE | NOARGS },
- { "m4wrap", M4WRTYPE | NOARGS },
- { "m4exit", EXITTYPE | NOARGS },
- { "syscmd", SYSCTYPE },
- { "sysval", SYSVTYPE | NOARGS },
- { "traceon", TRACEONTYPE | NOARGS },
- { "traceoff", TRACEOFFTYPE | NOARGS },
-
-#if defined(unix) || defined(__unix__)
- { "unix", SELFTYPE | NOARGS },
-#else
-#ifdef vms
- { "vms", SELFTYPE | NOARGS },
-#endif
-#endif
-};
-
-#define MAXKEYS (sizeof(keywrds)/sizeof(struct keyblk))
-
-#define MAXRECORD 50
-static struct position {
- char *name;
- unsigned long line;
-} quotes[MAXRECORD], paren[MAXRECORD];
-
-static void record(struct position *, int);
-static void dump_stack(struct position *, int);
-
-static void macro(void);
-static void initkwds(void);
-static ndptr inspect(int, char *);
-static int do_look_ahead(int, const char *);
-
-static void enlarge_stack(void);
-
-int
-main(int argc, char *argv[])
-{
- int c;
- int n;
- int rval;
- char *p;
-
- setlocale(LC_ALL, "");
-
- traceout = stderr;
-
- if (signal(SIGINT, SIG_IGN) != SIG_IGN)
- signal(SIGINT, onintr);
-
- initkwds();
- initspaces();
- STACKMAX = INITSTACKMAX;
-
- mstack = (stae *)xalloc(sizeof(stae) * STACKMAX);
- sstack = (char *)xalloc(STACKMAX);
-
- maxout = 0;
- outfile = NULL;
- resizedivs(MAXOUT);
-
- while ((c = getopt(argc, argv, "gst:d:D:U:o:I:")) != -1)
- switch(c) {
- case 'D': /* define something..*/
- for (p = optarg; *p; p++)
- if (*p == '=')
- break;
- if (p == optarg)
- errx(1, "null variable cannot be defined");
- if (*p)
- *p++ = EOS;
- dodefine(optarg, p);
- break;
- case 'I':
- addtoincludepath(optarg);
- break;
- case 'U': /* undefine... */
- remhash(optarg, TOP);
- break;
- case 'g':
- mimic_gnu = 1;
- break;
- case 'd':
- set_trace_flags(optarg);
- break;
- case 's':
- synccpp = 1;
- break;
- case 't':
- mark_traced(optarg, 1);
- break;
- case 'o':
- trace_file(optarg);
- break;
- case '?':
- default:
- usage();
- }
-
- argc -= optind;
- argv += optind;
-
- rval = 0;
- active = stdout; /* default active output */
- bbase[0] = bufbase;
- if (!argc) {
- sp = -1; /* stack pointer initialized */
- fp = 0; /* frame pointer initialized */
- set_input(infile+0, stdin, "stdin");
- /* default input (naturally) */
- if ((inname[0] = strdup("-")) == NULL)
- err(1, NULL);
- inlineno[0] = 1;
- emitline();
- macro();
- } else
- for (; argc--; ++argv) {
- p = *argv;
- if (p[0] == '-' && p[1] == EOS)
- set_input(infile, stdin, "stdin");
- else if (fopen_trypath(infile, p) == NULL) {
- warn("%s", p);
- rval = 1;
- continue;
- }
- sp = -1;
- fp = 0;
- if ((inname[0] = strdup(p)) == NULL)
- err(1, NULL);
- inlineno[0] = 1;
- emitline();
- macro();
- release_input(infile);
- }
-
- if (*m4wraps) { /* anything for rundown ?? */
- ilevel = 0; /* in case m4wrap includes.. */
- bufbase = bp = buf; /* use the entire buffer */
- pbstr(m4wraps); /* user-defined wrapup act */
- macro(); /* last will and testament */
- }
-
- if (active != stdout)
- active = stdout; /* reset output just in case */
- for (n = 1; n < maxout; n++) /* default wrap-up: undivert */
- if (outfile[n] != NULL)
- getdiv(n);
- /* remove bitbucket if used */
- if (outfile[0] != NULL) {
- (void) fclose(outfile[0]);
- }
-
- exit(rval);
-}
-
-/*
- * Look ahead for `token'.
- * (on input `t == token[0]')
- * Used for comment and quoting delimiters.
- * Returns 1 if `token' present; copied to output.
- * 0 if `token' not found; all characters pushed back
- */
-static int
-do_look_ahead(int t, const char *token)
-{
- int i;
-
- assert((unsigned char)t == (unsigned char)token[0]);
-
- for (i = 1; *++token; i++) {
- t = gpbc();
- if (t == EOF || (unsigned char)t != (unsigned char)*token) {
- putback(t);
- while (--i)
- putback(*--token);
- return 0;
- }
- }
- return 1;
-}
-
-#define LOOK_AHEAD(t, token) (t != EOF && \
- (unsigned char)(t)==(unsigned char)(token)[0] && \
- do_look_ahead(t,token))
-
-/*
- * macro - the work horse..
- */
-static void
-macro(void)
-{
- char token[MAXTOK+1];
- int t, l;
- ndptr p;
- int nlpar;
-
- cycle {
- t = gpbc();
- if (t == '_' || isalpha(t)) {
- p = inspect(t, token);
- if (p != nil)
- putback(l = gpbc());
- if (p == nil || (l != LPAREN &&
- (p->type & NEEDARGS) != 0))
- outputstr(token);
- else {
- /*
- * real thing.. First build a call frame:
- */
- pushf(fp); /* previous call frm */
- pushf(p->type); /* type of the call */
- pushf(0); /* parenthesis level */
- fp = sp; /* new frame pointer */
- /*
- * now push the string arguments:
- */
- pushs1(p->defn); /* defn string */
- pushs1(p->name); /* macro name */
- pushs(ep); /* start next..*/
-
- if (l != LPAREN && PARLEV == 0) {
- /* no bracks */
- chrsave(EOS);
-
- if ((uintptr_t)sp == STACKMAX)
- errx(1, "internal stack overflow");
- eval((const char **) mstack+fp+1, 2,
- CALTYP);
-
- ep = PREVEP; /* flush strspace */
- sp = PREVSP; /* previous sp.. */
- fp = PREVFP; /* rewind stack...*/
- }
- }
- } else if (t == EOF) {
- if (sp > -1) {
- warnx( "unexpected end of input, unclosed parenthesis:");
- dump_stack(paren, PARLEV);
- exit(1);
- }
- if (ilevel <= 0)
- break; /* all done thanks.. */
- release_input(infile+ilevel--);
- free(inname[ilevel+1]);
- bufbase = bbase[ilevel];
- emitline();
- continue;
- }
- /*
- * non-alpha token possibly seen..
- * [the order of else if .. stmts is important.]
- */
- else if (LOOK_AHEAD(t,lquote)) { /* strip quotes */
- nlpar = 0;
- record(quotes, nlpar++);
- /*
- * Opening quote: scan forward until matching
- * closing quote has been found.
- */
- do {
-
- l = gpbc();
- if (LOOK_AHEAD(l,rquote)) {
- if (--nlpar > 0)
- outputstr(rquote);
- } else if (LOOK_AHEAD(l,lquote)) {
- record(quotes, nlpar++);
- outputstr(lquote);
- } else if (l == EOF) {
- if (nlpar == 1)
- warnx("unclosed quote:");
- else
- warnx("%d unclosed quotes:", nlpar);
- dump_stack(quotes, nlpar);
- exit(1);
- } else {
- if (nlpar > 0) {
- if (sp < 0)
- putc(l, active);
- else
- CHRSAVE(l);
- }
- }
- }
- while (nlpar != 0);
- }
-
- else if (sp < 0 && LOOK_AHEAD(t, scommt)) {
- fputs(scommt, active);
-
- for(;;) {
- t = gpbc();
- if (LOOK_AHEAD(t, ecommt)) {
- fputs(ecommt, active);
- break;
- }
- if (t == EOF)
- break;
- putc(t, active);
- }
- }
-
- else if (sp < 0) { /* not in a macro at all */
- putc(t, active); /* output directly.. */
- }
-
- else switch(t) {
-
- case LPAREN:
- if (PARLEV > 0)
- chrsave(t);
- while (isspace(l = gpbc()))
- ; /* skip blank, tab, nl.. */
- putback(l);
- record(paren, PARLEV++);
- break;
-
- case RPAREN:
- if (--PARLEV > 0)
- chrsave(t);
- else { /* end of argument list */
- chrsave(EOS);
-
- if ((uintptr_t)sp == STACKMAX)
- errx(1, "internal stack overflow");
-
- eval((const char **) mstack+fp+1, sp-fp,
- CALTYP);
-
- ep = PREVEP; /* flush strspace */
- sp = PREVSP; /* previous sp.. */
- fp = PREVFP; /* rewind stack...*/
- }
- break;
-
- case COMMA:
- if (PARLEV == 1) {
- chrsave(EOS); /* new argument */
- while (isspace(l = gpbc()))
- ;
- putback(l);
- pushs(ep);
- } else
- chrsave(t);
- break;
-
- default:
- if (LOOK_AHEAD(t, scommt)) {
- char *pc;
- for (pc = scommt; *pc; pc++)
- chrsave(*pc);
- for(;;) {
- t = gpbc();
- if (LOOK_AHEAD(t, ecommt)) {
- for (pc = ecommt; *pc; pc++)
- chrsave(*pc);
- break;
- }
- if (t == EOF)
- break;
- CHRSAVE(t);
- }
- } else
- CHRSAVE(t); /* stack the char */
- break;
- }
- }
-}
-
-/*
- * output string directly, without pushing it for reparses.
- */
-void
-outputstr(const char *s)
-{
- if (sp < 0)
- while (*s)
- putc(*s++, active);
- else
- while (*s)
- CHRSAVE(*s++);
-}
-
-/*
- * build an input token..
- * consider only those starting with _ or A-Za-z. This is a
- * combo with lookup to speed things up.
- */
-static ndptr
-inspect(int c, char *tp)
-{
- char *name = tp;
- char *etp = tp+MAXTOK;
- ndptr p;
- unsigned int h;
-
- h = *tp++ = c;
-
- while ((isalnum(c = gpbc()) || c == '_') && tp < etp)
- h = (h << 5) + h + (*tp++ = c);
- if (c != EOF)
- PUTBACK(c);
- *tp = EOS;
- /* token is too long, it won't match anything, but it can still
- * be output. */
- if (tp == ep) {
- outputstr(name);
- while (isalnum(c = gpbc()) || c == '_') {
- if (sp < 0)
- putc(c, active);
- else
- CHRSAVE(c);
- }
- *name = EOS;
- return nil;
- }
-
- for (p = hashtab[h % HASHSIZE]; p != nil; p = p->nxtptr)
- if (h == p->hv && STREQ(name, p->name))
- break;
- return p;
-}
-
-/*
- * initkwds - initialise m4 keywords as fast as possible.
- * This very similar to install, but without certain overheads,
- * such as calling lookup. Malloc is not used for storing the
- * keyword strings, since we simply use the static pointers
- * within keywrds block.
- */
-static void
-initkwds(void)
-{
- size_t i;
- unsigned int h;
- ndptr p;
-
- for (i = 0; i < MAXKEYS; i++) {
- h = hash(keywrds[i].knam);
- p = (ndptr) xalloc(sizeof(struct ndblock));
- p->nxtptr = hashtab[h % HASHSIZE];
- hashtab[h % HASHSIZE] = p;
- p->name = xstrdup(keywrds[i].knam);
- p->defn = null;
- p->hv = h;
- p->type = keywrds[i].ktyp & TYPEMASK;
- if ((keywrds[i].ktyp & NOARGS) == 0)
- p->type |= NEEDARGS;
- }
-}
-
-/* Look up a builtin type, even if overridden by the user */
-int
-builtin_type(const char *key)
-{
- int i;
-
- for (i = 0; i != MAXKEYS; i++)
- if (STREQ(keywrds[i].knam, key))
- return keywrds[i].ktyp;
- return -1;
-}
-
-const char *
-builtin_realname(int n)
-{
- int i;
-
- for (i = 0; i != MAXKEYS; i++)
- if (((keywrds[i].ktyp ^ n) & TYPEMASK) == 0)
- return keywrds[i].knam;
- return NULL;
-}
-
-static void
-record(struct position *t, int lev)
-{
- if (lev < MAXRECORD) {
- t[lev].name = CURRENT_NAME;
- t[lev].line = CURRENT_LINE;
- }
-}
-
-static void
-dump_stack(struct position *t, int lev)
-{
- int i;
-
- for (i = 0; i < lev; i++) {
- if (i == MAXRECORD) {
- fprintf(stderr, " ...\n");
- break;
- }
- fprintf(stderr, " %s at line %lu\n",
- t[i].name, t[i].line);
- }
-}
-
-
-static void
-enlarge_stack(void)
-{
- STACKMAX *= 2;
- mstack = realloc(mstack, sizeof(stae) * STACKMAX);
- sstack = realloc(sstack, STACKMAX);
- if (mstack == NULL || sstack == NULL)
- errx(1, "Evaluation stack overflow (%lu)",
- (unsigned long)STACKMAX);
-}
-
-/* Emit preprocessor #line directive if -s option used. */
-void
-emitline(void)
-{
-
- if (synccpp)
- fprintf(active, "#line %d \"%s\"\n", inlineno[ilevel],
- inname[ilevel]);
-}
diff --git a/usr.bin/m4/mdef.h b/usr.bin/m4/mdef.h
deleted file mode 100644
index e3e48e2..0000000
--- a/usr.bin/m4/mdef.h
+++ /dev/null
@@ -1,223 +0,0 @@
-/* $OpenBSD: mdef.h,v 1.21 2001/09/27 11:40:33 espie Exp $ */
-/* $NetBSD: mdef.h,v 1.7 1996/01/13 23:25:27 pk Exp $ */
-
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ozan Yigit at York University.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)mdef.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#define MACRTYPE 1
-#define DEFITYPE 2
-#define EXPRTYPE 3
-#define SUBSTYPE 4
-#define IFELTYPE 5
-#define LENGTYPE 6
-#define CHNQTYPE 7
-#define SYSCTYPE 8
-#define UNDFTYPE 9
-#define INCLTYPE 10
-#define SINCTYPE 11
-#define PASTTYPE 12
-#define SPASTYPE 13
-#define INCRTYPE 14
-#define IFDFTYPE 15
-#define PUSDTYPE 16
-#define POPDTYPE 17
-#define SHIFTYPE 18
-#define DECRTYPE 19
-#define DIVRTYPE 20
-#define UNDVTYPE 21
-#define DIVNTYPE 22
-#define MKTMTYPE 23
-#define ERRPTYPE 24
-#define M4WRTYPE 25
-#define TRNLTYPE 26
-#define DNLNTYPE 27
-#define DUMPTYPE 28
-#define CHNCTYPE 29
-#define INDXTYPE 30
-#define SYSVTYPE 31
-#define EXITTYPE 32
-#define DEFNTYPE 33
-#define SELFTYPE 34
-#define INDIRTYPE 35
-#define BUILTINTYPE 36
-#define PATSTYPE 37
-#define FILENAMETYPE 38
-#define LINETYPE 39
-#define REGEXPTYPE 40
-#define ESYSCMDTYPE 41
-#define TRACEONTYPE 42
-#define TRACEOFFTYPE 43
-
-
-#define TYPEMASK 63 /* Keep bits really corresponding to a type. */
-#define RECDEF 256 /* Pure recursive def, don't expand it */
-#define NOARGS 512 /* builtin needs no args */
-#define NEEDARGS 1024 /* mark builtin that need args with this */
-
-/*
- * m4 special characters
- */
-
-#define ARGFLAG '$'
-#define LPAREN '('
-#define RPAREN ')'
-#define LQUOTE '`'
-#define RQUOTE '\''
-#define COMMA ','
-#define SCOMMT '#'
-#define ECOMMT '\n'
-
-#ifdef msdos
-#define system(str) (-1)
-#endif
-
-/*
- * other important constants
- */
-
-#define EOS '\0'
-#define MAXINP 10 /* maximum include files */
-#define MAXOUT 10 /* maximum # of diversions */
-#define BUFSIZE 4096 /* starting size of pushback buffer */
-#define INITSTACKMAX 4096 /* starting size of call stack */
-#define STRSPMAX 4096 /* starting size of string space */
-#define MAXTOK 512 /* maximum chars in a tokn */
-#define HASHSIZE 199 /* maximum size of hashtab */
-#define MAXCCHARS 5 /* max size of comment/quote delim */
-
-#define ALL 1
-#define TOP 0
-
-#define TRUE 1
-#define FALSE 0
-#define cycle for(;;)
-
-/*
- * m4 data structures
- */
-
-typedef struct ndblock *ndptr;
-
-struct ndblock { /* hastable structure */
- char *name; /* entry name.. */
- char *defn; /* definition.. */
- unsigned int type; /* type of the entry.. */
- unsigned int hv; /* hash function value.. */
- ndptr nxtptr; /* link to next entry.. */
-};
-
-#define nil ((ndptr) 0)
-
-struct keyblk {
- const char *knam; /* keyword name */
- int ktyp; /* keyword type */
-};
-
-typedef union { /* stack structure */
- int sfra; /* frame entry */
- char *sstr; /* string entry */
-} stae;
-
-struct input_file {
- FILE *file;
- char *name;
- unsigned long lineno;
- int c;
-};
-
-#define CURRENT_NAME (infile[ilevel].name)
-#define CURRENT_LINE (infile[ilevel].lineno)
-/*
- * macros for readibility and/or speed
- *
- * pushf() - push a call frame entry onto stack
- * pushs() - push a string pointer onto stack
- */
-#define pushf(x) \
- do { \
- if ((uintptr_t)++sp == STACKMAX) \
- enlarge_stack(); \
- mstack[sp].sfra = (x); \
- sstack[sp] = 0; \
- } while (0)
-
-#define pushs(x) \
- do { \
- if ((uintptr_t)++sp == STACKMAX) \
- enlarge_stack(); \
- mstack[sp].sstr = (x); \
- sstack[sp] = 1; \
- } while (0)
-
-#define pushs1(x) \
- do { \
- if ((uintptr_t)++sp == STACKMAX) \
- enlarge_stack(); \
- mstack[sp].sstr = (x); \
- sstack[sp] = 0; \
- } while (0)
-
-/*
- * . .
- * | . | <-- sp | . |
- * +-------+ +-----+
- * | arg 3 ----------------------->| str |
- * +-------+ | . |
- * | arg 2 ---PREVEP-----+ .
- * +-------+ |
- * . | | |
- * +-------+ | +-----+
- * | plev | PARLEV +-------->| str |
- * +-------+ | . |
- * | type | CALTYP .
- * +-------+
- * | prcf ---PREVFP--+
- * +-------+ |
- * | . | PREVSP |
- * . |
- * +-------+ |
- * | <----------+
- * +-------+
- *
- */
-#define PARLEV (mstack[fp].sfra)
-#define CALTYP (mstack[fp-1].sfra)
-#define PREVEP (mstack[fp+3].sstr)
-#define PREVSP (fp-3)
-#define PREVFP (mstack[fp-2].sfra)
diff --git a/usr.bin/m4/misc.c b/usr.bin/m4/misc.c
deleted file mode 100644
index b5632e8..0000000
--- a/usr.bin/m4/misc.c
+++ /dev/null
@@ -1,367 +0,0 @@
-/* $OpenBSD: misc.c,v 1.27 2002/04/26 16:15:16 espie Exp $ */
-/* $NetBSD: misc.c,v 1.6 1995/09/28 05:37:41 tls Exp $ */
-
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ozan Yigit at York University.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 6/6/93";
-#else
-#if 0
-static char rcsid[] = "$OpenBSD: misc.c,v 1.27 2002/04/26 16:15:16 espie Exp $";
-#endif
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include <err.h>
-#include "mdef.h"
-#include "stdd.h"
-#include "extern.h"
-#include "pathnames.h"
-
-
-char *ep; /* first free char in strspace */
-static char *strspace; /* string space for evaluation */
-char *endest; /* end of string space */
-static size_t strsize = STRSPMAX;
-static size_t bufsize = BUFSIZE;
-
-char *buf; /* push-back buffer */
-char *bufbase; /* the base for current ilevel */
-char *bbase[MAXINP]; /* the base for each ilevel */
-char *bp; /* first available character */
-char *endpbb; /* end of push-back buffer */
-
-
-/*
- * find the index of second str in the first str.
- */
-ptrdiff_t
-indx(const char *s1, const char *s2)
-{
- char *t;
-
- t = strstr(s1, s2);
- if (t == NULL)
- return (-1);
- else
- return (t - s1);
-}
-/*
- * putback - push character back onto input
- */
-void
-putback(int c)
-{
- if (c == EOF)
- return;
- if (bp >= endpbb)
- enlarge_bufspace();
- *bp++ = c;
-}
-
-/*
- * pbstr - push string back onto input
- * putback is replicated to improve
- * performance.
- */
-void
-pbstr(const char *s)
-{
- size_t n;
-
- n = strlen(s);
- while ((size_t)(endpbb - bp) <= n)
- enlarge_bufspace();
- while (n > 0)
- *bp++ = s[--n];
-}
-
-/*
- * pbnum - convert number to string, push back on input.
- */
-void
-pbnum(int n)
-{
- int num;
-
- num = (n < 0) ? -n : n;
- do {
- putback(num % 10 + '0');
- }
- while ((num /= 10) > 0);
-
- if (n < 0)
- putback('-');
-}
-
-/*
- * pbunsigned - convert unsigned long to string, push back on input.
- */
-void
-pbunsigned(unsigned long n)
-{
- do {
- putback(n % 10 + '0');
- }
- while ((n /= 10) > 0);
-}
-
-void
-initspaces(void)
-{
- int i;
-
- strspace = xalloc(strsize+1);
- ep = strspace;
- endest = strspace+strsize;
- buf = (char *)xalloc(bufsize);
- bufbase = buf;
- bp = buf;
- endpbb = buf + bufsize;
- for (i = 0; i < MAXINP; i++)
- bbase[i] = buf;
-}
-
-void
-enlarge_strspace(void)
-{
- char *newstrspace;
- int i;
-
- strsize *= 2;
- newstrspace = malloc(strsize + 1);
- if (!newstrspace)
- errx(1, "string space overflow");
- memcpy(newstrspace, strspace, strsize/2);
- for (i = 0; i <= sp; i++)
- if (sstack[i])
- mstack[i].sstr = (mstack[i].sstr - strspace)
- + newstrspace;
- ep = (ep-strspace) + newstrspace;
- free(strspace);
- strspace = newstrspace;
- endest = strspace + strsize;
-}
-
-void
-enlarge_bufspace(void)
-{
- char *newbuf;
- int i;
-
- bufsize *= 2;
- newbuf = realloc(buf, bufsize);
- if (!newbuf)
- errx(1, "too many characters pushed back");
- for (i = 0; i < MAXINP; i++)
- bbase[i] = (bbase[i]-buf)+newbuf;
- bp = (bp-buf)+newbuf;
- bufbase = (bufbase-buf)+newbuf;
- buf = newbuf;
- endpbb = buf+bufsize;
-}
-
-/*
- * chrsave - put single char on string space
- */
-void
-chrsave(int c)
-{
- if (ep >= endest)
- enlarge_strspace();
- *ep++ = c;
-}
-
-/*
- * read in a diversion file, and dispose it.
- */
-void
-getdiv(int n)
-{
- int c;
-
- if (active == outfile[n])
- errx(1, "undivert: diversion still active");
- rewind(outfile[n]);
- while ((c = getc(outfile[n])) != EOF)
- putc(c, active);
- (void) fclose(outfile[n]);
- outfile[n] = NULL;
-}
-
-void
-onintr(int signo __unused)
-{
-#define intrmessage "m4: interrupted.\n"
- write(STDERR_FILENO, intrmessage, sizeof(intrmessage)-1);
- _exit(1);
-}
-
-/*
- * killdiv - get rid of the diversion files
- */
-void
-killdiv(void)
-{
- int n;
-
- for (n = 0; n < maxout; n++)
- if (outfile[n] != NULL) {
- (void) fclose(outfile[n]);
- }
-}
-
-/*
- * resizedivs: allocate more diversion files */
-void
-resizedivs(int n)
-{
- int i;
-
- outfile = (FILE **)realloc(outfile, sizeof(FILE *) * n);
- if (outfile == NULL)
- errx(1, "too many diverts %d", n);
- for (i = maxout; i < n; i++)
- outfile[i] = NULL;
- maxout = n;
-}
-
-void *
-xalloc(size_t n)
-{
- char *p = malloc(n);
-
- if (p == NULL)
- err(1, "malloc");
- return p;
-}
-
-char *
-xstrdup(const char *s)
-{
- char *p = strdup(s);
- if (p == NULL)
- err(1, "strdup");
- return p;
-}
-
-void
-usage(void)
-{
- fprintf(stderr,
-"usage: m4 [-d flags] [-t name] [-gs] [-D name[=value]]...\n"
-" [-U name]... [-I dirname]... file...\n");
- exit(1);
-}
-
-int
-obtain_char(struct input_file *f)
-{
- if (f->c == EOF)
- return EOF;
- else if (f->c == '\n')
- f->lineno++;
-
- f->c = fgetc(f->file);
- return f->c;
-}
-
-void
-set_input(struct input_file *f, FILE *real, const char *name)
-{
- f->file = real;
- f->lineno = 1;
- f->c = 0;
- f->name = xstrdup(name);
-}
-
-void
-release_input(struct input_file *f)
-{
- if (f->file != stdin)
- fclose(f->file);
- f->c = EOF;
- /*
- * XXX can't free filename, as there might still be
- * error information pointing to it.
- */
-}
-
-void
-doprintlineno(struct input_file *f)
-{
- pbunsigned(f->lineno);
-}
-
-void
-doprintfilename(struct input_file *f)
-{
- pbstr(rquote);
- pbstr(f->name);
- pbstr(lquote);
-}
-
-/*
- * buffer_mark/dump_buffer: allows one to save a mark in a buffer,
- * and later dump everything that was added since then to a file.
- */
-size_t
-buffer_mark(void)
-{
- return bp - buf;
-}
-
-
-void
-dump_buffer(FILE *f, size_t m)
-{
- char *s;
-
- for (s = bp; s - buf > (int)m;)
- fputc(*--s, f);
-}
diff --git a/usr.bin/m4/pathnames.h b/usr.bin/m4/pathnames.h
deleted file mode 100644
index 94e8164..0000000
--- a/usr.bin/m4/pathnames.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* $OpenBSD: pathnames.h,v 1.4 1997/04/04 18:41:29 deraadt Exp $ */
-/* $NetBSD: pathnames.h,v 1.6 1995/09/29 00:27:55 cgd Exp $ */
-
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ozan Yigit at York University.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)pathnames.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-/*
- * Definitions of diversion files. If the name of the file is changed,
- * adjust UNIQUE to point to the wildcard (*) character in the filename.
- */
-
-#ifdef msdos
-#define _PATH_DIVNAME "\\M4*XXXXXX" /* msdos diversion files */
-#define UNIQUE 3 /* unique char location */
-#endif
-
-#if defined(unix) || defined(__FreeBSD__) || defined(__NetBSD__) || \
- defined(__OpenBSD__)
-#define _PATH_DIVNAME "/tmp/m4.0XXXXXXXXXX" /* unix diversion files */
-#define UNIQUE 8 /* unique char location */
-#endif
-
-#ifdef vms
-#define _PATH_DIVNAME "sys$login:m4*XXXXXX" /* vms diversion files */
-#define UNIQUE 12 /* unique char location */
-#endif
diff --git a/usr.bin/m4/stdd.h b/usr.bin/m4/stdd.h
deleted file mode 100644
index 3493985..0000000
--- a/usr.bin/m4/stdd.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* $OpenBSD: stdd.h,v 1.4 1999/11/09 18:16:18 deraadt Exp $ */
-/* $NetBSD: stdd.h,v 1.2 1995/09/28 05:37:50 tls Exp $ */
-
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ozan Yigit at York University.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)stdd.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-/*
- * standard defines
- */
-
-#define max(a,b) ((a) > (b)? (a): (b))
-#define min(a,b) ((a) < (b)? (a): (b))
-
-#define iswhite(c) ((c) == ' ' || (c) == '\t')
-
-/*
- * STREQ is an optimised strcmp(a,b)==0
- * STREQN is an optimised strncmp(a,b,n)==0; assumes n > 0
- */
-#define STREQ(a, b) ((a)[0] == (b)[0] && strcmp(a, b) == 0)
-#define STREQN(a, b, n) ((a)[0] == (b)[0] && strncmp(a, b, n) == 0)
-
-#define YES 1
-#define NO 0
diff --git a/usr.bin/m4/trace.c b/usr.bin/m4/trace.c
deleted file mode 100644
index a42aea0..0000000
--- a/usr.bin/m4/trace.c
+++ /dev/null
@@ -1,264 +0,0 @@
-/* $OpenBSD: trace.c,v 1.6 2002/04/26 16:15:16 espie Exp $ */
-/*
- * Copyright (c) 2001 Marc Espie.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE OPENBSD PROJECT AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBSD
- * PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <err.h>
-#include <stdlib.h>
-#include <string.h>
-#include "mdef.h"
-#include "stdd.h"
-#include "extern.h"
-
-FILE *traceout;
-
-int traced_macros = 0;
-
-#define TRACE_ARGS 1
-#define TRACE_EXPANSION 2
-#define TRACE_QUOTE 4
-#define TRACE_FILENAME 8
-#define TRACE_LINENO 16
-#define TRACE_CONT 32
-#define TRACE_ID 64
-#define TRACE_NEWFILE 128 /* not implemented yet */
-#define TRACE_INPUT 256 /* not implemented yet */
-#define TRACE_ALL 512
-
-static struct t {
- struct t *next;
- char *name;
- int on;
-} *l;
-
-static unsigned int letter_to_flag(int);
-static void print_header(struct input_file *);
-static struct t *find_trace_entry(const char *);
-static int frame_level(void);
-
-static unsigned int flags = TRACE_QUOTE | TRACE_EXPANSION;
-
-static struct t *
-find_trace_entry(const char *name)
-{
- struct t *n;
-
- for (n = l; n != NULL; n = n->next)
- if (STREQ(n->name, name))
- return n;
- return NULL;
-}
-
-
-void
-mark_traced(const char *name, int on)
-{
- struct t *n, *n2;
-
- traced_macros = 1;
-
- if (name == NULL) {
- if (on)
- flags |= TRACE_ALL;
- else {
- flags &= ~TRACE_ALL;
- traced_macros = 0;
- }
- for (n = l; n != NULL; n = n2) {
- n2 = n->next;
- free(n->name);
- free(n);
- }
- l = NULL;
- } else {
- n = find_trace_entry(name);
- if (n == NULL) {
- n = xalloc(sizeof(struct t));
- n->name = xstrdup(name);
- n->next = l;
- l = n;
- }
- n->on = on;
- }
-}
-
-int
-is_traced(const char *name)
-{
- struct t *n;
-
- for (n = l; n != NULL; n = n->next)
- if (STREQ(n->name, name))
- return n->on;
- return (flags & TRACE_ALL) ? 1 : 0;
-}
-
-void
-trace_file(const char *name)
-{
-
- if (traceout != stderr)
- fclose(traceout);
- traceout = fopen(name, "w");
- if (!traceout)
- err(1, "can't open %s", name);
-}
-
-static unsigned int
-letter_to_flag(int c)
-{
- switch(c) {
- case 'a':
- return TRACE_ARGS;
- case 'e':
- return TRACE_EXPANSION;
- case 'q':
- return TRACE_QUOTE;
- case 'c':
- return TRACE_CONT;
- case 'x':
- return TRACE_ID;
- case 'f':
- return TRACE_FILENAME;
- case 'l':
- return TRACE_LINENO;
- case 'p':
- return TRACE_NEWFILE;
- case 'i':
- return TRACE_INPUT;
- case 't':
- return TRACE_ALL;
- case 'V':
- return ~0;
- default:
- return 0;
- }
-}
-
-void
-set_trace_flags(const char *s)
-{
- char mode = 0;
- unsigned int f = 0;
-
- traced_macros = 1;
-
- if (*s == '+' || *s == '-')
- mode = *s++;
- while (*s)
- f |= letter_to_flag(*s++);
- switch(mode) {
- case 0:
- flags = f;
- break;
- case '+':
- flags |= f;
- break;
- case '-':
- flags &= ~f;
- break;
- }
-}
-
-static int
-frame_level(void)
-{
- int level;
- int framep;
-
- for (framep = fp, level = 0; framep != 0;
- level++,framep = mstack[framep-2].sfra)
- ;
- return level;
-}
-
-static void
-print_header(struct input_file *inp)
-{
- fprintf(traceout, "m4trace:");
- if (flags & TRACE_FILENAME)
- fprintf(traceout, "%s:", inp->name);
- if (flags & TRACE_LINENO)
- fprintf(traceout, "%lu:", inp->lineno);
- fprintf(traceout, " -%d- ", frame_level());
- if (flags & TRACE_ID)
- fprintf(traceout, "id %lu: ", expansion_id);
-}
-
-ssize_t
-trace(const char *argv[], int argc, struct input_file *inp)
-{
- print_header(inp);
- if (flags & TRACE_CONT) {
- fprintf(traceout, "%s ...\n", argv[1]);
- print_header(inp);
- }
- fprintf(traceout, "%s", argv[1]);
- if ((flags & TRACE_ARGS) && argc > 2) {
- char delim[3];
- int i;
-
- delim[0] = LPAREN;
- delim[1] = EOS;
- for (i = 2; i < argc; i++) {
- fprintf(traceout, "%s%s%s%s", delim,
- (flags & TRACE_QUOTE) ? lquote : "",
- argv[i],
- (flags & TRACE_QUOTE) ? rquote : "");
- delim[0] = COMMA;
- delim[1] = ' ';
- delim[2] = EOS;
- }
- fprintf(traceout, "%c", RPAREN);
- }
- if (flags & TRACE_CONT) {
- fprintf(traceout, " -> ???\n");
- print_header(inp);
- fprintf(traceout, argc > 2 ? "%s(...)" : "%s", argv[1]);
- }
- if (flags & TRACE_EXPANSION)
- return buffer_mark();
- else {
- fprintf(traceout, "\n");
- return -1;
- }
-}
-
-void
-finish_trace(size_t mark)
-{
- fprintf(traceout, " -> ");
- if (flags & TRACE_QUOTE)
- fprintf(traceout, "%s", lquote);
- dump_buffer(traceout, mark);
- if (flags & TRACE_QUOTE)
- fprintf(traceout, "%s", rquote);
- fprintf(traceout, "\n");
-}
diff --git a/usr.bin/mail/Makefile b/usr.bin/mail/Makefile
deleted file mode 100644
index 491d06f..0000000
--- a/usr.bin/mail/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-# @(#)Makefile 8.2 (Berkeley) 1/25/94
-# $FreeBSD$
-
-PROG= mail
-SRCS= version.c aux.c cmd1.c cmd2.c cmd3.c cmdtab.c collect.c edit.c fio.c \
- getname.c head.c v7.local.c lex.c list.c main.c names.c popen.c \
- quit.c send.c strings.c temp.c tty.c vars.c
-FILES= mail.help mail.tildehelp
-FILESDIR= ${SHAREDIR}/misc
-EFILES= mail.rc
-LINKS= ${BINDIR}/mail ${BINDIR}/Mail ${BINDIR}/mail ${BINDIR}/mailx
-MLINKS= mail.1 Mail.1 mail.1 mailx.1
-
-.PATH: ${.CURDIR}/misc
-
-etc-mailrc:
- cd ${.CURDIR}/misc; ${INSTALL} -o root -g wheel \
- -m 644 ${EFILES} ${DESTDIR}/etc
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/mail/USD.doc/mail0.nr b/usr.bin/mail/USD.doc/mail0.nr
deleted file mode 100644
index e569a5f..0000000
--- a/usr.bin/mail/USD.doc/mail0.nr
+++ /dev/null
@@ -1,72 +0,0 @@
-.\" Copyright (c) 1980, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)mail0.nr 8.1 (Berkeley) 6/8/93
-.\"
-.\" $FreeBSD$
-.\"
-.eh 'USD:7-%''Mail Reference Manual'
-.oh 'Mail Reference Manual''USD:7-%'
-.if n \
-.nr fs .5v
-.\".he 'Mail Reference Manual'\n(mo/\n(dy/\n(yr'%'
-.tp
-.sp 1.0i
-.sz 12
-.rb
-.(l C
-MAIL REFERENCE MANUAL
-.)l
-.sz 10
-.sp 2
-.i
-.(l C
-Kurt Shoens
-.)l
-.r
-.(l C
-Revised by
-.)l
-.(l C
-.i
-Craig Leres\ \c
-.r
-and\ \c
-.i
-Mark Andrews
-.)l
-.r
-.(l C
-Version 5.5
-
-
-.)l
-.pn 2
diff --git a/usr.bin/mail/USD.doc/mail1.nr b/usr.bin/mail/USD.doc/mail1.nr
deleted file mode 100644
index 50e7883..0000000
--- a/usr.bin/mail/USD.doc/mail1.nr
+++ /dev/null
@@ -1,92 +0,0 @@
-.\" Copyright (c) 1980, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)mail1.nr 8.1 (Berkeley) 6/8/93
-.\"
-.sh 1 Introduction
-.pp
-.i Mail
-provides a simple and friendly environment for sending and receiving mail.
-It divides incoming mail into
-its constituent messages and allows the user to deal with them
-in any order. In addition, it provides a set of
-.i ed -\c
-like commands for manipulating messages and sending mail.
-.i Mail
-offers the user simple editing capabilities to ease the composition
-of outgoing messages, as well as providing the ability to define and send
-to names which address groups of users. Finally,
-.i Mail
-is able to send and receive messages across such networks as the
-ARPANET, UUCP, and Berkeley network.
-.pp
-This document describes how to use the
-.i Mail
-program to send and receive messages. The reader is not assumed to
-be familiar with other message handling systems, but should be
-familiar with the \s-2UNIX\s0\**
-.(f
-\** \s-1UNIX\s0 is a trademark of Bell Laboratories.
-.)f
-shell, the text editor, and some of the common \s-2UNIX\s0 commands.
-.q "The \s-2UNIX\s0 Programmer's Manual,"
-.q "An Introduction to Csh,"
-and
-.q "Text Editing with Ex and Vi"
-can be consulted for more information on these topics.
-.pp
-Here is how messages are handled:
-the mail system accepts incoming
-.i messages
-for you from other people
-and collects them in a file, called your
-.i "system mailbox" .
-When you login, the system notifies you if there are any messages
-waiting in your system mailbox. If you are a
-.i csh
-user, you will be notified when new mail arrives if you inform
-the shell of the location of your mailbox. On version 7 systems,
-your system mailbox is located in the directory /var/mail
-in a file with your login name. If your login name is
-.q sam,
-then you can make
-.i csh
-notify you of new mail by including the following line in your .cshrc
-file:
-.(l
-set mail=/var/mail/sam
-.)l
-When you read your mail using
-.i Mail ,
-it reads your system mailbox and separates that file into the
-individual messages that have been sent to you. You can then
-read, reply to, delete, or save these messages.
-Each message is marked with its author and the date they sent it.
diff --git a/usr.bin/mail/USD.doc/mail2.nr b/usr.bin/mail/USD.doc/mail2.nr
deleted file mode 100644
index 0419859..0000000
--- a/usr.bin/mail/USD.doc/mail2.nr
+++ /dev/null
@@ -1,617 +0,0 @@
-.\" Copyright (c) 1980, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)mail2.nr 8.1 (Berkeley) 6/8/93
-.\"
-.bp
-.sh 1 "Common usage"
-.pp
-The
-.i Mail
-command has two distinct usages, according to whether one
-wants to send or receive mail. Sending mail is simple: to send a
-message to a user whose login name is, say,
-\*(lqroot,\*(rq
-use the shell
-command:
-.(l
-% Mail root
-.)l
-then type your message. When you reach the end of the message, type
-an EOT (control\-d) at the beginning of a line, which will cause
-.i Mail
-to echo \*(lqEOT\*(rq and return you to the Shell. When the user you sent mail
-to next logs in, he will receive the message:
-.(l
-You have mail.
-.)l
-to alert him to the existence of your message.
-.pp
-If, while you are composing the message
-you decide that you do not wish to send it after all, you can
-abort the letter with a \s-2RUBOUT\s0. Typing a single \s-2RUBOUT\s0
-causes
-.i Mail
-to print
-.(l
-(Interrupt -- one more to kill letter)
-.)l
-Typing a second
-\s-2RUBOUT\s0 causes
-.i Mail
-to save your partial letter on the file
-.q dead.letter
-in your home directory and abort the letter.
-Once you have
-sent mail to someone, there is no way to undo the act, so be
-careful.
-.pp
-The message your recipient reads will consist of the message you
-typed, preceded by a line telling who sent the message (your login name)
-and the date and time it
-was sent.
-.pp
-If you want to send the same message to several other people, you can list
-their login names on the command line.
-Thus,
-.(l
-% Mail sam bob john
-Tuition fees are due next Friday. Don't forget!!
-<Control\-d>
-EOT
-%
-.)l
-will send the reminder to sam, bob, and john.
-.pp
-If, when you log in, you see the message,
-.(l
-You have mail.
-.)l
-you can read the mail by typing simply:
-.(l
-% Mail
-.)l
-.i Mail
-will respond by typing its version number and date and then listing
-the messages you have waiting. Then it will type a prompt and await
-your command. The messages are assigned numbers starting with 1 \*- you
-refer to the messages with these numbers.
-.i Mail
-keeps track of which messages are
-.i new
-(have been sent since you last read your mail) and
-.i read
-(have been read by you). New messages have an
-.b N
-next to them in the header listing and old, but unread messages have
-a
-.b U
-next to them.
-.i Mail
-keeps track of new/old and read/unread messages by putting a
-header field called
-.q Status
-into your messages.
-.pp
-To look at a specific message, use the
-.b type
-command, which may be abbreviated to simply
-.b t .
-For example, if you had the following messages:
-.(l
-N 1 root Wed Sep 21 09:21 "Tuition fees"
-N 2 sam Tue Sep 20 22:55
-.)l
-you could examine the first message by giving the command:
-.(l
-type 1
-.)l
-which might cause
-.i Mail
-to respond with, for example:
-.(l
-Message 1:
-From root Wed Sep 21 09:21:45 1978
-Subject: Tuition fees
-Status: R
-
-Tuition fees are due next Wednesday. Don't forget!!
-
-.)l
-Many
-.i Mail
-commands that operate on messages take a message number as an
-argument like the
-.b type
-command. For these commands, there is a notion of a current
-message. When you enter the
-.i Mail
-program, the current message is initially the first one. Thus,
-you can often omit the message number and use, for example,
-.(l
-t
-.)l
-to type the current message. As a further shorthand, you can type a message
-by simply giving its message number. Hence,
-.(l
-1
-.)l
-would type the first message.
-.pp
-Frequently, it is useful to read the messages in your mailbox in order,
-one after another. You can read the next message in
-.i Mail
-by simply typing a newline. As a special case, you can type a newline
-as your first command to
-.i Mail
-to type the first message.
-.pp
-If, after typing a message, you wish to immediately send a reply,
-you can do so with the
-.b reply
-command.
-.b Reply ,
-like
-.b type ,
-takes a message number as an argument.
-.i Mail
-then begins a message addressed to the user who sent you the message.
-You may then type in your letter in reply, followed by a <control-d>
-at the beginning of a line, as before.
-.i Mail
-will type EOT, then type the ampersand prompt to indicate its readiness
-to accept another command. In our example, if, after typing the
-first message, you wished to reply to it, you might give the command:
-.(l
-reply
-.)l
-.i Mail
-responds by typing:
-.(l
-To: root
-Subject: Re: Tuition fees
-.)l
-and waiting for you to enter your letter.
-You are now in the message collection mode described at the beginning
-of this section and
-.i Mail
-will gather up your message up to a control\-d.
-Note that it copies the subject
-header from the original message. This is useful in that correspondence
-about a particular matter will tend to retain the same subject heading,
-making it easy to recognize. If there are other header fields in
-the message, the information found will also be used.
-For example, if the letter had a
-.q "To:"
-header listing several recipients,
-.i Mail
-would arrange to send your replay to the same people as well.
-Similarly, if the original message contained a
-.q "Cc:"
-(carbon copies to) field,
-.i Mail
-would send your reply to
-.i those
-users, too.
-.i Mail
-is careful, though, not too send the message to
-.i you ,
-even if you appear in the
-.q "To:"
-or
-.q "Cc:"
-field, unless you ask to be included explicitly. See section 4 for more
-details.
-.pp
-After typing in your letter, the dialog with
-.i Mail
-might look like the following:
-.(l
-reply
-To: root
-Subject: Tuition fees
-
-Thanks for the reminder
-EOT
-&
-.)l
-.pp
-The
-.b reply
-command is especially useful for sustaining extended conversations
-over the message system, with other
-.q listening
-users receiving copies of the conversation. The
-.b reply
-command can be abbreviated to
-.b r .
-.pp
-Sometimes you will receive a message that has been sent to
-several people and wish to reply
-.i only
-to the person who sent it.
-.b Reply
-with a capital
-.b R
-replies to a message, but sends a copy to the sender only.
-.pp
-If you wish, while reading your mail, to send a message to someone,
-but not as a reply to one of your messages, you can send the message
-directly with the
-.b mail
-command, which takes as arguments the names of the recipients you wish
-to send to. For example, to send a message to
-.q frank,
-you would do:
-.(l
-mail frank
-This is to confirm our meeting next Friday at 4.
-EOT
-&
-.)l
-The
-.b mail
-command can be abbreviated to
-.b m .
-.pp
-Normally, each message you receive is saved in the file
-.i mbox
-in your login directory at the time you leave
-.i Mail .
-Often,
-however, you will not want to save a particular message you
-have received because it is only of passing interest. To avoid
-saving a message in
-.i mbox
-you can delete it using the
-.b delete
-command. In our example,
-.(l
-delete 1
-.)l
-will prevent
-.i Mail
-from saving message 1 (from root) in
-.i mbox .
-In addition to not saving deleted messages,
-.i Mail
-will not let
-you type them, either. The effect is to make the message disappear
-altogether, along with its number. The
-.b delete
-command can be abbreviated to simply
-.b d .
-.pp
-Many features of
-.i Mail
-can be tailored to your liking with the
-.b set
-command. The
-.b set
-command has two forms, depending on whether you are setting
-a
-.i binary
-option or a
-.i valued
-option.
-Binary options are either on or off. For example, the
-.q ask
-option informs
-.i Mail
-that each time you send a message, you want it to prompt you for
-a subject header, to be included in the message.
-To set the
-.q ask
-option, you would type
-.(l
-set ask
-.)l
-.pp
-Another useful
-.i Mail
-option is
-.q hold.
-Unless told otherwise,
-.i Mail
-moves the messages from your system mailbox to the file
-.i mbox
-in your home directory when you leave
-.i Mail .
-If you want
-.i Mail
-to keep your letters in the system mailbox instead, you can set the
-.q hold
-option.
-.pp
-Valued options are values which
-.i Mail
-uses to adapt to your tastes. For example, the
-.q SHELL
-option tells
-.i Mail
-which shell you like to use, and is specified by
-.(l
-set SHELL=/bin/csh
-.)l
-for example. Note that no spaces are allowed in
-.q "SHELL=/bin/csh."
-A complete list of the
-.i Mail
-options appears in section 5.
-.pp
-Another important valued option is
-.q crt.
-If you use a fast video terminal, you will find that when you
-print long messages, they fly by too quickly for you to read them.
-With the
-.q crt
-option, you can make
-.i Mail
-print any message larger than a given number of lines by sending
-it through a paging program. This program is specified by the
-valued option \fBPAGER\fP.
-If \fBPAGER\fP is not set, a default paginator is used.
-For example, most CRT users with 24-line screens should do:
-.(l
-set crt=24
-.)l
-to paginate messages that will not fit on their screens.
-In the default state, \fImore\fP (default paginator) prints a screenful of
-information, then types --More--. Type a space to see the next screenful.
-.pp
-Another adaptation to user needs that
-.i Mail
-provides is that of
-.i aliases .
-An alias is simply a name which stands for one or more
-real user names.
-.i Mail
-sent to an alias is really sent to the list of real users
-associated with it. For example, an alias can be defined for the
-members of a project, so that you can send mail to the whole project
-by sending mail to just a single name. The
-.b alias
-command in
-.i Mail
-defines an alias. Suppose that the users in a project are
-named Sam, Sally, Steve, and Susan. To define an alias called
-.q project
-for them, you would use the
-.i Mail
-command:
-.(l
-alias project sam sally steve susan
-.)l
-The
-.b alias
-command can also be used to provide a convenient name for someone
-whose user name is inconvenient. For example, if a user named
-.q "Bob Anderson"
-had the login name
-.q anderson,"
-you might want to use:
-.(l
-alias bob anderson
-.)l
-so that you could send mail to the shorter name,
-.q bob.
-.pp
-While the
-.b alias
-and
-.b set
-commands allow you to customize
-.i Mail ,
-they have the drawback that they must be retyped each time you enter
-.i Mail .
-To make them more convenient to use,
-.i Mail
-always looks for two files when it is invoked. It first reads
-a system wide file
-.q /etc/mail.rc,
-then a user specific file,
-.q .mailrc,
-which is found in the user's home directory.
-The system wide file
-is maintained by the system administrator and
-contains
-.b set
-commands that are applicable to all users of the system.
-The
-.q .mailrc
-file is usually used by each user to set options the way he likes
-and define individual aliases.
-For example, my .mailrc file looks like this:
-.(l
-set ask nosave SHELL=/bin/csh
-.)l
-As you can see, it is possible to set many options in the
-same
-.b set
-command. The
-.q nosave
-option is described in section 5.
-.pp
-Mail aliasing is implemented
-at the system-wide level
-by the mail delivery
-system
-.i sendmail .
-These aliases are stored in the file /usr/lib/aliases and are
-accessible to all users of the system.
-The lines in /usr/lib/aliases are of
-the form:
-.(l
-alias: name\*<1\*>, name\*<2\*>, name\*<3\*>
-.)l
-where
-.i alias
-is the mailing list name and the
-.i name\*<i\*>
-are the members of the list. Long lists can be continued onto the next
-line by starting the next line with a space or tab. Remember that you
-must execute the shell command
-.i newaliases
-after editing /usr/lib/aliases since the delivery system
-uses an indexed file created by
-.i newaliases .
-.pp
-We have seen that
-.i Mail
-can be invoked with command line arguments which are people
-to send the message to, or with no arguments to read mail.
-Specifying the
-.rb \-f
-flag on the command line causes
-.i Mail
-to read messages from a file other than your system mailbox.
-For example, if you have a collection of messages in
-the file
-.q letters
-you can use
-.i Mail
-to read them with:
-.(l
-% Mail \-f letters
-.)l
-You can use all
-the
-.i Mail
-commands described in this document to examine, modify, or delete
-messages from your
-.q letters
-file, which will be rewritten when you leave
-.i Mail
-with the
-.b quit
-command described below.
-.pp
-Since mail that you read is saved in the file
-.i mbox
-in your home directory by default, you can read
-.i mbox
-in your home directory by using simply
-.(l
-% Mail \-f
-.)l
-.pp
-Normally, messages that you examine using the
-.b type
-command are saved in the file
-.q mbox
-in your home directory if you leave
-.i Mail
-with the
-.b quit
-command described below.
-If you wish to retain a message in your system mailbox
-you can use the
-.b preserve
-command to tell
-.i Mail
-to leave it there.
-The
-.b preserve
-command accepts a list of message numbers, just like
-.b type
-and may be abbreviated to
-.b pre .
-.pp
-Messages in your system mailbox that you do not examine are
-normally retained in your system mailbox automatically.
-If you wish to have such a message saved in
-.i mbox
-without reading it, you may use the
-.b mbox
-command to have them so saved. For example,
-.(l
-mbox 2
-.)l
-in our example would cause the second message (from sam)
-to be saved in
-.i mbox
-when the
-.b quit
-command is executed.
-.b Mbox
-is also the way to direct messages to your
-.i mbox
-file if you have set the
-.q hold
-option described above.
-.b Mbox
-can be abbreviated to
-.b mb .
-.pp
-When you have perused all the messages of interest, you can leave
-.i Mail
-with the
-.b quit
-command, which saves the messages you have typed but not
-deleted in the file
-.i mbox
-in your login directory. Deleted messages are discarded irretrievably,
-and messages left untouched are preserved in your system mailbox so
-that you will see them the next time you type:
-.(l
-% Mail
-.)l
-The
-.b quit
-command can be abbreviated to simply
-.b q .
-.pp
-If you wish for some reason to leave
-.i Mail
-quickly without altering either your system mailbox or
-.i mbox ,
-you can type the
-.b x
-command (short for
-.b exit ),
-which will immediately return you to the Shell without changing anything.
-.pp
-If, instead, you want to execute a Shell command without leaving
-.i Mail ,
-you
-can type the command preceded by an exclamation point, just as in the
-text editor. Thus, for instance:
-.(l
-!date
-.)l
-will print the current date without leaving
-.i Mail .
-.pp
-Finally, the
-.b help
-command is available to print out a brief summary of the
-.i Mail
-commands, using only the single character command abbreviations.
diff --git a/usr.bin/mail/USD.doc/mail3.nr b/usr.bin/mail/USD.doc/mail3.nr
deleted file mode 100644
index 8b133ef..0000000
--- a/usr.bin/mail/USD.doc/mail3.nr
+++ /dev/null
@@ -1,133 +0,0 @@
-.\" Copyright (c) 1980, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)mail3.nr 8.1 (Berkeley) 6/8/93
-.\"
-.sh 1 "Maintaining folders"
-.pp
-.i Mail
-includes a simple facility for maintaining groups of messages together
-in folders. This section describes this facility.
-.pp
-To use the folder facility, you must tell
-.i Mail
-where you wish to keep your folders. Each folder of messages will
-be a single file. For convenience, all of your folders are kept in
-a single directory of your choosing. To tell
-.i Mail
-where your folder directory is, put a line of the form
-.(l
-set folder=letters
-.)l
-in your
-.i .mailrc
-file. If, as in the example above, your folder directory does not
-begin with a `/,'
-.i Mail
-will assume that your folder directory is to be found starting from
-your home directory. Thus, if your home directory is
-.b /home/person
-the above example told
-.i Mail
-to find your folder directory in
-.b /home/person/letters .
-.pp
-Anywhere a file name is expected, you can use a folder name, preceded
-with `+.' For example, to put a message into a folder with the
-.b save
-command, you can use:
-.(l
-save +classwork
-.)l
-to save the current message in the
-.i classwork
-folder. If the
-.i classwork
-folder does not yet exist, it will be created. Note that messages
-which are saved with the
-.b save
-command are automatically removed from your system mailbox.
-.pp
-In order to make a copy of a message in a folder without causing
-that message to be removed from your system mailbox, use the
-.b copy
-command, which is identical in all other respects to the
-.b save
-command. For example,
-.(l
-copy +classwork
-.)l
-copies the current message into the
-.i classwork
-folder and leaves a copy in your system mailbox.
-.pp
-The
-.b folder
-command
-can be used to direct
-.i Mail
-to the contents of a different folder.
-For example,
-.(l
-folder +classwork
-.)l
-directs
-.i Mail
-to read the contents of the
-.i classwork
-folder. All of the commands that you can use on your system
-mailbox are also applicable to folders, including
-.b type ,
-.b delete ,
-and
-.b reply .
-To inquire which folder you are currently editing, use simply:
-.(l
-folder
-.)l
-.pp
-To list your current set of folders, use the
-.b folders
-command.
-.pp
-To start
-.i Mail
-reading one of your folders, you can use the
-.b \-f
-option described in section 2. For example:
-.(l
-% Mail \-f +classwork
-.)l
-will cause
-.i Mail
-to read your
-.i classwork
-folder without looking at your system mailbox.
diff --git a/usr.bin/mail/USD.doc/mail4.nr b/usr.bin/mail/USD.doc/mail4.nr
deleted file mode 100644
index 1a1e046..0000000
--- a/usr.bin/mail/USD.doc/mail4.nr
+++ /dev/null
@@ -1,437 +0,0 @@
-.\" Copyright (c) 1980, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)mail4.nr 8.1 (Berkeley) 6/8/93
-.\"
-.bp
-.sh 1 "More about sending mail"
-.sh 2 "Tilde escapes"
-.pp
-While typing in a message to be sent to others, it is often
-useful to be able to invoke the text editor on the partial message,
-print the message, execute a shell command, or do some other
-auxiliary function.
-.i Mail
-provides these capabilities through
-.i "tilde escapes" ,
-which consist of a tilde (~) at the beginning of a line, followed by
-a single character which indicates the function to be performed. For
-example, to print the text of the message so far, use:
-.(l
-~p
-.)l
-which will print a line of dashes, the recipients of your message, and
-the text of the message so far.
-Since
-.i Mail
-requires two consecutive \s-2RUBOUT\s0's to abort a letter, you
-can use a single \s-2RUBOUT\s0 to abort the output of ~p or any other
-~ escape without killing your letter.
-.pp
-If you are dissatisfied with the message as
-it stands, you can invoke the text editor on it using the escape
-.(l
-~e
-.)l
-which causes the message to be copied into a temporary file and an
-instance of the editor to be spawned. After modifying the message to
-your satisfaction, write it out and quit the editor.
-.i Mail
-will respond
-by typing
-.(l
-(continue)
-.)l
-after which you may continue typing text which will be appended to your
-message, or type <control-d> to end the message.
-A standard text editor is provided by
-.i Mail .
-You can override this default by setting the valued option
-.q EDITOR
-to something else. For example, you might prefer:
-.(l
-set EDITOR=/usr/bin/ex
-.)l
-.pp
-Many systems offer a screen editor as an alternative to the standard
-text editor, such as the
-.i vi
-editor from UC Berkeley.
-To use the screen, or
-.i visual
-editor, on your current message, you can use the escape,
-.(l
-~v
-.)l
-~v works like ~e, except that the screen editor is invoked instead.
-A default screen editor is defined by
-.i Mail .
-If it does not suit you, you can set the valued option
-.q VISUAL
-to the path name of a different editor.
-.pp
-It is often useful to be able to include the contents of some
-file in your message; the escape
-.(l
-~r filename
-.)l
-is provided for this purpose, and causes the named file to be appended
-to your current message.
-.i Mail
-complains if the file doesn't exist
-or can't be read. If the read is successful, the number of lines and
-characters appended to your message is printed, after which you may continue
-appending text. The filename may contain shell metacharacters like * and ?
-which are expanded according to the conventions of your shell.
-.pp
-As a special case of ~r, the escape
-.(l
-~d
-.)l
-reads in the file
-.q dead.letter
-in your home directory. This is often useful since
-.i Mail
-copies the text
-of your message there when you abort a message with \s-2RUBOUT\s0.
-.pp
-To save the current text of your message on a file you may use the
-.(l
-~w filename
-.)l
-escape.
-.i Mail
-will print out the number of lines and characters written
-to the file, after which you may continue appending text to your message.
-Shell metacharacters may be used in the filename, as in ~r and are expanded
-with the conventions of your shell.
-.pp
-If you are sending mail from within
-.i Mail's
-command mode
-you can read a message sent to you into the message
-you are constructing with the escape:
-.(l
-~m 4
-.)l
-which will read message 4 into the current message, shifted right by
-one tab stop. You can name any non-deleted message, or list of messages.
-Messages can also be forwarded without shifting by a tab stop with ~f.
-This is the usual way to forward a message.
-.pp
-If, in the process of composing a message, you decide to add additional
-people to the list of message recipients, you can do so with the escape
-.(l
-~t name1 name2 ...
-.)l
-You may name as few or many additional recipients as you wish. Note
-that the users originally on the recipient list will still receive
-the message; you cannot remove someone from the recipient
-list with ~t.
-.pp
-If you wish, you can associate a subject with your message by using the
-escape
-.(l
-~s Arbitrary string of text
-.)l
-which replaces any previous subject with
-.q "Arbitrary string of text."
-The subject, if given, is sent near the
-top of the message prefixed with
-.q "Subject:"
-You can see what the message will look like by using ~p.
-.pp
-For political reasons, one occasionally prefers to list certain
-people as recipients of carbon copies of a message rather than
-direct recipients. The escape
-.(l
-~c name1 name2 ...
-.)l
-adds the named people to the
-.q "Cc:"
-list, similar to ~t.
-Again, you can execute ~p to see what the message will look like.
-.pp
-The escape
-.(l
-~b name1 name2 ...
-.)l
-adds the named people to the
-.q "Cc:"
-list, but does not make the names visible in the
-.q "Cc:"
-line ("blind" carbon copy).
-.pp
-The recipients of the message together constitute the
-.q "To:"
-field, the subject the
-.q "Subject:"
-field, and the carbon copies the
-.q "Cc:"
-field. If you wish to edit these in ways impossible with the ~t, ~s, ~c
-and ~b escapes, you can use the escape
-.(l
-~h
-.)l
-which prints
-.q "To:"
-followed by the current list of recipients and leaves the cursor
-(or printhead) at the end of the line. If you type in ordinary
-characters, they are appended to the end of the current list of
-recipients. You can also use your erase character to erase back into
-the list of recipients, or your kill character to erase them altogether.
-Thus, for example, if your erase and kill characters are the standard
-(on printing terminals) # and @ symbols,
-.(l
-~h
-To: root kurt####bill
-.)l
-would change the initial recipients
-.q "root kurt"
-to
-.q "root bill."
-When you type a newline,
-.i Mail
-advances to the
-.q "Subject:"
-field, where the same rules apply. Another newline brings you to
-the
-.q "Cc:"
-field, which may be edited in the same fashion. Another newline
-brings you to the
-.q "Bcc:"
-("blind" carbon copy) field, which follows the same rules as the "Cc:"
-field. Another newline
-leaves you appending text to the end of your message. You can use
-~p to print the current text of the header fields and the body
-of the message.
-.pp
-To effect a temporary escape to the shell, the escape
-.(l
-~!command
-.)l
-is used, which executes
-.i command
-and returns you to mailing mode without altering the text of
-your message. If you wish, instead, to filter the body of your
-message through a shell command, then you can use
-.(l
-~|command
-.)l
-which pipes your message through the command and uses the output
-as the new text of your message. If the command produces no output,
-.i Mail
-assumes that something is amiss and retains the old version
-of your message. A frequently-used filter is the command
-.i fmt ,
-designed to format outgoing mail.
-.pp
-To effect a temporary escape to
-.i Mail
-command mode instead, you can use the
-.(l
-~:\fIMail command\fP
-.)l
-escape. This is especially useful for retyping the message you are
-replying to, using, for example:
-.(l
-~:t
-.)l
-It is also useful for setting options and modifying aliases.
-.pp
-If you wish abort the current message, you can use the escape
-.(l
-~q
-.)l
-This will terminate the current message and return you to the
-shell (or \fIMail\fP if you were using the \fBmail\fP command).
-If the \fBsave\fP option is set, the message will be copied
-to the file
-.q dead.letter
-in your home directory.
-.pp
-If you wish (for some reason) to send a message that contains
-a line beginning with a tilde, you must double it. Thus, for example,
-.(l
-~~This line begins with a tilde.
-.)l
-sends the line
-.(l
-~This line begins with a tilde.
-.)l
-.pp
-Finally, the escape
-.(l
-~?
-.)l
-prints out a brief summary of the available tilde escapes.
-.pp
-On some terminals (particularly ones with no lower case)
-tilde's are difficult to type.
-.i Mail
-allows you to change the escape character with the
-.q escape
-option. For example, I set
-.(l
-set escape=]
-.)l
-and use a right bracket instead of a tilde. If I ever need to
-send a line beginning with right bracket, I double it, just as for ~.
-Changing the escape character removes the special meaning of ~.
-.sh 2 "Network access"
-.pp
-This section describes how to send mail to people on other machines.
-Recall that sending to a plain login name sends mail to that person
-on your machine. If your machine is directly (or sometimes, even,
-indirectly) connected to the Arpanet, you can send messages to people
-on the Arpanet using a name of the form
-.(l
-name@host.domain
-.)l
-where
-.i name
-is the login name of the person you're trying to reach,
-.i host
-is the name of the machine on the Arpanet,
-and
-.i domain
-is the higher-level scope within which the hostname is known, e.g. EDU (for educational
-institutions), COM (for commercial entities), GOV (for governmental agencies),
-ARPA for many other things, BITNET or CSNET for those networks.
-.pp
-If your recipient logs in on a machine connected to yours by
-UUCP (the Bell Laboratories supplied network that communicates
-over telephone lines), sending mail can be a bit more complicated.
-You must know the list of machines through which your message must
-travel to arrive at his site. So, if his machine is directly connected
-to yours, you can send mail to him using the syntax:
-.(l
-host!name
-.)l
-where, again,
-.i host
-is the name of the machine and
-.i name
-is the login name.
-If your message must go through an intermediary machine first, you
-must use the syntax:
-.(l
-intermediary!host!name
-.)l
-and so on. It is actually a feature of UUCP that the map of all
-the systems in the network is not known anywhere (except where people
-decide to write it down for convenience). Talk to your system administrator
-about good ways to get places; the
-.i uuname
-command will tell you systems whose names are recognized, but not which
-ones are frequently called or well-connected.
-.pp
-When you use the
-.b reply
-command to respond to a letter, there is a problem of figuring out the
-names of the users in the
-.q "To:"
-and
-.q "Cc:"
-lists
-.i "relative to the current machine" .
-If the original letter was sent to you by someone on the local machine,
-then this problem does not exist, but if the message came from a remote
-machine, the problem must be dealt with.
-.i Mail
-uses a heuristic to build the correct name for each user relative
-to the local machine. So, when you
-.b reply
-to remote mail, the names in the
-.q "To:"
-and
-.q "Cc:"
-lists may change somewhat.
-.sh 2 "Special recipients"
-.pp
-As described previously, you can send mail to either user names or
-.b alias
-names. It is also possible to send messages directly to files or to
-programs, using special conventions. If a recipient name has a
-`/' in it or begins with a `+', it is assumed to be the
-path name of a file into which
-to send the message. If the file already exists, the message is
-appended to the end of the file. If you want to name a file in
-your current directory (ie, one for which a `/' would not usually
-be needed) you can precede the name with `./'
-So, to send mail to the file
-.q memo
-in the current directory, you can give the command:
-.(l
-% Mail ./memo
-.)l
-If the name begins with a `+,' it is expanded into the full path name
-of the folder name in your folder directory.
-This ability to send mail to files can be used for a variety of
-purposes, such as maintaining a journal and keeping a record of
-mail sent to a certain group of users. The second example can be
-done automatically by including the full pathname of the record
-file in the
-.b alias
-command for the group. Using our previous
-.b alias
-example, you might give the command:
-.(l
-alias project sam sally steve susan /usr/project/mail_record
-.)l
-Then, all mail sent to "project" would be saved on the file
-.q /usr/project/mail_record
-as well as being sent to the members of the project. This file
-can be examined using
-.i "Mail \-f" .
-.pp
-It is sometimes useful to send mail directly to a program, for
-example one might write a project billboard program and want to access
-it using
-.i Mail .
-To send messages to the billboard program, one can send mail
-to the special name `|billboard' for example.
-.i Mail
-treats recipient names that begin with a `|' as a program to send
-the mail to. An
-.b alias
-can be set up to reference a `|' prefaced name if desired.
-.i Caveats :
-the shell treats `|' specially, so it must be quoted on the command
-line. Also, the `| program' must be presented as a single argument to
-mail. The safest course is to surround the entire name with double
-quotes. This also applies to usage in the
-.b alias
-command. For example, if we wanted to alias `rmsgs' to `rmsgs \-s'
-we would need to say:
-.(l
-alias rmsgs "| rmsgs -s"
-.)l
diff --git a/usr.bin/mail/USD.doc/mail5.nr b/usr.bin/mail/USD.doc/mail5.nr
deleted file mode 100644
index 10e707c..0000000
--- a/usr.bin/mail/USD.doc/mail5.nr
+++ /dev/null
@@ -1,1042 +0,0 @@
-.\" Copyright (c) 1980, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)mail5.nr 8.1 (Berkeley) 6/8/93
-.\" $FreeBSD$
-.\"
-.bp
-.sh 1 "Additional features"
-.pp
-This section describes some additional commands useful for
-reading your mail, setting options, and handling lists of messages.
-.sh 2 "Message lists"
-.pp
-Several
-.i Mail
-commands accept a list of messages as an argument.
-Along with
-.b type
-and
-.b delete ,
-described in section 2,
-there is the
-.b from
-command, which prints the message headers associated with the
-message list passed to it.
-The
-.b from
-command is particularly useful in conjunction with some of the
-message list features described below.
-.pp
-A
-.i "message list"
-consists of a list of message numbers, ranges, and names,
-separated by spaces or tabs. Message numbers may be either
-decimal numbers, which directly specify messages, or one of the
-special characters
-.q \(ua
-.q "."
-or
-.q "$"
-to specify the first relevant, current, or last
-relevant message, respectively.
-.i Relevant
-here means, for most commands
-.q "not deleted"
-and
-.q "deleted"
-for the
-.b undelete
-command.
-.pp
-A range of messages consists of two message numbers (of the form
-described in the previous paragraph) separated by a dash.
-Thus, to print the first four messages, use
-.(l
-type 1\-4
-.)l
-and to print all the messages from the current message to the last
-message, use
-.(l
-type .\-$
-.)l
-.pp
-A
-.i name
-is a user name. The user names given in the message list are
-collected together and each message selected by other means
-is checked to make sure it was sent by one of the named users.
-If the message consists entirely of user names, then every
-message sent by one of those users that is
-.i relevant
-(in the sense described earlier)
-is selected. Thus, to print every message sent to you by
-.q root,
-do
-.(l
-type root
-.)l
-.pp
-As a shorthand notation, you can specify simply
-.q *
-to get every
-.i relevant
-(same sense)
-message. Thus,
-.(l
-type *
-.)l
-prints all undeleted messages,
-.(l
-delete *
-.)l
-deletes all undeleted messages, and
-.(l
-undelete *
-.)l
-undeletes all deleted messages.
-.pp
-You can search for the presence of a word in subject lines with
-.b / .
-For example, to print the headers of all messages that contain the
-word
-.q PASCAL,
-do:
-.(l
-from /pascal
-.)l
-Note that subject searching ignores upper/lower case differences.
-.sh 2 "List of commands"
-.pp
-This section describes all the
-.i Mail
-commands available when
-receiving mail.
-.ip "\fB\-\fP\ \ "
-The
-.rb \-
-command goes to the previous message and prints it. The
-.rb \-
-command may be given a decimal number
-.i n
-as an argument, in which case the
-.i n th
-previous message is gone to and printed.
-.ip "\fB?\fP\ \ "
-Prints a brief summary of commands.
-.ip "\fB!\fP\ \ "
-Used to preface a command to be executed by the shell.
-.ip "\fBPrint\fP\ \ "
-Like
-.b print ,
-but also print out ignored header fields. See also
-\fBprint\fP, \fBignore\fP and \fBretain\fP.
-\fBPrint\fP can be abbreviated to \fBP\fP.
-.ip "\fBReply\fP or \fBRespond\fP\ \ "
-Note the capital \fBR\fP in the name.
-Frame a reply to a one or more messages.
-The reply (or replies if you are using this on multiple messages)
-will be sent ONLY to the person who sent you the message
-(respectively, the set of people who sent the messages you are
-replying to).
-You can
-add people using the \fB~t\fP, \fB~c\fP and \fB~b\fP
-tilde escapes. The subject in your reply is formed by prefacing the
-subject in the original message with
-.q "Re:"
-unless it already began thus.
-If the original message included a
-.q "reply-to"
-header field, the reply will go
-.i only
-to the recipient named by
-.q "reply-to."
-You type in your message using the same conventions available to you
-through the
-.b mail
-command.
-The
-.b Reply
-command is especially useful for replying to messages that were sent
-to enormous distribution groups when you really just want to
-send a message to the originator. Use it often.
-\fBReply\fP (and \fBRespond\fP) can be abbreviated to \fBR\fP.
-.ip "\fBType\fP\ \ "
-Identical to the
-.b Print
-command.
-\fBType\fP can be abbreviated to \fBT\fP.
-.ip "\fBalias\fP\ \ "
-Define a name to stand for a set of other names.
-This is used when you want to send messages to a certain
-group of people and want to avoid retyping their names.
-For example
-.(l
-alias project john sue willie kathryn
-.)l
-creates an alias
-.i project
-which expands to the four people John, Sue, Willie, and Kathryn.
-If no arguments are given, all currently-defined aliases are printed.
-If one argument is given, that alias is printed (if it exists).
-\fBAlias\fP can be abbreviated to \fBa\fP.
-.ip "\fBalternates\fP\ \ "
-If you have accounts on several machines, you may find it convenient
-to use the /usr/lib/aliases on all the machines except one to direct
-your mail to a single account.
-The
-.b alternates
-command is used to inform
-.i Mail
-that each of these other addresses is really
-.i you .
-.i Alternates
-takes a list of user names and remembers that they are all actually you.
-When you
-.b reply
-to messages that were sent to one of these alternate names,
-.i Mail
-will not bother to send a copy of the message to this other address (which
-would simply be directed back to you by the alias mechanism).
-If
-.i alternates
-is given no argument, it lists the current set of alternate names.
-.b Alternates
-is usually used in the .mailrc file.
-\fBAlternates\fP can be abbreviated to \fBalt\fP.
-.ip "\fBchdir\fP\ \ "
-The
-.b chdir
-command allows you to change your current directory.
-.b Chdir
-takes a single argument, which is taken to be the pathname of
-the directory to change to. If no argument is given,
-.b chdir
-changes to your home directory.
-\fBChdir\fP can be abbreviated to \fBc\fP.
-.ip "\fBcopy\fP\ \ "
-The
-.b copy
-command does the same thing that
-.b save
-does, except that it does not mark the messages it is used on
-for deletion when you quit.
-\fBCopy\fP can be abbreviated to \fBco\fP.
-.ip "\fBdelete\fP\ \ "
-Deletes a list of messages. Deleted messages can be reclaimed
-with the
-.b undelete
-command.
-\fBDelete\fP can be abbreviated to \fBd\fP.
-.ip "\fBdp\fP or \fBdt\fP\ \ "
-These
-commands delete the current message and print the next message.
-They are useful for quickly reading and disposing of mail.
-If there is no next message, \fImail\fP says ``at EOF.''
-.ip "\fBedit\fP\ \ "
-To edit individual messages using the text editor, the
-.b edit
-command is provided. The
-.b edit
-command takes a list of messages as described under the
-.b type
-command and processes each by writing it into the file
-Message\c
-.i x
-where
-.i x
-is the message number being edited and executing the text editor on it.
-When you have edited the message to your satisfaction, write the message
-out and quit, upon which
-.i Mail
-will read the message back and remove the file.
-.b Edit
-can be abbreviated to
-.b e .
-.ip "\fBelse\fP\ \ "
-Marks the end of the then-part of an
-.b if
-statement and the beginning of the
-part to take effect if the condition of the
-.b if
-statement is false.
-.ip "\fBendif\fP\ \ "
-Marks the end of an
-.b if
-statement.
-.ip "\fBexit\fP or \fBxit\fP\ \ "
-Leave
-.i Mail
-without updating the system mailbox or the file your were reading.
-Thus, if you accidentally delete several messages, you can use
-.b exit
-to avoid scrambling your mailbox.
-\fBExit\fP can be abbreviated to \fBex\fP or \fBx\fP.
-.ip "\fBfile\fP\ \ "
-The same as
-.b folder .
-\fBFile\fP can be abbreviated to \fBfi\fP.
-.ip "\fBfolders\fP\ \ "
-List the names of the folders in your folder directory.
-.ip "\fBfolder\fP\ \ "
-The
-.b folder
-command switches to a new mail file or folder. With no arguments, it
-tells you which file you are currently reading. If you give
-it an argument, it will write out changes (such as deletions)
-you have made in the current file and read the new file.
-Some special conventions are recognized for the name:
-.(b
-.TS
-center;
-c c
-l a.
-Name Meaning
-_
-# Previous file read
-% Your system mailbox
-%name \fIName\fP's system mailbox
-& Your ~/mbox file
-+folder A file in your folder directory
-.TE
-.)b
-\fBFolder\fP can be abbreviated to \fBfo\fP.
-.ip "\fBfrom\fP\ \ "
-The
-.b from
-command takes a list of messages and prints out the header lines for each one;
-hence
-.(l
-from joe
-.)l
-is the easy way to display all the message headers from \*(lqjoe.\*(rq
-\fBFrom\fP can be abbreviated to \fBf\fP.
-.ip "\fBheaders\fP\ \ "
-When you start up
-.i Mail
-to read your mail, it lists the message headers that you have.
-These headers tell you who each message is from, when they were
-received, how many lines and characters each message is, and the
-.q "Subject:"
-header field of each message, if present. In addition,
-.i Mail
-tags the message header of each message that has been the object
-of the
-.b preserve
-command with a
-.q P.
-Messages that have been
-.b saved
-or
-.b written
-are flagged with a
-.q *.
-Finally,
-.b deleted
-messages are not printed at all. If you wish to reprint the current
-list of message headers, you can do so with the
-.b headers
-command. The
-.b headers
-command (and thus the initial header listing)
-only lists the first so many message headers.
-The number of headers listed depends on the speed of your
-terminal.
-This can be overridden by specifying the number of headers you
-want with the
-.i window
-option.
-.i Mail
-maintains a notion of the current
-.q window
-into your messages for the purposes of printing headers.
-Use the
-.b z
-command to move forward and back a window.
-You can move
-.i Mail's
-notion of the current window directly to a particular message by
-using, for example,
-.(l
-headers 40
-.)l
-to move
-.i Mail's
-attention to the messages around message 40.
-If a ``+'' argument is given, then the next screenful of message headers is
-printed, and if a ``\-'' argument is given, the previous screenful of message
-headers is printed.
-\fBHeaders\fP can be abbreviated to \fBh\fP.
-.ip "\fBhelp\fP\ \ "
-Print a brief and usually out of date help message about the commands
-in
-.i Mail .
-The
-.i man
-page for
-.i mail
-is usually more up-to-date than either the help message or this manual.
-It is also a synonym for \fB?\fP.
-.ip "\fBhold\fP\ \ "
-Arrange to hold a list of messages in the system mailbox, instead
-of moving them to the file
-.i mbox
-in your home directory. If you set the binary option
-.i hold ,
-this will happen by default.
-It does not override the \fBdelete\fP command.
-\fBHold\fP can be abbreviated to \fBho\fP.
-.ip "\fBif\fP\ \ "
-Commands in your
-.q .mailrc
-file can be executed conditionally depending on whether you are
-sending or receiving mail with the
-.b if
-command. For example, you can do:
-.(l
-if receive
- \fIcommands\fP...
-endif
-.)l
-An
-.b else
-form is also available:
-.(l
-if send
- \fIcommands\fP...
-else
- \fIcommands\fP...
-endif
-.)l
-Note that the only allowed conditions are
-.b receive
-and
-.b send .
-.ip "\fBignore\fP \ \ "
-.b N.B.:
-.i Ignore
-has been superseded by
-.i retain.
-.br
-Add the list of header fields named to the
-.i "ignore list" .
-Header fields in the ignore list are not printed on your
-terminal when you print a message. This allows you to suppress
-printing of certain machine-generated header fields, such as
-.i Via
-which are not usually of interest. The
-.b Type
-and
-.b Print
-commands can be used to print a message in its entirety, including
-ignored fields.
-If
-.b ignore
-is executed with no arguments, it lists the current set of ignored fields.
-.ip "\fBlist\fP\ \ "
-List the valid
-.i Mail
-commands.
-\fBList\fP can be abbreviated to \fBl\fP.
-.\".ip \fBlocal\fP
-.\"Define a list of local names for this host. This command is useful
-.\"when the host is known by more than one name. Names in the list
-.\"may be qualified be the domain of the host. The first name on the local
-.\"list is the
-.\".i distinguished
-.\"name of the host.
-.\"The names on the local list are used by
-.\".i Mail
-.\"to decide which addresses are local to the host.
-.\"For example:
-.\".(l
-.\"local ucbarpa.BERKELEY.ARPA arpa.BERKELEY.ARPA \\
-.\" arpavax.BERKELEY.ARPA r.BERKELEY.ARPA \\
-.\" ucb-arpa.ARPA
-.\".)l
-.\"From this list we see that
-.\".i "fred@ucbarpa.BERKELEY.ARPA",
-.\".i "harold@arpa.BERKELEY",
-.\"and
-.\".i "larry@r"
-.\"are all addresses of users on the local host.
-.\"The
-.\".b local
-.\"command is usually not used be general users since it is designed for
-.\"local configuration; it is usually found in the file /etc/mail.rc.
-.ip "\fBmail\fP\ \ "
-Send mail to one or more people. If you have the
-.i ask
-option set,
-.i Mail
-will prompt you for a subject to your message. Then you
-can type in your message, using tilde escapes as described in
-section 4 to edit, print, or modify your message. To signal your
-satisfaction with the message and send it, type control-d at the
-beginning of a line, or a . alone on a line if you set the option
-.i dot .
-To abort the message, type two interrupt characters (\s-2RUBOUT\s0
-by default) in a row or use the
-.b ~q
-escape.
-The \fBmail\fP command can be abbreviated to \fBm\fP.
-.ip "\fBmbox\fP\ \ "
-Indicate that a list of messages be sent to
-.i mbox
-in your home directory when you quit. This is the default
-action for messages if you do
-.i not
-have the
-.i hold
-option set.
-.ip "\fBnext\fP or \fB+\fP\ \ "
-The
-.b next
-command goes to the next message and types it. If given a message list,
-.b next
-goes to the first such message and types it. Thus,
-.(l
-next root
-.)l
-goes to the next message sent by
-.q root
-and types it. The
-.b next
-command can be abbreviated to simply a newline, which means that one
-can go to and type a message by simply giving its message number or
-one of the magic characters
-.q "^"
-.q "."
-or
-.q "$".
-Thus,
-.(l
-\&.
-.)l
-prints the current message and
-.(l
-4
-.)l
-prints message 4, as described previously.
-\fBNext\fP can be abbreviated to \fBn\fP.
-.ip "\fBpreserve\fP\ \ "
-Same as
-.b hold .
-Cause a list of messages to be held in your system mailbox when you quit.
-\fBPreserve\fP can be abbreviated to \fBpre\fP.
-.ip "\fBprint\fP\ \ "
-Print the specified messages. If the
-.b crt
-variable is set, messages longer than the number of lines it indicates
-are paged through the command specified by the \fBPAGER\fP variable.
-The \fBprint\fP command can be abbreviated to \fBp\fP.
-.ip "\fBquit\fP\ \ "
-Terminates the session, saving all undeleted, unsaved and unwritten messages
-in the user's \fImbox\fP file in their login directory
-(messages marked as having been read), preserving all
-messages marked with \fBhold\fP or \fBpreserve\fP or never referenced
-in their system mailbox.
-Any messages that were deleted, saved, written or saved to \fImbox\fP are
-removed from their system mailbox.
-If new mail has arrived during the session, the message
-``You have new mail'' is given. If given while editing a mailbox file
-with the \fB\-f\fP flag, then the edit file is rewritten.
-A return to the Shell is effected, unless the rewrite of edit file fails,
-in which case the user can escape with the \fBexit\fP command.
-\fBQuit\fP can be abbreviated to \fBq\fP.
-.ip "\fBreply\fP or \fBrespond\fP\ \ "
-Frame a reply to a single message.
-The reply will be sent to the
-person who sent you the message (to which you are replying), plus all
-the people who received the original message, except you. You can
-add people using the \fB~t\fP, \fB~c\fP and \fB~b\fP
-tilde escapes. The subject in your reply is formed by prefacing the
-subject in the original message with
-.q "Re:"
-unless it already began thus.
-If the original message included a
-.q "reply-to"
-header field, the reply will go
-.i only
-to the recipient named by
-.q "reply-to."
-You type in your message using the same conventions available to you
-through the
-.b mail
-command.
-The \fBreply\fP (and \fBrespond\fP) command can be abbreviated to \fBr\fP.
-.ip "\fBretain\fP\ \ "
-Add the list of header fields named to the \fIretained list\fP.
-Only the header fields in the retain list
-are shown on your terminal when you print a message.
-All other header fields are suppressed.
-The
-.b Type
-and
-.b Print
-commands can be used to print a message in its entirety.
-If
-.b retain
-is executed with no arguments, it lists the current set of
-retained fields.
-.ip "\fBsave\fP\ \ "
-It is often useful to be able to save messages on related topics
-in a file. The
-.b save
-command gives you the ability to do this. The
-.b save
-command takes as an argument a list of message numbers, followed by
-the name of the file in which to save the messages. The messages
-are appended to the named file, thus allowing one to keep several
-messages in the file, stored in the order they were put there.
-The filename in quotes, followed by the line
-count and character count is echoed on the user's terminal.
-An example of the
-.b save
-command relative to our running example is:
-.(l
-s 1 2 tuitionmail
-.)l
-.b Saved
-messages are not automatically saved in
-.i mbox
-at quit time, nor are they selected by the
-.b next
-command described above, unless explicitly specified.
-\fBSave\fP can be abbreviated to \fBs\fP.
-.ip "\fBset\fP\ \ "
-Set an option or give an option a value. Used to customize
-.i Mail .
-Section 5.3 contains a list of the options. Options can be
-.i binary ,
-in which case they are
-.i on
-or
-.i off ,
-or
-.i valued .
-To set a binary option
-.i option
-.i on ,
-do
-.(l
-set option
-.)l
-To give the valued option
-.i option
-the value
-.i value ,
-do
-.(l
-set option=value
-.)l
-There must be no space before or after the ``='' sign.
-If no arguments are given, all variable values are printed.
-Several options can be specified in a single
-.b set
-command.
-\fBSet\fP can be abbreviated to \fBse\fP.
-.ip "\fBshell\fP\ \ "
-The
-.b shell
-command allows you to
-escape to the shell.
-.b Shell
-invokes an interactive shell and allows you to type commands to it.
-When you leave the shell, you will return to
-.i Mail .
-The shell used is a default assumed by
-.i Mail ;
-you can override this default by setting the valued option
-.q SHELL,
-eg:
-.(l
-set SHELL=/bin/csh
-.)l
-\fBShell\fP can be abbreviated to \fBsh\fP.
-.ip "\fBsize\fP\ \ "
-Takes a message list and prints out the size in characters of each
-message.
-.ip "\fBsource\fP\ \ "
-The
-.b source
-command reads
-.i mail
-commands from a file. It is useful when you are trying to fix your
-.q .mailrc
-file and you need to re-read it.
-\fBSource\fP can be abbreviated to \fBso\fP.
-.ip "\fBtop\fP\ \ "
-The
-.b top
-command takes a message list and prints the first five lines
-of each addressed message.
-If you wish, you can change the number of lines that
-.b top
-prints out by setting the valued option
-.q "toplines."
-On a CRT terminal,
-.(l
-set toplines=10
-.)l
-might be preferred.
-\fBTop\fP can be abbreviated to \fBto\fP.
-.ip "\fBtype\fP\ \ "
-Same as \fBprint\fP.
-Takes a message list and types out each message on the terminal.
-The \fBtype\fP command can be abbreviated to \fBt\fP.
-.ip "\fBundelete\fP \ \"
-Takes a message list and marks each message as \fInot\fP
-being deleted.
-\fBUndelete\fP can be abbreviated to \fBu\fP.
-.ip "\fBunread\fP\ \ "
-Takes a message list and marks each message as
-.i not
-having been read.
-\fBUnread\fP can be abbreviated to \fBU\fP.
-.ip "\fBunset\fP\ \ "
-Takes a list of option names and discards their remembered values;
-the inverse of \fBset\fP .
-.ip "\fBvisual\fP\ \ "
-It is often useful to be able to invoke one of two editors,
-based on the type of terminal one is using. To invoke
-a display oriented editor, you can use the
-.b visual
-command. The operation of the
-.b visual
-command is otherwise identical to that of the
-.b edit
-command.
-.ne 2v+\n(psu
-.sp \n(psu
-Both the
-.b edit
-and
-.b visual
-commands assume some default text editors. These default editors
-can be overridden by the valued options
-.q EDITOR
-and
-.q VISUAL
-for the standard and screen editors. You might want to do:
-.(l
-set EDITOR=/usr/bin/ex VISUAL=/usr/bin/vi
-.)l
-\fBVisual\fP can be abbreviated to \fBv\fP.
-.ip "\fBwrite\fP\ \ "
-The
-.b save
-command always writes the entire message, including the headers,
-into the file. If you want to write just the message itself, you
-can use the
-.b write
-command. The
-.b write
-command has the same syntax as the
-.b save
-command, and can be abbreviated to simply
-.b w .
-Thus, we could write the second message by doing:
-.(l
-w 2 file.c
-.)l
-As suggested by this example, the
-.b write
-command is useful for such tasks as sending and receiving
-source program text over the message system.
-The filename in quotes, followed by the line
-count and character count is echoed on the user's terminal.
-.ip "\fBz\fP\ \ "
-.i Mail
-presents message headers in windowfuls as described under
-the
-.b headers
-command.
-You can move
-.i Mail's
-attention forward to the next window by giving the
-.(l
-z+
-.)l
-command. Analogously, you can move to the previous window with:
-.(l
-z\-
-.)l
-.sh 2 "Custom options"
-.pp
-Throughout this manual, we have seen examples of binary and valued options.
-This section describes each of the options in alphabetical order, including
-some that you have not seen yet.
-To avoid confusion, please note that the options are either
-all lower case letters or all upper case letters. When I start a sentence
-such as:
-.q "Ask"
-causes
-.i Mail
-to prompt you for a subject header,
-I am only capitalizing
-.q ask
-as a courtesy to English.
-.ip "\fBEDITOR\fP\ \ "
-The valued option
-.q EDITOR
-defines the pathname of the text editor to be used in the
-.b edit
-command and ~e. If not defined, a standard editor is used.
-.ip "\fBPAGER\fP\ \ "
-Pathname of the program to use for paginating output when
-it exceeds \fIcrt\fP lines.
-A default paginator is used if this option is not defined.
-.ip "\fBSHELL\fP\ \ "
-The valued option
-.q SHELL
-gives the path name of your shell. This shell is used for the
-.b !
-command and ~! escape. In addition, this shell expands
-file names with shell metacharacters like * and ? in them.
-.ip "\fBVISUAL\fP\ \ "
-The valued option
-.q VISUAL
-defines the pathname of the screen editor to be used in the
-.b visual
-command
-and ~v escape. A standard screen editor is used if you do not define one.
-.ip "\fBappend\fP\ \ "
-The
-.q append
-option is binary and
-causes messages saved in
-.i mbox
-to be appended to the end rather than prepended.
-Normally, \fIMail\fP will put messages in \fImbox\fP
-in the same order that the system puts messages in your system mailbox.
-By setting
-.q append,
-you are requesting that
-.i mbox
-be appended to regardless. It is in any event quicker to append.
-.ip "\fBask\fP\ \ "
-.q "Ask"
-is a binary option which
-causes
-.i Mail
-to prompt you for the subject of each message you send.
-If you respond with simply a newline, no subject field will be sent.
-.ip "\fBaskcc\fP\ \ "
-.q Askcc
-is a binary option which
-causes you to be prompted for additional carbon copy recipients at the
-end of each message. Responding with a newline shows your
-satisfaction with the current list.
-.ip "\fBautoprint\fP\ \ "
-.q Autoprint
-is a binary option which
-causes the
-.b delete
-command to behave like
-.b dp
-\*- thus, after deleting a message, the next one will be typed
-automatically. This is useful when quickly scanning and deleting
-messages in your mailbox.
-.ip "\fBcrt\fP \ \ "
-The valued option
-.q crt
-is used as a threshold to determine how long a message must
-be before
-.b PAGER
-is used to read it.
-.ip "\fBdebug\fP \ \ "
-The binary option
-.q debug
-causes debugging information to be displayed. Use of this
-option is the same as using the \fB\-d\fP command line flag.
-.ip "\fBdot\fP\ \ "
-.q Dot
-is a binary option which, if set, causes
-.i Mail
-to interpret a period alone on a line as the terminator
-of the message you are sending.
-.ip "\fBescape\fP\ \ "
-To allow you to change the escape character used when sending
-mail, you can set the valued option
-.q escape.
-Only the first character of the
-.q escape
-option is used, and it must be doubled if it is to appear as
-the first character of a line of your message. If you change your escape
-character, then ~ loses all its special meaning, and need no longer be doubled
-at the beginning of a line.
-.ip "\fBfolder\fP\ \ "
-The name of the directory to use for storing folders of messages.
-If this name begins with a `/'
-.i Mail
-considers it to be an absolute pathname; otherwise, the folder directory
-is found relative to your home directory.
-.ip "\fBhold\fP\ \ "
-The binary option
-.q hold
-causes messages that have been read but not manually dealt with
-to be held in the system mailbox. This prevents such messages from
-being automatically swept into your \fImbox\fP file.
-.ip "\fBignore\fP\ \ "
-The binary option
-.q ignore
-causes \s-2RUBOUT\s0 characters from your terminal to be ignored and echoed
-as @'s while you are sending mail. \s-2RUBOUT\s0 characters retain their
-original meaning in
-.i Mail
-command mode.
-Setting the
-.q ignore
-option is equivalent to supplying the
-.b \-i
-flag on the command line as described in section 6.
-.ip "\fBignoreeof\fP\ \ "
-An option related to
-.q dot
-is
-.q ignoreeof
-which makes
-.i Mail
-refuse to accept a control\-d as the end of a message.
-.q Ignoreeof
-also applies to
-.i Mail
-command mode.
-.ip "\fBkeep\fP\ \ "
-The
-.q keep
-option causes
-.i Mail
-to truncate your system mailbox instead of deleting it when it
-is empty. This is useful if you elect to protect your mailbox, which
-you would do with the shell command:
-.(l
-chmod 600 /var/mail/yourname
-.)l
-where
-.i yourname
-is your login name. If you do not do this, anyone can probably read
-your mail, although people usually don't.
-.ip "\fBkeepsave\fP\ \ "
-When you
-.b save
-a message,
-.i Mail
-usually discards it when you
-.b quit .
-To retain all saved messages, set the
-.q keepsave
-option.
-.ip "\fBmetoo\fP\ \ "
-When sending mail to an alias,
-.i Mail
-makes sure that if you are included in the alias, that mail will not
-be sent to you. This is useful if a single alias is being used by
-all members of the group. If however, you wish to receive a copy of
-all the messages you send to the alias, you can set the binary option
-.q metoo.
-.ip "\fBnoheader\fP\ \ "
-The binary option
-.q noheader
-suppresses the printing of the version and headers when
-.i Mail
-is first invoked. Setting this option is the same as using
-.b \-N
-on the command line.
-.ip "\fBnosave\fP\ \ "
-Normally,
-when you abort a message with two \s-2RUBOUTs\s0,
-.i Mail
-copies the partial letter to the file
-.q dead.letter
-in your home directory. Setting the binary option
-.q nosave
-prevents this.
-.ip "\fBReplyall\fP\ \ "
-Reverses the sense of
-.i reply
-and
-.i Reply
-commands.
-.ip "\fBquiet\fP\ \ "
-The binary option
-.q quiet
-suppresses the printing of the version when
-.i Mail
-is first invoked,
-as well as printing the for example
-.q "Message 4:"
-from the
-.b type
-command.
-.ip "\fBrecord\fP\ \ "
-If you love to keep records, then the
-valued option
-.q record
-can be set to the name of a file to save your outgoing mail.
-Each new message you send is appended to the end of the file.
-.ip "\fBscreen\fP\ \ "
-When
-.i Mail
-initially prints the message headers, it determines the number to
-print by looking at the speed of your terminal. The faster your
-terminal, the more it prints.
-The valued option
-.q screen
-overrides this calculation and
-specifies how many message headers you want printed.
-This number is also used for scrolling with the
-.b z
-command.
-.ip "\fBsendmail\fP\ \ "
-To use an alternate mail delivery system, set the
-.q sendmail
-option to the full pathname of the program to use. Note: this is not
-for everyone! Most people should use the default delivery system.
-.ip "\fBtoplines\fP\ \ "
-The valued option
-.q toplines
-defines the number of lines that the
-.q top
-command will print out instead of the default five lines.
-.ip "\fBverbose\fP\ \ "
-The binary option "verbose" causes
-.i Mail
-to invoke sendmail with the
-.b \-v
-flag, which causes it to go into verbose mode and announce expansion
-of aliases, etc. Setting the "verbose" option is equivalent to
-invoking
-.i Mail
-with the
-.b \-v
-flag as described in section 6.
diff --git a/usr.bin/mail/USD.doc/mail6.nr b/usr.bin/mail/USD.doc/mail6.nr
deleted file mode 100644
index 0465a94..0000000
--- a/usr.bin/mail/USD.doc/mail6.nr
+++ /dev/null
@@ -1,125 +0,0 @@
-.\" Copyright (c) 1980, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)mail6.nr 8.1 (Berkeley) 6/8/93
-.\"
-.bp
-.sh 1 "Command line options"
-.pp
-This section describes command line options for
-.i Mail
-and what they are used for.
-.ip \-N
-Suppress the initial printing of headers.
-.ip \-d
-Turn on debugging information. Not of general interest.
-.ip "\-f file\ \ "
-Show the messages in
-.i file
-instead of your system mailbox. If
-.i file
-is omitted,
-.i Mail
-reads
-.i mbox
-in your home directory.
-.ip \-i
-Ignore tty interrupt signals. Useful on noisy phone lines, which
-generate spurious RUBOUT or DELETE characters. It's usually
-more effective to change your interrupt character to control\-c,
-for which see the
-.i stty
-shell command.
-.ip \-n
-Inhibit reading of /etc/mail.rc. Not generally useful, since
-/etc/mail.rc is usually empty.
-.ip "\-s string"
-Used for sending mail.
-.i String
-is used as the subject of the message being composed. If
-.i string
-contains blanks, you must surround it with quote marks.
-.ip "\-u name"
-Read
-.i names's
-mail instead of your own. Unwitting others often neglect to protect
-their mailboxes, but discretion is advised. Essentially,
-.b "\-u user"
-is a shorthand way of doing
-.b "\-f /var/mail/user".
-.ip "\-v"
-Use the
-.b \-v
-flag when invoking sendmail. This feature may also be enabled
-by setting the the option "verbose".
-.pp
-The following command line flags are also recognized, but are
-intended for use by programs invoking
-.i Mail
-and not for people.
-.ip "\-T file"
-Arrange to print on
-.i file
-the contents of the
-.i article-id
-fields of all messages that were either read or deleted.
-.b \-T
-is for the
-.i readnews
-program and should NOT be used for reading your mail.
-.ip "\-h number"
-Pass on hop count information.
-.i Mail
-will take the number, increment it, and pass it with
-.b \-h
-to the mail delivery system.
-.b \-h
-only has effect when sending mail and is used for network mail
-forwarding.
-.ip "\-r name"
-Used for network mail forwarding: interpret
-.i name
-as the sender of the message. The
-.i name
-and
-.b \-r
-are simply sent along to the mail delivery system. Also,
-.i Mail
-will wait for the message to be sent and return the exit status.
-Also restricts formatting of message.
-.pp
-Note that
-.b \-h
-and
-.b \-r ,
-which are for network mail forwarding, are not used in practice
-since mail forwarding is now handled separately. They may
-disappear soon.
diff --git a/usr.bin/mail/USD.doc/mail7.nr b/usr.bin/mail/USD.doc/mail7.nr
deleted file mode 100644
index 0b2590b..0000000
--- a/usr.bin/mail/USD.doc/mail7.nr
+++ /dev/null
@@ -1,107 +0,0 @@
-.\" Copyright (c) 1980, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)mail7.nr 8.1 (Berkeley) 6/8/93
-.\"
-.sh 1 "Format of messages"
-.pp
-This section describes the format of messages.
-Messages begin with a
-.i from
-line, which consists of the word
-.q From
-followed by a user name, followed by anything, followed by
-a date in the format returned by the
-.i ctime
-library routine described in section 3 of the Unix Programmer's
-Manual. A possible
-.i ctime
-format date is:
-.(l
-Tue Dec 1 10:58:23 1981
-.)l
-The
-.i ctime
-date may be optionally followed by a single space and a
-time zone indication, which
-should be three capital letters, such as PDT.
-.pp
-Following the
-.i from
-line are zero or more
-.i "header field"
-lines.
-Each header field line is of the form:
-.(l
-name: information
-.)l
-.i Name
-can be anything, but only certain header fields are recognized as
-having any meaning. The recognized header fields are:
-.i article-id ,
-.i bcc ,
-.i cc ,
-.i from ,
-.i reply-to ,
-.i sender ,
-.i subject ,
-and
-.i to .
-Other header fields are also significant to other systems; see,
-for example, the current Arpanet message standard for much more
-information on this topic.
-A header field can be continued onto following lines by making the
-first character on the following line a space or tab character.
-.pp
-If any headers are present, they must be followed by a blank line.
-The part that follows is called the
-.i body
-of the message, and must be ASCII text, not containing null characters.
-Each line in the message body must be no longer than 512 characters and
-terminated with an ASCII newline character.
-If binary data must be passed through the mail system, it is suggested
-that this data be encoded in a system which encodes six bits into
-a printable character (i.e.: uuencode).
-For example, one could use the upper and lower case letters, the digits,
-and the characters comma and period to make up the 64 characters.
-Then, one can send a 16-bit binary number
-as three characters. These characters should be packed into lines,
-preferably lines about 70 characters long as long lines are transmitted
-more efficiently.
-.pp
-The message delivery system always adds a blank line to the end of
-each message. This blank line must not be deleted.
-.pp
-The UUCP message delivery system sometimes adds a blank line to
-the end of a message each time it is forwarded through a machine.
-.pp
-It should be noted that some network transport protocols enforce
-limits to the lengths of messages.
diff --git a/usr.bin/mail/USD.doc/mail8.nr b/usr.bin/mail/USD.doc/mail8.nr
deleted file mode 100644
index b09afbd..0000000
--- a/usr.bin/mail/USD.doc/mail8.nr
+++ /dev/null
@@ -1,75 +0,0 @@
-.\" Copyright (c) 1980, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)mail8.nr 8.1 (Berkeley) 6/8/93
-.\"
-.bp
-.sh 1 "Glossary"
-.pp
-This section contains the definitions of a few phrases
-peculiar to
-.i Mail .
-.ip "\fIalias\fP"
-An alternative name for a person or list of people.
-.ip "\fIflag\fP"
-An option, given on the command line of
-.i Mail ,
-prefaced with a \-. For example,
-.b \-f
-is a flag.
-.ip "\fIheader field\fP"
-At the beginning of a message, a line which contains information
-that is part of the structure of the message. Popular header fields
-include
-.i to ,
-.i cc ,
-and
-.i subject .
-.ip "\fImail\ \ \fP"
-A collection of messages. Often used in the phrase,
-.q "Have you read your mail?"
-.ip "\fImailbox\fP"
-The place where your mail is stored, typically in the directory
-/var/mail.
-.ip "\fImessage\fP"
-A single letter from someone, initially stored in your
-.i mailbox .
-.ip "\fImessage list\fP"
-A string used in
-.i Mail
-command mode to describe a sequence of messages.
-.ip "\fIoption\fP"
-A piece of special purpose information used to tailor
-.i Mail
-to your taste.
-Options are specified with the
-.b set
-command.
diff --git a/usr.bin/mail/USD.doc/mail9.nr b/usr.bin/mail/USD.doc/mail9.nr
deleted file mode 100644
index 271548e..0000000
--- a/usr.bin/mail/USD.doc/mail9.nr
+++ /dev/null
@@ -1,203 +0,0 @@
-.\" Copyright (c) 1980, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)mail9.nr 8.1 (Berkeley) 6/8/93
-.\"
-.bp
-.sh 1 "Summary of commands, options, and escapes"
-.pp
-This section gives a quick summary of the
-.i Mail
-commands, binary and valued options, and tilde escapes.
-.pp
-The following table describes the commands:
-.TS
-center ;
-c ci
-lb l.
-Command Description
-_
-+ Same as \fBnext\fP
-- Back up to previous message
-? Print brief summary of \fIMail\fP commands
-! Single command escape to shell
-Print Type message with ignored fields
-Reply Reply to author of message only
-Respond Same as \fBReply\fP
-Type Type message with ignored fields
-alias Define an alias as a set of user names
-alternates List other names you are known by
-chdir Change working directory, home by default
-copy Copy a message to a file or folder
-delete Delete a list of messages
-dp Same as \fBdt\fP
-dt Delete current message, type next message
-edit Edit a list of messages
-else Start of else part of conditional; see \fBif\fP
-endif End of conditional statement; see \fBif\fP
-exit Leave mail without changing anything
-file Interrogate/change current mail file
-folder Same as \fBfile\fP
-folders List the folders in your folder directory
-from List headers of a list of messages
-headers List current window of messages
-help Same as \fB?\fP
-hold Same as \fBpreserve\fP
-if Conditional execution of \fIMail\fP commands
-ignore Set/examine list of ignored header fields
-list List valid \fIMail\fP commands
-local List other names for the local host
-mail Send mail to specified names
-mbox Arrange to save a list of messages in \fImbox\fP
-next Go to next message and type it
-preserve Arrange to leave list of messages in system mailbox
-print Print messages
-quit Leave \fIMail\fP; update system mailbox, \fImbox\fP as appropriate
-reply Compose a reply to a message
-respond Same as \fBreply\fP
-retain Supersedes \fBignore\fP
-save Append messages, headers included, on a file
-set Set binary or valued options
-shell Invoke an interactive shell
-size Prints out size of message list
-source Read \fImail\fP commands from a file
-top Print first so many (5 by default) lines of list of messages
-type Same as \fBprint\fP
-undelete Undelete list of messages
-unread Marks list of messages as not been read
-unset Undo the operation of a \fBset\fP
-visual Invoke visual editor on a list of messages
-write Append messages to a file, don't include headers
-xit Same as \fBexit\fP
-z Scroll to next/previous screenful of headers
-.TE
-.bp
-.(b
-.pp
-The following table describes the options. Each option is
-shown as being either a binary or valued option.
-.TS
-center;
-c ci ci
-l ci l.
-Option Type Description
-_
-EDITOR valued Pathname of editor for ~e and \fBedit\fP
-PAGER valued Pathname of paginator for \fBPrint\fP, \fBprint\fP, \fBType\fP and \fBtype\fP
-SHELL valued Pathname of shell for \fBshell\fP, ~! and \fB!\fP
-VISUAL valued Pathname of screen editor for ~v, \fBvisual\fP
-append binary Always append messages to end of \fImbox\fP
-ask binary Prompt user for Subject: field when sending
-askcc binary Prompt user for additional Cc's at end of message
-autoprint binary Print next message after \fBdelete\fP
-crt valued Minimum number of lines before using \fBPAGER\fP
-debug binary Print out debugging information
-dot binary Accept . alone on line to terminate message input
-escape valued Escape character to be used instead of\ \ ~
-folder valued Directory to store folders in
-hold binary Hold messages in system mailbox by default
-ignore binary Ignore \s-2RUBOUT\s0 while sending mail
-ignoreeof binary Don't terminate letters/command input with \fB\(uaD\fP
-keep binary Don't unlink system mailbox when empty
-keepsave binary Don't delete \fBsave\fPd messages by default
-metoo binary Include sending user in aliases
-noheader binary Suppress initial printing of version and headers
-nosave binary Don't save partial letter in \fIdead.letter\fP
-quiet binary Suppress printing of \fIMail\fP version and message numbers
-record valued File to save all outgoing mail in
-screen valued Size of window of message headers for \fBz\fP, etc.
-sendmail valued Choose alternate mail delivery system
-toplines valued Number of lines to print in \fBtop\fP
-verbose binary Invoke sendmail with the \fB\-v\fP flag
-.TE
-.)b
-.(b
-.pp
-The following table summarizes the tilde escapes available
-while sending mail.
-.TS
-center;
-c ci ci
-l li l.
-Escape Arguments Description
-_
-~! command Execute shell command
-~b name ... Add names to "blind" Cc: list
-~c name ... Add names to Cc: field
-~d Read \fIdead.letter\fP into message
-~e Invoke text editor on partial message
-~f messages Read named messages
-~h Edit the header fields
-~m messages Read named messages, right shift by tab
-~p Print message entered so far
-~q Abort entry of letter; like \s-2RUBOUT\s0
-~r filename Read file into message
-~s string Set Subject: field to \fIstring\fP
-~t name ... Add names to To: field
-~v Invoke screen editor on message
-~w filename Write message on file
-~| command Pipe message through \fIcommand\fP
-~: Mail command Execute a \fIMail\fP command
-~~ string Quote a ~ in front of \fIstring\fP
-.TE
-.)b
-.(b
-.pp
-The following table shows the command line flags that
-.i Mail
-accepts:
-.TS
-center;
-c c
-l a.
-Flag Description
-_
-\-N Suppress the initial printing of headers
-\-T \fIfile\fP Article-id's of read/deleted messages to \fIfile\fP
-\-d Turn on debugging
-\-f \fIfile\fP Show messages in \fIfile\fP or \fI~/mbox\fP
-\-h \fInumber\fP Pass on hop count for mail forwarding
-\-i Ignore tty interrupt signals
-\-n Inhibit reading of /etc/mail.rc
-\-r \fIname\fP Pass on \fIname\fP for mail forwarding
-\-s \fIstring\fP Use \fIstring\fP as subject in outgoing mail
-\-u \fIname\fP Read \fIname's\fP mail instead of your own
-\-v Invoke sendmail with the \fB\-v\fP flag
-.TE
-.)b
-.lp
-Notes:
-.b \-T ,
-.b \-d ,
-.b \-h ,
-and
-.b \-r
-are not for human use.
diff --git a/usr.bin/mail/USD.doc/maila.nr b/usr.bin/mail/USD.doc/maila.nr
deleted file mode 100644
index 84b01fe..0000000
--- a/usr.bin/mail/USD.doc/maila.nr
+++ /dev/null
@@ -1,33 +0,0 @@
-.\" Copyright (c) 1980, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)maila.nr 8.1 (Berkeley) 6/8/93
-.\"
diff --git a/usr.bin/mail/aux.c b/usr.bin/mail/aux.c
deleted file mode 100644
index e764aac..0000000
--- a/usr.bin/mail/aux.c
+++ /dev/null
@@ -1,632 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)aux.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/time.h>
-
-#include "rcv.h"
-#include "extern.h"
-
-/*
- * Mail -- a mail program
- *
- * Auxiliary functions.
- */
-
-static char *save2str(char *, char *);
-
-/*
- * Return a pointer to a dynamic copy of the argument.
- */
-char *
-savestr(str)
- char *str;
-{
- char *new;
- int size = strlen(str) + 1;
-
- if ((new = salloc(size)) != NULL)
- bcopy(str, new, size);
- return (new);
-}
-
-/*
- * Make a copy of new argument incorporating old one.
- */
-static char *
-save2str(str, old)
- char *str, *old;
-{
- char *new;
- int newsize = strlen(str) + 1;
- int oldsize = old ? strlen(old) + 1 : 0;
-
- if ((new = salloc(newsize + oldsize)) != NULL) {
- if (oldsize) {
- bcopy(old, new, oldsize);
- new[oldsize - 1] = ' ';
- }
- bcopy(str, new + oldsize, newsize);
- }
- return (new);
-}
-
-/*
- * Touch the named message by setting its MTOUCH flag.
- * Touched messages have the effect of not being sent
- * back to the system mailbox on exit.
- */
-void
-touch(mp)
- struct message *mp;
-{
-
- mp->m_flag |= MTOUCH;
- if ((mp->m_flag & MREAD) == 0)
- mp->m_flag |= MREAD|MSTATUS;
-}
-
-/*
- * Test to see if the passed file name is a directory.
- * Return true if it is.
- */
-int
-isdir(name)
- char name[];
-{
- struct stat sbuf;
-
- if (stat(name, &sbuf) < 0)
- return (0);
- return (S_ISDIR(sbuf.st_mode));
-}
-
-/*
- * Count the number of arguments in the given string raw list.
- */
-int
-argcount(argv)
- char **argv;
-{
- char **ap;
-
- for (ap = argv; *ap++ != NULL;)
- ;
- return (ap - argv - 1);
-}
-
-/*
- * Return the desired header line from the passed message
- * pointer (or NULL if the desired header field is not available).
- */
-char *
-hfield(field, mp)
- const char *field;
- struct message *mp;
-{
- FILE *ibuf;
- char linebuf[LINESIZE];
- int lc;
- char *hfield;
- char *colon, *oldhfield = NULL;
-
- ibuf = setinput(mp);
- if ((lc = mp->m_lines - 1) < 0)
- return (NULL);
- if (readline(ibuf, linebuf, LINESIZE) < 0)
- return (NULL);
- while (lc > 0) {
- if ((lc = gethfield(ibuf, linebuf, lc, &colon)) < 0)
- return (oldhfield);
- if ((hfield = ishfield(linebuf, colon, field)) != NULL)
- oldhfield = save2str(hfield, oldhfield);
- }
- return (oldhfield);
-}
-
-/*
- * Return the next header field found in the given message.
- * Return >= 0 if something found, < 0 elsewise.
- * "colon" is set to point to the colon in the header.
- * Must deal with \ continuations & other such fraud.
- */
-int
-gethfield(f, linebuf, rem, colon)
- FILE *f;
- char linebuf[];
- int rem;
- char **colon;
-{
- char line2[LINESIZE];
- char *cp, *cp2;
- int c;
-
- for (;;) {
- if (--rem < 0)
- return (-1);
- if ((c = readline(f, linebuf, LINESIZE)) <= 0)
- return (-1);
- for (cp = linebuf; isprint((unsigned char)*cp) && *cp != ' ' && *cp != ':';
- cp++)
- ;
- if (*cp != ':' || cp == linebuf)
- continue;
- /*
- * I guess we got a headline.
- * Handle wraparounding
- */
- *colon = cp;
- cp = linebuf + c;
- for (;;) {
- while (--cp >= linebuf && (*cp == ' ' || *cp == '\t'))
- ;
- cp++;
- if (rem <= 0)
- break;
- ungetc(c = getc(f), f);
- if (c != ' ' && c != '\t')
- break;
- if ((c = readline(f, line2, LINESIZE)) < 0)
- break;
- rem--;
- for (cp2 = line2; *cp2 == ' ' || *cp2 == '\t'; cp2++)
- ;
- c -= cp2 - line2;
- if (cp + c >= linebuf + LINESIZE - 2)
- break;
- *cp++ = ' ';
- bcopy(cp2, cp, c);
- cp += c;
- }
- *cp = 0;
- return (rem);
- }
- /* NOTREACHED */
-}
-
-/*
- * Check whether the passed line is a header line of
- * the desired breed. Return the field body, or 0.
- */
-
-char*
-ishfield(linebuf, colon, field)
- char linebuf[];
- char *colon;
- const char *field;
-{
- char *cp = colon;
-
- *cp = 0;
- if (strcasecmp(linebuf, field) != 0) {
- *cp = ':';
- return (0);
- }
- *cp = ':';
- for (cp++; *cp == ' ' || *cp == '\t'; cp++)
- ;
- return (cp);
-}
-
-/*
- * Copy a string and lowercase the result.
- * dsize: space left in buffer (including space for NULL)
- */
-void
-istrncpy(dest, src, dsize)
- char *dest;
- const char *src;
- size_t dsize;
-{
-
- strlcpy(dest, src, dsize);
- while (*dest)
- *dest++ = tolower((unsigned char)*dest);
-}
-
-/*
- * The following code deals with input stacking to do source
- * commands. All but the current file pointer are saved on
- * the stack.
- */
-
-static int ssp; /* Top of file stack */
-struct sstack {
- FILE *s_file; /* File we were in. */
- int s_cond; /* Saved state of conditionals */
- int s_loading; /* Loading .mailrc, etc. */
-};
-#define SSTACK_SIZE 64 /* XXX was NOFILE. */
-static struct sstack sstack[SSTACK_SIZE];
-
-/*
- * Pushdown current input file and switch to a new one.
- * Set the global flag "sourcing" so that others will realize
- * that they are no longer reading from a tty (in all probability).
- */
-int
-source(arglist)
- char **arglist;
-{
- FILE *fi;
- char *cp;
-
- if ((cp = expand(*arglist)) == NULL)
- return (1);
- if ((fi = Fopen(cp, "r")) == NULL) {
- warn("%s", cp);
- return (1);
- }
- if (ssp >= SSTACK_SIZE - 1) {
- printf("Too much \"sourcing\" going on.\n");
- (void)Fclose(fi);
- return (1);
- }
- sstack[ssp].s_file = input;
- sstack[ssp].s_cond = cond;
- sstack[ssp].s_loading = loading;
- ssp++;
- loading = 0;
- cond = CANY;
- input = fi;
- sourcing++;
- return (0);
-}
-
-/*
- * Pop the current input back to the previous level.
- * Update the "sourcing" flag as appropriate.
- */
-int
-unstack()
-{
- if (ssp <= 0) {
- printf("\"Source\" stack over-pop.\n");
- sourcing = 0;
- return (1);
- }
- (void)Fclose(input);
- if (cond != CANY)
- printf("Unmatched \"if\"\n");
- ssp--;
- cond = sstack[ssp].s_cond;
- loading = sstack[ssp].s_loading;
- input = sstack[ssp].s_file;
- if (ssp == 0)
- sourcing = loading;
- return (0);
-}
-
-/*
- * Touch the indicated file.
- * This is nifty for the shell.
- */
-void
-alter(name)
- char *name;
-{
- struct stat sb;
- struct timeval tv[2];
-
- if (stat(name, &sb))
- return;
- (void)gettimeofday(&tv[0], (struct timezone *)NULL);
- tv[0].tv_sec++;
- TIMESPEC_TO_TIMEVAL(&tv[1], &sb.st_mtimespec);
- (void)utimes(name, tv);
-}
-
-/*
- * Get sender's name from this message. If the message has
- * a bunch of arpanet stuff in it, we may have to skin the name
- * before returning it.
- */
-char *
-nameof(mp, reptype)
- struct message *mp;
- int reptype;
-{
- char *cp, *cp2;
-
- cp = skin(name1(mp, reptype));
- if (reptype != 0 || charcount(cp, '!') < 2)
- return (cp);
- cp2 = strrchr(cp, '!');
- cp2--;
- while (cp2 > cp && *cp2 != '!')
- cp2--;
- if (*cp2 == '!')
- return (cp2 + 1);
- return (cp);
-}
-
-/*
- * Start of a "comment".
- * Ignore it.
- */
-char *
-skip_comment(cp)
- char *cp;
-{
- int nesting = 1;
-
- for (; nesting > 0 && *cp; cp++) {
- switch (*cp) {
- case '\\':
- if (cp[1])
- cp++;
- break;
- case '(':
- nesting++;
- break;
- case ')':
- nesting--;
- break;
- }
- }
- return (cp);
-}
-
-/*
- * Skin an arpa net address according to the RFC 822 interpretation
- * of "host-phrase."
- */
-char *
-skin(name)
- char *name;
-{
- char *nbuf, *bufend, *cp, *cp2;
- int c, gotlt, lastsp;
-
- if (name == NULL)
- return (NULL);
- if (strchr(name, '(') == NULL && strchr(name, '<') == NULL
- && strchr(name, ' ') == NULL)
- return (name);
-
- /* We assume that length(input) <= length(output) */
- if ((nbuf = malloc(strlen(name) + 1)) == NULL)
- err(1, "Out of memory");
- gotlt = 0;
- lastsp = 0;
- bufend = nbuf;
- for (cp = name, cp2 = bufend; (c = *cp++) != '\0'; ) {
- switch (c) {
- case '(':
- cp = skip_comment(cp);
- lastsp = 0;
- break;
-
- case '"':
- /*
- * Start of a "quoted-string".
- * Copy it in its entirety.
- */
- while ((c = *cp) != '\0') {
- cp++;
- if (c == '"')
- break;
- if (c != '\\')
- *cp2++ = c;
- else if ((c = *cp) != '\0') {
- *cp2++ = c;
- cp++;
- }
- }
- lastsp = 0;
- break;
-
- case ' ':
- if (cp[0] == 'a' && cp[1] == 't' && cp[2] == ' ')
- cp += 3, *cp2++ = '@';
- else
- if (cp[0] == '@' && cp[1] == ' ')
- cp += 2, *cp2++ = '@';
- else
- lastsp = 1;
- break;
-
- case '<':
- cp2 = bufend;
- gotlt++;
- lastsp = 0;
- break;
-
- case '>':
- if (gotlt) {
- gotlt = 0;
- while ((c = *cp) != '\0' && c != ',') {
- cp++;
- if (c == '(')
- cp = skip_comment(cp);
- else if (c == '"')
- while ((c = *cp) != '\0') {
- cp++;
- if (c == '"')
- break;
- if (c == '\\' && *cp != '\0')
- cp++;
- }
- }
- lastsp = 0;
- break;
- }
- /* FALLTHROUGH */
-
- default:
- if (lastsp) {
- lastsp = 0;
- *cp2++ = ' ';
- }
- *cp2++ = c;
- if (c == ',' && *cp == ' ' && !gotlt) {
- *cp2++ = ' ';
- while (*++cp == ' ')
- ;
- lastsp = 0;
- bufend = cp2;
- }
- }
- }
- *cp2 = '\0';
-
- if ((cp = realloc(nbuf, strlen(nbuf) + 1)) != NULL)
- nbuf = cp;
- return (nbuf);
-}
-
-/*
- * Fetch the sender's name from the passed message.
- * Reptype can be
- * 0 -- get sender's name for display purposes
- * 1 -- get sender's name for reply
- * 2 -- get sender's name for Reply
- */
-char *
-name1(mp, reptype)
- struct message *mp;
- int reptype;
-{
- char namebuf[LINESIZE];
- char linebuf[LINESIZE];
- char *cp, *cp2;
- FILE *ibuf;
- int first = 1;
-
- if ((cp = hfield("from", mp)) != NULL)
- return (cp);
- if (reptype == 0 && (cp = hfield("sender", mp)) != NULL)
- return (cp);
- ibuf = setinput(mp);
- namebuf[0] = '\0';
- if (readline(ibuf, linebuf, LINESIZE) < 0)
- return (savestr(namebuf));
-newname:
- for (cp = linebuf; *cp != '\0' && *cp != ' '; cp++)
- ;
- for (; *cp == ' ' || *cp == '\t'; cp++)
- ;
- for (cp2 = &namebuf[strlen(namebuf)];
- *cp != '\0' && *cp != ' ' && *cp != '\t' &&
- cp2 < namebuf + LINESIZE - 1;)
- *cp2++ = *cp++;
- *cp2 = '\0';
- if (readline(ibuf, linebuf, LINESIZE) < 0)
- return (savestr(namebuf));
- if ((cp = strchr(linebuf, 'F')) == NULL)
- return (savestr(namebuf));
- if (strncmp(cp, "From", 4) != 0)
- return (savestr(namebuf));
- while ((cp = strchr(cp, 'r')) != NULL) {
- if (strncmp(cp, "remote", 6) == 0) {
- if ((cp = strchr(cp, 'f')) == NULL)
- break;
- if (strncmp(cp, "from", 4) != 0)
- break;
- if ((cp = strchr(cp, ' ')) == NULL)
- break;
- cp++;
- if (first) {
- cp2 = namebuf;
- first = 0;
- } else
- cp2 = strrchr(namebuf, '!') + 1;
- strlcpy(cp2, cp, sizeof(namebuf) - (cp2 - namebuf) - 1);
- strcat(namebuf, "!");
- goto newname;
- }
- cp++;
- }
- return (savestr(namebuf));
-}
-
-/*
- * Count the occurances of c in str
- */
-int
-charcount(str, c)
- char *str;
- int c;
-{
- char *cp;
- int i;
-
- for (i = 0, cp = str; *cp != '\0'; cp++)
- if (*cp == c)
- i++;
- return (i);
-}
-
-/*
- * See if the given header field is supposed to be ignored.
- */
-int
-isign(field, ignore)
- const char *field;
- struct ignoretab ignore[2];
-{
- char realfld[LINESIZE];
-
- if (ignore == ignoreall)
- return (1);
- /*
- * Lower-case the string, so that "Status" and "status"
- * will hash to the same place.
- */
- istrncpy(realfld, field, sizeof(realfld));
- if (ignore[1].i_count > 0)
- return (!member(realfld, ignore + 1));
- else
- return (member(realfld, ignore));
-}
-
-int
-member(realfield, table)
- char *realfield;
- struct ignoretab *table;
-{
- struct ignore *igp;
-
- for (igp = table->i_head[hash(realfield)]; igp != NULL; igp = igp->i_link)
- if (*igp->i_field == *realfield &&
- equal(igp->i_field, realfield))
- return (1);
- return (0);
-}
diff --git a/usr.bin/mail/cmd1.c b/usr.bin/mail/cmd1.c
deleted file mode 100644
index be1b6f6..0000000
--- a/usr.bin/mail/cmd1.c
+++ /dev/null
@@ -1,485 +0,0 @@
-/*-
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)cmd1.c 8.2 (Berkeley) 4/20/95";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "rcv.h"
-#include "extern.h"
-
-/*
- * Mail -- a mail program
- *
- * User commands.
- */
-
-extern const struct cmd cmdtab[];
-
-/*
- * Print the current active headings.
- * Don't change dot if invoker didn't give an argument.
- */
-
-static int screen;
-
-int
-headers(msgvec)
- int *msgvec;
-{
- int n, mesg, flag, size;
- struct message *mp;
-
- size = screensize();
- n = msgvec[0];
- if (n != 0)
- screen = (n-1)/size;
- if (screen < 0)
- screen = 0;
- mp = &message[screen * size];
- if (mp >= &message[msgCount])
- mp = &message[msgCount - size];
- if (mp < &message[0])
- mp = &message[0];
- flag = 0;
- mesg = mp - &message[0];
- if (dot != &message[n-1])
- dot = mp;
- for (; mp < &message[msgCount]; mp++) {
- mesg++;
- if (mp->m_flag & MDELETED)
- continue;
- if (flag++ >= size)
- break;
- printhead(mesg);
- }
- if (flag == 0) {
- printf("No more mail.\n");
- return (1);
- }
- return (0);
-}
-
-/*
- * Scroll to the next/previous screen
- */
-int
-scroll(arg)
- char arg[];
-{
- int s, size;
- int cur[1];
-
- cur[0] = 0;
- size = screensize();
- s = screen;
- switch (*arg) {
- case 0:
- case '+':
- s++;
- if (s * size >= msgCount) {
- printf("On last screenful of messages\n");
- return (0);
- }
- screen = s;
- break;
-
- case '-':
- if (--s < 0) {
- printf("On first screenful of messages\n");
- return (0);
- }
- screen = s;
- break;
-
- default:
- printf("Unrecognized scrolling command \"%s\"\n", arg);
- return (1);
- }
- return (headers(cur));
-}
-
-/*
- * Compute screen size.
- */
-int
-screensize()
-{
- int s;
- char *cp;
-
- if ((cp = value("screen")) != NULL && (s = atoi(cp)) > 0)
- return (s);
- return (screenheight - 4);
-}
-
-/*
- * Print out the headlines for each message
- * in the passed message list.
- */
-int
-from(msgvec)
- int *msgvec;
-{
- int *ip;
-
- for (ip = msgvec; *ip != 0; ip++)
- printhead(*ip);
- if (--ip >= msgvec)
- dot = &message[*ip - 1];
- return (0);
-}
-
-/*
- * Print out the header of a specific message.
- * This is a slight improvement to the standard one.
- */
-void
-printhead(mesg)
- int mesg;
-{
- struct message *mp;
- char headline[LINESIZE], wcount[LINESIZE], *subjline, dispc, curind;
- char pbuf[BUFSIZ];
- struct headline hl;
- int subjlen;
- char *name;
-
- mp = &message[mesg-1];
- (void)readline(setinput(mp), headline, LINESIZE);
- if ((subjline = hfield("subject", mp)) == NULL)
- subjline = hfield("subj", mp);
- /*
- * Bletch!
- */
- curind = dot == mp ? '>' : ' ';
- dispc = ' ';
- if (mp->m_flag & MSAVED)
- dispc = '*';
- if (mp->m_flag & MPRESERVE)
- dispc = 'P';
- if ((mp->m_flag & (MREAD|MNEW)) == MNEW)
- dispc = 'N';
- if ((mp->m_flag & (MREAD|MNEW)) == 0)
- dispc = 'U';
- if (mp->m_flag & MBOX)
- dispc = 'M';
- parse(headline, &hl, pbuf);
- sprintf(wcount, "%3ld/%-5ld", mp->m_lines, mp->m_size);
- subjlen = screenwidth - 50 - strlen(wcount);
- name = value("show-rcpt") != NULL ?
- skin(hfield("to", mp)) : nameof(mp, 0);
- if (subjline == NULL || subjlen < 0) /* pretty pathetic */
- printf("%c%c%3d %-20.20s %16.16s %s\n",
- curind, dispc, mesg, name, hl.l_date, wcount);
- else
- printf("%c%c%3d %-20.20s %16.16s %s \"%.*s\"\n",
- curind, dispc, mesg, name, hl.l_date, wcount,
- subjlen, subjline);
-}
-
-/*
- * Print out the value of dot.
- */
-int
-pdot()
-{
- printf("%d\n", dot - &message[0] + 1);
- return (0);
-}
-
-/*
- * Print out all the possible commands.
- */
-int
-pcmdlist()
-{
- const struct cmd *cp;
- int cc;
-
- printf("Commands are:\n");
- for (cc = 0, cp = cmdtab; cp->c_name != NULL; cp++) {
- cc += strlen(cp->c_name) + 2;
- if (cc > 72) {
- printf("\n");
- cc = strlen(cp->c_name) + 2;
- }
- if ((cp+1)->c_name != NULL)
- printf("%s, ", cp->c_name);
- else
- printf("%s\n", cp->c_name);
- }
- return (0);
-}
-
-/*
- * Paginate messages, honor ignored fields.
- */
-int
-more(msgvec)
- int *msgvec;
-{
-
- return (type1(msgvec, 1, 1));
-}
-
-/*
- * Paginate messages, even printing ignored fields.
- */
-int
-More(msgvec)
- int *msgvec;
-{
-
- return (type1(msgvec, 0, 1));
-}
-
-/*
- * Type out messages, honor ignored fields.
- */
-int
-type(msgvec)
- int *msgvec;
-{
-
- return (type1(msgvec, 1, 0));
-}
-
-/*
- * Type out messages, even printing ignored fields.
- */
-int
-Type(msgvec)
- int *msgvec;
-{
-
- return (type1(msgvec, 0, 0));
-}
-
-/*
- * Type out the messages requested.
- */
-static jmp_buf pipestop;
-int
-type1(msgvec, doign, page)
- int *msgvec;
- int doign, page;
-{
- int nlines, *ip;
- struct message *mp;
- char *cp;
- FILE *obuf;
-
- obuf = stdout;
- if (setjmp(pipestop))
- goto close_pipe;
- if (value("interactive") != NULL &&
- (page || (cp = value("crt")) != NULL)) {
- nlines = 0;
- if (!page) {
- for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++)
- nlines += message[*ip - 1].m_lines;
- }
- if (page || nlines > (*cp ? atoi(cp) : realscreenheight)) {
- cp = value("PAGER");
- if (cp == NULL || *cp == '\0')
- cp = _PATH_MORE;
- obuf = Popen(cp, "w");
- if (obuf == NULL) {
- warnx("%s", cp);
- obuf = stdout;
- } else
- (void)signal(SIGPIPE, brokpipe);
- }
- }
-
- /*
- * Send messages to the output.
- *
- */
- for (ip = msgvec; *ip && ip - msgvec < msgCount; ip++) {
- mp = &message[*ip - 1];
- touch(mp);
- dot = mp;
- if (value("quiet") == NULL)
- fprintf(obuf, "Message %d:\n", *ip);
- (void)sendmessage(mp, obuf, doign ? ignore : 0, NULL);
- }
-
-close_pipe:
- if (obuf != stdout) {
- /*
- * Ignore SIGPIPE so it can't cause a duplicate close.
- */
- (void)signal(SIGPIPE, SIG_IGN);
- (void)Pclose(obuf);
- (void)signal(SIGPIPE, SIG_DFL);
- }
- return (0);
-}
-
-/*
- * Respond to a broken pipe signal --
- * probably caused by quitting more.
- */
-/*ARGSUSED*/
-void
-brokpipe(signo)
- int signo;
-{
- longjmp(pipestop, 1);
-}
-
-/*
- * Print the top so many lines of each desired message.
- * The number of lines is taken from the variable "toplines"
- * and defaults to 5.
- */
-int
-top(msgvec)
- int *msgvec;
-{
- int *ip;
- struct message *mp;
- int c, topl, lines, lineb;
- char *valtop, linebuf[LINESIZE];
- FILE *ibuf;
-
- topl = 5;
- valtop = value("toplines");
- if (valtop != NULL) {
- topl = atoi(valtop);
- if (topl < 0 || topl > 10000)
- topl = 5;
- }
- lineb = 1;
- for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++) {
- mp = &message[*ip - 1];
- touch(mp);
- dot = mp;
- if (value("quiet") == NULL)
- printf("Message %d:\n", *ip);
- ibuf = setinput(mp);
- c = mp->m_lines;
- if (!lineb)
- printf("\n");
- for (lines = 0; lines < c && lines <= topl; lines++) {
- if (readline(ibuf, linebuf, sizeof(linebuf)) < 0)
- break;
- puts(linebuf);
- lineb = strspn(linebuf, " \t") == strlen(linebuf);
- }
- }
- return (0);
-}
-
-/*
- * Touch all the given messages so that they will
- * get mboxed.
- */
-int
-stouch(msgvec)
- int msgvec[];
-{
- int *ip;
-
- for (ip = msgvec; *ip != 0; ip++) {
- dot = &message[*ip-1];
- dot->m_flag |= MTOUCH;
- dot->m_flag &= ~MPRESERVE;
- }
- return (0);
-}
-
-/*
- * Make sure all passed messages get mboxed.
- */
-int
-mboxit(msgvec)
- int msgvec[];
-{
- int *ip;
-
- for (ip = msgvec; *ip != 0; ip++) {
- dot = &message[*ip-1];
- dot->m_flag |= MTOUCH|MBOX;
- dot->m_flag &= ~MPRESERVE;
- }
- return (0);
-}
-
-/*
- * List the folders the user currently has.
- */
-int
-folders()
-{
- char dirname[PATHSIZE];
- char *cmd;
-
- if (getfold(dirname, sizeof(dirname)) < 0) {
- printf("No value set for \"folder\"\n");
- return (1);
- }
- if ((cmd = value("LISTER")) == NULL)
- cmd = "ls";
- (void)run_command(cmd, 0, -1, -1, dirname, NULL, NULL);
- return (0);
-}
-
-/*
- * Update the mail file with any new messages that have
- * come in since we started reading mail.
- */
-int
-inc(v)
- void *v;
-{
- int nmsg, mdot;
-
- nmsg = incfile();
-
- if (nmsg == 0)
- printf("No new mail.\n");
- else if (nmsg > 0) {
- mdot = newfileinfo(msgCount - nmsg);
- dot = &message[mdot - 1];
- } else
- printf("\"inc\" command failed...\n");
-
- return (0);
-}
diff --git a/usr.bin/mail/cmd2.c b/usr.bin/mail/cmd2.c
deleted file mode 100644
index 15cf04a..0000000
--- a/usr.bin/mail/cmd2.c
+++ /dev/null
@@ -1,534 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)cmd2.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "rcv.h"
-#include <sys/wait.h>
-#include "extern.h"
-
-/*
- * Mail -- a mail program
- *
- * More user commands.
- */
-
-extern int wait_status;
-
-/*
- * If any arguments were given, go to the next applicable argument
- * following dot, otherwise, go to the next applicable message.
- * If given as first command with no arguments, print first message.
- */
-int
-next(msgvec)
- int *msgvec;
-{
- struct message *mp;
- int *ip, *ip2, list[2], mdot;
-
- if (*msgvec != 0) {
-
- /*
- * If some messages were supplied, find the
- * first applicable one following dot using
- * wrap around.
- */
-
- mdot = dot - &message[0] + 1;
-
- /*
- * Find the first message in the supplied
- * message list which follows dot.
- */
-
- for (ip = msgvec; *ip != 0; ip++)
- if (*ip > mdot)
- break;
- if (*ip == 0)
- ip = msgvec;
- ip2 = ip;
- do {
- mp = &message[*ip2 - 1];
- if ((mp->m_flag & MDELETED) == 0) {
- dot = mp;
- goto hitit;
- }
- if (*ip2 != 0)
- ip2++;
- if (*ip2 == 0)
- ip2 = msgvec;
- } while (ip2 != ip);
- printf("No messages applicable\n");
- return (1);
- }
-
- /*
- * If this is the first command, select message 1.
- * Note that this must exist for us to get here at all.
- */
-
- if (!sawcom)
- goto hitit;
-
- /*
- * Just find the next good message after dot, no
- * wraparound.
- */
-
- for (mp = dot+1; mp < &message[msgCount]; mp++)
- if ((mp->m_flag & (MDELETED|MSAVED)) == 0)
- break;
- if (mp >= &message[msgCount]) {
- printf("At EOF\n");
- return (0);
- }
- dot = mp;
-hitit:
- /*
- * Print dot.
- */
-
- list[0] = dot - &message[0] + 1;
- list[1] = 0;
- return (type(list));
-}
-
-/*
- * Save a message in a file. Mark the message as saved
- * so we can discard when the user quits.
- */
-int
-save(str)
- char str[];
-{
-
- return (save1(str, 1, "save", saveignore));
-}
-
-/*
- * Copy a message to a file without affected its saved-ness
- */
-int
-copycmd(str)
- char str[];
-{
-
- return (save1(str, 0, "copy", saveignore));
-}
-
-/*
- * Save/copy the indicated messages at the end of the passed file name.
- * If mark is true, mark the message "saved."
- */
-int
-save1(str, mark, cmd, ignore)
- char str[];
- int mark;
- const char *cmd;
- struct ignoretab *ignore;
-{
- struct message *mp;
- char *file;
- const char *disp;
- int f, *msgvec, *ip;
- FILE *obuf;
-
- msgvec = (int *)salloc((msgCount + 2) * sizeof(*msgvec));
- if ((file = snarf(str, &f)) == NULL)
- return (1);
- if (!f) {
- *msgvec = first(0, MMNORM);
- if (*msgvec == 0) {
- printf("No messages to %s.\n", cmd);
- return (1);
- }
- msgvec[1] = 0;
- }
- if (f && getmsglist(str, msgvec, 0) < 0)
- return (1);
- if ((file = expand(file)) == NULL)
- return (1);
- printf("\"%s\" ", file);
- (void)fflush(stdout);
- if (access(file, 0) >= 0)
- disp = "[Appended]";
- else
- disp = "[New file]";
- if ((obuf = Fopen(file, "a")) == NULL) {
- warn((char *)NULL);
- return (1);
- }
- for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++) {
- mp = &message[*ip - 1];
- touch(mp);
- if (sendmessage(mp, obuf, ignore, NULL) < 0) {
- warnx("%s", file);
- (void)Fclose(obuf);
- return (1);
- }
- if (mark)
- mp->m_flag |= MSAVED;
- }
- (void)fflush(obuf);
- if (ferror(obuf))
- warn("%s", file);
- (void)Fclose(obuf);
- printf("%s\n", disp);
- return (0);
-}
-
-/*
- * Write the indicated messages at the end of the passed
- * file name, minus header and trailing blank line.
- */
-int
-swrite(str)
- char str[];
-{
-
- return (save1(str, 1, "write", ignoreall));
-}
-
-/*
- * Snarf the file from the end of the command line and
- * return a pointer to it. If there is no file attached,
- * just return NULL. Put a null in front of the file
- * name so that the message list processing won't see it,
- * unless the file name is the only thing on the line, in
- * which case, return 0 in the reference flag variable.
- */
-
-char *
-snarf(linebuf, flag)
- char linebuf[];
- int *flag;
-{
- char *cp;
-
- *flag = 1;
- cp = strlen(linebuf) + linebuf - 1;
-
- /*
- * Strip away trailing blanks.
- */
-
- while (cp > linebuf && isspace((unsigned char)*cp))
- cp--;
- *++cp = '\0';
-
- /*
- * Now search for the beginning of the file name.
- */
-
- while (cp > linebuf && !isspace((unsigned char)*cp))
- cp--;
- if (*cp == '\0') {
- printf("No file specified.\n");
- return (NULL);
- }
- if (isspace((unsigned char)*cp))
- *cp++ = '\0';
- else
- *flag = 0;
- return (cp);
-}
-
-/*
- * Delete messages.
- */
-int
-delete(msgvec)
- int msgvec[];
-{
-
- delm(msgvec);
- return (0);
-}
-
-/*
- * Delete messages, then type the new dot.
- */
-int
-deltype(msgvec)
- int msgvec[];
-{
- int list[2];
- int lastdot;
-
- lastdot = dot - &message[0] + 1;
- if (delm(msgvec) >= 0) {
- list[0] = dot - &message[0] + 1;
- if (list[0] > lastdot) {
- touch(dot);
- list[1] = 0;
- return (type(list));
- }
- printf("At EOF\n");
- } else
- printf("No more messages\n");
- return (0);
-}
-
-/*
- * Delete the indicated messages.
- * Set dot to some nice place afterwards.
- * Internal interface.
- */
-int
-delm(msgvec)
- int *msgvec;
-{
- struct message *mp;
- int *ip, last;
-
- last = 0;
- for (ip = msgvec; *ip != 0; ip++) {
- mp = &message[*ip - 1];
- touch(mp);
- mp->m_flag |= MDELETED|MTOUCH;
- mp->m_flag &= ~(MPRESERVE|MSAVED|MBOX);
- last = *ip;
- }
- if (last != 0) {
- dot = &message[last-1];
- last = first(0, MDELETED);
- if (last != 0) {
- dot = &message[last-1];
- return (0);
- }
- else {
- dot = &message[0];
- return (-1);
- }
- }
-
- /*
- * Following can't happen -- it keeps lint happy
- */
-
- return (-1);
-}
-
-/*
- * Undelete the indicated messages.
- */
-int
-undelete_messages(msgvec)
- int *msgvec;
-{
- struct message *mp;
- int *ip;
-
- for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++) {
- mp = &message[*ip - 1];
- touch(mp);
- dot = mp;
- mp->m_flag &= ~MDELETED;
- }
- return (0);
-}
-
-/*
- * Interactively dump core on "core"
- */
-int
-core()
-{
- int pid;
-
- switch (pid = fork()) {
- case -1:
- warn("fork");
- return (1);
- case 0:
- abort();
- _exit(1);
- }
- printf("Okie dokie");
- (void)fflush(stdout);
- wait_child(pid);
- if (WIFSIGNALED(wait_status) && WCOREDUMP(wait_status))
- printf(" -- Core dumped.\n");
- else
- printf(" -- Can't dump core.\n");
- return (0);
-}
-
-/*
- * Clobber as many bytes of stack as the user requests.
- */
-int
-clobber(argv)
- char **argv;
-{
- int times;
-
- if (argv[0] == 0)
- times = 1;
- else
- times = (atoi(argv[0]) + 511) / 512;
- clob1(times);
- return (0);
-}
-
-/*
- * Clobber the stack.
- */
-void
-clob1(n)
- int n;
-{
- char buf[512];
- char *cp;
-
- if (n <= 0)
- return;
- for (cp = buf; cp < &buf[512]; *cp++ = 0xFF)
- ;
- clob1(n - 1);
-}
-
-/*
- * Add the given header fields to the retained list.
- * If no arguments, print the current list of retained fields.
- */
-int
-retfield(list)
- char *list[];
-{
-
- return (ignore1(list, ignore + 1, "retained"));
-}
-
-/*
- * Add the given header fields to the ignored list.
- * If no arguments, print the current list of ignored fields.
- */
-int
-igfield(list)
- char *list[];
-{
-
- return (ignore1(list, ignore, "ignored"));
-}
-
-int
-saveretfield(list)
- char *list[];
-{
-
- return (ignore1(list, saveignore + 1, "retained"));
-}
-
-int
-saveigfield(list)
- char *list[];
-{
-
- return (ignore1(list, saveignore, "ignored"));
-}
-
-int
-ignore1(list, tab, which)
- char *list[];
- struct ignoretab *tab;
- const char *which;
-{
- char field[LINESIZE];
- int h;
- struct ignore *igp;
- char **ap;
-
- if (*list == NULL)
- return (igshow(tab, which));
- for (ap = list; *ap != 0; ap++) {
- istrncpy(field, *ap, sizeof(field));
- if (member(field, tab))
- continue;
- h = hash(field);
- igp = calloc(1, sizeof(struct ignore));
- igp->i_field = calloc((unsigned)strlen(field) + 1,
- sizeof(char));
- strcpy(igp->i_field, field);
- igp->i_link = tab->i_head[h];
- tab->i_head[h] = igp;
- tab->i_count++;
- }
- return (0);
-}
-
-/*
- * Print out all currently retained fields.
- */
-int
-igshow(tab, which)
- struct ignoretab *tab;
- const char *which;
-{
- int h;
- struct ignore *igp;
- char **ap, **ring;
-
- if (tab->i_count == 0) {
- printf("No fields currently being %s.\n", which);
- return (0);
- }
- ring = (char **)salloc((tab->i_count + 1) * sizeof(char *));
- ap = ring;
- for (h = 0; h < HSHSIZE; h++)
- for (igp = tab->i_head[h]; igp != NULL; igp = igp->i_link)
- *ap++ = igp->i_field;
- *ap = 0;
- qsort(ring, tab->i_count, sizeof(char *), igcomp);
- for (ap = ring; *ap != 0; ap++)
- printf("%s\n", *ap);
- return (0);
-}
-
-/*
- * Compare two names for sorting ignored field list.
- */
-int
-igcomp(l, r)
- const void *l, *r;
-{
-
- return (strcmp(*(const char **)l, *(const char **)r));
-}
diff --git a/usr.bin/mail/cmd3.c b/usr.bin/mail/cmd3.c
deleted file mode 100644
index c9b7c6a..0000000
--- a/usr.bin/mail/cmd3.c
+++ /dev/null
@@ -1,741 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)cmd3.c 8.2 (Berkeley) 4/20/95";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "rcv.h"
-#include "extern.h"
-
-/*
- * Mail -- a mail program
- *
- * Still more user commands.
- */
-
-/*
- * Process a shell escape by saving signals, ignoring signals,
- * and forking a sh -c
- */
-int
-shell(str)
- char *str;
-{
- sig_t sigint = signal(SIGINT, SIG_IGN);
- char *sh;
- char cmd[BUFSIZ];
-
- if (strlcpy(cmd, str, sizeof(cmd)) >= sizeof(cmd))
- return (1);
- if (bangexp(cmd, sizeof(cmd)) < 0)
- return (1);
- if ((sh = value("SHELL")) == NULL)
- sh = _PATH_CSHELL;
- (void)run_command(sh, 0, -1, -1, "-c", cmd, NULL);
- (void)signal(SIGINT, sigint);
- printf("!\n");
- return (0);
-}
-
-/*
- * Fork an interactive shell.
- */
-/*ARGSUSED*/
-int
-dosh(str)
- char *str;
-{
- sig_t sigint = signal(SIGINT, SIG_IGN);
- char *sh;
-
- if ((sh = value("SHELL")) == NULL)
- sh = _PATH_CSHELL;
- (void)run_command(sh, 0, -1, -1, NULL, NULL, NULL);
- (void)signal(SIGINT, sigint);
- printf("\n");
- return (0);
-}
-
-/*
- * Expand the shell escape by expanding unescaped !'s into the
- * last issued command where possible.
- */
-int
-bangexp(str, strsize)
- char *str;
- size_t strsize;
-{
- char bangbuf[BUFSIZ];
- static char lastbang[BUFSIZ];
- char *cp, *cp2;
- int n, changed = 0;
-
- cp = str;
- cp2 = bangbuf;
- n = sizeof(bangbuf);
- while (*cp != '\0') {
- if (*cp == '!') {
- if (n < strlen(lastbang)) {
-overf:
- printf("Command buffer overflow\n");
- return (-1);
- }
- changed++;
- if (strlcpy(cp2, lastbang, sizeof(bangbuf) - (cp2 - bangbuf))
- >= sizeof(bangbuf) - (cp2 - bangbuf))
- goto overf;
- cp2 += strlen(lastbang);
- n -= strlen(lastbang);
- cp++;
- continue;
- }
- if (*cp == '\\' && cp[1] == '!') {
- if (--n <= 1)
- goto overf;
- *cp2++ = '!';
- cp += 2;
- changed++;
- }
- if (--n <= 1)
- goto overf;
- *cp2++ = *cp++;
- }
- *cp2 = 0;
- if (changed) {
- printf("!%s\n", bangbuf);
- (void)fflush(stdout);
- }
- if (strlcpy(str, bangbuf, strsize) >= strsize)
- goto overf;
- if (strlcpy(lastbang, bangbuf, sizeof(lastbang)) >= sizeof(lastbang))
- goto overf;
- return (0);
-}
-
-/*
- * Print out a nice help message from some file or another.
- */
-
-int
-help()
-{
- int c;
- FILE *f;
-
- if ((f = Fopen(_PATH_HELP, "r")) == NULL) {
- warn("%s", _PATH_HELP);
- return (1);
- }
- while ((c = getc(f)) != EOF)
- putchar(c);
- (void)Fclose(f);
- return (0);
-}
-
-/*
- * Change user's working directory.
- */
-int
-schdir(arglist)
- char **arglist;
-{
- char *cp;
-
- if (*arglist == NULL) {
- if (homedir == NULL)
- return (1);
- cp = homedir;
- } else
- if ((cp = expand(*arglist)) == NULL)
- return (1);
- if (chdir(cp) < 0) {
- warn("%s", cp);
- return (1);
- }
- return (0);
-}
-
-int
-respond(msgvec)
- int *msgvec;
-{
- if (value("Replyall") == NULL && value("flipr") == NULL)
- return (dorespond(msgvec));
- else
- return (doRespond(msgvec));
-}
-
-/*
- * Reply to a list of messages. Extract each name from the
- * message header and send them off to mail1()
- */
-int
-dorespond(msgvec)
- int *msgvec;
-{
- struct message *mp;
- char *cp, *rcv, *replyto;
- char **ap;
- struct name *np;
- struct header head;
-
- if (msgvec[1] != 0) {
- printf("Sorry, can't reply to multiple messages at once\n");
- return (1);
- }
- mp = &message[msgvec[0] - 1];
- touch(mp);
- dot = mp;
- if ((rcv = skin(hfield("from", mp))) == NULL)
- rcv = skin(nameof(mp, 1));
- if ((replyto = skin(hfield("reply-to", mp))) != NULL)
- np = extract(replyto, GTO);
- else if ((cp = skin(hfield("to", mp))) != NULL)
- np = extract(cp, GTO);
- else
- np = NULL;
- np = elide(np);
- /*
- * Delete my name from the reply list,
- * and with it, all my alternate names.
- */
- np = delname(np, myname);
- if (altnames)
- for (ap = altnames; *ap != NULL; ap++)
- np = delname(np, *ap);
- if (np != NULL && replyto == NULL)
- np = cat(np, extract(rcv, GTO));
- else if (np == NULL) {
- if (replyto != NULL)
- printf("Empty reply-to field -- replying to author\n");
- np = extract(rcv, GTO);
- }
- head.h_to = np;
- if ((head.h_subject = hfield("subject", mp)) == NULL)
- head.h_subject = hfield("subj", mp);
- head.h_subject = reedit(head.h_subject);
- if (replyto == NULL && (cp = skin(hfield("cc", mp))) != NULL) {
- np = elide(extract(cp, GCC));
- np = delname(np, myname);
- if (altnames != 0)
- for (ap = altnames; *ap != NULL; ap++)
- np = delname(np, *ap);
- head.h_cc = np;
- } else
- head.h_cc = NULL;
- head.h_bcc = NULL;
- head.h_smopts = NULL;
- head.h_replyto = value("REPLYTO");
- head.h_inreplyto = skin(hfield("message-id", mp));
- mail1(&head, 1);
- return (0);
-}
-
-/*
- * Modify the subject we are replying to to begin with Re: if
- * it does not already.
- */
-char *
-reedit(subj)
- char *subj;
-{
- char *newsubj;
-
- if (subj == NULL)
- return (NULL);
- if ((subj[0] == 'r' || subj[0] == 'R') &&
- (subj[1] == 'e' || subj[1] == 'E') &&
- subj[2] == ':')
- return (subj);
- newsubj = salloc(strlen(subj) + 5);
- sprintf(newsubj, "Re: %s", subj);
- return (newsubj);
-}
-
-/*
- * Preserve the named messages, so that they will be sent
- * back to the system mailbox.
- */
-int
-preserve(msgvec)
- int *msgvec;
-{
- int *ip, mesg;
- struct message *mp;
-
- if (edit) {
- printf("Cannot \"preserve\" in edit mode\n");
- return (1);
- }
- for (ip = msgvec; *ip != 0; ip++) {
- mesg = *ip;
- mp = &message[mesg-1];
- mp->m_flag |= MPRESERVE;
- mp->m_flag &= ~MBOX;
- dot = mp;
- }
- return (0);
-}
-
-/*
- * Mark all given messages as unread.
- */
-int
-unread(msgvec)
- int msgvec[];
-{
- int *ip;
-
- for (ip = msgvec; *ip != 0; ip++) {
- dot = &message[*ip-1];
- dot->m_flag &= ~(MREAD|MTOUCH);
- dot->m_flag |= MSTATUS;
- }
- return (0);
-}
-
-/*
- * Print the size of each message.
- */
-int
-messize(msgvec)
- int *msgvec;
-{
- struct message *mp;
- int *ip, mesg;
-
- for (ip = msgvec; *ip != 0; ip++) {
- mesg = *ip;
- mp = &message[mesg-1];
- printf("%d: %ld/%ld\n", mesg, mp->m_lines, mp->m_size);
- }
- return (0);
-}
-
-/*
- * Quit quickly. If we are sourcing, just pop the input level
- * by returning an error.
- */
-int
-rexit(e)
- int e;
-{
- if (sourcing)
- return (1);
- exit(0);
- /*NOTREACHED*/
-}
-
-/*
- * Set or display a variable value. Syntax is similar to that
- * of csh.
- */
-int
-set(arglist)
- char **arglist;
-{
- struct var *vp;
- char *cp, *cp2;
- char varbuf[BUFSIZ], **ap, **p;
- int errs, h, s;
-
- if (*arglist == NULL) {
- for (h = 0, s = 1; h < HSHSIZE; h++)
- for (vp = variables[h]; vp != NULL; vp = vp->v_link)
- s++;
- ap = (char **)salloc(s * sizeof(*ap));
- for (h = 0, p = ap; h < HSHSIZE; h++)
- for (vp = variables[h]; vp != NULL; vp = vp->v_link)
- *p++ = vp->v_name;
- *p = NULL;
- sort(ap);
- for (p = ap; *p != NULL; p++)
- printf("%s\t%s\n", *p, value(*p));
- return (0);
- }
- errs = 0;
- for (ap = arglist; *ap != NULL; ap++) {
- cp = *ap;
- cp2 = varbuf;
- while (cp2 < varbuf + sizeof(varbuf) - 1 && *cp != '=' && *cp != '\0')
- *cp2++ = *cp++;
- *cp2 = '\0';
- if (*cp == '\0')
- cp = "";
- else
- cp++;
- if (equal(varbuf, "")) {
- printf("Non-null variable name required\n");
- errs++;
- continue;
- }
- assign(varbuf, cp);
- }
- return (errs);
-}
-
-/*
- * Unset a bunch of variable values.
- */
-int
-unset(arglist)
- char **arglist;
-{
- struct var *vp, *vp2;
- int errs, h;
- char **ap;
-
- errs = 0;
- for (ap = arglist; *ap != NULL; ap++) {
- if ((vp2 = lookup(*ap)) == NULL) {
- if (getenv(*ap))
- unsetenv(*ap);
- else if (!sourcing) {
- printf("\"%s\": undefined variable\n", *ap);
- errs++;
- }
- continue;
- }
- h = hash(*ap);
- if (vp2 == variables[h]) {
- variables[h] = variables[h]->v_link;
- vfree(vp2->v_name);
- vfree(vp2->v_value);
- (void)free(vp2);
- continue;
- }
- for (vp = variables[h]; vp->v_link != vp2; vp = vp->v_link)
- ;
- vp->v_link = vp2->v_link;
- vfree(vp2->v_name);
- vfree(vp2->v_value);
- (void)free(vp2);
- }
- return (errs);
-}
-
-/*
- * Put add users to a group.
- */
-int
-group(argv)
- char **argv;
-{
- struct grouphead *gh;
- struct group *gp;
- char **ap, *gname, **p;
- int h, s;
-
- if (*argv == NULL) {
- for (h = 0, s = 1; h < HSHSIZE; h++)
- for (gh = groups[h]; gh != NULL; gh = gh->g_link)
- s++;
- ap = (char **)salloc(s * sizeof(*ap));
- for (h = 0, p = ap; h < HSHSIZE; h++)
- for (gh = groups[h]; gh != NULL; gh = gh->g_link)
- *p++ = gh->g_name;
- *p = NULL;
- sort(ap);
- for (p = ap; *p != NULL; p++)
- printgroup(*p);
- return (0);
- }
- if (argv[1] == NULL) {
- printgroup(*argv);
- return (0);
- }
- gname = *argv;
- h = hash(gname);
- if ((gh = findgroup(gname)) == NULL) {
- gh = calloc(sizeof(*gh), 1);
- gh->g_name = vcopy(gname);
- gh->g_list = NULL;
- gh->g_link = groups[h];
- groups[h] = gh;
- }
-
- /*
- * Insert names from the command list into the group.
- * Who cares if there are duplicates? They get tossed
- * later anyway.
- */
-
- for (ap = argv+1; *ap != NULL; ap++) {
- gp = calloc(sizeof(*gp), 1);
- gp->ge_name = vcopy(*ap);
- gp->ge_link = gh->g_list;
- gh->g_list = gp;
- }
- return (0);
-}
-
-/*
- * Sort the passed string vecotor into ascending dictionary
- * order.
- */
-void
-sort(list)
- char **list;
-{
- char **ap;
-
- for (ap = list; *ap != NULL; ap++)
- ;
- if (ap-list < 2)
- return;
- qsort(list, ap-list, sizeof(*list), diction);
-}
-
-/*
- * Do a dictionary order comparison of the arguments from
- * qsort.
- */
-int
-diction(a, b)
- const void *a, *b;
-{
- return (strcmp(*(const char **)a, *(const char **)b));
-}
-
-/*
- * The do nothing command for comments.
- */
-
-/*ARGSUSED*/
-int
-null(e)
- int e;
-{
- return (0);
-}
-
-/*
- * Change to another file. With no argument, print information about
- * the current file.
- */
-int
-file(argv)
- char **argv;
-{
-
- if (argv[0] == NULL) {
- newfileinfo(0);
- return (0);
- }
- if (setfile(*argv) < 0)
- return (1);
- announce();
- return (0);
-}
-
-/*
- * Expand file names like echo
- */
-int
-echo(argv)
- char **argv;
-{
- char **ap, *cp;
-
- for (ap = argv; *ap != NULL; ap++) {
- cp = *ap;
- if ((cp = expand(cp)) != NULL) {
- if (ap != argv)
- printf(" ");
- printf("%s", cp);
- }
- }
- printf("\n");
- return (0);
-}
-
-int
-Respond(msgvec)
- int *msgvec;
-{
- if (value("Replyall") == NULL && value("flipr") == NULL)
- return (doRespond(msgvec));
- else
- return (dorespond(msgvec));
-}
-
-/*
- * Reply to a series of messages by simply mailing to the senders
- * and not messing around with the To: and Cc: lists as in normal
- * reply.
- */
-int
-doRespond(msgvec)
- int msgvec[];
-{
- struct header head;
- struct message *mp;
- int *ap;
- char *cp, *mid;
-
- head.h_to = NULL;
- for (ap = msgvec; *ap != 0; ap++) {
- mp = &message[*ap - 1];
- touch(mp);
- dot = mp;
- if ((cp = skin(hfield("from", mp))) == NULL)
- cp = skin(nameof(mp, 2));
- head.h_to = cat(head.h_to, extract(cp, GTO));
- mid = skin(hfield("message-id", mp));
- }
- if (head.h_to == NULL)
- return (0);
- mp = &message[msgvec[0] - 1];
- if ((head.h_subject = hfield("subject", mp)) == NULL)
- head.h_subject = hfield("subj", mp);
- head.h_subject = reedit(head.h_subject);
- head.h_cc = NULL;
- head.h_bcc = NULL;
- head.h_smopts = NULL;
- head.h_replyto = value("REPLYTO");
- head.h_inreplyto = mid;
- mail1(&head, 1);
- return (0);
-}
-
-/*
- * Conditional commands. These allow one to parameterize one's
- * .mailrc and do some things if sending, others if receiving.
- */
-int
-ifcmd(argv)
- char **argv;
-{
- char *cp;
-
- if (cond != CANY) {
- printf("Illegal nested \"if\"\n");
- return (1);
- }
- cond = CANY;
- cp = argv[0];
- switch (*cp) {
- case 'r': case 'R':
- cond = CRCV;
- break;
-
- case 's': case 'S':
- cond = CSEND;
- break;
-
- default:
- printf("Unrecognized if-keyword: \"%s\"\n", cp);
- return (1);
- }
- return (0);
-}
-
-/*
- * Implement 'else'. This is pretty simple -- we just
- * flip over the conditional flag.
- */
-int
-elsecmd()
-{
-
- switch (cond) {
- case CANY:
- printf("\"Else\" without matching \"if\"\n");
- return (1);
-
- case CSEND:
- cond = CRCV;
- break;
-
- case CRCV:
- cond = CSEND;
- break;
-
- default:
- printf("Mail's idea of conditions is screwed up\n");
- cond = CANY;
- break;
- }
- return (0);
-}
-
-/*
- * End of if statement. Just set cond back to anything.
- */
-int
-endifcmd()
-{
-
- if (cond == CANY) {
- printf("\"Endif\" without matching \"if\"\n");
- return (1);
- }
- cond = CANY;
- return (0);
-}
-
-/*
- * Set the list of alternate names.
- */
-int
-alternates(namelist)
- char **namelist;
-{
- int c;
- char **ap, **ap2, *cp;
-
- c = argcount(namelist) + 1;
- if (c == 1) {
- if (altnames == 0)
- return (0);
- for (ap = altnames; *ap != NULL; ap++)
- printf("%s ", *ap);
- printf("\n");
- return (0);
- }
- if (altnames != 0)
- (void)free(altnames);
- altnames = calloc((unsigned)c, sizeof(char *));
- for (ap = namelist, ap2 = altnames; *ap != NULL; ap++, ap2++) {
- cp = calloc((unsigned)strlen(*ap) + 1, sizeof(char));
- strcpy(cp, *ap);
- *ap2 = cp;
- }
- *ap2 = 0;
- return (0);
-}
diff --git a/usr.bin/mail/cmdtab.c b/usr.bin/mail/cmdtab.c
deleted file mode 100644
index b350cce..0000000
--- a/usr.bin/mail/cmdtab.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)cmdtab.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "def.h"
-#include "extern.h"
-
-/*
- * Mail -- a mail program
- *
- * Define all of the command names and bindings.
- */
-
-const struct cmd cmdtab[] = {
- /* msgmask msgflag */
- /* command function argtype result & mask */
- /* ------- -------- ------- ------ ------- */
- { "next", next, NDMLIST, 0, MMNDEL },
- { "alias", group, M|RAWLIST, 0, 1000 },
- { "print", type, MSGLIST, 0, MMNDEL },
- { "type", type, MSGLIST, 0, MMNDEL },
- { "Type", Type, MSGLIST, 0, MMNDEL },
- { "Print", Type, MSGLIST, 0, MMNDEL },
- { "visual", visual, I|MSGLIST, 0, MMNORM },
- { "top", top, MSGLIST, 0, MMNDEL },
- { "touch", stouch, W|MSGLIST, 0, MMNDEL },
- { "preserve", preserve, W|MSGLIST, 0, MMNDEL },
- { "delete", delete, W|P|MSGLIST, 0, MMNDEL },
- { "dp", deltype, W|MSGLIST, 0, MMNDEL },
- { "dt", deltype, W|MSGLIST, 0, MMNDEL },
- { "undelete", undelete_messages, P|MSGLIST, MDELETED,MMNDEL },
- { "unset", unset, M|RAWLIST, 1, 1000 },
- { "mail", sendmail, R|M|I|STRLIST, 0, 0 },
- { "mbox", mboxit, W|MSGLIST, 0, 0 },
- { "more", more, MSGLIST, 0, MMNDEL },
- { "page", more, MSGLIST, 0, MMNDEL },
- { "More", More, MSGLIST, 0, MMNDEL },
- { "Page", More, MSGLIST, 0, MMNDEL },
- { "unread", unread, MSGLIST, 0, MMNDEL },
- { "!", shell, I|STRLIST, 0, 0 },
- { "copy", copycmd, M|STRLIST, 0, 0 },
- { "chdir", schdir, M|RAWLIST, 0, 1 },
- { "cd", schdir, M|RAWLIST, 0, 1 },
- { "save", save, STRLIST, 0, 0 },
- { "source", source, M|RAWLIST, 1, 1 },
- { "set", set, M|RAWLIST, 0, 1000 },
- { "shell", dosh, I|NOLIST, 0, 0 },
- { "version", pversion, M|NOLIST, 0, 0 },
- { "group", group, M|RAWLIST, 0, 1000 },
- { "write", swrite, STRLIST, 0, 0 },
- { "from", from, MSGLIST, 0, MMNORM },
- { "file", file, T|M|RAWLIST, 0, 1 },
- { "folder", file, T|M|RAWLIST, 0, 1 },
- { "folders", folders, T|M|NOLIST, 0, 0 },
- { "?", help, M|NOLIST, 0, 0 },
- { "z", scroll, M|STRLIST, 0, 0 },
- { "headers", headers, MSGLIST, 0, MMNDEL },
- { "help", help, M|NOLIST, 0, 0 },
- { "=", pdot, NOLIST, 0, 0 },
- { "Reply", Respond, R|I|MSGLIST, 0, MMNDEL },
- { "Respond", Respond, R|I|MSGLIST, 0, MMNDEL },
- { "reply", respond, R|I|MSGLIST, 0, MMNDEL },
- { "respond", respond, R|I|MSGLIST, 0, MMNDEL },
- { "edit", editor, I|MSGLIST, 0, MMNORM },
- { "echo", echo, M|RAWLIST, 0, 1000 },
- { "quit", quitcmd, NOLIST, 0, 0 },
- { "list", pcmdlist, M|NOLIST, 0, 0 },
- { "xit", rexit, M|NOLIST, 0, 0 },
- { "exit", rexit, M|NOLIST, 0, 0 },
- { "size", messize, MSGLIST, 0, MMNDEL },
- { "hold", preserve, W|MSGLIST, 0, MMNDEL },
- { "if", ifcmd, F|M|RAWLIST, 1, 1 },
- { "else", elsecmd, F|M|RAWLIST, 0, 0 },
- { "endif", endifcmd, F|M|RAWLIST, 0, 0 },
- { "alternates", alternates, M|RAWLIST, 0, 1000 },
- { "ignore", igfield, M|RAWLIST, 0, 1000 },
- { "discard", igfield, M|RAWLIST, 0, 1000 },
- { "retain", retfield, M|RAWLIST, 0, 1000 },
- { "saveignore", saveigfield, M|RAWLIST, 0, 1000 },
- { "savediscard",saveigfield, M|RAWLIST, 0, 1000 },
- { "saveretain", saveretfield, M|RAWLIST, 0, 1000 },
-/* { "Header", Header, STRLIST, 0, 1000 }, */
- { "core", core, M|NOLIST, 0, 0 },
- { "#", null, M|NOLIST, 0, 0 },
- { "clobber", clobber, M|RAWLIST, 0, 1 },
- { "inc", inc, T|NOLIST, 0, 0 },
- { 0, 0, 0, 0, 0 }
-};
diff --git a/usr.bin/mail/collect.c b/usr.bin/mail/collect.c
deleted file mode 100644
index 6a09263..0000000
--- a/usr.bin/mail/collect.c
+++ /dev/null
@@ -1,753 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)collect.c 8.2 (Berkeley) 4/19/94";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Mail -- a mail program
- *
- * Collect input from standard input, handling
- * ~ escapes.
- */
-
-#include "rcv.h"
-#include <fcntl.h>
-#include "extern.h"
-
-/*
- * Read a message from standard output and return a read file to it
- * or NULL on error.
- */
-
-/*
- * The following hokiness with global variables is so that on
- * receipt of an interrupt signal, the partial message can be salted
- * away on dead.letter.
- */
-
-static sig_t saveint; /* Previous SIGINT value */
-static sig_t savehup; /* Previous SIGHUP value */
-static sig_t savetstp; /* Previous SIGTSTP value */
-static sig_t savettou; /* Previous SIGTTOU value */
-static sig_t savettin; /* Previous SIGTTIN value */
-static FILE *collf; /* File for saving away */
-static int hadintr; /* Have seen one SIGINT so far */
-
-static jmp_buf colljmp; /* To get back to work */
-static int colljmp_p; /* whether to long jump */
-static jmp_buf collabort; /* To end collection with error */
-
-FILE *
-collect(hp, printheaders)
- struct header *hp;
- int printheaders;
-{
- FILE *fbuf;
- int lc, cc, escape, eofcount, fd, c, t;
- char linebuf[LINESIZE], tempname[PATHSIZE], *cp, getsub;
- sigset_t nset;
- int longline, lastlong, rc; /* So we don't make 2 or more lines
- out of a long input line. */
-
- collf = NULL;
- /*
- * Start catching signals from here, but we're still die on interrupts
- * until we're in the main loop.
- */
- (void)sigemptyset(&nset);
- (void)sigaddset(&nset, SIGINT);
- (void)sigaddset(&nset, SIGHUP);
- (void)sigprocmask(SIG_BLOCK, &nset, NULL);
- if ((saveint = signal(SIGINT, SIG_IGN)) != SIG_IGN)
- (void)signal(SIGINT, collint);
- if ((savehup = signal(SIGHUP, SIG_IGN)) != SIG_IGN)
- (void)signal(SIGHUP, collhup);
- savetstp = signal(SIGTSTP, collstop);
- savettou = signal(SIGTTOU, collstop);
- savettin = signal(SIGTTIN, collstop);
- if (setjmp(collabort) || setjmp(colljmp)) {
- (void)rm(tempname);
- goto err;
- }
- (void)sigprocmask(SIG_UNBLOCK, &nset, NULL);
-
- noreset++;
- (void)snprintf(tempname, sizeof(tempname),
- "%s/mail.RsXXXXXXXXXX", tmpdir);
- if ((fd = mkstemp(tempname)) == -1 ||
- (collf = Fdopen(fd, "w+")) == NULL) {
- warn("%s", tempname);
- goto err;
- }
- (void)rm(tempname);
-
- /*
- * If we are going to prompt for a subject,
- * refrain from printing a newline after
- * the headers (since some people mind).
- */
- t = GTO|GSUBJECT|GCC|GNL;
- getsub = 0;
- if (hp->h_subject == NULL && value("interactive") != NULL &&
- (value("ask") != NULL || value("asksub") != NULL))
- t &= ~GNL, getsub++;
- if (printheaders) {
- puthead(hp, stdout, t);
- (void)fflush(stdout);
- }
- if ((cp = value("escape")) != NULL)
- escape = *cp;
- else
- escape = ESCAPE;
- eofcount = 0;
- hadintr = 0;
- lastlong = 0;
- longline = 0;
-
- if (!setjmp(colljmp)) {
- if (getsub)
- grabh(hp, GSUBJECT);
- } else {
- /*
- * Come here for printing the after-signal message.
- * Duplicate messages won't be printed because
- * the write is aborted if we get a SIGTTOU.
- */
-cont:
- if (hadintr) {
- (void)fflush(stdout);
- fprintf(stderr,
- "\n(Interrupt -- one more to kill letter)\n");
- } else {
- printf("(continue)\n");
- (void)fflush(stdout);
- }
- }
- for (;;) {
- colljmp_p = 1;
- c = readline(stdin, linebuf, LINESIZE);
- colljmp_p = 0;
- if (c < 0) {
- if (value("interactive") != NULL &&
- value("ignoreeof") != NULL && ++eofcount < 25) {
- printf("Use \".\" to terminate letter\n");
- continue;
- }
- break;
- }
- lastlong = longline;
- longline = c == LINESIZE - 1;
- eofcount = 0;
- hadintr = 0;
- if (linebuf[0] == '.' && linebuf[1] == '\0' &&
- value("interactive") != NULL && !lastlong &&
- (value("dot") != NULL || value("ignoreeof") != NULL))
- break;
- if (linebuf[0] != escape || value("interactive") == NULL ||
- lastlong) {
- if (putline(collf, linebuf, !longline) < 0)
- goto err;
- continue;
- }
- c = linebuf[1];
- switch (c) {
- default:
- /*
- * On double escape, just send the single one.
- * Otherwise, it's an error.
- */
- if (c == escape) {
- if (putline(collf, &linebuf[1], !longline) < 0)
- goto err;
- else
- break;
- }
- printf("Unknown tilde escape.\n");
- break;
- case 'C':
- /*
- * Dump core.
- */
- core();
- break;
- case '!':
- /*
- * Shell escape, send the balance of the
- * line to sh -c.
- */
- shell(&linebuf[2]);
- break;
- case ':':
- case '_':
- /*
- * Escape to command mode, but be nice!
- */
- execute(&linebuf[2], 1);
- goto cont;
- case '.':
- /*
- * Simulate end of file on input.
- */
- goto out;
- case 'q':
- /*
- * Force a quit of sending mail.
- * Act like an interrupt happened.
- */
- hadintr++;
- collint(SIGINT);
- exit(1);
- case 'x':
- /*
- * Exit, do not save in dead.letter.
- */
- goto err;
- case 'h':
- /*
- * Grab a bunch of headers.
- */
- grabh(hp, GTO|GSUBJECT|GCC|GBCC);
- goto cont;
- case 't':
- /*
- * Add to the To list.
- */
- hp->h_to = cat(hp->h_to, extract(&linebuf[2], GTO));
- break;
- case 's':
- /*
- * Set the Subject line.
- */
- cp = &linebuf[2];
- while (isspace((unsigned char)*cp))
- cp++;
- hp->h_subject = savestr(cp);
- break;
- case 'R':
- /*
- * Set the Reply-To line.
- */
- cp = &linebuf[2];
- while (isspace((unsigned char)*cp))
- cp++;
- hp->h_replyto = savestr(cp);
- break;
- case 'c':
- /*
- * Add to the CC list.
- */
- hp->h_cc = cat(hp->h_cc, extract(&linebuf[2], GCC));
- break;
- case 'b':
- /*
- * Add to the BCC list.
- */
- hp->h_bcc = cat(hp->h_bcc, extract(&linebuf[2], GBCC));
- break;
- case 'i':
- case 'A':
- case 'a':
- /*
- * Insert named variable in message.
- */
- switch(c) {
- case 'i':
- cp = &linebuf[2];
- while(isspace((unsigned char)*cp))
- cp++;
- break;
- case 'a':
- cp = "sign";
- break;
- case 'A':
- cp = "Sign";
- break;
- default:
- goto err;
- }
-
- if(*cp != '\0' && (cp = value(cp)) != NULL) {
- printf("%s\n", cp);
- if(putline(collf, cp, 1) < 0)
- goto err;
- }
-
- break;
- case 'd':
- /*
- * Read in the dead letter file.
- */
- if (strlcpy(linebuf + 2, getdeadletter(),
- sizeof(linebuf) - 2)
- >= sizeof(linebuf) - 2) {
- printf("Line buffer overflow\n");
- break;
- }
- /* FALLTHROUGH */
- case 'r':
- case '<':
- /*
- * Invoke a file:
- * Search for the file name,
- * then open it and copy the contents to collf.
- */
- cp = &linebuf[2];
- while (isspace((unsigned char)*cp))
- cp++;
- if (*cp == '\0') {
- printf("Interpolate what file?\n");
- break;
- }
- cp = expand(cp);
- if (cp == NULL)
- break;
- if (*cp == '!') {
- /*
- * Insert stdout of command.
- */
- char *sh;
- int nullfd, tempfd, rc;
- char tempname2[PATHSIZE];
-
- if ((nullfd = open("/dev/null", O_RDONLY, 0))
- == -1) {
- warn("/dev/null");
- break;
- }
-
- (void)snprintf(tempname2, sizeof(tempname2),
- "%s/mail.ReXXXXXXXXXX", tmpdir);
- if ((tempfd = mkstemp(tempname2)) == -1 ||
- (fbuf = Fdopen(tempfd, "w+")) == NULL) {
- warn("%s", tempname2);
- break;
- }
- (void)unlink(tempname2);
-
- if ((sh = value("SHELL")) == NULL)
- sh = _PATH_CSHELL;
-
- rc = run_command(sh, 0, nullfd, fileno(fbuf),
- "-c", cp+1, NULL);
-
- close(nullfd);
-
- if (rc < 0) {
- (void)Fclose(fbuf);
- break;
- }
-
- if (fsize(fbuf) == 0) {
- fprintf(stderr,
- "No bytes from command \"%s\"\n",
- cp+1);
- (void)Fclose(fbuf);
- break;
- }
-
- rewind(fbuf);
- } else if (isdir(cp)) {
- printf("%s: Directory\n", cp);
- break;
- } else if ((fbuf = Fopen(cp, "r")) == NULL) {
- warn("%s", cp);
- break;
- }
- printf("\"%s\" ", cp);
- (void)fflush(stdout);
- lc = 0;
- cc = 0;
- while ((rc = readline(fbuf, linebuf, LINESIZE)) >= 0) {
- if (rc != LINESIZE - 1)
- lc++;
- if ((t = putline(collf, linebuf,
- rc != LINESIZE - 1)) < 0) {
- (void)Fclose(fbuf);
- goto err;
- }
- cc += t;
- }
- (void)Fclose(fbuf);
- printf("%d/%d\n", lc, cc);
- break;
- case 'w':
- /*
- * Write the message on a file.
- */
- cp = &linebuf[2];
- while (*cp == ' ' || *cp == '\t')
- cp++;
- if (*cp == '\0') {
- fprintf(stderr, "Write what file!?\n");
- break;
- }
- if ((cp = expand(cp)) == NULL)
- break;
- rewind(collf);
- exwrite(cp, collf, 1);
- break;
- case 'm':
- case 'M':
- case 'f':
- case 'F':
- /*
- * Interpolate the named messages, if we
- * are in receiving mail mode. Does the
- * standard list processing garbage.
- * If ~f is given, we don't shift over.
- */
- if (forward(linebuf + 2, collf, tempname, c) < 0)
- goto err;
- goto cont;
- case '?':
- if ((fbuf = Fopen(_PATH_TILDE, "r")) == NULL) {
- warn("%s", _PATH_TILDE);
- break;
- }
- while ((t = getc(fbuf)) != EOF)
- (void)putchar(t);
- (void)Fclose(fbuf);
- break;
- case 'p':
- /*
- * Print out the current state of the
- * message without altering anything.
- */
- rewind(collf);
- printf("-------\nMessage contains:\n");
- puthead(hp, stdout, GTO|GSUBJECT|GCC|GBCC|GNL);
- while ((t = getc(collf)) != EOF)
- (void)putchar(t);
- goto cont;
- case '|':
- /*
- * Pipe message through command.
- * Collect output as new message.
- */
- rewind(collf);
- mespipe(collf, &linebuf[2]);
- goto cont;
- case 'v':
- case 'e':
- /*
- * Edit the current message.
- * 'e' means to use EDITOR
- * 'v' means to use VISUAL
- */
- rewind(collf);
- mesedit(collf, c);
- goto cont;
- }
- }
- goto out;
-err:
- if (collf != NULL) {
- (void)Fclose(collf);
- collf = NULL;
- }
-out:
- if (collf != NULL)
- rewind(collf);
- noreset--;
- (void)sigprocmask(SIG_BLOCK, &nset, NULL);
- (void)signal(SIGINT, saveint);
- (void)signal(SIGHUP, savehup);
- (void)signal(SIGTSTP, savetstp);
- (void)signal(SIGTTOU, savettou);
- (void)signal(SIGTTIN, savettin);
- (void)sigprocmask(SIG_UNBLOCK, &nset, NULL);
- return (collf);
-}
-
-/*
- * Write a file, ex-like if f set.
- */
-int
-exwrite(name, fp, f)
- char name[];
- FILE *fp;
- int f;
-{
- FILE *of;
- int c, lc;
- long cc;
- struct stat junk;
-
- if (f) {
- printf("\"%s\" ", name);
- (void)fflush(stdout);
- }
- if (stat(name, &junk) >= 0 && S_ISREG(junk.st_mode)) {
- if (!f)
- fprintf(stderr, "%s: ", name);
- fprintf(stderr, "File exists\n");
- return (-1);
- }
- if ((of = Fopen(name, "w")) == NULL) {
- warn((char *)NULL);
- return (-1);
- }
- lc = 0;
- cc = 0;
- while ((c = getc(fp)) != EOF) {
- cc++;
- if (c == '\n')
- lc++;
- (void)putc(c, of);
- if (ferror(of)) {
- warnx("%s", name);
- (void)Fclose(of);
- return (-1);
- }
- }
- (void)Fclose(of);
- printf("%d/%ld\n", lc, cc);
- (void)fflush(stdout);
- return (0);
-}
-
-/*
- * Edit the message being collected on fp.
- * On return, make the edit file the new temp file.
- */
-void
-mesedit(fp, c)
- FILE *fp;
- int c;
-{
- sig_t sigint = signal(SIGINT, SIG_IGN);
- FILE *nf = run_editor(fp, (off_t)-1, c, 0);
-
- if (nf != NULL) {
- (void)fseeko(nf, (off_t)0, SEEK_END);
- collf = nf;
- (void)Fclose(fp);
- }
- (void)signal(SIGINT, sigint);
-}
-
-/*
- * Pipe the message through the command.
- * Old message is on stdin of command;
- * New message collected from stdout.
- * Sh -c must return 0 to accept the new message.
- */
-void
-mespipe(fp, cmd)
- FILE *fp;
- char cmd[];
-{
- FILE *nf;
- int fd;
- sig_t sigint = signal(SIGINT, SIG_IGN);
- char *sh, tempname[PATHSIZE];
-
- (void)snprintf(tempname, sizeof(tempname),
- "%s/mail.ReXXXXXXXXXX", tmpdir);
- if ((fd = mkstemp(tempname)) == -1 ||
- (nf = Fdopen(fd, "w+")) == NULL) {
- warn("%s", tempname);
- goto out;
- }
- (void)rm(tempname);
- /*
- * stdin = current message.
- * stdout = new message.
- */
- if ((sh = value("SHELL")) == NULL)
- sh = _PATH_CSHELL;
- if (run_command(sh,
- 0, fileno(fp), fileno(nf), "-c", cmd, NULL) < 0) {
- (void)Fclose(nf);
- goto out;
- }
- if (fsize(nf) == 0) {
- fprintf(stderr, "No bytes from \"%s\" !?\n", cmd);
- (void)Fclose(nf);
- goto out;
- }
- /*
- * Take new files.
- */
- (void)fseeko(nf, (off_t)0, SEEK_END);
- collf = nf;
- (void)Fclose(fp);
-out:
- (void)signal(SIGINT, sigint);
-}
-
-/*
- * Interpolate the named messages into the current
- * message, preceding each line with a tab.
- * Return a count of the number of characters now in
- * the message, or -1 if an error is encountered writing
- * the message temporary. The flag argument is 'm' if we
- * should shift over and 'f' if not.
- */
-int
-forward(ms, fp, fn, f)
- char ms[];
- FILE *fp;
- char *fn;
- int f;
-{
- int *msgvec;
- struct ignoretab *ig;
- char *tabst;
-
- msgvec = (int *)salloc((msgCount+1) * sizeof(*msgvec));
- if (msgvec == NULL)
- return (0);
- if (getmsglist(ms, msgvec, 0) < 0)
- return (0);
- if (*msgvec == 0) {
- *msgvec = first(0, MMNORM);
- if (*msgvec == 0) {
- printf("No appropriate messages\n");
- return (0);
- }
- msgvec[1] = 0;
- }
- if (f == 'f' || f == 'F')
- tabst = NULL;
- else if ((tabst = value("indentprefix")) == NULL)
- tabst = "\t";
- ig = isupper((unsigned char)f) ? NULL : ignore;
- printf("Interpolating:");
- for (; *msgvec != 0; msgvec++) {
- struct message *mp = message + *msgvec - 1;
-
- touch(mp);
- printf(" %d", *msgvec);
- if (sendmessage(mp, fp, ig, tabst) < 0) {
- warnx("%s", fn);
- return (-1);
- }
- }
- printf("\n");
- return (0);
-}
-
-/*
- * Print (continue) when continued after ^Z.
- */
-/*ARGSUSED*/
-void
-collstop(s)
- int s;
-{
- sig_t old_action = signal(s, SIG_DFL);
- sigset_t nset;
-
- (void)sigemptyset(&nset);
- (void)sigaddset(&nset, s);
- (void)sigprocmask(SIG_UNBLOCK, &nset, NULL);
- (void)kill(0, s);
- (void)sigprocmask(SIG_BLOCK, &nset, NULL);
- (void)signal(s, old_action);
- if (colljmp_p) {
- colljmp_p = 0;
- hadintr = 0;
- longjmp(colljmp, 1);
- }
-}
-
-/*
- * On interrupt, come here to save the partial message in ~/dead.letter.
- * Then jump out of the collection loop.
- */
-/*ARGSUSED*/
-void
-collint(s)
- int s;
-{
- /*
- * the control flow is subtle, because we can be called from ~q.
- */
- if (!hadintr) {
- if (value("ignore") != NULL) {
- printf("@");
- (void)fflush(stdout);
- clearerr(stdin);
- return;
- }
- hadintr = 1;
- longjmp(colljmp, 1);
- }
- rewind(collf);
- if (value("nosave") == NULL)
- savedeadletter(collf);
- longjmp(collabort, 1);
-}
-
-/*ARGSUSED*/
-void
-collhup(s)
- int s;
-{
- rewind(collf);
- savedeadletter(collf);
- /*
- * Let's pretend nobody else wants to clean up,
- * a true statement at this time.
- */
- exit(1);
-}
-
-void
-savedeadletter(fp)
- FILE *fp;
-{
- FILE *dbuf;
- int c;
- char *cp;
-
- if (fsize(fp) == 0)
- return;
- cp = getdeadletter();
- c = umask(077);
- dbuf = Fopen(cp, "a");
- (void)umask(c);
- if (dbuf == NULL)
- return;
- while ((c = getc(fp)) != EOF)
- (void)putc(c, dbuf);
- (void)Fclose(dbuf);
- rewind(fp);
-}
diff --git a/usr.bin/mail/def.h b/usr.bin/mail/def.h
deleted file mode 100644
index 3ef4ed0..0000000
--- a/usr.bin/mail/def.h
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)def.h 8.4 (Berkeley) 4/20/95
- *
- * $FreeBSD$
- */
-
-/*
- * Mail -- a mail program
- *
- * Author: Kurt Shoens (UCB) March 25, 1978
- */
-
-#include <sys/param.h>
-#include <sys/stat.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <paths.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <termios.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "pathnames.h"
-
-#define APPEND /* New mail goes to end of mailbox */
-
-#define ESCAPE '~' /* Default escape for sending */
-#define NMLSIZE 1024 /* max names in a message list */
-#define PATHSIZE MAXPATHLEN /* Size of pathnames throughout */
-#define HSHSIZE 59 /* Hash size for aliases and vars */
-#define LINESIZE BUFSIZ /* max readable line width */
-#define STRINGSIZE ((unsigned)128) /* Dynamic allocation units */
-#define MAXARGC 1024 /* Maximum list of raw strings */
-#define MAXEXP 25 /* Maximum expansion of aliases */
-
-#define equal(a, b) (strcmp(a,b)==0)/* A nice function to string compare */
-
-struct message {
- short m_flag; /* flags, see below */
- short m_offset; /* offset in block of message */
- long m_block; /* block number of this message */
- long m_size; /* Bytes in the message */
- long m_lines; /* Lines in the message */
-};
-
-/*
- * flag bits.
- */
-
-#define MUSED (1<<0) /* entry is used, but this bit isn't */
-#define MDELETED (1<<1) /* entry has been deleted */
-#define MSAVED (1<<2) /* entry has been saved */
-#define MTOUCH (1<<3) /* entry has been noticed */
-#define MPRESERVE (1<<4) /* keep entry in sys mailbox */
-#define MMARK (1<<5) /* message is marked! */
-#define MODIFY (1<<6) /* message has been modified */
-#define MNEW (1<<7) /* message has never been seen */
-#define MREAD (1<<8) /* message has been read sometime. */
-#define MSTATUS (1<<9) /* message status has changed */
-#define MBOX (1<<10) /* Send this to mbox, regardless */
-
-/*
- * Given a file address, determine the block number it represents.
- */
-#define blockof(off) ((int)((off) / 4096))
-#define boffsetof(off) ((int)((off) % 4096))
-#define positionof(block, offset) ((off_t)(block) * 4096 + (offset))
-
-/*
- * Format of the command description table.
- * The actual table is declared and initialized
- * in lex.c
- */
-struct cmd {
- const char *c_name; /* Name of command */
- int (*c_func)(); /* Implementor of the command */
- short c_argtype; /* Type of arglist (see below) */
- short c_msgflag; /* Required flags of messages */
- short c_msgmask; /* Relevant flags of messages */
-};
-
-/* Yechh, can't initialize unions */
-
-#define c_minargs c_msgflag /* Minimum argcount for RAWLIST */
-#define c_maxargs c_msgmask /* Max argcount for RAWLIST */
-
-/*
- * Argument types.
- */
-
-#define MSGLIST 0 /* Message list type */
-#define STRLIST 1 /* A pure string */
-#define RAWLIST 2 /* Shell string list */
-#define NOLIST 3 /* Just plain 0 */
-#define NDMLIST 4 /* Message list, no defaults */
-
-#define P 040 /* Autoprint dot after command */
-#define I 0100 /* Interactive command bit */
-#define M 0200 /* Legal from send mode bit */
-#define W 0400 /* Illegal when read only bit */
-#define F 01000 /* Is a conditional command */
-#define T 02000 /* Is a transparent command */
-#define R 04000 /* Cannot be called from collect */
-
-/*
- * Oft-used mask values
- */
-
-#define MMNORM (MDELETED|MSAVED)/* Look at both save and delete bits */
-#define MMNDEL MDELETED /* Look only at deleted bit */
-
-/*
- * Structure used to return a break down of a head
- * line (hats off to Bill Joy!)
- */
-
-struct headline {
- char *l_from; /* The name of the sender */
- char *l_tty; /* His tty string (if any) */
- char *l_date; /* The entire date string */
-};
-
-#define GTO 1 /* Grab To: line */
-#define GSUBJECT 2 /* Likewise, Subject: line */
-#define GCC 4 /* And the Cc: line */
-#define GBCC 8 /* And also the Bcc: line */
-#define GREPLYTO 0x10 /* And the Reply-To: line */
-#define GINREPLYTO 0x20 /* The In-Reply-To: line */
-#define GMASK (GTO|GSUBJECT|GCC|GBCC|GREPLYTO|GINREPLYTO)
- /* Mask of places from whence */
-
-#define GNL 0x40 /* Print blank line after */
-#define GDEL 0x80 /* Entity removed from list */
-#define GCOMMA 0x100 /* detract puts in commas */
-
-/*
- * Structure used to pass about the current
- * state of the user-typed message header.
- */
-
-struct header {
- struct name *h_bcc; /* Blind carbon copies */
- struct name *h_cc; /* Carbon copies string */
- struct name *h_smopts; /* Sendmail options */
- struct name *h_to; /* Dynamic "To:" string */
- char *h_inreplyto; /* Reference */
- char *h_replyto; /* Reply address */
- char *h_subject; /* Subject string */
-};
-
-/*
- * Structure of namelist nodes used in processing
- * the recipients of mail and aliases and all that
- * kind of stuff.
- */
-
-struct name {
- struct name *n_flink; /* Forward link in list. */
- struct name *n_blink; /* Backward list link */
- short n_type; /* From which list it came */
- char *n_name; /* This fella's name */
-};
-
-/*
- * Structure of a variable node. All variables are
- * kept on a singly-linked list of these, rooted by
- * "variables"
- */
-
-struct var {
- struct var *v_link; /* Forward link to next variable */
- char *v_name; /* The variable's name */
- char *v_value; /* And it's current value */
-};
-
-struct group {
- struct group *ge_link; /* Next person in this group */
- char *ge_name; /* This person's user name */
-};
-
-struct grouphead {
- struct grouphead *g_link; /* Next grouphead in list */
- char *g_name; /* Name of this group */
- struct group *g_list; /* Users in group. */
-};
-
-/*
- * Structure of the hash table of ignored header fields
- */
-struct ignoretab {
- int i_count; /* Number of entries */
- struct ignore {
- struct ignore *i_link; /* Next ignored field in bucket */
- char *i_field; /* This ignored field */
- } *i_head[HSHSIZE];
-};
-
-/*
- * Token values returned by the scanner used for argument lists.
- * Also, sizes of scanner-related things.
- */
-
-#define TEOL 0 /* End of the command line */
-#define TNUMBER 1 /* A message number */
-#define TDASH 2 /* A simple dash */
-#define TSTRING 3 /* A string (possibly containing -) */
-#define TDOT 4 /* A "." */
-#define TUP 5 /* An "^" */
-#define TDOLLAR 6 /* A "$" */
-#define TSTAR 7 /* A "*" */
-#define TOPEN 8 /* An '(' */
-#define TCLOSE 9 /* A ')' */
-#define TPLUS 10 /* A '+' */
-#define TERROR 11 /* A lexical error */
-
-#define REGDEP 2 /* Maximum regret depth. */
-#define STRINGLEN 1024 /* Maximum length of string token */
-
-/*
- * Constants for conditional commands. These describe whether
- * we should be executing stuff or not.
- */
-
-#define CANY 0 /* Execute in send or receive mode */
-#define CRCV 1 /* Execute in receive mode only */
-#define CSEND 2 /* Execute in send mode only */
-
-/*
- * Kludges to handle the change from setexit / reset to setjmp / longjmp
- */
-
-#define setexit() setjmp(srbuf)
-#define reset(x) longjmp(srbuf, x)
-
-/*
- * Truncate a file to the last character written. This is
- * useful just before closing an old file that was opened
- * for read/write.
- */
-#define trunc(stream) { \
- (void)fflush(stream); \
- (void)ftruncate(fileno(stream), (off_t)ftell(stream)); \
-}
diff --git a/usr.bin/mail/edit.c b/usr.bin/mail/edit.c
deleted file mode 100644
index d50c43a..0000000
--- a/usr.bin/mail/edit.c
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)edit.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "rcv.h"
-#include <fcntl.h>
-#include "extern.h"
-
-/*
- * Mail -- a mail program
- *
- * Perform message editing functions.
- */
-
-/*
- * Edit a message list.
- */
-int
-editor(msgvec)
- int *msgvec;
-{
-
- return (edit1(msgvec, 'e'));
-}
-
-/*
- * Invoke the visual editor on a message list.
- */
-int
-visual(msgvec)
- int *msgvec;
-{
-
- return (edit1(msgvec, 'v'));
-}
-
-/*
- * Edit a message by writing the message into a funnily-named file
- * (which should not exist) and forking an editor on it.
- * We get the editor from the stuff above.
- */
-int
-edit1(msgvec, type)
- int *msgvec;
- int type;
-{
- int c, i;
- FILE *fp;
- struct message *mp;
- off_t size;
-
- /*
- * Deal with each message to be edited . . .
- */
- for (i = 0; msgvec[i] && i < msgCount; i++) {
- sig_t sigint;
-
- if (i > 0) {
- char buf[100];
- char *p;
-
- printf("Edit message %d [ynq]? ", msgvec[i]);
- if (fgets(buf, sizeof(buf), stdin) == 0)
- break;
- for (p = buf; *p == ' ' || *p == '\t'; p++)
- ;
- if (*p == 'q')
- break;
- if (*p == 'n')
- continue;
- }
- dot = mp = &message[msgvec[i] - 1];
- touch(mp);
- sigint = signal(SIGINT, SIG_IGN);
- fp = run_editor(setinput(mp), mp->m_size, type, readonly);
- if (fp != NULL) {
- (void)fseeko(otf, (off_t)0, SEEK_END);
- size = ftello(otf);
- mp->m_block = blockof(size);
- mp->m_offset = boffsetof(size);
- mp->m_size = (long)fsize(fp);
- mp->m_lines = 0;
- mp->m_flag |= MODIFY;
- rewind(fp);
- while ((c = getc(fp)) != EOF) {
- if (c == '\n')
- mp->m_lines++;
- if (putc(c, otf) == EOF)
- break;
- }
- if (ferror(otf))
- warnx("/tmp");
- (void)Fclose(fp);
- }
- (void)signal(SIGINT, sigint);
- }
- return (0);
-}
-
-/*
- * Run an editor on the file at "fpp" of "size" bytes,
- * and return a new file pointer.
- * Signals must be handled by the caller.
- * "Type" is 'e' for _PATH_EX, 'v' for _PATH_VI.
- */
-FILE *
-run_editor(fp, size, type, readonly)
- FILE *fp;
- off_t size;
- int type, readonly;
-{
- FILE *nf = NULL;
- int t;
- time_t modtime;
- char *edit, tempname[PATHSIZE];
- struct stat statb;
-
- (void)snprintf(tempname, sizeof(tempname),
- "%s/mail.ReXXXXXXXXXX", tmpdir);
- if ((t = mkstemp(tempname)) == -1 ||
- (nf = Fdopen(t, "w")) == NULL) {
- warn("%s", tempname);
- goto out;
- }
- if (readonly && fchmod(t, 0400) == -1) {
- warn("%s", tempname);
- (void)rm(tempname);
- goto out;
- }
- if (size >= 0)
- while (--size >= 0 && (t = getc(fp)) != EOF)
- (void)putc(t, nf);
- else
- while ((t = getc(fp)) != EOF)
- (void)putc(t, nf);
- (void)fflush(nf);
- if (fstat(fileno(nf), &statb) < 0)
- modtime = 0;
- else
- modtime = statb.st_mtime;
- if (ferror(nf)) {
- (void)Fclose(nf);
- warnx("%s", tempname);
- (void)rm(tempname);
- nf = NULL;
- goto out;
- }
- if (Fclose(nf) < 0) {
- warn("%s", tempname);
- (void)rm(tempname);
- nf = NULL;
- goto out;
- }
- nf = NULL;
- if ((edit = value(type == 'e' ? "EDITOR" : "VISUAL")) == NULL)
- edit = type == 'e' ? _PATH_EX : _PATH_VI;
- if (run_command(edit, 0, -1, -1, tempname, NULL, NULL) < 0) {
- (void)rm(tempname);
- goto out;
- }
- /*
- * If in read only mode or file unchanged, just remove the editor
- * temporary and return.
- */
- if (readonly) {
- (void)rm(tempname);
- goto out;
- }
- if (stat(tempname, &statb) < 0) {
- warn("%s", tempname);
- goto out;
- }
- if (modtime == statb.st_mtime) {
- (void)rm(tempname);
- goto out;
- }
- /*
- * Now switch to new file.
- */
- if ((nf = Fopen(tempname, "a+")) == NULL) {
- warn("%s", tempname);
- (void)rm(tempname);
- goto out;
- }
- (void)rm(tempname);
-out:
- return (nf);
-}
diff --git a/usr.bin/mail/extern.h b/usr.bin/mail/extern.h
deleted file mode 100644
index 7f02a88..0000000
--- a/usr.bin/mail/extern.h
+++ /dev/null
@@ -1,256 +0,0 @@
-/*-
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.2 (Berkeley) 4/20/95
- *
- * $FreeBSD$
- */
-
-struct name *cat(struct name *, struct name *);
-struct name *delname(struct name *, char []);
-struct name *elide(struct name *);
-struct name *extract(char [], int);
-struct name *gexpand(struct name *, struct grouphead *, int, int);
-struct name *nalloc(char [], int);
-struct name *outof(struct name *, FILE *, struct header *);
-struct name *put(struct name *, struct name *);
-struct name *tailof(struct name *);
-struct name *usermap(struct name *);
-FILE *Fdopen(int, const char *);
-FILE *Fopen(const char *, const char *);
-FILE *Popen(char *, const char *);
-FILE *collect(struct header *, int);
-char *copyin(char *, char **);
-char *detract(struct name *, int);
-char *expand(char *);
-char *getdeadletter(void);
-char *getname(int);
-char *hfield(const char *, struct message *);
-FILE *infix(struct header *, FILE *);
-char *ishfield(char [], char *, const char *);
-char *name1(struct message *, int);
-char *nameof(struct message *, int);
-char *nextword(char *, char *);
-char *readtty(const char *, char []);
-char *reedit(char *);
-FILE *run_editor(FILE *, off_t, int, int);
-char *salloc(int);
-char *savestr(char *);
-FILE *setinput(struct message *);
-char *skin(char *);
-char *skip_comment(char *);
-char *snarf(char [], int *);
-char *username(void);
-char *value(const char *);
-char *vcopy(const char *);
-char *yankword(char *, char []);
-char *yanklogin(char *, char []);
-int Fclose(FILE *);
-int More(int *);
-int Pclose(FILE *);
-int Respond(int *);
-int Type(int *);
-int doRespond(int []);
-int dorespond(int *);
-void alter(char *);
-int alternates(char **);
-void announce(void);
-int append(struct message *, FILE *);
-int argcount(char **);
-void assign(const char *, const char *);
-int bangexp(char *, size_t);
-void brokpipe(int);
-int charcount(char *, int);
-int check(int, int);
-void clob1(int);
-int clobber(char **);
-void close_all_files(void);
-int cmatch(char *, char *);
-void collhup(int);
-void collint(int);
-void collstop(int);
-void commands(void);
-int copycmd(char []);
-int core(void);
-int count(struct name *);
-int delete(int []);
-int delm(int []);
-int deltype(int []);
-void demail(void);
-int diction(const void *, const void *);
-int dosh(char *);
-int echo(char **);
-int edit1(int *, int);
-int editor(int *);
-void edstop(void);
-int elsecmd(void);
-int endifcmd(void);
-int evalcol(int);
-int execute(char [], int);
-int exwrite(char [], FILE *, int);
-void fail(const char *, const char *);
-int file(char **);
-struct grouphead *
- findgroup(char []);
-void findmail(char *, char *, int);
-int first(int, int);
-void fixhead(struct header *, struct name *);
-void fmt(const char *, struct name *, FILE *, int);
-int folders(void);
-int forward(char [], FILE *, char *, int);
-void free_child(int);
-int from(int *);
-off_t fsize(FILE *);
-int getfold(char *, int);
-int gethfield(FILE *, char [], int, char **);
-int getmsglist(char *, int *, int);
-int getrawlist(char [], char **, int);
-int getuserid(char []);
-int grabh(struct header *, int);
-int group(char **);
-void hangup(int);
-int hash(const char *);
-void hdrstop(int);
-int headers(int *);
-int help(void);
-void holdsigs(void);
-int ifcmd(char **);
-int igcomp(const void *, const void *);
-int igfield(char *[]);
-int ignore1(char *[], struct ignoretab *, const char *);
-int igshow(struct ignoretab *, const char *);
-int inc(void *);
-int incfile(void);
-void intr(int);
-int isdate(char []);
-int isdir(char []);
-int isfileaddr(char *);
-int ishead(char []);
-int isign(const char *, struct ignoretab []);
-int isprefix(const char *, const char *);
-void istrncpy(char *, const char *, size_t);
-__const struct cmd *
- lex(char []);
-void load(char *);
-struct var *
- lookup(const char *);
-int mail(struct name *,
- struct name *, struct name *, struct name *, char *, char *);
-void mail1(struct header *, int);
-void makemessage(FILE *, int);
-void mark(int);
-int markall(char [], int);
-int matchsender(char *, int);
-int matchfield(char *, int);
-int mboxit(int []);
-int member(char *, struct ignoretab *);
-void mesedit(FILE *, int);
-void mespipe(FILE *, char []);
-int messize(int *);
-int metamess(int, int);
-int more(int *);
-int newfileinfo(int);
-int next(int *);
-int null(int);
-void parse(char [], struct headline *, char []);
-int pcmdlist(void);
-int pdot(void);
-void prepare_child(sigset_t *, int, int);
-int preserve(int *);
-void prettyprint(struct name *);
-void printgroup(char []);
-void printhead(int);
-int puthead(struct header *, FILE *, int);
-int putline(FILE *, char *, int);
-int pversion(int);
-void quit(void);
-int quitcmd(void);
-int readline(FILE *, char *, int);
-void register_file(FILE *, int, int);
-void regret(int);
-void relsesigs(void);
-int respond(int *);
-int retfield(char *[]);
-int rexit(int);
-int rm(char *);
-int run_command(char *, sigset_t *, int, int, char *, char *, char *);
-int save(char []);
-int save1(char [], int, const char *, struct ignoretab *);
-void savedeadletter(FILE *);
-int saveigfield(char *[]);
-int savemail(char [], FILE *);
-int saveretfield(char *[]);
-int scan(char **);
-void scaninit(void);
-int schdir(char **);
-int screensize(void);
-int scroll(char []);
-int sendmessage(struct message *, FILE *, struct ignoretab *, char *);
-int sendmail(char *);
-int set(char **);
-int setfile(char *);
-void setmsize(int);
-void setptr(FILE *, off_t);
-void setscreensize(void);
-int shell(char *);
-void sigchild(int);
-void sort(char **);
-int source(char **);
-void spreserve(void);
-void sreset(void);
-int start_command(char *, sigset_t *, int, int, char *, char *, char *);
-void statusput(struct message *, FILE *, char *);
-void stop(int);
-int stouch(int []);
-int swrite(char []);
-void tinit(void);
-int top(int *);
-void touch(struct message *);
-void ttyint(int);
-void ttystop(int);
-int type(int *);
-int type1(int *, int, int);
-int undelete_messages(int *);
-void unmark(int);
-char **unpack(struct name *);
-int unread(int []);
-void unregister_file(FILE *);
-int unset(char **);
-int unstack(void);
-void vfree(char *);
-int visual(int *);
-int wait_child(int);
-int wait_command(int);
-int writeback(FILE *);
-
-extern char *__progname;
-extern char *tmpdir;
diff --git a/usr.bin/mail/fio.c b/usr.bin/mail/fio.c
deleted file mode 100644
index b00f485..0000000
--- a/usr.bin/mail/fio.c
+++ /dev/null
@@ -1,473 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)fio.c 8.2 (Berkeley) 4/20/95";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "rcv.h"
-#include <sys/file.h>
-#include <sys/wait.h>
-
-#include <unistd.h>
-#include <paths.h>
-#include <errno.h>
-#include "extern.h"
-
-/*
- * Mail -- a mail program
- *
- * File I/O.
- */
-
-extern int wait_status;
-
-/*
- * Set up the input pointers while copying the mail file into /tmp.
- */
-void
-setptr(ibuf, offset)
- FILE *ibuf;
- off_t offset;
-{
- int c, count;
- char *cp, *cp2;
- struct message this;
- FILE *mestmp;
- int maybe, inhead;
- char linebuf[LINESIZE], pathbuf[PATHSIZE];
- int omsgCount;
-
- /* Get temporary file. */
- (void)snprintf(pathbuf, sizeof(pathbuf), "%s/mail.XXXXXXXXXX", tmpdir);
- if ((c = mkstemp(pathbuf)) == -1 || (mestmp = Fdopen(c, "r+")) == NULL)
- err(1, "can't open %s", pathbuf);
- (void)rm(pathbuf);
-
- if (offset == 0) {
- msgCount = 0;
- } else {
- /* Seek into the file to get to the new messages */
- (void)fseeko(ibuf, offset, SEEK_SET);
- /*
- * We need to make "offset" a pointer to the end of
- * the temp file that has the copy of the mail file.
- * If any messages have been edited, this will be
- * different from the offset into the mail file.
- */
- (void)fseeko(otf, (off_t)0, SEEK_END);
- offset = ftello(otf);
- }
- omsgCount = msgCount;
- maybe = 1;
- inhead = 0;
- this.m_flag = MUSED|MNEW;
- this.m_size = 0;
- this.m_lines = 0;
- this.m_block = 0;
- this.m_offset = 0;
- for (;;) {
- if (fgets(linebuf, sizeof(linebuf), ibuf) == NULL) {
- if (append(&this, mestmp))
- errx(1, "temporary file");
- makemessage(mestmp, omsgCount);
- return;
- }
- count = strlen(linebuf);
- /*
- * Transforms lines ending in <CR><LF> to just <LF>.
- * This allows mail to be able to read Eudora mailboxes.
- */
- if (count >= 2 && linebuf[count - 1] == '\n' &&
- linebuf[count - 2] == '\r') {
- count--;
- linebuf[count - 1] = '\n';
- }
-
- (void)fwrite(linebuf, sizeof(*linebuf), count, otf);
- if (ferror(otf))
- errx(1, "/tmp");
- if (count)
- linebuf[count - 1] = '\0';
- if (maybe && linebuf[0] == 'F' && ishead(linebuf)) {
- msgCount++;
- if (append(&this, mestmp))
- errx(1, "temporary file");
- this.m_flag = MUSED|MNEW;
- this.m_size = 0;
- this.m_lines = 0;
- this.m_block = blockof(offset);
- this.m_offset = boffsetof(offset);
- inhead = 1;
- } else if (linebuf[0] == 0) {
- inhead = 0;
- } else if (inhead) {
- for (cp = linebuf, cp2 = "status";; cp++) {
- if ((c = *cp2++) == '\0') {
- while (isspace((unsigned char)*cp++))
- ;
- if (cp[-1] != ':')
- break;
- while ((c = *cp++) != '\0')
- if (c == 'R')
- this.m_flag |= MREAD;
- else if (c == 'O')
- this.m_flag &= ~MNEW;
- inhead = 0;
- break;
- }
- if (*cp != c && *cp != toupper((unsigned char)c))
- break;
- }
- }
- offset += count;
- this.m_size += count;
- this.m_lines++;
- maybe = linebuf[0] == 0;
- }
-}
-
-/*
- * Drop the passed line onto the passed output buffer.
- * If a write error occurs, return -1, else the count of
- * characters written, including the newline if requested.
- */
-int
-putline(obuf, linebuf, outlf)
- FILE *obuf;
- char *linebuf;
- int outlf;
-{
- int c;
-
- c = strlen(linebuf);
- (void)fwrite(linebuf, sizeof(*linebuf), c, obuf);
- if (outlf) {
- fprintf(obuf, "\n");
- c++;
- }
- if (ferror(obuf))
- return (-1);
- return (c);
-}
-
-/*
- * Read up a line from the specified input into the line
- * buffer. Return the number of characters read. Do not
- * include the newline (or carriage return) at the end.
- */
-int
-readline(ibuf, linebuf, linesize)
- FILE *ibuf;
- char *linebuf;
- int linesize;
-{
- int n;
-
- clearerr(ibuf);
- if (fgets(linebuf, linesize, ibuf) == NULL)
- return (-1);
- n = strlen(linebuf);
- if (n > 0 && linebuf[n - 1] == '\n')
- linebuf[--n] = '\0';
- if (n > 0 && linebuf[n - 1] == '\r')
- linebuf[--n] = '\0';
- return (n);
-}
-
-/*
- * Return a file buffer all ready to read up the
- * passed message pointer.
- */
-FILE *
-setinput(mp)
- struct message *mp;
-{
-
- (void)fflush(otf);
- if (fseeko(itf,
- positionof(mp->m_block, mp->m_offset), SEEK_SET) < 0)
- err(1, "fseeko");
- return (itf);
-}
-
-/*
- * Take the data out of the passed ghost file and toss it into
- * a dynamically allocated message structure.
- */
-void
-makemessage(f, omsgCount)
- FILE *f;
- int omsgCount;
-{
- size_t size;
- struct message *nmessage;
-
- size = (msgCount + 1) * sizeof(struct message);
- nmessage = (struct message *)realloc(message, size);
- if (nmessage == NULL)
- errx(1, "Insufficient memory for %d messages\n",
- msgCount);
- if (omsgCount == 0 || message == NULL)
- dot = nmessage;
- else
- dot = nmessage + (dot - message);
- message = nmessage;
- size -= (omsgCount + 1) * sizeof(struct message);
- (void)fflush(f);
- (void)lseek(fileno(f), (off_t)sizeof(*message), 0);
- if (read(fileno(f), (char *)&message[omsgCount], size) != size)
- errx(1, "Message temporary file corrupted");
- message[msgCount].m_size = 0;
- message[msgCount].m_lines = 0;
- (void)Fclose(f);
-}
-
-/*
- * Append the passed message descriptor onto the temp file.
- * If the write fails, return 1, else 0
- */
-int
-append(mp, f)
- struct message *mp;
- FILE *f;
-{
- return (fwrite((char *)mp, sizeof(*mp), 1, f) != 1);
-}
-
-/*
- * Delete a file, but only if the file is a plain file.
- */
-int
-rm(name)
- char *name;
-{
- struct stat sb;
-
- if (stat(name, &sb) < 0)
- return (-1);
- if (!S_ISREG(sb.st_mode)) {
- errno = EISDIR;
- return (-1);
- }
- return (unlink(name));
-}
-
-static int sigdepth; /* depth of holdsigs() */
-static sigset_t nset, oset;
-/*
- * Hold signals SIGHUP, SIGINT, and SIGQUIT.
- */
-void
-holdsigs()
-{
-
- if (sigdepth++ == 0) {
- (void)sigemptyset(&nset);
- (void)sigaddset(&nset, SIGHUP);
- (void)sigaddset(&nset, SIGINT);
- (void)sigaddset(&nset, SIGQUIT);
- (void)sigprocmask(SIG_BLOCK, &nset, &oset);
- }
-}
-
-/*
- * Release signals SIGHUP, SIGINT, and SIGQUIT.
- */
-void
-relsesigs()
-{
-
- if (--sigdepth == 0)
- (void)sigprocmask(SIG_SETMASK, &oset, NULL);
-}
-
-/*
- * Determine the size of the file possessed by
- * the passed buffer.
- */
-off_t
-fsize(iob)
- FILE *iob;
-{
- struct stat sbuf;
-
- if (fstat(fileno(iob), &sbuf) < 0)
- return (0);
- return (sbuf.st_size);
-}
-
-/*
- * Evaluate the string given as a new mailbox name.
- * Supported meta characters:
- * % for my system mail box
- * %user for user's system mail box
- * # for previous file
- * & invoker's mbox file
- * +file file in folder directory
- * any shell meta character
- * Return the file name as a dynamic string.
- */
-char *
-expand(name)
- char *name;
-{
- char xname[PATHSIZE];
- char cmdbuf[PATHSIZE]; /* also used for file names */
- int pid, l;
- char *cp, *sh;
- int pivec[2];
- struct stat sbuf;
-
- /*
- * The order of evaluation is "%" and "#" expand into constants.
- * "&" can expand into "+". "+" can expand into shell meta characters.
- * Shell meta characters expand into constants.
- * This way, we make no recursive expansion.
- */
- switch (*name) {
- case '%':
- findmail(name[1] ? name + 1 : myname, xname, sizeof(xname));
- return (savestr(xname));
- case '#':
- if (name[1] != 0)
- break;
- if (prevfile[0] == 0) {
- printf("No previous file\n");
- return (NULL);
- }
- return (savestr(prevfile));
- case '&':
- if (name[1] == 0 && (name = value("MBOX")) == NULL)
- name = "~/mbox";
- /* fall through */
- }
- if (name[0] == '+' && getfold(cmdbuf, sizeof(cmdbuf)) >= 0) {
- (void)snprintf(xname, sizeof(xname), "%s/%s", cmdbuf, name + 1);
- name = savestr(xname);
- }
- /* catch the most common shell meta character */
- if (name[0] == '~' && homedir != NULL &&
- (name[1] == '/' || name[1] == '\0')) {
- (void)snprintf(xname, sizeof(xname), "%s%s", homedir, name + 1);
- name = savestr(xname);
- }
- if (!strpbrk(name, "~{[*?$`'\"\\"))
- return (name);
- if (pipe(pivec) < 0) {
- warn("pipe");
- return (name);
- }
- (void)snprintf(cmdbuf, sizeof(cmdbuf), "echo %s", name);
- if ((sh = value("SHELL")) == NULL)
- sh = _PATH_CSHELL;
- pid = start_command(sh, 0, -1, pivec[1], "-c", cmdbuf, NULL);
- if (pid < 0) {
- (void)close(pivec[0]);
- (void)close(pivec[1]);
- return (NULL);
- }
- (void)close(pivec[1]);
- l = read(pivec[0], xname, BUFSIZ);
- (void)close(pivec[0]);
- if (wait_child(pid) < 0 && WIFSIGNALED(wait_status) &&
- WTERMSIG(wait_status) != SIGPIPE) {
- fprintf(stderr, "\"%s\": Expansion failed.\n", name);
- return (NULL);
- }
- if (l < 0) {
- warn("read");
- return (NULL);
- }
- if (l == 0) {
- fprintf(stderr, "\"%s\": No match.\n", name);
- return (NULL);
- }
- if (l == BUFSIZ) {
- fprintf(stderr, "\"%s\": Expansion buffer overflow.\n", name);
- return (NULL);
- }
- xname[l] = '\0';
- for (cp = &xname[l-1]; *cp == '\n' && cp > xname; cp--)
- ;
- cp[1] = '\0';
- if (strchr(xname, ' ') && stat(xname, &sbuf) < 0) {
- fprintf(stderr, "\"%s\": Ambiguous.\n", name);
- return (NULL);
- }
- return (savestr(xname));
-}
-
-/*
- * Determine the current folder directory name.
- */
-int
-getfold(name, namelen)
- char *name;
- int namelen;
-{
- char *folder;
- int copylen;
-
- if ((folder = value("folder")) == NULL)
- return (-1);
- if (*folder == '/')
- copylen = strlcpy(name, folder, namelen);
- else
- copylen = snprintf(name, namelen, "%s/%s",
- homedir ? homedir : ".", folder);
- return (copylen < 0 || copylen >= namelen ? (-1) : (0));
-}
-
-/*
- * Return the name of the dead.letter file.
- */
-char *
-getdeadletter()
-{
- char *cp;
-
- if ((cp = value("DEAD")) == NULL || (cp = expand(cp)) == NULL)
- cp = expand("~/dead.letter");
- else if (*cp != '/') {
- char buf[PATHSIZE];
-
- (void)snprintf(buf, sizeof(buf), "~/%s", cp);
- cp = expand(buf);
- }
- return (cp);
-}
diff --git a/usr.bin/mail/getname.c b/usr.bin/mail/getname.c
deleted file mode 100644
index 5851985..0000000
--- a/usr.bin/mail/getname.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)getname.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "rcv.h"
-#include <pwd.h>
-#include "extern.h"
-
-/* Getname / getuserid for those with hashed passwd data base). */
-
-/*
- * Search the passwd file for a uid. Return name on success, NULL on failure.
- */
-char *
-getname(uid)
- int uid;
-{
- struct passwd *pw;
-
- if ((pw = getpwuid(uid)) == NULL)
- return (NULL);
- return (pw->pw_name);
-}
-
-/*
- * Convert the passed name to a user id and return it. Return -1
- * on error.
- */
-int
-getuserid(name)
- char name[];
-{
- struct passwd *pw;
-
- if ((pw = getpwnam(name)) == NULL)
- return (-1);
- return (pw->pw_uid);
-}
diff --git a/usr.bin/mail/glob.h b/usr.bin/mail/glob.h
deleted file mode 100644
index 5f1812a..0000000
--- a/usr.bin/mail/glob.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)glob.h 8.1 (Berkeley) 6/6/93
- *
- * $FreeBSD$
- */
-
-/*
- * A bunch of global variable declarations lie herein.
- * def.h must be included first.
- */
-
-int msgCount; /* Count of messages read in */
-int rcvmode; /* True if receiving mail */
-int sawcom; /* Set after first command */
-char *Tflag; /* -T temp file for netnews */
-int senderr; /* An error while checking */
-int edit; /* Indicates editing a file */
-int readonly; /* Will be unable to rewrite file */
-int noreset; /* String resets suspended */
-int sourcing; /* Currently reading variant file */
-int loading; /* Loading user definitions */
-int cond; /* Current state of conditional exc. */
-FILE *itf; /* Input temp file buffer */
-FILE *otf; /* Output temp file buffer */
-int image; /* File descriptor for image of msg */
-FILE *input; /* Current command input file */
-char mailname[PATHSIZE]; /* Name of current file */
-char prevfile[PATHSIZE]; /* Name of previous file */
-char *homedir; /* Path name of home directory */
-char *myname; /* My login name */
-off_t mailsize; /* Size of system mailbox */
-int lexnumber; /* Number of TNUMBER from scan() */
-char lexstring[STRINGLEN]; /* String from TSTRING, scan() */
-int regretp; /* Pointer to TOS of regret tokens */
-int regretstack[REGDEP]; /* Stack of regretted tokens */
-char *string_stack[REGDEP]; /* Stack of regretted strings */
-int numberstack[REGDEP]; /* Stack of regretted numbers */
-struct message *dot; /* Pointer to current message */
-struct message *message; /* The actual message structure */
-struct var *variables[HSHSIZE]; /* Pointer to active var list */
-struct grouphead *groups[HSHSIZE];/* Pointer to active groups */
-struct ignoretab ignore[2]; /* ignored and retained fields
- 0 is ignore, 1 is retain */
-struct ignoretab saveignore[2]; /* ignored and retained fields
- on save to folder */
-struct ignoretab ignoreall[2]; /* special, ignore all headers */
-char **altnames; /* List of alternate names for user */
-int debug; /* Debug flag set */
-int screenwidth; /* Screen width, or best guess */
-int screenheight; /* Screen height, or best guess,
- for "header" command */
-int realscreenheight; /* the real screen height */
-
-#include <setjmp.h>
-
-jmp_buf srbuf;
-
-
-/*
- * The pointers for the string allocation routines,
- * there are NSPACE independent areas.
- * The first holds STRINGSIZE bytes, the next
- * twice as much, and so on.
- */
-
-#define NSPACE 25 /* Total number of string spaces */
-struct strings {
- char *s_topFree; /* Beginning of this area */
- char *s_nextFree; /* Next alloctable place here */
- unsigned s_nleft; /* Number of bytes left here */
-} stringdope[NSPACE];
diff --git a/usr.bin/mail/head.c b/usr.bin/mail/head.c
deleted file mode 100644
index 90db962..0000000
--- a/usr.bin/mail/head.c
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)head.c 8.2 (Berkeley) 4/20/95";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "rcv.h"
-#include "extern.h"
-
-/*
- * Mail -- a mail program
- *
- * Routines for processing and detecting headlines.
- */
-
-/*
- * See if the passed line buffer is a mail header.
- * Return true if yes. Note the extreme pains to
- * accomodate all funny formats.
- */
-int
-ishead(linebuf)
- char linebuf[];
-{
- struct headline hl;
- char parbuf[BUFSIZ];
-
- if (strncmp(linebuf, "From ", 5) != 0)
- return (0);
- parse(linebuf, &hl, parbuf);
- if (hl.l_date == NULL) {
- fail(linebuf, "No date field");
- return (0);
- }
- if (!isdate(hl.l_date)) {
- fail(linebuf, "Date field not legal date");
- return (0);
- }
- /*
- * I guess we got it!
- */
- return (1);
-}
-
-/*ARGSUSED*/
-void
-fail(linebuf, reason)
- const char *linebuf, *reason;
-{
-
- /*
- if (value("debug") == NULL)
- return;
- fprintf(stderr, "\"%s\"\nnot a header because %s\n", linebuf, reason);
- */
-}
-
-/*
- * Split a headline into its useful components.
- * Copy the line into dynamic string space, then set
- * pointers into the copied line in the passed headline
- * structure. Actually, it scans.
- */
-void
-parse(line, hl, pbuf)
- char line[], pbuf[];
- struct headline *hl;
-{
- char *cp, *sp;
- char word[LINESIZE];
-
- hl->l_from = NULL;
- hl->l_tty = NULL;
- hl->l_date = NULL;
- cp = line;
- sp = pbuf;
- /*
- * Skip over "From" first.
- */
- cp = nextword(cp, word);
- /*
- * Check for missing return-path.
- */
- if (isdate(cp)) {
- hl->l_date = copyin(cp, &sp);
- return;
- }
- cp = nextword(cp, word);
- if (strlen(word) > 0)
- hl->l_from = copyin(word, &sp);
- if (cp != NULL && strncmp(cp, "tty", 3) == 0) {
- cp = nextword(cp, word);
- hl->l_tty = copyin(word, &sp);
- }
- if (cp != NULL)
- hl->l_date = copyin(cp, &sp);
-}
-
-/*
- * Copy the string on the left into the string on the right
- * and bump the right (reference) string pointer by the length.
- * Thus, dynamically allocate space in the right string, copying
- * the left string into it.
- */
-char *
-copyin(src, space)
- char *src;
- char **space;
-{
- char *cp, *top;
-
- top = cp = *space;
- while ((*cp++ = *src++) != '\0')
- ;
- *space = cp;
- return (top);
-}
-
-/*
- * Test to see if the passed string is a ctime(3) generated
- * date string as documented in the manual. The template
- * below is used as the criterion of correctness.
- * Also, we check for a possible trailing time zone using
- * the tmztype template.
- *
- * If the mail file is created by Sys V (Solaris), there are
- * no seconds in the time. If the mail is created by another
- * program such as imapd, it might have timezone as
- * <-|+>nnnn (-0800 for instance) at the end.
- */
-
-/*
- * 'A' An upper case char
- * 'a' A lower case char
- * ' ' A space
- * '0' A digit
- * 'O' A digit or space
- * 'p' A punctuation char
- * 'P' A punctuation char or space
- * ':' A colon
- * 'N' A new line
- */
-
-static char *date_formats[] = {
- "Aaa Aaa O0 00:00:00 0000", /* Mon Jan 01 23:59:59 2001 */
- "Aaa Aaa O0 00:00:00 AAA 0000", /* Mon Jan 01 23:59:59 PST 2001 */
- "Aaa Aaa O0 00:00:00 0000 p0000", /* Mon Jan 01 23:59:59 2001 -0800 */
- "Aaa Aaa O0 00:00 0000", /* Mon Jan 01 23:59 2001 */
- "Aaa Aaa O0 00:00 AAA 0000", /* Mon Jan 01 23:59 PST 2001 */
- "Aaa Aaa O0 00:00 0000 p0000", /* Mon Jan 01 23:59 2001 -0800 */
- NULL
-};
-
-int
-isdate(date)
- char date[];
-{
- int i;
-
- for(i = 0; date_formats[i] != NULL; i++) {
- if (cmatch(date, date_formats[i]))
- return (1);
- }
- return (0);
-}
-
-/*
- * Match the given string (cp) against the given template (tp).
- * Return 1 if they match, 0 if they don't
- */
-int
-cmatch(cp, tp)
- char *cp, *tp;
-{
-
- while (*cp != '\0' && *tp != '\0')
- switch (*tp++) {
- case 'a':
- if (!islower((unsigned char)*cp++))
- return (0);
- break;
- case 'A':
- if (!isupper((unsigned char)*cp++))
- return (0);
- break;
- case ' ':
- if (*cp++ != ' ')
- return (0);
- break;
- case '0':
- if (!isdigit((unsigned char)*cp++))
- return (0);
- break;
- case 'O':
- if (*cp != ' ' && !isdigit((unsigned char)*cp))
- return (0);
- cp++;
- break;
- case 'p':
- if (!ispunct((unsigned char)*cp++))
- return (0);
- break;
- case 'P':
- if (*cp != ' ' && !ispunct((unsigned char)*cp))
- return (0);
- cp++;
- break;
- case ':':
- if (*cp++ != ':')
- return (0);
- break;
- case 'N':
- if (*cp++ != '\n')
- return (0);
- break;
- }
- if (*cp != '\0' || *tp != '\0')
- return (0);
- return (1);
-}
-
-/*
- * Collect a liberal (space, tab delimited) word into the word buffer
- * passed. Also, return a pointer to the next word following that,
- * or NULL if none follow.
- */
-char *
-nextword(wp, wbuf)
- char *wp, *wbuf;
-{
- int c;
-
- if (wp == NULL) {
- *wbuf = '\0';
- return (NULL);
- }
- while ((c = *wp++) != '\0' && c != ' ' && c != '\t') {
- *wbuf++ = c;
- if (c == '"') {
- while ((c = *wp++) != '\0' && c != '"')
- *wbuf++ = c;
- if (c == '"')
- *wbuf++ = c;
- else
- wp--;
- }
- }
- *wbuf = '\0';
- for (; c == ' ' || c == '\t'; c = *wp++)
- ;
- if (c == '\0')
- return (NULL);
- return (wp - 1);
-}
diff --git a/usr.bin/mail/lex.c b/usr.bin/mail/lex.c
deleted file mode 100644
index 4d5e14b..0000000
--- a/usr.bin/mail/lex.c
+++ /dev/null
@@ -1,718 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)lex.c 8.2 (Berkeley) 4/20/95";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "rcv.h"
-#include <errno.h>
-#include <fcntl.h>
-#include "extern.h"
-
-/*
- * Mail -- a mail program
- *
- * Lexical processing of commands.
- */
-
-static const char *prompt = "& ";
-
-extern const struct cmd cmdtab[];
-extern const char *version;
-
-/*
- * Set up editing on the given file name.
- * If the first character of name is %, we are considered to be
- * editing the file, otherwise we are reading our mail which has
- * signficance for mbox and so forth.
- *
- * If the -e option is being passed to mail, this function has a
- * tri-state return code: -1 on error, 0 on no mail, 1 if there is
- * mail.
- */
-int
-setfile(name)
- char *name;
-{
- FILE *ibuf;
- int checkmode, i, fd;
- struct stat stb;
- char isedit = *name != '%' || getuserid(myname) != getuid();
- char *who = name[1] ? name + 1 : myname;
- char tempname[PATHSIZE];
- static int shudclob;
-
- checkmode = value("checkmode") != NULL;
- if ((name = expand(name)) == NULL)
- return (-1);
-
- if ((ibuf = Fopen(name, "r")) == NULL) {
- if (!isedit && errno == ENOENT)
- goto nomail;
- warn("%s", name);
- return (-1);
- }
-
- if (fstat(fileno(ibuf), &stb) < 0) {
- warn("fstat");
- (void)Fclose(ibuf);
- return (-1);
- }
-
- if (S_ISDIR(stb.st_mode) || !S_ISREG(stb.st_mode)) {
- (void)Fclose(ibuf);
- errno = S_ISDIR(stb.st_mode) ? EISDIR : EINVAL;
- warn("%s", name);
- return (-1);
- }
-
- /*
- * Looks like all will be well. We must now relinquish our
- * hold on the current set of stuff. Must hold signals
- * while we are reading the new file, else we will ruin
- * the message[] data structure.
- */
-
- holdsigs();
- if (shudclob)
- quit();
-
- /*
- * Copy the messages into /tmp
- * and set pointers.
- */
-
- readonly = 0;
- if ((i = open(name, 1)) < 0)
- readonly++;
- else
- (void)close(i);
- if (shudclob) {
- (void)fclose(itf);
- (void)fclose(otf);
- }
- shudclob = 1;
- edit = isedit;
- strlcpy(prevfile, mailname, sizeof(prevfile));
- if (name != mailname)
- strlcpy(mailname, name, sizeof(mailname));
- mailsize = fsize(ibuf);
- (void)snprintf(tempname, sizeof(tempname),
- "%s/mail.RxXXXXXXXXXX", tmpdir);
- if ((fd = mkstemp(tempname)) == -1 || (otf = fdopen(fd, "w")) == NULL)
- err(1, "%s", tempname);
- (void)fcntl(fileno(otf), F_SETFD, 1);
- if ((itf = fopen(tempname, "r")) == NULL)
- err(1, "%s", tempname);
- (void)fcntl(fileno(itf), F_SETFD, 1);
- (void)rm(tempname);
- setptr(ibuf, 0);
- setmsize(msgCount);
- /*
- * New mail may have arrived while we were reading
- * the mail file, so reset mailsize to be where
- * we really are in the file...
- */
- mailsize = ftello(ibuf);
- (void)Fclose(ibuf);
- relsesigs();
- sawcom = 0;
-
- if ((checkmode || !edit) && msgCount == 0) {
-nomail:
- if (!checkmode) {
- fprintf(stderr, "No mail for %s\n", who);
- return (-1);
- } else
- return (0);
- }
- return (checkmode ? 1 : 0);
-}
-
-/*
- * Incorporate any new mail that has arrived since we first
- * started reading mail.
- */
-int
-incfile()
-{
- off_t newsize;
- int omsgCount = msgCount;
- FILE *ibuf;
-
- ibuf = Fopen(mailname, "r");
- if (ibuf == NULL)
- return (-1);
- holdsigs();
- newsize = fsize(ibuf);
- if (newsize == 0)
- return (-1); /* mail box is now empty??? */
- if (newsize < mailsize)
- return (-1); /* mail box has shrunk??? */
- if (newsize == mailsize)
- return (0); /* no new mail */
- setptr(ibuf, mailsize);
- setmsize(msgCount);
- mailsize = ftello(ibuf);
- (void)Fclose(ibuf);
- relsesigs();
- return (msgCount - omsgCount);
-}
-
-static int *msgvec;
-static int reset_on_stop; /* do a reset() if stopped */
-
-/*
- * Interpret user commands one by one. If standard input is not a tty,
- * print no prompt.
- */
-void
-commands()
-{
- int n, eofloop = 0;
- char linebuf[LINESIZE];
-
- if (!sourcing) {
- if (signal(SIGINT, SIG_IGN) != SIG_IGN)
- (void)signal(SIGINT, intr);
- if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
- (void)signal(SIGHUP, hangup);
- (void)signal(SIGTSTP, stop);
- (void)signal(SIGTTOU, stop);
- (void)signal(SIGTTIN, stop);
- }
- setexit();
- for (;;) {
- /*
- * Print the prompt, if needed. Clear out
- * string space, and flush the output.
- */
- if (!sourcing && value("interactive") != NULL) {
- if ((value("autoinc") != NULL) && (incfile() > 0))
- printf("New mail has arrived.\n");
- reset_on_stop = 1;
- printf("%s", prompt);
- }
- (void)fflush(stdout);
- sreset();
- /*
- * Read a line of commands from the current input
- * and handle end of file specially.
- */
- n = 0;
- for (;;) {
- if (readline(input, &linebuf[n], LINESIZE - n) < 0) {
- if (n == 0)
- n = -1;
- break;
- }
- if ((n = strlen(linebuf)) == 0)
- break;
- n--;
- if (linebuf[n] != '\\')
- break;
- linebuf[n++] = ' ';
- }
- reset_on_stop = 0;
- if (n < 0) {
- /* eof */
- if (loading)
- break;
- if (sourcing) {
- unstack();
- continue;
- }
- if (value("interactive") != NULL &&
- value("ignoreeof") != NULL &&
- ++eofloop < 25) {
- printf("Use \"quit\" to quit.\n");
- continue;
- }
- break;
- }
- eofloop = 0;
- if (execute(linebuf, 0))
- break;
- }
-}
-
-/*
- * Execute a single command.
- * Command functions return 0 for success, 1 for error, and -1
- * for abort. A 1 or -1 aborts a load or source. A -1 aborts
- * the interactive command loop.
- * Contxt is non-zero if called while composing mail.
- */
-int
-execute(linebuf, contxt)
- char linebuf[];
- int contxt;
-{
- char word[LINESIZE];
- char *arglist[MAXARGC];
- const struct cmd *com;
- char *cp, *cp2;
- int c, muvec[2];
- int e = 1;
-
- /*
- * Strip the white space away from the beginning
- * of the command, then scan out a word, which
- * consists of anything except digits and white space.
- *
- * Handle ! escapes differently to get the correct
- * lexical conventions.
- */
-
- for (cp = linebuf; isspace((unsigned char)*cp); cp++)
- ;
- if (*cp == '!') {
- if (sourcing) {
- printf("Can't \"!\" while sourcing\n");
- goto out;
- }
- shell(cp+1);
- return (0);
- }
- cp2 = word;
- while (*cp != '\0' && strchr(" \t0123456789$^.:/-+*'\"", *cp) == NULL)
- *cp2++ = *cp++;
- *cp2 = '\0';
-
- /*
- * Look up the command; if not found, bitch.
- * Normally, a blank command would map to the
- * first command in the table; while sourcing,
- * however, we ignore blank lines to eliminate
- * confusion.
- */
-
- if (sourcing && *word == '\0')
- return (0);
- com = lex(word);
- if (com == NULL) {
- printf("Unknown command: \"%s\"\n", word);
- goto out;
- }
-
- /*
- * See if we should execute the command -- if a conditional
- * we always execute it, otherwise, check the state of cond.
- */
-
- if ((com->c_argtype & F) == 0)
- if ((cond == CRCV && !rcvmode) || (cond == CSEND && rcvmode))
- return (0);
-
- /*
- * Process the arguments to the command, depending
- * on the type he expects. Default to an error.
- * If we are sourcing an interactive command, it's
- * an error.
- */
-
- if (!rcvmode && (com->c_argtype & M) == 0) {
- printf("May not execute \"%s\" while sending\n",
- com->c_name);
- goto out;
- }
- if (sourcing && com->c_argtype & I) {
- printf("May not execute \"%s\" while sourcing\n",
- com->c_name);
- goto out;
- }
- if (readonly && com->c_argtype & W) {
- printf("May not execute \"%s\" -- message file is read only\n",
- com->c_name);
- goto out;
- }
- if (contxt && com->c_argtype & R) {
- printf("Cannot recursively invoke \"%s\"\n", com->c_name);
- goto out;
- }
- switch (com->c_argtype & ~(F|P|I|M|T|W|R)) {
- case MSGLIST:
- /*
- * A message list defaulting to nearest forward
- * legal message.
- */
- if (msgvec == 0) {
- printf("Illegal use of \"message list\"\n");
- break;
- }
- if ((c = getmsglist(cp, msgvec, com->c_msgflag)) < 0)
- break;
- if (c == 0) {
- *msgvec = first(com->c_msgflag, com->c_msgmask);
- msgvec[1] = 0;
- }
- if (*msgvec == 0) {
- printf("No applicable messages\n");
- break;
- }
- e = (*com->c_func)(msgvec);
- break;
-
- case NDMLIST:
- /*
- * A message list with no defaults, but no error
- * if none exist.
- */
- if (msgvec == 0) {
- printf("Illegal use of \"message list\"\n");
- break;
- }
- if (getmsglist(cp, msgvec, com->c_msgflag) < 0)
- break;
- e = (*com->c_func)(msgvec);
- break;
-
- case STRLIST:
- /*
- * Just the straight string, with
- * leading blanks removed.
- */
- while (isspace((unsigned char)*cp))
- cp++;
- e = (*com->c_func)(cp);
- break;
-
- case RAWLIST:
- /*
- * A vector of strings, in shell style.
- */
- if ((c = getrawlist(cp, arglist,
- sizeof(arglist) / sizeof(*arglist))) < 0)
- break;
- if (c < com->c_minargs) {
- printf("%s requires at least %d arg(s)\n",
- com->c_name, com->c_minargs);
- break;
- }
- if (c > com->c_maxargs) {
- printf("%s takes no more than %d arg(s)\n",
- com->c_name, com->c_maxargs);
- break;
- }
- e = (*com->c_func)(arglist);
- break;
-
- case NOLIST:
- /*
- * Just the constant zero, for exiting,
- * eg.
- */
- e = (*com->c_func)(0);
- break;
-
- default:
- errx(1, "Unknown argtype");
- }
-
-out:
- /*
- * Exit the current source file on
- * error.
- */
- if (e) {
- if (e < 0)
- return (1);
- if (loading)
- return (1);
- if (sourcing)
- unstack();
- return (0);
- }
- if (com == NULL)
- return (0);
- if (value("autoprint") != NULL && com->c_argtype & P)
- if ((dot->m_flag & MDELETED) == 0) {
- muvec[0] = dot - &message[0] + 1;
- muvec[1] = 0;
- type(muvec);
- }
- if (!sourcing && (com->c_argtype & T) == 0)
- sawcom = 1;
- return (0);
-}
-
-/*
- * Set the size of the message vector used to construct argument
- * lists to message list functions.
- */
-void
-setmsize(sz)
- int sz;
-{
-
- if (msgvec != NULL)
- (void)free(msgvec);
- msgvec = calloc((unsigned)(sz + 1), sizeof(*msgvec));
-}
-
-/*
- * Find the correct command in the command table corresponding
- * to the passed command "word"
- */
-
-__const struct cmd *
-lex(word)
- char word[];
-{
- const struct cmd *cp;
-
- /*
- * ignore trailing chars after `#'
- *
- * lines with beginning `#' are comments
- * spaces before `#' are ignored in execute()
- */
-
- if (*word == '#')
- *(word+1) = '\0';
-
-
- for (cp = &cmdtab[0]; cp->c_name != NULL; cp++)
- if (isprefix(word, cp->c_name))
- return (cp);
- return (NULL);
-}
-
-/*
- * Determine if as1 is a valid prefix of as2.
- * Return true if yep.
- */
-int
-isprefix(as1, as2)
- const char *as1, *as2;
-{
- const char *s1, *s2;
-
- s1 = as1;
- s2 = as2;
- while (*s1++ == *s2)
- if (*s2++ == '\0')
- return (1);
- return (*--s1 == '\0');
-}
-
-/*
- * The following gets called on receipt of an interrupt. This is
- * to abort printout of a command, mainly.
- * Dispatching here when command() is inactive crashes rcv.
- * Close all open files except 0, 1, 2, and the temporary.
- * Also, unstack all source files.
- */
-
-static int inithdr; /* am printing startup headers */
-
-/*ARGSUSED*/
-void
-intr(s)
- int s;
-{
-
- noreset = 0;
- if (!inithdr)
- sawcom++;
- inithdr = 0;
- while (sourcing)
- unstack();
-
- close_all_files();
-
- if (image >= 0) {
- (void)close(image);
- image = -1;
- }
- fprintf(stderr, "Interrupt\n");
- reset(0);
-}
-
-/*
- * When we wake up after ^Z, reprint the prompt.
- */
-void
-stop(s)
- int s;
-{
- sig_t old_action = signal(s, SIG_DFL);
- sigset_t nset;
-
- (void)sigemptyset(&nset);
- (void)sigaddset(&nset, s);
- (void)sigprocmask(SIG_UNBLOCK, &nset, NULL);
- (void)kill(0, s);
- (void)sigprocmask(SIG_BLOCK, &nset, NULL);
- (void)signal(s, old_action);
- if (reset_on_stop) {
- reset_on_stop = 0;
- reset(0);
- }
-}
-
-/*
- * Branch here on hangup signal and simulate "exit".
- */
-/*ARGSUSED*/
-void
-hangup(s)
- int s;
-{
-
- /* nothing to do? */
- exit(1);
-}
-
-/*
- * Announce the presence of the current Mail version,
- * give the message count, and print a header listing.
- */
-void
-announce()
-{
- int vec[2], mdot;
-
- mdot = newfileinfo(0);
- vec[0] = mdot;
- vec[1] = 0;
- dot = &message[mdot - 1];
- if (msgCount > 0 && value("noheader") == NULL) {
- inithdr++;
- headers(vec);
- inithdr = 0;
- }
-}
-
-/*
- * Announce information about the file we are editing.
- * Return a likely place to set dot.
- */
-int
-newfileinfo(omsgCount)
- int omsgCount;
-{
- struct message *mp;
- int u, n, mdot, d, s;
- char fname[PATHSIZE+1], zname[PATHSIZE+1], *ename;
-
- for (mp = &message[omsgCount]; mp < &message[msgCount]; mp++)
- if (mp->m_flag & MNEW)
- break;
- if (mp >= &message[msgCount])
- for (mp = &message[omsgCount]; mp < &message[msgCount]; mp++)
- if ((mp->m_flag & MREAD) == 0)
- break;
- if (mp < &message[msgCount])
- mdot = mp - &message[0] + 1;
- else
- mdot = omsgCount + 1;
- s = d = 0;
- for (mp = &message[0], n = 0, u = 0; mp < &message[msgCount]; mp++) {
- if (mp->m_flag & MNEW)
- n++;
- if ((mp->m_flag & MREAD) == 0)
- u++;
- if (mp->m_flag & MDELETED)
- d++;
- if (mp->m_flag & MSAVED)
- s++;
- }
- ename = mailname;
- if (getfold(fname, sizeof(fname) - 1) >= 0) {
- strcat(fname, "/");
- if (strncmp(fname, mailname, strlen(fname)) == 0) {
- (void)snprintf(zname, sizeof(zname), "+%s",
- mailname + strlen(fname));
- ename = zname;
- }
- }
- printf("\"%s\": ", ename);
- if (msgCount == 1)
- printf("1 message");
- else
- printf("%d messages", msgCount);
- if (n > 0)
- printf(" %d new", n);
- if (u-n > 0)
- printf(" %d unread", u);
- if (d > 0)
- printf(" %d deleted", d);
- if (s > 0)
- printf(" %d saved", s);
- if (readonly)
- printf(" [Read only]");
- printf("\n");
- return (mdot);
-}
-
-/*
- * Print the current version number.
- */
-
-/*ARGSUSED*/
-int
-pversion(e)
- int e;
-{
-
- printf("Version %s\n", version);
- return (0);
-}
-
-/*
- * Load a file of user definitions.
- */
-void
-load(name)
- char *name;
-{
- FILE *in, *oldin;
-
- if ((in = Fopen(name, "r")) == NULL)
- return;
- oldin = input;
- input = in;
- loading = 1;
- sourcing = 1;
- commands();
- loading = 0;
- sourcing = 0;
- input = oldin;
- (void)Fclose(in);
-}
diff --git a/usr.bin/mail/list.c b/usr.bin/mail/list.c
deleted file mode 100644
index b5907ec..0000000
--- a/usr.bin/mail/list.c
+++ /dev/null
@@ -1,841 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)list.c 8.4 (Berkeley) 5/1/95";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "rcv.h"
-#include <ctype.h>
-#include "extern.h"
-
-/*
- * Mail -- a mail program
- *
- * Message list handling.
- */
-
-/*
- * Convert the user string of message numbers and
- * store the numbers into vector.
- *
- * Returns the count of messages picked up or -1 on error.
- */
-int
-getmsglist(buf, vector, flags)
- char *buf;
- int *vector, flags;
-{
- int *ip;
- struct message *mp;
-
- if (msgCount == 0) {
- *vector = 0;
- return (0);
- }
- if (markall(buf, flags) < 0)
- return (-1);
- ip = vector;
- for (mp = &message[0]; mp < &message[msgCount]; mp++)
- if (mp->m_flag & MMARK)
- *ip++ = mp - &message[0] + 1;
- *ip = 0;
- return (ip - vector);
-}
-
-/*
- * Mark all messages that the user wanted from the command
- * line in the message structure. Return 0 on success, -1
- * on error.
- */
-
-/*
- * Bit values for colon modifiers.
- */
-
-#define CMNEW 01 /* New messages */
-#define CMOLD 02 /* Old messages */
-#define CMUNREAD 04 /* Unread messages */
-#define CMDELETED 010 /* Deleted messages */
-#define CMREAD 020 /* Read messages */
-
-/*
- * The following table describes the letters which can follow
- * the colon and gives the corresponding modifier bit.
- */
-
-static struct coltab {
- char co_char; /* What to find past : */
- int co_bit; /* Associated modifier bit */
- int co_mask; /* m_status bits to mask */
- int co_equal; /* ... must equal this */
-} coltab[] = {
- { 'n', CMNEW, MNEW, MNEW },
- { 'o', CMOLD, MNEW, 0 },
- { 'u', CMUNREAD, MREAD, 0 },
- { 'd', CMDELETED, MDELETED, MDELETED},
- { 'r', CMREAD, MREAD, MREAD },
- { 0, 0, 0, 0 }
-};
-
-static int lastcolmod;
-
-int
-markall(buf, f)
- char buf[];
- int f;
-{
- char **np;
- int i;
- struct message *mp;
- char *namelist[NMLSIZE], *bufp;
- int tok, beg, mc, star, other, valdot, colmod, colresult;
-
- valdot = dot - &message[0] + 1;
- colmod = 0;
- for (i = 1; i <= msgCount; i++)
- unmark(i);
- bufp = buf;
- mc = 0;
- np = &namelist[0];
- scaninit();
- tok = scan(&bufp);
- star = 0;
- other = 0;
- beg = 0;
- while (tok != TEOL) {
- switch (tok) {
- case TNUMBER:
-number:
- if (star) {
- printf("No numbers mixed with *\n");
- return (-1);
- }
- mc++;
- other++;
- if (beg != 0) {
- if (check(lexnumber, f))
- return (-1);
- for (i = beg; i <= lexnumber; i++)
- if (f == MDELETED || (message[i - 1].m_flag & MDELETED) == 0)
- mark(i);
- beg = 0;
- break;
- }
- beg = lexnumber;
- if (check(beg, f))
- return (-1);
- tok = scan(&bufp);
- regret(tok);
- if (tok != TDASH) {
- mark(beg);
- beg = 0;
- }
- break;
-
- case TPLUS:
- if (beg != 0) {
- printf("Non-numeric second argument\n");
- return (-1);
- }
- i = valdot;
- do {
- i++;
- if (i > msgCount) {
- printf("Referencing beyond EOF\n");
- return (-1);
- }
- } while ((message[i - 1].m_flag & MDELETED) != f);
- mark(i);
- break;
-
- case TDASH:
- if (beg == 0) {
- i = valdot;
- do {
- i--;
- if (i <= 0) {
- printf("Referencing before 1\n");
- return (-1);
- }
- } while ((message[i - 1].m_flag & MDELETED) != f);
- mark(i);
- }
- break;
-
- case TSTRING:
- if (beg != 0) {
- printf("Non-numeric second argument\n");
- return (-1);
- }
- other++;
- if (lexstring[0] == ':') {
- colresult = evalcol(lexstring[1]);
- if (colresult == 0) {
- printf("Unknown colon modifier \"%s\"\n",
- lexstring);
- return (-1);
- }
- colmod |= colresult;
- }
- else
- *np++ = savestr(lexstring);
- break;
-
- case TDOLLAR:
- case TUP:
- case TDOT:
- lexnumber = metamess(lexstring[0], f);
- if (lexnumber == -1)
- return (-1);
- goto number;
-
- case TSTAR:
- if (other) {
- printf("Can't mix \"*\" with anything\n");
- return (-1);
- }
- star++;
- break;
-
- case TERROR:
- return (-1);
- }
- tok = scan(&bufp);
- }
- lastcolmod = colmod;
- *np = NULL;
- mc = 0;
- if (star) {
- for (i = 0; i < msgCount; i++)
- if ((message[i].m_flag & MDELETED) == f) {
- mark(i+1);
- mc++;
- }
- if (mc == 0) {
- printf("No applicable messages.\n");
- return (-1);
- }
- return (0);
- }
-
- /*
- * If no numbers were given, mark all of the messages,
- * so that we can unmark any whose sender was not selected
- * if any user names were given.
- */
-
- if ((np > namelist || colmod != 0) && mc == 0)
- for (i = 1; i <= msgCount; i++)
- if ((message[i-1].m_flag & MDELETED) == f)
- mark(i);
-
- /*
- * If any names were given, go through and eliminate any
- * messages whose senders were not requested.
- */
-
- if (np > namelist) {
- for (i = 1; i <= msgCount; i++) {
- for (mc = 0, np = &namelist[0]; *np != NULL; np++)
- if (**np == '/') {
- if (matchfield(*np, i)) {
- mc++;
- break;
- }
- }
- else {
- if (matchsender(*np, i)) {
- mc++;
- break;
- }
- }
- if (mc == 0)
- unmark(i);
- }
-
- /*
- * Make sure we got some decent messages.
- */
-
- mc = 0;
- for (i = 1; i <= msgCount; i++)
- if (message[i-1].m_flag & MMARK) {
- mc++;
- break;
- }
- if (mc == 0) {
- printf("No applicable messages from {%s",
- namelist[0]);
- for (np = &namelist[1]; *np != NULL; np++)
- printf(", %s", *np);
- printf("}\n");
- return (-1);
- }
- }
-
- /*
- * If any colon modifiers were given, go through and
- * unmark any messages which do not satisfy the modifiers.
- */
-
- if (colmod != 0) {
- for (i = 1; i <= msgCount; i++) {
- struct coltab *colp;
-
- mp = &message[i - 1];
- for (colp = &coltab[0]; colp->co_char != '\0'; colp++)
- if (colp->co_bit & colmod)
- if ((mp->m_flag & colp->co_mask)
- != colp->co_equal)
- unmark(i);
-
- }
- for (mp = &message[0]; mp < &message[msgCount]; mp++)
- if (mp->m_flag & MMARK)
- break;
- if (mp >= &message[msgCount]) {
- struct coltab *colp;
-
- printf("No messages satisfy");
- for (colp = &coltab[0]; colp->co_char != '\0'; colp++)
- if (colp->co_bit & colmod)
- printf(" :%c", colp->co_char);
- printf("\n");
- return (-1);
- }
- }
- return (0);
-}
-
-/*
- * Turn the character after a colon modifier into a bit
- * value.
- */
-int
-evalcol(col)
- int col;
-{
- struct coltab *colp;
-
- if (col == 0)
- return (lastcolmod);
- for (colp = &coltab[0]; colp->co_char != '\0'; colp++)
- if (colp->co_char == col)
- return (colp->co_bit);
- return (0);
-}
-
-/*
- * Check the passed message number for legality and proper flags.
- * If f is MDELETED, then either kind will do. Otherwise, the message
- * has to be undeleted.
- */
-int
-check(mesg, f)
- int mesg, f;
-{
- struct message *mp;
-
- if (mesg < 1 || mesg > msgCount) {
- printf("%d: Invalid message number\n", mesg);
- return (-1);
- }
- mp = &message[mesg-1];
- if (f != MDELETED && (mp->m_flag & MDELETED) != 0) {
- printf("%d: Inappropriate message\n", mesg);
- return (-1);
- }
- return (0);
-}
-
-/*
- * Scan out the list of string arguments, shell style
- * for a RAWLIST.
- */
-int
-getrawlist(line, argv, argc)
- char line[];
- char **argv;
- int argc;
-{
- char c, *cp, *cp2, quotec;
- int argn;
- char *linebuf;
- size_t linebufsize = BUFSIZ;
-
- if ((linebuf = malloc(linebufsize)) == NULL)
- err(1, "Out of memory");
-
- argn = 0;
- cp = line;
- for (;;) {
- for (; *cp == ' ' || *cp == '\t'; cp++)
- ;
- if (*cp == '\0')
- break;
- if (argn >= argc - 1) {
- printf(
- "Too many elements in the list; excess discarded.\n");
- break;
- }
- cp2 = linebuf;
- quotec = '\0';
- while ((c = *cp) != '\0') {
- /* Allocate more space if necessary */
- if (cp2 - linebuf == linebufsize - 1) {
- linebufsize += BUFSIZ;
- if ((linebuf = realloc(linebuf, linebufsize)) == NULL)
- err(1, "Out of memory");
- cp2 = linebuf + linebufsize - BUFSIZ - 1;
- }
- cp++;
- if (quotec != '\0') {
- if (c == quotec)
- quotec = '\0';
- else if (c == '\\')
- switch (c = *cp++) {
- case '\0':
- *cp2++ = '\\';
- cp--;
- break;
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- c -= '0';
- if (*cp >= '0' && *cp <= '7')
- c = c * 8 + *cp++ - '0';
- if (*cp >= '0' && *cp <= '7')
- c = c * 8 + *cp++ - '0';
- *cp2++ = c;
- break;
- case 'b':
- *cp2++ = '\b';
- break;
- case 'f':
- *cp2++ = '\f';
- break;
- case 'n':
- *cp2++ = '\n';
- break;
- case 'r':
- *cp2++ = '\r';
- break;
- case 't':
- *cp2++ = '\t';
- break;
- case 'v':
- *cp2++ = '\v';
- break;
- default:
- *cp2++ = c;
- }
- else if (c == '^') {
- c = *cp++;
- if (c == '?')
- *cp2++ = '\177';
- /* null doesn't show up anyway */
- else if ((c >= 'A' && c <= '_') ||
- (c >= 'a' && c <= 'z'))
- *cp2++ = c & 037;
- else {
- *cp2++ = '^';
- cp--;
- }
- } else
- *cp2++ = c;
- } else if (c == '"' || c == '\'')
- quotec = c;
- else if (c == ' ' || c == '\t')
- break;
- else
- *cp2++ = c;
- }
- *cp2 = '\0';
- argv[argn++] = savestr(linebuf);
- }
- argv[argn] = NULL;
- (void)free(linebuf);
- return (argn);
-}
-
-/*
- * scan out a single lexical item and return its token number,
- * updating the string pointer passed **p. Also, store the value
- * of the number or string scanned in lexnumber or lexstring as
- * appropriate. In any event, store the scanned `thing' in lexstring.
- */
-
-static struct lex {
- char l_char;
- char l_token;
-} singles[] = {
- { '$', TDOLLAR },
- { '.', TDOT },
- { '^', TUP },
- { '*', TSTAR },
- { '-', TDASH },
- { '+', TPLUS },
- { '(', TOPEN },
- { ')', TCLOSE },
- { 0, 0 }
-};
-
-int
-scan(sp)
- char **sp;
-{
- char *cp, *cp2;
- int c;
- struct lex *lp;
- int quotec;
-
- if (regretp >= 0) {
- strcpy(lexstring, string_stack[regretp]);
- lexnumber = numberstack[regretp];
- return (regretstack[regretp--]);
- }
- cp = *sp;
- cp2 = lexstring;
- c = *cp++;
-
- /*
- * strip away leading white space.
- */
-
- while (c == ' ' || c == '\t')
- c = *cp++;
-
- /*
- * If no characters remain, we are at end of line,
- * so report that.
- */
-
- if (c == '\0') {
- *sp = --cp;
- return (TEOL);
- }
-
- /*
- * If the leading character is a digit, scan
- * the number and convert it on the fly.
- * Return TNUMBER when done.
- */
-
- if (isdigit((unsigned char)c)) {
- lexnumber = 0;
- while (isdigit((unsigned char)c)) {
- lexnumber = lexnumber*10 + c - '0';
- *cp2++ = c;
- c = *cp++;
- }
- *cp2 = '\0';
- *sp = --cp;
- return (TNUMBER);
- }
-
- /*
- * Check for single character tokens; return such
- * if found.
- */
-
- for (lp = &singles[0]; lp->l_char != '\0'; lp++)
- if (c == lp->l_char) {
- lexstring[0] = c;
- lexstring[1] = '\0';
- *sp = cp;
- return (lp->l_token);
- }
-
- /*
- * We've got a string! Copy all the characters
- * of the string into lexstring, until we see
- * a null, space, or tab.
- * If the lead character is a " or ', save it
- * and scan until you get another.
- */
-
- quotec = 0;
- if (c == '\'' || c == '"') {
- quotec = c;
- c = *cp++;
- }
- while (c != '\0') {
- if (c == quotec) {
- cp++;
- break;
- }
- if (quotec == 0 && (c == ' ' || c == '\t'))
- break;
- if (cp2 - lexstring < STRINGLEN-1)
- *cp2++ = c;
- c = *cp++;
- }
- if (quotec && c == '\0') {
- fprintf(stderr, "Missing %c\n", quotec);
- return (TERROR);
- }
- *sp = --cp;
- *cp2 = '\0';
- return (TSTRING);
-}
-
-/*
- * Unscan the named token by pushing it onto the regret stack.
- */
-void
-regret(token)
- int token;
-{
- if (++regretp >= REGDEP)
- errx(1, "Too many regrets");
- regretstack[regretp] = token;
- lexstring[STRINGLEN-1] = '\0';
- string_stack[regretp] = savestr(lexstring);
- numberstack[regretp] = lexnumber;
-}
-
-/*
- * Reset all the scanner global variables.
- */
-void
-scaninit()
-{
- regretp = -1;
-}
-
-/*
- * Find the first message whose flags & m == f and return
- * its message number.
- */
-int
-first(f, m)
- int f, m;
-{
- struct message *mp;
-
- if (msgCount == 0)
- return (0);
- f &= MDELETED;
- m &= MDELETED;
- for (mp = dot; mp < &message[msgCount]; mp++)
- if ((mp->m_flag & m) == f)
- return (mp - message + 1);
- for (mp = dot-1; mp >= &message[0]; mp--)
- if ((mp->m_flag & m) == f)
- return (mp - message + 1);
- return (0);
-}
-
-/*
- * See if the passed name sent the passed message number. Return true
- * if so.
- */
-int
-matchsender(str, mesg)
- char *str;
- int mesg;
-{
- char *cp;
-
- /* null string matches nothing instead of everything */
- if (*str == '\0')
- return (0);
-
- cp = nameof(&message[mesg - 1], 0);
- return (strcasestr(cp, str) != NULL);
-}
-
-/*
- * See if the passed name received the passed message number. Return true
- * if so.
- */
-
-static char *to_fields[] = { "to", "cc", "bcc", NULL };
-
-static int
-matchto(str, mesg)
- char *str;
- int mesg;
-{
- struct message *mp;
- char *cp, **to;
-
- str++;
-
- /* null string matches nothing instead of everything */
- if (*str == '\0')
- return (0);
-
- mp = &message[mesg - 1];
-
- for (to = to_fields; *to != NULL; to++) {
- cp = hfield(*to, mp);
- if (cp != NULL && strcasestr(cp, str) != NULL)
- return (1);
- }
- return (0);
-}
-
-/*
- * See if the given substring is contained within the specified field. If
- * 'searchheaders' is set, then the form '/x:y' will be accepted and matches
- * any message with the substring 'y' in field 'x'. If 'x' is omitted or
- * 'searchheaders' is not set, then the search matches any messages
- * with the substring 'y' in the 'Subject'. The search is case insensitive.
- *
- * The form '/to:y' is a special case, and will match all messages
- * containing the substring 'y' in the 'To', 'Cc', or 'Bcc' header
- * fields. The search for 'to' is case sensitive, so that '/To:y' can
- * be used to limit the search to just the 'To' field.
- */
-
-static char lastscan[STRINGLEN];
-int
-matchfield(str, mesg)
- char *str;
- int mesg;
-{
- struct message *mp;
- char *cp, *cp2;
-
- str++;
- if (*str == '\0')
- str = lastscan;
- else
- strlcpy(lastscan, str, sizeof(lastscan));
- mp = &message[mesg-1];
-
- /*
- * Now look, ignoring case, for the word in the string.
- */
-
- if (value("searchheaders") && (cp = strchr(str, ':')) != NULL) {
- /* Check for special case "/to:" */
- if (strncmp(str, "to:", 3) == 0)
- return (matchto(cp, mesg));
- *cp++ = '\0';
- cp2 = hfield(*str != '\0' ? str : "subject", mp);
- cp[-1] = ':';
- str = cp;
- cp = cp2;
- } else
- cp = hfield("subject", mp);
-
- if (cp == NULL)
- return (0);
-
- return (strcasestr(cp, str) != NULL);
-}
-
-/*
- * Mark the named message by setting its mark bit.
- */
-void
-mark(mesg)
- int mesg;
-{
- int i;
-
- i = mesg;
- if (i < 1 || i > msgCount)
- errx(1, "Bad message number to mark");
- message[i-1].m_flag |= MMARK;
-}
-
-/*
- * Unmark the named message.
- */
-void
-unmark(mesg)
- int mesg;
-{
- int i;
-
- i = mesg;
- if (i < 1 || i > msgCount)
- errx(1, "Bad message number to unmark");
- message[i-1].m_flag &= ~MMARK;
-}
-
-/*
- * Return the message number corresponding to the passed meta character.
- */
-int
-metamess(meta, f)
- int meta, f;
-{
- int c, m;
- struct message *mp;
-
- c = meta;
- switch (c) {
- case '^':
- /*
- * First 'good' message left.
- */
- for (mp = &message[0]; mp < &message[msgCount]; mp++)
- if ((mp->m_flag & MDELETED) == f)
- return (mp - &message[0] + 1);
- printf("No applicable messages\n");
- return (-1);
-
- case '$':
- /*
- * Last 'good message left.
- */
- for (mp = &message[msgCount-1]; mp >= &message[0]; mp--)
- if ((mp->m_flag & MDELETED) == f)
- return (mp - &message[0] + 1);
- printf("No applicable messages\n");
- return (-1);
-
- case '.':
- /*
- * Current message.
- */
- m = dot - &message[0] + 1;
- if ((dot->m_flag & MDELETED) != f) {
- printf("%d: Inappropriate message\n", m);
- return (-1);
- }
- return (m);
-
- default:
- printf("Unknown metachar (%c)\n", c);
- return (-1);
- }
-}
diff --git a/usr.bin/mail/mail.1 b/usr.bin/mail/mail.1
deleted file mode 100644
index 8f8ce40..0000000
--- a/usr.bin/mail/mail.1
+++ /dev/null
@@ -1,1284 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)mail.1 8.8 (Berkeley) 4/28/95
-.\" $FreeBSD$
-.\"
-.Dd January 5, 2006
-.Dt MAIL 1
-.Os
-.Sh NAME
-.Nm mail ,
-.Nm Mail ,
-.Nm mailx
-.Nd send and receive mail
-.Sh SYNOPSIS
-.Nm
-.Op Fl dEiInv
-.Op Fl s Ar subject
-.Op Fl c Ar cc-addr
-.Op Fl b Ar bcc-addr
-.Op Fl F
-.Ar to-addr ...
-.Op Fl Ar sendmail-option ...
-.Nm
-.Op Fl dEHiInNv
-.Op Fl F
-.Fl f
-.Op Ar name
-.Nm
-.Op Fl dEHiInNv
-.Op Fl F
-.Op Fl u Ar user
-.Nm
-.Op Fl d
-.Fl e
-.Op Fl f Ar name
-.Sh INTRODUCTION
-The
-.Nm
-utility is an intelligent mail processing system, which has
-a command syntax reminiscent of
-.Xr ed 1
-with lines replaced by messages.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl v
-Verbose mode.
-The details of
-delivery are displayed on the user's terminal.
-.It Fl d
-Debugging mode.
-See the
-.Va debug
-mail option for details.
-.It Fl e
-Test for the presence of mail in the (by default, system)
-mailbox.
-An exit status of 0 is returned if
-it has mail; otherwise, an exit status
-of 1 is returned.
-.It Fl H
-Write a header summary only, then exit.
-.It Fl E
-Do not send messages with an empty body.
-This is useful for piping errors from
-.Xr cron 8
-scripts.
-.It Fl i
-Ignore tty interrupt signals.
-This is
-particularly useful when using
-.Nm
-on noisy phone lines.
-.It Fl I
-Force
-.Nm
-to run in interactive mode even when
-input is not a terminal.
-In particular, the
-.Ql ~
-special
-character when sending mail is only active in interactive mode.
-.It Fl n
-Inhibit reading the system-wide
-.Pa mail.rc
-files upon startup.
-.It Fl N
-Inhibit the initial display of message headers
-when reading mail or editing a mail folder.
-.It Fl s Ar subject
-Specify
-.Ar subject
-on command line.
-(Only the first argument after the
-.Fl s
-flag is used as a subject; be careful to quote subjects
-containing spaces.)
-.It Fl c Ar cc-addr
-Send carbon copies to
-.Ar cc-addr
-list of users.
-The
-.Ar cc-addr
-argument should be a comma-separated list of names.
-.It Fl b Ar bcc-addr
-Send blind carbon copies to
-.Ar bcc-addr
-list of users.
-The
-.Ar bcc-addr
-argument should be a comma-separated list of names.
-.It Fl f Op Ar mbox
-Read in the contents of your
-.Pa mbox
-(or the specified file)
-for processing; when you
-.Ic quit ,
-.Nm
-writes undeleted messages back to this file.
-.It Fl F
-Record the message in a file named after the first
-recipient.
-The name is the login-name portion of the
-address found first on the
-.Dq Li To:
-line in the mail header.
-Overrides the
-.Va record
-variable, if set.
-.It Fl u
-Is equivalent to:
-.Pp
-.Dl "mail -f /var/mail/user"
-.El
-.Ss "Startup Actions"
-At startup time
-.Nm
-will execute commands in the system command files
-.Pa /usr/share/misc/mail.rc ,
-.Pa /usr/local/etc/mail.rc
-and
-.Pa /etc/mail.rc
-in order, unless explicitly told not to by the use of the
-.Fl n
-option.
-Next, the commands in the user's personal command file
-.Pa ~/.mailrc
-are executed.
-The
-.Nm
-utility then examines its command line options to determine whether a
-new message is to be sent, or whether an existing mailbox is to
-be read.
-.Ss "Sending Mail"
-To send a message to one or more people,
-.Nm
-can be invoked with arguments which are the names of people to
-whom the mail will be sent.
-You are then expected to type in
-your message, followed
-by a
-.Aq Li control-D
-at the beginning of a line.
-The section below
-.Sx "Replying To or Originating Mail" ,
-describes some features of
-.Nm
-available to help you compose your letter.
-.Ss "Reading Mail"
-In normal usage
-.Nm
-is given no arguments and checks your mail out of the
-post office, then
-prints out a one line header of each message found.
-The current message is initially the first message (numbered 1)
-and can be printed using the
-.Ic print
-command (which can be abbreviated
-.Ic p ) .
-You can move among the messages much as you move between lines in
-.Xr ed 1 ,
-with the commands
-.Ic +
-and
-.Ic \-
-moving backwards and forwards, and
-simple numbers.
-.Ss "Disposing of Mail"
-After examining a message you can
-.Ic delete
-.Pq Ic d
-the message or
-.Ic reply
-.Pq Ic r
-to it.
-Deletion causes the
-.Nm
-program to forget about the message.
-This is not irreversible; the message can be
-.Ic undeleted
-.Pq Ic u
-by giving its number, or the
-.Nm
-session can be aborted by giving the
-.Ic exit
-.Pq Ic x
-command.
-Deleted messages will, however, usually disappear never to be seen again.
-.Ss "Specifying Messages"
-Commands such as
-.Ic print
-and
-.Ic delete
-can be given a list of message numbers as arguments to apply
-to a number of messages at once.
-Thus
-.Dq Li "delete 1 2"
-deletes messages 1 and 2, while
-.Dq Li "delete 1\-5"
-deletes messages 1 through 5.
-The special name
-.Ql *
-addresses all messages, and
-.Ql $
-addresses
-the last message; thus the command
-.Ic top
-which prints the first few lines of a message could be used in
-.Dq Li "top *"
-to print the first few lines of all messages.
-.Ss "Replying To or Originating Mail"
-You can use the
-.Ic reply
-command to
-set up a response to a message, sending it back to the
-person who it was from.
-Text you then type in, up to an end-of-file,
-defines the contents of the message.
-While you are composing a message,
-.Nm
-treats lines beginning with the character
-.Ql ~
-specially.
-For instance, typing
-.Ic ~m
-(alone on a line) will place a copy
-of the current message into the response right shifting it by a tabstop
-(see
-.Va indentprefix
-variable, below).
-Other escapes will set up subject fields, add and delete recipients
-to the message and allow you to escape to an editor to revise the
-message or to a shell to run some commands.
-(These options
-are given in the summary below.)
-.Ss "Ending a Mail Processing Session"
-You can end a
-.Nm
-session with the
-.Ic quit
-.Pq Ic q
-command.
-Messages which have been examined go to your
-.Pa mbox
-file unless they have been deleted in which case they are discarded.
-Unexamined messages go back to the post office.
-(See the
-.Fl f
-option above).
-.Ss "Personal and System Wide Distribution Lists"
-It is also possible to create a personal distribution lists so that,
-for instance, you can send mail to
-.Dq Li cohorts
-and have it go
-to a group of people.
-Such lists can be defined by placing a line like
-.Pp
-.Dl "alias cohorts bill ozalp jkf mark kridle@ucbcory"
-.Pp
-in the file
-.Pa .mailrc
-in your home directory.
-The current list of such aliases can be displayed with the
-.Ic alias
-command in
-.Nm .
-System wide distribution lists can be created by editing
-.Pa /etc/mail/aliases ,
-see
-.Xr aliases 5
-and
-.Xr sendmail 8 ;
-these are kept in a different syntax.
-In mail you send, personal aliases will be expanded in mail sent
-to others so that they will be able to
-.Ic reply
-to the recipients.
-System wide
-aliases
-are not expanded when the mail is sent,
-but any reply returned to the machine will have the system wide
-alias expanded as all mail goes through
-.Xr sendmail 8 .
-.Ss "Network Mail (ARPA, UUCP, Berknet)"
-See
-.Xr mailaddr 7
-for a description of network addresses.
-.Pp
-The
-.Nm
-utility has a number of options which can be set in the
-.Pa .mailrc
-file to alter its behavior; thus
-.Dq Li "set askcc"
-enables the
-.Va askcc
-feature.
-(These options are summarized below.)
-.Sh SUMMARY
-(Adapted from the
-.%T "Mail Reference Manual" . )
-.Pp
-Each command is typed on a line by itself, and may take arguments
-following the command word.
-The command need not be typed in its
-entirety \(em the first command which matches the typed prefix is used.
-For commands which take message lists as arguments, if no message
-list is given, then the next message forward which satisfies the
-command's requirements is used.
-If there are no messages forward of
-the current message, the search proceeds backwards, and if there are no
-good messages at all,
-.Nm
-types
-.Dq Li "No applicable messages"
-and
-aborts the command.
-.Bl -tag -width indent
-.It Ic \-
-Print out the preceding message.
-If given a numeric
-argument
-.Ar n ,
-goes to the
-.Ar n Ns 'th
-previous message and prints it.
-.It Ic #
-ignore the remainder of the line as a comment.
-.It Ic \&?
-Prints a brief summary of commands.
-.It Ic \&!
-Executes the shell
-(see
-.Xr sh 1
-and
-.Xr csh 1 )
-command which follows.
-.It Ic Print
-.Pq Ic P
-Like
-.Ic print
-but also prints out ignored header fields.
-See also
-.Ic print , ignore
-and
-.Ic retain .
-.It Ic Reply
-.Pq Ic R
-Reply to originator.
-Does not reply to other
-recipients of the original message.
-.It Ic Type
-.Pq Ic T
-Identical to the
-.Ic Print
-command.
-.It Ic alias
-.Pq Ic a
-With no arguments, prints out all currently-defined aliases.
-With one
-argument, prints out that alias.
-With more than one argument, creates
-a new alias or changes an old one.
-.It Ic alternates
-.Pq Ic alt
-The
-.Ic alternates
-command is useful if you have accounts on several machines.
-It can be used to inform
-.Nm
-that the listed addresses are really you.
-When you
-.Ic reply
-to messages,
-.Nm
-will not send a copy of the message to any of the addresses
-listed on the
-.Ic alternates
-list.
-If the
-.Ic alternates
-command is given with no argument, the current set of alternative
-names is displayed.
-.It Ic chdir
-.Pq Ic c
-Changes the user's working directory to that specified, if given.
-If
-no directory is given, then changes to the user's login directory.
-.It Ic copy
-.Pq Ic co
-The
-.Ic copy
-command does the same thing that
-.Ic save
-does, except that it does not mark the messages it
-is used on for deletion when you
-.Ic quit .
-.It Ic delete
-.Pq Ic d
-Takes a list of messages as argument and marks them all as deleted.
-Deleted messages will not be saved in
-.Pa mbox ,
-nor will they be available for most other commands.
-.It Ic dp
-(also
-.Ic dt )
-Deletes the current message and prints the next message.
-If there is no next message,
-.Nm
-says
-.Dq Li "at EOF" .
-.It Ic edit
-.Pq Ic e
-Takes a list of messages and points the text editor at each one in
-turn.
-On return from the editor, the message is read back in.
-.It Ic exit
-.Ic ( ex
-or
-.Ic x )
-Effects an immediate return to the shell without
-modifying the user's system mailbox, his
-.Pa mbox
-file, or his edit file in
-.Fl f .
-.It Ic file
-.Pq Ic fi
-The same as
-.Ic folder .
-.It Ic folders
-List the names of the folders in your folder directory.
-.It Ic folder
-.Pq Ic fo
-The
-.Ic folder
-command switches to a new mail file or folder.
-With no
-arguments, it tells you which file you are currently reading.
-If you give it an argument, it will write out changes (such
-as deletions) you have made in the current file and read in
-the new file.
-Some special conventions are recognized for
-the name.
-.Ql #
-means the previous file,
-.Ql %
-means your system mailbox,
-.Dq Li % Ns Ar user
-means user's system mailbox,
-.Ql &
-means your
-.Pa mbox
-file, and
-.Dq Li + Ns Ar folder
-means a file in your folder
-directory.
-.It Ic from
-.Pq Ic f
-Takes a list of messages and prints their message headers.
-.It Ic headers
-.Pq Ic h
-Lists the current range of headers, which is an 18-message group.
-If
-a
-.Ql +
-argument is given, then the next 18-message group is printed, and if
-a
-.Ql \-
-argument is given, the previous 18-message group is printed.
-.It Ic help
-A synonym for
-.Ic \&? .
-.It Ic hold
-.Ic ( ho ,
-also
-.Ic preserve )
-Takes a message list and marks each
-message therein to be saved in the
-user's system mailbox instead of in
-.Pa mbox .
-Does not override the
-.Ic delete
-command.
-.It Ic ignore
-Add the list of header fields named to the
-.Ar ignored list .
-Header fields in the ignore list are not printed
-on your terminal when you print a message.
-This
-command is very handy for suppression of certain machine-generated
-header fields.
-The
-.Ic Type
-and
-.Ic Print
-commands can be used to print a message in its entirety, including
-ignored fields.
-If
-.Ic ignore
-is executed with no arguments, it lists the current set of
-ignored fields.
-.It Ic inc
-Incorporate any new messages that have arrived while mail
-is being read.
-The new messages are added to the end of the message list,
-and the current message is reset to be the first new mail message.
-This does not renumber the existing message list, nor
-does it cause any changes made so far to be saved.
-.It Ic mail
-.Pq Ic m
-Takes as argument login names and distribution group names and sends
-mail to those people.
-.It Ic mbox
-Indicate that a list of messages be sent to
-.Pa mbox
-in your home directory when you quit.
-This is the default
-action for messages if you do
-.Em not
-have the
-.Ic hold
-option set.
-.It Ic more
-.Pq Ic mo
-Takes a list of messages and invokes the pager on that list.
-.It Ic next
-.Ic ( n ,
-like
-.Ic +
-or
-.Tn CR )
-Goes to the next message in sequence and types it.
-With an argument list, types the next matching message.
-.It Ic preserve
-.Pq Ic pre
-A synonym for
-.Ic hold .
-.It Ic print
-.Pq Ic p
-Takes a message list and types out each message on the user's terminal.
-.It Ic quit
-.Pq Ic q
-Terminates the session, saving all undeleted, unsaved messages in
-the user's
-.Pa mbox
-file in his login directory, preserving all messages marked with
-.Ic hold
-or
-.Ic preserve
-or never referenced
-in his system mailbox, and removing all other messages from his system
-mailbox.
-If new mail has arrived during the session, the message
-.Dq Li "You have new mail"
-is given.
-If given while editing a
-mailbox file with the
-.Fl f
-flag, then the edit file is rewritten.
-A return to the shell is
-effected, unless the rewrite of edit file fails, in which case the user
-can escape with the
-.Ic exit
-command.
-.It Ic reply
-.Pq Ic r
-Takes a message list and sends mail to the sender and all
-recipients of the specified message.
-The default message must not be deleted.
-.It Ic respond
-A synonym for
-.Ic reply .
-.It Ic retain
-Add the list of header fields named to the
-.Em "retained list" .
-Only the header fields in the retained list
-are shown on your terminal when you print a message.
-All other header fields are suppressed.
-The
-.Ic type
-and
-.Ic print
-commands can be used to print a message in its entirety.
-If
-.Ic retain
-is executed with no arguments, it lists the current set of
-retained fields.
-.It Ic save
-.Pq Ic s
-Takes a message list and a filename and appends each message in
-turn to the end of the file.
-The filename in quotes, followed by the line
-count and character count is echoed on the user's terminal.
-.It Ic set
-.Pq Ic se
-With no arguments, prints all variable values.
-Otherwise, sets
-option.
-Arguments are of the form
-.Ar option Ns Li = Ns Ar value
-(no space before or after
-.Ql = )
-or
-.Ar option .
-Quotation marks may be placed around any part of the assignment statement to
-quote blanks or tabs, i.e.\&
-.Dq Li "set indentprefix=\*q->\*q"
-.It Ic saveignore
-.Ic Saveignore
-is to
-.Ic save
-what
-.Ic ignore
-is to
-.Ic print
-and
-.Ic type .
-Header fields thus marked are filtered out when
-saving a message by
-.Ic save
-or when automatically saving to
-.Pa mbox .
-.It Ic saveretain
-.Ic Saveretain
-is to
-.Ic save
-what
-.Ic retain
-is to
-.Ic print
-and
-.Ic type .
-Header fields thus marked are the only ones saved
-with a message when saving by
-.Ic save
-or when automatically saving to
-.Pa mbox .
-.Ic Saveretain
-overrides
-.Ic saveignore .
-.It Ic shell
-.Pq Ic sh
-Invokes an interactive version of the shell.
-.It Ic size
-Takes a message list and prints out the size in characters of each
-message.
-.It Ic source
-The
-.Ic source
-command reads
-commands from a file.
-.It Ic top
-Takes a message list and prints the top few lines of each.
-The number of
-lines printed is controlled by the variable
-.Va toplines
-and defaults to 5.
-.It Ic type
-.Pq Ic t
-A synonym for
-.Ic print .
-.It Ic unalias
-Takes a list of names defined by
-.Ic alias
-commands and discards the remembered groups of users.
-The group names
-no longer have any significance.
-.It Ic undelete
-.Pq Ic u
-Takes a message list and marks each message as
-.Em not
-being deleted.
-.It Ic unread
-.Pq Ic U
-Takes a message list and marks each message as
-.Em not
-having been read.
-.It Ic unset
-Takes a list of option names and discards their remembered values;
-the inverse of
-.Ic set .
-.It Ic visual
-.Pq Ic v
-Takes a message list and invokes the display editor on each message.
-.It Ic write
-.Pq Ic w
-Similar to
-.Ic save ,
-except that
-.Em only
-the message body
-.Em ( without
-the header) is saved.
-Extremely useful for such tasks as sending and receiving source
-program text over the message system.
-.It Ic xit
-.Pq Ic x
-A synonym for
-.Ic exit .
-.It Ic z
-The
-.Nm
-utility presents message headers in windowfuls as described under the
-.Ic headers
-command.
-You can move
-.Nm Ns 's
-attention forward to the next window with the
-.Ic z
-command.
-Also, you can move to the previous window by using
-.Ic z\- .
-.El
-.Ss Tilde/Escapes
-Here is a summary of the tilde escapes,
-which are used when composing messages to perform
-special functions.
-Tilde escapes are only recognized at the beginning
-of lines.
-The name
-.Dq "tilde escape"
-is somewhat of a misnomer since the actual escape character can be set
-by the option
-.Va escape .
-.Bl -tag -width indent
-.It Ic ~a
-Inserts the autograph string from the sign= option into the message.
-.It Ic ~A
-Inserts the autograph string from the Sign= option into the message.
-.It Ic ~b Ar name ...
-Add the given names to the list of carbon copy recipients but do not make
-the names visible in the Cc: line
-.Dq ( blind
-carbon copy).
-.It Ic ~c Ar name ...
-Add the given names to the list of carbon copy recipients.
-.It Ic ~d
-Read the file
-.Pa dead.letter
-from your home directory into the message.
-.It Ic ~e
-Invoke the text editor on the message collected so far.
-After the
-editing session is finished, you may continue appending text to the
-message.
-.It Ic ~f Ar messages
-Read the named messages into the message being sent.
-If no messages are specified, read in the current message.
-Message headers currently being ignored (by the
-.Ic ignore
-or
-.Ic retain
-command) are not included.
-.It Ic ~F Ar messages
-Identical to
-.Ic ~f ,
-except all message headers are included.
-.It Ic ~h
-Edit the message header fields by typing each one in turn and allowing
-the user to append text to the end or modify the field by using the
-current terminal erase and kill characters.
-.It Ic ~i Ar string
-Inserts the value of the named option into the text of the message.
-.It Ic ~m Ar messages
-Read the named messages into the message being sent, indented by a
-tab or by the value of
-.Va indentprefix .
-If no messages are specified,
-read the current message.
-Message headers currently being ignored (by the
-.Ic ignore
-or
-.Ic retain
-command) are not included.
-.It Ic ~M Ar messages
-Identical to
-.Ic ~m ,
-except all message headers are included.
-.It Ic ~p
-Print out the message collected so far, prefaced by the message header
-fields.
-.It Ic ~q
-Abort the message being sent, copying the message to
-.Pa dead.letter
-in your home directory if
-.Va save
-is set.
-.It Ic ~r Ar filename , Ic ~r Li \&! Ns Ar command
-.It Ic ~< Ar filename , Ic ~< Li \&! Ns Ar command
-Read the named file into the message.
-If the argument begins with a
-.Ql \&! ,
-the rest of the string is taken as an arbitrary system command and is
-executed, with the standard output inserted into the message.
-.It Ic ~R Ar string
-Use
-.Ar string
-as the Reply-To field.
-.It Ic ~s Ar string
-Cause the named string to become the current subject field.
-.It Ic ~t Ar name ...
-Add the given names to the direct recipient list.
-.It Ic ~v
-Invoke an alternative editor (defined by the
-.Ev VISUAL
-environment variable) on the
-message collected so far.
-Usually, the alternative editor will be a
-screen editor.
-After you quit the editor, you may resume appending
-text to the end of your message.
-.It Ic ~w Ar filename
-Write the message onto the named file.
-.It Ic ~x
-Exits as with
-.Ic ~q ,
-except the message is not saved in
-.Pa dead.letter .
-.It Ic ~! Ar command
-Execute the indicated shell command, then return to the message.
-.It Ic ~| Ar command , Ic ~^ Ar command
-Pipe the message through the command as a filter.
-If the command gives
-no output or terminates abnormally, retain the original text of the
-message.
-The command
-.Xr fmt 1
-is often used as
-.Ar command
-to rejustify the message.
-.It Ic ~: Ar mail-command , Ic ~_ Ar mail-command
-Execute the given
-.Nm
-command.
-Not all commands, however, are allowed.
-.It Ic ~.
-Simulate end-of-file on input.
-.It Ic ~?
-Print a summary of the available command escapes.
-.It Ic ~~ Ar string
-Insert the string of text in the message prefaced by a single
-.Ql ~ .
-If
-you have changed the escape character, then you should double
-that character in order to send it.
-.El
-.Ss "Mail Options"
-Options can be set with the
-.Ic set
-command
-and can be disabled with the
-.Ic unset
-or
-.Ic set Cm no Ns Ar name
-commands.
-Options may be either binary, in which case it is only
-significant to see whether they are set or not; or string, in which
-case the actual value is of interest.
-If an option is not set,
-.Nm
-will look for an environment variable of the same name.
-The available options include the following:
-.Bl -tag -width indent
-.It Va append
-Causes messages saved in
-.Pa mbox
-to be appended to the end rather than prepended.
-This should always be set (preferably in one of the system-wide
-.Pa mail.rc
-files).
-Default is
-.Va noappend .
-.It Va ask , asksub
-Causes
-.Nm
-to prompt you for the subject of each message you send.
-If
-you respond with simply a newline, no subject field will be sent.
-Default is
-.Va asksub .
-.It Va askbcc
-Causes you to be prompted for additional blind carbon copy recipients at the
-end of each message.
-Responding with a newline indicates your
-satisfaction with the current list.
-Default is
-.Va noaskbcc .
-.It Va askcc
-Causes you to be prompted for additional carbon copy recipients at the
-end of each message.
-Responding with a newline indicates your
-satisfaction with the current list.
-Default is
-.Va noaskcc .
-.It Va autoinc
-Causes new mail to be automatically incorporated when it arrives.
-Setting this is similar to issuing the
-.Ic inc
-command at each prompt, except that the current message is not
-reset when new mail arrives.
-Default is
-.Va noautoinc .
-.It Va autoprint
-Causes the
-.Ic delete
-command to behave like
-.Ic dp ;
-thus, after deleting a message, the next one will be typed
-automatically.
-Default is
-.Va noautoprint .
-.It Va crt
-The valued option
-.Va crt
-is used as a threshold to determine how long a message must
-be before
-.Ev PAGER
-is used to read it.
-If
-.Va crt
-is set without a value,
-then the height of the terminal screen stored in the system
-is used to compute the threshold (see
-.Xr stty 1 ) .
-Default is
-.Va nocrt .
-.It Va debug
-Setting the binary option
-.Va debug
-is the same as specifying
-.Fl d
-on the command line and causes
-.Nm
-to output all sorts of information useful for debugging
-.Nm .
-In case
-.Nm
-is invoked in this mode to send mail, all preparations
-will be performed and reported about, but the mail will
-not be actually sent.
-Default is
-.Va nodebug .
-.It Va dot
-The binary option
-.Va dot
-causes
-.Nm
-to interpret a period alone on a line as the terminator
-of a message you are sending.
-Default is
-.Va nodot .
-.It Va escape
-If defined, the first character of this option gives the character to
-use in place of
-.Ql ~
-to denote escapes.
-.It Va flipr
-Reverses the sense of
-.Ic reply
-and
-.Ic Reply
-commands.
-Default is
-.Va noflipr .
-.It Va folder
-The name of the directory to use for storing folders of
-messages.
-If this name begins with a
-.Ql / ,
-.Nm
-considers it to be an absolute pathname; otherwise, the
-folder directory is found relative to your home directory.
-.It Va header
-If defined, initially display message headers when reading mail or
-editing a mail folder.
-Default is
-.Va header .
-This option can be disabled by giving the
-.Fl N
-flag on the command line.
-.It Va hold
-This option is used to hold messages in the system mailbox
-by default.
-Default is
-.Va nohold .
-.It Va ignore
-Causes interrupt signals from your terminal to be ignored and echoed as
-.Li @ Ns 's.
-Default is
-.Va noignore .
-.It Va ignoreeof
-An option related to
-.Va dot
-is
-.Va ignoreeof
-which makes
-.Nm
-refuse to accept a
-.Aq Li control-D
-as the end of a message.
-.Ar Ignoreeof
-also applies to
-.Nm
-command mode.
-Default is
-.Va noignoreeof .
-.It Va indentprefix
-String used by the
-.Ic ~m
-tilde escape for indenting messages, in place of
-the normal tab character
-.Pq Li ^I .
-Be sure to quote the value if it contains
-spaces or tabs.
-.It Va metoo
-Usually, when a group is expanded that contains the sender, the sender
-is removed from the expansion.
-Setting this option causes the sender
-to be included in the group.
-Default is
-.Va nometoo .
-.It Va quiet
-Suppresses the printing of the version when first invoked.
-Default is
-.Va noquiet .
-.It Va record
-If defined, gives the pathname of the file used to record all outgoing
-mail.
-If not defined, outgoing mail is not saved.
-Default is
-.Va norecord .
-.It Va Replyall
-Reverses the sense of
-.Ic reply
-and
-.Ic Reply
-commands.
-Default is
-.Va noReplyall .
-.It Va save
-If this option is set, and you abort a message with two
-.Tn RUBOUT
-(erase or delete),
-.Nm
-will copy the partial letter to the file
-.Pa dead.letter
-in your home directory.
-Default is
-.Va save .
-.It Va searchheaders
-If this option is set, then a message-list specifier in the form
-.Dq Li / Ns Ar x Ns Li : Ns Ar y
-will expand to all messages containing the substring
-.Ar y
-in the header field
-.Ar x .
-The string search is case insensitive.
-If
-.Ar x
-is omitted, it will default to the
-.Dq Li Subject
-header field.
-The form
-.Dq Li /to: Ns Ar y
-is a special case, and will expand
-to all messages containing the substring
-.Ar y
-in the
-.Dq Li To ,
-.Dq Li Cc
-or
-.Dq Li Bcc
-header fields.
-The check for
-.Qq Li "to"
-is case sensitive, so that
-.Dq Li /To: Ns Ar y
-can be used to limit the search for
-.Ar y
-to just the
-.Dq Li To:
-field.
-Default is
-.Va nosearchheaders .
-.It Va toplines
-If defined, gives the number of lines of a message to be printed out
-with the
-.Ic top
-command; normally, the first five lines are printed.
-.It Va verbose
-Setting the option
-.Va verbose
-is the same as using the
-.Fl v
-flag on the command line.
-When
-.Nm
-runs in verbose mode,
-the actual delivery of messages is displayed on the user's
-terminal.
-Default is
-.Va noverbose .
-.El
-.Sh ENVIRONMENT
-.Bl -tag -width ".Ev REPLYTO"
-.It Ev DEAD
-Pathname of the file to save partial messages to in case of interrupts
-or delivery errors.
-Default is
-.Pa ~/dead.letter .
-.It Ev EDITOR
-Pathname of the text editor to use in the
-.Ic edit
-command and
-.Ic ~e
-escape.
-If not defined, then a default editor is used.
-.It Ev HOME
-Pathname of the user's home directory.
-.It Ev LISTER
-Pathname of the directory lister to use in the
-.Ic folders
-command.
-Default is
-.Pa /bin/ls .
-.It Ev MAIL
-Location of the user's mailbox.
-Default is
-.Pa /var/mail .
-.It Ev MAILRC
-Pathname of file containing initial
-.Nm
-commands.
-Default is
-.Pa ~/.mailrc .
-.It Ev MBOX
-The name of the mailbox file.
-It can be the name of a folder.
-The default is
-.Pa mbox
-in the user's home directory.
-.It Ev PAGER
-Pathname of the program to use in the
-.Ic more
-command or when
-.Va crt
-variable is set.
-The default paginator
-.Xr more 1
-is used if this option is not defined.
-.It Ev REPLYTO
-If set, will be used to initialize the Reply-To field for outgoing
-messages.
-.It Ev SHELL
-Pathname of the shell to use in the
-.Ic \&!
-command and the
-.Ic ~!
-escape.
-A default shell is used if this option is
-not defined.
-.It Ev TMPDIR
-Pathname of the directory used for creating temporary files.
-.It Ev VISUAL
-Pathname of the text editor to use in the
-.Ic visual
-command and
-.Ic ~v
-escape.
-.It Ev USER
-Login name of the user executing mail.
-.El
-.Sh FILES
-.Bl -tag -width ".Pa /usr/share/misc/mail.*help" -compact
-.It Pa /var/mail/*
-Post office.
-.It Pa ~/mbox
-User's old mail.
-.It Pa ~/.mailrc
-File giving initial
-.Nm
-commands.
-This can be overridden by setting the
-.Ev MAILRC
-environment variable.
-.It Pa /tmp/R*
-Temporary files.
-.It Pa /usr/share/misc/mail.*help
-Help files.
-.Pp
-.It Pa /usr/share/misc/mail.rc
-.It Pa /usr/local/etc/mail.rc
-.It Pa /etc/mail.rc
-System-wide initialization files.
-Each file will be sourced, in order,
-if it exists.
-.El
-.Sh SEE ALSO
-.Xr fmt 1 ,
-.Xr newaliases 1 ,
-.Xr vacation 1 ,
-.Xr aliases 5 ,
-.Xr mailaddr 7 ,
-.Xr sendmail 8
-.Rs
-.%T "The Mail Reference Manual"
-.Re
-.Sh HISTORY
-A
-.Nm
-command
-appeared in
-.At v1 .
-This man page is derived from
-.%T "The Mail Reference Manual"
-originally written by
-.An Kurt Shoens .
-.Sh BUGS
-There are some flags that are not documented here.
-Most are
-not useful to the general user.
-.Pp
-Usually,
-.Nm
-is just a link to
-.Nm Mail
-and
-.Nm mailx ,
-which can be confusing.
-.Pp
-The name of the
-.Ic alternates
-list is incorrect English (it should be
-.Dq alternatives ) ,
-but is retained for compatibility.
diff --git a/usr.bin/mail/main.c b/usr.bin/mail/main.c
deleted file mode 100644
index 3dc5938..0000000
--- a/usr.bin/mail/main.c
+++ /dev/null
@@ -1,354 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)main.c 8.2 (Berkeley) 4/20/95";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "rcv.h"
-#include <fcntl.h>
-#include "extern.h"
-
-/*
- * Mail -- a mail program
- *
- * Startup -- interface with user.
- */
-
-static jmp_buf hdrjmp;
-
-extern const char *version;
-
-int
-main(argc, argv)
- int argc;
- char *argv[];
-{
- int i;
- struct name *to, *cc, *bcc, *smopts;
- char *subject, *replyto;
- char *ef, *rc;
- char nosrc = 0;
- sig_t prevint;
-
- /*
- * Set up a reasonable environment.
- * Figure out whether we are being run interactively,
- * start the SIGCHLD catcher, and so forth.
- */
- (void)signal(SIGCHLD, sigchild);
- if (isatty(0))
- assign("interactive", "");
- image = -1;
- /*
- * Now, determine how we are being used.
- * We successively pick off - flags.
- * If there is anything left, it is the base of the list
- * of users to mail to. Argp will be set to point to the
- * first of these users.
- */
- ef = NULL;
- to = NULL;
- cc = NULL;
- bcc = NULL;
- smopts = NULL;
- subject = NULL;
- while ((i = getopt(argc, argv, "FEHINT:b:c:edfins:u:v")) != -1) {
- switch (i) {
- case 'T':
- /*
- * Next argument is temp file to write which
- * articles have been read/deleted for netnews.
- */
- Tflag = optarg;
- if ((i = open(Tflag, O_CREAT | O_TRUNC | O_WRONLY,
- 0600)) < 0)
- err(1, "%s", Tflag);
- (void)close(i);
- break;
- case 'u':
- /*
- * Next argument is person to pretend to be.
- */
- myname = optarg;
- unsetenv("MAIL");
- break;
- case 'i':
- /*
- * User wants to ignore interrupts.
- * Set the variable "ignore"
- */
- assign("ignore", "");
- break;
- case 'd':
- debug++;
- break;
- case 'e':
- /*
- * User wants to check mail and exit.
- */
- assign("checkmode", "");
- break;
- case 'H':
- /*
- * User wants a header summary only.
- */
- assign("headersummary", "");
- break;
- case 'F':
- /*
- * User wants to record messages to files
- * named after first recipient username.
- */
- assign("recordrecip", "");
- break;
- case 's':
- /*
- * Give a subject field for sending from
- * non terminal
- */
- subject = optarg;
- break;
- case 'f':
- /*
- * User is specifying file to "edit" with Mail,
- * as opposed to reading system mailbox.
- * If no argument is given after -f, we read his
- * mbox file.
- *
- * getopt() can't handle optional arguments, so here
- * is an ugly hack to get around it.
- */
- if ((argv[optind] != NULL) && (argv[optind][0] != '-'))
- ef = argv[optind++];
- else
- ef = "&";
- break;
- case 'n':
- /*
- * User doesn't want to source /usr/lib/Mail.rc
- */
- nosrc++;
- break;
- case 'N':
- /*
- * Avoid initial header printing.
- */
- assign("noheader", "");
- break;
- case 'v':
- /*
- * Send mailer verbose flag
- */
- assign("verbose", "");
- break;
- case 'I':
- /*
- * We're interactive
- */
- assign("interactive", "");
- break;
- case 'c':
- /*
- * Get Carbon Copy Recipient list
- */
- cc = cat(cc, nalloc(optarg, GCC));
- break;
- case 'b':
- /*
- * Get Blind Carbon Copy Recipient list
- */
- bcc = cat(bcc, nalloc(optarg, GBCC));
- break;
- case 'E':
- /*
- * Don't send empty files.
- */
- assign("dontsendempty", "");
- break;
- case '?':
- fprintf(stderr, "\
-Usage: %s [-dEiInv] [-s subject] [-c cc-addr] [-b bcc-addr] [-F] to-addr ...\n\
- %*s [-sendmail-option ...]\n\
- %s [-dEHiInNv] [-F] -f [name]\n\
- %s [-dEHiInNv] [-F] [-u user]\n\
- %s [-d] -e [-f name]\n", __progname, strlen(__progname), "",
- __progname, __progname, __progname);
- exit(1);
- }
- }
- for (i = optind; (argv[i] != NULL) && (*argv[i] != '-'); i++)
- to = cat(to, nalloc(argv[i], GTO));
- for (; argv[i] != NULL; i++)
- smopts = cat(smopts, nalloc(argv[i], 0));
- /*
- * Check for inconsistent arguments.
- */
- if (to == NULL && (subject != NULL || cc != NULL || bcc != NULL))
- errx(1, "You must specify direct recipients with -s, -c, or -b.");
- if (ef != NULL && to != NULL)
- errx(1, "Cannot give -f and people to send to.");
- tinit();
- setscreensize();
- input = stdin;
- rcvmode = !to;
- spreserve();
- if (!nosrc) {
- char *s, *path_rc;
-
- if ((path_rc = malloc(sizeof(_PATH_MASTER_RC))) == NULL)
- err(1, "malloc(path_rc) failed");
-
- strcpy(path_rc, _PATH_MASTER_RC);
- while ((s = strsep(&path_rc, ":")) != NULL)
- if (*s != '\0')
- load(s);
- }
- /*
- * Expand returns a savestr, but load only uses the file name
- * for fopen, so it's safe to do this.
- */
- if ((rc = getenv("MAILRC")) == NULL)
- rc = "~/.mailrc";
- load(expand(rc));
-
- replyto = value("REPLYTO");
- if (!rcvmode) {
- mail(to, cc, bcc, smopts, subject, replyto);
- /*
- * why wait?
- */
- exit(senderr);
- }
-
- if(value("checkmode") != NULL) {
- if (ef == NULL)
- ef = "%";
- if (setfile(ef) <= 0)
- /* Either an error has occured, or no mail */
- exit(1);
- else
- exit(0);
- /* NOTREACHED */
- }
-
- /*
- * Ok, we are reading mail.
- * Decide whether we are editing a mailbox or reading
- * the system mailbox, and open up the right stuff.
- */
- if (ef == NULL)
- ef = "%";
- if (setfile(ef) < 0)
- exit(1); /* error already reported */
- if (setjmp(hdrjmp) == 0) {
- if ((prevint = signal(SIGINT, SIG_IGN)) != SIG_IGN)
- (void)signal(SIGINT, hdrstop);
- if (value("quiet") == NULL)
- printf("Mail version %s. Type ? for help.\n",
- version);
- announce();
- (void)fflush(stdout);
- (void)signal(SIGINT, prevint);
- }
-
- /* If we were in header summary mode, it's time to exit. */
- if (value("headersummary") != NULL)
- exit(0);
-
- commands();
- (void)signal(SIGHUP, SIG_IGN);
- (void)signal(SIGINT, SIG_IGN);
- (void)signal(SIGQUIT, SIG_IGN);
- quit();
- exit(0);
-}
-
-/*
- * Interrupt printing of the headers.
- */
-/*ARGSUSED*/
-void
-hdrstop(signo)
- int signo;
-{
-
- (void)fflush(stdout);
- fprintf(stderr, "\nInterrupt\n");
- longjmp(hdrjmp, 1);
-}
-
-/*
- * Compute what the screen size for printing headers should be.
- * We use the following algorithm for the height:
- * If baud rate < 1200, use 9
- * If baud rate = 1200, use 14
- * If baud rate > 1200, use 24 or ws_row
- * Width is either 80 or ws_col;
- */
-void
-setscreensize()
-{
- struct termios tbuf;
- struct winsize ws;
- speed_t speed;
-
- if (ioctl(1, TIOCGWINSZ, (char *)&ws) < 0)
- ws.ws_col = ws.ws_row = 0;
- if (tcgetattr(1, &tbuf) < 0)
- speed = B9600;
- else
- speed = cfgetospeed(&tbuf);
- if (speed < B1200)
- screenheight = 9;
- else if (speed == B1200)
- screenheight = 14;
- else if (ws.ws_row != 0)
- screenheight = ws.ws_row;
- else
- screenheight = 24;
- if ((realscreenheight = ws.ws_row) == 0)
- realscreenheight = 24;
- if ((screenwidth = ws.ws_col) == 0)
- screenwidth = 80;
-}
diff --git a/usr.bin/mail/misc/mail.help b/usr.bin/mail/misc/mail.help
deleted file mode 100644
index f5c5dd2..0000000
--- a/usr.bin/mail/misc/mail.help
+++ /dev/null
@@ -1,23 +0,0 @@
- Mail Commands
-t <message list> type messages
-n goto and type next message
-e <message list> edit messages
-f <message list> give head lines of messages
-d <message list> delete messages
-s <message list> file append messages to file
-u <message list> undelete messages
-R <message list> reply to message senders
-r <message list> reply to message senders and all recipients
-pre <message list> make messages go back to /var/mail
-m <user list> mail to specific users
-q quit, saving unresolved messages in mbox
-x quit, do not remove system mailbox
-h print out active message headers
-! shell escape
-cd [directory] chdir to directory or home if none given
-
-A <message list> consists of integers, ranges of same, or user names separated
-by spaces. If omitted, Mail uses the last message typed.
-
-A <user list> consists of user names or aliases separated by spaces.
-Aliases are defined in .mailrc in your home directory.
diff --git a/usr.bin/mail/misc/mail.rc b/usr.bin/mail/misc/mail.rc
deleted file mode 100644
index 2293b3c..0000000
--- a/usr.bin/mail/misc/mail.rc
+++ /dev/null
@@ -1,2 +0,0 @@
-set append dot save ask crt
-ignore Received Message-Id Resent-Message-Id Status Mail-From Return-Path Via
diff --git a/usr.bin/mail/misc/mail.tildehelp b/usr.bin/mail/misc/mail.tildehelp
deleted file mode 100644
index 47201d3..0000000
--- a/usr.bin/mail/misc/mail.tildehelp
+++ /dev/null
@@ -1,36 +0,0 @@
------------------------------------------------------------
-The following ~ escapes are defined:
-~? Print this message
-~~ Quote a single tilde
-~. Simulate end-of-file on input
-~A Equivalent to: ~i Sign
-~a Equivalent to: ~i sign
-~b users Add users to Bcc list
-~c users Add users to Cc list
-~C Dump core
-~d Read in dead.letter
-~e Edit the message buffer
-~f messages Read in messages
-~F messages Same as ~f, but keep all header lines
-~h Prompt for Subject and To, Cc, and Bcc lists
-~i name Insert the value of the named variable
-~m messages Read in messages, right shifted by a tab
-~M messages Same as ~m, but keep all header lines
-~p Print the message buffer
-~q Quit, save partial message in dead.letter
-~r file Read a file into the message buffer
-~r !command Insert the output of the command
-~< file Same as ~r
-~< !command Same as ~r
-~R address Set Reply-to to address
-~s subject Set Subject to subject
-~t users Add users to the To list
-~v Invoke display editor on message
-~w file Write message onto file
-~x Quit, do not save to dead.letter
-~! command Invoke the shell
-~| command Pipe the message through the command
-~^ command Same as ~|
-~_ mail-cmd Perform the command-level request
-~: mail-cmd Same as ~_
------------------------------------------------------------
diff --git a/usr.bin/mail/names.c b/usr.bin/mail/names.c
deleted file mode 100644
index fc0acdc..0000000
--- a/usr.bin/mail/names.c
+++ /dev/null
@@ -1,791 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)names.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Mail -- a mail program
- *
- * Handle name lists.
- */
-
-#include "rcv.h"
-#include <fcntl.h>
-#include "extern.h"
-
-/*
- * Allocate a single element of a name list,
- * initialize its name field to the passed
- * name and return it.
- */
-struct name *
-nalloc(str, ntype)
- char str[];
- int ntype;
-{
- struct name *np;
-
- np = (struct name *)salloc(sizeof(*np));
- np->n_flink = NULL;
- np->n_blink = NULL;
- np->n_type = ntype;
- np->n_name = savestr(str);
- return (np);
-}
-
-/*
- * Find the tail of a list and return it.
- */
-struct name *
-tailof(name)
- struct name *name;
-{
- struct name *np;
-
- np = name;
- if (np == NULL)
- return (NULL);
- while (np->n_flink != NULL)
- np = np->n_flink;
- return (np);
-}
-
-/*
- * Extract a list of names from a line,
- * and make a list of names from it.
- * Return the list or NULL if none found.
- */
-struct name *
-extract(line, ntype)
- char line[];
- int ntype;
-{
- char *cp, *nbuf;
- struct name *top, *np, *t;
-
- if (line == NULL || *line == '\0')
- return (NULL);
- if ((nbuf = malloc(strlen(line) + 1)) == NULL)
- err(1, "Out of memory");
- top = NULL;
- np = NULL;
- cp = line;
- while ((cp = yankword(cp, nbuf)) != NULL) {
- t = nalloc(nbuf, ntype);
- if (top == NULL)
- top = t;
- else
- np->n_flink = t;
- t->n_blink = np;
- np = t;
- }
- (void)free(nbuf);
- return (top);
-}
-
-/*
- * Turn a list of names into a string of the same names.
- */
-char *
-detract(np, ntype)
- struct name *np;
- int ntype;
-{
- int s, comma;
- char *cp, *top;
- struct name *p;
-
- comma = ntype & GCOMMA;
- if (np == NULL)
- return (NULL);
- ntype &= ~GCOMMA;
- s = 0;
- if (debug && comma)
- fprintf(stderr, "detract asked to insert commas\n");
- for (p = np; p != NULL; p = p->n_flink) {
- if (ntype && (p->n_type & GMASK) != ntype)
- continue;
- s += strlen(p->n_name) + 1;
- if (comma)
- s++;
- }
- if (s == 0)
- return (NULL);
- s += 2;
- top = salloc(s);
- cp = top;
- for (p = np; p != NULL; p = p->n_flink) {
- if (ntype && (p->n_type & GMASK) != ntype)
- continue;
- cp += strlcpy(cp, p->n_name, strlen(p->n_name) + 1);
- if (comma && p->n_flink != NULL)
- *cp++ = ',';
- *cp++ = ' ';
- }
- *--cp = '\0';
- if (comma && *--cp == ',')
- *cp = '\0';
- return (top);
-}
-
-/*
- * Grab a single word (liberal word)
- * Throw away things between ()'s, and take anything between <>.
- */
-char *
-yankword(ap, wbuf)
- char *ap, wbuf[];
-{
- char *cp, *cp2;
-
- cp = ap;
- for (;;) {
- if (*cp == '\0')
- return (NULL);
- if (*cp == '(') {
- int nesting = 0;
-
- while (*cp != '\0') {
- switch (*cp++) {
- case '(':
- nesting++;
- break;
- case ')':
- --nesting;
- break;
- }
- if (nesting <= 0)
- break;
- }
- } else if (*cp == ' ' || *cp == '\t' || *cp == ',')
- cp++;
- else
- break;
- }
- if (*cp == '<')
- for (cp2 = wbuf; *cp && (*cp2++ = *cp++) != '>';)
- ;
- else
- for (cp2 = wbuf; *cp != '\0' && strchr(" \t,(", *cp) == NULL;
- *cp2++ = *cp++)
- ;
- *cp2 = '\0';
- return (cp);
-}
-
-/*
- * Grab a single login name (liberal word)
- * Throw away things between ()'s, take anything between <>,
- * and look for words before metacharacters %, @, !.
- */
-char *
-yanklogin(ap, wbuf)
- char *ap, wbuf[];
-{
- char *cp, *cp2, *cp_temp;
- int n;
-
- cp = ap;
- for (;;) {
- if (*cp == '\0')
- return (NULL);
- if (*cp == '(') {
- int nesting = 0;
-
- while (*cp != '\0') {
- switch (*cp++) {
- case '(':
- nesting++;
- break;
- case ')':
- --nesting;
- break;
- }
- if (nesting <= 0)
- break;
- }
- } else if (*cp == ' ' || *cp == '\t' || *cp == ',')
- cp++;
- else
- break;
- }
-
- /*
- * Now, let's go forward till we meet the needed character,
- * and step one word back.
- */
-
- /* First, remember current point. */
- cp_temp = cp;
- n = 0;
-
- /*
- * Note that we look ahead in a cycle. This is safe, since
- * non-end of string is checked first.
- */
- while(*cp != '\0' && strchr("@%!", *(cp + 1)) == NULL)
- cp++;
-
- /*
- * Now, start stepping back to the first non-word character,
- * while counting the number of symbols in a word.
- */
- while(cp != cp_temp && strchr(" \t,<>", *(cp - 1)) == NULL) {
- n++;
- cp--;
- }
-
- /* Finally, grab the word forward. */
- cp2 = wbuf;
- while(n >= 0) {
- *cp2++=*cp++;
- n--;
- }
-
- *cp2 = '\0';
- return (cp);
-}
-
-/*
- * For each recipient in the passed name list with a /
- * in the name, append the message to the end of the named file
- * and remove him from the recipient list.
- *
- * Recipients whose name begins with | are piped through the given
- * program and removed.
- */
-struct name *
-outof(names, fo, hp)
- struct name *names;
- FILE *fo;
- struct header *hp;
-{
- int c, ispipe;
- struct name *np, *top;
- time_t now;
- char *date, *fname;
- FILE *fout, *fin;
-
- top = names;
- np = names;
- (void)time(&now);
- date = ctime(&now);
- while (np != NULL) {
- if (!isfileaddr(np->n_name) && np->n_name[0] != '|') {
- np = np->n_flink;
- continue;
- }
- ispipe = np->n_name[0] == '|';
- if (ispipe)
- fname = np->n_name+1;
- else
- fname = expand(np->n_name);
-
- /*
- * See if we have copied the complete message out yet.
- * If not, do so.
- */
-
- if (image < 0) {
- int fd;
- char tempname[PATHSIZE];
-
- (void)snprintf(tempname, sizeof(tempname),
- "%s/mail.ReXXXXXXXXXX", tmpdir);
- if ((fd = mkstemp(tempname)) == -1 ||
- (fout = Fdopen(fd, "a")) == NULL) {
- warn("%s", tempname);
- senderr++;
- goto cant;
- }
- image = open(tempname, O_RDWR);
- (void)rm(tempname);
- if (image < 0) {
- warn("%s", tempname);
- senderr++;
- (void)Fclose(fout);
- goto cant;
- }
- (void)fcntl(image, F_SETFD, 1);
- fprintf(fout, "From %s %s", myname, date);
- puthead(hp, fout,
- GTO|GSUBJECT|GCC|GREPLYTO|GINREPLYTO|GNL);
- while ((c = getc(fo)) != EOF)
- (void)putc(c, fout);
- rewind(fo);
- fprintf(fout, "\n");
- (void)fflush(fout);
- if (ferror(fout)) {
- warn("%s", tempname);
- senderr++;
- (void)Fclose(fout);
- goto cant;
- }
- (void)Fclose(fout);
- }
-
- /*
- * Now either copy "image" to the desired file
- * or give it as the standard input to the desired
- * program as appropriate.
- */
-
- if (ispipe) {
- int pid;
- char *sh;
- sigset_t nset;
-
- /*
- * XXX
- * We can't really reuse the same image file,
- * because multiple piped recipients will
- * share the same lseek location and trample
- * on one another.
- */
- if ((sh = value("SHELL")) == NULL)
- sh = _PATH_CSHELL;
- (void)sigemptyset(&nset);
- (void)sigaddset(&nset, SIGHUP);
- (void)sigaddset(&nset, SIGINT);
- (void)sigaddset(&nset, SIGQUIT);
- pid = start_command(sh, &nset, image, -1, "-c", fname,
- NULL);
- if (pid < 0) {
- senderr++;
- goto cant;
- }
- free_child(pid);
- } else {
- int f;
- if ((fout = Fopen(fname, "a")) == NULL) {
- warn("%s", fname);
- senderr++;
- goto cant;
- }
- if ((f = dup(image)) < 0) {
- warn("dup");
- fin = NULL;
- } else
- fin = Fdopen(f, "r");
- if (fin == NULL) {
- fprintf(stderr, "Can't reopen image\n");
- (void)Fclose(fout);
- senderr++;
- goto cant;
- }
- rewind(fin);
- while ((c = getc(fin)) != EOF)
- (void)putc(c, fout);
- if (ferror(fout)) {
- warnx("%s", fname);
- senderr++;
- (void)Fclose(fout);
- (void)Fclose(fin);
- goto cant;
- }
- (void)Fclose(fout);
- (void)Fclose(fin);
- }
-cant:
- /*
- * In days of old we removed the entry from the
- * the list; now for sake of header expansion
- * we leave it in and mark it as deleted.
- */
- np->n_type |= GDEL;
- np = np->n_flink;
- }
- if (image >= 0) {
- (void)close(image);
- image = -1;
- }
- return (top);
-}
-
-/*
- * Determine if the passed address is a local "send to file" address.
- * If any of the network metacharacters precedes any slashes, it can't
- * be a filename. We cheat with .'s to allow path names like ./...
- */
-int
-isfileaddr(name)
- char *name;
-{
- char *cp;
-
- if (*name == '+')
- return (1);
- for (cp = name; *cp != '\0'; cp++) {
- if (*cp == '!' || *cp == '%' || *cp == '@')
- return (0);
- if (*cp == '/')
- return (1);
- }
- return (0);
-}
-
-/*
- * Map all of the aliased users in the invoker's mailrc
- * file and insert them into the list.
- * Changed after all these months of service to recursively
- * expand names (2/14/80).
- */
-
-struct name *
-usermap(names)
- struct name *names;
-{
- struct name *new, *np, *cp;
- struct grouphead *gh;
- int metoo;
-
- new = NULL;
- np = names;
- metoo = (value("metoo") != NULL);
- while (np != NULL) {
- if (np->n_name[0] == '\\') {
- cp = np->n_flink;
- new = put(new, np);
- np = cp;
- continue;
- }
- gh = findgroup(np->n_name);
- cp = np->n_flink;
- if (gh != NULL)
- new = gexpand(new, gh, metoo, np->n_type);
- else
- new = put(new, np);
- np = cp;
- }
- return (new);
-}
-
-/*
- * Recursively expand a group name. We limit the expansion to some
- * fixed level to keep things from going haywire.
- * Direct recursion is not expanded for convenience.
- */
-
-struct name *
-gexpand(nlist, gh, metoo, ntype)
- struct name *nlist;
- struct grouphead *gh;
- int metoo, ntype;
-{
- struct group *gp;
- struct grouphead *ngh;
- struct name *np;
- static int depth;
- char *cp;
-
- if (depth > MAXEXP) {
- printf("Expanding alias to depth larger than %d\n", MAXEXP);
- return (nlist);
- }
- depth++;
- for (gp = gh->g_list; gp != NULL; gp = gp->ge_link) {
- cp = gp->ge_name;
- if (*cp == '\\')
- goto quote;
- if (strcmp(cp, gh->g_name) == 0)
- goto quote;
- if ((ngh = findgroup(cp)) != NULL) {
- nlist = gexpand(nlist, ngh, metoo, ntype);
- continue;
- }
-quote:
- np = nalloc(cp, ntype);
- /*
- * At this point should allow to expand
- * to self if only person in group
- */
- if (gp == gh->g_list && gp->ge_link == NULL)
- goto skip;
- if (!metoo && strcmp(cp, myname) == 0)
- np->n_type |= GDEL;
-skip:
- nlist = put(nlist, np);
- }
- depth--;
- return (nlist);
-}
-
-/*
- * Concatenate the two passed name lists, return the result.
- */
-struct name *
-cat(n1, n2)
- struct name *n1, *n2;
-{
- struct name *tail;
-
- if (n1 == NULL)
- return (n2);
- if (n2 == NULL)
- return (n1);
- tail = tailof(n1);
- tail->n_flink = n2;
- n2->n_blink = tail;
- return (n1);
-}
-
-/*
- * Unpack the name list onto a vector of strings.
- * Return an error if the name list won't fit.
- */
-char **
-unpack(np)
- struct name *np;
-{
- char **ap, **top;
- struct name *n;
- int t, extra, metoo, verbose;
-
- n = np;
- if ((t = count(n)) == 0)
- errx(1, "No names to unpack");
- /*
- * Compute the number of extra arguments we will need.
- * We need at least two extra -- one for "mail" and one for
- * the terminating 0 pointer. Additional spots may be needed
- * to pass along -f to the host mailer.
- */
- extra = 2;
- extra++;
- metoo = value("metoo") != NULL;
- if (metoo)
- extra++;
- verbose = value("verbose") != NULL;
- if (verbose)
- extra++;
- top = (char **)salloc((t + extra) * sizeof(*top));
- ap = top;
- *ap++ = "send-mail";
- *ap++ = "-i";
- if (metoo)
- *ap++ = "-m";
- if (verbose)
- *ap++ = "-v";
- for (; n != NULL; n = n->n_flink)
- if ((n->n_type & GDEL) == 0)
- *ap++ = n->n_name;
- *ap = NULL;
- return (top);
-}
-
-/*
- * Remove all of the duplicates from the passed name list by
- * insertion sorting them, then checking for dups.
- * Return the head of the new list.
- */
-struct name *
-elide(names)
- struct name *names;
-{
- struct name *np, *t, *new;
- struct name *x;
-
- if (names == NULL)
- return (NULL);
- new = names;
- np = names;
- np = np->n_flink;
- if (np != NULL)
- np->n_blink = NULL;
- new->n_flink = NULL;
- while (np != NULL) {
- t = new;
- while (strcasecmp(t->n_name, np->n_name) < 0) {
- if (t->n_flink == NULL)
- break;
- t = t->n_flink;
- }
-
- /*
- * If we ran out of t's, put the new entry after
- * the current value of t.
- */
-
- if (strcasecmp(t->n_name, np->n_name) < 0) {
- t->n_flink = np;
- np->n_blink = t;
- t = np;
- np = np->n_flink;
- t->n_flink = NULL;
- continue;
- }
-
- /*
- * Otherwise, put the new entry in front of the
- * current t. If at the front of the list,
- * the new guy becomes the new head of the list.
- */
-
- if (t == new) {
- t = np;
- np = np->n_flink;
- t->n_flink = new;
- new->n_blink = t;
- t->n_blink = NULL;
- new = t;
- continue;
- }
-
- /*
- * The normal case -- we are inserting into the
- * middle of the list.
- */
-
- x = np;
- np = np->n_flink;
- x->n_flink = t;
- x->n_blink = t->n_blink;
- t->n_blink->n_flink = x;
- t->n_blink = x;
- }
-
- /*
- * Now the list headed up by new is sorted.
- * Go through it and remove duplicates.
- */
-
- np = new;
- while (np != NULL) {
- t = np;
- while (t->n_flink != NULL &&
- strcasecmp(np->n_name, t->n_flink->n_name) == 0)
- t = t->n_flink;
- if (t == np || t == NULL) {
- np = np->n_flink;
- continue;
- }
-
- /*
- * Now t points to the last entry with the same name
- * as np. Make np point beyond t.
- */
-
- np->n_flink = t->n_flink;
- if (t->n_flink != NULL)
- t->n_flink->n_blink = np;
- np = np->n_flink;
- }
- return (new);
-}
-
-/*
- * Put another node onto a list of names and return
- * the list.
- */
-struct name *
-put(list, node)
- struct name *list, *node;
-{
- node->n_flink = list;
- node->n_blink = NULL;
- if (list != NULL)
- list->n_blink = node;
- return (node);
-}
-
-/*
- * Determine the number of undeleted elements in
- * a name list and return it.
- */
-int
-count(np)
- struct name *np;
-{
- int c;
-
- for (c = 0; np != NULL; np = np->n_flink)
- if ((np->n_type & GDEL) == 0)
- c++;
- return (c);
-}
-
-/*
- * Delete the given name from a namelist.
- */
-struct name *
-delname(np, name)
- struct name *np;
- char name[];
-{
- struct name *p;
-
- for (p = np; p != NULL; p = p->n_flink)
- if (strcasecmp(p->n_name, name) == 0) {
- if (p->n_blink == NULL) {
- if (p->n_flink != NULL)
- p->n_flink->n_blink = NULL;
- np = p->n_flink;
- continue;
- }
- if (p->n_flink == NULL) {
- if (p->n_blink != NULL)
- p->n_blink->n_flink = NULL;
- continue;
- }
- p->n_blink->n_flink = p->n_flink;
- p->n_flink->n_blink = p->n_blink;
- }
- return (np);
-}
-
-/*
- * Pretty print a name list
- * Uncomment it if you need it.
- */
-
-/*
-void
-prettyprint(name)
- struct name *name;
-{
- struct name *np;
-
- np = name;
- while (np != NULL) {
- fprintf(stderr, "%s(%d) ", np->n_name, np->n_type);
- np = np->n_flink;
- }
- fprintf(stderr, "\n");
-}
-*/
diff --git a/usr.bin/mail/pathnames.h b/usr.bin/mail/pathnames.h
deleted file mode 100644
index 57a2a0c..0000000
--- a/usr.bin/mail/pathnames.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)pathnames.h 8.1 (Berkeley) 6/6/93
- *
- * $FreeBSD$
- */
-
-#define _PATH_EX "/usr/bin/ex"
-#define _PATH_HELP "/usr/share/misc/mail.help"
-#define _PATH_TILDE "/usr/share/misc/mail.tildehelp"
-#define _PATH_MASTER_RC "/usr/share/misc/mail.rc:/usr/local/etc/mail.rc:/etc/mail.rc"
-#define _PATH_MORE "/usr/bin/more"
diff --git a/usr.bin/mail/popen.c b/usr.bin/mail/popen.c
deleted file mode 100644
index b6dc30a..0000000
--- a/usr.bin/mail/popen.c
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)popen.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "rcv.h"
-#include <sys/wait.h>
-#include <fcntl.h>
-#include "extern.h"
-
-#define READ 0
-#define WRITE 1
-
-struct fp {
- FILE *fp;
- int pipe;
- int pid;
- struct fp *link;
-};
-static struct fp *fp_head;
-
-struct child {
- int pid;
- char done;
- char free;
- int status;
- struct child *link;
-};
-static struct child *child;
-static struct child *findchild(int);
-static void delchild(struct child *);
-static int file_pid(FILE *);
-
-FILE *
-Fopen(path, mode)
- const char *path, *mode;
-{
- FILE *fp;
-
- if ((fp = fopen(path, mode)) != NULL) {
- register_file(fp, 0, 0);
- (void)fcntl(fileno(fp), F_SETFD, 1);
- }
- return (fp);
-}
-
-FILE *
-Fdopen(fd, mode)
- int fd;
- const char *mode;
-{
- FILE *fp;
-
- if ((fp = fdopen(fd, mode)) != NULL) {
- register_file(fp, 0, 0);
- (void)fcntl(fileno(fp), F_SETFD, 1);
- }
- return (fp);
-}
-
-int
-Fclose(fp)
- FILE *fp;
-{
- unregister_file(fp);
- return (fclose(fp));
-}
-
-FILE *
-Popen(cmd, mode)
- char *cmd;
- const char *mode;
-{
- int p[2];
- int myside, hisside, fd0, fd1;
- int pid;
- sigset_t nset;
- FILE *fp;
-
- if (pipe(p) < 0)
- return (NULL);
- (void)fcntl(p[READ], F_SETFD, 1);
- (void)fcntl(p[WRITE], F_SETFD, 1);
- if (*mode == 'r') {
- myside = p[READ];
- fd0 = -1;
- hisside = fd1 = p[WRITE];
- } else {
- myside = p[WRITE];
- hisside = fd0 = p[READ];
- fd1 = -1;
- }
- (void)sigemptyset(&nset);
- if ((pid = start_command(cmd, &nset, fd0, fd1, NULL, NULL, NULL)) < 0) {
- (void)close(p[READ]);
- (void)close(p[WRITE]);
- return (NULL);
- }
- (void)close(hisside);
- if ((fp = fdopen(myside, mode)) != NULL)
- register_file(fp, 1, pid);
- return (fp);
-}
-
-int
-Pclose(ptr)
- FILE *ptr;
-{
- int i;
- sigset_t nset, oset;
-
- i = file_pid(ptr);
- unregister_file(ptr);
- (void)fclose(ptr);
- (void)sigemptyset(&nset);
- (void)sigaddset(&nset, SIGINT);
- (void)sigaddset(&nset, SIGHUP);
- (void)sigprocmask(SIG_BLOCK, &nset, &oset);
- i = wait_child(i);
- (void)sigprocmask(SIG_SETMASK, &oset, NULL);
- return (i);
-}
-
-void
-close_all_files()
-{
-
- while (fp_head != NULL)
- if (fp_head->pipe)
- (void)Pclose(fp_head->fp);
- else
- (void)Fclose(fp_head->fp);
-}
-
-void
-register_file(fp, pipe, pid)
- FILE *fp;
- int pipe, pid;
-{
- struct fp *fpp;
-
- if ((fpp = malloc(sizeof(*fpp))) == NULL)
- err(1, "Out of memory");
- fpp->fp = fp;
- fpp->pipe = pipe;
- fpp->pid = pid;
- fpp->link = fp_head;
- fp_head = fpp;
-}
-
-void
-unregister_file(fp)
- FILE *fp;
-{
- struct fp **pp, *p;
-
- for (pp = &fp_head; (p = *pp) != NULL; pp = &p->link)
- if (p->fp == fp) {
- *pp = p->link;
- (void)free(p);
- return;
- }
- errx(1, "Invalid file pointer");
- /*NOTREACHED*/
-}
-
-int
-file_pid(fp)
- FILE *fp;
-{
- struct fp *p;
-
- for (p = fp_head; p != NULL; p = p->link)
- if (p->fp == fp)
- return (p->pid);
- errx(1, "Invalid file pointer");
- /*NOTREACHED*/
-}
-
-/*
- * Run a command without a shell, with optional arguments and splicing
- * of stdin and stdout. The command name can be a sequence of words.
- * Signals must be handled by the caller.
- * "Mask" contains the signals to ignore in the new process.
- * SIGINT is enabled unless it's in the mask.
- */
-/*VARARGS4*/
-int
-run_command(cmd, mask, infd, outfd, a0, a1, a2)
- char *cmd;
- sigset_t *mask;
- int infd, outfd;
- char *a0, *a1, *a2;
-{
- int pid;
-
- if ((pid = start_command(cmd, mask, infd, outfd, a0, a1, a2)) < 0)
- return (-1);
- return (wait_command(pid));
-}
-
-/*VARARGS4*/
-int
-start_command(cmd, mask, infd, outfd, a0, a1, a2)
- char *cmd;
- sigset_t *mask;
- int infd, outfd;
- char *a0, *a1, *a2;
-{
- int pid;
-
- if ((pid = fork()) < 0) {
- warn("fork");
- return (-1);
- }
- if (pid == 0) {
- char *argv[100];
- int i = getrawlist(cmd, argv, sizeof(argv) / sizeof(*argv));
-
- if ((argv[i++] = a0) != NULL &&
- (argv[i++] = a1) != NULL &&
- (argv[i++] = a2) != NULL)
- argv[i] = NULL;
- prepare_child(mask, infd, outfd);
- execvp(argv[0], argv);
- warn("%s", argv[0]);
- _exit(1);
- }
- return (pid);
-}
-
-void
-prepare_child(nset, infd, outfd)
- sigset_t *nset;
- int infd, outfd;
-{
- int i;
- sigset_t eset;
-
- /*
- * All file descriptors other than 0, 1, and 2 are supposed to be
- * close-on-exec.
- */
- if (infd >= 0)
- dup2(infd, 0);
- if (outfd >= 0)
- dup2(outfd, 1);
- for (i = 1; i < NSIG; i++)
- if (nset != NULL && sigismember(nset, i))
- (void)signal(i, SIG_IGN);
- if (nset == NULL || !sigismember(nset, SIGINT))
- (void)signal(SIGINT, SIG_DFL);
- (void)sigemptyset(&eset);
- (void)sigprocmask(SIG_SETMASK, &eset, NULL);
-}
-
-int
-wait_command(pid)
- int pid;
-{
-
- if (wait_child(pid) < 0) {
- printf("Fatal error in process.\n");
- return (-1);
- }
- return (0);
-}
-
-static struct child *
-findchild(pid)
- int pid;
-{
- struct child **cpp;
-
- for (cpp = &child; *cpp != NULL && (*cpp)->pid != pid;
- cpp = &(*cpp)->link)
- ;
- if (*cpp == NULL) {
- *cpp = malloc(sizeof(struct child));
- if (*cpp == NULL)
- err(1, "Out of memory");
- (*cpp)->pid = pid;
- (*cpp)->done = (*cpp)->free = 0;
- (*cpp)->link = NULL;
- }
- return (*cpp);
-}
-
-static void
-delchild(cp)
- struct child *cp;
-{
- struct child **cpp;
-
- for (cpp = &child; *cpp != cp; cpp = &(*cpp)->link)
- ;
- *cpp = cp->link;
- (void)free(cp);
-}
-
-/*ARGSUSED*/
-void
-sigchild(signo)
- int signo;
-{
- int pid;
- int status;
- struct child *cp;
-
- while ((pid = waitpid((pid_t)-1, &status, WNOHANG)) > 0) {
- cp = findchild(pid);
- if (cp->free)
- delchild(cp);
- else {
- cp->done = 1;
- cp->status = status;
- }
- }
-}
-
-int wait_status;
-
-/*
- * Wait for a specific child to die.
- */
-int
-wait_child(pid)
- int pid;
-{
- sigset_t nset, oset;
- struct child *cp = findchild(pid);
-
- (void)sigemptyset(&nset);
- (void)sigaddset(&nset, SIGCHLD);
- (void)sigprocmask(SIG_BLOCK, &nset, &oset);
-
- while (!cp->done)
- (void)sigsuspend(&oset);
- wait_status = cp->status;
- delchild(cp);
- (void)sigprocmask(SIG_SETMASK, &oset, NULL);
- return ((WIFEXITED(wait_status) && WEXITSTATUS(wait_status)) ? -1 : 0);
-}
-
-/*
- * Mark a child as don't care.
- */
-void
-free_child(pid)
- int pid;
-{
- sigset_t nset, oset;
- struct child *cp = findchild(pid);
-
- (void)sigemptyset(&nset);
- (void)sigaddset(&nset, SIGCHLD);
- (void)sigprocmask(SIG_BLOCK, &nset, &oset);
-
- if (cp->done)
- delchild(cp);
- else
- cp->free = 1;
- (void)sigprocmask(SIG_SETMASK, &oset, NULL);
-}
diff --git a/usr.bin/mail/quit.c b/usr.bin/mail/quit.c
deleted file mode 100644
index 4507c59..0000000
--- a/usr.bin/mail/quit.c
+++ /dev/null
@@ -1,499 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)quit.c 8.2 (Berkeley) 4/28/95";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "rcv.h"
-#include <fcntl.h>
-#include "extern.h"
-
-/*
- * Rcv -- receive mail rationally.
- *
- * Termination processing.
- */
-
-/*
- * The "quit" command.
- */
-int
-quitcmd()
-{
- /*
- * If we are sourcing, then return 1 so execute() can handle it.
- * Otherwise, return -1 to abort command loop.
- */
- if (sourcing)
- return (1);
- return (-1);
-}
-
-/*
- * Save all of the undetermined messages at the top of "mbox"
- * Save all untouched messages back in the system mailbox.
- * Remove the system mailbox, if none saved there.
- */
-void
-quit()
-{
- int mcount, p, modify, autohold, anystat, holdbit, nohold;
- FILE *ibuf, *obuf, *fbuf, *rbuf, *readstat, *abuf;
- struct message *mp;
- int c, fd;
- struct stat minfo;
- char *mbox, tempname[PATHSIZE];
-
- /*
- * If we are read only, we can't do anything,
- * so just return quickly.
- */
- if (readonly)
- return;
- /*
- * If editing (not reading system mail box), then do the work
- * in edstop()
- */
- if (edit) {
- edstop();
- return;
- }
-
- /*
- * See if there any messages to save in mbox. If no, we
- * can save copying mbox to /tmp and back.
- *
- * Check also to see if any files need to be preserved.
- * Delete all untouched messages to keep them out of mbox.
- * If all the messages are to be preserved, just exit with
- * a message.
- */
-
- fbuf = Fopen(mailname, "r");
- if (fbuf == NULL)
- goto newmail;
- (void)flock(fileno(fbuf), LOCK_EX);
- rbuf = NULL;
- if (fstat(fileno(fbuf), &minfo) >= 0 && minfo.st_size > mailsize) {
- printf("New mail has arrived.\n");
- (void)snprintf(tempname, sizeof(tempname),
- "%s/mail.RqXXXXXXXXXX", tmpdir);
- if ((fd = mkstemp(tempname)) == -1 ||
- (rbuf = Fdopen(fd, "w")) == NULL)
- goto newmail;
-#ifdef APPEND
- (void)fseeko(fbuf, mailsize, SEEK_SET);
- while ((c = getc(fbuf)) != EOF)
- (void)putc(c, rbuf);
-#else
- p = minfo.st_size - mailsize;
- while (p-- > 0) {
- c = getc(fbuf);
- if (c == EOF)
- goto newmail;
- (void)putc(c, rbuf);
- }
-#endif
- (void)Fclose(rbuf);
- if ((rbuf = Fopen(tempname, "r")) == NULL)
- goto newmail;
- (void)rm(tempname);
- }
-
- /*
- * Adjust the message flags in each message.
- */
-
- anystat = 0;
- autohold = value("hold") != NULL;
- holdbit = autohold ? MPRESERVE : MBOX;
- nohold = MBOX|MSAVED|MDELETED|MPRESERVE;
- if (value("keepsave") != NULL)
- nohold &= ~MSAVED;
- for (mp = &message[0]; mp < &message[msgCount]; mp++) {
- if (mp->m_flag & MNEW) {
- mp->m_flag &= ~MNEW;
- mp->m_flag |= MSTATUS;
- }
- if (mp->m_flag & MSTATUS)
- anystat++;
- if ((mp->m_flag & MTOUCH) == 0)
- mp->m_flag |= MPRESERVE;
- if ((mp->m_flag & nohold) == 0)
- mp->m_flag |= holdbit;
- }
- modify = 0;
- if (Tflag != NULL) {
- if ((readstat = Fopen(Tflag, "w")) == NULL)
- Tflag = NULL;
- }
- for (c = 0, p = 0, mp = &message[0]; mp < &message[msgCount]; mp++) {
- if (mp->m_flag & MBOX)
- c++;
- if (mp->m_flag & MPRESERVE)
- p++;
- if (mp->m_flag & MODIFY)
- modify++;
- if (Tflag != NULL && (mp->m_flag & (MREAD|MDELETED)) != 0) {
- char *id;
-
- if ((id = hfield("article-id", mp)) != NULL)
- fprintf(readstat, "%s\n", id);
- }
- }
- if (Tflag != NULL)
- (void)Fclose(readstat);
- if (p == msgCount && !modify && !anystat) {
- printf("Held %d message%s in %s\n",
- p, p == 1 ? "" : "s", mailname);
- (void)Fclose(fbuf);
- return;
- }
- if (c == 0) {
- if (p != 0) {
- writeback(rbuf);
- (void)Fclose(fbuf);
- return;
- }
- goto cream;
- }
-
- /*
- * Create another temporary file and copy user's mbox file
- * darin. If there is no mbox, copy nothing.
- * If he has specified "append" don't copy his mailbox,
- * just copy saveable entries at the end.
- */
-
- mbox = expand("&");
- mcount = c;
- if (value("append") == NULL) {
- (void)snprintf(tempname, sizeof(tempname),
- "%s/mail.RmXXXXXXXXXX", tmpdir);
- if ((fd = mkstemp(tempname)) == -1 ||
- (obuf = Fdopen(fd, "w")) == NULL) {
- warn("%s", tempname);
- (void)Fclose(fbuf);
- return;
- }
- if ((ibuf = Fopen(tempname, "r")) == NULL) {
- warn("%s", tempname);
- (void)rm(tempname);
- (void)Fclose(obuf);
- (void)Fclose(fbuf);
- return;
- }
- (void)rm(tempname);
- if ((abuf = Fopen(mbox, "r")) != NULL) {
- while ((c = getc(abuf)) != EOF)
- (void)putc(c, obuf);
- (void)Fclose(abuf);
- }
- if (ferror(obuf)) {
- warnx("%s", tempname);
- (void)Fclose(ibuf);
- (void)Fclose(obuf);
- (void)Fclose(fbuf);
- return;
- }
- (void)Fclose(obuf);
- (void)close(open(mbox, O_CREAT | O_TRUNC | O_WRONLY, 0600));
- if ((obuf = Fopen(mbox, "r+")) == NULL) {
- warn("%s", mbox);
- (void)Fclose(ibuf);
- (void)Fclose(fbuf);
- return;
- }
- }
- if (value("append") != NULL) {
- if ((obuf = Fopen(mbox, "a")) == NULL) {
- warn("%s", mbox);
- (void)Fclose(fbuf);
- return;
- }
- (void)fchmod(fileno(obuf), 0600);
- }
- for (mp = &message[0]; mp < &message[msgCount]; mp++)
- if (mp->m_flag & MBOX)
- if (sendmessage(mp, obuf, saveignore, NULL) < 0) {
- warnx("%s", mbox);
- (void)Fclose(ibuf);
- (void)Fclose(obuf);
- (void)Fclose(fbuf);
- return;
- }
-
- /*
- * Copy the user's old mbox contents back
- * to the end of the stuff we just saved.
- * If we are appending, this is unnecessary.
- */
-
- if (value("append") == NULL) {
- rewind(ibuf);
- c = getc(ibuf);
- while (c != EOF) {
- (void)putc(c, obuf);
- if (ferror(obuf))
- break;
- c = getc(ibuf);
- }
- (void)Fclose(ibuf);
- }
- (void)fflush(obuf);
- trunc(obuf);
- if (ferror(obuf)) {
- warn("%s", mbox);
- (void)Fclose(obuf);
- (void)Fclose(fbuf);
- return;
- }
- (void)Fclose(obuf);
- if (mcount == 1)
- printf("Saved 1 message in mbox\n");
- else
- printf("Saved %d messages in mbox\n", mcount);
-
- /*
- * Now we are ready to copy back preserved files to
- * the system mailbox, if any were requested.
- */
-
- if (p != 0) {
- writeback(rbuf);
- (void)Fclose(fbuf);
- return;
- }
-
- /*
- * Finally, remove his /var/mail file.
- * If new mail has arrived, copy it back.
- */
-
-cream:
- if (rbuf != NULL) {
- abuf = Fopen(mailname, "r+");
- if (abuf == NULL)
- goto newmail;
- while ((c = getc(rbuf)) != EOF)
- (void)putc(c, abuf);
- (void)Fclose(rbuf);
- trunc(abuf);
- (void)Fclose(abuf);
- alter(mailname);
- (void)Fclose(fbuf);
- return;
- }
- demail();
- (void)Fclose(fbuf);
- return;
-
-newmail:
- printf("Thou hast new mail.\n");
- if (fbuf != NULL)
- (void)Fclose(fbuf);
-}
-
-/*
- * Preserve all the appropriate messages back in the system
- * mailbox, and print a nice message indicated how many were
- * saved. On any error, just return -1. Else return 0.
- * Incorporate the any new mail that we found.
- */
-int
-writeback(res)
- FILE *res;
-{
- struct message *mp;
- int p, c;
- FILE *obuf;
-
- p = 0;
- if ((obuf = Fopen(mailname, "r+")) == NULL) {
- warn("%s", mailname);
- return (-1);
- }
-#ifndef APPEND
- if (res != NULL)
- while ((c = getc(res)) != EOF)
- (void)putc(c, obuf);
-#endif
- for (mp = &message[0]; mp < &message[msgCount]; mp++)
- if ((mp->m_flag&MPRESERVE)||(mp->m_flag&MTOUCH)==0) {
- p++;
- if (sendmessage(mp, obuf, NULL, NULL) < 0) {
- warnx("%s", mailname);
- (void)Fclose(obuf);
- return (-1);
- }
- }
-#ifdef APPEND
- if (res != NULL)
- while ((c = getc(res)) != EOF)
- (void)putc(c, obuf);
-#endif
- (void)fflush(obuf);
- trunc(obuf);
- if (ferror(obuf)) {
- warn("%s", mailname);
- (void)Fclose(obuf);
- return (-1);
- }
- if (res != NULL)
- (void)Fclose(res);
- (void)Fclose(obuf);
- alter(mailname);
- if (p == 1)
- printf("Held 1 message in %s\n", mailname);
- else
- printf("Held %d messages in %s\n", p, mailname);
- return (0);
-}
-
-/*
- * Terminate an editing session by attempting to write out the user's
- * file from the temporary. Save any new stuff appended to the file.
- */
-void
-edstop()
-{
- int gotcha, c;
- struct message *mp;
- FILE *obuf, *ibuf, *readstat;
- struct stat statb;
- char tempname[PATHSIZE];
-
- if (readonly)
- return;
- holdsigs();
- if (Tflag != NULL) {
- if ((readstat = Fopen(Tflag, "w")) == NULL)
- Tflag = NULL;
- }
- for (mp = &message[0], gotcha = 0; mp < &message[msgCount]; mp++) {
- if (mp->m_flag & MNEW) {
- mp->m_flag &= ~MNEW;
- mp->m_flag |= MSTATUS;
- }
- if (mp->m_flag & (MODIFY|MDELETED|MSTATUS))
- gotcha++;
- if (Tflag != NULL && (mp->m_flag & (MREAD|MDELETED)) != 0) {
- char *id;
-
- if ((id = hfield("article-id", mp)) != NULL)
- fprintf(readstat, "%s\n", id);
- }
- }
- if (Tflag != NULL)
- (void)Fclose(readstat);
- if (!gotcha || Tflag != NULL)
- goto done;
- ibuf = NULL;
- if (stat(mailname, &statb) >= 0 && statb.st_size > mailsize) {
- int fd;
-
- (void)snprintf(tempname, sizeof(tempname),
- "%s/mbox.XXXXXXXXXX", tmpdir);
- if ((fd = mkstemp(tempname)) == -1 ||
- (obuf = Fdopen(fd, "w")) == NULL) {
- warn("%s", tempname);
- relsesigs();
- reset(0);
- }
- if ((ibuf = Fopen(mailname, "r")) == NULL) {
- warn("%s", mailname);
- (void)Fclose(obuf);
- (void)rm(tempname);
- relsesigs();
- reset(0);
- }
- (void)fseeko(ibuf, mailsize, SEEK_SET);
- while ((c = getc(ibuf)) != EOF)
- (void)putc(c, obuf);
- (void)Fclose(ibuf);
- (void)Fclose(obuf);
- if ((ibuf = Fopen(tempname, "r")) == NULL) {
- warn("%s", tempname);
- (void)rm(tempname);
- relsesigs();
- reset(0);
- }
- (void)rm(tempname);
- }
- printf("\"%s\" ", mailname);
- (void)fflush(stdout);
- if ((obuf = Fopen(mailname, "r+")) == NULL) {
- warn("%s", mailname);
- relsesigs();
- reset(0);
- }
- trunc(obuf);
- c = 0;
- for (mp = &message[0]; mp < &message[msgCount]; mp++) {
- if ((mp->m_flag & MDELETED) != 0)
- continue;
- c++;
- if (sendmessage(mp, obuf, NULL, NULL) < 0) {
- warnx("%s", mailname);
- relsesigs();
- reset(0);
- }
- }
- gotcha = (c == 0 && ibuf == NULL);
- if (ibuf != NULL) {
- while ((c = getc(ibuf)) != EOF)
- (void)putc(c, obuf);
- (void)Fclose(ibuf);
- }
- (void)fflush(obuf);
- if (ferror(obuf)) {
- warn("%s", mailname);
- relsesigs();
- reset(0);
- }
- (void)Fclose(obuf);
- if (gotcha) {
- (void)rm(mailname);
- printf("removed\n");
- } else
- printf("complete\n");
- (void)fflush(stdout);
-
-done:
- relsesigs();
-}
diff --git a/usr.bin/mail/rcv.h b/usr.bin/mail/rcv.h
deleted file mode 100644
index 44bb25e..0000000
--- a/usr.bin/mail/rcv.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)rcv.h 8.1 (Berkeley) 6/6/93
- *
- * $FreeBSD$
- */
-
-/*
- * Mail -- a mail program
- *
- * This file is included by normal files which want both
- * globals and declarations.
- */
-
-#include "def.h"
-#include "glob.h"
diff --git a/usr.bin/mail/send.c b/usr.bin/mail/send.c
deleted file mode 100644
index 35b4c72..0000000
--- a/usr.bin/mail/send.c
+++ /dev/null
@@ -1,612 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)send.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "rcv.h"
-#include "extern.h"
-
-/*
- * Mail -- a mail program
- *
- * Mail to others.
- */
-
-/*
- * Send message described by the passed pointer to the
- * passed output buffer. Return -1 on error.
- * Adjust the status: field if need be.
- * If doign is given, suppress ignored header fields.
- * prefix is a string to prepend to each output line.
- */
-int
-sendmessage(mp, obuf, doign, prefix)
- struct message *mp;
- FILE *obuf;
- struct ignoretab *doign;
- char *prefix;
-{
- long count;
- FILE *ibuf;
- char *cp, *cp2, line[LINESIZE];
- int ishead, infld, ignoring, dostat, firstline;
- int c, length, prefixlen;
-
- /*
- * Compute the prefix string, without trailing whitespace
- */
- if (prefix != NULL) {
- cp2 = 0;
- for (cp = prefix; *cp != '\0'; cp++)
- if (*cp != ' ' && *cp != '\t')
- cp2 = cp;
- prefixlen = cp2 == NULL ? 0 : cp2 - prefix + 1;
- }
- ibuf = setinput(mp);
- count = mp->m_size;
- ishead = 1;
- dostat = doign == 0 || !isign("status", doign);
- infld = 0;
- firstline = 1;
- /*
- * Process headers first
- */
- while (count > 0 && ishead) {
- if (fgets(line, sizeof(line), ibuf) == NULL)
- break;
- count -= length = strlen(line);
- if (firstline) {
- /*
- * First line is the From line, so no headers
- * there to worry about
- */
- firstline = 0;
- ignoring = doign == ignoreall;
- } else if (line[0] == '\n') {
- /*
- * If line is blank, we've reached end of
- * headers, so force out status: field
- * and note that we are no longer in header
- * fields
- */
- if (dostat) {
- statusput(mp, obuf, prefix);
- dostat = 0;
- }
- ishead = 0;
- ignoring = doign == ignoreall;
- } else if (infld && (line[0] == ' ' || line[0] == '\t')) {
- /*
- * If this line is a continuation (via space or tab)
- * of a previous header field, just echo it
- * (unless the field should be ignored).
- * In other words, nothing to do.
- */
- } else {
- /*
- * Pick up the header field if we have one.
- */
- for (cp = line; (c = *cp++) != '\0' && c != ':' &&
- !isspace((unsigned char)c);)
- ;
- cp2 = --cp;
- while (isspace((unsigned char)*cp++))
- ;
- if (cp[-1] != ':') {
- /*
- * Not a header line, force out status:
- * This happens in uucp style mail where
- * there are no headers at all.
- */
- if (dostat) {
- statusput(mp, obuf, prefix);
- dostat = 0;
- }
- if (doign != ignoreall)
- /* add blank line */
- (void)putc('\n', obuf);
- ishead = 0;
- ignoring = 0;
- } else {
- /*
- * If it is an ignored field and
- * we care about such things, skip it.
- */
- *cp2 = '\0'; /* temporarily null terminate */
- if (doign && isign(line, doign))
- ignoring = 1;
- else if ((line[0] == 's' || line[0] == 'S') &&
- strcasecmp(line, "status") == 0) {
- /*
- * If the field is "status," go compute
- * and print the real Status: field
- */
- if (dostat) {
- statusput(mp, obuf, prefix);
- dostat = 0;
- }
- ignoring = 1;
- } else {
- ignoring = 0;
- *cp2 = c; /* restore */
- }
- infld = 1;
- }
- }
- if (!ignoring) {
- /*
- * Strip trailing whitespace from prefix
- * if line is blank.
- */
- if (prefix != NULL) {
- if (length > 1)
- fputs(prefix, obuf);
- else
- (void)fwrite(prefix, sizeof(*prefix),
- prefixlen, obuf);
- }
- (void)fwrite(line, sizeof(*line), length, obuf);
- if (ferror(obuf))
- return (-1);
- }
- }
- /*
- * Copy out message body
- */
- if (doign == ignoreall)
- count--; /* skip final blank line */
- if (prefix != NULL)
- while (count > 0) {
- if (fgets(line, sizeof(line), ibuf) == NULL) {
- c = 0;
- break;
- }
- count -= c = strlen(line);
- /*
- * Strip trailing whitespace from prefix
- * if line is blank.
- */
- if (c > 1)
- fputs(prefix, obuf);
- else
- (void)fwrite(prefix, sizeof(*prefix),
- prefixlen, obuf);
- (void)fwrite(line, sizeof(*line), c, obuf);
- if (ferror(obuf))
- return (-1);
- }
- else
- while (count > 0) {
- c = count < LINESIZE ? count : LINESIZE;
- if ((c = fread(line, sizeof(*line), c, ibuf)) <= 0)
- break;
- count -= c;
- if (fwrite(line, sizeof(*line), c, obuf) != c)
- return (-1);
- }
- if (doign == ignoreall && c > 0 && line[c - 1] != '\n')
- /* no final blank line */
- if ((c = getc(ibuf)) != EOF && putc(c, obuf) == EOF)
- return (-1);
- return (0);
-}
-
-/*
- * Output a reasonable looking status field.
- */
-void
-statusput(mp, obuf, prefix)
- struct message *mp;
- FILE *obuf;
- char *prefix;
-{
- char statout[3];
- char *cp = statout;
-
- if (mp->m_flag & MREAD)
- *cp++ = 'R';
- if ((mp->m_flag & MNEW) == 0)
- *cp++ = 'O';
- *cp = '\0';
- if (statout[0] != '\0')
- fprintf(obuf, "%sStatus: %s\n",
- prefix == NULL ? "" : prefix, statout);
-}
-
-/*
- * Interface between the argument list and the mail1 routine
- * which does all the dirty work.
- */
-int
-mail(to, cc, bcc, smopts, subject, replyto)
- struct name *to, *cc, *bcc, *smopts;
- char *subject, *replyto;
-{
- struct header head;
-
- head.h_to = to;
- head.h_subject = subject;
- head.h_cc = cc;
- head.h_bcc = bcc;
- head.h_smopts = smopts;
- head.h_replyto = replyto;
- head.h_inreplyto = NULL;
- mail1(&head, 0);
- return (0);
-}
-
-
-/*
- * Send mail to a bunch of user names. The interface is through
- * the mail routine below.
- */
-int
-sendmail(str)
- char *str;
-{
- struct header head;
-
- head.h_to = extract(str, GTO);
- head.h_subject = NULL;
- head.h_cc = NULL;
- head.h_bcc = NULL;
- head.h_smopts = NULL;
- head.h_replyto = value("REPLYTO");
- head.h_inreplyto = NULL;
- mail1(&head, 0);
- return (0);
-}
-
-/*
- * Mail a message on standard input to the people indicated
- * in the passed header. (Internal interface).
- */
-void
-mail1(hp, printheaders)
- struct header *hp;
- int printheaders;
-{
- char *cp;
- char *nbuf;
- int pid;
- char **namelist;
- struct name *to, *nsto;
- FILE *mtf;
-
- /*
- * Collect user's mail from standard input.
- * Get the result as mtf.
- */
- if ((mtf = collect(hp, printheaders)) == NULL)
- return;
- if (value("interactive") != NULL) {
- if (value("askcc") != NULL || value("askbcc") != NULL) {
- if (value("askcc") != NULL)
- grabh(hp, GCC);
- if (value("askbcc") != NULL)
- grabh(hp, GBCC);
- } else {
- printf("EOT\n");
- (void)fflush(stdout);
- }
- }
- if (fsize(mtf) == 0) {
- if (value("dontsendempty") != NULL)
- goto out;
- if (hp->h_subject == NULL)
- printf("No message, no subject; hope that's ok\n");
- else
- printf("Null message body; hope that's ok\n");
- }
- /*
- * Now, take the user names from the combined
- * to and cc lists and do all the alias
- * processing.
- */
- senderr = 0;
- to = usermap(cat(hp->h_bcc, cat(hp->h_to, hp->h_cc)));
- if (to == NULL) {
- printf("No recipients specified\n");
- senderr++;
- }
- /*
- * Look through the recipient list for names with /'s
- * in them which we write to as files directly.
- */
- to = outof(to, mtf, hp);
- if (senderr)
- savedeadletter(mtf);
- to = elide(to);
- if (count(to) == 0)
- goto out;
- if (value("recordrecip") != NULL) {
- /*
- * Before fixing the header, save old To:.
- * We do this because elide above has sorted To: list, and
- * we would like to save message in a file named by the first
- * recipient the user has entered, not the one being the first
- * after sorting happened.
- */
- if ((nsto = malloc(sizeof(struct name))) == NULL)
- err(1, "Out of memory");
- bcopy(hp->h_to, nsto, sizeof(struct name));
- }
- fixhead(hp, to);
- if ((mtf = infix(hp, mtf)) == NULL) {
- fprintf(stderr, ". . . message lost, sorry.\n");
- return;
- }
- namelist = unpack(cat(hp->h_smopts, to));
- if (debug) {
- char **t;
-
- printf("Sendmail arguments:");
- for (t = namelist; *t != NULL; t++)
- printf(" \"%s\"", *t);
- printf("\n");
- goto out;
- }
- if (value("recordrecip") != NULL) {
- /*
- * Extract first recipient username from saved To: and use it
- * as a filename.
- */
- if ((nbuf = malloc(strlen(detract(nsto, 0)) + 1)) == NULL)
- err(1, "Out of memory");
- if ((cp = yanklogin(detract(nsto, 0), nbuf)) != NULL)
- (void)savemail(expand(nbuf), mtf);
- free(nbuf);
- free(nsto);
- } else if ((cp = value("record")) != NULL)
- (void)savemail(expand(cp), mtf);
- /*
- * Fork, set up the temporary mail file as standard
- * input for "mail", and exec with the user list we generated
- * far above.
- */
- pid = fork();
- if (pid == -1) {
- warn("fork");
- savedeadletter(mtf);
- goto out;
- }
- if (pid == 0) {
- sigset_t nset;
- (void)sigemptyset(&nset);
- (void)sigaddset(&nset, SIGHUP);
- (void)sigaddset(&nset, SIGINT);
- (void)sigaddset(&nset, SIGQUIT);
- (void)sigaddset(&nset, SIGTSTP);
- (void)sigaddset(&nset, SIGTTIN);
- (void)sigaddset(&nset, SIGTTOU);
- prepare_child(&nset, fileno(mtf), -1);
- if ((cp = value("sendmail")) != NULL)
- cp = expand(cp);
- else
- cp = _PATH_SENDMAIL;
- execv(cp, namelist);
- warn("%s", cp);
- _exit(1);
- }
- if (value("verbose") != NULL)
- (void)wait_child(pid);
- else
- free_child(pid);
-out:
- (void)Fclose(mtf);
-}
-
-/*
- * Fix the header by glopping all of the expanded names from
- * the distribution list into the appropriate fields.
- */
-void
-fixhead(hp, tolist)
- struct header *hp;
- struct name *tolist;
-{
- struct name *np;
-
- hp->h_to = NULL;
- hp->h_cc = NULL;
- hp->h_bcc = NULL;
- for (np = tolist; np != NULL; np = np->n_flink) {
- /* Don't copy deleted addresses to the header */
- if (np->n_type & GDEL)
- continue;
- if ((np->n_type & GMASK) == GTO)
- hp->h_to =
- cat(hp->h_to, nalloc(np->n_name, np->n_type));
- else if ((np->n_type & GMASK) == GCC)
- hp->h_cc =
- cat(hp->h_cc, nalloc(np->n_name, np->n_type));
- else if ((np->n_type & GMASK) == GBCC)
- hp->h_bcc =
- cat(hp->h_bcc, nalloc(np->n_name, np->n_type));
- }
-}
-
-/*
- * Prepend a header in front of the collected stuff
- * and return the new file.
- */
-FILE *
-infix(hp, fi)
- struct header *hp;
- FILE *fi;
-{
- FILE *nfo, *nfi;
- int c, fd;
- char tempname[PATHSIZE];
-
- (void)snprintf(tempname, sizeof(tempname),
- "%s/mail.RsXXXXXXXXXX", tmpdir);
- if ((fd = mkstemp(tempname)) == -1 ||
- (nfo = Fdopen(fd, "w")) == NULL) {
- warn("%s", tempname);
- return (fi);
- }
- if ((nfi = Fopen(tempname, "r")) == NULL) {
- warn("%s", tempname);
- (void)Fclose(nfo);
- (void)rm(tempname);
- return (fi);
- }
- (void)rm(tempname);
- (void)puthead(hp, nfo,
- GTO|GSUBJECT|GCC|GBCC|GREPLYTO|GINREPLYTO|GNL|GCOMMA);
- c = getc(fi);
- while (c != EOF) {
- (void)putc(c, nfo);
- c = getc(fi);
- }
- if (ferror(fi)) {
- warnx("read");
- rewind(fi);
- return (fi);
- }
- (void)fflush(nfo);
- if (ferror(nfo)) {
- warn("%s", tempname);
- (void)Fclose(nfo);
- (void)Fclose(nfi);
- rewind(fi);
- return (fi);
- }
- (void)Fclose(nfo);
- (void)Fclose(fi);
- rewind(nfi);
- return (nfi);
-}
-
-/*
- * Dump the to, subject, cc header on the
- * passed file buffer.
- */
-int
-puthead(hp, fo, w)
- struct header *hp;
- FILE *fo;
- int w;
-{
- int gotcha;
-
- gotcha = 0;
- if (hp->h_to != NULL && w & GTO)
- fmt("To:", hp->h_to, fo, w&GCOMMA), gotcha++;
- if (hp->h_subject != NULL && w & GSUBJECT)
- fprintf(fo, "Subject: %s\n", hp->h_subject), gotcha++;
- if (hp->h_cc != NULL && w & GCC)
- fmt("Cc:", hp->h_cc, fo, w&GCOMMA), gotcha++;
- if (hp->h_bcc != NULL && w & GBCC)
- fmt("Bcc:", hp->h_bcc, fo, w&GCOMMA), gotcha++;
- if (hp->h_replyto != NULL && w & GREPLYTO)
- fprintf(fo, "Reply-To: %s\n", hp->h_replyto), gotcha++;
- if (hp->h_inreplyto != NULL && w & GINREPLYTO)
- fprintf(fo, "In-Reply-To: <%s>\n", hp->h_inreplyto), gotcha++;
- if (gotcha && w & GNL)
- (void)putc('\n', fo);
- return (0);
-}
-
-/*
- * Format the given header line to not exceed 72 characters.
- */
-void
-fmt(str, np, fo, comma)
- const char *str;
- struct name *np;
- FILE *fo;
- int comma;
-{
- int col, len;
-
- comma = comma ? 1 : 0;
- col = strlen(str);
- if (col)
- fputs(str, fo);
- for (; np != NULL; np = np->n_flink) {
- if (np->n_flink == NULL)
- comma = 0;
- len = strlen(np->n_name);
- col++; /* for the space */
- if (col + len + comma > 72 && col > 4) {
- fprintf(fo, "\n ");
- col = 4;
- } else
- fprintf(fo, " ");
- fputs(np->n_name, fo);
- if (comma)
- fprintf(fo, ",");
- col += len + comma;
- }
- fprintf(fo, "\n");
-}
-
-/*
- * Save the outgoing mail on the passed file.
- */
-
-/*ARGSUSED*/
-int
-savemail(name, fi)
- char name[];
- FILE *fi;
-{
- FILE *fo;
- char buf[BUFSIZ];
- int i;
- time_t now;
-
- if ((fo = Fopen(name, "a")) == NULL) {
- warn("%s", name);
- return (-1);
- }
- (void)time(&now);
- fprintf(fo, "From %s %s", myname, ctime(&now));
- while ((i = fread(buf, 1, sizeof(buf), fi)) > 0)
- (void)fwrite(buf, 1, i, fo);
- fprintf(fo, "\n");
- (void)fflush(fo);
- if (ferror(fo))
- warn("%s", name);
- (void)Fclose(fo);
- rewind(fi);
- return (0);
-}
diff --git a/usr.bin/mail/strings.c b/usr.bin/mail/strings.c
deleted file mode 100644
index d3a816f..0000000
--- a/usr.bin/mail/strings.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)strings.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Mail -- a mail program
- *
- * String allocation routines.
- * Strings handed out here are reclaimed at the top of the command
- * loop each time, so they need not be freed.
- */
-
-#include "rcv.h"
-#include "extern.h"
-
-/*
- * Allocate size more bytes of space and return the address of the
- * first byte to the caller. An even number of bytes are always
- * allocated so that the space will always be on a word boundary.
- * The string spaces are of exponentially increasing size, to satisfy
- * the occasional user with enormous string size requests.
- */
-
-char *
-salloc(size)
- int size;
-{
- char *t;
- int s, index;
- struct strings *sp;
-
- s = size;
- s += (sizeof(char *) - 1);
- s &= ~(sizeof(char *) - 1);
- index = 0;
- for (sp = &stringdope[0]; sp < &stringdope[NSPACE]; sp++) {
- if (sp->s_topFree == NULL && (STRINGSIZE << index) >= s)
- break;
- if (sp->s_nleft >= s)
- break;
- index++;
- }
- if (sp >= &stringdope[NSPACE])
- errx(1, "String too large");
- if (sp->s_topFree == NULL) {
- index = sp - &stringdope[0];
- if ((sp->s_topFree = malloc(STRINGSIZE << index)) == NULL)
- err(1, "No room for space %d", index);
- sp->s_nextFree = sp->s_topFree;
- sp->s_nleft = STRINGSIZE << index;
- }
- sp->s_nleft -= s;
- t = sp->s_nextFree;
- sp->s_nextFree += s;
- return (t);
-}
-
-/*
- * Reset the string area to be empty.
- * Called to free all strings allocated
- * since last reset.
- */
-void
-sreset()
-{
- struct strings *sp;
- int index;
-
- if (noreset)
- return;
- index = 0;
- for (sp = &stringdope[0]; sp < &stringdope[NSPACE]; sp++) {
- if (sp->s_topFree == NULL)
- continue;
- sp->s_nextFree = sp->s_topFree;
- sp->s_nleft = STRINGSIZE << index;
- index++;
- }
-}
-
-/*
- * Make the string area permanent.
- * Meant to be called in main, after initialization.
- */
-void
-spreserve()
-{
- struct strings *sp;
-
- for (sp = &stringdope[0]; sp < &stringdope[NSPACE]; sp++)
- sp->s_topFree = NULL;
-}
diff --git a/usr.bin/mail/temp.c b/usr.bin/mail/temp.c
deleted file mode 100644
index 0d7424e..0000000
--- a/usr.bin/mail/temp.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)temp.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "rcv.h"
-#include "extern.h"
-
-/*
- * Mail -- a mail program
- *
- * Give names to all the temporary files that we will need.
- */
-
-char *tmpdir;
-
-void
-tinit()
-{
- char *cp;
-
- if ((tmpdir = getenv("TMPDIR")) == NULL || *tmpdir == '\0')
- tmpdir = _PATH_TMP;
- if ((tmpdir = strdup(tmpdir)) == NULL)
- errx(1, "Out of memory");
- /* Strip trailing '/' if necessary */
- cp = tmpdir + strlen(tmpdir) - 1;
- while (cp > tmpdir && *cp == '/') {
- *cp = '\0';
- cp--;
- }
-
- /*
- * It's okay to call savestr in here because main will
- * do a spreserve() after us.
- */
- if (myname != NULL) {
- if (getuserid(myname) < 0)
- errx(1, "\"%s\" is not a user of this system", myname);
- } else {
- if ((cp = username()) == NULL) {
- myname = "ubluit";
- if (rcvmode)
- errx(1, "Who are you!?");
- } else
- myname = savestr(cp);
- }
- if ((cp = getenv("HOME")) == NULL || *cp == '\0' ||
- strlen(cp) >= PATHSIZE)
- homedir = NULL;
- else
- homedir = savestr(cp);
- if (debug)
- printf("user = %s, homedir = %s\n", myname,
- homedir ? homedir : "NONE");
-}
diff --git a/usr.bin/mail/tty.c b/usr.bin/mail/tty.c
deleted file mode 100644
index 6948d04..0000000
--- a/usr.bin/mail/tty.c
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)tty.c 8.2 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Mail -- a mail program
- *
- * Generally useful tty stuff.
- */
-
-#include "rcv.h"
-#include "extern.h"
-
-static cc_t c_erase; /* Current erase char */
-static cc_t c_kill; /* Current kill char */
-static jmp_buf rewrite; /* Place to go when continued */
-static jmp_buf intjmp; /* Place to go when interrupted */
-#ifndef TIOCSTI
-static int ttyset; /* We must now do erase/kill */
-#endif
-
-/*
- * Read all relevant header fields.
- */
-
-int
-grabh(hp, gflags)
- struct header *hp;
- int gflags;
-{
- struct termios ttybuf;
- sig_t saveint;
- sig_t savetstp;
- sig_t savettou;
- sig_t savettin;
- int errs;
-#ifndef TIOCSTI
- sig_t savequit;
-#else
-# ifdef TIOCEXT
- int extproc, flag;
-# endif /* TIOCEXT */
-#endif /* TIOCSTI */
-
- savetstp = signal(SIGTSTP, SIG_DFL);
- savettou = signal(SIGTTOU, SIG_DFL);
- savettin = signal(SIGTTIN, SIG_DFL);
- errs = 0;
-#ifndef TIOCSTI
- ttyset = 0;
-#endif
- if (tcgetattr(fileno(stdin), &ttybuf) < 0) {
- warn("tcgetattr(stdin)");
- return (-1);
- }
- c_erase = ttybuf.c_cc[VERASE];
- c_kill = ttybuf.c_cc[VKILL];
-#ifndef TIOCSTI
- ttybuf.c_cc[VERASE] = _POSIX_VDISABLE;
- ttybuf.c_cc[VKILL] = _POSIX_VDISABLE;
- if ((saveint = signal(SIGINT, SIG_IGN)) == SIG_DFL)
- (void)signal(SIGINT, SIG_DFL);
- if ((savequit = signal(SIGQUIT, SIG_IGN)) == SIG_DFL)
- (void)signal(SIGQUIT, SIG_DFL);
-#else
-# ifdef TIOCEXT
- extproc = ((ttybuf.c_lflag & EXTPROC) ? 1 : 0);
- if (extproc) {
- flag = 0;
- if (ioctl(fileno(stdin), TIOCEXT, &flag) < 0)
- warn("TIOCEXT: off");
- }
-# endif /* TIOCEXT */
- if (setjmp(intjmp))
- goto out;
- saveint = signal(SIGINT, ttyint);
-#endif
- if (gflags & GTO) {
-#ifndef TIOCSTI
- if (!ttyset && hp->h_to != NULL)
- ttyset++, tcsetattr(fileno(stdin), TCSADRAIN, &ttybuf);
-#endif
- hp->h_to =
- extract(readtty("To: ", detract(hp->h_to, 0)), GTO);
- }
- if (gflags & GSUBJECT) {
-#ifndef TIOCSTI
- if (!ttyset && hp->h_subject != NULL)
- ttyset++, tcsetattr(fileno(stdin), TCSADRAIN, &ttybuf);
-#endif
- hp->h_subject = readtty("Subject: ", hp->h_subject);
- }
- if (gflags & GCC) {
-#ifndef TIOCSTI
- if (!ttyset && hp->h_cc != NULL)
- ttyset++, tcsetattr(fileno(stdin), TCSADRAIN, &ttybuf);
-#endif
- hp->h_cc =
- extract(readtty("Cc: ", detract(hp->h_cc, 0)), GCC);
- }
- if (gflags & GBCC) {
-#ifndef TIOCSTI
- if (!ttyset && hp->h_bcc != NULL)
- ttyset++, tcsetattr(fileno(stdin), TCSADRAIN, &ttybuf);
-#endif
- hp->h_bcc =
- extract(readtty("Bcc: ", detract(hp->h_bcc, 0)), GBCC);
- }
-out:
- (void)signal(SIGTSTP, savetstp);
- (void)signal(SIGTTOU, savettou);
- (void)signal(SIGTTIN, savettin);
-#ifndef TIOCSTI
- ttybuf.c_cc[VERASE] = c_erase;
- ttybuf.c_cc[VKILL] = c_kill;
- if (ttyset)
- tcsetattr(fileno(stdin), TCSADRAIN, &ttybuf);
- (void)signal(SIGQUIT, savequit);
-#else
-# ifdef TIOCEXT
- if (extproc) {
- flag = 1;
- if (ioctl(fileno(stdin), TIOCEXT, &flag) < 0)
- warn("TIOCEXT: on");
- }
-# endif /* TIOCEXT */
-#endif
- (void)signal(SIGINT, saveint);
- return (errs);
-}
-
-/*
- * Read up a header from standard input.
- * The source string has the preliminary contents to
- * be read.
- *
- */
-
-char *
-readtty(pr, src)
- const char *pr;
- char src[];
-{
- char ch, canonb[BUFSIZ];
- int c;
- char *cp, *cp2;
-
- fputs(pr, stdout);
- (void)fflush(stdout);
- if (src != NULL && strlen(src) > BUFSIZ - 2) {
- printf("too long to edit\n");
- return (src);
- }
-#ifndef TIOCSTI
- if (src != NULL)
- strlcpy(canonb, src, sizeof(canonb));
- else
- *canonb = '\0';
- fputs(canonb, stdout);
- (void)fflush(stdout);
-#else
- cp = src == NULL ? "" : src;
- while ((c = *cp++) != '\0') {
- if ((c_erase != _POSIX_VDISABLE && c == c_erase) ||
- (c_kill != _POSIX_VDISABLE && c == c_kill)) {
- ch = '\\';
- ioctl(0, TIOCSTI, &ch);
- }
- ch = c;
- ioctl(0, TIOCSTI, &ch);
- }
- cp = canonb;
- *cp = '\0';
-#endif
- cp2 = cp;
- while (cp2 < canonb + BUFSIZ)
- *cp2++ = '\0';
- cp2 = cp;
- if (setjmp(rewrite))
- goto redo;
- (void)signal(SIGTSTP, ttystop);
- (void)signal(SIGTTOU, ttystop);
- (void)signal(SIGTTIN, ttystop);
- clearerr(stdin);
- while (cp2 < canonb + BUFSIZ) {
- c = getc(stdin);
- if (c == EOF || c == '\n')
- break;
- *cp2++ = c;
- }
- *cp2 = '\0';
- (void)signal(SIGTSTP, SIG_DFL);
- (void)signal(SIGTTOU, SIG_DFL);
- (void)signal(SIGTTIN, SIG_DFL);
- if (c == EOF && ferror(stdin)) {
-redo:
- cp = strlen(canonb) > 0 ? canonb : NULL;
- clearerr(stdin);
- return (readtty(pr, cp));
- }
-#ifndef TIOCSTI
- if (cp == NULL || *cp == '\0')
- return (src);
- cp2 = cp;
- if (!ttyset)
- return (strlen(canonb) > 0 ? savestr(canonb) : NULL);
- while (*cp != '\0') {
- c = *cp++;
- if (c_erase != _POSIX_VDISABLE && c == c_erase) {
- if (cp2 == canonb)
- continue;
- if (cp2[-1] == '\\') {
- cp2[-1] = c;
- continue;
- }
- cp2--;
- continue;
- }
- if (c_kill != _POSIX_VDISABLE && c == c_kill) {
- if (cp2 == canonb)
- continue;
- if (cp2[-1] == '\\') {
- cp2[-1] = c;
- continue;
- }
- cp2 = canonb;
- continue;
- }
- *cp2++ = c;
- }
- *cp2 = '\0';
-#endif
- if (equal("", canonb))
- return (NULL);
- return (savestr(canonb));
-}
-
-/*
- * Receipt continuation.
- */
-void
-ttystop(s)
- int s;
-{
- sig_t old_action = signal(s, SIG_DFL);
- sigset_t nset;
-
- (void)sigemptyset(&nset);
- (void)sigaddset(&nset, s);
- (void)sigprocmask(SIG_BLOCK, &nset, NULL);
- kill(0, s);
- (void)sigprocmask(SIG_UNBLOCK, &nset, NULL);
- (void)signal(s, old_action);
- longjmp(rewrite, 1);
-}
-
-/*ARGSUSED*/
-void
-ttyint(s)
- int s;
-{
- longjmp(intjmp, 1);
-}
diff --git a/usr.bin/mail/v7.local.c b/usr.bin/mail/v7.local.c
deleted file mode 100644
index 34f9d80..0000000
--- a/usr.bin/mail/v7.local.c
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)v7.local.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Mail -- a mail program
- *
- * Version 7
- *
- * Local routines that are installation dependent.
- */
-
-#include "rcv.h"
-#include <fcntl.h>
-#include "extern.h"
-
-/*
- * Locate the user's mailbox file (ie, the place where new, unread
- * mail is queued).
- */
-void
-findmail(user, buf, buflen)
- char *user, *buf;
- int buflen;
-{
- char *tmp = getenv("MAIL");
-
- if (tmp == NULL)
- (void)snprintf(buf, buflen, "%s/%s", _PATH_MAILDIR, user);
- else
- (void)strlcpy(buf, tmp, buflen);
-}
-
-/*
- * Get rid of the queued mail.
- */
-void
-demail()
-{
-
- if (value("keep") != NULL || rm(mailname) < 0)
- (void)close(open(mailname, O_CREAT | O_TRUNC | O_WRONLY, 0600));
-}
-
-/*
- * Discover user login name.
- */
-char *
-username()
-{
- char *np;
- uid_t uid;
-
- if ((np = getenv("USER")) != NULL)
- return (np);
- if ((np = getenv("LOGNAME")) != NULL)
- return (np);
- if ((np = getname(uid = getuid())) != NULL)
- return (np);
- printf("Cannot associate a name with uid %u\n", (unsigned)uid);
- return (NULL);
-}
diff --git a/usr.bin/mail/vars.c b/usr.bin/mail/vars.c
deleted file mode 100644
index ab171c1..0000000
--- a/usr.bin/mail/vars.c
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)vars.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "rcv.h"
-#include "extern.h"
-
-/*
- * Mail -- a mail program
- *
- * Variable handling stuff.
- */
-
-/*
- * Assign a value to a variable.
- */
-void
-assign(name, value)
- const char *name, *value;
-{
- struct var *vp;
- int h;
-
- h = hash(name);
- vp = lookup(name);
- if (vp == NULL) {
- vp = calloc(sizeof(*vp), 1);
- vp->v_name = vcopy(name);
- vp->v_link = variables[h];
- variables[h] = vp;
- }
- else
- vfree(vp->v_value);
- vp->v_value = vcopy(value);
-}
-
-/*
- * Free up a variable string. We do not bother to allocate
- * strings whose value is "" since they are expected to be frequent.
- * Thus, we cannot free same!
- */
-void
-vfree(cp)
- char *cp;
-{
- if (*cp != '\0')
- (void)free(cp);
-}
-
-/*
- * Copy a variable value into permanent (ie, not collected after each
- * command) space. Do not bother to alloc space for ""
- */
-
-char *
-vcopy(str)
- const char *str;
-{
- char *new;
- unsigned len;
-
- if (*str == '\0')
- return ("");
- len = strlen(str) + 1;
- if ((new = malloc(len)) == NULL)
- err(1, "Out of memory");
- bcopy(str, new, (int)len);
- return (new);
-}
-
-/*
- * Get the value of a variable and return it.
- * Look in the environment if its not available locally.
- */
-
-char *
-value(name)
- const char *name;
-{
- struct var *vp;
-
- if ((vp = lookup(name)) == NULL)
- return (getenv(name));
- return (vp->v_value);
-}
-
-/*
- * Locate a variable and return its variable
- * node.
- */
-
-struct var *
-lookup(name)
- const char *name;
-{
- struct var *vp;
-
- for (vp = variables[hash(name)]; vp != NULL; vp = vp->v_link)
- if (*vp->v_name == *name && equal(vp->v_name, name))
- return (vp);
- return (NULL);
-}
-
-/*
- * Locate a group name and return it.
- */
-
-struct grouphead *
-findgroup(name)
- char name[];
-{
- struct grouphead *gh;
-
- for (gh = groups[hash(name)]; gh != NULL; gh = gh->g_link)
- if (*gh->g_name == *name && equal(gh->g_name, name))
- return (gh);
- return (NULL);
-}
-
-/*
- * Print a group out on stdout
- */
-void
-printgroup(name)
- char name[];
-{
- struct grouphead *gh;
- struct group *gp;
-
- if ((gh = findgroup(name)) == NULL) {
- printf("\"%s\": not a group\n", name);
- return;
- }
- printf("%s\t", gh->g_name);
- for (gp = gh->g_list; gp != NULL; gp = gp->ge_link)
- printf(" %s", gp->ge_name);
- printf("\n");
-}
-
-/*
- * Hash the passed string and return an index into
- * the variable or group hash table.
- */
-int
-hash(name)
- const char *name;
-{
- int h = 0;
-
- while (*name != '\0') {
- h <<= 2;
- h += *name++;
- }
- if (h < 0 && (h = -h) < 0)
- h = 0;
- return (h % HSHSIZE);
-}
diff --git a/usr.bin/mail/version.c b/usr.bin/mail/version.c
deleted file mode 100644
index e41c25c..0000000
--- a/usr.bin/mail/version.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)version.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Just keep track of the date/sid of this version of Mail.
- * Load this file first to get a "total" Mail version.
- */
-const char *version = "8.1 6/6/93";
diff --git a/usr.bin/make/GNode.h b/usr.bin/make/GNode.h
deleted file mode 100644
index 71d2afd..0000000
--- a/usr.bin/make/GNode.h
+++ /dev/null
@@ -1,224 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef GNode_h_39503bf2
-#define GNode_h_39503bf2
-
-#include "lst.h"
-#include "util.h"
-
-struct Suff;
-
-/*
- * The structure for an individual graph node. Each node has several
- * pieces of data associated with it.
- */
-typedef struct GNode {
- char *name; /* The target's name */
- char *path; /* The full pathname of the target file */
-
- /*
- * The type of operator used to define the sources (qv. parse.c)
- *
- * The OP_ constants are used when parsing a dependency line as a way of
- * communicating to other parts of the program the way in which a target
- * should be made. These constants are bitwise-OR'ed together and
- * placed in the 'type' field of each node. Any node that has
- * a 'type' field which satisfies the OP_NOP function was never never on
- * the lefthand side of an operator, though it may have been on the
- * righthand side...
- */
- int type;
-#define OP_DEPENDS 0x00000001 /* Execution of commands depends on
- * kids (:) */
-#define OP_FORCE 0x00000002 /* Always execute commands (!) */
-#define OP_DOUBLEDEP 0x00000004 /* Execution of commands depends on
- * kids per line (::) */
-#define OP_OPMASK (OP_DEPENDS|OP_FORCE|OP_DOUBLEDEP)
-
-#define OP_OPTIONAL 0x00000008 /* Don't care if the target doesn't
- * exist and can't be created */
-#define OP_USE 0x00000010 /*
- * Use associated commands for
- * parents
- */
-#define OP_EXEC 0x00000020 /* Target is never out of date, but
- * always execute commands anyway.
- * Its time doesn't matter, so it has
- * none...sort of
- */
-#define OP_IGNORE 0x00000040 /*
- * Ignore errors when creating the node
- */
-#define OP_PRECIOUS 0x00000080 /* Don't remove the target when
- * interrupted */
-#define OP_SILENT 0x00000100 /* Don't echo commands when executed */
-#define OP_MAKE 0x00000200 /*
- * Target is a recurrsive make so its
- * commands should always be executed
- * when it is out of date, regardless
- * of the state of the -n or -t flags
- */
-#define OP_JOIN 0x00000400 /* Target is out-of-date only if any of
- * its children was out-of-date */
-#define OP_INVISIBLE 0x00004000 /* The node is invisible to its parents.
- * I.e. it doesn't show up in the
- * parents's local variables. */
-#define OP_NOTMAIN 0x00008000 /* The node is exempt from normal 'main
- * target' processing in parse.c */
-#define OP_PHONY 0x00010000 /* Not a file target; run always */
-/* Attributes applied by PMake */
-#define OP_TRANSFORM 0x80000000 /* The node is a transformation rule */
-#define OP_MEMBER 0x40000000 /* Target is a member of an archive */
-#define OP_LIB 0x20000000 /* Target is a library */
-#define OP_ARCHV 0x10000000 /* Target is an archive construct */
-#define OP_HAS_COMMANDS 0x08000000 /* Target has all the commands it
- * should. Used when parsing to catch
- * multiple commands for a target */
-#define OP_SAVE_CMDS 0x04000000 /* Saving commands on .END (Compat) */
-#define OP_DEPS_FOUND 0x02000000 /* Already processed by Suff_FindDeps */
-
-/*
- * OP_NOP will return TRUE if the node with the given type was not the
- * object of a dependency operator
- */
-#define OP_NOP(t) (((t) & OP_OPMASK) == 0x00000000)
-
- int order; /* Its wait weight */
-
- Boolean make; /* TRUE if this target needs to be remade */
-
- /* Set to reflect the state of processing on this node */
- enum {
- UNMADE, /* Not examined yet */
-
- /*
- * Target is already being made. Indicates a cycle in the graph.
- * (compat mode only)
- */
- BEINGMADE,
-
- MADE, /* Was out-of-date and has been made */
- UPTODATE, /* Was already up-to-date */
-
- /*
- * An error occured while it was being
- * made (used only in compat mode)
- */
- ERROR,
-
- /*
- * The target was aborted due to an
- * error making an inferior (compat).
- */
- ABORTED,
-
- /*
- * Marked as potentially being part of a graph cycle. If we
- * come back to a node marked this way, it is printed and
- * 'made' is changed to ENDCYCLE.
- */
- CYCLE,
-
- /*
- * The cycle has been completely printed. Go back and
- * unmark all its members.
- */
- ENDCYCLE
- } made;
-
- /* TRUE if one of this target's children was made */
- Boolean childMade;
-
- int unmade; /* The number of unmade children */
- int mtime; /* Its modification time */
- int cmtime; /* Modification time of its youngest child */
- struct GNode *cmtime_gn;/* Youngest child */
-
- /*
- * Links to parents for which this is an implied source, if any. (nodes
- * that depend on this, as gleaned from the transformation rules.
- */
- Lst iParents;
-
- /* List of nodes of the same name created by the :: operator */
- Lst cohorts;
-
- /* Lst of nodes for which this is a source (that depend on this one) */
- Lst parents;
-
- /* List of nodes on which this depends */
- Lst children;
-
- /*
- * List of nodes that must be made (if they're made) after this node is,
- * but that do not depend on this node, in the normal sense.
- */
- Lst successors;
-
- /*
- * List of nodes that must be made (if they're made) before this node
- * can be, but that do no enter into the datedness of this node.
- */
- Lst preds;
-
- /*
- * List of ``local'' variables that are specific to this target
- * and this target only (qv. var.c [$@ $< $?, etc.])
- */
- Lst context;
-
- /*
- * List of strings that are commands to be given to a shell
- * to create this target.
- */
- Lst commands;
-
- /* current command executing in compat mode */
- LstNode *compat_command;
-
- /*
- * Suffix for the node (determined by Suff_FindDeps and opaque to
- * everyone but the Suff module)
- */
- struct Suff *suffix;
-} GNode;
-
-#endif /* GNode_h_39503bf2 */
diff --git a/usr.bin/make/Makefile b/usr.bin/make/Makefile
deleted file mode 100644
index e5be06d..0000000
--- a/usr.bin/make/Makefile
+++ /dev/null
@@ -1,110 +0,0 @@
-# @(#)Makefile 5.2 (Berkeley) 12/28/90
-# $Id: Makefile,v 1.6 1994/06/30 05:33:39 cgd Exp $
-# $FreeBSD$
-
-PROG= make
-CFLAGS+=-I${.CURDIR}
-SRCS= arch.c buf.c cond.c dir.c for.c hash.c hash_tables.c job.c \
- lst.c main.c make.c parse.c proc.c shell.c str.c suff.c targ.c \
- util.c var.c
-
-NO_WERROR=
-WARNS?= 6
-NO_SHARED?= YES
-
-CFLAGS+=-DMAKE_VERSION=\"5200408120\"
-# There is no obvious performance improvement currently.
-# CFLAGS+=-DUSE_KQUEUE
-
-# Make object files which depend on preprocessor symbols defined in
-# the Makefile which are not compilation options but rather configuration
-# options dependend on the Makefile. main.c needs MAKE_VERSION while
-# shell.c uses DEFSHELLNAME. This will cause recompilation in the case
-# the definition is changed in the makefile. It will of course not cause
-# recompilation if one does 'make MAKE_SHELL=csh'.
-main.o shell.o: ${MAKEFILE}
-
-# Directive and keyword tables. We use hash tables. These hash tables have been
-# generated with mph (ports/devel/mph)
-# If you change the directives or keywords (adding, deleting, reordering) you
-# need to create new tables and hash functions (directive_hash, keyword_hash).
-#
-# The following changes have been made to the generated code:
-#
-# o prefix the names of the g, T0 and T1 arrays with 'directive_'
-# resp. 'keyword_'.
-#
-# o make the type of the tables 'const [un]signed char' (if you change
-# anything make sure that the numbers fit into a char).
-#
-# o make the hash function use the length for termination,
-# not the trailing '\0', via the -l flag in emitc and some editing
-# (only for directive_hash).
-
-LOCALBASE ?= /usr/local
-MPH ?= ${LOCALBASE}/bin/mph
-EMITC ?= ${LOCALBASE}/bin/emitc
-
-.PRECIOUS: hash
-
-hash:
- ( echo '/*' ; \
- echo ' * DO NOT EDIT' ; \
- echo ' * $$''FreeBSD$$' ; \
- echo -n ' * auto-generated from ' ; \
- sed -nEe '/\$$FreeBSD/s/^.*\$$(.*)\$$.*$$/\1/p' \
- ${.CURDIR}/parse.c ; \
- echo ' * DO NOT EDIT' ; \
- echo ' */' ; \
- echo '#include <sys/types.h>' ; \
- echo ; \
- echo '#include "hash_tables.h"' ; \
- echo ; \
- cat ${.CURDIR}/parse.c | sed \
- -e '1,/DIRECTIVES-START-TAG/d' \
- -e '/DIRECTIVES-END-TAG/,$$d' \
- -e 's/^[^"]*"\([^"]*\)".*$$/\1/' | \
- ${MPH} -d2 -m1 | ${EMITC} -l -s | \
- sed \
- -e 's/^static int g\[\]/static const signed char directive_g[]/' \
- -e 's/^static int T0\[\]/static const u_char directive_T0[]/' \
- -e 's/^static int T1\[\]/static const u_char directive_T1[]/' \
- -e '/^#define uchar unsigned char/d' \
- -e 's/uchar/u_char/g' \
- -e 's/^hash(/directive_hash(/' \
- -e 's/; \*kp;/; kp < key + len;/' \
- -e 's/int len)/size_t len)/' \
- -e 's/= T0\[/= directive_T0\[/' \
- -e 's/= T1\[/= directive_T1\[/' \
- -e 's/g\[f/directive_g[f/g' ; \
- cat ${.CURDIR}/parse.c | sed \
- -e '1,/KEYWORD-START-TAG/d' \
- -e '/KEYWORD-END-TAG/,$$d' \
- -e 's/^[^"]*"\([^"]*\)".*$$/\1/' | \
- ${MPH} -d2 -m1 | ${EMITC} -l -s | \
- sed \
- -e 's/^static int g\[\]/static const signed char keyword_g[]/' \
- -e 's/^static int T0\[\]/static const u_char keyword_T0[]/' \
- -e 's/^static int T1\[\]/static const u_char keyword_T1[]/' \
- -e '/^#define uchar unsigned char/d' \
- -e 's/uchar/u_char/g' \
- -e 's/^hash(/keyword_hash(/' \
- -e 's/int len)/size_t len)/' \
- -e 's/= T0\[/= keyword_T0\[/' \
- -e 's/= T1\[/= keyword_T1\[/' \
- -e 's/g\[f/keyword_g[f/g' \
- ) > ${.CURDIR}/hash_tables.c
-
-# Set the shell which make(1) uses. Bourne is the default, but a decent
-# Korn shell works fine, and much faster. Using the C shell for this
-# will almost certainly break everything, but it's Unix tradition to
-# allow you to shoot yourself in the foot if you want to :-)
-
-MAKE_SHELL?= sh
-.if ${MAKE_SHELL} == "csh" || ${MAKE_SHELL} == "sh" || ${MAKE_SHELL} == "ksh"
-CFLAGS+= -DDEFSHELLNAME=\"${MAKE_SHELL}\"
-.else
-.error "MAKE_SHELL must be set to one of \"csh\", \"sh\" or \"ksh\"."
-.endif
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/make/Makefile.dist b/usr.bin/make/Makefile.dist
deleted file mode 100644
index 8823d74..0000000
--- a/usr.bin/make/Makefile.dist
+++ /dev/null
@@ -1,10 +0,0 @@
-# $FreeBSD$
-# a simple makefile to help builds on !FreeBSD systems
-pmake:
- @echo 'make started.'
- cc -D__dead2="" -D__unused="" -Darc4random=random -D__FBSDID="static const char *id=" -DDEFSHELLNAME=\"sh\" -I. -c *.c
- cc *.o -o pmake
- @echo 'make completed.'
-
-clean:
- @rm -f *.o pmake
diff --git a/usr.bin/make/PSD.doc/stubs b/usr.bin/make/PSD.doc/stubs
deleted file mode 100644
index 39d8def..0000000
--- a/usr.bin/make/PSD.doc/stubs
+++ /dev/null
@@ -1,9 +0,0 @@
-.\" $FreeBSD$
-.\"
-.de Ix
-..
-.de Rd
-..
-.de Rm
-..
-.if n .ftr CR R
diff --git a/usr.bin/make/PSD.doc/tutorial.ms b/usr.bin/make/PSD.doc/tutorial.ms
deleted file mode 100644
index 320d5df..0000000
--- a/usr.bin/make/PSD.doc/tutorial.ms
+++ /dev/null
@@ -1,3747 +0,0 @@
-.\" Copyright (c) 1988, 1989 by Adam de Boor
-.\" Copyright (c) 1989 by Berkeley Softworks
-.\" Copyright (c) 1988, 1989, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Adam de Boor.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)tutorial.ms 8.1 (Berkeley) 8/18/93
-.\" $FreeBSD$
-.\"
-.EH 'PSD:12-%''PMake \*- A Tutorial'
-.OH 'PMake \*- A Tutorial''PSD:12-%'
-.\" xH is a macro to provide numbered headers that are automatically stuffed
-.\" into a table-of-contents, properly indented, etc. If the first argument
-.\" is numeric, it is taken as the depth for numbering (as for .NH), else
-.\" the default (1) is assumed.
-.\"
-.\" @P The initial paragraph distance.
-.\" @Q The piece of section number to increment (or 0 if none given)
-.\" @R Section header.
-.\" @S Indent for toc entry
-.\" @T Argument to NH (can't use @Q b/c giving 0 to NH resets the counter)
-.de xH
-.NH \\$1
-\\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
-.nr PD .1v
-.XS \\n%
-.ta 0.6i
-\\*(SN \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
-.XE
-.nr PD .3v
-..
-.ig
-.\" CW is used to place a string in fixed-width or switch to a
-.\" fixed-width font.
-.\" C is a typewriter font for a laserwriter. Use something else if
-.\" you don't have one...
-.de CW
-.ie !\\n(.$ .ft S
-.el \&\\$3\fS\\$1\fP\\$2
-..
-.\" Anything I put in a display I want to be in fixed-width
-.am DS
-.CW
-..
-.\" The stuff in .No produces a little stop sign in the left margin
-.\" that says NOTE in it. Unfortunately, it does cause a break, but
-.\" hey. Can't have everything. In case you're wondering how I came
-.\" up with such weird commands, they came from running grn on a
-.\" gremlin file...
-.de No
-.br
-.ne 0.5i
-.po -0.5i
-.br
-.mk
-.nr g3 \\n(.f
-.nr g4 \\n(.s
-.ig ft
-.sp -1
-.\" .st cf
-\D's -1u'\D't 5u'
-.sp -1
-\h'50u'\D'l 71u 0u'\D'l 50u 50u'\D'l 0u 71u'\D'l -50u 50u'\D'l -71u 0u'\D'l -50u -50u'\D'l 0u -71u'\D'l 50u -50u'
-.sp -1
-\D't 3u'
-.sp -1
-.sp 7u
-\h'53u'\D'p 14 68u 0u 46u 46u 0u 68u -46u 46u -68u 0u -47u -46u 0u -68u 47u -46u'
-.sp -1
-.ft R
-.ps 6
-.nr g8 \\n(.d
-.ds g9 "NOTE
-.sp 74u
-\h'85u'\v'0.85n'\h-\w\\*(g9u/2u\&\\*(g9
-.sp |\\n(g8u
-.sp 166u
-.ig br
-\D't 3u'\D's -1u'
-.br
-.po
-.rt
-.ft \\n(g3
-.ps \\n(g4
-..
-.de Bp
-.ie !\\n(.$ .IP \(bu 2
-.el .IP "\&" 2
-..
-.po +.3i
-.TL
-PMake \*- A Tutorial
-.AU
-Adam de Boor
-.AI
-Berkeley Softworks
-2150 Shattuck Ave, Penthouse
-Berkeley, CA 94704
-adam@bsw.uu.net
-\&...!uunet!bsw!adam
-.FS
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appears in all copies.
-The University of California, Berkeley Softworks, and Adam de Boor make no
-representations about the suitability of this software for any
-purpose. It is provided "as is" without express or implied warranty.
-.FE
-.PP
-.xH 1 Introduction
-.LP
-PMake is a program for creating other programs, or anything else you
-can think of for it to do. The basic idea behind PMake is that, for
-any given system, be it a program or a document or whatever, there
-will be some files that depend on the state of other files (on when
-they were last modified). PMake takes these dependencies, which you
-must specify, and uses them to build whatever it is you want it to
-build.
-.LP
-PMake is almost fully-compatible with Make, with which you may already
-be familiar. PMake's most important feature is its ability to run
-several different jobs at once, making the creation of systems
-considerably faster. It also has a great deal more functionality than
-Make. Throughout the text, whenever something is mentioned that is an
-important difference between PMake and Make (i.e. something that will
-cause a makefile to fail if you don't do something about it), or is
-simply important, it will be flagged with a little sign in the left
-margin, like this:
-.No
-.LP
-This tutorial is divided into three main sections corresponding to basic,
-intermediate and advanced PMake usage. If you already know Make well,
-you will only need to skim chapter 2 (there are some aspects of
-PMake that I consider basic to its use that didn't exist in Make).
-Things in chapter 3 make life much easier, while those in chapter 4
-are strictly for those who know what they are doing. Chapter 5 has
-definitions for the jargon I use and chapter 6 contains possible
-solutions to the problems presented throughout the tutorial.
-.xH 1 The Basics of PMake
-.LP
-PMake takes as input a file that tells a) which files depend on which
-other files to be complete and b) what to do about files that are
-``out-of-date.'' This file is known as a ``makefile'' and is usually
-.Ix 0 def makefile
-kept in the top-most directory of the system to be built. While you
-can call the makefile anything you want, PMake will look for
-.CW Makefile
-and
-.CW makefile
-(in that order) in the current directory if you don't tell it
-otherwise.
-.Ix 0 def makefile default
-To specify a different makefile, use the
-.B \-f
-flag (e.g.
-.CW "pmake -f program.mk" ''). ``
-.Ix 0 ref flags -f
-.Ix 0 ref makefile other
-.LP
-A makefile has four different types of lines in it:
-.RS
-.IP \(bu 2
-File dependency specifications
-.IP \(bu 2
-Creation commands
-.IP \(bu 2
-Variable assignments
-.IP \(bu 2
-Comments, include statements and conditional directives
-.RE
-.LP
-Any line may be continued over multiple lines by ending it with a
-backslash.
-.Ix 0 def "continuation line"
-The backslash, following newline and any initial whitespace
-on the following line are compressed into a single space before the
-input line is examined by PMake.
-.xH 2 Dependency Lines
-.LP
-As mentioned in the introduction, in any system, there are
-dependencies between the files that make up the system. For instance,
-in a program made up of several C source files and one header file,
-the C files will need to be re-compiled should the header file be
-changed. For a document of several chapters and one macro file, the
-chapters will need to be reprocessed if any of the macros changes.
-.Ix 0 def "dependency"
-These are dependencies and are specified by means of dependency lines in
-the makefile.
-.LP
-.Ix 0 def "dependency line"
-On a dependency line, there are targets and sources, separated by a
-one- or two-character operator.
-The targets ``depend'' on the sources and are usually created from
-them.
-.Ix 0 def target
-.Ix 0 def source
-.Ix 0 ref operator
-Any number of targets and sources may be specified on a dependency line.
-All the targets in the line are made to depend on all the sources.
-Targets and sources need not be actual files, but every source must be
-either an actual file or another target in the makefile.
-If you run out of room, use a backslash at the end of the line to continue onto
-the next one.
-.LP
-Any file may be a target and any file may be a source, but the
-relationship between the two (or however many) is determined by the
-``operator'' that separates them.
-.Ix 0 def operator
-Three types of operators exist: one specifies that the datedness of a
-target is determined by the state of its sources, while another
-specifies other files (the sources) that need to be dealt with before
-the target can be re-created. The third operator is very similar to
-the first, with the additional condition that the target is
-out-of-date if it has no sources. These operations are represented by
-the colon, the exclamation point and the double-colon, respectively, and are
-mutually exclusive. Their exact semantics are as follows:
-.IP ":"
-.Ix 0 def operator colon
-.Ix 0 def :
-If a colon is used, a target on the line is considered to be
-``out-of-date'' (and in need of creation) if
-.RS
-.IP \(bu 2
-any of the sources has been modified more recently than the target, or
-.IP \(bu 2
-the target doesn't exist.
-.RE
-.Ix 0 def out-of-date
-.IP "\&"
-Under this operation, steps will be taken to re-create the target only
-if it is found to be out-of-date by using these two rules.
-.IP "!"
-.Ix 0 def operator force
-.Ix 0 def !
-If an exclamation point is used, the target will always be re-created,
-but this will not happen until all of its sources have been examined
-and re-created, if necessary.
-.IP "::"
-.Ix 0 def operator double-colon
-.Ix 0 def ::
-If a double-colon is used, a target is out-of-date if:
-.RS
-.IP \(bu 2
-any of the sources has been modified more recently than the target, or
-.IP \(bu 2
-the target doesn't exist, or
-.IP \(bu 2
-the target has no sources.
-.RE
-.IP "\&"
-If the target is out-of-date according to these rules, it will be re-created.
-This operator also does something else to the targets, but I'll go
-into that in the next section (``Shell Commands'').
-.LP
-Enough words, now for an example. Take that C program I mentioned
-earlier. Say there are three C files
-.CW a.c , (
-.CW b.c
-and
-.CW c.c )
-each of which
-includes the file
-.CW defs.h .
-The dependencies between the files could then be expressed as follows:
-.DS
-program : a.o b.o c.o
-a.o b.o c.o : defs.h
-a.o : a.c
-b.o : b.c
-c.o : c.c
-.DE
-.LP
-You may be wondering at this point, where
-.CW a.o ,
-.CW b.o
-and
-.CW c.o
-came in and why
-.I they
-depend on
-.CW defs.h
-and the C files don't. The reason is quite simple:
-.CW program
-cannot be made by linking together .c files \*- it must be
-made from .o files. Likewise, if you change
-.CW defs.h ,
-it isn't the .c files that need to be re-created, it's the .o files.
-If you think of dependencies in these terms \*- which files (targets)
-need to be created from which files (sources) \*- you should have no problems.
-.LP
-An important thing to notice about the above example, is that all the
-\&.o files appear as targets on more than one line. This is perfectly
-all right: the target is made to depend on all the sources mentioned
-on all the dependency lines. E.g.
-.CW a.o
-depends on both
-.CW defs.h
-and
-.CW a.c .
-.Ix 0 ref dependency
-.No
-.LP
-The order of the dependency lines in the makefile is
-important: the first target on the first dependency line in the
-makefile will be the one that gets made if you don't say otherwise.
-That's why
-.CW program
-comes first in the example makefile, above.
-.LP
-Both targets and sources may contain the standard C-Shell wildcard
-characters
-.CW { , (
-.CW } ,
-.CW * ,
-.CW ? ,
-.CW [ ,
-and
-.CW ] ),
-but the non-curly-brace ones may only appear in the final component
-(the file portion) of the target or source. The characters mean the
-following things:
-.IP \fB{}\fP
-These enclose a comma-separated list of options and cause the pattern
-to be expanded once for each element of the list. Each expansion
-contains a different element. For example,
-.CW src/{whiffle,beep,fish}.c
-expands to the three words
-.CW src/whiffle.c ,
-.CW src/beep.c ,
-and
-.CW src/fish.c .
-These braces may be nested and, unlike the other wildcard characters,
-the resulting words need not be actual files. All other wildcard
-characters are expanded using the files that exist when PMake is
-started.
-.IP \fB*\fP
-This matches zero or more characters of any sort.
-.CW src/*.c
-will expand to the same three words as above as long as
-.CW src
-contains those three files (and no other files that end in
-.CW .c ).
-.IP \fB?\fP
-Matches any single character.
-.IP \fB[]\fP
-This is known as a character class and contains either a list of
-single characters, or a series of character ranges
-.CW a-z , (
-for example means all characters between a and z), or both. It matches
-any single character contained in the list. E.g.
-.CW [A-Za-z]
-will match all letters, while
-.CW [0123456789]
-will match all numbers.
-.xH 2 Shell Commands
-.LP
-``Isn't that nice,'' you say to yourself, ``but how are files
-actually `re-created,' as he likes to spell it?''
-The re-creation is accomplished by commands you place in the makefile.
-These commands are passed to the Bourne shell (better known as
-``/bin/sh'') to be executed and are
-.Ix 0 ref shell
-.Ix 0 ref re-creation
-.Ix 0 ref update
-expected to do what's necessary to update the target file (PMake
-doesn't actually check to see if the target was created. It just
-assumes it's there).
-.Ix 0 ref target
-.LP
-Shell commands in a makefile look a lot like shell commands you would
-type at a terminal, with one important exception: each command in a
-makefile
-.I must
-be preceded by at least one tab.
-.LP
-Each target has associated with it a shell script made up of
-one or more of these shell commands. The creation script for a target
-should immediately follow the dependency line for that target. While
-any given target may appear on more than one dependency line, only one
-of these dependency lines may be followed by a creation script, unless
-the `::' operator was used on the dependency line.
-.Ix 0 ref operator double-colon
-.Ix 0 ref ::
-.No
-.LP
-If the double-colon was used, each dependency line for the target
-may be followed by a shell script. That script will only be executed
-if the target on the associated dependency line is out-of-date with
-respect to the sources on that line, according to the rules I gave
-earlier.
-I'll give you a good example of this later on.
-.LP
-To expand on the earlier makefile, you might add commands as follows:
-.DS
-program : a.o b.o c.o
- cc a.o b.o c.o \-o program
-a.o b.o c.o : defs.h
-a.o : a.c
- cc \-c a.c
-b.o : b.c
- cc \-c b.c
-c.o : c.c
- cc \-c c.c
-.DE
-.LP
-Something you should remember when writing a makefile is, the
-commands will be executed if the
-.I target
-on the dependency line is out-of-date, not the sources.
-.Ix 0 ref target
-.Ix 0 ref source
-.Ix 0 ref out-of-date
-In this example, the command
-.CW "cc \-c a.c" '' ``
-will be executed if
-.CW a.o
-is out-of-date. Because of the `:' operator,
-.Ix 0 ref :
-.Ix 0 ref operator colon
-this means that should
-.CW a.c
-.I or
-.CW defs.h
-have been modified more recently than
-.CW a.o ,
-the command will be executed
-.CW a.o "\&" (
-will be considered out-of-date).
-.Ix 0 ref out-of-date
-.LP
-Remember how I said the only difference between a makefile shell
-command and a regular shell command was the leading tab? I lied. There
-is another way in which makefile commands differ from regular ones.
-The first two characters after the initial whitespace are treated
-specially.
-If they are any combination of `@' and `\-', they cause PMake to do
-different things.
-.LP
-In most cases, shell commands are printed before they're
-actually executed. This is to keep you informed of what's going on. If
-an `@' appears, however, this echoing is suppressed. In the case of an
-.CW echo
-command, say
-.CW "echo Linking index" ,'' ``
-it would be
-rather silly to see
-.DS
-echo Linking index
-Linking index
-.DE
-.LP
-so PMake allows you to place an `@' before the command
-.CW "@echo Linking index" '') (``
-to prevent the command from being printed.
-.LP
-The other special character is the `\-'. In case you didn't know,
-shell commands finish with a certain ``exit status.'' This status is
-made available by the operating system to whatever program invoked the
-command. Normally this status will be 0 if everything went ok and
-non-zero if something went wrong. For this reason, PMake will consider
-an error to have occurred if one of the shells it invokes returns a non-zero
-status. When it detects an error, PMake's usual action is to abort
-whatever it's doing and exit with a non-zero status itself (any other
-targets that were being created will continue being made, but nothing
-new will be started. PMake will exit after the last job finishes).
-This behavior can be altered, however, by placing a `\-' at the front
-of a command
-.CW "\-mv index index.old" ''), (``
-certain command-line arguments,
-or doing other things, to be detailed later. In such
-a case, the non-zero status is simply ignored and PMake keeps chugging
-along.
-.No
-.LP
-Because all the commands are given to a single shell to execute, such
-things as setting shell variables, changing directories, etc., last
-beyond the command in which they are found. This also allows shell
-compound commands (like
-.CW for
-loops) to be entered in a natural manner.
-Since this could cause problems for some makefiles that depend on
-each command being executed by a single shell, PMake has a
-.B \-B
-.Ix 0 ref compatibility
-.Ix 0 ref flags -B
-flag (it stands for backwards-compatible) that forces each command to
-be given to a separate shell. It also does several other things, all
-of which I discourage since they are now old-fashioned.\|.\|.\|.
-.No
-.LP
-A target's shell script is fed to the shell on its (the shell's) input stream.
-This means that any commands, such as
-.CW ci
-that need to get input from the terminal won't work right \*- they'll
-get the shell's input, something they probably won't find to their
-liking. A simple way around this is to give a command like this:
-.DS
-ci $(SRCS) < /dev/tty
-.DE
-This would force the program's input to come from the terminal. If you
-can't do this for some reason, your only other alternative is to use
-PMake in its fullest compatibility mode. See
-.B Compatibility
-in chapter 4.
-.Ix 0 ref compatibility
-.LP
-.xH 2 Variables
-.LP
-PMake, like Make before it, has the ability to save text in variables
-to be recalled later at your convenience. Variables in PMake are used
-much like variables in the shell and, by tradition, consist of
-all upper-case letters (you don't
-.I have
-to use all upper-case letters.
-In fact there's nothing to stop you from calling a variable
-.CW @^&$%$ .
-Just tradition). Variables are assigned-to using lines of the form
-.Ix 0 def variable assignment
-.DS
-VARIABLE = value
-.DE
-.Ix 0 def variable assignment
-appended-to by
-.DS
-VARIABLE += value
-.DE
-.Ix 0 def variable appending
-.Ix 0 def variable assignment appended
-.Ix 0 def +=
-conditionally assigned-to (if the variable isn't already defined) by
-.DS
-VARIABLE ?= value
-.DE
-.Ix 0 def variable assignment conditional
-.Ix 0 def ?=
-and assigned-to with expansion (i.e. the value is expanded (see below)
-before being assigned to the variable\*-useful for placing a value at
-the beginning of a variable, or other things) by
-.DS
-VARIABLE := value
-.DE
-.Ix 0 def variable assignment expanded
-.Ix 0 def :=
-.LP
-Any whitespace before
-.I value
-is stripped off. When appending, a space is placed between the old
-value and the stuff being appended.
-.LP
-The final way a variable may be assigned to is using
-.DS
-VARIABLE != shell-command
-.DE
-.Ix 0 def variable assignment shell-output
-.Ix 0 def !=
-In this case,
-.I shell-command
-has all its variables expanded (see below) and is passed off to a
-shell to execute. The output of the shell is then placed in the
-variable. Any newlines (other than the final one) are replaced by
-spaces before the assignment is made. This is typically used to find
-the current directory via a line like:
-.DS
-CWD != pwd
-.DE
-.LP
-.B Note:
-this is intended to be used to execute commands that produce small amounts
-of output (e.g. ``pwd''). The implementation is less than intelligent and will
-likely freeze if you execute something that produces thousands of
-bytes of output (8 Kb is the limit on many UNIX systems).
-.LP
-The value of a variable may be retrieved by enclosing the variable
-name in parentheses or curly braces and preceding the whole thing
-with a dollar sign.
-.LP
-For example, to set the variable CFLAGS to the string
-.CW "\-I/sprite/src/lib/libc \-O" ,'' ``
-you would place a line
-.DS
-CFLAGS = \-I/sprite/src/lib/libc \-O
-.DE
-in the makefile and use the word
-.CW "$(CFLAGS)"
-wherever you would like the string
-.CW "\-I/sprite/src/lib/libc \-O"
-to appear. This is called variable expansion.
-.Ix 0 def variable expansion
-.No
-.LP
-Unlike Make, PMake will not expand a variable unless it knows
-the variable exists. E.g. if you have a
-.CW "${i}"
-in a shell command and you have not assigned a value to the variable
-.CW i
-(the empty string is considered a value, by the way), where Make would have
-substituted the empty string, PMake will leave the
-.CW "${i}"
-alone.
-To keep PMake from substituting for a variable it knows, precede the
-dollar sign with another dollar sign.
-(e.g. to pass
-.CW "${HOME}"
-to the shell, use
-.CW "$${HOME}" ).
-This causes PMake, in effect, to expand the
-.CW $
-macro, which expands to a single
-.CW $ .
-For compatibility, Make's style of variable expansion will be used
-if you invoke PMake with any of the compatibility flags (\c
-.B \-V ,
-.B \-B
-or
-.B \-M .
-The
-.B \-V
-flag alters just the variable expansion).
-.Ix 0 ref flags -V
-.Ix 0 ref flags -B
-.Ix 0 ref flags -M
-.Ix 0 ref compatibility
-.LP
-.Ix 0 ref variable expansion
-There are two different times at which variable expansion occurs:
-When parsing a dependency line, the expansion occurs immediately
-upon reading the line. If any variable used on a dependency line is
-undefined, PMake will print a message and exit.
-Variables in shell commands are expanded when the command is
-executed.
-Variables used inside another variable are expanded whenever the outer
-variable is expanded (the expansion of an inner variable has no effect
-on the outer variable. I.e. if the outer variable is used on a dependency
-line and in a shell command, and the inner variable changes value
-between when the dependency line is read and the shell command is
-executed, two different values will be substituted for the outer
-variable).
-.Ix 0 def variable types
-.LP
-Variables come in four flavors, though they are all expanded the same
-and all look about the same. They are (in order of expanding scope):
-.RS
-.IP \(bu 2
-Local variables.
-.Ix 0 ref variable local
-.IP \(bu 2
-Command-line variables.
-.Ix 0 ref variable command-line
-.IP \(bu 2
-Global variables.
-.Ix 0 ref variable global
-.IP \(bu 2
-Environment variables.
-.Ix 0 ref variable environment
-.RE
-.LP
-The classification of variables doesn't matter much, except that the
-classes are searched from the top (local) to the bottom (environment)
-when looking up a variable. The first one found wins.
-.xH 3 Local Variables
-.LP
-.Ix 0 def variable local
-Each target can have as many as seven local variables. These are
-variables that are only ``visible'' within that target's shell script
-and contain such things as the target's name, all of its sources (from
-all its dependency lines), those sources that were out-of-date, etc.
-Four local variables are defined for all targets. They are:
-.RS
-.IP ".TARGET"
-.Ix 0 def variable local .TARGET
-.Ix 0 def .TARGET
-The name of the target.
-.IP ".OODATE"
-.Ix 0 def variable local .OODATE
-.Ix 0 def .OODATE
-The list of the sources for the target that were considered out-of-date.
-The order in the list is not guaranteed to be the same as the order in
-which the dependencies were given.
-.IP ".ALLSRC"
-.Ix 0 def variable local .ALLSRC
-.Ix 0 def .ALLSRC
-The list of all sources for this target in the order in which they
-were given.
-.IP ".PREFIX"
-.Ix 0 def variable local .PREFIX
-.Ix 0 def .PREFIX
-The target without its suffix and without any leading path. E.g. for
-the target
-.CW ../../lib/compat/fsRead.c ,
-this variable would contain
-.CW fsRead .
-.RE
-.LP
-Three other local variables are set only for certain targets under
-special circumstances. These are the ``.IMPSRC,''
-.Ix 0 ref variable local .IMPSRC
-.Ix 0 ref .IMPSRC
-``.ARCHIVE,''
-.Ix 0 ref variable local .ARCHIVE
-.Ix 0 ref .ARCHIVE
-and ``.MEMBER''
-.Ix 0 ref variable local .MEMBER
-.Ix 0 ref .MEMBER
-variables. When they are set and how they are used is described later.
-.LP
-Four of these variables may be used in sources as well as in shell
-scripts.
-.Ix 0 def "dynamic source"
-.Ix 0 def source dynamic
-These are ``.TARGET'', ``.PREFIX'', ``.ARCHIVE'' and ``.MEMBER''. The
-variables in the sources are expanded once for each target on the
-dependency line, providing what is known as a ``dynamic source,''
-.Rd 0
-allowing you to specify several dependency lines at once. For example,
-.DS
-$(OBJS) : $(.PREFIX).c
-.DE
-will create a dependency between each object file and its
-corresponding C source file.
-.xH 3 Command-line Variables
-.LP
-.Ix 0 def variable command-line
-Command-line variables are set when PMake is first invoked by giving a
-variable assignment as one of the arguments. For example,
-.DS
-pmake "CFLAGS = -I/sprite/src/lib/libc -O"
-.DE
-would make
-.CW CFLAGS
-be a command-line variable with the given value. Any assignments to
-.CW CFLAGS
-in the makefile will have no effect, because once it
-is set, there is (almost) nothing you can do to change a command-line
-variable (the search order, you see). Command-line variables may be
-set using any of the four assignment operators, though only
-.CW =
-and
-.CW ?=
-behave as you would expect them to, mostly because assignments to
-command-line variables are performed before the makefile is read, thus
-the values set in the makefile are unavailable at the time.
-.CW +=
-.Ix 0 ref +=
-.Ix 0 ref variable assignment appended
-is the same as
-.CW = ,
-because the old value of the variable is sought only in the scope in
-which the assignment is taking place (for reasons of efficiency that I
-won't get into here).
-.CW :=
-and
-.CW ?=
-.Ix 0 ref :=
-.Ix 0 ref ?=
-.Ix 0 ref variable assignment expanded
-.Ix 0 ref variable assignment conditional
-will work if the only variables used are in the environment.
-.CW !=
-is sort of pointless to use from the command line, since the same
-effect can no doubt be accomplished using the shell's own command
-substitution mechanisms (backquotes and all that).
-.xH 3 Global Variables
-.LP
-.Ix 0 def variable global
-Global variables are those set or appended-to in the makefile.
-There are two classes of global variables: those you set and those PMake sets.
-As I said before, the ones you set can have any name you want them to have,
-except they may not contain a colon or an exclamation point.
-The variables PMake sets (almost) always begin with a
-period and always contain upper-case letters, only. The variables are
-as follows:
-.RS
-.IP .PMAKE
-.Ix 0 def variable global .PMAKE
-.Ix 0 def .PMAKE
-.Ix 0 def variable global MAKE
-.Ix 0 def MAKE
-The name by which PMake was invoked is stored in this variable. For
-compatibility, the name is also stored in the MAKE variable.
-.IP .MAKEFLAGS
-.Ix 0 def variable global .MAKEFLAGS
-.Ix 0 def .MAKEFLAGS variable
-.Ix 0 def variable global MFLAGS
-.Ix 0 def MFLAGS
-All the relevant flags with which PMake was invoked. This does not
-include such things as
-.B \-f
-or variable assignments. Again for compatibility, this value is stored
-in the MFLAGS variable as well.
-.RE
-.LP
-Two other variables, ``.INCLUDES'' and ``.LIBS,'' are covered in the
-section on special targets in chapter 3.
-.Ix 0 ref variable global .INCLUDES
-.Ix 0 ref variable global .LIBS
-.LP
-Global variables may be deleted using lines of the form:
-.Ix 0 def #undef
-.Ix 0 def variable deletion
-.DS
-#undef \fIvariable\fP
-.DE
-The
-.CW # ' `
-must be the first character on the line. Note that this may only be
-done on global variables.
-.xH 3 Environment Variables
-.LP
-.Ix 0 def variable environment
-Environment variables are passed by the shell that invoked PMake and
-are given by PMake to each shell it invokes. They are expanded like
-any other variable, but they cannot be altered in any way.
-.LP
-One special environment variable,
-.CW PMAKE ,
-.Ix 0 def variable environment PMAKE
-is examined by PMake for command-line flags, variable assignments,
-etc., it should always use. This variable is examined before the
-actual arguments to PMake are. In addition, all flags given to PMake,
-either through the
-.CW PMAKE
-variable or on the command line, are placed in this environment
-variable and exported to each shell PMake executes. Thus recursive
-invocations of PMake automatically receive the same flags as the
-top-most one.
-.LP
-Using all these variables, you can compress the sample makefile even more:
-.DS
-OBJS = a.o b.o c.o
-program : $(OBJS)
- cc $(.ALLSRC) \-o $(.TARGET)
-$(OBJS) : defs.h
-a.o : a.c
- cc \-c a.c
-b.o : b.c
- cc \-c b.c
-c.o : c.c
- cc \-c c.c
-.DE
-.Ix 0 ref variable local .ALLSRC
-.Ix 0 ref .ALLSRC
-.Ix 0 ref variable local .TARGET
-.Ix 0 ref .TARGET
-.Rd 3
-.xH 2 Comments
-.LP
-.Ix 0 def comments
-Comments in a makefile start with a `#' character and extend to the
-end of the line. They may appear
-anywhere you want them, except in a shell command (though the shell
-will treat it as a comment, too). If, for some reason, you need to use the `#'
-in a variable or on a dependency line, put a backslash in front of it.
-PMake will compress the two into a single `#' (Note: this isn't true
-if PMake is operating in full-compatibility mode).
-.Ix 0 ref flags -M
-.Ix 0 ref compatibility
-.xH 2 Parallelism
-.No
-.LP
-PMake was specifically designed to re-create several targets at once,
-when possible. You do not have to do anything special to cause this to
-happen (unless PMake was configured to not act in parallel, in which
-case you will have to make use of the
-.B \-L
-and
-.B \-J
-flags (see below)),
-.Ix 0 ref flags -L
-.Ix 0 ref flags -J
-but you do have to be careful at times.
-.LP
-There are several problems you are likely to encounter. One is
-that some makefiles (and programs) are written in such a way that it is
-impossible for two targets to be made at once. The program
-.CW xstr ,
-for example,
-always modifies the files
-.CW strings
-and
-.CW x.c .
-There is no way to change it. Thus you cannot run two of them at once
-without something being trashed. Similarly, if you have commands
-in the makefile that always send output to the same file, you will not
-be able to make more than one target at once unless you change the
-file you use. You can, for instance, add a
-.CW $$$$
-to the end of the file name to tack on the process ID of the shell
-executing the command (each
-.CW $$
-expands to a single
-.CW $ ,
-thus giving you the shell variable
-.CW $$ ).
-Since only one shell is used for all the
-commands, you'll get the same file name for each command in the
-script.
-.LP
-The other problem comes from improperly-specified dependencies that
-worked in Make because of its sequential, depth-first way of examining
-them. While I don't want to go into depth on how PMake
-works (look in chapter 4 if you're interested), I will warn you that
-files in two different ``levels'' of the dependency tree may be
-examined in a different order in PMake than they were in Make. For
-example, given the makefile
-.DS
-a : b c
-b : d
-.DE
-PMake will examine the targets in the order
-.CW c ,
-.CW d ,
-.CW b ,
-.CW a .
-If the makefile's author expected PMake to abort before making
-.CW c
-if an error occurred while making
-.CW b ,
-or if
-.CW b
-needed to exist before
-.CW c
-was made,
-s/he will be sorely disappointed. The dependencies are
-incomplete, since in both these cases,
-.CW c
-would depend on
-.CW b .
-So watch out.
-.LP
-Another problem you may face is that, while PMake is set up to handle the
-output from multiple jobs in a graceful fashion, the same is not so for input.
-It has no way to regulate input to different jobs,
-so if you use the redirection from
-.CW /dev/tty
-I mentioned earlier, you must be careful not to run two of the jobs at once.
-.xH 2 Writing and Debugging a Makefile
-.LP
-Now you know most of what's in a makefile, what do you do next? There
-are two choices: (1) use one of the uncommonly-available makefile
-generators or (2) write your own makefile (I leave out the third choice of
-ignoring PMake and doing everything by hand as being beyond the bounds
-of common sense).
-.LP
-When faced with the writing of a makefile, it is usually best to start
-from first principles: just what
-.I are
-you trying to do? What do you want the makefile finally to produce?
-.LP
-To begin with a somewhat traditional example, let's say you need to
-write a makefile to create a program,
-.CW expr ,
-that takes standard infix expressions and converts them to prefix form (for
-no readily apparent reason). You've got three source files, in C, that
-make up the program:
-.CW main.c ,
-.CW parse.c ,
-and
-.CW output.c .
-Harking back to my pithy advice about dependency lines, you write the
-first line of the file:
-.DS
-expr : main.o parse.o output.o
-.DE
-because you remember
-.CW expr
-is made from
-.CW .o
-files, not
-.CW .c
-files. Similarly for the
-.CW .o
-files you produce the lines:
-.DS
-main.o : main.c
-parse.o : parse.c
-output.o : output.c
-main.o parse.o output.o : defs.h
-.DE
-.LP
-Great. You've now got the dependencies specified. What you need now is
-commands. These commands, remember, must produce the target on the
-dependency line, usually by using the sources you've listed.
-You remember about local variables? Good, so it should come
-to you as no surprise when you write
-.DS
-expr : main.o parse.o output.o
- cc -o $(.TARGET) $(.ALLSRC)
-.DE
-Why use the variables? If your program grows to produce postfix
-expressions too (which, of course, requires a name change or two), it
-is one fewer place you have to change the file. You cannot do this for
-the object files, however, because they depend on their corresponding
-source files
-.I and
-.CW defs.h ,
-thus if you said
-.DS
- cc -c $(.ALLSRC)
-.DE
-you'd get (for
-.CW main.o ):
-.DS
- cc -c main.c defs.h
-.DE
-which is wrong. So you round out the makefile with these lines:
-.DS
-main.o : main.c
- cc -c main.c
-parse.o : parse.c
- cc -c parse.c
-output.o : output.c
- cc -c output.c
-.DE
-.LP
-The makefile is now complete and will, in fact, create the program you
-want it to without unnecessary compilations or excessive typing on
-your part. There are two things wrong with it, however (aside from it
-being altogether too long, something I'll address in chapter 3):
-.IP 1)
-The string
-.CW "main.o parse.o output.o" '' ``
-is repeated twice, necessitating two changes when you add postfix
-(you were planning on that, weren't you?). This is in direct violation
-of de Boor's First Rule of writing makefiles:
-.QP
-.I
-Anything that needs to be written more than once
-should be placed in a variable.
-.IP "\&"
-I cannot emphasize this enough as being very important to the
-maintenance of a makefile and its program.
-.IP 2)
-There is no way to alter the way compilations are performed short of
-editing the makefile and making the change in all places. This is evil
-and violates de Boor's Second Rule, which follows directly from the
-first:
-.QP
-.I
-Any flags or programs used inside a makefile should be placed in a variable so
-they may be changed, temporarily or permanently, with the greatest ease.
-.LP
-The makefile should more properly read:
-.DS
-OBJS = main.o parse.o output.o
-expr : $(OBJS)
- $(CC) $(CFLAGS) -o $(.TARGET) $(.ALLSRC)
-main.o : main.c
- $(CC) $(CFLAGS) -c main.c
-parse.o : parse.c
- $(CC) $(CFLAGS) -c parse.c
-output.o : output.c
- $(CC) $(CFLAGS) -c output.c
-$(OBJS) : defs.h
-.DE
-Alternatively, if you like the idea of dynamic sources mentioned in
-section 2.3.1,
-.Rm 0 2.3.1
-.Rd 4
-.Ix 0 ref "dynamic source"
-.Ix 0 ref source dynamic
-you could write it like this:
-.DS
-OBJS = main.o parse.o output.o
-expr : $(OBJS)
- $(CC) $(CFLAGS) -o $(.TARGET) $(.ALLSRC)
-$(OBJS) : $(.PREFIX).c defs.h
- $(CC) $(CFLAGS) -c $(.PREFIX).c
-.DE
-These two rules and examples lead to de Boor's First Corollary:
-.QP
-.I
-Variables are your friends.
-.LP
-Once you've written the makefile comes the sometimes-difficult task of
-.Ix 0 ref debugging
-making sure the darn thing works. Your most helpful tool to make sure
-the makefile is at least syntactically correct is the
-.B \-n
-.Ix 0 ref flags -n
-flag, which allows you to see if PMake will choke on the makefile. The
-second thing the
-.B \-n
-flag lets you do is see what PMake would do without it actually doing
-it, thus you can make sure the right commands would be executed were
-you to give PMake its head.
-.LP
-When you find your makefile isn't behaving as you hoped, the first
-question that comes to mind (after ``What time is it, anyway?'') is
-``Why not?'' In answering this, two flags will serve you well:
-.CW "-d m" '' ``
-.Ix 0 ref flags -d
-and
-.CW "-p 2" .'' ``
-.Ix 0 ref flags -p
-The first causes PMake to tell you as it examines each target in the
-makefile and indicate why it is deciding whatever it is deciding. You
-can then use the information printed for other targets to see where
-you went wrong. The
-.CW "-p 2" '' ``
-flag makes PMake print out its internal state when it is done,
-allowing you to see that you forgot to make that one chapter depend on
-that file of macros you just got a new version of. The output from
-.CW "-p 2" '' ``
-is intended to resemble closely a real makefile, but with additional
-information provided and with variables expanded in those commands
-PMake actually printed or executed.
-.LP
-Something to be especially careful about is circular dependencies.
-.Ix 0 def dependency circular
-E.g.
-.DS
-a : b
-b : c d
-d : a
-.DE
-In this case, because of how PMake works,
-.CW c
-is the only thing PMake will examine, because
-.CW d
-and
-.CW a
-will effectively fall off the edge of the universe, making it
-impossible to examine
-.CW b
-(or them, for that matter).
-PMake will tell you (if run in its normal mode) all the targets
-involved in any cycle it looked at (i.e. if you have two cycles in the
-graph (naughty, naughty), but only try to make a target in one of
-them, PMake will only tell you about that one. You'll have to try to
-make the other to find the second cycle). When run as Make, it will
-only print the first target in the cycle.
-.xH 2 Invoking PMake
-.LP
-.Ix 0 ref flags
-.Ix 0 ref arguments
-.Ix 0 ref usage
-PMake comes with a wide variety of flags to choose from.
-They may appear in any order, interspersed with command-line variable
-assignments and targets to create.
-The flags are as follows:
-.IP "\fB\-d\fP \fIwhat\fP"
-.Ix 0 def flags -d
-.Ix 0 ref debugging
-This causes PMake to spew out debugging information that
-may prove useful to you. If you can't
-figure out why PMake is doing what it's doing, you might try using
-this flag. The
-.I what
-parameter is a string of single characters that tell PMake what
-aspects you are interested in. Most of what I describe will make
-little sense to you, unless you've dealt with Make before. Just
-remember where this table is and come back to it as you read on.
-The characters and the information they produce are as follows:
-.RS
-.IP a
-Archive searching and caching.
-.IP c
-Conditional evaluation.
-.IP d
-The searching and caching of directories.
-.IP j
-Various snippets of information related to the running of the multiple
-shells. Not particularly interesting.
-.IP m
-The making of each target: what target is being examined; when it was
-last modified; whether it is out-of-date; etc.
-.IP p
-Makefile parsing.
-.IP r
-Remote execution.
-.IP s
-The application of suffix-transformation rules. (See chapter 3)
-.IP t
-The maintenance of the list of targets.
-.IP v
-Variable assignment.
-.RE
-.IP "\&"
-Of these all, the
-.CW m
-and
-.CW s
-letters will be most useful to you.
-If the
-.B \-d
-is the final argument or the argument from which it would get these
-key letters (see below for a note about which argument would be used)
-begins with a
-.B \- ,
-all of these debugging flags will be set, resulting in massive amounts
-of output.
-.IP "\fB\-f\fP \fImakefile\fP"
-.Ix 0 def flags -f
-Specify a makefile to read different from the standard makefiles
-.CW Makefile "\&" (
-or
-.CW makefile ).
-.Ix 0 ref makefile default
-.Ix 0 ref makefile other
-If
-.I makefile
-is ``\-'', PMake uses the standard input. This is useful for making
-quick and dirty makefiles.\|.\|.
-.Ix 0 ref makefile "quick and dirty"
-.IP \fB\-h\fP
-.Ix 0 def flags -h
-Prints out a summary of the various flags PMake accepts. It can also
-be used to find out what level of concurrency was compiled into the
-version of PMake you are using (look at
-.B \-J
-and
-.B \-L )
-and various other information on how PMake was configured.
-.Ix 0 ref configuration
-.Ix 0 ref makefilesystem
-.IP \fB\-i\fP
-.Ix 0 def flags -i
-If you give this flag, PMake will ignore non-zero status returned
-by any of its shells. It's like placing a `\-' before all the commands
-in the makefile.
-.IP \fB\-k\fP
-.Ix 0 def flags -k
-This is similar to
-.B \-i
-in that it allows PMake to continue when it sees an error, but unlike
-.B \-i ,
-where PMake continues blithely as if nothing went wrong,
-.B \-k
-causes it to recognize the error and only continue work on those
-things that don't depend on the target, either directly or indirectly (through
-depending on something that depends on it), whose creation returned the error.
-The `k' is for ``keep going''.\|.\|.
-.Ix 0 ref target
-.IP \fB\-l\fP
-.Ix 0 def flags -l
-PMake has the ability to lock a directory against other
-people executing it in the same directory (by means of a file called
-``LOCK.make'' that it creates and checks for in the directory). This
-is a Good Thing because two people doing the same thing in the same place
-can be disastrous for the final product (too many cooks and all that).
-Whether this locking is the default is up to your system
-administrator. If locking is on,
-.B \-l
-will turn it off, and vice versa. Note that this locking will not
-prevent \fIyou\fP from invoking PMake twice in the same place \*- if
-you own the lock file, PMake will warn you about it but continue to execute.
-.IP "\fB\-m\fP \fIdirectory\fP"
-.Ix 0 def flags -m
-Tells PMake another place to search for included makefiles via the <...>
-style. Several
-.B \-m
-options can be given to form a search path. If this construct is used the
-default system makefile search path is completely overridden.
-To be explained in chapter 3, section 3.2.
-.Rm 2 3.2
-.IP \fB\-n\fP
-.Ix 0 def flags -n
-This flag tells PMake not to execute the commands needed to update the
-out-of-date targets in the makefile. Rather, PMake will simply print
-the commands it would have executed and exit. This is particularly
-useful for checking the correctness of a makefile. If PMake doesn't do
-what you expect it to, it's a good chance the makefile is wrong.
-.IP "\fB\-p\fP \fInumber\fP"
-.Ix 0 def flags -p
-.Ix 0 ref debugging
-This causes PMake to print its input in a reasonable form, though
-not necessarily one that would make immediate sense to anyone but me. The
-.I number
-is a bitwise-or of 1 and 2 where 1 means it should print the input
-before doing any processing and 2 says it should print it after
-everything has been re-created. Thus
-.CW "\-p 3"
-would print it twice\*-once before processing and once after (you
-might find the difference between the two interesting). This is mostly
-useful to me, but you may find it informative in some bizarre circumstances.
-.IP \fB\-q\fP
-.Ix 0 def flags -q
-If you give PMake this flag, it will not try to re-create anything. It
-will just see if anything is out-of-date and exit non-zero if so.
-.IP \fB\-r\fP
-.Ix 0 def flags -r
-When PMake starts up, it reads a default makefile that tells it what
-sort of system it's on and gives it some idea of what to do if you
-don't tell it anything. I'll tell you about it in chapter 3. If you
-give this flag, PMake won't read the default makefile.
-.IP \fB\-s\fP
-.Ix 0 def flags -s
-This causes PMake to not print commands before they're executed. It
-is the equivalent of putting an `@' before every command in the
-makefile.
-.IP \fB\-t\fP
-.Ix 0 def flags -t
-Rather than try to re-create a target, PMake will simply ``touch'' it
-so as to make it appear up-to-date. If the target didn't exist before,
-it will when PMake finishes, but if the target did exist, it will
-appear to have been updated.
-.IP \fB\-v\fP
-.Ix 0 def flags -v
-This is a mixed-compatibility flag intended to mimic the System V
-version of Make. It is the same as giving
-.B \-B ,
-and
-.B \-V
-as well as turning off directory locking. Targets can still be created
-in parallel, however. This is the mode PMake will enter if it is
-invoked either as
-.CW smake '' ``
-or
-.CW vmake ''. ``
-.IP \fB\-x\fP
-.Ix 0 def flags -x
-This tells PMake it's ok to export jobs to other machines, if they're
-available. It is used when running in Make mode, as exporting in this
-mode tends to make things run slower than if the commands were just
-executed locally.
-.IP \fB\-B\fP
-.Ix 0 ref compatibility
-.Ix 0 def flags -B
-Forces PMake to be as backwards-compatible with Make as possible while
-still being itself.
-This includes:
-.RS
-.IP \(bu 2
-Executing one shell per shell command
-.IP \(bu 2
-Expanding anything that looks even vaguely like a variable, with the
-empty string replacing any variable PMake doesn't know.
-.IP \(bu 2
-Refusing to allow you to escape a `#' with a backslash.
-.IP \(bu 2
-Permitting undefined variables on dependency lines and conditionals
-(see below). Normally this causes PMake to abort.
-.RE
-.IP \fB\-C\fP
-.Ix 0 def flags -C
-This nullifies any and all compatibility mode flags you may have given
-or implied up to the time the
-.B \-C
-is encountered. It is useful mostly in a makefile that you wrote for PMake
-to avoid bad things happening when someone runs PMake as
-.CW make '' ``
-or has things set in the environment that tell it to be compatible.
-.B \-C
-is
-.I not
-placed in the
-.CW PMAKE
-environment variable or the
-.CW .MAKEFLAGS
-or
-.CW MFLAGS
-global variables.
-.Ix 0 ref variable environment PMAKE
-.Ix 0 ref variable global .MAKEFLAGS
-.Ix 0 ref variable global MFLAGS
-.Ix 0 ref .MAKEFLAGS variable
-.Ix 0 ref MFLAGS
-.IP "\fB\-D\fP \fIvariable\fP"
-.Ix 0 def flags -D
-Allows you to define a variable to have
-.CW 1 '' ``
-as its value. The variable is a global variable, not a command-line
-variable. This is useful mostly for people who are used to the C
-compiler arguments and those using conditionals, which I'll get into
-in section 4.3
-.Rm 1 4.3
-.IP "\fB\-I\fP \fIdirectory\fP"
-.Ix 0 def flags -I
-Tells PMake another place to search for included makefiles. Yet
-another thing to be explained in chapter 3 (section 3.2, to be
-precise).
-.Rm 2 3.2
-.IP "\fB\-J\fP \fInumber\fP"
-.Ix 0 def flags -J
-Gives the absolute maximum number of targets to create at once on both
-local and remote machines.
-.IP "\fB\-L\fP \fInumber\fP"
-.Ix 0 def flags -L
-This specifies the maximum number of targets to create on the local
-machine at once. This may be 0, though you should be wary of doing
-this, as PMake may hang until a remote machine becomes available, if
-one is not available when it is started.
-.IP \fB\-M\fP
-.Ix 0 ref compatibility
-.Ix 0 def flags -M
-This is the flag that provides absolute, complete, full compatibility
-with Make. It still allows you to use all but a few of the features of
-PMake, but it is non-parallel. This is the mode PMake enters if you
-call it
-.CW make .'' ``
-.IP \fB\-P\fP
-.Ix 0 def flags -P
-.Ix 0 ref "output control"
-When creating targets in parallel, several shells are executing at
-once, each wanting to write its own two cent's-worth to the screen.
-This output must be captured by PMake in some way in order to prevent
-the screen from being filled with garbage even more indecipherable
-than you usually see. PMake has two ways of doing this, one of which
-provides for much cleaner output and a clear separation between the
-output of different jobs, the other of which provides a more immediate
-response so one can tell what is really happening. The former is done
-by notifying you when the creation of a target starts, capturing the
-output and transferring it to the screen all at once when the job
-finishes. The latter is done by catching the output of the shell (and
-its children) and buffering it until an entire line is received, then
-printing that line preceded by an indication of which job produced
-the output. Since I prefer this second method, it is the one used by
-default. The first method will be used if you give the
-.B \-P
-flag to PMake.
-.IP \fB\-V\fP
-.Ix 0 def flags -V
-As mentioned before, the
-.B \-V
-flag tells PMake to use Make's style of expanding variables,
-substituting the empty string for any variable it doesn't know.
-.IP \fB\-W\fP
-.Ix 0 def flags -W
-There are several times when PMake will print a message at you that is
-only a warning, i.e. it can continue to work in spite of your having
-done something silly (such as forgotten a leading tab for a shell
-command). Sometimes you are well aware of silly things you have done
-and would like PMake to stop bothering you. This flag tells it to shut
-up about anything non-fatal.
-.IP \fB\-X\fP
-.Ix 0 def flags -X
-This flag causes PMake to not attempt to export any jobs to another
-machine.
-.LP
-Several flags may follow a single `\-'. Those flags that require
-arguments take them from successive parameters. E.g.
-.DS
-pmake -fDnI server.mk DEBUG /chip2/X/server/include
-.DE
-will cause PMake to read
-.CW server.mk
-as the input makefile, define the variable
-.CW DEBUG
-as a global variable and look for included makefiles in the directory
-.CW /chip2/X/server/include .
-.xH 2 Summary
-.LP
-A makefile is made of four types of lines:
-.RS
-.IP \(bu 2
-Dependency lines
-.IP \(bu 2
-Creation commands
-.IP \(bu 2
-Variable assignments
-.IP \(bu 2
-Comments, include statements and conditional directives
-.RE
-.LP
-A dependency line is a list of one or more targets, an operator
-.CW : ', (`
-.CW :: ', `
-or
-.CW ! '), `
-and a list of zero or more sources. Sources may contain wildcards and
-certain local variables.
-.LP
-A creation command is a regular shell command preceded by a tab. In
-addition, if the first two characters after the tab (and other
-whitespace) are a combination of
-.CW @ ' `
-or
-.CW - ', `
-PMake will cause the command to not be printed (if the character is
-.CW @ ') `
-or errors from it to be ignored (if
-.CW - '). `
-A blank line, dependency line or variable assignment terminates a
-creation script. There may be only one creation script for each target
-with a
-.CW : ' `
-or
-.CW ! ' `
-operator.
-.LP
-Variables are places to store text. They may be unconditionally
-assigned-to using the
-.CW = ' `
-.Ix 0 ref =
-.Ix 0 ref variable assignment
-operator, appended-to using the
-.CW += ' `
-.Ix 0 ref +=
-.Ix 0 ref variable assignment appended
-operator, conditionally (if the variable is undefined) assigned-to
-with the
-.CW ?= ' `
-.Ix 0 ref ?=
-.Ix 0 ref variable assignment conditional
-operator, and assigned-to with variable expansion with the
-.CW := ' `
-.Ix 0 ref :=
-.Ix 0 ref variable assignment expanded
-operator. The output of a shell command may be assigned to a variable
-using the
-.CW != ' `
-.Ix 0 ref !=
-.Ix 0 ref variable assignment shell-output
-operator. Variables may be expanded (their value inserted) by enclosing
-their name in parentheses or curly braces, preceded by a dollar sign.
-A dollar sign may be escaped with another dollar sign. Variables are
-not expanded if PMake doesn't know about them. There are seven local
-variables:
-.CW .TARGET ,
-.CW .ALLSRC ,
-.CW .OODATE ,
-.CW .PREFIX ,
-.CW .IMPSRC ,
-.CW .ARCHIVE ,
-and
-.CW .MEMBER .
-Four of them
-.CW .TARGET , (
-.CW .PREFIX ,
-.CW .ARCHIVE ,
-and
-.CW .MEMBER )
-may be used to specify ``dynamic sources.''
-.Ix 0 ref "dynamic source"
-.Ix 0 ref source dynamic
-Variables are good. Know them. Love them. Live them.
-.LP
-Debugging of makefiles is best accomplished using the
-.B \-n ,
-.B "\-d m" ,
-and
-.B "\-p 2"
-flags.
-.xH 2 Exercises
-.ce
-\s+4\fBTBA\fP\s0
-.xH 1 Short-cuts and Other Nice Things
-.LP
-Based on what I've told you so far, you may have gotten the impression
-that PMake is just a way of storing away commands and making sure you
-don't forget to compile something. Good. That's just what it is.
-However, the ways I've described have been inelegant, at best, and
-painful, at worst.
-This chapter contains things that make the
-writing of makefiles easier and the makefiles themselves shorter and
-easier to modify (and, occasionally, simpler). In this chapter, I
-assume you are somewhat more
-familiar with Sprite (or UNIX, if that's what you're using) than I did
-in chapter 2, just so you're on your toes.
-So without further ado...
-.xH 2 Transformation Rules
-.LP
-As you know, a file's name consists of two parts: a base name, which
-gives some hint as to the contents of the file, and a suffix, which
-usually indicates the format of the file.
-Over the years, as
-.UX
-has developed,
-naming conventions, with regard to suffixes, have also developed that have
-become almost as incontrovertible as Law. E.g. a file ending in
-.CW .c
-is assumed to contain C source code; one with a
-.CW .o
-suffix is assumed to be a compiled, relocatable object file that may
-be linked into any program; a file with a
-.CW .ms
-suffix is usually a text file to be processed by Troff with the \-ms
-macro package, and so on.
-One of the best aspects of both Make and PMake comes from their
-understanding of how the suffix of a file pertains to its contents and
-their ability to do things with a file based solely on its suffix. This
-ability comes from something known as a transformation rule. A
-transformation rule specifies how to change a file with one suffix
-into a file with another suffix.
-.LP
-A transformation rule looks much like a dependency line, except the
-target is made of two known suffixes stuck together. Suffixes are made
-known to PMake by placing them as sources on a dependency line whose
-target is the special target
-.CW .SUFFIXES .
-E.g.
-.DS
-\&.SUFFIXES : .o .c
-\&.c.o :
- $(CC) $(CFLAGS) -c $(.IMPSRC)
-.DE
-The creation script attached to the target is used to transform a file with
-the first suffix (in this case,
-.CW .c )
-into a file with the second suffix (here,
-.CW .o ).
-In addition, the target inherits whatever attributes have been applied
-to the transformation rule.
-The simple rule given above says that to transform a C source file
-into an object file, you compile it using
-.CW cc
-with the
-.CW \-c
-flag.
-This rule is taken straight from the system makefile. Many
-transformation rules (and suffixes) are defined there, and I refer you
-to it for more examples (type
-.CW "pmake -h" '' ``
-to find out where it is).
-.LP
-There are several things to note about the transformation rule given
-above:
-.RS
-.IP 1)
-The
-.CW .IMPSRC
-variable.
-.Ix 0 def variable local .IMPSRC
-.Ix 0 def .IMPSRC
-This variable is set to the ``implied source'' (the file from which
-the target is being created; the one with the first suffix), which, in this
-case, is the .c file.
-.IP 2)
-The
-.CW CFLAGS
-variable. Almost all of the transformation rules in the system
-makefile are set up using variables that you can alter in your
-makefile to tailor the rule to your needs. In this case, if you want
-all your C files to be compiled with the
-.B \-g
-flag, to provide information for
-.CW dbx ,
-you would set the
-.CW CFLAGS
-variable to contain
-.CW -g
-.CW "CFLAGS = -g" '') (``
-and PMake would take care of the rest.
-.RE
-.LP
-To give you a quick example, the makefile in 2.3.4
-.Rm 3 2.3.4
-could be changed to this:
-.DS
-OBJS = a.o b.o c.o
-program : $(OBJS)
- $(CC) -o $(.TARGET) $(.ALLSRC)
-$(OBJS) : defs.h
-.DE
-The transformation rule I gave above takes the place of the 6 lines\**
-.FS
-This is also somewhat cleaner, I think, than the dynamic source
-solution presented in 2.6
-.FE
-.Rm 4 2.6
-.DS
-a.o : a.c
- cc -c a.c
-b.o : b.c
- cc -c b.c
-c.o : c.c
- cc -c c.c
-.DE
-.LP
-Now you may be wondering about the dependency between the
-.CW .o
-and
-.CW .c
-files \*- it's not mentioned anywhere in the new makefile. This is
-because it isn't needed: one of the effects of applying a
-transformation rule is the target comes to depend on the implied
-source. That's why it's called the implied
-.I source .
-.LP
-For a more detailed example. Say you have a makefile like this:
-.DS
-a.out : a.o b.o
- $(CC) $(.ALLSRC)
-.DE
-and a directory set up like this:
-.DS
-total 4
--rw-rw-r-- 1 deboor 34 Sep 7 00:43 Makefile
--rw-rw-r-- 1 deboor 119 Oct 3 19:39 a.c
--rw-rw-r-- 1 deboor 201 Sep 7 00:43 a.o
--rw-rw-r-- 1 deboor 69 Sep 7 00:43 b.c
-.DE
-While just typing
-.CW pmake '' ``
-will do the right thing, it's much more informative to type
-.CW "pmake -d s" ''. ``
-This will show you what PMake is up to as it processes the files. In
-this case, PMake prints the following:
-.DS
-Suff_FindDeps (a.out)
- using existing source a.o
- applying .o -> .out to "a.o"
-Suff_FindDeps (a.o)
- trying a.c...got it
- applying .c -> .o to "a.c"
-Suff_FindDeps (b.o)
- trying b.c...got it
- applying .c -> .o to "b.c"
-Suff_FindDeps (a.c)
- trying a.y...not there
- trying a.l...not there
- trying a.c,v...not there
- trying a.y,v...not there
- trying a.l,v...not there
-Suff_FindDeps (b.c)
- trying b.y...not there
- trying b.l...not there
- trying b.c,v...not there
- trying b.y,v...not there
- trying b.l,v...not there
---- a.o ---
-cc -c a.c
---- b.o ---
-cc -c b.c
---- a.out ---
-cc a.o b.o
-.DE
-.LP
-.CW Suff_FindDeps
-is the name of a function in PMake that is called to check for implied
-sources for a target using transformation rules.
-The transformations it tries are, naturally
-enough, limited to the ones that have been defined (a transformation
-may be defined multiple times, by the way, but only the most recent
-one will be used). You will notice, however, that there is a definite
-order to the suffixes that are tried. This order is set by the
-relative positions of the suffixes on the
-.CW .SUFFIXES
-line \*- the earlier a suffix appears, the earlier it is checked as
-the source of a transformation. Once a suffix has been defined, the
-only way to change its position in the pecking order is to remove all
-the suffixes (by having a
-.CW .SUFFIXES
-dependency line with no sources) and redefine them in the order you
-want. (Previously-defined transformation rules will be automatically
-redefined as the suffixes they involve are re-entered.)
-.LP
-Another way to affect the search order is to make the dependency
-explicit. In the above example,
-.CW a.out
-depends on
-.CW a.o
-and
-.CW b.o .
-Since a transformation exists from
-.CW .o
-to
-.CW .out ,
-PMake uses that, as indicated by the
-.CW "using existing source a.o" '' ``
-message.
-.LP
-The search for a transformation starts from the suffix of the target
-and continues through all the defined transformations, in the order
-dictated by the suffix ranking, until an existing file with the same
-base (the target name minus the suffix and any leading directories) is
-found. At that point, one or more transformation rules will have been
-found to change the one existing file into the target.
-.LP
-For example, ignoring what's in the system makefile for now, say you
-have a makefile like this:
-.DS
-\&.SUFFIXES : .out .o .c .y .l
-\&.l.c :
- lex $(.IMPSRC)
- mv lex.yy.c $(.TARGET)
-\&.y.c :
- yacc $(.IMPSRC)
- mv y.tab.c $(.TARGET)
-\&.c.o :
- cc -c $(.IMPSRC)
-\&.o.out :
- cc -o $(.TARGET) $(.IMPSRC)
-.DE
-and the single file
-.CW jive.l .
-If you were to type
-.CW "pmake -rd ms jive.out" ,'' ``
-you would get the following output for
-.CW jive.out :
-.DS
-Suff_FindDeps (jive.out)
- trying jive.o...not there
- trying jive.c...not there
- trying jive.y...not there
- trying jive.l...got it
- applying .l -> .c to "jive.l"
- applying .c -> .o to "jive.c"
- applying .o -> .out to "jive.o"
-.DE
-and this is why: PMake starts with the target
-.CW jive.out ,
-figures out its suffix
-.CW .out ) (
-and looks for things it can transform to a
-.CW .out
-file. In this case, it only finds
-.CW .o ,
-so it looks for the file
-.CW jive.o .
-It fails to find it, so it looks for transformations into a
-.CW .o
-file. Again it has only one choice:
-.CW .c .
-So it looks for
-.CW jive.c
-and, as you know, fails to find it. At this point it has two choices:
-it can create the
-.CW .c
-file from either a
-.CW .y
-file or a
-.CW .l
-file. Since
-.CW .y
-came first on the
-.CW .SUFFIXES
-line, it checks for
-.CW jive.y
-first, but can't find it, so it looks for
-.CW jive.l
-and, lo and behold, there it is.
-At this point, it has defined a transformation path as follows:
-.CW .l
-\(->
-.CW .c
-\(->
-.CW .o
-\(->
-.CW .out
-and applies the transformation rules accordingly. For completeness,
-and to give you a better idea of what PMake actually did with this
-three-step transformation, this is what PMake printed for the rest of
-the process:
-.DS
-Suff_FindDeps (jive.o)
- using existing source jive.c
- applying .c -> .o to "jive.c"
-Suff_FindDeps (jive.c)
- using existing source jive.l
- applying .l -> .c to "jive.l"
-Suff_FindDeps (jive.l)
-Examining jive.l...modified 17:16:01 Oct 4, 1987...up-to-date
-Examining jive.c...non-existent...out-of-date
---- jive.c ---
-lex jive.l
-\&.\|.\|. meaningless lex output deleted .\|.\|.
-mv lex.yy.c jive.c
-Examining jive.o...non-existent...out-of-date
---- jive.o ---
-cc -c jive.c
-Examining jive.out...non-existent...out-of-date
---- jive.out ---
-cc -o jive.out jive.o
-.DE
-.LP
-One final question remains: what does PMake do with targets that have
-no known suffix? PMake simply pretends it actually has a known suffix
-and searches for transformations accordingly.
-The suffix it chooses is the source for the
-.CW .NULL
-.Ix 0 ref .NULL
-target mentioned later. In the system makefile,
-.CW .out
-is chosen as the ``null suffix''
-.Ix 0 def suffix null
-.Ix 0 def "null suffix"
-because most people use PMake to create programs. You are, however,
-free and welcome to change it to a suffix of your own choosing.
-The null suffix is ignored, however, when PMake is in compatibility
-mode (see chapter 4).
-.xH 2 Including Other Makefiles
-.Ix 0 def makefile inclusion
-.Rd 2
-.LP
-Just as for programs, it is often useful to extract certain parts of a
-makefile into another file and just include it in other makefiles
-somehow. Many compilers allow you say something like
-.DS
-#include "defs.h"
-.DE
-to include the contents of
-.CW defs.h
-in the source file. PMake allows you to do the same thing for
-makefiles, with the added ability to use variables in the filenames.
-An include directive in a makefile looks either like this:
-.DS
-#include <file>
-.DE
-or this
-.DS
-#include "file"
-.DE
-The difference between the two is where PMake searches for the file:
-the first way, PMake will look for
-the file only in the system makefile directory (or directories)
-(to find out what that directory is, give PMake the
-.B \-h
-flag).
-.Ix 0 ref flags -h
-The system makefile directory search path can be overridden via the
-.B \-m
-option.
-.Ix 0 ref flags -m
-For files in double-quotes, the search is more complex:
-.RS
-.IP 1)
-The directory of the makefile that's including the file.
-.IP 2)
-The current directory (the one in which you invoked PMake).
-.IP 3)
-The directories given by you using
-.B \-I
-flags, in the order in which you gave them.
-.IP 4)
-Directories given by
-.CW .PATH
-dependency lines (see chapter 4).
-.IP 5)
-The system makefile directory.
-.RE
-.LP
-in that order.
-.LP
-You are free to use PMake variables in the filename\*-PMake will
-expand them before searching for the file. You must specify the
-searching method with either angle brackets or double-quotes
-.I outside
-of a variable expansion. I.e. the following
-.DS
-SYSTEM = <command.mk>
-
-#include $(SYSTEM)
-.DE
-won't work.
-.xH 2 Saving Commands
-.LP
-.Ix 0 def ...
-There may come a time when you will want to save certain commands to
-be executed when everything else is done. For instance: you're
-making several different libraries at one time and you want to create the
-members in parallel. Problem is,
-.CW ranlib
-is another one of those programs that can't be run more than once in
-the same directory at the same time (each one creates a file called
-.CW __.SYMDEF
-into which it stuffs information for the linker to use. Two of them
-running at once will overwrite each other's file and the result will
-be garbage for both parties). You might want a way to save the ranlib
-commands til the end so they can be run one after the other, thus
-keeping them from trashing each other's file. PMake allows you to do
-this by inserting an ellipsis (``.\|.\|.'') as a command between
-commands to be run at once and those to be run later.
-.LP
-So for the
-.CW ranlib
-case above, you might do this:
-.Rd 5
-.DS
-lib1.a : $(LIB1OBJS)
- rm -f $(.TARGET)
- ar cr $(.TARGET) $(.ALLSRC)
- ...
- ranlib $(.TARGET)
-
-lib2.a : $(LIB2OBJS)
- rm -f $(.TARGET)
- ar cr $(.TARGET) $(.ALLSRC)
- ...
- ranlib $(.TARGET)
-.DE
-.Ix 0 ref variable local .TARGET
-.Ix 0 ref variable local .ALLSRC
-This would save both
-.DS
-ranlib $(.TARGET)
-.DE
-commands until the end, when they would run one after the other
-(using the correct value for the
-.CW .TARGET
-variable, of course).
-.LP
-Commands saved in this manner are only executed if PMake manages to
-re-create everything without an error.
-.xH 2 Target Attributes
-.LP
-PMake allows you to give attributes to targets by means of special
-sources. Like everything else PMake uses, these sources begin with a
-period and are made up of all upper-case letters. There are various
-reasons for using them, and I will try to give examples for most of
-them. Others you'll have to find uses for yourself. Think of it as ``an
-exercise for the reader.'' By placing one (or more) of these as a source on a
-dependency line, you are ``marking the target(s) with that
-attribute.'' That's just the way I phrase it, so you know.
-.LP
-Any attributes given as sources for a transformation rule are applied
-to the target of the transformation rule when the rule is applied.
-.Ix 0 def attributes
-.Ix 0 ref source
-.Ix 0 ref target
-.nr pw 12
-.IP .DONTCARE \n(pw
-.Ix 0 def attributes .DONTCARE
-.Ix 0 def .DONTCARE
-If a target is marked with this attribute and PMake can't figure out
-how to create it, it will ignore this fact and assume the file isn't
-really needed or actually exists and PMake just can't find it. This may prove
-wrong, but the error will be noted later on, not when PMake tries to create
-the target so marked. This attribute also prevents PMake from
-attempting to touch the target if it is given the
-.B \-t
-flag.
-.Ix 0 ref flags -t
-.IP .EXEC \n(pw
-.Ix 0 def attributes .EXEC
-.Ix 0 def .EXEC
-This attribute causes its shell script to be executed while having no
-effect on targets that depend on it. This makes the target into a sort
-of subroutine. An example. Say you have some LISP files that need to
-be compiled and loaded into a LISP process. To do this, you echo LISP
-commands into a file and execute a LISP with this file as its input
-when everything's done. Say also that you have to load other files
-from another system before you can compile your files and further,
-that you don't want to go through the loading and dumping unless one
-of
-.I your
-files has changed. Your makefile might look a little bit
-like this (remember, this is an educational example, and don't worry
-about the
-.CW COMPILE
-rule, all will soon become clear, grasshopper):
-.DS
-system : init a.fasl b.fasl c.fasl
- for i in $(.ALLSRC);
- do
- echo -n '(load "' >> input
- echo -n ${i} >> input
- echo '")' >> input
- done
- echo '(dump "$(.TARGET)")' >> input
- lisp < input
-
-a.fasl : a.l init COMPILE
-b.fasl : b.l init COMPILE
-c.fasl : c.l init COMPILE
-COMPILE : .USE
- echo '(compile "$(.ALLSRC)")' >> input
-init : .EXEC
- echo '(load-system)' > input
-.DE
-.Ix 0 ref .USE
-.Ix 0 ref attributes .USE
-.Ix 0 ref variable local .ALLSRC
-.IP "\&"
-.CW .EXEC
-sources, don't appear in the local variables of targets that depend on
-them (nor are they touched if PMake is given the
-.B \-t
-flag).
-.Ix 0 ref flags -t
-Note that all the rules, not just that for
-.CW system ,
-include
-.CW init
-as a source. This is because none of the other targets can be made
-until
-.CW init
-has been made, thus they depend on it.
-.IP .EXPORT \n(pw
-.Ix 0 def attributes .EXPORT
-.Ix 0 def .EXPORT
-This is used to mark those targets whose creation should be sent to
-another machine if at all possible. This may be used by some
-exportation schemes if the exportation is expensive. You should ask
-your system administrator if it is necessary.
-.IP .EXPORTSAME \n(pw
-.Ix 0 def attributes .EXPORTSAME
-.Ix 0 def .EXPORTSAME
-Tells the export system that the job should be exported to a machine
-of the same architecture as the current one. Certain operations (e.g.
-running text through
-.CW nroff )
-can be performed the same on any architecture (CPU and
-operating system type), while others (e.g. compiling a program with
-.CW cc )
-must be performed on a machine with the same architecture. Not all
-export systems will support this attribute.
-.IP .IGNORE \n(pw
-.Ix 0 def attributes .IGNORE
-.Ix 0 def .IGNORE attribute
-Giving a target the
-.CW .IGNORE
-attribute causes PMake to ignore errors from any of the target's commands, as
-if they all had `\-' before them.
-.IP .INVISIBLE \n(pw
-.Ix 0 def attributes .INVISIBLE
-.Ix 0 def .INVISIBLE
-This allows you to specify one target as a source for another without
-the one affecting the other's local variables. Useful if, say, you
-have a makefile that creates two programs, one of which is used to
-create the other, so it must exist before the other is created. You
-could say
-.DS
-prog1 : $(PROG1OBJS) prog2 MAKEINSTALL
-prog2 : $(PROG2OBJS) .INVISIBLE MAKEINSTALL
-.DE
-where
-.CW MAKEINSTALL
-is some complex .USE rule (see below) that depends on the
-.Ix 0 ref .USE
-.CW .ALLSRC
-variable containing the right things. Without the
-.CW .INVISIBLE
-attribute for
-.CW prog2 ,
-the
-.CW MAKEINSTALL
-rule couldn't be applied. This is not as useful as it should be, and
-the semantics may change (or the whole thing go away) in the
-not-too-distant future.
-.IP .JOIN \n(pw
-.Ix 0 def attributes .JOIN
-.Ix 0 def .JOIN
-This is another way to avoid performing some operations in parallel
-while permitting everything else to be done so. Specifically it
-forces the target's shell script to be executed only if one or more of the
-sources was out-of-date. In addition, the target's name,
-in both its
-.CW .TARGET
-variable and all the local variables of any target that depends on it,
-is replaced by the value of its
-.CW .ALLSRC
-variable.
-As an example, suppose you have a program that has four libraries that
-compile in the same directory along with, and at the same time as, the
-program. You again have the problem with
-.CW ranlib
-that I mentioned earlier, only this time it's more severe: you
-can't just put the ranlib off to the end since the program
-will need those libraries before it can be re-created. You can do
-something like this:
-.DS
-program : $(OBJS) libraries
- cc -o $(.TARGET) $(.ALLSRC)
-
-libraries : lib1.a lib2.a lib3.a lib4.a .JOIN
- ranlib $(.OODATE)
-.DE
-.Ix 0 ref variable local .TARGET
-.Ix 0 ref variable local .ALLSRC
-.Ix 0 ref variable local .OODATE
-.Ix 0 ref .TARGET
-.Ix 0 ref .ALLSRC
-.Ix 0 ref .OODATE
-In this case, PMake will re-create the
-.CW $(OBJS)
-as necessary, along with
-.CW lib1.a ,
-.CW lib2.a ,
-.CW lib3.a
-and
-.CW lib4.a .
-It will then execute
-.CW ranlib
-on any library that was changed and set
-.CW program 's
-.CW .ALLSRC
-variable to contain what's in
-.CW $(OBJS)
-followed by
-.CW "lib1.a lib2.a lib3.a lib4.a" .'' ``
-In case you're wondering, it's called
-.CW .JOIN
-because it joins together different threads of the ``input graph'' at
-the target marked with the attribute.
-Another aspect of the .JOIN attribute is it keeps the target from
-being created if the
-.B \-t
-flag was given.
-.Ix 0 ref flags -t
-.IP .MAKE \n(pw
-.Ix 0 def attributes .MAKE
-.Ix 0 def .MAKE
-The
-.CW .MAKE
-attribute marks its target as being a recursive invocation of PMake.
-This forces PMake to execute the script associated with the target (if
-it's out-of-date) even if you gave the
-.B \-n
-or
-.B \-t
-flag. By doing this, you can start at the top of a system and type
-.DS
-pmake -n
-.DE
-and have it descend the directory tree (if your makefiles are set up
-correctly), printing what it would have executed if you hadn't
-included the
-.B \-n
-flag.
-.IP .NOEXPORT \n(pw
-.Ix 0 def attributes .NOEXPORT
-.Ix 0 def .NOEXPORT attribute
-If possible, PMake will attempt to export the creation of all targets to
-another machine (this depends on how PMake was configured). Sometimes,
-the creation is so simple, it is pointless to send it to another
-machine. If you give the target the
-.CW .NOEXPORT
-attribute, it will be run locally, even if you've given PMake the
-.B "\-L 0"
-flag.
-.IP .NOTMAIN \n(pw
-.Ix 0 def attributes .NOTMAIN
-.Ix 0 def .NOTMAIN
-Normally, if you do not specify a target to make in any other way,
-PMake will take the first target on the first dependency line of a
-makefile as the target to create. That target is known as the ``Main
-Target'' and is labeled as such if you print the dependencies out
-using the
-.B \-p
-flag.
-.Ix 0 ref flags -p
-Giving a target this attribute tells PMake that the target is
-definitely
-.I not
-the Main Target.
-This allows you to place targets in an included makefile and
-have PMake create something else by default.
-.IP .PRECIOUS \n(pw
-.Ix 0 def attributes .PRECIOUS
-.Ix 0 def .PRECIOUS attribute
-When PMake is interrupted (you type control-C at the keyboard), it
-will attempt to clean up after itself by removing any half-made
-targets. If a target has the
-.CW .PRECIOUS
-attribute, however, PMake will leave it alone. An additional side
-effect of the `::' operator is to mark the targets as
-.CW .PRECIOUS .
-.Ix 0 ref operator double-colon
-.Ix 0 ref ::
-.IP .SILENT \n(pw
-.Ix 0 def attributes .SILENT
-.Ix 0 def .SILENT attribute
-Marking a target with this attribute keeps its commands from being
-printed when they're executed, just as if they had an `@' in front of them.
-.IP .USE \n(pw
-.Ix 0 def attributes .USE
-.Ix 0 def .USE
-By giving a target this attribute, you turn it into PMake's equivalent
-of a macro. When the target is used as a source for another target,
-the other target acquires the commands, sources and attributes (except
-.CW .USE )
-of the source.
-If the target already has commands, the
-.CW .USE
-target's commands are added to the end. If more than one .USE-marked
-source is given to a target, the rules are applied sequentially.
-.IP "\&" \n(pw
-The typical .USE rule (as I call them) will use the sources of the
-target to which it is applied (as stored in the
-.CW .ALLSRC
-variable for the target) as its ``arguments,'' if you will.
-For example, you probably noticed that the commands for creating
-.CW lib1.a
-and
-.CW lib2.a
-in the example in section 3.3
-.Rm 5 3.3
-were exactly the same. You can use the
-.CW .USE
-attribute to eliminate the repetition, like so:
-.DS
-lib1.a : $(LIB1OBJS) MAKELIB
-lib2.a : $(LIB2OBJS) MAKELIB
-
-MAKELIB : .USE
- rm -f $(.TARGET)
- ar cr $(.TARGET) $(.ALLSRC)
- ...
- ranlib $(.TARGET)
-.DE
-.Ix 0 ref variable local .TARGET
-.Ix 0 ref variable local .ALLSRC
-.IP "\&" \n(pw
-Several system makefiles (not to be confused with The System Makefile)
-make use of these .USE rules to make your
-life easier (they're in the default, system makefile directory...take a look).
-Note that the .USE rule source itself
-.CW MAKELIB ) (
-does not appear in any of the targets's local variables.
-There is no limit to the number of times I could use the
-.CW MAKELIB
-rule. If there were more libraries, I could continue with
-.CW "lib3.a : $(LIB3OBJS) MAKELIB" '' ``
-and so on and so forth.
-.xH 2 Special Targets
-.LP
-As there were in Make, so there are certain targets that have special
-meaning to PMake. When you use one on a dependency line, it is the
-only target that may appear on the left-hand-side of the operator.
-.Ix 0 ref target
-.Ix 0 ref operator
-As for the attributes and variables, all the special targets
-begin with a period and consist of upper-case letters only.
-I won't describe them all in detail because some of them are rather
-complex and I'll describe them in more detail than you'll want in
-chapter 4.
-The targets are as follows:
-.nr pw 10
-.IP .BEGIN \n(pw
-.Ix 0 def .BEGIN
-Any commands attached to this target are executed before anything else
-is done. You can use it for any initialization that needs doing.
-.IP .DEFAULT \n(pw
-.Ix 0 def .DEFAULT
-This is sort of a .USE rule for any target (that was used only as a
-source) that PMake can't figure out any other way to create. It's only
-``sort of'' a .USE rule because only the shell script attached to the
-.CW .DEFAULT
-target is used. The
-.CW .IMPSRC
-variable of a target that inherits
-.CW .DEFAULT 's
-commands is set to the target's own name.
-.Ix 0 ref .IMPSRC
-.Ix 0 ref variable local .IMPSRC
-.IP .END \n(pw
-.Ix 0 def .END
-This serves a function similar to
-.CW .BEGIN ,
-in that commands attached to it are executed once everything has been
-re-created (so long as no errors occurred). It also serves the extra
-function of being a place on which PMake can hang commands you put off
-to the end. Thus the script for this target will be executed before
-any of the commands you save with the ``.\|.\|.''.
-.Ix 0 ref ...
-.IP .EXPORT \n(pw
-The sources for this target are passed to the exportation system compiled
-into PMake. Some systems will use these sources to configure
-themselves. You should ask your system administrator about this.
-.IP .IGNORE \n(pw
-.Ix 0 def .IGNORE target
-.Ix 0 ref .IGNORE attribute
-.Ix 0 ref attributes .IGNORE
-This target marks each of its sources with the
-.CW .IGNORE
-attribute. If you don't give it any sources, then it is like
-giving the
-.B \-i
-flag when you invoke PMake \*- errors are ignored for all commands.
-.Ix 0 ref flags -i
-.IP .INCLUDES \n(pw
-.Ix 0 def .INCLUDES target
-.Ix 0 def variable global .INCLUDES
-.Ix 0 def .INCLUDES variable
-The sources for this target are taken to be suffixes that indicate a
-file that can be included in a program source file.
-The suffix must have already been declared with
-.CW .SUFFIXES
-(see below).
-Any suffix so marked will have the directories on its search path
-(see
-.CW .PATH ,
-below) placed in the
-.CW .INCLUDES
-variable, each preceded by a
-.B \-I
-flag. This variable can then be used as an argument for the compiler
-in the normal fashion. The
-.CW .h
-suffix is already marked in this way in the system makefile.
-.Ix 0 ref makefilesystem
-E.g. if you have
-.DS
-\&.SUFFIXES : .bitmap
-\&.PATH.bitmap : /usr/local/X/lib/bitmaps
-\&.INCLUDES : .bitmap
-.DE
-PMake will place
-.CW "-I/usr/local/X/lib/bitmaps" '' ``
-in the
-.CW .INCLUDES
-variable and you can then say
-.DS
-cc $(.INCLUDES) -c xprogram.c
-.DE
-(Note: the
-.CW .INCLUDES
-variable is not actually filled in until the entire makefile has been read.)
-.IP .INTERRUPT \n(pw
-.Ix 0 def .INTERRUPT
-When PMake is interrupted,
-it will execute the commands in the script for this target, if it
-exists.
-.IP .LIBS \n(pw
-.Ix 0 def .LIBS target
-.Ix 0 def .LIBS variable
-.Ix 0 def variable global .LIBS
-This does for libraries what
-.CW .INCLUDES
-does for include files, except the flag used is
-.B \-L ,
-as required by those linkers that allow you to tell them where to find
-libraries. The variable used is
-.CW .LIBS .
-Be forewarned that PMake may not have been compiled to do this if the
-linker on your system doesn't accept the
-.B \-L
-flag, though the
-.CW .LIBS
-variable will always be defined once the makefile has been read.
-.IP .MAIN \n(pw
-.Ix 0 def .MAIN
-If you didn't give a target (or targets) to create when you invoked
-PMake, it will take the sources of this target as the targets to
-create.
-.IP .MAKEFLAGS \n(pw
-.Ix 0 def .MAKEFLAGS target
-This target provides a way for you to always specify flags for PMake
-when the makefile is used. The flags are just as they would be typed
-to the shell (except you can't use shell variables unless they're in
-the environment),
-though the
-.B \-f
-and
-.B \-r
-flags have no effect.
-.IP .NULL \n(pw
-.Ix 0 def .NULL
-.Ix 0 ref suffix null
-.Ix 0 ref "null suffix"
-This allows you to specify what suffix PMake should pretend a file has
-if, in fact, it has no known suffix. Only one suffix may be so
-designated. The last source on the dependency line is the suffix that
-is used (you should, however, only give one suffix.\|.\|.).
-.IP .PATH \n(pw
-.Ix 0 def .PATH
-If you give sources for this target, PMake will take them as
-directories in which to search for files it cannot find in the current
-directory. If you give no sources, it will clear out any directories
-added to the search path before. Since the effects of this all get
-very complex, I'll leave it til chapter four to give you a complete
-explanation.
-.IP .PATH\fIsuffix\fP \n(pw
-.Ix 0 ref .PATH
-This does a similar thing to
-.CW .PATH ,
-but it does it only for files with the given suffix. The suffix must
-have been defined already. Look at
-.B "Search Paths"
-(section 4.1)
-.Rm 6 4.1
-for more information.
-.IP .PRECIOUS \n(pw
-.Ix 0 def .PRECIOUS target
-.Ix 0 ref .PRECIOUS attribute
-.Ix 0 ref attributes .PRECIOUS
-Similar to
-.CW .IGNORE ,
-this gives the
-.CW .PRECIOUS
-attribute to each source on the dependency line, unless there are no
-sources, in which case the
-.CW .PRECIOUS
-attribute is given to every target in the file.
-.IP .RECURSIVE \n(pw
-.Ix 0 def .RECURSIVE
-.Ix 0 ref attributes .MAKE
-.Ix 0 ref .MAKE
-This target applies the
-.CW .MAKE
-attribute to all its sources. It does nothing if you don't give it any sources.
-.IP .SHELL \n(pw
-.Ix 0 def .SHELL
-PMake is not constrained to only using the Bourne shell to execute
-the commands you put in the makefile. You can tell it some other shell
-to use with this target. Check out
-.B "A Shell is a Shell is a Shell"
-(section 4.4)
-.Rm 7 4.4
-for more information.
-.IP .SILENT \n(pw
-.Ix 0 def .SILENT target
-.Ix 0 ref .SILENT attribute
-.Ix 0 ref attributes .SILENT
-When you use
-.CW .SILENT
-as a target, it applies the
-.CW .SILENT
-attribute to each of its sources. If there are no sources on the
-dependency line, then it is as if you gave PMake the
-.B \-s
-flag and no commands will be echoed.
-.IP .SUFFIXES \n(pw
-.Ix 0 def .SUFFIXES
-This is used to give new file suffixes for PMake to handle. Each
-source is a suffix PMake should recognize. If you give a
-.CW .SUFFIXES
-dependency line with no sources, PMake will forget about all the
-suffixes it knew (this also nukes the null suffix).
-For those targets that need to have suffixes defined, this is how you do it.
-.LP
-In addition to these targets, a line of the form
-.DS
-\fIattribute\fP : \fIsources\fP
-.DE
-applies the
-.I attribute
-to all the targets listed as
-.I sources .
-.xH 2 Modifying Variable Expansion
-.LP
-.Ix 0 def variable expansion modified
-.Ix 0 ref variable expansion
-.Ix 0 def variable modifiers
-Variables need not always be expanded verbatim. PMake defines several
-modifiers that may be applied to a variable's value before it is
-expanded. You apply a modifier by placing it after the variable name
-with a colon between the two, like so:
-.DS
-${\fIVARIABLE\fP:\fImodifier\fP}
-.DE
-Each modifier is a single character followed by something specific to
-the modifier itself.
-You may apply as many modifiers as you want \*- each one is applied to
-the result of the previous and is separated from the previous by
-another colon.
-.LP
-There are seven ways to modify a variable's expansion, most of which
-come from the C shell variable modification characters:
-.RS
-.IP "M\fIpattern\fP"
-.Ix 0 def :M
-.Ix 0 def modifier match
-This is used to select only those words (a word is a series of
-characters that are neither spaces nor tabs) that match the given
-.I pattern .
-The pattern is a wildcard pattern like that used by the shell, where
-.CW *
-means 0 or more characters of any sort;
-.CW ?
-is any single character;
-.CW [abcd]
-matches any single character that is either `a', `b', `c' or `d'
-(there may be any number of characters between the brackets);
-.CW [0-9]
-matches any single character that is between `0' and `9' (i.e. any
-digit. This form may be freely mixed with the other bracket form), and
-`\\' is used to escape any of the characters `*', `?', `[' or `:',
-leaving them as regular characters to match themselves in a word.
-For example, the system makefile
-.CW <makedepend.mk>
-uses
-.CW "$(CFLAGS:M-[ID]*)" '' ``
-to extract all the
-.CW \-I
-and
-.CW \-D
-flags that would be passed to the C compiler. This allows it to
-properly locate include files and generate the correct dependencies.
-.IP "N\fIpattern\fP"
-.Ix 0 def :N
-.Ix 0 def modifier nomatch
-This is identical to
-.CW :M
-except it substitutes all words that don't match the given pattern.
-.IP "S/\fIsearch-string\fP/\fIreplacement-string\fP/[g]"
-.Ix 0 def :S
-.Ix 0 def modifier substitute
-Causes the first occurrence of
-.I search-string
-in the variable to be replaced by
-.I replacement-string ,
-unless the
-.CW g
-flag is given at the end, in which case all occurrences of the string
-are replaced. The substitution is performed on each word in the
-variable in turn. If
-.I search-string
-begins with a
-.CW ^ ,
-the string must match starting at the beginning of the word. If
-.I search-string
-ends with a
-.CW $ ,
-the string must match to the end of the word (these two may be
-combined to force an exact match). If a backslash precedes these two
-characters, however, they lose their special meaning. Variable
-expansion also occurs in the normal fashion inside both the
-.I search-string
-and the
-.I replacement-string ,
-.B except
-that a backslash is used to prevent the expansion of a
-.CW $ ,
-not another dollar sign, as is usual.
-Note that
-.I search-string
-is just a string, not a pattern, so none of the usual
-regular-expression/wildcard characters have any special meaning save
-.CW ^
-and
-.CW $ .
-In the replacement string,
-the
-.CW &
-character is replaced by the
-.I search-string
-unless it is preceded by a backslash.
-You are allowed to use any character except
-colon or exclamation point to separate the two strings. This so-called
-delimiter character may be placed in either string by preceding it
-with a backslash.
-.IP T
-.Ix 0 def :T
-.Ix 0 def modifier tail
-Replaces each word in the variable expansion by its last
-component (its ``tail''). For example, given
-.DS
-OBJS = ../lib/a.o b /usr/lib/libm.a
-TAILS = $(OBJS:T)
-.DE
-the variable
-.CW TAILS
-would expand to
-.CW "a.o b libm.a" .'' ``
-.IP H
-.Ix 0 def :H
-.Ix 0 def modifier head
-This is similar to
-.CW :T ,
-except that every word is replaced by everything but the tail (the
-``head''). Using the same definition of
-.CW OBJS ,
-the string
-.CW "$(OBJS:H)" '' ``
-would expand to
-.CW "../lib /usr/lib" .'' ``
-Note that the final slash on the heads is removed and
-anything without a head is replaced by the empty string.
-.IP E
-.Ix 0 def :E
-.Ix 0 def modifier extension
-.Ix 0 def modifier suffix
-.Ix 0 ref suffix "variable modifier"
-.CW :E
-replaces each word by its suffix (``extension''). So
-.CW "$(OBJS:E)" '' ``
-would give you
-.CW ".o .a" .'' ``
-.IP R
-.Ix 0 def :R
-.Ix 0 def modifier root
-.Ix 0 def modifier base
-This replaces each word by everything but the suffix (the ``root'' of
-the word).
-.CW "$(OBJS:R)" '' ``
-expands to ``
-.CW "../lib/a b /usr/lib/libm" .''
-.RE
-.LP
-In addition, the System V style of substitution is also supported.
-This looks like:
-.DS
-$(\fIVARIABLE\fP:\fIsearch-string\fP=\fIreplacement\fP)
-.DE
-It must be the last modifier in the chain. The search is anchored at
-the end of each word, so only suffixes or whole words may be replaced.
-.xH 2 More on Debugging
-.xH 2 More Exercises
-.IP (3.1)
-You've got a set programs, each of which is created from its own
-assembly-language source file (suffix
-.CW .asm ).
-Each program can be assembled into two versions, one with error-checking
-code assembled in and one without. You could assemble them into files
-with different suffixes
-.CW .eobj \& (
-and
-.CW .obj ,
-for instance), but your linker only understands files that end in
-.CW .obj .
-To top it all off, the final executables
-.I must
-have the suffix
-.CW .exe .
-How can you still use transformation rules to make your life easier
-(Hint: assume the error-checking versions have
-.CW ec
-tacked onto their prefix)?
-.IP (3.2)
-Assume, for a moment or two, you want to perform a sort of
-``indirection'' by placing the name of a variable into another one,
-then you want to get the value of the first by expanding the second
-somehow. Unfortunately, PMake doesn't allow constructs like
-.DS I
-$($(FOO))
-.DE
-What do you do? Hint: no further variable expansion is performed after
-modifiers are applied, thus if you cause a $ to occur in the
-expansion, that's what will be in the result.
-.xH 1 PMake for Gods
-.LP
-This chapter is devoted to those facilities in PMake that allow you to
-do a great deal in a makefile with very little work, as well as do
-some things you couldn't do in Make without a great deal of work (and
-perhaps the use of other programs). The problem with these features,
-is they must be handled with care, or you will end up with a mess.
-.LP
-Once more, I assume a greater familiarity with
-.UX
-or Sprite than I did in the previous two chapters.
-.xH 2 Search Paths
-.Rd 6
-.LP
-PMake supports the dispersal of files into multiple directories by
-allowing you to specify places to look for sources with
-.CW .PATH
-targets in the makefile. The directories you give as sources for these
-targets make up a ``search path.'' Only those files used exclusively
-as sources are actually sought on a search path, the assumption being
-that anything listed as a target in the makefile can be created by the
-makefile and thus should be in the current directory.
-.LP
-There are two types of search paths
-in PMake: one is used for all types of files (including included
-makefiles) and is specified with a plain
-.CW .PATH
-target (e.g.
-.CW ".PATH : RCS" ''), ``
-while the other is specific to a certain type of file, as indicated by
-the file's suffix. A specific search path is indicated by immediately following
-the
-.CW .PATH
-with the suffix of the file. For instance
-.DS
-\&.PATH.h : /sprite/lib/include /sprite/att/lib/include
-.DE
-would tell PMake to look in the directories
-.CW /sprite/lib/include
-and
-.CW /sprite/att/lib/include
-for any files whose suffix is
-.CW .h .
-.LP
-The current directory is always consulted first to see if a file
-exists. Only if it cannot be found there are the directories in the
-specific search path, followed by those in the general search path,
-consulted.
-.LP
-A search path is also used when expanding wildcard characters. If the
-pattern has a recognizable suffix on it, the path for that suffix will
-be used for the expansion. Otherwise the default search path is employed.
-.LP
-When a file is found in some directory other than the current one, all
-local variables that would have contained the target's name
-.CW .ALLSRC , (
-and
-.CW .IMPSRC )
-will instead contain the path to the file, as found by PMake.
-Thus if you have a file
-.CW ../lib/mumble.c
-and a makefile
-.DS
-\&.PATH.c : ../lib
-mumble : mumble.c
- $(CC) -o $(.TARGET) $(.ALLSRC)
-.DE
-the command executed to create
-.CW mumble
-would be
-.CW "cc -o mumble ../lib/mumble.c" .'' ``
-(As an aside, the command in this case isn't strictly necessary, since
-it will be found using transformation rules if it isn't given. This is because
-.CW .out
-is the null suffix by default and a transformation exists from
-.CW .c
-to
-.CW .out .
-Just thought I'd throw that in.)
-.LP
-If a file exists in two directories on the same search path, the file
-in the first directory on the path will be the one PMake uses. So if
-you have a large system spread over many directories, it would behoove
-you to follow a naming convention that avoids such conflicts.
-.LP
-Something you should know about the way search paths are implemented
-is that each directory is read, and its contents cached, exactly once
-\&\*- when it is first encountered \*- so any changes to the
-directories while PMake is running will not be noted when searching
-for implicit sources, nor will they be found when PMake attempts to
-discover when the file was last modified, unless the file was created in the
-current directory. While people have suggested that PMake should read
-the directories each time, my experience suggests that the caching seldom
-causes problems. In addition, not caching the directories slows things
-down enormously because of PMake's attempts to apply transformation
-rules through non-existent files \*- the number of extra file-system
-searches is truly staggering, especially if many files without
-suffixes are used and the null suffix isn't changed from
-.CW .out .
-.xH 2 Archives and Libraries
-.LP
-.UX
-and Sprite allow you to merge files into an archive using the
-.CW ar
-command. Further, if the files are relocatable object files, you can
-run
-.CW ranlib
-on the archive and get yourself a library that you can link into any
-program you want. The main problem with archives is they double the
-space you need to store the archived files, since there's one copy in
-the archive and one copy out by itself. The problem with libraries is
-you usually think of them as
-.CW -lm
-rather than
-.CW /usr/lib/libm.a
-and the linker thinks they're out-of-date if you so much as look at
-them.
-.LP
-PMake solves the problem with archives by allowing you to tell it to
-examine the files in the archives (so you can remove the individual
-files without having to regenerate them later). To handle the problem
-with libraries, PMake adds an additional way of deciding if a library
-is out-of-date:
-.IP \(bu 2
-If the table of contents is older than the library, or is missing, the
-library is out-of-date.
-.LP
-A library is any target that looks like
-.CW \-l name'' ``
-or that ends in a suffix that was marked as a library using the
-.CW .LIBS
-target.
-.CW .a
-is so marked in the system makefile.
-.LP
-Members of an archive are specified as
-``\fIarchive\fP(\fImember\fP[ \fImember\fP...])''.
-Thus
-.CW libdix.a(window.o) '' ``'
-specifies the file
-.CW window.o
-in the archive
-.CW libdix.a .
-You may also use wildcards to specify the members of the archive. Just
-remember that most the wildcard characters will only find
-.I existing
-files.
-.LP
-A file that is a member of an archive is treated specially. If the
-file doesn't exist, but it is in the archive, the modification time
-recorded in the archive is used for the file when determining if the
-file is out-of-date. When figuring out how to make an archived member target
-(not the file itself, but the file in the archive \*- the
-\fIarchive\fP(\fImember\fP) target), special care is
-taken with the transformation rules, as follows:
-.IP \(bu 2
-\&\fIarchive\fP(\fImember\fP) is made to depend on \fImember\fP.
-.IP \(bu 2
-The transformation from the \fImember\fP's suffix to the
-\fIarchive\fP's suffix is applied to the \fIarchive\fP(\fImember\fP) target.
-.IP \(bu 2
-The \fIarchive\fP(\fImember\fP)'s
-.CW .TARGET
-variable is set to the name of the \fImember\fP if \fImember\fP is
-actually a target, or the path to the member file if \fImember\fP is
-only a source.
-.IP \(bu 2
-The
-.CW .ARCHIVE
-variable for the \fIarchive\fP(\fImember\fP) target is set to the name
-of the \fIarchive\fP.
-.Ix 0 def variable local .ARCHIVE
-.Ix 0 def .ARCHIVE
-.IP \(bu 2
-The
-.CW .MEMBER
-variable is set to the actual string inside the parentheses. In most
-cases, this will be the same as the
-.CW .TARGET
-variable.
-.Ix 0 def variable local .MEMBER
-.Ix 0 def .MEMBER
-.IP \(bu 2
-The \fIarchive\fP(\fImember\fP)'s place in the local variables of the
-targets that depend on it is taken by the value of its
-.CW .TARGET
-variable.
-.LP
-Thus, a program library could be created with the following makefile:
-.DS
-\&.o.a :
- ...
- rm -f $(.TARGET:T)
-OBJS = obj1.o obj2.o obj3.o
-libprog.a : libprog.a($(OBJS))
- ar cru $(.TARGET) $(.OODATE)
- ranlib $(.TARGET)
-.DE
-This will cause the three object files to be compiled (if the
-corresponding source files were modified after the object file or, if
-that doesn't exist, the archived object file), the out-of-date ones
-archived in
-.CW libprog.a ,
-a table of contents placed in the archive and the newly-archived
-object files to be removed.
-.LP
-All this is used in the
-.CW makelib.mk
-system makefile to create a single library with ease. This makefile
-looks like this:
-.DS
-.SM
-#
-# Rules for making libraries. The object files that make up the library
-# are removed once they are archived.
-#
-# To make several libraries in parallel, you should define the variable
-# "many_libraries". This will serialize the invocations of ranlib.
-#
-# To use, do something like this:
-#
-# OBJECTS = <files in the library>
-#
-# fish.a: fish.a($(OBJECTS)) MAKELIB
-#
-#
-
-#ifndef _MAKELIB_MK
-_MAKELIB_MK =
-
-#include <po.mk>
-
-\&.po.a .o.a :
- ...
- rm -f $(.MEMBER)
-
-ARFLAGS ?= crl
-
-#
-# Re-archive the out-of-date members and recreate the library's table of
-# contents using ranlib. If many_libraries is defined, put the ranlib
-# off til the end so many libraries can be made at once.
-#
-MAKELIB : .USE .PRECIOUS
- ar $(ARFLAGS) $(.TARGET) $(.OODATE)
-#ifndef no_ranlib
-# ifdef many_libraries
- ...
-# endif many_libraries
- ranlib $(.TARGET)
-#endif no_ranlib
-
-#endif _MAKELIB_MK
-.DE
-.xH 2 On the Condition...
-.Rd 1
-.LP
-Like the C compiler before it, PMake allows you to configure the makefile,
-based on the current environment, using conditional statements. A
-conditional looks like this:
-.DS
-#if \fIboolean expression\fP
-\fIlines\fP
-#elif \fIanother boolean expression\fP
-\fImore lines\fP
-#else
-\fIstill more lines\fP
-#endif
-.DE
-They may be nested to a maximum depth of 30 and may occur anywhere
-(except in a comment, of course). The
-.CW # '' ``
-must the very first character on the line.
-.LP
-Each
-.I "boolean expression"
-is made up of terms that look like function calls, the standard C
-boolean operators
-.CW && ,
-.CW || ,
-and
-.CW ! ,
-and the standard relational operators
-.CW == ,
-.CW != ,
-.CW > ,
-.CW >= ,
-.CW < ,
-and
-.CW <= ,
-with
-.CW ==
-and
-.CW !=
-being overloaded to allow string comparisons as well.
-.CW &&
-represents logical AND;
-.CW ||
-is logical OR and
-.CW !
-is logical NOT. The arithmetic and string operators take precedence
-over all three of these operators, while NOT takes precedence over
-AND, which takes precedence over OR. This precedence may be
-overridden with parentheses, and an expression may be parenthesized to
-your heart's content. Each term looks like a call on one of four
-functions:
-.nr pw 9
-.Ix 0 def make
-.Ix 0 def conditional make
-.Ix 0 def if make
-.IP make \n(pw
-The syntax is
-.CW make( \fItarget\fP\c
-.CW )
-where
-.I target
-is a target in the makefile. This is true if the given target was
-specified on the command line, or as the source for a
-.CW .MAIN
-target (note that the sources for
-.CW .MAIN
-are only used if no targets were given on the command line).
-.IP defined \n(pw
-.Ix 0 def defined
-.Ix 0 def conditional defined
-.Ix 0 def if defined
-The syntax is
-.CW defined( \fIvariable\fP\c
-.CW )
-and is true if
-.I variable
-is defined. Certain variables are defined in the system makefile that
-identify the system on which PMake is being run.
-.IP exists \n(pw
-.Ix 0 def exists
-.Ix 0 def conditional exists
-.Ix 0 def if exists
-The syntax is
-.CW exists( \fIfile\fP\c
-.CW )
-and is true if the file can be found on the global search path (i.e.
-that defined by
-.CW .PATH
-targets, not by
-.CW .PATH \fIsuffix\fP
-targets).
-.IP empty \n(pw
-.Ix 0 def empty
-.Ix 0 def conditional empty
-.Ix 0 def if empty
-This syntax is much like the others, except the string inside the
-parentheses is of the same form as you would put between parentheses
-when expanding a variable, complete with modifiers and everything. The
-function returns true if the resulting string is empty (NOTE: an undefined
-variable in this context will cause at the very least a warning
-message about a malformed conditional, and at the worst will cause the
-process to stop once it has read the makefile. If you want to check
-for a variable being defined or empty, use the expression
-.CW !defined( \fIvar\fP\c ``
-.CW ") || empty(" \fIvar\fP\c
-.CW ) ''
-as the definition of
-.CW ||
-will prevent the
-.CW empty()
-from being evaluated and causing an error, if the variable is
-undefined). This can be used to see if a variable contains a given
-word, for example:
-.DS
-#if !empty(\fIvar\fP:M\fIword\fP)
-.DE
-.LP
-The arithmetic and string operators may only be used to test the value
-of a variable. The lefthand side must contain the variable expansion,
-while the righthand side contains either a string, enclosed in
-double-quotes, or a number. The standard C numeric conventions (except
-for specifying an octal number) apply to both sides. E.g.
-.DS
-#if $(OS) == 4.3
-
-#if $(MACHINE) == "sun3"
-
-#if $(LOAD_ADDR) < 0xc000
-.DE
-are all valid conditionals. In addition, the numeric value of a
-variable can be tested as a boolean as follows:
-.DS
-#if $(LOAD)
-.DE
-would see if
-.CW LOAD
-contains a non-zero value and
-.DS
-#if !$(LOAD)
-.DE
-would test if
-.CW LOAD
-contains a zero value.
-.LP
-In addition to the bare
-.CW #if ,'' ``
-there are other forms that apply one of the first two functions to each
-term. They are as follows:
-.DS
- ifdef \fRdefined\fP
- ifndef \fR!defined\fP
- ifmake \fRmake\fP
- ifnmake \fR!make\fP
-.DE
-There are also the ``else if'' forms:
-.CW elif ,
-.CW elifdef ,
-.CW elifndef ,
-.CW elifmake ,
-and
-.CW elifnmake .
-.LP
-For instance, if you wish to create two versions of a program, one of which
-is optimized (the production version) and the other of which is for debugging
-(has symbols for dbx), you have two choices: you can create two
-makefiles, one of which uses the
-.CW \-g
-flag for the compilation, while the other uses the
-.CW \-O
-flag, or you can use another target (call it
-.CW debug )
-to create the debug version. The construct below will take care of
-this for you. I have also made it so defining the variable
-.CW DEBUG
-(say with
-.CW "pmake -D DEBUG" )
-will also cause the debug version to be made.
-.DS
-#if defined(DEBUG) || make(debug)
-CFLAGS += -g
-#else
-CFLAGS += -O
-#endif
-.DE
-There are, of course, problems with this approach. The most glaring
-annoyance is that if you want to go from making a debug version to
-making a production version, you have to remove all the object files,
-or you will get some optimized and some debug versions in the same
-program. Another annoyance is you have to be careful not to make two
-targets that ``conflict'' because of some conditionals in the
-makefile. For instance
-.DS
-#if make(print)
-FORMATTER = ditroff -Plaser_printer
-#endif
-#if make(draft)
-FORMATTER = nroff -Pdot_matrix_printer
-#endif
-.DE
-would wreak havoc if you tried
-.CW "pmake draft print" '' ``
-since you would use the same formatter for each target. As I said,
-this all gets somewhat complicated.
-.xH 2 A Shell is a Shell is a Shell
-.Rd 7
-.LP
-In normal operation, the Bourne Shell (better known as
-.CW sh '') ``
-is used to execute the commands to re-create targets. PMake also allows you
-to specify a different shell for it to use when executing these
-commands. There are several things PMake must know about the shell you
-wish to use. These things are specified as the sources for the
-.CW .SHELL
-.Ix 0 ref .SHELL
-.Ix 0 ref target .SHELL
-target by keyword, as follows:
-.IP "\fBpath=\fP\fIpath\fP"
-PMake needs to know where the shell actually resides, so it can
-execute it. If you specify this and nothing else, PMake will use the
-last component of the path and look in its table of the shells it
-knows and use the specification it finds, if any. Use this if you just
-want to use a different version of the Bourne or C Shell (yes, PMake knows
-how to use the C Shell too).
-.IP "\fBname=\fP\fIname\fP"
-This is the name by which the shell is to be known. It is a single
-word and, if no other keywords are specified (other than
-.B path ),
-it is the name by which PMake attempts to find a specification for
-it (as mentioned above). You can use this if you would just rather use
-the C Shell than the Bourne Shell
-.CW ".SHELL: name=csh" '' (``
-will do it).
-.IP "\fBquiet=\fP\fIecho-off command\fP"
-As mentioned before, PMake actually controls whether commands are
-printed by introducing commands into the shell's input stream. This
-keyword, and the next two, control what those commands are. The
-.B quiet
-keyword is the command used to turn echoing off. Once it is turned
-off, echoing is expected to remain off until the echo-on command is given.
-.IP "\fBecho=\fP\fIecho-on command\fP"
-The command PMake should give to turn echoing back on again.
-.IP "\fBfilter=\fP\fIprinted echo-off command\fP"
-Many shells will echo the echo-off command when it is given. This
-keyword tells PMake in what format the shell actually prints the
-echo-off command. Wherever PMake sees this string in the shell's
-output, it will delete it and any following whitespace, up to and
-including the next newline. See the example at the end of this section
-for more details.
-.IP "\fBechoFlag=\fP\fIflag to turn echoing on\fP"
-Unless a target has been marked
-.CW .SILENT ,
-PMake wants to start the shell running with echoing on. To do this, it
-passes this flag to the shell as one of its arguments. If either this
-or the next flag begins with a `\-', the flags will be passed to the
-shell as separate arguments. Otherwise, the two will be concatenated
-(if they are used at the same time, of course).
-.IP "\fBerrFlag=\fP\fIflag to turn error checking on\fP"
-Likewise, unless a target is marked
-.CW .IGNORE ,
-PMake wishes error-checking to be on from the very start. To this end,
-it will pass this flag to the shell as an argument. The same rules for
-an initial `\-' apply as for the
-.B echoFlag .
-.IP "\fBcheck=\fP\fIcommand to turn error checking on\fP"
-Just as for echo-control, error-control is achieved by inserting
-commands into the shell's input stream. This is the command to make
-the shell check for errors. It also serves another purpose if the
-shell doesn't have error-control as commands, but I'll get into that
-in a minute. Again, once error checking has been turned on, it is
-expected to remain on until it is turned off again.
-.IP "\fBignore=\fP\fIcommand to turn error checking off\fP"
-This is the command PMake uses to turn error checking off. It has
-another use if the shell doesn't do error-control, but I'll tell you
-about that.\|.\|.\|now.
-.IP "\fBhasErrCtl=\fP\fIyes or no\fP"
-This takes a value that is either
-.B yes
-or
-.B no .
-Now you might think that the existence of the
-.B check
-and
-.B ignore
-keywords would be enough to tell PMake if the shell can do
-error-control, but you'd be wrong. If
-.B hasErrCtl
-is
-.B yes ,
-PMake uses the check and ignore commands in a straight-forward manner.
-If this is
-.B no ,
-however, their use is rather different. In this case, the check
-command is used as a template, in which the string
-.B %s
-is replaced by the command that's about to be executed, to produce a
-command for the shell that will echo the command to be executed. The
-ignore command is also used as a template, again with
-.B %s
-replaced by the command to be executed, to produce a command that will
-execute the command to be executed and ignore any error it returns.
-When these strings are used as templates, you must provide newline(s)
-.CW \en '') (``
-in the appropriate place(s).
-.LP
-The strings that follow these keywords may be enclosed in single or
-double quotes (the quotes will be stripped off) and may contain the
-usual C backslash-characters (\en is newline, \er is return, \eb is
-backspace, \e' escapes a single-quote inside single-quotes, \e"
-escapes a double-quote inside double-quotes). Now for an example.
-.LP
-This is actually the contents of the
-.CW <shx.mk>
-system makefile, and causes PMake to use the Bourne Shell in such a
-way that each command is printed as it is executed. That is, if more
-than one command is given on a line, each will be printed separately.
-Similarly, each time the body of a loop is executed, the commands
-within that loop will be printed, etc. The specification runs like
-this:
-.DS
-#
-# This is a shell specification to have the Bourne shell echo
-# the commands just before executing them, rather than when it reads
-# them. Useful if you want to see how variables are being expanded, etc.
-#
-\&.SHELL : path=/bin/sh \e
- quiet="set -" \e
- echo="set -x" \e
- filter="+ set - " \e
- echoFlag=x \e
- errFlag=e \e
- hasErrCtl=yes \e
- check="set -e" \e
- ignore="set +e"
-.DE
-.LP
-It tells PMake the following:
-.Bp
-The shell is located in the file
-.CW /bin/sh .
-It need not tell PMake that the name of the shell is
-.CW sh
-as PMake can figure that out for itself (it's the last component of
-the path).
-.Bp
-The command to stop echoing is
-.CW "set -" .
-.Bp
-The command to start echoing is
-.CW "set -x" .
-.Bp
-When the echo off command is executed, the shell will print
-.CW "+ set - "
-(The `+' comes from using the
-.CW \-x
-flag (rather than the
-.CW \-v
-flag PMake usually uses)). PMake will remove all occurrences of this
-string from the output, so you don't notice extra commands you didn't
-put there.
-.Bp
-The flag the Bourne Shell will take to start echoing in this way is
-the
-.CW \-x
-flag. The Bourne Shell will only take its flag arguments concatenated
-as its first argument, so neither this nor the
-.B errFlag
-specification begins with a \-.
-.Bp
-The flag to use to turn error-checking on from the start is
-.CW \-e .
-.Bp
-The shell can turn error-checking on and off, and the commands to do
-so are
-.CW "set +e"
-and
-.CW "set -e" ,
-respectively.
-.LP
-I should note that this specification is for Bourne Shells that are
-not part of Berkeley
-.UX ,
-as shells from Berkeley don't do error control. You can get a similar
-effect, however, by changing the last three lines to be:
-.DS
- hasErrCtl=no \e
- check="echo \e"+ %s\e"\en" \e
- ignore="sh -c '%s || exit 0\en"
-.DE
-.LP
-This will cause PMake to execute the two commands
-.DS
-echo "+ \fIcmd\fP"
-sh -c '\fIcmd\fP || true'
-.DE
-for each command for which errors are to be ignored. (In case you are
-wondering, the thing for
-.CW ignore
-tells the shell to execute another shell without error checking on and
-always exit 0, since the
-.B ||
-causes the
-.CW "exit 0"
-to be executed only if the first command exited non-zero, and if the
-first command exited zero, the shell will also exit zero, since that's
-the last command it executed).
-.xH 2 Compatibility
-.Ix 0 ref compatibility
-.LP
-There are three (well, 3 \(12) levels of backwards-compatibility built
-into PMake. Most makefiles will need none at all. Some may need a
-little bit of work to operate correctly when run in parallel. Each
-level encompasses the previous levels (e.g.
-.B \-B
-(one shell per command) implies
-.B \-V )
-The three levels are described in the following three sections.
-.xH 3 DEFCON 3 \*- Variable Expansion
-.Ix 0 ref compatibility
-.LP
-As noted before, PMake will not expand a variable unless it knows of a
-value for it. This can cause problems for makefiles that expect to
-leave variables undefined except in special circumstances (e.g. if
-more flags need to be passed to the C compiler or the output from a
-text processor should be sent to a different printer). If the
-variables are enclosed in curly braces
-.CW ${PRINTER} ''), (``
-the shell will let them pass. If they are enclosed in parentheses,
-however, the shell will declare a syntax error and the make will come
-to a grinding halt.
-.LP
-You have two choices: change the makefile to define the variables
-(their values can be overridden on the command line, since that's
-where they would have been set if you used Make, anyway) or always give the
-.B \-V
-flag (this can be done with the
-.CW .MAKEFLAGS
-target, if you want).
-.xH 3 DEFCON 2 \*- The Number of the Beast
-.Ix 0 ref compatibility
-.LP
-Then there are the makefiles that expect certain commands, such as
-changing to a different directory, to not affect other commands in a
-target's creation script. You can solve this is either by going
-back to executing one shell per command (which is what the
-.B \-B
-flag forces PMake to do), which slows the process down a good bit and
-requires you to use semicolons and escaped newlines for shell constructs, or
-by changing the makefile to execute the offending command(s) in a subshell
-(by placing the line inside parentheses), like so:
-.DS
-install :: .MAKE
- (cd src; $(.PMAKE) install)
- (cd lib; $(.PMAKE) install)
- (cd man; $(.PMAKE) install)
-.DE
-.Ix 0 ref operator double-colon
-.Ix 0 ref variable global .PMAKE
-.Ix 0 ref .PMAKE
-.Ix 0 ref .MAKE
-.Ix 0 ref attribute .MAKE
-This will always execute the three makes (even if the
-.B \-n
-flag was given) because of the combination of the ``::'' operator and
-the
-.CW .MAKE
-attribute. Each command will change to the proper directory to perform
-the install, leaving the main shell in the directory in which it started.
-.xH 3 "DEFCON 1 \*- Imitation is the Not the Highest Form of Flattery"
-.Ix 0 ref compatibility
-.LP
-The final category of makefile is the one where every command requires
-input, the dependencies are incompletely specified, or you simply
-cannot create more than one target at a time, as mentioned earlier. In
-addition, you may not have the time or desire to upgrade the makefile
-to run smoothly with PMake. If you are the conservative sort, this is
-the compatibility mode for you. It is entered either by giving PMake
-the
-.B \-M
-flag (for Make), or by executing PMake as
-.CW make .'' ``
-In either case, PMake performs things exactly like Make (while still
-supporting most of the nice new features PMake provides). This
-includes:
-.IP \(bu 2
-No parallel execution.
-.IP \(bu 2
-Targets are made in the exact order specified by the makefile. The
-sources for each target are made in strict left-to-right order, etc.
-.IP \(bu 2
-A single Bourne shell is used to execute each command, thus the
-shell's
-.CW $$
-variable is useless, changing directories doesn't work across command
-lines, etc.
-.IP \(bu 2
-If no special characters exist in a command line, PMake will break the
-command into words itself and execute the command directly, without
-executing a shell first. The characters that cause PMake to execute a
-shell are:
-.CW # ,
-.CW = ,
-.CW | ,
-.CW ^ ,
-.CW ( ,
-.CW ) ,
-.CW { ,
-.CW } ,
-.CW ; ,
-.CW & ,
-.CW < ,
-.CW > ,
-.CW * ,
-.CW ? ,
-.CW [ ,
-.CW ] ,
-.CW : ,
-.CW $ ,
-.CW ` ,
-and
-.CW \e .
-You should notice that these are all the characters that are given
-special meaning by the shell (except
-.CW '
-and
-.CW " ,
-which PMake deals with all by its lonesome).
-.IP \(bu 2
-The use of the null suffix is turned off.
-.Ix 0 ref "null suffix"
-.Ix 0 ref suffix null
-.xH 2 The Way Things Work
-.LP
-When PMake reads the makefile, it parses sources and targets into
-nodes in a graph. The graph is directed only in the sense that PMake
-knows which way is up. Each node contains not only links to all its
-parents and children (the nodes that depend on it and those on which
-it depends, respectively), but also a count of the number of its
-children that have already been processed.
-.LP
-The most important thing to know about how PMake uses this graph is
-that the traversal is breadth-first and occurs in two passes.
-.LP
-After PMake has parsed the makefile, it begins with the nodes the user
-has told it to make (either on the command line, or via a
-.CW .MAIN
-target, or by the target being the first in the file not labeled with
-the
-.CW .NOTMAIN
-attribute) placed in a queue. It continues to take the node off the
-front of the queue, mark it as something that needs to be made, pass
-the node to
-.CW Suff_FindDeps
-(mentioned earlier) to find any implicit sources for the node, and
-place all the node's children that have yet to be marked at the end of
-the queue. If any of the children is a
-.CW .USE
-rule, its attributes are applied to the parent, then its commands are
-appended to the parent's list of commands and its children are linked
-to its parent. The parent's unmade children counter is then decremented
-(since the
-.CW .USE
-node has been processed). You will note that this allows a
-.CW .USE
-node to have children that are
-.CW .USE
-nodes and the rules will be applied in sequence.
-If the node has no children, it is placed at the end of
-another queue to be examined in the second pass. This process
-continues until the first queue is empty.
-.LP
-At this point, all the leaves of the graph are in the examination
-queue. PMake removes the node at the head of the queue and sees if it
-is out-of-date. If it is, it is passed to a function that will execute
-the commands for the node asynchronously. When the commands have
-completed, all the node's parents have their unmade children counter
-decremented and, if the counter is then 0, they are placed on the
-examination queue. Likewise, if the node is up-to-date. Only those
-parents that were marked on the downward pass are processed in this
-way. Thus PMake traverses the graph back up to the nodes the user
-instructed it to create. When the examination queue is empty and no
-shells are running to create a target, PMake is finished.
-.LP
-Once all targets have been processed, PMake executes the commands
-attached to the
-.CW .END
-target, either explicitly or through the use of an ellipsis in a shell
-script. If there were no errors during the entire process but there
-are still some targets unmade (PMake keeps a running count of how many
-targets are left to be made), there is a cycle in the graph. PMake does
-a depth-first traversal of the graph to find all the targets that
-weren't made and prints them out one by one.
-.xH 1 Answers to Exercises
-.IP (3.1)
-This is something of a trick question, for which I apologize. The
-trick comes from the UNIX definition of a suffix, which PMake doesn't
-necessarily share. You will have noticed that all the suffixes used in
-this tutorial (and in UNIX in general) begin with a period
-.CW .ms , (
-.CW .c ,
-etc.). Now, PMake's idea of a suffix is more like English's: it's the
-characters at the end of a word. With this in mind, one possible
-.Ix 0 def suffix
-solution to this problem goes as follows:
-.DS I
-\&.SUFFIXES : ec.exe .exe ec.obj .obj .asm
-ec.objec.exe .obj.exe :
- link -o $(.TARGET) $(.IMPSRC)
-\&.asmec.obj :
- asm -o $(.TARGET) -DDO_ERROR_CHECKING $(.IMPSRC)
-\&.asm.obj :
- asm -o $(.TARGET) $(.IMPSRC)
-.DE
-.IP (3.2)
-The trick to this one lies in the ``:='' variable-assignment operator
-and the ``:S'' variable-expansion modifier.
-.Ix 0 ref variable assignment expanded
-.Ix 0 ref variable expansion modified
-.Ix 0 ref modifier substitute
-.Ix 0 ref :S
-.Ix 0 ref :=
-Basically what you want is to take the pointer variable, so to speak,
-and transform it into an invocation of the variable at which it
-points. You might try something like
-.DS I
-$(PTR:S/^/\e$(/:S/$/))
-.DE
-which places
-.CW $( '' ``
-at the front of the variable name and
-.CW ) '' ``
-at the end, thus transforming
-.CW VAR ,'' ``
-for example, into
-.CW $(VAR) ,'' ``
-which is just what we want. Unfortunately (as you know if you've tried
-it), since, as it says in the hint, PMake does no further substitution
-on the result of a modified expansion, that's \fIall\fP you get. The
-solution is to make use of ``:='' to place that string into yet
-another variable, then invoke the other variable directly:
-.DS I
-*PTR := $(PTR:S/^/\e$(/:S/$/)/)
-.DE
-You can then use
-.CW $(*PTR) '' ``
-to your heart's content.
-.de Gp
-.XP
-\&\fB\\$1:\fP
-..
-.xH 1 Glossary of Jargon
-.Gp "attribute"
-A property given to a target that causes PMake to treat it differently.
-.Gp "command script"
-The lines immediately following a dependency line that specify
-commands to execute to create each of the targets on the dependency
-line. Each line in the command script must begin with a tab.
-.Gp "command-line variable"
-A variable defined in an argument when PMake is first executed.
-Overrides all assignments to the same variable name in the makefile.
-.Gp "conditional"
-A construct much like that used in C that allows a makefile to be
-configured on the fly based on the local environment, or on what is being
-made by that invocation of PMake.
-.Gp "creation script"
-Commands used to create a target. See ``command script.''
-.Gp "dependency"
-The relationship between a source and a target. This comes in three
-flavors, as indicated by the operator between the target and the
-source. `:' gives a straight time-wise dependency (if the target is
-older than the source, the target is out-of-date), while `!' provides
-simply an ordering and always considers the target out-of-date. `::'
-is much like `:', save it creates multiple instances of a target each
-of which depends on its own list of sources.
-.Gp "dynamic source"
-This refers to a source that has a local variable invocation in it. It
-allows a single dependency line to specify a different source for each
-target on the line.
-.Gp "global variable"
-Any variable defined in a makefile. Takes precedence over variables
-defined in the environment, but not over command-line or local variables.
-.Gp "input graph"
-What PMake constructs from a makefile. Consists of nodes made of the
-targets in the makefile, and the links between them (the
-dependencies). The links are directed (from source to target) and
-there may not be any cycles (loops) in the graph.
-.Gp "local variable"
-A variable defined by PMake visible only in a target's shell script.
-There are seven local variables, not all of which are defined for
-every target:
-.CW .TARGET ,
-.CW .ALLSRC ,
-.CW .OODATE ,
-.CW .PREFIX ,
-.CW .IMPSRC ,
-.CW .ARCHIVE ,
-and
-.CW .MEMBER .
-.CW .TARGET ,
-.CW .PREFIX ,
-.CW .ARCHIVE ,
-and
-.CW .MEMBER
-may be used on dependency lines to create ``dynamic sources.''
-.Gp "makefile"
-A file that describes how a system is built. If you don't know what it
-is after reading this tutorial.\|.\|.\|.
-.Gp "modifier"
-A letter, following a colon, used to alter how a variable is expanded.
-It has no effect on the variable itself.
-.Gp "operator"
-What separates a source from a target (on a dependency line) and specifies
-the relationship between the two. There are three:
-.CW : ', `
-.CW :: ', `
-and
-.CW ! '. `
-.Gp "search path"
-A list of directories in which a file should be sought. PMake's view
-of the contents of directories in a search path does not change once
-the makefile has been read. A file is sought on a search path only if
-it is exclusively a source.
-.Gp "shell"
-A program to which commands are passed in order to create targets.
-.Gp "source"
-Anything to the right of an operator on a dependency line. Targets on
-the dependency line are usually created from the sources.
-.Gp "special target"
-A target that causes PMake to do special things when it's encountered.
-.Gp "suffix"
-The tail end of a file name. Usually begins with a period,
-.CW .c
-or
-.CW .ms ,
-e.g.
-.Gp "target"
-A word to the left of the operator on a dependency line. More
-generally, any file that PMake might create. A file may be (and often
-is) both a target and a source (what it is depends on how PMake is
-looking at it at the time \*- sort of like the wave/particle duality
-of light, you know).
-.Gp "transformation rule"
-A special construct in a makefile that specifies how to create a file
-of one type from a file of another, as indicated by their suffixes.
-.Gp "variable expansion"
-The process of substituting the value of a variable for a reference to
-it. Expansion may be altered by means of modifiers.
-.Gp "variable"
-A place in which to store text that may be retrieved later. Also used
-to define the local environment. Conditionals exist that test whether
-a variable is defined or not.
-.bp
-.\" Output table of contents last, with an entry for the index, making
-.\" sure to save and restore the last real page number for the index...
-.nr @n \n(PN+1
-.\" We are not generating an index
-.\" .XS \n(@n
-.\" Index
-.\" .XE
-.nr %% \n%
-.PX
-.nr % \n(%%
diff --git a/usr.bin/make/arch.c b/usr.bin/make/arch.c
deleted file mode 100644
index d8206e0..0000000
--- a/usr.bin/make/arch.c
+++ /dev/null
@@ -1,1228 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)arch.c 8.2 (Berkeley) 1/2/94
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*-
- * arch.c --
- * Functions to manipulate libraries, archives and their members.
- *
- * Once again, cacheing/hashing comes into play in the manipulation
- * of archives. The first time an archive is referenced, all of its members'
- * headers are read and hashed and the archive closed again. All hashed
- * archives are kept on a list which is searched each time an archive member
- * is referenced.
- *
- * The interface to this module is:
- * Arch_ParseArchive Given an archive specification, return a list
- * of GNode's, one for each member in the spec.
- * FALSE is returned if the specification is
- * invalid for some reason.
- *
- * Arch_Touch Alter the modification time of the archive
- * member described by the given node to be
- * the current time.
- *
- * Arch_TouchLib Update the modification time of the library
- * described by the given node. This is special
- * because it also updates the modification time
- * of the library's table of contents.
- *
- * Arch_MTime Find the modification time of a member of
- * an archive *in the archive*. The time is also
- * placed in the member's GNode. Returns the
- * modification time.
- *
- * Arch_MemTime Find the modification time of a member of
- * an archive. Called when the member doesn't
- * already exist. Looks in the archive for the
- * modification time. Returns the modification
- * time.
- *
- * Arch_FindLib Search for a library along a path. The
- * library name in the GNode should be in
- * -l<name> format.
- *
- * Arch_LibOODate Special function to decide if a library node
- * is out-of-date.
- *
- * Arch_Init Initialize this module.
- */
-
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/types.h>
-#include <ar.h>
-#include <ctype.h>
-#include <errno.h>
-#include <inttypes.h>
-#include <limits.h>
-#include <regex.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <utime.h>
-
-#include "arch.h"
-#include "buf.h"
-#include "config.h"
-#include "dir.h"
-#include "globals.h"
-#include "GNode.h"
-#include "hash.h"
-#include "make.h"
-#include "parse.h"
-#include "targ.h"
-#include "util.h"
-#include "var.h"
-
-typedef struct Arch {
- char *name; /* Name of archive */
-
- /*
- * All the members of the archive described
- * by <name, struct ar_hdr *> key/value pairs
- */
- Hash_Table members;
-
- TAILQ_ENTRY(Arch) link; /* link all cached archives */
-} Arch;
-
-/* Lst of archives we've already examined */
-static TAILQ_HEAD(, Arch) archives = TAILQ_HEAD_INITIALIZER(archives);
-
-
-/* size of the name field in the archive member header */
-#define AR_NAMSIZ sizeof(((struct ar_hdr *)0)->ar_name)
-
-/*
- * This structure is used while reading/writing an archive
- */
-struct arfile {
- FILE *fp; /* archive file */
- char *fname; /* name of the file */
- struct ar_hdr hdr; /* current header */
- char sname[AR_NAMSIZ + 1]; /* short name */
- char *member; /* (long) member name */
- size_t mlen; /* size of the above */
- char *nametab; /* name table */
- size_t nametablen; /* size of the table */
- int64_t time; /* from ar_date */
- uint64_t size; /* from ar_size */
- off_t pos; /* header pos of current entry */
-};
-
-/*
- * Name of the symbol table. The original BSD used "__.SYMDEF". Rumours go
- * that this name may have a slash appended sometimes. Actually FreeBSD
- * uses "/" which probably came from SVR4.
- */
-#define SVR4_RANLIBMAG "/"
-#define BSD_RANLIBMAG "__.SYMDEF"
-
-/*
- * Name of the filename table. The 4.4BSD ar format did not use this, but
- * puts long filenames directly between the member header and the object
- * file.
- */
-#define SVR4_NAMEMAG "//"
-#define BSD_NAMEMAG "ARFILENAMES/"
-
-/*
- * 44BSD long filename key. Use a local define here instead of relying
- * on ar.h because we want this to continue working even when the
- * definition is removed from ar.h.
- */
-#define BSD_EXT1 "#1/"
-#define BSD_EXT1LEN 3
-
-/* if this is TRUE make archive errors fatal */
-Boolean arch_fatal = TRUE;
-
-/**
- * ArchError
- * An error happend while handling an archive. BSDmake traditionally
- * ignored these errors. Now this is dependend on the global arch_fatal
- * which, if true, makes these errors fatal and, if false, just emits an
- * error message.
- */
-#define ArchError(ARGS) do { \
- if (arch_fatal) \
- Fatal ARGS; \
- else \
- Error ARGS; \
- } while (0)
-
-/*-
- *-----------------------------------------------------------------------
- * Arch_ParseArchive --
- * Parse the archive specification in the given line and find/create
- * the nodes for the specified archive members, placing their nodes
- * on the given list, given the pointer to the start of the
- * specification, a Lst on which to place the nodes, and a context
- * in which to expand variables.
- *
- * Results:
- * TRUE if it was a valid specification. The linePtr is updated
- * to point to the first non-space after the archive spec. The
- * nodes for the members are placed on the given list.
- *
- * Side Effects:
- * Some nodes may be created. The given list is extended.
- *
- *-----------------------------------------------------------------------
- */
-Boolean
-Arch_ParseArchive(char **linePtr, Lst *nodeLst, GNode *ctxt)
-{
- char *cp; /* Pointer into line */
- GNode *gn; /* New node */
- char *libName; /* Library-part of specification */
- char *memName; /* Member-part of specification */
- char *nameBuf; /* temporary place for node name */
- char saveChar; /* Ending delimiter of member-name */
- Boolean subLibName; /* TRUE if libName should have/had
- * variable substitution performed on it */
-
- libName = *linePtr;
-
- subLibName = FALSE;
-
- for (cp = libName; *cp != '(' && *cp != '\0'; cp++) {
- if (*cp == '$') {
- /*
- * Variable spec, so call the Var module to parse the
- * puppy so we can safely advance beyond it...
- */
- size_t length = 0;
- Boolean freeIt;
- char *result;
-
- result = Var_Parse(cp, ctxt, TRUE, &length, &freeIt);
- if (result == var_Error) {
- return (FALSE);
- }
- subLibName = TRUE;
-
- if (freeIt) {
- free(result);
- }
- cp += length - 1;
- }
- }
-
- *cp++ = '\0';
- if (subLibName) {
- libName = Buf_Peel(Var_Subst(libName, ctxt, TRUE));
- }
-
- for (;;) {
- /*
- * First skip to the start of the member's name, mark that
- * place and skip to the end of it (either white-space or
- * a close paren).
- */
-
- /*
- * TRUE if need to substitute in memName
- */
- Boolean doSubst = FALSE;
-
- while (*cp != '\0' && *cp != ')' &&
- isspace((unsigned char)*cp)) {
- cp++;
- }
-
- memName = cp;
- while (*cp != '\0' && *cp != ')' &&
- !isspace((unsigned char)*cp)) {
- if (*cp == '$') {
- /*
- * Variable spec, so call the Var module to
- * parse the puppy so we can safely advance
- * beyond it...
- */
- size_t length = 0;
- Boolean freeIt;
- char *result;
-
- result = Var_Parse(cp, ctxt, TRUE,
- &length, &freeIt);
- if (result == var_Error) {
- return (FALSE);
- }
- doSubst = TRUE;
-
- if (freeIt) {
- free(result);
- }
- cp += length;
- } else {
- cp++;
- }
- }
-
- /*
- * If the specification ends without a closing parenthesis,
- * chances are there's something wrong (like a missing
- * backslash), so it's better to return failure than allow
- * such things to happen
- */
- if (*cp == '\0') {
- printf("No closing parenthesis in archive "
- "specification\n");
- return (FALSE);
- }
-
- /*
- * If we didn't move anywhere, we must be done
- */
- if (cp == memName) {
- break;
- }
-
- saveChar = *cp;
- *cp = '\0';
-
- /*
- * XXX: This should be taken care of intelligently by
- * SuffExpandChildren, both for the archive and the member
- * portions.
- */
- /*
- * If member contains variables, try and substitute for them.
- * This will slow down archive specs with dynamic sources, of
- * course, since we'll be (non-)substituting them three times,
- * but them's the breaks -- we need to do this since
- * SuffExpandChildren calls us, otherwise we could assume the
- * thing would be taken care of later.
- */
- if (doSubst) {
- char *buf;
- char *sacrifice;
- char *oldMemName = memName;
- size_t sz;
- Buffer *buf1;
-
- /*
- * Now form an archive spec and recurse to deal with
- * nested variables and multi-word variable values....
- * The results are just placed at the end of the
- * nodeLst we're returning.
- */
- buf1 = Var_Subst(memName, ctxt, TRUE);
- memName = Buf_Data(buf1);
-
- sz = strlen(memName) + strlen(libName) + 3;
- buf = emalloc(sz);
-
- snprintf(buf, sz, "%s(%s)", libName, memName);
-
- sacrifice = buf;
-
- if (strchr(memName, '$') &&
- strcmp(memName, oldMemName) == 0) {
- /*
- * Must contain dynamic sources, so we can't
- * deal with it now.
- * Just create an ARCHV node for the thing and
- * let SuffExpandChildren handle it...
- */
- gn = Targ_FindNode(buf, TARG_CREATE);
-
- if (gn == NULL) {
- free(buf);
- Buf_Destroy(buf1, FALSE);
- return (FALSE);
- }
- gn->type |= OP_ARCHV;
- Lst_AtEnd(nodeLst, (void *)gn);
- } else if (!Arch_ParseArchive(&sacrifice, nodeLst,
- ctxt)) {
- /*
- * Error in nested call -- free buffer and
- * return FALSE ourselves.
- */
- free(buf);
- Buf_Destroy(buf1, FALSE);
- return (FALSE);
- }
-
- /* Free buffer and continue with our work. */
- free(buf);
- Buf_Destroy(buf1, FALSE);
-
- } else if (Dir_HasWildcards(memName)) {
- Lst members = Lst_Initializer(members);
- char *member;
- size_t sz = MAXPATHLEN;
- size_t nsz;
-
- nameBuf = emalloc(sz);
-
- Path_Expand(memName, &dirSearchPath, &members);
- while (!Lst_IsEmpty(&members)) {
- member = Lst_DeQueue(&members);
- nsz = strlen(libName) + strlen(member) + 3;
- if (nsz > sz) {
- sz = nsz * 2;
- nameBuf = erealloc(nameBuf, sz);
- }
-
- snprintf(nameBuf, sz, "%s(%s)",
- libName, member);
- free(member);
- gn = Targ_FindNode(nameBuf, TARG_CREATE);
- if (gn == NULL) {
- free(nameBuf);
- /* XXXHB Lst_Destroy(&members) */
- return (FALSE);
- }
- /*
- * We've found the node, but have to make sure
- * the rest of the world knows it's an archive
- * member, without having to constantly check
- * for parentheses, so we type the thing with
- * the OP_ARCHV bit before we place it on the
- * end of the provided list.
- */
- gn->type |= OP_ARCHV;
- Lst_AtEnd(nodeLst, gn);
- }
- free(nameBuf);
- } else {
- size_t sz = strlen(libName) + strlen(memName) + 3;
-
- nameBuf = emalloc(sz);
- snprintf(nameBuf, sz, "%s(%s)", libName, memName);
- gn = Targ_FindNode(nameBuf, TARG_CREATE);
- free(nameBuf);
- if (gn == NULL) {
- return (FALSE);
- }
- /*
- * We've found the node, but have to make sure the
- * rest of the world knows it's an archive member,
- * without having to constantly check for parentheses,
- * so we type the thing with the OP_ARCHV bit before
- * we place it on the end of the provided list.
- */
- gn->type |= OP_ARCHV;
- Lst_AtEnd(nodeLst, gn);
- }
- if (doSubst) {
- free(memName);
- }
-
- *cp = saveChar;
- }
-
- /*
- * If substituted libName, free it now, since we need it no longer.
- */
- if (subLibName) {
- free(libName);
- }
-
- /*
- * We promised the pointer would be set up at the next non-space, so
- * we must advance cp there before setting *linePtr... (note that on
- * entrance to the loop, cp is guaranteed to point at a ')')
- */
- do {
- cp++;
- } while (*cp != '\0' && isspace((unsigned char)*cp));
-
- *linePtr = cp;
- return (TRUE);
-}
-
-/*
- * Close an archive file an free all resources
- */
-static void
-ArchArchiveClose(struct arfile *ar)
-{
-
- if (ar->nametab != NULL)
- free(ar->nametab);
- free(ar->member);
- if (ar->fp != NULL) {
- if (fclose(ar->fp) == EOF)
- ArchError(("%s: close error", ar->fname));
- }
- free(ar->fname);
- free(ar);
-}
-
-/*
- * Open an archive file.
- */
-static struct arfile *
-ArchArchiveOpen(const char *archive, const char *mode)
-{
- struct arfile *ar;
- char magic[SARMAG];
-
- ar = emalloc(sizeof(*ar));
- ar->fname = estrdup(archive);
- ar->mlen = 100;
- ar->member = emalloc(ar->mlen);
- ar->nametab = NULL;
- ar->nametablen = 0;
-
- if ((ar->fp = fopen(ar->fname, mode)) == NULL) {
- DEBUGM(ARCH, ("%s", ar->fname));
- ArchArchiveClose(ar);
- return (NULL);
- }
-
- /* read MAGIC */
- if (fread(magic, SARMAG, 1, ar->fp) != 1 ||
- strncmp(magic, ARMAG, SARMAG) != 0) {
- ArchError(("%s: bad archive magic\n", ar->fname));
- ArchArchiveClose(ar);
- return (NULL);
- }
-
- ar->pos = 0;
- return (ar);
-}
-
-/*
- * Read the next header from the archive. The return value will be +1 if
- * the header is read successfully, 0 on EOF and -1 if an error happend.
- * On a successful return sname contains the truncated member name and
- * member the full name. hdr contains the member header. For the symbol table
- * names of length 0 are returned. The entry for the file name table is never
- * returned.
- */
-static int
-ArchArchiveNext(struct arfile *ar)
-{
- char *end;
- int have_long_name;
- u_long offs;
- char *ptr;
- size_t ret;
- char buf[MAX(sizeof(ar->hdr.ar_size), sizeof(ar->hdr.ar_date)) + 1];
-
- next:
- /*
- * Seek to the next header.
- */
- if (ar->pos == 0) {
- ar->pos = SARMAG;
- } else {
- ar->pos += sizeof(ar->hdr) + ar->size;
- if (ar->size % 2 == 1)
- ar->pos++;
- }
-
- if (fseeko(ar->fp, ar->pos, SEEK_SET) == -1) {
- ArchError(("%s: cannot seek to %jd: %s", ar->fname,
- (intmax_t)ar->pos, strerror(errno)));
- return (-1);
- }
-
- /*
- * Read next member header
- */
- ret = fread(&ar->hdr, sizeof(ar->hdr), 1, ar->fp);
- if (ret != 1) {
- if (feof(ar->fp))
- return (0);
- ArchError(("%s: error reading member header: %s", ar->fname,
- strerror(errno)));
- return (-1);
- }
- if (strncmp(ar->hdr.ar_fmag, ARFMAG, sizeof(ar->hdr.ar_fmag)) != 0) {
- ArchError(("%s: bad entry magic", ar->fname));
- return (-1);
- }
-
- /*
- * looks like a member - get name by stripping trailing spaces
- * and NUL terminating.
- */
- strncpy(ar->sname, ar->hdr.ar_name, AR_NAMSIZ);
- ar->sname[AR_NAMSIZ] = '\0';
- for (ptr = ar->sname + AR_NAMSIZ; ptr > ar->sname; ptr--)
- if (ptr[-1] != ' ')
- break;
-
- *ptr = '\0';
-
- /*
- * Parse the size. All entries need to have a size. Be careful
- * to not allow buffer overruns.
- */
- strncpy(buf, ar->hdr.ar_size, sizeof(ar->hdr.ar_size));
- buf[sizeof(ar->hdr.ar_size)] = '\0';
-
- errno = 0;
- ar->size = strtoumax(buf, &end, 10);
- if (errno != 0 || strspn(end, " ") != strlen(end)) {
- ArchError(("%s: bad size format in archive '%s'",
- ar->fname, buf));
- return (-1);
- }
-
- /*
- * Look for the extended name table. Do this before parsing
- * the date because this table doesn't need a date.
- */
- if (strcmp(ar->sname, BSD_NAMEMAG) == 0 ||
- strcmp(ar->sname, SVR4_NAMEMAG) == 0) {
- /* filename table - read it in */
- ar->nametablen = ar->size;
- ar->nametab = emalloc(ar->nametablen);
-
- ret = fread(ar->nametab, 1, ar->nametablen, ar->fp);
- if (ret != ar->nametablen) {
- if (ferror(ar->fp)) {
- ArchError(("%s: cannot read nametab: %s",
- ar->fname, strerror(errno)));
- } else {
- ArchError(("%s: cannot read nametab: "
- "short read", ar->fname, strerror(errno)));
- }
- return (-1);
- }
-
- /*
- * NUL terminate the entries. Entries are \n terminated
- * and may have a trailing / or \.
- */
- ptr = ar->nametab;
- while (ptr < ar->nametab + ar->nametablen) {
- if (*ptr == '\n') {
- if (ptr[-1] == '/' || ptr[-1] == '\\')
- ptr[-1] = '\0';
- *ptr = '\0';
- }
- ptr++;
- }
-
- /* get next archive entry */
- goto next;
- }
-
- /*
- * Now parse the modification date. Be careful to not overrun
- * buffers.
- */
- strncpy(buf, ar->hdr.ar_date, sizeof(ar->hdr.ar_date));
- buf[sizeof(ar->hdr.ar_date)] = '\0';
-
- errno = 0;
- ar->time = (int64_t)strtoll(buf, &end, 10);
- if (errno != 0 || strspn(end, " ") != strlen(end)) {
- ArchError(("%s: bad date format in archive '%s'",
- ar->fname, buf));
- return (-1);
- }
-
- /*
- * Now check for the symbol table. This should really be the first
- * entry, but we don't check this.
- */
- if (strcmp(ar->sname, BSD_RANLIBMAG) == 0 ||
- strcmp(ar->sname, SVR4_RANLIBMAG) == 0) {
- /* symbol table - return a zero length name */
- ar->member[0] = '\0';
- ar->sname[0] = '\0';
- return (1);
- }
-
- have_long_name = 0;
-
- /*
- * Look whether this is a long name. There are several variants
- * of long names:
- * "#1/12 " - 12 length of following filename
- * "/17 " - index into name table
- * " 17 " - index into name table
- * Note that in the last case we must also check that there is no
- * slash in the name because of filenames with leading spaces:
- * " 777.o/ " - filename 777.o
- */
- if (ar->sname[0] == '/' || (ar->sname[0] == ' ' &&
- strchr(ar->sname, '/') == NULL)) {
- /* SVR4 extended name */
- errno = 0;
- offs = strtoul(ar->sname + 1, &end, 10);
- if (errno != 0 || *end != '\0' || offs >= ar->nametablen ||
- end == ar->sname + 1) {
- ArchError(("%s: bad extended name '%s'", ar->fname,
- ar->sname));
- return (-1);
- }
-
- /* fetch the name */
- if (ar->mlen <= strlen(ar->nametab + offs)) {
- ar->mlen = strlen(ar->nametab + offs) + 1;
- ar->member = erealloc(ar->member, ar->mlen);
- }
- strcpy(ar->member, ar->nametab + offs);
-
- have_long_name = 1;
-
- } else if (strncmp(ar->sname, BSD_EXT1, BSD_EXT1LEN) == 0 &&
- isdigit(ar->sname[BSD_EXT1LEN])) {
- /* BSD4.4 extended name */
- errno = 0;
- offs = strtoul(ar->sname + BSD_EXT1LEN, &end, 10);
- if (errno != 0 || *end != '\0' ||
- end == ar->sname + BSD_EXT1LEN) {
- ArchError(("%s: bad extended name '%s'", ar->fname,
- ar->sname));
- return (-1);
- }
-
- /* read it from the archive */
- if (ar->mlen <= offs) {
- ar->mlen = offs + 1;
- ar->member = erealloc(ar->member, ar->mlen);
- }
- ret = fread(ar->member, 1, offs, ar->fp);
- if (ret != offs) {
- if (ferror(ar->fp)) {
- ArchError(("%s: reading extended name: %s",
- ar->fname, strerror(errno)));
- } else {
- ArchError(("%s: reading extended name: "
- "short read", ar->fname));
- }
- return (-1);
- }
- ar->member[offs] = '\0';
-
- have_long_name = 1;
- }
-
- /*
- * Now remove the trailing slash that Svr4 puts at
- * the end of the member name to support trailing spaces in names.
- */
- if (ptr > ar->sname && ptr[-1] == '/')
- *--ptr = '\0';
-
- if (!have_long_name) {
- if (strlen(ar->sname) >= ar->mlen) {
- ar->mlen = strlen(ar->sname) + 1;
- ar->member = erealloc(ar->member, ar->mlen);
- }
- strcpy(ar->member, ar->sname);
- }
-
- return (1);
-}
-
-/*
- * Touch the current archive member by writing a new header with an
- * updated timestamp. The return value is 0 for success and -1 for errors.
- */
-static int
-ArchArchiveTouch(struct arfile *ar, int64_t ts)
-{
-
- /* seek to our header */
- if (fseeko(ar->fp, ar->pos, SEEK_SET) == -1) {
- ArchError(("%s: cannot seek to %jd: %s", ar->fname,
- (intmax_t)ar->pos, strerror(errno)));
- return (-1);
- }
-
- /*
- * change timestamp, be sure to not NUL-terminated it, but
- * to fill with spaces.
- */
- snprintf(ar->hdr.ar_date, sizeof(ar->hdr.ar_date), "%jd",
- (intmax_t)ts);
- memset(ar->hdr.ar_date + strlen(ar->hdr.ar_date),
- ' ', sizeof(ar->hdr.ar_date) - strlen(ar->hdr.ar_date));
-
- if (fwrite(&ar->hdr, sizeof(ar->hdr), 1, ar->fp) != 1) {
- ArchError(("%s: cannot touch: %s", ar->fname, strerror(errno)));
- return (-1);
- }
- return (0);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * ArchFindMember --
- * Locate a member of an archive, given the path of the archive and
- * the path of the desired member. If the archive is to be modified,
- * the mode should be "r+", if not, it should be "r". The archive
- * file is returned positioned at the correct header.
- *
- * Results:
- * A struct arfile *, opened for reading and, possibly writing,
- * positioned at the member's header, or NULL if the member was
- * nonexistent.
- *
- *-----------------------------------------------------------------------
- */
-static struct arfile *
-ArchFindMember(const char *archive, const char *member, const char *mode)
-{
- struct arfile *ar;
- const char *cp; /* Useful character pointer */
-
- if ((ar = ArchArchiveOpen(archive, mode)) == NULL)
- return (NULL);
-
- /*
- * Because of space constraints and similar things, files are archived
- * using their final path components, not the entire thing, so we need
- * to point 'member' to the final component, if there is one, to make
- * the comparisons easier...
- */
- if (member != NULL) {
- cp = strrchr(member, '/');
- if (cp != NULL) {
- member = cp + 1;
- }
- }
-
- while (ArchArchiveNext(ar) > 0) {
- /*
- * When comparing there are actually three cases:
- * (1) the name fits into the limit og af_name,
- * (2) the name is longer and the archive supports long names,
- * (3) the name is longer and the archive doesn't support long
- * names.
- * Because we don't know whether the archive supports long
- * names or not we need to be carefull.
- */
- if (member == NULL) {
- /* special case - symbol table */
- if (ar->member[0] == '\0')
- return (ar);
- } else if (strlen(member) <= AR_NAMSIZ) {
- /* case (1) */
- if (strcmp(ar->member, member) == 0)
- return (ar);
- } else if (strcmp(ar->member, member) == 0) {
- /* case (3) */
- return (ar);
- } else {
- /* case (2) */
- if (strlen(ar->member) == AR_NAMSIZ &&
- strncmp(member, ar->member, AR_NAMSIZ) == 0)
- return (ar);
- }
- }
-
- /* not found */
- ArchArchiveClose(ar);
- return (NULL);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * ArchStatMember --
- * Locate a member of an archive, given the path of the archive and
- * the path of the desired member, and a boolean representing whether
- * or not the archive should be hashed (if not already hashed).
- *
- * Results:
- * A pointer to the current struct ar_hdr structure for the member. Note
- * That no position is returned, so this is not useful for touching
- * archive members. This is mostly because we have no assurances that
- * The archive will remain constant after we read all the headers, so
- * there's not much point in remembering the position...
- *
- * Side Effects:
- *
- *-----------------------------------------------------------------------
- */
-static int64_t
-ArchStatMember(const char *archive, const char *member, Boolean hash)
-{
- struct arfile *arf;
- int64_t ret;
- int t;
- char *cp; /* Useful character pointer */
- Arch *ar; /* Archive descriptor */
- Hash_Entry *he; /* Entry containing member's description */
- char copy[AR_NAMSIZ + 1];
-
- /*
- * Because of space constraints and similar things, files are archived
- * using their final path components, not the entire thing, so we need
- * to point 'member' to the final component, if there is one, to make
- * the comparisons easier...
- */
- if (member != NULL) {
- cp = strrchr(member, '/');
- if (cp != NULL)
- member = cp + 1;
- }
-
- TAILQ_FOREACH(ar, &archives, link) {
- if (strcmp(archive, ar->name) == 0)
- break;
- }
- if (ar == NULL) {
- /* archive not found */
- if (!hash) {
- /*
- * Caller doesn't want the thing hashed, just use
- * ArchFindMember to read the header for the member
- * out and close down the stream again.
- */
- arf = ArchFindMember(archive, member, "r");
- if (arf == NULL) {
- return (INT64_MIN);
- }
- ret = arf->time;
- ArchArchiveClose(arf);
- return (ret);
- }
-
- /*
- * We don't have this archive on the list yet, so we want to
- * find out everything that's in it and cache it so we can get
- * at it quickly.
- */
- arf = ArchArchiveOpen(archive, "r");
- if (arf == NULL) {
- return (INT64_MIN);
- }
-
- /* create archive data structure */
- ar = emalloc(sizeof(*ar));
- ar->name = estrdup(archive);
- Hash_InitTable(&ar->members, -1);
-
- while ((t = ArchArchiveNext(arf)) > 0) {
- he = Hash_CreateEntry(&ar->members, arf->member, NULL);
- Hash_SetValue(he, emalloc(sizeof(int64_t)));
- *(int64_t *)Hash_GetValue(he) = arf->time;
- }
-
- ArchArchiveClose(arf);
-
- if (t < 0) {
- /* error happend - throw away everything */
- Hash_DeleteTable(&ar->members);
- free(ar->name);
- free(ar);
- return (INT64_MIN);
- }
-
- TAILQ_INSERT_TAIL(&archives, ar, link);
- }
-
- /*
- * Now that the archive has been read and cached, we can look into
- * the hash table to find the desired member's header.
- */
- he = Hash_FindEntry(&ar->members, member);
- if (he != NULL)
- return (*(int64_t *)Hash_GetValue (he));
-
- if (member != NULL && strlen(member) > AR_NAMSIZ) {
- /* Try truncated name */
- strncpy(copy, member, AR_NAMSIZ);
- copy[AR_NAMSIZ] = '\0';
-
- if ((he = Hash_FindEntry(&ar->members, copy)) != NULL)
- return (*(int64_t *)Hash_GetValue(he));
- }
-
- return (INT64_MIN);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Arch_Touch --
- * Touch a member of an archive.
- *
- * Results:
- * The 'time' field of the member's header is updated.
- *
- * Side Effects:
- * The modification time of the entire archive is also changed.
- * For a library, this could necessitate the re-ranlib'ing of the
- * whole thing.
- *
- *-----------------------------------------------------------------------
- */
-void
-Arch_Touch(GNode *gn)
-{
- struct arfile *ar;
-
- ar = ArchFindMember(Var_Value(ARCHIVE, gn),
- Var_Value(TARGET, gn), "r+");
-
- if (ar != NULL) {
- ArchArchiveTouch(ar, (int64_t)now);
- ArchArchiveClose(ar);
- }
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Arch_TouchLib --
- * Given a node which represents a library, touch the thing, making
- * sure that the table of contents also is touched.
- *
- * Results:
- * None.
- *
- * Side Effects:
- * Both the modification time of the library and of the RANLIBMAG
- * member are set to 'now'.
- *
- *-----------------------------------------------------------------------
- */
-void
-Arch_TouchLib(GNode *gn)
-{
- struct arfile *ar; /* Open archive */
- struct utimbuf times; /* Times for utime() call */
-
- ar = ArchFindMember(gn->path, NULL, "r+");
- if (ar != NULL) {
- ArchArchiveTouch(ar, (int64_t)now);
- ArchArchiveClose(ar);
-
- times.actime = times.modtime = now;
- utime(gn->path, &times);
- }
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Arch_MTime --
- * Return the modification time of a member of an archive, given its
- * name.
- *
- * Results:
- * The modification time(seconds).
- * XXXHB this should be a long.
- *
- * Side Effects:
- * The mtime field of the given node is filled in with the value
- * returned by the function.
- *
- *-----------------------------------------------------------------------
- */
-int
-Arch_MTime(GNode *gn)
-{
- int64_t mtime;
-
- mtime = ArchStatMember(Var_Value(ARCHIVE, gn),
- Var_Value(TARGET, gn), TRUE);
-
- if (mtime == INT_MIN) {
- mtime = 0;
- }
- gn->mtime = (int)mtime; /* XXX */
- return (gn->mtime);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Arch_MemMTime --
- * Given a non-existent archive member's node, get its modification
- * time from its archived form, if it exists.
- *
- * Results:
- * The modification time.
- *
- * Side Effects:
- * The mtime field is filled in.
- *
- *-----------------------------------------------------------------------
- */
-int
-Arch_MemMTime(GNode *gn)
-{
- LstNode *ln;
- GNode *pgn;
- char *nameStart;
- char *nameEnd;
-
- for (ln = Lst_First(&gn->parents); ln != NULL; ln = Lst_Succ(ln)) {
- pgn = Lst_Datum(ln);
-
- if (pgn->type & OP_ARCHV) {
- /*
- * If the parent is an archive specification and is
- * being made and its member's name matches the name of
- * the node we were given, record the modification time
- * of the parent in the child. We keep searching its
- * parents in case some other parent requires this
- * child to exist...
- */
- nameStart = strchr(pgn->name, '(') + 1;
- nameEnd = strchr(nameStart, ')');
-
- if (pgn->make && strncmp(nameStart, gn->name,
- nameEnd - nameStart) == 0) {
- gn->mtime = Arch_MTime(pgn);
- }
- } else if (pgn->make) {
- /*
- * Something which isn't a library depends on the
- * existence of this target, so it needs to exist.
- */
- gn->mtime = 0;
- break;
- }
- }
- return (gn->mtime);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Arch_FindLib --
- * Search for a named library along the given search path.
- *
- * Results:
- * None.
- *
- * Side Effects:
- * The node's 'path' field is set to the found path (including the
- * actual file name, not -l...). If the system can handle the -L
- * flag when linking (or we cannot find the library), we assume that
- * the user has placed the .LIBRARIES variable in the final linking
- * command (or the linker will know where to find it) and set the
- * TARGET variable for this node to be the node's name. Otherwise,
- * we set the TARGET variable to be the full path of the library,
- * as returned by Dir_FindFile.
- *
- *-----------------------------------------------------------------------
- */
-void
-Arch_FindLib(GNode *gn, struct Path *path)
-{
- char *libName; /* file name for archive */
- size_t sz;
-
- sz = strlen(gn->name) + 4;
- libName = emalloc(sz);
- snprintf(libName, sz, "lib%s.a", &gn->name[2]);
-
- gn->path = Path_FindFile(libName, path);
-
- free(libName);
-
-#ifdef LIBRARIES
- Var_Set(TARGET, gn->name, gn);
-#else
- Var_Set(TARGET, gn->path == NULL ? gn->name : gn->path, gn);
-#endif /* LIBRARIES */
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Arch_LibOODate --
- * Decide if a node with the OP_LIB attribute is out-of-date. Called
- * from Make_OODate to make its life easier, with the library's
- * graph node.
- *
- * There are several ways for a library to be out-of-date that are
- * not available to ordinary files. In addition, there are ways
- * that are open to regular files that are not available to
- * libraries. A library that is only used as a source is never
- * considered out-of-date by itself. This does not preclude the
- * library's modification time from making its parent be out-of-date.
- * A library will be considered out-of-date for any of these reasons,
- * given that it is a target on a dependency line somewhere:
- * Its modification time is less than that of one of its
- * sources (gn->mtime < gn->cmtime).
- * Its modification time is greater than the time at which the
- * make began (i.e. it's been modified in the course
- * of the make, probably by archiving).
- * The modification time of one of its sources is greater than
- * the one of its RANLIBMAG member (i.e. its table of contents
- * is out-of-date). We don't compare of the archive time
- * vs. TOC time because they can be too close. In my
- * opinion we should not bother with the TOC at all since
- * this is used by 'ar' rules that affect the data contents
- * of the archive, not by ranlib rules, which affect the
- * TOC.
- *
- * Results:
- * TRUE if the library is out-of-date. FALSE otherwise.
- *
- * Side Effects:
- * The library will be hashed if it hasn't been already.
- *
- *-----------------------------------------------------------------------
- */
-Boolean
-Arch_LibOODate(GNode *gn)
-{
- int64_t mtime; /* The table-of-contents's mod time */
-
- if (OP_NOP(gn->type) && Lst_IsEmpty(&gn->children)) {
- return (FALSE);
- }
- if (gn->mtime > now || gn->mtime < gn->cmtime) {
- return (TRUE);
- }
-
- mtime = ArchStatMember(gn->path, NULL, FALSE);
- if (mtime == INT64_MIN) {
- /*
- * Not found. A library w/o a table of contents is out-of-date
- */
- if (DEBUG(ARCH) || DEBUG(MAKE)) {
- Debug("No TOC...");
- }
- return (TRUE);
- }
-
- /* XXX choose one. */
- if (DEBUG(ARCH) || DEBUG(MAKE)) {
- Debug("TOC modified %s...", Targ_FmtTime(mtime));
- }
- return (gn->cmtime > mtime);
-}
diff --git a/usr.bin/make/arch.h b/usr.bin/make/arch.h
deleted file mode 100644
index 3c28b2f..0000000
--- a/usr.bin/make/arch.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef arch_h_488adf7a
-#define arch_h_488adf7a
-
-#include "util.h"
-
-struct GNode;
-struct Lst;
-struct Path;
-
-/* archive errors are fatal */
-extern Boolean arch_fatal;
-
-Boolean Arch_ParseArchive(char **, struct Lst *, struct GNode *);
-void Arch_Touch(struct GNode *);
-void Arch_TouchLib(struct GNode *);
-int Arch_MTime(struct GNode *);
-int Arch_MemMTime(struct GNode *);
-void Arch_FindLib(struct GNode *, struct Path *);
-Boolean Arch_LibOODate(struct GNode *);
-
-#endif /* arch_h_488adf7a */
diff --git a/usr.bin/make/buf.c b/usr.bin/make/buf.c
deleted file mode 100644
index 6453abf..0000000
--- a/usr.bin/make/buf.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/*-
- * Copyright (c) 2005 Max Okumoto
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1988, 1989 by Adam de Boor
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)buf.c 8.1 (Berkeley) 6/6/93
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * buf.c
- * Functions for automatically-expanded buffers.
- */
-
-#include <string.h>
-#include <stdlib.h>
-
-#include "buf.h"
-#include "util.h"
-
-/**
- * Returns the number of bytes in the buffer. Doesn't include the
- * null-terminating byte.
- */
-inline size_t
-Buf_Size(const Buffer *buf)
-{
-
- return (buf->end - buf->buf);
-}
-
-/**
- * Returns a reference to the data contained in the buffer.
- *
- * @note Adding data to the Buffer object may invalidate the reference.
- */
-inline char *
-Buf_Data(const Buffer *bp)
-{
-
- return (bp->buf);
-}
-
-/**
- * Expand the buffer to hold the number of additional bytes, plus
- * space to store a terminating NULL byte.
- */
-static inline void
-BufExpand(Buffer *bp, size_t nb)
-{
- size_t len = Buf_Size(bp);
- size_t size;
-
- if (bp->size < len + nb + 1) {
- size = bp->size + MAX(nb + 1, BUF_ADD_INC);
- bp->size = size;
- bp->buf = erealloc(bp->buf, size);
- bp->end = bp->buf + len;
- }
-}
-
-/**
- * Add a single byte to the buffer.
- */
-inline void
-Buf_AddByte(Buffer *bp, Byte byte)
-{
-
- BufExpand(bp, 1);
-
- *bp->end = byte;
- bp->end++;
- *bp->end = '\0';
-}
-
-/**
- * Add bytes to the buffer.
- */
-void
-Buf_AddBytes(Buffer *bp, size_t len, const Byte *bytes)
-{
-
- BufExpand(bp, len);
-
- memcpy(bp->end, bytes, len);
- bp->end += len;
- *bp->end = '\0';
-}
-
-/**
- * Get a reference to the internal buffer.
- *
- * len:
- * Pointer to where we return the number of bytes in the internal buffer.
- *
- * Returns:
- * return A pointer to the data.
- */
-Byte *
-Buf_GetAll(Buffer *bp, size_t *len)
-{
-
- if (len != NULL)
- *len = Buf_Size(bp);
-
- return (bp->buf);
-}
-
-/**
- * Get the contents of a buffer and destroy the buffer. If the buffer
- * is NULL, return NULL.
- *
- * Returns:
- * the pointer to the data.
- */
-char *
-Buf_Peel(Buffer *bp)
-{
- char *ret;
-
- if (bp == NULL)
- return (NULL);
- ret = bp->buf;
- free(bp);
- return (ret);
-}
-
-/**
- * Initialize a buffer. If no initial size is given, a reasonable
- * default is used.
- *
- * Returns:
- * A buffer object to be given to other functions in this library.
- *
- * Side Effects:
- * Space is allocated for the Buffer object and a internal buffer.
- */
-Buffer *
-Buf_Init(size_t size)
-{
- Buffer *bp; /* New Buffer */
-
- if (size <= 0)
- size = BUF_DEF_SIZE;
-
- bp = emalloc(sizeof(*bp));
- bp->size = size;
- bp->buf = emalloc(size);
- bp->end = bp->buf;
- *bp->end = '\0';
-
- return (bp);
-}
-
-/**
- * Destroy a buffer, and optionally free its data, too.
- *
- * Side Effects:
- * Space for the Buffer object and possibly the internal buffer
- * is de-allocated.
- */
-void
-Buf_Destroy(Buffer *buf, Boolean freeData)
-{
-
- if (freeData)
- free(buf->buf);
- free(buf);
-}
-
-/**
- * Replace the last byte in a buffer. If the buffer was empty
- * intially, then a new byte will be added.
- */
-void
-Buf_ReplaceLastByte(Buffer *bp, Byte byte)
-{
-
- if (bp->end == bp->buf) {
- Buf_AddByte(bp, byte);
- } else {
- *(bp->end - 1) = byte;
- }
-}
-
-/**
- * Append characters in str to Buffer object
- */
-void
-Buf_Append(Buffer *bp, const char str[])
-{
-
- Buf_AddBytes(bp, strlen(str), str);
-}
-
-/**
- * Append characters in buf to Buffer object
- */
-void
-Buf_AppendBuf(Buffer *bp, const Buffer *buf)
-{
-
- Buf_AddBytes(bp, Buf_Size(buf), buf->buf);
-}
-
-/**
- * Append characters between str and end to Buffer object.
- */
-void
-Buf_AppendRange(Buffer *bp, const char str[], const char *end)
-{
-
- Buf_AddBytes(bp, end - str, str);
-}
-
-/**
- * Convert newlines in buffer to spaces. The trailing newline is
- * removed.
- */
-void
-Buf_StripNewlines(Buffer *bp)
-{
- char *ptr = bp->end;
-
- /*
- * If there is anything in the buffer, remove the last
- * newline character.
- */
- if (ptr != bp->buf) {
- if (*(ptr - 1) == '\n') {
- /* shorten buffer */
- *(ptr - 1) = '\0';
- --bp->end;
- }
- --ptr;
- }
-
- /* Convert newline characters to a space characters. */
- while (ptr != bp->buf) {
- if (*ptr == '\n') {
- *ptr = ' ';
- }
- --ptr;
- }
-}
-/**
- * Clear the contents of the buffer.
- */
-void
-Buf_Clear(Buffer *bp)
-{
-
- bp->end = bp->buf;
- *bp->end = '\0';
-}
diff --git a/usr.bin/make/buf.h b/usr.bin/make/buf.h
deleted file mode 100644
index 106f348..0000000
--- a/usr.bin/make/buf.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1988, 1989 by Adam de Boor
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)buf.h 8.2 (Berkeley) 4/28/95
- * $FreeBSD$
- */
-
-#ifndef buf_h_a61a6812
-#define buf_h_a61a6812
-
-/*-
- * buf.h --
- * Header for users of the buf library.
- */
-
-#include <sys/types.h>
-
-#include "util.h"
-
-/*
- * There are several places where expandable buffers are used (parse.c and
- * var.c). This constant is merely the starting point for those buffers. If
- * lines tend to be much shorter than this, it would be best to reduce BSIZE.
- * If longer, it should be increased. Reducing it will cause more copying to
- * be done for longer lines, but will save space for shorter ones. In any
- * case, it ought to be a power of two simply because most storage allocation
- * schemes allocate in powers of two.
- */
-#define MAKE_BSIZE 256 /* starting size for expandable buffers */
-
-#define BUF_DEF_SIZE 256 /* Default buffer size */
-#define BUF_ADD_INC 256 /* Expansion increment when Adding */
-
-typedef char Byte;
-
-typedef struct Buffer {
- size_t size; /* Current size of the buffer */
- Byte *buf; /* The buffer itself */
- Byte *end; /* Place to write to */
-} Buffer;
-
-void Buf_AddByte(Buffer *, Byte);
-void Buf_AddBytes(Buffer *, size_t, const Byte *);
-void Buf_Append(Buffer *, const char []);
-void Buf_AppendBuf(Buffer *, const Buffer *);
-void Buf_AppendRange(Buffer *, const char [], const char *);
-void Buf_Clear(Buffer *);
-char *Buf_Data(const Buffer *);
-void Buf_Destroy(Buffer *, Boolean);
-Byte *Buf_GetAll(Buffer *, size_t *);
-Buffer *Buf_Init(size_t);
-char *Buf_Peel(Buffer *);
-void Buf_ReplaceLastByte(Buffer *, Byte);
-size_t Buf_Size(const Buffer *);
-void Buf_StripNewlines(Buffer *);
-
-#endif /* buf_h_a61a6812 */
diff --git a/usr.bin/make/cond.c b/usr.bin/make/cond.c
deleted file mode 100644
index 6e7a094..0000000
--- a/usr.bin/make/cond.c
+++ /dev/null
@@ -1,1221 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1988, 1989 by Adam de Boor
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)cond.c 8.2 (Berkeley) 1/2/94
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Functions to handle conditionals in a makefile.
- *
- * Interface:
- * Cond_Eval Evaluate the conditional in the passed line.
- */
-
-#include <ctype.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "buf.h"
-#include "cond.h"
-#include "dir.h"
-#include "globals.h"
-#include "GNode.h"
-#include "make.h"
-#include "parse.h"
-#include "str.h"
-#include "targ.h"
-#include "util.h"
-#include "var.h"
-
-/*
- * The parsing of conditional expressions is based on this grammar:
- * E -> F || E
- * E -> F
- * F -> T && F
- * F -> T
- * T -> defined(variable)
- * T -> make(target)
- * T -> exists(file)
- * T -> empty(varspec)
- * T -> target(name)
- * T -> symbol
- * T -> $(varspec) op value
- * T -> $(varspec) == "string"
- * T -> $(varspec) != "string"
- * T -> ( E )
- * T -> ! T
- * op -> == | != | > | < | >= | <=
- *
- * 'symbol' is some other symbol to which the default function (condDefProc)
- * is applied.
- *
- * Tokens are scanned from the 'condExpr' string. The scanner (CondToken)
- * will return And for '&' and '&&', Or for '|' and '||', Not for '!',
- * LParen for '(', RParen for ')' and will evaluate the other terminal
- * symbols, using either the default function or the function given in the
- * terminal, and return the result as either True or False.
- *
- * All Non-Terminal functions (CondE, CondF and CondT) return Err on error.
- */
-typedef enum {
- And,
- Or,
- Not,
- True,
- False,
- LParen,
- RParen,
- EndOfFile,
- None,
- Err
-} Token;
-
-typedef Boolean CondProc(int, char *);
-
-/*-
- * Structures to handle elegantly the different forms of #if's. The
- * last two fields are stored in condInvert and condDefProc, respectively.
- */
-static void CondPushBack(Token);
-static int CondGetArg(char **, char **, const char *, Boolean);
-static CondProc CondDoDefined;
-static CondProc CondDoMake;
-static CondProc CondDoExists;
-static CondProc CondDoTarget;
-static char *CondCvtArg(char *, double *);
-static Token CondToken(Boolean);
-static Token CondT(Boolean);
-static Token CondF(Boolean);
-static Token CondE(Boolean);
-
-static const struct If {
- Boolean doNot; /* TRUE if default function should be negated */
- CondProc *defProc; /* Default function to apply */
- Boolean isElse; /* actually el<XXX> */
-} ifs[] = {
- [COND_IF] = { FALSE, CondDoDefined, FALSE },
- [COND_IFDEF] = { FALSE, CondDoDefined, FALSE },
- [COND_IFNDEF] = { TRUE, CondDoDefined, FALSE },
- [COND_IFMAKE] = { FALSE, CondDoMake, FALSE },
- [COND_IFNMAKE] = { TRUE, CondDoMake, FALSE },
- [COND_ELIF] = { FALSE, CondDoDefined, TRUE },
- [COND_ELIFDEF] = { FALSE, CondDoDefined, TRUE },
- [COND_ELIFNDEF] = { TRUE, CondDoDefined, TRUE },
- [COND_ELIFMAKE] = { FALSE, CondDoMake, TRUE },
- [COND_ELIFNMAKE] = { TRUE, CondDoMake, TRUE },
-};
-
-static Boolean condInvert; /* Invert the default function */
-static CondProc *condDefProc; /* default function to apply */
-static char *condExpr; /* The expression to parse */
-static Token condPushBack = None; /* Single push-back token in parsing */
-
-#define MAXIF 30 /* greatest depth of #if'ing */
-
-static Boolean condStack[MAXIF]; /* Stack of conditionals's values */
-static int condLineno[MAXIF]; /* Line numbers of the opening .if */
-static int condTop = MAXIF; /* Top-most conditional */
-static int skipIfLevel = 0; /* Depth of skipped conditionals */
-static int skipIfLineno[MAXIF]; /* Line numbers of skipped .ifs */
-Boolean skipLine = FALSE; /* Whether the parse module is skipping
- * lines */
-
-/**
- * CondPushBack
- * Push back the most recent token read. We only need one level of
- * this, so the thing is just stored in 'condPushback'.
- *
- * Side Effects:
- * condPushback is overwritten.
- */
-static void
-CondPushBack(Token t)
-{
-
- condPushBack = t;
-}
-
-/**
- * CondGetArg
- * Find the argument of a built-in function. parens is set to TRUE
- * if the arguments are bounded by parens.
- *
- * Results:
- * The length of the argument and the address of the argument.
- *
- * Side Effects:
- * The pointer is set to point to the closing parenthesis of the
- * function call.
- */
-static int
-CondGetArg(char **linePtr, char **argPtr, const char *func, Boolean parens)
-{
- char *cp;
- size_t argLen;
- Buffer *buf;
-
- cp = *linePtr;
- if (parens) {
- while (*cp != '(' && *cp != '\0') {
- cp++;
- }
- if (*cp == '(') {
- cp++;
- }
- }
-
- if (*cp == '\0') {
- /*
- * No arguments whatsoever. Because 'make' and 'defined'
- * aren't really "reserved words", we don't print a message.
- * I think this is better than hitting the user with a warning
- * message every time s/he uses the word 'make' or 'defined'
- * at the beginning of a symbol...
- */
- *argPtr = cp;
- return (0);
- }
-
- while (*cp == ' ' || *cp == '\t') {
- cp++;
- }
-
- /*
- * Create a buffer for the argument and start it out at 16 characters
- * long. Why 16? Why not?
- */
- buf = Buf_Init(16);
-
- while ((strchr(" \t)&|", *cp) == NULL) && (*cp != '\0')) {
- if (*cp == '$') {
- /*
- * Parse the variable spec and install it as part of
- * the argument if it's valid. We tell Var_Parse to
- * complain on an undefined variable, so we don't do
- * it too. Nor do we return an error, though perhaps
- * we should...
- */
- char *cp2;
- size_t len = 0;
- Boolean doFree;
-
- cp2 = Var_Parse(cp, VAR_CMD, TRUE, &len, &doFree);
-
- Buf_Append(buf, cp2);
- if (doFree) {
- free(cp2);
- }
- cp += len;
- } else {
- Buf_AddByte(buf, (Byte)*cp);
- cp++;
- }
- }
-
- Buf_AddByte(buf, (Byte)'\0');
- *argPtr = (char *)Buf_GetAll(buf, &argLen);
- Buf_Destroy(buf, FALSE);
-
- while (*cp == ' ' || *cp == '\t') {
- cp++;
- }
- if (parens && *cp != ')') {
- Parse_Error(PARSE_WARNING,
- "Missing closing parenthesis for %s()", func);
- return (0);
- } else if (parens) {
- /*
- * Advance pointer past close parenthesis.
- */
- cp++;
- }
-
- *linePtr = cp;
- return (argLen);
-}
-
-/**
- * CondDoDefined
- * Handle the 'defined' function for conditionals.
- *
- * Results:
- * TRUE if the given variable is defined.
- */
-static Boolean
-CondDoDefined(int argLen, char *arg)
-{
- char savec = arg[argLen];
- Boolean result;
-
- arg[argLen] = '\0';
- if (Var_Value(arg, VAR_CMD) != NULL) {
- result = TRUE;
- } else {
- result = FALSE;
- }
- arg[argLen] = savec;
- return (result);
-}
-
-/**
- * CondDoMake
- * Handle the 'make' function for conditionals.
- *
- * Results:
- * TRUE if the given target is being made.
- */
-static Boolean
-CondDoMake(int argLen, char *arg)
-{
- char savec = arg[argLen];
- Boolean result;
- const LstNode *ln;
-
- arg[argLen] = '\0';
- result = FALSE;
- LST_FOREACH(ln, &create) {
- if (Str_Match(Lst_Datum(ln), arg)) {
- result = TRUE;
- break;
- }
- }
- arg[argLen] = savec;
- return (result);
-}
-
-/**
- * CondDoExists
- * See if the given file exists.
- *
- * Results:
- * TRUE if the file exists and FALSE if it does not.
- */
-static Boolean
-CondDoExists(int argLen, char *arg)
-{
- char savec = arg[argLen];
- Boolean result;
- char *path;
-
- arg[argLen] = '\0';
- path = Path_FindFile(arg, &dirSearchPath);
- if (path != NULL) {
- result = TRUE;
- free(path);
- } else {
- result = FALSE;
- }
- arg[argLen] = savec;
- return (result);
-}
-
-/**
- * CondDoTarget
- * See if the given node exists and is an actual target.
- *
- * Results:
- * TRUE if the node exists as a target and FALSE if it does not.
- */
-static Boolean
-CondDoTarget(int argLen, char *arg)
-{
- char savec = arg[argLen];
- Boolean result;
- GNode *gn;
-
- arg[argLen] = '\0';
- gn = Targ_FindNode(arg, TARG_NOCREATE);
- if ((gn != NULL) && !OP_NOP(gn->type)) {
- result = TRUE;
- } else {
- result = FALSE;
- }
- arg[argLen] = savec;
- return (result);
-}
-
-/**
- * CondCvtArg
- * Convert the given number into a double. If the number begins
- * with 0x, it is interpreted as a hexadecimal integer
- * and converted to a double from there. All other strings just have
- * strtod called on them.
- *
- * Results:
- * Sets 'value' to double value of string.
- * Returns address of the first character after the last valid
- * character of the converted number.
- *
- * Side Effects:
- * Can change 'value' even if string is not a valid number.
- */
-static char *
-CondCvtArg(char *str, double *value)
-{
-
- if ((*str == '0') && (str[1] == 'x')) {
- long i;
-
- for (str += 2, i = 0; ; str++) {
- int x;
-
- if (isdigit((unsigned char)*str))
- x = *str - '0';
- else if (isxdigit((unsigned char)*str))
- x = 10 + *str -
- isupper((unsigned char)*str) ? 'A' : 'a';
- else {
- *value = (double)i;
- return (str);
- }
- i = (i << 4) + x;
- }
-
- } else {
- char *eptr;
-
- *value = strtod(str, &eptr);
- return (eptr);
- }
-}
-
-/**
- * CondToken
- * Return the next token from the input.
- *
- * Results:
- * A Token for the next lexical token in the stream.
- *
- * Side Effects:
- * condPushback will be set back to None if it is used.
- */
-static Token
-CondToken(Boolean doEval)
-{
- Token t;
-
- if (condPushBack != None) {
- t = condPushBack;
- condPushBack = None;
- return (t);
- }
-
- while (*condExpr == ' ' || *condExpr == '\t') {
- condExpr++;
- }
- switch (*condExpr) {
- case '(':
- t = LParen;
- condExpr++;
- break;
- case ')':
- t = RParen;
- condExpr++;
- break;
- case '|':
- if (condExpr[1] == '|') {
- condExpr++;
- }
- condExpr++;
- t = Or;
- break;
- case '&':
- if (condExpr[1] == '&') {
- condExpr++;
- }
- condExpr++;
- t = And;
- break;
- case '!':
- t = Not;
- condExpr++;
- break;
- case '\n':
- case '\0':
- t = EndOfFile;
- break;
- case '$': {
- char *lhs;
- const char *op;
- char *rhs;
- char zero[] = "0";
- size_t varSpecLen = 0;
- Boolean doFree;
-
- /*
- * Parse the variable spec and skip over it, saving its
- * value in lhs.
- */
- t = Err;
- lhs = Var_Parse(condExpr, VAR_CMD, doEval,
- &varSpecLen, &doFree);
- if (lhs == var_Error) {
- /*
- * Even if !doEval, we still report syntax
- * errors, which is what getting var_Error
- * back with !doEval means.
- */
- return (Err);
- }
- condExpr += varSpecLen;
-
- if (!isspace((unsigned char)*condExpr) &&
- strchr("!=><", *condExpr) == NULL) {
- Buffer *buf;
-
- buf = Buf_Init(0);
-
- Buf_Append(buf, lhs);
-
- if (doFree)
- free(lhs);
-
- for (;*condExpr &&
- !isspace((unsigned char)*condExpr);
- condExpr++)
- Buf_AddByte(buf, (Byte)*condExpr);
-
- Buf_AddByte(buf, (Byte)'\0');
- lhs = (char *)Buf_GetAll(buf, &varSpecLen);
- Buf_Destroy(buf, FALSE);
-
- doFree = TRUE;
- }
-
- /*
- * Skip whitespace to get to the operator
- */
- while (isspace((unsigned char)*condExpr))
- condExpr++;
-
- /*
- * Make sure the operator is a valid one. If it isn't a
- * known relational operator, pretend we got a
- * != 0 comparison.
- */
- op = condExpr;
- switch (*condExpr) {
- case '!':
- case '=':
- case '<':
- case '>':
- if (condExpr[1] == '=') {
- condExpr += 2;
- } else {
- condExpr += 1;
- }
- while (isspace((unsigned char)*condExpr)) {
- condExpr++;
- }
- if (*condExpr == '\0') {
- Parse_Error(PARSE_WARNING,
- "Missing right-hand-side of operator");
- goto error;
- }
- rhs = condExpr;
- break;
-
- default:
- op = "!=";
- rhs = zero;
- break;
- }
- if (*rhs == '"') {
- /*
- * Doing a string comparison. Only allow == and
- * != for * operators.
- */
- char *string;
- char *cp, *cp2;
- int qt;
- Buffer *buf;
-
- do_string_compare:
- if (((*op != '!') && (*op != '=')) ||
- (op[1] != '=')) {
- Parse_Error(PARSE_WARNING,
- "String comparison operator should "
- "be either == or !=");
- goto error;
- }
-
- buf = Buf_Init(0);
- qt = *rhs == '"' ? 1 : 0;
-
- for (cp = &rhs[qt];
- ((qt && (*cp != '"')) ||
- (!qt && strchr(" \t)", *cp) == NULL)) &&
- (*cp != '\0'); cp++) {
- if ((*cp == '\\') && (cp[1] != '\0')) {
- /*
- * Backslash escapes things --
- * skip over next character, * if it exists.
- */
- cp++;
- Buf_AddByte(buf, (Byte)*cp);
-
- } else if (*cp == '$') {
- size_t len = 0;
- Boolean freeIt;
-
- cp2 = Var_Parse(cp, VAR_CMD,
- doEval, &len, &freeIt);
- if (cp2 != var_Error) {
- Buf_Append(buf, cp2);
- if (freeIt) {
- free(cp2);
- }
- cp += len - 1;
- } else {
- Buf_AddByte(buf,
- (Byte)*cp);
- }
- } else {
- Buf_AddByte(buf, (Byte)*cp);
- }
- }
-
- string = Buf_Peel(buf);
-
- DEBUGF(COND, ("lhs = \"%s\", rhs = \"%s\", "
- "op = %.2s\n", lhs, string, op));
- /*
- * Null-terminate rhs and perform the
- * comparison. t is set to the result.
- */
- if (*op == '=') {
- t = strcmp(lhs, string) ? False : True;
- } else {
- t = strcmp(lhs, string) ? True : False;
- }
- free(string);
- if (rhs == condExpr) {
- if (*cp == '\0' || (!qt && *cp == ')'))
- condExpr = cp;
- else
- condExpr = cp + 1;
- }
- } else {
- /*
- * rhs is either a float or an integer.
- * Convert both the lhs and the rhs to a
- * double and compare the two.
- */
- double left, right;
- char *string;
-
- if (*CondCvtArg(lhs, &left) != '\0')
- goto do_string_compare;
- if (*rhs == '$') {
- size_t len = 0;
- Boolean freeIt;
-
- string = Var_Parse(rhs, VAR_CMD, doEval,
- &len, &freeIt);
- if (string == var_Error) {
- right = 0.0;
- } else {
- if (*CondCvtArg(string,
- &right) != '\0') {
- if (freeIt)
- free(string);
- goto do_string_compare;
- }
- if (freeIt)
- free(string);
- if (rhs == condExpr)
- condExpr += len;
- }
- } else {
- char *c = CondCvtArg(rhs, &right);
-
- if (c == rhs)
- goto do_string_compare;
- if (rhs == condExpr) {
- /*
- * Skip over the right-hand side
- */
- condExpr = c;
- }
- }
-
- DEBUGF(COND, ("left = %f, right = %f, "
- "op = %.2s\n", left, right, op));
- switch (op[0]) {
- case '!':
- if (op[1] != '=') {
- Parse_Error(PARSE_WARNING,
- "Unknown operator");
- goto error;
- }
- t = (left != right ? True : False);
- break;
- case '=':
- if (op[1] != '=') {
- Parse_Error(PARSE_WARNING,
- "Unknown operator");
- goto error;
- }
- t = (left == right ? True : False);
- break;
- case '<':
- if (op[1] == '=') {
- t = (left <= right?True:False);
- } else {
- t = (left < right?True:False);
- }
- break;
- case '>':
- if (op[1] == '=') {
- t = (left >= right?True:False);
- } else {
- t = (left > right?True:False);
- }
- break;
- default:
- break;
- }
- }
- error:
- if (doFree)
- free(lhs);
- break;
- }
-
- default: {
- CondProc *evalProc;
- Boolean invert = FALSE;
- char *arg;
- int arglen;
-
- if (strncmp(condExpr, "defined", 7) == 0) {
- /*
- * Use CondDoDefined to evaluate the argument
- * and CondGetArg to extract the argument from
- * the 'function call'.
- */
- evalProc = CondDoDefined;
- condExpr += 7;
- arglen = CondGetArg(&condExpr, &arg,
- "defined", TRUE);
- if (arglen == 0) {
- condExpr -= 7;
- goto use_default;
- }
-
- } else if (strncmp(condExpr, "make", 4) == 0) {
- /*
- * Use CondDoMake to evaluate the argument and
- * CondGetArg to extract the argument from the
- * 'function call'.
- */
- evalProc = CondDoMake;
- condExpr += 4;
- arglen = CondGetArg(&condExpr, &arg,
- "make", TRUE);
- if (arglen == 0) {
- condExpr -= 4;
- goto use_default;
- }
-
- } else if (strncmp(condExpr, "exists", 6) == 0) {
- /*
- * Use CondDoExists to evaluate the argument and
- * CondGetArg to extract the argument from the
- * 'function call'.
- */
- evalProc = CondDoExists;
- condExpr += 6;
- arglen = CondGetArg(&condExpr, &arg,
- "exists", TRUE);
- if (arglen == 0) {
- condExpr -= 6;
- goto use_default;
- }
-
- } else if (strncmp(condExpr, "empty", 5) == 0) {
- /*
- * Use Var_Parse to parse the spec in parens and
- * return True if the resulting string is empty.
- */
- size_t length;
- Boolean doFree;
- char *val;
-
- condExpr += 5;
-
- for (arglen = 0;
- condExpr[arglen] != '(' &&
- condExpr[arglen] != '\0'; arglen += 1)
- continue;
-
- if (condExpr[arglen] != '\0') {
- length = 0;
- val = Var_Parse(&condExpr[arglen - 1],
- VAR_CMD, FALSE, &length, &doFree);
- if (val == var_Error) {
- t = Err;
- } else {
- /*
- * A variable is empty when it
- * just contains spaces...
- * 4/15/92, christos
- */
- char *p;
-
- for (p = val;
- *p &&
- isspace((unsigned char)*p);
- p++)
- continue;
- t = (*p == '\0') ? True : False;
- }
- if (doFree) {
- free(val);
- }
- /*
- * Advance condExpr to beyond the
- * closing ). Note that we subtract
- * one from arglen + length b/c length
- * is calculated from
- * condExpr[arglen - 1].
- */
- condExpr += arglen + length - 1;
- } else {
- condExpr -= 5;
- goto use_default;
- }
- break;
-
- } else if (strncmp(condExpr, "target", 6) == 0) {
- /*
- * Use CondDoTarget to evaluate the argument and
- * CondGetArg to extract the argument from the
- * 'function call'.
- */
- evalProc = CondDoTarget;
- condExpr += 6;
- arglen = CondGetArg(&condExpr, &arg,
- "target", TRUE);
- if (arglen == 0) {
- condExpr -= 6;
- goto use_default;
- }
-
- } else {
- /*
- * The symbol is itself the argument to the
- * default function. We advance condExpr to
- * the end of the symbol by hand (the next
- * whitespace, closing paren or binary operator)
- * and set to invert the evaluation
- * function if condInvert is TRUE.
- */
- use_default:
- invert = condInvert;
- evalProc = condDefProc;
- arglen = CondGetArg(&condExpr, &arg, "", FALSE);
- }
-
- /*
- * Evaluate the argument using the set function. If
- * invert is TRUE, we invert the sense of the function.
- */
- t = (!doEval || (* evalProc) (arglen, arg) ?
- (invert ? False : True) :
- (invert ? True : False));
- free(arg);
- break;
- }
- }
- return (t);
-}
-
-/**
- * CondT
- * Parse a single term in the expression. This consists of a terminal
- * symbol or Not and a terminal symbol (not including the binary
- * operators):
- * T -> defined(variable) | make(target) | exists(file) | symbol
- * T -> ! T | ( E )
- *
- * Results:
- * True, False or Err.
- *
- * Side Effects:
- * Tokens are consumed.
- */
-static Token
-CondT(Boolean doEval)
-{
- Token t;
-
- t = CondToken(doEval);
- if (t == EndOfFile) {
- /*
- * If we reached the end of the expression, the expression
- * is malformed...
- */
- t = Err;
- } else if (t == LParen) {
- /*
- * T -> ( E )
- */
- t = CondE(doEval);
- if (t != Err) {
- if (CondToken(doEval) != RParen) {
- t = Err;
- }
- }
- } else if (t == Not) {
- t = CondT(doEval);
- if (t == True) {
- t = False;
- } else if (t == False) {
- t = True;
- }
- }
- return (t);
-}
-
-/**
- * CondF --
- * Parse a conjunctive factor (nice name, wot?)
- * F -> T && F | T
- *
- * Results:
- * True, False or Err
- *
- * Side Effects:
- * Tokens are consumed.
- */
-static Token
-CondF(Boolean doEval)
-{
- Token l, o;
-
- l = CondT(doEval);
- if (l != Err) {
- o = CondToken(doEval);
-
- if (o == And) {
- /*
- * F -> T && F
- *
- * If T is False, the whole thing will be False, but
- * we have to parse the r.h.s. anyway (to throw it
- * away). If T is True, the result is the r.h.s.,
- * be it an Err or no.
- */
- if (l == True) {
- l = CondF(doEval);
- } else {
- CondF(FALSE);
- }
- } else {
- /*
- * F -> T
- */
- CondPushBack(o);
- }
- }
- return (l);
-}
-
-/**
- * CondE --
- * Main expression production.
- * E -> F || E | F
- *
- * Results:
- * True, False or Err.
- *
- * Side Effects:
- * Tokens are, of course, consumed.
- */
-static Token
-CondE(Boolean doEval)
-{
- Token l, o;
-
- l = CondF(doEval);
- if (l != Err) {
- o = CondToken(doEval);
-
- if (o == Or) {
- /*
- * E -> F || E
- *
- * A similar thing occurs for ||, except that here we
- * make sure the l.h.s. is False before we bother to
- * evaluate the r.h.s. Once again, if l is False, the
- * result is the r.h.s. and once again if l is True,
- * we parse the r.h.s. to throw it away.
- */
- if (l == False) {
- l = CondE(doEval);
- } else {
- CondE(FALSE);
- }
- } else {
- /*
- * E -> F
- */
- CondPushBack(o);
- }
- }
- return (l);
-}
-
-/**
- * Cond_If
- * Handle .if<X> and .elif<X> directives.
- * This function is called even when we're skipping.
- */
-void
-Cond_If(char *line, int code, int lineno)
-{
- const struct If *ifp;
- Boolean value;
-
- ifp = &ifs[code];
-
- if (ifp->isElse) {
- if (condTop == MAXIF) {
- Parse_Error(PARSE_FATAL, "if-less elif");
- return;
- }
- if (skipIfLevel != 0) {
- /*
- * If skipping this conditional, just ignore
- * the whole thing. If we don't, the user
- * might be employing a variable that's
- * undefined, for which there's an enclosing
- * ifdef that we're skipping...
- */
- skipIfLineno[skipIfLevel - 1] = lineno;
- return;
- }
-
- } else if (skipLine) {
- /*
- * Don't even try to evaluate a conditional that's
- * not an else if we're skipping things...
- */
- skipIfLineno[skipIfLevel] = lineno;
- skipIfLevel += 1;
- return;
- }
-
- /*
- * Initialize file-global variables for parsing
- */
- condDefProc = ifp->defProc;
- condInvert = ifp->doNot;
-
- while (*line == ' ' || *line == '\t') {
- line++;
- }
-
- condExpr = line;
- condPushBack = None;
-
- switch (CondE(TRUE)) {
- case True:
- if (CondToken(TRUE) != EndOfFile)
- goto err;
- value = TRUE;
- break;
-
- case False:
- if (CondToken(TRUE) != EndOfFile)
- goto err;
- value = FALSE;
- break;
-
- case Err:
- err: Parse_Error(PARSE_FATAL, "Malformed conditional (%s)", line);
- return;
-
- default:
- abort();
- }
-
- if (!ifp->isElse) {
- /* push this value */
- condTop -= 1;
-
- } else if (skipIfLevel != 0 || condStack[condTop]) {
- /*
- * If this is an else-type conditional, it should only take
- * effect if its corresponding if was evaluated and FALSE.
- * If its if was TRUE or skipped, we return COND_SKIP (and
- * start skipping in case we weren't already), leaving the
- * stack unmolested so later elif's don't screw up...
- */
- skipLine = TRUE;
- return;
- }
-
- if (condTop < 0) {
- /*
- * This is the one case where we can definitely proclaim a fatal
- * error. If we don't, we're hosed.
- */
- Parse_Error(PARSE_FATAL, "Too many nested if's. %d max.",MAXIF);
- return;
- }
-
- /* push */
- condStack[condTop] = value;
- condLineno[condTop] = lineno;
- skipLine = !value;
-}
-
-/**
- * Cond_Else
- * Handle .else statement.
- */
-void
-Cond_Else(char *line __unused, int code __unused, int lineno __unused)
-{
-
- while (isspace((u_char)*line))
- line++;
-
- if (*line != '\0' && (warn_flags & WARN_DIRSYNTAX)) {
- Parse_Error(PARSE_WARNING, "junk after .else ignored '%s'",
- line);
- }
-
- if (condTop == MAXIF) {
- Parse_Error(PARSE_FATAL, "if-less else");
- return;
- }
- if (skipIfLevel != 0)
- return;
-
- if (skipIfLevel != 0 || condStack[condTop]) {
- /*
- * An else should only take effect if its corresponding if was
- * evaluated and FALSE.
- * If its if was TRUE or skipped, we return COND_SKIP (and
- * start skipping in case we weren't already), leaving the
- * stack unmolested so later elif's don't screw up...
- * XXX How does this work with two .else's?
- */
- skipLine = TRUE;
- return;
- }
-
- /* inverse value */
- condStack[condTop] = !condStack[condTop];
- skipLine = !condStack[condTop];
-}
-
-/**
- * Cond_Endif
- * Handle .endif statement.
- */
-void
-Cond_Endif(char *line __unused, int code __unused, int lineno __unused)
-{
-
- while (isspace((u_char)*line))
- line++;
-
- if (*line != '\0' && (warn_flags & WARN_DIRSYNTAX)) {
- Parse_Error(PARSE_WARNING, "junk after .endif ignored '%s'",
- line);
- }
-
- /*
- * End of a conditional section. If skipIfLevel is non-zero,
- * that conditional was skipped, so lines following it should
- * also be skipped. Hence, we return COND_SKIP. Otherwise,
- * the conditional was read so succeeding lines should be
- * parsed (think about it...) so we return COND_PARSE, unless
- * this endif isn't paired with a decent if.
- */
- if (skipIfLevel != 0) {
- skipIfLevel -= 1;
- return;
- }
-
- if (condTop == MAXIF) {
- Parse_Error(PARSE_FATAL, "if-less endif");
- return;
- }
-
- /* pop */
- skipLine = FALSE;
- condTop += 1;
-}
-
-/**
- * Cond_End
- * Make sure everything's clean at the end of a makefile.
- *
- * Side Effects:
- * Parse_Error will be called if open conditionals are around.
- */
-void
-Cond_End(void)
-{
- int level;
-
- if (condTop != MAXIF) {
- Parse_Error(PARSE_FATAL, "%d open conditional%s:",
- MAXIF - condTop + skipIfLevel,
- MAXIF - condTop + skipIfLevel== 1 ? "" : "s");
-
- for (level = skipIfLevel; level > 0; level--)
- Parse_Error(PARSE_FATAL, "\t%*sat line %d (skipped)",
- MAXIF - condTop + level + 1, "",
- skipIfLineno[level - 1]);
- for (level = condTop; level < MAXIF; level++)
- Parse_Error(PARSE_FATAL, "\t%*sat line %d "
- "(evaluated to %s)", MAXIF - level + skipIfLevel,
- "", condLineno[level],
- condStack[level] ? "true" : "false");
- }
- condTop = MAXIF;
-}
diff --git a/usr.bin/make/cond.h b/usr.bin/make/cond.h
deleted file mode 100644
index 9a8dbdc..0000000
--- a/usr.bin/make/cond.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef cond_h_6e96ad7c
-#define cond_h_6e96ad7c
-
-/*
- * Values returned by Cond_Eval.
- */
-#define COND_PARSE 0 /* Parse the next lines */
-#define COND_SKIP 1 /* Skip the next lines */
-#define COND_INVALID 2 /* Not a conditional statement */
-
-enum {
- COND_IF,
- COND_IFDEF,
- COND_IFNDEF,
- COND_IFMAKE,
- COND_IFNMAKE,
- COND_ELSE,
- COND_ELIF,
- COND_ELIFDEF,
- COND_ELIFNDEF,
- COND_ELIFMAKE,
- COND_ELIFNMAKE,
- COND_ENDIF,
-};
-
-void Cond_If(char *, int, int);
-void Cond_Else(char *, int, int);
-void Cond_Endif(char *, int, int);
-void Cond_End(void);
-
-extern Boolean skipLine;
-
-#endif /* cond_h_6e96ad7c */
diff --git a/usr.bin/make/config.h b/usr.bin/make/config.h
deleted file mode 100644
index 06b0f8e..0000000
--- a/usr.bin/make/config.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1988, 1989 by Adam de Boor
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)config.h 8.2 (Berkeley) 4/28/95
- * $FreeBSD$
- */
-
-#ifndef config_h_efe0765e
-#define config_h_efe0765e
-
-/*
- * DEFMAXJOBS
- * This control the default concurrency. On no occasion will more
- * than DEFMAXJOBS targets be created at once.
- */
-#define DEFMAXJOBS 1
-
-/*
- * INCLUDES
- * LIBRARIES
- * These control the handling of the .INCLUDES and .LIBS variables.
- * If INCLUDES is defined, the .INCLUDES variable will be filled
- * from the search paths of those suffixes which are marked by
- * .INCLUDES dependency lines. Similarly for LIBRARIES and .LIBS
- * See suff.c for more details.
- */
-#define INCLUDES
-#define LIBRARIES
-
-/*
- * LIBSUFF
- * Is the suffix used to denote libraries and is used by the Suff module
- * to find the search path on which to seek any -l<xx> targets.
- *
- * RECHECK
- * If defined, Make_Update will check a target for its current
- * modification time after it has been re-made, setting it to the
- * starting time of the make only if the target still doesn't exist.
- * Unfortunately, under NFS the modification time often doesn't
- * get updated in time, so a target will appear to not have been
- * re-made, causing later targets to appear up-to-date. On systems
- * that don't have this problem, you should defined this. Under
- * NFS you probably should not, unless you aren't exporting jobs.
- */
-#define LIBSUFF ".a"
-#define RECHECK
-
-/*
- * SYSVINCLUDE
- * Recognize system V like include directives [include "filename"]
- * SYSVVARSUB
- * Recognize system V like ${VAR:x=y} variable substitutions
- */
-#define SYSVINCLUDE
-#define SYSVVARSUB
-
-/*
- * SUNSHCMD
- * Recognize SunOS and Solaris:
- * VAR :sh= CMD # Assign VAR to the command substitution of CMD
- * ${VAR:sh} # Return the command substitution of the value
- * # of ${VAR}
- */
-#define SUNSHCMD
-
-#if !defined(__svr4__) && !defined(__SVR4) && !defined(__ELF__)
-# ifndef RANLIBMAG
-# define RANLIBMAG "__.SYMDEF"
-# endif
-#else
-# ifndef RANLIBMAG
-# define RANLIBMAG "/"
-# endif
-#endif
-
-#endif /* config_h_efe0765e */
diff --git a/usr.bin/make/dir.c b/usr.bin/make/dir.c
deleted file mode 100644
index c66b2bf..0000000
--- a/usr.bin/make/dir.c
+++ /dev/null
@@ -1,1154 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1988, 1989 by Adam de Boor
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)dir.c 8.2 (Berkeley) 1/2/94
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*-
- * dir.c --
- * Directory searching using wildcards and/or normal names...
- * Used both for source wildcarding in the Makefile and for finding
- * implicit sources.
- *
- * The interface for this module is:
- * Dir_Init Initialize the module.
- *
- * Dir_HasWildcards Returns TRUE if the name given it needs to
- * be wildcard-expanded.
- *
- * Path_Expand Given a pattern and a path, return a Lst of names
- * which match the pattern on the search path.
- *
- * Path_FindFile Searches for a file on a given search path.
- * If it exists, the entire path is returned.
- * Otherwise NULL is returned.
- *
- * Dir_MTime Return the modification time of a node. The file
- * is searched for along the default search path.
- * The path and mtime fields of the node are filled in.
- *
- * Path_AddDir Add a directory to a search path.
- *
- * Dir_MakeFlags Given a search path and a command flag, create
- * a string with each of the directories in the path
- * preceded by the command flag and all of them
- * separated by a space.
- *
- * Dir_Destroy Destroy an element of a search path. Frees up all
- * things that can be freed for the element as long
- * as the element is no longer referenced by any other
- * search path.
- *
- * Dir_ClearPath Resets a search path to the empty list.
- *
- * For debugging:
- * Dir_PrintDirectories Print stats about the directory cache.
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <dirent.h>
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "arch.h"
-#include "dir.h"
-#include "globals.h"
-#include "GNode.h"
-#include "hash.h"
-#include "lst.h"
-#include "make.h"
-#include "str.h"
-#include "targ.h"
-#include "util.h"
-
-/*
- * A search path consists of a list of Dir structures. A Dir structure
- * has in it the name of the directory and a hash table of all the files
- * in the directory. This is used to cut down on the number of system
- * calls necessary to find implicit dependents and their like. Since
- * these searches are made before any actions are taken, we need not
- * worry about the directory changing due to creation commands. If this
- * hampers the style of some makefiles, they must be changed.
- *
- * A list of all previously-read directories is kept in the
- * openDirectories list. This list is checked first before a directory
- * is opened.
- *
- * The need for the caching of whole directories is brought about by
- * the multi-level transformation code in suff.c, which tends to search
- * for far more files than regular make does. In the initial
- * implementation, the amount of time spent performing "stat" calls was
- * truly astronomical. The problem with hashing at the start is,
- * of course, that pmake doesn't then detect changes to these directories
- * during the course of the make. Three possibilities suggest themselves:
- *
- * 1) just use stat to test for a file's existence. As mentioned
- * above, this is very inefficient due to the number of checks
- * engendered by the multi-level transformation code.
- * 2) use readdir() and company to search the directories, keeping
- * them open between checks. I have tried this and while it
- * didn't slow down the process too much, it could severely
- * affect the amount of parallelism available as each directory
- * open would take another file descriptor out of play for
- * handling I/O for another job. Given that it is only recently
- * that UNIX OS's have taken to allowing more than 20 or 32
- * file descriptors for a process, this doesn't seem acceptable
- * to me.
- * 3) record the mtime of the directory in the Dir structure and
- * verify the directory hasn't changed since the contents were
- * hashed. This will catch the creation or deletion of files,
- * but not the updating of files. However, since it is the
- * creation and deletion that is the problem, this could be
- * a good thing to do. Unfortunately, if the directory (say ".")
- * were fairly large and changed fairly frequently, the constant
- * rehashing could seriously degrade performance. It might be
- * good in such cases to keep track of the number of rehashes
- * and if the number goes over a (small) limit, resort to using
- * stat in its place.
- *
- * An additional thing to consider is that pmake is used primarily
- * to create C programs and until recently pcc-based compilers refused
- * to allow you to specify where the resulting object file should be
- * placed. This forced all objects to be created in the current
- * directory. This isn't meant as a full excuse, just an explanation of
- * some of the reasons for the caching used here.
- *
- * One more note: the location of a target's file is only performed
- * on the downward traversal of the graph and then only for terminal
- * nodes in the graph. This could be construed as wrong in some cases,
- * but prevents inadvertent modification of files when the "installed"
- * directory for a file is provided in the search path.
- *
- * Another data structure maintained by this module is an mtime
- * cache used when the searching of cached directories fails to find
- * a file. In the past, Path_FindFile would simply perform an access()
- * call in such a case to determine if the file could be found using
- * just the name given. When this hit, however, all that was gained
- * was the knowledge that the file existed. Given that an access() is
- * essentially a stat() without the copyout() call, and that the same
- * filesystem overhead would have to be incurred in Dir_MTime, it made
- * sense to replace the access() with a stat() and record the mtime
- * in a cache for when Dir_MTime was actually called.
- */
-
-typedef struct Dir {
- char *name; /* Name of directory */
- int refCount; /* No. of paths with this directory */
- int hits; /* No. of times a file has been found here */
- Hash_Table files; /* Hash table of files in directory */
- TAILQ_ENTRY(Dir) link; /* allDirs link */
-} Dir;
-
-/*
- * A path is a list of pointers to directories. These directories are
- * reference counted so a directory can be on more than one path.
- */
-struct PathElement {
- struct Dir *dir; /* pointer to the directory */
- TAILQ_ENTRY(PathElement) link; /* path link */
-};
-
-/* main search path */
-struct Path dirSearchPath = TAILQ_HEAD_INITIALIZER(dirSearchPath);
-
-/* the list of all open directories */
-static TAILQ_HEAD(, Dir) openDirectories =
- TAILQ_HEAD_INITIALIZER(openDirectories);
-
-/*
- * Variables for gathering statistics on the efficiency of the hashing
- * mechanism.
- */
-static int hits; /* Found in directory cache */
-static int misses; /* Sad, but not evil misses */
-static int nearmisses; /* Found under search path */
-static int bigmisses; /* Sought by itself */
-
-static Dir *dot; /* contents of current directory */
-
-/* Results of doing a last-resort stat in Path_FindFile --
- * if we have to go to the system to find the file, we might as well
- * have its mtime on record.
- * XXX: If this is done way early, there's a chance other rules will
- * have already updated the file, in which case we'll update it again.
- * Generally, there won't be two rules to update a single file, so this
- * should be ok, but...
- */
-static Hash_Table mtimes;
-
-/*-
- *-----------------------------------------------------------------------
- * Dir_Init --
- * initialize things for this module
- *
- * Results:
- * none
- *
- * Side Effects:
- * none
- *-----------------------------------------------------------------------
- */
-void
-Dir_Init(void)
-{
-
- Hash_InitTable(&mtimes, 0);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Dir_InitDot --
- * initialize the "." directory
- *
- * Results:
- * none
- *
- * Side Effects:
- * some directories may be opened.
- *-----------------------------------------------------------------------
- */
-void
-Dir_InitDot(void)
-{
-
- dot = Path_AddDir(NULL, ".");
- if (dot == NULL)
- err(1, "cannot open current directory");
-
- /*
- * We always need to have dot around, so we increment its
- * reference count to make sure it's not destroyed.
- */
- dot->refCount += 1;
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Dir_HasWildcards --
- * See if the given name has any wildcard characters in it.
- *
- * Results:
- * returns TRUE if the word should be expanded, FALSE otherwise
- *
- * Side Effects:
- * none
- *-----------------------------------------------------------------------
- */
-Boolean
-Dir_HasWildcards(const char *name)
-{
- const char *cp;
- int wild = 0, brace = 0, bracket = 0;
-
- for (cp = name; *cp; cp++) {
- switch (*cp) {
- case '{':
- brace++;
- wild = 1;
- break;
- case '}':
- brace--;
- break;
- case '[':
- bracket++;
- wild = 1;
- break;
- case ']':
- bracket--;
- break;
- case '?':
- case '*':
- wild = 1;
- break;
- default:
- break;
- }
- }
- return (wild && bracket == 0 && brace == 0);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * DirMatchFiles --
- * Given a pattern and a Dir structure, see if any files
- * match the pattern and add their names to the 'expansions' list if
- * any do. This is incomplete -- it doesn't take care of patterns like
- * src / *src / *.c properly (just *.c on any of the directories), but it
- * will do for now.
- *
- * Results:
- * Always returns 0
- *
- * Side Effects:
- * File names are added to the expansions lst. The directory will be
- * fully hashed when this is done.
- *-----------------------------------------------------------------------
- */
-static int
-DirMatchFiles(const char *pattern, const Dir *p, Lst *expansions)
-{
- Hash_Search search; /* Index into the directory's table */
- Hash_Entry *entry; /* Current entry in the table */
- Boolean isDot; /* TRUE if the directory being searched is . */
-
- isDot = (*p->name == '.' && p->name[1] == '\0');
-
- for (entry = Hash_EnumFirst(&p->files, &search);
- entry != NULL;
- entry = Hash_EnumNext(&search)) {
- /*
- * See if the file matches the given pattern. Note we follow
- * the UNIX convention that dot files will only be found if
- * the pattern begins with a dot (note also that as a side
- * effect of the hashing scheme, .* won't match . or ..
- * since they aren't hashed).
- */
- if (Str_Match(entry->name, pattern) &&
- ((entry->name[0] != '.') ||
- (pattern[0] == '.'))) {
- Lst_AtEnd(expansions, (isDot ? estrdup(entry->name) :
- str_concat(p->name, entry->name, STR_ADDSLASH)));
- }
- }
- return (0);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * DirExpandCurly --
- * Expand curly braces like the C shell. Does this recursively.
- * Note the special case: if after the piece of the curly brace is
- * done there are no wildcard characters in the result, the result is
- * placed on the list WITHOUT CHECKING FOR ITS EXISTENCE. The
- * given arguments are the entire word to expand, the first curly
- * brace in the word, the search path, and the list to store the
- * expansions in.
- *
- * Results:
- * None.
- *
- * Side Effects:
- * The given list is filled with the expansions...
- *
- *-----------------------------------------------------------------------
- */
-static void
-DirExpandCurly(const char *word, const char *brace, struct Path *path,
- Lst *expansions)
-{
- const char *end; /* Character after the closing brace */
- const char *cp; /* Current position in brace clause */
- const char *start; /* Start of current piece of brace clause */
- int bracelevel; /* Number of braces we've seen. If we see a right brace
- * when this is 0, we've hit the end of the clause. */
- char *file; /* Current expansion */
- int otherLen; /* The length of the other pieces of the expansion
- * (chars before and after the clause in 'word') */
- char *cp2; /* Pointer for checking for wildcards in
- * expansion before calling Dir_Expand */
-
- start = brace + 1;
-
- /*
- * Find the end of the brace clause first, being wary of nested brace
- * clauses.
- */
- for (end = start, bracelevel = 0; *end != '\0'; end++) {
- if (*end == '{')
- bracelevel++;
- else if ((*end == '}') && (bracelevel-- == 0))
- break;
- }
- if (*end == '\0') {
- Error("Unterminated {} clause \"%s\"", start);
- return;
- } else
- end++;
-
- otherLen = brace - word + strlen(end);
-
- for (cp = start; cp < end; cp++) {
- /*
- * Find the end of this piece of the clause.
- */
- bracelevel = 0;
- while (*cp != ',') {
- if (*cp == '{')
- bracelevel++;
- else if ((*cp == '}') && (bracelevel-- <= 0))
- break;
- cp++;
- }
- /*
- * Allocate room for the combination and install the
- * three pieces.
- */
- file = emalloc(otherLen + cp - start + 1);
- if (brace != word)
- strncpy(file, word, brace - word);
- if (cp != start)
- strncpy(&file[brace - word], start, cp - start);
- strcpy(&file[(brace - word) + (cp - start)], end);
-
- /*
- * See if the result has any wildcards in it. If we find one,
- * call Dir_Expand right away, telling it to place the result
- * on our list of expansions.
- */
- for (cp2 = file; *cp2 != '\0'; cp2++) {
- switch (*cp2) {
- case '*':
- case '?':
- case '{':
- case '[':
- Path_Expand(file, path, expansions);
- goto next;
- default:
- break;
- }
- }
- if (*cp2 == '\0') {
- /*
- * Hit the end w/o finding any wildcards, so stick
- * the expansion on the end of the list.
- */
- Lst_AtEnd(expansions, file);
- } else {
- next:
- free(file);
- }
- start = cp + 1;
- }
-}
-
-/*-
- *-----------------------------------------------------------------------
- * DirExpandInt --
- * Internal expand routine. Passes through the directories in the
- * path one by one, calling DirMatchFiles for each. NOTE: This still
- * doesn't handle patterns in directories... Works given a word to
- * expand, a path to look in, and a list to store expansions in.
- *
- * Results:
- * None.
- *
- * Side Effects:
- * Things are added to the expansions list.
- *
- *-----------------------------------------------------------------------
- */
-static void
-DirExpandInt(const char *word, const struct Path *path, Lst *expansions)
-{
- struct PathElement *pe;
-
- TAILQ_FOREACH(pe, path, link)
- DirMatchFiles(word, pe->dir, expansions);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Dir_Expand --
- * Expand the given word into a list of words by globbing it looking
- * in the directories on the given search path.
- *
- * Results:
- * A list of words consisting of the files which exist along the search
- * path matching the given pattern is placed in expansions.
- *
- * Side Effects:
- * Directories may be opened. Who knows?
- *-----------------------------------------------------------------------
- */
-void
-Path_Expand(char *word, struct Path *path, Lst *expansions)
-{
- LstNode *ln;
- char *cp;
-
- DEBUGF(DIR, ("expanding \"%s\"...", word));
-
- cp = strchr(word, '{');
- if (cp != NULL)
- DirExpandCurly(word, cp, path, expansions);
- else {
- cp = strchr(word, '/');
- if (cp != NULL) {
- /*
- * The thing has a directory component -- find the
- * first wildcard in the string.
- */
- for (cp = word; *cp != '\0'; cp++) {
- if (*cp == '?' || *cp == '[' ||
- *cp == '*' || *cp == '{') {
- break;
- }
- }
- if (*cp == '{') {
- /*
- * This one will be fun.
- */
- DirExpandCurly(word, cp, path, expansions);
- return;
- } else if (*cp != '\0') {
- /*
- * Back up to the start of the component
- */
- char *dirpath;
-
- while (cp > word && *cp != '/')
- cp--;
- if (cp != word) {
- char sc;
-
- /*
- * If the glob isn't in the first
- * component, try and find all the
- * components up to the one with a
- * wildcard.
- */
- sc = cp[1];
- cp[1] = '\0';
- dirpath = Path_FindFile(word, path);
- cp[1] = sc;
- /*
- * dirpath is null if can't find the
- * leading component
- * XXX: Path_FindFile won't find internal
- * components. i.e. if the path contains
- * ../Etc/Object and we're looking for
- * Etc, * it won't be found. Ah well.
- * Probably not important.
- */
- if (dirpath != NULL) {
- char *dp =
- &dirpath[strlen(dirpath)
- - 1];
- struct Path tp =
- TAILQ_HEAD_INITIALIZER(tp);
-
- if (*dp == '/')
- *dp = '\0';
- Path_AddDir(&tp, dirpath);
- DirExpandInt(cp + 1, &tp,
- expansions);
- Path_Clear(&tp);
- }
- } else {
- /*
- * Start the search from the local
- * directory
- */
- DirExpandInt(word, path, expansions);
- }
- } else {
- /*
- * Return the file -- this should never happen.
- */
- DirExpandInt(word, path, expansions);
- }
- } else {
- /*
- * First the files in dot
- */
- DirMatchFiles(word, dot, expansions);
-
- /*
- * Then the files in every other directory on the path.
- */
- DirExpandInt(word, path, expansions);
- }
- }
- if (DEBUG(DIR)) {
- LST_FOREACH(ln, expansions)
- DEBUGF(DIR, ("%s ", (const char *)Lst_Datum(ln)));
- DEBUGF(DIR, ("\n"));
- }
-}
-
-/**
- * Path_FindFile
- * Find the file with the given name along the given search path.
- *
- * Results:
- * The path to the file or NULL. This path is guaranteed to be in a
- * different part of memory than name and so may be safely free'd.
- *
- * Side Effects:
- * If the file is found in a directory which is not on the path
- * already (either 'name' is absolute or it is a relative path
- * [ dir1/.../dirn/file ] which exists below one of the directories
- * already on the search path), its directory is added to the end
- * of the path on the assumption that there will be more files in
- * that directory later on. Sometimes this is true. Sometimes not.
- */
-char *
-Path_FindFile(char *name, struct Path *path)
-{
- char *p1; /* pointer into p->name */
- char *p2; /* pointer into name */
- char *file; /* the current filename to check */
- const struct PathElement *pe; /* current path member */
- char *cp; /* final component of the name */
- Boolean hasSlash; /* true if 'name' contains a / */
- struct stat stb; /* Buffer for stat, if necessary */
- Hash_Entry *entry; /* Entry for mtimes table */
-
- /*
- * Find the final component of the name and note whether it has a
- * slash in it (the name, I mean)
- */
- cp = strrchr(name, '/');
- if (cp != NULL) {
- hasSlash = TRUE;
- cp += 1;
- } else {
- hasSlash = FALSE;
- cp = name;
- }
-
- DEBUGF(DIR, ("Searching for %s...", name));
- /*
- * No matter what, we always look for the file in the current directory
- * before anywhere else and we *do not* add the ./ to it if it exists.
- * This is so there are no conflicts between what the user specifies
- * (fish.c) and what pmake finds (./fish.c).
- */
- if ((!hasSlash || (cp - name == 2 && *name == '.')) &&
- (Hash_FindEntry(&dot->files, cp) != NULL)) {
- DEBUGF(DIR, ("in '.'\n"));
- hits += 1;
- dot->hits += 1;
- return (estrdup(name));
- }
-
- /*
- * We look through all the directories on the path seeking one which
- * contains the final component of the given name and whose final
- * component(s) match the name's initial component(s). If such a beast
- * is found, we concatenate the directory name and the final component
- * and return the resulting string. If we don't find any such thing,
- * we go on to phase two...
- */
- TAILQ_FOREACH(pe, path, link) {
- DEBUGF(DIR, ("%s...", pe->dir->name));
- if (Hash_FindEntry(&pe->dir->files, cp) != NULL) {
- DEBUGF(DIR, ("here..."));
- if (hasSlash) {
- /*
- * If the name had a slash, its initial
- * components and p's final components must
- * match. This is false if a mismatch is
- * encountered before all of the initial
- * components have been checked (p2 > name at
- * the end of the loop), or we matched only
- * part of one of the components of p
- * along with all the rest of them (*p1 != '/').
- */
- p1 = pe->dir->name + strlen(pe->dir->name) - 1;
- p2 = cp - 2;
- while (p2 >= name && p1 >= pe->dir->name &&
- *p1 == *p2) {
- p1 -= 1; p2 -= 1;
- }
- if (p2 >= name || (p1 >= pe->dir->name &&
- *p1 != '/')) {
- DEBUGF(DIR, ("component mismatch -- "
- "continuing..."));
- continue;
- }
- }
- file = str_concat(pe->dir->name, cp, STR_ADDSLASH);
- DEBUGF(DIR, ("returning %s\n", file));
- pe->dir->hits += 1;
- hits += 1;
- return (file);
- } else if (hasSlash) {
- /*
- * If the file has a leading path component and that
- * component exactly matches the entire name of the
- * current search directory, we assume the file
- * doesn't exist and return NULL.
- */
- for (p1 = pe->dir->name, p2 = name; *p1 && *p1 == *p2;
- p1++, p2++)
- continue;
- if (*p1 == '\0' && p2 == cp - 1) {
- if (*cp == '\0' || ISDOT(cp) || ISDOTDOT(cp)) {
- DEBUGF(DIR, ("returning %s\n", name));
- return (estrdup(name));
- } else {
- DEBUGF(DIR, ("must be here but isn't --"
- " returning NULL\n"));
- return (NULL);
- }
- }
- }
- }
-
- /*
- * We didn't find the file on any existing members of the directory.
- * If the name doesn't contain a slash, that means it doesn't exist.
- * If it *does* contain a slash, however, there is still hope: it
- * could be in a subdirectory of one of the members of the search
- * path. (eg. /usr/include and sys/types.h. The above search would
- * fail to turn up types.h in /usr/include, but it *is* in
- * /usr/include/sys/types.h) If we find such a beast, we assume there
- * will be more (what else can we assume?) and add all but the last
- * component of the resulting name onto the search path (at the
- * end). This phase is only performed if the file is *not* absolute.
- */
- if (!hasSlash) {
- DEBUGF(DIR, ("failed.\n"));
- misses += 1;
- return (NULL);
- }
-
- if (*name != '/') {
- Boolean checkedDot = FALSE;
-
- DEBUGF(DIR, ("failed. Trying subdirectories..."));
- TAILQ_FOREACH(pe, path, link) {
- if (pe->dir != dot) {
- file = str_concat(pe->dir->name,
- name, STR_ADDSLASH);
- } else {
- /*
- * Checking in dot -- DON'T put a leading ./
- * on the thing.
- */
- file = estrdup(name);
- checkedDot = TRUE;
- }
- DEBUGF(DIR, ("checking %s...", file));
-
- if (stat(file, &stb) == 0) {
- DEBUGF(DIR, ("got it.\n"));
-
- /*
- * We've found another directory to search. We
- * know there's a slash in 'file' because we put
- * one there. We nuke it after finding it and
- * call Path_AddDir to add this new directory
- * onto the existing search path. Once that's
- * done, we restore the slash and triumphantly
- * return the file name, knowing that should a
- * file in this directory every be referenced
- * again in such a manner, we will find it
- * without having to do numerous numbers of
- * access calls. Hurrah!
- */
- cp = strrchr(file, '/');
- *cp = '\0';
- Path_AddDir(path, file);
- *cp = '/';
-
- /*
- * Save the modification time so if
- * it's needed, we don't have to fetch it again.
- */
- DEBUGF(DIR, ("Caching %s for %s\n",
- Targ_FmtTime(stb.st_mtime), file));
- entry = Hash_CreateEntry(&mtimes, file,
- (Boolean *)NULL);
- Hash_SetValue(entry,
- (void *)(long)stb.st_mtime);
- nearmisses += 1;
- return (file);
- } else {
- free(file);
- }
- }
-
- DEBUGF(DIR, ("failed. "));
-
- if (checkedDot) {
- /*
- * Already checked by the given name, since . was in
- * the path, so no point in proceeding...
- */
- DEBUGF(DIR, ("Checked . already, returning NULL\n"));
- return (NULL);
- }
- }
-
- /*
- * Didn't find it that way, either. Sigh. Phase 3. Add its directory
- * onto the search path in any case, just in case, then look for the
- * thing in the hash table. If we find it, grand. We return a new
- * copy of the name. Otherwise we sadly return a NULL pointer. Sigh.
- * Note that if the directory holding the file doesn't exist, this will
- * do an extra search of the final directory on the path. Unless
- * something weird happens, this search won't succeed and life will
- * be groovy.
- *
- * Sigh. We cannot add the directory onto the search path because
- * of this amusing case:
- * $(INSTALLDIR)/$(FILE): $(FILE)
- *
- * $(FILE) exists in $(INSTALLDIR) but not in the current one.
- * When searching for $(FILE), we will find it in $(INSTALLDIR)
- * b/c we added it here. This is not good...
- */
-#ifdef notdef
- cp[-1] = '\0';
- Path_AddDir(path, name);
- cp[-1] = '/';
-
- bigmisses += 1;
- pe = TAILQ_LAST(path, Path);
- if (pe == NULL)
- return (NULL);
-
- if (Hash_FindEntry(&pe->dir->files, cp) != NULL) {
- return (estrdup(name));
-
- return (NULL);
-#else /* !notdef */
- DEBUGF(DIR, ("Looking for \"%s\"...", name));
-
- bigmisses += 1;
- entry = Hash_FindEntry(&mtimes, name);
- if (entry != NULL) {
- DEBUGF(DIR, ("got it (in mtime cache)\n"));
- return (estrdup(name));
- } else if (stat (name, &stb) == 0) {
- entry = Hash_CreateEntry(&mtimes, name, (Boolean *)NULL);
- DEBUGF(DIR, ("Caching %s for %s\n",
- Targ_FmtTime(stb.st_mtime), name));
- Hash_SetValue(entry, (void *)(long)stb.st_mtime);
- return (estrdup(name));
- } else {
- DEBUGF(DIR, ("failed. Returning NULL\n"));
- return (NULL);
- }
-#endif /* notdef */
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Dir_MTime --
- * Find the modification time of the file described by gn along the
- * search path dirSearchPath.
- *
- * Results:
- * The modification time or 0 if it doesn't exist
- *
- * Side Effects:
- * The modification time is placed in the node's mtime slot.
- * If the node didn't have a path entry before, and Dir_FindFile
- * found one for it, the full name is placed in the path slot.
- *-----------------------------------------------------------------------
- */
-int
-Dir_MTime(GNode *gn)
-{
- char *fullName; /* the full pathname of name */
- struct stat stb; /* buffer for finding the mod time */
- Hash_Entry *entry;
-
- if (gn->type & OP_ARCHV)
- return (Arch_MTime(gn));
-
- else if (gn->path == NULL)
- fullName = Path_FindFile(gn->name, &dirSearchPath);
- else
- fullName = gn->path;
-
- if (fullName == NULL)
- fullName = estrdup(gn->name);
-
- entry = Hash_FindEntry(&mtimes, fullName);
- if (entry != NULL) {
- /*
- * Only do this once -- the second time folks are checking to
- * see if the file was actually updated, so we need to
- * actually go to the filesystem.
- */
- DEBUGF(DIR, ("Using cached time %s for %s\n",
- Targ_FmtTime((time_t)(long)Hash_GetValue(entry)),
- fullName));
- stb.st_mtime = (time_t)(long)Hash_GetValue(entry);
- Hash_DeleteEntry(&mtimes, entry);
- } else if (stat(fullName, &stb) < 0) {
- if (gn->type & OP_MEMBER) {
- if (fullName != gn->path)
- free(fullName);
- return (Arch_MemMTime(gn));
- } else {
- stb.st_mtime = 0;
- }
- }
- if (fullName && gn->path == (char *)NULL)
- gn->path = fullName;
-
- gn->mtime = stb.st_mtime;
- return (gn->mtime);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Path_AddDir --
- * Add the given name to the end of the given path.
- *
- * Results:
- * none
- *
- * Side Effects:
- * A structure is added to the list and the directory is
- * read and hashed.
- *-----------------------------------------------------------------------
- */
-struct Dir *
-Path_AddDir(struct Path *path, const char *name)
-{
- Dir *d; /* pointer to new Path structure */
- DIR *dir; /* for reading directory */
- struct PathElement *pe;
- struct dirent *dp; /* entry in directory */
-
- /* check whether we know this directory */
- TAILQ_FOREACH(d, &openDirectories, link) {
- if (strcmp(d->name, name) == 0) {
- /* Found it. */
- if (path == NULL)
- return (d);
-
- /* Check whether its already on the path. */
- TAILQ_FOREACH(pe, path, link) {
- if (pe->dir == d)
- return (d);
- }
- /* Add it to the path */
- d->refCount += 1;
- pe = emalloc(sizeof(*pe));
- pe->dir = d;
- TAILQ_INSERT_TAIL(path, pe, link);
- return (d);
- }
- }
-
- DEBUGF(DIR, ("Caching %s...", name));
-
- if ((dir = opendir(name)) == NULL) {
- DEBUGF(DIR, (" cannot open\n"));
- return (NULL);
- }
-
- d = emalloc(sizeof(*d));
- d->name = estrdup(name);
- d->hits = 0;
- d->refCount = 1;
- Hash_InitTable(&d->files, -1);
-
- while ((dp = readdir(dir)) != NULL) {
-#if defined(sun) && defined(d_ino) /* d_ino is a sunos4 #define for d_fileno */
- /*
- * The sun directory library doesn't check for
- * a 0 inode (0-inode slots just take up space),
- * so we have to do it ourselves.
- */
- if (dp->d_fileno == 0)
- continue;
-#endif /* sun && d_ino */
-
- /* Skip the '.' and '..' entries by checking
- * for them specifically instead of assuming
- * readdir() reuturns them in that order when
- * first going through a directory. This is
- * needed for XFS over NFS filesystems since
- * SGI does not guarantee that these are the
- * first two entries returned from readdir().
- */
- if (ISDOT(dp->d_name) || ISDOTDOT(dp->d_name))
- continue;
-
- Hash_CreateEntry(&d->files, dp->d_name, (Boolean *)NULL);
- }
- closedir(dir);
-
- if (path != NULL) {
- /* Add it to the path */
- d->refCount += 1;
- pe = emalloc(sizeof(*pe));
- pe->dir = d;
- TAILQ_INSERT_TAIL(path, pe, link);
- }
-
- /* Add to list of all directories */
- TAILQ_INSERT_TAIL(&openDirectories, d, link);
-
- DEBUGF(DIR, ("done\n"));
-
- return (d);
-}
-
-/**
- * Path_Duplicate
- * Duplicate a path. Ups the reference count for the directories.
- */
-void
-Path_Duplicate(struct Path *dst, const struct Path *src)
-{
- struct PathElement *ped, *pes;
-
- TAILQ_FOREACH(pes, src, link) {
- ped = emalloc(sizeof(*ped));
- ped->dir = pes->dir;
- ped->dir->refCount++;
- TAILQ_INSERT_TAIL(dst, ped, link);
- }
-}
-
-/**
- * Path_MakeFlags
- * Make a string by taking all the directories in the given search
- * path and preceding them by the given flag. Used by the suffix
- * module to create variables for compilers based on suffix search
- * paths.
- *
- * Results:
- * The string mentioned above. Note that there is no space between
- * the given flag and each directory. The empty string is returned if
- * Things don't go well.
- */
-char *
-Path_MakeFlags(const char *flag, const struct Path *path)
-{
- char *str; /* the string which will be returned */
- char *tstr; /* the current directory preceded by 'flag' */
- char *nstr;
- const struct PathElement *pe;
-
- str = estrdup("");
-
- TAILQ_FOREACH(pe, path, link) {
- tstr = str_concat(flag, pe->dir->name, 0);
- nstr = str_concat(str, tstr, STR_ADDSPACE);
- free(str);
- free(tstr);
- str = nstr;
- }
-
- return (str);
-}
-
-/**
- * Path_Clear
- *
- * Destroy a path. This decrements the reference counts of all
- * directories of this path and, if a reference count goes 0,
- * destroys the directory object.
- */
-void
-Path_Clear(struct Path *path)
-{
- struct PathElement *pe;
-
- while ((pe = TAILQ_FIRST(path)) != NULL) {
- pe->dir->refCount--;
- TAILQ_REMOVE(path, pe, link);
- if (pe->dir->refCount == 0) {
- TAILQ_REMOVE(&openDirectories, pe->dir, link);
- Hash_DeleteTable(&pe->dir->files);
- free(pe->dir->name);
- free(pe->dir);
- }
- free(pe);
- }
-}
-
-/**
- * Path_Concat
- *
- * Concatenate two paths, adding the second to the end of the first.
- * Make sure to avoid duplicates.
- *
- * Side Effects:
- * Reference counts for added dirs are upped.
- */
-void
-Path_Concat(struct Path *path1, const struct Path *path2)
-{
- struct PathElement *p1, *p2;
-
- TAILQ_FOREACH(p2, path2, link) {
- TAILQ_FOREACH(p1, path1, link) {
- if (p1->dir == p2->dir)
- break;
- }
- if (p1 == NULL) {
- p1 = emalloc(sizeof(*p1));
- p1->dir = p2->dir;
- p1->dir->refCount++;
- TAILQ_INSERT_TAIL(path1, p1, link);
- }
- }
-}
-
-/********** DEBUG INFO **********/
-void
-Dir_PrintDirectories(void)
-{
- const Dir *d;
-
- printf("#*** Directory Cache:\n");
- printf("# Stats: %d hits %d misses %d near misses %d losers (%d%%)\n",
- hits, misses, nearmisses, bigmisses,
- (hits + bigmisses + nearmisses ?
- hits * 100 / (hits + bigmisses + nearmisses) : 0));
- printf("# %-20s referenced\thits\n", "directory");
- TAILQ_FOREACH(d, &openDirectories, link)
- printf("# %-20s %10d\t%4d\n", d->name, d->refCount, d->hits);
-}
-
-void
-Path_Print(const struct Path *path)
-{
- const struct PathElement *p;
-
- TAILQ_FOREACH(p, path, link)
- printf("%s ", p->dir->name);
-}
diff --git a/usr.bin/make/dir.h b/usr.bin/make/dir.h
deleted file mode 100644
index 03481b8..0000000
--- a/usr.bin/make/dir.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1988, 1989 by Adam de Boor
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)dir.h 8.2 (Berkeley) 4/28/95
- * $FreeBSD$
- */
-
-#ifndef dir_h_6002e3b8
-#define dir_h_6002e3b8
-
-#include <sys/queue.h>
-#include "hash.h"
-
-struct GNode;
-struct Lst;
-struct Dir;
-
-struct PathElement;
-TAILQ_HEAD(Path, PathElement);
-
-void Dir_Init(void);
-void Dir_InitDot(void);
-Boolean Dir_HasWildcards(const char *);
-int Dir_MTime(struct GNode *);
-void Dir_PrintDirectories(void);
-
-struct Dir *Path_AddDir(struct Path *, const char *);
-void Path_Clear(struct Path *);
-void Path_Concat(struct Path *, const struct Path *);
-void Path_Duplicate(struct Path *, const struct Path *);
-void Path_Expand(char *, struct Path *, struct Lst *);
-char *Path_FindFile(char *, struct Path *);
-char *Path_MakeFlags(const char *, const struct Path *);
-void Path_Print(const struct Path *);
-
-#endif /* dir_h_6002e3b8 */
diff --git a/usr.bin/make/for.c b/usr.bin/make/for.c
deleted file mode 100644
index b035238..0000000
--- a/usr.bin/make/for.c
+++ /dev/null
@@ -1,269 +0,0 @@
-/*-
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Christos Zoulas.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)for.c 8.1 (Berkeley) 6/6/93
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*-
- * for.c --
- * Functions to handle loops in a makefile.
- *
- * Interface:
- * For_Eval Evaluate the loop in the passed line.
- * For_Run Run accumulated loop
- *
- */
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "buf.h"
-#include "dir.h"
-#include "for.h"
-#include "globals.h"
-#include "lst.h"
-#include "make.h"
-#include "parse.h"
-#include "str.h"
-#include "util.h"
-#include "var.h"
-
-/*
- * For statements are of the form:
- *
- * .for <variable> in <varlist>
- * ...
- * .endfor
- *
- * The trick is to look for the matching end inside for for loop
- * To do that, we count the current nesting level of the for loops.
- * and the .endfor statements, accumulating all the statements between
- * the initial .for loop and the matching .endfor;
- * then we evaluate the for loop for each variable in the varlist.
- */
-
-static int forLevel = 0; /* Nesting level */
-static char *forVar; /* Iteration variable */
-static Buffer *forBuf; /* Commands in loop */
-static Lst forLst; /* List of items */
-
-/**
- * For_For
- * Evaluate the for loop in the passed line. The line
- * looks like this:
- * .for <variable> in <varlist>
- * The line pointer points just behind the for.
- *
- * Results:
- * TRUE: Syntax ok.
- * FALSE: Syntax error.
- */
-Boolean
-For_For(char *line)
-{
- char *ptr;
- char *wrd;
- char *sub;
- Buffer *buf;
- size_t varlen;
- int i;
- ArgArray words;
-
- ptr = line;
-
- /*
- * Skip space between for and the variable.
- */
- for (ptr++; *ptr && isspace((u_char)*ptr); ptr++)
- ;
-
- /*
- * Grab the variable
- */
- for (wrd = ptr; *ptr && !isspace((u_char)*ptr); ptr++)
- ;
-
- buf = Buf_Init(0);
- Buf_AppendRange(buf, wrd, ptr);
- forVar = Buf_GetAll(buf, &varlen);
-
- if (varlen == 0) {
- Buf_Destroy(buf, TRUE);
- Parse_Error(PARSE_FATAL, "missing variable in for");
- return (FALSE);
- }
- Buf_Destroy(buf, FALSE);
-
- /*
- * Skip to 'in'.
- */
- while (*ptr && isspace((u_char)*ptr))
- ptr++;
-
- /*
- * Grab the `in'
- */
- if (ptr[0] != 'i' || ptr[1] != 'n' || !isspace((u_char)ptr[2])) {
- free(forVar);
- Parse_Error(PARSE_FATAL, "missing `in' in for");
- fprintf(stderr, "%s\n", ptr);
- return (FALSE);
- }
- ptr += 3;
-
- /*
- * Skip to values
- */
- while (*ptr && isspace((u_char)*ptr))
- ptr++;
-
- /*
- * Make a list with the remaining words
- */
- sub = Buf_Peel(Var_Subst(ptr, VAR_CMD, FALSE));
- brk_string(&words, sub, FALSE);
- Lst_Init(&forLst);
- for (i = 1; i < words.argc; i++) {
- if (words.argv[i][0] != '\0')
- Lst_AtFront(&forLst, estrdup(words.argv[i]));
- }
- ArgArray_Done(&words);
- DEBUGF(FOR, ("For: Iterator %s List %s\n", forVar, sub));
- free(sub);
-
- forBuf = Buf_Init(0);
- forLevel++;
- return (TRUE);
-}
-
-/**
- * For_Eval
- * Eat a line of the .for body looking for embedded .for loops
- * and the .endfor
- */
-Boolean
-For_Eval(char *line)
-{
- char *ptr;
-
- ptr = line;
-
- if (*ptr == '.') {
- /*
- * Need to check for 'endfor' and 'for' to find the end
- * of our loop or to find embedded for loops.
- */
- for (ptr++; *ptr != '\0' && isspace((u_char)*ptr); ptr++)
- ;
-
- /* XXX the isspace is wrong */
- if (strncmp(ptr, "endfor", 6) == 0 &&
- (isspace((u_char)ptr[6]) || ptr[6] == '\0')) {
- DEBUGF(FOR, ("For: end for %d\n", forLevel));
- if (forLevel == 0) {
- /* should not be here */
- abort();
- }
- forLevel--;
-
- } else if (strncmp(ptr, "for", 3) == 0 &&
- isspace((u_char)ptr[3])) {
- forLevel++;
- DEBUGF(FOR, ("For: new loop %d\n", forLevel));
- }
- }
-
- if (forLevel != 0) {
- /*
- * Still in loop - append the line
- */
- Buf_Append(forBuf, line);
- Buf_AddByte(forBuf, (Byte)'\n');
- return (TRUE);
- }
-
- return (FALSE);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * For_Run --
- * Run the for loop, immitating the actions of an include file
- *
- * Results:
- * None.
- *
- * Side Effects:
- * The values of the variables forLst, forVar and forBuf are freed.
- *
- *-----------------------------------------------------------------------
- */
-void
-For_Run(int lineno)
-{
- Lst values; /* list of values for the variable */
- char *var; /* the variable's name */
- Buffer *buf; /* the contents of the for loop */
- const char *val; /* current value of loop variable */
- LstNode *ln;
- char *str;
-
- if (forVar == NULL || forBuf == NULL)
- return;
-
- /* copy the global variables to have them free for embedded fors */
- var = forVar;
- buf = forBuf;
- Lst_Init(&values);
- Lst_Concat(&values, &forLst, LST_CONCLINK);
-
- forVar = NULL;
- forBuf = NULL;
-
- LST_FOREACH(ln, &values) {
- val = Lst_Datum(ln);
- Var_Set(var, val, VAR_GLOBAL);
-
- DEBUGF(FOR, ("--- %s = %s\n", var, val));
- str = Buf_Peel(Var_SubstOnly(var, Buf_Data(buf), FALSE));
-
- Parse_FromString(str, lineno);
- Var_Delete(var, VAR_GLOBAL);
- }
-
- free(var);
- Lst_Destroy(&values, free);
- Buf_Destroy(buf, TRUE);
-}
diff --git a/usr.bin/make/for.h b/usr.bin/make/for.h
deleted file mode 100644
index 0e43c4a..0000000
--- a/usr.bin/make/for.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef for_h_9d770f33
-#define for_h_9d770f33
-
-#include "util.h"
-
-Boolean For_For(char *);
-Boolean For_Eval(char *);
-void For_Run(int);
-
-#endif /* for_h_9d770f33 */
diff --git a/usr.bin/make/globals.h b/usr.bin/make/globals.h
deleted file mode 100644
index 04c7da9..0000000
--- a/usr.bin/make/globals.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef globals_h_1c1edb96
-#define globals_h_1c1edb96
-
-/*
- * Global Variables
- */
-
-#include <time.h>
-#include <stdint.h>
-
-#include "lst.h"
-#include "util.h"
-
-struct GNode;
-struct Path;
-
-/*
- * The list of target names specified on the command line.
- * Used to resolve #if make(...) statements
- */
-extern Lst create;
-
-/* The list of directories to search when looking for targets */
-extern struct Path dirSearchPath;
-
-/* The list of directories to search when looking for includes */
-extern struct Path parseIncPath;
-
-/* The system include path. */
-extern struct Path sysIncPath;
-
-extern int jobLimit; /* -j argument: maximum number of jobs */
-extern Boolean jobsRunning; /* True if jobs are running */
-extern Boolean compatMake; /* True if we are make compatible */
-extern Boolean ignoreErrors; /* True if should ignore all errors */
-extern Boolean beSilent; /* True if should print no commands */
-extern Boolean beVerbose; /* True if should print extra cruft */
-extern Boolean noExecute; /* True if should execute nothing */
-extern Boolean allPrecious; /* True if every target is precious */
-extern Boolean is_posix; /* .POSIX target seen */
-extern Boolean mfAutoDeps; /* .MAKEFILEDEPS target seen */
-
-/* True if should continue on unaffected portions of the graph
- * when have an error in one portion */
-extern Boolean keepgoing;
-
-/* TRUE if targets should just be 'touched'if out of date. Set by the -t flag */
-extern Boolean touchFlag;
-
-/* TRUE if should capture the output of subshells by means of pipes.
- * Otherwise it is routed to temporary files from which it is retrieved
- * when the shell exits */
-extern Boolean usePipes;
-
-/* TRUE if we aren't supposed to really make anything, just see if the
- * targets are out-of-date */
-extern Boolean queryFlag;
-
-/* List of specific variables for which the environment should be
- * searched before the global context */
-extern Lst envFirstVars;
-
-extern struct GNode *DEFAULT; /* .DEFAULT rule */
-
-/* The time at the start of this whole process */
-extern time_t now;
-
-extern int debug;
-
-/* warning flags */
-extern uint32_t warn_cmd; /* positive warning flags on command line */
-extern uint32_t warn_nocmd; /* negative warning flags on command line */
-extern uint32_t warn_flags; /* current warning flags */
-
-#endif /* globals_h_1c1edb96 */
diff --git a/usr.bin/make/hash.c b/usr.bin/make/hash.c
deleted file mode 100644
index b5ea6bc..0000000
--- a/usr.bin/make/hash.c
+++ /dev/null
@@ -1,398 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1988, 1989 by Adam de Boor
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)hash.c 8.1 (Berkeley) 6/6/93
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/* hash.c --
- *
- * This module contains routines to manipulate a hash table.
- * See hash.h for a definition of the structure of the hash
- * table. Hash tables grow automatically as the amount of
- * information increases.
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "hash.h"
-#include "util.h"
-
-/*
- * Forward references to local procedures that are used before they're
- * defined:
- */
-static void RebuildTable(Hash_Table *);
-
-/*
- * The following defines the ratio of # entries to # buckets
- * at which we rebuild the table to make it larger.
- */
-
-#define rebuildLimit 8
-
-/*
- *---------------------------------------------------------
- *
- * Hash_InitTable --
- *
- * Set up the hash table t with a given number of buckets, or a
- * reasonable default if the number requested is less than or
- * equal to zero. Hash tables will grow in size as needed.
- *
- *
- * Results:
- * None.
- *
- * Side Effects:
- * Memory is allocated for the initial bucket area.
- *
- *---------------------------------------------------------
- */
-void
-Hash_InitTable(Hash_Table *t, int numBuckets)
-{
- int i;
- struct Hash_Entry **hp;
-
- /*
- * Round up the size to a power of two.
- */
- if (numBuckets <= 0)
- i = 16;
- else {
- for (i = 2; i < numBuckets; i <<= 1)
- continue;
- }
- t->numEntries = 0;
- t->size = i;
- t->mask = i - 1;
- t->bucketPtr = hp = emalloc(sizeof(*hp) * i);
- while (--i >= 0)
- *hp++ = NULL;
-}
-
-/*
- *---------------------------------------------------------
- *
- * Hash_DeleteTable --
- *
- * This routine removes everything from a hash table
- * and frees up the memory space it occupied (except for
- * the space in the Hash_Table structure).
- *
- * Results:
- * None.
- *
- * Side Effects:
- * Lots of memory is freed up.
- *
- *---------------------------------------------------------
- */
-void
-Hash_DeleteTable(Hash_Table *t)
-{
- struct Hash_Entry **hp, *h, *nexth = NULL;
- int i;
-
- for (hp = t->bucketPtr, i = t->size; --i >= 0;) {
- for (h = *hp++; h != NULL; h = nexth) {
- nexth = h->next;
- free(h);
- }
- }
- free(t->bucketPtr);
-
- /*
- * Set up the hash table to cause memory faults on any future access
- * attempts until re-initialization.
- */
- t->bucketPtr = NULL;
-}
-
-/*
- *---------------------------------------------------------
- *
- * Hash_FindEntry --
- *
- * Searches a hash table for an entry corresponding to key.
- *
- * Results:
- * The return value is a pointer to the entry for key,
- * if key was present in the table. If key was not
- * present, NULL is returned.
- *
- * Side Effects:
- * None.
- *
- *---------------------------------------------------------
- */
-Hash_Entry *
-Hash_FindEntry(const Hash_Table *t, const char *key)
-{
- Hash_Entry *e;
- unsigned h;
- const char *p;
-
- for (h = 0, p = key; *p;)
- h = (h << 5) - h + *p++;
- p = key;
- for (e = t->bucketPtr[h & t->mask]; e != NULL; e = e->next)
- if (e->namehash == h && strcmp(e->name, p) == 0)
- return (e);
- return (NULL);
-}
-
-/*
- *---------------------------------------------------------
- *
- * Hash_CreateEntry --
- *
- * Searches a hash table for an entry corresponding to
- * key. If no entry is found, then one is created.
- *
- * Results:
- * The return value is a pointer to the entry. If *newPtr
- * isn't NULL, then *newPtr is filled in with TRUE if a
- * new entry was created, and FALSE if an entry already existed
- * with the given key.
- *
- * Side Effects:
- * Memory may be allocated, and the hash buckets may be modified.
- *---------------------------------------------------------
- */
-Hash_Entry *
-Hash_CreateEntry(Hash_Table *t, const char *key, Boolean *newPtr)
-{
- Hash_Entry *e;
- unsigned int h;
- const char *p;
- int keylen;
- struct Hash_Entry **hp;
-
- /*
- * Hash the key. As a side effect, save the length (strlen) of the
- * key in case we need to create the entry.
- */
- for (h = 0, p = key; *p;)
- h = (h << 5) - h + *p++;
- keylen = p - key;
- p = key;
- for (e = t->bucketPtr[h & t->mask]; e != NULL; e = e->next) {
- if (e->namehash == h && strcmp(e->name, p) == 0) {
- if (newPtr != NULL)
- *newPtr = FALSE;
- return (e);
- }
- }
-
- /*
- * The desired entry isn't there. Before allocating a new entry,
- * expand the table if necessary (and this changes the resulting
- * bucket chain).
- */
- if (t->numEntries >= rebuildLimit * t->size)
- RebuildTable(t);
- e = emalloc(sizeof(*e) + keylen);
- hp = &t->bucketPtr[h & t->mask];
- e->next = *hp;
- *hp = e;
- e->clientData = NULL;
- e->namehash = h;
- strcpy(e->name, p);
- t->numEntries++;
-
- if (newPtr != NULL)
- *newPtr = TRUE;
- return (e);
-}
-
-/*
- *---------------------------------------------------------
- *
- * Hash_DeleteEntry --
- *
- * Delete the given hash table entry and free memory associated with
- * it.
- *
- * Results:
- * None.
- *
- * Side Effects:
- * Hash chain that entry lives in is modified and memory is freed.
- *
- *---------------------------------------------------------
- */
-void
-Hash_DeleteEntry(Hash_Table *t, Hash_Entry *e)
-{
- Hash_Entry **hp, *p;
-
- if (e == NULL)
- return;
- for (hp = &t->bucketPtr[e->namehash & t->mask];
- (p = *hp) != NULL; hp = &p->next) {
- if (p == e) {
- *hp = p->next;
- free(p);
- t->numEntries--;
- return;
- }
- }
- write(STDERR_FILENO, "bad call to Hash_DeleteEntry\n", 29);
- abort();
-}
-
-/*
- *---------------------------------------------------------
- *
- * Hash_EnumFirst --
- * This procedure sets things up for a complete search
- * of all entries recorded in the hash table.
- *
- * Results:
- * The return value is the address of the first entry in
- * the hash table, or NULL if the table is empty.
- *
- * Side Effects:
- * The information in searchPtr is initialized so that successive
- * calls to Hash_Next will return successive HashEntry's
- * from the table.
- *
- *---------------------------------------------------------
- */
-Hash_Entry *
-Hash_EnumFirst(const Hash_Table *t, Hash_Search *searchPtr)
-{
-
- searchPtr->tablePtr = t;
- searchPtr->nextIndex = 0;
- searchPtr->hashEntryPtr = NULL;
- return (Hash_EnumNext(searchPtr));
-}
-
-/*
- *---------------------------------------------------------
- *
- * Hash_EnumNext --
- * This procedure returns successive entries in the hash table.
- *
- * Results:
- * The return value is a pointer to the next HashEntry
- * in the table, or NULL when the end of the table is
- * reached.
- *
- * Side Effects:
- * The information in searchPtr is modified to advance to the
- * next entry.
- *
- *---------------------------------------------------------
- */
-Hash_Entry *
-Hash_EnumNext(Hash_Search *searchPtr)
-{
- Hash_Entry *e;
- const Hash_Table *t = searchPtr->tablePtr;
-
- /*
- * The hashEntryPtr field points to the most recently returned
- * entry, or is NULL if we are starting up. If not NULL, we have
- * to start at the next one in the chain.
- */
- e = searchPtr->hashEntryPtr;
- if (e != NULL)
- e = e->next;
- /*
- * If the chain ran out, or if we are starting up, we need to
- * find the next nonempty chain.
- */
- while (e == NULL) {
- if (searchPtr->nextIndex >= t->size)
- return (NULL);
- e = t->bucketPtr[searchPtr->nextIndex++];
- }
- searchPtr->hashEntryPtr = e;
- return (e);
-}
-
-/*
- *---------------------------------------------------------
- *
- * RebuildTable --
- * This local routine makes a new hash table that
- * is larger than the old one.
- *
- * Results:
- * None.
- *
- * Side Effects:
- * The entire hash table is moved, so any bucket numbers
- * from the old table are invalid.
- *
- *---------------------------------------------------------
- */
-static void
-RebuildTable(Hash_Table *t)
-{
- Hash_Entry *e, *next = NULL, **hp, **xp;
- int i, mask;
- Hash_Entry **oldhp;
- int oldsize;
-
- oldhp = t->bucketPtr;
- oldsize = i = t->size;
- i <<= 1;
- t->size = i;
- t->mask = mask = i - 1;
- t->bucketPtr = hp = emalloc(sizeof(*hp) * i);
- while (--i >= 0)
- *hp++ = NULL;
- for (hp = oldhp, i = oldsize; --i >= 0;) {
- for (e = *hp++; e != NULL; e = next) {
- next = e->next;
- xp = &t->bucketPtr[e->namehash & mask];
- e->next = *xp;
- *xp = e;
- }
- }
- free(oldhp);
-}
diff --git a/usr.bin/make/hash.h b/usr.bin/make/hash.h
deleted file mode 100644
index 80dd74d..0000000
--- a/usr.bin/make/hash.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1988, 1989 by Adam de Boor
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)hash.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#ifndef hash_h_f6312f46
-#define hash_h_f6312f46
-
-/* hash.h --
- *
- * This file contains definitions used by the hash module,
- * which maintains hash tables.
- */
-
-#include "util.h"
-
-/*
- * The following defines one entry in the hash table.
- */
-typedef struct Hash_Entry {
- struct Hash_Entry *next; /* Link entries within same bucket. */
- void *clientData; /* Data associated with key. */
- unsigned namehash; /* hash value of key */
- char name[1]; /* key string */
-} Hash_Entry;
-
-typedef struct Hash_Table {
- struct Hash_Entry **bucketPtr; /* Buckets in the table */
- int size; /* Actual size of array. */
- int numEntries; /* Number of entries in the table. */
- int mask; /* Used to select bits for hashing. */
-} Hash_Table;
-
-/*
- * The following structure is used by the searching routines
- * to record where we are in the search.
- */
-typedef struct Hash_Search {
- const Hash_Table *tablePtr; /* Table being searched. */
- int nextIndex; /* Next bucket to check */
- Hash_Entry *hashEntryPtr; /* Next entry in current bucket */
-} Hash_Search;
-
-/*
- * Macros.
- */
-
-/*
- * void *Hash_GetValue(const Hash_Entry *h)
- */
-#define Hash_GetValue(h) ((h)->clientData)
-
-/*
- * Hash_SetValue(Hash_Entry *h, void *val);
- */
-#define Hash_SetValue(h, val) ((h)->clientData = (val))
-
-void Hash_InitTable(Hash_Table *, int);
-void Hash_DeleteTable(Hash_Table *);
-Hash_Entry *Hash_FindEntry(const Hash_Table *, const char *);
-Hash_Entry *Hash_CreateEntry(Hash_Table *, const char *, Boolean *);
-void Hash_DeleteEntry(Hash_Table *, Hash_Entry *);
-Hash_Entry *Hash_EnumFirst(const Hash_Table *, Hash_Search *);
-Hash_Entry *Hash_EnumNext(Hash_Search *);
-
-#endif /* hash_h_f6312f46 */
diff --git a/usr.bin/make/hash_tables.c b/usr.bin/make/hash_tables.c
deleted file mode 100644
index 27909d0..0000000
--- a/usr.bin/make/hash_tables.c
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * DO NOT EDIT
- * $FreeBSD$
- * auto-generated from FreeBSD: src/usr.bin/make/parse.c,v 1.114 2008/03/12 14:50:58 obrien Exp
- * DO NOT EDIT
- */
-#include <sys/types.h>
-
-#include "hash_tables.h"
-
-/*
- * d=2
- * n=40
- * m=19
- * c=2.09
- * maxlen=1
- * minklen=2
- * maxklen=9
- * minchar=97
- * maxchar=119
- * loop=0
- * numiter=1
- * seed=
- */
-
-static const signed char directive_g[] = {
- 8, 0, 0, 5, 6, -1, 17, 15, 10, 6,
- -1, -1, 10, 0, 0, -1, 18, 2, 3, 0,
- 7, -1, -1, -1, 0, 14, -1, -1, 11, 16,
- -1, -1, 0, -1, 0, 0, 17, 0, -1, 1,
-};
-
-static const u_char directive_T0[] = {
- 26, 14, 19, 35, 10, 34, 18, 27, 1, 17,
- 22, 37, 12, 12, 36, 21, 0, 6, 1, 25,
- 9, 4, 19,
-};
-
-static const u_char directive_T1[] = {
- 25, 22, 19, 0, 2, 18, 33, 18, 30, 4,
- 30, 9, 21, 19, 16, 12, 35, 34, 4, 19,
- 9, 33, 16,
-};
-
-
-int
-directive_hash(const u_char *key, size_t len)
-{
- unsigned f0, f1;
- const u_char *kp = key;
-
- if (len < 2 || len > 9)
- return -1;
-
- for (f0=f1=0; kp < key + len; ++kp) {
- if (*kp < 97 || *kp > 119)
- return -1;
- f0 += directive_T0[-97 + *kp];
- f1 += directive_T1[-97 + *kp];
- }
-
- f0 %= 40;
- f1 %= 40;
-
- return (directive_g[f0] + directive_g[f1]) % 19;
-}
-/*
- * d=2
- * n=74
- * m=35
- * c=2.09
- * maxlen=1
- * minklen=4
- * maxklen=13
- * minchar=46
- * maxchar=95
- * loop=0
- * numiter=4
- * seed=
- */
-
-static const signed char keyword_g[] = {
- 12, 18, 7, 25, 30, 5, -1, -1, -1, 7,
- -1, 0, 33, 0, 4, -1, -1, 13, 29, 0,
- -1, 28, -1, 28, -1, 0, -1, 27, 4, 34,
- -1, -1, -1, 30, 13, 10, -1, -1, 0, 10,
- 24, -1, -1, -1, 0, 6, 0, 0, -1, 23,
- -1, -1, -1, 0, -1, 23, -1, -1, 19, 4,
- -1, 31, 12, 16, -1, 20, 22, 9, 0, -1,
- -1, 9, 4, 0,
-};
-
-static const u_char keyword_T0[] = {
- 34, 28, 50, 61, 14, 57, 48, 60, 20, 67,
- 60, 63, 0, 24, 28, 2, 49, 64, 18, 23,
- 36, 33, 40, 14, 38, 42, 71, 49, 2, 53,
- 53, 37, 7, 29, 24, 21, 12, 50, 59, 10,
- 43, 23, 0, 44, 47, 6, 46, 22, 48, 64,
-};
-
-static const u_char keyword_T1[] = {
- 18, 67, 39, 60, 7, 70, 2, 26, 31, 18,
- 73, 47, 61, 17, 38, 50, 22, 52, 13, 55,
- 56, 32, 63, 4, 64, 55, 49, 21, 47, 67,
- 33, 66, 60, 73, 30, 68, 69, 32, 72, 4,
- 28, 49, 51, 15, 66, 68, 43, 67, 46, 56,
-};
-
-
-int
-keyword_hash(const u_char *key, size_t len)
-{
- unsigned f0, f1;
- const u_char *kp = key;
-
- if (len < 4 || len > 13)
- return -1;
-
- for (f0=f1=0; *kp; ++kp) {
- if (*kp < 46 || *kp > 95)
- return -1;
- f0 += keyword_T0[-46 + *kp];
- f1 += keyword_T1[-46 + *kp];
- }
-
- f0 %= 74;
- f1 %= 74;
-
- return (keyword_g[f0] + keyword_g[f1]) % 35;
-}
diff --git a/usr.bin/make/hash_tables.h b/usr.bin/make/hash_tables.h
deleted file mode 100644
index 8fa43a5..0000000
--- a/usr.bin/make/hash_tables.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2005 Max Okumoto.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-#ifndef hash_tables_h_
-#define hash_tables_h_
-
-#include <sys/types.h>
-
-int directive_hash(const u_char *, size_t);
-int keyword_hash(const u_char *, size_t);
-
-#endif
diff --git a/usr.bin/make/job.c b/usr.bin/make/job.c
deleted file mode 100644
index 77a7f86..0000000
--- a/usr.bin/make/job.c
+++ /dev/null
@@ -1,3387 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1988, 1989 by Adam de Boor
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)job.c 8.2 (Berkeley) 3/19/94
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*-
- * job.c --
- * handle the creation etc. of our child processes.
- *
- * Interface:
- * Job_Make Start the creation of the given target.
- *
- * Job_CatchChildren
- * Check for and handle the termination of any children.
- * This must be called reasonably frequently to keep the
- * whole make going at a decent clip, since job table
- * entries aren't removed until their process is caught
- * this way. Its single argument is TRUE if the function
- * should block waiting for a child to terminate.
- *
- * Job_CatchOutput Print any output our children have produced. Should
- * also be called fairly frequently to keep the user
- * informed of what's going on. If no output is waiting,
- * it will block for a time given by the SEL_* constants,
- * below, or until output is ready.
- *
- * Job_Init Called to intialize this module. in addition, any
- * commands attached to the .BEGIN target are executed
- * before this function returns. Hence, the makefile must
- * have been parsed before this function is called.
- *
- * Job_Full Return TRUE if the job table is filled.
- *
- * Job_Empty Return TRUE if the job table is completely empty.
- *
- * Job_Finish Perform any final processing which needs doing. This
- * includes the execution of any commands which have
- * been/were attached to the .END target. It should only
- * be called when the job table is empty.
- *
- * Job_AbortAll Abort all currently running jobs. It doesn't handle
- * output or do anything for the jobs, just kills them.
- * It should only be called in an emergency, as it were.
- *
- * Job_CheckCommands
- * Verify that the commands for a target are ok. Provide
- * them if necessary and possible.
- *
- * Job_Touch Update a target without really updating it.
- *
- * Job_Wait Wait for all currently-running jobs to finish.
- *
- * compat.c --
- * The routines in this file implement the full-compatibility
- * mode of PMake. Most of the special functionality of PMake
- * is available in this mode. Things not supported:
- * - different shells.
- * - friendly variable substitution.
- *
- * Interface:
- * Compat_Run Initialize things for this module and recreate
- * thems as need creatin'
- */
-
-#include <sys/queue.h>
-#include <sys/types.h>
-#include <sys/select.h>
-#include <sys/stat.h>
-#ifdef USE_KQUEUE
-#include <sys/event.h>
-#endif
-#include <sys/wait.h>
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <string.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <utime.h>
-
-#include "arch.h"
-#include "buf.h"
-#include "config.h"
-#include "dir.h"
-#include "globals.h"
-#include "GNode.h"
-#include "job.h"
-#include "make.h"
-#include "parse.h"
-#include "proc.h"
-#include "shell.h"
-#include "str.h"
-#include "suff.h"
-#include "targ.h"
-#include "util.h"
-#include "var.h"
-
-#define TMPPAT "/tmp/makeXXXXXXXXXX"
-
-#ifndef USE_KQUEUE
-/*
- * The SEL_ constants determine the maximum amount of time spent in select
- * before coming out to see if a child has finished. SEL_SEC is the number of
- * seconds and SEL_USEC is the number of micro-seconds
- */
-#define SEL_SEC 2
-#define SEL_USEC 0
-#endif /* !USE_KQUEUE */
-
-/*
- * Job Table definitions.
- *
- * The job "table" is kept as a linked Lst in 'jobs', with the number of
- * active jobs maintained in the 'nJobs' variable. At no time will this
- * exceed the value of 'maxJobs', initialized by the Job_Init function.
- *
- * When a job is finished, the Make_Update function is called on each of the
- * parents of the node which was just remade. This takes care of the upward
- * traversal of the dependency graph.
- */
-#define JOB_BUFSIZE 1024
-typedef struct Job {
- pid_t pid; /* The child's process ID */
-
- struct GNode *node; /* The target the child is making */
-
- /*
- * A LstNode for the first command to be saved after the job completes.
- * This is NULL if there was no "..." in the job's commands.
- */
- LstNode *tailCmds;
-
- /*
- * An FILE* for writing out the commands. This is only
- * used before the job is actually started.
- */
- FILE *cmdFILE;
-
- /*
- * A word of flags which determine how the module handles errors,
- * echoing, etc. for the job
- */
- short flags; /* Flags to control treatment of job */
-#define JOB_IGNERR 0x001 /* Ignore non-zero exits */
-#define JOB_SILENT 0x002 /* no output */
-#define JOB_SPECIAL 0x004 /* Target is a special one. i.e. run it locally
- * if we can't export it and maxLocal is 0 */
-#define JOB_IGNDOTS 0x008 /* Ignore "..." lines when processing
- * commands */
-#define JOB_FIRST 0x020 /* Job is first job for the node */
-#define JOB_RESTART 0x080 /* Job needs to be completely restarted */
-#define JOB_RESUME 0x100 /* Job needs to be resumed b/c it stopped,
- * for some reason */
-#define JOB_CONTINUING 0x200 /* We are in the process of resuming this job.
- * Used to avoid infinite recursion between
- * JobFinish and JobRestart */
-
- /* union for handling shell's output */
- union {
- /*
- * This part is used when usePipes is true.
- * The output is being caught via a pipe and the descriptors
- * of our pipe, an array in which output is line buffered and
- * the current position in that buffer are all maintained for
- * each job.
- */
- struct {
- /*
- * Input side of pipe associated with
- * job's output channel
- */
- int op_inPipe;
-
- /*
- * Output side of pipe associated with job's
- * output channel
- */
- int op_outPipe;
-
- /*
- * Buffer for storing the output of the
- * job, line by line
- */
- char op_outBuf[JOB_BUFSIZE + 1];
-
- /* Current position in op_outBuf */
- int op_curPos;
- } o_pipe;
-
- /*
- * If usePipes is false the output is routed to a temporary
- * file and all that is kept is the name of the file and the
- * descriptor open to the file.
- */
- struct {
- /* Name of file to which shell output was rerouted */
- char of_outFile[sizeof(TMPPAT)];
-
- /*
- * Stream open to the output file. Used to funnel all
- * from a single job to one file while still allowing
- * multiple shell invocations
- */
- int of_outFd;
- } o_file;
-
- } output; /* Data for tracking a shell's output */
-
- TAILQ_ENTRY(Job) link; /* list link */
-} Job;
-
-#define outPipe output.o_pipe.op_outPipe
-#define inPipe output.o_pipe.op_inPipe
-#define outBuf output.o_pipe.op_outBuf
-#define curPos output.o_pipe.op_curPos
-#define outFile output.o_file.of_outFile
-#define outFd output.o_file.of_outFd
-
-TAILQ_HEAD(JobList, Job);
-
-/*
- * error handling variables
- */
-static int errors = 0; /* number of errors reported */
-static int aborting = 0; /* why is the make aborting? */
-#define ABORT_ERROR 1 /* Because of an error */
-#define ABORT_INTERRUPT 2 /* Because it was interrupted */
-#define ABORT_WAIT 3 /* Waiting for jobs to finish */
-
-/*
- * XXX: Avoid SunOS bug... FILENO() is fp->_file, and file
- * is a char! So when we go above 127 we turn negative!
- */
-#define FILENO(a) ((unsigned)fileno(a))
-
-/*
- * post-make command processing. The node postCommands is really just the
- * .END target but we keep it around to avoid having to search for it
- * all the time.
- */
-static GNode *postCommands;
-
-/*
- * The number of commands actually printed for a target. Should this
- * number be 0, no shell will be executed.
- */
-static int numCommands;
-
-/*
- * Return values from JobStart.
- */
-#define JOB_RUNNING 0 /* Job is running */
-#define JOB_ERROR 1 /* Error in starting the job */
-#define JOB_FINISHED 2 /* The job is already finished */
-#define JOB_STOPPED 3 /* The job is stopped */
-
-/*
- * The maximum number of jobs that may run. This is initialize from the
- * -j argument for the leading make and from the FIFO for sub-makes.
- */
-static int maxJobs;
-
-static int nJobs; /* The number of children currently running */
-
-/* The structures that describe them */
-static struct JobList jobs = TAILQ_HEAD_INITIALIZER(jobs);
-
-static Boolean jobFull; /* Flag to tell when the job table is full. It
- * is set TRUE when (1) the total number of
- * running jobs equals the maximum allowed */
-#ifdef USE_KQUEUE
-static int kqfd; /* File descriptor obtained by kqueue() */
-#else
-static fd_set outputs; /* Set of descriptors of pipes connected to
- * the output channels of children */
-#endif
-
-static GNode *lastNode; /* The node for which output was most recently
- * produced. */
-static const char *targFmt; /* Format string to use to head output from a
- * job when it's not the most-recent job heard
- * from */
-
-#define TARG_FMT "--- %s ---\n" /* Default format */
-#define MESSAGE(fp, gn) \
- fprintf(fp, targFmt, gn->name);
-
-/*
- * When JobStart attempts to run a job but isn't allowed to
- * or when Job_CatchChildren detects a job that has
- * been stopped somehow, the job is placed on the stoppedJobs queue to be run
- * when the next job finishes.
- *
- * Lst of Job structures describing jobs that were stopped due to
- * concurrency limits or externally
- */
-static struct JobList stoppedJobs = TAILQ_HEAD_INITIALIZER(stoppedJobs);
-
-static int fifoFd; /* Fd of our job fifo */
-static char fifoName[] = "/tmp/make_fifo_XXXXXXXXX";
-static int fifoMaster;
-
-static sig_atomic_t interrupted;
-
-
-#if defined(USE_PGRP) && defined(SYSV)
-# define KILL(pid, sig) killpg(-(pid), (sig))
-#else
-# if defined(USE_PGRP)
-# define KILL(pid, sig) killpg((pid), (sig))
-# else
-# define KILL(pid, sig) kill((pid), (sig))
-# endif
-#endif
-
-/*
- * Grmpf... There is no way to set bits of the wait structure
- * anymore with the stupid W*() macros. I liked the union wait
- * stuff much more. So, we devise our own macros... This is
- * really ugly, use dramamine sparingly. You have been warned.
- */
-#define W_SETMASKED(st, val, fun) \
- { \
- int sh = (int)~0; \
- int mask = fun(sh); \
- \
- for (sh = 0; ((mask >> sh) & 1) == 0; sh++) \
- continue; \
- *(st) = (*(st) & ~mask) | ((val) << sh); \
- }
-
-#define W_SETTERMSIG(st, val) W_SETMASKED(st, val, WTERMSIG)
-#define W_SETEXITSTATUS(st, val) W_SETMASKED(st, val, WEXITSTATUS)
-
-static void JobRestart(Job *);
-static int JobStart(GNode *, int, Job *);
-static void JobDoOutput(Job *, Boolean);
-static void JobInterrupt(int, int);
-static void JobRestartJobs(void);
-static int Compat_RunCommand(char *, struct GNode *);
-
-static GNode *curTarg = NULL;
-static GNode *ENDNode;
-
-/**
- * Create a fifo file with a uniq filename, and returns a file
- * descriptor to that fifo.
- */
-static int
-mkfifotemp(char *template)
-{
- char *start;
- char *pathend;
- char *ptr;
- const unsigned char padchar[] =
- "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
-
- if (template[0] == '\0') {
- errno = EINVAL; /* bad input string */
- return (-1);
- }
-
- /* Find end of template string. */
- pathend = strchr(template, '\0');
- ptr = pathend - 1;
-
- /*
- * Starting from the end of the template replace spaces with 'X' in
- * them with random characters until there are no more 'X'.
- */
- while (ptr >= template && *ptr == 'X') {
- uint32_t rand_num =
-#if __FreeBSD_version < 800041
- arc4random() % (sizeof(padchar) - 1);
-#else
- arc4random_uniform(sizeof(padchar) - 1);
-#endif
- *ptr-- = padchar[rand_num];
- }
- start = ptr + 1;
-
- /* Check the target directory. */
- for (; ptr > template; --ptr) {
- if (*ptr == '/') {
- struct stat sbuf;
-
- *ptr = '\0';
- if (stat(template, &sbuf) != 0)
- return (-1);
-
- if (!S_ISDIR(sbuf.st_mode)) {
- errno = ENOTDIR;
- return (-1);
- }
- *ptr = '/';
- break;
- }
- }
-
- for (;;) {
- if (mkfifo(template, 0600) == 0) {
- int fd;
-
- if ((fd = open(template, O_RDWR, 0600)) < 0) {
- unlink(template);
- return (-1);
- } else {
- return (fd);
- }
- } else {
- if (errno != EEXIST) {
- return (-1);
- }
- }
-
- /*
- * If we have a collision, cycle through the space of
- * filenames.
- */
- for (ptr = start;;) {
- char *pad;
-
- if (*ptr == '\0' || ptr == pathend)
- return (-1);
-
- pad = strchr(padchar, *ptr);
- if (pad == NULL || *++pad == '\0') {
- *ptr++ = padchar[0];
- } else {
- *ptr++ = *pad;
- break;
- }
- }
- }
- /*NOTREACHED*/
-}
-
-static void
-catch_child(int sig __unused)
-{
-}
-
-/**
- */
-void
-Proc_Init()
-{
- /*
- * Catch SIGCHLD so that we get kicked out of select() when we
- * need to look at a child. This is only known to matter for the
- * -j case (perhaps without -P).
- *
- * XXX this is intentionally misplaced.
- */
- struct sigaction sa;
-
- sigemptyset(&sa.sa_mask);
- sa.sa_flags = SA_RESTART | SA_NOCLDSTOP;
- sa.sa_handler = catch_child;
- sigaction(SIGCHLD, &sa, NULL);
-}
-
-/**
- * Wait for child process to terminate.
- */
-static int
-ProcWait(ProcStuff *ps)
-{
- pid_t pid;
- int status;
-
- /*
- * Wait for the process to exit.
- */
- for (;;) {
- pid = wait(&status);
- if (pid == -1 && errno != EINTR) {
- Fatal("error in wait: %d", pid);
- /* NOTREACHED */
- }
- if (pid == ps->child_pid) {
- break;
- }
- if (interrupted) {
- break;
- }
- }
-
- return (status);
-}
-
-/**
- * JobCatchSignal
- * Got a signal. Set global variables and hope that someone will
- * handle it.
- */
-static void
-JobCatchSig(int signo)
-{
-
- interrupted = signo;
-}
-
-/**
- * JobPassSig --
- * Pass a signal on to all local jobs if
- * USE_PGRP is defined, then die ourselves.
- *
- * Side Effects:
- * We die by the same signal.
- */
-static void
-JobPassSig(int signo)
-{
- Job *job;
- sigset_t nmask, omask;
- struct sigaction act;
-
- sigemptyset(&nmask);
- sigaddset(&nmask, signo);
- sigprocmask(SIG_SETMASK, &nmask, &omask);
-
- DEBUGF(JOB, ("JobPassSig(%d) called.\n", signo));
- TAILQ_FOREACH(job, &jobs, link) {
- DEBUGF(JOB, ("JobPassSig passing signal %d to child %jd.\n",
- signo, (intmax_t)job->pid));
- KILL(job->pid, signo);
- }
-
- /*
- * Deal with proper cleanup based on the signal received. We only run
- * the .INTERRUPT target if the signal was in fact an interrupt.
- * The other three termination signals are more of a "get out *now*"
- * command.
- */
- if (signo == SIGINT) {
- JobInterrupt(TRUE, signo);
- } else if (signo == SIGHUP || signo == SIGTERM || signo == SIGQUIT) {
- JobInterrupt(FALSE, signo);
- }
-
- /*
- * Leave gracefully if SIGQUIT, rather than core dumping.
- */
- if (signo == SIGQUIT) {
- signo = SIGINT;
- }
-
- /*
- * Send ourselves the signal now we've given the message to everyone
- * else. Note we block everything else possible while we're getting
- * the signal. This ensures that all our jobs get continued when we
- * wake up before we take any other signal.
- * XXX this comment seems wrong.
- */
- act.sa_handler = SIG_DFL;
- sigemptyset(&act.sa_mask);
- act.sa_flags = 0;
- sigaction(signo, &act, NULL);
-
- DEBUGF(JOB, ("JobPassSig passing signal to self, mask = %x.\n",
- ~0 & ~(1 << (signo - 1))));
- signal(signo, SIG_DFL);
-
- KILL(getpid(), signo);
-
- signo = SIGCONT;
- TAILQ_FOREACH(job, &jobs, link) {
- DEBUGF(JOB, ("JobPassSig passing signal %d to child %jd.\n",
- signo, (intmax_t)job->pid));
- KILL(job->pid, signo);
- }
-
- sigprocmask(SIG_SETMASK, &omask, NULL);
- sigprocmask(SIG_SETMASK, &omask, NULL);
- act.sa_handler = JobPassSig;
- sigaction(signo, &act, NULL);
-}
-
-/**
- * JobPrintCommand --
- * Put out another command for the given job. If the command starts
- * with an @ or a - we process it specially. In the former case,
- * so long as the -s and -n flags weren't given to make, we stick
- * a shell-specific echoOff command in the script. In the latter,
- * we ignore errors for the entire job, unless the shell has error
- * control.
- * If the command is just "..." we take all future commands for this
- * job to be commands to be executed once the entire graph has been
- * made and return non-zero to signal that the end of the commands
- * was reached. These commands are later attached to the postCommands
- * node and executed by Job_Finish when all things are done.
- * This function is called from JobStart via LST_FOREACH.
- *
- * Results:
- * Always 0, unless the command was "..."
- *
- * Side Effects:
- * If the command begins with a '-' and the shell has no error control,
- * the JOB_IGNERR flag is set in the job descriptor.
- * If the command is "..." and we're not ignoring such things,
- * tailCmds is set to the successor node of the cmd.
- * numCommands is incremented if the command is actually printed.
- */
-static int
-JobPrintCommand(char *cmd, Job *job)
-{
- Boolean noSpecials; /* true if we shouldn't worry about
- * inserting special commands into
- * the input stream. */
- Boolean shutUp = FALSE; /* true if we put a no echo command
- * into the command file */
- Boolean errOff = FALSE; /* true if we turned error checking
- * off before printing the command
- * and need to turn it back on */
- const char *cmdTemplate;/* Template to use when printing the command */
- char *cmdStart; /* Start of expanded command */
- LstNode *cmdNode; /* Node for replacing the command */
-
- noSpecials = (noExecute && !(job->node->type & OP_MAKE));
-
- if (strcmp(cmd, "...") == 0) {
- job->node->type |= OP_SAVE_CMDS;
- if ((job->flags & JOB_IGNDOTS) == 0) {
- job->tailCmds =
- Lst_Succ(Lst_Member(&job->node->commands, cmd));
- return (1);
- }
- return (0);
- }
-
-#define DBPRINTF(fmt, arg) \
- DEBUGF(JOB, (fmt, arg)); \
- fprintf(job->cmdFILE, fmt, arg); \
- fflush(job->cmdFILE);
-
- numCommands += 1;
-
- /*
- * For debugging, we replace each command with the result of expanding
- * the variables in the command.
- */
- cmdNode = Lst_Member(&job->node->commands, cmd);
-
- cmd = Buf_Peel(Var_Subst(cmd, job->node, FALSE));
- cmdStart = cmd;
-
- Lst_Replace(cmdNode, cmdStart);
-
- cmdTemplate = "%s\n";
-
- /*
- * Check for leading @', -' or +'s to control echoing, error checking,
- * and execution on -n.
- */
- while (*cmd == '@' || *cmd == '-' || *cmd == '+') {
- switch (*cmd) {
-
- case '@':
- shutUp = DEBUG(LOUD) ? FALSE : TRUE;
- break;
-
- case '-':
- errOff = TRUE;
- break;
-
- case '+':
- if (noSpecials) {
- /*
- * We're not actually exececuting anything...
- * but this one needs to be - use compat mode
- * just for it.
- */
- Compat_RunCommand(cmd, job->node);
- return (0);
- }
- break;
- }
- cmd++;
- }
-
- while (isspace((unsigned char)*cmd))
- cmd++;
-
- if (shutUp) {
- if (!(job->flags & JOB_SILENT) && !noSpecials &&
- commandShell->hasEchoCtl) {
- DBPRINTF("%s\n", commandShell->echoOff);
- } else {
- shutUp = FALSE;
- }
- }
-
- if (errOff) {
- if (!(job->flags & JOB_IGNERR) && !noSpecials) {
- if (commandShell->hasErrCtl) {
- /*
- * We don't want the error-control commands
- * showing up either, so we turn off echoing
- * while executing them. We could put another
- * field in the shell structure to tell
- * JobDoOutput to look for this string too,
- * but why make it any more complex than
- * it already is?
- */
- if (!(job->flags & JOB_SILENT) && !shutUp &&
- commandShell->hasEchoCtl) {
- DBPRINTF("%s\n", commandShell->echoOff);
- DBPRINTF("%s\n", commandShell->ignErr);
- DBPRINTF("%s\n", commandShell->echoOn);
- } else {
- DBPRINTF("%s\n", commandShell->ignErr);
- }
- } else if (commandShell->ignErr &&
- *commandShell->ignErr != '\0') {
- /*
- * The shell has no error control, so we need to
- * be weird to get it to ignore any errors from
- * the command. If echoing is turned on, we turn
- * it off and use the errCheck template to echo
- * the command. Leave echoing off so the user
- * doesn't see the weirdness we go through to
- * ignore errors. Set cmdTemplate to use the
- * weirdness instead of the simple "%s\n"
- * template.
- */
- if (!(job->flags & JOB_SILENT) && !shutUp &&
- commandShell->hasEchoCtl) {
- DBPRINTF("%s\n", commandShell->echoOff);
- DBPRINTF(commandShell->errCheck, cmd);
- shutUp = TRUE;
- }
- cmdTemplate = commandShell->ignErr;
- /*
- * The error ignoration (hee hee) is already
- * taken care of by the ignErr template, so
- * pretend error checking is still on.
- */
- errOff = FALSE;
- } else {
- errOff = FALSE;
- }
- } else {
- errOff = FALSE;
- }
- }
-
- DBPRINTF(cmdTemplate, cmd);
-
- if (errOff) {
- /*
- * If echoing is already off, there's no point in issuing the
- * echoOff command. Otherwise we issue it and pretend it was on
- * for the whole command...
- */
- if (!shutUp && !(job->flags & JOB_SILENT) &&
- commandShell->hasEchoCtl) {
- DBPRINTF("%s\n", commandShell->echoOff);
- shutUp = TRUE;
- }
- DBPRINTF("%s\n", commandShell->errCheck);
- }
- if (shutUp) {
- DBPRINTF("%s\n", commandShell->echoOn);
- }
- return (0);
-}
-
-/**
- * JobClose --
- * Called to close both input and output pipes when a job is finished.
- *
- * Side Effects:
- * The file descriptors associated with the job are closed.
- */
-static void
-JobClose(Job *job)
-{
-
- if (usePipes) {
-#if !defined(USE_KQUEUE)
- FD_CLR(job->inPipe, &outputs);
-#endif
- if (job->outPipe != job->inPipe) {
- close(job->outPipe);
- }
- JobDoOutput(job, TRUE);
- close(job->inPipe);
- } else {
- close(job->outFd);
- JobDoOutput(job, TRUE);
- }
-}
-
-/**
- * JobFinish --
- * Do final processing for the given job including updating
- * parents and starting new jobs as available/necessary. Note
- * that we pay no attention to the JOB_IGNERR flag here.
- * This is because when we're called because of a noexecute flag
- * or something, jstat.w_status is 0 and when called from
- * Job_CatchChildren, the status is zeroed if it s/b ignored.
- *
- * Side Effects:
- * Some nodes may be put on the toBeMade queue.
- * Final commands for the job are placed on postCommands.
- *
- * If we got an error and are aborting (aborting == ABORT_ERROR) and
- * the job list is now empty, we are done for the day.
- * If we recognized an error (errors !=0), we set the aborting flag
- * to ABORT_ERROR so no more jobs will be started.
- */
-static void
-JobFinish(Job *job, int *status)
-{
- Boolean done;
- LstNode *ln;
-
- if (WIFEXITED(*status)) {
- int job_status = WEXITSTATUS(*status);
-
- JobClose(job);
- /*
- * Deal with ignored errors in -B mode. We need to
- * print a message telling of the ignored error as
- * well as setting status.w_status to 0 so the next
- * command gets run. To do this, we set done to be
- * TRUE if in -B mode and the job exited non-zero.
- */
- if (job_status == 0) {
- done = FALSE;
- } else {
- if (job->flags & JOB_IGNERR) {
- done = TRUE;
- } else {
- /*
- * If it exited non-zero and either we're
- * doing things our way or we're not ignoring
- * errors, the job is finished. Similarly, if
- * the shell died because of a signal the job
- * is also finished. In these cases, finish
- * out the job's output before printing the
- * exit status...
- */
- done = TRUE;
- if (job->cmdFILE != NULL &&
- job->cmdFILE != stdout) {
- fclose(job->cmdFILE);
- }
-
- }
- }
- } else if (WIFSIGNALED(*status)) {
- if (WTERMSIG(*status) == SIGCONT) {
- /*
- * No need to close things down or anything.
- */
- done = FALSE;
- } else {
- /*
- * If it exited non-zero and either we're
- * doing things our way or we're not ignoring
- * errors, the job is finished. Similarly, if
- * the shell died because of a signal the job
- * is also finished. In these cases, finish
- * out the job's output before printing the
- * exit status...
- */
- JobClose(job);
- if (job->cmdFILE != NULL &&
- job->cmdFILE != stdout) {
- fclose(job->cmdFILE);
- }
- done = TRUE;
- }
- } else {
- /*
- * No need to close things down or anything.
- */
- done = FALSE;
- }
-
- if (WIFEXITED(*status)) {
- if (done || DEBUG(JOB)) {
- FILE *out;
-
- if (compatMake &&
- !usePipes &&
- (job->flags & JOB_IGNERR)) {
- /*
- * If output is going to a file and this job
- * is ignoring errors, arrange to have the
- * exit status sent to the output file as
- * well.
- */
- out = fdopen(job->outFd, "w");
- if (out == NULL)
- Punt("Cannot fdopen");
- } else {
- out = stdout;
- }
-
- DEBUGF(JOB, ("Process %jd exited.\n",
- (intmax_t)job->pid));
-
- if (WEXITSTATUS(*status) == 0) {
- if (DEBUG(JOB)) {
- if (usePipes && job->node != lastNode) {
- MESSAGE(out, job->node);
- lastNode = job->node;
- }
- fprintf(out,
- "*** Completed successfully\n");
- }
- } else {
- if (usePipes && job->node != lastNode) {
- MESSAGE(out, job->node);
- lastNode = job->node;
- }
- fprintf(out, "*** Error code %d%s\n",
- WEXITSTATUS(*status),
- (job->flags & JOB_IGNERR) ?
- "(ignored)" : "");
-
- if (job->flags & JOB_IGNERR) {
- *status = 0;
- }
- }
-
- fflush(out);
- }
- } else if (WIFSIGNALED(*status)) {
- if (done || DEBUG(JOB) || (WTERMSIG(*status) == SIGCONT)) {
- FILE *out;
-
- if (compatMake &&
- !usePipes &&
- (job->flags & JOB_IGNERR)) {
- /*
- * If output is going to a file and this job
- * is ignoring errors, arrange to have the
- * exit status sent to the output file as
- * well.
- */
- out = fdopen(job->outFd, "w");
- if (out == NULL)
- Punt("Cannot fdopen");
- } else {
- out = stdout;
- }
-
- if (WTERMSIG(*status) == SIGCONT) {
- /*
- * If the beastie has continued, shift the
- * Job from the stopped list to the running
- * one (or re-stop it if concurrency is
- * exceeded) and go and get another child.
- */
- if (job->flags & (JOB_RESUME | JOB_RESTART)) {
- if (usePipes && job->node != lastNode) {
- MESSAGE(out, job->node);
- lastNode = job->node;
- }
- fprintf(out, "*** Continued\n");
- }
- if (!(job->flags & JOB_CONTINUING)) {
- DEBUGF(JOB, ("Warning: process %jd was not "
- "continuing.\n", (intmax_t) job->pid));
-#ifdef notdef
- /*
- * We don't really want to restart a
- * job from scratch just because it
- * continued, especially not without
- * killing the continuing process!
- * That's why this is ifdef'ed out.
- * FD - 9/17/90
- */
- JobRestart(job);
-#endif
- }
- job->flags &= ~JOB_CONTINUING;
- TAILQ_INSERT_TAIL(&jobs, job, link);
- nJobs += 1;
- DEBUGF(JOB, ("Process %jd is continuing locally.\n",
- (intmax_t) job->pid));
- if (nJobs == maxJobs) {
- jobFull = TRUE;
- DEBUGF(JOB, ("Job queue is full.\n"));
- }
- fflush(out);
- return;
-
- } else {
- if (usePipes && job->node != lastNode) {
- MESSAGE(out, job->node);
- lastNode = job->node;
- }
- fprintf(out,
- "*** Signal %d\n", WTERMSIG(*status));
- fflush(out);
- }
- }
- } else {
- /* STOPPED */
- FILE *out;
-
- if (compatMake && !usePipes && (job->flags & JOB_IGNERR)) {
- /*
- * If output is going to a file and this job
- * is ignoring errors, arrange to have the
- * exit status sent to the output file as
- * well.
- */
- out = fdopen(job->outFd, "w");
- if (out == NULL)
- Punt("Cannot fdopen");
- } else {
- out = stdout;
- }
-
- DEBUGF(JOB, ("Process %jd stopped.\n", (intmax_t) job->pid));
- if (usePipes && job->node != lastNode) {
- MESSAGE(out, job->node);
- lastNode = job->node;
- }
- fprintf(out, "*** Stopped -- signal %d\n", WSTOPSIG(*status));
- job->flags |= JOB_RESUME;
- TAILQ_INSERT_TAIL(&stoppedJobs, job, link);
- fflush(out);
- return;
- }
-
- /*
- * Now handle the -B-mode stuff. If the beast still isn't finished,
- * try and restart the job on the next command. If JobStart says it's
- * ok, it's ok. If there's an error, this puppy is done.
- */
- if (compatMake && WIFEXITED(*status) &&
- Lst_Succ(job->node->compat_command) != NULL) {
- switch (JobStart(job->node, job->flags & JOB_IGNDOTS, job)) {
- case JOB_RUNNING:
- done = FALSE;
- break;
- case JOB_ERROR:
- done = TRUE;
- W_SETEXITSTATUS(status, 1);
- break;
- case JOB_FINISHED:
- /*
- * If we got back a JOB_FINISHED code, JobStart has
- * already called Make_Update and freed the job
- * descriptor. We set done to false here to avoid fake
- * cycles and double frees. JobStart needs to do the
- * update so we can proceed up the graph when given
- * the -n flag..
- */
- done = FALSE;
- break;
- default:
- break;
- }
- } else {
- done = TRUE;
- }
-
- if (done && aborting != ABORT_ERROR &&
- aborting != ABORT_INTERRUPT && *status == 0) {
- /*
- * As long as we aren't aborting and the job didn't return a
- * non-zero status that we shouldn't ignore, we call
- * Make_Update to update the parents. In addition, any saved
- * commands for the node are placed on the .END target.
- */
- for (ln = job->tailCmds; ln != NULL; ln = LST_NEXT(ln)) {
- Lst_AtEnd(&postCommands->commands,
- Buf_Peel(
- Var_Subst(Lst_Datum(ln), job->node, FALSE)));
- }
-
- job->node->made = MADE;
- Make_Update(job->node);
- free(job);
-
- } else if (*status != 0) {
- errors += 1;
- free(job);
- }
-
- JobRestartJobs();
-
- /*
- * Set aborting if any error.
- */
- if (errors && !keepgoing && aborting != ABORT_INTERRUPT) {
- /*
- * If we found any errors in this batch of children and the -k
- * flag wasn't given, we set the aborting flag so no more jobs
- * get started.
- */
- aborting = ABORT_ERROR;
- }
-
- if (aborting == ABORT_ERROR && Job_Empty()) {
- /*
- * If we are aborting and the job table is now empty, we finish.
- */
- Finish(errors);
- }
-}
-
-/**
- * Job_Touch
- * Touch the given target. Called by JobStart when the -t flag was
- * given. Prints messages unless told to be silent.
- *
- * Side Effects:
- * The data modification of the file is changed. In addition, if the
- * file did not exist, it is created.
- */
-void
-Job_Touch(GNode *gn, Boolean silent)
-{
- int streamID; /* ID of stream opened to do the touch */
- struct utimbuf times; /* Times for utime() call */
-
- if (gn->type & (OP_JOIN | OP_USE | OP_EXEC | OP_OPTIONAL)) {
- /*
- * .JOIN, .USE, .ZEROTIME and .OPTIONAL targets are "virtual"
- * targets and, as such, shouldn't really be created.
- */
- return;
- }
-
- if (!silent) {
- fprintf(stdout, "touch %s\n", gn->name);
- fflush(stdout);
- }
-
- if (noExecute) {
- return;
- }
-
- if (gn->type & OP_ARCHV) {
- Arch_Touch(gn);
- } else if (gn->type & OP_LIB) {
- Arch_TouchLib(gn);
- } else {
- char *file = gn->path ? gn->path : gn->name;
-
- times.actime = times.modtime = now;
- if (utime(file, &times) < 0) {
- streamID = open(file, O_RDWR | O_CREAT, 0666);
-
- if (streamID >= 0) {
- char c;
-
- /*
- * Read and write a byte to the file to change
- * the modification time, then close the file.
- */
- if (read(streamID, &c, 1) == 1) {
- lseek(streamID, (off_t)0, SEEK_SET);
- write(streamID, &c, 1);
- }
-
- close(streamID);
- } else {
- fprintf(stdout, "*** couldn't touch %s: %s",
- file, strerror(errno));
- fflush(stdout);
- }
- }
- }
-}
-
-/**
- * Job_CheckCommands
- * Make sure the given node has all the commands it needs.
- *
- * Results:
- * TRUE if the commands list is/was ok.
- *
- * Side Effects:
- * The node will have commands from the .DEFAULT rule added to it
- * if it needs them.
- */
-Boolean
-Job_CheckCommands(GNode *gn, void (*abortProc)(const char *, ...))
-{
-
- if (OP_NOP(gn->type) && Lst_IsEmpty(&gn->commands) &&
- (gn->type & OP_LIB) == 0) {
- /*
- * No commands. Look for .DEFAULT rule from which we might infer
- * commands.
- */
- if (DEFAULT != NULL && !Lst_IsEmpty(&DEFAULT->commands)) {
- /*
- * Make only looks for a .DEFAULT if the node was
- * never the target of an operator, so that's what we
- * do too. If a .DEFAULT was given, we substitute its
- * commands for gn's commands and set the IMPSRC
- * variable to be the target's name The DEFAULT node
- * acts like a transformation rule, in that gn also
- * inherits any attributes or sources attached to
- * .DEFAULT itself.
- */
- Make_HandleUse(DEFAULT, gn);
- Var_Set(IMPSRC, Var_Value(TARGET, gn), gn);
-
- } else if (Dir_MTime(gn) == 0) {
- /*
- * The node wasn't the target of an operator we have
- * no .DEFAULT rule to go on and the target doesn't
- * already exist. There's nothing more we can do for
- * this branch. If the -k flag wasn't given, we stop
- * in our tracks, otherwise we just don't update
- * this node's parents so they never get examined.
- */
- static const char msg[] =
- "make: don't know how to make";
-
- if (gn->type & OP_OPTIONAL) {
- fprintf(stdout, "%s %s(ignored)\n",
- msg, gn->name);
- fflush(stdout);
- } else if (keepgoing) {
- fprintf(stdout, "%s %s(continuing)\n",
- msg, gn->name);
- fflush(stdout);
- return (FALSE);
- } else {
-#ifndef WITHOUT_OLD_JOKE
- if (strcmp(gn->name,"love") == 0)
- (*abortProc)("Not war.");
- else
-#endif
- (*abortProc)("%s %s. Stop",
- msg, gn->name);
- return (FALSE);
- }
- }
- }
- return (TRUE);
-}
-
-/**
- * JobExec
- * Execute the shell for the given job. Called from JobStart and
- * JobRestart.
- *
- * Side Effects:
- * A shell is executed, outputs is altered and the Job structure added
- * to the job table.
- */
-static void
-JobExec(Job *job, char **argv)
-{
- ProcStuff ps;
-
- if (DEBUG(JOB)) {
- int i;
-
- DEBUGF(JOB, ("Running %s\n", job->node->name));
- DEBUGF(JOB, ("\tCommand: "));
- for (i = 0; argv[i] != NULL; i++) {
- DEBUGF(JOB, ("%s ", argv[i]));
- }
- DEBUGF(JOB, ("\n"));
- }
-
- /*
- * Some jobs produce no output and it's disconcerting to have
- * no feedback of their running (since they produce no output, the
- * banner with their name in it never appears). This is an attempt to
- * provide that feedback, even if nothing follows it.
- */
- if (lastNode != job->node && (job->flags & JOB_FIRST) &&
- !(job->flags & JOB_SILENT)) {
- MESSAGE(stdout, job->node);
- lastNode = job->node;
- }
-
- ps.in = FILENO(job->cmdFILE);
- if (usePipes) {
- /*
- * Set up the child's output to be routed through the
- * pipe we've created for it.
- */
- ps.out = job->outPipe;
- } else {
- /*
- * We're capturing output in a file, so we duplicate
- * the descriptor to the temporary file into the
- * standard output.
- */
- ps.out = job->outFd;
- }
- ps.err = STDERR_FILENO;
-
- ps.merge_errors = 1;
- ps.pgroup = 1;
- ps.searchpath = 0;
-
- ps.argv = argv;
- ps.argv_free = 0;
-
- /*
- * Fork. Warning since we are doing vfork() instead of fork(),
- * do not allocate memory in the child process!
- */
- if ((ps.child_pid = vfork()) == -1) {
- Punt("Cannot fork");
-
-
- } else if (ps.child_pid == 0) {
- /*
- * Child
- */
- if (fifoFd >= 0)
- close(fifoFd);
-
- Proc_Exec(&ps);
- /* NOTREACHED */
- }
-
- /*
- * Parent
- */
- job->pid = ps.child_pid;
-
- if (usePipes && (job->flags & JOB_FIRST)) {
- /*
- * The first time a job is run for a node, we set the
- * current position in the buffer to the beginning and
- * mark another stream to watch in the outputs mask.
- */
-#ifdef USE_KQUEUE
- struct kevent kev[2];
-#endif
- job->curPos = 0;
-
-#if defined(USE_KQUEUE)
- EV_SET(&kev[0], job->inPipe, EVFILT_READ, EV_ADD, 0, 0, job);
- EV_SET(&kev[1], job->pid, EVFILT_PROC,
- EV_ADD | EV_ONESHOT, NOTE_EXIT, 0, NULL);
- if (kevent(kqfd, kev, 2, NULL, 0, NULL) != 0) {
- /*
- * kevent() will fail if the job is already
- * finished
- */
- if (errno != EINTR && errno != EBADF && errno != ESRCH)
- Punt("kevent: %s", strerror(errno));
- }
-#else
- FD_SET(job->inPipe, &outputs);
-#endif /* USE_KQUEUE */
- }
-
- if (job->cmdFILE != NULL && job->cmdFILE != stdout) {
- fclose(job->cmdFILE);
- job->cmdFILE = NULL;
- }
-
- /*
- * Now the job is actually running, add it to the table.
- */
- nJobs += 1;
- TAILQ_INSERT_TAIL(&jobs, job, link);
- if (nJobs == maxJobs) {
- jobFull = TRUE;
- }
-}
-
-/**
- * JobMakeArgv
- * Create the argv needed to execute the shell for a given job.
- */
-static void
-JobMakeArgv(Job *job, char **argv)
-{
- int argc;
- static char args[10]; /* For merged arguments */
-
- argv[0] = commandShell->name;
- argc = 1;
-
- if ((commandShell->exit && *commandShell->exit != '-') ||
- (commandShell->echo && *commandShell->echo != '-')) {
- /*
- * At least one of the flags doesn't have a minus before it, so
- * merge them together. Have to do this because the *(&(@*#*&#$#
- * Bourne shell thinks its second argument is a file to source.
- * Grrrr. Note the ten-character limitation on the combined
- * arguments.
- */
- sprintf(args, "-%s%s", (job->flags & JOB_IGNERR) ? "" :
- commandShell->exit ? commandShell->exit : "",
- (job->flags & JOB_SILENT) ? "" :
- commandShell->echo ? commandShell->echo : "");
-
- if (args[1]) {
- argv[argc] = args;
- argc++;
- }
- } else {
- if (!(job->flags & JOB_IGNERR) && commandShell->exit) {
- argv[argc] = commandShell->exit;
- argc++;
- }
- if (!(job->flags & JOB_SILENT) && commandShell->echo) {
- argv[argc] = commandShell->echo;
- argc++;
- }
- }
- argv[argc] = NULL;
-}
-
-/**
- * JobRestart
- * Restart a job that stopped for some reason. The job must be neither
- * on the jobs nor on the stoppedJobs list.
- *
- * Side Effects:
- * jobFull will be set if the job couldn't be run.
- */
-static void
-JobRestart(Job *job)
-{
-
- if (job->flags & JOB_RESTART) {
- /*
- * Set up the control arguments to the shell. This is based on
- * the flags set earlier for this job. If the JOB_IGNERR flag
- * is clear, the 'exit' flag of the commandShell is used to
- * cause it to exit upon receiving an error. If the JOB_SILENT
- * flag is clear, the 'echo' flag of the commandShell is used
- * to get it to start echoing as soon as it starts
- * processing commands.
- */
- char *argv[4];
-
- JobMakeArgv(job, argv);
-
- DEBUGF(JOB, ("Restarting %s...", job->node->name));
- if (nJobs >= maxJobs && !(job->flags & JOB_SPECIAL)) {
- /*
- * Not allowed to run -- put it back on the hold
- * queue and mark the table full
- */
- DEBUGF(JOB, ("holding\n"));
- TAILQ_INSERT_HEAD(&stoppedJobs, job, link);
- jobFull = TRUE;
- DEBUGF(JOB, ("Job queue is full.\n"));
- return;
- } else {
- /*
- * Job may be run locally.
- */
- DEBUGF(JOB, ("running locally\n"));
- }
- JobExec(job, argv);
-
- } else {
- /*
- * The job has stopped and needs to be restarted.
- * Why it stopped, we don't know...
- */
- DEBUGF(JOB, ("Resuming %s...", job->node->name));
- if ((nJobs < maxJobs || ((job->flags & JOB_SPECIAL) &&
- maxJobs == 0)) && nJobs != maxJobs) {
- /*
- * If we haven't reached the concurrency limit already
- * (or the job must be run and maxJobs is 0), it's ok
- * to resume it.
- */
- Boolean error;
- int status;
-
- error = (KILL(job->pid, SIGCONT) != 0);
-
- if (!error) {
- /*
- * Make sure the user knows we've continued
- * the beast and actually put the thing in the
- * job table.
- */
- job->flags |= JOB_CONTINUING;
- status = 0;
- W_SETTERMSIG(&status, SIGCONT);
- JobFinish(job, &status);
-
- job->flags &= ~(JOB_RESUME|JOB_CONTINUING);
- DEBUGF(JOB, ("done\n"));
- } else {
- Error("couldn't resume %s: %s",
- job->node->name, strerror(errno));
- status = 0;
- W_SETEXITSTATUS(&status, 1);
- JobFinish(job, &status);
- }
- } else {
- /*
- * Job cannot be restarted. Mark the table as full and
- * place the job back on the list of stopped jobs.
- */
- DEBUGF(JOB, ("table full\n"));
- TAILQ_INSERT_HEAD(&stoppedJobs, job, link);
- jobFull = TRUE;
- DEBUGF(JOB, ("Job queue is full.\n"));
- }
- }
-}
-
-/**
- * JobStart
- * Start a target-creation process going for the target described
- * by the graph node gn.
- *
- * Results:
- * JOB_ERROR if there was an error in the commands, JOB_FINISHED
- * if there isn't actually anything left to do for the job and
- * JOB_RUNNING if the job has been started.
- *
- * Side Effects:
- * A new Job node is created and added to the list of running
- * jobs. PMake is forked and a child shell created.
- */
-static int
-JobStart(GNode *gn, int flags, Job *previous)
-{
- Job *job; /* new job descriptor */
- char *argv[4]; /* Argument vector to shell */
- Boolean cmdsOK; /* true if the nodes commands were all right */
- Boolean noExec; /* Set true if we decide not to run the job */
- int tfd; /* File descriptor for temp file */
- LstNode *ln;
- char tfile[sizeof(TMPPAT)];
-
- if (interrupted) {
- JobPassSig(interrupted);
- return (JOB_ERROR);
- }
- if (previous != NULL) {
- previous->flags &= ~(JOB_FIRST | JOB_IGNERR | JOB_SILENT);
- job = previous;
- } else {
- job = emalloc(sizeof(Job));
- flags |= JOB_FIRST;
- }
-
- job->node = gn;
- job->tailCmds = NULL;
-
- /*
- * Set the initial value of the flags for this job based on the global
- * ones and the node's attributes... Any flags supplied by the caller
- * are also added to the field.
- */
- job->flags = 0;
- if (Targ_Ignore(gn)) {
- job->flags |= JOB_IGNERR;
- }
- if (Targ_Silent(gn)) {
- job->flags |= JOB_SILENT;
- }
- job->flags |= flags;
-
- /*
- * Check the commands now so any attributes from .DEFAULT have a chance
- * to migrate to the node.
- */
- if (!compatMake && (job->flags & JOB_FIRST)) {
- cmdsOK = Job_CheckCommands(gn, Error);
- } else {
- cmdsOK = TRUE;
- }
-
- /*
- * If the -n flag wasn't given, we open up OUR (not the child's)
- * temporary file to stuff commands in it. The thing is rd/wr so we
- * don't need to reopen it to feed it to the shell. If the -n flag
- * *was* given, we just set the file to be stdout. Cute, huh?
- */
- if ((gn->type & OP_MAKE) || (!noExecute && !touchFlag)) {
- /*
- * We're serious here, but if the commands were bogus, we're
- * also dead...
- */
- if (!cmdsOK) {
- DieHorribly();
- }
-
- strcpy(tfile, TMPPAT);
- if ((tfd = mkstemp(tfile)) == -1)
- Punt("Cannot create temp file: %s", strerror(errno));
- job->cmdFILE = fdopen(tfd, "w+");
- eunlink(tfile);
- if (job->cmdFILE == NULL) {
- close(tfd);
- Punt("Could not open %s", tfile);
- }
- fcntl(FILENO(job->cmdFILE), F_SETFD, 1);
- /*
- * Send the commands to the command file, flush all its
- * buffers then rewind and remove the thing.
- */
- noExec = FALSE;
-
- /*
- * Used to be backwards; replace when start doing multiple
- * commands per shell.
- */
- if (compatMake) {
- /*
- * Be compatible: If this is the first time for this
- * node, verify its commands are ok and open the
- * commands list for sequential access by later
- * invocations of JobStart. Once that is done, we take
- * the next command off the list and print it to the
- * command file. If the command was an ellipsis, note
- * that there's nothing more to execute.
- */
- if (job->flags & JOB_FIRST)
- gn->compat_command = Lst_First(&gn->commands);
- else
- gn->compat_command =
- Lst_Succ(gn->compat_command);
-
- if (gn->compat_command == NULL ||
- JobPrintCommand(Lst_Datum(gn->compat_command), job))
- noExec = TRUE;
-
- if (noExec && !(job->flags & JOB_FIRST)) {
- /*
- * If we're not going to execute anything, the
- * job is done and we need to close down the
- * various file descriptors we've opened for
- * output, then call JobDoOutput to catch the
- * final characters or send the file to the
- * screen... Note that the i/o streams are only
- * open if this isn't the first job. Note also
- * that this could not be done in
- * Job_CatchChildren b/c it wasn't clear if
- * there were more commands to execute or not...
- */
- JobClose(job);
- }
- } else {
- /*
- * We can do all the commands at once. hooray for sanity
- */
- numCommands = 0;
- LST_FOREACH(ln, &gn->commands) {
- if (JobPrintCommand(Lst_Datum(ln), job))
- break;
- }
-
- /*
- * If we didn't print out any commands to the shell
- * script, there's not much point in executing the
- * shell, is there?
- */
- if (numCommands == 0) {
- noExec = TRUE;
- }
- }
-
- } else if (noExecute) {
- /*
- * Not executing anything -- just print all the commands to
- * stdout in one fell swoop. This will still set up
- * job->tailCmds correctly.
- */
- if (lastNode != gn) {
- MESSAGE(stdout, gn);
- lastNode = gn;
- }
- job->cmdFILE = stdout;
-
- /*
- * Only print the commands if they're ok, but don't die if
- * they're not -- just let the user know they're bad and keep
- * going. It doesn't do any harm in this case and may do
- * some good.
- */
- if (cmdsOK) {
- LST_FOREACH(ln, &gn->commands) {
- if (JobPrintCommand(Lst_Datum(ln), job))
- break;
- }
- }
- /*
- * Don't execute the shell, thank you.
- */
- noExec = TRUE;
-
- } else {
- /*
- * Just touch the target and note that no shell should be
- * executed. Set cmdFILE to stdout to make life easier. Check
- * the commands, too, but don't die if they're no good -- it
- * does no harm to keep working up the graph.
- */
- job->cmdFILE = stdout;
- Job_Touch(gn, job->flags & JOB_SILENT);
- noExec = TRUE;
- }
-
- /*
- * If we're not supposed to execute a shell, don't.
- */
- if (noExec) {
- /*
- * Unlink and close the command file if we opened one
- */
- if (job->cmdFILE != stdout) {
- if (job->cmdFILE != NULL)
- fclose(job->cmdFILE);
- } else {
- fflush(stdout);
- }
-
- /*
- * We only want to work our way up the graph if we aren't here
- * because the commands for the job were no good.
- */
- if (cmdsOK) {
- if (aborting == 0) {
- for (ln = job->tailCmds; ln != NULL;
- ln = LST_NEXT(ln)) {
- Lst_AtEnd(&postCommands->commands,
- Buf_Peel(Var_Subst(Lst_Datum(ln),
- job->node, FALSE)));
- }
- job->node->made = MADE;
- Make_Update(job->node);
- }
- free(job);
- return(JOB_FINISHED);
- } else {
- free(job);
- return(JOB_ERROR);
- }
- } else {
- fflush(job->cmdFILE);
- }
-
- /*
- * Set up the control arguments to the shell. This is based on the flags
- * set earlier for this job.
- */
- JobMakeArgv(job, argv);
-
- /*
- * If we're using pipes to catch output, create the pipe by which we'll
- * get the shell's output. If we're using files, print out that we're
- * starting a job and then set up its temporary-file name.
- */
- if (!compatMake || (job->flags & JOB_FIRST)) {
- if (usePipes) {
- int fd[2];
-
- if (pipe(fd) == -1)
- Punt("Cannot create pipe: %s", strerror(errno));
- job->inPipe = fd[0];
- job->outPipe = fd[1];
- fcntl(job->inPipe, F_SETFD, 1);
- fcntl(job->outPipe, F_SETFD, 1);
- } else {
- fprintf(stdout, "Remaking `%s'\n", gn->name);
- fflush(stdout);
- strcpy(job->outFile, TMPPAT);
- if ((job->outFd = mkstemp(job->outFile)) == -1)
- Punt("cannot create temp file: %s",
- strerror(errno));
- fcntl(job->outFd, F_SETFD, 1);
- }
- }
-
- if (nJobs >= maxJobs && !(job->flags & JOB_SPECIAL) && maxJobs != 0) {
- /*
- * We've hit the limit of concurrency, so put the job on hold
- * until some other job finishes. Note that the special jobs
- * (.BEGIN, .INTERRUPT and .END) may be run even when the
- * limit has been reached (e.g. when maxJobs == 0).
- */
- jobFull = TRUE;
-
- DEBUGF(JOB, ("Can only run job locally.\n"));
- job->flags |= JOB_RESTART;
- TAILQ_INSERT_TAIL(&stoppedJobs, job, link);
- } else {
- if (nJobs >= maxJobs) {
- /*
- * If we're running this job as a special case
- * (see above), at least say the table is full.
- */
- jobFull = TRUE;
- DEBUGF(JOB, ("Local job queue is full.\n"));
- }
- JobExec(job, argv);
- }
- return (JOB_RUNNING);
-}
-
-static char *
-JobOutput(Job *job, char *cp, char *endp, int msg)
-{
- char *ecp;
-
- if (commandShell->noPrint) {
- ecp = strstr(cp, commandShell->noPrint);
- while (ecp != NULL) {
- if (cp != ecp) {
- *ecp = '\0';
- if (msg && job->node != lastNode) {
- MESSAGE(stdout, job->node);
- lastNode = job->node;
- }
- /*
- * The only way there wouldn't be a newline
- * after this line is if it were the last in
- * the buffer. However, since the non-printable
- * comes after it, there must be a newline, so
- * we don't print one.
- */
- fprintf(stdout, "%s", cp);
- fflush(stdout);
- }
- cp = ecp + strlen(commandShell->noPrint);
- if (cp != endp) {
- /*
- * Still more to print, look again after
- * skipping the whitespace following the
- * non-printable command....
- */
- cp++;
- while (*cp == ' ' || *cp == '\t' ||
- *cp == '\n') {
- cp++;
- }
- ecp = strstr(cp, commandShell->noPrint);
- } else {
- return (cp);
- }
- }
- }
- return (cp);
-}
-
-/**
- * JobDoOutput
- * This function is called at different times depending on
- * whether the user has specified that output is to be collected
- * via pipes or temporary files. In the former case, we are called
- * whenever there is something to read on the pipe. We collect more
- * output from the given job and store it in the job's outBuf. If
- * this makes up a line, we print it tagged by the job's identifier,
- * as necessary.
- * If output has been collected in a temporary file, we open the
- * file and read it line by line, transfering it to our own
- * output channel until the file is empty. At which point we
- * remove the temporary file.
- * In both cases, however, we keep our figurative eye out for the
- * 'noPrint' line for the shell from which the output came. If
- * we recognize a line, we don't print it. If the command is not
- * alone on the line (the character after it is not \0 or \n), we
- * do print whatever follows it.
- *
- * Side Effects:
- * curPos may be shifted as may the contents of outBuf.
- */
-static void
-JobDoOutput(Job *job, Boolean finish)
-{
- Boolean gotNL = FALSE; /* true if got a newline */
- Boolean fbuf; /* true if our buffer filled up */
- int nr; /* number of bytes read */
- int i; /* auxiliary index into outBuf */
- int max; /* limit for i (end of current data) */
- int nRead; /* (Temporary) number of bytes read */
- FILE *oFILE; /* Stream pointer to shell's output file */
- char inLine[132];
-
- if (usePipes) {
- /*
- * Read as many bytes as will fit in the buffer.
- */
- end_loop:
- gotNL = FALSE;
- fbuf = FALSE;
-
- nRead = read(job->inPipe, &job->outBuf[job->curPos],
- JOB_BUFSIZE - job->curPos);
- /*
- * Check for interrupt here too, because the above read may
- * block when the child process is stopped. In this case the
- * interrupt will unblock it (we don't use SA_RESTART).
- */
- if (interrupted)
- JobPassSig(interrupted);
-
- if (nRead < 0) {
- DEBUGF(JOB, ("JobDoOutput(piperead)"));
- nr = 0;
- } else {
- nr = nRead;
- }
-
- /*
- * If we hit the end-of-file (the job is dead), we must flush
- * its remaining output, so pretend we read a newline if
- * there's any output remaining in the buffer.
- * Also clear the 'finish' flag so we stop looping.
- */
- if (nr == 0 && job->curPos != 0) {
- job->outBuf[job->curPos] = '\n';
- nr = 1;
- finish = FALSE;
- } else if (nr == 0) {
- finish = FALSE;
- }
-
- /*
- * Look for the last newline in the bytes we just got. If there
- * is one, break out of the loop with 'i' as its index and
- * gotNL set TRUE.
- */
- max = job->curPos + nr;
- for (i = job->curPos + nr - 1; i >= job->curPos; i--) {
- if (job->outBuf[i] == '\n') {
- gotNL = TRUE;
- break;
- } else if (job->outBuf[i] == '\0') {
- /*
- * Why?
- */
- job->outBuf[i] = ' ';
- }
- }
-
- if (!gotNL) {
- job->curPos += nr;
- if (job->curPos == JOB_BUFSIZE) {
- /*
- * If we've run out of buffer space, we have
- * no choice but to print the stuff. sigh.
- */
- fbuf = TRUE;
- i = job->curPos;
- }
- }
- if (gotNL || fbuf) {
- /*
- * Need to send the output to the screen. Null terminate
- * it first, overwriting the newline character if there
- * was one. So long as the line isn't one we should
- * filter (according to the shell description), we print
- * the line, preceded by a target banner if this target
- * isn't the same as the one for which we last printed
- * something. The rest of the data in the buffer are
- * then shifted down to the start of the buffer and
- * curPos is set accordingly.
- */
- job->outBuf[i] = '\0';
- if (i >= job->curPos) {
- char *cp;
-
- cp = JobOutput(job, job->outBuf,
- &job->outBuf[i], FALSE);
-
- /*
- * There's still more in that buffer. This time,
- * though, we know there's no newline at the
- * end, so we add one of our own free will.
- */
- if (*cp != '\0') {
- if (job->node != lastNode) {
- MESSAGE(stdout, job->node);
- lastNode = job->node;
- }
- fprintf(stdout, "%s%s", cp,
- gotNL ? "\n" : "");
- fflush(stdout);
- }
- }
- if (i < max - 1) {
- /* shift the remaining characters down */
- memcpy(job->outBuf, &job->outBuf[i + 1],
- max - (i + 1));
- job->curPos = max - (i + 1);
-
- } else {
- /*
- * We have written everything out, so we just
- * start over from the start of the buffer.
- * No copying. No nothing.
- */
- job->curPos = 0;
- }
- }
- if (finish) {
- /*
- * If the finish flag is true, we must loop until we hit
- * end-of-file on the pipe. This is guaranteed to happen
- * eventually since the other end of the pipe is now
- * closed (we closed it explicitly and the child has
- * exited). When we do get an EOF, finish will be set
- * FALSE and we'll fall through and out.
- */
- goto end_loop;
- }
-
- } else {
- /*
- * We've been called to retrieve the output of the job from the
- * temporary file where it's been squirreled away. This consists
- * of opening the file, reading the output line by line, being
- * sure not to print the noPrint line for the shell we used,
- * then close and remove the temporary file. Very simple.
- *
- * Change to read in blocks and do FindSubString type things
- * as for pipes? That would allow for "@echo -n..."
- */
- oFILE = fopen(job->outFile, "r");
- if (oFILE != NULL) {
- fprintf(stdout, "Results of making %s:\n",
- job->node->name);
- fflush(stdout);
-
- while (fgets(inLine, sizeof(inLine), oFILE) != NULL) {
- char *cp, *endp, *oendp;
-
- cp = inLine;
- oendp = endp = inLine + strlen(inLine);
- if (endp[-1] == '\n') {
- *--endp = '\0';
- }
- cp = JobOutput(job, inLine, endp, FALSE);
-
- /*
- * There's still more in that buffer. This time,
- * though, we know there's no newline at the
- * end, so we add one of our own free will.
- */
- fprintf(stdout, "%s", cp);
- fflush(stdout);
- if (endp != oendp) {
- fprintf(stdout, "\n");
- fflush(stdout);
- }
- }
- fclose(oFILE);
- eunlink(job->outFile);
- }
- }
-}
-
-/**
- * Job_CatchChildren
- * Handle the exit of a child. Called from Make_Make.
- *
- * Side Effects:
- * The job descriptor is removed from the list of children.
- *
- * Notes:
- * We do waits, blocking or not, according to the wisdom of our
- * caller, until there are no more children to report. For each
- * job, call JobFinish to finish things off. This will take care of
- * putting jobs on the stoppedJobs queue.
- */
-void
-Job_CatchChildren(Boolean block)
-{
- pid_t pid; /* pid of dead child */
- Job *job; /* job descriptor for dead child */
- int status; /* Exit/termination status */
-
- /*
- * Don't even bother if we know there's no one around.
- */
- if (nJobs == 0) {
- return;
- }
-
- for (;;) {
- pid = waitpid((pid_t)-1, &status,
- (block ? 0 : WNOHANG) | WUNTRACED);
- if (pid <= 0)
- break;
-
- DEBUGF(JOB, ("Process %jd exited or stopped.\n",
- (intmax_t)pid));
-
- TAILQ_FOREACH(job, &jobs, link) {
- if (job->pid == pid)
- break;
- }
-
- if (job == NULL) {
- if (WIFSIGNALED(status) &&
- (WTERMSIG(status) == SIGCONT)) {
- TAILQ_FOREACH(job, &jobs, link) {
- if (job->pid == pid)
- break;
- }
- if (job == NULL) {
- Error("Resumed child (%jd) "
- "not in table", (intmax_t)pid);
- continue;
- }
- TAILQ_REMOVE(&stoppedJobs, job, link);
- } else {
- Error("Child (%jd) not in table?",
- (intmax_t)pid);
- continue;
- }
- } else {
- TAILQ_REMOVE(&jobs, job, link);
- nJobs -= 1;
- if (fifoFd >= 0 && maxJobs > 1) {
- write(fifoFd, "+", 1);
- maxJobs--;
- if (nJobs >= maxJobs)
- jobFull = TRUE;
- else
- jobFull = FALSE;
- } else {
- DEBUGF(JOB, ("Job queue is no longer full.\n"));
- jobFull = FALSE;
- }
- }
-
- JobFinish(job, &status);
- }
- if (interrupted)
- JobPassSig(interrupted);
-}
-
-/**
- * Job_CatchOutput
- * Catch the output from our children, if we're using
- * pipes do so. Otherwise just block time until we get a
- * signal(most likely a SIGCHLD) since there's no point in
- * just spinning when there's nothing to do and the reaping
- * of a child can wait for a while.
- *
- * Side Effects:
- * Output is read from pipes if we're piping.
- * -----------------------------------------------------------------------
- */
-void
-#ifdef USE_KQUEUE
-Job_CatchOutput(int flag __unused)
-#else
-Job_CatchOutput(int flag)
-#endif
-{
- int nfds;
-#ifdef USE_KQUEUE
-#define KEV_SIZE 4
- struct kevent kev[KEV_SIZE];
- int i;
-#else
- struct timeval timeout;
- fd_set readfds;
- Job *job;
-#endif
-
- fflush(stdout);
-
- if (usePipes) {
-#ifdef USE_KQUEUE
- if ((nfds = kevent(kqfd, NULL, 0, kev, KEV_SIZE, NULL)) == -1) {
- if (errno != EINTR)
- Punt("kevent: %s", strerror(errno));
- if (interrupted)
- JobPassSig(interrupted);
- } else {
- for (i = 0; i < nfds; i++) {
- if (kev[i].flags & EV_ERROR) {
- warnc(kev[i].data, "kevent");
- continue;
- }
- switch (kev[i].filter) {
- case EVFILT_READ:
- JobDoOutput(kev[i].udata, FALSE);
- break;
- case EVFILT_PROC:
- /*
- * Just wake up and let
- * Job_CatchChildren() collect the
- * terminated job.
- */
- break;
- }
- }
- }
-#else
- readfds = outputs;
- timeout.tv_sec = SEL_SEC;
- timeout.tv_usec = SEL_USEC;
- if (flag && jobFull && fifoFd >= 0)
- FD_SET(fifoFd, &readfds);
-
- nfds = select(FD_SETSIZE, &readfds, (fd_set *)NULL,
- (fd_set *)NULL, &timeout);
- if (nfds <= 0) {
- if (interrupted)
- JobPassSig(interrupted);
- return;
- }
- if (fifoFd >= 0 && FD_ISSET(fifoFd, &readfds)) {
- if (--nfds <= 0)
- return;
- }
- job = TAILQ_FIRST(&jobs);
- while (nfds != 0 && job != NULL) {
- if (FD_ISSET(job->inPipe, &readfds)) {
- JobDoOutput(job, FALSE);
- nfds--;
- }
- job = TAILQ_NEXT(job, link);
- }
-#endif /* !USE_KQUEUE */
- }
-}
-
-/**
- * Job_Make
- * Start the creation of a target. Basically a front-end for
- * JobStart used by the Make module.
- *
- * Side Effects:
- * Another job is started.
- */
-void
-Job_Make(GNode *gn)
-{
-
- JobStart(gn, 0, NULL);
-}
-
-/**
- * Job_Init
- * Initialize the process module, given a maximum number of jobs.
- *
- * Side Effects:
- * lists and counters are initialized
- */
-void
-Job_Init(int maxproc)
-{
- GNode *begin; /* node for commands to do at the very start */
- const char *env;
- struct sigaction sa;
-
- fifoFd = -1;
- env = getenv("MAKE_JOBS_FIFO");
-
- if (env == NULL && maxproc > 1) {
- /*
- * We did not find the environment variable so we are the
- * leader. Create the fifo, open it, write one char per
- * allowed job into the pipe.
- */
- fifoFd = mkfifotemp(fifoName);
- if (fifoFd < 0) {
- env = NULL;
- } else {
- fifoMaster = 1;
- fcntl(fifoFd, F_SETFL, O_NONBLOCK);
- env = fifoName;
- setenv("MAKE_JOBS_FIFO", env, 1);
- while (maxproc-- > 0) {
- write(fifoFd, "+", 1);
- }
- /* The master make does not get a magic token */
- jobFull = TRUE;
- maxJobs = 0;
- }
-
- } else if (env != NULL) {
- /*
- * We had the environment variable so we are a slave.
- * Open fifo and give ourselves a magic token which represents
- * the token our parent make has grabbed to start his make
- * process. Otherwise the sub-makes would gobble up tokens and
- * the proper number of tokens to specify to -j would depend
- * on the depth of the tree and the order of execution.
- */
- fifoFd = open(env, O_RDWR, 0);
- if (fifoFd >= 0) {
- fcntl(fifoFd, F_SETFL, O_NONBLOCK);
- maxJobs = 1;
- jobFull = FALSE;
- }
- }
- if (fifoFd < 0) {
- maxJobs = maxproc;
- jobFull = FALSE;
- } else {
- }
- nJobs = 0;
-
- aborting = 0;
- errors = 0;
-
- lastNode = NULL;
-
- if ((maxJobs == 1 && fifoFd < 0) || beVerbose == 0) {
- /*
- * If only one job can run at a time, there's no need for a
- * banner, no is there?
- */
- targFmt = "";
- } else {
- targFmt = TARG_FMT;
- }
-
- /*
- * Catch the four signals that POSIX specifies if they aren't ignored.
- * JobCatchSignal will just set global variables and hope someone
- * else is going to handle the interrupt.
- */
- sa.sa_handler = JobCatchSig;
- sigemptyset(&sa.sa_mask);
- sa.sa_flags = 0;
-
- if (signal(SIGINT, SIG_IGN) != SIG_IGN) {
- sigaction(SIGINT, &sa, NULL);
- }
- if (signal(SIGHUP, SIG_IGN) != SIG_IGN) {
- sigaction(SIGHUP, &sa, NULL);
- }
- if (signal(SIGQUIT, SIG_IGN) != SIG_IGN) {
- sigaction(SIGQUIT, &sa, NULL);
- }
- if (signal(SIGTERM, SIG_IGN) != SIG_IGN) {
- sigaction(SIGTERM, &sa, NULL);
- }
- /*
- * There are additional signals that need to be caught and passed if
- * either the export system wants to be told directly of signals or if
- * we're giving each job its own process group (since then it won't get
- * signals from the terminal driver as we own the terminal)
- */
-#if defined(USE_PGRP)
- if (signal(SIGTSTP, SIG_IGN) != SIG_IGN) {
- sigaction(SIGTSTP, &sa, NULL);
- }
- if (signal(SIGTTOU, SIG_IGN) != SIG_IGN) {
- sigaction(SIGTTOU, &sa, NULL);
- }
- if (signal(SIGTTIN, SIG_IGN) != SIG_IGN) {
- sigaction(SIGTTIN, &sa, NULL);
- }
- if (signal(SIGWINCH, SIG_IGN) != SIG_IGN) {
- sigaction(SIGWINCH, &sa, NULL);
- }
-#endif
-
-#ifdef USE_KQUEUE
- if ((kqfd = kqueue()) == -1) {
- Punt("kqueue: %s", strerror(errno));
- }
-#endif
-
- begin = Targ_FindNode(".BEGIN", TARG_NOCREATE);
-
- if (begin != NULL) {
- JobStart(begin, JOB_SPECIAL, (Job *)NULL);
- while (nJobs) {
- Job_CatchOutput(0);
- Job_CatchChildren(!usePipes);
- }
- }
- postCommands = Targ_FindNode(".END", TARG_CREATE);
-}
-
-/**
- * Job_Full
- * See if the job table is full. It is considered full if it is OR
- * if we are in the process of aborting OR if we have
- * reached/exceeded our local quota. This prevents any more jobs
- * from starting up.
- *
- * Results:
- * TRUE if the job table is full, FALSE otherwise
- */
-Boolean
-Job_Full(void)
-{
- char c;
- int i;
-
- if (aborting)
- return (aborting);
- if (fifoFd >= 0 && jobFull) {
- i = read(fifoFd, &c, 1);
- if (i > 0) {
- maxJobs++;
- jobFull = FALSE;
- }
- }
- return (jobFull);
-}
-
-/**
- * Job_Empty
- * See if the job table is empty. Because the local concurrency may
- * be set to 0, it is possible for the job table to become empty,
- * while the list of stoppedJobs remains non-empty. In such a case,
- * we want to restart as many jobs as we can.
- *
- * Results:
- * TRUE if it is. FALSE if it ain't.
- */
-Boolean
-Job_Empty(void)
-{
- if (nJobs == 0) {
- if (!TAILQ_EMPTY(&stoppedJobs) && !aborting) {
- /*
- * The job table is obviously not full if it has no
- * jobs in it...Try and restart the stopped jobs.
- */
- jobFull = FALSE;
- JobRestartJobs();
- return (FALSE);
- } else {
- return (TRUE);
- }
- } else {
- return (FALSE);
- }
-}
-
-/**
- * JobInterrupt
- * Handle the receipt of an interrupt.
- *
- * Side Effects:
- * All children are killed. Another job will be started if the
- * .INTERRUPT target was given.
- */
-static void
-JobInterrupt(int runINTERRUPT, int signo)
-{
- Job *job; /* job descriptor in that element */
- GNode *interrupt; /* the node describing the .INTERRUPT target */
-
- aborting = ABORT_INTERRUPT;
-
- TAILQ_FOREACH(job, &jobs, link) {
- if (!Targ_Precious(job->node)) {
- char *file = (job->node->path == NULL ?
- job->node->name : job->node->path);
-
- if (!noExecute && eunlink(file) != -1) {
- Error("*** %s removed", file);
- }
- }
- if (job->pid) {
- DEBUGF(JOB, ("JobInterrupt passing signal to child "
- "%jd.\n", (intmax_t)job->pid));
- KILL(job->pid, signo);
- }
- }
-
- if (runINTERRUPT && !touchFlag) {
- /*
- * clear the interrupted flag because we would get an
- * infinite loop otherwise.
- */
- interrupted = 0;
-
- interrupt = Targ_FindNode(".INTERRUPT", TARG_NOCREATE);
- if (interrupt != NULL) {
- ignoreErrors = FALSE;
-
- JobStart(interrupt, JOB_IGNDOTS, (Job *)NULL);
- while (nJobs) {
- Job_CatchOutput(0);
- Job_CatchChildren(!usePipes);
- }
- }
- }
- if (fifoMaster)
- unlink(fifoName);
-}
-
-/**
- * Job_Finish
- * Do final processing such as the running of the commands
- * attached to the .END target.
- *
- * Results:
- * Number of errors reported.
- */
-int
-Job_Finish(void)
-{
-
- if (postCommands != NULL && !Lst_IsEmpty(&postCommands->commands)) {
- if (errors) {
- Error("Errors reported so .END ignored");
- } else {
- JobStart(postCommands, JOB_SPECIAL | JOB_IGNDOTS, NULL);
-
- while (nJobs) {
- Job_CatchOutput(0);
- Job_CatchChildren(!usePipes);
- }
- }
- }
- if (fifoFd >= 0) {
- close(fifoFd);
- fifoFd = -1;
- if (fifoMaster)
- unlink(fifoName);
- }
- return (errors);
-}
-
-/**
- * Job_Wait
- * Waits for all running jobs to finish and returns. Sets 'aborting'
- * to ABORT_WAIT to prevent other jobs from starting.
- *
- * Side Effects:
- * Currently running jobs finish.
- */
-void
-Job_Wait(void)
-{
-
- aborting = ABORT_WAIT;
- while (nJobs != 0) {
- Job_CatchOutput(0);
- Job_CatchChildren(!usePipes);
- }
- aborting = 0;
-}
-
-/**
- * Job_AbortAll
- * Abort all currently running jobs without handling output or anything.
- * This function is to be called only in the event of a major
- * error. Most definitely NOT to be called from JobInterrupt.
- *
- * Side Effects:
- * All children are killed, not just the firstborn
- */
-void
-Job_AbortAll(void)
-{
- Job *job; /* the job descriptor in that element */
- int foo;
-
- aborting = ABORT_ERROR;
-
- if (nJobs) {
- TAILQ_FOREACH(job, &jobs, link) {
- /*
- * kill the child process with increasingly drastic
- * signals to make darn sure it's dead.
- */
- KILL(job->pid, SIGINT);
- KILL(job->pid, SIGKILL);
- }
- }
-
- /*
- * Catch as many children as want to report in at first, then give up
- */
- while (waitpid((pid_t)-1, &foo, WNOHANG) > 0)
- ;
-}
-
-/**
- * JobRestartJobs
- * Tries to restart stopped jobs if there are slots available.
- * Note that this tries to restart them regardless of pending errors.
- * It's not good to leave stopped jobs lying around!
- *
- * Side Effects:
- * Resumes(and possibly migrates) jobs.
- */
-static void
-JobRestartJobs(void)
-{
- Job *job;
-
- while (!jobFull && (job = TAILQ_FIRST(&stoppedJobs)) != NULL) {
- DEBUGF(JOB, ("Job queue is not full. "
- "Restarting a stopped job.\n"));
- TAILQ_REMOVE(&stoppedJobs, job, link);
- JobRestart(job);
- }
-}
-
-/**
- * Cmd_Exec
- * Execute the command in cmd, and return the output of that command
- * in a string.
- *
- * Results:
- * A string containing the output of the command, or the empty string
- * If error is not NULL, it contains the reason for the command failure
- * Any output sent to stderr in the child process is passed to stderr,
- * and not captured in the string.
- *
- * Side Effects:
- * The string must be freed by the caller.
- */
-Buffer *
-Cmd_Exec(const char *cmd, const char **error)
-{
- int fds[2]; /* Pipe streams */
- int status; /* command exit status */
- Buffer *buf; /* buffer to store the result */
- ssize_t rcnt;
- ProcStuff ps;
-
- *error = NULL;
- buf = Buf_Init(0);
-
- /*
- * Open a pipe for fetching its output
- */
- if (pipe(fds) == -1) {
- *error = "Couldn't create pipe for \"%s\"";
- return (buf);
- }
-
- /* Set close-on-exec on read side of pipe. */
- fcntl(fds[0], F_SETFD, fcntl(fds[0], F_GETFD) | FD_CLOEXEC);
-
- ps.in = STDIN_FILENO;
- ps.out = fds[1];
- ps.err = STDERR_FILENO;
-
- ps.merge_errors = 0;
- ps.pgroup = 0;
- ps.searchpath = 0;
-
- /* Set up arguments for shell */
- ps.argv = emalloc(4 * sizeof(char *));
- ps.argv[0] = strdup(commandShell->name);
- ps.argv[1] = strdup("-c");
- ps.argv[2] = strdup(cmd);
- ps.argv[3] = NULL;
- ps.argv_free = 1;
-
- /*
- * Fork. Warning since we are doing vfork() instead of fork(),
- * do not allocate memory in the child process!
- */
- if ((ps.child_pid = vfork()) == -1) {
- *error = "Couldn't exec \"%s\"";
- return (buf);
-
- } else if (ps.child_pid == 0) {
- /*
- * Child
- */
- Proc_Exec(&ps);
- /* NOTREACHED */
- }
-
- free(ps.argv[2]);
- free(ps.argv[1]);
- free(ps.argv[0]);
- free(ps.argv);
-
- close(fds[1]); /* No need for the writing half of the pipe. */
-
- do {
- char result[BUFSIZ];
-
- rcnt = read(fds[0], result, sizeof(result));
- if (rcnt != -1)
- Buf_AddBytes(buf, (size_t)rcnt, (Byte *)result);
- } while (rcnt > 0 || (rcnt == -1 && errno == EINTR));
-
- if (rcnt == -1)
- *error = "Error reading shell's output for \"%s\"";
-
- /*
- * Close the input side of the pipe.
- */
- close(fds[0]);
-
- status = ProcWait(&ps);
-
- if (status)
- *error = "\"%s\" returned non-zero status";
-
- Buf_StripNewlines(buf);
-
- return (buf);
-}
-
-
-/*
- * Interrupt handler - set flag and defer handling to the main code
- */
-static void
-CompatCatchSig(int signo)
-{
-
- interrupted = signo;
-}
-
-/*-
- *-----------------------------------------------------------------------
- * CompatInterrupt --
- * Interrupt the creation of the current target and remove it if
- * it ain't precious.
- *
- * Results:
- * None.
- *
- * Side Effects:
- * The target is removed and the process exits. If .INTERRUPT exists,
- * its commands are run first WITH INTERRUPTS IGNORED..
- *
- *-----------------------------------------------------------------------
- */
-static void
-CompatInterrupt(int signo)
-{
- GNode *gn;
- sigset_t nmask, omask;
- LstNode *ln;
-
- sigemptyset(&nmask);
- sigaddset(&nmask, SIGINT);
- sigaddset(&nmask, SIGTERM);
- sigaddset(&nmask, SIGHUP);
- sigaddset(&nmask, SIGQUIT);
- sigprocmask(SIG_SETMASK, &nmask, &omask);
-
- /* prevent recursion in evaluation of .INTERRUPT */
- interrupted = 0;
-
- if (curTarg != NULL && !Targ_Precious(curTarg)) {
- const char *file = Var_Value(TARGET, curTarg);
-
- if (!noExecute && eunlink(file) != -1) {
- printf("*** %s removed\n", file);
- }
- }
-
- /*
- * Run .INTERRUPT only if hit with interrupt signal
- */
- if (signo == SIGINT) {
- gn = Targ_FindNode(".INTERRUPT", TARG_NOCREATE);
- if (gn != NULL) {
- LST_FOREACH(ln, &gn->commands) {
- if (Compat_RunCommand(Lst_Datum(ln), gn))
- break;
- }
- }
- }
-
- sigprocmask(SIG_SETMASK, &omask, NULL);
-
- if (signo == SIGQUIT)
- exit(signo);
- signal(signo, SIG_DFL);
- kill(getpid(), signo);
-}
-
-/**
- * shellneed
- *
- * Results:
- * Returns NULL if a specified line must be executed by the shell,
- * and an argument vector if it can be run via execvp().
- *
- * Side Effects:
- * Uses brk_string so destroys the contents of argv.
- */
-static char **
-shellneed(ArgArray *aa, char *cmd)
-{
- char **p;
- int ret;
-
- if (commandShell->meta == NULL || commandShell->builtins.argc <= 1)
- /* use shell */
- return (NULL);
-
- if (strpbrk(cmd, commandShell->meta) != NULL)
- return (NULL);
-
- /*
- * Break the command into words to form an argument
- * vector we can execute.
- */
- brk_string(aa, cmd, TRUE);
- for (p = commandShell->builtins.argv + 1; *p != 0; p++) {
- if ((ret = strcmp(aa->argv[1], *p)) == 0) {
- /* found - use shell */
- ArgArray_Done(aa);
- return (NULL);
- }
- if (ret < 0) {
- /* not found */
- break;
- }
- }
- return (aa->argv + 1);
-}
-
-/**
- * Execute the next command for a target. If the command returns an
- * error, the node's made field is set to ERROR and creation stops.
- * The node from which the command came is also given. This is used
- * to execute the commands in compat mode and when executing commands
- * with the '+' flag in non-compat mode. In these modes each command
- * line should be executed by its own shell. We do some optimisation here:
- * if the shell description defines both a string of meta characters and
- * a list of builtins and the command line neither contains a meta character
- * nor starts with one of the builtins then we execute the command directly
- * without invoking a shell.
- *
- * Results:
- * 0 if the command succeeded, 1 if an error occurred.
- *
- * Side Effects:
- * The node's 'made' field may be set to ERROR.
- */
-static int
-Compat_RunCommand(char *cmd, GNode *gn)
-{
- ArgArray aa;
- char *cmdStart; /* Start of expanded command */
- Boolean silent; /* Don't print command */
- Boolean doit; /* Execute even in -n */
- Boolean errCheck; /* Check errors */
- int reason; /* Reason for child's death */
- int status; /* Description of child's death */
- LstNode *cmdNode; /* Node where current cmd is located */
- char **av; /* Argument vector for thing to exec */
- ProcStuff ps;
-
- silent = gn->type & OP_SILENT;
- errCheck = !(gn->type & OP_IGNORE);
- doit = FALSE;
-
- cmdNode = Lst_Member(&gn->commands, cmd);
- cmdStart = Buf_Peel(Var_Subst(cmd, gn, FALSE));
-
- /*
- * brk_string will return an argv with a NULL in av[0], thus causing
- * execvp() to choke and die horribly. Besides, how can we execute a
- * null command? In any case, we warn the user that the command
- * expanded to nothing (is this the right thing to do?).
- */
- if (*cmdStart == '\0') {
- free(cmdStart);
- Error("%s expands to empty string", cmd);
- return (0);
- } else {
- cmd = cmdStart;
- }
- Lst_Replace(cmdNode, cmdStart);
-
- if ((gn->type & OP_SAVE_CMDS) && (gn != ENDNode)) {
- Lst_AtEnd(&ENDNode->commands, cmdStart);
- return (0);
- } else if (strcmp(cmdStart, "...") == 0) {
- gn->type |= OP_SAVE_CMDS;
- return (0);
- }
-
- while (*cmd == '@' || *cmd == '-' || *cmd == '+') {
- switch (*cmd) {
-
- case '@':
- silent = DEBUG(LOUD) ? FALSE : TRUE;
- break;
-
- case '-':
- errCheck = FALSE;
- break;
-
- case '+':
- doit = TRUE;
- break;
- }
- cmd++;
- }
-
- while (isspace((unsigned char)*cmd))
- cmd++;
-
- /*
- * Print the command before echoing if we're not supposed to be quiet
- * for this one. We also print the command if -n given, but not if '+'.
- */
- if (!silent || (noExecute && !doit)) {
- printf("%s\n", cmd);
- fflush(stdout);
- }
-
- /*
- * If we're not supposed to execute any commands, this is as far as
- * we go...
- */
- if (!doit && noExecute) {
- return (0);
- }
-
- ps.in = STDIN_FILENO;
- ps.out = STDOUT_FILENO;
- ps.err = STDERR_FILENO;
-
- ps.merge_errors = 0;
- ps.pgroup = 0;
- ps.searchpath = 1;
-
- if ((av = shellneed(&aa, cmd)) == NULL) {
- /*
- * Shell meta character or shell builtin found - pass
- * command to shell. We give the shell the -e flag as
- * well as -c if it is supposed to exit when it hits an error.
- */
- ps.argv = emalloc(4 * sizeof(char *));
- ps.argv[0] = strdup(commandShell->path);
- ps.argv[1] = strdup(errCheck ? "-ec" : "-c");
- ps.argv[2] = strdup(cmd);
- ps.argv[3] = NULL;
- ps.argv_free = 1;
- } else {
- ps.argv = av;
- ps.argv_free = 0;
- }
- ps.errCheck = errCheck;
-
- /*
- * Warning since we are doing vfork() instead of fork(),
- * do not allocate memory in the child process!
- */
- if ((ps.child_pid = vfork()) == -1) {
- Fatal("Could not fork");
-
- } else if (ps.child_pid == 0) {
- /*
- * Child
- */
- Proc_Exec(&ps);
- /* NOTREACHED */
-
- } else {
- if (ps.argv_free) {
- free(ps.argv[2]);
- free(ps.argv[1]);
- free(ps.argv[0]);
- free(ps.argv);
- } else {
- ArgArray_Done(&aa);
- }
-
- /*
- * we need to print out the command associated with this
- * Gnode in Targ_PrintCmd from Targ_PrintGraph when debugging
- * at level g2, in main(), Fatal() and DieHorribly(),
- * therefore do not free it when debugging.
- */
- if (!DEBUG(GRAPH2)) {
- free(cmdStart);
- }
-
- /*
- * The child is off and running. Now all we can do is wait...
- */
- reason = ProcWait(&ps);
-
- if (interrupted)
- CompatInterrupt(interrupted);
-
- /*
- * Decode and report the reason child exited, then
- * indicate how we handled it.
- */
- if (WIFEXITED(reason)) {
- status = WEXITSTATUS(reason);
- if (status == 0) {
- return (0);
- } else {
- printf("*** Error code %d", status);
- }
- } else if (WIFSTOPPED(reason)) {
- status = WSTOPSIG(reason);
- } else {
- status = WTERMSIG(reason);
- printf("*** Signal %d", status);
- }
-
- if (ps.errCheck) {
- gn->made = ERROR;
- if (keepgoing) {
- /*
- * Abort the current
- * target, but let
- * others continue.
- */
- printf(" (continuing)\n");
- }
- return (status);
- } else {
- /*
- * Continue executing
- * commands for this target.
- * If we return 0, this will
- * happen...
- */
- printf(" (ignored)\n");
- return (0);
- }
- }
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Compat_Make --
- * Make a target, given the parent, to abort if necessary.
- *
- * Side Effects:
- * If an error is detected and not being ignored, the process exits.
- *
- *-----------------------------------------------------------------------
- */
-int
-Compat_Make(GNode *gn, GNode *pgn)
-{
- LstNode *ln;
-
- if (gn->type & OP_USE) {
- Make_HandleUse(gn, pgn);
-
- } else if (gn->made == UNMADE) {
- /*
- * First mark ourselves to be made, then apply whatever
- * transformations the suffix module thinks are necessary.
- * Once that's done, we can descend and make all our children.
- * If any of them has an error but the -k flag was given, our
- * 'make' field will be set FALSE again. This is our signal to
- * not attempt to do anything but abort our parent as well.
- */
- gn->make = TRUE;
- gn->made = BEINGMADE;
- Suff_FindDeps(gn);
- LST_FOREACH(ln, &gn->children)
- Compat_Make(Lst_Datum(ln), gn);
- if (!gn->make) {
- gn->made = ABORTED;
- pgn->make = FALSE;
- return (0);
- }
-
- if (Lst_Member(&gn->iParents, pgn) != NULL) {
- Var_Set(IMPSRC, Var_Value(TARGET, gn), pgn);
- }
-
- /*
- * All the children were made ok. Now cmtime contains the
- * modification time of the newest child, we need to find out
- * if we exist and when we were modified last. The criteria for
- * datedness are defined by the Make_OODate function.
- */
- DEBUGF(MAKE, ("Examining %s...", gn->name));
- if (!Make_OODate(gn)) {
- gn->made = UPTODATE;
- DEBUGF(MAKE, ("up-to-date.\n"));
- return (0);
- } else {
- DEBUGF(MAKE, ("out-of-date.\n"));
- }
-
- /*
- * If the user is just seeing if something is out-of-date,
- * exit now to tell him/her "yes".
- */
- if (queryFlag) {
- exit(1);
- }
-
- /*
- * We need to be re-made. We also have to make sure we've got
- * a $? variable. To be nice, we also define the $> variable
- * using Make_DoAllVar().
- */
- Make_DoAllVar(gn);
-
- /*
- * Alter our type to tell if errors should be ignored or things
- * should not be printed so Compat_RunCommand knows what to do.
- */
- if (Targ_Ignore(gn)) {
- gn->type |= OP_IGNORE;
- }
- if (Targ_Silent(gn)) {
- gn->type |= OP_SILENT;
- }
-
- if (Job_CheckCommands(gn, Fatal)) {
- /*
- * Our commands are ok, but we still have to worry
- * about the -t flag...
- */
- if (!touchFlag) {
- curTarg = gn;
- LST_FOREACH(ln, &gn->commands) {
- if (Compat_RunCommand(Lst_Datum(ln),
- gn))
- break;
- }
- curTarg = NULL;
- } else {
- Job_Touch(gn, gn->type & OP_SILENT);
- }
- } else {
- gn->made = ERROR;
- }
-
- if (gn->made != ERROR) {
- /*
- * If the node was made successfully, mark it so, update
- * its modification time and timestamp all its parents.
- * Note that for .ZEROTIME targets, the timestamping
- * isn't done. This is to keep its state from affecting
- * that of its parent.
- */
- gn->made = MADE;
-#ifndef RECHECK
- /*
- * We can't re-stat the thing, but we can at least take
- * care of rules where a target depends on a source that
- * actually creates the target, but only if it has
- * changed, e.g.
- *
- * parse.h : parse.o
- *
- * parse.o : parse.y
- * yacc -d parse.y
- * cc -c y.tab.c
- * mv y.tab.o parse.o
- * cmp -s y.tab.h parse.h || mv y.tab.h parse.h
- *
- * In this case, if the definitions produced by yacc
- * haven't changed from before, parse.h won't have been
- * updated and gn->mtime will reflect the current
- * modification time for parse.h. This is something of a
- * kludge, I admit, but it's a useful one..
- *
- * XXX: People like to use a rule like
- *
- * FRC:
- *
- * To force things that depend on FRC to be made, so we
- * have to check for gn->children being empty as well...
- */
- if (!Lst_IsEmpty(&gn->commands) ||
- Lst_IsEmpty(&gn->children)) {
- gn->mtime = now;
- }
-#else
- /*
- * This is what Make does and it's actually a good
- * thing, as it allows rules like
- *
- * cmp -s y.tab.h parse.h || cp y.tab.h parse.h
- *
- * to function as intended. Unfortunately, thanks to
- * the stateless nature of NFS (and the speed of this
- * program), there are times when the modification time
- * of a file created on a remote machine will not be
- * modified before the stat() implied by the Dir_MTime
- * occurs, thus leading us to believe that the file
- * is unchanged, wreaking havoc with files that depend
- * on this one.
- *
- * I have decided it is better to make too much than to
- * make too little, so this stuff is commented out
- * unless you're sure it's ok.
- * -- ardeb 1/12/88
- */
- if (noExecute || Dir_MTime(gn) == 0) {
- gn->mtime = now;
- }
- if (gn->cmtime > gn->mtime)
- gn->mtime = gn->cmtime;
- DEBUGF(MAKE, ("update time: %s\n",
- Targ_FmtTime(gn->mtime)));
-#endif
- if (!(gn->type & OP_EXEC)) {
- pgn->childMade = TRUE;
- Make_TimeStamp(pgn, gn);
- }
-
- } else if (keepgoing) {
- pgn->make = FALSE;
-
- } else {
- printf("\n\nStop in %s.\n", Var_Value(".CURDIR", gn));
- exit(1);
- }
- } else if (gn->made == ERROR) {
- /*
- * Already had an error when making this beastie. Tell the
- * parent to abort.
- */
- pgn->make = FALSE;
- } else {
- if (Lst_Member(&gn->iParents, pgn) != NULL) {
- Var_Set(IMPSRC, Var_Value(TARGET, gn), pgn);
- }
- switch(gn->made) {
- case BEINGMADE:
- Error("Graph cycles through %s\n", gn->name);
- gn->made = ERROR;
- pgn->make = FALSE;
- break;
- case MADE:
- if ((gn->type & OP_EXEC) == 0) {
- pgn->childMade = TRUE;
- Make_TimeStamp(pgn, gn);
- }
- break;
- case UPTODATE:
- if ((gn->type & OP_EXEC) == 0) {
- Make_TimeStamp(pgn, gn);
- }
- break;
- default:
- break;
- }
- }
-
- return (0);
-}
-
-/*-
- * Install signal handlers for Compat_Run
- */
-void
-Compat_InstallSignalHandlers(void)
-{
-
- if (signal(SIGINT, SIG_IGN) != SIG_IGN) {
- signal(SIGINT, CompatCatchSig);
- }
- if (signal(SIGTERM, SIG_IGN) != SIG_IGN) {
- signal(SIGTERM, CompatCatchSig);
- }
- if (signal(SIGHUP, SIG_IGN) != SIG_IGN) {
- signal(SIGHUP, CompatCatchSig);
- }
- if (signal(SIGQUIT, SIG_IGN) != SIG_IGN) {
- signal(SIGQUIT, CompatCatchSig);
- }
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Compat_Run --
- * Start making again, given a list of target nodes.
- *
- * Results:
- * None.
- *
- * Side Effects:
- * Guess what?
- *
- *-----------------------------------------------------------------------
- */
-void
-Compat_Run(Lst *targs)
-{
- GNode *gn = NULL; /* Current root target */
- int error_cnt; /* Number of targets not remade due to errors */
- LstNode *ln;
-
- Compat_InstallSignalHandlers();
- ENDNode = Targ_FindNode(".END", TARG_CREATE);
- /*
- * If the user has defined a .BEGIN target, execute the commands
- * attached to it.
- */
- if (!queryFlag) {
- gn = Targ_FindNode(".BEGIN", TARG_NOCREATE);
- if (gn != NULL) {
- LST_FOREACH(ln, &gn->commands) {
- if (Compat_RunCommand(Lst_Datum(ln), gn))
- break;
- }
- if (gn->made == ERROR) {
- printf("\n\nStop.\n");
- exit(1);
- }
- }
- }
-
- /*
- * For each entry in the list of targets to create, call Compat_Make on
- * it to create the thing. Compat_Make will leave the 'made' field of gn
- * in one of several states:
- * UPTODATE gn was already up-to-date
- * MADE gn was recreated successfully
- * ERROR An error occurred while gn was being created
- * ABORTED gn was not remade because one of its inferiors
- * could not be made due to errors.
- */
- error_cnt = 0;
- while (!Lst_IsEmpty(targs)) {
- gn = Lst_DeQueue(targs);
- Compat_Make(gn, gn);
-
- if (gn->made == UPTODATE) {
- printf("`%s' is up to date.\n", gn->name);
- } else if (gn->made == ABORTED) {
- printf("`%s' not remade because of errors.\n",
- gn->name);
- error_cnt += 1;
- }
- }
-
- /*
- * If the user has defined a .END target, run its commands.
- */
- if (error_cnt == 0) {
- LST_FOREACH(ln, &ENDNode->commands) {
- if (Compat_RunCommand(Lst_Datum(ln), ENDNode))
- break;
- }
- }
-}
-
diff --git a/usr.bin/make/job.h b/usr.bin/make/job.h
deleted file mode 100644
index a4c6620..0000000
--- a/usr.bin/make/job.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1988, 1989 by Adam de Boor
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)job.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#ifndef job_h_4678dfd1
-#define job_h_4678dfd1
-
-/*-
- * job.h --
- * Definitions pertaining to the running of jobs in parallel mode.
- */
-
-#include <stdio.h>
-
-#include "util.h"
-
-struct Buffer;
-struct GNode;
-struct Lst;
-
-void Job_Touch(struct GNode *, Boolean);
-Boolean Job_CheckCommands(struct GNode *, void (*abortProc)(const char *, ...));
-void Job_CatchChildren(Boolean);
-void Job_CatchOutput(int flag);
-void Job_Make(struct GNode *);
-void Job_Init(int);
-Boolean Job_Full(void);
-Boolean Job_Empty(void);
-int Job_Finish(void);
-void Job_Wait(void);
-void Job_AbortAll(void);
-
-void Proc_Init(void);
-
-struct Buffer *Cmd_Exec(const char *, const char **);
-
-int Compat_Make(struct GNode *gn, struct GNode *pgn);
-void Compat_InstallSignalHandlers(void);
-void Compat_Run(struct Lst *);
-
-#endif /* job_h_4678dfd1 */
diff --git a/usr.bin/make/lst.c b/usr.bin/make/lst.c
deleted file mode 100644
index a5b7f06..0000000
--- a/usr.bin/make/lst.c
+++ /dev/null
@@ -1,345 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/*-
- * lst.c --
- * Routines to maintain a linked list of objects.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "lst.h"
-#include "make.h"
-#include "util.h"
-
-/**
- * Lst_Append
- * Create a new node and add it to the given list after the given node.
- *
- * Arguments:
- * l affected list
- * ln node after which to append the datum
- * d said datum
- *
- * Side Effects:
- * A new LstNode is created and linked in to the List. The lastPtr
- * field of the List will be altered if ln is the last node in the
- * list. lastPtr and firstPtr will alter if the list was empty and
- * ln was NULL.
- */
-void
-Lst_Append(Lst *list, LstNode *ln, void *d)
-{
- LstNode *nLNode;
-
- nLNode = emalloc(sizeof(*nLNode));
- nLNode->datum = d;
-
- if (ln == NULL) {
- nLNode->nextPtr = nLNode->prevPtr = NULL;
- list->firstPtr = list->lastPtr = nLNode;
- } else {
- nLNode->prevPtr = ln;
- nLNode->nextPtr = ln->nextPtr;
-
- ln->nextPtr = nLNode;
- if (nLNode->nextPtr != NULL) {
- nLNode->nextPtr->prevPtr = nLNode;
- }
-
- if (ln == list->lastPtr) {
- list->lastPtr = nLNode;
- }
- }
-}
-
-/**
- * Lst_Concat
- * Concatenate two lists. New elements are created to hold the data
- * elements, if specified, but the elements themselves are not copied.
- * If the elements should be duplicated to avoid confusion with another
- * list, the Lst_Duplicate function should be called first.
- *
- * Arguments:
- * list1 The list to which list2 is to be appended
- * list2 The list to append to list1
- * flags LST_CONCNEW if LstNode's should be duplicated
- * LST_CONCLINK if should just be relinked
- *
- * Side Effects:
- * New elements are created and appended the the first list.
- */
-void
-Lst_Concat(Lst *list1, Lst *list2, int flags)
-{
- LstNode *ln; /* original LstNode */
- LstNode *nln; /* new LstNode */
- LstNode *last; /* the last element in the list. Keeps
- * bookkeeping until the end */
-
- if (list2->firstPtr == NULL)
- return;
-
- if (flags == LST_CONCLINK) {
- /*
- * Link the first element of the second list to the last
- * element of the first list. If the first list isn't empty,
- * we then link the last element of the list to the first
- * element of the second list. The last element of the second
- * list, if it exists, then becomes the last element of the
- * first list.
- */
- list2->firstPtr->prevPtr = list1->lastPtr;
- if (list1->lastPtr != NULL)
- list1->lastPtr->nextPtr = list2->firstPtr;
- else
- list1->firstPtr = list2->firstPtr;
- list1->lastPtr = list2->lastPtr;
-
- Lst_Init(list2);
- } else {
- /*
- * The loop simply goes through the entire second list creating
- * new LstNodes and filling in the nextPtr, and prevPtr to fit
- * into list1 and its datum field from the datum field of the
- * corresponding element in list2. The 'last' node follows the
- * last of the new nodes along until the entire list2 has been
- * appended. Only then does the bookkeeping catch up with the
- * changes. During the first iteration of the loop, if 'last'
- * is NULL, the first list must have been empty so the
- * newly-created node is made the first node of the list.
- */
- for (last = list1->lastPtr, ln = list2->firstPtr;
- ln != NULL;
- ln = ln->nextPtr) {
- nln = emalloc(sizeof(*nln));
- nln->datum = ln->datum;
- if (last != NULL) {
- last->nextPtr = nln;
- } else {
- list1->firstPtr = nln;
- }
- nln->prevPtr = last;
- last = nln;
- }
-
- /*
- * Finish bookkeeping. The last new element becomes the last
- * element of list one.
- */
- list1->lastPtr = last;
- last->nextPtr = NULL;
- }
-}
-
-/**
- * Lst_DeQueue
- * Remove and return the datum at the head of the given list.
- *
- * Results:
- * The datum in the node at the head or (ick) NULL if the list
- * is empty.
- *
- * Side Effects:
- * The head node is removed from the list.
- */
-void *
-Lst_DeQueue(Lst *l)
-{
- void *rd;
- LstNode *tln;
-
- tln = Lst_First(l);
- if (tln == NULL) {
- return (NULL);
- }
-
- rd = tln->datum;
- Lst_Remove(l, tln);
- return (rd);
-}
-
-/**
- * Lst_Destroy
- * Destroy a list and free all its resources. If the freeProc is
- * given, it is called with the datum from each node in turn before
- * the node is freed.
- *
- * Side Effects:
- * The given list is freed in its entirety.
- */
-void
-Lst_Destroy(Lst *list, FreeProc *freeProc)
-{
- LstNode *ln;
-
- if (list->firstPtr == NULL)
- return;
-
- if (freeProc != NOFREE) {
- while ((ln = list->firstPtr) != NULL) {
- list->firstPtr = ln->nextPtr;
- (*freeProc)(ln->datum);
- free(ln);
- }
- } else {
- while ((ln = list->firstPtr) != NULL) {
- list->firstPtr = ln->nextPtr;
- free(ln);
- }
- }
- list->lastPtr = NULL;
-}
-
-/**
- * Lst_Duplicate
- * Duplicate an entire list. If a function to copy a void * is
- * given, the individual client elements will be duplicated as well.
- *
- * Arguments:
- * dst the destination list (initialized)
- * src the list to duplicate
- * copyProc A function to duplicate each void
- */
-void
-Lst_Duplicate(Lst *dst, Lst *src, DuplicateProc *copyProc)
-{
- LstNode *ln;
-
- ln = src->firstPtr;
- while (ln != NULL) {
- if (copyProc != NOCOPY)
- Lst_AtEnd(dst, (*copyProc)(ln->datum));
- else
- Lst_AtEnd(dst, ln->datum);
- ln = ln->nextPtr;
- }
-}
-
-/**
- * Lst_Insert
- * Insert a new node with the given piece of data before the given
- * node in the given list.
- *
- * Parameters:
- * l list to manipulate
- * ln node before which to insert d
- * d datum to be inserted
- *
- * Side Effects:
- * the firstPtr field will be changed if ln is the first node in the
- * list.
- */
-void
-Lst_Insert(Lst *list, LstNode *ln, void *d)
-{
- LstNode *nLNode; /* new lnode for d */
-
- nLNode = emalloc(sizeof(*nLNode));
- nLNode->datum = d;
-
- if (ln == NULL) {
- nLNode->prevPtr = nLNode->nextPtr = NULL;
- list->firstPtr = list->lastPtr = nLNode;
- } else {
- nLNode->prevPtr = ln->prevPtr;
- nLNode->nextPtr = ln;
-
- if (nLNode->prevPtr != NULL) {
- nLNode->prevPtr->nextPtr = nLNode;
- }
- ln->prevPtr = nLNode;
-
- if (ln == list->firstPtr) {
- list->firstPtr = nLNode;
- }
- }
-}
-
-LstNode *
-Lst_Member(Lst *list, void *d)
-{
- LstNode *lNode;
-
- lNode = list->firstPtr;
- if (lNode == NULL) {
- return (NULL);
- }
-
- do {
- if (lNode->datum == d) {
- return (lNode);
- }
- lNode = lNode->nextPtr;
- } while (lNode != NULL && lNode != list->firstPtr);
-
- return (NULL);
-}
-
-/**
- * Lst_Remove
- * Remove the given node from the given list.
- *
- * Side Effects:
- * The list's firstPtr will be set to NULL if ln is the last
- * node on the list. firsPtr and lastPtr will be altered if ln is
- * either the first or last node, respectively, on the list.
- */
-void
-Lst_Remove(Lst *list, LstNode *ln)
-{
- /*
- * unlink it from the list
- */
- if (ln->nextPtr != NULL)
- /* unlink from the backward chain */
- ln->nextPtr->prevPtr = ln->prevPtr;
- else
- /* this was the last element */
- list->lastPtr = ln->prevPtr;
-
- if (ln->prevPtr != NULL)
- /* unlink from the forward chain */
- ln->prevPtr->nextPtr = ln->nextPtr;
- else
- /* this was the first element */
- list->firstPtr = ln->nextPtr;
-
- /*
- * note that the datum is unmolested. The caller must free it as
- * necessary and as expected.
- */
- free(ln);
-}
diff --git a/usr.bin/make/lst.h b/usr.bin/make/lst.h
deleted file mode 100644
index 497d59c..0000000
--- a/usr.bin/make/lst.h
+++ /dev/null
@@ -1,177 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1988, 1989 by Adam de Boor
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)lst.h 8.2 (Berkeley) 4/28/95
- * $FreeBSD$
- */
-
-#ifndef lst_h_38f3ead1
-#define lst_h_38f3ead1
-
-/*-
- * lst.h --
- * Header for using the list library
- */
-
-#include "util.h"
-
-/*
- * Structure of a list node.
- */
-struct LstNode {
- struct LstNode *prevPtr; /* previous element in list */
- struct LstNode *nextPtr; /* next in list */
- void *datum; /* datum associated with this element */
-};
-typedef struct LstNode LstNode;
-
-/*
- * The list itself
- */
-struct Lst {
- LstNode *firstPtr; /* first node in list */
- LstNode *lastPtr; /* last node in list */
-};
-typedef struct Lst Lst;
-
-typedef void *DuplicateProc(void *);
-typedef void FreeProc(void *);
-
-/*
- * NOFREE can be used as the freeProc to Lst_Destroy when the elements are
- * not to be freed.
- * NOCOPY performs similarly when given as the copyProc to Lst_Duplicate.
- */
-#define NOFREE ((FreeProc *)NULL)
-#define NOCOPY ((DuplicateProc *)NULL)
-
-#define LST_CONCNEW 0 /* create new LstNode's when using Lst_Concat */
-#define LST_CONCLINK 1 /* relink LstNode's when using Lst_Concat */
-
-/*
- * Creation/destruction functions
- */
-/* Create a new list */
-#define Lst_Init(LST) do { \
- (LST)->firstPtr = NULL; \
- (LST)->lastPtr = NULL; \
- } while (0)
-#define Lst_Initializer(NAME) { NULL, NULL }
-
-/* Duplicate an existing list */
-void Lst_Duplicate(Lst *, Lst *, DuplicateProc *);
-
-/* Destroy an old one */
-void Lst_Destroy(Lst *, FreeProc *);
-
-/*
- * Functions to modify a list
- */
-/* Insert an element before another */
-void Lst_Insert(Lst *, LstNode *, void *);
-/* Insert an element after another */
-void Lst_Append(Lst *, LstNode *, void *);
-/* Place an element at the front of a lst. */
-#define Lst_AtFront(LST, D) (Lst_Insert((LST), Lst_First(LST), (D)))
-/* Place an element at the end of a lst. */
-#define Lst_AtEnd(LST, D) (Lst_Append((LST), Lst_Last(LST), (D)))
-/* Remove an element */
-void Lst_Remove(Lst *, LstNode *);
-/* Replace a node with a new value */
-#define Lst_Replace(NODE, D) ((void)((NODE)->datum = (D)))
-/* Concatenate two lists */
-void Lst_Concat(Lst *, Lst *, int);
-
-/*
- * Node-specific functions
- */
-/* Return first element in list */
-#define Lst_First(LST) ((Lst_Valid(LST) && !Lst_IsEmpty(LST)) \
- ? (LST)->firstPtr : NULL)
-/* Return last element in list */
-#define Lst_Last(LST) ((Lst_Valid(LST) && !Lst_IsEmpty(LST)) \
- ? (LST)->lastPtr : NULL)
-/* Return successor to given element */
-#define Lst_Succ(NODE) (((NODE) == NULL) ? NULL : (NODE)->nextPtr)
-#define LST_NEXT(NODE) ((NODE)->nextPtr)
-/* Get datum from LstNode */
-#define Lst_Datum(NODE) ((NODE)->datum)
-
-/*
- * Functions for entire lists
- */
-
-/*
- * See if the given datum is on the list. Returns the LstNode containing
- * the datum
- */
-LstNode *Lst_Member(Lst *, void *);
-
-/* Loop through a list. Note, that you may not delete the list element. */
-#define LST_FOREACH(PTR, LST) \
- for ((PTR) = (LST)->firstPtr; (PTR) != NULL; (PTR) = (PTR)->nextPtr)
-
-/*
- * for using the list as a queue
- */
-/* Place an element at tail of queue */
-#define Lst_EnQueue(LST, D) (Lst_Valid(LST) \
- ? Lst_Append((LST), Lst_Last(LST), (D)) \
- : (void)0)
-/* Remove an element from head of queue */
-void *Lst_DeQueue(Lst *);
-
-/*
- * LstValid (L) --
- * Return TRUE if the list L is valid
- */
-#define Lst_Valid(L) (((L) == NULL) ? FALSE : TRUE)
-
-/*
- * LstNodeValid (LN, L) --
- * Return TRUE if the LstNode LN is valid with respect to L
- */
-#define Lst_NodeValid(LN, L) (((LN) == NULL) ? FALSE : TRUE)
-
-/*
- * Lst_IsEmpty(L) --
- * TRUE if the list L is empty.
- */
-#define Lst_IsEmpty(L) (!Lst_Valid(L) || (L)->firstPtr == NULL)
-
-#endif /* lst_h_38f3ead1 */
diff --git a/usr.bin/make/main.c b/usr.bin/make/main.c
deleted file mode 100644
index 7569d42..0000000
--- a/usr.bin/make/main.c
+++ /dev/null
@@ -1,1319 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)main.c 8.3 (Berkeley) 3/19/94
- */
-
-#ifndef lint
-#if 0
-static char copyright[] =
-"@(#) Copyright (c) 1988, 1989, 1990, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * main.c
- * The main file for this entire program. Exit routines etc
- * reside here.
- *
- * Utility functions defined in this file:
- * Main_ParseArgLine
- * Takes a line of arguments, breaks them and
- * treats them as if they were given when first
- * invoked. Used by the parse module to implement
- * the .MFLAGS target.
- */
-
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/sysctl.h>
-#include <sys/time.h>
-#include <sys/queue.h>
-#include <sys/resource.h>
-#include <sys/utsname.h>
-#include <sys/wait.h>
-#include <err.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "arch.h"
-#include "buf.h"
-#include "config.h"
-#include "dir.h"
-#include "globals.h"
-#include "GNode.h"
-#include "job.h"
-#include "make.h"
-#include "parse.h"
-#include "pathnames.h"
-#include "shell.h"
-#include "str.h"
-#include "suff.h"
-#include "targ.h"
-#include "util.h"
-#include "var.h"
-
-extern char **environ; /* XXX what header declares this variable? */
-
-#define WANT_ENV_MKLVL 1
-#define MKLVL_MAXVAL 500
-#define MKLVL_ENVVAR "__MKLVL__"
-
-/* ordered list of makefiles to read */
-static Lst makefiles = Lst_Initializer(makefiles);
-
-/* ordered list of source makefiles */
-static Lst source_makefiles = Lst_Initializer(source_makefiles);
-
-/* list of variables to print */
-static Lst variables = Lst_Initializer(variables);
-
-static Boolean expandVars; /* fully expand printed variables */
-static Boolean noBuiltins; /* -r flag */
-static Boolean forceJobs; /* -j argument given */
-static char *curdir; /* startup directory */
-static char *objdir; /* where we chdir'ed to */
-static char **save_argv; /* saved argv */
-static char *save_makeflags;/* saved MAKEFLAGS */
-
-/* (-E) vars to override from env */
-Lst envFirstVars = Lst_Initializer(envFirstVars);
-
-/* Targets to be made */
-Lst create = Lst_Initializer(create);
-
-Boolean allPrecious; /* .PRECIOUS given on line by itself */
-Boolean is_posix; /* .POSIX target seen */
-Boolean mfAutoDeps; /* .MAKEFILEDEPS target seen */
-Boolean beSilent; /* -s flag */
-Boolean beVerbose; /* -v flag */
-Boolean compatMake; /* -B argument */
-int debug; /* -d flag */
-Boolean ignoreErrors; /* -i flag */
-int jobLimit; /* -j argument */
-Boolean jobsRunning; /* TRUE if the jobs might be running */
-Boolean keepgoing; /* -k flag */
-Boolean noExecute; /* -n flag */
-Boolean printGraphOnly; /* -p flag */
-Boolean queryFlag; /* -q flag */
-Boolean touchFlag; /* -t flag */
-Boolean usePipes; /* !-P flag */
-uint32_t warn_cmd; /* command line warning flags */
-uint32_t warn_flags; /* actual warning flags */
-uint32_t warn_nocmd; /* command line no-warning flags */
-
-time_t now; /* Time at start of make */
-struct GNode *DEFAULT; /* .DEFAULT node */
-
-/**
- * Exit with usage message.
- */
-static void
-usage(void)
-{
- fprintf(stderr,
- "usage: make [-BPSXeiknpqrstv] [-C directory] [-D variable]\n"
- "\t[-d flags] [-E variable] [-f makefile] [-I directory]\n"
- "\t[-j max_jobs] [-m directory] [-V variable]\n"
- "\t[variable=value] [target ...]\n");
- exit(2);
-}
-
-/**
- * MFLAGS_append
- * Append a flag with an optional argument to MAKEFLAGS and MFLAGS
- */
-static void
-MFLAGS_append(const char *flag, char *arg)
-{
- char *str;
-
- Var_Append(".MAKEFLAGS", flag, VAR_GLOBAL);
- if (arg != NULL) {
- str = MAKEFLAGS_quote(arg);
- Var_Append(".MAKEFLAGS", str, VAR_GLOBAL);
- free(str);
- }
-
- Var_Append("MFLAGS", flag, VAR_GLOBAL);
- if (arg != NULL) {
- str = MAKEFLAGS_quote(arg);
- Var_Append("MFLAGS", str, VAR_GLOBAL);
- free(str);
- }
-}
-
-/**
- * Main_ParseWarn
- *
- * Handle argument to warning option.
- */
-int
-Main_ParseWarn(const char *arg, int iscmd)
-{
- int i, neg;
-
- static const struct {
- const char *option;
- uint32_t flag;
- } options[] = {
- { "dirsyntax", WARN_DIRSYNTAX },
- { NULL, 0 }
- };
-
- neg = 0;
- if (arg[0] == 'n' && arg[1] == 'o') {
- neg = 1;
- arg += 2;
- }
-
- for (i = 0; options[i].option != NULL; i++)
- if (strcmp(arg, options[i].option) == 0)
- break;
-
- if (options[i].option == NULL)
- /* unknown option */
- return (-1);
-
- if (iscmd) {
- if (!neg) {
- warn_cmd |= options[i].flag;
- warn_nocmd &= ~options[i].flag;
- warn_flags |= options[i].flag;
- } else {
- warn_nocmd |= options[i].flag;
- warn_cmd &= ~options[i].flag;
- warn_flags &= ~options[i].flag;
- }
- } else {
- if (!neg) {
- warn_flags |= (options[i].flag & ~warn_nocmd);
- } else {
- warn_flags &= ~(options[i].flag | warn_cmd);
- }
- }
- return (0);
-}
-
-/**
- * Open and parse the given makefile.
- *
- * Results:
- * TRUE if ok. FALSE if couldn't open file.
- */
-static Boolean
-ReadMakefile(const char p[])
-{
- char *fname, *fnamesave; /* makefile to read */
- FILE *stream;
- char *name, path[MAXPATHLEN];
- char *MAKEFILE;
- int setMAKEFILE;
-
- /* XXX - remove this once constification is done */
- fnamesave = fname = estrdup(p);
-
- if (!strcmp(fname, "-")) {
- Parse_File("(stdin)", stdin);
- Var_SetGlobal("MAKEFILE", "");
- } else {
- setMAKEFILE = strcmp(fname, ".depend");
-
- /* if we've chdir'd, rebuild the path name */
- if (curdir != objdir && *fname != '/') {
- snprintf(path, MAXPATHLEN, "%s/%s", curdir, fname);
- /*
- * XXX The realpath stuff breaks relative includes
- * XXX in some cases. The problem likely is in
- * XXX parse.c where it does special things in
- * XXX ParseDoInclude if the file is relateive
- * XXX or absolute and not a system file. There
- * XXX it assumes that if the current file that's
- * XXX being included is absolute, that any files
- * XXX that it includes shouldn't do the -I path
- * XXX stuff, which is inconsistant with historical
- * XXX behavior. However, I can't pentrate the mists
- * XXX further, so I'm putting this workaround in
- * XXX here until such time as the underlying bug
- * XXX can be fixed.
- */
-#if THIS_BREAKS_THINGS
- if (realpath(path, path) != NULL &&
- (stream = fopen(path, "r")) != NULL) {
- MAKEFILE = fname;
- fname = path;
- goto found;
- }
- } else if (realpath(fname, path) != NULL) {
- MAKEFILE = fname;
- fname = path;
- if ((stream = fopen(fname, "r")) != NULL)
- goto found;
- }
-#else
- if ((stream = fopen(path, "r")) != NULL) {
- MAKEFILE = fname;
- fname = path;
- goto found;
- }
- } else {
- MAKEFILE = fname;
- if ((stream = fopen(fname, "r")) != NULL)
- goto found;
- }
-#endif
- /* look in -I and system include directories. */
- name = Path_FindFile(fname, &parseIncPath);
- if (!name)
- name = Path_FindFile(fname, &sysIncPath);
- if (!name || !(stream = fopen(name, "r"))) {
- free(fnamesave);
- return (FALSE);
- }
- MAKEFILE = fname = name;
- /*
- * set the MAKEFILE variable desired by System V fans -- the
- * placement of the setting here means it gets set to the last
- * makefile specified, as it is set by SysV make.
- */
-found:
- if (setMAKEFILE)
- Var_SetGlobal("MAKEFILE", MAKEFILE);
- Parse_File(fname, stream);
- }
- free(fnamesave);
- return (TRUE);
-}
-
-/**
- * Open and parse the given makefile.
- * If open is successful add it to the list of makefiles.
- *
- * Results:
- * TRUE if ok. FALSE if couldn't open file.
- */
-static Boolean
-TryReadMakefile(const char p[])
-{
- char *data;
- LstNode *last = Lst_Last(&source_makefiles);
-
- if (!ReadMakefile(p))
- return (FALSE);
-
- data = estrdup(p);
- if (last == NULL) {
- LstNode *first = Lst_First(&source_makefiles);
- Lst_Insert(&source_makefiles, first, data);
- } else
- Lst_Append(&source_makefiles, last, estrdup(p));
- return (TRUE);
-}
-
-/**
- * MainParseArgs
- * Parse a given argument vector. Called from main() and from
- * Main_ParseArgLine() when the .MAKEFLAGS target is used.
- *
- * XXX: Deal with command line overriding .MAKEFLAGS in makefile
- *
- * Side Effects:
- * Various global and local flags will be set depending on the flags
- * given
- */
-static void
-MainParseArgs(int argc, char **argv)
-{
- int c;
- Boolean found_dd = FALSE;
-
-rearg:
- optind = 1; /* since we're called more than once */
- optreset = 1;
-#define OPTFLAGS "ABC:D:E:I:PSV:Xd:ef:ij:km:npqrstvx:"
- for (;;) {
- if ((optind < argc) && strcmp(argv[optind], "--") == 0) {
- found_dd = TRUE;
- }
- if ((c = getopt(argc, argv, OPTFLAGS)) == -1) {
- break;
- }
- switch(c) {
-
- case 'A':
- arch_fatal = FALSE;
- MFLAGS_append("-A", NULL);
- break;
- case 'C':
- if (chdir(optarg) == -1)
- err(1, "chdir %s", optarg);
- break;
- case 'D':
- Var_SetGlobal(optarg, "1");
- MFLAGS_append("-D", optarg);
- break;
- case 'I':
- Parse_AddIncludeDir(optarg);
- MFLAGS_append("-I", optarg);
- break;
- case 'V':
- Lst_AtEnd(&variables, estrdup(optarg));
- MFLAGS_append("-V", optarg);
- break;
- case 'X':
- expandVars = FALSE;
- break;
- case 'B':
- compatMake = TRUE;
- MFLAGS_append("-B", NULL);
- unsetenv("MAKE_JOBS_FIFO");
- break;
- case 'P':
- usePipes = FALSE;
- MFLAGS_append("-P", NULL);
- break;
- case 'S':
- keepgoing = FALSE;
- MFLAGS_append("-S", NULL);
- break;
- case 'd': {
- char *modules = optarg;
-
- for (; *modules; ++modules)
- switch (*modules) {
- case 'A':
- debug = ~0;
- break;
- case 'a':
- debug |= DEBUG_ARCH;
- break;
- case 'c':
- debug |= DEBUG_COND;
- break;
- case 'd':
- debug |= DEBUG_DIR;
- break;
- case 'f':
- debug |= DEBUG_FOR;
- break;
- case 'g':
- if (modules[1] == '1') {
- debug |= DEBUG_GRAPH1;
- ++modules;
- }
- else if (modules[1] == '2') {
- debug |= DEBUG_GRAPH2;
- ++modules;
- }
- break;
- case 'j':
- debug |= DEBUG_JOB;
- break;
- case 'l':
- debug |= DEBUG_LOUD;
- break;
- case 'm':
- debug |= DEBUG_MAKE;
- break;
- case 's':
- debug |= DEBUG_SUFF;
- break;
- case 't':
- debug |= DEBUG_TARG;
- break;
- case 'v':
- debug |= DEBUG_VAR;
- break;
- default:
- warnx("illegal argument to d option "
- "-- %c", *modules);
- usage();
- }
- MFLAGS_append("-d", optarg);
- break;
- }
- case 'E':
- Lst_AtEnd(&envFirstVars, estrdup(optarg));
- MFLAGS_append("-E", optarg);
- break;
- case 'e':
- checkEnvFirst = TRUE;
- MFLAGS_append("-e", NULL);
- break;
- case 'f':
- Lst_AtEnd(&makefiles, estrdup(optarg));
- break;
- case 'i':
- ignoreErrors = TRUE;
- MFLAGS_append("-i", NULL);
- break;
- case 'j': {
- char *endptr;
-
- forceJobs = TRUE;
- jobLimit = strtol(optarg, &endptr, 10);
- if (jobLimit <= 0 || *endptr != '\0') {
- warnx("illegal number, -j argument -- %s",
- optarg);
- usage();
- }
- MFLAGS_append("-j", optarg);
- break;
- }
- case 'k':
- keepgoing = TRUE;
- MFLAGS_append("-k", NULL);
- break;
- case 'm':
- Path_AddDir(&sysIncPath, optarg);
- MFLAGS_append("-m", optarg);
- break;
- case 'n':
- noExecute = TRUE;
- MFLAGS_append("-n", NULL);
- break;
- case 'p':
- printGraphOnly = TRUE;
- debug |= DEBUG_GRAPH1;
- break;
- case 'q':
- queryFlag = TRUE;
- /* Kind of nonsensical, wot? */
- MFLAGS_append("-q", NULL);
- break;
- case 'r':
- noBuiltins = TRUE;
- MFLAGS_append("-r", NULL);
- break;
- case 's':
- beSilent = TRUE;
- MFLAGS_append("-s", NULL);
- break;
- case 't':
- touchFlag = TRUE;
- MFLAGS_append("-t", NULL);
- break;
- case 'v':
- beVerbose = TRUE;
- MFLAGS_append("-v", NULL);
- break;
- case 'x':
- if (Main_ParseWarn(optarg, 1) != -1)
- MFLAGS_append("-x", optarg);
- break;
-
- default:
- case '?':
- usage();
- }
- }
- argv += optind;
- argc -= optind;
-
- oldVars = TRUE;
-
- /*
- * Parse the rest of the arguments.
- * o Check for variable assignments and perform them if so.
- * o Check for more flags and restart getopt if so.
- * o Anything else is taken to be a target and added
- * to the end of the "create" list.
- */
- for (; *argv != NULL; ++argv, --argc) {
- if (Parse_IsVar(*argv)) {
- char *ptr = MAKEFLAGS_quote(*argv);
- char *v = estrdup(*argv);
-
- Var_Append(".MAKEFLAGS", ptr, VAR_GLOBAL);
- Parse_DoVar(v, VAR_CMD);
- free(ptr);
- free(v);
-
- } else if ((*argv)[0] == '-') {
- if ((*argv)[1] == '\0') {
- /*
- * (*argv) is a single dash, so we
- * just ignore it.
- */
- } else if (found_dd) {
- /*
- * Double dash has been found, ignore
- * any more options. But what do we do
- * with it? For now treat it like a target.
- */
- Lst_AtEnd(&create, estrdup(*argv));
- } else {
- /*
- * (*argv) is a -flag, so backup argv and
- * argc. getopt() expects options to start
- * in the 2nd position.
- */
- argc++;
- argv--;
- goto rearg;
- }
-
- } else if ((*argv)[0] == '\0') {
- Punt("illegal (null) argument.");
-
- } else {
- Lst_AtEnd(&create, estrdup(*argv));
- }
- }
-}
-
-/**
- * Main_ParseArgLine
- * Used by the parse module when a .MFLAGS or .MAKEFLAGS target
- * is encountered and by main() when reading the .MAKEFLAGS envariable.
- * Takes a line of arguments and breaks it into its
- * component words and passes those words and the number of them to the
- * MainParseArgs function.
- * The line should have all its leading whitespace removed.
- *
- * Side Effects:
- * Only those that come from the various arguments.
- */
-void
-Main_ParseArgLine(char *line, int mflags)
-{
- ArgArray aa;
-
- if (line == NULL)
- return;
- for (; *line == ' '; ++line)
- continue;
- if (!*line)
- return;
-
- if (mflags)
- MAKEFLAGS_break(&aa, line);
- else
- brk_string(&aa, line, TRUE);
-
- MainParseArgs(aa.argc, aa.argv);
- ArgArray_Done(&aa);
-}
-
-static char *
-chdir_verify_path(const char *path, char *obpath)
-{
- struct stat sb;
-
- if (stat(path, &sb) == 0 && S_ISDIR(sb.st_mode)) {
- if (chdir(path) == -1 || getcwd(obpath, MAXPATHLEN) == NULL) {
- warn("warning: %s", path);
- return (NULL);
- }
- return (obpath);
- }
-
- return (NULL);
-}
-
-/**
- * In lieu of a good way to prevent every possible looping in make(1), stop
- * there from being more than MKLVL_MAXVAL processes forked by make(1), to
- * prevent a forkbomb from happening, in a dumb and mechanical way.
- *
- * Side Effects:
- * Creates or modifies enviornment variable MKLVL_ENVVAR via setenv().
- */
-static void
-check_make_level(void)
-{
-#ifdef WANT_ENV_MKLVL
- char *value = getenv(MKLVL_ENVVAR);
- int level = (value == NULL) ? 0 : atoi(value);
-
- if (level < 0) {
- errc(2, EAGAIN, "Invalid value for recursion level (%d).",
- level);
- } else if (level > MKLVL_MAXVAL) {
- errc(2, EAGAIN, "Max recursion level (%d) exceeded.",
- MKLVL_MAXVAL);
- } else {
- char new_value[32];
- sprintf(new_value, "%d", level + 1);
- setenv(MKLVL_ENVVAR, new_value, 1);
- }
-#endif /* WANT_ENV_MKLVL */
-}
-
-/**
- * Main_AddSourceMakefile
- * Add a file to the list of source makefiles
- */
-void
-Main_AddSourceMakefile(const char *name)
-{
-
- Lst_AtEnd(&source_makefiles, estrdup(name));
-}
-
-/**
- * Remake_Makefiles
- * Remake all the makefiles
- */
-static void
-Remake_Makefiles(void)
-{
- LstNode *ln;
- int error_cnt = 0;
- int remade_cnt = 0;
-
- Compat_InstallSignalHandlers();
- if (curdir != objdir) {
- if (chdir(curdir) < 0)
- Fatal("Failed to change directory to %s.", curdir);
- }
-
- LST_FOREACH(ln, &source_makefiles) {
- LstNode *ln2;
- struct GNode *gn;
- const char *name = Lst_Datum(ln);
- Boolean saveTouchFlag = touchFlag;
- Boolean saveQueryFlag = queryFlag;
- Boolean saveNoExecute = noExecute;
- int mtime;
-
- /*
- * Create node
- */
- gn = Targ_FindNode(name, TARG_CREATE);
- DEBUGF(MAKE, ("Checking %s...", gn->name));
- Suff_FindDeps(gn);
-
- /*
- * ! dependencies as well as
- * dependencies with .FORCE, .EXEC and .PHONY attributes
- * are skipped to prevent infinite loops
- */
- if (gn->type & (OP_FORCE | OP_EXEC | OP_PHONY)) {
- DEBUGF(MAKE, ("skipping (force, exec or phony).\n",
- gn->name));
- continue;
- }
-
- /*
- * Skip :: targets that have commands and no children
- * because such targets are always out-of-date
- */
- if ((gn->type & OP_DOUBLEDEP) &&
- !Lst_IsEmpty(&gn->commands) &&
- Lst_IsEmpty(&gn->children)) {
- DEBUGF(MAKE, ("skipping (doubledep, no sources "
- "and has commands).\n"));
- continue;
- }
-
- /*
- * Skip targets without sources and without commands
- */
- if (Lst_IsEmpty(&gn->commands) &&
- Lst_IsEmpty(&gn->children)) {
- DEBUGF(MAKE,
- ("skipping (no sources and no commands).\n"));
- continue;
- }
-
- DEBUGF(MAKE, ("\n"));
-
- /*
- * -t, -q and -n has no effect unless the makefile is
- * specified as one of the targets explicitly in the
- * command line
- */
- LST_FOREACH(ln2, &create) {
- if (!strcmp(gn->name, Lst_Datum(ln2))) {
- /* found as a target */
- break;
- }
- }
- if (ln2 == NULL) {
- touchFlag = FALSE;
- queryFlag = FALSE;
- noExecute = FALSE;
- }
-
- /*
- * Check and remake the makefile
- */
- mtime = Dir_MTime(gn);
- Compat_Make(gn, gn);
-
- /*
- * Restore -t, -q and -n behaviour
- */
- touchFlag = saveTouchFlag;
- queryFlag = saveQueryFlag;
- noExecute = saveNoExecute;
-
- /*
- * Compat_Make will leave the 'made' field of gn
- * in one of the following states:
- * UPTODATE gn was already up-to-date
- * MADE gn was recreated successfully
- * ERROR An error occurred while gn was being created
- * ABORTED gn was not remade because one of its inferiors
- * could not be made due to errors.
- */
- if (gn->made == MADE) {
- if (mtime != Dir_MTime(gn)) {
- DEBUGF(MAKE,
- ("%s updated (%d -> %d).\n",
- gn->name, mtime, gn->mtime));
- remade_cnt++;
- } else {
- DEBUGF(MAKE,
- ("%s not updated: skipping restart.\n",
- gn->name));
- }
- } else if (gn->made == ERROR)
- error_cnt++;
- else if (gn->made == ABORTED) {
- printf("`%s' not remade because of errors.\n",
- gn->name);
- error_cnt++;
- } else if (gn->made == UPTODATE) {
- Lst examine;
-
- Lst_Init(&examine);
- Lst_EnQueue(&examine, gn);
- while (!Lst_IsEmpty(&examine)) {
- LstNode *eln;
- GNode *egn = Lst_DeQueue(&examine);
-
- egn->make = FALSE;
- LST_FOREACH(eln, &egn->children) {
- GNode *cgn = Lst_Datum(eln);
-
- Lst_EnQueue(&examine, cgn);
- }
- }
- }
- }
-
- if (error_cnt > 0)
- Fatal("Failed to remake Makefiles.");
- if (remade_cnt > 0) {
- DEBUGF(MAKE, ("Restarting `%s'.\n", save_argv[0]));
-
- /*
- * Some of makefiles were remade -- restart from clean state
- */
- if (save_makeflags != NULL)
- setenv("MAKEFLAGS", save_makeflags, 1);
- else
- unsetenv("MAKEFLAGS");
- if (execvp(save_argv[0], save_argv) < 0) {
- Fatal("Can't restart `%s': %s.",
- save_argv[0], strerror(errno));
- }
- }
-
- if (curdir != objdir) {
- if (chdir(objdir) < 0)
- Fatal("Failed to change directory to %s.", objdir);
- }
-}
-
-/**
- * main
- * The main function, for obvious reasons. Initializes variables
- * and a few modules, then parses the arguments give it in the
- * environment and on the command line. Reads the system makefile
- * followed by either Makefile, makefile or the file given by the
- * -f argument. Sets the .MAKEFLAGS PMake variable based on all the
- * flags it has received by then uses either the Make or the Compat
- * module to create the initial list of targets.
- *
- * Results:
- * If -q was given, exits -1 if anything was out-of-date. Else it exits
- * 0.
- *
- * Side Effects:
- * The program exits when done. Targets are created. etc. etc. etc.
- */
-int
-main(int argc, char **argv)
-{
- const char *machine;
- const char *machine_arch;
- const char *machine_cpu;
- Boolean outOfDate = TRUE; /* FALSE if all targets up to date */
- const char *p;
- const char *pathp;
- const char *path;
- char mdpath[MAXPATHLEN];
- char obpath[MAXPATHLEN];
- char cdpath[MAXPATHLEN];
- char *cp = NULL, *start;
-
- save_argv = argv;
- save_makeflags = getenv("MAKEFLAGS");
- if (save_makeflags != NULL)
- save_makeflags = estrdup(save_makeflags);
-
- /*
- * Initialize file global variables.
- */
- expandVars = TRUE;
- noBuiltins = FALSE; /* Read the built-in rules */
- forceJobs = FALSE; /* No -j flag */
- curdir = cdpath;
-
- /*
- * Initialize program global variables.
- */
- beSilent = FALSE; /* Print commands as executed */
- ignoreErrors = FALSE; /* Pay attention to non-zero returns */
- noExecute = FALSE; /* Execute all commands */
- printGraphOnly = FALSE; /* Don't stop after printing graph */
- keepgoing = FALSE; /* Stop on error */
- allPrecious = FALSE; /* Remove targets when interrupted */
- queryFlag = FALSE; /* This is not just a check-run */
- touchFlag = FALSE; /* Actually update targets */
- usePipes = TRUE; /* Catch child output in pipes */
- debug = 0; /* No debug verbosity, please. */
- jobsRunning = FALSE;
-
- jobLimit = DEFMAXJOBS;
- compatMake = FALSE; /* No compat mode */
-
- check_make_level();
-
-#ifdef RLIMIT_NOFILE
- /*
- * get rid of resource limit on file descriptors
- */
- {
- struct rlimit rl;
- if (getrlimit(RLIMIT_NOFILE, &rl) == -1) {
- err(2, "getrlimit");
- }
- rl.rlim_cur = rl.rlim_max;
- if (setrlimit(RLIMIT_NOFILE, &rl) == -1) {
- err(2, "setrlimit");
- }
- }
-#endif
-
- /*
- * Prior to 7.0, FreeBSD/pc98 kernel used to set the
- * utsname.machine to "i386", and MACHINE was defined as
- * "i386", so it could not be distinguished from FreeBSD/i386.
- * Therefore, we had to check machine.ispc98 and adjust the
- * MACHINE variable. NOTE: The code is still here to be able
- * to compile new make binary on old FreeBSD/pc98 systems, and
- * have the MACHINE variable set properly.
- */
- if ((machine = getenv("MACHINE")) == NULL) {
- int ispc98;
- size_t len;
-
- len = sizeof(ispc98);
- if (!sysctlbyname("machdep.ispc98", &ispc98, &len, NULL, 0)) {
- if (ispc98)
- machine = "pc98";
- }
- }
-
- /*
- * Get the name of this type of MACHINE from utsname
- * so we can share an executable for similar machines.
- * (i.e. m68k: amiga hp300, mac68k, sun3, ...)
- *
- * Note that both MACHINE and MACHINE_ARCH are decided at
- * run-time.
- */
- if (machine == NULL) {
- static struct utsname utsname;
-
- if (uname(&utsname) == -1)
- err(2, "uname");
- machine = utsname.machine;
- }
-
- if ((machine_arch = getenv("MACHINE_ARCH")) == NULL) {
-#ifdef MACHINE_ARCH
- machine_arch = MACHINE_ARCH;
-#else
- machine_arch = "unknown";
-#endif
- }
-
- /*
- * Set machine_cpu to the minumum supported CPU revision based
- * on the target architecture, if not already set.
- */
- if ((machine_cpu = getenv("MACHINE_CPU")) == NULL) {
- if (!strcmp(machine_arch, "i386"))
- machine_cpu = "i386";
- else if (!strcmp(machine_arch, "alpha"))
- machine_cpu = "ev4";
- else
- machine_cpu = "unknown";
- }
-
- /*
- * Initialize the parsing, directory and variable modules to prepare
- * for the reading of inclusion paths and variable settings on the
- * command line
- */
- Proc_Init();
-
- Dir_Init(); /* Initialize directory structures so -I flags
- * can be processed correctly */
- Var_Init(environ); /* As well as the lists of variables for
- * parsing arguments */
-
- /*
- * Initialize the Shell so that we have a shell for != assignments
- * on the command line.
- */
- Shell_Init();
-
- /*
- * Initialize various variables.
- * MAKE also gets this name, for compatibility
- * .MAKEFLAGS gets set to the empty string just in case.
- * MFLAGS also gets initialized empty, for compatibility.
- */
- Var_SetGlobal("MAKE", argv[0]);
- Var_SetGlobal(".MAKEFLAGS", "");
- Var_SetGlobal("MFLAGS", "");
- Var_SetGlobal("MACHINE", machine);
- Var_SetGlobal("MACHINE_ARCH", machine_arch);
- Var_SetGlobal("MACHINE_CPU", machine_cpu);
-#ifdef MAKE_VERSION
- Var_SetGlobal("MAKE_VERSION", MAKE_VERSION);
-#endif
-
- /*
- * First snag things out of the MAKEFLAGS environment
- * variable. Then parse the command line arguments.
- */
- Main_ParseArgLine(getenv("MAKEFLAGS"), 1);
-
- MainParseArgs(argc, argv);
-
- /*
- * Find where we are...
- */
- if (getcwd(curdir, MAXPATHLEN) == NULL)
- err(2, NULL);
-
- {
- struct stat sa;
-
- if (stat(curdir, &sa) == -1)
- err(2, "%s", curdir);
- }
-
- /*
- * The object directory location is determined using the
- * following order of preference:
- *
- * 1. MAKEOBJDIRPREFIX`cwd`
- * 2. MAKEOBJDIR
- * 3. PATH_OBJDIR.${MACHINE}
- * 4. PATH_OBJDIR
- * 5. PATH_OBJDIRPREFIX`cwd`
- *
- * If one of the first two fails, use the current directory.
- * If the remaining three all fail, use the current directory.
- *
- * Once things are initted,
- * have to add the original directory to the search path,
- * and modify the paths for the Makefiles apropriately. The
- * current directory is also placed as a variable for make scripts.
- */
- if (!(pathp = getenv("MAKEOBJDIRPREFIX"))) {
- if (!(path = getenv("MAKEOBJDIR"))) {
- path = PATH_OBJDIR;
- pathp = PATH_OBJDIRPREFIX;
- snprintf(mdpath, MAXPATHLEN, "%s.%s", path, machine);
- if (!(objdir = chdir_verify_path(mdpath, obpath)))
- if (!(objdir=chdir_verify_path(path, obpath))) {
- snprintf(mdpath, MAXPATHLEN,
- "%s%s", pathp, curdir);
- if (!(objdir=chdir_verify_path(mdpath,
- obpath)))
- objdir = curdir;
- }
- }
- else if (!(objdir = chdir_verify_path(path, obpath)))
- objdir = curdir;
- }
- else {
- snprintf(mdpath, MAXPATHLEN, "%s%s", pathp, curdir);
- if (!(objdir = chdir_verify_path(mdpath, obpath)))
- objdir = curdir;
- }
- Dir_InitDot(); /* Initialize the "." directory */
- if (objdir != curdir)
- Path_AddDir(&dirSearchPath, curdir);
- Var_SetGlobal(".ST_EXPORTVAR", "YES");
- Var_SetGlobal(".CURDIR", curdir);
- Var_SetGlobal(".OBJDIR", objdir);
-
- if (getenv("MAKE_JOBS_FIFO") != NULL)
- forceJobs = TRUE;
- /*
- * Be compatible if user did not specify -j and did not explicitly
- * turned compatibility on
- */
- if (!compatMake && !forceJobs)
- compatMake = TRUE;
-
- /*
- * Initialize target and suffix modules in preparation for
- * parsing the makefile(s)
- */
- Targ_Init();
- Suff_Init();
-
- DEFAULT = NULL;
- time(&now);
-
- /*
- * Set up the .TARGETS variable to contain the list of targets to be
- * created. If none specified, make the variable empty -- the parser
- * will fill the thing in with the default or .MAIN target.
- */
- if (Lst_IsEmpty(&create)) {
- Var_SetGlobal(".TARGETS", "");
- } else {
- LstNode *ln;
-
- for (ln = Lst_First(&create); ln != NULL; ln = Lst_Succ(ln)) {
- char *name = Lst_Datum(ln);
-
- Var_Append(".TARGETS", name, VAR_GLOBAL);
- }
- }
-
-
- /*
- * If no user-supplied system path was given (through the -m option)
- * add the directories from the DEFSYSPATH (more than one may be given
- * as dir1:...:dirn) to the system include path.
- */
- if (TAILQ_EMPTY(&sysIncPath)) {
- char syspath[] = PATH_DEFSYSPATH;
-
- for (start = syspath; *start != '\0'; start = cp) {
- for (cp = start; *cp != '\0' && *cp != ':'; cp++)
- continue;
- if (*cp == '\0') {
- Path_AddDir(&sysIncPath, start);
- } else {
- *cp++ = '\0';
- Path_AddDir(&sysIncPath, start);
- }
- }
- }
-
- /*
- * Read in the built-in rules first, followed by the specified
- * makefile, if it was (makefile != (char *) NULL), or the default
- * Makefile and makefile, in that order, if it wasn't.
- */
- if (!noBuiltins) {
- /* Path of sys.mk */
- Lst sysMkPath = Lst_Initializer(sysMkPath);
- LstNode *ln;
- char defsysmk[] = PATH_DEFSYSMK;
-
- Path_Expand(defsysmk, &sysIncPath, &sysMkPath);
- if (Lst_IsEmpty(&sysMkPath))
- Fatal("make: no system rules (%s).", PATH_DEFSYSMK);
- LST_FOREACH(ln, &sysMkPath) {
- if (!ReadMakefile(Lst_Datum(ln)))
- break;
- }
- if (ln != NULL)
- Fatal("make: cannot open %s.", (char *)Lst_Datum(ln));
- Lst_Destroy(&sysMkPath, free);
- }
-
- if (!Lst_IsEmpty(&makefiles)) {
- LstNode *ln;
-
- LST_FOREACH(ln, &makefiles) {
- if (!TryReadMakefile(Lst_Datum(ln)))
- break;
- }
- if (ln != NULL)
- Fatal("make: cannot open %s.", (char *)Lst_Datum(ln));
- } else if (!TryReadMakefile("BSDmakefile"))
- if (!TryReadMakefile("makefile"))
- TryReadMakefile("Makefile");
-
- ReadMakefile(".depend");
-
- /* Install all the flags into the MAKEFLAGS envariable. */
- if (((p = Var_Value(".MAKEFLAGS", VAR_GLOBAL)) != NULL) && *p)
- setenv("MAKEFLAGS", p, 1);
- else
- setenv("MAKEFLAGS", "", 1);
-
- /*
- * For compatibility, look at the directories in the VPATH variable
- * and add them to the search path, if the variable is defined. The
- * variable's value is in the same format as the PATH envariable, i.e.
- * <directory>:<directory>:<directory>...
- */
- if (Var_Exists("VPATH", VAR_CMD)) {
- /*
- * GCC stores string constants in read-only memory, but
- * Var_Subst will want to write this thing, so store it
- * in an array
- */
- static char VPATH[] = "${VPATH}";
- Buffer *buf;
- char *vpath;
- char *ptr;
- char savec;
-
- buf = Var_Subst(VPATH, VAR_CMD, FALSE);
-
- vpath = Buf_Data(buf);
- do {
- /* skip to end of directory */
- for (ptr = vpath; *ptr != ':' && *ptr != '\0'; ptr++)
- ;
-
- /* Save terminator character so know when to stop */
- savec = *ptr;
- *ptr = '\0';
-
- /* Add directory to search path */
- Path_AddDir(&dirSearchPath, vpath);
-
- vpath = ptr + 1;
- } while (savec != '\0');
-
- Buf_Destroy(buf, TRUE);
- }
-
- /*
- * Now that all search paths have been read for suffixes et al, it's
- * time to add the default search path to their lists...
- */
- Suff_DoPaths();
-
- /* print the initial graph, if the user requested it */
- if (DEBUG(GRAPH1))
- Targ_PrintGraph(1);
-
- /* print the values of any variables requested by the user */
- if (Lst_IsEmpty(&variables) && !printGraphOnly) {
- /*
- * Since the user has not requested that any variables
- * be printed, we can build targets.
- *
- * Have read the entire graph and need to make a list of targets
- * to create. If none was given on the command line, we consult
- * the parsing module to find the main target(s) to create.
- */
- Lst targs = Lst_Initializer(targs);
-
- if (!is_posix && mfAutoDeps) {
- /*
- * Check if any of the makefiles are out-of-date.
- */
- Remake_Makefiles();
- }
-
- if (Lst_IsEmpty(&create))
- Parse_MainName(&targs);
- else
- Targ_FindList(&targs, &create, TARG_CREATE);
-
- if (compatMake) {
- /*
- * Compat_Init will take care of creating
- * all the targets as well as initializing
- * the module.
- */
- Compat_Run(&targs);
- outOfDate = 0;
- } else {
- /*
- * Initialize job module before traversing
- * the graph, now that any .BEGIN and .END
- * targets have been read. This is done
- * only if the -q flag wasn't given (to
- * prevent the .BEGIN from being executed
- * should it exist).
- */
- if (!queryFlag) {
- Job_Init(jobLimit);
- jobsRunning = TRUE;
- }
-
- /* Traverse the graph, checking on all the targets */
- outOfDate = Make_Run(&targs);
- }
- Lst_Destroy(&targs, NOFREE);
-
- } else {
- Var_Print(&variables, expandVars);
- }
-
- Lst_Destroy(&variables, free);
- Lst_Destroy(&makefiles, free);
- Lst_Destroy(&source_makefiles, free);
- Lst_Destroy(&create, free);
-
- /* print the graph now it's been processed if the user requested it */
- if (DEBUG(GRAPH2))
- Targ_PrintGraph(2);
-
- if (queryFlag && outOfDate)
- return (1);
- else
- return (0);
-}
-
diff --git a/usr.bin/make/make.1 b/usr.bin/make/make.1
deleted file mode 100644
index 44421e5..0000000
--- a/usr.bin/make/make.1
+++ /dev/null
@@ -1,1754 +0,0 @@
-.\" Copyright (c) 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)make.1 8.8 (Berkeley) 6/13/95
-.\" $FreeBSD$
-.\"
-.Dd March 24, 2008
-.Dt MAKE 1
-.Os
-.Sh NAME
-.Nm make
-.Nd maintain program dependencies
-.Sh SYNOPSIS
-.Nm
-.Op Fl ABPSXeiknpqrstv
-.Op Fl C Ar directory
-.Op Fl D Ar variable
-.Op Fl d Ar flags
-.Op Fl E Ar variable
-.Op Fl f Ar makefile
-.Op Fl I Ar directory
-.Bk -words
-.Op Fl j Ar max_jobs
-.Op Fl m Ar directory
-.Ek
-.Op Fl V Ar variable
-.Op Fl x Ar warning_options
-.Op Ar variable Ns No = Ns Ar value
-.Op Ar target ...
-.Sh DESCRIPTION
-The
-.Nm
-utility is a program designed to simplify the maintenance of other programs.
-Its input is a list of specifications
-describing dependency relationships between the generation of
-files and programs.
-.Pp
-First of all, the initial list of specifications will be read
-from the system makefile,
-.Pa sys.mk ,
-unless inhibited with the
-.Fl r
-option.
-The standard
-.Pa sys.mk
-as shipped with
-.Fx
-also handles
-.Xr make.conf 5 ,
-the default path to which
-can be altered via the
-.Nm
-variable
-.Va __MAKE_CONF .
-.Pp
-Then the first of
-.Pa BSDmakefile ,
-.Pa makefile ,
-and
-.Pa Makefile
-that can be found in the current directory, object directory (see
-.Va .OBJDIR ) ,
-or search path (see the
-.Fl I
-option)
-will be read for the main list of dependency specifications.
-A different makefile or list of them can be supplied via the
-.Fl f
-option(s).
-Finally, if the file
-.Pa .depend
-can be found in any of the aforesaid locations, it will also be read (see
-.Xr mkdep 1 ) .
-.Pp
-When
-.Nm
-searches for a makefile, its name takes precedence over its location.
-For instance,
-.Pa BSDmakefile
-in the object directory will be favored over
-.Pa Makefile
-in the current directory.
-.Pp
-The options are as follows:
-.Bl -tag -width Ds
-.It Fl A
-Make archive errors non-fatal, causing
-.Nm
-to just skip the remainder
-or all of the archive and continue after printing a message.
-.It Fl B
-Try to be backwards compatible by executing a single shell per command and
-by executing the commands to make the sources of a dependency line in sequence.
-This is turned on by default unless
-.Fl j
-is used.
-.It Fl C Ar directory
-Change to
-.Ar directory
-before reading the makefiles or doing anything else.
-If multiple
-.Fl C
-options are specified, each is interpreted relative to the previous one:
-.Fl C Pa / Fl C Pa etc
-is equivalent to
-.Fl C Pa /etc .
-.It Fl D Ar variable
-Define
-.Ar variable
-to be 1, in the global context.
-.It Fl d Ar flags
-Turn on debugging, and specify which portions of
-.Nm
-are to print debugging information.
-Argument
-.Ar flags
-is one or more of the following:
-.Bl -tag -width Ds
-.It Ar A
-Print all possible debugging information;
-equivalent to specifying all of the debugging flags.
-.It Ar a
-Print debugging information about archive searching and caching.
-.It Ar c
-Print debugging information about conditional evaluation.
-.It Ar d
-Print debugging information about directory searching and caching.
-.It Ar f
-Print debugging information about the execution of for loops.
-.It Ar "g1"
-Print the input graph before making anything.
-.It Ar "g2"
-Print the input graph after making everything, or before exiting
-on error.
-.It Ar j
-Print debugging information about running multiple shells.
-.It Ar l
-Print commands in Makefiles regardless of whether or not they are prefixed
-by @ or other "quiet" flags.
-Also known as "loud" behavior.
-.It Ar m
-Print debugging information about making targets, including modification
-dates.
-.It Ar s
-Print debugging information about suffix-transformation rules.
-.It Ar t
-Print debugging information about target list maintenance.
-.It Ar v
-Print debugging information about variable assignment.
-.El
-.It Fl E Ar variable
-Specify a variable whose environment value (if any) will override
-macro assignments within makefiles.
-.It Fl e
-Specify that environment values override macro assignments within
-makefiles for all variables.
-.It Fl f Ar makefile
-Specify a makefile to read instead of the default one.
-If
-.Ar makefile
-is not an absolute pathname,
-.Nm
-will search for it as described above.
-In case
-.Ar makefile
-is
-.Sq Fl ,
-standard input is read.
-Multiple
-.Fl f
-options can be supplied,
-and the makefiles will be read in that order.
-Unlike the other command-line options,
-.Fl f
-is neither stored in
-.Va .MAKEFLAGS
-nor pushed down to sub-makes via
-.Ev MAKEFLAGS .
-See below for more details on these variables.
-.It Fl I Ar directory
-Specify a directory in which to search for makefiles and included makefiles.
-Multiple
-.Fl I
-options can be specified to form a search path.
-The system makefile directory (or directories, see the
-.Fl m
-option) is automatically appended at the tail of this path.
-.It Fl i
-Ignore non-zero exit of shell commands in the makefile.
-Equivalent to specifying
-.Sq Ic \-
-before each command line in the makefile.
-.It Fl j Ar max_jobs
-Specify the maximum number of jobs that
-.Nm
-may have running at any one time.
-Turns compatibility mode off, unless the
-.Fl B
-flag is also specified.
-.It Fl k
-Continue processing after errors are encountered, but only on those targets
-that do not depend on the target whose creation caused the error.
-.It Fl m Ar directory
-Specify a directory in which to search for
-the system makefile and makefiles included via the <...> style.
-Multiple
-.Fl m
-options can be specified to form a search path.
-This path will override the default system include path,
-.Pa /usr/share/mk .
-The system include path will always be appended to the search path used
-for "..."-style inclusions and makefile searches (see the
-.Fl I
-option).
-.It Fl n
-Display the commands that would have been executed, but do not actually
-execute them.
-.It Fl P
-Collate the output of a given job and display it only when the job finishes,
-instead of mixing the output of parallel jobs together.
-This option has no effect unless
-.Fl j
-is used too.
-.It Fl p
-Only print the input graph, not executing any commands.
-The output is the same as
-.Fl d Ar g1 .
-When combined with
-.Fl f Pa /dev/null ,
-only the builtin rules of
-.Nm
-are displayed.
-.It Fl q
-Do not execute any commands, but exit 0 if the specified targets are
-up-to-date and 1, otherwise.
-.It Fl r
-Do not process the system makefile.
-.It Fl S
-Stop processing when an error is encountered.
-Default behaviour.
-This is needed to negate the
-.Fl k
-option during recursive builds.
-.It Fl s
-Do not echo any commands as they are executed.
-Equivalent to specifying
-.Sq Ic @
-before each command line in the makefile.
-.It Fl t
-Rather than re-building a target as specified in the makefile, create it
-or update its modification time to make it appear up-to-date.
-.It Fl V Ar variable
-Print
-.Nm Ns 's
-idea of the value of
-.Ar variable ,
-in the global context.
-Do not build any targets.
-Multiple instances of this option may be specified;
-the variables will be printed one per line,
-with a blank line for each null or undefined variable.
-.It Fl v
-Be extra verbose.
-For multi-job makes, this will cause file banners to be generated.
-.It Fl X
-When using the
-.Fl V
-option to print the values of variables,
-do not recursively expand the values.
-.It Ar variable Ns No = Ns Ar value
-Set the value of the variable
-.Ar variable
-to
-.Ar value .
-.It Fl x Ar warning_options
-Specify extended warning options.
-This option may be specified several times.
-A
-.Ar warning_option
-can be prefixed with
-.Dq Li no
-in which case the warning is switched off.
-The currently available options are:
-.Bl -tag -width indent
-.It Li dirsyntax
-Warn if anything except blanks and comments follows an
-.Ic .endif
-or
-.Ic .else
-directive.
-.El
-.Pp
-See also the
-.Ic .WARN
-special target.
-.El
-.Pp
-There are seven different types of lines in a makefile: file dependency
-specifications, shell commands, variable assignments, include statements,
-conditional directives, for loops, and comments.
-.Pp
-In general, lines may be continued from one line to the next by ending
-them with a backslash
-.Pq Ql \e .
-The trailing newline character and initial whitespace on the following
-line are compressed into a single space.
-.Sh FILE DEPENDENCY SPECIFICATIONS
-Dependency lines consist of one or more targets, an operator, and zero
-or more sources.
-This creates a relationship where the targets
-.Dq depend
-on the sources
-and are usually created from them.
-The exact relationship between the target and the source is determined
-by the operator that separates them.
-The three operators are as follows:
-.Bl -tag -width flag
-.It Ic \&:
-A target is considered out-of-date if its modification time is less than
-those of any of its sources.
-Sources for a target accumulate over dependency lines when this operator
-is used.
-The target is removed if
-.Nm
-is interrupted.
-.It Ic \&!
-Targets are always re-created, but not until all sources have been
-examined and re-created as necessary.
-Sources for a target accumulate over dependency lines when this operator
-is used.
-The target is removed if
-.Nm
-is interrupted.
-.It Ic ::
-If no sources are specified, the target is always re-created.
-Otherwise, a target is considered out-of-date if any of its sources has
-been modified more recently than the target.
-Sources for a target do not accumulate over dependency lines when this
-operator is used.
-The target will not be removed if
-.Nm
-is interrupted.
-.El
-.Pp
-Targets and sources may contain the shell wildcard expressions
-.Ql \&? ,
-.Ql * ,
-.Ql []
-and
-.Ql {} .
-The expressions
-.Ql \&? ,
-.Ql *
-and
-.Ql []
-may only be used as part of the final
-component of the target or source, and must be used to describe existing
-files.
-The expression
-.Ql {}
-need not necessarily be used to describe existing files.
-Expansion is in directory order, not alphabetically as done in the shell.
-.Sh SHELL COMMANDS
-Each target may have associated with it a series of shell commands, normally
-used to create the target.
-Each of the commands in this script
-.Em must
-be preceded by a tab.
-While any target may appear on a dependency line, only one of these
-dependencies may be followed by a creation script, unless the
-.Sq Ic ::
-operator is used.
-.Pp
-If the first characters of the command line are
-.Sq Ic @ ,
-.Sq Ic \- ,
-and/or
-.Sq Ic + ,
-the command is treated specially.
-A
-.Sq Ic @
-causes the command not to be echoed before it is executed.
-A
-.Sq Ic \-
-causes any non-zero exit status of the command line to be ignored.
-A
-.Sq Ic +
-causes the command to be executed even if
-.Fl n
-is specified on the command line.
-.Sh VARIABLE ASSIGNMENTS
-Variables in
-.Nm
-are much like variables in the shell, and, by tradition,
-consist of all upper-case letters.
-The five operators that can be used to assign values to variables are as
-follows:
-.Bl -tag -width Ds
-.It Ic =
-Assign the value to the variable.
-Any previous value is overridden.
-.It Ic +=
-Append the value to the current value of the variable.
-.It Ic ?=
-Assign the value to the variable if it is not already defined.
-.It Ic :=
-Assign with expansion, i.e., expand the value before assigning it
-to the variable.
-Normally, expansion is not done until the variable is referenced.
-.It Ic !=
-Expand the value and pass it to the shell for execution and assign
-the result to the variable.
-Any newlines in the result are replaced with spaces.
-.El
-.Pp
-Any whitespace before the assigned
-.Ar value
-is removed; if the value is being appended, a single space is inserted
-between the previous contents of the variable and the appended value.
-.Pp
-Variables are expanded by surrounding the variable name with either
-curly braces
-.Pq Ql {}
-or parentheses
-.Pq Ql ()
-and preceding it with
-a dollar sign
-.Pq Ql $ .
-If the variable name contains only a single letter, the surrounding
-braces or parentheses are not required.
-This shorter form is not recommended.
-.Pp
-Variable substitution occurs at two distinct times, depending on where
-the variable is being used.
-Variables in dependency lines are expanded as the line is read.
-Variables in shell commands are expanded when the shell command is
-executed.
-.Pp
-The four different classes of variables (in order of increasing precedence)
-are:
-.Bl -tag -width Ds
-.It Environment variables
-Variables defined as part of
-.Nm Ns 's
-environment.
-.It Global variables
-Variables defined in the makefile or in included makefiles.
-.It Command line variables
-Variables defined as part of the command line and variables
-obtained from the
-.Ev MAKEFLAGS
-environment variable or the
-.Ic .MAKEFLAGS
-target.
-.It Local variables
-Variables that are defined specific to a certain target.
-.El
-.Pp
-If the name of an environment variable appears in a makefile
-on the left-hand side of an assignment,
-a global variable with the same name is created, and the latter
-shadows the former as per their relative precedences.
-The environment is not changed in this case, and the change
-is not exported to programs executed by
-.Nm .
-However, a command-line variable actually replaces
-the environment variable of the same name if the latter exists,
-which is visible to child programs.
-.Pp
-There are seven local variables in
-.Nm :
-.Bl -tag -width ".ARCHIVE"
-.It Va .ALLSRC
-The list of all sources for this target; also known as
-.Sq Va > .
-.It Va .ARCHIVE
-The name of the archive file; also known as
-.Sq Va \&! .
-.It Va .IMPSRC
-The name/path of the source from which the target is to be transformed
-(the
-.Dq implied
-source); also known as
-.Sq Va < .
-.It Va .MEMBER
-The name of the archive member; also known as
-.Sq Va % .
-.It Va .OODATE
-The list of sources for this target that were deemed out-of-date; also
-known as
-.Sq Va \&? .
-.It Va .PREFIX
-The file prefix of the file, containing only the file portion, no suffix
-or preceding directory components; also known as
-.Sq Va * .
-.It Va .TARGET
-The name of the target; also known as
-.Sq Va @ .
-.El
-.Pp
-The shorter forms
-.Sq Va @ ,
-.Sq Va \&! ,
-.Sq Va < ,
-.Sq Va % ,
-.Sq Va \&? ,
-.Sq Va > ,
-and
-.Sq Va *
-are permitted for backward
-compatibility and are not recommended.
-The six variables
-.Sq Va @F ,
-.Sq Va @D ,
-.Sq Va <F ,
-.Sq Va <D ,
-.Sq Va *F ,
-and
-.Sq Va *D
-are
-permitted for compatibility with
-.At V
-makefiles and are not recommended.
-.Pp
-Four of the local variables may be used in sources on dependency lines
-because they expand to the proper value for each target on the line.
-These variables are
-.Va .TARGET ,
-.Va .PREFIX ,
-.Va .ARCHIVE ,
-and
-.Va .MEMBER .
-.Pp
-In addition,
-.Nm
-sets or knows about the following internal variables or environment
-variables:
-.Bl -tag -width ".Va .MAKEFILE_LIST"
-.It Va $
-A single dollar sign
-.Ql $ ,
-i.e.\&
-.Ql $$
-expands to a single dollar
-sign.
-.It Va MAKE
-The name that
-.Nm
-was executed with
-.Pq Va argv Ns Op 0 .
-.It Va .CURDIR
-A path to the directory where
-.Nm
-was executed.
-The
-.Nm
-utility sets
-.Va .CURDIR
-to the canonical path given by
-.Xr getcwd 3 .
-.It Va .OBJDIR
-A path to the directory where the targets are built.
-At startup,
-.Nm
-searches for an alternate directory to place target files.
-It will attempt to change into this special directory
-and will search this directory for makefiles
-not found in the current directory.
-The following directories are tried in order:
-.Pp
-.Bl -enum -compact
-.It
-${MAKEOBJDIRPREFIX}/`pwd`
-.It
-${MAKEOBJDIR}
-.It
-obj.${MACHINE}
-.It
-obj
-.It
-/usr/obj/`pwd`
-.El
-.Pp
-The first directory that
-.Nm
-successfully changes into is used.
-If either
-.Ev MAKEOBJDIRPREFIX
-or
-.Ev MAKEOBJDIR
-is set in the environment but
-.Nm
-is unable to change into the corresponding directory,
-then the current directory is used
-without checking the remainder of the list.
-If they are undefined and
-.Nm
-is unable to change into any of the remaining three directories,
-then the current directory is used.
-Note, that
-.Ev MAKEOBJDIRPREFIX
-and
-.Ev MAKEOBJDIR
-must be environment variables and should not be set on
-.Nm Ns 's
-command line.
-.Pp
-The
-.Nm
-utility sets
-.Va .OBJDIR
-to the canonical path given by
-.Xr getcwd 3 .
-.It Va .MAKEFILE_LIST
-As
-.Nm
-reads various makefiles, including the default files and any
-obtained from the command line and
-.Ic .include
-and
-.Ic .sinclude
-directives, their names will be automatically appended to the
-.Va .MAKEFILE_LIST
-variable.
-They are added right before
-.Nm
-begins to parse them, so that the name of the current makefile is the
-last word in this variable.
-.It Ev MAKEFLAGS
-The environment variable
-.Ev MAKEFLAGS
-may initially contain anything that
-may be specified on
-.Nm Ns 's
-command line,
-including
-.Fl f
-option(s).
-After processing, its contents are stored in the
-.Va .MAKEFLAGS
-global variable, although any
-.Fl f
-options are omitted.
-Then all options and variable assignments specified on
-.Nm Ns 's
-command line, except for
-.Fl f ,
-are appended to the
-.Va .MAKEFLAGS
-variable.
-.Pp
-Whenever
-.Nm
-executes a program, it sets
-.Ev MAKEFLAGS
-in the program's environment to the current value of the
-.Va .MAKEFLAGS
-global variable.
-Thus, if
-.Ev MAKEFLAGS
-in
-.Nm Ns 's
-environment contains any
-.Fl f
-options, they will not be pushed down to child programs automatically.
-The
-.Nm
-utility effectively filters out
-.Fl f
-options from the environment and command line although it
-passes the rest of its options down to sub-makes via
-.Ev MAKEFLAGS
-by default.
-.Pp
-When passing macro definitions and flag arguments in the
-.Ev MAKEFLAGS
-environment variable,
-space and tab characters are quoted by preceding them with a backslash.
-When reading the
-.Ev MAKEFLAGS
-variable from the environment,
-all sequences of a backslash and one of space or tab
-are replaced just with their second character
-without causing a word break.
-Any other occurrences of a backslash are retained.
-Groups of unquoted space, tab and newline characters cause word
-breaking.
-.It Va .MAKEFLAGS
-Initially, this global variable contains
-.Nm Ns 's
-current run-time options from the environment
-and command line as described above, under
-.Ev MAKEFLAGS .
-By modifying the contents of the
-.Va .MAKEFLAGS
-global variable, the makefile can alter the contents of the
-.Ev MAKEFLAGS
-environment variable made available for all programs which
-.Nm
-executes.
-This includes adding
-.Fl f
-option(s).
-The current value of
-.Va .MAKEFLAGS
-is just copied verbatim to
-.Ev MAKEFLAGS
-in the environment of child programs.
-.Pp
-Note that any options entered to
-.Va .MAKEFLAGS
-neither affect the current instance of
-.Nm
-nor show up in its own copy of
-.Ev MAKEFLAGS
-instantly.
-However, they do show up in the
-.Ev MAKEFLAGS
-environment variable of programs executed by
-.Nm .
-On the other hand, a direct assignment to
-.Ev MAKEFLAGS
-neither affects the current instance of
-.Nm
-nor is passed down to
-.Nm Ns 's
-children.
-Compare with the
-.Ic .MAKEFLAGS
-special target below.
-.It Va MFLAGS
-This variable is provided for backward compatibility and
-contains all the options from the
-.Ev MAKEFLAGS
-environment variable plus any options specified on
-.Nm Ns 's
-command line.
-.It Va .TARGETS
-List of targets
-.Nm
-is currently building.
-.It Va .INCLUDES
-See
-.Ic .INCLUDES
-special target.
-.It Va .LIBS
-See
-.Ic .LIBS
-special target.
-.It Va MACHINE
-Name of the machine architecture
-.Nm
-is running on, obtained from the
-.Ev MACHINE
-environment variable, or through
-.Xr uname 3
-if not defined.
-.It Va MACHINE_ARCH
-Name of the machine architecture
-.Nm
-was compiled for, defined at compilation time.
-.It Va VPATH
-Makefiles may assign a colon-delimited list of directories to
-.Va VPATH .
-These directories will be searched for source files by
-.Nm
-after it has finished parsing all input makefiles.
-.El
-.Pp
-Variable expansion may be modified to select or modify each word of the
-variable (where a
-.Dq word
-is whitespace-delimited sequence of characters).
-The general format of a variable expansion is as follows:
-.Pp
-.Dl {variable[:modifier[:...]]}
-.Pp
-Each modifier begins with a colon and one of the following
-special characters.
-The colon may be escaped with a backslash
-.Pq Ql \e .
-.Bl -tag -width Cm
-.Sm off
-.It Cm C No / Ar pattern Xo
-.No / Ar replacement
-.No / Op Cm 1g
-.Xc
-.Sm on
-Modify each word of the value,
-substituting every match of the extended regular expression
-.Ar pattern
-(see
-.Xr re_format 7 )
-with the
-.Xr ed 1 Ns \-style
-.Ar replacement
-string.
-Normally, the first occurrence of the pattern in
-each word of the value is changed.
-The
-.Ql 1
-modifier causes the substitution to apply to at most one word; the
-.Ql g
-modifier causes the substitution to apply to as many instances of the
-search pattern as occur in the word or words it is found in.
-Note that
-.Ql 1
-and
-.Ql g
-are orthogonal; the former specifies whether multiple words are
-potentially affected, the latter whether multiple substitutions can
-potentially occur within each affected word.
-.It Cm E
-Replaces each word in the variable with its suffix.
-.It Cm H
-Replaces each word in the variable with everything but the last component.
-.It Cm L
-Converts variable to lower-case letters.
-.It Cm M Ns Ar pattern
-Select only those words that match the rest of the modifier.
-The standard shell wildcard characters
-.Pf ( Ql * ,
-.Ql \&? ,
-and
-.Ql [] )
-may
-be used.
-The wildcard characters may be escaped with a backslash
-.Pq Ql \e .
-.It Cm N Ns Ar pattern
-This is identical to
-.Cm M ,
-but selects all words which do not match
-the rest of the modifier.
-.It Cm O
-Order every word in the variable alphabetically.
-.It Cm Q
-Quotes every shell meta-character in the variable, so that it can be passed
-safely through recursive invocations of
-.Nm .
-.It Cm R
-Replaces each word in the variable with everything but its suffix.
-.Sm off
-.It Cm S No / Ar old_string Xo
-.No / Ar new_string
-.No / Op Cm g
-.Xc
-.Sm on
-Modify the first occurrence of
-.Ar old_string
-in each word of the variable's value, replacing it with
-.Ar new_string .
-If a
-.Ql g
-is appended to the last slash of the pattern, all occurrences
-in each word are replaced.
-If
-.Ar old_string
-begins with a caret
-.Pq Ql ^ ,
-.Ar old_string
-is anchored at the beginning of each word.
-If
-.Ar old_string
-ends with a dollar sign
-.Pq Ql $ ,
-it is anchored at the end of each word.
-Inside
-.Ar new_string ,
-an ampersand
-.Pq Ql &
-is replaced by
-.Ar old_string .
-Any character may be used as a delimiter for the parts of the modifier
-string.
-The anchoring, ampersand, and delimiter characters may be escaped with a
-backslash
-.Pq Ql \e .
-.Pp
-Variable expansion occurs in the normal fashion inside both
-.Ar old_string
-and
-.Ar new_string
-with the single exception that a backslash is used to prevent the expansion
-of a dollar sign
-.Pq Ql $ ,
-not a preceding dollar sign as is usual.
-.It Ar old_string=new_string
-This is the
-.At V
-style variable substitution.
-It must be the last modifier specified.
-If
-.Ar old_string
-or
-.Ar new_string
-do not contain the pattern matching character
-.Ar %
-then it is assumed that they are
-anchored at the end of each word, so only suffixes or entire
-words may be replaced.
-Otherwise
-.Ar %
-is the substring of
-.Ar old_string
-to be replaced in
-.Ar new_string
-.It Cm T
-Replaces each word in the variable with its last component.
-.It Cm U
-Converts variable to upper-case letters.
-.It Cm u
-Remove adjacent duplicate words (like
-.Xr uniq 1 ) .
-.El
-.Sh DIRECTIVES, CONDITIONALS, AND FOR LOOPS
-Directives, conditionals, and for loops reminiscent
-of the C programming language are provided in
-.Nm .
-All such structures are identified by a line beginning with a single
-dot
-.Pq Ql \&.
-character.
-The following directives are supported:
-.Bl -tag -width Ds
-.It Ic .include Ar <file>
-.It Ic .include Ar \*qfile\*q
-Include the specified makefile.
-Variables between the angle brackets
-or double quotes are expanded to form the file name.
-If angle brackets
-are used, the included makefile is expected to be in the system
-makefile directory.
-If double quotes are used, the including
-makefile's directory and any directories specified using the
-.Fl I
-option are searched before the system
-makefile directory.
-.It Ic .sinclude Ar <file>
-.It Ic .sinclude Ar \*qfile\*q
-Like
-.Ic .include ,
-but silently ignored if the file cannot be found and opened.
-.It Ic .undef Ar variable
-Un-define the specified global variable.
-Only global variables may be un-defined.
-.It Ic .error Ar message
-Terminate processing of the makefile immediately.
-The filename of the
-makefile, the line on which the error was encountered and the specified
-message are printed to the standard error output and
-.Nm
-terminates with exit code 1.
-Variables in the message are expanded.
-.It Ic .warning Ar message
-Emit a warning message.
-The filename of the makefile,
-the line on which the warning was encountered,
-and the specified message are printed to the standard error output.
-Variables in the message are expanded.
-.El
-.Pp
-Conditionals are used to determine which parts of the Makefile
-to process.
-They are used similarly to the conditionals supported
-by the C pre-processor.
-The following conditionals are supported:
-.Bl -tag -width Ds
-.It Xo
-.Ic .if
-.Oo \&! Oc Ns Ar expression
-.Op Ar operator expression ...
-.Xc
-Test the value of an expression.
-.It Xo
-.Ic .ifdef
-.Oo \&! Oc Ns Ar variable
-.Op Ar operator variable ...
-.Xc
-Test the value of a variable.
-.It Xo
-.Ic .ifndef
-.Oo \&! Oc Ns Ar variable
-.Op Ar operator variable ...
-.Xc
-Test the value of a variable.
-.It Xo
-.Ic .ifmake
-.Oo \&! Oc Ns Ar target
-.Op Ar operator target ...
-.Xc
-Test the target being built.
-.It Xo
-.Ic .ifnmake
-.Oo \&! Oc Ns Ar target
-.Op Ar operator target ...
-.Xc
-Test the target being built.
-.It Ic .else
-Reverse the sense of the last conditional.
-.It Xo
-.Ic .elif
-.Oo \&! Oc Ns Ar expression
-.Op Ar operator expression ...
-.Xc
-A combination of
-.Ic .else
-followed by
-.Ic .if .
-.It Xo
-.Ic .elifdef
-.Oo \&! Oc Ns Ar variable
-.Op Ar operator variable ...
-.Xc
-A combination of
-.Ic .else
-followed by
-.Ic .ifdef .
-.It Xo
-.Ic .elifndef
-.Oo \&! Oc Ns Ar variable
-.Op Ar operator variable ...
-.Xc
-A combination of
-.Ic .else
-followed by
-.Ic .ifndef .
-.It Xo
-.Ic .elifmake
-.Oo \&! Oc Ns Ar target
-.Op Ar operator target ...
-.Xc
-A combination of
-.Ic .else
-followed by
-.Ic .ifmake .
-.It Xo
-.Ic .elifnmake
-.Oo \&! Oc Ns Ar target
-.Op Ar operator target ...
-.Xc
-A combination of
-.Ic .else
-followed by
-.Ic .ifnmake .
-.It Ic .endif
-End the body of the conditional.
-.El
-.Pp
-The
-.Ar operator
-may be any one of the following:
-.Bl -tag -width "Cm XX"
-.It Cm ||
-logical
-.Tn OR
-.It Cm &&
-Logical
-.Tn AND ;
-of higher precedence than
-.Sq Ic || .
-.El
-.Pp
-As in C,
-.Nm
-will only evaluate a conditional as far as is necessary to determine
-its value.
-Parentheses may be used to change the order of evaluation.
-The boolean operator
-.Sq Ic !\&
-may be used to logically negate an entire
-conditional.
-It is of higher precedence than
-.Sq Ic && .
-.Pp
-The value of
-.Ar expression
-may be any of the following:
-.Bl -tag -width Ic
-.It Ic defined
-Takes a variable name as an argument and evaluates to true if the variable
-has been defined.
-.It Ic make
-Takes a target name as an argument and evaluates to true if the target
-was specified as part of
-.Nm Ns 's
-command line or was declared the default target (either implicitly or
-explicitly, see
-.Va .MAIN )
-before the line containing the conditional.
-.It Ic empty
-Takes a variable, with possible modifiers, and evaluates to true if
-the expansion of the variable would result in an empty string.
-.It Ic exists
-Takes a file name as an argument and evaluates to true if the file exists.
-The file is searched for on the system search path (see
-.Va .PATH ) .
-.It Ic target
-Takes a target name as an argument and evaluates to true if the target
-has been defined.
-.El
-.Pp
-An
-.Ar expression
-may also be an arithmetic or string comparison, with the left-hand side
-being a variable expansion.
-Variable expansion is
-performed on both sides of the comparison, after which the integral
-values are compared.
-A value is interpreted as hexadecimal if it is
-preceded by 0x, otherwise it is decimal; octal numbers are not supported.
-The standard C relational operators are all supported.
-If after
-variable expansion, either the left or right hand side of a
-.Sq Ic ==
-or
-.Sq Ic !=
-operator is not an integral value, then
-string comparison is performed between the expanded
-variables.
-If no relational operator is given, it is assumed that the expanded
-variable is being compared against 0.
-.Pp
-When
-.Nm
-is evaluating one of these conditional expressions, and it encounters
-a word it does not recognize, either the
-.Dq make
-or
-.Dq defined
-expression is applied to it, depending on the form of the conditional.
-If the form is
-.Ic .if ,
-.Ic .ifdef
-or
-.Ic .ifndef ,
-the
-.Dq defined
-expression is applied.
-Similarly, if the form is
-.Ic .ifmake
-or
-.Ic .ifnmake ,
-the
-.Dq make
-expression is applied.
-.Pp
-If the conditional evaluates to true the parsing of the makefile continues
-as before.
-If it evaluates to false, the following lines are skipped.
-In both cases this continues until a
-.Ic .else
-or
-.Ic .endif
-is found.
-.Pp
-For loops are typically used to apply a set of rules to a list of files.
-The syntax of a for loop is:
-.Pp
-.Bl -tag -width indent -compact
-.It Ic .for Ar variable Ic in Ar expression
-.It <make-rules>
-.It Ic .endfor
-.El
-.Pp
-After the for
-.Ar expression
-is evaluated, it is split into words.
-The
-iteration
-.Ar variable
-is successively set to each word, and substituted in the
-.Ic make-rules
-inside the body of the for loop.
-.Sh COMMENTS
-Comments begin with a hash
-.Pq Ql #
-character, anywhere but in a shell
-command line, and continue to the end of the line.
-.Sh SPECIAL SOURCES
-.Bl -tag -width Ic
-.It Ic .IGNORE
-Ignore any errors from the commands associated with this target, exactly
-as if they all were preceded by a dash
-.Pq Ql \- .
-.It Ic .MAKE
-Execute the commands associated with this target even if the
-.Fl n
-or
-.Fl t
-options were specified.
-Normally used to mark recursive
-.Nm Ns 's .
-.It Ic .NOTMAIN
-Normally
-.Nm
-selects the first target it encounters as the default target to be built
-if no target was specified.
-This source prevents this target from being selected.
-.It Ic .OPTIONAL
-If a target is marked with this attribute and
-.Nm
-cannot figure out how to create it, it will ignore this fact and assume
-the file is not needed or already exists.
-.It Ic .PRECIOUS
-When
-.Nm
-is interrupted, it removes any partially made targets.
-This source prevents the target from being removed.
-.It Ic .SILENT
-Do not echo any of the commands associated with this target, exactly
-as if they all were preceded by an at sign
-.Pq Ql @ .
-.It Ic .USE
-Turn the target into
-.Nm Ns 's
-version of a macro.
-When the target is used as a source for another target, the other target
-acquires the commands, sources, and attributes (except for
-.Ic .USE )
-of the
-source.
-If the target already has commands, the
-.Ic .USE
-target's commands are appended
-to them.
-.It Ic .WAIT
-If special
-.Ic .WAIT
-source appears in a dependency line, the sources that precede it are
-made before the sources that succeed it in the line.
-Loops are not being
-detected and targets that form loops will be silently ignored.
-.El
-.Sh "SPECIAL TARGETS"
-Special targets may not be included with other targets, i.e., they must be
-the only target specified.
-.Bl -tag -width Ic
-.It Ic .BEGIN
-Any command lines attached to this target are executed before anything
-else is done.
-.It Ic .DEFAULT
-This is sort of a
-.Ic .USE
-rule for any target (that was used only as a
-source) that
-.Nm
-cannot figure out any other way to create.
-Only the shell script is used.
-The
-.Ic .IMPSRC
-variable of a target that inherits
-.Ic .DEFAULT Ns 's
-commands is set
-to the target's own name.
-.It Ic .END
-Any command lines attached to this target are executed after everything
-else is done.
-.It Ic .IGNORE
-Mark each of the sources with the
-.Ic .IGNORE
-attribute.
-If no sources are specified, this is the equivalent of specifying the
-.Fl i
-option.
-.It Ic .INCLUDES
-A list of suffixes that indicate files that can be included in a source
-file.
-The suffix must have already been declared with
-.Ic .SUFFIXES ;
-any suffix so declared will have the directories on its search path (see
-.Ic .PATH )
-placed in the
-.Va .INCLUDES
-special variable, each preceded by a
-.Fl I
-flag.
-.It Ic .INTERRUPT
-If
-.Nm
-is interrupted, the commands for this target will be executed.
-.It Ic .LIBS
-This does for libraries what
-.Ic .INCLUDES
-does for include files, except that the flag used is
-.Fl L .
-.It Ic .MAIN
-If no target is specified when
-.Nm
-is invoked, this target will be built.
-This is always set, either
-explicitly, or implicitly when
-.Nm
-selects the default target, to give the user a way to refer to the default
-target on the command line.
-.It Ic .MAKEFILEDEPS
-Enable the
-.Dq Remaking Makefiles
-functionality, as explained in the
-.Sx REMAKING MAKEFILES
-section below.
-.It Ic .MAKEFLAGS
-This target provides a way to specify flags for
-.Nm
-when the makefile is used.
-The flags are as if typed to the shell, though the
-.Fl f
-option will have
-no effect.
-Flags (except for
-.Fl f )
-and variable assignments specified as the source
-for this target are also appended to the
-.Va .MAKEFLAGS
-internal variable.
-Please note the difference between this target and the
-.Va .MAKEFLAGS
-internal variable: specifying an option or variable
-assignment as the source for this target will affect
-.Em both
-the current makefile and all processes that
-.Nm
-executes.
-.It Ic .MFLAGS
-Same as above, for backward compatibility.
-.\" XXX: NOT YET!!!!
-.\" .It Ic .NOTPARALLEL
-.\" The named targets are executed in non parallel mode. If no targets are
-.\" specified, then all targets are executed in non parallel mode.
-.It Ic .NOTPARALLEL
-Disable parallel mode.
-.It Ic .NO_PARALLEL
-Same as above, for compatibility with other
-.Nm pmake
-variants.
-.It Ic .ORDER
-The named targets are made in sequence.
-.\" XXX: NOT YET!!!!
-.\" .It Ic .PARALLEL
-.\" The named targets are executed in parallel mode. If no targets are
-.\" specified, then all targets are executed in parallel mode.
-.It Ic .PATH
-The sources are directories which are to be searched for files not
-found in the current directory.
-If no sources are specified, any previously specified directories are
-deleted.
-Where possible, use of
-.Ic .PATH
-is preferred over use of the
-.Va VPATH
-variable.
-.It Ic .PATH\fIsuffix\fR
-The sources are directories which are to be searched for suffixed files
-not found in the current directory.
-The
-.Nm
-utility
-first searches the suffixed search path, before reverting to the default
-path if the file is not found there.
-This form is required for
-.Ic .LIBS
-and
-.Ic .INCLUDES
-to work.
-.It Ic .PHONY
-Apply the
-.Ic .PHONY
-attribute to any specified sources.
-Targets with this attribute are always
-considered to be out of date.
-.It Ic .POSIX
-Adjust
-.Nm Ap s
-behavior to match the applicable
-.Tn POSIX
-specifications.
-(Note this disables the
-.Dq Remaking Makefiles
-feature.)
-.It Ic .PRECIOUS
-Apply the
-.Ic .PRECIOUS
-attribute to any specified sources.
-If no sources are specified, the
-.Ic .PRECIOUS
-attribute is applied to every
-target in the file.
-.It Ic .SHELL
-Select another shell.
-The sources of this target have the format
-.Ar key Ns = Ns Ar value .
-The
-.Ar key
-is one of:
-.Bl -tag -width ".Va hasErrCtl"
-.It Va path
-Specify the path to the new shell.
-.It Va name
-Specify the name of the new shell.
-This may be either one of the three builtin shells (see below) or any
-other name.
-.It Va quiet
-Specify the shell command to turn echoing off.
-.It Va echo
-Specify the shell command to turn echoing on.
-.It Va filter
-Usually shells print the echo off command before turning echoing off.
-This is the exact string that will be printed by the shell and is used
-to filter the shell output to remove the echo off command.
-.It Va echoFlag
-The shell option that turns echoing on.
-.It Va errFlag
-The shell option to turn on error checking.
-If error checking is on, the shell should exit if a command returns
-a non-zero status.
-.It Va hasErrCtl
-True if the shell has error control.
-.It Va check
-If
-.Va hasErrCtl
-is true then this is the shell command to turn error checking on.
-If
-.Va hasErrCtl
-is false then this is a command template to echo commands for which error
-checking is disabled.
-The template must contain a
-.Ql %s .
-.It Va ignore
-If
-.Va hasErrCtl
-is true, this is the shell command to turn error checking off.
-If
-.Va hasErrCtl
-is false, this is a command template to execute a command so that errors
-are ignored.
-The template must contain a
-.Ql %s .
-.It Va meta
-This is a string of meta characters of the shell.
-.It Va builtins
-This is a string holding all the shell's builtin commands separated by blanks.
-The
-.Va meta
-and
-.Va builtins
-strings are used in compat mode.
-When a command line contains neither a meta
-character nor starts with a shell builtin, it is executed directly without
-invoking a shell.
-When one of these strings (or both) is empty all commands are executed
-through a shell.
-.It Va unsetenv
-If true, remove the
-.Ev ENV
-environment variable before executing any command.
-This is useful for the Korn-shell
-.Pq Nm ksh .
-.El
-.Pp
-Values that are strings must be surrounded by double quotes.
-Boolean values are specified as
-.Ql T
-or
-.Ql Y
-(in either case) to mean true.
-Any other value is taken to mean false.
-.Pp
-There are several uses of the
-.Ic .SHELL
-target:
-.Bl -bullet
-.It
-Selecting one of the builtin shells.
-This is done by just specifying the name of the shell with the
-.Va name
-keyword.
-It is also possible to modify the parameters of the builtin shell by just
-specifying other keywords (except for
-.Va path ) .
-.It
-Using another executable for one of the builtin shells.
-This is done by specifying the path to the executable with the
-.Va path
-keyword.
-If the last component is the same as the name of the builtin shell, no
-name needs to be specified; if it is different, the name must be given:
-.Bd -literal -offset indent
-\&.SHELL: path="/usr/local/bin/sh"
-.Ed
-.Pp
-selects the builtin shell
-.Dq Li sh
-but will execute it from
-.Pa /usr/local/bin/sh .
-Like in the previous case, it is possible to modify parameters of the builtin
-shell by just specifying them.
-.It
-Using an entirely different shell.
-This is done by specifying all keywords.
-.El
-.Pp
-The builtin shells are
-.Dq Li sh ,
-.Dq Li csh
-and
-.Dq Li ksh .
-Because
-.Fx
-has no
-.Nm ksh
-in
-.Pa /bin ,
-it is unwise to specify
-.Va name Ns = Ns Qq Li ksh
-without also specifying a path.
-.It Ic .SILENT
-Apply the
-.Ic .SILENT
-attribute to any specified sources.
-If no sources are specified, the
-.Ic .SILENT
-attribute is applied to every
-command in the file.
-.It Ic .SUFFIXES
-Each source specifies a suffix to
-.Nm .
-If no sources are specified, any previous specified suffices are deleted.
-.It Ic .WARN
-Each source specifies a warning flag as previously described for the
-.Fl x
-command line option.
-Warning flags specified on the command line take precedence over flags
-specified in the makefile.
-Also, command line warning flags are pushed to sub-makes through the
-.Ev MAKEFLAGS
-environment variables so that a warning flag specified on the command
-line will influence all sub-makes.
-Several flags can be specified on a single
-.Ic .WARN
-target by seperating them with blanks.
-.El
-.Sh REMAKING MAKEFILES
-If the special target
-.Ic .MAKEFILEDEPS
-exists in the Makefile,
-.Nm
-enables the
-.Dq Remaking Makefiles
-feature.
-After reading Makefile and all the files that are included using
-.Ic .include
-or
-.Ic .sinclude
-directives (source Makefiles)
-.Nm
-considers each source Makefile as a target and tries to rebuild it.
-Both explicit and implicit rules are checked and all source Makefiles
-are updated if necessary. If any of the source Makefiles were rebuilt,
-.Nm
-restarts from clean state.
-.Pp
-To prevent infinite loops the following source Makefile targets are ignored:
-.Bl -bullet
-.It
-.Ic ::
-targets that have no prerequisites but have commands
-.It
-.Ic !
-targets
-.It
-targets that have
-.Ic .PHONY
-or
-.Ic .EXEC
-attributes
-.It
-targets without prerequisites and without commands
-.El
-.Pp
-When remaking a source Makefile options
-.Ic -t
-(touch target),
-.Ic -q
-(query mode), and
-.Ic -n
-(no exec) do not take effect, unless source Makefile is specified
-explicitly as a target in
-.Nm
-command line.
-.Pp
-Additionally, system makefiles and
-.Ic .depend
-are not considered as Makefiles that can be rebuilt.
-.Sh ENVIRONMENT
-The
-.Nm
-utility uses the following environment variables, if they exist:
-.Ev MACHINE ,
-.Ev MAKE ,
-.Ev MAKEFLAGS ,
-.Ev MAKEOBJDIR ,
-and
-.Ev MAKEOBJDIRPREFIX .
-.Sh FILES
-.Bl -tag -width /usr/share/doc/psd/12.make -compact
-.It Pa .depend
-list of dependencies
-.It Pa Makefile
-list of dependencies
-.It Pa makefile
-list of dependencies
-.It Pa obj
-object directory
-.It Pa sys.mk
-system makefile
-.It Pa /usr/share/mk
-default system makefile directory
-.It Pa /usr/share/doc/psd/12.make
-PMake tutorial
-.It Pa /usr/obj
-default
-.Ev MAKEOBJDIRPREFIX
-directory.
-.It Pa /etc/make.conf
-default path to
-.Xr make.conf 5
-.El
-.Sh EXAMPLES
-List all included makefiles in order visited:
-.Pp
-.Dl "make -V .MAKEFILE_LIST | tr \e\ \e\en"
-.Sh COMPATIBILITY
-Older versions of
-.Nm
-used
-.Ev MAKE
-instead of
-.Ev MAKEFLAGS .
-This was removed for
-.Tn POSIX
-compatibility.
-The internal variable
-.Va MAKE
-is set to the same value as
-.Va .MAKE ;
-support for this may be removed in the future.
-.Pp
-Most of the more esoteric features of
-.Nm
-should probably be avoided for greater compatibility.
-.Sh SEE ALSO
-.Xr mkdep 1 ,
-.Xr make.conf 5
-.Rs
-.%T "PMake - A Tutorial"
-.Re
-in
-.Pa /usr/share/doc/psd/12.make
-.Sh HISTORY
-A
-.Nm
-command appeared in PWB UNIX.
-.Sh BUGS
-The determination of
-.Va .OBJDIR
-is contorted to the point of absurdity.
-.Pp
-In the presence of several
-.Ic .MAIN
-special targets,
-.Nm
-silently ignores all but the first.
-.Pp
-.Va .TARGETS
-is not set to the default target when
-.Nm
-is invoked without a target name and no
-.Ic .MAIN
-special target exists.
-.Pp
-The evaluation of
-.Ar expression
-in a test is very simple-minded.
-Currently, the only form that works is
-.Ql .if ${VAR} op something
-For instance, you should write tests as
-.Ql .if ${VAR} == "string"
-not the other way around, which would give you an error.
-.Pp
-For loops are expanded before tests, so a fragment such as:
-.Bd -literal -offset indent
-\&.for ARCH in ${SHARED_ARCHS}
-\&.if ${ARCH} == ${MACHINE}
- ...
-\&.endif
-\&.endfor
-.Ed
-.Pp
-will not work, and should be rewritten as:
-.Bd -literal -offset indent
-\&.for ARCH in ${SHARED_ARCHS}
-\&.if ${MACHINE} == ${ARCH}
- ...
-\&.endif
-\&.endfor
-.Ed
-.Pp
-The parsing code is broken with respect to handling a semicolon
-after a colon, so a fragment like this will fail:
-.Bd -literal -offset indent
-HDRS= foo.h bar.h
-
-all:
-\&.for h in ${HDRS:S;^;${.CURDIR}/;}
- ...
-\&.endfor
-.Ed
-.Pp
-A trailing backslash in a variable value defined on the command line causes
-the delimiting space in the
-.Ev MAKEFLAGS
-environment variable to be preceded by that backslash.
-That causes a submake to not treat that space as a word delimiter.
-Fixing this requires a larger rewrite of the code handling command line
-macros and assignments to
-.Va .MAKEFLAGS .
diff --git a/usr.bin/make/make.c b/usr.bin/make/make.c
deleted file mode 100644
index 4ac5bb6..0000000
--- a/usr.bin/make/make.c
+++ /dev/null
@@ -1,807 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)make.c 8.1 (Berkeley) 6/6/93
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * make.c
- * The functions which perform the examination of targets and
- * their suitability for creation
- *
- * Interface:
- * Make_Run Initialize things for the module and recreate
- * whatever needs recreating. Returns TRUE if
- * work was (or would have been) done and FALSE
- * otherwise.
- *
- * Make_Update Update all parents of a given child. Performs
- * various bookkeeping chores like the updating
- * of the cmtime field of the parent, filling
- * of the IMPSRC context variable, etc. It will
- * place the parent on the toBeMade queue if it should be.
- *
- * Make_TimeStamp Function to set the parent's cmtime field
- * based on a child's modification time.
- *
- * Make_DoAllVar Set up the various local variables for a
- * target, including the .ALLSRC variable, making
- * sure that any variable that needs to exist
- * at the very least has the empty value.
- *
- * Make_OODate Determine if a target is out-of-date.
- *
- * Make_HandleUse See if a child is a .USE node for a parent
- * and perform the .USE actions if so.
- */
-
-#include <stdlib.h>
-
-#include "arch.h"
-#include "config.h"
-#include "dir.h"
-#include "globals.h"
-#include "GNode.h"
-#include "job.h"
-#include "make.h"
-#include "parse.h"
-#include "suff.h"
-#include "targ.h"
-#include "util.h"
-#include "var.h"
-
-/* The current fringe of the graph. These are nodes which await examination
- * by MakeOODate. It is added to by Make_Update and subtracted from by
- * MakeStartJobs */
-static Lst toBeMade = Lst_Initializer(toBeMade);
-
-/*
- * Number of nodes to be processed. If this is non-zero when Job_Empty()
- * returns TRUE, there's a cycle in the graph.
- */
-static int numNodes;
-
-static Boolean MakeStartJobs(void);
-
-/**
- * Make_TimeStamp
- * Set the cmtime field of a parent node based on the mtime stamp in its
- * child. Called from MakeOODate via LST_FOREACH.
- *
- * Results:
- * Always returns 0.
- *
- * Side Effects:
- * The cmtime of the parent node will be changed if the mtime
- * field of the child is greater than it.
- */
-int
-Make_TimeStamp(GNode *pgn, GNode *cgn)
-{
-
- if (cgn->mtime > pgn->cmtime) {
- pgn->cmtime = cgn->mtime;
- pgn->cmtime_gn = cgn;
- }
- return (0);
-}
-
-/**
- * Make_OODate
- * See if a given node is out of date with respect to its sources.
- * Used by Make_Run when deciding which nodes to place on the
- * toBeMade queue initially and by Make_Update to screen out USE and
- * EXEC nodes. In the latter case, however, any other sort of node
- * must be considered out-of-date since at least one of its children
- * will have been recreated.
- *
- * Results:
- * TRUE if the node is out of date. FALSE otherwise.
- *
- * Side Effects:
- * The mtime field of the node and the cmtime field of its parents
- * will/may be changed.
- */
-Boolean
-Make_OODate(GNode *gn)
-{
- Boolean oodate;
- LstNode *ln;
-
- /*
- * Certain types of targets needn't even be sought as their datedness
- * doesn't depend on their modification time...
- */
- if ((gn->type & (OP_JOIN | OP_USE | OP_EXEC)) == 0) {
- Dir_MTime(gn);
- if (gn->mtime != 0) {
- DEBUGF(MAKE, ("modified %s...",
- Targ_FmtTime(gn->mtime)));
- } else {
- DEBUGF(MAKE, ("non-existent..."));
- }
- }
-
- /*
- * A target is remade in one of the following circumstances:
- * its modification time is smaller than that of its youngest child
- * and it would actually be run (has commands or type OP_NOP)
- * it's the object of a force operator
- * it has no children, was on the lhs of an operator and doesn't
- * exist already.
- *
- * Libraries are only considered out-of-date if the archive module says
- * they are.
- *
- * These weird rules are brought to you by Backward-Compatibility and
- * the strange people who wrote 'Make'.
- */
- if (gn->type & OP_USE) {
- /*
- * If the node is a USE node it is *never* out of date
- * no matter *what*.
- */
- DEBUGF(MAKE, (".USE node..."));
- oodate = FALSE;
-
- } else if (gn->type & OP_LIB) {
- DEBUGF(MAKE, ("library..."));
-
- /*
- * always out of date if no children and :: target
- */
- oodate = Arch_LibOODate(gn) ||
- ((gn->cmtime == 0) && (gn->type & OP_DOUBLEDEP));
-
- } else if (gn->type & OP_JOIN) {
- /*
- * A target with the .JOIN attribute is only considered
- * out-of-date if any of its children was out-of-date.
- */
- DEBUGF(MAKE, (".JOIN node..."));
- oodate = gn->childMade;
-
- } else if (gn->type & (OP_FORCE|OP_EXEC|OP_PHONY)) {
- /*
- * A node which is the object of the force (!) operator or
- * which has the .EXEC attribute is always considered
- * out-of-date.
- */
- if (gn->type & OP_FORCE) {
- DEBUGF(MAKE, ("! operator..."));
- } else if (gn->type & OP_PHONY) {
- DEBUGF(MAKE, (".PHONY node..."));
- } else {
- DEBUGF(MAKE, (".EXEC node..."));
- }
- oodate = TRUE;
-
- } else if ((gn->mtime < gn->cmtime) ||
- ((gn->cmtime == 0) &&
- ((gn->mtime==0) || (gn->type & OP_DOUBLEDEP)))) {
- /*
- * A node whose modification time is less than that of its
- * youngest child or that has no children (cmtime == 0) and
- * either doesn't exist (mtime == 0) or was the object of a
- * :: operator is out-of-date. Why? Because that's the way
- * Make does it.
- */
- if (gn->mtime < gn->cmtime) {
- DEBUGF(MAKE, ("modified before source (%s)...",
- gn->cmtime_gn ? gn->cmtime_gn->path : "???"));
- } else if (gn->mtime == 0) {
- DEBUGF(MAKE, ("non-existent and no sources..."));
- } else {
- DEBUGF(MAKE, (":: operator and no sources..."));
- }
- oodate = TRUE;
- } else
- oodate = FALSE;
-
- /*
- * If the target isn't out-of-date, the parents need to know its
- * modification time. Note that targets that appear to be out-of-date
- * but aren't, because they have no commands and aren't of type OP_NOP,
- * have their mtime stay below their children's mtime to keep parents
- * from thinking they're out-of-date.
- */
- if (!oodate) {
- LST_FOREACH(ln, &gn->parents)
- if (Make_TimeStamp(Lst_Datum(ln), gn))
- break;
- }
-
- return (oodate);
-}
-
-/**
- * Make_HandleUse
- * Function called by Make_Run and SuffApplyTransform on the downward
- * pass to handle .USE and transformation nodes. A callback function
- * for LST_FOREACH, it implements the .USE and transformation
- * functionality by copying the node's commands, type flags
- * and children to the parent node. Should be called before the
- * children are enqueued to be looked at.
- *
- * A .USE node is much like an explicit transformation rule, except
- * its commands are always added to the target node, even if the
- * target already has commands.
- *
- * Results:
- * returns 0.
- *
- * Side Effects:
- * Children and commands may be added to the parent and the parent's
- * type may be changed.
- *
- *-----------------------------------------------------------------------
- */
-int
-Make_HandleUse(GNode *cgn, GNode *pgn)
-{
- GNode *gn; /* A child of the .USE node */
- LstNode *ln; /* An element in the children list */
-
- if (cgn->type & (OP_USE | OP_TRANSFORM)) {
- if ((cgn->type & OP_USE) || Lst_IsEmpty(&pgn->commands)) {
- /*
- * .USE or transformation and target has no commands --
- * append the child's commands to the parent.
- */
- Lst_Concat(&pgn->commands, &cgn->commands, LST_CONCNEW);
- }
-
- for (ln = Lst_First(&cgn->children); ln != NULL;
- ln = Lst_Succ(ln)) {
- gn = Lst_Datum(ln);
-
- if (Lst_Member(&pgn->children, gn) == NULL) {
- Lst_AtEnd(&pgn->children, gn);
- Lst_AtEnd(&gn->parents, pgn);
- pgn->unmade += 1;
- }
- }
-
- pgn->type |= cgn->type & ~(OP_OPMASK | OP_USE | OP_TRANSFORM);
-
- /*
- * This child node is now "made", so we decrement the count of
- * unmade children in the parent... We also remove the child
- * from the parent's list to accurately reflect the number of
- * decent children the parent has. This is used by Make_Run to
- * decide whether to queue the parent or examine its children...
- */
- if (cgn->type & OP_USE) {
- pgn->unmade--;
- }
- }
- return (0);
-}
-
-/**
- * Make_Update
- * Perform update on the parents of a node. Used by JobFinish once
- * a node has been dealt with and by MakeStartJobs if it finds an
- * up-to-date node.
- *
- * Results:
- * Always returns 0
- *
- * Side Effects:
- * The unmade field of pgn is decremented and pgn may be placed on
- * the toBeMade queue if this field becomes 0.
- *
- * If the child was made, the parent's childMade field will be set true
- * and its cmtime set to now.
- *
- * If the child wasn't made, the cmtime field of the parent will be
- * altered if the child's mtime is big enough.
- *
- * Finally, if the child is the implied source for the parent, the
- * parent's IMPSRC variable is set appropriately.
- */
-void
-Make_Update(GNode *cgn)
-{
- GNode *pgn; /* the parent node */
- const char *cname; /* the child's name */
- LstNode *ln; /* Element in parents and iParents lists */
- const char *cpref;
-
- cname = Var_Value(TARGET, cgn);
-
- /*
- * If the child was actually made, see what its modification time is
- * now -- some rules won't actually update the file. If the file still
- * doesn't exist, make its mtime now.
- */
- if (cgn->made != UPTODATE) {
-#ifndef RECHECK
- /*
- * We can't re-stat the thing, but we can at least take care
- * of rules where a target depends on a source that actually
- * creates the target, but only if it has changed, e.g.
- *
- * parse.h : parse.o
- *
- * parse.o : parse.y
- * yacc -d parse.y
- * cc -c y.tab.c
- * mv y.tab.o parse.o
- * cmp -s y.tab.h parse.h || mv y.tab.h parse.h
- *
- * In this case, if the definitions produced by yacc haven't
- * changed from before, parse.h won't have been updated and
- * cgn->mtime will reflect the current modification time for
- * parse.h. This is something of a kludge, I admit, but it's a
- * useful one..
- * XXX: People like to use a rule like
- *
- * FRC:
- *
- * To force things that depend on FRC to be made, so we have to
- * check for gn->children being empty as well...
- */
- if (!Lst_IsEmpty(&cgn->commands) ||
- Lst_IsEmpty(&cgn->children)) {
- cgn->mtime = now;
- }
- #else
- /*
- * This is what Make does and it's actually a good thing, as it
- * allows rules like
- *
- * cmp -s y.tab.h parse.h || cp y.tab.h parse.h
- *
- * to function as intended. Unfortunately, thanks to the
- * stateless nature of NFS (by which I mean the loose coupling
- * of two clients using the same file from a common server),
- * there are times when the modification time of a file created
- * on a remote machine will not be modified before the local
- * stat() implied by the Dir_MTime occurs, thus leading us to
- * believe that the file is unchanged, wreaking havoc with
- * files that depend on this one.
- *
- * I have decided it is better to make too much than to make too
- * little, so this stuff is commented out unless you're sure
- * it's ok.
- * -- ardeb 1/12/88
- */
- /*
- * Christos, 4/9/92: If we are saving commands pretend that
- * the target is made now. Otherwise archives with ... rules
- * don't work!
- */
- if (noExecute || (cgn->type & OP_SAVE_CMDS) ||
- Dir_MTime(cgn) == 0) {
- cgn->mtime = now;
- }
- DEBUGF(MAKE, ("update time: %s\n", Targ_FmtTime(cgn->mtime)));
-#endif
- }
-
- for (ln = Lst_First(&cgn->parents); ln != NULL; ln = Lst_Succ(ln)) {
- pgn = Lst_Datum(ln);
- if (pgn->make) {
- pgn->unmade -= 1;
-
- if (!(cgn->type & (OP_EXEC | OP_USE))) {
- if (cgn->made == MADE)
- pgn->childMade = TRUE;
- Make_TimeStamp(pgn, cgn);
- }
- if (pgn->unmade == 0) {
- /*
- * Queue the node up -- any unmade predecessors
- * will be dealt with in MakeStartJobs.
- */
- Lst_EnQueue(&toBeMade, pgn);
- } else if (pgn->unmade < 0) {
- Error("Graph cycles through %s", pgn->name);
- }
- }
- }
-
- /*
- * Deal with successor nodes. If any is marked for making and has an
- * unmade count of 0, has not been made and isn't in the examination
- * queue, it means we need to place it in the queue as it restrained
- * itself before.
- */
- for (ln = Lst_First(&cgn->successors); ln != NULL; ln = Lst_Succ(ln)) {
- GNode *succ = Lst_Datum(ln);
-
- if (succ->make && succ->unmade == 0 && succ->made == UNMADE &&
- Lst_Member(&toBeMade, succ) == NULL) {
- Lst_EnQueue(&toBeMade, succ);
- }
- }
-
- /*
- * Set the .PREFIX and .IMPSRC variables for all the implied parents
- * of this node.
- */
- cpref = Var_Value(PREFIX, cgn);
- for (ln = Lst_First(&cgn->iParents); ln != NULL; ln = Lst_Succ(ln)) {
- pgn = Lst_Datum(ln);
- if (pgn->make) {
- Var_Set(IMPSRC, cname, pgn);
- Var_Set(PREFIX, cpref, pgn);
- }
- }
-}
-
-/**
- * Make_DoAllVar
- * Set up the ALLSRC and OODATE variables. Sad to say, it must be
- * done separately, rather than while traversing the graph. This is
- * because Make defined OODATE to contain all sources whose modification
- * times were later than that of the target, *not* those sources that
- * were out-of-date. Since in both compatibility and native modes,
- * the modification time of the parent isn't found until the child
- * has been dealt with, we have to wait until now to fill in the
- * variable. As for ALLSRC, the ordering is important and not
- * guaranteed when in native mode, so it must be set here, too.
- *
- * Side Effects:
- * The ALLSRC and OODATE variables of the given node is filled in.
- * If the node is a .JOIN node, its TARGET variable will be set to
- * match its ALLSRC variable.
- */
-void
-Make_DoAllVar(GNode *gn)
-{
- LstNode *ln;
- GNode *cgn;
- const char *child;
-
- LST_FOREACH(ln, &gn->children) {
- /*
- * Add the child's name to the ALLSRC and OODATE variables of
- * the given node. The child is added only if it has not been
- * given the .EXEC, .USE or .INVISIBLE attributes. .EXEC and
- * .USE children are very rarely going to be files, so...
- *
- * A child is added to the OODATE variable if its modification
- * time is later than that of its parent, as defined by Make,
- * except if the parent is a .JOIN node. In that case, it is
- * only added to the OODATE variable if it was actually made
- * (since .JOIN nodes don't have modification times, the
- * comparison is rather unfair...).
- */
- cgn = Lst_Datum(ln);
-
- if ((cgn->type & (OP_EXEC | OP_USE | OP_INVISIBLE)) == 0) {
- if (OP_NOP(cgn->type)) {
- /*
- * this node is only source; use the specific
- * pathname for it
- */
- child = cgn->path ? cgn->path : cgn->name;
- } else
- child = Var_Value(TARGET, cgn);
- Var_Append(ALLSRC, child, gn);
- if (gn->type & OP_JOIN) {
- if (cgn->made == MADE) {
- Var_Append(OODATE, child, gn);
- }
- } else if (gn->mtime < cgn->mtime ||
- (cgn->mtime >= now && cgn->made == MADE)) {
- /*
- * It goes in the OODATE variable if the parent
- * is younger than the child or if the child has
- * been modified more recently than the start of
- * the make. This is to keep pmake from getting
- * confused if something else updates the parent
- * after the make starts (shouldn't happen, I
- * know, but sometimes it does). In such a case,
- * if we've updated the kid, the parent is
- * likely to have a modification time later than
- * that of the kid and anything that relies on
- * the OODATE variable will be hosed.
- *
- * XXX: This will cause all made children to
- * go in the OODATE variable, even if they're
- * not touched, if RECHECK isn't defined, since
- * cgn->mtime is set to now in Make_Update.
- * According to some people, this is good...
- */
- Var_Append(OODATE, child, gn);
- }
- }
- }
-
- if (!Var_Exists (OODATE, gn)) {
- Var_Set(OODATE, "", gn);
- }
- if (!Var_Exists (ALLSRC, gn)) {
- Var_Set(ALLSRC, "", gn);
- }
-
- if (gn->type & OP_JOIN) {
- Var_Set(TARGET, Var_Value(ALLSRC, gn), gn);
- }
-}
-
-/**
- * MakeStartJobs
- * Start as many jobs as possible.
- *
- * Results:
- * If the query flag was given to pmake, no job will be started,
- * but as soon as an out-of-date target is found, this function
- * returns TRUE. At all other times, this function returns FALSE.
- *
- * Side Effects:
- * Nodes are removed from the toBeMade queue and job table slots
- * are filled.
- */
-static Boolean
-MakeStartJobs(void)
-{
- GNode *gn;
-
- while (!Lst_IsEmpty(&toBeMade) && !Job_Full()) {
- gn = Lst_DeQueue(&toBeMade);
- DEBUGF(MAKE, ("Examining %s...", gn->name));
-
- /*
- * Make sure any and all predecessors that are going to be made,
- * have been.
- */
- if (!Lst_IsEmpty(&gn->preds)) {
- LstNode *ln;
-
- for (ln = Lst_First(&gn->preds); ln != NULL;
- ln = Lst_Succ(ln)){
- GNode *pgn = Lst_Datum(ln);
-
- if (pgn->make && pgn->made == UNMADE) {
- DEBUGF(MAKE, ("predecessor %s not made "
- "yet.\n", pgn->name));
- break;
- }
- }
- /*
- * If ln isn't NULL, there's a predecessor as yet
- * unmade, so we just drop this node on the floor.
- * When the node in question has been made, it will
- * notice this node as being ready to make but as yet
- * unmade and will place the node on the queue.
- */
- if (ln != NULL) {
- continue;
- }
- }
-
- numNodes--;
- if (Make_OODate(gn)) {
- DEBUGF(MAKE, ("out-of-date\n"));
- if (queryFlag) {
- return (TRUE);
- }
- Make_DoAllVar(gn);
- Job_Make(gn);
- } else {
- DEBUGF(MAKE, ("up-to-date\n"));
- gn->made = UPTODATE;
- if (gn->type & OP_JOIN) {
- /*
- * Even for an up-to-date .JOIN node, we need
- * it to have its context variables so
- * references to it get the correct value for
- * .TARGET when building up the context
- * variables of its parent(s)...
- */
- Make_DoAllVar(gn);
- }
-
- Make_Update(gn);
- }
- }
- return (FALSE);
-}
-
-/**
- * MakePrintStatus
- * Print the status of a top-level node, viz. it being up-to-date
- * already or not created due to an error in a lower level.
- * Callback function for Make_Run via LST_FOREACH. If gn->unmade is
- * nonzero and that is meant to imply a cycle in the graph, then
- * cycle is TRUE.
- *
- * Side Effects:
- * A message may be printed.
- */
-static void
-MakePrintStatus(GNode *gn, Boolean cycle)
-{
- LstNode *ln;
-
- if (gn->made == UPTODATE) {
- printf("`%s' is up to date.\n", gn->name);
-
- } else if (gn->unmade != 0) {
- if (cycle) {
- /*
- * If printing cycles and came to one that has unmade
- * children, print out the cycle by recursing on its
- * children. Note a cycle like:
- * a : b
- * b : c
- * c : b
- * will cause this to erroneously complain about a
- * being in the cycle, but this is a good approximation.
- */
- if (gn->made == CYCLE) {
- Error("Graph cycles through `%s'", gn->name);
- gn->made = ENDCYCLE;
- LST_FOREACH(ln, &gn->children)
- MakePrintStatus(Lst_Datum(ln), TRUE);
- gn->made = UNMADE;
- } else if (gn->made != ENDCYCLE) {
- gn->made = CYCLE;
- LST_FOREACH(ln, &gn->children)
- MakePrintStatus(Lst_Datum(ln), TRUE);
- }
- } else {
- printf("`%s' not remade because of errors.\n",
- gn->name);
- }
- }
-}
-
-/**
- * Make_Run
- * Initialize the nodes to remake and the list of nodes which are
- * ready to be made by doing a breadth-first traversal of the graph
- * starting from the nodes in the given list. Once this traversal
- * is finished, all the 'leaves' of the graph are in the toBeMade
- * queue.
- * Using this queue and the Job module, work back up the graph,
- * calling on MakeStartJobs to keep the job table as full as
- * possible.
- *
- * Results:
- * TRUE if work was done. FALSE otherwise.
- *
- * Side Effects:
- * The make field of all nodes involved in the creation of the given
- * targets is set to 1. The toBeMade list is set to contain all the
- * 'leaves' of these subgraphs.
- */
-Boolean
-Make_Run(Lst *targs)
-{
- GNode *gn; /* a temporary pointer */
- GNode *cgn;
- Lst examine; /* List of targets to examine */
- int errors; /* Number of errors the Job module reports */
- LstNode *ln;
-
- Lst_Init(&examine);
- Lst_Duplicate(&examine, targs, NOCOPY);
- numNodes = 0;
-
- /*
- * Make an initial downward pass over the graph, marking nodes to be
- * made as we go down. We call Suff_FindDeps to find where a node is and
- * to get some children for it if it has none and also has no commands.
- * If the node is a leaf, we stick it on the toBeMade queue to
- * be looked at in a minute, otherwise we add its children to our queue
- * and go on about our business.
- */
- while (!Lst_IsEmpty(&examine)) {
- gn = Lst_DeQueue(&examine);
-
- if (!gn->make) {
- gn->make = TRUE;
- numNodes++;
-
- /*
- * Apply any .USE rules before looking for implicit
- * dependencies to make sure everything has commands
- * that should...
- */
- LST_FOREACH(ln, &gn->children)
- if (Make_HandleUse(Lst_Datum(ln), gn))
- break;
-
- Suff_FindDeps(gn);
-
- if (gn->unmade != 0) {
- LST_FOREACH(ln, &gn->children) {
- cgn = Lst_Datum(ln);
- if (!cgn->make && !(cgn->type & OP_USE))
- Lst_EnQueue(&examine, cgn);
- }
- } else {
- Lst_EnQueue(&toBeMade, gn);
- }
- }
- }
-
- if (queryFlag) {
- /*
- * We wouldn't do any work unless we could start some jobs in
- * the next loop... (we won't actually start any, of course,
- * this is just to see if any of the targets was out of date)
- */
- return (MakeStartJobs());
-
- } else {
- /*
- * Initialization. At the moment, no jobs are running and
- * until some get started, nothing will happen since the
- * remaining upward traversal of the graph is performed by the
- * routines in job.c upon the finishing of a job. So we fill
- * the Job table as much as we can before going into our loop.
- */
- MakeStartJobs();
- }
-
- /*
- * Main Loop: The idea here is that the ending of jobs will take
- * care of the maintenance of data structures and the waiting for output
- * will cause us to be idle most of the time while our children run as
- * much as possible. Because the job table is kept as full as possible,
- * the only time when it will be empty is when all the jobs which need
- * running have been run, so that is the end condition of this loop.
- * Note that the Job module will exit if there were any errors unless
- * the keepgoing flag was given.
- */
- while (!Job_Empty()) {
- Job_CatchOutput(!Lst_IsEmpty(&toBeMade));
- Job_CatchChildren(!usePipes);
- MakeStartJobs();
- }
-
- errors = Job_Finish();
-
- /*
- * Print the final status of each target. E.g. if it wasn't made
- * because some inferior reported an error.
- */
- errors = ((errors == 0) && (numNodes != 0));
- LST_FOREACH(ln, targs)
- MakePrintStatus(Lst_Datum(ln), errors);
-
- return (TRUE);
-}
diff --git a/usr.bin/make/make.h b/usr.bin/make/make.h
deleted file mode 100644
index 2386cd7..0000000
--- a/usr.bin/make/make.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)make.h 8.3 (Berkeley) 6/13/95
- * $FreeBSD$
- */
-
-#ifndef make_h_a91074b9
-#define make_h_a91074b9
-
-/**
- * make.h
- * The global definitions for make
- */
-
-#include "util.h"
-
-struct GNode;
-struct Lst;
-struct Buffer;
-
-/*
- * Warning flags
- */
-enum {
- WARN_DIRSYNTAX = 0x0001, /* syntax errors in directives */
-};
-
-int Make_TimeStamp(struct GNode *, struct GNode *);
-Boolean Make_OODate(struct GNode *);
-int Make_HandleUse(struct GNode *, struct GNode *);
-void Make_Update(struct GNode *);
-void Make_DoAllVar(struct GNode *);
-Boolean Make_Run(struct Lst *);
-void Main_ParseArgLine(char *, int);
-int Main_ParseWarn(const char *, int);
-void Main_AddSourceMakefile(const char *);
-
-#endif /* make_h_a91074b9 */
diff --git a/usr.bin/make/parse.c b/usr.bin/make/parse.c
deleted file mode 100644
index 3e8cb93..0000000
--- a/usr.bin/make/parse.c
+++ /dev/null
@@ -1,2539 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)parse.c 8.3 (Berkeley) 3/19/94
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*-
- * parse.c --
- * Functions to parse a makefile.
- *
- * Most important structures are kept in Lsts. Directories for
- * the #include "..." function are kept in the 'parseIncPath' Lst, while
- * those for the #include <...> are kept in the 'sysIncPath' Lst. The
- * targets currently being defined are kept in the 'targets' Lst.
- *
- * Interface:
- *
- * Parse_File Function used to parse a makefile. It must
- * be given the name of the file, which should
- * already have been opened, and a function
- * to call to read a character from the file.
- *
- * Parse_IsVar Returns TRUE if the given line is a
- * variable assignment. Used by MainParseArgs
- * to determine if an argument is a target
- * or a variable assignment. Used internally
- * for pretty much the same thing...
- *
- * Parse_Error Function called when an error occurs in
- * parsing. Used by the variable and
- * conditional modules.
- *
- * Parse_MainName Returns a Lst of the main target to create.
- */
-
-#include <assert.h>
-#include <ctype.h>
-#include <stdarg.h>
-#include <string.h>
-#include <stdlib.h>
-#include <err.h>
-
-#include "arch.h"
-#include "buf.h"
-#include "cond.h"
-#include "config.h"
-#include "dir.h"
-#include "for.h"
-#include "globals.h"
-#include "GNode.h"
-#include "hash_tables.h"
-#include "job.h"
-#include "make.h"
-#include "parse.h"
-#include "pathnames.h"
-#include "shell.h"
-#include "str.h"
-#include "suff.h"
-#include "targ.h"
-#include "util.h"
-#include "var.h"
-
-/*
- * These values are returned by ParsePopInput to tell Parse_File whether to
- * CONTINUE parsing, i.e. it had only reached the end of an include file,
- * or if it's DONE.
- */
-#define CONTINUE 1
-#define DONE 0
-
-/* targets we're working on */
-static Lst targets = Lst_Initializer(targets);
-
-/* true if currently in a dependency line or its commands */
-static Boolean inLine;
-
-static int fatals = 0;
-
-/*
- * The main target to create. This is the first target on the
- * first dependency line in the first makefile.
- */
-static GNode *mainNode;
-
-/*
- * Definitions for handling #include specifications
- */
-struct IFile {
- char *fname; /* name of previous file */
- int lineno; /* saved line number */
- FILE *F; /* the open stream */
- char *str; /* the string when parsing a string */
- char *ptr; /* the current pointer when parsing a string */
- TAILQ_ENTRY(IFile) link;/* stack the files */
-};
-
-/* stack of IFiles generated by * #includes */
-static TAILQ_HEAD(, IFile) includes = TAILQ_HEAD_INITIALIZER(includes);
-
-/* access current file */
-#define CURFILE (TAILQ_FIRST(&includes))
-
-/* list of directories for "..." includes */
-struct Path parseIncPath = TAILQ_HEAD_INITIALIZER(parseIncPath);
-
-/* list of directories for <...> includes */
-struct Path sysIncPath = TAILQ_HEAD_INITIALIZER(sysIncPath);
-
-/*
- * specType contains the SPECial TYPE of the current target. It is
- * Not if the target is unspecial. If it *is* special, however, the children
- * are linked as children of the parent but not vice versa. This variable is
- * set in ParseDoDependency
- */
-typedef enum {
- Begin, /* .BEGIN */
- Default, /* .DEFAULT */
- End, /* .END */
- ExportVar, /* .EXPORTVAR */
- Ignore, /* .IGNORE */
- Includes, /* .INCLUDES */
- Interrupt, /* .INTERRUPT */
- Libs, /* .LIBS */
- MFlags, /* .MFLAGS or .MAKEFLAGS */
- Main, /* .MAIN and we don't have anyth. user-spec. to make */
- Not, /* Not special */
- NotParallel, /* .NOTPARALELL */
- Null, /* .NULL */
- Order, /* .ORDER */
- Parallel, /* .PARALLEL */
- ExPath, /* .PATH */
- Phony, /* .PHONY */
- Posix, /* .POSIX */
- MakefileDeps, /* .MAKEFILEDEPS */
- Precious, /* .PRECIOUS */
- ExShell, /* .SHELL */
- Silent, /* .SILENT */
- SingleShell, /* .SINGLESHELL */
- Suffixes, /* .SUFFIXES */
- Wait, /* .WAIT */
- Warn, /* .WARN */
- Attribute /* Generic attribute */
-} ParseSpecial;
-
-static ParseSpecial specType;
-static int waiting;
-
-/*
- * Predecessor node for handling .ORDER. Initialized to NULL when .ORDER
- * seen, then set to each successive source on the line.
- */
-static GNode *predecessor;
-
-/*
- * The parseKeywords table is searched using binary search when deciding
- * if a target or source is special. The 'spec' field is the ParseSpecial
- * type of the keyword ("Not" if the keyword isn't special as a target) while
- * the 'op' field is the operator to apply to the list of targets if the
- * keyword is used as a source ("0" if the keyword isn't special as a source)
- */
-static const struct keyword {
- const char *name; /* Name of keyword */
- ParseSpecial spec; /* Type when used as a target */
- int op; /* Operator when used as a source */
-} parseKeywords[] = {
- /* KEYWORD-START-TAG */
- { ".BEGIN", Begin, 0 },
- { ".DEFAULT", Default, 0 },
- { ".END", End, 0 },
- { ".EXEC", Attribute, OP_EXEC },
- { ".EXPORTVAR", ExportVar, 0 },
- { ".IGNORE", Ignore, OP_IGNORE },
- { ".INCLUDES", Includes, 0 },
- { ".INTERRUPT", Interrupt, 0 },
- { ".INVISIBLE", Attribute, OP_INVISIBLE },
- { ".JOIN", Attribute, OP_JOIN },
- { ".LIBS", Libs, 0 },
- { ".MAIN", Main, 0 },
- { ".MAKE", Attribute, OP_MAKE },
- { ".MAKEFILEDEPS", MakefileDeps, 0 },
- { ".MAKEFLAGS", MFlags, 0 },
- { ".MFLAGS", MFlags, 0 },
- { ".NOTMAIN", Attribute, OP_NOTMAIN },
- { ".NOTPARALLEL", NotParallel, 0 },
- { ".NO_PARALLEL", NotParallel, 0 },
- { ".NULL", Null, 0 },
- { ".OPTIONAL", Attribute, OP_OPTIONAL },
- { ".ORDER", Order, 0 },
- { ".PARALLEL", Parallel, 0 },
- { ".PATH", ExPath, 0 },
- { ".PHONY", Phony, OP_PHONY },
- { ".POSIX", Posix, 0 },
- { ".PRECIOUS", Precious, OP_PRECIOUS },
- { ".RECURSIVE", Attribute, OP_MAKE },
- { ".SHELL", ExShell, 0 },
- { ".SILENT", Silent, OP_SILENT },
- { ".SINGLESHELL", SingleShell, 0 },
- { ".SUFFIXES", Suffixes, 0 },
- { ".USE", Attribute, OP_USE },
- { ".WAIT", Wait, 0 },
- { ".WARN", Warn, 0 },
- /* KEYWORD-END-TAG */
-};
-#define NKEYWORDS (sizeof(parseKeywords) / sizeof(parseKeywords[0]))
-
-static void parse_include(char *, int, int);
-static void parse_sinclude(char *, int, int);
-static void parse_message(char *, int, int);
-static void parse_undef(char *, int, int);
-static void parse_for(char *, int, int);
-static void parse_endfor(char *, int, int);
-
-static const struct directive {
- const char *name;
- int code;
- Boolean skip_flag; /* execute even when skipped */
- void (*func)(char *, int, int);
-} directives[] = {
- /* DIRECTIVES-START-TAG */
- { "elif", COND_ELIF, TRUE, Cond_If },
- { "elifdef", COND_ELIFDEF, TRUE, Cond_If },
- { "elifmake", COND_ELIFMAKE, TRUE, Cond_If },
- { "elifndef", COND_ELIFNDEF, TRUE, Cond_If },
- { "elifnmake", COND_ELIFNMAKE, TRUE, Cond_If },
- { "else", COND_ELSE, TRUE, Cond_Else },
- { "endfor", 0, FALSE, parse_endfor },
- { "endif", COND_ENDIF, TRUE, Cond_Endif },
- { "error", 1, FALSE, parse_message },
- { "for", 0, FALSE, parse_for },
- { "if", COND_IF, TRUE, Cond_If },
- { "ifdef", COND_IFDEF, TRUE, Cond_If },
- { "ifmake", COND_IFMAKE, TRUE, Cond_If },
- { "ifndef", COND_IFNDEF, TRUE, Cond_If },
- { "ifnmake", COND_IFNMAKE, TRUE, Cond_If },
- { "include", 0, FALSE, parse_include },
- { "sinclude", 0, FALSE, parse_sinclude },
- { "undef", 0, FALSE, parse_undef },
- { "warning", 0, FALSE, parse_message },
- /* DIRECTIVES-END-TAG */
-};
-#define NDIRECTS (sizeof(directives) / sizeof(directives[0]))
-
-/*-
- * ParseFindKeyword
- * Look in the table of keywords for one matching the given string.
- *
- * Results:
- * The pointer to keyword table entry or NULL.
- */
-static const struct keyword *
-ParseFindKeyword(const char *str)
-{
- int kw;
-
- kw = keyword_hash(str, strlen(str));
- if (kw < 0 || kw >= (int)NKEYWORDS ||
- strcmp(str, parseKeywords[kw].name) != 0)
- return (NULL);
- return (&parseKeywords[kw]);
-}
-
-/*-
- * Parse_Error --
- * Error message abort function for parsing. Prints out the context
- * of the error (line number and file) as well as the message with
- * two optional arguments.
- *
- * Results:
- * None
- *
- * Side Effects:
- * "fatals" is incremented if the level is PARSE_FATAL.
- */
-/* VARARGS */
-void
-Parse_Error(int type, const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- if (CURFILE != NULL)
- fprintf(stderr, "\"%s\", line %d: ",
- CURFILE->fname, CURFILE->lineno);
- if (type == PARSE_WARNING)
- fprintf(stderr, "warning: ");
- vfprintf(stderr, fmt, ap);
- va_end(ap);
- fprintf(stderr, "\n");
- fflush(stderr);
- if (type == PARSE_FATAL)
- fatals += 1;
-}
-
-/**
- * ParsePushInput
- *
- * Push a new input source onto the input stack. If ptr is NULL
- * the fullname is used to fopen the file. If it is not NULL,
- * ptr is assumed to point to the string to be parsed. If opening the
- * file fails, the fullname is freed.
- */
-static void
-ParsePushInput(char *fullname, FILE *fp, char *ptr, int lineno)
-{
- struct IFile *nf;
-
- nf = emalloc(sizeof(*nf));
- nf->fname = fullname;
- nf->lineno = lineno;
-
- if (ptr == NULL) {
- /* the input source is a file */
- if ((nf->F = fp) == NULL) {
- nf->F = fopen(fullname, "r");
- if (nf->F == NULL) {
- Parse_Error(PARSE_FATAL, "Cannot open %s",
- fullname);
- free(fullname);
- free(nf);
- return;
- }
- }
- nf->str = nf->ptr = NULL;
- Var_Append(".MAKEFILE_LIST", fullname, VAR_GLOBAL);
- } else {
- nf->str = nf->ptr = ptr;
- nf->F = NULL;
- }
- TAILQ_INSERT_HEAD(&includes, nf, link);
-}
-
-/**
- * ParsePopInput
- * Called when EOF is reached in the current file. If we were reading
- * an include file, the includes stack is popped and things set up
- * to go back to reading the previous file at the previous location.
- *
- * Results:
- * CONTINUE if there's more to do. DONE if not.
- *
- * Side Effects:
- * The old curFile.F is closed. The includes list is shortened.
- * curFile.lineno, curFile.F, and curFile.fname are changed if
- * CONTINUE is returned.
- */
-static int
-ParsePopInput(void)
-{
- struct IFile *ifile; /* the state on the top of the includes stack */
-
- assert(!TAILQ_EMPTY(&includes));
-
- ifile = TAILQ_FIRST(&includes);
- TAILQ_REMOVE(&includes, ifile, link);
-
- free(ifile->fname);
- if (ifile->F != NULL) {
- fclose(ifile->F);
- Var_Append(".MAKEFILE_LIST", "..", VAR_GLOBAL);
- }
- if (ifile->str != NULL) {
- free(ifile->str);
- }
- free(ifile);
-
- return (TAILQ_EMPTY(&includes) ? DONE : CONTINUE);
-}
-
-/**
- * parse_warn
- * Parse the .WARN pseudo-target.
- */
-static void
-parse_warn(char *line)
-{
- ArgArray aa;
- int i;
-
- brk_string(&aa, line, TRUE);
-
- for (i = 1; i < aa.argc; i++)
- Main_ParseWarn(aa.argv[i], 0);
-}
-
-/*-
- *---------------------------------------------------------------------
- * ParseLinkSrc --
- * Link the parent nodes to their new child. Used by
- * ParseDoDependency. If the specType isn't 'Not', the parent
- * isn't linked as a parent of the child.
- *
- * Side Effects:
- * New elements are added to the parents lists of cgn and the
- * children list of cgn. the unmade field of pgn is updated
- * to reflect the additional child.
- *---------------------------------------------------------------------
- */
-static void
-ParseLinkSrc(Lst *parents, GNode *cgn)
-{
- LstNode *ln;
- GNode *pgn;
-
- LST_FOREACH(ln, parents) {
- pgn = Lst_Datum(ln);
- if (Lst_Member(&pgn->children, cgn) == NULL) {
- Lst_AtEnd(&pgn->children, cgn);
- if (specType == Not) {
- Lst_AtEnd(&cgn->parents, pgn);
- }
- pgn->unmade += 1;
- }
- }
-}
-
-/*-
- *---------------------------------------------------------------------
- * ParseDoOp --
- * Apply the parsed operator to all target nodes. Used in
- * ParseDoDependency once all targets have been found and their
- * operator parsed. If the previous and new operators are incompatible,
- * a major error is taken.
- *
- * Side Effects:
- * The type field of the node is altered to reflect any new bits in
- * the op.
- *---------------------------------------------------------------------
- */
-static void
-ParseDoOp(int op)
-{
- GNode *cohort;
- LstNode *ln;
- GNode *gn;
-
- LST_FOREACH(ln, &targets) {
- gn = Lst_Datum(ln);
-
- /*
- * If the dependency mask of the operator and the node don't
- * match and the node has actually had an operator applied to
- * it before, and the operator actually has some dependency
- * information in it, complain.
- */
- if ((op & OP_OPMASK) != (gn->type & OP_OPMASK) &&
- !OP_NOP(gn->type) && !OP_NOP(op)) {
- Parse_Error(PARSE_FATAL, "Inconsistent operator for %s",
- gn->name);
- return;
- }
-
- if (op == OP_DOUBLEDEP &&
- (gn->type & OP_OPMASK) == OP_DOUBLEDEP) {
- /*
- * If the node was the object of a :: operator, we need
- * to create a new instance of it for the children and
- * commands on this dependency line. The new instance
- * is placed on the 'cohorts' list of the initial one
- * (note the initial one is not on its own cohorts list)
- * and the new instance is linked to all parents of the
- * initial instance.
- */
- cohort = Targ_NewGN(gn->name);
-
- /*
- * Duplicate links to parents so graph traversal is
- * simple. Perhaps some type bits should be duplicated?
- *
- * Make the cohort invisible as well to avoid
- * duplicating it into other variables. True, parents
- * of this target won't tend to do anything with their
- * local variables, but better safe than sorry.
- */
- ParseLinkSrc(&gn->parents, cohort);
- cohort->type = OP_DOUBLEDEP|OP_INVISIBLE;
- Lst_AtEnd(&gn->cohorts, cohort);
-
- /*
- * Replace the node in the targets list with the
- * new copy
- */
- Lst_Replace(ln, cohort);
- gn = cohort;
- }
- /*
- * We don't want to nuke any previous flags (whatever they were)
- * so we just OR the new operator into the old
- */
- gn->type |= op;
- }
-}
-
-/*-
- *---------------------------------------------------------------------
- * ParseDoSrc --
- * Given the name of a source, figure out if it is an attribute
- * and apply it to the targets if it is. Else decide if there is
- * some attribute which should be applied *to* the source because
- * of some special target and apply it if so. Otherwise, make the
- * source be a child of the targets in the list 'targets'
- *
- * Results:
- * None
- *
- * Side Effects:
- * Operator bits may be added to the list of targets or to the source.
- * The targets may have a new source added to their lists of children.
- *---------------------------------------------------------------------
- */
-static void
-ParseDoSrc(int tOp, char *src, Lst *allsrc)
-{
- GNode *gn = NULL;
- const struct keyword *kw;
-
- if (src[0] == '.' && isupper ((unsigned char)src[1])) {
- if ((kw = ParseFindKeyword(src)) != NULL) {
- if (kw->op != 0) {
- ParseDoOp(kw->op);
- return;
- }
- if (kw->spec == Wait) {
- waiting++;
- return;
- }
- }
- }
-
- switch (specType) {
- case Main:
- /*
- * If we have noted the existence of a .MAIN, it means we need
- * to add the sources of said target to the list of things
- * to create. The string 'src' is likely to be free, so we
- * must make a new copy of it. Note that this will only be
- * invoked if the user didn't specify a target on the command
- * line. This is to allow #ifmake's to succeed, or something...
- */
- Lst_AtEnd(&create, estrdup(src));
- /*
- * Add the name to the .TARGETS variable as well, so the user
- * can employ that, if desired.
- */
- Var_Append(".TARGETS", src, VAR_GLOBAL);
- return;
-
- case Order:
- /*
- * Create proper predecessor/successor links between the
- * previous source and the current one.
- */
- gn = Targ_FindNode(src, TARG_CREATE);
- if (predecessor != NULL) {
- Lst_AtEnd(&predecessor->successors, gn);
- Lst_AtEnd(&gn->preds, predecessor);
- }
- /*
- * The current source now becomes the predecessor for the next
- * one.
- */
- predecessor = gn;
- break;
-
- default:
- /*
- * If the source is not an attribute, we need to find/create
- * a node for it. After that we can apply any operator to it
- * from a special target or link it to its parents, as
- * appropriate.
- *
- * In the case of a source that was the object of a :: operator,
- * the attribute is applied to all of its instances (as kept in
- * the 'cohorts' list of the node) or all the cohorts are linked
- * to all the targets.
- */
- gn = Targ_FindNode(src, TARG_CREATE);
- if (tOp) {
- gn->type |= tOp;
- } else {
- ParseLinkSrc(&targets, gn);
- }
- if ((gn->type & OP_OPMASK) == OP_DOUBLEDEP) {
- GNode *cohort;
- LstNode *ln;
-
- for (ln = Lst_First(&gn->cohorts); ln != NULL;
- ln = Lst_Succ(ln)) {
- cohort = Lst_Datum(ln);
- if (tOp) {
- cohort->type |= tOp;
- } else {
- ParseLinkSrc(&targets, cohort);
- }
- }
- }
- break;
- }
-
- gn->order = waiting;
- Lst_AtEnd(allsrc, gn);
- if (waiting) {
- LstNode *ln;
- GNode *p;
-
- /*
- * Check if GNodes needs to be synchronized.
- * This has to be when two nodes are on different sides of a
- * .WAIT directive.
- */
- LST_FOREACH(ln, allsrc) {
- p = Lst_Datum(ln);
-
- if (p->order >= gn->order)
- break;
- /*
- * XXX: This can cause loops, and loops can cause
- * unmade targets, but checking is tedious, and the
- * debugging output can show the problem
- */
- Lst_AtEnd(&p->successors, gn);
- Lst_AtEnd(&gn->preds, p);
- }
- }
-}
-
-
-/*-
- *---------------------------------------------------------------------
- * ParseDoDependency --
- * Parse the dependency line in line.
- *
- * Results:
- * None
- *
- * Side Effects:
- * The nodes of the sources are linked as children to the nodes of the
- * targets. Some nodes may be created.
- *
- * We parse a dependency line by first extracting words from the line and
- * finding nodes in the list of all targets with that name. This is done
- * until a character is encountered which is an operator character. Currently
- * these are only ! and :. At this point the operator is parsed and the
- * pointer into the line advanced until the first source is encountered.
- * The parsed operator is applied to each node in the 'targets' list,
- * which is where the nodes found for the targets are kept, by means of
- * the ParseDoOp function.
- * The sources are read in much the same way as the targets were except
- * that now they are expanded using the wildcarding scheme of the C-Shell
- * and all instances of the resulting words in the list of all targets
- * are found. Each of the resulting nodes is then linked to each of the
- * targets as one of its children.
- * Certain targets are handled specially. These are the ones detailed
- * by the specType variable.
- * The storing of transformation rules is also taken care of here.
- * A target is recognized as a transformation rule by calling
- * Suff_IsTransform. If it is a transformation rule, its node is gotten
- * from the suffix module via Suff_AddTransform rather than the standard
- * Targ_FindNode in the target module.
- *---------------------------------------------------------------------
- */
-static void
-ParseDoDependency(char *line)
-{
- char *cp; /* our current position */
- GNode *gn; /* a general purpose temporary node */
- int op; /* the operator on the line */
- char savec; /* a place to save a character */
- Lst paths; /* Search paths to alter when parsing .PATH targets */
- int tOp; /* operator from special target */
- LstNode *ln;
- const struct keyword *kw;
-
- tOp = 0;
-
- specType = Not;
- waiting = 0;
- Lst_Init(&paths);
-
- do {
- for (cp = line;
- *cp && !isspace((unsigned char)*cp) && *cp != '(';
- cp++) {
- if (*cp == '$') {
- /*
- * Must be a dynamic source (would have been
- * expanded otherwise), so call the Var module
- * to parse the puppy so we can safely advance
- * beyond it...There should be no errors in this
- * as they would have been discovered in the
- * initial Var_Subst and we wouldn't be here.
- */
- size_t length = 0;
- Boolean freeIt;
- char *result;
-
- result = Var_Parse(cp, VAR_CMD, TRUE,
- &length, &freeIt);
-
- if (freeIt) {
- free(result);
- }
- cp += length - 1;
-
- } else if (*cp == '!' || *cp == ':') {
- /*
- * We don't want to end a word on ':' or '!' if
- * there is a better match later on in the
- * string (greedy matching).
- * This allows the user to have targets like:
- * fie::fi:fo: fum
- * foo::bar:
- * where "fie::fi:fo" and "foo::bar" are the
- * targets. In real life this is used for perl5
- * library man pages where "::" separates an
- * object from its class. Ie:
- * "File::Spec::Unix". This behaviour is also
- * consistent with other versions of make.
- */
- char *p = cp + 1;
-
- if (*cp == ':' && *p == ':')
- p++;
-
- /* Found the best match already. */
- if (*p == '\0' || isspace(*p))
- break;
-
- p += strcspn(p, "!:");
-
- /* No better match later on... */
- if (*p == '\0')
- break;
- }
- continue;
- }
- if (*cp == '(') {
- /*
- * Archives must be handled specially to make sure the
- * OP_ARCHV flag is set in their 'type' field, for one
- * thing, and because things like "archive(file1.o
- * file2.o file3.o)" are permissible. Arch_ParseArchive
- * will set 'line' to be the first non-blank after the
- * archive-spec. It creates/finds nodes for the members
- * and places them on the given list, returning TRUE
- * if all went well and FALSE if there was an error in
- * the specification. On error, line should remain
- * untouched.
- */
- if (!Arch_ParseArchive(&line, &targets, VAR_CMD)) {
- Parse_Error(PARSE_FATAL,
- "Error in archive specification: \"%s\"",
- line);
- return;
- } else {
- cp = line;
- continue;
- }
- }
- savec = *cp;
-
- if (!*cp) {
- /*
- * Ending a dependency line without an operator is a * Bozo no-no. As a heuristic, this is also often
- * triggered by undetected conflicts from cvs/rcs
- * merges.
- */
- if (strncmp(line, "<<<<<<", 6) == 0 ||
- strncmp(line, "======", 6) == 0 ||
- strncmp(line, ">>>>>>", 6) == 0) {
- Parse_Error(PARSE_FATAL, "Makefile appears to "
- "contain unresolved cvs/rcs/??? merge "
- "conflicts");
- } else
- Parse_Error(PARSE_FATAL, "Need an operator");
- return;
- }
- *cp = '\0';
- /*
- * Have a word in line. See if it's a special target and set
- * specType to match it.
- */
- if (*line == '.' && isupper((unsigned char)line[1])) {
- /*
- * See if the target is a special target that must have
- * it or its sources handled specially.
- */
- if ((kw = ParseFindKeyword(line)) != NULL) {
- if (specType == ExPath && kw->spec != ExPath) {
- Parse_Error(PARSE_FATAL,
- "Mismatched special targets");
- return;
- }
-
- specType = kw->spec;
- tOp = kw->op;
-
- /*
- * Certain special targets have special
- * semantics:
- * .PATH Have to set the dirSearchPath
- * variable too
- * .MAIN Its sources are only used if
- * nothing has been specified to
- * create.
- * .DEFAULT Need to create a node to hang
- * commands on, but we don't want
- * it in the graph, nor do we want
- * it to be the Main Target, so we
- * create it, set OP_NOTMAIN and
- * add it to the list, setting
- * DEFAULT to the new node for
- * later use. We claim the node is
- * A transformation rule to make
- * life easier later, when we'll
- * use Make_HandleUse to actually
- * apply the .DEFAULT commands.
- * .PHONY The list of targets
- * .BEGIN
- * .END
- * .INTERRUPT Are not to be considered the
- * main target.
- * .NOTPARALLEL Make only one target at a time.
- * .SINGLESHELL Create a shell for each
- * command.
- * .ORDER Must set initial predecessor
- * to NULL
- */
- switch (specType) {
- case ExPath:
- Lst_AtEnd(&paths, &dirSearchPath);
- break;
- case Main:
- if (!Lst_IsEmpty(&create)) {
- specType = Not;
- }
- break;
- case Begin:
- case End:
- case Interrupt:
- gn = Targ_FindNode(line, TARG_CREATE);
- gn->type |= OP_NOTMAIN;
- Lst_AtEnd(&targets, gn);
- break;
- case Default:
- gn = Targ_NewGN(".DEFAULT");
- gn->type |= (OP_NOTMAIN|OP_TRANSFORM);
- Lst_AtEnd(&targets, gn);
- DEFAULT = gn;
- break;
- case NotParallel:
- jobLimit = 1;
- break;
- case SingleShell:
- compatMake = 1;
- break;
- case Order:
- predecessor = NULL;
- break;
- default:
- break;
- }
-
- } else if (strncmp(line, ".PATH", 5) == 0) {
- /*
- * .PATH<suffix> has to be handled specially.
- * Call on the suffix module to give us a path
- * to modify.
- */
- struct Path *path;
-
- specType = ExPath;
- path = Suff_GetPath(&line[5]);
- if (path == NULL) {
- Parse_Error(PARSE_FATAL, "Suffix '%s' "
- "not defined (yet)", &line[5]);
- return;
- } else
- Lst_AtEnd(&paths, path);
- }
- }
-
- /*
- * Have word in line. Get or create its node and stick it at
- * the end of the targets list
- */
- if (specType == Not && *line != '\0') {
-
- /* target names to be found and added to targets list */
- Lst curTargs = Lst_Initializer(curTargs);
-
- if (Dir_HasWildcards(line)) {
- /*
- * Targets are to be sought only in the current
- * directory, so create an empty path for the
- * thing. Note we need to use Path_Clear in the
- * destruction of the path as the Dir module
- * could have added a directory to the path...
- */
- struct Path emptyPath =
- TAILQ_HEAD_INITIALIZER(emptyPath);
-
- Path_Expand(line, &emptyPath, &curTargs);
- Path_Clear(&emptyPath);
-
- } else {
- /*
- * No wildcards, but we want to avoid code
- * duplication, so create a list with the word
- * on it.
- */
- Lst_AtEnd(&curTargs, line);
- }
-
- while (!Lst_IsEmpty(&curTargs)) {
- char *targName = Lst_DeQueue(&curTargs);
-
- if (!Suff_IsTransform (targName)) {
- gn = Targ_FindNode(targName,
- TARG_CREATE);
- } else {
- gn = Suff_AddTransform(targName);
- }
-
- Lst_AtEnd(&targets, gn);
- }
- } else if (specType == ExPath && *line != '.' && *line != '\0'){
- Parse_Error(PARSE_WARNING, "Extra target (%s) ignored",
- line);
- }
-
- *cp = savec;
- /*
- * If it is a special type and not .PATH, it's the only
- * target we allow on this line...
- */
- if (specType != Not && specType != ExPath) {
- Boolean warnFlag = FALSE;
-
- while (*cp != '!' && *cp != ':' && *cp) {
- if (*cp != ' ' && *cp != '\t') {
- warnFlag = TRUE;
- }
- cp++;
- }
- if (warnFlag) {
- Parse_Error(PARSE_WARNING,
- "Extra target ignored");
- }
- } else {
- while (*cp && isspace((unsigned char)*cp)) {
- cp++;
- }
- }
- line = cp;
- } while (*line != '!' && *line != ':' && *line);
-
- if (!Lst_IsEmpty(&targets)) {
- switch (specType) {
- default:
- Parse_Error(PARSE_WARNING, "Special and mundane "
- "targets don't mix. Mundane ones ignored");
- break;
- case Default:
- case Begin:
- case End:
- case Interrupt:
- /*
- * These four create nodes on which to hang commands, so
- * targets shouldn't be empty...
- */
- case Not:
- /*
- * Nothing special here -- targets can be empty if it
- * wants.
- */
- break;
- }
- }
-
- /*
- * Have now parsed all the target names. Must parse the operator next.
- * The result is left in op.
- */
- if (*cp == '!') {
- op = OP_FORCE;
- } else if (*cp == ':') {
- if (cp[1] == ':') {
- op = OP_DOUBLEDEP;
- cp++;
- } else {
- op = OP_DEPENDS;
- }
- } else {
- Parse_Error(PARSE_FATAL, "Missing dependency operator");
- return;
- }
-
- cp++; /* Advance beyond operator */
-
- ParseDoOp(op);
-
- /*
- * Get to the first source
- */
- while (*cp && isspace((unsigned char)*cp)) {
- cp++;
- }
- line = cp;
-
- /*
- * Several special targets take different actions if present with no
- * sources:
- * a .SUFFIXES line with no sources clears out all old suffixes
- * a .PRECIOUS line makes all targets precious
- * a .IGNORE line ignores errors for all targets
- * a .SILENT line creates silence when making all targets
- * a .PATH removes all directories from the search path(s).
- */
- if (!*line) {
- switch (specType) {
- case Suffixes:
- Suff_ClearSuffixes();
- break;
- case Precious:
- allPrecious = TRUE;
- break;
- case Ignore:
- ignoreErrors = TRUE;
- break;
- case Silent:
- beSilent = TRUE;
- break;
- case ExPath:
- LST_FOREACH(ln, &paths)
- Path_Clear(Lst_Datum(ln));
- break;
- case MakefileDeps:
- mfAutoDeps = TRUE;
- break;
- case Posix:
- is_posix = TRUE;
- Var_Set("%POSIX", "1003.2", VAR_GLOBAL);
- break;
- default:
- break;
- }
-
- } else if (specType == MFlags) {
- /*
- * Call on functions in main.c to deal with these arguments and
- * set the initial character to a null-character so the loop to
- * get sources won't get anything
- */
- Main_ParseArgLine(line, 0);
- *line = '\0';
-
- } else if (specType == Warn) {
- parse_warn(line);
- *line = '\0';
-
- } else if (specType == ExShell) {
- if (!Shell_Parse(line)) {
- Parse_Error(PARSE_FATAL,
- "improper shell specification");
- return;
- }
- *line = '\0';
-
- } else if (specType == NotParallel || specType == SingleShell) {
- *line = '\0';
- }
-
- /*
- * NOW GO FOR THE SOURCES
- */
- if (specType == Suffixes || specType == ExPath ||
- specType == Includes || specType == Libs ||
- specType == Null) {
- while (*line) {
- /*
- * If the target was one that doesn't take files as its
- * sources but takes something like suffixes, we take
- * each space-separated word on the line as a something
- * and deal with it accordingly.
- *
- * If the target was .SUFFIXES, we take each source as
- * a suffix and add it to the list of suffixes
- * maintained by the Suff module.
- *
- * If the target was a .PATH, we add the source as a
- * directory to search on the search path.
- *
- * If it was .INCLUDES, the source is taken to be the
- * suffix of files which will be #included and whose
- * search path should be present in the .INCLUDES
- * variable.
- *
- * If it was .LIBS, the source is taken to be the
- * suffix of files which are considered libraries and
- * whose search path should be present in the .LIBS
- * variable.
- *
- * If it was .NULL, the source is the suffix to use
- * when a file has no valid suffix.
- */
- char savech;
- while (*cp && !isspace((unsigned char)*cp)) {
- cp++;
- }
- savech = *cp;
- *cp = '\0';
- switch (specType) {
- case Suffixes:
- Suff_AddSuffix(line);
- break;
- case ExPath:
- LST_FOREACH(ln, &paths)
- Path_AddDir(Lst_Datum(ln), line);
- break;
- case Includes:
- Suff_AddInclude(line);
- break;
- case Libs:
- Suff_AddLib(line);
- break;
- case Null:
- Suff_SetNull(line);
- break;
- default:
- break;
- }
- *cp = savech;
- if (savech != '\0') {
- cp++;
- }
- while (*cp && isspace((unsigned char)*cp)) {
- cp++;
- }
- line = cp;
- }
- Lst_Destroy(&paths, NOFREE);
-
- } else if (specType == ExportVar) {
- Var_SetEnv(line, VAR_GLOBAL);
-
- } else {
- /* list of sources in order */
- Lst curSrcs = Lst_Initializer(curSrc);
-
- while (*line) {
- /*
- * The targets take real sources, so we must beware of
- * archive specifications (i.e. things with left
- * parentheses in them) and handle them accordingly.
- */
- while (*cp && !isspace((unsigned char)*cp)) {
- if (*cp == '(' && cp > line && cp[-1] != '$') {
- /*
- * Only stop for a left parenthesis if
- * it isn't at the start of a word
- * (that'll be for variable changes
- * later) and isn't preceded by a dollar
- * sign (a dynamic source).
- */
- break;
- } else {
- cp++;
- }
- }
-
- if (*cp == '(') {
- GNode *gnp;
-
- /* list of archive source names after exp. */
- Lst sources = Lst_Initializer(sources);
-
- if (!Arch_ParseArchive(&line, &sources,
- VAR_CMD)) {
- Parse_Error(PARSE_FATAL, "Error in "
- "source archive spec \"%s\"", line);
- return;
- }
-
- while (!Lst_IsEmpty(&sources)) {
- gnp = Lst_DeQueue(&sources);
- ParseDoSrc(tOp, gnp->name, &curSrcs);
- }
- cp = line;
- } else {
- if (*cp) {
- *cp = '\0';
- cp += 1;
- }
-
- ParseDoSrc(tOp, line, &curSrcs);
- }
- while (*cp && isspace((unsigned char)*cp)) {
- cp++;
- }
- line = cp;
- }
- Lst_Destroy(&curSrcs, NOFREE);
- }
-
- if (mainNode == NULL) {
- /*
- * If we have yet to decide on a main target to make, in the
- * absence of any user input, we want the first target on
- * the first dependency line that is actually a real target
- * (i.e. isn't a .USE or .EXEC rule) to be made.
- */
- LST_FOREACH(ln, &targets) {
- gn = Lst_Datum(ln);
- if ((gn->type & (OP_NOTMAIN | OP_USE |
- OP_EXEC | OP_TRANSFORM)) == 0) {
- mainNode = gn;
- Targ_SetMain(gn);
- break;
- }
- }
- }
-}
-
-/*-
- *---------------------------------------------------------------------
- * Parse_IsVar --
- * Return TRUE if the passed line is a variable assignment. A variable
- * assignment consists of a single word followed by optional whitespace
- * followed by either a += or an = operator.
- * This function is used both by the Parse_File function and main when
- * parsing the command-line arguments.
- *
- * Results:
- * TRUE if it is. FALSE if it ain't
- *
- * Side Effects:
- * none
- *---------------------------------------------------------------------
- */
-Boolean
-Parse_IsVar(char *line)
-{
- Boolean wasSpace = FALSE; /* set TRUE if found a space */
- Boolean haveName = FALSE; /* Set TRUE if have a variable name */
-
- int level = 0;
-#define ISEQOPERATOR(c) \
- ((c) == '+' || (c) == ':' || (c) == '?' || (c) == '!')
-
- /*
- * Skip to variable name
- */
- for (; *line == ' ' || *line == '\t'; line++)
- continue;
-
- for (; *line != '=' || level != 0; line++) {
- switch (*line) {
- case '\0':
- /*
- * end-of-line -- can't be a variable assignment.
- */
- return (FALSE);
-
- case ' ':
- case '\t':
- /*
- * there can be as much white space as desired so long
- * as there is only one word before the operator
- */
- wasSpace = TRUE;
- break;
-
- case '(':
- case '{':
- level++;
- break;
-
- case '}':
- case ')':
- level--;
- break;
-
- default:
- if (wasSpace && haveName) {
- if (ISEQOPERATOR(*line)) {
- /*
- * We must have a finished word
- */
- if (level != 0)
- return (FALSE);
-
- /*
- * When an = operator [+?!:] is found,
- * the next character must be an = or
- * it ain't a valid assignment.
- */
- if (line[1] == '=')
- return (haveName);
-#ifdef SUNSHCMD
- /*
- * This is a shell command
- */
- if (strncmp(line, ":sh", 3) == 0)
- return (haveName);
-#endif
- }
- /*
- * This is the start of another word, so not
- * assignment.
- */
- return (FALSE);
-
- } else {
- haveName = TRUE;
- wasSpace = FALSE;
- }
- break;
- }
- }
-
- return (haveName);
-}
-
-/*-
- *---------------------------------------------------------------------
- * Parse_DoVar --
- * Take the variable assignment in the passed line and do it in the
- * global context.
- *
- * Note: There is a lexical ambiguity with assignment modifier characters
- * in variable names. This routine interprets the character before the =
- * as a modifier. Therefore, an assignment like
- * C++=/usr/bin/CC
- * is interpreted as "C+ +=" instead of "C++ =".
- *
- * Results:
- * none
- *
- * Side Effects:
- * the variable structure of the given variable name is altered in the
- * global context.
- *---------------------------------------------------------------------
- */
-void
-Parse_DoVar(char *line, GNode *ctxt)
-{
- char *cp; /* pointer into line */
- enum {
- VAR_SUBST,
- VAR_APPEND,
- VAR_SHELL,
- VAR_NORMAL
- } type; /* Type of assignment */
- char *opc; /* ptr to operator character to
- * null-terminate the variable name */
-
- /*
- * Skip to variable name
- */
- while (*line == ' ' || *line == '\t') {
- line++;
- }
-
- /*
- * Skip to operator character, nulling out whitespace as we go
- */
- for (cp = line + 1; *cp != '='; cp++) {
- if (isspace((unsigned char)*cp)) {
- *cp = '\0';
- }
- }
- opc = cp - 1; /* operator is the previous character */
- *cp++ = '\0'; /* nuke the = */
-
- /*
- * Check operator type
- */
- switch (*opc) {
- case '+':
- type = VAR_APPEND;
- *opc = '\0';
- break;
-
- case '?':
- /*
- * If the variable already has a value, we don't do anything.
- */
- *opc = '\0';
- if (Var_Exists(line, ctxt)) {
- return;
- } else {
- type = VAR_NORMAL;
- }
- break;
-
- case ':':
- type = VAR_SUBST;
- *opc = '\0';
- break;
-
- case '!':
- type = VAR_SHELL;
- *opc = '\0';
- break;
-
- default:
-#ifdef SUNSHCMD
- while (*opc != ':') {
- if (opc == line)
- break;
- else
- --opc;
- }
-
- if (strncmp(opc, ":sh", 3) == 0) {
- type = VAR_SHELL;
- *opc = '\0';
- break;
- }
-#endif
- type = VAR_NORMAL;
- break;
- }
-
- while (isspace((unsigned char)*cp)) {
- cp++;
- }
-
- if (type == VAR_APPEND) {
- Var_Append(line, cp, ctxt);
-
- } else if (type == VAR_SUBST) {
- /*
- * Allow variables in the old value to be undefined, but leave
- * their invocation alone -- this is done by forcing oldVars
- * to be false.
- * XXX: This can cause recursive variables, but that's not
- * hard to do, and this allows someone to do something like
- *
- * CFLAGS = $(.INCLUDES)
- * CFLAGS := -I.. $(CFLAGS)
- *
- * And not get an error.
- */
- Boolean oldOldVars = oldVars;
-
- oldVars = FALSE;
-
- /*
- * make sure that we set the variable the first time to nothing
- * so that it gets substituted!
- */
- if (!Var_Exists(line, ctxt))
- Var_Set(line, "", ctxt);
-
- cp = Buf_Peel(Var_Subst(cp, ctxt, FALSE));
-
- oldVars = oldOldVars;
-
- Var_Set(line, cp, ctxt);
- free(cp);
-
- } else if (type == VAR_SHELL) {
- /*
- * TRUE if the command needs to be freed, i.e.
- * if any variable expansion was performed
- */
- Boolean freeCmd = FALSE;
- Buffer *buf;
- const char *error;
-
- if (strchr(cp, '$') != NULL) {
- /*
- * There's a dollar sign in the command, so perform
- * variable expansion on the whole thing. The
- * resulting string will need freeing when we're done,
- * so set freeCmd to TRUE.
- */
- cp = Buf_Peel(Var_Subst(cp, VAR_CMD, TRUE));
- freeCmd = TRUE;
- }
-
- buf = Cmd_Exec(cp, &error);
- Var_Set(line, Buf_Data(buf), ctxt);
- Buf_Destroy(buf, TRUE);
-
- if (error)
- Parse_Error(PARSE_WARNING, error, cp);
-
- if (freeCmd)
- free(cp);
-
- } else {
- /*
- * Normal assignment -- just do it.
- */
- Var_Set(line, cp, ctxt);
- }
-}
-
-/*-
- *-----------------------------------------------------------------------
- * ParseHasCommands --
- * Callback procedure for Parse_File when destroying the list of
- * targets on the last dependency line. Marks a target as already
- * having commands if it does, to keep from having shell commands
- * on multiple dependency lines.
- *
- * Results:
- * None
- *
- * Side Effects:
- * OP_HAS_COMMANDS may be set for the target.
- *
- *-----------------------------------------------------------------------
- */
-static void
-ParseHasCommands(void *gnp)
-{
- GNode *gn = gnp;
-
- if (!Lst_IsEmpty(&gn->commands)) {
- gn->type |= OP_HAS_COMMANDS;
- }
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Parse_AddIncludeDir --
- * Add a directory to the path searched for included makefiles
- * bracketed by double-quotes. Used by functions in main.c
- *
- * Results:
- * None.
- *
- * Side Effects:
- * The directory is appended to the list.
- *
- *-----------------------------------------------------------------------
- */
-void
-Parse_AddIncludeDir(char *dir)
-{
-
- Path_AddDir(&parseIncPath, dir);
-}
-
-/*-
- *---------------------------------------------------------------------
- * Parse_FromString --
- * Start Parsing from the given string
- *
- * Results:
- * None
- *
- * Side Effects:
- * A structure is added to the includes Lst and readProc, curFile.lineno,
- * curFile.fname and curFile.F are altered for the new file
- *---------------------------------------------------------------------
- */
-void
-Parse_FromString(char *str, int lineno)
-{
-
- DEBUGF(FOR, ("%s\n---- at line %d\n", str, lineno));
-
- ParsePushInput(estrdup(CURFILE->fname), NULL, str, lineno);
-}
-
-#ifdef SYSVINCLUDE
-/*-
- *---------------------------------------------------------------------
- * ParseTraditionalInclude --
- * Push to another file.
- *
- * The input is the line minus the "include". The file name is
- * the string following the "include".
- *
- * Results:
- * None
- *
- * Side Effects:
- * A structure is added to the includes Lst and readProc, curFile.lineno,
- * curFile.fname and curFile.F are altered for the new file
- *---------------------------------------------------------------------
- */
-static void
-ParseTraditionalInclude(char *file)
-{
- char *fullname; /* full pathname of file */
- char *cp; /* current position in file spec */
-
- /*
- * Skip over whitespace
- */
- while (*file == ' ' || *file == '\t') {
- file++;
- }
-
- if (*file == '\0') {
- Parse_Error(PARSE_FATAL, "Filename missing from \"include\"");
- return;
- }
-
- /*
- * Skip to end of line or next whitespace
- */
- for (cp = file; *cp && *cp != '\n' && *cp != '\t' && *cp != ' '; cp++) {
- continue;
- }
-
- *cp = '\0';
-
- /*
- * Substitute for any variables in the file name before trying to
- * find the thing.
- */
- file = Buf_Peel(Var_Subst(file, VAR_CMD, FALSE));
-
- /*
- * Now we know the file's name, we attempt to find the durn thing.
- * Search for it first on the -I search path, then on the .PATH
- * search path, if not found in a -I directory.
- */
- fullname = Path_FindFile(file, &parseIncPath);
- if (fullname == NULL) {
- fullname = Path_FindFile(file, &dirSearchPath);
- }
-
- if (fullname == NULL) {
- /*
- * Still haven't found the makefile. Look for it on the system
- * path as a last resort.
- */
- fullname = Path_FindFile(file, &sysIncPath);
- }
-
- if (fullname == NULL) {
- Parse_Error(PARSE_FATAL, "Could not find %s", file);
- /* XXXHB free(file) */
- return;
- }
-
- /* XXXHB free(file) */
-
- /*
- * We set up the name of the file to be the absolute
- * name of the include file so error messages refer to the right
- * place.
- */
- ParsePushInput(fullname, NULL, NULL, 0);
-}
-#endif
-
-/*-
- *---------------------------------------------------------------------
- * ParseReadc --
- * Read a character from the current file
- *
- * Results:
- * The character that was read
- *
- * Side Effects:
- *---------------------------------------------------------------------
- */
-static int
-ParseReadc(void)
-{
-
- if (CURFILE->F != NULL)
- return (fgetc(CURFILE->F));
-
- if (CURFILE->str != NULL && *CURFILE->ptr != '\0')
- return (*CURFILE->ptr++);
-
- return (EOF);
-}
-
-
-/*-
- *---------------------------------------------------------------------
- * ParseUnreadc --
- * Put back a character to the current file
- *
- * Results:
- * None.
- *
- * Side Effects:
- *---------------------------------------------------------------------
- */
-static void
-ParseUnreadc(int c)
-{
-
- if (CURFILE->F != NULL) {
- ungetc(c, CURFILE->F);
- return;
- }
- if (CURFILE->str != NULL) {
- *--(CURFILE->ptr) = c;
- return;
- }
-}
-
-/* ParseSkipLine():
- * Grab the next line unless it begins with a dot (`.') and we're told to
- * ignore such lines.
- */
-static char *
-ParseSkipLine(int skip, int keep_newline)
-{
- char *line;
- int c, lastc;
- Buffer *buf;
-
- buf = Buf_Init(MAKE_BSIZE);
-
- do {
- Buf_Clear(buf);
- lastc = '\0';
-
- while (((c = ParseReadc()) != '\n' || lastc == '\\')
- && c != EOF) {
- if (skip && c == '#' && lastc != '\\') {
- /*
- * let a comment be terminated even by an
- * escaped \n. This is consistent to comment
- * handling in ParseReadLine
- */
- while ((c = ParseReadc()) != '\n' && c != EOF)
- ;
- break;
- }
- if (c == '\n') {
- if (keep_newline)
- Buf_AddByte(buf, (Byte)c);
- else
- Buf_ReplaceLastByte(buf, (Byte)' ');
- CURFILE->lineno++;
-
- while ((c = ParseReadc()) == ' ' || c == '\t')
- continue;
-
- if (c == EOF)
- break;
- }
-
- Buf_AddByte(buf, (Byte)c);
- lastc = c;
- }
-
- if (c == EOF) {
- Parse_Error(PARSE_FATAL,
- "Unclosed conditional/for loop");
- Buf_Destroy(buf, TRUE);
- return (NULL);
- }
-
- CURFILE->lineno++;
- Buf_AddByte(buf, (Byte)'\0');
- line = Buf_Data(buf);
- } while (skip == 1 && line[0] != '.');
-
- Buf_Destroy(buf, FALSE);
- return (line);
-}
-
-/*-
- *---------------------------------------------------------------------
- * ParseReadLine --
- * Read an entire line from the input file. Called only by Parse_File.
- * To facilitate escaped newlines and what have you, a character is
- * buffered in 'lastc', which is '\0' when no characters have been
- * read. When we break out of the loop, c holds the terminating
- * character and lastc holds a character that should be added to
- * the line (unless we don't read anything but a terminator).
- *
- * Results:
- * A line w/o its newline
- *
- * Side Effects:
- * Only those associated with reading a character
- *---------------------------------------------------------------------
- */
-static char *
-ParseReadLine(void)
-{
- Buffer *buf; /* Buffer for current line */
- int c; /* the current character */
- int lastc; /* The most-recent character */
- Boolean semiNL; /* treat semi-colons as newlines */
- Boolean ignDepOp; /* TRUE if should ignore dependency operators
- * for the purposes of setting semiNL */
- Boolean ignComment; /* TRUE if should ignore comments (in a
- * shell command */
- char *line; /* Result */
- char *ep; /* to strip trailing blanks */
-
- again:
- semiNL = FALSE;
- ignDepOp = FALSE;
- ignComment = FALSE;
-
- lastc = '\0';
-
- /*
- * Handle tab at the beginning of the line. A leading tab (shell
- * command) forces us to ignore comments and dependency operators and
- * treat semi-colons as semi-colons (by leaving semiNL FALSE).
- * This also discards completely blank lines.
- */
- for (;;) {
- c = ParseReadc();
- if (c == EOF) {
- if (ParsePopInput() == DONE) {
- /* End of all inputs - return NULL */
- return (NULL);
- }
- continue;
- }
-
- if (c == '\t') {
- ignComment = ignDepOp = TRUE;
- lastc = c;
- break;
- }
- if (c != '\n') {
- ParseUnreadc(c);
- break;
- }
- CURFILE->lineno++;
- }
-
- buf = Buf_Init(MAKE_BSIZE);
-
- while (((c = ParseReadc()) != '\n' || lastc == '\\') && c != EOF) {
- test_char:
- switch (c) {
- case '\n':
- /*
- * Escaped newline: read characters until a
- * non-space or an unescaped newline and
- * replace them all by a single space. This is
- * done by storing the space over the backslash
- * and dropping through with the next nonspace.
- * If it is a semi-colon and semiNL is TRUE,
- * it will be recognized as a newline in the
- * code below this...
- */
- CURFILE->lineno++;
- lastc = ' ';
- while ((c = ParseReadc()) == ' ' || c == '\t') {
- continue;
- }
- if (c == EOF || c == '\n') {
- goto line_read;
- } else {
- /*
- * Check for comments, semiNL's, etc. --
- * easier than ParseUnreadc(c);
- * continue;
- */
- goto test_char;
- }
- /*NOTREACHED*/
- break;
-
- case ';':
- /*
- * Semi-colon: Need to see if it should be
- * interpreted as a newline
- */
- if (semiNL) {
- /*
- * To make sure the command that may
- * be following this semi-colon begins
- * with a tab, we push one back into the
- * input stream. This will overwrite the
- * semi-colon in the buffer. If there is
- * no command following, this does no
- * harm, since the newline remains in
- * the buffer and the
- * whole line is ignored.
- */
- ParseUnreadc('\t');
- goto line_read;
- }
- break;
- case '=':
- if (!semiNL) {
- /*
- * Haven't seen a dependency operator
- * before this, so this must be a
- * variable assignment -- don't pay
- * attention to dependency operators
- * after this.
- */
- ignDepOp = TRUE;
- } else if (lastc == ':' || lastc == '!') {
- /*
- * Well, we've seen a dependency
- * operator already, but it was the
- * previous character, so this is really
- * just an expanded variable assignment.
- * Revert semi-colons to being just
- * semi-colons again and ignore any more
- * dependency operators.
- *
- * XXX: Note that a line like
- * "foo : a:=b" will blow up, but who'd
- * write a line like that anyway?
- */
- ignDepOp = TRUE;
- semiNL = FALSE;
- }
- break;
- case '#':
- if (!ignComment) {
- if (lastc != '\\') {
- /*
- * If the character is a hash
- * mark and it isn't escaped
- * (or we're being compatible),
- * the thing is a comment.
- * Skip to the end of the line.
- */
- do {
- c = ParseReadc();
- } while (c != '\n' && c != EOF);
- goto line_read;
- } else {
- /*
- * Don't add the backslash.
- * Just let the # get copied
- * over.
- */
- lastc = c;
- continue;
- }
- }
- break;
-
- case ':':
- case '!':
- if (!ignDepOp) {
- /*
- * A semi-colon is recognized as a
- * newline only on dependency lines.
- * Dependency lines are lines with a
- * colon or an exclamation point.
- * Ergo...
- */
- semiNL = TRUE;
- }
- break;
-
- default:
- break;
- }
- /*
- * Copy in the previous character (there may be none if this
- * was the first character) and save this one in
- * lastc.
- */
- if (lastc != '\0')
- Buf_AddByte(buf, (Byte)lastc);
- lastc = c;
- }
- line_read:
- CURFILE->lineno++;
-
- if (lastc != '\0') {
- Buf_AddByte(buf, (Byte)lastc);
- }
- Buf_AddByte(buf, (Byte)'\0');
- line = Buf_Peel(buf);
-
- /*
- * Strip trailing blanks and tabs from the line.
- * Do not strip a blank or tab that is preceded by
- * a '\'
- */
- ep = line;
- while (*ep)
- ++ep;
- while (ep > line + 1 && (ep[-1] == ' ' || ep[-1] == '\t')) {
- if (ep > line + 1 && ep[-2] == '\\')
- break;
- --ep;
- }
- *ep = 0;
-
- if (line[0] == '\0') {
- /* empty line - just ignore */
- free(line);
- goto again;
- }
-
- return (line);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * ParseFinishLine --
- * Handle the end of a dependency group.
- *
- * Results:
- * Nothing.
- *
- * Side Effects:
- * inLine set FALSE. 'targets' list destroyed.
- *
- *-----------------------------------------------------------------------
- */
-static void
-ParseFinishLine(void)
-{
- const LstNode *ln;
-
- if (inLine) {
- LST_FOREACH(ln, &targets) {
- if (((const GNode *)Lst_Datum(ln))->type & OP_TRANSFORM)
- Suff_EndTransform(Lst_Datum(ln));
- }
- Lst_Destroy(&targets, ParseHasCommands);
- inLine = FALSE;
- }
-}
-
-/**
- * xparse_include
- * Parse an .include directive and push the file onto the input stack.
- * The input is the line minus the .include. A file spec is a string
- * enclosed in <> or "". The former is looked for only in sysIncPath.
- * The latter in . and the directories specified by -I command line
- * options
- */
-static void
-xparse_include(char *file, int sinclude)
-{
- char *fullname; /* full pathname of file */
- char endc; /* the character which ends the file spec */
- char *cp; /* current position in file spec */
- Boolean isSystem; /* TRUE if makefile is a system makefile */
- char *prefEnd, *Fname;
- char *newName;
-
- /*
- * Skip to delimiter character so we know where to look
- */
- while (*file == ' ' || *file == '\t') {
- file++;
- }
-
- if (*file != '"' && *file != '<') {
- Parse_Error(PARSE_FATAL,
- ".include filename must be delimited by '\"' or '<'");
- return;
- }
-
- /*
- * Set the search path on which to find the include file based on the
- * characters which bracket its name. Angle-brackets imply it's
- * a system Makefile while double-quotes imply it's a user makefile
- */
- if (*file == '<') {
- isSystem = TRUE;
- endc = '>';
- } else {
- isSystem = FALSE;
- endc = '"';
- }
-
- /*
- * Skip to matching delimiter
- */
- for (cp = ++file; *cp != endc; cp++) {
- if (*cp == '\0') {
- Parse_Error(PARSE_FATAL,
- "Unclosed .include filename. '%c' expected", endc);
- return;
- }
- }
- *cp = '\0';
-
- /*
- * Substitute for any variables in the file name before trying to
- * find the thing.
- */
- file = Buf_Peel(Var_Subst(file, VAR_CMD, FALSE));
-
- /*
- * Now we know the file's name and its search path, we attempt to
- * find the durn thing. A return of NULL indicates the file don't
- * exist.
- */
- if (!isSystem) {
- /*
- * Include files contained in double-quotes are first searched
- * for relative to the including file's location. We don't want
- * to cd there, of course, so we just tack on the old file's
- * leading path components and call Path_FindFile to see if
- * we can locate the beast.
- */
-
- /* Make a temporary copy of this, to be safe. */
- Fname = estrdup(CURFILE->fname);
-
- prefEnd = strrchr(Fname, '/');
- if (prefEnd != NULL) {
- *prefEnd = '\0';
- if (file[0] == '/')
- newName = estrdup(file);
- else
- newName = str_concat(Fname, file, STR_ADDSLASH);
- fullname = Path_FindFile(newName, &parseIncPath);
- if (fullname == NULL) {
- fullname = Path_FindFile(newName,
- &dirSearchPath);
- }
- free(newName);
- *prefEnd = '/';
- } else {
- fullname = NULL;
- }
- free(Fname);
- if (fullname == NULL) {
- /*
- * Makefile wasn't found in same directory as included
- * makefile. Search for it first on the -I search path,
- * then on the .PATH search path, if not found in a -I
- * directory.
- * XXX: Suffix specific?
- */
- fullname = Path_FindFile(file, &parseIncPath);
- if (fullname == NULL) {
- fullname = Path_FindFile(file, &dirSearchPath);
- }
- }
- } else {
- fullname = NULL;
- }
-
- if (fullname == NULL) {
- /*
- * System makefile or still haven't found the makefile.
- * Look for it on the system path.
- */
- fullname = Path_FindFile(file, &sysIncPath);
- }
-
- if (fullname == NULL) {
- *cp = endc;
- if (!sinclude)
- Parse_Error(PARSE_FATAL, "Could not find %s", file);
- else
- Main_AddSourceMakefile(file);
- free(file);
- return;
- }
- Main_AddSourceMakefile(fullname);
- free(file);
-
- /*
- * We set up the name of the file to be the absolute
- * name of the include file so error messages refer to the right
- * place.
- */
- ParsePushInput(fullname, NULL, NULL, 0);
- DEBUGF(DIR, (".include %s\n", fullname));
-}
-
-static void
-parse_include(char *file, int code __unused, int lineno __unused)
-{
- xparse_include(file, 0);
-}
-
-static void
-parse_sinclude(char *file, int code __unused, int lineno __unused)
-{
- xparse_include(file, 1);
-}
-
-/**
- * parse_message
- * Parse a .warning or .error directive
- *
- * The input is the line minus the ".error"/".warning". We substitute
- * variables, print the message and exit(1) (for .error) or just print
- * a warning if the directive is malformed.
- */
-static void
-parse_message(char *line, int iserror, int lineno __unused)
-{
-
- if (!isspace((u_char)*line)) {
- Parse_Error(PARSE_WARNING, "invalid syntax: .%s%s",
- iserror ? "error" : "warning", line);
- return;
- }
-
- while (isspace((u_char)*line))
- line++;
-
- line = Buf_Peel(Var_Subst(line, VAR_CMD, FALSE));
- Parse_Error(iserror ? PARSE_FATAL : PARSE_WARNING, "%s", line);
- free(line);
-
- if (iserror) {
- /* Terminate immediately. */
- exit(1);
- }
-}
-
-/**
- * parse_undef
- * Parse an .undef directive.
- */
-static void
-parse_undef(char *line, int code __unused, int lineno __unused)
-{
- char *cp;
-
- while (isspace((u_char)*line))
- line++;
-
- for (cp = line; !isspace((u_char)*cp) && *cp != '\0'; cp++) {
- ;
- }
- *cp = '\0';
-
- cp = Buf_Peel(Var_Subst(line, VAR_CMD, FALSE));
- Var_Delete(cp, VAR_GLOBAL);
- free(cp);
-}
-
-/**
- * parse_for
- * Parse a .for directive.
- */
-static void
-parse_for(char *line, int code __unused, int lineno)
-{
-
- if (!For_For(line)) {
- /* syntax error */
- return;
- }
- line = NULL;
-
- /*
- * Skip after the matching endfor.
- */
- do {
- free(line);
- line = ParseSkipLine(0, 1);
- if (line == NULL) {
- Parse_Error(PARSE_FATAL,
- "Unexpected end of file in for loop.\n");
- return;
- }
- } while (For_Eval(line));
- free(line);
-
- /* execute */
- For_Run(lineno);
-}
-
-/**
- * parse_endfor
- * Parse endfor. This may only happen if there was no matching .for.
- */
-static void
-parse_endfor(char *line __unused, int code __unused, int lineno __unused)
-{
-
- Parse_Error(PARSE_FATAL, "for-less endfor");
-}
-
-/**
- * parse_directive
- * Got a line starting with a '.'. Check if this is a directive
- * and parse it.
- *
- * return:
- * TRUE if line was a directive, FALSE otherwise.
- */
-static Boolean
-parse_directive(char *line)
-{
- char *start;
- char *cp;
- int dir;
-
- /*
- * Get the keyword:
- * .[[:space:]]*\([[:alpha:]][[:alnum:]_]*\).*
- * \1 is the keyword.
- */
- for (start = line; isspace((u_char)*start); start++) {
- ;
- }
-
- if (!isalpha((u_char)*start)) {
- return (FALSE);
- }
-
- cp = start + 1;
- while (isalnum((u_char)*cp) || *cp == '_') {
- cp++;
- }
-
- dir = directive_hash(start, cp - start);
- if (dir < 0 || dir >= (int)NDIRECTS ||
- (size_t)(cp - start) != strlen(directives[dir].name) ||
- strncmp(start, directives[dir].name, cp - start) != 0) {
- /* not actually matched */
- return (FALSE);
- }
-
- if (!skipLine || directives[dir].skip_flag)
- (*directives[dir].func)(cp, directives[dir].code,
- CURFILE->lineno);
- return (TRUE);
-}
-
-/*-
- *---------------------------------------------------------------------
- * Parse_File --
- * Parse a file into its component parts, incorporating it into the
- * current dependency graph. This is the main function and controls
- * almost every other function in this module
- *
- * Results:
- * None
- *
- * Side Effects:
- * Loads. Nodes are added to the list of all targets, nodes and links
- * are added to the dependency graph. etc. etc. etc.
- *---------------------------------------------------------------------
- */
-void
-Parse_File(const char *name, FILE *stream)
-{
- char *cp; /* pointer into the line */
- char *line; /* the line we're working on */
-
- inLine = FALSE;
- fatals = 0;
-
- ParsePushInput(estrdup(name), stream, NULL, 0);
-
- while ((line = ParseReadLine()) != NULL) {
- if (*line == '.' && parse_directive(line + 1)) {
- /* directive consumed */
- goto nextLine;
- }
- if (skipLine || *line == '#') {
- /* Skipping .if block or comment. */
- goto nextLine;
- }
-
- if (*line == '\t') {
- /*
- * If a line starts with a tab, it can only
- * hope to be a creation command.
- */
- for (cp = line + 1; isspace((unsigned char)*cp); cp++) {
- continue;
- }
- if (*cp) {
- if (inLine) {
- LstNode *ln;
- GNode *gn;
-
- /*
- * So long as it's not a blank
- * line and we're actually in a
- * dependency spec, add the
- * command to the list of
- * commands of all targets in
- * the dependency spec.
- */
- LST_FOREACH(ln, &targets) {
- gn = Lst_Datum(ln);
-
- /*
- * if target already
- * supplied, ignore
- * commands
- */
- if (!(gn->type & OP_HAS_COMMANDS))
- Lst_AtEnd(&gn->commands, cp);
- else
- Parse_Error(PARSE_WARNING, "duplicate script "
- "for target \"%s\" ignored", gn->name);
- }
- continue;
- } else {
- Parse_Error(PARSE_FATAL,
- "Unassociated shell command \"%s\"",
- cp);
- }
- }
-#ifdef SYSVINCLUDE
- } else if (strncmp(line, "include", 7) == 0 &&
- isspace((unsigned char)line[7]) &&
- strchr(line, ':') == NULL) {
- /*
- * It's an S3/S5-style "include".
- */
- ParseTraditionalInclude(line + 7);
- goto nextLine;
-#endif
- } else if (Parse_IsVar(line)) {
- ParseFinishLine();
- Parse_DoVar(line, VAR_GLOBAL);
-
- } else {
- /*
- * We now know it's a dependency line so it
- * needs to have all variables expanded before
- * being parsed. Tell the variable module to
- * complain if some variable is undefined...
- * To make life easier on novices, if the line
- * is indented we first make sure the line has
- * a dependency operator in it. If it doesn't
- * have an operator and we're in a dependency
- * line's script, we assume it's actually a
- * shell command and add it to the current
- * list of targets. XXX this comment seems wrong.
- */
- cp = line;
- if (isspace((unsigned char)line[0])) {
- while (*cp != '\0' &&
- isspace((unsigned char)*cp)) {
- cp++;
- }
- if (*cp == '\0') {
- goto nextLine;
- }
- }
-
- ParseFinishLine();
-
- cp = Buf_Peel(Var_Subst(line, VAR_CMD, TRUE));
-
- free(line);
- line = cp;
-
- /*
- * Need a non-circular list for the target nodes
- */
- Lst_Destroy(&targets, NOFREE);
- inLine = TRUE;
-
- ParseDoDependency(line);
- }
-
- nextLine:
- free(line);
- }
-
- ParseFinishLine();
-
- /*
- * Make sure conditionals are clean
- */
- Cond_End();
-
- if (fatals)
- errx(1, "fatal errors encountered -- cannot continue");
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Parse_MainName --
- * Return a Lst of the main target to create for main()'s sake. If
- * no such target exists, we Punt with an obnoxious error message.
- *
- * Results:
- * A Lst of the single node to create.
- *
- * Side Effects:
- * None.
- *
- *-----------------------------------------------------------------------
- */
-void
-Parse_MainName(Lst *listmain)
-{
-
- if (mainNode == NULL) {
- Punt("no target to make.");
- /*NOTREACHED*/
- } else if (mainNode->type & OP_DOUBLEDEP) {
- Lst_AtEnd(listmain, mainNode);
- Lst_Concat(listmain, &mainNode->cohorts, LST_CONCNEW);
- } else
- Lst_AtEnd(listmain, mainNode);
-}
diff --git a/usr.bin/make/parse.h b/usr.bin/make/parse.h
deleted file mode 100644
index 6ee15f9..0000000
--- a/usr.bin/make/parse.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef parse_h_470eeb9a
-#define parse_h_470eeb9a
-
-#include <stdio.h>
-
-#include "util.h"
-
-struct GNode;
-struct Lst;
-
-/*
- * Error levels for parsing. PARSE_FATAL means the process cannot continue
- * once the makefile has been parsed. PARSE_WARNING means it can. Passed
- * as the first argument to Parse_Error.
- */
-#define PARSE_WARNING 2
-#define PARSE_FATAL 1
-
-/*
- * Definitions for the "local" variables. Used only for clarity.
- */
-#define TARGET "@" /* Target of dependency */
-#define OODATE "?" /* All out-of-date sources */
-#define ALLSRC ">" /* All sources */
-#define IMPSRC "<" /* Source implied by transformation */
-#define PREFIX "*" /* Common prefix */
-#define ARCHIVE "!" /* Archive in "archive(member)" syntax */
-#define MEMBER "%" /* Member in "archive(member)" syntax */
-
-#define FTARGET "@F" /* file part of TARGET */
-#define DTARGET "@D" /* directory part of TARGET */
-#define FIMPSRC "<F" /* file part of IMPSRC */
-#define DIMPSRC "<D" /* directory part of IMPSRC */
-#define FPREFIX "*F" /* file part of PREFIX */
-#define DPREFIX "*D" /* directory part of PREFIX */
-
-void Parse_Error(int, const char *, ...);
-Boolean Parse_AnyExport(void);
-Boolean Parse_IsVar(char *);
-void Parse_DoVar(char *, struct GNode *);
-void Parse_AddIncludeDir(char *);
-void Parse_File(const char *, FILE *);
-void Parse_FromString(char *, int);
-void Parse_MainName(struct Lst *);
-
-#endif /* parse_h_470eeb9a */
diff --git a/usr.bin/make/pathnames.h b/usr.bin/make/pathnames.h
deleted file mode 100644
index 5fb4ceb..0000000
--- a/usr.bin/make/pathnames.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)pathnames.h 8.2 (Berkeley) 4/28/95
- * $FreeBSD$
- */
-
-#ifndef pathnames_h_235b888a
-#define pathnames_h_235b888a
-
-#ifndef PATH_OBJDIR
-#define PATH_OBJDIR "obj"
-#endif /* ! PATH_OBJDIR */
-
-#ifndef PATH_OBJDIRPREFIX
-#define PATH_OBJDIRPREFIX "/usr/obj"
-#endif /* ! PATH_OBJDIRPREFIX */
-
-#ifndef PATH_DEFSHELLDIR
-#define PATH_DEFSHELLDIR "/bin"
-#endif /* ! PATH_DEFSHELLDIR */
-
-#ifndef PATH_DEFSYSMK
-#define PATH_DEFSYSMK "sys.mk"
-#endif /* ! PATH_DEFSYSMK */
-
-#ifndef PATH_DEFSYSPATH
-#define PATH_DEFSYSPATH "/usr/share/mk"
-#endif /* ! PATH_DEFSYSPATH */
-
-#endif /* pathnames_h_235b888a */
diff --git a/usr.bin/make/proc.c b/usr.bin/make/proc.c
deleted file mode 100644
index 711f605..0000000
--- a/usr.bin/make/proc.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*-
- * Copyright (C) 2005 Max Okumoto.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <unistd.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-
-#include "proc.h"
-#include "shell.h"
-#include "util.h"
-
-/**
- * Replace the current process.
- */
-void
-Proc_Exec(const ProcStuff *ps)
-{
-
- if (ps->in != STDIN_FILENO) {
- /*
- * Redirect the child's stdin to the input fd
- * and reset it to the beginning (again).
- */
- if (dup2(ps->in, STDIN_FILENO) == -1)
- Punt("Cannot dup2: %s", strerror(errno));
- lseek(STDIN_FILENO, (off_t)0, SEEK_SET);
- }
-
- if (ps->out != STDOUT_FILENO) {
- /*
- * Redirect the child's stdout to the output fd.
- */
- if (dup2(ps->out, STDOUT_FILENO) == -1)
- Punt("Cannot dup2: %s", strerror(errno));
- close(ps->out);
- }
-
- if (ps->err != STDERR_FILENO) {
- /*
- * Redirect the child's stderr to the err fd.
- */
- if (dup2(ps->err, STDERR_FILENO) == -1)
- Punt("Cannot dup2: %s", strerror(errno));
- close(ps->err);
- }
-
- if (ps->merge_errors) {
- /*
- * Send stderr to parent process too.
- */
- if (dup2(STDOUT_FILENO, STDERR_FILENO) == -1)
- Punt("Cannot dup2: %s", strerror(errno));
- }
-
- if (commandShell->unsetenv) {
- /* for the benfit of ksh */
- unsetenv("ENV");
- }
-
- /*
- * The file descriptors for stdin, stdout, or stderr might
- * have been marked close-on-exec. Clear the flag on all
- * of them.
- */
- fcntl(STDIN_FILENO, F_SETFD,
- fcntl(STDIN_FILENO, F_GETFD) & (~FD_CLOEXEC));
- fcntl(STDOUT_FILENO, F_SETFD,
- fcntl(STDOUT_FILENO, F_GETFD) & (~FD_CLOEXEC));
- fcntl(STDERR_FILENO, F_SETFD,
- fcntl(STDERR_FILENO, F_GETFD) & (~FD_CLOEXEC));
-
- if (ps->pgroup) {
-#ifdef USE_PGRP
- /*
- * Become a process group leader, so we can kill it and all
- * its descendants in one fell swoop, by killing its process
- * family, but not commit suicide.
- */
-#if defined(SYSV)
- setsid();
-#else
- setpgid(0, getpid());
-#endif
-#endif /* USE_PGRP */
- }
-
- if (ps->searchpath) {
- execvp(ps->argv[0], ps->argv);
-
- write(STDERR_FILENO, ps->argv[0], strlen(ps->argv[0]));
- write(STDERR_FILENO, ":", 1);
- write(STDERR_FILENO, strerror(errno), strlen(strerror(errno)));
- write(STDERR_FILENO, "\n", 1);
- } else {
- execv(commandShell->path, ps->argv);
-
- write(STDERR_FILENO,
- "Could not execute shell\n",
- sizeof("Could not execute shell"));
- }
-
- /*
- * Since we are the child process, exit without flushing buffers.
- */
- _exit(1);
-}
diff --git a/usr.bin/make/proc.h b/usr.bin/make/proc.h
deleted file mode 100644
index a4ce6d3..0000000
--- a/usr.bin/make/proc.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*-
- * Copyright (C) 2005 Max Okumoto.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef proc_h_458845848
-#define proc_h_458845848
-
-/**
- * Information used to create a new process.
- */
-typedef struct ProcStuff {
- int in; /* stdin for new process */
- int out; /* stdout for new process */
- int err; /* stderr for new process */
-
- int merge_errors; /* true if stderr is redirected to stdin */
- int pgroup; /* true if new process a process leader */
- int searchpath; /* true if binary should be found via $PATH */
-
- char **argv;
- int argv_free; /* release argv after use */
- int errCheck;
-
- pid_t child_pid;
-} ProcStuff;
-
-void Proc_Exec(const ProcStuff *) __dead2;
-
-#endif /* proc_h_458845848 */
diff --git a/usr.bin/make/shell.c b/usr.bin/make/shell.c
deleted file mode 100644
index c1f82d1..0000000
--- a/usr.bin/make/shell.c
+++ /dev/null
@@ -1,472 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1988, 1989 by Adam de Boor
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/queue.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "parse.h"
-#include "pathnames.h"
-#include "shell.h"
-#include "util.h"
-
-/*
- * Descriptions for various shells. What the list of builtins should contain
- * is debatable: either all builtins or only those which may specified on
- * a single line without use of meta-characters. For correct makefiles that
- * contain only correct command lines there is no difference. But if a command
- * line, for example, is: 'if -foo bar' and there is an executable named 'if'
- * in the path, the first possibility would execute that 'if' while in the
- * second case the shell would give an error. Histerically only a small
- * subset of the builtins and no reserved words where given in the list which
- * corresponds roughly to the first variant. So go with this but add missing
- * words.
- */
-#define CSH_BUILTINS \
- "alias cd eval exec exit read set ulimit unalias " \
- "umask unset wait"
-
-#define SH_BUILTINS \
- "alias cd eval exec exit read set ulimit unalias " \
- "umask unset wait"
-
-#define CSH_META "#=|^(){};&<>*?[]:$`\\@\n"
-#define SH_META "#=|^(){};&<>*?[]:$`\\\n"
-
-static const char *const shells_init[] = {
- /*
- * CSH description. The csh can do echo control by playing
- * with the setting of the 'echo' shell variable. Sadly,
- * however, it is unable to do error control nicely.
- */
- "name=csh path='" PATH_DEFSHELLDIR "/csh' "
- "quiet='unset verbose' echo='set verbose' filter='unset verbose' "
- "hasErrCtl=N check='echo \"%s\"\n' ignore='csh -c \"%s || exit 0\"' "
- "echoFlag=v errFlag=e "
- "meta='" CSH_META "' builtins='" CSH_BUILTINS "'",
-
- /*
- * SH description. Echo control is also possible and, under
- * sun UNIX anyway, one can even control error checking.
- */
- "name=sh path='" PATH_DEFSHELLDIR "/sh' "
- "quiet='set -' echo='set -v' filter='set -' "
- "hasErrCtl=Y check='set -e' ignore='set +e' "
- "echoFlag=v errFlag=e "
- "meta='" SH_META "' builtins='" SH_BUILTINS "'",
-
- /*
- * KSH description. The Korn shell has a superset of
- * the Bourne shell's functionality. There are probably builtins
- * missing here.
- */
- "name=ksh path='" PATH_DEFSHELLDIR "/ksh' "
- "quiet='set -' echo='set -v' filter='set -' "
- "hasErrCtl=Y check='set -e' ignore='set +e' "
- "echoFlag=v errFlag=e "
- "meta='" SH_META "' builtins='" SH_BUILTINS "' unsetenv=T",
-
- NULL
-};
-
-/*
- * This is the shell to which we pass all commands in the Makefile.
- * It is set by the Job_ParseShell function.
- */
-struct Shell *commandShell;
-
-/*
- * This is the list of all known shells.
- */
-static struct Shells shells = TAILQ_HEAD_INITIALIZER(shells);
-
-void ShellDump(const struct Shell *) __unused;
-
-/**
- * Helper function for sorting the builtin list alphabetically.
- */
-static int
-sort_builtins(const void *p1, const void *p2)
-{
-
- return (strcmp(*(const char* const*)p1, *(const char* const*)p2));
-}
-
-/**
- * Free a shell structure and all associated strings.
- */
-static void
-ShellFree(struct Shell *sh)
-{
-
- if (sh != NULL) {
- free(sh->name);
- free(sh->path);
- free(sh->echoOff);
- free(sh->echoOn);
- free(sh->noPrint);
- free(sh->errCheck);
- free(sh->ignErr);
- free(sh->echo);
- free(sh->exit);
- ArgArray_Done(&sh->builtins);
- free(sh->meta);
- free(sh);
- }
-}
-
-/**
- * Dump a shell specification to stderr.
- */
-void
-ShellDump(const struct Shell *sh)
-{
- int i;
-
- fprintf(stderr, "Shell %p:\n", sh);
- fprintf(stderr, " name='%s' path='%s'\n", sh->name, sh->path);
- fprintf(stderr, " hasEchoCtl=%d echoOff='%s' echoOn='%s'\n",
- sh->hasEchoCtl, sh->echoOff, sh->echoOn);
- fprintf(stderr, " noPrint='%s'\n", sh->noPrint);
- fprintf(stderr, " hasErrCtl=%d errCheck='%s' ignErr='%s'\n",
- sh->hasErrCtl, sh->errCheck, sh->ignErr);
- fprintf(stderr, " echo='%s' exit='%s'\n", sh->echo, sh->exit);
- fprintf(stderr, " builtins=%d\n", sh->builtins.argc - 1);
- for (i = 1; i < sh->builtins.argc; i++)
- fprintf(stderr, " '%s'", sh->builtins.argv[i]);
- fprintf(stderr, "\n meta='%s'\n", sh->meta);
- fprintf(stderr, " unsetenv=%d\n", sh->unsetenv);
-}
-
-/**
- * Parse a shell specification line and return the new Shell structure.
- * In case of an error a message is printed and NULL is returned.
- */
-static struct Shell *
-ShellParseSpec(const char *spec, Boolean *fullSpec)
-{
- ArgArray aa;
- struct Shell *sh;
- char *eq;
- char *keyw;
- int arg;
-
- *fullSpec = FALSE;
-
- sh = emalloc(sizeof(*sh));
- memset(sh, 0, sizeof(*sh));
- ArgArray_Init(&sh->builtins);
-
- /*
- * Parse the specification by keyword but skip the first word
- */
- brk_string(&aa, spec, TRUE);
-
- for (arg = 1; arg < aa.argc; arg++) {
- /*
- * Split keyword and value
- */
- keyw = aa.argv[arg];
- if ((eq = strchr(keyw, '=')) == NULL) {
- Parse_Error(PARSE_FATAL, "missing '=' in shell "
- "specification keyword '%s'", keyw);
- ArgArray_Done(&aa);
- ShellFree(sh);
- return (NULL);
- }
- *eq++ = '\0';
-
- if (strcmp(keyw, "path") == 0) {
- free(sh->path);
- sh->path = estrdup(eq);
- } else if (strcmp(keyw, "name") == 0) {
- free(sh->name);
- sh->name = estrdup(eq);
- } else if (strcmp(keyw, "quiet") == 0) {
- free(sh->echoOff);
- sh->echoOff = estrdup(eq);
- *fullSpec = TRUE;
- } else if (strcmp(keyw, "echo") == 0) {
- free(sh->echoOn);
- sh->echoOn = estrdup(eq);
- *fullSpec = TRUE;
- } else if (strcmp(keyw, "filter") == 0) {
- free(sh->noPrint);
- sh->noPrint = estrdup(eq);
- *fullSpec = TRUE;
- } else if (strcmp(keyw, "echoFlag") == 0) {
- free(sh->echo);
- sh->echo = estrdup(eq);
- *fullSpec = TRUE;
- } else if (strcmp(keyw, "errFlag") == 0) {
- free(sh->exit);
- sh->exit = estrdup(eq);
- *fullSpec = TRUE;
- } else if (strcmp(keyw, "hasErrCtl") == 0) {
- sh->hasErrCtl = (*eq == 'Y' || *eq == 'y' ||
- *eq == 'T' || *eq == 't');
- *fullSpec = TRUE;
- } else if (strcmp(keyw, "check") == 0) {
- free(sh->errCheck);
- sh->errCheck = estrdup(eq);
- *fullSpec = TRUE;
- } else if (strcmp(keyw, "ignore") == 0) {
- free(sh->ignErr);
- sh->ignErr = estrdup(eq);
- *fullSpec = TRUE;
- } else if (strcmp(keyw, "builtins") == 0) {
- ArgArray_Done(&sh->builtins);
- brk_string(&sh->builtins, eq, TRUE);
- qsort(sh->builtins.argv + 1, sh->builtins.argc - 1,
- sizeof(char *), sort_builtins);
- *fullSpec = TRUE;
- } else if (strcmp(keyw, "meta") == 0) {
- free(sh->meta);
- sh->meta = estrdup(eq);
- *fullSpec = TRUE;
- } else if (strcmp(keyw, "unsetenv") == 0) {
- sh->unsetenv = (*eq == 'Y' || *eq == 'y' ||
- *eq == 'T' || *eq == 't');
- *fullSpec = TRUE;
- } else {
- Parse_Error(PARSE_FATAL, "unknown keyword in shell "
- "specification '%s'", keyw);
- ArgArray_Done(&aa);
- ShellFree(sh);
- return (NULL);
- }
- }
- ArgArray_Done(&aa);
-
- /*
- * Some checks (could be more)
- */
- if (*fullSpec) {
- if ((sh->echoOn != NULL) ^ (sh->echoOff != NULL)) {
- Parse_Error(PARSE_FATAL, "Shell must have either both "
- "echoOff and echoOn or none of them");
- ShellFree(sh);
- return (NULL);
- }
-
- if (sh->echoOn != NULL && sh->echoOff != NULL)
- sh->hasEchoCtl = TRUE;
- }
-
- return (sh);
-}
-
-/**
- * Parse the builtin shell specifications and put them into the shell
- * list. Then select the default shell to be the current shell. This
- * is called from main() before any parsing (including MAKEFLAGS and
- * command line) is done.
- */
-void
-Shell_Init(void)
-{
- int i;
- struct Shell *sh;
- Boolean fullSpec;
-
- for (i = 0; shells_init[i] != NULL; i++) {
- sh = ShellParseSpec(shells_init[i], &fullSpec);
- TAILQ_INSERT_TAIL(&shells, sh, link);
- if (strcmp(sh->name, DEFSHELLNAME) == 0)
- commandShell = sh;
- }
-}
-
-/**
- * Find a matching shell in 'shells' given its final component.
- *
- * Results:
- * A pointer to a freshly allocated Shell structure with the contents
- * from static description or NULL if no shell with the given name
- * is found.
- */
-static struct Shell *
-ShellMatch(const char *name)
-{
- struct Shell *sh;
-
- TAILQ_FOREACH(sh, &shells, link)
- if (strcmp(sh->name, name) == 0)
- return (sh);
-
- return (NULL);
-}
-
-/**
- * Parse a shell specification and set up commandShell appropriately.
- *
- * Results:
- * TRUE if the specification was correct. FALSE otherwise.
- *
- * Side Effects:
- * commandShell points to a Shell structure.
- * created from the shell spec).
- *
- * Notes:
- * A shell specification consists of a .SHELL target, with dependency
- * operator, followed by a series of blank-separated words. Double
- * quotes can be used to use blanks in words. A backslash escapes
- * anything (most notably a double-quote and a space) and
- * provides the functionality it does in C. Each word consists of
- * keyword and value separated by an equal sign. There should be no
- * unnecessary spaces in the word. The keywords are as follows:
- * name Name of shell.
- * path Location of shell. Overrides "name" if given
- * quiet Command to turn off echoing.
- * echo Command to turn echoing on
- * filter Result of turning off echoing that shouldn't be
- * printed.
- * echoFlag Flag to turn echoing on at the start
- * errFlag Flag to turn error checking on at the start
- * hasErrCtl True if shell has error checking control
- * check Command to turn on error checking if hasErrCtl
- * is TRUE or template of command to echo a command
- * for which error checking is off if hasErrCtl is
- * FALSE.
- * ignore Command to turn off error checking if hasErrCtl
- * is TRUE or template of command to execute a
- * command so as to ignore any errors it returns if
- * hasErrCtl is FALSE.
- * builtins A space separated list of builtins. If one
- * of these builtins is detected when make wants
- * to execute a command line, the command line is
- * handed to the shell. Otherwise make may try to
- * execute the command directly. If this list is empty
- * it is assumed, that the command must always be
- * handed over to the shell.
- * meta The shell meta characters. If this is not specified
- * or empty, commands are alway passed to the shell.
- * Otherwise they are not passed when they contain
- * neither a meta character nor a builtin command.
- * unsetenv Unsetenv("ENV") before executing anything.
- */
-Boolean
-Shell_Parse(const char line[])
-{
- Boolean fullSpec;
- struct Shell *sh;
- struct Shell *match;
-
- /* parse the specification */
- if ((sh = ShellParseSpec(line, &fullSpec)) == NULL)
- return (FALSE);
-
- if (sh->path == NULL) {
- /*
- * If no path was given, the user wants one of the pre-defined
- * shells, yes? So we find the one s/he wants with the help of
- * JobMatchShell and set things up the right way.
- */
- if (sh->name == NULL) {
- Parse_Error(PARSE_FATAL,
- "Neither path nor name specified");
- ShellFree(sh);
- return (FALSE);
- }
- if (fullSpec) {
- /*
- * XXX May want to merge sh into match. But this
- * require ShellParseSpec to return information
- * which attributes actuall have been specified.
- */
- Parse_Error(PARSE_FATAL, "No path specified");
- ShellFree(sh);
- return (FALSE);
- }
- if ((match = ShellMatch(sh->name)) == NULL) {
- Parse_Error(PARSE_FATAL, "%s: no matching shell",
- sh->name);
- ShellFree(sh);
- return (FALSE);
- }
- ShellFree(sh);
- commandShell = match;
-
- return (TRUE);
- }
-
- /*
- * The user provided a path. If s/he gave nothing else
- * (fullSpec is FALSE), try and find a matching shell in the
- * ones we know of. Else we just take the specification at its
- * word and copy it to a new location. In either case, we need
- * to record the path the user gave for the shell.
- */
- if (sh->name == NULL) {
- /* get the base name as the name */
- if ((sh->name = strrchr(sh->path, '/')) == NULL) {
- sh->name = estrdup(sh->path);
- } else {
- sh->name = estrdup(sh->name + 1);
- }
- }
-
- if (!fullSpec) {
- if ((match = ShellMatch(sh->name)) == NULL) {
- Parse_Error(PARSE_FATAL,
- "%s: no matching shell", sh->name);
- ShellFree(sh);
- return (FALSE);
- }
-
- /* set the patch on the matching shell */
- free(match->path);
- match->path = sh->path;
- sh->path = NULL;
-
- ShellFree(sh);
- commandShell = match;
- return (TRUE);
- }
-
- TAILQ_INSERT_HEAD(&shells, sh, link);
-
- /* set the new shell */
- commandShell = sh;
- return (TRUE);
-}
diff --git a/usr.bin/make/shell.h b/usr.bin/make/shell.h
deleted file mode 100644
index a317058..0000000
--- a/usr.bin/make/shell.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1988, 1989 by Adam de Boor
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef shell_h_6002e3b8
-#define shell_h_6002e3b8
-
-#include <sys/queue.h>
-
-#include "str.h"
-#include "util.h"
-
-/**
- * Shell Specifications:
- *
- * Some special stuff goes on if a shell doesn't have error control. In such
- * a case, errCheck becomes a printf template for echoing the command,
- * should echoing be on and ignErr becomes another printf template for
- * executing the command while ignoring the return status. If either of these
- * strings is empty when hasErrCtl is FALSE, the command will be executed
- * anyway as is and if it causes an error, so be it.
- */
-struct Shell {
- TAILQ_ENTRY(Shell) link; /* link all shell descriptions */
-
- /*
- * the name of the shell. For Bourne and C shells, this is used
- * only to find the shell description when used as the single
- * source of a .SHELL target.
- */
- char *name;
-
- char *path; /* full path to the shell */
-
- /* True if both echoOff and echoOn defined */
- Boolean hasEchoCtl;
-
- char *echoOff; /* command to turn off echo */
- char *echoOn; /* command to turn it back on */
-
- /*
- * What the shell prints, and its length, when given the
- * echo-off command. This line will not be printed when
- * received from the shell. This is usually the command which
- * was executed to turn off echoing
- */
- char *noPrint;
-
- /* set if can control error checking for individual commands */
- Boolean hasErrCtl;
-
- /* string to turn error checking on */
- char *errCheck;
-
- /* string to turn off error checking */
- char *ignErr;
-
- char *echo; /* command line flag: echo commands */
- char *exit; /* command line flag: exit on error */
-
- ArgArray builtins; /* ordered list of shell builtins */
- char *meta; /* shell meta characters */
-
- Boolean unsetenv; /* unsetenv("ENV") before exec */
-};
-TAILQ_HEAD(Shells, Shell);
-
-extern struct Shell *commandShell;
-
-void Shell_Init(void);
-Boolean Shell_Parse(const char []);
-
-#endif /* shell_h_6002e3b8 */
diff --git a/usr.bin/make/str.c b/usr.bin/make/str.c
deleted file mode 100644
index 81bb7a3..0000000
--- a/usr.bin/make/str.c
+++ /dev/null
@@ -1,561 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)str.c 5.8 (Berkeley) 6/1/90
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "buf.h"
-#include "globals.h"
-#include "str.h"
-#include "util.h"
-
-/**
- * Initialize the argument array object. The array is initially
- * eight positions, and will be expaned as neccessary. The first
- * position is set to NULL since everything ignores it. We allocate
- * (size + 1) since we need space for the terminating NULL. The
- * buffer is set to NULL, since no common buffer is alloated yet.
- */
-void
-ArgArray_Init(ArgArray *aa)
-{
-
- aa->size = 8;
- aa->argv = emalloc((aa->size + 1) * sizeof(char *));
- aa->argc = 0;
- aa->argv[aa->argc++] = NULL;
- aa->len = 0;
- aa->buffer = NULL;
-}
-
-/**
- * Cleanup the memory allocated for in the argument array object.
- */
-void
-ArgArray_Done(ArgArray *aa)
-{
-
- if (aa->buffer == NULL) {
- int i;
- /* args are individually allocated */
- for (i = 0; i < aa->argc; ++i) {
- if (aa->argv[i]) {
- free(aa->argv[i]);
- aa->argv[i] = NULL;
- }
- }
- } else {
- /* args are part of a single allocation */
- free(aa->buffer);
- aa->buffer = NULL;
- }
- free(aa->argv);
- aa->argv = NULL;
- aa->argc = 0;
- aa->size = 0;
-}
-
-/*-
- * str_concat --
- * concatenate the two strings, inserting a space or slash between them.
- *
- * returns --
- * the resulting string in allocated space.
- */
-char *
-str_concat(const char *s1, const char *s2, int flags)
-{
- int len1, len2;
- char *result;
-
- /* get the length of both strings */
- len1 = strlen(s1);
- len2 = strlen(s2);
-
- /* allocate length plus separator plus EOS */
- result = emalloc(len1 + len2 + 2);
-
- /* copy first string into place */
- memcpy(result, s1, len1);
-
- /* add separator character */
- if (flags & STR_ADDSPACE) {
- result[len1] = ' ';
- ++len1;
- } else if (flags & STR_ADDSLASH) {
- result[len1] = '/';
- ++len1;
- }
-
- /* copy second string plus EOS into place */
- memcpy(result + len1, s2, len2 + 1);
-
- return (result);
-}
-
-/**
- * Fracture a string into an array of words (as delineated by tabs or
- * spaces) taking quotation marks into account. Leading tabs/spaces
- * are ignored.
- */
-void
-brk_string(ArgArray *aa, const char str[], Boolean expand)
-{
- char inquote;
- char *start;
- char *arg;
-
- /* skip leading space chars. */
- for (; *str == ' ' || *str == '\t'; ++str)
- continue;
-
- ArgArray_Init(aa);
-
- aa->buffer = estrdup(str);;
-
- arg = aa->buffer;
- start = arg;
- inquote = '\0';
-
- /*
- * copy the string; at the same time, parse backslashes,
- * quotes and build the argument list.
- */
- for (;;) {
- switch (str[0]) {
- case '"':
- case '\'':
- if (inquote == '\0') {
- inquote = str[0];
- if (expand)
- break;
- if (start == NULL)
- start = arg;
- } else if (inquote == str[0]) {
- inquote = '\0';
- /* Don't miss "" or '' */
- if (start == NULL)
- start = arg;
- if (expand)
- break;
- } else {
- /* other type of quote found */
- if (start == NULL)
- start = arg;
- }
- *arg++ = str[0];
- break;
- case ' ':
- case '\t':
- case '\n':
- if (inquote) {
- if (start == NULL)
- start = arg;
- *arg++ = str[0];
- break;
- }
- if (start == NULL)
- break;
- /* FALLTHROUGH */
- case '\0':
- /*
- * end of a token -- make sure there's enough argv
- * space and save off a pointer.
- */
- if (aa->argc == aa->size) {
- aa->size *= 2; /* ramp up fast */
- aa->argv = erealloc(aa->argv,
- (aa->size + 1) * sizeof(char *));
- }
-
- *arg++ = '\0';
- if (start == NULL) {
- aa->argv[aa->argc] = start;
- return;
- }
- if (str[0] == '\n' || str[0] == '\0') {
- aa->argv[aa->argc++] = start;
- aa->argv[aa->argc] = NULL;
- return;
- } else {
- aa->argv[aa->argc++] = start;
- start = NULL;
- break;
- }
- case '\\':
- if (start == NULL)
- start = arg;
- if (expand) {
- switch (str[1]) {
- case '\0':
- case '\n':
- /* hmmm; fix it up as best we can */
- *arg++ = '\\';
- break;
- case 'b':
- *arg++ = '\b';
- ++str;
- break;
- case 'f':
- *arg++ = '\f';
- ++str;
- break;
- case 'n':
- *arg++ = '\n';
- ++str;
- break;
- case 'r':
- *arg++ = '\r';
- ++str;
- break;
- case 't':
- *arg++ = '\t';
- ++str;
- break;
- default:
- *arg++ = str[1];
- ++str;
- break;
- }
- } else {
- *arg++ = str[0];
- if (str[1] != '\0') {
- ++str;
- *arg++ = str[0];
- }
- }
- break;
- default:
- if (start == NULL)
- start = arg;
- *arg++ = str[0];
- break;
- }
- ++str;
- }
-}
-
-/*
- * Quote a string for appending it to MAKEFLAGS. According to Posix the
- * kind of quoting here is implementation-defined. This quoting must ensure
- * that the parsing of MAKEFLAGS's contents in a sub-shell yields the same
- * options, option arguments and macro definitions as in the calling make.
- * We simply quote all blanks, which according to Posix are space and tab
- * in the POSIX locale. Don't use isblank because in that case makes with
- * different locale settings could not communicate. We must also quote
- * backslashes obviously.
- */
-char *
-MAKEFLAGS_quote(const char *str)
-{
- char *ret, *q;
- const char *p;
-
- /* assume worst case - everything has to be quoted */
- ret = emalloc(strlen(str) * 2 + 1);
-
- p = str;
- q = ret;
- while (*p != '\0') {
- switch (*p) {
-
- case ' ':
- case '\t':
- *q++ = '\\';
- break;
-
- default:
- break;
- }
- *q++ = *p++;
- }
- *q++ = '\0';
- return (ret);
-}
-
-void
-MAKEFLAGS_break(ArgArray *aa, const char str[])
-{
- char *arg;
- char *start;
-
- ArgArray_Init(aa);
-
- aa->buffer = strdup(str);
-
- arg = aa->buffer;
- start = NULL;
-
- for (;;) {
- switch (str[0]) {
- case ' ':
- case '\t':
- /* word separator */
- if (start == NULL) {
- /* not in a word */
- str++;
- continue;
- }
- /* FALLTHRU */
- case '\0':
- if (aa->argc == aa->size) {
- aa->size *= 2;
- aa->argv = erealloc(aa->argv,
- (aa->size + 1) * sizeof(char *));
- }
-
- *arg++ = '\0';
- if (start == NULL) {
- aa->argv[aa->argc] = start;
- return;
- }
- if (str[0] == '\0') {
- aa->argv[aa->argc++] = start;
- aa->argv[aa->argc] = NULL;
- return;
- } else {
- aa->argv[aa->argc++] = start;
- start = NULL;
- str++;
- continue;
- }
-
- case '\\':
- if (str[1] == ' ' || str[1] == '\t')
- str++;
- break;
-
- default:
- break;
- }
- if (start == NULL)
- start = arg;
- *arg++ = *str++;
- }
-}
-
-/*
- * Str_Match --
- *
- * See if a particular string matches a particular pattern.
- *
- * Results: Non-zero is returned if string matches pattern, 0 otherwise. The
- * matching operation permits the following special characters in the
- * pattern: *?\[] (see the man page for details on what these mean).
- *
- * Side effects: None.
- */
-int
-Str_Match(const char *string, const char *pattern)
-{
- char c2;
-
- for (;;) {
- /*
- * See if we're at the end of both the pattern and the
- * string. If, we succeeded. If we're at the end of the
- * pattern but not at the end of the string, we failed.
- */
- if (*pattern == 0)
- return (!*string);
- if (*string == 0 && *pattern != '*')
- return (0);
- /*
- * Check for a "*" as the next pattern character. It matches
- * any substring. We handle this by calling ourselves
- * recursively for each postfix of string, until either we
- * match or we reach the end of the string.
- */
- if (*pattern == '*') {
- pattern += 1;
- if (*pattern == 0)
- return (1);
- while (*string != 0) {
- if (Str_Match(string, pattern))
- return (1);
- ++string;
- }
- return (0);
- }
- /*
- * Check for a "?" as the next pattern character. It matches
- * any single character.
- */
- if (*pattern == '?')
- goto thisCharOK;
- /*
- * Check for a "[" as the next pattern character. It is
- * followed by a list of characters that are acceptable, or
- * by a range (two characters separated by "-").
- */
- if (*pattern == '[') {
- ++pattern;
- for (;;) {
- if ((*pattern == ']') || (*pattern == 0))
- return (0);
- if (*pattern == *string)
- break;
- if (pattern[1] == '-') {
- c2 = pattern[2];
- if (c2 == 0)
- return (0);
- if ((*pattern <= *string) &&
- (c2 >= *string))
- break;
- if ((*pattern >= *string) &&
- (c2 <= *string))
- break;
- pattern += 2;
- }
- ++pattern;
- }
- while ((*pattern != ']') && (*pattern != 0))
- ++pattern;
- goto thisCharOK;
- }
- /*
- * If the next pattern character is '/', just strip off the
- * '/' so we do exact matching on the character that follows.
- */
- if (*pattern == '\\') {
- ++pattern;
- if (*pattern == 0)
- return (0);
- }
- /*
- * There's no special character. Just make sure that the
- * next characters of each string match.
- */
- if (*pattern != *string)
- return (0);
-thisCharOK: ++pattern;
- ++string;
- }
-}
-
-
-/**
- * Str_SYSVMatch
- * Check word against pattern for a match (% is wild),
- *
- * Results:
- * Returns the beginning position of a match or null. The number
- * of characters matched is returned in len.
- */
-const char *
-Str_SYSVMatch(const char *word, const char *pattern, int *len)
-{
- const char *m, *p, *w;
-
- p = pattern;
- w = word;
-
- if (*w == '\0') {
- /* Zero-length word cannot be matched against */
- *len = 0;
- return (NULL);
- }
-
- if (*p == '\0') {
- /* Null pattern is the whole string */
- *len = strlen(w);
- return (w);
- }
-
- if ((m = strchr(p, '%')) != NULL) {
- /* check that the prefix matches */
- for (; p != m && *w && *w == *p; w++, p++)
- continue;
-
- if (p != m)
- return (NULL); /* No match */
-
- if (*++p == '\0') {
- /* No more pattern, return the rest of the string */
- *len = strlen(w);
- return (w);
- }
- }
-
- m = w;
-
- /* Find a matching tail */
- do
- if (strcmp(p, w) == 0) {
- *len = w - m;
- return (m);
- }
- while (*w++ != '\0');
-
- return (NULL);
-}
-
-
-/**
- * Str_SYSVSubst
- * Substitute '%' on the pattern with len characters from src.
- * If the pattern does not contain a '%' prepend len characters
- * from src.
- *
- * Side Effects:
- * Places result on buf
- */
-void
-Str_SYSVSubst(Buffer *buf, const char *pat, const char *src, int len)
-{
- const char *m;
-
- if ((m = strchr(pat, '%')) != NULL) {
- /* Copy the prefix */
- Buf_AppendRange(buf, pat, m);
- /* skip the % */
- pat = m + 1;
- }
-
- /* Copy the pattern */
- Buf_AddBytes(buf, len, (const Byte *)src);
-
- /* append the rest */
- Buf_Append(buf, pat);
-}
diff --git a/usr.bin/make/str.h b/usr.bin/make/str.h
deleted file mode 100644
index e8cf10c..0000000
--- a/usr.bin/make/str.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef str_h_44db59e6
-#define str_h_44db59e6
-
-#include "util.h"
-
-struct Buffer;
-
-/**
- * An array of c-strings. The pointers stored in argv, point to
- * strings stored in buffer.
- */
-typedef struct ArgArray {
- int size; /* size of argv array */
- int argc; /* strings referenced in argv */
- char **argv; /* array of string pointers */
- size_t len; /* size of buffer */
- char *buffer; /* data buffer */
-} ArgArray;
-
-/*
- * These constants are all used by the Str_Concat function to decide how the
- * final string should look. If STR_ADDSPACE is given, a space will be
- * placed between the two strings. If STR_ADDSLASH is given, a '/' will
- * be used instead of a space. If neither is given, no intervening characters
- * will be placed between the two strings in the final output.
- */
-#define STR_ADDSPACE 0x01 /* add a space when Str_Concat'ing */
-#define STR_ADDSLASH 0x04 /* add a slash when Str_Concat'ing */
-
-void ArgArray_Init(ArgArray *);
-void ArgArray_Done(ArgArray *);
-
-char *str_concat(const char *, const char *, int);
-void brk_string(ArgArray *, const char [], Boolean);
-char *MAKEFLAGS_quote(const char *);
-void MAKEFLAGS_break(ArgArray *, const char []);
-int Str_Match(const char *, const char *);
-const char *Str_SYSVMatch(const char *, const char *, int *);
-void Str_SYSVSubst(struct Buffer *, const char *, const char *, int);
-
-#endif /* str_h_44db59e6 */
diff --git a/usr.bin/make/suff.c b/usr.bin/make/suff.c
deleted file mode 100644
index 7aa96f6..0000000
--- a/usr.bin/make/suff.c
+++ /dev/null
@@ -1,2204 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)suff.c 8.4 (Berkeley) 3/21/94
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*-
- * suff.c --
- * Functions to maintain suffix lists and find implicit dependents
- * using suffix transformation rules
- *
- * Interface:
- * Suff_Init Initialize all things to do with suffixes.
- *
- * Suff_DoPaths This function is used to make life easier
- * when searching for a file according to its
- * suffix. It takes the global search path,
- * as defined using the .PATH: target, and appends
- * its directories to the path of each of the
- * defined suffixes, as specified using
- * .PATH<suffix>: targets. In addition, all
- * directories given for suffixes labeled as
- * include files or libraries, using the .INCLUDES
- * or .LIBS targets, are played with using
- * Dir_MakeFlags to create the .INCLUDES and
- * .LIBS global variables.
- *
- * Suff_ClearSuffixes Clear out all the suffixes and defined
- * transformations.
- *
- * Suff_IsTransform Return TRUE if the passed string is the lhs
- * of a transformation rule.
- *
- * Suff_AddSuffix Add the passed string as another known suffix.
- *
- * Suff_GetPath Return the search path for the given suffix.
- *
- * Suff_AddInclude Mark the given suffix as denoting an include
- * file.
- *
- * Suff_AddLib Mark the given suffix as denoting a library.
- *
- * Suff_AddTransform Add another transformation to the suffix
- * graph. Returns GNode suitable for framing, I
- * mean, tacking commands, attributes, etc. on.
- *
- * Suff_SetNull Define the suffix to consider the suffix of
- * any file that doesn't have a known one.
- *
- * Suff_FindDeps Find implicit sources for and the location of
- * a target based on its suffix. Returns the
- * bottom-most node added to the graph or NULL
- * if the target had no implicit sources.
- */
-
-#include <sys/queue.h>
-#include <assert.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "arch.h"
-#include "buf.h"
-#include "config.h"
-#include "dir.h"
-#include "globals.h"
-#include "GNode.h"
-#include "lst.h"
-#include "make.h"
-#include "parse.h"
-#include "str.h"
-#include "suff.h"
-#include "targ.h"
-#include "util.h"
-#include "var.h"
-
-/* Lst of suffixes */
-static Lst sufflist = Lst_Initializer(sufflist);
-
-/* Lst of suffixes to be cleaned */
-static Lst suffClean = Lst_Initializer(suffClean);
-
-/* Lst of sources */
-static Lst srclist = Lst_Initializer(srclist);
-
-/* Lst of transformation rules */
-static Lst transforms = Lst_Initializer(transforms);
-
-/* Counter for assigning suffix numbers */
-static int sNum = 0;
-
-/*
- * Structure describing an individual suffix.
- */
-typedef struct Suff {
- char *name; /* The suffix itself */
- int nameLen; /* Length of the suffix */
- short flags; /* Type of suffix */
-#define SUFF_INCLUDE 0x01 /* One which is #include'd */
-#define SUFF_LIBRARY 0x02 /* One which contains a library */
-#define SUFF_NULL 0x04 /* The empty suffix */
- struct Path searchPath; /* Path for files with this suffix */
- int sNum; /* The suffix number */
- int refCount; /* Reference count of list membership */
- Lst parents; /* Suffixes we have a transformation to */
- Lst children; /* Suffixes we have a transformation from */
- Lst ref; /* List of lists this suffix is referenced */
-} Suff;
-
-/*
- * Structure used in the search for implied sources.
- */
-typedef struct Src {
- char *file; /* The file to look for */
- char *pref; /* Prefix from which file was formed */
- Suff *suff; /* The suffix on the file */
- struct Src *parent; /* The Src for which this is a source */
- GNode *node; /* The node describing the file */
- int children; /* Count of existing children (so we don't free
- * this thing too early or never nuke it) */
-#ifdef DEBUG_SRC
- Lst cp; /* Debug; children list */
-#endif
-} Src;
-
-/* The NULL suffix for this run */
-static Suff *suffNull;
-
-/* The empty suffix required for POSIX single-suffix transformation rules */
-static Suff *emptySuff;
-
-static void SuffFindDeps(GNode *, Lst *);
-
-
-/*-
- *-----------------------------------------------------------------------
- * SuffSuffIsSuffix --
- * See if suff is a suffix of str.
- *
- * Results:
- * NULL if it ain't, pointer to character in str before suffix if
- * it is.
- *
- * Side Effects:
- * None
- *-----------------------------------------------------------------------
- */
-static char *
-SuffSuffIsSuffix(const Suff *s, char *str)
-{
- const char *p1; /* Pointer into suffix name */
- char *p2; /* Pointer into string being examined */
- size_t len;
-
- len = strlen(str);
- p1 = s->name + s->nameLen;
- p2 = str + len;
-
- while (p1 >= s->name && len > 0 && *p1 == *p2) {
- p1--;
- p2--;
- len--;
- }
-
- return (p1 == s->name - 1 ? p2 : NULL);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * SuffSuffFind --
- * Find a suffix given its name.
- *
- * Results:
- * The suffix or NULL.
- *
- * Side Effects:
- * None
- *-----------------------------------------------------------------------
- */
-static Suff *
-SuffSuffFind(const char *s)
-{
- LstNode *ln;
-
- LST_FOREACH(ln, &sufflist) {
- if (strcmp(s, ((const Suff *)Lst_Datum(ln))->name) == 0)
- return (Lst_Datum(ln));
- }
- return (NULL);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * SuffTransFind
- * Find a transform.
- *
- * Results:
- * transform or NULL.
- *
- * Side Effects:
- * None
- *-----------------------------------------------------------------------
- */
-static GNode *
-SuffTransFind(const char *name)
-{
- LstNode *ln;
-
- LST_FOREACH(ln, &transforms) {
- if (strcmp(name, ((const GNode *)Lst_Datum(ln))->name) == 0)
- return (Lst_Datum(ln));
- }
- return (NULL);
-}
-
- /*********** Maintenance Functions ************/
-
-#if 0
-/*
- * Keep this function for now until it is clear why a .SUFFIXES: doesn't
- * actually delete the suffixes but just puts them on the suffClean list.
- */
-/*-
- *-----------------------------------------------------------------------
- * SuffFree --
- * Free up all memory associated with the given suffix structure.
- *
- * Results:
- * none
- *
- * Side Effects:
- * the suffix entry is detroyed
- *-----------------------------------------------------------------------
- */
-static void
-SuffFree(void *sp)
-{
- Suff *s = sp;
-
- if (s == suffNull)
- suffNull = NULL;
-
- if (s == emptySuff)
- emptySuff = NULL;
-
- Lst_Destroy(&s->ref, NOFREE);
- Lst_Destroy(&s->children, NOFREE);
- Lst_Destroy(&s->parents, NOFREE);
- Lst_Destroy(&s->searchPath, Dir_Destroy);
-
- free(s->name);
- free(s);
-}
-#endif
-
-/*-
- *-----------------------------------------------------------------------
- * SuffRemove --
- * Remove the suffix into the list
- *
- * Results:
- * None
- *
- * Side Effects:
- * The reference count for the suffix is decremented
- *-----------------------------------------------------------------------
- */
-static void
-SuffRemove(Lst *l, Suff *s)
-{
- LstNode *ln = Lst_Member(l, s);
-
- if (ln != NULL) {
- Lst_Remove(l, ln);
- s->refCount--;
- }
-}
-
-/*-
- *-----------------------------------------------------------------------
- * SuffInsert --
- * Insert the suffix into the list keeping the list ordered by suffix
- * numbers.
- *
- * Results:
- * None
- *
- * Side Effects:
- * The reference count of the suffix is incremented
- *-----------------------------------------------------------------------
- */
-static void
-SuffInsert(Lst *l, Suff *s)
-{
- LstNode *ln; /* current element in l we're examining */
- Suff *s2; /* the suffix descriptor in this element */
-
- s2 = NULL;
- for (ln = Lst_First(l); ln != NULL; ln = Lst_Succ(ln)) {
- s2 = Lst_Datum(ln);
- if (s2->sNum >= s->sNum)
- break;
- }
- if (s2 == NULL) {
- DEBUGF(SUFF, ("inserting an empty list?..."));
- }
-
- DEBUGF(SUFF, ("inserting %s(%d)...", s->name, s->sNum));
- if (ln == NULL) {
- DEBUGF(SUFF, ("at end of list\n"));
- Lst_AtEnd(l, s);
- s->refCount++;
- Lst_AtEnd(&s->ref, l);
- } else if (s2->sNum != s->sNum) {
- DEBUGF(SUFF, ("before %s(%d)\n", s2->name, s2->sNum));
- Lst_Insert(l, ln, s);
- s->refCount++;
- Lst_AtEnd(&s->ref, l);
- } else {
- DEBUGF(SUFF, ("already there\n"));
- }
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Suff_ClearSuffixes --
- * This is gross. Nuke the list of suffixes but keep all transformation
- * rules around. The transformation graph is destroyed in this process,
- * but we leave the list of rules so when a new graph is formed the rules
- * will remain.
- * This function is called from the parse module when a
- * .SUFFIXES:\n line is encountered.
- *
- * Results:
- * none
- *
- * Side Effects:
- * the sufflist and its graph nodes are destroyed
- *-----------------------------------------------------------------------
- */
-void
-Suff_ClearSuffixes(void)
-{
-
- Lst_Concat(&suffClean, &sufflist, LST_CONCLINK);
-
- sNum = 1;
- suffNull = emptySuff;
- /*
- * Clear suffNull's children list (the other suffixes are built new, but
- * suffNull is used as is).
- * NOFREE is used because all suffixes are are on the suffClean list.
- * suffNull should not have parents.
- */
- Lst_Destroy(&suffNull->children, NOFREE);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * SuffParseTransform --
- * Parse a transformation string to find its two component suffixes.
- *
- * Results:
- * TRUE if the string is a valid transformation and FALSE otherwise.
- *
- * Side Effects:
- * The passed pointers are overwritten.
- *
- *-----------------------------------------------------------------------
- */
-static Boolean
-SuffParseTransform(char *str, Suff **srcPtr, Suff **targPtr)
-{
- LstNode *srcLn; /* element in suffix list of trans source*/
- Suff *src; /* Source of transformation */
- char *str2; /* Extra pointer (maybe target suffix) */
- LstNode *singleLn; /* element in suffix list of any suffix
- * that exactly matches str */
- Suff *single = NULL; /* Source of possible transformation to
- * null suffix */
-
- singleLn = NULL;
-
- /*
- * Loop looking first for a suffix that matches the start of the
- * string and then for one that exactly matches the rest of it. If
- * we can find two that meet these criteria, we've successfully
- * parsed the string.
- */
- srcLn = Lst_First(&sufflist);
- for (;;) {
- /* advance to next possible suffix */
- while (srcLn != NULL) {
- src = Lst_Datum(srcLn);
- if (strncmp(str, src->name, strlen(src->name)) == 0)
- break;
- srcLn = LST_NEXT(srcLn);
- }
-
- if (srcLn == NULL) {
- /*
- * Ran out of source suffixes -- no such rule
- */
- if (singleLn != NULL) {
- /*
- * Not so fast Mr. Smith! There was a suffix
- * that encompassed the entire string, so we
- * assume it was a transformation to the null
- * suffix (thank you POSIX). We still prefer to
- * find a double rule over a singleton, hence we
- * leave this check until the end.
- *
- * XXX: Use emptySuff over suffNull?
- */
- *srcPtr = single;
- *targPtr = suffNull;
- return (TRUE);
- }
- return (FALSE);
- }
- str2 = str + src->nameLen;
- if (*str2 == '\0') {
- single = src;
- singleLn = srcLn;
- } else {
-
- *targPtr = SuffSuffFind(str2);
- if (*targPtr != NULL) {
- *srcPtr = src;
- return (TRUE);
- }
- }
- /* next one */
- srcLn = LST_NEXT(srcLn);
- }
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Suff_IsTransform --
- * Return TRUE if the given string is a transformation rule
- *
- *
- * Results:
- * TRUE if the string is a concatenation of two known suffixes.
- * FALSE otherwise
- *
- * Side Effects:
- * None
- *-----------------------------------------------------------------------
- */
-Boolean
-Suff_IsTransform(char *str)
-{
- Suff *src, *targ;
-
- return (SuffParseTransform(str, &src, &targ));
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Suff_AddTransform --
- * Add the transformation rule described by the line to the
- * list of rules and place the transformation itself in the graph
- *
- * Results:
- * The node created for the transformation in the transforms list
- *
- * Side Effects:
- * The node is placed on the end of the transforms Lst and links are
- * made between the two suffixes mentioned in the target name
- *-----------------------------------------------------------------------
- */
-GNode *
-Suff_AddTransform(char *line)
-{
- GNode *gn; /* GNode of transformation rule */
- Suff *s; /* source suffix */
- Suff *t; /* target suffix */
-
- gn = SuffTransFind(line);
- if (gn == NULL) {
- /*
- * Make a new graph node for the transformation.
- * It will be filled in by the Parse module.
- */
- gn = Targ_NewGN(line);
- Lst_AtEnd(&transforms, gn);
- } else {
- /*
- * New specification for transformation rule. Just nuke the
- * old list of commands so they can be filled in again...
- * We don't actually free the commands themselves, because a
- * given command can be attached to several different
- * transformations.
- */
- Lst_Destroy(&gn->commands, NOFREE);
- Lst_Destroy(&gn->children, NOFREE);
- }
-
- gn->type = OP_TRANSFORM;
-
- SuffParseTransform(line, &s, &t);
-
- /*
- * link the two together in the proper relationship and order
- */
- DEBUGF(SUFF, ("defining transformation from `%s' to `%s'\n",
- s->name, t->name));
- SuffInsert(&t->children, s);
- SuffInsert(&s->parents, t);
-
- return (gn);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Suff_EndTransform --
- * Handle the finish of a transformation definition, removing the
- * transformation from the graph if it has neither commands nor
- * sources. This is called from the Parse module at the end of
- * a dependency block.
- *
- * Side Effects:
- * If the node has no commands or children, the children and parents
- * lists of the affected suffices are altered.
- *
- *-----------------------------------------------------------------------
- */
-void
-Suff_EndTransform(const GNode *gn)
-{
- Suff *s, *t;
-
- if (!Lst_IsEmpty(&gn->commands) || !Lst_IsEmpty(&gn->children)) {
- DEBUGF(SUFF, ("transformation %s complete\n", gn->name));
- return;
- }
-
- /*
- * SuffParseTransform() may fail for special rules which are not
- * actual transformation rules (e.g., .DEFAULT).
- */
- if (!SuffParseTransform(gn->name, &s, &t))
- return;
-
- DEBUGF(SUFF, ("deleting transformation from `%s' to `%s'\n",
- s->name, t->name));
-
- /*
- * Remove the source from the target's children list. We check
- * for a NULL return to handle a beanhead saying something like
- * .c.o .c.o:
- *
- * We'll be called twice when the next target is seen, but .c
- * and .o are only linked once...
- */
- SuffRemove(&t->children, s);
-
- /*
- * Remove the target from the source's parents list
- */
- SuffRemove(&s->parents, t);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * SuffRebuildGraph --
- * Called from Suff_AddSuffix via LST_FOREACH to search through the
- * list of existing transformation rules and rebuild the transformation
- * graph when it has been destroyed by Suff_ClearSuffixes. If the
- * given rule is a transformation involving this suffix and another,
- * existing suffix, the proper relationship is established between
- * the two.
- *
- * Side Effects:
- * The appropriate links will be made between this suffix and
- * others if transformation rules exist for it.
- *
- *-----------------------------------------------------------------------
- */
-static void
-SuffRebuildGraph(const GNode *transform, Suff *s)
-{
- char *cp;
- Suff *s2 = NULL;
-
- /*
- * First see if it is a transformation from this suffix.
- */
- if (strncmp(transform->name, s->name, strlen(s->name)) == 0) {
- cp = transform->name + strlen(s->name);
-
- if (cp[0] == '\0') /* null rule */
- s2 = suffNull;
- else
- s2 = SuffSuffFind(cp);
- if (s2 != NULL) {
- /*
- * Found target. Link in and return, since it can't be
- * anything else.
- */
- SuffInsert(&s2->children, s);
- SuffInsert(&s->parents, s2);
- return;
- }
- }
-
- /*
- * Not from, maybe to?
- */
- cp = SuffSuffIsSuffix(s, transform->name);
- if (cp != NULL) {
- /*
- * Null-terminate the source suffix in order to find it.
- */
- cp[1] = '\0';
- s2 = SuffSuffFind(transform->name);
-
- /*
- * Replace the start of the target suffix
- */
- cp[1] = s->name[0];
- if (s2 != NULL) {
- /*
- * Found it -- establish the proper relationship
- */
- SuffInsert(&s->children, s2);
- SuffInsert(&s2->parents, s);
- }
- }
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Suff_AddSuffix --
- * Add the suffix in string to the end of the list of known suffixes.
- * Should we restructure the suffix graph? Make doesn't...
- *
- * Results:
- * None
- *
- * Side Effects:
- * A GNode is created for the suffix and a Suff structure is created and
- * added to the suffixes list unless the suffix was already known.
- *-----------------------------------------------------------------------
- */
-void
-Suff_AddSuffix(char *str)
-{
- Suff *s; /* new suffix descriptor */
- LstNode *ln;
-
- if (SuffSuffFind(str) != NULL)
- /*
- * Already known
- */
- return;
-
- s = emalloc(sizeof(Suff));
-
- s->name = estrdup(str);
- s->nameLen = strlen(s->name);
- TAILQ_INIT(&s->searchPath);
- Lst_Init(&s->children);
- Lst_Init(&s->parents);
- Lst_Init(&s->ref);
- s->sNum = sNum++;
- s->flags = 0;
- s->refCount = 0;
-
- Lst_AtEnd(&sufflist, s);
-
- /*
- * Look for any existing transformations from or to this suffix.
- * XXX: Only do this after a Suff_ClearSuffixes?
- */
- LST_FOREACH(ln, &transforms)
- SuffRebuildGraph(Lst_Datum(ln), s);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Suff_GetPath --
- * Return the search path for the given suffix, if it's defined.
- *
- * Results:
- * The searchPath for the desired suffix or NULL if the suffix isn't
- * defined.
- *
- * Side Effects:
- * None
- *-----------------------------------------------------------------------
- */
-struct Path *
-Suff_GetPath(char *sname)
-{
- Suff *s;
-
- s = SuffSuffFind(sname);
- if (s == NULL)
- return (NULL);
- return (&s->searchPath);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Suff_DoPaths --
- * Extend the search paths for all suffixes to include the default
- * search path.
- *
- * Results:
- * None.
- *
- * Side Effects:
- * The searchPath field of all the suffixes is extended by the
- * directories in dirSearchPath. If paths were specified for the
- * ".h" suffix, the directories are stuffed into a global variable
- * called ".INCLUDES" with each directory preceded by a -I. The same
- * is done for the ".a" suffix, except the variable is called
- * ".LIBS" and the flag is -L.
- *-----------------------------------------------------------------------
- */
-void
-Suff_DoPaths(void)
-{
- Suff *s;
- LstNode *ln;
- char *ptr;
- struct Path inIncludes; /* Cumulative .INCLUDES path */
- struct Path inLibs; /* Cumulative .LIBS path */
-
- TAILQ_INIT(&inIncludes);
- TAILQ_INIT(&inLibs);
-
- for (ln = Lst_First(&sufflist); ln != NULL; ln = Lst_Succ(ln)) {
- s = Lst_Datum(ln);
-#ifdef INCLUDES
- if (s->flags & SUFF_INCLUDE) {
- Path_Concat(&inIncludes, &s->searchPath);
- }
-#endif /* INCLUDES */
-#ifdef LIBRARIES
- if (s->flags & SUFF_LIBRARY) {
- Path_Concat(&inLibs, &s->searchPath);
- }
-#endif /* LIBRARIES */
- Path_Concat(&s->searchPath, &dirSearchPath);
- }
-
- ptr = Path_MakeFlags("-I", &inIncludes);
- Var_Set(".INCLUDES", ptr, VAR_GLOBAL);
- free(ptr);
-
- ptr = Path_MakeFlags("-L", &inLibs);
- Var_Set(".LIBS", ptr, VAR_GLOBAL);
- free(ptr);
-
- Path_Clear(&inIncludes);
- Path_Clear(&inLibs);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Suff_AddInclude --
- * Add the given suffix as a type of file which gets included.
- * Called from the parse module when a .INCLUDES line is parsed.
- * The suffix must have already been defined.
- *
- * Results:
- * None.
- *
- * Side Effects:
- * The SUFF_INCLUDE bit is set in the suffix's flags field
- *
- *-----------------------------------------------------------------------
- */
-void
-Suff_AddInclude(char *sname)
-{
- Suff *s;
-
- if ((s = SuffSuffFind(sname)) != NULL)
- s->flags |= SUFF_INCLUDE;
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Suff_AddLib --
- * Add the given suffix as a type of file which is a library.
- * Called from the parse module when parsing a .LIBS line. The
- * suffix must have been defined via .SUFFIXES before this is
- * called.
- *
- * Results:
- * None.
- *
- * Side Effects:
- * The SUFF_LIBRARY bit is set in the suffix's flags field
- *
- *-----------------------------------------------------------------------
- */
-void
-Suff_AddLib(char *sname)
-{
- Suff *s;
-
- if ((s = SuffSuffFind(sname)) != NULL)
- s->flags |= SUFF_LIBRARY;
-}
-
-/*
- * Create a new Src structure
- */
-static Src *
-SuffSrcCreate(char *file, char *prefix, Suff *suff, Src *parent, GNode *node)
-{
- Src *s;
-
- s = emalloc(sizeof(*s));
- s->file = file;
- s->pref = prefix;
- s->suff = suff;
- s->parent = parent;
- s->node = node;
- s->children = 0;
-
-#ifdef DEBUG_SRC
- Lst_Init(&s->cp);
-#endif
-
- return (s);
-}
-
- /********** Implicit Source Search Functions *********/
-
-/*-
- *-----------------------------------------------------------------------
- * SuffAddLevel --
- * Add all the children of targ as Src structures to the given list:
- * Add a suffix as a Src structure to the given list with its parent
- * being the given Src structure. If the suffix is the null suffix,
- * the prefix is used unaltered as the file name in the Src structure.
- *
- * Results:
- * None
- *
- * Side Effects:
- * Lots of structures are created and added to the list
- *-----------------------------------------------------------------------
- */
-static void
-SuffAddLevel(Lst *l, Src *targ)
-{
- LstNode *ln;
- Suff *suff;
- Src *s2;
-#ifdef DEBUG_SRC
- const LstNode *ln1;
-#endif
-
- LST_FOREACH(ln, &targ->suff->children) {
- suff = Lst_Datum(ln);
-
- if ((suff->flags & SUFF_NULL) && *suff->name != '\0') {
- /*
- * If the suffix has been marked as the NULL suffix,
- * also create a Src structure for a file with no suffix
- * attached. Two birds, and all that...
- */
- s2 = SuffSrcCreate(estrdup(targ->pref), targ->pref,
- suff, targ, NULL);
- suff->refCount++;
- targ->children += 1;
- Lst_AtEnd(l, s2);
-#ifdef DEBUG_SRC
- Lst_AtEnd(&targ->cp, s2);
- printf("1 add %p %p to %p:", targ, s2, l);
- LST_FOREACH(ln1, l)
- printf("%p ", (const void *)Lst_Datum(ln1));
- printf("\n");
-#endif
- }
- s2 = SuffSrcCreate(str_concat(targ->pref, suff->name, 0),
- targ->pref, suff, targ, NULL);
- suff->refCount++;
- targ->children += 1;
- Lst_AtEnd(l, s2);
-#ifdef DEBUG_SRC
- Lst_AtEnd(&targ->cp, s2);
- printf("2 add %p %p to %p:", targ, s2, l);
- LST_FOREACH(ln1, l)
- printf("%p ", (const void *)Lst_Datum(ln1));
- printf("\n");
-#endif
- }
-}
-
-/*-
- *----------------------------------------------------------------------
- * SuffRemoveSrc --
- * Free all src structures in list that don't have a reference count
- * XXX this actually frees only the first of these.
- *
- * Results:
- * True if a src was removed
- *
- * Side Effects:
- * The memory is free'd.
- *----------------------------------------------------------------------
- */
-static int
-SuffRemoveSrc(Lst *l)
-{
- LstNode *ln, *ln1;
- Src *s;
- int t = 0;
-
-#ifdef DEBUG_SRC
- printf("cleaning %lx: ", (unsigned long) l);
- LST_FOREACH(ln, l)
- printf("%p ", (const void *)Lst_Datum(ln));
- printf("\n");
-#endif
-
- for (ln = Lst_First(l); ln != NULL; ln = ln1) {
- ln1 = Lst_Succ(ln);
-
- s = (Src *)Lst_Datum(ln);
- if (s->children == 0) {
- free(s->file);
- if (!s->parent)
- free(s->pref);
- else {
-#ifdef DEBUG_SRC
- LstNode *ln = Lst_Member(&s->parent->cp, s);
- if (ln != NULL)
- Lst_Remove(&s->parent->cp, ln);
-#endif
- --s->parent->children;
- }
-#ifdef DEBUG_SRC
- printf("free: [l=%p] p=%p %d\n", l, s, s->children);
- Lst_Destroy(&s->cp, NOFREE);
-#endif
- Lst_Remove(l, ln);
- free(s);
- t |= 1;
- return (TRUE);
- }
-#ifdef DEBUG_SRC
- else {
- const LstNode *tln;
-
- printf("keep: [l=%p] p=%p %d: ", l, s, s->children);
- LST_FOREACH(tln, &s->cp)
- printf("%p ", (const void *)Lst_Datum(tln));
- printf("\n");
- }
-#endif
- }
-
- return (t);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * SuffFindThem --
- * Find the first existing file/target in the list srcs
- *
- * Results:
- * The lowest structure in the chain of transformations
- *
- * Side Effects:
- * None
- *-----------------------------------------------------------------------
- */
-static Src *
-SuffFindThem(Lst *srcs, Lst *slst)
-{
- Src *s; /* current Src */
- Src *rs; /* returned Src */
- char *ptr;
-
- rs = NULL;
-
- while (!Lst_IsEmpty (srcs)) {
- s = Lst_DeQueue(srcs);
-
- DEBUGF(SUFF, ("\ttrying %s...", s->file));
-
- /*
- * A file is considered to exist if either a node exists in the
- * graph for it or the file actually exists.
- */
- if (Targ_FindNode(s->file, TARG_NOCREATE) != NULL) {
-#ifdef DEBUG_SRC
- printf("remove %p from %p\n", s, srcs);
-#endif
- rs = s;
- break;
- }
-
- if ((ptr = Path_FindFile(s->file,
- &s->suff->searchPath)) != NULL) {
- rs = s;
-#ifdef DEBUG_SRC
- printf("remove %p from %p\n", s, srcs);
-#endif
- free(ptr);
- break;
- }
-
- DEBUGF(SUFF, ("not there\n"));
-
- SuffAddLevel(srcs, s);
- Lst_AtEnd(slst, s);
- }
-
- if (rs) {
- DEBUGF(SUFF, ("got it\n"));
- }
- return (rs);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * SuffFindCmds --
- * See if any of the children of the target in the Src structure is
- * one from which the target can be transformed. If there is one,
- * a Src structure is put together for it and returned.
- *
- * Results:
- * The Src structure of the "winning" child, or NULL if no such beast.
- *
- * Side Effects:
- * A Src structure may be allocated.
- *
- *-----------------------------------------------------------------------
- */
-static Src *
-SuffFindCmds(Src *targ, Lst *slst)
-{
- LstNode *ln; /* General-purpose list node */
- GNode *t; /* Target GNode */
- GNode *s; /* Source GNode */
- int prefLen;/* The length of the defined prefix */
- Suff *suff; /* Suffix on matching beastie */
- Src *ret; /* Return value */
- char *cp;
-
- t = targ->node;
- prefLen = strlen(targ->pref);
-
- for (ln = Lst_First(&t->children); ln != NULL; ln = Lst_Succ(ln)) {
- s = Lst_Datum(ln);
-
- cp = strrchr(s->name, '/');
- if (cp == NULL) {
- cp = s->name;
- } else {
- cp++;
- }
- if (strncmp(cp, targ->pref, prefLen) == 0) {
- /*
- * The node matches the prefix ok, see if it has
- * a known suffix.
- */
- suff = SuffSuffFind(&cp[prefLen]);
- if (suff != NULL) {
- /*
- * It even has a known suffix, see if there's
- * a transformation defined between the node's
- * suffix and the target's suffix.
- *
- * XXX: Handle multi-stage transformations
- * here, too.
- */
- if (Lst_Member(&suff->parents,
- targ->suff) != NULL) {
- /*
- * Hot Damn! Create a new Src structure
- * to describe this transformation
- * (making sure to duplicate the
- * source node's name so Suff_FindDeps
- * can free it again (ick)), and return
- * the new structure.
- */
- ret = SuffSrcCreate(estrdup(s->name),
- targ->pref, suff, targ, s);
- suff->refCount++;
- targ->children += 1;
-#ifdef DEBUG_SRC
- printf("3 add %p %p\n", &targ, ret);
- Lst_AtEnd(&targ->cp, ret);
-#endif
- Lst_AtEnd(slst, ret);
- DEBUGF(SUFF, ("\tusing existing source "
- "%s\n", s->name));
- return (ret);
- }
- }
- }
- }
- return (NULL);
-}
-
-/*-
- * The child node contains variable references. Expand them and return
- * a list of expansions.
- */
-static void
-SuffExpandVariables(GNode *parent, GNode *child, Lst *members)
-{
- Buffer *buf;
- char *cp;
- char *start;
-
- Lst_Init(members);
-
- DEBUGF(SUFF, ("Expanding \"%s\"...", child->name));
- buf = Var_Subst(child->name, parent, TRUE);
- cp = Buf_Data(buf);
-
- if (child->type & OP_ARCHV) {
- /*
- * Node was an archive(member) target, so we
- * want to call on the Arch module to find the
- * nodes for us, expanding variables in the
- * parent's context.
- */
- Arch_ParseArchive(&cp, members, parent);
- Buf_Destroy(buf, TRUE);
- return;
- }
- /*
- * Break the result into a vector of strings whose nodes we can find,
- * then add those nodes to the members list. Unfortunately, we can't use
- * brk_string b/c it doesn't understand about variable specifications
- * with spaces in them... XXX
- */
- for (start = cp; *start == ' ' || *start == '\t'; start++)
- ;
-
- for (cp = start; *cp != '\0'; cp++) {
- if (*cp == ' ' || *cp == '\t') {
- /*
- * White-space -- terminate element, find the node,
- * add it, skip any further spaces.
- */
- *cp++ = '\0';
- Lst_AtEnd(members, Targ_FindNode(start, TARG_CREATE));
-
- while (*cp == ' ' || *cp == '\t') {
- cp++;
- }
- /*
- * Adjust cp for increment at
- * start of loop, but set start
- * to first non-space.
- */
- start = cp--;
-
- } else if (*cp == '$') {
- /*
- * Start of a variable spec -- contact variable module
- * to find the end so we can skip over it.
- */
- char *junk;
- size_t len = 0;
- Boolean doFree;
-
- junk = Var_Parse(cp, parent, TRUE, &len, &doFree);
- if (junk != var_Error) {
- cp += len - 1;
- }
- if (doFree) {
- free(junk);
- }
-
- } else if (*cp == '\\' && *cp != '\0') {
- /*
- * Escaped something -- skip over it
- */
- cp++;
- }
- }
-
- if (cp != start) {
- /*
- * Stuff left over -- add it to the
- * list too
- */
- Lst_AtEnd(members, Targ_FindNode(start, TARG_CREATE));
- }
-
- Buf_Destroy(buf, TRUE);
-}
-
-/*-
- * The child node contains wildcards. Expand them and return a list of
- * expansions.
- */
-static void
-SuffExpandWildcards(GNode *child, Lst *members)
-{
- char *cp;
- Lst exp; /* List of expansions */
- LstNode *ln;
- struct Path *path; /* Search path along which to expand */
-
- Lst_Init(members);
-
- /*
- * Find a path along which to expand the word.
- *
- * If the word has a known suffix, use that path.
- * If it has no known suffix and we're allowed to use the null
- * suffix, use its path.
- * Else use the default system search path.
- */
- LST_FOREACH(ln, &sufflist) {
- if (SuffSuffIsSuffix(Lst_Datum(ln), child->name) != NULL)
- break;
- }
-
- DEBUGF(SUFF, ("Wildcard expanding \"%s\"...", child->name));
-
- if (ln != NULL) {
- Suff *s = Lst_Datum(ln);
-
- DEBUGF(SUFF, ("suffix is \"%s\"...", s->name));
- path = &s->searchPath;
- } else {
- /*
- * Use default search path
- */
- path = &dirSearchPath;
- }
-
- /*
- * Expand the word along the chosen path
- */
- Lst_Init(&exp);
- Path_Expand(child->name, path, &exp);
-
- while (!Lst_IsEmpty(&exp)) {
- /*
- * Fetch next expansion off the list and find its GNode
- */
- cp = Lst_DeQueue(&exp);
-
- DEBUGF(SUFF, ("%s...", cp));
- Lst_AtEnd(members, Targ_FindNode(cp, TARG_CREATE));
- }
-}
-
-/*-
- *-----------------------------------------------------------------------
- * SuffExpandChildren --
- * Expand the names of any children of a given node that contain
- * variable invocations or file wildcards into actual targets.
- *
- * Results:
- * == 0 (continue)
- *
- * Side Effects:
- * The expanded node is removed from the parent's list of children,
- * and the parent's unmade counter is decremented, but other nodes
- * may be added.
- *
- *-----------------------------------------------------------------------
- */
-static void
-SuffExpandChildren(GNode *parent, LstNode *current)
-{
- GNode *cchild; /* current child */
- GNode *gn;
- LstNode *prev; /* node after which to append new source */
- Lst members; /* expanded nodes */
-
- if (current == NULL) {
- /* start from begin of parent's children list */
- current = Lst_First(&parent->children);
- }
-
- while (current != NULL) {
- cchild = Lst_Datum(current);
-
- /*
- * First do variable expansion -- this takes precedence over
- * wildcard expansion. If the result contains wildcards, they'll
- * be gotten to later since the resulting words are tacked
- * instead of the current child onto the children list.
- *
- * XXXHB what if cchild contains lib.a(t1.o t2.o t3.o) but
- * no $?
- */
- if (strchr(cchild->name, '$') != NULL) {
- SuffExpandVariables(parent, cchild, &members);
-
- } else if (Dir_HasWildcards(cchild->name)) {
- SuffExpandWildcards(cchild, &members);
-
- } else {
- /* nothing special just advance to next child */
- current = LST_NEXT(current);
- continue;
- }
-
- /*
- * New nodes effectively take the place of the child,
- * so place them after the child
- */
- prev = current;
-
- /*
- * Add all new elements to the parent node if they aren't
- * already children of it.
- */
- while(!Lst_IsEmpty(&members)) {
- gn = Lst_DeQueue(&members);
-
- DEBUGF(SUFF, ("%s...", gn->name));
- if (Lst_Member(&parent->children, gn) == NULL) {
- Lst_Append(&parent->children, prev, gn);
- prev = Lst_Succ(prev);
- Lst_AtEnd(&gn->parents, parent);
- parent->unmade++;
- }
- }
-
- /*
- * Now the source is expanded, remove it from the list
- * of children to keep it from being processed.
- * Advance to the next child.
- */
- prev = current;
- current = LST_NEXT(current);
-
- parent->unmade--;
- Lst_Remove(&parent->children, prev);
- DEBUGF(SUFF, ("\n"));
- }
-}
-
-/*-
- *-----------------------------------------------------------------------
- * SuffApplyTransform --
- * Apply a transformation rule, given the source and target nodes
- * and suffixes.
- *
- * Results:
- * TRUE if successful, FALSE if not.
- *
- * Side Effects:
- * The source and target are linked and the commands from the
- * transformation are added to the target node's commands list.
- * All attributes but OP_DEPMASK and OP_TRANSFORM are applied
- * to the target. The target also inherits all the sources for
- * the transformation rule.
- *
- *-----------------------------------------------------------------------
- */
-static Boolean
-SuffApplyTransform(GNode *tGn, GNode *sGn, Suff *t, Suff *s)
-{
- LstNode *ln; /* General node */
- char *tname; /* Name of transformation rule */
- GNode *gn; /* Node for same */
-
- if (Lst_Member(&tGn->children, sGn) == NULL) {
- /*
- * Not already linked, so form the proper links between the
- * target and source.
- */
- Lst_AtEnd(&tGn->children, sGn);
- Lst_AtEnd(&sGn->parents, tGn);
- tGn->unmade += 1;
- }
-
- if ((sGn->type & OP_OPMASK) == OP_DOUBLEDEP) {
- /*
- * When a :: node is used as the implied source of a node,
- * we have to link all its cohorts in as sources as well. Only
- * the initial sGn gets the target in its iParents list, however
- * as that will be sufficient to get the .IMPSRC variable set
- * for tGn
- */
- for (ln = Lst_First(&sGn->cohorts); ln != NULL;
- ln = Lst_Succ(ln)) {
- gn = Lst_Datum(ln);
-
- if (Lst_Member(&tGn->children, gn) == NULL) {
- /*
- * Not already linked, so form the proper
- * links between the target and source.
- */
- Lst_AtEnd(&tGn->children, gn);
- Lst_AtEnd(&gn->parents, tGn);
- tGn->unmade += 1;
- }
- }
- }
- /*
- * Locate the transformation rule itself
- */
- tname = str_concat(s->name, t->name, 0);
- gn = SuffTransFind(tname);
- free(tname);
-
- if (gn == NULL) {
- /*
- * Not really such a transformation rule (can happen when we're
- * called to link an OP_MEMBER and OP_ARCHV node), so return
- * FALSE.
- */
- return (FALSE);
- }
-
- DEBUGF(SUFF, ("\tapplying %s -> %s to \"%s\"\n",
- s->name, t->name, tGn->name));
-
- /*
- * Record last child for expansion purposes
- */
- ln = Lst_Last(&tGn->children);
-
- /*
- * Pass the buck to Make_HandleUse to apply the rule
- */
- Make_HandleUse(gn, tGn);
-
- /*
- * Deal with wildcards and variables in any acquired sources
- */
- ln = Lst_Succ(ln);
- if (ln != NULL) {
- SuffExpandChildren(tGn, ln);
- }
-
- /*
- * Keep track of another parent to which this beast is transformed so
- * the .IMPSRC variable can be set correctly for the parent.
- */
- Lst_AtEnd(&sGn->iParents, tGn);
-
- return (TRUE);
-}
-
-
-/*-
- *-----------------------------------------------------------------------
- * SuffFindArchiveDeps --
- * Locate dependencies for an OP_ARCHV node.
- *
- * Results:
- * None
- *
- * Side Effects:
- * Same as Suff_FindDeps
- *
- *-----------------------------------------------------------------------
- */
-static void
-SuffFindArchiveDeps(GNode *gn, Lst *slst)
-{
- char *eoarch; /* End of archive portion */
- char *eoname; /* End of member portion */
- char *name; /* Start of member's name */
- GNode *mem; /* Node for member */
- Suff *ms; /* Suffix descriptor for member */
-
- static const char *copy[] = {
- TARGET, /* Must be first */
- PREFIX, /* Must be second */
- };
-
- /*
- * The node is an archive(member) pair. so we must find a
- * suffix for both of them.
- */
- eoarch = strchr(gn->name, '(');
- eoname = strchr(eoarch, ')');
-
- *eoname = '\0'; /* Nuke parentheses during suffix search */
- *eoarch = '\0'; /* So a suffix can be found */
-
- name = eoarch + 1;
-
- /*
- * To simplify things, call Suff_FindDeps recursively on the member now,
- * so we can simply compare the member's .PREFIX and .TARGET variables
- * to locate its suffix. This allows us to figure out the suffix to
- * use for the archive without having to do a quadratic search over the
- * suffix list, backtracking for each one...
- */
- mem = Targ_FindNode(name, TARG_CREATE);
- SuffFindDeps(mem, slst);
-
- /*
- * Create the link between the two nodes right off
- */
- if (Lst_Member(&gn->children, mem) == NULL) {
- Lst_AtEnd(&gn->children, mem);
- Lst_AtEnd(&mem->parents, gn);
- gn->unmade += 1;
- }
-
- /*
- * Copy in the variables from the member node to this one.
- */
- Var_Set(copy[1], Var_Value(copy[1], mem), gn);
- Var_Set(copy[0], Var_Value(copy[0], mem), gn);
-
- ms = mem->suffix;
- if (ms == NULL) {
- /*
- * Didn't know what it was -- use .NULL suffix if not in
- * make mode
- */
- DEBUGF(SUFF, ("using null suffix\n"));
- ms = suffNull;
- }
-
- /*
- * Set the other two local variables required for this target.
- */
- Var_Set(MEMBER, name, gn);
- Var_Set(ARCHIVE, gn->name, gn);
-
- if (ms != NULL) {
- /*
- * Member has a known suffix, so look for a transformation rule
- * from it to a possible suffix of the archive. Rather than
- * searching through the entire list, we just look at suffixes
- * to which the member's suffix may be transformed...
- */
- LstNode *ln;
-
- /*
- * Use first matching suffix...
- */
- LST_FOREACH(ln, &ms->parents) {
- if (SuffSuffIsSuffix(Lst_Datum(ln), gn->name) != NULL)
- break;
- }
-
- if (ln != NULL) {
- /*
- * Got one -- apply it
- */
- if (!SuffApplyTransform(gn, mem, Lst_Datum(ln), ms)) {
- DEBUGF(SUFF, ("\tNo transformation from "
- "%s -> %s\n", ms->name,
- ((Suff *)Lst_Datum(ln))->name));
- }
- }
- }
-
- /*
- * Replace the opening and closing parens now we've no need
- * of the separate pieces.
- */
- *eoarch = '(';
- *eoname = ')';
-
- /*
- * Pretend gn appeared to the left of a dependency operator so
- * the user needn't provide a transformation from the member to the
- * archive.
- */
- if (OP_NOP(gn->type)) {
- gn->type |= OP_DEPENDS;
- }
-
- /*
- * Flag the member as such so we remember to look in the archive for
- * its modification time.
- */
- mem->type |= OP_MEMBER;
-}
-
-/*-
- *-----------------------------------------------------------------------
- * SuffFindNormalDeps --
- * Locate implicit dependencies for regular targets.
- *
- * Results:
- * None.
- *
- * Side Effects:
- * Same as Suff_FindDeps...
- *
- *-----------------------------------------------------------------------
- */
-static void
-SuffFindNormalDeps(GNode *gn, Lst *slst)
-{
- char *eoname; /* End of name */
- char *sopref; /* Start of prefix */
- LstNode *ln; /* Next suffix node to check */
- Lst srcs; /* List of sources at which to look */
- Lst targs; /* List of targets to which things can be
- * transformed. They all have the same file,
- * but different suff and pref fields */
- Src *bottom; /* Start of found transformation path */
- Src *src; /* General Src pointer */
- char *pref; /* Prefix to use */
- Src *targ; /* General Src target pointer */
-
- eoname = gn->name + strlen(gn->name);
- sopref = gn->name;
-
- /*
- * Begin at the beginning...
- */
- ln = Lst_First(&sufflist);
- Lst_Init(&srcs);
- Lst_Init(&targs);
-
- /*
- * We're caught in a catch-22 here. On the one hand, we want to use any
- * transformation implied by the target's sources, but we can't examine
- * the sources until we've expanded any variables/wildcards they may
- * hold, and we can't do that until we've set up the target's local
- * variables and we can't do that until we know what the proper suffix
- * for the target is (in case there are two suffixes one of which is a
- * suffix of the other) and we can't know that until we've found its
- * implied source, which we may not want to use if there's an existing
- * source that implies a different transformation.
- *
- * In an attempt to get around this, which may not work all the time,
- * but should work most of the time, we look for implied sources first,
- * checking transformations to all possible suffixes of the target,
- * use what we find to set the target's local variables, expand the
- * children, then look for any overriding transformations they imply.
- * Should we find one, we discard the one we found before.
- */
-
- while (ln != NULL) {
- /*
- * Look for next possible suffix...
- */
- while (ln != NULL) {
- if (SuffSuffIsSuffix(Lst_Datum(ln), gn->name) != NULL)
- break;
- ln = LST_NEXT(ln);
- }
-
- if (ln != NULL) {
- int prefLen; /* Length of the prefix */
- Src *target;
-
- /*
- * Allocate a Src structure to which things can be
- * transformed
- */
- target = SuffSrcCreate(estrdup(gn->name), NULL,
- Lst_Datum(ln), NULL, gn);
- target->suff->refCount++;
-
- /*
- * Allocate room for the prefix, whose end is found
- * by subtracting the length of the suffix from
- * the end of the name.
- */
- prefLen = (eoname - target->suff->nameLen) - sopref;
- assert(prefLen >= 0);
- target->pref = emalloc(prefLen + 1);
- memcpy(target->pref, sopref, prefLen);
- target->pref[prefLen] = '\0';
-
- /*
- * Add nodes from which the target can be made
- */
- SuffAddLevel(&srcs, target);
-
- /*
- * Record the target so we can nuke it
- */
- Lst_AtEnd(&targs, target);
-
- /*
- * Search from this suffix's successor...
- */
- ln = Lst_Succ(ln);
- }
- }
-
- /*
- * Handle target of unknown suffix...
- */
- if (Lst_IsEmpty(&targs) && suffNull != NULL) {
- DEBUGF(SUFF, ("\tNo known suffix on %s. Using .NULL suffix\n",
- gn->name));
-
- targ = SuffSrcCreate(estrdup(gn->name), estrdup(sopref),
- suffNull, NULL, gn);
- targ->suff->refCount++;
-
- /*
- * Only use the default suffix rules if we don't have commands
- * or dependencies defined for this gnode
- */
- if (Lst_IsEmpty(&gn->commands) && Lst_IsEmpty(&gn->children))
- SuffAddLevel(&srcs, targ);
- else {
- DEBUGF(SUFF, ("not "));
- }
-
- DEBUGF(SUFF, ("adding suffix rules\n"));
-
- Lst_AtEnd(&targs, targ);
- }
-
- /*
- * Using the list of possible sources built up from the target
- * suffix(es), try and find an existing file/target that matches.
- */
- bottom = SuffFindThem(&srcs, slst);
-
- if (bottom == NULL) {
- /*
- * No known transformations -- use the first suffix found for
- * setting the local variables.
- */
- if (!Lst_IsEmpty(&targs)) {
- targ = Lst_Datum(Lst_First(&targs));
- } else {
- targ = NULL;
- }
- } else {
- /*
- * Work up the transformation path to find the suffix of the
- * target to which the transformation was made.
- */
- for (targ = bottom; targ->parent != NULL; targ = targ->parent)
- continue;
- }
-
- /*
- * The .TARGET variable we always set to be the name at this point,
- * since it's only set to the path if the thing is only a source and
- * if it's only a source, it doesn't matter what we put here as far
- * as expanding sources is concerned, since it has none...
- */
- Var_Set(TARGET, gn->name, gn);
-
- pref = (targ != NULL) ? targ->pref : gn->name;
- Var_Set(PREFIX, pref, gn);
-
- /*
- * Now we've got the important local variables set, expand any sources
- * that still contain variables or wildcards in their names.
- */
- SuffExpandChildren(gn, NULL);
-
- if (targ == NULL) {
- DEBUGF(SUFF, ("\tNo valid suffix on %s\n", gn->name));
-
- sfnd_abort:
- /*
- * Deal with finding the thing on the default search path if the
- * node is only a source (not on the lhs of a dependency
- * operator or [XXX] it has neither children or commands).
- */
- if (OP_NOP(gn->type) || (Lst_IsEmpty(&gn->children) &&
- Lst_IsEmpty(&gn->commands))) {
- gn->path = Path_FindFile(gn->name,
- (targ == NULL ? &dirSearchPath :
- &targ->suff->searchPath));
- if (gn->path != NULL) {
- char *ptr;
- Var_Set(TARGET, gn->path, gn);
-
- if (targ != NULL) {
- /*
- * Suffix known for the thing -- trim
- * the suffix off the path to form the
- * proper .PREFIX variable.
- */
- int savep = strlen(gn->path) -
- targ->suff->nameLen;
- char savec;
-
- if (gn->suffix)
- gn->suffix->refCount--;
- gn->suffix = targ->suff;
- gn->suffix->refCount++;
-
- savec = gn->path[savep];
- gn->path[savep] = '\0';
-
- if ((ptr = strrchr(gn->path, '/')) != NULL)
- ptr++;
- else
- ptr = gn->path;
-
- Var_Set(PREFIX, ptr, gn);
-
- gn->path[savep] = savec;
- } else {
- /*
- * The .PREFIX gets the full path if
- * the target has no known suffix.
- */
- if (gn->suffix)
- gn->suffix->refCount--;
- gn->suffix = NULL;
-
- if ((ptr = strrchr(gn->path, '/')) != NULL)
- ptr++;
- else
- ptr = gn->path;
-
- Var_Set(PREFIX, ptr, gn);
- }
- }
- } else {
- /*
- * Not appropriate to search for the thing -- set the
- * path to be the name so Dir_MTime won't go
- * grovelling for it.
- */
- if (gn->suffix)
- gn->suffix->refCount--;
- gn->suffix = (targ == NULL) ? NULL : targ->suff;
- if (gn->suffix)
- gn->suffix->refCount++;
- free(gn->path);
- gn->path = estrdup(gn->name);
- }
-
- goto sfnd_return;
- }
-
- /*
- * If the suffix indicates that the target is a library, mark that in
- * the node's type field.
- */
- if (targ->suff->flags & SUFF_LIBRARY) {
- gn->type |= OP_LIB;
- }
-
- /*
- * Check for overriding transformation rule implied by sources
- */
- if (!Lst_IsEmpty(&gn->children)) {
- src = SuffFindCmds(targ, slst);
-
- if (src != NULL) {
- /*
- * Free up all the Src structures in the
- * transformation path up to, but not including,
- * the parent node.
- */
- while (bottom && bottom->parent != NULL) {
- if (Lst_Member(slst, bottom) == NULL) {
- Lst_AtEnd(slst, bottom);
- }
- bottom = bottom->parent;
- }
- bottom = src;
- }
- }
-
- if (bottom == NULL) {
- /*
- * No idea from where it can come -- return now.
- */
- goto sfnd_abort;
- }
-
- /*
- * We now have a list of Src structures headed by 'bottom' and linked
- * via their 'parent' pointers. What we do next is create links between
- * source and target nodes (which may or may not have been created)
- * and set the necessary local variables in each target. The
- * commands for each target are set from the commands of the
- * transformation rule used to get from the src suffix to the targ
- * suffix. Note that this causes the commands list of the original
- * node, gn, to be replaced by the commands of the final
- * transformation rule. Also, the unmade field of gn is incremented.
- * Etc.
- */
- if (bottom->node == NULL) {
- bottom->node = Targ_FindNode(bottom->file, TARG_CREATE);
- }
-
- for (src = bottom; src->parent != NULL; src = src->parent) {
- targ = src->parent;
-
- if (src->node->suffix)
- src->node->suffix->refCount--;
- src->node->suffix = src->suff;
- src->node->suffix->refCount++;
-
- if (targ->node == NULL) {
- targ->node = Targ_FindNode(targ->file, TARG_CREATE);
- }
-
- SuffApplyTransform(targ->node, src->node,
- targ->suff, src->suff);
-
- if (targ->node != gn) {
- /*
- * Finish off the dependency-search process for any
- * nodes between bottom and gn (no point in questing
- * around the filesystem for their implicit source
- * when it's already known). Note that the node can't
- * have any sources that need expanding, since
- * SuffFindThem will stop on an existing
- * node, so all we need to do is set the standard and
- * System V variables.
- */
- targ->node->type |= OP_DEPS_FOUND;
-
- Var_Set(PREFIX, targ->pref, targ->node);
- Var_Set(TARGET, targ->node->name, targ->node);
- }
- }
-
- if (gn->suffix)
- gn->suffix->refCount--;
- gn->suffix = src->suff;
- gn->suffix->refCount++;
-
- /*
- * So Dir_MTime doesn't go questing for it...
- */
- free(gn->path);
- gn->path = estrdup(gn->name);
-
- /*
- * Nuke the transformation path and the Src structures left over in the
- * two lists.
- */
- sfnd_return:
- if (bottom)
- if (Lst_Member(slst, bottom) == NULL)
- Lst_AtEnd(slst, bottom);
-
- while (SuffRemoveSrc(&srcs) || SuffRemoveSrc(&targs))
- continue;
-
- Lst_Concat(slst, &srcs, LST_CONCLINK);
- Lst_Concat(slst, &targs, LST_CONCLINK);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Suff_FindDeps --
- * Find implicit sources for the target described by the graph node
- * gn
- *
- * Results:
- * Nothing.
- *
- * Side Effects:
- * Nodes are added to the graph below the passed-in node. The nodes
- * are marked to have their IMPSRC variable filled in. The
- * PREFIX variable is set for the given node and all its
- * implied children.
- *
- * Notes:
- * The path found by this target is the shortest path in the
- * transformation graph, which may pass through non-existent targets,
- * to an existing target. The search continues on all paths from the
- * root suffix until a file is found. I.e. if there's a path
- * .o -> .c -> .l -> .l,v from the root and the .l,v file exists but
- * the .c and .l files don't, the search will branch out in
- * all directions from .o and again from all the nodes on the
- * next level until the .l,v node is encountered.
- *
- *-----------------------------------------------------------------------
- */
-void
-Suff_FindDeps(GNode *gn)
-{
-
- SuffFindDeps(gn, &srclist);
- while (SuffRemoveSrc(&srclist))
- continue;
-}
-
-
-static void
-SuffFindDeps(GNode *gn, Lst *slst)
-{
-
- if (gn->type & OP_DEPS_FOUND) {
- /*
- * If dependencies already found, no need to do it again...
- */
- return;
- } else {
- gn->type |= OP_DEPS_FOUND;
- }
-
- DEBUGF(SUFF, ("SuffFindDeps (%s)\n", gn->name));
-
- if (gn->type & OP_ARCHV) {
- SuffFindArchiveDeps(gn, slst);
-
- } else if (gn->type & OP_LIB) {
- /*
- * If the node is a library, it is the arch module's job to find
- * it and set the TARGET variable accordingly. We merely provide
- * the search path, assuming all libraries end in ".a" (if the
- * suffix hasn't been defined, there's nothing we can do for it,
- * so we just set the TARGET variable to the node's name in order
- * to give it a value).
- */
- Suff *s;
-
- s = SuffSuffFind(LIBSUFF);
- if (gn->suffix)
- gn->suffix->refCount--;
- if (s != NULL) {
- gn->suffix = s;
- gn->suffix->refCount++;
- Arch_FindLib(gn, &s->searchPath);
- } else {
- gn->suffix = NULL;
- Var_Set(TARGET, gn->name, gn);
- }
-
- /*
- * Because a library (-lfoo) target doesn't follow the standard
- * filesystem conventions, we don't set the regular variables for
- * the thing. .PREFIX is simply made empty...
- */
- Var_Set(PREFIX, "", gn);
-
- } else {
- SuffFindNormalDeps(gn, slst);
- }
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Suff_SetNull --
- * Define which suffix is the null suffix.
- *
- * Results:
- * None.
- *
- * Side Effects:
- * 'suffNull' is altered.
- *
- * Notes:
- * Need to handle the changing of the null suffix gracefully so the
- * old transformation rules don't just go away.
- *
- *-----------------------------------------------------------------------
- */
-void
-Suff_SetNull(char *name)
-{
- Suff *s;
-
- if ((s = SuffSuffFind(name)) == NULL) {
- Parse_Error(PARSE_WARNING, "Desired null suffix %s "
- "not defined.", name);
- return;
- }
-
- if (suffNull != NULL) {
- suffNull->flags &= ~SUFF_NULL;
- }
- s->flags |= SUFF_NULL;
-
- /*
- * XXX: Here's where the transformation mangling
- * would take place
- */
- suffNull = s;
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Suff_Init --
- * Initialize suffixes module
- *
- * Results:
- * None
- *
- * Side Effects:
- * Many
- *-----------------------------------------------------------------------
- */
-void
-Suff_Init(void)
-{
-
- sNum = 0;
- /*
- * Create null suffix for single-suffix rules (POSIX). The thing doesn't
- * actually go on the suffix list or everyone will think that's its
- * suffix.
- */
- emptySuff = suffNull = emalloc(sizeof(Suff));
-
- suffNull->name = estrdup("");
- suffNull->nameLen = 0;
- TAILQ_INIT(&suffNull->searchPath);
- Path_Concat(&suffNull->searchPath, &dirSearchPath);
- Lst_Init(&suffNull->children);
- Lst_Init(&suffNull->parents);
- Lst_Init(&suffNull->ref);
- suffNull->sNum = sNum++;
- suffNull->flags = SUFF_NULL;
- suffNull->refCount = 1;
-}
-
-/********************* DEBUGGING FUNCTIONS **********************/
-
-void
-Suff_PrintAll(void)
-{
- const LstNode *ln;
- const LstNode *tln;
- const GNode *gn;
- const Suff *s;
-
- static const struct flag2str suff_flags[] = {
- { SUFF_INCLUDE, "INCLUDE" },
- { SUFF_LIBRARY, "LIBRARY" },
- { SUFF_NULL, "NULL" },
- { 0, NULL }
- };
-
- printf("#*** Suffixes:\n");
- LST_FOREACH(ln, &sufflist) {
- s = Lst_Datum(ln);
- printf("# `%s' [%d] ", s->name, s->refCount);
-
- if (s->flags != 0) {
- printf(" ");
- print_flags(stdout, suff_flags, s->flags, 1);
- }
-
- printf("\n#\tTo: ");
- LST_FOREACH(tln, &s->parents)
- printf("`%s' ", ((const Suff *)Lst_Datum(tln))->name);
-
- printf("\n#\tFrom: ");
- LST_FOREACH(tln, &s->children)
- printf("`%s' ", ((const Suff *)Lst_Datum(tln))->name);
-
- printf("\n#\tSearch Path: ");
- Path_Print(&s->searchPath);
-
- printf("\n");
- }
-
- printf("#*** Transformations:\n");
- LST_FOREACH(ln, &transforms) {
- gn = Lst_Datum(ln);
- printf("%-16s: ", gn->name);
- Targ_PrintType(gn->type);
- printf("\n");
- LST_FOREACH(tln, &gn->commands)
- printf("\t%s\n", (const char *)Lst_Datum(tln));
- printf("\n");
- }
-}
diff --git a/usr.bin/make/suff.h b/usr.bin/make/suff.h
deleted file mode 100644
index 9982ab4..0000000
--- a/usr.bin/make/suff.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef suff_h_2d5a821c
-#define suff_h_2d5a821c
-
-struct GNode;
-struct Path;
-
-void Suff_ClearSuffixes(void);
-Boolean Suff_IsTransform(char *);
-struct GNode *Suff_AddTransform(char *);
-void Suff_EndTransform(const struct GNode *);
-void Suff_AddSuffix(char *);
-struct Path *Suff_GetPath(char *);
-void Suff_DoPaths(void);
-void Suff_AddInclude(char *);
-void Suff_AddLib(char *);
-void Suff_FindDeps(struct GNode *);
-void Suff_SetNull(char *);
-void Suff_Init(void);
-void Suff_PrintAll(void);
-
-#endif /* suff_h_2d5a821c */
diff --git a/usr.bin/make/targ.c b/usr.bin/make/targ.c
deleted file mode 100644
index eac121e..0000000
--- a/usr.bin/make/targ.c
+++ /dev/null
@@ -1,474 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)targ.c 8.2 (Berkeley) 3/19/94
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Functions for maintaining the Lst allTargets. Target nodes are
- * kept in two structures: a Lst, maintained by the list library, and a
- * hash table, maintained by the hash library.
- *
- * Interface:
- * Targ_Init Initialization procedure.
- *
- * Targ_NewGN Create a new GNode for the passed target (string).
- * The node is *not* placed in the hash table, though all
- * its fields are initialized.
- *
- * Targ_FindNode Find the node for a given target, creating and storing
- * it if it doesn't exist and the flags are right
- * (TARG_CREATE)
- *
- * Targ_FindList Given a list of names, find nodes for all of them. If a
- * name doesn't exist and the TARG_NOCREATE flag was given,
- * an error message is printed. Else, if a name doesn't
- * exist, its node is created.
- *
- * Targ_Ignore Return TRUE if errors should be ignored when creating
- * the given target.
- *
- * Targ_Silent Return TRUE if we should be silent when creating the
- * given target.
- *
- * Targ_Precious Return TRUE if the target is precious and should not
- * be removed if we are interrupted.
- *
- * Debugging:
- * Targ_PrintGraph Print out the entire graphm all variables and statistics
- * for the directory cache. Should print something for
- * suffixes, too, but...
- */
-
-#include <stdio.h>
-#include <string.h>
-
-#include "dir.h"
-#include "globals.h"
-#include "GNode.h"
-#include "hash.h"
-#include "make.h"
-#include "suff.h"
-#include "targ.h"
-#include "util.h"
-#include "var.h"
-
-/* the list of all targets found so far */
-static Lst allTargets = Lst_Initializer(allTargets);
-
-static Hash_Table targets; /* a hash table of same */
-
-#define HTSIZE 191 /* initial size of hash table */
-
-/**
- * Targ_Init
- * Initialize this module
- *
- * Side Effects:
- * The allTargets list and the targets hash table are initialized
- */
-void
-Targ_Init(void)
-{
-
- Hash_InitTable(&targets, HTSIZE);
-}
-
-/**
- * Targ_NewGN
- * Create and initialize a new graph node
- *
- * Results:
- * An initialized graph node with the name field filled with a copy
- * of the passed name
- *
- * Side Effects:
- * The gnode is added to the list of all gnodes.
- */
-GNode *
-Targ_NewGN(const char *name)
-{
- GNode *gn;
-
- gn = emalloc(sizeof(GNode));
- gn->name = estrdup(name);
- gn->path = NULL;
- if (name[0] == '-' && name[1] == 'l') {
- gn->type = OP_LIB;
- } else {
- gn->type = 0;
- }
- gn->unmade = 0;
- gn->make = FALSE;
- gn->made = UNMADE;
- gn->childMade = FALSE;
- gn->order = 0;
- gn->mtime = gn->cmtime = 0;
- gn->cmtime_gn = NULL;
- Lst_Init(&gn->iParents);
- Lst_Init(&gn->cohorts);
- Lst_Init(&gn->parents);
- Lst_Init(&gn->children);
- Lst_Init(&gn->successors);
- Lst_Init(&gn->preds);
- Lst_Init(&gn->context);
- Lst_Init(&gn->commands);
- gn->suffix = NULL;
-
- return (gn);
-}
-
-/**
- * Targ_FindNode
- * Find a node in the list using the given name for matching
- *
- * Results:
- * The node in the list if it was. If it wasn't, return NULL of
- * flags was TARG_NOCREATE or the newly created and initialized node
- * if it was TARG_CREATE
- *
- * Side Effects:
- * Sometimes a node is created and added to the list
- */
-GNode *
-Targ_FindNode(const char *name, int flags)
-{
- GNode *gn; /* node in that element */
- Hash_Entry *he; /* New or used hash entry for node */
- Boolean isNew; /* Set TRUE if Hash_CreateEntry had to create */
- /* an entry for the node */
-
- if (flags & TARG_CREATE) {
- he = Hash_CreateEntry(&targets, name, &isNew);
- if (isNew) {
- gn = Targ_NewGN(name);
- Hash_SetValue(he, gn);
- Lst_AtEnd(&allTargets, gn);
- }
- } else {
- he = Hash_FindEntry(&targets, name);
- }
-
- if (he == NULL) {
- return (NULL);
- } else {
- return (Hash_GetValue(he));
- }
-}
-
-/**
- * Targ_FindList
- * Make a complete list of GNodes from the given list of names
- *
- * Results:
- * A complete list of graph nodes corresponding to all instances of all
- * the names in names.
- *
- * Side Effects:
- * If flags is TARG_CREATE, nodes will be created for all names in
- * names which do not yet have graph nodes. If flags is TARG_NOCREATE,
- * an error message will be printed for each name which can't be found.
- */
-void
-Targ_FindList(Lst *nodes, Lst *names, int flags)
-{
- LstNode *ln; /* name list element */
- GNode *gn; /* node in tLn */
- char *name;
-
- for (ln = Lst_First(names); ln != NULL; ln = Lst_Succ(ln)) {
- name = Lst_Datum(ln);
- gn = Targ_FindNode(name, flags);
- if (gn != NULL) {
- /*
- * Note: Lst_AtEnd must come before the Lst_Concat so
- * the nodes are added to the list in the order in which
- * they were encountered in the makefile.
- */
- Lst_AtEnd(nodes, gn);
- if (gn->type & OP_DOUBLEDEP) {
- Lst_Concat(nodes, &gn->cohorts, LST_CONCNEW);
- }
-
- } else if (flags == TARG_NOCREATE) {
- Error("\"%s\" -- target unknown.", name);
- }
- }
-}
-
-/**
- * Targ_Ignore
- * Return true if should ignore errors when creating gn
- *
- * Results:
- * TRUE if should ignore errors
- */
-Boolean
-Targ_Ignore(GNode *gn)
-{
-
- if (ignoreErrors || (gn->type & OP_IGNORE)) {
- return (TRUE);
- } else {
- return (FALSE);
- }
-}
-
-/**
- * Targ_Silent
- * Return true if be silent when creating gn
- *
- * Results:
- * TRUE if should be silent
- */
-Boolean
-Targ_Silent(GNode *gn)
-{
-
- if (beSilent || (gn->type & OP_SILENT)) {
- return (TRUE);
- } else {
- return (FALSE);
- }
-}
-
-/**
- * Targ_Precious
- * See if the given target is precious
- *
- * Results:
- * TRUE if it is precious. FALSE otherwise
- */
-Boolean
-Targ_Precious(GNode *gn)
-{
-
- if (allPrecious || (gn->type & (OP_PRECIOUS | OP_DOUBLEDEP))) {
- return (TRUE);
- } else {
- return (FALSE);
- }
-}
-
-static GNode *mainTarg; /* the main target, as set by Targ_SetMain */
-
-/**
- * Targ_SetMain
- * Set our idea of the main target we'll be creating. Used for
- * debugging output.
- *
- * Side Effects:
- * "mainTarg" is set to the main target's node.
- */
-void
-Targ_SetMain(GNode *gn)
-{
-
- mainTarg = gn;
-}
-
-/**
- * Targ_FmtTime
- * Format a modification time in some reasonable way and return it.
- *
- * Results:
- * The time reformatted.
- *
- * Side Effects:
- * The time is placed in a static area, so it is overwritten
- * with each call.
- */
-char *
-Targ_FmtTime(time_t modtime)
-{
- struct tm *parts;
- static char buf[128];
-
- parts = localtime(&modtime);
-
- strftime(buf, sizeof(buf), "%H:%M:%S %b %d, %Y", parts);
- buf[sizeof(buf) - 1] = '\0';
- return (buf);
-}
-
-/**
- * Targ_PrintType
- * Print out a type field giving only those attributes the user can
- * set.
- */
-void
-Targ_PrintType(int type)
-{
- static const struct flag2str type2str[] = {
- { OP_OPTIONAL, ".OPTIONAL" },
- { OP_USE, ".USE" },
- { OP_EXEC, ".EXEC" },
- { OP_IGNORE, ".IGNORE" },
- { OP_PRECIOUS, ".PRECIOUS" },
- { OP_SILENT, ".SILENT" },
- { OP_MAKE, ".MAKE" },
- { OP_JOIN, ".JOIN" },
- { OP_INVISIBLE, ".INVISIBLE" },
- { OP_NOTMAIN, ".NOTMAIN" },
- { OP_PHONY, ".PHONY" },
- { OP_LIB, ".LIB" },
- { OP_MEMBER, ".MEMBER" },
- { OP_ARCHV, ".ARCHV" },
- { 0, NULL }
- };
-
- type &= ~OP_OPMASK;
- if (!DEBUG(TARG))
- type &= ~(OP_ARCHV | OP_LIB | OP_MEMBER);
- print_flags(stdout, type2str, type, 0);
-}
-
-/**
- * TargPrintNode
- * print the contents of a node
- */
-static int
-TargPrintNode(const GNode *gn, int pass)
-{
- const LstNode *tln;
-
- if (!OP_NOP(gn->type)) {
- printf("#\n");
- if (gn == mainTarg) {
- printf("# *** MAIN TARGET ***\n");
- }
- if (pass == 2) {
- if (gn->unmade) {
- printf("# %d unmade children\n", gn->unmade);
- } else {
- printf("# No unmade children\n");
- }
- if (!(gn->type & (OP_JOIN | OP_USE | OP_EXEC))) {
- if (gn->mtime != 0) {
- printf("# last modified %s: %s\n",
- Targ_FmtTime(gn->mtime),
- gn->made == UNMADE ? "unmade" :
- gn->made == MADE ? "made" :
- gn->made == UPTODATE ? "up-to-date":
- "error when made");
- } else if (gn->made != UNMADE) {
- printf("# non-existent (maybe): %s\n",
- gn->made == MADE ? "made" :
- gn->made == UPTODATE ? "up-to-date":
- gn->made == ERROR?"error when made":
- "aborted");
- } else {
- printf("# unmade\n");
- }
- }
- if (!Lst_IsEmpty(&gn->iParents)) {
- printf("# implicit parents: ");
- LST_FOREACH(tln, &gn->iParents)
- printf("%s ", ((const GNode *)
- Lst_Datum(tln))->name);
- printf("\n");
- }
- }
- if (!Lst_IsEmpty(&gn->parents)) {
- printf("# parents: ");
- LST_FOREACH(tln, &gn->parents)
- printf("%s ", ((const GNode *)
- Lst_Datum(tln))->name);
- printf("\n");
- }
-
- printf("%-16s", gn->name);
- switch (gn->type & OP_OPMASK) {
- case OP_DEPENDS:
- printf(": ");
- break;
- case OP_FORCE:
- printf("! ");
- break;
- case OP_DOUBLEDEP:
- printf(":: ");
- break;
- default:
- break;
- }
- Targ_PrintType(gn->type);
- LST_FOREACH(tln, &gn->children)
- printf("%s ", ((const GNode *)Lst_Datum(tln))->name);
- printf("\n");
- LST_FOREACH(tln, &gn->commands)
- printf("\t%s\n", (const char *)Lst_Datum(tln));
- printf("\n\n");
- if (gn->type & OP_DOUBLEDEP) {
- LST_FOREACH(tln, &gn->cohorts)
- TargPrintNode((const GNode *)Lst_Datum(tln),
- pass);
- }
- }
- return (0);
-}
-
-/**
- * Targ_PrintGraph
- * Print the entire graph.
- */
-void
-Targ_PrintGraph(int pass)
-{
- const GNode *gn;
- const LstNode *tln;
-
- printf("#*** Input graph:\n");
- LST_FOREACH(tln, &allTargets)
- TargPrintNode((const GNode *)Lst_Datum(tln), pass);
- printf("\n\n");
-
- printf("#\n# Files that are only sources:\n");
- LST_FOREACH(tln, &allTargets) {
- gn = Lst_Datum(tln);
- if (OP_NOP(gn->type))
- printf("#\t%s [%s]\n", gn->name,
- gn->path ? gn->path : gn->name);
- }
- Var_Dump();
- printf("\n");
- Dir_PrintDirectories();
- printf("\n");
- Suff_PrintAll();
-}
diff --git a/usr.bin/make/targ.h b/usr.bin/make/targ.h
deleted file mode 100644
index 3882833..0000000
--- a/usr.bin/make/targ.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef targ_h_6ded1830
-#define targ_h_6ded1830
-
-#include <time.h>
-
-/*
- * The TARG_ constants are used when calling the Targ_FindNode and
- * Targ_FindList functions in targ.c. They simply tell the functions what to
- * do if the desired node(s) is (are) not found. If the TARG_CREATE constant
- * is given, a new, empty node will be created for the target, placed in the
- * table of all targets and its address returned. If TARG_NOCREATE is given,
- * a NULL pointer will be returned.
- */
-#define TARG_CREATE 0x01 /* create node if not found */
-#define TARG_NOCREATE 0x00 /* don't create it */
-
-struct GNode;
-struct Lst;
-
-void Targ_Init(void);
-struct GNode *Targ_NewGN(const char *);
-struct GNode *Targ_FindNode(const char *, int);
-void Targ_FindList(struct Lst *, struct Lst *, int);
-Boolean Targ_Ignore(struct GNode *);
-Boolean Targ_Silent(struct GNode *);
-Boolean Targ_Precious(struct GNode *);
-void Targ_SetMain(struct GNode *);
-int Targ_PrintCmd(void *, void *);
-char *Targ_FmtTime(time_t);
-void Targ_PrintType(int);
-void Targ_PrintGraph(int);
-
-#endif /* targ_h_6ded1830 */
diff --git a/usr.bin/make/util.c b/usr.bin/make/util.c
deleted file mode 100644
index 3a27b0a..0000000
--- a/usr.bin/make/util.c
+++ /dev/null
@@ -1,316 +0,0 @@
-/*-
- * Copyright (c) 2002 Juli Mallett. All rights reserved.
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)main.c 8.3 (Berkeley) 3/19/94
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*-
- * util.c --
- * General utilitarian routines for make(1).
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <err.h>
-#include <errno.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "globals.h"
-#include "job.h"
-#include "targ.h"
-#include "util.h"
-
-static void enomem(void) __dead2;
-
-/*-
- * Debug --
- * Print a debugging message given its format.
- *
- * Results:
- * None.
- *
- * Side Effects:
- * The message is printed.
- */
-/* VARARGS */
-void
-Debug(const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- va_end(ap);
- fflush(stderr);
-}
-
-/*-
- * Print a debugging message given its format and append the current
- * errno description. Terminate with a newline.
- */
-/* VARARGS */
-void
-DebugM(const char *fmt, ...)
-{
- va_list ap;
- int e = errno;
-
- va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- fprintf(stderr, ": %s\n", strerror(e));
- va_end(ap);
- fflush(stderr);
-}
-
-/*-
- * Error --
- * Print an error message given its format.
- *
- * Results:
- * None.
- *
- * Side Effects:
- * The message is printed.
- */
-/* VARARGS */
-void
-Error(const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- va_end(ap);
- fprintf(stderr, "\n");
- fflush(stderr);
-}
-
-/*-
- * Fatal --
- * Produce a Fatal error message. If jobs are running, waits for them
- * to finish.
- *
- * Results:
- * None
- *
- * Side Effects:
- * The program exits
- */
-/* VARARGS */
-void
-Fatal(const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- if (jobsRunning)
- Job_Wait();
-
- vfprintf(stderr, fmt, ap);
- va_end(ap);
- fprintf(stderr, "\n");
- fflush(stderr);
-
- if (DEBUG(GRAPH2))
- Targ_PrintGraph(2);
- exit(2); /* Not 1 so -q can distinguish error */
-}
-
-/*
- * Punt --
- * Major exception once jobs are being created. Kills all jobs, prints
- * a message and exits.
- *
- * Results:
- * None
- *
- * Side Effects:
- * All children are killed indiscriminately and the program Lib_Exits
- */
-/* VARARGS */
-void
-Punt(const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- fprintf(stderr, "make: ");
- vfprintf(stderr, fmt, ap);
- va_end(ap);
- fprintf(stderr, "\n");
- fflush(stderr);
-
- DieHorribly();
-}
-
-/*-
- * DieHorribly --
- * Exit without giving a message.
- *
- * Results:
- * None
- *
- * Side Effects:
- * A big one...
- */
-void
-DieHorribly(void)
-{
- if (jobsRunning)
- Job_AbortAll();
- if (DEBUG(GRAPH2))
- Targ_PrintGraph(2);
- exit(2); /* Not 1, so -q can distinguish error */
-}
-
-/*
- * Finish --
- * Called when aborting due to errors in child shell to signal
- * abnormal exit, with the number of errors encountered in Make_Make.
- *
- * Results:
- * None
- *
- * Side Effects:
- * The program exits
- */
-void
-Finish(int errors)
-{
-
- Fatal("%d error%s", errors, errors == 1 ? "" : "s");
-}
-
-/*
- * emalloc --
- * malloc, but die on error.
- */
-void *
-emalloc(size_t len)
-{
- void *p;
-
- if ((p = malloc(len)) == NULL)
- enomem();
- return (p);
-}
-
-/*
- * estrdup --
- * strdup, but die on error.
- */
-char *
-estrdup(const char *str)
-{
- char *p;
-
- if ((p = strdup(str)) == NULL)
- enomem();
- return (p);
-}
-
-/*
- * erealloc --
- * realloc, but die on error.
- */
-void *
-erealloc(void *ptr, size_t size)
-{
-
- if ((ptr = realloc(ptr, size)) == NULL)
- enomem();
- return (ptr);
-}
-
-/*
- * enomem --
- * die when out of memory.
- */
-static void
-enomem(void)
-{
- err(2, NULL);
-}
-
-/*
- * enunlink --
- * Remove a file carefully, avoiding directories.
- */
-int
-eunlink(const char *file)
-{
- struct stat st;
-
- if (lstat(file, &st) == -1)
- return (-1);
-
- if (S_ISDIR(st.st_mode)) {
- errno = EISDIR;
- return (-1);
- }
- return (unlink(file));
-}
-
-/*
- * Convert a flag word to a printable thing and print it
- */
-void
-print_flags(FILE *fp, const struct flag2str *tab, u_int flags, int par)
-{
- int first = 1;
-
- if (par)
- fprintf(fp, "(");
- while (tab->str != NULL) {
- if (flags & tab->flag) {
- if (!first)
- fprintf(fp, par ? "|" : " ");
- first = 0;
- fprintf(fp, "%s", tab->str);
- }
- tab++;
- }
- if (par)
- fprintf(fp, ")");
-}
diff --git a/usr.bin/make/util.h b/usr.bin/make/util.h
deleted file mode 100644
index 9a1dedf..0000000
--- a/usr.bin/make/util.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*-
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef util_h_b7020fdb
-#define util_h_b7020fdb
-
-#include <sys/types.h>
-#include <stdio.h>
-
-/*
- * A boolean type is defined as an integer, not an enum. This allows a
- * boolean argument to be an expression that isn't strictly 0 or 1 valued.
- */
-
-typedef int Boolean;
-#ifndef TRUE
-#define TRUE 1
-#define FALSE 0
-#endif /* TRUE */
-
-#define CONCAT(a,b) a##b
-
-struct flag2str {
- u_int flag;
- const char *str;
-};
-
-/*
- * debug control:
- * There is one bit per module. It is up to the module what debug
- * information to print.
- */
-#define DEBUG_ARCH 0x0001
-#define DEBUG_COND 0x0002
-#define DEBUG_DIR 0x0004
-#define DEBUG_GRAPH1 0x0008
-#define DEBUG_GRAPH2 0x0010
-#define DEBUG_JOB 0x0020
-#define DEBUG_MAKE 0x0040
-#define DEBUG_SUFF 0x0080
-#define DEBUG_TARG 0x0100
-#define DEBUG_VAR 0x0200
-#define DEBUG_FOR 0x0400
-#define DEBUG_LOUD 0x0800
-
-#define DEBUG(module) (debug & CONCAT(DEBUG_,module))
-#define DEBUGF(module,args) \
-do { \
- if (DEBUG(module)) { \
- Debug args ; \
- } \
-} while (0)
-#define DEBUGM(module, args) do { \
- if (DEBUG(module)) { \
- DebugM args; \
- } \
- } while (0)
-
-#define ISDOT(c) ((c)[0] == '.' && (((c)[1] == '\0') || ((c)[1] == '/')))
-#define ISDOTDOT(c) ((c)[0] == '.' && ISDOT(&((c)[1])))
-
-#ifndef MAX
-#define MAX(a, b) ((a) > (b) ? (a) : (b))
-#endif
-
-void Debug(const char *, ...);
-void DebugM(const char *, ...);
-void Error(const char *, ...);
-void Fatal(const char *, ...) __dead2;
-void Punt(const char *, ...) __dead2;
-void DieHorribly(void) __dead2;
-void Finish(int) __dead2;
-char *estrdup(const char *);
-void *emalloc(size_t);
-void *erealloc(void *, size_t);
-int eunlink(const char *);
-void print_flags(FILE *, const struct flag2str *, u_int, int);
-
-#endif /* util_h_b7020fdb */
diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c
deleted file mode 100644
index 259a672..0000000
--- a/usr.bin/make/var.c
+++ /dev/null
@@ -1,2611 +0,0 @@
-/*-
- * Copyright (c) 2002 Juli Mallett.
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)var.c 8.3 (Berkeley) 3/19/94
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/**
- * var.c --
- * Variable-handling functions
- *
- * Interface:
- * Var_Set Set the value of a variable in the given
- * context. The variable is created if it doesn't
- * yet exist. The value and variable name need not
- * be preserved.
- *
- * Var_Append Append more characters to an existing variable
- * in the given context. The variable needn't
- * exist already -- it will be created if it doesn't.
- * A space is placed between the old value and the
- * new one.
- *
- * Var_Exists See if a variable exists.
- *
- * Var_Value Return the value of a variable in a context or
- * NULL if the variable is undefined.
- *
- * Var_Subst Substitute named variable, or all variables if
- * NULL in a string using
- * the given context as the top-most one. If the
- * third argument is non-zero, Parse_Error is
- * called if any variables are undefined.
- *
- * Var_Parse Parse a variable expansion from a string and
- * return the result and the number of characters
- * consumed.
- *
- * Var_Delete Delete a variable in a context.
- *
- * Var_Init Initialize this module.
- *
- * Debugging:
- * Var_Dump Print out all variables defined in the given
- * context.
- *
- * XXX: There's a lot of duplication in these functions.
- */
-
-#include <assert.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <regex.h>
-
-#include "buf.h"
-#include "config.h"
-#include "globals.h"
-#include "GNode.h"
-#include "job.h"
-#include "lst.h"
-#include "make.h"
-#include "parse.h"
-#include "str.h"
-#include "targ.h"
-#include "util.h"
-#include "var.h"
-
-/**
- *
- */
-typedef struct VarParser {
- const char *const input; /* pointer to input string */
- const char *ptr; /* current parser pos in input str */
- GNode *ctxt;
- Boolean err;
- Boolean execute;
-} VarParser;
-
-typedef struct Var {
- char *name; /* the variable's name */
- struct Buffer *val; /* its value */
- int flags; /* miscellaneous status flags */
-
-#define VAR_IN_USE 1 /* Variable's value currently being used.
- * Used to avoid recursion */
-
-#define VAR_JUNK 4 /* Variable is a junk variable that
- * should be destroyed when done with
- * it. Used by Var_Parse for undefined,
- * modified variables */
-
-#define VAR_TO_ENV 8 /* Place variable in environment */
-} Var;
-
-typedef struct {
- struct Buffer *lhs; /* String to match */
- struct Buffer *rhs; /* Replacement string (w/ &'s removed) */
-
- regex_t re;
- int nsub;
- regmatch_t *matches;
-
- int flags;
-#define VAR_SUB_GLOBAL 0x01 /* Apply substitution globally */
-#define VAR_SUB_ONE 0x02 /* Apply substitution to one word */
-#define VAR_SUB_MATCHED 0x04 /* There was a match */
-#define VAR_MATCH_START 0x08 /* Match at start of word */
-#define VAR_MATCH_END 0x10 /* Match at end of word */
-} VarPattern;
-
-typedef Boolean VarModifyProc(const char *, Boolean, struct Buffer *, void *);
-
-static char *VarParse(VarParser *, Boolean *);
-
-/*
- * This is a harmless return value for Var_Parse that can be used by Var_Subst
- * to determine if there was an error in parsing -- easier than returning
- * a flag, as things outside this module don't give a hoot.
- */
-char var_Error[] = "";
-
-/*
- * Similar to var_Error, but returned when the 'err' flag for Var_Parse is
- * set false. Why not just use a constant? Well, gcc likes to condense
- * identical string instances...
- */
-static char varNoError[] = "";
-
-/*
- * Internally, variables are contained in four different contexts.
- * 1) the environment. They may not be changed. If an environment
- * variable is appended-to, the result is placed in the global
- * context.
- * 2) the global context. Variables set in the Makefile are located in
- * the global context. It is the penultimate context searched when
- * substituting.
- * 3) the command-line context. All variables set on the command line
- * are placed in this context. They are UNALTERABLE once placed here.
- * 4) the local context. Each target has associated with it a context
- * list. On this list are located the structures describing such
- * local variables as $(@) and $(*)
- * The four contexts are searched in the reverse order from which they are
- * listed.
- */
-static GNode *VAR_ENV; /* variables from the environment */
-GNode *VAR_GLOBAL; /* variables from the makefile */
-GNode *VAR_CMD; /* variables defined on the command-line */
-
-Boolean oldVars; /* variable substitution style */
-Boolean checkEnvFirst; /* -e flag */
-
-#define OPEN_PAREN '('
-#define CLOSE_PAREN ')'
-#define OPEN_BRACE '{'
-#define CLOSE_BRACE '}'
-
-/**
- * Create a Var object.
- *
- * Params:
- * name Name of variable (copied).
- * value Value of variable (copied) or NULL.
- * flags Flags set on variable.
- *
- * Returns:
- * New variable.
- */
-static Var *
-VarCreate(const char name[], const char value[], int flags)
-{
- Var *v;
-
- v = emalloc(sizeof(Var));
- v->name = estrdup(name);
- v->val = Buf_Init(0);
- v->flags = flags;
-
- if (value != NULL) {
- Buf_Append(v->val, value);
- }
- return (v);
-}
-
-/**
- * Destroy a Var object.
- *
- * Params:
- * v Object to destroy.
- * f True if internal buffer in Buffer object is to be removed.
- */
-static void
-VarDestroy(Var *v, Boolean f)
-{
-
- Buf_Destroy(v->val, f);
- free(v->name);
- free(v);
-}
-
-/**
- * Remove the tail of the given word and place the result in the given
- * buffer.
- *
- * Results:
- * TRUE if characters were added to the buffer (a space needs to be
- * added to the buffer before the next word).
- *
- * Side Effects:
- * The trimmed word is added to the buffer.
- */
-static Boolean
-VarHead(const char *word, Boolean addSpace, Buffer *buf, void *dummy __unused)
-{
- char *slash;
-
- slash = strrchr(word, '/');
- if (slash != NULL) {
- if (addSpace) {
- Buf_AddByte(buf, (Byte)' ');
- }
- Buf_AppendRange(buf, word, slash);
- } else {
- /*
- * If no directory part, give . (q.v. the POSIX standard)
- */
- if (addSpace) {
- Buf_Append(buf, " .");
- } else {
- Buf_AddByte(buf, (Byte)'.');
- }
- }
- return (TRUE);
-}
-
-/**
- * Remove the head of the given word and place the result in the given
- * buffer.
- *
- * Results:
- * TRUE if characters were added to the buffer (a space needs to be
- * added to the buffer before the next word).
- *
- * Side Effects:
- * The trimmed word is added to the buffer.
- */
-static Boolean
-VarTail(const char *word, Boolean addSpace, Buffer *buf, void *dummy __unused)
-{
- const char *slash;
-
- if (addSpace) {
- Buf_AddByte (buf, (Byte)' ');
- }
-
- slash = strrchr(word, '/');
- if (slash != NULL) {
- slash++;
- Buf_Append(buf, slash);
- } else {
- Buf_Append(buf, word);
- }
- return (TRUE);
-}
-
-/**
- * Place the suffix of the given word in the given buffer.
- *
- * Results:
- * TRUE if characters were added to the buffer (a space needs to be
- * added to the buffer before the next word).
- *
- * Side Effects:
- * The suffix from the word is placed in the buffer.
- */
-static Boolean
-VarSuffix(const char *word, Boolean addSpace, Buffer *buf, void *dummy __unused)
-{
- const char *dot;
-
- dot = strrchr(word, '.');
- if (dot != NULL) {
- if (addSpace) {
- Buf_AddByte(buf, (Byte)' ');
- }
- dot++;
- Buf_Append(buf, dot);
- addSpace = TRUE;
- }
- return (addSpace);
-}
-
-/**
- * Remove the suffix of the given word and place the result in the
- * buffer.
- *
- * Results:
- * TRUE if characters were added to the buffer (a space needs to be
- * added to the buffer before the next word).
- *
- * Side Effects:
- * The trimmed word is added to the buffer.
- */
-static Boolean
-VarRoot(const char *word, Boolean addSpace, Buffer *buf, void *dummy __unused)
-{
- char *dot;
-
- if (addSpace) {
- Buf_AddByte(buf, (Byte)' ');
- }
-
- dot = strrchr(word, '.');
- if (dot != NULL) {
- Buf_AppendRange(buf, word, dot);
- } else {
- Buf_Append(buf, word);
- }
- return (TRUE);
-}
-
-/**
- * Place the word in the buffer if it matches the given pattern.
- * Callback function for VarModify to implement the :M modifier.
- * A space will be added if requested. A pattern is supplied
- * which the word must match.
- *
- * Results:
- * TRUE if a space should be placed in the buffer before the next
- * word.
- *
- * Side Effects:
- * The word may be copied to the buffer.
- */
-static Boolean
-VarMatch(const char *word, Boolean addSpace, Buffer *buf, void *pattern)
-{
-
- if (Str_Match(word, pattern)) {
- if (addSpace) {
- Buf_AddByte(buf, (Byte)' ');
- }
- addSpace = TRUE;
- Buf_Append(buf, word);
- }
- return (addSpace);
-}
-
-#ifdef SYSVVARSUB
-/**
- * Place the word in the buffer if it matches the given pattern.
- * Callback function for VarModify to implement the System V %
- * modifiers. A space is added if requested.
- *
- * Results:
- * TRUE if a space should be placed in the buffer before the next
- * word.
- *
- * Side Effects:
- * The word may be copied to the buffer.
- */
-static Boolean
-VarSYSVMatch(const char *word, Boolean addSpace, Buffer *buf, void *patp)
-{
- int len;
- const char *ptr;
- VarPattern *pat = (VarPattern *)patp;
-
- if (addSpace)
- Buf_AddByte(buf, (Byte)' ');
-
- addSpace = TRUE;
-
- if ((ptr = Str_SYSVMatch(word, Buf_Data(pat->lhs), &len)) != NULL)
- Str_SYSVSubst(buf, Buf_Data(pat->rhs), ptr, len);
- else
- Buf_Append(buf, word);
-
- return (addSpace);
-}
-#endif
-
-/**
- * Place the word in the buffer if it doesn't match the given pattern.
- * Callback function for VarModify to implement the :N modifier. A
- * space is added if requested.
- *
- * Results:
- * TRUE if a space should be placed in the buffer before the next
- * word.
- *
- * Side Effects:
- * The word may be copied to the buffer.
- */
-static Boolean
-VarNoMatch(const char *word, Boolean addSpace, Buffer *buf, void *pattern)
-{
-
- if (!Str_Match(word, pattern)) {
- if (addSpace) {
- Buf_AddByte(buf, (Byte)' ');
- }
- addSpace = TRUE;
- Buf_Append(buf, word);
- }
- return (addSpace);
-}
-
-/**
- * Perform a string-substitution on the given word, placing the
- * result in the passed buffer. A space is added if requested.
- *
- * Results:
- * TRUE if a space is needed before more characters are added.
- */
-static Boolean
-VarSubstitute(const char *word, Boolean addSpace, Buffer *buf, void *patternp)
-{
- size_t wordLen; /* Length of word */
- const char *cp; /* General pointer */
- VarPattern *pattern = patternp;
-
- wordLen = strlen(word);
- if (1) { /* substitute in each word of the variable */
- /*
- * Break substitution down into simple anchored cases
- * and if none of them fits, perform the general substitution
- * case.
- */
- if ((pattern->flags & VAR_MATCH_START) &&
- (strncmp(word, Buf_Data(pattern->lhs),
- Buf_Size(pattern->lhs)) == 0)) {
- /*
- * Anchored at start and beginning of word matches
- * pattern.
- */
- if ((pattern->flags & VAR_MATCH_END) &&
- (wordLen == Buf_Size(pattern->lhs))) {
- /*
- * Also anchored at end and matches to the end
- * (word is same length as pattern) add space
- * and rhs only if rhs is non-null.
- */
- if (Buf_Size(pattern->rhs) != 0) {
- if (addSpace) {
- Buf_AddByte(buf, (Byte)' ');
- }
- addSpace = TRUE;
- Buf_AppendBuf(buf, pattern->rhs);
- }
-
- } else if (pattern->flags & VAR_MATCH_END) {
- /*
- * Doesn't match to end -- copy word wholesale
- */
- goto nosub;
-
- } else {
- /*
- * Matches at start but need to copy in
- * trailing characters.
- */
- if ((Buf_Size(pattern->rhs) + wordLen -
- Buf_Size(pattern->lhs)) != 0) {
- if (addSpace) {
- Buf_AddByte(buf, (Byte)' ');
- }
- addSpace = TRUE;
- }
- Buf_AppendBuf(buf, pattern->rhs);
- Buf_AddBytes(buf, wordLen -
- Buf_Size(pattern->lhs),
- (word + Buf_Size(pattern->lhs)));
- }
-
- } else if (pattern->flags & VAR_MATCH_START) {
- /*
- * Had to match at start of word and didn't -- copy
- * whole word.
- */
- goto nosub;
-
- } else if (pattern->flags & VAR_MATCH_END) {
- /*
- * Anchored at end, Find only place match could occur
- * (leftLen characters from the end of the word) and
- * see if it does. Note that because the $ will be
- * left at the end of the lhs, we have to use strncmp.
- */
- cp = word + (wordLen - Buf_Size(pattern->lhs));
- if ((cp >= word) && (strncmp(cp, Buf_Data(pattern->lhs),
- Buf_Size(pattern->lhs)) == 0)) {
- /*
- * Match found. If we will place characters in
- * the buffer, add a space before hand as
- * indicated by addSpace, then stuff in the
- * initial, unmatched part of the word followed
- * by the right-hand-side.
- */
- if ((cp - word) + Buf_Size(pattern->rhs) != 0) {
- if (addSpace) {
- Buf_AddByte(buf, (Byte)' ');
- }
- addSpace = TRUE;
- }
- Buf_AppendRange(buf, word, cp);
- Buf_AppendBuf(buf, pattern->rhs);
-
- } else {
- /*
- * Had to match at end and didn't. Copy entire
- * word.
- */
- goto nosub;
- }
- } else {
- /*
- * Pattern is unanchored: search for the pattern in the
- * word using strstr(3), copying unmatched portions and
- * the right-hand-side for each match found, handling
- * non-global substitutions correctly, etc. When the
- * loop is done, any remaining part of the word (word
- * and wordLen are adjusted accordingly through the
- * loop) is copied straight into the buffer.
- * addSpace is set FALSE as soon as a space is added
- * to the buffer.
- */
- Boolean done;
- size_t origSize;
-
- done = FALSE;
- origSize = Buf_Size(buf);
- while (!done) {
- cp = strstr(word, Buf_Data(pattern->lhs));
- if (cp != NULL) {
- if (addSpace && (((cp - word) +
- Buf_Size(pattern->rhs)) != 0)) {
- Buf_AddByte(buf, (Byte)' ');
- addSpace = FALSE;
- }
- Buf_AppendRange(buf, word, cp);
- Buf_AppendBuf(buf, pattern->rhs);
- wordLen -= (cp - word) +
- Buf_Size(pattern->lhs);
- word = cp + Buf_Size(pattern->lhs);
- if (wordLen == 0 || (pattern->flags &
- VAR_SUB_GLOBAL) == 0) {
- done = TRUE;
- }
- } else {
- done = TRUE;
- }
- }
- if (wordLen != 0) {
- if (addSpace) {
- Buf_AddByte(buf, (Byte)' ');
- }
- Buf_AddBytes(buf, wordLen, (const Byte *)word);
- }
-
- /*
- * If added characters to the buffer, need to add a
- * space before we add any more. If we didn't add any,
- * just return the previous value of addSpace.
- */
- return ((Buf_Size(buf) != origSize) || addSpace);
- }
- /*
- * Common code for anchored substitutions:
- * addSpace was set TRUE if characters were added to the buffer.
- */
- return (addSpace);
- }
- nosub:
- if (addSpace) {
- Buf_AddByte(buf, (Byte)' ');
- }
- Buf_AddBytes(buf, wordLen, (const Byte *)word);
- return (TRUE);
-}
-
-/**
- * Print the error caused by a regcomp or regexec call.
- *
- * Side Effects:
- * An error gets printed.
- */
-static void
-VarREError(int err, regex_t *pat, const char *str)
-{
- char *errbuf;
- int errlen;
-
- errlen = regerror(err, pat, 0, 0);
- errbuf = emalloc(errlen);
- regerror(err, pat, errbuf, errlen);
- Error("%s: %s", str, errbuf);
- free(errbuf);
-}
-
-
-/**
- * Perform a regex substitution on the given word, placing the
- * result in the passed buffer. A space is added if requested.
- *
- * Results:
- * TRUE if a space is needed before more characters are added.
- */
-static Boolean
-VarRESubstitute(const char *word, Boolean addSpace, Buffer *buf, void *patternp)
-{
- VarPattern *pat;
- int xrv;
- const char *wp;
- char *rp;
- int added;
- int flags = 0;
-
-#define MAYBE_ADD_SPACE() \
- if (addSpace && !added) \
- Buf_AddByte(buf, (Byte)' '); \
- added = 1
-
- added = 0;
- wp = word;
- pat = patternp;
-
- if ((pat->flags & (VAR_SUB_ONE | VAR_SUB_MATCHED)) ==
- (VAR_SUB_ONE | VAR_SUB_MATCHED)) {
- xrv = REG_NOMATCH;
- } else {
- tryagain:
- xrv = regexec(&pat->re, wp, pat->nsub, pat->matches, flags);
- }
-
- switch (xrv) {
- case 0:
- pat->flags |= VAR_SUB_MATCHED;
- if (pat->matches[0].rm_so > 0) {
- MAYBE_ADD_SPACE();
- Buf_AddBytes(buf, pat->matches[0].rm_so,
- (const Byte *)wp);
- }
-
- for (rp = Buf_Data(pat->rhs); *rp; rp++) {
- if ((*rp == '\\') && ((rp[1] == '&') || (rp[1] == '\\'))) {
- MAYBE_ADD_SPACE();
- Buf_AddByte(buf, (Byte)rp[1]);
- rp++;
-
- } else if ((*rp == '&') ||
- ((*rp == '\\') && isdigit((unsigned char)rp[1]))) {
- int n;
- const char *subbuf;
- int sublen;
- char errstr[3];
-
- if (*rp == '&') {
- n = 0;
- errstr[0] = '&';
- errstr[1] = '\0';
- } else {
- n = rp[1] - '0';
- errstr[0] = '\\';
- errstr[1] = rp[1];
- errstr[2] = '\0';
- rp++;
- }
-
- if (n > pat->nsub) {
- Error("No subexpression %s",
- &errstr[0]);
- subbuf = "";
- sublen = 0;
-
- } else if ((pat->matches[n].rm_so == -1) &&
- (pat->matches[n].rm_eo == -1)) {
- Error("No match for subexpression %s",
- &errstr[0]);
- subbuf = "";
- sublen = 0;
-
- } else {
- subbuf = wp + pat->matches[n].rm_so;
- sublen = pat->matches[n].rm_eo -
- pat->matches[n].rm_so;
- }
-
- if (sublen > 0) {
- MAYBE_ADD_SPACE();
- Buf_AddBytes(buf, sublen,
- (const Byte *)subbuf);
- }
- } else {
- MAYBE_ADD_SPACE();
- Buf_AddByte(buf, (Byte)*rp);
- }
- }
- wp += pat->matches[0].rm_eo;
- if (pat->flags & VAR_SUB_GLOBAL) {
- flags |= REG_NOTBOL;
- if (pat->matches[0].rm_so == 0 &&
- pat->matches[0].rm_eo == 0) {
- MAYBE_ADD_SPACE();
- Buf_AddByte(buf, (Byte)*wp);
- wp++;
- }
- if (*wp)
- goto tryagain;
- }
- if (*wp) {
- MAYBE_ADD_SPACE();
- Buf_Append(buf, wp);
- }
- break;
-
- default:
- VarREError(xrv, &pat->re, "Unexpected regex error");
- /* fall through */
-
- case REG_NOMATCH:
- if (*wp) {
- MAYBE_ADD_SPACE();
- Buf_Append(buf, wp);
- }
- break;
- }
- return (addSpace || added);
-}
-
-/**
- * Find a variable in a variable list.
- */
-static Var *
-VarLookup(Lst *vlist, const char *name)
-{
- LstNode *ln;
-
- LST_FOREACH(ln, vlist)
- if (strcmp(((const Var *)Lst_Datum(ln))->name, name) == 0)
- return (Lst_Datum(ln));
- return (NULL);
-}
-
-/**
- * Expand a variable name's embedded variables in the given context.
- *
- * Results:
- * The contents of name, possibly expanded.
- */
-static char *
-VarPossiblyExpand(const char *name, GNode *ctxt)
-{
- Buffer *buf;
-
- if (strchr(name, '$') != NULL) {
- buf = Var_Subst(name, ctxt, 0);
- return (Buf_Peel(buf));
- } else {
- return estrdup(name);
- }
-}
-
-/**
- * If the variable name begins with a '.', it could very well be
- * one of the local ones. We check the name against all the local
- * variables and substitute the short version in for 'name' if it
- * matches one of them.
- */
-static const char *
-VarLocal(const char name[])
-{
- if (name[0] == '.') {
- switch (name[1]) {
- case 'A':
- if (!strcmp(name, ".ALLSRC"))
- return (ALLSRC);
- if (!strcmp(name, ".ARCHIVE"))
- return (ARCHIVE);
- break;
- case 'I':
- if (!strcmp(name, ".IMPSRC"))
- return (IMPSRC);
- break;
- case 'M':
- if (!strcmp(name, ".MEMBER"))
- return (MEMBER);
- break;
- case 'O':
- if (!strcmp(name, ".OODATE"))
- return (OODATE);
- break;
- case 'P':
- if (!strcmp(name, ".PREFIX"))
- return (PREFIX);
- break;
- case 'T':
- if (!strcmp(name, ".TARGET"))
- return (TARGET);
- break;
- default:
- break;
- }
- }
- return (name);
-}
-
-/**
- * Find the given variable in the given context and the enviornment.
- *
- * Results:
- * A pointer to the structure describing the desired variable or
- * NULL if the variable does not exist.
- */
-static Var *
-VarFindEnv(const char name[], GNode *ctxt)
-{
- Var *var;
-
- name = VarLocal(name);
-
- if ((var = VarLookup(&ctxt->context, name)) != NULL)
- return (var);
-
- if ((var = VarLookup(&VAR_ENV->context, name)) != NULL)
- return (var);
-
- return (NULL);
-}
-
-/**
- * Look for the variable in the given context.
- */
-static Var *
-VarFindOnly(const char name[], GNode *ctxt)
-{
- Var *var;
-
- name = VarLocal(name);
-
- if ((var = VarLookup(&ctxt->context, name)) != NULL)
- return (var);
-
- return (NULL);
-}
-
-/**
- * Look for the variable in all contexts.
- */
-static Var *
-VarFindAny(const char name[], GNode *ctxt)
-{
- Boolean localCheckEnvFirst;
- LstNode *ln;
- Var *var;
-
- name = VarLocal(name);
-
- /*
- * Note whether this is one of the specific variables we were told
- * through the -E flag to use environment-variable-override for.
- */
- localCheckEnvFirst = FALSE;
- LST_FOREACH(ln, &envFirstVars) {
- if (strcmp(Lst_Datum(ln), name) == 0) {
- localCheckEnvFirst = TRUE;
- break;
- }
- }
-
- /*
- * First look for the variable in the given context. If it's not there,
- * look for it in VAR_CMD, VAR_GLOBAL and the environment,
- * in that order, depending on the FIND_* flags in 'flags'
- */
- if ((var = VarLookup(&ctxt->context, name)) != NULL)
- return (var);
-
- /* not there - try command line context */
- if (ctxt != VAR_CMD) {
- if ((var = VarLookup(&VAR_CMD->context, name)) != NULL)
- return (var);
- }
-
- /* not there - try global context, but only if not -e/-E */
- if (ctxt != VAR_GLOBAL && (!checkEnvFirst && !localCheckEnvFirst)) {
- if ((var = VarLookup(&VAR_GLOBAL->context, name)) != NULL)
- return (var);
- }
-
- if ((var = VarLookup(&VAR_ENV->context, name)) != NULL)
- return (var);
-
- /* deferred check for the environment (in case of -e/-E) */
- if ((ctxt != VAR_GLOBAL) && (checkEnvFirst || localCheckEnvFirst)) {
- if ((var = VarLookup(&VAR_GLOBAL->context, name)) != NULL)
- return (var);
- }
-
- return (NULL);
-}
-
-/**
- * Add a new variable of name name and value val to the given context.
- *
- * Side Effects:
- * The new variable is placed at the front of the given context
- * The name and val arguments are duplicated so they may
- * safely be freed.
- */
-static void
-VarAdd(const char *name, const char *val, GNode *ctxt)
-{
-
- Lst_AtFront(&ctxt->context, VarCreate(name, val, 0));
- DEBUGF(VAR, ("%s:%s = %s\n", ctxt->name, name, val));
-}
-
-/**
- * Remove a variable from a context.
- *
- * Side Effects:
- * The Var structure is removed and freed.
- */
-void
-Var_Delete(const char *name, GNode *ctxt)
-{
- LstNode *ln;
-
- DEBUGF(VAR, ("%s:delete %s\n", ctxt->name, name));
- LST_FOREACH(ln, &ctxt->context) {
- if (strcmp(((const Var *)Lst_Datum(ln))->name, name) == 0) {
- VarDestroy(Lst_Datum(ln), TRUE);
- Lst_Remove(&ctxt->context, ln);
- break;
- }
- }
-}
-
-/**
- * Set the variable name to the value val in the given context.
- *
- * Side Effects:
- * If the variable doesn't yet exist, a new record is created for it.
- * Else the old value is freed and the new one stuck in its place
- *
- * Notes:
- * The variable is searched for only in its context before being
- * created in that context. I.e. if the context is VAR_GLOBAL,
- * only VAR_GLOBAL->context is searched. Likewise if it is VAR_CMD, only
- * VAR_CMD->context is searched. This is done to avoid the literally
- * thousands of unnecessary strcmp's that used to be done to
- * set, say, $(@) or $(<).
- */
-void
-Var_Set(const char *name, const char *val, GNode *ctxt)
-{
- Var *v;
- char *n;
-
- /*
- * We only look for a variable in the given context since anything
- * set here will override anything in a lower context, so there's not
- * much point in searching them all just to save a bit of memory...
- */
- n = VarPossiblyExpand(name, ctxt);
- v = VarFindOnly(n, ctxt);
- if (v == NULL) {
- VarAdd(n, val, ctxt);
- if (ctxt == VAR_CMD) {
- /*
- * Any variables given on the command line
- * are automatically exported to the
- * environment (as per POSIX standard)
- */
- setenv(n, val, 1);
- }
- } else {
- Buf_Clear(v->val);
- Buf_Append(v->val, val);
-
- if (ctxt == VAR_CMD || (v->flags & VAR_TO_ENV)) {
- /*
- * Any variables given on the command line
- * are automatically exported to the
- * environment (as per POSIX standard)
- */
- setenv(n, val, 1);
- }
- DEBUGF(VAR, ("%s:%s = %s\n", ctxt->name, n, val));
- }
-
- free(n);
-}
-
-/**
- * Set the a global name variable to the value.
- */
-void
-Var_SetGlobal(const char name[], const char value[])
-{
-
- Var_Set(name, value, VAR_GLOBAL);
-}
-
-
-/**
- * Set the VAR_TO_ENV flag on a variable
- */
-void
-Var_SetEnv(const char *name, GNode *ctxt)
-{
- Var *v;
-
- v = VarFindOnly(name, VAR_CMD);
- if (v != NULL) {
- /*
- * Do not allow .EXPORT: to be set on variables
- * from the comand line or MAKEFLAGS.
- */
- Error(
- "Warning: Did not set .EXPORTVAR: on %s because it "
- "is from the comand line or MAKEFLAGS", name);
- return;
- }
-
- v = VarFindAny(name, ctxt);
- if (v == NULL) {
- Lst_AtFront(&VAR_ENV->context,
- VarCreate(name, NULL, VAR_TO_ENV));
- setenv(name, "", 1);
- Error("Warning: .EXPORTVAR: set on undefined variable %s", name);
- } else {
- if ((v->flags & VAR_TO_ENV) == 0) {
- v->flags |= VAR_TO_ENV;
- setenv(v->name, Buf_Data(v->val), 1);
- }
- }
-}
-
-/**
- * The variable of the given name has the given value appended to it in
- * the given context.
- *
- * Side Effects:
- * If the variable doesn't exist, it is created. Else the strings
- * are concatenated (with a space in between).
- *
- * Notes:
- * Only if the variable is being sought in the global context is the
- * environment searched.
- * XXX: Knows its calling circumstances in that if called with ctxt
- * an actual target, it will only search that context since only
- * a local variable could be being appended to. This is actually
- * a big win and must be tolerated.
- */
-void
-Var_Append(const char *name, const char *val, GNode *ctxt)
-{
- Var *v;
- char *n;
-
- n = VarPossiblyExpand(name, ctxt);
- if (ctxt == VAR_GLOBAL) {
- v = VarFindEnv(n, ctxt);
- } else {
- v = VarFindOnly(n, ctxt);
- }
- if (v == NULL) {
- VarAdd(n, val, ctxt);
- } else {
- Buf_AddByte(v->val, (Byte)' ');
- Buf_Append(v->val, val);
- DEBUGF(VAR, ("%s:%s = %s\n", ctxt->name, n, Buf_Data(v->val)));
- }
- free(n);
-}
-
-/**
- * See if the given variable exists.
- *
- * Results:
- * TRUE if it does, FALSE if it doesn't
- */
-Boolean
-Var_Exists(const char *name, GNode *ctxt)
-{
- Var *v;
- char *n;
-
- n = VarPossiblyExpand(name, ctxt);
- v = VarFindAny(n, ctxt);
- if (v == NULL) {
- free(n);
- return (FALSE);
- } else {
- free(n);
- return (TRUE);
- }
-}
-
-/**
- * Return the value of the named variable in the given context
- *
- * Results:
- * The value if the variable exists, NULL if it doesn't.
- */
-const char *
-Var_Value(const char name[], GNode *ctxt)
-{
- Var *v;
- char *n;
-
- n = VarPossiblyExpand(name, ctxt);
- v = VarFindAny(n, ctxt);
- free(n);
- if (v == NULL) {
- return (NULL);
- } else {
- return (Buf_Data(v->val));
- }
-}
-
-/**
- * Modify each of the words of the passed string using the given
- * function. Used to implement all modifiers.
- *
- * Results:
- * A string of all the words modified appropriately.
- *
- * Side Effects:
- * Uses brk_string() so it invalidates any previous call to
- * brk_string().
- */
-static char *
-VarModify(const char *str, VarModifyProc *modProc, void *datum)
-{
- ArgArray aa;
- Buffer *buf; /* Buffer for the new string */
- int i;
- Boolean addSpace; /*
- * TRUE if need to add a space to
- * the buffer before adding the
- * trimmed word
- */
-
- brk_string(&aa, str, FALSE);
-
- addSpace = FALSE;
- buf = Buf_Init(0);
- for (i = 1; i < aa.argc; i++)
- addSpace = (*modProc)(aa.argv[i], addSpace, buf, datum);
-
- ArgArray_Done(&aa);
- return (Buf_Peel(buf));
-}
-
-/**
- * Sort the words in the string.
- *
- * Input:
- * str String whose words should be sorted
- * cmp A comparison function to control the ordering
- *
- * Results:
- * A string containing the words sorted
- */
-static char *
-VarSortWords(const char *str, int (*cmp)(const void *, const void *))
-{
- ArgArray aa;
- Buffer *buf;
- int i;
-
- brk_string(&aa, str, FALSE);
- qsort(aa.argv + 1, aa.argc - 1, sizeof(char *), cmp);
-
- buf = Buf_Init(0);
- for (i = 1; i < aa.argc; i++) {
- Buf_Append(buf, aa.argv[i]);
- Buf_AddByte(buf, (Byte)((i < aa.argc - 1) ? ' ' : '\0'));
- }
-
- ArgArray_Done(&aa);
- return (Buf_Peel(buf));
-}
-
-static int
-SortIncreasing(const void *l, const void *r)
-{
-
- return (strcmp(*(const char* const*)l, *(const char* const*)r));
-}
-
-/**
- * Remove adjacent duplicate words.
- *
- * Results:
- * A string containing the resulting words.
- */
-static char *
-VarUniq(const char *str)
-{
- ArgArray aa;
- Buffer *buf; /* Buffer for new string */
- int i, j;
-
- buf = Buf_Init(0);
- brk_string(&aa, str, FALSE);
-
- if (aa.argc > 2) {
- for (j = 1, i = 2; i < aa.argc; i++) {
- if (strcmp(aa.argv[i], aa.argv[j]) != 0 && (++j != i))
- aa.argv[j] = aa.argv[i];
- }
- aa.argc = j + 1;
- }
-
- for (i = 1; i < aa.argc; i++) {
- Buf_AddBytes(buf, strlen(aa.argv[i]), (Byte *)aa.argv[i]);
- if (i != aa.argc - 1)
- Buf_AddByte(buf, ' ');
- }
- Buf_AddByte(buf, '\0');
-
- ArgArray_Done(&aa);
- return (Buf_Peel(buf));
-}
-
-/**
- * Pass through the tstr looking for 1) escaped delimiters,
- * '$'s and backslashes (place the escaped character in
- * uninterpreted) and 2) unescaped $'s that aren't before
- * the delimiter (expand the variable substitution).
- * Return the expanded string or NULL if the delimiter was missing
- * If pattern is specified, handle escaped ampersands, and replace
- * unescaped ampersands with the lhs of the pattern.
- *
- * Results:
- * A string of all the words modified appropriately.
- * If length is specified, return the string length of the buffer
- * If flags is specified and the last character of the pattern is a
- * $ set the VAR_MATCH_END bit of flags.
- */
-static Buffer *
-VarGetPattern(VarParser *vp, int delim, int *flags, VarPattern *patt)
-{
- Buffer *buf;
-
- buf = Buf_Init(0);
-
- /*
- * Skim through until the matching delimiter is found; pick up
- * variable substitutions on the way. Also allow backslashes to quote
- * the delimiter, $, and \, but don't touch other backslashes.
- */
- while (*vp->ptr != '\0') {
- if (*vp->ptr == delim) {
- return (buf);
-
- } else if ((vp->ptr[0] == '\\') &&
- ((vp->ptr[1] == delim) ||
- (vp->ptr[1] == '\\') ||
- (vp->ptr[1] == '$') ||
- (vp->ptr[1] == '&' && patt != NULL))) {
- vp->ptr++; /* consume backslash */
- Buf_AddByte(buf, (Byte)vp->ptr[0]);
- vp->ptr++;
-
- } else if (vp->ptr[0] == '$') {
- if (vp->ptr[1] == delim) {
- if (flags == NULL) {
- Buf_AddByte(buf, (Byte)vp->ptr[0]);
- vp->ptr++;
- } else {
- /*
- * Unescaped $ at end of patt =>
- * anchor patt at end.
- */
- *flags |= VAR_MATCH_END;
- vp->ptr++;
- }
- } else {
- VarParser subvp = {
- vp->ptr,
- vp->ptr,
- vp->ctxt,
- vp->err,
- vp->execute
- };
- char *rval;
- Boolean rfree;
-
- /*
- * If unescaped dollar sign not
- * before the delimiter, assume it's
- * a variable substitution and
- * recurse.
- */
- rval = VarParse(&subvp, &rfree);
- Buf_Append(buf, rval);
- if (rfree)
- free(rval);
- vp->ptr = subvp.ptr;
- }
- } else if (vp->ptr[0] == '&' && patt != NULL) {
- Buf_AppendBuf(buf, patt->lhs);
- vp->ptr++;
- } else {
- Buf_AddByte(buf, (Byte)vp->ptr[0]);
- vp->ptr++;
- }
- }
-
- Buf_Destroy(buf, TRUE);
- return (NULL);
-}
-
-/**
- * Make sure this variable is fully expanded.
- */
-static char *
-VarExpand(Var *v, VarParser *vp)
-{
- char *value;
- char *result;
-
- if (v->flags & VAR_IN_USE) {
- Fatal("Variable %s is recursive.", v->name);
- /* NOTREACHED */
- }
-
- v->flags |= VAR_IN_USE;
-
- /*
- * Before doing any modification, we have to make sure the
- * value has been fully expanded. If it looks like recursion
- * might be necessary (there's a dollar sign somewhere in the
- * variable's value) we just call Var_Subst to do any other
- * substitutions that are necessary. Note that the value
- * returned by Var_Subst will have been
- * dynamically-allocated, so it will need freeing when we
- * return.
- */
- value = Buf_Data(v->val);
- if (strchr(value, '$') == NULL) {
- result = strdup(value);
- } else {
- Buffer *buf;
-
- buf = Var_Subst(value, vp->ctxt, vp->err);
- result = Buf_Peel(buf);
- }
-
- v->flags &= ~VAR_IN_USE;
-
- return (result);
-}
-
-/**
- * Select only those words in value that match the modifier.
- */
-static char *
-modifier_M(VarParser *vp, const char value[], char endc)
-{
- char *patt;
- char *ptr;
- char *newValue;
- char modifier;
-
- modifier = vp->ptr[0];
- vp->ptr++; /* consume 'M' or 'N' */
-
- /*
- * Compress the \:'s out of the pattern, so allocate enough
- * room to hold the uncompressed pattern and compress the
- * pattern into that space.
- */
- patt = estrdup(vp->ptr);
- ptr = patt;
- while (vp->ptr[0] != '\0') {
- if (vp->ptr[0] == endc || vp->ptr[0] == ':') {
- break;
- }
- if (vp->ptr[0] == '\\' &&
- (vp->ptr[1] == endc || vp->ptr[1] == ':')) {
- vp->ptr++; /* consume backslash */
- }
- *ptr = vp->ptr[0];
- ptr++;
- vp->ptr++;
- }
- *ptr = '\0';
-
- if (modifier == 'M') {
- newValue = VarModify(value, VarMatch, patt);
- } else {
- newValue = VarModify(value, VarNoMatch, patt);
- }
- free(patt);
-
- return (newValue);
-}
-
-/**
- * Substitute the replacement string for the pattern. The substitution
- * is applied to each word in value.
- */
-static char *
-modifier_S(VarParser *vp, const char value[], Var *v)
-{
- VarPattern patt;
- char delim;
- char *newValue;
-
- patt.flags = 0;
-
- vp->ptr++; /* consume 'S' */
-
- delim = *vp->ptr; /* used to find end of pattern */
- vp->ptr++; /* consume 1st delim */
-
- /*
- * If pattern begins with '^', it is anchored to the start of the
- * word -- skip over it and flag pattern.
- */
- if (*vp->ptr == '^') {
- patt.flags |= VAR_MATCH_START;
- vp->ptr++;
- }
-
- patt.lhs = VarGetPattern(vp, delim, &patt.flags, NULL);
- if (patt.lhs == NULL) {
- /*
- * LHS didn't end with the delim, complain and exit.
- */
- Fatal("Unclosed substitution for %s (%c missing)",
- v->name, delim);
- }
-
- vp->ptr++; /* consume 2nd delim */
-
- patt.rhs = VarGetPattern(vp, delim, NULL, &patt);
- if (patt.rhs == NULL) {
- /*
- * RHS didn't end with the delim, complain and exit.
- */
- Fatal("Unclosed substitution for %s (%c missing)",
- v->name, delim);
- }
-
- vp->ptr++; /* consume last delim */
-
- /*
- * Check for global substitution. If 'g' after the final delimiter,
- * substitution is global and is marked that way.
- */
- if (vp->ptr[0] == 'g') {
- patt.flags |= VAR_SUB_GLOBAL;
- vp->ptr++;
- }
-
- /*
- * Global substitution of the empty string causes an infinite number
- * of matches, unless anchored by '^' (start of string) or '$' (end
- * of string). Catch the infinite substitution here. Note that flags
- * can only contain the 3 bits we're interested in so we don't have
- * to mask unrelated bits. We can test for equality.
- */
- if (Buf_Size(patt.lhs) == 0 && patt.flags == VAR_SUB_GLOBAL)
- Fatal("Global substitution of the empty string");
-
- newValue = VarModify(value, VarSubstitute, &patt);
-
- /*
- * Free the two strings.
- */
- free(patt.lhs);
- free(patt.rhs);
-
- return (newValue);
-}
-
-static char *
-modifier_C(VarParser *vp, char value[], Var *v)
-{
- VarPattern patt;
- char delim;
- int error;
- char *newValue;
-
- patt.flags = 0;
-
- vp->ptr++; /* consume 'C' */
-
- delim = *vp->ptr; /* delimiter between sections */
-
- vp->ptr++; /* consume 1st delim */
-
- patt.lhs = VarGetPattern(vp, delim, NULL, NULL);
- if (patt.lhs == NULL) {
- Fatal("Unclosed substitution for %s (%c missing)",
- v->name, delim);
- }
-
- vp->ptr++; /* consume 2st delim */
-
- patt.rhs = VarGetPattern(vp, delim, NULL, NULL);
- if (patt.rhs == NULL) {
- Fatal("Unclosed substitution for %s (%c missing)",
- v->name, delim);
- }
-
- vp->ptr++; /* consume last delim */
-
- switch (*vp->ptr) {
- case 'g':
- patt.flags |= VAR_SUB_GLOBAL;
- vp->ptr++; /* consume 'g' */
- break;
- case '1':
- patt.flags |= VAR_SUB_ONE;
- vp->ptr++; /* consume '1' */
- break;
- default:
- break;
- }
-
- error = regcomp(&patt.re, Buf_Data(patt.lhs), REG_EXTENDED);
- if (error) {
- VarREError(error, &patt.re, "RE substitution error");
- free(patt.rhs);
- free(patt.lhs);
- return (var_Error);
- }
-
- patt.nsub = patt.re.re_nsub + 1;
- if (patt.nsub < 1)
- patt.nsub = 1;
- if (patt.nsub > 10)
- patt.nsub = 10;
- patt.matches = emalloc(patt.nsub * sizeof(regmatch_t));
-
- newValue = VarModify(value, VarRESubstitute, &patt);
-
- regfree(&patt.re);
- free(patt.matches);
- free(patt.rhs);
- free(patt.lhs);
-
- return (newValue);
-}
-
-static char *
-sysVvarsub(VarParser *vp, char startc, Var *v, const char value[])
-{
-#ifdef SYSVVARSUB
- /*
- * This can either be a bogus modifier or a System-V substitution
- * command.
- */
- char endc;
- VarPattern patt;
- Boolean eqFound;
- int cnt;
- char *newStr;
- const char *cp;
-
- endc = (startc == OPEN_PAREN) ? CLOSE_PAREN : CLOSE_BRACE;
-
- patt.flags = 0;
-
- /*
- * First we make a pass through the string trying to verify it is a
- * SYSV-make-style translation: it must be: <string1>=<string2>)
- */
- eqFound = FALSE;
- cp = vp->ptr;
- cnt = 1;
- while (*cp != '\0' && cnt) {
- if (*cp == '=') {
- eqFound = TRUE;
- /* continue looking for endc */
- } else if (*cp == endc)
- cnt--;
- else if (*cp == startc)
- cnt++;
- if (cnt)
- cp++;
- }
-
- if (*cp == endc && eqFound) {
- /*
- * Now we break this sucker into the lhs and rhs.
- */
- patt.lhs = VarGetPattern(vp, '=', &patt.flags, NULL);
- if (patt.lhs == NULL) {
- Fatal("Unclosed substitution for %s (%c missing)",
- v->name, '=');
- }
- vp->ptr++; /* consume '=' */
-
- patt.rhs = VarGetPattern(vp, endc, NULL, &patt);
- if (patt.rhs == NULL) {
- Fatal("Unclosed substitution for %s (%c missing)",
- v->name, endc);
- }
-
- /*
- * SYSV modifications happen through the whole string. Note
- * the pattern is anchored at the end.
- */
- newStr = VarModify(value, VarSYSVMatch, &patt);
-
- free(patt.lhs);
- free(patt.rhs);
- } else
-#endif
- {
- Error("Unknown modifier '%c'\n", *vp->ptr);
- vp->ptr++;
- while (*vp->ptr != '\0') {
- if (*vp->ptr == endc && *vp->ptr == ':') {
- break;
- }
- vp->ptr++;
- }
- newStr = var_Error;
- }
-
- return (newStr);
-}
-
-/**
- * Quote shell meta-characters in the string
- *
- * Results:
- * The quoted string
- */
-static char *
-Var_Quote(const char *str)
-{
- Buffer *buf;
- /* This should cover most shells :-( */
- static char meta[] = "\n \t'`\";&<>()|*?{}[]\\$!#^~";
-
- buf = Buf_Init(MAKE_BSIZE);
- for (; *str; str++) {
- if (strchr(meta, *str) != NULL)
- Buf_AddByte(buf, (Byte)'\\');
- Buf_AddByte(buf, (Byte)*str);
- }
-
- return (Buf_Peel(buf));
-}
-
-
-/*
- * Now we need to apply any modifiers the user wants applied.
- * These are:
- * :M<pattern>
- * words which match the given <pattern>.
- * <pattern> is of the standard file
- * wildcarding form.
- * :N<pattern>
- * words which do not match the given <pattern>
- * <pattern> is of the standard file
- * wildcarding form.
- * :S<d><pat1><d><pat2><d>[g]
- * Substitute <pat2> for <pat1> in the value
- * :C<d><pat1><d><pat2><d>[g]
- * Substitute <pat2> for regex <pat1> in the value
- * :H Substitute the head of each word
- * :T Substitute the tail of each word
- * :E Substitute the extension (minus '.') of
- * each word
- * :R Substitute the root of each word
- * (pathname minus the suffix).
- * :lhs=rhs
- * Like :S, but the rhs goes to the end of
- * the invocation.
- * :U Converts variable to upper-case.
- * :L Converts variable to lower-case.
- * :O ("Order") Alphabeticaly sort words in variable.
- * :u ("uniq") Remove adjacent duplicate words.
- */
-static char *
-ParseModifier(VarParser *vp, char startc, Var *v, Boolean *freeResult)
-{
- char *value;
- char endc;
-
- value = VarExpand(v, vp);
- *freeResult = TRUE;
-
- endc = (startc == OPEN_PAREN) ? CLOSE_PAREN : CLOSE_BRACE;
-
- vp->ptr++; /* consume first colon */
-
- while (*vp->ptr != '\0') {
- char *newStr; /* New value to return */
-
- if (*vp->ptr == endc) {
- return (value);
- }
-
- DEBUGF(VAR, ("Applying :%c to \"%s\"\n", *vp->ptr, value));
- switch (*vp->ptr) {
- case 'N':
- case 'M':
- newStr = modifier_M(vp, value, endc);
- break;
- case 'S':
- newStr = modifier_S(vp, value, v);
- break;
- case 'C':
- newStr = modifier_C(vp, value, v);
- break;
- default:
- if (vp->ptr[1] != endc && vp->ptr[1] != ':') {
-#ifdef SUNSHCMD
- if ((vp->ptr[0] == 's') &&
- (vp->ptr[1] == 'h') &&
- (vp->ptr[2] == endc || vp->ptr[2] == ':')) {
- const char *error;
-
- if (vp->execute) {
- newStr = Buf_Peel(
- Cmd_Exec(value, &error));
- } else {
- newStr = estrdup("");
- }
-
- if (error)
- Error(error, value);
- vp->ptr += 2;
- } else
-#endif
- {
- newStr = sysVvarsub(vp, startc, v, value);
- }
- break;
- }
-
- switch (vp->ptr[0]) {
- case 'L':
- {
- const char *cp;
- Buffer *buf;
- buf = Buf_Init(MAKE_BSIZE);
- for (cp = value; *cp; cp++)
- Buf_AddByte(buf, (Byte)tolower(*cp));
-
- newStr = Buf_Peel(buf);
-
- vp->ptr++;
- break;
- }
- case 'O':
- newStr = VarSortWords(value, SortIncreasing);
- vp->ptr++;
- break;
- case 'Q':
- newStr = Var_Quote(value);
- vp->ptr++;
- break;
- case 'T':
- newStr = VarModify(value, VarTail, NULL);
- vp->ptr++;
- break;
- case 'U':
- {
- const char *cp;
- Buffer *buf;
- buf = Buf_Init(MAKE_BSIZE);
- for (cp = value; *cp; cp++)
- Buf_AddByte(buf, (Byte)toupper(*cp));
-
- newStr = Buf_Peel(buf);
-
- vp->ptr++;
- break;
- }
- case 'H':
- newStr = VarModify(value, VarHead, NULL);
- vp->ptr++;
- break;
- case 'E':
- newStr = VarModify(value, VarSuffix, NULL);
- vp->ptr++;
- break;
- case 'R':
- newStr = VarModify(value, VarRoot, NULL);
- vp->ptr++;
- break;
- case 'u':
- newStr = VarUniq(value);
- vp->ptr++;
- break;
- default:
- newStr = sysVvarsub(vp, startc, v, value);
- break;
- }
- break;
- }
-
- DEBUGF(VAR, ("Result is \"%s\"\n", newStr));
- if (*freeResult) {
- free(value);
- }
-
- value = newStr;
- *freeResult = (value == var_Error) ? FALSE : TRUE;
-
- if (vp->ptr[0] == ':') {
- vp->ptr++; /* consume colon */
- }
- }
-
- return (value);
-}
-
-static char *
-ParseRestModifier(VarParser *vp, char startc, Buffer *buf, Boolean *freeResult)
-{
- const char *vname;
- size_t vlen;
- Var *v;
- char *value;
-
- vname = Buf_GetAll(buf, &vlen);
-
- v = VarFindAny(vname, vp->ctxt);
- if (v != NULL) {
- value = ParseModifier(vp, startc, v, freeResult);
- return (value);
- }
-
- if ((vp->ctxt == VAR_CMD) || (vp->ctxt == VAR_GLOBAL)) {
- size_t consumed;
- /*
- * Still need to get to the end of the variable
- * specification, so kludge up a Var structure for the
- * modifications
- */
- v = VarCreate(vname, NULL, VAR_JUNK);
- value = ParseModifier(vp, startc, v, freeResult);
- if (*freeResult) {
- free(value);
- }
- VarDestroy(v, TRUE);
-
- consumed = vp->ptr - vp->input + 1;
- /*
- * If substituting a local variable in a non-local context,
- * assume it's for dynamic source stuff. We have to handle
- * this specially and return the longhand for the variable
- * with the dollar sign escaped so it makes it back to the
- * caller. Only four of the local variables are treated
- * specially as they are the only four that will be set when
- * dynamic sources are expanded.
- */
- if (vlen == 1 ||
- (vlen == 2 && (vname[1] == 'F' || vname[1] == 'D'))) {
- if (strchr("!%*@", vname[0]) != NULL) {
- value = emalloc(consumed + 1);
- strncpy(value, vp->input, consumed);
- value[consumed] = '\0';
-
- *freeResult = TRUE;
- return (value);
- }
- }
- if (vlen > 2 &&
- vname[0] == '.' &&
- isupper((unsigned char)vname[1])) {
- if ((strncmp(vname, ".TARGET", vlen - 1) == 0) ||
- (strncmp(vname, ".ARCHIVE", vlen - 1) == 0) ||
- (strncmp(vname, ".PREFIX", vlen - 1) == 0) ||
- (strncmp(vname, ".MEMBER", vlen - 1) == 0)) {
- value = emalloc(consumed + 1);
- strncpy(value, vp->input, consumed);
- value[consumed] = '\0';
-
- *freeResult = TRUE;
- return (value);
- }
- }
-
- *freeResult = FALSE;
- return (vp->err ? var_Error : varNoError);
- } else {
- /*
- * Check for D and F forms of local variables since we're in
- * a local context and the name is the right length.
- */
- if (vlen == 2 &&
- (vname[1] == 'F' || vname[1] == 'D') &&
- (strchr("!%*<>@", vname[0]) != NULL)) {
- char name[2];
-
- name[0] = vname[0];
- name[1] = '\0';
-
- v = VarFindOnly(name, vp->ctxt);
- if (v != NULL) {
- value = ParseModifier(vp, startc, v, freeResult);
- return (value);
- }
- }
-
- /*
- * Still need to get to the end of the variable
- * specification, so kludge up a Var structure for the
- * modifications
- */
- v = VarCreate(vname, NULL, VAR_JUNK);
- value = ParseModifier(vp, startc, v, freeResult);
- if (*freeResult) {
- free(value);
- }
- VarDestroy(v, TRUE);
-
- *freeResult = FALSE;
- return (vp->err ? var_Error : varNoError);
- }
-}
-
-static char *
-ParseRestEnd(VarParser *vp, Buffer *buf, Boolean *freeResult)
-{
- const char *vname;
- size_t vlen;
- Var *v;
- char *value;
-
- vname = Buf_GetAll(buf, &vlen);
-
- v = VarFindAny(vname, vp->ctxt);
- if (v != NULL) {
- value = VarExpand(v, vp);
- *freeResult = TRUE;
- return (value);
- }
-
- if ((vp->ctxt == VAR_CMD) || (vp->ctxt == VAR_GLOBAL)) {
- size_t consumed = vp->ptr - vp->input + 1;
-
- /*
- * If substituting a local variable in a non-local context,
- * assume it's for dynamic source stuff. We have to handle
- * this specially and return the longhand for the variable
- * with the dollar sign escaped so it makes it back to the
- * caller. Only four of the local variables are treated
- * specially as they are the only four that will be set when
- * dynamic sources are expanded.
- */
- if (vlen == 1 ||
- (vlen == 2 && (vname[1] == 'F' || vname[1] == 'D'))) {
- if (strchr("!%*@", vname[0]) != NULL) {
- value = emalloc(consumed + 1);
- strncpy(value, vp->input, consumed);
- value[consumed] = '\0';
-
- *freeResult = TRUE;
- return (value);
- }
- }
- if (vlen > 2 &&
- vname[0] == '.' &&
- isupper((unsigned char)vname[1])) {
- if ((strncmp(vname, ".TARGET", vlen - 1) == 0) ||
- (strncmp(vname, ".ARCHIVE", vlen - 1) == 0) ||
- (strncmp(vname, ".PREFIX", vlen - 1) == 0) ||
- (strncmp(vname, ".MEMBER", vlen - 1) == 0)) {
- value = emalloc(consumed + 1);
- strncpy(value, vp->input, consumed);
- value[consumed] = '\0';
-
- *freeResult = TRUE;
- return (value);
- }
- }
- } else {
- /*
- * Check for D and F forms of local variables since we're in
- * a local context and the name is the right length.
- */
- if (vlen == 2 &&
- (vname[1] == 'F' || vname[1] == 'D') &&
- (strchr("!%*<>@", vname[0]) != NULL)) {
- char name[2];
-
- name[0] = vname[0];
- name[1] = '\0';
-
- v = VarFindOnly(name, vp->ctxt);
- if (v != NULL) {
- char *val;
- /*
- * No need for nested expansion or anything,
- * as we're the only one who sets these
- * things and we sure don't put nested
- * invocations in them...
- */
- val = Buf_Data(v->val);
-
- if (vname[1] == 'D') {
- val = VarModify(val, VarHead, NULL);
- } else {
- val = VarModify(val, VarTail, NULL);
- }
-
- *freeResult = TRUE;
- return (val);
- }
- }
- }
-
- *freeResult = FALSE;
- return (vp->err ? var_Error : varNoError);
-}
-
-/**
- * Parse a multi letter variable name, and return it's value.
- */
-static char *
-VarParseLong(VarParser *vp, Boolean *freeResult)
-{
- Buffer *buf;
- char startc;
- char endc;
- char *value;
-
- buf = Buf_Init(MAKE_BSIZE);
-
- startc = vp->ptr[0];
- vp->ptr++; /* consume opening paren or brace */
-
- endc = (startc == OPEN_PAREN) ? CLOSE_PAREN : CLOSE_BRACE;
-
- /*
- * Process characters until we reach an end character or a colon,
- * replacing embedded variables as we go.
- */
- while (*vp->ptr != '\0') {
- if (*vp->ptr == endc) {
- value = ParseRestEnd(vp, buf, freeResult);
- vp->ptr++; /* consume closing paren or brace */
- Buf_Destroy(buf, TRUE);
- return (value);
-
- } else if (*vp->ptr == ':') {
- value = ParseRestModifier(vp, startc, buf, freeResult);
- vp->ptr++; /* consume closing paren or brace */
- Buf_Destroy(buf, TRUE);
- return (value);
-
- } else if (*vp->ptr == '$') {
- VarParser subvp = {
- vp->ptr,
- vp->ptr,
- vp->ctxt,
- vp->err,
- vp->execute
- };
- char *rval;
- Boolean rfree;
-
- rval = VarParse(&subvp, &rfree);
- if (rval == var_Error) {
- Fatal("Error expanding embedded variable.");
- }
- Buf_Append(buf, rval);
- if (rfree)
- free(rval);
- vp->ptr = subvp.ptr;
- } else {
- Buf_AddByte(buf, (Byte)*vp->ptr);
- vp->ptr++;
- }
- }
-
- /* If we did not find the end character, return var_Error */
- Buf_Destroy(buf, TRUE);
- *freeResult = FALSE;
- return (var_Error);
-}
-
-/**
- * Parse a single letter variable name, and return it's value.
- */
-static char *
-VarParseShort(VarParser *vp, Boolean *freeResult)
-{
- char vname[2];
- Var *v;
- char *value;
-
- vname[0] = vp->ptr[0];
- vname[1] = '\0';
-
- vp->ptr++; /* consume single letter */
-
- v = VarFindAny(vname, vp->ctxt);
- if (v != NULL) {
- value = VarExpand(v, vp);
- *freeResult = TRUE;
- return (value);
- }
-
- /*
- * If substituting a local variable in a non-local context, assume
- * it's for dynamic source stuff. We have to handle this specially
- * and return the longhand for the variable with the dollar sign
- * escaped so it makes it back to the caller. Only four of the local
- * variables are treated specially as they are the only four that
- * will be set when dynamic sources are expanded.
- */
- if ((vp->ctxt == VAR_CMD) || (vp->ctxt == VAR_GLOBAL)) {
-
- /* XXX: It looks like $% and $! are reversed here */
- switch (vname[0]) {
- case '@':
- *freeResult = TRUE;
- return (estrdup("$(.TARGET)"));
- case '%':
- *freeResult = TRUE;
- return (estrdup("$(.ARCHIVE)"));
- case '*':
- *freeResult = TRUE;
- return (estrdup("$(.PREFIX)"));
- case '!':
- *freeResult = TRUE;
- return (estrdup("$(.MEMBER)"));
- default:
- *freeResult = FALSE;
- return (vp->err ? var_Error : varNoError);
- }
- }
-
- /* Variable name was not found. */
- *freeResult = FALSE;
- return (vp->err ? var_Error : varNoError);
-}
-
-static char *
-VarParse(VarParser *vp, Boolean *freeResult)
-{
-
- vp->ptr++; /* consume '$' or last letter of conditional */
-
- if (vp->ptr[0] == '\0') {
- /* Error, there is only a dollar sign in the input string. */
- *freeResult = FALSE;
- return (vp->err ? var_Error : varNoError);
-
- } else if (vp->ptr[0] == OPEN_PAREN || vp->ptr[0] == OPEN_BRACE) {
- /* multi letter variable name */
- return (VarParseLong(vp, freeResult));
-
- } else {
- /* single letter variable name */
- return (VarParseShort(vp, freeResult));
- }
-}
-
-/**
- * Given the start of a variable invocation, extract the variable
- * name and find its value, then modify it according to the
- * specification.
- *
- * Results:
- * The value of the variable or var_Error if the specification
- * is invalid. The number of characters in the specification
- * is placed in the variable pointed to by consumed. (for
- * invalid specifications, this is just 2 to skip the '$' and
- * the following letter, or 1 if '$' was the last character
- * in the string). A Boolean in *freeResult telling whether the
- * returned string should be freed by the caller.
- */
-char *
-Var_Parse(const char input[], GNode *ctxt, Boolean err,
- size_t *consumed, Boolean *freeResult)
-{
- VarParser vp = {
- input,
- input,
- ctxt,
- err,
- TRUE
- };
- char *value;
-
- value = VarParse(&vp, freeResult);
- *consumed += vp.ptr - vp.input;
- return (value);
-}
-
-/*
- * Given the start of a variable invocation, determine the length
- * of the specification.
- *
- * Results:
- * The number of characters in the specification. For invalid
- * specifications, this is just 2 to skip the '$' and the
- * following letter, or 1 if '$' was the last character in the
- * string.
- */
-size_t
-Var_Match(const char input[], GNode *ctxt)
-{
- VarParser vp = {
- input,
- input,
- ctxt,
- FALSE,
- FALSE
- };
- char *value;
- Boolean freeResult;
-
- value = VarParse(&vp, &freeResult);
- if (freeResult) {
- free(value);
- }
- return (vp.ptr - vp.input);
-}
-
-static int
-match_var(const char str[], const char var[])
-{
- const char *start = str;
- size_t len;
-
- str++; /* consume '$' */
-
- if (str[0] == OPEN_PAREN || str[0] == OPEN_BRACE) {
- str++; /* consume opening paren or brace */
-
- while (str[0] != '\0') {
- if (str[0] == '$') {
- /*
- * A variable inside the variable. We cannot
- * expand the external variable yet.
- */
- return (str - start);
- } else if (str[0] == ':' ||
- str[0] == CLOSE_PAREN ||
- str[0] == CLOSE_BRACE) {
- len = str - (start + 2);
-
- if (strncmp(var, start + 2, len) == 0 && var[len] == '\0') {
- return (0); /* match */
- } else {
- /*
- * Not the variable we want to
- * expand.
- */
- return (str - start);
- }
- } else {
- ++str;
- }
- }
- return (str - start);
- } else {
- /* Single letter variable name */
- if (var[1] == '\0' && var[0] == str[0]) {
- return (0); /* match */
- } else {
- str++; /* consume variable name */
- return (str - start);
- }
- }
-}
-
-/**
- * Substitute for all variables in the given string in the given
- * context If err is TRUE, Parse_Error will be called when an
- * undefined variable is encountered.
- *
- * Results:
- * The resulting string.
- *
- * Side Effects:
- * None. The old string must be freed by the caller
- */
-Buffer *
-Var_Subst(const char *str, GNode *ctxt, Boolean err)
-{
- Boolean errorReported;
- Buffer *buf; /* Buffer for forming things */
-
- /*
- * Set TRUE if an error has already been reported to prevent a
- * plethora of messages when recursing. XXXHB this comment sounds
- * wrong.
- */
- errorReported = FALSE;
-
- buf = Buf_Init(0);
- while (str[0] != '\0') {
- if ((str[0] == '$') && (str[1] == '$')) {
- /*
- * A dollar sign may be escaped with another dollar
- * sign. In such a case, we skip over the escape
- * character and store the dollar sign into the
- * buffer directly.
- */
- str++;
- Buf_AddByte(buf, (Byte)str[0]);
- str++;
-
- } else if (str[0] == '$') {
- /* Variable invocation. */
- VarParser subvp = {
- str,
- str,
- ctxt,
- err,
- TRUE
- };
- char *rval;
- Boolean rfree;
-
- rval = VarParse(&subvp, &rfree);
-
- /*
- * When we come down here, val should either point to
- * the value of this variable, suitably modified, or
- * be NULL. Length should be the total length of the
- * potential variable invocation (from $ to end
- * character...)
- */
- if (rval == var_Error || rval == varNoError) {
- /*
- * If performing old-time variable
- * substitution, skip over the variable and
- * continue with the substitution. Otherwise,
- * store the dollar sign and advance str so
- * we continue with the string...
- */
- if (oldVars) {
- str = subvp.ptr;
- } else if (err) {
- /*
- * If variable is undefined, complain
- * and skip the variable. The
- * complaint will stop us from doing
- * anything when the file is parsed.
- */
- if (!errorReported) {
- Parse_Error(PARSE_FATAL,
- "Undefined variable \"%.*s\"", subvp.ptr - subvp.input, str);
- }
- errorReported = TRUE;
- str = subvp.ptr;
- } else {
- Buf_AddByte(buf, (Byte)str[0]);
- str++;
- }
- } else {
- /*
- * Copy all the characters from the variable
- * value straight into the new string.
- */
- Buf_Append(buf, rval);
- if (rfree) {
- free(rval);
- }
- str = subvp.ptr;
- }
- } else {
- Buf_AddByte(buf, (Byte)str[0]);
- str++;
- }
- }
-
- return (buf);
-}
-
-/**
- * Substitute for all variables except if it is the same as 'var',
- * in the given string in the given context. If err is TRUE,
- * Parse_Error will be called when an undefined variable is
- * encountered.
- *
- * Results:
- * The resulting string.
- *
- * Side Effects:
- * None. The old string must be freed by the caller
- */
-Buffer *
-Var_SubstOnly(const char *var, const char *str, Boolean err)
-{
- GNode *ctxt = VAR_GLOBAL;
- Boolean errorReported;
- Buffer *buf; /* Buffer for forming things */
-
- /*
- * Set TRUE if an error has already been reported to prevent a
- * plethora of messages when recursing. XXXHB this comment sounds
- * wrong.
- */
- errorReported = FALSE;
-
- buf = Buf_Init(0);
- while (str[0] != '\0') {
- if (str[0] == '$') {
- int skip;
-
- skip = match_var(str, var);
- if (skip > 0) {
- Buf_AddBytes(buf, skip, str);
- str += skip;
- } else {
- /* Variable invocation. */
- VarParser subvp = {
- str,
- str,
- ctxt,
- err,
- TRUE
- };
- char *rval;
- Boolean rfree;
-
- rval = VarParse(&subvp, &rfree);
-
- /*
- * When we get down here, rval should either
- * point to the value of this variable, or be
- * NULL.
- */
- if (rval == var_Error || rval == varNoError) {
- /*
- * If performing old-time variable
- * substitution, skip over the
- * variable and continue with the
- * substitution. Otherwise, store the
- * dollar sign and advance str so we
- * continue with the string...
- */
- if (oldVars) {
- str = subvp.ptr;
- } else if (err) {
- /*
- * If variable is undefined,
- * complain and skip the
- * variable. The complaint
- * will stop us from doing
- * anything when the file is
- * parsed.
- */
- if (!errorReported) {
- Parse_Error(PARSE_FATAL,
- "Undefined variable \"%.*s\"", subvp.ptr - subvp.input, str);
- }
- errorReported = TRUE;
- str = subvp.ptr;
- } else {
- Buf_AddByte(buf, (Byte)str[0]);
- str++;
- }
- } else {
- /*
- * Copy all the characters from the
- * variable value straight into the
- * new string.
- */
- Buf_Append(buf, rval);
- if (rfree) {
- free(rval);
- }
- str = subvp.ptr;
- }
- }
- } else {
- Buf_AddByte(buf, (Byte)str[0]);
- str++;
- }
- }
-
- return (buf);
-}
-
-/**
- * Initialize the module
- *
- * Side Effects:
- * The VAR_CMD and VAR_GLOBAL contexts are created
- */
-void
-Var_Init(char **env)
-{
- char **ptr;
-
- VAR_CMD = Targ_NewGN("Command");
- VAR_ENV = Targ_NewGN("Environment");
- VAR_GLOBAL = Targ_NewGN("Global");
-
- /*
- * Copy user environment variables into ENV context.
- */
- for (ptr = env; *ptr != NULL; ++ptr) {
- char *tmp = estrdup(*ptr);
- const char *name = tmp;
- char *sep = strchr(name, '=');
- const char *value = sep + 1;
-
- if (sep != NULL) {
- *sep = '\0';
- VarAdd(name, value, VAR_ENV);
- }
- free(tmp);
- }
-}
-
-/**
- * Print all variables in global and command line contexts.
- */
-void
-Var_Dump(void)
-{
- const LstNode *ln;
- const Var *v;
-
- printf("#*** Global Variables:\n");
- LST_FOREACH(ln, &VAR_GLOBAL->context) {
- v = Lst_Datum(ln);
- printf("%-16s = %s\n", v->name, Buf_Data(v->val));
- }
-
- printf("#*** Command-line Variables:\n");
- LST_FOREACH(ln, &VAR_CMD->context) {
- v = Lst_Datum(ln);
- printf("%-16s = %s\n", v->name, Buf_Data(v->val));
- }
-}
-
-/**
- * Print the values of any variables requested by
- * the user.
- */
-void
-Var_Print(Lst *vlist, Boolean expandVars)
-{
- LstNode *n;
- const char *name;
-
- LST_FOREACH(n, vlist) {
- name = Lst_Datum(n);
- if (expandVars) {
- char *value;
- char *v;
-
- v = emalloc(strlen(name) + 1 + 3);
- sprintf(v, "${%s}", name);
-
- value = Buf_Peel(Var_Subst(v, VAR_GLOBAL, FALSE));
- printf("%s\n", value);
-
- free(v);
- free(value);
- } else {
- const char *value = Var_Value(name, VAR_GLOBAL);
- printf("%s\n", value != NULL ? value : "");
- }
- }
-}
-
diff --git a/usr.bin/make/var.h b/usr.bin/make/var.h
deleted file mode 100644
index 618cf7a..0000000
--- a/usr.bin/make/var.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*-
- * Copyright (c) 2002 Juli Mallett.
- * Copyright (c) 1988, 1989, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 1989 by Berkeley Softworks
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam de Boor.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef var_h_9cccafce
-#define var_h_9cccafce
-
-struct Buffer;
-struct GNode;
-struct List;
-
-/* Variables defined in a global context, e.g in the Makefile itself */
-extern struct GNode *VAR_GLOBAL;
-
-/* Variables defined on the command line */
-extern struct GNode *VAR_CMD;
-
-/*
- * Value returned by Var_Parse when an error is encountered. It actually
- * points to an empty string, so naive callers needn't worry about it.
- */
-extern char var_Error[];
-
-/*
- * TRUE if environment should be searched for all variables before
- * the global context
- */
-extern Boolean checkEnvFirst;
-
-/* Do old-style variable substitution */
-extern Boolean oldVars;
-
-void Var_Append(const char *, const char *, struct GNode *);
-void Var_Delete(const char *, struct GNode *);
-void Var_Dump(void);
-Boolean Var_Exists(const char *, struct GNode *);
-void Var_Init(char **);
-size_t Var_Match(const char [], struct GNode *);
-char *Var_Parse(const char *, struct GNode *, Boolean, size_t *, Boolean *);
-void Var_Print(struct Lst *, Boolean);
-void Var_Set(const char *, const char *, struct GNode *);
-void Var_SetGlobal(const char *, const char *);
-void Var_SetEnv(const char *, struct GNode *);
-struct Buffer *Var_Subst(const char *, struct GNode *, Boolean);
-struct Buffer *Var_SubstOnly(const char *, const char *, Boolean);
-const char *Var_Value(const char [], struct GNode *);
-
-#endif /* var_h_9cccafce */
diff --git a/usr.bin/makewhatis/Makefile b/usr.bin/makewhatis/Makefile
deleted file mode 100644
index 4da90ef..0000000
--- a/usr.bin/makewhatis/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-# $FreeBSD$
-
-PROG= makewhatis
-DPADD= ${LIBZ}
-LDADD= -lz
-SCRIPTS= makewhatis.local.sh
-MAN= makewhatis.1 makewhatis.local.8
-SCRIPTSDIR= /usr/libexec
-LINKS= ${SCRIPTSDIR}/makewhatis.local ${SCRIPTSDIR}/catman.local
-MLINKS= makewhatis.local.8 catman.local.8
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/makewhatis/makewhatis.1 b/usr.bin/makewhatis/makewhatis.1
deleted file mode 100644
index 1928c84..0000000
--- a/usr.bin/makewhatis/makewhatis.1
+++ /dev/null
@@ -1,136 +0,0 @@
-.\" Copyright (c) 2002 John Rochester
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd December 3, 2005
-.Dt MAKEWHATIS 1
-.Os
-.Sh NAME
-.Nm makewhatis
-.Nd "create whatis database"
-.Sh SYNOPSIS
-.Nm
-.Op Fl a
-.Op Fl i Ar column
-.Op Fl n Ar name
-.Op Fl o Ar file
-.Op Fl v
-.Op Fl L
-.Op Ar directories ...
-.Sh DESCRIPTION
-The
-.Nm
-utility collects the names and short descriptions from all the unformatted
-man pages in the
-.Ar directories
-and puts them into a file used by the
-.Xr whatis 1
-and
-.Xr apropos 1
-commands.
-Directories may be separated by colons instead of spaces.
-If no
-.Ar directories
-are specified, the contents of the
-.Ev MANPATH
-environment variable will be used, or if that is not set, the default directory
-.Pa /usr/share/man
-will be processed.
-.Pp
-The options are as follows:
-.Bl -tag -width ".Fl i Ar column"
-.It Fl a
-Appends to the output file(s) instead of replacing them.
-The output
-will be sorted with duplicate lines removed, but may have obsolete
-entries.
-.It Fl i Ar column
-Indents the description by
-.Ar column
-characters.
-The default value is 24.
-.It Fl n Ar name
-Uses
-.Ar name
-instead of
-.Pa whatis .
-.It Fl o Ar file
-Outputs all lines to the
-.Ar file
-instead of
-.Pa */man/whatis .
-.It Fl v
-Makes
-.Nm
-more verbose about what it is doing.
-.It Fl L
-Process only localized subdirectories corresponding to the locale specified
-in the standard environment variables.
-.El
-.Sh ENVIRONMENT
-.Bl -tag -width ".Ev MANPATH"
-.It Ev LC_ALL , LC_CTYPE , LANG
-These variables control what subdirectories will be processed if the
-.Fl L
-option is used.
-.It Ev MACHINE
-If set, its value is used to override the current
-machine type when searching machine specific subdirectories.
-.It Ev MACHINE_ARCH
-If set, its value is used to override the current
-architecture when searching architecture specific subdirectories.
-.It Ev MANPATH
-Determines the set of directories to be processed if none are given on
-the command line.
-.El
-.Sh FILES
-.Bl -tag -width ".Pa /usr/share/man" -compact
-.It Pa /usr/share/man
-Default directory to process if the
-.Ev MANPATH
-environment variable is not set.
-.It Pa */man/whatis
-The default output file.
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr apropos 1 ,
-.Xr whatis 1
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Fx 2.1 .
-.Sh AUTHORS
-.An -nosplit
-The
-.Nm
-program was originally written in Perl and was contributed by
-.An Wolfram Schneider .
-The current version of
-.Nm
-was rewritten in C by
-.An John Rochester .
diff --git a/usr.bin/makewhatis/makewhatis.c b/usr.bin/makewhatis/makewhatis.c
deleted file mode 100644
index c9404f6..0000000
--- a/usr.bin/makewhatis/makewhatis.c
+++ /dev/null
@@ -1,1048 +0,0 @@
-/*-
- * Copyright (c) 2002 John Rochester
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer,
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/utsname.h>
-
-#include <ctype.h>
-#include <dirent.h>
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stringlist.h>
-#include <unistd.h>
-#include <zlib.h>
-
-#define DEFAULT_MANPATH "/usr/share/man"
-#define LINE_ALLOC 4096
-
-static char blank[] = "";
-
-/*
- * Information collected about each man page in a section.
- */
-struct page_info {
- char * filename;
- char * name;
- char * suffix;
- int gzipped;
- ino_t inode;
-};
-
-/*
- * An entry kept for each visited directory.
- */
-struct visited_dir {
- dev_t device;
- ino_t inode;
- SLIST_ENTRY(visited_dir) next;
-};
-
-/*
- * an expanding string
- */
-struct sbuf {
- char * content; /* the start of the buffer */
- char * end; /* just past the end of the content */
- char * last; /* the last allocated character */
-};
-
-/*
- * Removes the last amount characters from the sbuf.
- */
-#define sbuf_retract(sbuf, amount) \
- ((sbuf)->end -= (amount))
-/*
- * Returns the length of the sbuf content.
- */
-#define sbuf_length(sbuf) \
- ((sbuf)->end - (sbuf)->content)
-
-typedef char *edited_copy(char *from, char *to, int length);
-
-static int append; /* -a flag: append to existing whatis */
-static int verbose; /* -v flag: be verbose with warnings */
-static int indent = 24; /* -i option: description indentation */
-static const char *whatis_name="whatis";/* -n option: the name */
-static char *common_output; /* -o option: the single output file */
-static char *locale; /* user's locale if -L is used */
-static char *lang_locale; /* short form of locale */
-static const char *machine, *machine_arch;
-
-static int exit_code; /* exit code to use when finished */
-static SLIST_HEAD(, visited_dir) visited_dirs =
- SLIST_HEAD_INITIALIZER(visited_dirs);
-
-/*
- * While the whatis line is being formed, it is stored in whatis_proto.
- * When finished, it is reformatted into whatis_final and then appended
- * to whatis_lines.
- */
-static struct sbuf *whatis_proto;
-static struct sbuf *whatis_final;
-static StringList *whatis_lines; /* collected output lines */
-
-static char tmp_file[MAXPATHLEN]; /* path of temporary file, if any */
-
-/* A set of possible names for the NAME man page section */
-static const char *name_section_titles[] = {
- "NAME", "Name", "NAMN", "BEZEICHNUNG", "\xcc\xbe\xbe\xce",
- "\xee\xe1\xfa\xf7\xe1\xee\xe9\xe5", NULL
-};
-
-/* A subset of the mdoc(7) commands to ignore */
-static char mdoc_commands[] = "ArDvErEvFlLiNmPa";
-
-/*
- * Frees a struct page_info and its content.
- */
-static void
-free_page_info(struct page_info *info)
-{
- free(info->filename);
- free(info->name);
- free(info->suffix);
- free(info);
-}
-
-/*
- * Allocates and fills in a new struct page_info given the
- * name of the man section directory and the dirent of the file.
- * If the file is not a man page, returns NULL.
- */
-static struct page_info *
-new_page_info(char *dir, struct dirent *dirent)
-{
- struct page_info *info;
- int basename_length;
- char *suffix;
- struct stat st;
-
- info = (struct page_info *) malloc(sizeof(struct page_info));
- if (info == NULL)
- err(1, "malloc");
- basename_length = strlen(dirent->d_name);
- suffix = &dirent->d_name[basename_length];
- asprintf(&info->filename, "%s/%s", dir, dirent->d_name);
- if ((info->gzipped = basename_length >= 4 && strcmp(&dirent->d_name[basename_length - 3], ".gz") == 0)) {
- suffix -= 3;
- *suffix = '\0';
- }
- for (;;) {
- if (--suffix == dirent->d_name || !isalnum(*suffix)) {
- if (*suffix == '.')
- break;
- if (verbose)
- warnx("%s: invalid man page name", info->filename);
- free(info->filename);
- free(info);
- return NULL;
- }
- }
- *suffix++ = '\0';
- info->name = strdup(dirent->d_name);
- info->suffix = strdup(suffix);
- if (stat(info->filename, &st) < 0) {
- warn("%s", info->filename);
- free_page_info(info);
- return NULL;
- }
- if (!S_ISREG(st.st_mode)) {
- if (verbose && !S_ISDIR(st.st_mode))
- warnx("%s: not a regular file", info->filename);
- free_page_info(info);
- return NULL;
- }
- info->inode = st.st_ino;
- return info;
-}
-
-/*
- * Reset an sbuf's length to 0.
- */
-static void
-sbuf_clear(struct sbuf *sbuf)
-{
- sbuf->end = sbuf->content;
-}
-
-/*
- * Allocate a new sbuf.
- */
-static struct sbuf *
-new_sbuf(void)
-{
- struct sbuf *sbuf = (struct sbuf *) malloc(sizeof(struct sbuf));
- sbuf->content = (char *) malloc(LINE_ALLOC);
- sbuf->last = sbuf->content + LINE_ALLOC - 1;
- sbuf_clear(sbuf);
- return sbuf;
-}
-
-/*
- * Ensure that there is enough room in the sbuf for nchars more characters.
- */
-static void
-sbuf_need(struct sbuf *sbuf, int nchars)
-{
- char *new_content;
- size_t size, cntsize;
-
- /* double the size of the allocation until the buffer is big enough */
- while (sbuf->end + nchars > sbuf->last) {
- size = sbuf->last + 1 - sbuf->content;
- size *= 2;
- cntsize = sbuf->end - sbuf->content;
-
- new_content = (char *)malloc(size);
- memcpy(new_content, sbuf->content, cntsize);
- free(sbuf->content);
- sbuf->content = new_content;
- sbuf->end = new_content + cntsize;
- sbuf->last = new_content + size - 1;
- }
-}
-
-/*
- * Appends a string of a given length to the sbuf.
- */
-static void
-sbuf_append(struct sbuf *sbuf, const char *text, int length)
-{
- if (length > 0) {
- sbuf_need(sbuf, length);
- memcpy(sbuf->end, text, length);
- sbuf->end += length;
- }
-}
-
-/*
- * Appends a null-terminated string to the sbuf.
- */
-static void
-sbuf_append_str(struct sbuf *sbuf, char *text)
-{
- sbuf_append(sbuf, text, strlen(text));
-}
-
-/*
- * Appends an edited null-terminated string to the sbuf.
- */
-static void
-sbuf_append_edited(struct sbuf *sbuf, char *text, edited_copy copy)
-{
- int length = strlen(text);
- if (length > 0) {
- sbuf_need(sbuf, length);
- sbuf->end = copy(text, sbuf->end, length);
- }
-}
-
-/*
- * Strips any of a set of chars from the end of the sbuf.
- */
-static void
-sbuf_strip(struct sbuf *sbuf, const char *set)
-{
- while (sbuf->end > sbuf->content && strchr(set, sbuf->end[-1]) != NULL)
- sbuf->end--;
-}
-
-/*
- * Returns the null-terminated string built by the sbuf.
- */
-static char *
-sbuf_content(struct sbuf *sbuf)
-{
- *sbuf->end = '\0';
- return sbuf->content;
-}
-
-/*
- * Returns true if no man page exists in the directory with
- * any of the names in the StringList.
- */
-static int
-no_page_exists(char *dir, StringList *names, char *suffix)
-{
- char path[MAXPATHLEN];
- size_t i;
-
- for (i = 0; i < names->sl_cur; i++) {
- snprintf(path, sizeof path, "%s/%s.%s.gz", dir, names->sl_str[i], suffix);
- if (access(path, F_OK) < 0) {
- path[strlen(path) - 3] = '\0';
- if (access(path, F_OK) < 0)
- continue;
- }
- return 0;
- }
- return 1;
-}
-
-static void
-trap_signal(int sig __unused)
-{
- if (tmp_file[0] != '\0')
- unlink(tmp_file);
- exit(1);
-}
-
-/*
- * Attempts to open an output file. Returns NULL if unsuccessful.
- */
-static FILE *
-open_output(char *name)
-{
- FILE *output;
-
- whatis_lines = sl_init();
- if (append) {
- char line[LINE_ALLOC];
-
- output = fopen(name, "r");
- if (output == NULL) {
- warn("%s", name);
- exit_code = 1;
- return NULL;
- }
- while (fgets(line, sizeof line, output) != NULL) {
- line[strlen(line) - 1] = '\0';
- sl_add(whatis_lines, strdup(line));
- }
- }
- if (common_output == NULL) {
- snprintf(tmp_file, sizeof tmp_file, "%s.tmp", name);
- name = tmp_file;
- }
- output = fopen(name, "w");
- if (output == NULL) {
- warn("%s", name);
- exit_code = 1;
- return NULL;
- }
- return output;
-}
-
-static int
-linesort(const void *a, const void *b)
-{
- return strcmp((*(const char * const *)a), (*(const char * const *)b));
-}
-
-/*
- * Writes the unique sorted lines to the output file.
- */
-static void
-finish_output(FILE *output, char *name)
-{
- size_t i;
- char *prev = NULL;
-
- qsort(whatis_lines->sl_str, whatis_lines->sl_cur, sizeof(char *), linesort);
- for (i = 0; i < whatis_lines->sl_cur; i++) {
- char *line = whatis_lines->sl_str[i];
- if (i > 0 && strcmp(line, prev) == 0)
- continue;
- prev = line;
- fputs(line, output);
- putc('\n', output);
- }
- fclose(output);
- sl_free(whatis_lines, 1);
- if (common_output == NULL) {
- rename(tmp_file, name);
- unlink(tmp_file);
- }
-}
-
-static FILE *
-open_whatis(char *mandir)
-{
- char filename[MAXPATHLEN];
-
- snprintf(filename, sizeof filename, "%s/%s", mandir, whatis_name);
- return open_output(filename);
-}
-
-static void
-finish_whatis(FILE *output, char *mandir)
-{
- char filename[MAXPATHLEN];
-
- snprintf(filename, sizeof filename, "%s/%s", mandir, whatis_name);
- finish_output(output, filename);
-}
-
-/*
- * Tests to see if the given directory has already been visited.
- */
-static int
-already_visited(char *dir)
-{
- struct stat st;
- struct visited_dir *visit;
-
- if (stat(dir, &st) < 0) {
- warn("%s", dir);
- exit_code = 1;
- return 1;
- }
- SLIST_FOREACH(visit, &visited_dirs, next) {
- if (visit->inode == st.st_ino &&
- visit->device == st.st_dev) {
- warnx("already visited %s", dir);
- return 1;
- }
- }
- visit = (struct visited_dir *) malloc(sizeof(struct visited_dir));
- visit->device = st.st_dev;
- visit->inode = st.st_ino;
- SLIST_INSERT_HEAD(&visited_dirs, visit, next);
- return 0;
-}
-
-/*
- * Removes trailing spaces from a string, returning a pointer to just
- * beyond the new last character.
- */
-static char *
-trim_rhs(char *str)
-{
- char *rhs = &str[strlen(str)];
- while (--rhs > str && isspace(*rhs))
- ;
- *++rhs = '\0';
- return rhs;
-}
-
-/*
- * Returns a pointer to the next non-space character in the string.
- */
-static char *
-skip_spaces(char *s)
-{
- while (*s != '\0' && isspace(*s))
- s++;
- return s;
-}
-
-/*
- * Returns whether the string contains only digits.
- */
-static int
-only_digits(char *line)
-{
- if (!isdigit(*line++))
- return 0;
- while (isdigit(*line))
- line++;
- return *line == '\0';
-}
-
-/*
- * Returns whether the line is of one of the forms:
- * .Sh NAME
- * .Sh "NAME"
- * etc.
- * assuming that section_start is ".Sh".
- */
-static int
-name_section_line(char *line, const char *section_start)
-{
- char *rhs;
- const char **title;
-
- if (strncmp(line, section_start, 3) != 0)
- return 0;
- line = skip_spaces(line + 3);
- rhs = trim_rhs(line);
- if (*line == '"') {
- line++;
- if (*--rhs == '"')
- *rhs = '\0';
- }
- for (title = name_section_titles; *title != NULL; title++)
- if (strcmp(*title, line) == 0)
- return 1;
- return 0;
-}
-
-/*
- * Copies characters while removing the most common nroff/troff
- * markup:
- * \(em, \(mi, \s[+-N], \&
- * \fF, \f(fo, \f[font]
- * \*s, \*(st, \*[stringvar]
- */
-static char *
-de_nroff_copy(char *from, char *to, int fromlen)
-{
- char *from_end = &from[fromlen];
- while (from < from_end) {
- switch (*from) {
- case '\\':
- switch (*++from) {
- case '(':
- if (strncmp(&from[1], "em", 2) == 0 ||
- strncmp(&from[1], "mi", 2) == 0) {
- from += 3;
- continue;
- }
- break;
- case 's':
- if (*++from == '-')
- from++;
- while (isdigit(*from))
- from++;
- continue;
- case 'f':
- case '*':
- if (*++from == '(')
- from += 3;
- else if (*from == '[') {
- while (*++from != ']' && from < from_end);
- from++;
- } else
- from++;
- continue;
- case '&':
- from++;
- continue;
- }
- break;
- }
- *to++ = *from++;
- }
- return to;
-}
-
-/*
- * Appends a string with the nroff formatting removed.
- */
-static void
-add_nroff(char *text)
-{
- sbuf_append_edited(whatis_proto, text, de_nroff_copy);
-}
-
-/*
- * Appends "name(suffix), " to whatis_final.
- */
-static void
-add_whatis_name(char *name, char *suffix)
-{
- if (*name != '\0') {
- sbuf_append_str(whatis_final, name);
- sbuf_append(whatis_final, "(", 1);
- sbuf_append_str(whatis_final, suffix);
- sbuf_append(whatis_final, "), ", 3);
- }
-}
-
-/*
- * Processes an old-style man(7) line. This ignores commands with only
- * a single number argument.
- */
-static void
-process_man_line(char *line)
-{
- if (*line == '.') {
- while (isalpha(*++line))
- ;
- line = skip_spaces(line);
- if (only_digits(line))
- return;
- } else
- line = skip_spaces(line);
- if (*line != '\0') {
- add_nroff(line);
- sbuf_append(whatis_proto, " ", 1);
- }
-}
-
-/*
- * Processes a new-style mdoc(7) line.
- */
-static void
-process_mdoc_line(char *line)
-{
- int xref;
- int arg = 0;
- char *line_end = &line[strlen(line)];
- int orig_length = sbuf_length(whatis_proto);
- char *next;
-
- if (*line == '\0')
- return;
- if (line[0] != '.' || !isupper(line[1]) || !islower(line[2])) {
- add_nroff(skip_spaces(line));
- sbuf_append(whatis_proto, " ", 1);
- return;
- }
- xref = strncmp(line, ".Xr", 3) == 0;
- line += 3;
- while ((line = skip_spaces(line)) < line_end) {
- if (*line == '"') {
- next = ++line;
- for (;;) {
- next = strchr(next, '"');
- if (next == NULL)
- break;
- memmove(next, next + 1, strlen(next));
- line_end--;
- if (*next != '"')
- break;
- next++;
- }
- } else
- next = strpbrk(line, " \t");
- if (next != NULL)
- *next++ = '\0';
- else
- next = line_end;
- if (isupper(*line) && islower(line[1]) && line[2] == '\0') {
- if (strcmp(line, "Ns") == 0) {
- arg = 0;
- line = next;
- continue;
- }
- if (strstr(mdoc_commands, line) != NULL) {
- line = next;
- continue;
- }
- }
- if (arg > 0 && strchr(",.:;?!)]", *line) == 0) {
- if (xref) {
- sbuf_append(whatis_proto, "(", 1);
- add_nroff(line);
- sbuf_append(whatis_proto, ")", 1);
- xref = 0;
- line = blank;
- } else
- sbuf_append(whatis_proto, " ", 1);
- }
- add_nroff(line);
- arg++;
- line = next;
- }
- if (sbuf_length(whatis_proto) > orig_length)
- sbuf_append(whatis_proto, " ", 1);
-}
-
-/*
- * Collects a list of comma-separated names from the text.
- */
-static void
-collect_names(StringList *names, char *text)
-{
- char *arg;
-
- for (;;) {
- arg = text;
- text = strchr(text, ',');
- if (text != NULL)
- *text++ = '\0';
- sl_add(names, arg);
- if (text == NULL)
- return;
- if (*text == ' ')
- text++;
- }
-}
-
-enum { STATE_UNKNOWN, STATE_MANSTYLE, STATE_MDOCNAME, STATE_MDOCDESC };
-
-/*
- * Processes a man page source into a single whatis line and adds it
- * to whatis_lines.
- */
-static void
-process_page(struct page_info *page, char *section_dir)
-{
- gzFile *in;
- char buffer[4096];
- char *line;
- StringList *names;
- char *descr;
- int state = STATE_UNKNOWN;
- size_t i;
-
- sbuf_clear(whatis_proto);
- if ((in = gzopen(page->filename, "r")) == NULL) {
- warn("%s", page->filename);
- exit_code = 1;
- return;
- }
- while (gzgets(in, buffer, sizeof buffer) != NULL) {
- line = buffer;
- if (strncmp(line, ".\\\"", 3) == 0) /* ignore comments */
- continue;
- switch (state) {
- /*
- * haven't reached the NAME section yet.
- */
- case STATE_UNKNOWN:
- if (name_section_line(line, ".SH"))
- state = STATE_MANSTYLE;
- else if (name_section_line(line, ".Sh"))
- state = STATE_MDOCNAME;
- continue;
- /*
- * Inside an old-style .SH NAME section.
- */
- case STATE_MANSTYLE:
- if (strncmp(line, ".SH", 3) == 0)
- break;
- if (strncmp(line, ".SS", 3) == 0)
- break;
- trim_rhs(line);
- if (strcmp(line, ".") == 0)
- continue;
- if (strncmp(line, ".IX", 3) == 0) {
- line += 3;
- line = skip_spaces(line);
- }
- process_man_line(line);
- continue;
- /*
- * Inside a new-style .Sh NAME section (the .Nm part).
- */
- case STATE_MDOCNAME:
- trim_rhs(line);
- if (strncmp(line, ".Nm", 3) == 0) {
- process_mdoc_line(line);
- continue;
- } else {
- if (strcmp(line, ".") == 0)
- continue;
- sbuf_append(whatis_proto, "- ", 2);
- state = STATE_MDOCDESC;
- }
- /* fall through */
- /*
- * Inside a new-style .Sh NAME section (after the .Nm-s).
- */
- case STATE_MDOCDESC:
- if (strncmp(line, ".Sh", 3) == 0)
- break;
- trim_rhs(line);
- if (strcmp(line, ".") == 0)
- continue;
- process_mdoc_line(line);
- continue;
- }
- break;
- }
- gzclose(in);
- sbuf_strip(whatis_proto, " \t.-");
- line = sbuf_content(whatis_proto);
- /*
- * line now contains the appropriate data, but without
- * the proper indentation or the section appended to each name.
- */
- descr = strstr(line, " - ");
- if (descr == NULL) {
- descr = strchr(line, ' ');
- if (descr == NULL) {
- if (verbose)
- fprintf(stderr, " ignoring junk description \"%s\"\n", line);
- return;
- }
- *descr++ = '\0';
- } else {
- *descr = '\0';
- descr += 3;
- }
- names = sl_init();
- collect_names(names, line);
- sbuf_clear(whatis_final);
- if (!sl_find(names, page->name) && no_page_exists(section_dir, names, page->suffix)) {
- /*
- * Add the page name since that's the only thing that
- * man(1) will find.
- */
- add_whatis_name(page->name, page->suffix);
- }
- for (i = 0; i < names->sl_cur; i++)
- add_whatis_name(names->sl_str[i], page->suffix);
- sl_free(names, 0);
- sbuf_retract(whatis_final, 2); /* remove last ", " */
- while (sbuf_length(whatis_final) < indent)
- sbuf_append(whatis_final, " ", 1);
- sbuf_append(whatis_final, " - ", 3);
- sbuf_append_str(whatis_final, skip_spaces(descr));
- sl_add(whatis_lines, strdup(sbuf_content(whatis_final)));
-}
-
-/*
- * Sorts pages first by inode number, then by name.
- */
-static int
-pagesort(const void *a, const void *b)
-{
- const struct page_info *p1 = *(struct page_info * const *) a;
- const struct page_info *p2 = *(struct page_info * const *) b;
- if (p1->inode == p2->inode)
- return strcmp(p1->name, p2->name);
- return p1->inode - p2->inode;
-}
-
-/*
- * Processes a single man section.
- */
-static void
-process_section(char *section_dir)
-{
- struct dirent **entries;
- int nentries;
- struct page_info **pages;
- int npages = 0;
- int i;
- ino_t prev_inode = 0;
-
- if (verbose)
- fprintf(stderr, " %s\n", section_dir);
-
- /*
- * scan the man section directory for pages
- */
- nentries = scandir(section_dir, &entries, NULL, alphasort);
- if (nentries < 0) {
- warn("%s", section_dir);
- exit_code = 1;
- return;
- }
- /*
- * collect information about man pages
- */
- pages = (struct page_info **) calloc(nentries, sizeof(struct page_info *));
- for (i = 0; i < nentries; i++) {
- struct page_info *info = new_page_info(section_dir, entries[i]);
- if (info != NULL)
- pages[npages++] = info;
- free(entries[i]);
- }
- free(entries);
- qsort(pages, npages, sizeof(struct page_info *), pagesort);
- /*
- * process each unique page
- */
- for (i = 0; i < npages; i++) {
- struct page_info *page = pages[i];
- if (page->inode != prev_inode) {
- prev_inode = page->inode;
- if (verbose)
- fprintf(stderr, " reading %s\n", page->filename);
- process_page(page, section_dir);
- } else if (verbose)
- fprintf(stderr, " skipping %s, duplicate\n", page->filename);
- free_page_info(page);
- }
- free(pages);
-}
-
-/*
- * Returns whether the directory entry is a man page section.
- */
-static int
-select_sections(struct dirent *entry)
-{
- char *p = &entry->d_name[3];
-
- if (strncmp(entry->d_name, "man", 3) != 0)
- return 0;
- while (*p != '\0') {
- if (!isalnum(*p++))
- return 0;
- }
- return 1;
-}
-
-/*
- * Processes a single top-level man directory by finding all the
- * sub-directories named man* and processing each one in turn.
- */
-static void
-process_mandir(char *dir_name)
-{
- struct dirent **entries;
- int nsections;
- FILE *fp = NULL;
- int i;
- struct stat st;
-
- if (already_visited(dir_name))
- return;
- if (verbose)
- fprintf(stderr, "man directory %s\n", dir_name);
- nsections = scandir(dir_name, &entries, select_sections, alphasort);
- if (nsections < 0) {
- warn("%s", dir_name);
- exit_code = 1;
- return;
- }
- if (common_output == NULL && (fp = open_whatis(dir_name)) == NULL)
- return;
- for (i = 0; i < nsections; i++) {
- char section_dir[MAXPATHLEN];
- snprintf(section_dir, sizeof section_dir, "%s/%s", dir_name, entries[i]->d_name);
- process_section(section_dir);
- snprintf(section_dir, sizeof section_dir, "%s/%s/%s", dir_name,
- entries[i]->d_name, machine);
- if (stat(section_dir, &st) == 0 && S_ISDIR(st.st_mode))
- process_section(section_dir);
- if (strcmp(machine_arch, machine) != 0) {
- snprintf(section_dir, sizeof section_dir, "%s/%s/%s",
- dir_name, entries[i]->d_name, machine_arch);
- if (stat(section_dir, &st) == 0 && S_ISDIR(st.st_mode))
- process_section(section_dir);
- }
- free(entries[i]);
- }
- free(entries);
- if (common_output == NULL)
- finish_whatis(fp, dir_name);
-}
-
-/*
- * Processes one argument, which may be a colon-separated list of
- * directories.
- */
-static void
-process_argument(const char *arg)
-{
- char *dir;
- char *mandir;
- char *parg;
-
- parg = strdup(arg);
- if (parg == NULL)
- err(1, "out of memory");
- while ((dir = strsep(&parg, ":")) != NULL) {
- if (locale != NULL) {
- asprintf(&mandir, "%s/%s", dir, locale);
- process_mandir(mandir);
- free(mandir);
- if (lang_locale != NULL) {
- asprintf(&mandir, "%s/%s", dir, lang_locale);
- process_mandir(mandir);
- free(mandir);
- }
- } else {
- process_mandir(dir);
- }
- }
- free(parg);
-}
-
-
-int
-main(int argc, char **argv)
-{
- int opt;
- FILE *fp = NULL;
-
- while ((opt = getopt(argc, argv, "ai:n:o:vL")) != -1) {
- switch (opt) {
- case 'a':
- append++;
- break;
- case 'i':
- indent = atoi(optarg);
- break;
- case 'n':
- whatis_name = optarg;
- break;
- case 'o':
- common_output = optarg;
- break;
- case 'v':
- verbose++;
- break;
- case 'L':
- locale = getenv("LC_ALL");
- if (locale == NULL)
- locale = getenv("LC_CTYPE");
- if (locale == NULL)
- locale = getenv("LANG");
- if (locale != NULL) {
- char *sep = strchr(locale, '_');
- if (sep != NULL && isupper(sep[1]) &&
- isupper(sep[2])) {
- asprintf(&lang_locale, "%.*s%s", sep - locale, locale, &sep[3]);
- }
- }
- break;
- default:
- fprintf(stderr, "usage: %s [-a] [-i indent] [-n name] [-o output_file] [-v] [-L] [directories...]\n", argv[0]);
- exit(1);
- }
- }
-
- signal(SIGINT, trap_signal);
- signal(SIGHUP, trap_signal);
- signal(SIGQUIT, trap_signal);
- signal(SIGTERM, trap_signal);
- SLIST_INIT(&visited_dirs);
- whatis_proto = new_sbuf();
- whatis_final = new_sbuf();
-
- if ((machine = getenv("MACHINE")) == NULL) {
- static struct utsname utsname;
-
- if (uname(&utsname) == -1)
- err(1, "uname");
- machine = utsname.machine;
- }
-
- if ((machine_arch = getenv("MACHINE_ARCH")) == NULL)
- machine_arch = MACHINE_ARCH;
-
- if (common_output != NULL && (fp = open_output(common_output)) == NULL)
- err(1, "%s", common_output);
- if (optind == argc) {
- const char *manpath = getenv("MANPATH");
- if (manpath == NULL)
- manpath = DEFAULT_MANPATH;
- process_argument(manpath);
- } else {
- while (optind < argc)
- process_argument(argv[optind++]);
- }
- if (common_output != NULL)
- finish_output(fp, common_output);
- exit(exit_code);
-}
diff --git a/usr.bin/makewhatis/makewhatis.local.8 b/usr.bin/makewhatis/makewhatis.local.8
deleted file mode 100644
index dfe252f..0000000
--- a/usr.bin/makewhatis/makewhatis.local.8
+++ /dev/null
@@ -1,83 +0,0 @@
-.\" Copyright (c) April 1996 Wolfram Schneider <wosch@FreeBSD.org>. Berlin.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.Dd April 26, 1996
-.Dt MAKEWHATIS.LOCAL 8
-.Os
-.Sh NAME
-.Nm makewhatis.local , catman.local
-.Nd start makewhatis or catman for local file systems
-.Sh SYNOPSIS
-.Nm /usr/libexec/makewhatis.local
-.Op options
-.Ar directories ...
-.Nm /usr/libexec/catman.local
-.Op options
-.Ar directories ...
-.Sh DESCRIPTION
-The
-.Nm
-utility starts
-.Xr makewhatis 1
-only for file systems physically mounted on the system
-where the
-.Nm
-is being executed.
-Running makewhatis
-by
-.Pa periodic weekly
-for rw nfs-mounted /usr may kill
-your NFS server -- all NFS clients start makewhatis at the same time!
-So use this wrapper for
-.Xr cron 8
-instead of calling makewhatis directly.
-The
-.Nm catman.local
-utility is using for same purposes as
-.Nm
-but for
-.Xr catman 1 .
-.Sh FILES
-.Bl -tag -width /etc/periodic/weekly/320.whatis.XXX -compact
-.It Pa /etc/periodic/weekly/320.whatis
-run
-.Nm
-every week
-.It Pa /etc/periodic/weekly/330.catman
-run
-.Nm catman.local
-every week
-.El
-.Sh SEE ALSO
-.Xr catman 1 ,
-.Xr find 1 ,
-.Xr makewhatis 1 ,
-.Xr cron 8 ,
-.Xr periodic 8
-.Sh HISTORY
-The
-.Nm
-utility appeared in
-.Fx 2.2 .
diff --git a/usr.bin/makewhatis/makewhatis.local.sh b/usr.bin/makewhatis/makewhatis.local.sh
deleted file mode 100644
index 8be2530..0000000
--- a/usr.bin/makewhatis/makewhatis.local.sh
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) April 1996 Wolfram Schneider <wosch@FreeBSD.org>. Berlin.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# makewhatis.local - start makewhatis(1) only for file systems
-# physically mounted on the system
-#
-# Running makewhatis from /etc/periodic/weekly/320.whatis for rw nfs-mounted
-# /usr may kill your NFS server -- all clients start makewhatis at the same
-# time! So use this wrapper instead calling makewhatis directly.
-#
-# PS: this wrapper works also for catman(1)
-#
-# $FreeBSD$
-
-PATH=/bin:/usr/bin:$PATH; export PATH
-opt= dirs= localdirs=
-
-for arg
-do
- case "$arg" in
- -*) opt="$opt $arg";;
- *) dirs="$dirs $arg";;
- esac
-done
-
-dirs=`echo $dirs | sed 's/:/ /g'`
-case X"$dirs" in X) echo "usage: $0 [options] directories ..."; exit 1;; esac
-
-localdirs=`find -H $dirs -fstype local -type d -prune -print`
-
-case X"$localdirs" in
- X) echo "$0: no local-mounted manual directories found: $dirs"
- exit 1;;
- *) exec `basename $0 .local` $opt $localdirs;;
-esac
diff --git a/usr.bin/mesg/Makefile b/usr.bin/mesg/Makefile
deleted file mode 100644
index 47f5a85..0000000
--- a/usr.bin/mesg/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= mesg
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/mesg/mesg.1 b/usr.bin/mesg/mesg.1
deleted file mode 100644
index b596f75..0000000
--- a/usr.bin/mesg/mesg.1
+++ /dev/null
@@ -1,112 +0,0 @@
-.\" Copyright (c) 1987, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)mesg.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd May 5, 2002
-.Dt MESG 1
-.Os
-.Sh NAME
-.Nm mesg
-.Nd display (do not display) messages from other users
-.Sh SYNOPSIS
-.Nm
-.Op Cm n | Cm y
-.Sh DESCRIPTION
-The
-.Nm
-utility is invoked by a user to control write access others
-have to a terminal device.
-Write access is allowed by default, and programs such as
-.Xr talk 1
-and
-.Xr write 1
-may display messages on the terminal.
-.Pp
-The first terminal device in the sequence of devices associated with standard
-input, standard output and standard error is affected.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Cm n
-Disallow messages.
-.It Cm y
-Permit messages to be displayed.
-.El
-.Pp
-If no arguments are given,
-.Nm
-displays the present message status to the standard output.
-.Sh EXIT STATUS
-The
-.Nm
-utility exits with one of the following values:
-.Bl -tag -width flag -compact -offset indent
-.Pp
-.It Li "\ 0"
-Messages are allowed.
-.It Li "\ 1"
-Messages are not allowed.
-.It Li ">1"
-An error has occurred.
-.El
-.Sh EXAMPLES
-Disallow messages from other users to the current terminal:
-.Pp
-.Dl "mesg n"
-.Pp
-Allow messages from other users to
-.Pa ttyp1
-(assuming you are also logged in on that terminal):
-.Pp
-.Dl "mesg y </dev/ttyp1"
-.Sh COMPATIBILITY
-Previous versions of the
-.Nm
-utility wrote the message status to the standard error output and
-affected the terminal attached to standard error without first trying the
-standard input or output devices.
-.Sh SEE ALSO
-.Xr biff 1 ,
-.Xr talk 1 ,
-.Xr wall 1 ,
-.Xr write 1
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v1 .
diff --git a/usr.bin/mesg/mesg.c b/usr.bin/mesg/mesg.c
deleted file mode 100644
index 270c1c5..0000000
--- a/usr.bin/mesg/mesg.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (c) 1987, 1993
- * The Regents of the University of California. All rights reserved.
- * (c) UNIX System Laboratories, Inc.
- * All or some portions of this file are derived from material licensed
- * to the University of California by American Telephone and Telegraph
- * Co. or Unix System Laboratories, Inc. and are reproduced herein with
- * the permission of UNIX System Laboratories, Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1987, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)mesg.c 8.2 (Berkeley) 1/21/94";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- struct stat sb;
- char *tty;
- int ch;
-
- while ((ch = getopt(argc, argv, "")) != -1)
- switch (ch) {
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if ((tty = ttyname(STDIN_FILENO)) == NULL &&
- (tty = ttyname(STDOUT_FILENO)) == NULL &&
- (tty = ttyname(STDERR_FILENO)) == NULL)
- err(2, "ttyname");
- if (stat(tty, &sb) < 0)
- err(2, "%s", tty);
-
- if (*argv == NULL) {
- if (sb.st_mode & S_IWGRP) {
- (void)puts("is y");
- exit(0);
- }
- (void)puts("is n");
- exit(1);
- }
-
- switch (*argv[0]) {
- case 'y':
- if (chmod(tty, sb.st_mode | S_IWGRP) < 0)
- err(2, "%s", tty);
- exit(0);
- case 'n':
- if (chmod(tty, sb.st_mode & ~S_IWGRP) < 0)
- err(2, "%s", tty);
- exit(1);
- }
-
- usage();
- return(0);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "usage: mesg [n | y]\n");
- exit(2);
-}
diff --git a/usr.bin/minigzip/Makefile b/usr.bin/minigzip/Makefile
deleted file mode 100644
index 226ba76..0000000
--- a/usr.bin/minigzip/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# $FreeBSD$
-
-PROG= minigzip
-LDADD= -lz
-DPADD= ${LIBZ}
-.PATH: ${.CURDIR}/../../lib/libz
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/minigzip/minigzip.1 b/usr.bin/minigzip/minigzip.1
deleted file mode 100644
index ddd2b95..0000000
--- a/usr.bin/minigzip/minigzip.1
+++ /dev/null
@@ -1,83 +0,0 @@
-.\" Copyright (c) 1997
-.\" Michael Smith
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd October 3, 2002
-.Dt MINIGZIP 1
-.Os
-.Sh NAME
-.Nm minigzip
-.Nd minimal implementation of the 'gzip' compression tool
-.Sh SYNOPSIS
-.Nm
-.Op Fl cd
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility is a minimal implementation of the
-.Xr gzip 1
-utility.
-It supports
-compression and decompression of individual files, as well as
-streaming compression and decompression via standard input and
-output.
-.Pp
-The default operation is compression, decompression can be
-selected by supplying the
-.Fl d
-flag on the commandline.
-.Pp
-If any
-.Ar file
-arguments are supplied, the operation is performed on each file
-separately.
-Compression replaces the original file with one having a
-.Pa .gz
-suffix.
-Decompression will remove a
-.Pa .gz
-suffix if one is present.
-.Pp
-If no
-.Ar file
-arguments are supplied,
-.Nm
-reads from standard input and writes the results of the operation
-to standard output.
-.Pp
-If the
-.Fl c
-option is specified,
-.Nm
-writes the results to standard output and keep the original files
-unchanged.
-.Sh SEE ALSO
-.Xr gzip 1
-.Sh AUTHORS
-The
-.Nm
-utility was written by
-.An Jean-loup Gailly .
diff --git a/usr.bin/ministat/Makefile b/usr.bin/ministat/Makefile
deleted file mode 100644
index e4c2f07..0000000
--- a/usr.bin/ministat/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-# $FreeBSD$
-PROG= ministat
-DPADD= ${LIBM}
-LDADD= -lm
-
-.include <bsd.prog.mk>
-
-test: ${PROG}
- ./${PROG} < ${.CURDIR}/chameleon
- ./${PROG} ${.CURDIR}/chameleon
- ./${PROG} ${.CURDIR}/iguana ${.CURDIR}/chameleon
- ./${PROG} -c 80 ${.CURDIR}/iguana ${.CURDIR}/chameleon
- ./${PROG} -s -c 80 ${.CURDIR}/chameleon ${.CURDIR}/iguana
- ./${PROG} -s -c 80 ${.CURDIR}/chameleon ${.CURDIR}/iguana ${.CURDIR}/iguana
diff --git a/usr.bin/ministat/README b/usr.bin/ministat/README
deleted file mode 100644
index cc5fe27..0000000
--- a/usr.bin/ministat/README
+++ /dev/null
@@ -1,50 +0,0 @@
-$FreeBSD$
-
-A small tool to do the statistics legwork on benchmarks etc.
-
-Prepare your data into two files, one number per line
-run
- ./ministat data_before data_after
-
-and see what it says.
-
-You need at least three data points in each data set, but the more
-you have the better your result generally gets.
-
-Here are two typical outputs:
-
-x _1
-+ _2
-+--------------------------------------------------------------------------+
-|x + x+ x x x + ++ |
-| |_________|______AM_______________|__A___________M_______________||
-+--------------------------------------------------------------------------+
- N Min Max Median Avg Stddev
-x 5 36060 36138 36107 36105.6 31.165686
-+ 5 36084 36187 36163 36142.6 49.952978
-No difference proven at 95.0% confidence
-
-Here nothing can be concluded from the numbers. It _may_ be possible to
-prove something if many more measurements are made, but with only five
-measurements, nothing is proven.
-
-
-x _1
-+ _2
-+--------------------------------------------------------------------------+
-| + |
-| x + +|
-|x x x x + +|
-| |_______________A_____M_________| |_M___A____| |
-+--------------------------------------------------------------------------+
- N Min Max Median Avg Stddev
-x 5 0.133 0.137 0.136 0.1354 0.0015165751
-+ 5 0.139 0.14 0.139 0.1394 0.00054772256
-Difference at 95.0% confidence
- 0.004 +/- 0.00166288
- 2.95421% +/- 1.22812%
- (Student's t, pooled s = 0.00114018)
-
-Here we have a clearcut difference, not very big, but clear and unambiguous.
-
-
diff --git a/usr.bin/ministat/chameleon b/usr.bin/ministat/chameleon
deleted file mode 100644
index c554c99..0000000
--- a/usr.bin/ministat/chameleon
+++ /dev/null
@@ -1,6 +0,0 @@
-# $FreeBSD$
-150
-400
-720
-500
-930
diff --git a/usr.bin/ministat/iguana b/usr.bin/ministat/iguana
deleted file mode 100644
index d6996c1..0000000
--- a/usr.bin/ministat/iguana
+++ /dev/null
@@ -1,8 +0,0 @@
-# $FreeBSD$
-50
-200
-150
-400
-750
-400
-150
diff --git a/usr.bin/ministat/ministat.1 b/usr.bin/ministat/ministat.1
deleted file mode 100644
index 2d4ed22..0000000
--- a/usr.bin/ministat/ministat.1
+++ /dev/null
@@ -1,130 +0,0 @@
-.\"
-.\" Copyright (c) 2007 Poul-Henning Kamp
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd December 20, 2007
-.Dt MINISTAT 1
-.Os
-.Sh NAME
-.Nm ministat
-.Nd statistics utility
-.Sh SYNOPSIS
-.Nm
-.Op Fl ns
-.Op Fl C Ar column
-.Op Fl c Ar confidence_level
-.Op Fl d Ar delimiter
-.Op Fl w Op width
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-command calculates fundamental statistical properties of numeric data
-in the specified files or, if no file is specified, standard input.
-.Pp
-The options are as follows:
-.Bl -tag -width Fl
-.It Fl n
-Just report the raw statistics of the input, suppress the ASCII-art plot
-and the relative comparisons.
-.It Fl s
-Print the average/median/stddev bars on separate lines in the ASCII-art
-plot, to avoid overlap.
-.It Fl C Ar column
-Specify which column of data to use.
-By default the first column in the input file(s) are used.
-.It Fl c Ar confidence_level
-Specify desired confidence level for Student's T analysis.
-Possible values are 80, 90, 95, 98, 99 and 99.5 %
-.It Fl d Ar delimiter
-Specifies the column delimiter characters, default is SPACE and TAB.
-See
-.Xr strtok 3
-for details.
-.It Fl w Ar width
-Width of ASCII-art plot in characters, default is 74.
-.El
-.Pp
-A sample output could look like this:
-.Bd -literal -offset indent
- $ ministat -s -w 60 iguana chameleon
- x iguana
- + chameleon
- +------------------------------------------------------------+
- |x * x * + + x +|
- | |________M______A_______________| |
- | |________________M__A___________________| |
- +------------------------------------------------------------+
- N Min Max Median Avg Stddev
- x 7 50 750 200 300 238.04761
- + 5 150 930 500 540 299.08193
- No difference proven at 95.0% confidence
-.Ed
-.Pp
-If
-.Nm
-tells you, as in the example above, that there is no difference
-proven at 95% confidence, the two data sets you gave it are for
-all statistical purposes identical.
-.Pp
-You have the option of lowering your standards by specifying a
-lower confidence level:
-.Bd -literal -offset indent
- $ ministat -c 80 iguana chameleon
- x iguana
- + chameleon
- +------------------------------------------------------------+
- |x * x * + + x +|
- | |________M______A_______________| |
- | |________________M__A___________________| |
- +------------------------------------------------------------+
- N Min Max Median Avg Stddev
- x 7 50 750 200 300 238.04761
- + 5 150 930 500 540 299.08193
- Difference at 80.0% confidence
- 240 +/- 212.215
- 80% +/- 70.7384%
- (Student's t, pooled s = 264.159)
-.Ed
-.Pp
-But a lower standard does not make your data any better, and the
-example is only included here to show the format of the output when
-a statistical difference is proven according to Student's T method.
-.Sh SEE ALSO
-Any mathematics text on basic statistics, for instances Larry Gonicks
-excellent "Cartoon Guide to Statistics" which supplied the above example.
-.Sh HISTORY
-The
-.Nm
-command was written by Poul-Henning Kamp out of frustration
-over all the bogus benchmark claims made by people with no
-understanding of the importance of uncertainty and statistics.
-.Pp
-From
-.Fx 5.2
-it has lived in the source tree as a developer tool, graduating
-to the installed system from
-.Fx 8.0 .
diff --git a/usr.bin/ministat/ministat.c b/usr.bin/ministat/ministat.c
deleted file mode 100644
index 5873ca7..0000000
--- a/usr.bin/ministat/ministat.c
+++ /dev/null
@@ -1,631 +0,0 @@
-/*
- * ----------------------------------------------------------------------------
- * "THE BEER-WARE LICENSE" (Revision 42):
- * <phk@FreeBSD.ORG> wrote this file. As long as you retain this notice you
- * can do whatever you want with this stuff. If we meet some day, and you think
- * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
- * ----------------------------------------------------------------------------
- *
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdio.h>
-#include <math.h>
-#include <err.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-#include <sys/queue.h>
-#include <sys/ttycom.h>
-
-#define NSTUDENT 100
-#define NCONF 6
-double const studentpct[] = { 80, 90, 95, 98, 99, 99.5 };
-double student [NSTUDENT + 1][NCONF] = {
-/* inf */ { 1.282, 1.645, 1.960, 2.326, 2.576, 3.090 },
-/* 1. */ { 3.078, 6.314, 12.706, 31.821, 63.657, 318.313 },
-/* 2. */ { 1.886, 2.920, 4.303, 6.965, 9.925, 22.327 },
-/* 3. */ { 1.638, 2.353, 3.182, 4.541, 5.841, 10.215 },
-/* 4. */ { 1.533, 2.132, 2.776, 3.747, 4.604, 7.173 },
-/* 5. */ { 1.476, 2.015, 2.571, 3.365, 4.032, 5.893 },
-/* 6. */ { 1.440, 1.943, 2.447, 3.143, 3.707, 5.208 },
-/* 7. */ { 1.415, 1.895, 2.365, 2.998, 3.499, 4.782 },
-/* 8. */ { 1.397, 1.860, 2.306, 2.896, 3.355, 4.499 },
-/* 9. */ { 1.383, 1.833, 2.262, 2.821, 3.250, 4.296 },
-/* 10. */ { 1.372, 1.812, 2.228, 2.764, 3.169, 4.143 },
-/* 11. */ { 1.363, 1.796, 2.201, 2.718, 3.106, 4.024 },
-/* 12. */ { 1.356, 1.782, 2.179, 2.681, 3.055, 3.929 },
-/* 13. */ { 1.350, 1.771, 2.160, 2.650, 3.012, 3.852 },
-/* 14. */ { 1.345, 1.761, 2.145, 2.624, 2.977, 3.787 },
-/* 15. */ { 1.341, 1.753, 2.131, 2.602, 2.947, 3.733 },
-/* 16. */ { 1.337, 1.746, 2.120, 2.583, 2.921, 3.686 },
-/* 17. */ { 1.333, 1.740, 2.110, 2.567, 2.898, 3.646 },
-/* 18. */ { 1.330, 1.734, 2.101, 2.552, 2.878, 3.610 },
-/* 19. */ { 1.328, 1.729, 2.093, 2.539, 2.861, 3.579 },
-/* 20. */ { 1.325, 1.725, 2.086, 2.528, 2.845, 3.552 },
-/* 21. */ { 1.323, 1.721, 2.080, 2.518, 2.831, 3.527 },
-/* 22. */ { 1.321, 1.717, 2.074, 2.508, 2.819, 3.505 },
-/* 23. */ { 1.319, 1.714, 2.069, 2.500, 2.807, 3.485 },
-/* 24. */ { 1.318, 1.711, 2.064, 2.492, 2.797, 3.467 },
-/* 25. */ { 1.316, 1.708, 2.060, 2.485, 2.787, 3.450 },
-/* 26. */ { 1.315, 1.706, 2.056, 2.479, 2.779, 3.435 },
-/* 27. */ { 1.314, 1.703, 2.052, 2.473, 2.771, 3.421 },
-/* 28. */ { 1.313, 1.701, 2.048, 2.467, 2.763, 3.408 },
-/* 29. */ { 1.311, 1.699, 2.045, 2.462, 2.756, 3.396 },
-/* 30. */ { 1.310, 1.697, 2.042, 2.457, 2.750, 3.385 },
-/* 31. */ { 1.309, 1.696, 2.040, 2.453, 2.744, 3.375 },
-/* 32. */ { 1.309, 1.694, 2.037, 2.449, 2.738, 3.365 },
-/* 33. */ { 1.308, 1.692, 2.035, 2.445, 2.733, 3.356 },
-/* 34. */ { 1.307, 1.691, 2.032, 2.441, 2.728, 3.348 },
-/* 35. */ { 1.306, 1.690, 2.030, 2.438, 2.724, 3.340 },
-/* 36. */ { 1.306, 1.688, 2.028, 2.434, 2.719, 3.333 },
-/* 37. */ { 1.305, 1.687, 2.026, 2.431, 2.715, 3.326 },
-/* 38. */ { 1.304, 1.686, 2.024, 2.429, 2.712, 3.319 },
-/* 39. */ { 1.304, 1.685, 2.023, 2.426, 2.708, 3.313 },
-/* 40. */ { 1.303, 1.684, 2.021, 2.423, 2.704, 3.307 },
-/* 41. */ { 1.303, 1.683, 2.020, 2.421, 2.701, 3.301 },
-/* 42. */ { 1.302, 1.682, 2.018, 2.418, 2.698, 3.296 },
-/* 43. */ { 1.302, 1.681, 2.017, 2.416, 2.695, 3.291 },
-/* 44. */ { 1.301, 1.680, 2.015, 2.414, 2.692, 3.286 },
-/* 45. */ { 1.301, 1.679, 2.014, 2.412, 2.690, 3.281 },
-/* 46. */ { 1.300, 1.679, 2.013, 2.410, 2.687, 3.277 },
-/* 47. */ { 1.300, 1.678, 2.012, 2.408, 2.685, 3.273 },
-/* 48. */ { 1.299, 1.677, 2.011, 2.407, 2.682, 3.269 },
-/* 49. */ { 1.299, 1.677, 2.010, 2.405, 2.680, 3.265 },
-/* 50. */ { 1.299, 1.676, 2.009, 2.403, 2.678, 3.261 },
-/* 51. */ { 1.298, 1.675, 2.008, 2.402, 2.676, 3.258 },
-/* 52. */ { 1.298, 1.675, 2.007, 2.400, 2.674, 3.255 },
-/* 53. */ { 1.298, 1.674, 2.006, 2.399, 2.672, 3.251 },
-/* 54. */ { 1.297, 1.674, 2.005, 2.397, 2.670, 3.248 },
-/* 55. */ { 1.297, 1.673, 2.004, 2.396, 2.668, 3.245 },
-/* 56. */ { 1.297, 1.673, 2.003, 2.395, 2.667, 3.242 },
-/* 57. */ { 1.297, 1.672, 2.002, 2.394, 2.665, 3.239 },
-/* 58. */ { 1.296, 1.672, 2.002, 2.392, 2.663, 3.237 },
-/* 59. */ { 1.296, 1.671, 2.001, 2.391, 2.662, 3.234 },
-/* 60. */ { 1.296, 1.671, 2.000, 2.390, 2.660, 3.232 },
-/* 61. */ { 1.296, 1.670, 2.000, 2.389, 2.659, 3.229 },
-/* 62. */ { 1.295, 1.670, 1.999, 2.388, 2.657, 3.227 },
-/* 63. */ { 1.295, 1.669, 1.998, 2.387, 2.656, 3.225 },
-/* 64. */ { 1.295, 1.669, 1.998, 2.386, 2.655, 3.223 },
-/* 65. */ { 1.295, 1.669, 1.997, 2.385, 2.654, 3.220 },
-/* 66. */ { 1.295, 1.668, 1.997, 2.384, 2.652, 3.218 },
-/* 67. */ { 1.294, 1.668, 1.996, 2.383, 2.651, 3.216 },
-/* 68. */ { 1.294, 1.668, 1.995, 2.382, 2.650, 3.214 },
-/* 69. */ { 1.294, 1.667, 1.995, 2.382, 2.649, 3.213 },
-/* 70. */ { 1.294, 1.667, 1.994, 2.381, 2.648, 3.211 },
-/* 71. */ { 1.294, 1.667, 1.994, 2.380, 2.647, 3.209 },
-/* 72. */ { 1.293, 1.666, 1.993, 2.379, 2.646, 3.207 },
-/* 73. */ { 1.293, 1.666, 1.993, 2.379, 2.645, 3.206 },
-/* 74. */ { 1.293, 1.666, 1.993, 2.378, 2.644, 3.204 },
-/* 75. */ { 1.293, 1.665, 1.992, 2.377, 2.643, 3.202 },
-/* 76. */ { 1.293, 1.665, 1.992, 2.376, 2.642, 3.201 },
-/* 77. */ { 1.293, 1.665, 1.991, 2.376, 2.641, 3.199 },
-/* 78. */ { 1.292, 1.665, 1.991, 2.375, 2.640, 3.198 },
-/* 79. */ { 1.292, 1.664, 1.990, 2.374, 2.640, 3.197 },
-/* 80. */ { 1.292, 1.664, 1.990, 2.374, 2.639, 3.195 },
-/* 81. */ { 1.292, 1.664, 1.990, 2.373, 2.638, 3.194 },
-/* 82. */ { 1.292, 1.664, 1.989, 2.373, 2.637, 3.193 },
-/* 83. */ { 1.292, 1.663, 1.989, 2.372, 2.636, 3.191 },
-/* 84. */ { 1.292, 1.663, 1.989, 2.372, 2.636, 3.190 },
-/* 85. */ { 1.292, 1.663, 1.988, 2.371, 2.635, 3.189 },
-/* 86. */ { 1.291, 1.663, 1.988, 2.370, 2.634, 3.188 },
-/* 87. */ { 1.291, 1.663, 1.988, 2.370, 2.634, 3.187 },
-/* 88. */ { 1.291, 1.662, 1.987, 2.369, 2.633, 3.185 },
-/* 89. */ { 1.291, 1.662, 1.987, 2.369, 2.632, 3.184 },
-/* 90. */ { 1.291, 1.662, 1.987, 2.368, 2.632, 3.183 },
-/* 91. */ { 1.291, 1.662, 1.986, 2.368, 2.631, 3.182 },
-/* 92. */ { 1.291, 1.662, 1.986, 2.368, 2.630, 3.181 },
-/* 93. */ { 1.291, 1.661, 1.986, 2.367, 2.630, 3.180 },
-/* 94. */ { 1.291, 1.661, 1.986, 2.367, 2.629, 3.179 },
-/* 95. */ { 1.291, 1.661, 1.985, 2.366, 2.629, 3.178 },
-/* 96. */ { 1.290, 1.661, 1.985, 2.366, 2.628, 3.177 },
-/* 97. */ { 1.290, 1.661, 1.985, 2.365, 2.627, 3.176 },
-/* 98. */ { 1.290, 1.661, 1.984, 2.365, 2.627, 3.175 },
-/* 99. */ { 1.290, 1.660, 1.984, 2.365, 2.626, 3.175 },
-/* 100. */ { 1.290, 1.660, 1.984, 2.364, 2.626, 3.174 }
-};
-
-#define MAX_DS 8
-static char symbol[MAX_DS] = { ' ', 'x', '+', '*', '%', '#', '@', 'O' };
-
-struct dataset {
- char *name;
- double *points;
- unsigned lpoints;
- double sy, syy;
- int n;
-};
-
-static struct dataset *
-NewSet(void)
-{
- struct dataset *ds;
-
- ds = calloc(1, sizeof *ds);
- ds->lpoints = 100000;
- ds->points = calloc(sizeof *ds->points, ds->lpoints);
- return(ds);
-}
-
-static void
-AddPoint(struct dataset *ds, double a)
-{
- double *dp;
-
- if (ds->n >= ds->lpoints) {
- dp = ds->points;
- ds->lpoints *= 4;
- ds->points = calloc(sizeof *ds->points, ds->lpoints);
- memcpy(ds->points, dp, sizeof *dp * ds->n);
- free(dp);
- }
- ds->points[ds->n++] = a;
- ds->sy += a;
- ds->syy += a * a;
-}
-
-static double
-Min(struct dataset *ds)
-{
-
- return (ds->points[0]);
-}
-
-static double
-Max(struct dataset *ds)
-{
-
- return (ds->points[ds->n -1]);
-}
-
-static double
-Avg(struct dataset *ds)
-{
-
- return(ds->sy / ds->n);
-}
-
-static double
-Median(struct dataset *ds)
-{
- int even, i;
- struct point *p1, *p2;
-
- return (ds->points[ds->n / 2]);
-}
-
-static double
-Var(struct dataset *ds)
-{
-
- return (ds->syy - ds->sy * ds->sy / ds->n) / (ds->n - 1.0);
-}
-
-static double
-Stddev(struct dataset *ds)
-{
-
- return sqrt(Var(ds));
-}
-
-static void
-VitalsHead(void)
-{
-
- printf(" N Min Max Median Avg Stddev\n");
-}
-
-static void
-Vitals(struct dataset *ds, int flag)
-{
-
- printf("%c %3d %13.8g %13.8g %13.8g %13.8g %13.8g", symbol[flag],
- ds->n, Min(ds), Max(ds), Median(ds), Avg(ds), Stddev(ds));
- printf("\n");
-}
-
-static void
-Relative(struct dataset *ds, struct dataset *rs, int confidx)
-{
- double spool, s, d, e, t;
- int i;
-
- i = ds->n + rs->n - 2;
- if (i > NSTUDENT)
- t = student[0][confidx];
- else
- t = student[i][confidx];
- spool = (ds->n - 1) * Var(ds) + (rs->n - 1) * Var(rs);
- spool /= ds->n + rs->n - 2;
- spool = sqrt(spool);
- s = spool * sqrt(1.0 / ds->n + 1.0 / rs->n);
- d = Avg(ds) - Avg(rs);
- e = t * s;
-
- if (fabs(d) > e) {
-
- printf("Difference at %.1f%% confidence\n", studentpct[confidx]);
- printf(" %g +/- %g\n", d, e);
- printf(" %g%% +/- %g%%\n", d * 100 / Avg(rs), e * 100 / Avg(rs));
- printf(" (Student's t, pooled s = %g)\n", spool);
- } else {
- printf("No difference proven at %.1f%% confidence\n",
- studentpct[confidx]);
- }
-}
-
-struct plot {
- double min;
- double max;
- double span;
- int width;
-
- double x0, dx;
- int height;
- char *data;
- char **bar;
- int separate_bars;
- int num_datasets;
-};
-
-static struct plot plot;
-
-static void
-SetupPlot(int width, int separate, int num_datasets)
-{
- struct plot *pl;
-
- pl = &plot;
- pl->width = width;
- pl->height = 0;
- pl->data = NULL;
- pl->bar = NULL;
- pl->separate_bars = separate;
- pl->num_datasets = num_datasets;
- pl->min = 999e99;
- pl->max = -999e99;
-}
-
-static void
-AdjPlot(double a)
-{
- struct plot *pl;
-
- pl = &plot;
- if (a < pl->min)
- pl->min = a;
- if (a > pl->max)
- pl->max = a;
- pl->span = pl->max - pl->min;
- pl->dx = pl->span / (pl->width - 1.0);
- pl->x0 = pl->min - .5 * pl->dx;
-}
-
-static void
-DimPlot(struct dataset *ds)
-{
- AdjPlot(Min(ds));
- AdjPlot(Max(ds));
- AdjPlot(Avg(ds) - Stddev(ds));
- AdjPlot(Avg(ds) + Stddev(ds));
-}
-
-static void
-PlotSet(struct dataset *ds, int val)
-{
- struct plot *pl;
- struct point *pp;
- int i, j, m, x, n;
- int bar;
-
- pl = &plot;
- if (pl->span == 0)
- return;
-
- if (pl->separate_bars)
- bar = val-1;
- else
- bar = 0;
-
- if (pl->bar == NULL) {
- pl->bar = malloc(sizeof(char *) * pl->num_datasets);
- memset(pl->bar, 0, sizeof(char*) * pl->num_datasets);
- }
- if (pl->bar[bar] == NULL) {
- pl->bar[bar] = malloc(pl->width);
- memset(pl->bar[bar], 0, pl->width);
- }
-
- m = 1;
- i = -1;
- j = 0;
- for (n = 0; n < ds->n; n++) {
- x = (ds->points[n] - pl->x0) / pl->dx;
- if (x == i) {
- j++;
- if (j > m)
- m = j;
- } else {
- j = 1;
- i = x;
- }
- }
- m += 1;
- if (m > pl->height) {
- pl->data = realloc(pl->data, pl->width * m);
- memset(pl->data + pl->height * pl->width, 0,
- (m - pl->height) * pl->width);
- }
- pl->height = m;
- i = -1;
- for (n = 0; n < ds->n; n++) {
- x = (ds->points[n] - pl->x0) / pl->dx;
- if (x == i) {
- j++;
- } else {
- j = 1;
- i = x;
- }
- pl->data[j * pl->width + x] |= val;
- }
- if (!isnan(Stddev(ds))) {
- x = ((Avg(ds) - Stddev(ds)) - pl->x0) / pl->dx;
- m = ((Avg(ds) + Stddev(ds)) - pl->x0) / pl->dx;
- pl->bar[bar][m] = '|';
- pl->bar[bar][x] = '|';
- for (i = x + 1; i < m; i++)
- if (pl->bar[bar][i] == 0)
- pl->bar[bar][i] = '_';
- }
- x = (Median(ds) - pl->x0) / pl->dx;
- pl->bar[bar][x] = 'M';
- x = (Avg(ds) - pl->x0) / pl->dx;
- pl->bar[bar][x] = 'A';
-}
-
-static void
-DumpPlot(void)
-{
- struct plot *pl;
- int i, j, k;
-
- pl = &plot;
- if (pl->span == 0) {
- printf("[no plot, span is zero width]\n");
- return;
- }
-
- putchar('+');
- for (i = 0; i < pl->width; i++)
- putchar('-');
- putchar('+');
- putchar('\n');
- for (i = 1; i < pl->height; i++) {
- putchar('|');
- for (j = 0; j < pl->width; j++) {
- k = pl->data[(pl->height - i) * pl->width + j];
- if (k >= 0 && k < MAX_DS)
- putchar(symbol[k]);
- else
- printf("[%02x]", k);
- }
- putchar('|');
- putchar('\n');
- }
- for (i = 0; i < pl->num_datasets; i++) {
- if (pl->bar[i] == NULL)
- continue;
- putchar('|');
- for (j = 0; j < pl->width; j++) {
- k = pl->bar[i][j];
- if (k == 0)
- k = ' ';
- putchar(k);
- }
- putchar('|');
- putchar('\n');
- }
- putchar('+');
- for (i = 0; i < pl->width; i++)
- putchar('-');
- putchar('+');
- putchar('\n');
-}
-
-static int
-dbl_cmp(const void *a, const void *b)
-{
- const double *aa = a;
- const double *bb = b;
-
- if (*aa < *bb)
- return (-1);
- else if (*aa > *bb)
- return (1);
- else
- return (0);
-}
-
-static struct dataset *
-ReadSet(const char *n, int column, const char *delim)
-{
- FILE *f;
- char buf[BUFSIZ], *p, *t;
- struct dataset *s;
- double d;
- int line;
- int i;
-
- if (n == NULL) {
- f = stdin;
- n = "<stdin>";
- } else if (!strcmp(n, "-")) {
- f = stdin;
- n = "<stdin>";
- } else {
- f = fopen(n, "r");
- }
- if (f == NULL)
- err(1, "Cannot open %s", n);
- s = NewSet();
- s->name = strdup(n);
- line = 0;
- while (fgets(buf, sizeof buf, f) != NULL) {
- line++;
-
- i = strlen(buf);
- if (buf[i-1] == '\n')
- buf[i-1] = '\0';
- for (i = 1, t = strtok(buf, delim);
- t != NULL && *t != '#';
- i++, t = strtok(NULL, delim)) {
- if (i == column)
- break;
- }
- if (t == NULL || *t == '#')
- continue;
-
- d = strtod(t, &p);
- if (p != NULL && *p != '\0')
- err(2, "Invalid data on line %d in %s\n", line, n);
- if (*buf != '\0')
- AddPoint(s, d);
- }
- fclose(f);
- if (s->n < 3) {
- fprintf(stderr,
- "Dataset %s must contain at least 3 data points\n", n);
- exit (2);
- }
- qsort(s->points, s->n, sizeof *s->points, dbl_cmp);
- return (s);
-}
-
-static void
-usage(char const *whine)
-{
- int i;
-
- fprintf(stderr, "%s\n", whine);
- fprintf(stderr,
- "Usage: ministat [-C column] [-c confidence] [-d delimiter(s)] [-ns] [-w width] [file [file ...]]\n");
- fprintf(stderr, "\tconfidence = {");
- for (i = 0; i < NCONF; i++) {
- fprintf(stderr, "%s%g%%",
- i ? ", " : "",
- studentpct[i]);
- }
- fprintf(stderr, "}\n");
- fprintf(stderr, "\t-C : column number to extract (starts and defaults to 1)\n");
- fprintf(stderr, "\t-d : delimiter(s) string, default to \" \\t\"\n");
- fprintf(stderr, "\t-n : print summary statistics only, no graph/test\n");
- fprintf(stderr, "\t-s : print avg/median/stddev bars on separate lines\n");
- fprintf(stderr, "\t-w : width of graph/test output (default 74 or terminal width)\n");
- exit (2);
-}
-
-int
-main(int argc, char **argv)
-{
- struct dataset *ds[7];
- int nds;
- double a;
- const char *delim = " \t";
- char *p;
- int c, i, ci;
- int column = 1;
- int flag_s = 0;
- int flag_n = 0;
- int termwidth = 74;
-
- if (isatty(STDOUT_FILENO)) {
- struct winsize wsz;
-
- if ((p = getenv("COLUMNS")) != NULL && *p != '\0')
- termwidth = atoi(p);
- else if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &wsz) != -1 &&
- wsz.ws_col > 0)
- termwidth = wsz.ws_col - 2;
- }
-
- ci = -1;
- while ((c = getopt(argc, argv, "C:c:d:snw:")) != -1)
- switch (c) {
- case 'C':
- column = strtol(optarg, &p, 10);
- if (p != NULL && *p != '\0')
- usage("Invalid column number.");
- if (column <= 0)
- usage("Column number should be positive.");
- break;
- case 'c':
- a = strtod(optarg, &p);
- if (p != NULL && *p != '\0')
- usage("Not a floating point number");
- for (i = 0; i < NCONF; i++)
- if (a == studentpct[i])
- ci = i;
- if (ci == -1)
- usage("No support for confidence level");
- break;
- case 'd':
- if (*optarg == '\0')
- usage("Can't use empty delimiter string");
- delim = optarg;
- break;
- case 'n':
- flag_n = 1;
- break;
- case 's':
- flag_s = 1;
- break;
- case 'w':
- termwidth = strtol(optarg, &p, 10);
- if (p != NULL && *p != '\0')
- usage("Invalid width, not a number.");
- if (termwidth < 0)
- usage("Unable to move beyond left margin.");
- break;
- default:
- usage("Unknown option");
- break;
- }
- if (ci == -1)
- ci = 2;
- argc -= optind;
- argv += optind;
-
- if (argc == 0) {
- ds[0] = ReadSet("-", column, delim);
- nds = 1;
- } else {
- if (argc > (MAX_DS - 1))
- usage("Too many datasets.");
- nds = argc;
- for (i = 0; i < nds; i++)
- ds[i] = ReadSet(argv[i], column, delim);
- }
-
- for (i = 0; i < nds; i++)
- printf("%c %s\n", symbol[i+1], ds[i]->name);
-
- if (!flag_n) {
- SetupPlot(termwidth, flag_s, nds);
- for (i = 0; i < nds; i++)
- DimPlot(ds[i]);
- for (i = 0; i < nds; i++)
- PlotSet(ds[i], i + 1);
- DumpPlot();
- }
- VitalsHead();
- Vitals(ds[0], 1);
- for (i = 1; i < nds; i++) {
- Vitals(ds[i], i + 1);
- if (!flag_n)
- Relative(ds[i], ds[0], ci);
- }
- exit(0);
-}
diff --git a/usr.bin/mkdep/Makefile b/usr.bin/mkdep/Makefile
deleted file mode 100644
index 463466c..0000000
--- a/usr.bin/mkdep/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-SCRIPTS= mkdep.gcc.sh
-MAN= mkdep.1
-SCRIPTSNAME= mkdep
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/mkdep/mkdep.1 b/usr.bin/mkdep/mkdep.1
deleted file mode 100644
index 5d86209..0000000
--- a/usr.bin/mkdep/mkdep.1
+++ /dev/null
@@ -1,129 +0,0 @@
-.\" Copyright (c) 1987, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)mkdep.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 6, 1993
-.Dt MKDEP 1
-.Os
-.Sh NAME
-.Nm mkdep
-.Nd construct Makefile dependency list
-.Sh SYNOPSIS
-.Nm
-.Op Fl ap
-.Op Fl f Ar file
-.Op Ar flags
-.Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility takes a set of flags for the C compiler and a list
-of C source files as arguments and constructs a set of include
-file dependencies which are written into the file ``.depend''.
-An example of its use in a Makefile might be:
-.Bd -literal -offset indent
-CFLAGS= -O -I../include
-SRCS= file1.c file2.c
-
-depend:
- mkdep ${CFLAGS} ${SRCS}
-.Ed
-.Pp
-where the macro SRCS is the list of C source files and the macro
-CFLAGS is the list of flags for the C compiler.
-.Pp
-The user has the ability to change the preprocessor and preprocessor options
-used.
-For instance, to use gcc as the preprocessor and to ignore system
-headers, one would use
-.Bd -literal -offset indent
-depend:
- env MKDEP_CPP="gcc -E" MKDEP_CPP_OPTS=-MM mkdep \\
- ${CFLAGS} ${SRCS}
-.Ed
-.Pp
-The options are as follows:
-.Bl -tag -width Ds
-.It Fl a
-Append to the output file,
-so that multiple
-.Nm Ns 's
-may be run from a single Makefile.
-.It Fl f
-Write the include file dependencies to
-.Ar file ,
-instead of the default ``.depend''.
-.It Fl p
-Cause
-.Nm
-to produce dependencies of the form:
-.Bd -literal -offset indent
-program: program.c
-.Ed
-.Pp
-so that subsequent makes will produce
-.Ar program
-directly from its C module rather than using an intermediate
-.Pa \&.o
-module.
-This is useful for programs whose source is contained in a single
-module.
-.El
-.Sh ENVIRONMENT
-.Bl -tag -width MKDEP_CPP_OPTS
-.It Ev CC
-Specifies the C compiler to use.
-The specified compiler is expected to have
-options consistent with the GNU C compiler.
-.It Ev MKDEP_CPP
-Specifies the preprocessor to use.
-The default is "${CC} -E".
-.It Ev MKDEP_CPP_OPTS
-Specifies the non-CFLAGS options for the preprocessor.
-The default is
-"-M".
-.El
-.Sh FILES
-.Bl -tag -width .depend -compact
-.It Pa .depend
-File containing list of dependencies.
-.El
-.Sh SEE ALSO
-.Xr cc 1 ,
-.Xr cpp 1 ,
-.Xr make 1
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.3 Tahoe .
diff --git a/usr.bin/mkdep/mkdep.gcc.sh b/usr.bin/mkdep/mkdep.gcc.sh
deleted file mode 100644
index ec00dcf..0000000
--- a/usr.bin/mkdep/mkdep.gcc.sh
+++ /dev/null
@@ -1,100 +0,0 @@
-#!/bin/sh -
-#
-# Copyright (c) 1991, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 4. Neither the name of the University nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# @(#)mkdep.gcc.sh 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-D=.depend # default dependency file is .depend
-append=0
-pflag=
-
-while :
- do case "$1" in
- # -a appends to the depend file
- -a)
- append=1
- shift ;;
-
- # -f allows you to select a makefile name
- -f)
- D=$2
- shift; shift ;;
-
- # the -p flag produces "program: program.c" style dependencies
- # so .o's don't get produced
- -p)
- pflag=p
- shift ;;
- *)
- break ;;
- esac
-done
-
-case $# in 0)
- echo 'usage: mkdep [-ap] [-f file] [flags] file ...' >&2
- exit 1;;
-esac
-
-TMP=_mkdep$$
-trap 'rm -f $TMP ; trap 2 ; kill -2 $$' 1 2 3 13 15
-trap 'rm -f $TMP' 0
-
-# For C sources, mkdep must use exactly the same cpp and predefined flags
-# as the compiler would. This is easily arranged by letting the compiler
-# pick the cpp. mkdep must be told the cpp to use for exceptional cases.
-CC=${CC-"cc"}
-MKDEP_CPP=${MKDEP_CPP-"${CC} -E"}
-MKDEP_CPP_OPTS=${MKDEP_CPP_OPTS-"-M"};
-
-echo "# $@" > $TMP # store arguments for debugging
-
-if $MKDEP_CPP $MKDEP_CPP_OPTS "$@" >> $TMP; then :
-else
- echo 'mkdep: compile failed' >&2
- exit 1
-fi
-
-case x$pflag in
- x) case $append in
- 0) sed -e 's; \./; ;g' < $TMP > $D;;
- *) sed -e 's; \./; ;g' < $TMP >> $D;;
- esac
- ;;
- *) case $append in
- 0) sed -e 's;\.o:;:;' -e 's; \./; ;g' < $TMP > $D;;
- *) sed -e 's;\.o:;:;' -e 's; \./; ;g' < $TMP >> $D;;
- esac
- ;;
-esac
-
-exit $?
diff --git a/usr.bin/mkdep/mkdep.sh b/usr.bin/mkdep/mkdep.sh
deleted file mode 100644
index b039fe6..0000000
--- a/usr.bin/mkdep/mkdep.sh
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/bin/sh -
-#
-# Copyright (c) 1991, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 4. Neither the name of the University nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# @(#)mkdep.sh 8.1 (Berkeley) 6/6/93
-#
-
-PATH=/bin:/usr/bin:/usr/ucb:/usr/old/bin
-export PATH
-
-D=.depend # default dependency file is .depend
-append=0
-
-while :
- do case "$1" in
- # -a appends to the depend file
- -a)
- append=1
- shift ;;
-
- # -f allows you to select a makefile name
- -f)
- D=$2
- shift; shift ;;
-
- # the -p flag produces "program: program.c" style dependencies
- # so .o's don't get produced
- -p)
- SED='s;\.o ; ;'
- shift ;;
- *)
- break ;;
- esac
-done
-
-if [ $# = 0 ] ; then
- echo 'usage: mkdep [-p] [-f depend_file] [cc_flags] file ...'
- exit 1
-fi
-
-TMP=/tmp/mkdep$$
-
-trap 'rm -f $TMP ; trap 2 ; kill -2 $$' 1 2 3 13 15
-
-cc -M $* |
-sed "
- s; \./; ;g
- /\.c:$/d
- $SED" |
-awk '{
- if ($1 != prev) {
- if (rec != "")
- print rec;
- rec = $0;
- prev = $1;
- }
- else {
- if (length(rec $2) > 78) {
- print rec;
- rec = $0;
- }
- else
- rec = rec " " $2
- }
-}
-END {
- print rec
-}' > $TMP
-
-if [ $? != 0 ]; then
- echo 'mkdep: compile failed.'
- rm -f $TMP
- exit 1
-fi
-
-if [ $append = 1 ]; then
- cat $TMP >> $D
- rm -f $TMP
-else
- mv $TMP $D
-fi
-exit 0
diff --git a/usr.bin/mkfifo/Makefile b/usr.bin/mkfifo/Makefile
deleted file mode 100644
index bab308b..0000000
--- a/usr.bin/mkfifo/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= mkfifo
-WARNS?= 6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/mkfifo/mkfifo.1 b/usr.bin/mkfifo/mkfifo.1
deleted file mode 100644
index b29c48a..0000000
--- a/usr.bin/mkfifo/mkfifo.1
+++ /dev/null
@@ -1,102 +0,0 @@
-.\" Copyright (c) 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)mkfifo.1 8.2 (Berkeley) 1/5/94
-.\" $FreeBSD$
-.\"
-.Dd January 5, 1994
-.Dt MKFIFO 1
-.Os
-.Sh NAME
-.Nm mkfifo
-.Nd make fifos
-.Sh SYNOPSIS
-.Nm
-.Op Fl m Ar mode
-.Ar fifo_name ...
-.Sh DESCRIPTION
-The
-.Nm
-utility creates the fifos requested, in the order specified.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl m
-Set the file permission bits of the created fifos to the
-specified mode, ignoring the
-.Xr umask 2
-of the calling process.
-The
-.Ar mode
-argument takes any format that can be specified to the
-.Xr chmod 1
-command.
-If a symbolic mode is specified, the op symbols
-.Ql +
-(plus) and
-.Ql -
-(hyphen) are interpreted relative to an assumed initial mode of
-.Dq Li a=rw
-(read and write permissions for all).
-.El
-.Pp
-If the
-.Fl m
-option is not specified, fifos are created with mode
-.Li 0666
-modified by the
-.Xr umask 2
-of the calling process.
-The
-.Nm
-utility requires write permission in the parent directory.
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr mkdir 1 ,
-.Xr rm 1 ,
-.Xr mkfifo 2 ,
-.Xr mknod 2 ,
-.Xr mknod 8
-.Sh STANDARDS
-The
-.Nm
-utility is expected to be
-.St -p1003.2
-compliant.
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.4 .
diff --git a/usr.bin/mkfifo/mkfifo.c b/usr.bin/mkfifo/mkfifo.c
deleted file mode 100644
index 7e147b6..0000000
--- a/usr.bin/mkfifo/mkfifo.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1990, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)mkfifo.c 8.2 (Berkeley) 1/5/94";
-#endif
-#endif /* not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#define BASEMODE S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | \
- S_IROTH | S_IWOTH
-
-static void usage(void);
-
-static int f_mode;
-
-int
-main(int argc, char *argv[])
-{
- const char *modestr = NULL;
- const void *modep;
- mode_t fifomode;
- int ch, exitval;
-
- while ((ch = getopt(argc, argv, "m:")) != -1)
- switch(ch) {
- case 'm':
- f_mode = 1;
- modestr = optarg;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
- if (argv[0] == NULL)
- usage();
-
- if (f_mode) {
- umask(0);
- errno = 0;
- if ((modep = setmode(modestr)) == NULL) {
- if (errno)
- err(1, "setmode");
- errx(1, "invalid file mode: %s", modestr);
- }
- fifomode = getmode(modep, BASEMODE);
- } else {
- fifomode = BASEMODE;
- }
-
- for (exitval = 0; *argv != NULL; ++argv)
- if (mkfifo(*argv, fifomode) < 0) {
- warn("%s", *argv);
- exitval = 1;
- }
- exit(exitval);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "usage: mkfifo [-m mode] fifo_name ...\n");
- exit(1);
-}
diff --git a/usr.bin/mklocale/Makefile b/usr.bin/mklocale/Makefile
deleted file mode 100644
index 9873d4e..0000000
--- a/usr.bin/mklocale/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/7/93
-# $FreeBSD$
-
-PROG= mklocale
-WARNS?= 6
-SRCS= yacc.y lex.l y.tab.h
-CFLAGS+= -I. -I${.CURDIR} -I${.CURDIR}/../../lib/libc/locale
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/mklocale/extern.h b/usr.bin/mklocale/extern.h
deleted file mode 100644
index a52c6b5..0000000
--- a/usr.bin/mklocale/extern.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*-
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Paul Borman at Krystal Technologies.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-int yylex(void);
-int yyparse(void);
diff --git a/usr.bin/mklocale/ldef.h b/usr.bin/mklocale/ldef.h
deleted file mode 100644
index 70ce43a..0000000
--- a/usr.bin/mklocale/ldef.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*-
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Paul Borman at Krystal Technologies.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ldef.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-#include "runefile.h"
-
-/*
- * This should look a LOT like a _RuneEntry
- */
-typedef struct rune_list {
- int32_t min;
- int32_t max;
- int32_t map;
- uint32_t *types;
- struct rune_list *next;
-} rune_list;
-
-typedef struct rune_map {
- uint32_t map[_CACHED_RUNES];
- rune_list *root;
-} rune_map;
diff --git a/usr.bin/mklocale/lex.l b/usr.bin/mklocale/lex.l
deleted file mode 100644
index eeed535..0000000
--- a/usr.bin/mklocale/lex.l
+++ /dev/null
@@ -1,177 +0,0 @@
-%{
-/*-
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Paul Borman at Krystal Technologies.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)lex.l 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "ldef.h"
-#include "y.tab.h"
-#include "extern.h"
-%}
-
-ODIGIT [0-7]
-DIGIT [0-9]
-XDIGIT [0-9a-fA-F]
-W [\t\n\r ]
-
-%%
-\'.\' { yylval.rune = (unsigned char)yytext[1];
- return(RUNE); }
-
-'\\a' { yylval.rune = '\a';
- return(RUNE); }
-'\\b' { yylval.rune = '\b';
- return(RUNE); }
-'\\f' { yylval.rune = '\f';
- return(RUNE); }
-'\\n' { yylval.rune = '\n';
- return(RUNE); }
-'\\r' { yylval.rune = '\r';
- return(RUNE); }
-'\\t' { yylval.rune = '\t';
- return(RUNE); }
-'\\v' { yylval.rune = '\v';
- return(RUNE); }
-
-0x{XDIGIT}+ { yylval.rune = strtol(yytext, 0, 16);
- return(RUNE); }
-0{ODIGIT}+ { yylval.rune = strtol(yytext, 0, 8);
- return(RUNE); }
-{DIGIT}+ { yylval.rune = strtol(yytext, 0, 10);
- return(RUNE); }
-
-
-MAPLOWER { return(MAPLOWER); }
-MAPUPPER { return(MAPUPPER); }
-TODIGIT { return(DIGITMAP); }
-INVALID { return(INVALID); }
-
-ALPHA { yylval.i = _CTYPE_A|_CTYPE_R|_CTYPE_G;
- return(LIST); }
-CONTROL { yylval.i = _CTYPE_C;
- return(LIST); }
-DIGIT { yylval.i = _CTYPE_D|_CTYPE_R|_CTYPE_G;
- return(LIST); }
-GRAPH { yylval.i = _CTYPE_G|_CTYPE_R;
- return(LIST); }
-LOWER { yylval.i = _CTYPE_L|_CTYPE_R|_CTYPE_G;
- return(LIST); }
-PUNCT { yylval.i = _CTYPE_P|_CTYPE_R|_CTYPE_G;
- return(LIST); }
-SPACE { yylval.i = _CTYPE_S;
- return(LIST); }
-UPPER { yylval.i = _CTYPE_U|_CTYPE_R|_CTYPE_G;
- return(LIST); }
-XDIGIT { yylval.i = _CTYPE_X|_CTYPE_R|_CTYPE_G;
- return(LIST); }
-BLANK { yylval.i = _CTYPE_B;
- return(LIST); }
-PRINT { yylval.i = _CTYPE_R;
- return(LIST); }
-IDEOGRAM { yylval.i = _CTYPE_I|_CTYPE_R|_CTYPE_G;
- return(LIST); }
-SPECIAL { yylval.i = _CTYPE_T|_CTYPE_R|_CTYPE_G;
- return(LIST); }
-PHONOGRAM { yylval.i = _CTYPE_Q|_CTYPE_R|_CTYPE_G;
- return(LIST); }
-SWIDTH0 { yylval.i = _CTYPE_SW0; return(LIST); }
-SWIDTH1 { yylval.i = _CTYPE_SW1; return(LIST); }
-SWIDTH2 { yylval.i = _CTYPE_SW2; return(LIST); }
-SWIDTH3 { yylval.i = _CTYPE_SW3; return(LIST); }
-
-VARIABLE[\t ] { static char vbuf[1024];
- char *v = vbuf;
- while ((*v = input()) && *v != '\n')
- ++v;
- if (*v) {
- unput(*v);
- *v = 0;
- }
- yylval.str = vbuf;
- return(VARIABLE);
- }
-
-ENCODING { return(ENCODING); }
-
-\".*\" { char *e = yytext + 1;
- yylval.str = e;
- while (*e && *e != '"')
- ++e;
- *e = 0;
- return(STRING); }
-
-\<|\(|\[ { return(LBRK); }
-
-\>|\)|\] { return(RBRK); }
-
-\- { return(THRU); }
-\.\.\. { return(THRU); }
-
-\: { return(':'); }
-
-{W}+ ;
-
-^\#.*\n ;
-\/\* { char lc = 0;
- do {
- while ((lc) != '*')
- if ((lc = input()) == 0)
- break;
- } while((lc = input()) != '/');
- }
-
-\\$ ;
-. { printf("Lex is skipping '%s'\n", yytext); }
-%%
-
-#if !defined(yywrap)
-int
-yywrap()
-{
- return(1);
-}
-#endif
diff --git a/usr.bin/mklocale/mklocale.1 b/usr.bin/mklocale/mklocale.1
deleted file mode 100644
index ab245e0..0000000
--- a/usr.bin/mklocale/mklocale.1
+++ /dev/null
@@ -1,308 +0,0 @@
-.\" Copyright (c) 1993, 1994
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Paul Borman at Krystal Technologies.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)mklocale.1 8.2 (Berkeley) 4/18/94
-.\" $FreeBSD$
-.\"
-.Dd October 17, 2004
-.Dt MKLOCALE 1
-.Os
-.Sh NAME
-.Nm mklocale
-.Nd make LC_CTYPE locale files
-.Sh SYNOPSIS
-.Nm
-.Op Fl d
-.Ar "< src-file"
-.Ar "> language/LC_CTYPE"
-.Nm
-.Op Fl d
-.Fl o
-.Ar language/LC_CTYPE
-.Ar src-file
-.Sh DESCRIPTION
-The
-.Nm
-utility reads a
-.Dv LC_CTYPE
-source file from standard input and produces a
-.Dv LC_CTYPE
-binary file on standard output suitable for placement in
-.Pa /usr/share/locale/ Ns Ar language Ns Pa /LC_CTYPE .
-.Pp
-The format of
-.Ar src-file
-is quite simple.
-It consists of a series of lines which start with a keyword and have
-associated data following.
-C style comments are used
-to place comments in the file.
-.Pp
-Following options are available:
-.Bl -tag -width indent
-.It Fl d
-Turns on debugging messages.
-.It Fl o
-Specify output file.
-.El
-.Pp
-Besides the keywords which will be listed below,
-the following are valid tokens in
-.Ar src-file :
-.Bl -tag -width ".Ar literal"
-.It Dv RUNE
-A
-.Dv RUNE
-may be any of the following:
-.Bl -tag -width ".Ar 0x[0-9a-z]*"
-.It Ar 'x'
-The ASCII character
-.Ar x .
-.It Ar '\ex'
-The ANSI C character
-.Ar \ex
-where
-.Ar \ex
-is one of
-.Dv \ea ,
-.Dv \eb ,
-.Dv \ef ,
-.Dv \en ,
-.Dv \er ,
-.Dv \et ,
-or
-.Dv \ev .
-.It Ar 0x[0-9a-z]*
-A hexadecimal number representing a rune code.
-.It Ar 0[0-7]*
-An octal number representing a rune code.
-.It Ar [1-9][0-9]*
-A decimal number representing a rune code.
-.El
-.It Dv STRING
-A string enclosed in double quotes (").
-.It Dv THRU
-Either
-.Dv ...
-or
-.Dv - .
-Used to indicate ranges.
-.It Ar literal
-The follow characters are taken literally:
-.Bl -tag -width ".Dv <\|\|(\|\|["
-.It Dv "<\|(\|["
-Used to start a mapping.
-All are equivalent.
-.It Dv ">\|\^)\|]"
-Used to end a mapping.
-All are equivalent.
-.It Dv :
-Used as a delimiter in mappings.
-.El
-.El
-.Pp
-Key words which should only appear once are:
-.Bl -tag -width ".Dv PHONOGRAM"
-.It Dv ENCODING
-Followed by a
-.Dv STRING
-which indicates the encoding mechanism to be used for this locale.
-The current encodings are:
-.Bl -tag -width ".Dv MSKanji"
-.It Dv ASCII
-American Standard Code for Information Interchange.
-.It Dv BIG5
-The
-.Dq Big5
-encoding of Chinese.
-.It Dv EUC
-.Dv EUC
-encoding as used by several
-vendors of
-.Ux
-systems.
-.It Dv GB18030
-PRC national standard for encoding of Chinese text.
-.It Dv GB2312
-Older PRC national standard for encoding Chinese text.
-.It Dv GBK
-A widely used encoding method for Chinese text,
-backwards compatible with GB\ 2312-1980.
-.It Dv MSKanji
-The method of encoding Japanese used by Microsoft,
-loosely based on JIS.
-Also known as
-.Dq "Shift JIS"
-and
-.Dq SJIS .
-.It Dv NONE
-No translation and the default.
-.It Dv UTF-8
-The
-.Dv UTF-8
-transformation format of
-.Tn ISO
-10646
-as defined by RFC 2279.
-.El
-.It Dv VARIABLE
-This keyword must be followed by a single tab or space character,
-after which encoding specific data is placed.
-Currently only the
-.Dv "EUC"
-encoding requires variable data.
-See
-.Xr euc 5
-for further details.
-.It Dv INVALID
-(obsolete)
-A single
-.Dv RUNE
-follows and is used as the invalid rune for this locale.
-.El
-.Pp
-The following keywords may appear multiple times and have the following
-format for data:
-.Bl -tag -width ".Dv <RUNE1 THRU RUNEn : RUNE2>" -offset indent
-.It Dv <RUNE1 RUNE2>
-.Dv RUNE1
-is mapped to
-.Dv RUNE2 .
-.It Dv <RUNE1 THRU RUNEn : RUNE2>
-Runes
-.Dv RUNE1
-through
-.Dv RUNEn
-are mapped to
-.Dv RUNE2
-through
-.Dv RUNE2
-+ n-1.
-.El
-.Bl -tag -width ".Dv PHONOGRAM"
-.It Dv MAPLOWER
-Defines the tolower mappings.
-.Dv RUNE2
-is the lower case representation of
-.Dv RUNE1 .
-.It Dv MAPUPPER
-Defines the toupper mappings.
-.Dv RUNE2
-is the upper case representation of
-.Dv RUNE1 .
-.It Dv TODIGIT
-Defines a map from runes to their digit value.
-.Dv RUNE2
-is the integer value represented by
-.Dv RUNE1 .
-For example, the ASCII character
-.Ql 0
-would map to the decimal value 0.
-Only values up to 255
-are allowed.
-.El
-.Pp
-The following keywords may appear multiple times and have the following
-format for data:
-.Bl -tag -width ".Dv RUNE1 THRU RUNEn" -offset indent
-.It Dv RUNE
-This rune has the property defined by the keyword.
-.It Dv "RUNE1 THRU RUNEn"
-All the runes between and including
-.Dv RUNE1
-and
-.Dv RUNEn
-have the property defined by the keyword.
-.El
-.Bl -tag -width ".Dv PHONOGRAM"
-.It Dv ALPHA
-Defines runes which are alphabetic, printable and graphic.
-.It Dv CONTROL
-Defines runes which are control characters.
-.It Dv DIGIT
-Defines runes which are decimal digits, printable and graphic.
-.It Dv GRAPH
-Defines runes which are graphic and printable.
-.It Dv LOWER
-Defines runes which are lower case, printable and graphic.
-.It Dv PUNCT
-Defines runes which are punctuation, printable and graphic.
-.It Dv SPACE
-Defines runes which are spaces.
-.It Dv UPPER
-Defines runes which are upper case, printable and graphic.
-.It Dv XDIGIT
-Defines runes which are hexadecimal digits, printable and graphic.
-.It Dv BLANK
-Defines runes which are blank.
-.It Dv PRINT
-Defines runes which are printable.
-.It Dv IDEOGRAM
-Defines runes which are ideograms, printable and graphic.
-.It Dv SPECIAL
-Defines runes which are special characters, printable and graphic.
-.It Dv PHONOGRAM
-Defines runes which are phonograms, printable and graphic.
-.It Dv SWIDTH0
-Defines runes with display width 0.
-.It Dv SWIDTH1
-Defines runes with display width 1.
-.It Dv SWIDTH2
-Defines runes with display width 2.
-.It Dv SWIDTH3
-Defines runes with display width 3.
-.El
-.Pp
-If no display width explicitly defined, width 1 assumed
-for printable runes by default.
-.Sh SEE ALSO
-.Xr colldef 1 ,
-.Xr setlocale 3 ,
-.Xr wcwidth 3 ,
-.Xr big5 5 ,
-.Xr euc 5 ,
-.Xr gb18030 5 ,
-.Xr gb2312 5 ,
-.Xr gbk 5 ,
-.Xr mskanji 5 ,
-.Xr utf8 5
-.Sh HISTORY
-The
-.Nm
-utility first appeared in
-.Bx 4.4 .
-.Sh BUGS
-The
-.Nm
-utility is overly simplistic.
diff --git a/usr.bin/mklocale/yacc.y b/usr.bin/mklocale/yacc.y
deleted file mode 100644
index 4024f67..0000000
--- a/usr.bin/mklocale/yacc.y
+++ /dev/null
@@ -1,886 +0,0 @@
-%{
-/*-
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Paul Borman at Krystal Technologies.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)yacc.y 8.1 (Berkeley) 6/6/93";
-#endif /* 0 */
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <arpa/inet.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "ldef.h"
-#include "extern.h"
-#include "runefile.h"
-
-static void *xmalloc(unsigned int sz);
-static uint32_t *xlalloc(unsigned int sz);
-void yyerror(const char *s);
-static uint32_t *xrelalloc(uint32_t *old, unsigned int sz);
-static void dump_tables(void);
-static void cleanout(void);
-
-const char *locale_file = "<stdout>";
-
-rune_map maplower = { { 0 }, NULL };
-rune_map mapupper = { { 0 }, NULL };
-rune_map types = { { 0 }, NULL };
-
-_FileRuneLocale new_locale = { "", "", {}, {}, {}, 0, 0, 0, 0 };
-char *variable = NULL;
-
-void set_map(rune_map *, rune_list *, uint32_t);
-void set_digitmap(rune_map *, rune_list *);
-void add_map(rune_map *, rune_list *, uint32_t);
-static void usage(void);
-%}
-
-%union {
- int32_t rune;
- int i;
- char *str;
-
- rune_list *list;
-}
-
-%token <rune> RUNE
-%token LBRK
-%token RBRK
-%token THRU
-%token MAPLOWER
-%token MAPUPPER
-%token DIGITMAP
-%token <i> LIST
-%token <str> VARIABLE
-%token ENCODING
-%token INVALID
-%token <str> STRING
-
-%type <list> list
-%type <list> map
-
-
-%%
-
-locale : /* empty */
- | table
- { dump_tables(); }
- ;
-
-table : entry
- | table entry
- ;
-
-entry : ENCODING STRING
- { if (strcmp($2, "NONE") &&
- strcmp($2, "ASCII") &&
- strcmp($2, "UTF-8") &&
- strcmp($2, "EUC") &&
- strcmp($2, "GBK") &&
- strcmp($2, "GB18030") &&
- strcmp($2, "GB2312") &&
- strcmp($2, "BIG5") &&
- strcmp($2, "MSKanji"))
- warnx("ENCODING %s is not supported by libc", $2);
- strncpy(new_locale.encoding, $2,
- sizeof(new_locale.encoding)); }
- | VARIABLE
- { new_locale.variable_len = strlen($1) + 1;
- variable = xmalloc(new_locale.variable_len);
- strcpy(variable, $1);
- }
- | INVALID RUNE
- { warnx("the INVALID keyword is deprecated"); }
- | LIST list
- { set_map(&types, $2, $1); }
- | MAPLOWER map
- { set_map(&maplower, $2, 0); }
- | MAPUPPER map
- { set_map(&mapupper, $2, 0); }
- | DIGITMAP map
- { set_digitmap(&types, $2); }
- ;
-
-list : RUNE
- {
- $$ = (rune_list *)xmalloc(sizeof(rune_list));
- $$->min = $1;
- $$->max = $1;
- $$->next = 0;
- }
- | RUNE THRU RUNE
- {
- $$ = (rune_list *)xmalloc(sizeof(rune_list));
- $$->min = $1;
- $$->max = $3;
- $$->next = 0;
- }
- | list RUNE
- {
- $$ = (rune_list *)xmalloc(sizeof(rune_list));
- $$->min = $2;
- $$->max = $2;
- $$->next = $1;
- }
- | list RUNE THRU RUNE
- {
- $$ = (rune_list *)xmalloc(sizeof(rune_list));
- $$->min = $2;
- $$->max = $4;
- $$->next = $1;
- }
- ;
-
-map : LBRK RUNE RUNE RBRK
- {
- $$ = (rune_list *)xmalloc(sizeof(rune_list));
- $$->min = $2;
- $$->max = $2;
- $$->map = $3;
- $$->next = 0;
- }
- | map LBRK RUNE RUNE RBRK
- {
- $$ = (rune_list *)xmalloc(sizeof(rune_list));
- $$->min = $3;
- $$->max = $3;
- $$->map = $4;
- $$->next = $1;
- }
- | LBRK RUNE THRU RUNE ':' RUNE RBRK
- {
- $$ = (rune_list *)xmalloc(sizeof(rune_list));
- $$->min = $2;
- $$->max = $4;
- $$->map = $6;
- $$->next = 0;
- }
- | map LBRK RUNE THRU RUNE ':' RUNE RBRK
- {
- $$ = (rune_list *)xmalloc(sizeof(rune_list));
- $$->min = $3;
- $$->max = $5;
- $$->map = $7;
- $$->next = $1;
- }
- ;
-%%
-
-int debug;
-FILE *fp;
-
-static void
-cleanout(void)
-{
- if (fp != NULL)
- unlink(locale_file);
-}
-
-int
-main(int ac, char *av[])
-{
- int x;
-
- fp = stdout;
-
- while ((x = getopt(ac, av, "do:")) != -1) {
- switch(x) {
- case 'd':
- debug = 1;
- break;
- case 'o':
- locale_file = optarg;
- if ((fp = fopen(locale_file, "w")) == NULL)
- err(1, "%s", locale_file);
- atexit(cleanout);
- break;
- default:
- usage();
- }
- }
-
- switch (ac - optind) {
- case 0:
- break;
- case 1:
- if (freopen(av[optind], "r", stdin) == 0)
- err(1, "%s", av[optind]);
- break;
- default:
- usage();
- }
- for (x = 0; x < _CACHED_RUNES; ++x) {
- mapupper.map[x] = x;
- maplower.map[x] = x;
- }
- memcpy(new_locale.magic, _FILE_RUNE_MAGIC_1, sizeof(new_locale.magic));
-
- yyparse();
-
- return(0);
-}
-
-static void
-usage()
-{
- fprintf(stderr, "usage: mklocale [-d] [-o output] [source]\n");
- exit(1);
-}
-
-void
-yyerror(s)
- const char *s;
-{
- fprintf(stderr, "%s\n", s);
-}
-
-static void *
-xmalloc(sz)
- unsigned int sz;
-{
- void *r = malloc(sz);
- if (!r)
- errx(1, "xmalloc");
- return(r);
-}
-
-static uint32_t *
-xlalloc(sz)
- unsigned int sz;
-{
- uint32_t *r = (uint32_t *)malloc(sz * sizeof(uint32_t));
- if (!r)
- errx(1, "xlalloc");
- return(r);
-}
-
-static uint32_t *
-xrelalloc(old, sz)
- uint32_t *old;
- unsigned int sz;
-{
- uint32_t *r = (uint32_t *)realloc((char *)old,
- sz * sizeof(uint32_t));
- if (!r)
- errx(1, "xrelalloc");
- return(r);
-}
-
-void
-set_map(map, list, flag)
- rune_map *map;
- rune_list *list;
- uint32_t flag;
-{
- while (list) {
- rune_list *nlist = list->next;
- add_map(map, list, flag);
- list = nlist;
- }
-}
-
-void
-set_digitmap(map, list)
- rune_map *map;
- rune_list *list;
-{
- int32_t i;
-
- while (list) {
- rune_list *nlist = list->next;
- for (i = list->min; i <= list->max; ++i) {
- if (list->map + (i - list->min)) {
- rune_list *tmp = (rune_list *)xmalloc(sizeof(rune_list));
- tmp->min = i;
- tmp->max = i;
- add_map(map, tmp, list->map + (i - list->min));
- }
- }
- free(list);
- list = nlist;
- }
-}
-
-void
-add_map(map, list, flag)
- rune_map *map;
- rune_list *list;
- uint32_t flag;
-{
- int32_t i;
- rune_list *lr = 0;
- rune_list *r;
- int32_t run;
-
- while (list->min < _CACHED_RUNES && list->min <= list->max) {
- if (flag)
- map->map[list->min++] |= flag;
- else
- map->map[list->min++] = list->map++;
- }
-
- if (list->min > list->max) {
- free(list);
- return;
- }
-
- run = list->max - list->min + 1;
-
- if (!(r = map->root) || (list->max < r->min - 1)
- || (!flag && list->max == r->min - 1)) {
- if (flag) {
- list->types = xlalloc(run);
- for (i = 0; i < run; ++i)
- list->types[i] = flag;
- }
- list->next = map->root;
- map->root = list;
- return;
- }
-
- for (r = map->root; r && r->max + 1 < list->min; r = r->next)
- lr = r;
-
- if (!r) {
- /*
- * We are off the end.
- */
- if (flag) {
- list->types = xlalloc(run);
- for (i = 0; i < run; ++i)
- list->types[i] = flag;
- }
- list->next = 0;
- lr->next = list;
- return;
- }
-
- if (list->max < r->min - 1) {
- /*
- * We come before this range and we do not intersect it.
- * We are not before the root node, it was checked before the loop
- */
- if (flag) {
- list->types = xlalloc(run);
- for (i = 0; i < run; ++i)
- list->types[i] = flag;
- }
- list->next = lr->next;
- lr->next = list;
- return;
- }
-
- /*
- * At this point we have found that we at least intersect with
- * the range pointed to by `r', we might intersect with one or
- * more ranges beyond `r' as well.
- */
-
- if (!flag && list->map - list->min != r->map - r->min) {
- /*
- * There are only two cases when we are doing case maps and
- * our maps needn't have the same offset. When we are adjoining
- * but not intersecting.
- */
- if (list->max + 1 == r->min) {
- lr->next = list;
- list->next = r;
- return;
- }
- if (list->min - 1 == r->max) {
- list->next = r->next;
- r->next = list;
- return;
- }
- errx(1, "error: conflicting map entries");
- }
-
- if (list->min >= r->min && list->max <= r->max) {
- /*
- * Subset case.
- */
-
- if (flag) {
- for (i = list->min; i <= list->max; ++i)
- r->types[i - r->min] |= flag;
- }
- free(list);
- return;
- }
- if (list->min <= r->min && list->max >= r->max) {
- /*
- * Superset case. Make him big enough to hold us.
- * We might need to merge with the guy after him.
- */
- if (flag) {
- list->types = xlalloc(list->max - list->min + 1);
-
- for (i = list->min; i <= list->max; ++i)
- list->types[i - list->min] = flag;
-
- for (i = r->min; i <= r->max; ++i)
- list->types[i - list->min] |= r->types[i - r->min];
-
- free(r->types);
- r->types = list->types;
- } else {
- r->map = list->map;
- }
- r->min = list->min;
- r->max = list->max;
- free(list);
- } else if (list->min < r->min) {
- /*
- * Our tail intersects his head.
- */
- if (flag) {
- list->types = xlalloc(r->max - list->min + 1);
-
- for (i = r->min; i <= r->max; ++i)
- list->types[i - list->min] = r->types[i - r->min];
-
- for (i = list->min; i < r->min; ++i)
- list->types[i - list->min] = flag;
-
- for (i = r->min; i <= list->max; ++i)
- list->types[i - list->min] |= flag;
-
- free(r->types);
- r->types = list->types;
- } else {
- r->map = list->map;
- }
- r->min = list->min;
- free(list);
- return;
- } else {
- /*
- * Our head intersects his tail.
- * We might need to merge with the guy after him.
- */
- if (flag) {
- r->types = xrelalloc(r->types, list->max - r->min + 1);
-
- for (i = list->min; i <= r->max; ++i)
- r->types[i - r->min] |= flag;
-
- for (i = r->max+1; i <= list->max; ++i)
- r->types[i - r->min] = flag;
- }
- r->max = list->max;
- free(list);
- }
-
- /*
- * Okay, check to see if we grew into the next guy(s)
- */
- while ((lr = r->next) && r->max >= lr->min) {
- if (flag) {
- if (r->max >= lr->max) {
- /*
- * Good, we consumed all of him.
- */
- for (i = lr->min; i <= lr->max; ++i)
- r->types[i - r->min] |= lr->types[i - lr->min];
- } else {
- /*
- * "append" him on to the end of us.
- */
- r->types = xrelalloc(r->types, lr->max - r->min + 1);
-
- for (i = lr->min; i <= r->max; ++i)
- r->types[i - r->min] |= lr->types[i - lr->min];
-
- for (i = r->max+1; i <= lr->max; ++i)
- r->types[i - r->min] = lr->types[i - lr->min];
-
- r->max = lr->max;
- }
- } else {
- if (lr->max > r->max)
- r->max = lr->max;
- }
-
- r->next = lr->next;
-
- if (flag)
- free(lr->types);
- free(lr);
- }
-}
-
-static void
-dump_tables()
-{
- int x, first_d, curr_d;
- rune_list *list;
-
- /*
- * See if we can compress some of the istype arrays
- */
- for(list = types.root; list; list = list->next) {
- list->map = list->types[0];
- for (x = 1; x < list->max - list->min + 1; ++x) {
- if ((int32_t)list->types[x] != list->map) {
- list->map = 0;
- break;
- }
- }
- }
-
- first_d = curr_d = -1;
- for (x = 0; x < _CACHED_RUNES; ++x) {
- uint32_t r = types.map[x];
-
- if (r & _CTYPE_D) {
- if (first_d < 0)
- first_d = curr_d = x;
- else if (x != curr_d + 1)
- errx(1, "error: DIGIT range is not contiguous");
- else if (x - first_d > 9)
- errx(1, "error: DIGIT range is too big");
- else
- curr_d++;
- if (!(r & _CTYPE_X))
- errx(1,
- "error: DIGIT range is not a subset of XDIGIT range");
- }
- }
- if (first_d < 0)
- errx(1, "error: no DIGIT range defined in the single byte area");
- else if (curr_d - first_d < 9)
- errx(1, "error: DIGIT range is too small in the single byte area");
-
- /*
- * Fill in our tables. Do this in network order so that
- * diverse machines have a chance of sharing data.
- * (Machines like Crays cannot share with little machines due to
- * word size. Sigh. We tried.)
- */
- for (x = 0; x < _CACHED_RUNES; ++x) {
- new_locale.runetype[x] = htonl(types.map[x]);
- new_locale.maplower[x] = htonl(maplower.map[x]);
- new_locale.mapupper[x] = htonl(mapupper.map[x]);
- }
-
- /*
- * Count up how many ranges we will need for each of the extents.
- */
- list = types.root;
-
- while (list) {
- new_locale.runetype_ext_nranges++;
- list = list->next;
- }
- new_locale.runetype_ext_nranges =
- htonl(new_locale.runetype_ext_nranges);
-
- list = maplower.root;
-
- while (list) {
- new_locale.maplower_ext_nranges++;
- list = list->next;
- }
- new_locale.maplower_ext_nranges =
- htonl(new_locale.maplower_ext_nranges);
-
- list = mapupper.root;
-
- while (list) {
- new_locale.mapupper_ext_nranges++;
- list = list->next;
- }
- new_locale.mapupper_ext_nranges =
- htonl(new_locale.mapupper_ext_nranges);
-
- new_locale.variable_len = htonl(new_locale.variable_len);
-
- /*
- * Okay, we are now ready to write the new locale file.
- */
-
- /*
- * PART 1: The _FileRuneLocale structure
- */
- if (fwrite((char *)&new_locale, sizeof(new_locale), 1, fp) != 1) {
- perror(locale_file);
- exit(1);
- }
- /*
- * PART 2: The runetype_ext structures (not the actual tables)
- */
- list = types.root;
-
- while (list) {
- _FileRuneEntry re;
-
- re.min = htonl(list->min);
- re.max = htonl(list->max);
- re.map = htonl(list->map);
-
- if (fwrite((char *)&re, sizeof(re), 1, fp) != 1) {
- perror(locale_file);
- exit(1);
- }
-
- list = list->next;
- }
- /*
- * PART 3: The maplower_ext structures
- */
- list = maplower.root;
-
- while (list) {
- _FileRuneEntry re;
-
- re.min = htonl(list->min);
- re.max = htonl(list->max);
- re.map = htonl(list->map);
-
- if (fwrite((char *)&re, sizeof(re), 1, fp) != 1) {
- perror(locale_file);
- exit(1);
- }
-
- list = list->next;
- }
- /*
- * PART 4: The mapupper_ext structures
- */
- list = mapupper.root;
-
- while (list) {
- _FileRuneEntry re;
-
- re.min = htonl(list->min);
- re.max = htonl(list->max);
- re.map = htonl(list->map);
-
- if (fwrite((char *)&re, sizeof(re), 1, fp) != 1) {
- perror(locale_file);
- exit(1);
- }
-
- list = list->next;
- }
- /*
- * PART 5: The runetype_ext tables
- */
- list = types.root;
-
- while (list) {
- for (x = 0; x < list->max - list->min + 1; ++x)
- list->types[x] = htonl(list->types[x]);
-
- if (!list->map) {
- if (fwrite((char *)list->types,
- (list->max - list->min + 1) * sizeof(uint32_t),
- 1, fp) != 1) {
- perror(locale_file);
- exit(1);
- }
- }
- list = list->next;
- }
- /*
- * PART 6: And finally the variable data
- */
- if (fwrite(variable,
- ntohl(new_locale.variable_len), 1, fp) != 1) {
- perror(locale_file);
- exit(1);
- }
- if (fclose(fp) != 0) {
- perror(locale_file);
- exit(1);
- }
- fp = NULL;
-
- if (!debug)
- return;
-
- if (new_locale.encoding[0])
- fprintf(stderr, "ENCODING %s\n", new_locale.encoding);
- if (variable)
- fprintf(stderr, "VARIABLE %s\n", variable);
-
- fprintf(stderr, "\nMAPLOWER:\n\n");
-
- for (x = 0; x < _CACHED_RUNES; ++x) {
- if (isprint(maplower.map[x]))
- fprintf(stderr, " '%c'", (int)maplower.map[x]);
- else if (maplower.map[x])
- fprintf(stderr, "%04x", maplower.map[x]);
- else
- fprintf(stderr, "%4x", 0);
- if ((x & 0xf) == 0xf)
- fprintf(stderr, "\n");
- else
- fprintf(stderr, " ");
- }
- fprintf(stderr, "\n");
-
- for (list = maplower.root; list; list = list->next)
- fprintf(stderr, "\t%04x - %04x : %04x\n", list->min, list->max, list->map);
-
- fprintf(stderr, "\nMAPUPPER:\n\n");
-
- for (x = 0; x < _CACHED_RUNES; ++x) {
- if (isprint(mapupper.map[x]))
- fprintf(stderr, " '%c'", (int)mapupper.map[x]);
- else if (mapupper.map[x])
- fprintf(stderr, "%04x", mapupper.map[x]);
- else
- fprintf(stderr, "%4x", 0);
- if ((x & 0xf) == 0xf)
- fprintf(stderr, "\n");
- else
- fprintf(stderr, " ");
- }
- fprintf(stderr, "\n");
-
- for (list = mapupper.root; list; list = list->next)
- fprintf(stderr, "\t%04x - %04x : %04x\n", list->min, list->max, list->map);
-
-
- fprintf(stderr, "\nTYPES:\n\n");
-
- for (x = 0; x < _CACHED_RUNES; ++x) {
- uint32_t r = types.map[x];
-
- if (r) {
- if (isprint(x))
- fprintf(stderr, " '%c': %2d", x, (int)(r & 0xff));
- else
- fprintf(stderr, "%04x: %2d", x, (int)(r & 0xff));
-
- fprintf(stderr, " %4s", (r & _CTYPE_A) ? "alph" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_C) ? "ctrl" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_D) ? "dig" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_G) ? "graf" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_L) ? "low" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_P) ? "punc" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_S) ? "spac" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_U) ? "upp" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_X) ? "xdig" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_B) ? "blnk" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_R) ? "prnt" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_I) ? "ideo" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_T) ? "spec" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_Q) ? "phon" : "");
- fprintf(stderr, "\n");
- }
- }
-
- for (list = types.root; list; list = list->next) {
- if (list->map && list->min + 3 < list->max) {
- uint32_t r = list->map;
-
- fprintf(stderr, "%04x: %2d",
- (uint32_t)list->min, (int)(r & 0xff));
-
- fprintf(stderr, " %4s", (r & _CTYPE_A) ? "alph" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_C) ? "ctrl" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_D) ? "dig" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_G) ? "graf" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_L) ? "low" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_P) ? "punc" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_S) ? "spac" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_U) ? "upp" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_X) ? "xdig" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_B) ? "blnk" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_R) ? "prnt" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_I) ? "ideo" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_T) ? "spec" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_Q) ? "phon" : "");
- fprintf(stderr, "\n...\n");
-
- fprintf(stderr, "%04x: %2d",
- (uint32_t)list->max, (int)(r & 0xff));
-
- fprintf(stderr, " %4s", (r & _CTYPE_A) ? "alph" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_C) ? "ctrl" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_D) ? "dig" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_G) ? "graf" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_L) ? "low" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_P) ? "punc" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_S) ? "spac" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_U) ? "upp" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_X) ? "xdig" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_B) ? "blnk" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_R) ? "prnt" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_I) ? "ideo" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_T) ? "spec" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_Q) ? "phon" : "");
- fprintf(stderr, "\n");
- } else
- for (x = list->min; x <= list->max; ++x) {
- uint32_t r = ntohl(list->types[x - list->min]);
-
- if (r) {
- fprintf(stderr, "%04x: %2d", x, (int)(r & 0xff));
-
- fprintf(stderr, " %4s", (r & _CTYPE_A) ? "alph" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_C) ? "ctrl" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_D) ? "dig" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_G) ? "graf" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_L) ? "low" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_P) ? "punc" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_S) ? "spac" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_U) ? "upp" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_X) ? "xdig" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_B) ? "blnk" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_R) ? "prnt" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_I) ? "ideo" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_T) ? "spec" : "");
- fprintf(stderr, " %4s", (r & _CTYPE_Q) ? "phon" : "");
- fprintf(stderr, "\n");
- }
- }
- }
-}
diff --git a/usr.bin/mkstr/Makefile b/usr.bin/mkstr/Makefile
deleted file mode 100644
index 805c013..0000000
--- a/usr.bin/mkstr/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= mkstr
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/mkstr/mkstr.1 b/usr.bin/mkstr/mkstr.1
deleted file mode 100644
index 7435a25..0000000
--- a/usr.bin/mkstr/mkstr.1
+++ /dev/null
@@ -1,134 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)mkstr.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd November 1, 2002
-.Dt MKSTR 1
-.Os
-.Sh NAME
-.Nm mkstr
-.Nd create an error message file by massaging C source
-.Sh SYNOPSIS
-.Nm
-.Op Fl
-.Ar mesgfile
-.Ar prefix Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility creates a file containing error messages extracted from C source,
-and restructures the same C source, to utilize the created error message
-file.
-The intent of
-.Nm
-was to reduce the size of large programs and
-reduce swapping (see
-.Sx BUGS
-section below).
-.Pp
-The
-.Nm
-utility processes each of the specified files,
-placing a restructured version of the input in a file whose name
-consists of the specified
-.Ar prefix
-and the original name.
-A typical usage of
-.Nm
-is
-.Pp
-.Dl "mkstr pistrings xx *.c"
-.Pp
-This command causes all the error messages from the C source
-files in the current directory to be placed in the file
-.Pa pistrings
-and restructured copies of the sources to be placed in
-files whose names are prefixed with
-.Dq Li xx .
-.Pp
-Options:
-.Bl -tag -width indent
-.It Fl
-Error messages are placed at the end of the specified
-message file for recompiling part of a large
-.Nm Ns ed
-program.
-.El
-.Pp
-The
-.Nm
-utility finds error messages in the source by
-searching for the string
-.Sq Li error("
-in the input stream.
-Each time it occurs, the C string starting at the
-.Ql \&"
-is stored
-in the message file followed by a null character and a new-line character;
-The new source is restructured with
-.Xr lseek 2
-pointers into the error message file for retrieval.
-.Bd -literal -offset indent
-char efilname = "/usr/lib/pi_strings";
-int efil = -1;
-
-error(a1, a2, a3, a4)
-{
- char buf[256];
-
- if (efil < 0) {
- efil = open(efilname, 0);
- if (efil < 0)
- err(1, "%s", efilname);
- }
- if (lseek(efil, (off_t)a1, SEEK_SET) < 0 ||
- read(efil, buf, 256) <= 0)
- err(1, "%s", efilname);
- printf(buf, a2, a3, a4);
-}
-.Ed
-.Sh SEE ALSO
-.Xr gencat 1 ,
-.Xr xstr 1 ,
-.Xr lseek 2
-.Sh HISTORY
-An
-.Nm
-utility appeared in
-.Bx 3.0 .
-.Sh BUGS
-The
-.Nm
-utility was intended for the limited architecture of the PDP 11 family.
-Very few programs actually use it.
-The memory savings are negligible in modern computers.
diff --git a/usr.bin/mkstr/mkstr.c b/usr.bin/mkstr/mkstr.c
deleted file mode 100644
index ce61c9d..0000000
--- a/usr.bin/mkstr/mkstr.c
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)mkstr.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define ungetchar(c) ungetc(c, stdin)
-
-/*
- * mkstr - create a string error message file by massaging C source
- *
- * Bill Joy UCB August 1977
- *
- * Modified March 1978 to hash old messages to be able to recompile
- * without addding messages to the message file (usually)
- *
- * Based on an earlier program conceived by Bill Joy and Chuck Haley
- *
- * Program to create a string error message file
- * from a group of C programs. Arguments are the name
- * of the file where the strings are to be placed, the
- * prefix of the new files where the processed source text
- * is to be placed, and the files to be processed.
- *
- * The program looks for 'error("' in the source stream.
- * Whenever it finds this, the following characters from the '"'
- * to a '"' are replaced by 'seekpt' where seekpt is a
- * pointer into the error message file.
- * If the '(' is not immediately followed by a '"' no change occurs.
- *
- * The optional '-' causes strings to be added at the end of the
- * existing error message file for recompilation of single routines.
- */
-
-FILE *mesgread, *mesgwrite;
-char name[100], *np;
-
-void copystr(void);
-int fgetNUL(char *, int, FILE *);
-unsigned hashit(char *, int, unsigned);
-void inithash(void);
-int match(const char *);
-int octdigit(char);
-void process(void);
-void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- char addon = 0;
- size_t namelen;
-
- argc--, argv++;
- if (argc > 1 && argv[0][0] == '-')
- addon++, argc--, argv++;
- if (argc < 3)
- usage();
- mesgwrite = fopen(argv[0], addon ? "a" : "w");
- if (mesgwrite == NULL)
- err(1, "%s", argv[0]);
- mesgread = fopen(argv[0], "r");
- if (mesgread == NULL)
- err(1, "%s", argv[0]);
- inithash();
- argc--, argv++;
- namelen = strlcpy(name, argv[0], sizeof(name));
- if (namelen >= sizeof(name)) {
- errno = ENAMETOOLONG;
- err(1, "%s", argv[0]);
- }
- np = name + namelen;
- argc--, argv++;
- do {
- if (strlcpy(np, argv[0], sizeof(name) - namelen) >=
- sizeof(name) - namelen) {
- errno = ENAMETOOLONG;
- err(1, "%s%s", name, argv[0]);
- }
- if (freopen(name, "w", stdout) == NULL)
- err(1, "%s", name);
- if (freopen(argv[0], "r", stdin) == NULL)
- err(1, "%s", argv[0]);
- process();
- argc--, argv++;
- } while (argc > 0);
- exit(0);
-}
-
-void
-usage(void)
-{
- fprintf(stderr, "usage: mkstr [-] mesgfile prefix file ...\n");
- exit(1);
-}
-
-void
-process(void)
-{
- int c;
-
- for (;;) {
- c = getchar();
- if (c == EOF)
- return;
- if (c != 'e') {
- putchar(c);
- continue;
- }
- if (match("error(")) {
- printf("error(");
- c = getchar();
- if (c != '"')
- putchar(c);
- else
- copystr();
- }
- }
-}
-
-int
-match(const char *ocp)
-{
- const char *cp;
- int c;
-
- for (cp = ocp + 1; *cp; cp++) {
- c = getchar();
- if (c != *cp) {
- while (ocp < cp)
- putchar(*ocp++);
- ungetchar(c);
- return (0);
- }
- }
- return (1);
-}
-
-void
-copystr(void)
-{
- int c, ch;
- char buf[512];
- char *cp = buf;
-
- for (;;) {
- if (cp == buf + sizeof(buf) - 2)
- errx(1, "message too long");
- c = getchar();
- if (c == EOF)
- break;
- switch (c) {
-
- case '"':
- *cp++ = 0;
- goto out;
- case '\\':
- c = getchar();
- switch (c) {
-
- case 'b':
- c = '\b';
- break;
- case 't':
- c = '\t';
- break;
- case 'r':
- c = '\r';
- break;
- case 'n':
- c = '\n';
- break;
- case '\n':
- continue;
- case 'f':
- c = '\f';
- break;
- case '0':
- c = 0;
- break;
- case '\\':
- break;
- default:
- if (!octdigit(c))
- break;
- c -= '0';
- ch = getchar();
- if (!octdigit(ch))
- break;
- c <<= 7, c += ch - '0';
- ch = getchar();
- if (!octdigit(ch))
- break;
- c <<= 3, c+= ch - '0', ch = -1;
- break;
- }
- }
- *cp++ = c;
- }
-out:
- *cp = 0;
- printf("%d", hashit(buf, 1, 0));
-}
-
-int
-octdigit(char c)
-{
-
- return (c >= '0' && c <= '7');
-}
-
-void
-inithash(void)
-{
- char buf[512];
- int mesgpt = 0;
-
- rewind(mesgread);
- while (fgetNUL(buf, sizeof buf, mesgread) != 0) {
- hashit(buf, 0, mesgpt);
- mesgpt += strlen(buf) + 2;
- }
-}
-
-#define NBUCKETS 511
-
-struct hash {
- long hval;
- unsigned hpt;
- struct hash *hnext;
-} *bucket[NBUCKETS];
-
-unsigned
-hashit(char *str, int really, unsigned fakept)
-{
- int i;
- struct hash *hp;
- char buf[512];
- long hashval = 0;
- char *cp;
-
- if (really)
- fflush(mesgwrite);
- for (cp = str; *cp;)
- hashval = (hashval << 1) + *cp++;
- i = hashval % NBUCKETS;
- if (i < 0)
- i += NBUCKETS;
- if (really != 0)
- for (hp = bucket[i]; hp != 0; hp = hp->hnext)
- if (hp->hval == hashval) {
- fseek(mesgread, (long) hp->hpt, 0);
- fgetNUL(buf, sizeof buf, mesgread);
-/*
- fprintf(stderr, "Got (from %d) %s\n", hp->hpt, buf);
-*/
- if (strcmp(buf, str) == 0)
- break;
- }
- if (!really || hp == 0) {
- hp = (struct hash *) calloc(1, sizeof *hp);
- if (hp == NULL)
- err(1, NULL);
- hp->hnext = bucket[i];
- hp->hval = hashval;
- hp->hpt = really ? ftell(mesgwrite) : fakept;
- if (really) {
- fwrite(str, sizeof (char), strlen(str) + 1, mesgwrite);
- fwrite("\n", sizeof (char), 1, mesgwrite);
- }
- bucket[i] = hp;
- }
-/*
- fprintf(stderr, "%s hashed to %ld at %d\n", str, hp->hval, hp->hpt);
-*/
- return (hp->hpt);
-}
-
-int
-fgetNUL(char *obuf, int rmdr, FILE *file)
-{
- int c;
- char *buf = obuf;
-
- while (--rmdr > 0 && (c = getc(file)) != 0 && c != EOF)
- *buf++ = c;
- *buf++ = 0;
- getc(file);
- return ((feof(file) || ferror(file)) ? 0 : 1);
-}
diff --git a/usr.bin/mktemp/Makefile b/usr.bin/mktemp/Makefile
deleted file mode 100644
index 76ebee6..0000000
--- a/usr.bin/mktemp/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-PROG= mktemp
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/mktemp/mktemp.1 b/usr.bin/mktemp/mktemp.1
deleted file mode 100644
index 6e35759..0000000
--- a/usr.bin/mktemp/mktemp.1
+++ /dev/null
@@ -1,206 +0,0 @@
-.\" Copyright (c) 1989, 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" From: $OpenBSD: mktemp.1,v 1.8 1998/03/19 06:13:37 millert Exp $
-.\" $FreeBSD$
-.\"
-.Dd December 30, 2005
-.Dt MKTEMP 1
-.Os
-.Sh NAME
-.Nm mktemp
-.Nd make temporary file name (unique)
-.Sh SYNOPSIS
-.Nm
-.Op Fl d
-.Op Fl q
-.Op Fl t Ar prefix
-.Op Fl u
-.Ar template ...
-.Nm
-.Op Fl d
-.Op Fl q
-.Op Fl u
-.Fl t Ar prefix
-.Sh DESCRIPTION
-The
-.Nm
-utility takes each of the given file name templates and overwrites a
-portion of it to create a file name.
-This file name is unique
-and suitable for use by the application.
-The template may be
-any file name with some number of
-.Ql X Ns s
-appended
-to it, for example
-.Pa /tmp/temp.XXXX .
-The trailing
-.Ql X Ns s
-are replaced with the current process number and/or a
-unique letter combination.
-The number of unique file names
-.Nm
-can return depends on the number of
-.Ql X Ns s
-provided; six
-.Ql X Ns s
-will
-result in
-.Nm
-selecting 1 of 56800235584 (62 ** 6) possible file names.
-.Pp
-If
-.Nm
-can successfully generate a unique file name, the file
-is created with mode 0600 (unless the
-.Fl u
-flag is given) and the filename is printed
-to standard output.
-.Pp
-If the
-.Fl t Ar prefix
-option is given,
-.Nm
-will generate a template string based on the
-.Ar prefix
-and the
-.Ev TMPDIR
-environment variable if set.
-The default location if
-.Ev TMPDIR
-is not set is
-.Pa /tmp .
-Care should
-be taken to ensure that it is appropriate to use an environment variable
-potentially supplied by the user.
-.Pp
-Any number of temporary files may be created in a single invocation,
-including one based on the internal template resulting from the
-.Fl t
-flag.
-.Pp
-The
-.Nm
-utility is provided to allow shell scripts to safely use temporary files.
-Traditionally, many shell scripts take the name of the program with
-the pid as a suffix and use that as a temporary file name.
-This
-kind of naming scheme is predictable and the race condition it creates
-is easy for an attacker to win.
-A safer, though still inferior, approach
-is to make a temporary directory using the same naming scheme.
-While
-this does allow one to guarantee that a temporary file will not be
-subverted, it still allows a simple denial of service attack.
-For these
-reasons it is suggested that
-.Nm
-be used instead.
-.Sh OPTIONS
-The available options are as follows:
-.Bl -tag -width indent
-.It Fl d
-Make a directory instead of a file.
-.It Fl q
-Fail silently if an error occurs.
-This is useful if
-a script does not want error output to go to standard error.
-.It Fl t Ar prefix
-Generate a template (using the supplied
-.Ar prefix
-and
-.Ev TMPDIR
-if set) to create a filename template.
-.It Fl u
-Operate in
-.Dq unsafe
-mode.
-The temp file will be unlinked before
-.Nm
-exits.
-This is slightly better than
-.Xr mktemp 3
-but still introduces a race condition.
-Use of this
-option is not encouraged.
-.El
-.Sh EXIT STATUS
-The
-.Nm
-utility
-exits 0 on success, and 1 if an error occurs.
-.Sh EXAMPLES
-The following
-.Xr sh 1
-fragment illustrates a simple use of
-.Nm
-where the script should quit if it cannot get a safe
-temporary file.
-.Bd -literal -offset indent
-tempfoo=`basename $0`
-TMPFILE=`mktemp /tmp/${tempfoo}.XXXXXX` || exit 1
-echo "program output" >> $TMPFILE
-.Ed
-.Pp
-To allow the use of $TMPDIR:
-.Bd -literal -offset indent
-tempfoo=`basename $0`
-TMPFILE=`mktemp -t ${tempfoo}` || exit 1
-echo "program output" >> $TMPFILE
-.Ed
-.Pp
-In this case, we want the script to catch the error itself.
-.Bd -literal -offset indent
-tempfoo=`basename $0`
-TMPFILE=`mktemp -q /tmp/${tempfoo}.XXXXXX`
-if [ $? -ne 0 ]; then
- echo "$0: Can't create temp file, exiting..."
- exit 1
-fi
-.Ed
-.Sh SEE ALSO
-.Xr mkdtemp 3 ,
-.Xr mkstemp 3 ,
-.Xr mktemp 3 ,
-.Xr environ 7
-.Sh HISTORY
-A
-.Nm
-utility appeared in
-.Ox 2.1 .
-This implementation was written independently based on the
-.Ox
-man page, and
-first appeared in
-.Fx 2.2.7 .
-This man page is taken from
-.Ox .
diff --git a/usr.bin/mktemp/mktemp.c b/usr.bin/mktemp/mktemp.c
deleted file mode 100644
index b58ac4b..0000000
--- a/usr.bin/mktemp/mktemp.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/*-
- * Copyright (c) 1994, 1995, 1996, 1998 Peter Wemm <peter@netplex.com.au>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- */
-
-/*
- * This program was originally written long ago, originally for a non
- * BSD-like OS without mkstemp(). It's been modified over the years
- * to use mkstemp() rather than the original O_CREAT|O_EXCL/fstat/lstat
- * etc style hacks.
- * A cleanup, misc options and mkdtemp() calls were added to try and work
- * more like the OpenBSD version - which was first to publish the interface.
- */
-
-#include <err.h>
-#include <paths.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifndef lint
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-static void usage(void);
-
-int
-main(int argc, char **argv)
-{
- int c, fd, ret;
- char *tmpdir;
- const char *prefix;
- char *name;
- int dflag, qflag, tflag, uflag;
-
- ret = dflag = qflag = tflag = uflag = 0;
- prefix = "mktemp";
- name = NULL;
-
- while ((c = getopt(argc, argv, "dqt:u")) != -1)
- switch (c) {
- case 'd':
- dflag++;
- break;
-
- case 'q':
- qflag++;
- break;
-
- case 't':
- prefix = optarg;
- tflag++;
- break;
-
- case 'u':
- uflag++;
- break;
-
- default:
- usage();
- }
-
- argc -= optind;
- argv += optind;
-
- if (tflag) {
- tmpdir = getenv("TMPDIR");
- if (tmpdir == NULL)
- asprintf(&name, "%s%s.XXXXXXXX", _PATH_TMP, prefix);
- else
- asprintf(&name, "%s/%s.XXXXXXXX", tmpdir, prefix);
- /* if this fails, the program is in big trouble already */
- if (name == NULL) {
- if (qflag)
- return (1);
- else
- errx(1, "cannot generate template");
- }
- } else if (argc < 1) {
- usage();
- }
-
- /* generate all requested files */
- while (name != NULL || argc > 0) {
- if (name == NULL) {
- name = strdup(argv[0]);
- argv++;
- argc--;
- }
-
- if (dflag) {
- if (mkdtemp(name) == NULL) {
- ret = 1;
- if (!qflag)
- warn("mkdtemp failed on %s", name);
- } else {
- printf("%s\n", name);
- if (uflag)
- rmdir(name);
- }
- } else {
- fd = mkstemp(name);
- if (fd < 0) {
- ret = 1;
- if (!qflag)
- warn("mkstemp failed on %s", name);
- } else {
- close(fd);
- if (uflag)
- unlink(name);
- printf("%s\n", name);
- }
- }
- if (name)
- free(name);
- name = NULL;
- }
- return (ret);
-}
-
-static void
-usage()
-{
- fprintf(stderr,
- "usage: mktemp [-d] [-q] [-t prefix] [-u] template ...\n");
- fprintf(stderr,
- " mktemp [-d] [-q] [-u] -t prefix \n");
- exit (1);
-}
diff --git a/usr.bin/mkuzip/Makefile b/usr.bin/mkuzip/Makefile
deleted file mode 100644
index 11ed083..0000000
--- a/usr.bin/mkuzip/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-# $FreeBSD$
-
-PROG= mkuzip
-MAN= mkuzip.8
-
-DPADD= ${LIBZ}
-LDADD= -lz
-
-WARNS?= 6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/mkuzip/mkuzip.8 b/usr.bin/mkuzip/mkuzip.8
deleted file mode 100644
index 37d86ba..0000000
--- a/usr.bin/mkuzip/mkuzip.8
+++ /dev/null
@@ -1,106 +0,0 @@
-.\" ----------------------------------------------------------------------------
-.\" "THE BEER-WARE LICENSE" (Revision 42):
-.\" <sobomax@FreeBSD.ORG> wrote this file. As long as you retain this notice you
-.\" can do whatever you want with this stuff. If we meet some day, and you think
-.\" this stuff is worth it, you can buy me a beer in return. Maxim Sobolev
-.\" ----------------------------------------------------------------------------
-.\"
-.\" $FreeBSD$
-.\"
-.Dd March 17, 2006
-.Dt MKUZIP 8
-.Os
-.Sh NAME
-.Nm mkuzip
-.Nd compress disk image for use with
-.Xr geom_uzip 4
-class
-.Sh SYNOPSIS
-.Nm
-.Op Fl v
-.Op Fl o Ar outfile
-.Op Fl s Ar cluster_size
-.Ar infile
-.Sh DESCRIPTION
-The
-.Nm
-utility compresses a disk image file so that the
-.Xr geom_uzip 4
-class will be able to decompress the resulting image at run-time.
-This allows for a significant reduction of size of disk image at
-the expense of some CPU time required to decompress the data each
-time it is read.
-The
-.Nm
-utility
-works in two phases:
-.Bl -enum
-.It
-An
-.Ar infile
-image is split into clusters; each cluster is compressed using
-.Xr zlib 3 .
-.It
-The resulting set of compressed clusters along with headers that allow
-locating each individual cluster is written to the output file.
-.El
-.Pp
-The options are:
-.Bl -tag -width indent
-.It Fl o Ar outfile
-Name of the output file
-.Ar outfile .
-The default is to use the input name with the suffix
-.Pa .uzip .
-.It Fl s Ar cluster_size
-Split the image into clusters of
-.Ar cluster_size
-bytes, 16384 bytes by default.
-The
-.Ar cluster_size
-should be a multiple of 512 bytes.
-.It Fl v
-Display verbose messages.
-.El
-.Sh NOTES
-The compression ratio largely depends on the cluster size used.
-.\" The following two sentences are unclear: how can gzip(1) be
-.\" used in a comparable fashion, and wouldn't a gzip-compressed
-.\" image suffer from larger cluster sizes as well?
-For large cluster sizes (16K and higher), typical compression ratios
-are only 1-2% less than those achieved with
-.Xr gzip 1 .
-However, it should be kept in mind that larger cluster
-sizes lead to higher overhead in the
-.Xr geom_uzip 4
-class, as the class has to decompress the whole cluster even if
-only a few bytes from that cluster have to be read.
-.Pp
-The
-.Nm
-utility
-inserts a short shell script at the beginning of the generated image,
-which makes it possible to
-.Dq run
-the image just like any other shell script.
-The script tries to load the
-.Xr geom_uzip 4
-class if it is not loaded, configure the image as an
-.Xr md 4
-disk device using
-.Xr mdconfig 8 ,
-and automatically mount it using
-.Xr mount_cd9660 8
-on the mount point provided as the first argument to the script.
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr gzip 1 ,
-.Xr zlib 3 ,
-.Xr geom 4 ,
-.Xr geom_uzip 4 ,
-.Xr md 4 ,
-.Xr mdconfig 8 ,
-.Xr mount_cd9660 8
-.Sh AUTHORS
-.An Maxim Sobolev Aq sobomax@FreeBSD.org
diff --git a/usr.bin/mkuzip/mkuzip.c b/usr.bin/mkuzip/mkuzip.c
deleted file mode 100644
index 02ebefa..0000000
--- a/usr.bin/mkuzip/mkuzip.c
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * ----------------------------------------------------------------------------
- * "THE BEER-WARE LICENSE" (Revision 42):
- * <sobomax@FreeBSD.ORG> wrote this file. As long as you retain this notice you
- * can do whatever you want with this stuff. If we meet some day, and you think
- * this stuff is worth it, you can buy me a beer in return. Maxim Sobolev
- * ----------------------------------------------------------------------------
- *
- * $FreeBSD$
- *
- */
-
-#include <sys/types.h>
-#include <sys/disk.h>
-#include <sys/endian.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/uio.h>
-#include <netinet/in.h>
-#include <zlib.h>
-#include <err.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#define CLSTSIZE 16384
-#define DEFAULT_SUFX ".uzip"
-
-#define CLOOP_MAGIC_LEN 128
-static char CLOOP_MAGIC_START[] = "#!/bin/sh\n#V2.0 Format\n"
- "m=geom_uzip\n(kldstat -m $m 2>&-||kldload $m)>&-&&"
- "mount_cd9660 /dev/`mdconfig -af $0`.uzip $1\nexit $?\n";
-
-static char *readblock(int, char *, u_int32_t);
-static void usage(void);
-static void *safe_malloc(size_t);
-static void cleanup(void);
-
-static char *cleanfile = NULL;
-
-int main(int argc, char **argv)
-{
- char *iname, *oname, *obuf, *ibuf;
- uint64_t *toc;
- int fdr, fdw, i, opt, verbose, tmp;
- struct iovec iov[2];
- struct stat sb;
- uLongf destlen;
- uint64_t offset;
- struct cloop_header {
- char magic[CLOOP_MAGIC_LEN]; /* cloop magic */
- uint32_t blksz; /* block size */
- uint32_t nblocks; /* number of blocks */
- } hdr;
-
- memset(&hdr, 0, sizeof(hdr));
- hdr.blksz = CLSTSIZE;
- strcpy(hdr.magic, CLOOP_MAGIC_START);
- oname = NULL;
- verbose = 0;
-
- while((opt = getopt(argc, argv, "o:s:v")) != -1) {
- switch(opt) {
- case 'o':
- oname = optarg;
- break;
-
- case 's':
- tmp = atoi(optarg);
- if (tmp <= 0) {
- errx(1, "invalid cluster size specified: %s",
- optarg);
- /* Not reached */
- }
- if (tmp % DEV_BSIZE != 0) {
- errx(1, "cluster size should be multiple of %d",
- DEV_BSIZE);
- /* Not reached */
- }
- if (compressBound(tmp) > MAXPHYS) {
- errx(1, "cluster size is too large");
- /* Not reached */
- }
- hdr.blksz = tmp;
- break;
-
- case 'v':
- verbose = 1;
- break;
-
- default:
- usage();
- /* Not reached */
- }
- }
- argc -= optind;
- argv += optind;
-
- if (argc != 1) {
- usage();
- /* Not reached */
- }
-
- iname = argv[0];
- if (oname == NULL) {
- asprintf(&oname, "%s%s", iname, DEFAULT_SUFX);
- if (oname == NULL) {
- err(1, "can't allocate memory");
- /* Not reached */
- }
- }
-
- obuf = safe_malloc(compressBound(hdr.blksz));
- ibuf = safe_malloc(hdr.blksz);
-
- signal(SIGHUP, exit);
- signal(SIGINT, exit);
- signal(SIGTERM, exit);
- signal(SIGXCPU, exit);
- signal(SIGXFSZ, exit);
- atexit(cleanup);
-
- fdr = open(iname, O_RDONLY);
- if (fdr < 0) {
- err(1, "open(%s)", iname);
- /* Not reached */
- }
- if (fstat(fdr, &sb) != 0) {
- err(1, "fstat(%s)", iname);
- /* Not reached */
- }
- if (S_ISCHR(sb.st_mode)) {
- off_t ms;
-
- if (ioctl(fdr, DIOCGMEDIASIZE, &ms) < 0) {
- err(1, "ioctl(DIOCGMEDIASIZE)");
- /* Not reached */
- }
- sb.st_size = ms;
- } else if (!S_ISREG(sb.st_mode)) {
- fprintf(stderr, "%s: not a character device or regular file\n",
- iname);
- exit(1);
- }
- hdr.nblocks = sb.st_size / hdr.blksz;
- if ((sb.st_size % hdr.blksz) != 0) {
- if (verbose != 0)
- fprintf(stderr, "file size is not multiple "
- "of %d, padding data\n", hdr.blksz);
- hdr.nblocks++;
- }
- toc = safe_malloc((hdr.nblocks + 1) * sizeof(*toc));
-
- fdw = open(oname, O_WRONLY | O_TRUNC | O_CREAT,
- S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
- if (fdw < 0) {
- err(1, "open(%s)", oname);
- /* Not reached */
- }
- cleanfile = oname;
-
- /* Prepare header that we will write later when we have index ready. */
- iov[0].iov_base = (char *)&hdr;
- iov[0].iov_len = sizeof(hdr);
- iov[1].iov_base = (char *)toc;
- iov[1].iov_len = (hdr.nblocks + 1) * sizeof(*toc);
- offset = iov[0].iov_len + iov[1].iov_len;
-
- /* Reserve space for header */
- lseek(fdw, offset, SEEK_SET);
-
- if (verbose != 0)
- fprintf(stderr, "data size %ju bytes, number of clusters "
- "%u, index length %zu bytes\n", sb.st_size,
- hdr.nblocks, iov[1].iov_len);
-
- for(i = 0; i == 0 || ibuf != NULL; i++) {
- ibuf = readblock(fdr, ibuf, hdr.blksz);
- if (ibuf != NULL) {
- destlen = compressBound(hdr.blksz);
- if (compress2(obuf, &destlen, ibuf, hdr.blksz,
- Z_BEST_COMPRESSION) != Z_OK) {
- errx(1, "can't compress data: compress2() "
- "failed");
- /* Not reached */
- }
- if (verbose != 0)
- fprintf(stderr, "cluster #%d, in %u bytes, "
- "out %lu bytes\n", i, hdr.blksz, destlen);
- } else {
- destlen = DEV_BSIZE - (offset % DEV_BSIZE);
- memset(obuf, 0, destlen);
- if (verbose != 0)
- fprintf(stderr, "padding data with %lu bytes so "
- "that file size is multiple of %d\n", destlen,
- DEV_BSIZE);
- }
- if (write(fdw, obuf, destlen) < 0) {
- err(1, "write(%s)", oname);
- /* Not reached */
- }
- toc[i] = htobe64(offset);
- offset += destlen;
- }
- close(fdr);
-
- if (verbose != 0)
- fprintf(stderr, "compressed data to %ju bytes, saved %lld "
- "bytes, %.2f%% decrease.\n", offset, (long long)(sb.st_size - offset),
- 100.0 * (long long)(sb.st_size - offset) / (float)sb.st_size);
-
- /* Convert to big endian */
- hdr.blksz = htonl(hdr.blksz);
- hdr.nblocks = htonl(hdr.nblocks);
- /* Write headers into pre-allocated space */
- lseek(fdw, 0, SEEK_SET);
- if (writev(fdw, iov, 2) < 0) {
- err(1, "writev(%s)", oname);
- /* Not reached */
- }
- cleanfile = NULL;
- close(fdw);
-
- exit(0);
-}
-
-static char *
-readblock(int fd, char *ibuf, u_int32_t clstsize)
-{
- int numread;
-
- bzero(ibuf, clstsize);
- numread = read(fd, ibuf, clstsize);
- if (numread < 0) {
- err(1, "read() failed");
- /* Not reached */
- }
- if (numread == 0) {
- return NULL;
- }
- return ibuf;
-}
-
-static void
-usage(void)
-{
-
- fprintf(stderr, "usage: mkuzip [-v] [-o outfile] [-s cluster_size] infile\n");
- exit(1);
-}
-
-static void *
-safe_malloc(size_t size)
-{
- void *retval;
-
- retval = malloc(size);
- if (retval == NULL) {
- err(1, "can't allocate memory");
- /* Not reached */
- }
- return retval;
-}
-
-static void
-cleanup(void)
-{
-
- if (cleanfile != NULL)
- unlink(cleanfile);
-}
diff --git a/usr.bin/msgs/Makefile b/usr.bin/msgs/Makefile
deleted file mode 100644
index 9f59c6a..0000000
--- a/usr.bin/msgs/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= msgs
-WARNS?= 6
-DPADD= ${LIBTERMCAP}
-LDADD= -ltermcap
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/msgs/msgs.1 b/usr.bin/msgs/msgs.1
deleted file mode 100644
index 147f8c9..0000000
--- a/usr.bin/msgs/msgs.1
+++ /dev/null
@@ -1,236 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)msgs.1 8.2 (Berkeley) 4/28/95
-.\" $FreeBSD$
-.\"
-.Dd April 28, 1995
-.Dt MSGS 1
-.Os
-.Sh NAME
-.Nm msgs
-.Nd system messages and junk mail program
-.Sh SYNOPSIS
-.Nm
-.Op Fl fhlpq
-.Op Ar number
-.Op Ar \-number
-.Nm
-.Op Fl s
-.Nm
-.Op Fl c
-.Op \-days
-.Sh DESCRIPTION
-The
-.Nm
-utility is used to read system messages.
-These messages are
-sent by mailing to the login `msgs' and should be short
-pieces of information which are suitable to be read once by most users
-of the system.
-.Pp
-The
-.Nm
-utility is normally invoked each time you login, by placing it in the file
-.Pa .login
-(or
-.Pa .profile
-if you use
-.Xr sh 1 ) .
-It will then prompt you with the source and subject of each new message.
-If there is no subject line, the first few non-blank lines of the
-message will be displayed.
-If there is more to the message, you will be told how
-long it is and asked whether you wish to see the rest of the message.
-The possible responses are:
-.Bl -tag -width Fl
-.It Fl y
-Type the rest of the message.
-.It Ic RETURN
-Synonym for y.
-.It Fl n
-Skip this message
-and go on to the next message.
-.It Fl
-Redisplay the last message.
-.It Fl q
-Drop out of
-.Nm ;
-the next time
-.Nm
-will pick up where it last left off.
-.It Fl s
-Append the current message to the file ``Messages'' in the current directory;
-`s\-' will save the previously displayed message.
-A `s' or `s\-' may
-be followed by a space and a file name to receive the message replacing
-the default ``Messages''.
-.It Fl m
-A copy of the specified message is placed in a temporary
-mailbox and
-.Xr mail 1
-is invoked on that mailbox.
-Both `m' and `s' accept a numeric argument in place of the `\-'.
-.El
-.Pp
-The
-.Nm
-utility keeps track of the next message you will see by a number in the file
-.Pa \&.msgsrc
-in your home directory.
-In the directory
-.Pa /var/msgs
-it keeps a set of files whose names are the (sequential) numbers
-of the messages they represent.
-The file
-.Pa /var/msgs/bounds
-shows the low and high number of the messages in the directory
-so that
-.Nm
-can quickly determine if there are no messages for you.
-If the contents of
-.Pa bounds
-is incorrect it can be fixed by removing it;
-.Nm
-will make a new
-.Pa bounds
-file the next time it is run with the
-.Fl s
-option.
-If
-.Nm
-is run with any option other than
-.Fl s ,
-an error will be displayed if
-.Pa /var/msgs/bounds
-does not exist.
-.Pp
-The
-.Fl s
-option is used for setting up the posting of messages.
-The line
-.Pp
-.Dl msgs: \&"\&| /usr/bin/msgs \-s\&"
-.Pp
-should be included in
-.Pa /etc/mail/aliases
-(see
-.Xr newaliases 1 )
-to enable posting of messages.
-.Pp
-The
-.Fl c
-option is used for performing cleanup on
-.Pa /var/msgs .
-A shell script entry to run
-.Nm
-with the
-.Fl c
-option should be placed in
-.Pa /etc/periodic/daily
-(see
-.Xr periodic 8 )
-to run every night.
-This will remove all messages over 21 days old.
-A different expiration may be specified on the command line to override
-the default.
-You must be the superuser to use this option.
-.Pp
-Options when reading messages include:
-.Bl -tag -width Fl
-.It Fl f
-Do not say ``No new messages.''.
-This is useful in a
-.Pa .login
-file since this is often the case here.
-.It Fl q
-Queries whether there are messages, printing
-``There are new messages.'' if there are.
-The command ``msgs \-q'' is often used in login scripts.
-.It Fl h
-Print the first part of messages only.
-.It Fl l
-Cause only locally originated messages to be reported.
-.It Ar num
-A message number can be given
-on the command line, causing
-.Nm
-to start at the specified message rather than at the next message
-indicated by your
-.Pa \&.msgsrc
-file.
-Thus
-.Pp
-.Dl msgs \-h 1
-.Pp
-prints the first part of all messages.
-.It Ar \-number
-Start
-.Ar number
-messages back from the one indicated in the
-.Pa \&.msgsrc
-file, useful for reviews of recent messages.
-.It Fl p
-Pipe long messages through
-.Xr more 1 .
-.El
-.Pp
-Within
-.Nm
-you can also go to any specific message by typing its number when
-.Nm
-requests input as to what to do.
-.Sh ENVIRONMENT
-The
-.Nm
-utility uses the
-.Ev HOME
-and
-.Ev TERM
-environment variables for the default home directory and
-terminal type.
-.Sh FILES
-.Bl -tag -width /var/msgs/* -compact
-.It Pa /var/msgs/*
-database
-.It Pa ~/.msgsrc
-number of next message to be presented
-.El
-.Sh SEE ALSO
-.Xr mail 1 ,
-.Xr more 1 ,
-.Xr aliases 5 ,
-.Xr periodic 8
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3.0 .
diff --git a/usr.bin/msgs/msgs.c b/usr.bin/msgs/msgs.c
deleted file mode 100644
index 2172735..0000000
--- a/usr.bin/msgs/msgs.c
+++ /dev/null
@@ -1,914 +0,0 @@
-/*-
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)msgs.c 8.2 (Berkeley) 4/28/95";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * msgs - a user bulletin board program
- *
- * usage:
- * msgs [fhlopq] [[-]number] to read messages
- * msgs -s to place messages
- * msgs -c [-days] to clean up the bulletin board
- *
- * prompt commands are:
- * y print message
- * n flush message, go to next message
- * q flush message, quit
- * p print message, turn on 'pipe thru more' mode
- * P print message, turn off 'pipe thru more' mode
- * - reprint last message
- * s[-][<num>] [<filename>] save message
- * m[-][<num>] mail with message in temp mbox
- * x exit without flushing this message
- * <num> print message number <num>
- */
-
-#define V7 /* will look for TERM in the environment */
-#define OBJECT /* will object to messages without Subjects */
-/* #define REJECT */ /* will reject messages without Subjects
- (OBJECT must be defined also) */
-/* #define UNBUFFERED *//* use unbuffered output */
-
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <ctype.h>
-#include <dirent.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <locale.h>
-#include <pwd.h>
-#include <setjmp.h>
-#include <termcap.h>
-#include <termios.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-#include "pathnames.h"
-
-#define CMODE 0644 /* bounds file creation mode */
-#define NO 0
-#define YES 1
-#define SUPERUSER 0 /* superuser uid */
-#define DAEMON 1 /* daemon uid */
-#define NLINES 24 /* default number of lines/crt screen */
-#define NDAYS 21 /* default keep time for messages */
-#define DAYS *24*60*60 /* seconds/day */
-#define MSGSRC ".msgsrc" /* user's rc file */
-#define BOUNDS "bounds" /* message bounds file */
-#define NEXT "Next message? [yq]"
-#define MORE "More? [ynq]"
-#define NOMORE "(No more) [q] ?"
-
-typedef char bool;
-
-FILE *msgsrc;
-FILE *newmsg;
-const char *sep = "-";
-char inbuf[BUFSIZ];
-char fname[MAXPATHLEN];
-char cmdbuf[MAXPATHLEN + MAXPATHLEN];
-char subj[128];
-char from[128];
-char date[128];
-char *ptr;
-char *in;
-bool local;
-bool ruptible;
-bool totty;
-bool seenfrom;
-bool seensubj;
-bool blankline;
-bool printing = NO;
-bool mailing = NO;
-bool quitit = NO;
-bool sending = NO;
-bool intrpflg = NO;
-uid_t uid;
-int msg;
-int prevmsg;
-int lct;
-int nlines;
-int Lpp = 0;
-time_t t;
-time_t keep;
-
-/* option initialization */
-bool hdrs = NO;
-bool qopt = NO;
-bool hush = NO;
-bool send_msg = NO;
-bool locomode = NO;
-bool use_pager = NO;
-bool clean = NO;
-bool lastcmd = NO;
-jmp_buf tstpbuf;
-
-static void ask(const char *);
-static void gfrsub(FILE *);
-static int linecnt(FILE *);
-static int next(char *);
-static char *nxtfld(char *);
-static void onsusp(int);
-static void onintr(int);
-static void prmesg(int);
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- bool newrc, already;
- int rcfirst = 0; /* first message to print (from .rc) */
- int rcback = 0; /* amount to back off of rcfirst */
- int firstmsg = 0, nextmsg = 0, lastmsg = 0;
- int blast = 0;
- struct stat buf; /* stat to check access of bounds */
- FILE *bounds;
- char *cp;
-
-#ifdef UNBUFFERED
- setbuf(stdout, NULL);
-#endif
- setlocale(LC_ALL, "");
-
- time(&t);
- setuid(uid = getuid());
- ruptible = (signal(SIGINT, SIG_IGN) == SIG_DFL);
- if (ruptible)
- signal(SIGINT, SIG_DFL);
-
- argc--, argv++;
- while (argc > 0) {
- if (isdigit(argv[0][0])) { /* starting message # */
- rcfirst = atoi(argv[0]);
- }
- else if (isdigit(argv[0][1])) { /* backward offset */
- rcback = atoi( &( argv[0][1] ) );
- }
- else {
- ptr = *argv;
- while (*ptr) switch (*ptr++) {
-
- case '-':
- break;
-
- case 'c':
- if (uid != SUPERUSER && uid != DAEMON)
- errx(1,
- "only the super-user can use the c flag");
- clean = YES;
- break;
-
- case 'f': /* silently */
- hush = YES;
- break;
-
- case 'h': /* headers only */
- hdrs = YES;
- break;
-
- case 'l': /* local msgs only */
- locomode = YES;
- break;
-
- case 'o': /* option to save last message */
- lastcmd = YES;
- break;
-
- case 'p': /* pipe thru 'more' during long msgs */
- use_pager = YES;
- break;
-
- case 'q': /* query only */
- qopt = YES;
- break;
-
- case 's': /* sending TO msgs */
- send_msg = YES;
- break;
-
- default:
- usage();
- }
- }
- argc--, argv++;
- }
-
- /*
- * determine current message bounds
- */
- snprintf(fname, sizeof(fname), "%s/%s", _PATH_MSGS, BOUNDS);
-
- /*
- * Test access rights to the bounds file
- * This can be a little tricky. if(send_msg), then
- * we will create it. We assume that if(send_msg),
- * then you have write permission there.
- * Else, it better be there, or we bail.
- */
- if (send_msg != YES) {
- if (stat(fname, &buf) < 0) {
- if (hush != YES) {
- err(errno, "%s", fname);
- } else {
- exit(1);
- }
- }
- }
- bounds = fopen(fname, "r");
-
- if (bounds != NULL) {
- fscanf(bounds, "%d %d\n", &firstmsg, &lastmsg);
- fclose(bounds);
- blast = lastmsg; /* save upper bound */
- }
-
- if (clean)
- keep = t - (rcback? rcback : NDAYS) DAYS;
-
- if (clean || bounds == NULL) { /* relocate message bounds */
- struct dirent *dp;
- struct stat stbuf;
- bool seenany = NO;
- DIR *dirp;
-
- dirp = opendir(_PATH_MSGS);
- if (dirp == NULL)
- err(errno, "%s", _PATH_MSGS);
-
- firstmsg = 32767;
- lastmsg = 0;
-
- for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)){
- cp = dp->d_name;
- int i = 0;
-
- if (dp->d_ino == 0)
- continue;
- if (dp->d_namlen == 0)
- continue;
-
- if (clean)
- snprintf(inbuf, sizeof(inbuf), "%s/%s", _PATH_MSGS, cp);
-
- while (isdigit(*cp))
- i = i * 10 + *cp++ - '0';
- if (*cp)
- continue; /* not a message! */
-
- if (clean) {
- if (stat(inbuf, &stbuf) != 0)
- continue;
- if (stbuf.st_mtime < keep
- && stbuf.st_mode&S_IWRITE) {
- unlink(inbuf);
- continue;
- }
- }
-
- if (i > lastmsg)
- lastmsg = i;
- if (i < firstmsg)
- firstmsg = i;
- seenany = YES;
- }
- closedir(dirp);
-
- if (!seenany) {
- if (blast != 0) /* never lower the upper bound! */
- lastmsg = blast;
- firstmsg = lastmsg + 1;
- }
- else if (blast > lastmsg)
- lastmsg = blast;
-
- if (!send_msg) {
- bounds = fopen(fname, "w");
- if (bounds == NULL)
- err(errno, "%s", fname);
- chmod(fname, CMODE);
- fprintf(bounds, "%d %d\n", firstmsg, lastmsg);
- fclose(bounds);
- }
- }
-
- if (send_msg) {
- /*
- * Send mode - place msgs in _PATH_MSGS
- */
- bounds = fopen(fname, "w");
- if (bounds == NULL)
- err(errno, "%s", fname);
-
- nextmsg = lastmsg + 1;
- snprintf(fname, sizeof(fname), "%s/%d", _PATH_MSGS, nextmsg);
- newmsg = fopen(fname, "w");
- if (newmsg == NULL)
- err(errno, "%s", fname);
- chmod(fname, CMODE);
-
- fprintf(bounds, "%d %d\n", firstmsg, nextmsg);
- fclose(bounds);
-
- sending = YES;
- if (ruptible)
- signal(SIGINT, onintr);
-
- if (isatty(fileno(stdin))) {
- ptr = getpwuid(uid)->pw_name;
- printf("Message %d:\nFrom %s %sSubject: ",
- nextmsg, ptr, ctime(&t));
- fflush(stdout);
- fgets(inbuf, sizeof inbuf, stdin);
- putchar('\n');
- fflush(stdout);
- fprintf(newmsg, "From %s %sSubject: %s\n",
- ptr, ctime(&t), inbuf);
- blankline = seensubj = YES;
- }
- else
- blankline = seensubj = NO;
- for (;;) {
- fgets(inbuf, sizeof inbuf, stdin);
- if (feof(stdin) || ferror(stdin))
- break;
- blankline = (blankline || (inbuf[0] == '\n'));
- seensubj = (seensubj || (!blankline && (strncmp(inbuf, "Subj", 4) == 0)));
- fputs(inbuf, newmsg);
- }
-#ifdef OBJECT
- if (!seensubj) {
- printf("NOTICE: Messages should have a Subject field!\n");
-#ifdef REJECT
- unlink(fname);
-#endif
- exit(1);
- }
-#endif
- exit(ferror(stdin));
- }
- if (clean)
- exit(0);
-
- /*
- * prepare to display messages
- */
- totty = (isatty(fileno(stdout)) != 0);
- use_pager = use_pager && totty;
-
- if ((cp = getenv("HOME")) == NULL || *cp == '\0') {
- fprintf(stderr, "Error, no home directory!\n");
- exit(1);
- }
- snprintf(fname, sizeof(fname), "%s/%s", cp, MSGSRC);
- msgsrc = fopen(fname, "r");
- if (msgsrc) {
- newrc = NO;
- fscanf(msgsrc, "%d\n", &nextmsg);
- fclose(msgsrc);
- if (nextmsg > lastmsg+1) {
- printf("Warning: bounds have been reset (%d, %d)\n",
- firstmsg, lastmsg);
- truncate(fname, (off_t)0);
- newrc = YES;
- }
- else if (!rcfirst)
- rcfirst = nextmsg - rcback;
- }
- else
- newrc = YES;
- msgsrc = fopen(fname, "r+");
- if (msgsrc == NULL)
- msgsrc = fopen(fname, "w");
- if (msgsrc == NULL)
- err(errno, "%s", fname);
- if (rcfirst) {
- if (rcfirst > lastmsg+1) {
- printf("Warning: the last message is number %d.\n",
- lastmsg);
- rcfirst = nextmsg;
- }
- if (rcfirst > firstmsg)
- firstmsg = rcfirst; /* don't set below first msg */
- }
- if (newrc) {
- nextmsg = firstmsg;
- rewind(msgsrc);
- fprintf(msgsrc, "%d\n", nextmsg);
- fflush(msgsrc);
- }
-
-#ifdef V7
- if (totty) {
- struct winsize win;
- if (ioctl(fileno(stdout), TIOCGWINSZ, &win) != -1)
- Lpp = win.ws_row;
- if (Lpp <= 0) {
- if (tgetent(inbuf, getenv("TERM")) <= 0
- || (Lpp = tgetnum("li")) <= 0) {
- Lpp = NLINES;
- }
- }
- }
-#endif
- Lpp -= 6; /* for headers, etc. */
-
- already = NO;
- prevmsg = firstmsg;
- printing = YES;
- if (ruptible)
- signal(SIGINT, onintr);
-
- /*
- * Main program loop
- */
- for (msg = firstmsg; msg <= lastmsg; msg++) {
-
- snprintf(fname, sizeof(fname), "%s/%d", _PATH_MSGS, msg);
- newmsg = fopen(fname, "r");
- if (newmsg == NULL)
- continue;
-
- gfrsub(newmsg); /* get From and Subject fields */
- if (locomode && !local) {
- fclose(newmsg);
- continue;
- }
-
- if (qopt) { /* This has to be located here */
- printf("There are new messages.\n");
- exit(0);
- }
-
- if (already && !hdrs)
- putchar('\n');
-
- /*
- * Print header
- */
- if (totty)
- signal(SIGTSTP, onsusp);
- (void) setjmp(tstpbuf);
- already = YES;
- nlines = 2;
- if (seenfrom) {
- printf("Message %d:\nFrom %s %s", msg, from, date);
- nlines++;
- }
- if (seensubj) {
- printf("Subject: %s", subj);
- nlines++;
- }
- else {
- if (seenfrom) {
- putchar('\n');
- nlines++;
- }
- while (nlines < 6
- && fgets(inbuf, sizeof inbuf, newmsg)
- && inbuf[0] != '\n') {
- fputs(inbuf, stdout);
- nlines++;
- }
- }
-
- lct = linecnt(newmsg);
- if (lct)
- printf("(%d%sline%s) ", lct, seensubj? " " : " more ",
- (lct == 1) ? "" : "s");
-
- if (hdrs) {
- printf("\n-----\n");
- fclose(newmsg);
- continue;
- }
-
- /*
- * Ask user for command
- */
- if (totty)
- ask(lct? MORE : (msg==lastmsg? NOMORE : NEXT));
- else
- inbuf[0] = 'y';
- if (totty)
- signal(SIGTSTP, SIG_DFL);
-cmnd:
- in = inbuf;
- switch (*in) {
- case 'x':
- /* FALLTHROUGH */
- case 'X':
- exit(0);
- /* NOTREACHED */
-
- case 'q':
- /* FALLTHROUGH */
- case 'Q':
- quitit = YES;
- printf("--Postponed--\n");
- exit(0);
- /* NOTREACHED */
-
- case 'n':
- /* FALLTHROUGH */
- case 'N':
- if (msg >= nextmsg) sep = "Flushed";
- prevmsg = msg;
- break;
-
- case 'p':
- /* FALLTHROUGH */
- case 'P':
- use_pager = (*in++ == 'p');
- /* FALLTHROUGH */
- case '\n':
- /* FALLTHROUGH */
- case 'y':
- default:
- if (*in == '-') {
- msg = prevmsg-1;
- sep = "replay";
- break;
- }
- if (isdigit(*in)) {
- msg = next(in);
- sep = in;
- break;
- }
-
- prmesg(nlines + lct + (seensubj? 1 : 0));
- prevmsg = msg;
-
- }
-
- printf("--%s--\n", sep);
- sep = "-";
- if (msg >= nextmsg) {
- nextmsg = msg + 1;
- rewind(msgsrc);
- fprintf(msgsrc, "%d\n", nextmsg);
- fflush(msgsrc);
- }
- if (newmsg)
- fclose(newmsg);
- if (quitit)
- break;
- }
-
- /*
- * Make sure .rc file gets updated
- */
- if (--msg >= nextmsg) {
- nextmsg = msg + 1;
- rewind(msgsrc);
- fprintf(msgsrc, "%d\n", nextmsg);
- fflush(msgsrc);
- }
- if (already && !quitit && lastcmd && totty) {
- /*
- * save or reply to last message?
- */
- msg = prevmsg;
- ask(NOMORE);
- if (inbuf[0] == '-' || isdigit(inbuf[0]))
- goto cmnd;
- }
- if (!(already || hush || qopt))
- printf("No new messages.\n");
- exit(0);
- /* NOTREACHED */
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: msgs [fhlopq] [[-]number]\n");
- exit(1);
-}
-
-static void
-prmesg(int length)
-{
- FILE *outf;
- char *env_pager;
-
- if (use_pager && length > Lpp) {
- signal(SIGPIPE, SIG_IGN);
- signal(SIGQUIT, SIG_IGN);
- if ((env_pager = getenv("PAGER")) == NULL) {
- snprintf(cmdbuf, sizeof(cmdbuf), _PATH_PAGER, Lpp);
- } else {
- snprintf(cmdbuf, sizeof(cmdbuf), "%s", env_pager);
- }
- outf = popen(cmdbuf, "w");
- if (!outf)
- outf = stdout;
- else
- setbuf(outf, (char *)NULL);
- }
- else
- outf = stdout;
-
- if (seensubj)
- putc('\n', outf);
-
- while (fgets(inbuf, sizeof inbuf, newmsg)) {
- fputs(inbuf, outf);
- if (ferror(outf)) {
- clearerr(outf);
- break;
- }
- }
-
- if (outf != stdout) {
- pclose(outf);
- signal(SIGPIPE, SIG_DFL);
- signal(SIGQUIT, SIG_DFL);
- }
- else {
- fflush(stdout);
- }
-
- /* force wait on output */
- tcdrain(fileno(stdout));
-}
-
-static void
-onintr(int unused __unused)
-{
- signal(SIGINT, onintr);
- if (mailing)
- unlink(fname);
- if (sending) {
- unlink(fname);
- puts("--Killed--");
- exit(1);
- }
- if (printing) {
- putchar('\n');
- if (hdrs)
- exit(0);
- sep = "Interrupt";
- if (newmsg)
- fseeko(newmsg, (off_t)0, SEEK_END);
- intrpflg = YES;
- }
-}
-
-/*
- * We have just gotten a susp. Suspend and prepare to resume.
- */
-static void
-onsusp(int unused __unused)
-{
- signal(SIGTSTP, SIG_DFL);
- sigsetmask(0);
- kill(0, SIGTSTP);
- signal(SIGTSTP, onsusp);
- if (!mailing)
- longjmp(tstpbuf, 0);
-}
-
-static int
-linecnt(FILE *f)
-{
- off_t oldpos = ftello(f);
- int l = 0;
- char lbuf[BUFSIZ];
-
- while (fgets(lbuf, sizeof lbuf, f))
- l++;
- clearerr(f);
- fseeko(f, oldpos, SEEK_SET);
- return (l);
-}
-
-static int
-next(char *buf)
-{
- int i;
- sscanf(buf, "%d", &i);
- sprintf(buf, "Goto %d", i);
- return(--i);
-}
-
-static void
-ask(const char *prompt)
-{
- char inch;
- int n, cmsg, fd;
- off_t oldpos;
- FILE *cpfrom, *cpto;
-
- printf("%s ", prompt);
- fflush(stdout);
- intrpflg = NO;
- (void) fgets(inbuf, sizeof inbuf, stdin);
- if ((n = strlen(inbuf)) > 0 && inbuf[n - 1] == '\n')
- inbuf[n - 1] = '\0';
- if (intrpflg)
- inbuf[0] = 'x';
-
- /*
- * Handle 'mail' and 'save' here.
- */
- if ((inch = inbuf[0]) == 's' || inch == 'm') {
- if (inbuf[1] == '-')
- cmsg = prevmsg;
- else if (isdigit(inbuf[1]))
- cmsg = atoi(&inbuf[1]);
- else
- cmsg = msg;
- snprintf(fname, sizeof(fname), "%s/%d", _PATH_MSGS, cmsg);
-
- oldpos = ftello(newmsg);
-
- cpfrom = fopen(fname, "r");
- if (!cpfrom) {
- printf("Message %d not found\n", cmsg);
- ask (prompt);
- return;
- }
-
- if (inch == 's') {
- in = nxtfld(inbuf);
- if (*in) {
- for (n=0; in[n] > ' '; n++) { /* sizeof fname? */
- fname[n] = in[n];
- }
- fname[n] = '\0';
- }
- else
- strcpy(fname, "Messages");
- fd = open(fname, O_RDWR|O_EXCL|O_CREAT|O_APPEND);
- }
- else {
- strcpy(fname, _PATH_TMP);
- fd = mkstemp(fname);
- if (fd != -1) {
- snprintf(cmdbuf, sizeof(cmdbuf), _PATH_MAIL,
- fname);
- mailing = YES;
- }
- }
- if (fd == -1 || (cpto = fdopen(fd, "a")) == NULL) {
- if (fd != -1)
- close(fd);
- warn("%s", fname);
- mailing = NO;
- fseeko(newmsg, oldpos, SEEK_SET);
- ask(prompt);
- return;
- }
-
- while ((n = fread(inbuf, 1, sizeof inbuf, cpfrom)))
- fwrite(inbuf, 1, n, cpto);
-
- fclose(cpfrom);
- fclose(cpto);
- fseeko(newmsg, oldpos, SEEK_SET);/* reposition current message */
- if (inch == 's')
- printf("Message %d saved in \"%s\"\n", cmsg, fname);
- else {
- system(cmdbuf);
- unlink(fname);
- mailing = NO;
- }
- ask(prompt);
- }
-}
-
-static void
-gfrsub(FILE *infile)
-{
- off_t frompos;
- int count;
-
- seensubj = seenfrom = NO;
- local = YES;
- subj[0] = from[0] = date[0] = '\0';
-
- /*
- * Is this a normal message?
- */
- if (fgets(inbuf, sizeof inbuf, infile)) {
- if (strncmp(inbuf, "From", 4)==0) {
- /*
- * expected form starts with From
- */
- seenfrom = YES;
- frompos = ftello(infile);
- ptr = from;
- in = nxtfld(inbuf);
- if (*in) {
- count = sizeof(from) - 1;
- while (*in && *in > ' ' && count-- > 0) {
- if (*in == ':' || *in == '@' ||
- *in == '!')
- local = NO;
- *ptr++ = *in++;
- }
- }
- *ptr = '\0';
- if (*(in = nxtfld(in)))
- strncpy(date, in, sizeof date);
- else {
- date[0] = '\n';
- date[1] = '\0';
- }
- }
- else {
- /*
- * not the expected form
- */
- rewind(infile);
- return;
- }
- }
- else
- /*
- * empty file ?
- */
- return;
-
- /*
- * look for Subject line until EOF or a blank line
- */
- while (fgets(inbuf, sizeof inbuf, infile)
- && !(blankline = (inbuf[0] == '\n'))) {
- /*
- * extract Subject line
- */
- if (!seensubj && strncmp(inbuf, "Subj", 4)==0) {
- seensubj = YES;
- frompos = ftello(infile);
- strncpy(subj, nxtfld(inbuf), sizeof subj);
- }
- }
- if (!blankline)
- /*
- * ran into EOF
- */
- fseeko(infile, frompos, SEEK_SET);
-
- if (!seensubj)
- /*
- * for possible use with Mail
- */
- strncpy(subj, "(No Subject)\n", sizeof subj);
-}
-
-static char *
-nxtfld(char *s)
-{
- if (*s) while (*s && !isspace(*s)) s++; /* skip over this field */
- if (*s) while (*s && isspace(*s)) s++; /* find start of next field */
- return (s);
-}
diff --git a/usr.bin/msgs/pathnames.h b/usr.bin/msgs/pathnames.h
deleted file mode 100644
index 90f23f4..0000000
--- a/usr.bin/msgs/pathnames.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)pathnames.h 8.1 (Berkeley) 6/6/93
- */
-
-#define _PATH_MSGS "/var/msgs"
-#define _PATH_MAIL "/usr/bin/Mail -f %s"
-#define _PATH_PAGER "/usr/bin/more -%d"
-#undef _PATH_TMP
-#define _PATH_TMP "/tmp/msgXXXXXX"
diff --git a/usr.bin/mt/Makefile b/usr.bin/mt/Makefile
deleted file mode 100644
index 25b4af5..0000000
--- a/usr.bin/mt/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= mt
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/mt/mt.1 b/usr.bin/mt/mt.1
deleted file mode 100644
index 17e269b..0000000
--- a/usr.bin/mt/mt.1
+++ /dev/null
@@ -1,404 +0,0 @@
-.\" Copyright (c) 1981, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)mt.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd January 20, 2008
-.Dt MT 1
-.Os
-.Sh NAME
-.Nm mt
-.Nd magnetic tape manipulating program
-.Sh SYNOPSIS
-.Nm
-.Op Fl f Ar tapename
-.Ar command
-.Op Ar count
-.Nm
-.Op Fl f Ar tapename
-.Ar command
-.Ar argument
-.Sh DESCRIPTION
-The
-.Nm
-utility is used to command a magnetic tape drive for operations
-other than reading or writing data.
-.Pp
-The
-.Fl f
-option's
-.Ar tapename
-overrides the
-.Ev TAPE
-environment variable described below.
-.Pp
-The available commands are listed below.
-Only as many
-characters as are required to uniquely identify a command
-need be specified.
-.Pp
-The following commands optionally take a
-.Ar count ,
-which defaults to 1.
-.Bl -tag -width ".Cm erase"
-.It Cm weof
-Write
-.Ar count
-end-of-file (EOF) marks at the current position.
-.It Cm smk
-Write
-.Ar count
-setmarks at the current position (DDS drives only).
-.It Cm fsf
-Forward space
-.Ar count
-files.
-.It Cm fsr
-Forward space
-.Ar count
-records.
-.It Cm fss
-Forward space
-.Ar count
-setmarks (DDS drives only).
-.It Cm bsf
-Backward space
-.Ar count
-files.
-.It Cm bsr
-Backward space
-.Ar count
-records.
-.It Cm bss
-Backward space
-.Ar count
-setmarks (DDS drives only).
-.It Cm erase
-Erase the tape using a long (often very long) method.
-With a
-.Ar count
-of 0, it will erase the tape using a quick method.
-Operation is not guaranteed if the tape is not at its beginning.
-The tape will be at its beginning upon completion.
-.El
-.Pp
-The following commands ignore
-.Ar count .
-.Bl -tag -width ".Cm geteotmodel"
-.It Cm rdhpos
-Read the hardware block position.
-The block
-number reported is specific for that hardware only.
-With drive data compression especially,
-this position may have more to do with the amount of data
-sent to the drive than the amount of data written to tape.
-Some drives do not support this.
-.It Cm rdspos
-Read the SCSI logical block position.
-This typically is greater than the hardware position
-by the number of end-of-file marks.
-Some drives do not support this.
-.It Cm rewind
-Rewind the tape.
-.It Cm offline , rewoffl
-Rewind the tape and place the drive off line.
-Some drives are never off line.
-.It Cm retension
-Re-tension the tape.
-This winds the tape from the current position to the end
-and then to the beginning.
-This sometimes improves subsequent reading and writing,
-particularly for streaming drives.
-Some drives do not support this.
-.It Cm status
-Output status information about the drive.
-For SCSI magnetic tape devices,
-the current operating modes of density, blocksize, and whether compression
-is enabled is reported.
-The current state of the driver (what it thinks that
-it is doing with the device) is reported.
-If the driver knows the relative
-position from BOT (in terms of filemarks and records), it outputs that.
-Note
-that this information is not definitive (only BOT, End of Recorded Media, and
-hardware or SCSI logical block position (if the drive supports such) are
-considered definitive tape positions).
-.It Cm errstat
-Output (and clear) error status information about this device.
-For every normal
-operation (e.g., a read or a write) and every control operation (e.g,, a
-rewind), the driver stores up the last command executed and it is associated
-status and any residual counts (if any).
-This command retrieves and outputs this
-information.
-If possible, this also clears any latched error information.
-.It Cm geteotmodel
-Output the current EOT filemark model.
-The model states how
-many filemarks will be written at close if a tape was being written.
-.It Cm eod , eom
-Wind the tape to the end of the recorded data,
-typically after an EOF mark where another file may be written.
-.El
-.Pp
-The following commands require an
-.Ar argument .
-.Bl -tag -width ".Cm seteotmodel"
-.It Cm sethpos
-Set the hardware block position.
-The
-.Ar argument
-is a hardware block number to which to position the tape.
-Some drives do not support this.
-.It Cm setspos
-Set the SCSI logical block position.
-The
-.Ar argument
-is a SCSI logical block number to which to position the tape.
-Some drives do not support this.
-.It Cm blocksize
-Set the block size for the drive.
-The
-.Ar argument
-is the number of bytes per block,
-except 0 commands the drive to use variable-length blocks.
-.It Cm seteotmodel
-Set the EOT filemark model to
-.Ar argument
-and output the old and new models.
-Typically this will be 2
-filemarks, but some devices (typically QIC cartridge drives) can
-only write 1 filemark.
-You may only choose a value of
-.Ar 1
-or
-.Ar 2 .
-.It Cm comp
-Set the drive's compression mode.
-The non-numeric values of
-.Ar argument
-are:
-.Pp
-.Bl -tag -width 9n -compact
-.It off
-Turn compression off.
-.It on
-Turn compression on.
-.It none
-Same as
-.Ar off .
-.It enable
-Same as
-.Ar on .
-.It IDRC
-IBM Improved Data Recording Capability compression (0x10).
-.It DCLZ
-DCLZ compression algorithm (0x20).
-.El
-.Pp
-In addition to the above recognized compression keywords, the user can
-supply a numeric compression algorithm for the drive to use.
-In most
-cases, simply turning the compression
-.Sq on
-will have the desired effect of enabling the default compression algorithm
-supported by the drive.
-If this is not the case (see the
-.Cm status
-display to see which compression algorithm is currently in use), the user
-can manually specify one of the supported compression keywords (above), or
-supply a numeric compression value from the drive's specifications.
-.It Cm density
-Set the density for the drive.
-For the density codes, see below.
-The density value could be given either numerically, or as a string,
-corresponding to the
-.Dq Reference
-field.
-If the string is abbreviated, it will be resolved in the order
-shown in the table, and the first matching entry will be used.
-If the
-given string and the resulting canonical density name do not match
-exactly, an informational message is output about what the given
-string has been taken for.
-.El
-.Pp
-The following density table was taken from the
-.Sq Historical sequential access density codes
-table (A-1) in Revision 11 of the SCSI-3 Stream Device Commands (SSC)
-working draft, dated November 11, 1997.
-.Pp
-The density codes are:
-.Bd -literal -offset 3n
-0x0 default for device
-0xE reserved for ECMA
-
-Value Width Tracks Density Code Type Reference Note
- mm in bpmm bpi
-0x01 12.7 (0.5) 9 32 (800) NRZI R X3.22-1983 2
-0x02 12.7 (0.5) 9 63 (1,600) PE R X3.39-1986 2
-0x03 12.7 (0.5) 9 246 (6,250) GCR R X3.54-1986 2
-0x05 6.3 (0.25) 4/9 315 (8,000) GCR C X3.136-1986 1
-0x06 12.7 (0.5) 9 126 (3,200) PE R X3.157-1987 2
-0x07 6.3 (0.25) 4 252 (6,400) IMFM C X3.116-1986 1
-0x08 3.81 (0.15) 4 315 (8,000) GCR CS X3.158-1987 1
-0x09 12.7 (0.5) 18 1,491 (37,871) GCR C X3.180 2
-0x0A 12.7 (0.5) 22 262 (6,667) MFM C X3B5/86-199 1
-0x0B 6.3 (0.25) 4 63 (1,600) PE C X3.56-1986 1
-0x0C 12.7 (0.5) 24 500 (12,690) GCR C HI-TC1 1,6
-0x0D 12.7 (0.5) 24 999 (25,380) GCR C HI-TC2 1,6
-0x0F 6.3 (0.25) 15 394 (10,000) GCR C QIC-120 1,6
-0x10 6.3 (0.25) 18 394 (10,000) GCR C QIC-150 1,6
-0x11 6.3 (0.25) 26 630 (16,000) GCR C QIC-320 1,6
-0x12 6.3 (0.25) 30 2,034 (51,667) RLL C QIC-1350 1,6
-0x13 3.81 (0.15) 1 2,400 (61,000) DDS CS X3B5/88-185A 5
-0x14 8.0 (0.315) 1 1,703 (43,245) RLL CS X3.202-1991 5
-0x15 8.0 (0.315) 1 1,789 (45,434) RLL CS ECMA TC17 5
-0x16 12.7 (0.5) 48 394 (10,000) MFM C X3.193-1990 1
-0x17 12.7 (0.5) 48 1,673 (42,500) MFM C X3B5/91-174 1
-0x18 12.7 (0.5) 112 1,673 (42,500) MFM C X3B5/92-50 1
-0x19 12.7 (0.5) 128 2,460 (62,500) RLL C DLTapeIII 6,7
-0x1A 12.7 (0.5) 128 3,214 (81,633) RLL C DLTapeIV(20) 6,7
-0x1B 12.7 (0.5) 208 3,383 (85,937) RLL C DLTapeIV(35) 6,7
-0x1C 6.3 (0.25) 34 1,654 (42,000) MFM C QIC-385M 1,6
-0x1D 6.3 (0.25) 32 1,512 (38,400) GCR C QIC-410M 1,6
-0x1E 6.3 (0.25) 30 1,385 (36,000) GCR C QIC-1000C 1,6
-0x1F 6.3 (0.25) 30 2,666 (67,733) RLL C QIC-2100C 1,6
-0x20 6.3 (0.25) 144 2,666 (67,733) RLL C QIC-6GB(M) 1,6
-0x21 6.3 (0.25) 144 2,666 (67,733) RLL C QIC-20GB(C) 1,6
-0x22 6.3 (0.25) 42 1,600 (40,640) GCR C QIC-2GB(C) ?
-0x23 6.3 (0.25) 38 2,666 (67,733) RLL C QIC-875M ?
-0x24 3.81 (0.15) 1 2,400 (61,000) CS DDS-2 5
-0x25 3.81 (0.15) 1 3,816 (97,000) CS DDS-3 5
-0x26 3.81 (0.15) 1 3,816 (97,000) CS DDS-4 5
-0x27 8.0 (0.315) 1 3,056 (77,611) RLL CS Mammoth 5
-0x28 12.7 (0.5) 36 1,491 (37,871) GCR C X3.224 1
-0x29 12.7 (0.5)
-0x2A
-0x2B 12.7 (0.5) 3 ? ? ? C X3.267 5
-0x41 12.7 (0.5) 208 3,868 (98,250) RLL C DLTapeIV(40) 6,7
-0x48 12.7 (0.5) 448 5,236 (133,000) PRML C SDLTapeI(110) 6,8
-0x49 12.7 (0.5) 448 7,598 (193,000) PRML C SDLTapeI(160) 6,8
-.Ed
-.Bd -literal -offset 3n
-Code Description Type Description
----- -------------------------------------- ---- -----------
-NRZI Non return to zero, change on ones R Reel-to-reel
-GCR Group code recording C Cartridge
-PE Phase encoded CS Cassette
-IMFM Inverted modified frequency modulation
-MFM Modified frequency modulation
-DDS DAT data storage
-RLL Run length limited
-PRML Partial Response Maximum Likelihood
-.Ed
-.Bd -literal -offset 3n
-NOTES
-1. Serial recorded.
-2. Parallel recorded.
-3. Old format known as QIC-11.
-5. Helical scan.
-6. This is not an American National Standard. The reference is based on
- an industry standard definition of the media format.
-7. DLT recording: serially recorded track pairs (DLTapeIII and
- DLTapeIV(20)), or track quads (DLTapeIV(35) and DLTapeIV(40)).
-8. Super DLT (SDLT) recording: 56 serially recorded logical tracks with
- 8 physical tracks each.
-.Ed
-.Sh ENVIRONMENT
-.Bl -tag -width ".Ev TAPE"
-.It Ev TAPE
-This is the pathname of the tape drive.
-The default (if the variable is unset, but not if it is null) is
-.Pa /dev/nsa0 .
-It may be overridden with the
-.Fl f
-option.
-.El
-.Sh FILES
-.Bl -tag -width ".Pa /dev/*sa[0-9]*" -compact
-.It Pa /dev/*wt*
-QIC-02/QIC-36 magnetic tape interface
-.It Pa /dev/*sa[0-9]*
-SCSI magnetic tape interface
-.El
-.Sh DIAGNOSTICS
-The exit status will be 0 when the drive operations were successful,
-2 when the drive operations were unsuccessful, and 1 for other
-problems like an unrecognized command or a missing drive device.
-.Sh COMPATIBILITY
-Some undocumented commands support old software.
-.Sh SEE ALSO
-.Xr dd 1 ,
-.Xr ioctl 2 ,
-.Xr ast 4 ,
-.Xr mtio 4 ,
-.Xr sa 4 ,
-.Xr environ 7
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.3 .
-.Pp
-Extensions regarding the
-.Xr st 4
-driver appeared in
-.Bx 386 0.1
-as a separate
-.Nm st
-command, and have been merged into the
-.Nm
-command in
-.Fx 2.1 .
-.Pp
-The former
-.Cm eof
-command that used to be a synonym for
-.Cm weof
-has been abandoned in
-.Fx 2.1
-since it was often confused with
-.Cm eom ,
-which is fairly dangerous.
-.Sh BUGS
-The utility cannot be interrupted or killed during a long erase
-(which can be longer than an hour), and it is easy to forget
-that the default erase is long.
-.Pp
-Hardware block numbers do not always correspond to blocks on the tape
-when the drive uses internal compression.
-.Pp
-Erasure is not guaranteed if the tape is not at its beginning.
-.Pp
-Tape-related documentation is poor, here and elsewhere.
diff --git a/usr.bin/mt/mt.c b/usr.bin/mt/mt.c
deleted file mode 100644
index 902128e..0000000
--- a/usr.bin/mt/mt.c
+++ /dev/null
@@ -1,650 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)mt.c 8.2 (Berkeley) 5/4/95";
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * mt --
- * magnetic tape manipulation program
- */
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/mtio.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-/* the appropriate sections of <sys/mtio.h> are also #ifdef'd for FreeBSD */
-/* c_flags */
-#define NEED_2ARGS 0x01
-#define ZERO_ALLOWED 0x02
-#define IS_DENSITY 0x04
-#define DISABLE_THIS 0x08
-#define IS_COMP 0x10
-
-#ifndef TRUE
-#define TRUE 1
-#endif
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-struct commands {
- const char *c_name;
- int c_code;
- int c_ronly;
- int c_flags;
-} com[] = {
- { "bsf", MTBSF, 1, 0 },
- { "bsr", MTBSR, 1, 0 },
- /* XXX FreeBSD considered "eof" dangerous, since it's being
- confused with "eom" (and is an alias for "weof" anyway) */
- { "eof", MTWEOF, 0, DISABLE_THIS },
- { "fsf", MTFSF, 1, 0 },
- { "fsr", MTFSR, 1, 0 },
- { "offline", MTOFFL, 1, 0 },
- { "rewind", MTREW, 1, 0 },
- { "rewoffl", MTOFFL, 1, 0 },
- { "status", MTNOP, 1, 0 },
- { "weof", MTWEOF, 0, ZERO_ALLOWED },
- { "erase", MTERASE, 0, ZERO_ALLOWED},
- { "blocksize", MTSETBSIZ, 0, NEED_2ARGS|ZERO_ALLOWED },
- { "density", MTSETDNSTY, 0, NEED_2ARGS|ZERO_ALLOWED|IS_DENSITY },
- { "eom", MTEOD, 1, 0 },
- { "eod", MTEOD, 1, 0 },
- { "smk", MTWSS, 0, 0 },
- { "wss", MTWSS, 0, 0 },
- { "fss", MTFSS, 1, 0 },
- { "bss", MTBSS, 1, 0 },
- { "comp", MTCOMP, 0, NEED_2ARGS|ZERO_ALLOWED|IS_COMP },
- { "retension", MTRETENS, 1, 0 },
- { "rdhpos", MTIOCRDHPOS, 0, 0 },
- { "rdspos", MTIOCRDSPOS, 0, 0 },
- { "sethpos", MTIOCHLOCATE, 0, NEED_2ARGS|ZERO_ALLOWED },
- { "setspos", MTIOCSLOCATE, 0, NEED_2ARGS|ZERO_ALLOWED },
- { "errstat", MTIOCERRSTAT, 0, 0 },
- { "setmodel", MTIOCSETEOTMODEL, 0, NEED_2ARGS|ZERO_ALLOWED },
- { "seteotmodel", MTIOCSETEOTMODEL, 0, NEED_2ARGS|ZERO_ALLOWED },
- { "getmodel", MTIOCGETEOTMODEL, 0, 0 },
- { "geteotmodel", MTIOCGETEOTMODEL, 0, 0 },
- { NULL, 0, 0, 0 }
-};
-
-const char *getblksiz(int);
-void printreg(const char *, u_int, const char *);
-void status(struct mtget *);
-void usage(void);
-void st_status (struct mtget *);
-int stringtodens (const char *s);
-const char *denstostring (int d);
-int denstobp(int d, int bpi);
-u_int32_t stringtocomp(const char *s);
-const char *comptostring(u_int32_t comp);
-void warn_eof(void);
-
-int
-main(int argc, char *argv[])
-{
- struct commands *comp;
- struct mtget mt_status;
- struct mtop mt_com;
- int ch, len, mtfd;
- const char *p, *tape;
-
- if ((tape = getenv("TAPE")) == NULL)
- tape = DEFTAPE;
-
- while ((ch = getopt(argc, argv, "f:t:")) != -1)
- switch(ch) {
- case 'f':
- case 't':
- tape = optarg;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (argc < 1 || argc > 2)
- usage();
-
- len = strlen(p = *argv++);
- for (comp = com;; comp++) {
- if (comp->c_name == NULL)
- errx(1, "%s: unknown command", p);
- if (strncmp(p, comp->c_name, len) == 0)
- break;
- }
- if((comp->c_flags & NEED_2ARGS) && argc != 2)
- usage();
- if(comp->c_flags & DISABLE_THIS) {
- warn_eof();
- }
- if ((mtfd = open(tape, comp->c_ronly ? O_RDONLY : O_RDWR)) < 0)
- err(1, "%s", tape);
- if (comp->c_code != MTNOP) {
- mt_com.mt_op = comp->c_code;
- if (*argv) {
- if (!isdigit(**argv) &&
- (comp->c_flags & IS_DENSITY)) {
- const char *dcanon;
- mt_com.mt_count = stringtodens(*argv);
- if (mt_com.mt_count == 0)
- errx(1, "%s: unknown density", *argv);
- dcanon = denstostring(mt_com.mt_count);
- if (strcmp(dcanon, *argv) != 0)
- printf(
- "Using \"%s\" as an alias for %s\n",
- *argv, dcanon);
- p = "";
- } else if (!isdigit(**argv) &&
- (comp->c_flags & IS_COMP)) {
-
- mt_com.mt_count = stringtocomp(*argv);
- if ((u_int32_t)mt_com.mt_count == 0xf0f0f0f0)
- errx(1, "%s: unknown compression",
- *argv);
- p = "";
- } else {
- char *q;
- /* allow for hex numbers; useful for density */
- mt_com.mt_count = strtol(*argv, &q, 0);
- p = q;
- }
- if ((mt_com.mt_count <=
- ((comp->c_flags & ZERO_ALLOWED)? -1: 0)
- && ((comp->c_flags & IS_COMP) == 0)
- ) || *p)
- errx(1, "%s: illegal count", *argv);
- }
- else
- mt_com.mt_count = 1;
- switch (comp->c_code) {
- case MTIOCERRSTAT:
- {
- unsigned int i;
- union mterrstat umn;
- struct scsi_tape_errors *s = &umn.scsi_errstat;
-
- if (ioctl(mtfd, comp->c_code, (caddr_t)&umn) < 0)
- err(2, "%s", tape);
- (void)printf("Last I/O Residual: %u\n", s->io_resid);
- (void)printf(" Last I/O Command:");
- for (i = 0; i < sizeof (s->io_cdb); i++)
- (void)printf(" %02X", s->io_cdb[i]);
- (void)printf("\n");
- (void)printf(" Last I/O Sense:\n\n\t");
- for (i = 0; i < sizeof (s->io_sense); i++) {
- (void)printf(" %02X", s->io_sense[i]);
- if (((i + 1) & 0xf) == 0) {
- (void)printf("\n\t");
- }
- }
- (void)printf("\n");
- (void)printf("Last Control Residual: %u\n",
- s->ctl_resid);
- (void)printf(" Last Control Command:");
- for (i = 0; i < sizeof (s->ctl_cdb); i++)
- (void)printf(" %02X", s->ctl_cdb[i]);
- (void)printf("\n");
- (void)printf(" Last Control Sense:\n\n\t");
- for (i = 0; i < sizeof (s->ctl_sense); i++) {
- (void)printf(" %02X", s->ctl_sense[i]);
- if (((i + 1) & 0xf) == 0) {
- (void)printf("\n\t");
- }
- }
- (void)printf("\n\n");
- exit(0);
- /* NOTREACHED */
- }
- case MTIOCRDHPOS:
- case MTIOCRDSPOS:
- {
- u_int32_t block;
- if (ioctl(mtfd, comp->c_code, (caddr_t)&block) < 0)
- err(2, "%s", tape);
- (void)printf("%s: %s block location %u\n", tape,
- (comp->c_code == MTIOCRDHPOS)? "hardware" :
- "logical", block);
- exit(0);
- /* NOTREACHED */
- }
- case MTIOCSLOCATE:
- case MTIOCHLOCATE:
- {
- u_int32_t block = (u_int32_t)mt_com.mt_count;
- if (ioctl(mtfd, comp->c_code, (caddr_t)&block) < 0)
- err(2, "%s", tape);
- exit(0);
- /* NOTREACHED */
- }
- case MTIOCGETEOTMODEL:
- {
- u_int32_t om;
- if (ioctl(mtfd, MTIOCGETEOTMODEL, (caddr_t)&om) < 0)
- err(2, "%s", tape);
- (void)printf("%s: the model is %u filemar%s at EOT\n",
- tape, om, (om > 1)? "ks" : "k");
- exit(0);
- /* NOTREACHED */
- }
- case MTIOCSETEOTMODEL:
- {
- u_int32_t om, nm = (u_int32_t)mt_com.mt_count;
- if (ioctl(mtfd, MTIOCGETEOTMODEL, (caddr_t)&om) < 0)
- err(2, "%s", tape);
- if (ioctl(mtfd, comp->c_code, (caddr_t)&nm) < 0)
- err(2, "%s", tape);
- (void)printf("%s: old model was %u filemar%s at EOT\n",
- tape, om, (om > 1)? "ks" : "k");
- (void)printf("%s: new model is %u filemar%s at EOT\n",
- tape, nm, (nm > 1)? "ks" : "k");
- exit(0);
- /* NOTREACHED */
- }
- default:
- break;
- }
- if (ioctl(mtfd, MTIOCTOP, &mt_com) < 0)
- err(1, "%s: %s", tape, comp->c_name);
- } else {
- if (ioctl(mtfd, MTIOCGET, &mt_status) < 0)
- err(1, NULL);
- status(&mt_status);
- }
- exit(0);
- /* NOTREACHED */
-}
-
-struct tape_desc {
- short t_type; /* type of magtape device */
- const char *t_name; /* printing name */
- const char *t_dsbits; /* "drive status" register */
- const char *t_erbits; /* "error" register */
-} tapes[] = {
- { MT_ISAR, "SCSI tape drive", 0, 0 },
- { 0, NULL, 0, 0 }
-};
-
-/*
- * Interpret the status buffer returned
- */
-void
-status(struct mtget *bp)
-{
- struct tape_desc *mt;
-
- for (mt = tapes;; mt++) {
- if (mt->t_type == 0) {
- (void)printf("%d: unknown tape drive type\n",
- bp->mt_type);
- return;
- }
- if (mt->t_type == bp->mt_type)
- break;
- }
- if(mt->t_type == MT_ISAR)
- st_status(bp);
- else {
- (void)printf("%s tape drive, residual=%d\n",
- mt->t_name, bp->mt_resid);
- printreg("ds", (unsigned short)bp->mt_dsreg, mt->t_dsbits);
- printreg("\ner", (unsigned short)bp->mt_erreg, mt->t_erbits);
- (void)putchar('\n');
- }
-}
-
-/*
- * Print a register a la the %b format of the kernel's printf.
- */
-void
-printreg(const char *s, u_int v, const char *bits)
-{
- int i, any = 0;
- char c;
-
- if (bits && *bits == 8)
- printf("%s=%o", s, v);
- else
- printf("%s=%x", s, v);
- if (!bits)
- return;
- bits++;
- if (v && bits) {
- putchar('<');
- while ((i = *bits++)) {
- if (v & (1 << (i-1))) {
- if (any)
- putchar(',');
- any = 1;
- for (; (c = *bits) > 32; bits++)
- putchar(c);
- } else
- for (; *bits > 32; bits++)
- ;
- }
- putchar('>');
- }
-}
-
-void
-usage(void)
-{
- (void)fprintf(stderr, "usage: mt [-f device] command [count]\n");
- exit(1);
-}
-
-struct densities {
- int dens;
- int bpmm;
- int bpi;
- const char *name;
-} dens[] = {
- /*
- * Taken from T10 Project 997D
- * SCSI-3 Stream Device Commands (SSC)
- * Revision 11, 4-Nov-97
- */
- /*Num. bpmm bpi Reference */
- { 0x1, 32, 800, "X3.22-1983" },
- { 0x2, 63, 1600, "X3.39-1986" },
- { 0x3, 246, 6250, "X3.54-1986" },
- { 0x5, 315, 8000, "X3.136-1986" },
- { 0x6, 126, 3200, "X3.157-1987" },
- { 0x7, 252, 6400, "X3.116-1986" },
- { 0x8, 315, 8000, "X3.158-1987" },
- { 0x9, 491, 37871, "X3.180" },
- { 0xA, 262, 6667, "X3B5/86-199" },
- { 0xB, 63, 1600, "X3.56-1986" },
- { 0xC, 500, 12690, "HI-TC1" },
- { 0xD, 999, 25380, "HI-TC2" },
- { 0xF, 394, 10000, "QIC-120" },
- { 0x10, 394, 10000, "QIC-150" },
- { 0x11, 630, 16000, "QIC-320" },
- { 0x12, 2034, 51667, "QIC-1350" },
- { 0x13, 2400, 61000, "X3B5/88-185A" },
- { 0x14, 1703, 43245, "X3.202-1991" },
- { 0x15, 1789, 45434, "ECMA TC17" },
- { 0x16, 394, 10000, "X3.193-1990" },
- { 0x17, 1673, 42500, "X3B5/91-174" },
- { 0x18, 1673, 42500, "X3B5/92-50" },
- { 0x19, 2460, 62500, "DLTapeIII" },
- { 0x1A, 3214, 81633, "DLTapeIV(20GB)" },
- { 0x1B, 3383, 85937, "DLTapeIV(35GB)" },
- { 0x1C, 1654, 42000, "QIC-385M" },
- { 0x1D, 1512, 38400, "QIC-410M" },
- { 0x1E, 1385, 36000, "QIC-1000C" },
- { 0x1F, 2666, 67733, "QIC-2100C" },
- { 0x20, 2666, 67733, "QIC-6GB(M)" },
- { 0x21, 2666, 67733, "QIC-20GB(C)" },
- { 0x22, 1600, 40640, "QIC-2GB(C)" },
- { 0x23, 2666, 67733, "QIC-875M" },
- { 0x24, 2400, 61000, "DDS-2" },
- { 0x25, 3816, 97000, "DDS-3" },
- { 0x26, 3816, 97000, "DDS-4" },
- { 0x27, 3056, 77611, "Mammoth" },
- { 0x28, 1491, 37871, "X3.224" },
- { 0x41, 3868, 98250, "DLTapeIV(40GB)" },
- { 0x48, 5236, 133000, "SDLTapeI(110)" },
- { 0x49, 7598, 193000, "SDLTapeI(160)" },
- { 0, 0, 0, NULL }
-};
-
-struct compression_types {
- u_int32_t comp_number;
- const char *name;
-} comp_types[] = {
- { 0x00, "none" },
- { 0x00, "off" },
- { 0x10, "IDRC" },
- { 0x20, "DCLZ" },
- { 0xffffffff, "enable" },
- { 0xffffffff, "on" },
- { 0xf0f0f0f0, NULL}
-};
-
-const char *
-denstostring(int d)
-{
- static char buf[20];
- struct densities *sd;
-
- /* densities 0 and 0x7f are handled as special cases */
- if (d == 0)
- return "default";
- if (d == 0x7f)
- return "same";
- for (sd = dens; sd->dens; sd++)
- if (sd->dens == d)
- break;
- if (sd->dens == 0)
- sprintf(buf, "0x%02x", d);
- else
- sprintf(buf, "0x%02x:%s", d, sd->name);
- return buf;
-}
-
-/*
- * Given a specific density number, return either the bits per inch or bits
- * per millimeter for the given density.
- */
-int
-denstobp(int d, int bpi)
-{
- struct densities *sd;
-
- for (sd = dens; sd->dens; sd++)
- if (sd->dens == d)
- break;
- if (sd->dens == 0)
- return(0);
- else {
- if (bpi)
- return(sd->bpi);
- else
- return(sd->bpmm);
- }
-}
-
-int
-stringtodens(const char *s)
-{
- struct densities *sd;
- size_t l = strlen(s);
-
- for (sd = dens; sd->dens; sd++)
- if (strncasecmp(sd->name, s, l) == 0)
- break;
- return sd->dens;
-}
-
-
-const char *
-getblksiz(int bs)
-{
- static char buf[25];
- if (bs == 0)
- return "variable";
- else {
- sprintf(buf, "%d bytes", bs);
- return buf;
- }
-}
-
-const char *
-comptostring(u_int32_t comp)
-{
- static char buf[20];
- struct compression_types *ct;
-
- if (comp == MT_COMP_DISABLED)
- return "disabled";
- else if (comp == MT_COMP_UNSUPP)
- return "unsupported";
-
- for (ct = comp_types; ct->name; ct++)
- if (ct->comp_number == comp)
- break;
-
- if (ct->comp_number == 0xf0f0f0f0) {
- sprintf(buf, "0x%x", comp);
- return(buf);
- } else
- return(ct->name);
-}
-
-u_int32_t
-stringtocomp(const char *s)
-{
- struct compression_types *ct;
- size_t l = strlen(s);
-
- for (ct = comp_types; ct->name; ct++)
- if (strncasecmp(ct->name, s, l) == 0)
- break;
-
- return(ct->comp_number);
-}
-
-void
-st_status(struct mtget *bp)
-{
- printf("Mode Density Blocksize bpi "
- "Compression\n"
- "Current: %-17s %-12s %-7d %s\n"
- "---------available modes---------\n"
- "0: %-17s %-12s %-7d %s\n"
- "1: %-17s %-12s %-7d %s\n"
- "2: %-17s %-12s %-7d %s\n"
- "3: %-17s %-12s %-7d %s\n",
- denstostring(bp->mt_density), getblksiz(bp->mt_blksiz),
- denstobp(bp->mt_density, TRUE), comptostring(bp->mt_comp),
- denstostring(bp->mt_density0), getblksiz(bp->mt_blksiz0),
- denstobp(bp->mt_density0, TRUE), comptostring(bp->mt_comp0),
- denstostring(bp->mt_density1), getblksiz(bp->mt_blksiz1),
- denstobp(bp->mt_density1, TRUE), comptostring(bp->mt_comp1),
- denstostring(bp->mt_density2), getblksiz(bp->mt_blksiz2),
- denstobp(bp->mt_density2, TRUE), comptostring(bp->mt_comp2),
- denstostring(bp->mt_density3), getblksiz(bp->mt_blksiz3),
- denstobp(bp->mt_density3, TRUE), comptostring(bp->mt_comp3));
-
- if (bp->mt_dsreg != MTIO_DSREG_NIL) {
- auto char foo[32];
- const char sfmt[] = "Current Driver State: %s.\n";
- printf("---------------------------------\n");
- switch (bp->mt_dsreg) {
- case MTIO_DSREG_REST:
- printf(sfmt, "at rest");
- break;
- case MTIO_DSREG_RBSY:
- printf(sfmt, "Communicating with drive");
- break;
- case MTIO_DSREG_WR:
- printf(sfmt, "Writing");
- break;
- case MTIO_DSREG_FMK:
- printf(sfmt, "Writing Filemarks");
- break;
- case MTIO_DSREG_ZER:
- printf(sfmt, "Erasing");
- break;
- case MTIO_DSREG_RD:
- printf(sfmt, "Reading");
- break;
- case MTIO_DSREG_FWD:
- printf(sfmt, "Spacing Forward");
- break;
- case MTIO_DSREG_REV:
- printf(sfmt, "Spacing Reverse");
- break;
- case MTIO_DSREG_POS:
- printf(sfmt,
- "Hardware Positioning (direction unknown)");
- break;
- case MTIO_DSREG_REW:
- printf(sfmt, "Rewinding");
- break;
- case MTIO_DSREG_TEN:
- printf(sfmt, "Retensioning");
- break;
- case MTIO_DSREG_UNL:
- printf(sfmt, "Unloading");
- break;
- case MTIO_DSREG_LD:
- printf(sfmt, "Loading");
- break;
- default:
- (void) sprintf(foo, "Unknown state 0x%x", bp->mt_dsreg);
- printf(sfmt, foo);
- break;
- }
- }
- if (bp->mt_resid == 0 && bp->mt_fileno == (daddr_t) -1 &&
- bp->mt_blkno == (daddr_t) -1)
- return;
- printf("---------------------------------\n");
- printf("File Number: %d\tRecord Number: %d\tResidual Count %d\n",
- bp->mt_fileno, bp->mt_blkno, bp->mt_resid);
-}
-
-void
-warn_eof(void)
-{
- fprintf(stderr,
- "The \"eof\" command has been disabled.\n"
- "Use \"weof\" if you really want to write end-of-file marks,\n"
- "or \"eom\" if you rather want to skip to the end of "
- "recorded medium.\n");
- exit(1);
-}
diff --git a/usr.bin/nc/Makefile b/usr.bin/nc/Makefile
deleted file mode 100644
index a4400bc..0000000
--- a/usr.bin/nc/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-# $FreeBSD$
-
-.PATH: ${.CURDIR}/../../contrib/netcat
-
-PROG= nc
-SRCS= netcat.c atomicio.c socks.c
-
-CFLAGS+=-DIPSEC
-LDADD= -lipsec
-DPADD= ${LIBIPSEC}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ncal/Makefile b/usr.bin/ncal/Makefile
deleted file mode 100644
index 4ec8973..0000000
--- a/usr.bin/ncal/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-# $FreeBSD$
-
-PROG= ncal
-
-DPADD= ${LIBCALENDAR}
-LDADD= -lcalendar
-WARNS?= 1
-
-LINKS= ${BINDIR}/ncal ${BINDIR}/cal
-MLINKS= ncal.1 cal.1
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ncal/ncal.1 b/usr.bin/ncal/ncal.1
deleted file mode 100644
index 6bcddd2..0000000
--- a/usr.bin/ncal/ncal.1
+++ /dev/null
@@ -1,140 +0,0 @@
-.\" Copyright (c) 1997 Wolfgang Helbig
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd October 23, 2005
-.Dt CAL 1
-.Os
-.Sh NAME
-.Nm cal ,
-.Nm ncal
-.Nd displays a calendar and the date of easter
-.Sh SYNOPSIS
-.Nm
-.Op Fl jy
-.Oo
-.Op Ar month
-.Ar year
-.Oc
-.Nm
-.Op Fl j
-.Fl m Ar month
-.Op Ar year
-.Nm ncal
-.Op Fl jJpwy
-.Op Fl s Ar country_code
-.Oo
-.Op Ar month
-.Ar year
-.Oc
-.Nm ncal
-.Op Fl Jeo
-.Op Ar year
-.Sh DESCRIPTION
-The
-.Nm
-utility displays a simple calendar in traditional format and
-.Nm ncal
-offers an alternative layout, more options and the date of easter.
-The new format is a little cramped but it makes a year fit
-on a 25x80 terminal.
-If arguments are not specified,
-the current month is displayed.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl J
-Display Julian Calendar, if combined with the
-.Fl e
-option, display date of easter according to the Julian Calendar.
-.It Fl e
-Display date of easter (for western churches).
-.It Fl j
-Display Julian days (days one-based, numbered from January 1).
-.It Fl m Ar month
-Display the specified
-.Ar month .
-.It Fl o
-Display date of orthodox easter (Greek and Russian
-Orthodox Churches).
-.It Fl p
-Print the country codes and switching days from Julian to Gregorian
-Calendar as they are assumed by
-.Nm ncal .
-The country code as determined from the local environment is marked
-with an asterisk.
-.It Fl s Ar country_code
-Assume the switch from Julian to Gregorian Calendar at the date
-associated with the
-.Ar country_code .
-If not specified,
-.Nm ncal
-tries to guess the switch date from the local environment or
-falls back to September 2, 1752.
-This was when Great
-Britain and her colonies switched to the Gregorian Calendar.
-.It Fl w
-Print the number of the week below each week column.
-.It Fl y
-Display a calendar for the specified year.
-.El
-.Pp
-A single parameter specifies the year (1 - 9999) to be displayed;
-note the year must be fully specified:
-.Dq Li cal 89
-will
-.Em not
-display a calendar for 1989.
-Two parameters denote the month and year; the month is either a number between
-1 and 12, or a full or abbreviated name as specified by the current locale.
-Month and year default to those of the current system clock and time zone (so
-.Dq Li cal -m 8
-will display a calendar for the month of August in the current year).
-.Pp
-A year starts on Jan 1.
-.Sh SEE ALSO
-.Xr calendar 3 ,
-.Xr strftime 3
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v5 .
-The
-.Nm ncal
-command appeared in
-.Fx 2.2.6 .
-.Sh AUTHORS
-The
-.Nm ncal
-command and manual were written by
-.An Wolfgang Helbig Aq helbig@FreeBSD.org .
-.Sh BUGS
-The assignment of Julian\(emGregorian switching dates to
-country codes is historically naive for many countries.
-.Pp
-The
-.Nm
-utility does not recognize multibyte characters.
diff --git a/usr.bin/ncal/ncal.c b/usr.bin/ncal/ncal.c
deleted file mode 100644
index 7e0d5ee..0000000
--- a/usr.bin/ncal/ncal.c
+++ /dev/null
@@ -1,876 +0,0 @@
-/*-
- * Copyright (c) 1997 Wolfgang Helbig
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <calendar.h>
-#include <ctype.h>
-#include <err.h>
-#include <langinfo.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysexits.h>
-#include <time.h>
-#include <unistd.h>
-
-/* Width of one month with backward compatibility */
-#define MONTH_WIDTH_B_J 27
-#define MONTH_WIDTH_B 20
-
-#define MONTH_WIDTH_J 24
-#define MONTH_WIDTH 18
-
-#define MAX_WIDTH 28
-
-typedef struct date date;
-
-struct monthlines {
- char name[MAX_WIDTH + 1];
- char lines[7][MAX_WIDTH + 1];
- char weeks[MAX_WIDTH + 1];
-};
-
-struct weekdays {
- char names[7][4];
-};
-
-/* The switches from Julian to Gregorian in some countries */
-static struct djswitch {
- const char *cc; /* Country code according to ISO 3166 */
- const char *nm; /* Name of country */
- date dt; /* Last day of Julian calendar */
-} switches[] = {
- {"AL", "Albania", {1912, 11, 30}},
- {"AT", "Austria", {1583, 10, 5}},
- {"AU", "Australia", {1752, 9, 2}},
- {"BE", "Belgium", {1582, 12, 14}},
- {"BG", "Bulgaria", {1916, 3, 18}},
- {"CA", "Canada", {1752, 9, 2}},
- {"CH", "Switzerland", {1655, 2, 28}},
- {"CN", "China", {1911, 12, 18}},
- {"CZ", "Czech Republic",{1584, 1, 6}},
- {"DE", "Germany", {1700, 2, 18}},
- {"DK", "Denmark", {1700, 2, 18}},
- {"ES", "Spain", {1582, 10, 4}},
- {"FI", "Finland", {1753, 2, 17}},
- {"FR", "France", {1582, 12, 9}},
- {"GB", "United Kingdom",{1752, 9, 2}},
- {"GR", "Greece", {1924, 3, 9}},
- {"HU", "Hungary", {1587, 10, 21}},
- {"IS", "Iceland", {1700, 11, 16}},
- {"IT", "Italy", {1582, 10, 4}},
- {"JP", "Japan", {1918, 12, 18}},
- {"LI", "Lithuania", {1918, 2, 1}},
- {"LN", "Latin", {9999, 05, 31}},
- {"LU", "Luxembourg", {1582, 12, 14}},
- {"LV", "Latvia", {1918, 2, 1}},
- {"NL", "Netherlands", {1582, 12, 14}},
- {"NO", "Norway", {1700, 2, 18}},
- {"PL", "Poland", {1582, 10, 4}},
- {"PT", "Portugal", {1582, 10, 4}},
- {"RO", "Romania", {1919, 3, 31}},
- {"RU", "Russia", {1918, 1, 31}},
- {"SI", "Slovenia", {1919, 3, 4}},
- {"SW", "Sweden", {1753, 2, 17}},
- {"TR", "Turkey", {1926, 12, 18}},
- {"US", "United States", {1752, 9, 2}},
- {"YU", "Yugoslavia", {1919, 3, 4}}
-};
-
-struct djswitch *dftswitch =
- switches + sizeof(switches) / sizeof(struct djswitch) - 2;
- /* default switch (should be "US") */
-
-/* Table used to print day of month and week numbers */
-char daystr[] = " 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15"
- " 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31"
- " 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47"
- " 48 49 50 51 52 53";
-
-/* Table used to print day of year and week numbers */
-char jdaystr[] = " 1 2 3 4 5 6 7 8 9"
- " 10 11 12 13 14 15 16 17 18 19"
- " 20 21 22 23 24 25 26 27 28 29"
- " 30 31 32 33 34 35 36 37 38 39"
- " 40 41 42 43 44 45 46 47 48 49"
- " 50 51 52 53 54 55 56 57 58 59"
- " 60 61 62 63 64 65 66 67 68 69"
- " 70 71 72 73 74 75 76 77 78 79"
- " 80 81 82 83 84 85 86 87 88 89"
- " 90 91 92 93 94 95 96 97 98 99"
- " 100 101 102 103 104 105 106 107 108 109"
- " 110 111 112 113 114 115 116 117 118 119"
- " 120 121 122 123 124 125 126 127 128 129"
- " 130 131 132 133 134 135 136 137 138 139"
- " 140 141 142 143 144 145 146 147 148 149"
- " 150 151 152 153 154 155 156 157 158 159"
- " 160 161 162 163 164 165 166 167 168 169"
- " 170 171 172 173 174 175 176 177 178 179"
- " 180 181 182 183 184 185 186 187 188 189"
- " 190 191 192 193 194 195 196 197 198 199"
- " 200 201 202 203 204 205 206 207 208 209"
- " 210 211 212 213 214 215 216 217 218 219"
- " 220 221 222 223 224 225 226 227 228 229"
- " 230 231 232 233 234 235 236 237 238 239"
- " 240 241 242 243 244 245 246 247 248 249"
- " 250 251 252 253 254 255 256 257 258 259"
- " 260 261 262 263 264 265 266 267 268 269"
- " 270 271 272 273 274 275 276 277 278 279"
- " 280 281 282 283 284 285 286 287 288 289"
- " 290 291 292 293 294 295 296 297 298 299"
- " 300 301 302 303 304 305 306 307 308 309"
- " 310 311 312 313 314 315 316 317 318 319"
- " 320 321 322 323 324 325 326 327 328 329"
- " 330 331 332 333 334 335 336 337 338 339"
- " 340 341 342 343 344 345 346 347 348 349"
- " 350 351 352 353 354 355 356 357 358 359"
- " 360 361 362 363 364 365 366";
-
-int flag_weeks; /* user wants number of week */
-int nswitch; /* user defined switch date */
-int nswitchb; /* switch date for backward compatibility */
-
-char *center(char *s, char *t, int w);
-void mkmonth(int year, int month, int jd_flag, struct monthlines * monthl);
-void mkmonthb(int year, int month, int jd_flag, struct monthlines * monthl);
-void mkweekdays(struct weekdays * wds);
-int parsemonth(const char *s);
-void printcc(void);
-void printeaster(int year, int julian, int orthodox);
-void printmonth(int year, int month, int jd_flag);
-void printmonthb(int year, int month, int jd_flag);
-void printyear(int year, int jd_flag);
-void printyearb(int year, int jd_flag);
-int firstday(int y, int m);
-date *sdate(int ndays, struct date * d);
-date *sdateb(int ndays, struct date * d);
-int sndays(struct date * d);
-int sndaysb(struct date * d);
-static void usage(void);
-int weekdayb(int nd);
-
-int
-main(int argc, char *argv[])
-{
- struct djswitch *p, *q; /* to search user defined switch date */
- date never = {10000, 1, 1}; /* outside valid range of dates */
- date ukswitch = {1752, 9, 2};/* switch date for Great Britain */
- int ch; /* holds the option character */
- int m = 0; /* month */
- int y = 0; /* year */
- int flag_backward = 0; /* user called cal--backward compat. */
- int flag_hole_year = 0; /* user wants the whole year */
- int flag_julian_cal = 0; /* user wants Julian Calendar */
- int flag_julian_day = 0; /* user wants the Julian day
- * numbers */
- int flag_orthodox = 0; /* use wants Orthodox easter */
- int flag_easter = 0; /* use wants easter date */
- char *cp; /* character pointer */
- char *flag_month = NULL; /* requested month as string */
- const char *locale; /* locale to get country code */
-
- /*
- * Use locale to determine the country code,
- * and use the country code to determine the default
- * switchdate and date format from the switches table.
- */
- if (setlocale(LC_ALL, "") == NULL)
- warn("setlocale");
- locale = setlocale(LC_TIME, NULL);
- if (locale == NULL ||
- strcmp(locale, "C") == 0 ||
- strcmp(locale, "POSIX") == 0 ||
- strcmp(locale, "ASCII") == 0 ||
- strcmp(locale, "US-ASCII") == 0)
- locale = "_US";
- q = switches + sizeof(switches) / sizeof(struct djswitch);
- for (p = switches; p != q; p++)
- if ((cp = strstr(locale, p->cc)) != NULL && *(cp - 1) == '_')
- break;
- if (p == q) {
- nswitch = ndaysj(&dftswitch->dt);
- } else {
- nswitch = ndaysj(&p->dt);
- dftswitch = p;
- }
-
-
- /*
- * Get the filename portion of argv[0] and set flag_backward if
- * this program is called "cal".
- */
- cp = strrchr(argv[0], '/');
- cp = (cp == NULL) ? argv[0] : cp + 1;
- if (strcmp("cal", cp) == 0)
- flag_backward = 1;
-
- /* Set the switch date to United Kingdom if backwards compatible */
- if (flag_backward)
- nswitchb = ndaysj(&ukswitch);
-
- while ((ch = getopt(argc, argv, "Jejm:ops:wy")) != -1)
- switch (ch) {
- case 'J':
- if (flag_backward)
- usage();
- nswitch = ndaysj(&never);
- flag_julian_cal = 1;
- break;
- case 'e':
- if (flag_backward)
- usage();
- flag_easter = 1;
- break;
- case 'j':
- flag_julian_day = 1;
- break;
- case 'm':
- flag_month = optarg;
- break;
- case 'o':
- if (flag_backward)
- usage();
- flag_orthodox = 1;
- flag_easter = 1;
- break;
- case 'p':
- if (flag_backward)
- usage();
- printcc();
- return (0);
- break;
- case 's':
- if (flag_backward)
- usage();
- q = switches +
- sizeof(switches) / sizeof(struct djswitch);
- for (p = switches;
- p != q && strcmp(p->cc, optarg) != 0; p++)
- ;
- if (p == q)
- errx(EX_USAGE,
- "%s: invalid country code", optarg);
- nswitch = ndaysj(&(p->dt));
- break;
- case 'w':
- if (flag_backward)
- usage();
- flag_weeks = 1;
- break;
- case 'y':
- flag_hole_year = 1;
- break;
- default:
- usage();
- }
-
- argc -= optind;
- argv += optind;
-
- switch (argc) {
- case 2:
- if (flag_easter)
- usage();
- flag_month = *argv++;
- /* FALLTHROUGH */
- case 1:
- y = atoi(*argv++);
- if (y < 1 || y > 9999)
- errx(EX_USAGE, "year %d not in range 1..9999", y);
- break;
- case 0:
- {
- time_t t;
- struct tm *tm;
-
- t = time(NULL);
- tm = localtime(&t);
- y = tm->tm_year + 1900;
- m = tm->tm_mon + 1;
- }
- break;
- default:
- usage();
- }
-
- if (flag_month != NULL) {
- m = parsemonth(flag_month);
- if (m < 1 || m > 12)
- errx(EX_USAGE,
- "%s is neither a month number (1..12) nor a name",
- flag_month);
- }
-
- if (flag_easter)
- printeaster(y, flag_julian_cal, flag_orthodox);
- else if (argc == 1 || flag_hole_year)
- if (flag_backward)
- printyearb(y, flag_julian_day);
- else
- printyear(y, flag_julian_day);
- else
- if (flag_backward)
- printmonthb(y, m, flag_julian_day);
- else
- printmonth(y, m, flag_julian_day);
-
- return (0);
-}
-
-static void
-usage(void)
-{
-
- fputs(
- "usage: cal [-jy] [[month] year]\n"
- " cal [-j] [-m month] [year]\n"
- " ncal [-Jjpwy] [-s country_code] [[month] year]\n"
- " ncal [-Jeo] [year]\n", stderr);
- exit(EX_USAGE);
-}
-
-/* print the assumed switches for all countries */
-void
-printcc(void)
-{
- struct djswitch *p;
- int n; /* number of lines to print */
- int m; /* offset from left to right table entry on the same line */
-
-#define FSTR "%c%s %-15s%4d-%02d-%02d"
-#define DFLT(p) ((p) == dftswitch ? '*' : ' ')
-#define FSTRARG(p) DFLT(p), (p)->cc, (p)->nm, (p)->dt.y, (p)->dt.m, (p)->dt.d
-
- n = sizeof(switches) / sizeof(struct djswitch);
- m = (n + 1) / 2;
- n /= 2;
- for (p = switches; p != switches + n; p++)
- printf(FSTR" "FSTR"\n", FSTRARG(p), FSTRARG(p+m));
- if (m != n)
- printf(FSTR"\n", FSTRARG(p));
-}
-
-/* print the date of easter sunday */
-void
-printeaster(int y, int julian, int orthodox)
-{
- date dt;
- struct tm tm;
- char buf[80];
- static int d_first = -1;
-
- if (d_first < 0)
- d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
- /* force orthodox easter for years before 1583 */
- if (y < 1583)
- orthodox = 1;
-
- if (orthodox)
- if (julian)
- easteroj(y, &dt);
- else
- easterog(y, &dt);
- else
- easterg(y, &dt);
-
- memset(&tm, 0, sizeof(tm));
- tm.tm_year = dt.y - 1900;
- tm.tm_mon = dt.m - 1;
- tm.tm_mday = dt.d;
- strftime(buf, sizeof(buf), d_first ? "%e %B %Y" : "%B %e %Y", &tm);
- printf("%s\n", buf);
-}
-
-void
-printmonth(int y, int m, int jd_flag)
-{
- struct monthlines month;
- struct weekdays wds;
- int i;
-
- mkmonth(y, m - 1, jd_flag, &month);
- mkweekdays(&wds);
- printf(" %s %d\n", month.name, y);
- for (i = 0; i != 7; i++)
- printf("%.2s%s\n", wds.names[i], month.lines[i]);
- if (flag_weeks)
- printf(" %s\n", month.weeks);
-}
-
-void
-printmonthb(int y, int m, int jd_flag)
-{
- struct monthlines month;
- struct weekdays wds;
- char s[MAX_WIDTH], t[MAX_WIDTH];
- int i;
- int mw;
-
- mkmonthb(y, m - 1, jd_flag, &month);
- mkweekdays(&wds);
-
- mw = jd_flag ? MONTH_WIDTH_B_J : MONTH_WIDTH_B;
-
- sprintf(s, "%s %d", month.name, y);
- printf("%s\n", center(t, s, mw));
-
- if (jd_flag)
- printf(" %s %s %s %s %s %s %.2s\n", wds.names[6], wds.names[0],
- wds.names[1], wds.names[2], wds.names[3],
- wds.names[4], wds.names[5]);
- else
- printf("%s%s%s%s%s%s%.2s\n", wds.names[6], wds.names[0],
- wds.names[1], wds.names[2], wds.names[3],
- wds.names[4], wds.names[5]);
-
- for (i = 0; i != 6; i++)
- printf("%s\n", month.lines[i]+1);
-}
-
-void
-printyear(int y, int jd_flag)
-{
- struct monthlines year[12];
- struct weekdays wds;
- char s[80], t[80];
- int i, j;
- int mpl;
- int mw;
-
- for (i = 0; i != 12; i++)
- mkmonth(y, i, jd_flag, year + i);
- mkweekdays(&wds);
- mpl = jd_flag ? 3 : 4;
- mw = jd_flag ? MONTH_WIDTH_J : MONTH_WIDTH;
-
- sprintf(s, "%d", y);
- printf("%s\n", center(t, s, mpl * mw));
-
- for (j = 0; j != 12; j += mpl) {
- printf(" %-*s%-*s",
- mw, year[j].name,
- mw, year[j + 1].name);
- if (mpl == 3)
- printf("%s\n", year[j + 2].name);
- else
- printf("%-*s%s\n",
- mw, year[j + 2].name,
- year[j + 3].name);
- for (i = 0; i != 7; i++) {
- printf("%.2s%-*s%-*s",
- wds.names[i],
- mw, year[j].lines[i],
- mw, year[j + 1].lines[i]);
- if (mpl == 3)
- printf("%s\n", year[j + 2].lines[i]);
- else
- printf("%-*s%s\n",
- mw, year[j + 2].lines[i],
- year[j + 3].lines[i]);
- }
- if (flag_weeks) {
- if (mpl == 3)
- printf(" %-*s%-*s%-s\n",
- mw, year[j].weeks,
- mw, year[j + 1].weeks,
- year[j + 2].weeks);
- else
- printf(" %-*s%-*s%-*s%-s\n",
- mw, year[j].weeks,
- mw, year[j + 1].weeks,
- mw, year[j + 2].weeks,
- year[j + 3].weeks);
- }
- }
-}
-
-void
-printyearb(int y, int jd_flag)
-{
- struct monthlines year[12];
- struct weekdays wds;
- char s[80], t[80];
- int i, j;
- int mpl;
- int mw;
-
- for (i = 0; i != 12; i++)
- mkmonthb(y, i, jd_flag, year + i);
- mkweekdays(&wds);
- mpl = jd_flag ? 2 : 3;
- mw = jd_flag ? MONTH_WIDTH_B_J : MONTH_WIDTH_B;
-
- sprintf(s, "%d", y);
- printf("%s\n\n", center(t, s, mw * mpl + mpl));
-
- for (j = 0; j != 12; j += mpl) {
- printf("%-*s ", mw, center(s, year[j].name, mw));
- if (mpl == 2)
- printf("%s\n", center(s, year[j + 1].name, mw));
- else
- printf("%-*s %s\n", mw,
- center(s, year[j + 1].name, mw),
- center(t, year[j + 2].name, mw));
-
- if (mpl == 2)
- printf(" %s %s %s %s %s %s %s "
- " %s %s %s %s %s %s %.2s\n",
- wds.names[6], wds.names[0], wds.names[1],
- wds.names[2], wds.names[3], wds.names[4],
- wds.names[5],
- wds.names[6], wds.names[0], wds.names[1],
- wds.names[2], wds.names[3], wds.names[4],
- wds.names[5]);
- else
- printf("%s%s%s%s%s%s%s "
- "%s%s%s%s%s%s%s "
- "%s%s%s%s%s%s%.2s\n",
- wds.names[6], wds.names[0], wds.names[1],
- wds.names[2], wds.names[3], wds.names[4],
- wds.names[5],
- wds.names[6], wds.names[0], wds.names[1],
- wds.names[2], wds.names[3], wds.names[4],
- wds.names[5],
- wds.names[6], wds.names[0], wds.names[1],
- wds.names[2], wds.names[3], wds.names[4],
- wds.names[5]);
- for (i = 0; i != 6; i++) {
- if (mpl == 2)
- printf("%-*s %s\n",
- mw, year[j].lines[i]+1,
- year[j + 1].lines[i]+1);
- else
- printf("%-*s %-*s %s\n",
- mw, year[j].lines[i]+1,
- mw, year[j + 1].lines[i]+1,
- year[j + 2].lines[i]+1);
-
- }
- }
-}
-
-void
-mkmonth(int y, int m, int jd_flag, struct monthlines *mlines)
-{
-
- struct tm tm; /* for strftime printing local names of
- * months */
- date dt; /* handy date */
- int dw; /* width of numbers */
- int first; /* first day of month */
- int firstm; /* first day of first week of month */
- int i, j, k; /* just indices */
- int last; /* the first day of next month */
- int jan1 = 0; /* the first day of this year */
- char *ds; /* pointer to day strings (daystr or
- * jdaystr) */
-
- /* Set name of month. */
- memset(&tm, 0, sizeof(tm));
- tm.tm_mon = m;
- strftime(mlines->name, sizeof(mlines->name), "%OB", &tm);
- mlines->name[0] = toupper((unsigned char)mlines->name[0]);
-
- /*
- * Set first and last to the day number of the first day of this
- * month and the first day of next month respectively. Set jan1 to
- * the day number of the first day of this year.
- */
- first = firstday(y, m + 1);
- if (m == 11)
- last = firstday(y + 1, 1);
- else
- last = firstday(y, m + 2);
-
- if (jd_flag)
- jan1 = firstday(y, 1);
-
- /*
- * Set firstm to the day number of monday of the first week of
- * this month. (This might be in the last month)
- */
- firstm = first - weekday(first);
-
- /* Set ds (daystring) and dw (daywidth) according to the jd_flag */
- if (jd_flag) {
- ds = jdaystr;
- dw = 4;
- } else {
- ds = daystr;
- dw = 3;
- }
-
- /*
- * Fill the lines with day of month or day of year (julian day)
- * line index: i, each line is one weekday. column index: j, each
- * column is one day number. print column index: k.
- */
- for (i = 0; i != 7; i++) {
- for (j = firstm + i, k = 0; j < last; j += 7, k += dw)
- if (j >= first) {
- if (jd_flag)
- dt.d = j - jan1 + 1;
- else
- sdate(j, &dt);
- memcpy(mlines->lines[i] + k,
- ds + dt.d * dw, dw);
- } else
- memcpy(mlines->lines[i] + k, " ", dw);
- mlines->lines[i][k] = '\0';
-
- }
-
- /* fill the weeknumbers */
- if (flag_weeks) {
- for (j = firstm, k = 0; j < last; k += dw, j += 7)
- if (j <= nswitch)
- memset(mlines->weeks + k, ' ', dw);
- else
- memcpy(mlines->weeks + k,
- ds + week(j, &i)*dw, dw);
- mlines->weeks[k] = '\0';
- }
-}
-
-void
-mkmonthb(int y, int m, int jd_flag, struct monthlines *mlines)
-{
-
- struct tm tm; /* for strftime printing local names of
- * months */
- date dt; /* handy date */
- int dw; /* width of numbers */
- int first; /* first day of month */
- int firsts; /* sunday of first week of month */
- int i, j, k; /* just indices */
- int jan1 = 0; /* the first day of this year */
- int last; /* the first day of next month */
- char *ds; /* pointer to day strings (daystr or
- * jdaystr) */
-
- /* Set ds (daystring) and dw (daywidth) according to the jd_flag */
- if (jd_flag) {
- ds = jdaystr;
- dw = 4;
- } else {
- ds = daystr;
- dw = 3;
- }
-
- /* Set name of month centered */
- memset(&tm, 0, sizeof(tm));
- tm.tm_mon = m;
- strftime(mlines->name, sizeof(mlines->name), "%OB", &tm);
- mlines->name[0] = toupper((unsigned char)mlines->name[0]);
-
- /*
- * Set first and last to the day number of the first day of this
- * month and the first day of next month respectively. Set jan1 to
- * the day number of Jan 1st of this year.
- */
- dt.y = y;
- dt.m = m + 1;
- dt.d = 1;
- first = sndaysb(&dt);
- if (m == 11) {
- dt.y = y + 1;
- dt.m = 1;
- dt.d = 1;
- } else {
- dt.y = y;
- dt.m = m + 2;
- dt.d = 1;
- }
- last = sndaysb(&dt);
-
- if (jd_flag) {
- dt.y = y;
- dt.m = 1;
- dt.d = 1;
- jan1 = sndaysb(&dt);
- }
-
- /*
- * Set firsts to the day number of sunday of the first week of
- * this month. (This might be in the last month)
- */
- firsts = first - (weekday(first)+1) % 7;
-
- /*
- * Fill the lines with day of month or day of year (Julian day)
- * line index: i, each line is one week. column index: j, each
- * column is one day number. print column index: k.
- */
- for (i = 0; i != 6; i++) {
- for (j = firsts + 7 * i, k = 0; j < last && k != dw * 7;
- j++, k += dw)
- if (j >= first) {
- if (jd_flag)
- dt.d = j - jan1 + 1;
- else
- sdateb(j, &dt);
- memcpy(mlines->lines[i] + k,
- ds + dt.d * dw, dw);
- } else
- memcpy(mlines->lines[i] + k, " ", dw);
- if (k == 0)
- mlines->lines[i][1] = '\0';
- else
- mlines->lines[i][k] = '\0';
- }
-}
-
-/* Put the local names of weekdays into the wds */
-void
-mkweekdays(struct weekdays *wds)
-{
- int i, len;
- struct tm tm;
- char buf[20];
-
- memset(&tm, 0, sizeof(tm));
-
- for (i = 0; i != 7; i++) {
- tm.tm_wday = (i+1) % 7;
- strftime(buf, sizeof(buf), "%a", &tm);
- len = strlen(buf);
- if (len > 2)
- len = 2;
- strcpy(wds->names[i], " ");
- strncpy(wds->names[i] + 2 - len, buf, len);
- }
-}
-
-/*
- * Compute the day number of the first
- * existing date after the first day in month.
- * (the first day in month and even the month might not exist!)
- */
-int
-firstday(int y, int m)
-{
- date dt;
- int nd;
-
- dt.y = y;
- dt.m = m;
- dt.d = 1;
- nd = sndays(&dt);
- for (;;) {
- sdate(nd, &dt);
- if ((dt.m >= m && dt.y == y) || dt.y > y)
- return (nd);
- else
- nd++;
- }
- /* NEVER REACHED */
-}
-
-/*
- * Compute the number of days from date, obey the local switch from
- * Julian to Gregorian if specified by the user.
- */
-int
-sndays(struct date *d)
-{
-
- if (nswitch != 0)
- if (nswitch < ndaysj(d))
- return (ndaysg(d));
- else
- return (ndaysj(d));
- else
- return ndaysg(d);
-}
-
-/*
- * Compute the number of days from date, obey the switch from
- * Julian to Gregorian as used by UK and her colonies.
- */
-int
-sndaysb(struct date *d)
-{
-
- if (nswitchb < ndaysj(d))
- return (ndaysg(d));
- else
- return (ndaysj(d));
-}
-
-/* Inverse of sndays */
-struct date *
-sdate(int nd, struct date *d)
-{
-
- if (nswitch < nd)
- return (gdate(nd, d));
- else
- return (jdate(nd, d));
-}
-
-/* Inverse of sndaysb */
-struct date *
-sdateb(int nd, struct date *d)
-{
-
- if (nswitchb < nd)
- return (gdate(nd, d));
- else
- return (jdate(nd, d));
-}
-
-/* Center string t in string s of length w by putting enough leading blanks */
-char *
-center(char *s, char *t, int w)
-{
- char blanks[80];
-
- memset(blanks, ' ', sizeof(blanks));
- sprintf(s, "%.*s%s", (int)(w - strlen(t)) / 2, blanks, t);
- return (s);
-}
-
-int
-parsemonth(const char *s)
-{
- int v;
- char *cp;
- struct tm tm;
-
- v = (int)strtol(s, &cp, 10);
- if (cp != s)
- return (v);
- if (strptime(s, "%B", &tm) != NULL)
- return (tm.tm_mon + 1);
- if (strptime(s, "%b", &tm) != NULL)
- return (tm.tm_mon + 1);
- return (0);
-}
diff --git a/usr.bin/ncplist/Makefile b/usr.bin/ncplist/Makefile
deleted file mode 100644
index 8e6d189..0000000
--- a/usr.bin/ncplist/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# $FreeBSD$
-
-PROG= ncplist
-
-DPADD= ${LIBNCP} ${LIBIPX}
-LDADD= -lncp -lipx
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ncplist/ncplist.1 b/usr.bin/ncplist/ncplist.1
deleted file mode 100644
index 753be8f..0000000
--- a/usr.bin/ncplist/ncplist.1
+++ /dev/null
@@ -1,88 +0,0 @@
-.\" $FreeBSD$
-.Dd June 24, 1999
-.Dt NCPLIST 1
-.Os
-.Sh NAME
-.Nm ncplist
-.Nd "display various information about ncplib and NetWare servers"
-.Sh SYNOPSIS
-.Nm
-.Ar command
-.Op Ar arguments
-.Sh DESCRIPTION
-The
-.Nm
-utility displays the state of ncplib and NetWare servers.
-The first argument
-is a one-letter
-.Ar command
-that may be followed by
-.Ar arguments .
-.Pp
-The commands are:
-.Bl -tag -width indent
-.It Ic b Ar server type Op Ar pattern
-Lists bindery objects of
-.Ar type
-on a specified
-.Ar server .
-The
-.Ar type
-argument
-can be one of the following:
-.Pp
-.Bl -tag -width ".Cm pserver" -offset indent -compact
-.It Em Type
-.Em Meaning
-.It Cm user
-bindery users
-.It Cm group
-bindery groups
-.It Cm pserver
-bindery print servers
-.It Cm tree
-tree name hosted by given server
-.El
-.Pp
-Note that if you are not logged in to the specified server,
-the list may be incomplete or empty.
-.It Ic c
-List active NCP connections on the local machine.
-.It Ic s Op Ar server
-Display
-.Tn NetWare
-servers known to a given
-.Ar server .
-If no server is specified, the nearest server will be used.
-.It Ic u Ar server
-Displays a list of users logged in on a given
-.Ar server .
-If you are not logged in to the specified server,
-the list will be empty.
-.It Ic q Ar server Op Ar pattern
-Displays bindery queues on a given
-.Ar server .
-.It Ic v Ar server
-Displays mounted volumes on a given
-.Ar server .
-.El
-.Sh IMPLEMENTATION NOTES
-This utility is provided mostly for educational purposes.
-.Sh FILES
-.Bl -tag -width /var/log/wtmp -compact
-.It Pa ~/.nwfsrc
-keeps description for each connection.
-See
-.Pa /usr/share/examples/nwclient/dot.nwfsrc
-for details.
-.El
-.Sh HISTORY
-The
-.Nm
-utility first appeared in
-.Fx 4.0 .
-.Sh AUTHORS
-.An Boris Popov Aq bp@butya.kz ,
-.Aq rbp@chat.ru
-.Sh BUGS
-Please report any bugs to the author.
diff --git a/usr.bin/ncplist/ncplist.c b/usr.bin/ncplist/ncplist.c
deleted file mode 100644
index e2c2ce4..0000000
--- a/usr.bin/ncplist/ncplist.c
+++ /dev/null
@@ -1,477 +0,0 @@
-/*
- * Copyright (c) 1999, Boris Popov
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Boris Popov.
- * 4. Neither the name of the author nor the names of any co-contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/time.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <netncp/ncp_lib.h>
-
-extern char *__progname;
-
-static struct ncp_conn_stat conndesc;
-
-static void help(void);
-static void show_connlist(void);
-static void show_serverlist(char *server);
-static void show_userlist(char *server);
-static void list_volumes(char *server);
-static void str_trim_right(char *s, char c);
-
-
-static int
-ncp_get_connid(char *server, int justattach)
-{
- int connid, error;
- struct ncp_conn_loginfo li;
-
- connid = ncp_conn_find(server, NULL);
- if (connid > 0) {
- ncp_conn_getinfo(connid, &conndesc);
- return connid;
- }
- if (!justattach) {
- if (connid == -1) {
- printf("You are not attached to server %s\n",server);
- return -1;
- }
- printf("You are not attached to any server\n");
- return -1;
- }
- ncp_li_init(&li, 0, NULL);
- if (server) {
- ncp_li_setserver(&li, server);
- error = ncp_find_fileserver(&li, AF_IPX, NULL);
- if (error) {
- printf("Could not find server %s\n", li.server);
- return -1;
- }
- } else {
- error = ncp_find_fileserver(&li, AF_IPX, NULL);
- if (error) {
- printf("Can't find any file server\n");
- return -1;
- }
- }
- error = ncp_connect(&li, &connid);
- if (error) {
- printf("Can't attach to a nearest server\n");
- return -1;
- }
- ncp_conn_getinfo(connid, &conndesc);
- return connid;
-}
-
-static struct ncp_bitname conn_statenames [] = {
- {NCPFL_INVALID, "invalid"},
- {NCPFL_LOGGED, "active"},
- {NCPFL_PERMANENT, "permanent"},
- {NCPFL_PRIMARY, "primary"},
- {0, NULL}
-};
-
-static void
-str_trim_right(char *s, char c)
-{
- int len;
-
- for (len = strlen(s) - 1; len > 0 && s[len] == c; len--)
- s[len] = '\0';
-}
-
-void
-show_connlist(void)
-{
- void *p;
- int cnt;
- char buf[200];
- struct ncp_conn_stat *ncsp;
-
- printf("Active NCP connections:\n");
- p = ncp_conn_list();
- if (p == NULL) {
- printf("None\n");
- return;
- }
- printf(" refid server:user(connid), owner:group(mode), refs, <state>\n");
- cnt = *(int*)p;
- ncsp = (struct ncp_conn_stat*)(((int*)p)+1);
- while (cnt--) {
- printf("%6d %s:%s(%d), %s:%s(%o), %d, %s",
- ncsp->connRef, ncsp->li.server,ncsp->user,ncsp->connid,
- user_from_uid(ncsp->owner, 0),
- group_from_gid(ncsp->group, 0),
- ncsp->li.access_mode,
- ncsp->ref_cnt,
- ncp_printb(buf, ncsp->flags, conn_statenames));
- printf("\n");
- ncsp++;
- }
- free(p);
- printf("\n");
-}
-
-void
-show_serverlist(char *server)
-{
- int found = 0, connid;
- struct ncp_bindery_object obj;
- char *pattern = "*";
-
- connid = ncp_get_connid(server, 1);
- if (connid < 0)
- return;
- printf("Visible servers (from %s):\n", conndesc.li.server);
- printf("Name Network Node Port\n");
- printf("----------------------------------------------- -------- ------------ ----\n");
- obj.object_id = 0xffffffff;
-
- while (ncp_scan_bindery_object(connid, obj.object_id, NCP_BINDERY_FSERVER,
- pattern, &obj) == 0) {
- struct nw_property prop;
- struct ipx_addr *naddr = (struct ipx_addr *) &prop;
-
- found = 1;
- printf("%-48s", obj.object_name);
-
- if (ncp_read_property_value(connid, NCP_BINDERY_FSERVER,
- obj.object_name, 1, "NET_ADDRESS",
- &prop) == 0) {
- ipx_print_addr(naddr);
- }
- printf("\n");
- }
-
- if (!found) {
- printf("No servers found\n");
- }
- printf("\n");
-}
-
-
-void
-show_userlist(char *server)
-{
- int connid, error, i;
- struct ncp_file_server_info info;
- struct ncp_bindery_object user;
- time_t login_time;
- struct ipx_addr addr;
- u_int8_t conn_type;
-
- connid = ncp_get_connid(server, 0);
- if (connid < 0) return;
- if (ncp_get_file_server_information(connid, &info) != 0) {
- perror("Could not get server information");
- return;
- }
- printf("User information for server %s\n",info.ServerName);
- printf("\n%-6s%-21s%-27s%-12s\n"
- "---------------------------------------------"
- "---------------------------------\n",
- "Conn",
- "User name",
- "Station Address",
- "Login time");
- for (i = 1; i <= info.MaximumServiceConnections; i++) {
- char name[49];
- name[48] = '\0';
- error = ncp_get_stations_logged_info(connid, i, &user, &login_time);
- if (error) continue;
- memset(&addr, 0, sizeof(addr));
- error = ncp_get_internet_address(connid, i, &addr, &conn_type);
- if (error) continue;
- memcpy(name, user.object_name, 48);
- str_trim_right(name, ' ');
- printf("%4d: %-20s ", i, name);
- ipx_print_addr(&addr);
- printf(" ");
- printf("%s", ctime(&login_time));
- }
-
- return;
-}
-
-void
-show_queuelist(char *server, char *patt)
-{
- struct ncp_bindery_object q;
- int found = 0, connid;
- char default_pattern[] = "*";
- char *pattern = default_pattern;
-
- connid = ncp_get_connid(server, 1);
- if (connid < 0) return;
- if (patt != NULL)
- pattern = patt;
- ncp_str_upper(pattern);
-
- printf("\nServer: %s\n", server);
- printf("%-52s%-10s\n"
- "-----------------------------------------------"
- "-------------\n",
- "Print queue name",
- "Queue ID");
- q.object_id = 0xffffffff;
-
- while (ncp_scan_bindery_object(connid, q.object_id,
- NCP_BINDERY_PQUEUE, pattern, &q) == 0)
- {
- found = 1;
- printf("%-52s", q.object_name);
- printf("%08X\n", (unsigned int) q.object_id);
- }
-
- if (!found) {
- printf("No queues found\n");
- }
- return;
-}
-
-void
-list_volumes(char *server)
-{
- int found = 0, connid, i, error;
- struct ncp_file_server_info si;
- char volname[NCP_VOLNAME_LEN+1];
-
- connid = ncp_get_connid(server, 1);
- if (connid < 0) return;
-
- error = ncp_get_file_server_information(connid, &si);
- if (error) {
- ncp_error("Can't get information for server %s", error, server);
- return;
- }
-
- printf("\nMounted volumes on server %s:\n", server);
- printf("Number Name\n");
- printf("------ -----------------------------------------------\n");
-
- for(i = 0; i < si.NumberMountedVolumes; i++) {
- if (NWGetVolumeName(connid, i, volname))
- continue;
- found = 1;
- printf("%6d %s\n", i, volname);
- }
-
- if (!found)
- printf("No volumes found ?\n");
- return;
-}
-
-struct ncp_bind_type {
- u_long type;
- char *name;
-};
-
-static struct ncp_bind_type btypes[] = {
- {NCP_BINDERY_USER, "USER"},
- {NCP_BINDERY_UGROUP, "GROUP"},
- {NCP_BINDERY_PSERVER, "PSERVER"},
- {0x278, "TREE"},
- {0, NULL}
-};
-
-void
-list_bindery(char *server, char *type, char *patt)
-{
- struct ncp_bindery_object q;
- int i, found = 0, connid;
- char default_pattern[] = "*";
- char *pattern = default_pattern;
- u_long objtype;
-
- ncp_str_upper(type);
- objtype = 0;
-
- for(i = 0; btypes[i].type; i++) {
- if (strcmp(btypes[i].name, type) == 0) {
- objtype = btypes[i].type;
- break;
- }
- }
- if (!objtype) {
- printf("Bindery object of type %s is unknown\n", type);
- return;
- }
- if (patt != NULL)
- pattern = patt;
- ncp_str_upper(pattern);
- connid = ncp_get_connid(server, 1);
- if (connid < 0) return;
-
- connid = ncp_get_connid(server, 1);
- if (connid < 0) return;
-
-
- printf("\nServer: %s\n", server);
- printf("%-52s%-10s\n"
- "-----------------------------------------------"
- "-------------\n",
- "Object name",
- "Object ID");
-
- q.object_id = 0xffffffff;
- while (ncp_scan_bindery_object(connid, q.object_id,
- objtype, pattern, &q) == 0)
- {
- found = 1;
- printf("%-52s", q.object_name);
- printf("%08X\n", (unsigned int) q.object_id);
- }
-
- if (!found) {
- printf("No bindery objects found\n");
- }
- return;
-}
-
-enum listop {
- LO_NONE, LO_SERVERS, LO_QUEUES, LO_BINDERY, LO_USERS, LO_VOLUMES
-};
-
-#define MAX_ARGS 10
-
-int
-main(int argc, char *argv[])
-{
- int opt, wdone = 0, nargs = 0, i;
- enum listop what;
- char *args[MAX_ARGS];
-
- bzero(args, sizeof(args));
-
- what = LO_NONE;
- while ((opt = getopt(argc, argv, "h")) != -1) {
- switch (opt) {
- case 'h': case '?':
- help();
- /*NOTREACHED */
- default:
- help();
- return 1;
- }
- }
- if (optind >= argc)
- help();
-
- if(ncp_initlib())
- exit(1);
-
- switch(argv[optind++][0]) {
- case 'b':
- what = LO_BINDERY;
- nargs = 2;
- break;
- case 'c':
- show_connlist();
- return 0;
- case 's':
- what = LO_SERVERS;
- break;
- case 'u':
- what = LO_USERS;
- nargs = 1;
- break;
- case 'q':
- what = LO_QUEUES;
- nargs = 1;
- break;
- case 'v':
- what = LO_VOLUMES;
- nargs = 1;
- break;
- default:
- printf("Unknown command %s\n", argv[optind-1]);
- help();
- }
- for (i = 0; i < MAX_ARGS; i++) {
- if (optind < argc) {
- args[i] = argv[optind++];
- } else if (i < nargs) {
- printf("Not enough arguments\n");
- help();
- return 1;
- } else
- break;
- }
- switch(what) {
- case LO_SERVERS:
- show_serverlist(args[0]);
- wdone = 1;
- break;
- case LO_USERS:
- show_userlist(args[0]);
- wdone = 1;
- break;
- case LO_QUEUES:
- show_queuelist(args[0], args[1]);
- wdone = 1;
- break;
- case LO_VOLUMES:
- list_volumes(args[0]);
- wdone = 1;
- break;
- case LO_BINDERY:
- list_bindery(args[0], args[1], args[2]);
- wdone = 1;
- break;
- default:
- help();
- }
- return 0;
-}
-
-static void
-help(void)
-{
- printf("\n");
- printf("usage: %s command [args]\n", __progname);
- printf("where commands are:\n"
- " b server user|group [pattern] list bindery objects on server\n"
- " c display opened connections\n"
- " s [server] display known servers\n"
- " u server list logged-in users on server\n"
- " q server [pattern] list print queues on server\n"
- " v server list mounted volumes on a specified server\n"
- "\n");
- exit(1);
-}
diff --git a/usr.bin/ncplogin/Makefile b/usr.bin/ncplogin/Makefile
deleted file mode 100644
index 8795f29..0000000
--- a/usr.bin/ncplogin/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-# $FreeBSD$
-
-PROG= ncplogin
-MAN= ncplogin.1 ncplogout.1
-
-LINKS= ${BINDIR}/ncplogin ${BINDIR}/ncplogout
-
-LDADD= -lncp -lipx
-DPADD= ${LIBNCP} ${LIBIPX}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ncplogin/ncplogin.1 b/usr.bin/ncplogin/ncplogin.1
deleted file mode 100644
index 24b806a..0000000
--- a/usr.bin/ncplogin/ncplogin.1
+++ /dev/null
@@ -1,262 +0,0 @@
-.\" $FreeBSD$
-.Dd September 15, 1999
-.Dt NCPLOGIN 1
-.Os
-.Sh NAME
-.Nm ncplogin
-.Nd create permanent connection to a NetWare server
-.Sh SYNOPSIS
-.Nm
-.Op Fl BCDN
-.Op Fl S Ar server
-.Op Fl U Ar user
-.Op Fl A Ar host
-.Op Fl I Ar level
-.Op Fl M Ar mode
-.Oo
-.Fl O Xo
-.Op Ar owner Ns
-.Op : Ns Ar group
-.Xc
-.Oc
-.Op Fl R Ar retrycount
-.Op Fl T Ar tree
-.Op Fl W Ar timeout
-.Nm
-.Op Fl BCDN
-.Op Fl A Ar host
-.Op Fl I Ar level
-.Op Fl M Ar mode
-.Oo
-.Fl O Xo
-.Op Ar owner Ns
-.Op : Ns Ar group
-.Xc
-.Oc
-.Op Fl R Ar retrycount
-.Op Fl T Ar tree
-.Op Fl W Ar timeout
-.No / Ns Ar server Ns : Ns Ar user
-.Sh DESCRIPTION
-Connections to a
-.Tn NetWare
-server can be created and used independently of the
-.Xr mount_nwfs 8
-command.
-Connections can be created by any user.
-Each user can have multiple
-connections, but each
-.Ar NetWareServer Ns : Ns Ar NetWareUser
-pair should be unique.
-.Pp
-The
-.Nm
-command is used to create a permanent connection to a
-.Tn NetWare
-server.
-Permanent connections will stay open even if no application uses them.
-This allows users to run different
-.Pa ncp*
-programs
-without specifying a file server and user to use.
-Established connections can be destroyed with the
-.Xr ncplogout 1
-command.
-.Pp
-Upper case options described in this manual page
-are common for other
-.Pa ncp*
-programs and are referred to as
-.Dq connection options .
-Options
-.Fl U
-and
-.Fl S
-are mutually exclusive with the
-.No / Ns Ar server Ns : Ns Ar user
-syntax.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl S Ar server
-Specify the name of the
-.Tn NetWare
-server to connect to.
-This affects only
-.Tn IPX
-servers.
-For servers supporting
-.Tn IP
-natively, see the
-.Fl A
-option.
-.It Fl U Ar user
-Specify the name of the user used in the login sequence.
-.It Fl A Ar host
-Use the
-.Tn UDP
-protocol to connect to a
-.Tn NetWare
-5.x server specified by the
-.Ar host
-argument.
-.It Fl C
-Do not convert the password to uppercase.
-.It Fl D
-Mark the connection as primary.
-The option can be used to modify existing connections.
-Only the
-.Nm
-program accepts this option.
-.It Fl I Ar signature_level
-Try to use
-.Ar signature_level .
-Available values are:
-.Pp
-.Bl -tag -width ".Em Value" -offset indent -compact
-.It Em Value
-.Em Meaning
-.It 0
-disable signatures
-.It 1
-enable (use if required by server)
-.It 2
-request but do not require signing
-.It 3
-require signatures
-.El
-.Pp
-Note that only packet header signing is implemented.
-.It Fl M Ar mode
-Share this connection.
-The bits in the
-.Ar mode
-argument are similar to standard file permissions:
-.Pp
-.Bl -tag -width ".Em Mask" -offset indent -compact
-.It Em Mask
-.Em Meaning
-.It 4
-.Pq READ
-connection will be visible.
-.It 2
-.Pq WRITE
-connection can be closed/modified.
-.It 1
-.Pq EXECUTE
-user is allowed to execute requests.
-.El
-.Pp
-By default, the connection is created with
-.Ar mode
-0700
-and only the owner can use it.
-Specifying 0750 as the argument to the
-.Fl M
-option would allow read-only group access as well.
-This would allow the group to perform
-.Tn NCP
-requests,
-but not to destroy the connection.
-When a server is not explicitly specified,
-.Pa ncp*
-programs try to find a suitable connection in the following order:
-.Bl -enum -offset indent
-.It
-Try to find a connection owned by the user.
-If there is more than one such
-connection, try to determine which one is primary.
-(The primary flag is set with the
-.Fl D
-option.)
-.It
-If the primary connection could not be determined,
-the first shared connection will be used.
-.El
-.It Fl N
-Do not prompt for a password.
-At run time,
-.Nm
-reads the
-.Pa ~/.nwfsrc
-file for additional configuration parameters and a password.
-If no password is found for the specified
-.Ar server Ns : Ns Ar user
-pair,
-.Nm
-prompts for it.
-.It Fl O
-Specify the
-.Ar owner
-and
-.Ar group
-attributes for the connection.
-By default, newly created connections take the
-.Ar owner
-attribute from the creating user's username and the
-.Ar group
-attribute from the creating user's primary group.
-This option overrides that behaviour.
-Only the superuser can override the
-.Ar owner
-attribute for a connection.
-.It Fl P
-Mark the connection as permanent.
-The
-.Nm
-utility always creates permanent connections.
-This option can be useful in other
-.Pa ncp*
-programs.
-.It Fl R Ar retry_count
-Specify the number of retries to be performed
-before dropping the connection.
-The default value is 10.
-.Pp
-Note: after a connection is marked
-.Dq BAD ,
-each request will try to restore it.
-This process restores only the
-.Tn NCP
-connection;
-it does not reopen any files that were open
-at the time that the connection was marked
-.Dq BAD .
-.It Fl W Ar timeout
-Specify the server request timeout in seconds.
-The default is 5 seconds.
-.It / Ns Ar server Ns : Ns Ar user
-This syntax is provided for the sake of simplicity
-and is mutually exclusive with the
-.Fl S
-and
-.Fl U
-options.
-.El
-.Sh IMPLEMENTATION NOTES
-Low-level connection management is implemented in the
-.Pa ncp.ko
-kernel module.
-The
-.Xr IPXrouted 8
-program is also required for
-.Tn IPX
-support.
-.Sh FILES
-.Bl -tag -width ".Pa ~/.nwfsrc"
-.It Pa ~/.nwfsrc
-keeps static parameters for connections and other information;
-see
-.Pa /usr/share/examples/nwclient/dot.nwfsrc
-for details.
-.El
-.Sh HISTORY
-The
-.Nm
-command first appeared in
-.Fx 4.0 .
-.Sh AUTHORS
-.An Boris Popov Aq bp@butya.kz ,
-.Aq rbp@chat.ru
-.Sh BUGS
-Please report any bugs to the author.
diff --git a/usr.bin/ncplogin/ncplogin.c b/usr.bin/ncplogin/ncplogin.c
deleted file mode 100644
index 05b95c1..0000000
--- a/usr.bin/ncplogin/ncplogin.c
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (c) 1999, Boris Popov
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Boris Popov.
- * 4. Neither the name of the author nor the names of any co-contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/errno.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysexits.h>
-#include <unistd.h>
-
-#include <netncp/ncp_lib.h>
-#include <netncp/ncp_rcfile.h>
-
-extern char *__progname;
-
-static void
-login_usage(void) {
- printf("usage: %s [-Dh] [-A host] [-BCN] [-I level] [-M mode] \n"
- " [-R retrycount] [-W timeout] /server:user\n", __progname);
- exit(1);
-}
-
-static void
-logout_usage(void) {
- printf("usage: %s [-c handle] [-h] [/server:user]\n", __progname);
- exit(1);
-}
-
-static void
-login(int argc, char *argv[], struct ncp_conn_loginfo *li) {
- int error = 0, connid, opt, setprimary = 0;
-
- while ((opt = getopt(argc, argv, STDPARAM_OPT"D")) != -1) {
- switch(opt){
- case STDPARAM_ARGS:
- if (ncp_li_arg(li, opt, optarg))
- exit(1);
- break;
- case 'D':
- setprimary = 1;
- break;
- default:
- login_usage();
- /*NOTREACHED*/
- }
- }
- if (li->access_mode == 0)
- li->access_mode = S_IRWXU;
- if (ncp_li_check(li))
- exit(1);
- li->opt |= NCP_OPT_WDOG | NCP_OPT_PERMANENT;
- /* now we can try to login, or use already established connection */
- error = ncp_li_login(li, &connid);
- if (error) {
- ncp_error("Could not login to server %s", error, li->server);
- exit(1);
- }
- error = ncp_setpermanent(connid, 1);
- if (error && errno != EACCES){
- ncp_error("Can't make connection permanent", error);
- exit(1);
- }
- if (setprimary && ncp_setprimary(connid, 1) != 0)
- ncp_error("Warning: can't make connection primary", errno);
- printf("Logged in with conn handle:%d\n", connid);
- return;
-}
-
-static void
-logout(int argc, char *argv[], struct ncp_conn_loginfo *li) {
- int error = 0, connid, opt;
-
- connid = -1;
- while ((opt = getopt(argc, argv, STDPARAM_OPT"c:")) != -1){
- switch (opt) {
- case 'c':
- connid = atoi(optarg);
- break;
- case STDPARAM_ARGS:
- if (ncp_li_arg(li, opt, optarg))
- exit(1);
- break;
- default:
- logout_usage();
- /*NOTREACHED*/
- }
- }
- if (connid == -1) {
- if (li->server[0] == 0)
- errx(EX_USAGE, "no server name specified");
- if (li->user == 0)
- errx(EX_USAGE, "no user name specified");
- if (ncp_conn_scan(li, &connid))
- errx(EX_OSERR, "You are not attached to server %s",
- li->server);
- }
- if (ncp_setpermanent(connid, 0) < 0 && errno != EACCES) {
- ncp_error("Connection isn't valid", errno);
- exit(EX_OSERR);
- }
- error = ncp_disconnect(connid);
- if (error) {
- if (errno == EACCES) {
- warnx("you logged out, but connection belongs"
- "to other user and not closed");
- } else {
- ncp_error("Can't logout with connid %d", error, connid);
- error = 1;
- }
- }
- exit(error ? 1 : 0);
-}
-
-int
-main(int argc, char *argv[]) {
- int islogin, error;
- char *p, *p1;
- struct ncp_conn_loginfo li;
-
- islogin = strcmp(__progname, "ncplogin") == 0;
-
- if (argc == 2) {
- if (strcmp(argv[1], "-h") == 0) {
- if (islogin)
- login_usage();
- else
- logout_usage();
- }
- }
-
- if (ncp_initlib())
- exit(1);
- if (ncp_li_init(&li, argc, argv))
- return 1;
-
- if (argc >= 2 && argv[argc - 1][0] == '/') {
- p = argv[argc - 1];
- error = 1;
- do {
- if (*p++ != '/')
- break;
- p1 = strchr(p, ':');
- if (p1 == NULL)
- break;
- *p1++ = 0;
- if (ncp_li_setserver(&li, p))
- break;
- if (*p1 == 0)
- break;
- if (ncp_li_setuser(&li, p1)) break;
- error = 0;
- } while(0);
- if (error)
- errx(EX_DATAERR,
- "an error occured while parsing '%s'",
- argv[argc - 1]);
- }
-
- if (ncp_li_readrc(&li))
- return 1;
- if (ncp_rc)
- rc_close(ncp_rc);
- if (islogin)
- login(argc, argv, &li);
- else
- logout(argc, argv, &li);
- return 0;
-}
diff --git a/usr.bin/ncplogin/ncplogout.1 b/usr.bin/ncplogin/ncplogout.1
deleted file mode 100644
index bc220a7..0000000
--- a/usr.bin/ncplogin/ncplogout.1
+++ /dev/null
@@ -1,56 +0,0 @@
-.\" $FreeBSD$
-.Dd September 15, 1999
-.Dt NCPLOGOUT 1
-.Os
-.Sh NAME
-.Nm ncplogout
-.Nd schedule permanent connection to close
-.Sh SYNOPSIS
-.Nm
-.Op Fl S Ar server
-.Op Fl U Ar user
-.Op Fl c Ar handle
-.Nm
-.Op Fl c Ar handle
-.No / Ns Ar server Ns : Ns Ar user
-.Sh DESCRIPTION
-The
-.Nm
-utility will schedule a connection created by
-.Xr ncplogin 1
-command to be closed.
-If the connection is busy (i.e., used by other processes) it will
-be closed when the last process using it is terminated.
-This command is similar to the
-.Tn DOS
-.Pa logout.exe
-command.
-.Pp
-The options are:
-.Bl -tag -width indent
-.It Fl S Ar server
-Specify the name of the
-.Tn Netware
-server to which the connection should be terminated.
-Can be omitted if there is only
-one connection active.
-.It Fl U Ar user
-Specify the name of the user to use when identifying the connection.
-Can be omitted if there is only
-one connection active.
-.It Fl c Ar handle
-Close a connection by handle.
-A list of available handles can be obtained with the following command:
-.Pp
-.Dl "ncplist c"
-.El
-.Sh HISTORY
-The
-.Nm
-utility first appeared in
-.Fx 4.0 .
-.Sh AUTHORS
-.An Boris Popov Aq bp@butya.kz ,
-.Aq bp@FreeBSD.org
-.Sh BUGS
-Please report any bugs to the author.
diff --git a/usr.bin/netstat/Makefile b/usr.bin/netstat/Makefile
deleted file mode 100644
index bb73c67..0000000
--- a/usr.bin/netstat/Makefile
+++ /dev/null
@@ -1,40 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/12/93
-# $FreeBSD$
-
-.include <bsd.own.mk>
-
-PROG= netstat
-SRCS= if.c inet.c main.c mbuf.c mcast.c mroute.c route.c \
- unix.c atalk.c mroute6.c ipsec.c bpf.c pfkey.c sctp.c
-
-WARNS?= 3
-CFLAGS+=-fno-strict-aliasing
-
-CFLAGS+=-DIPSEC
-CFLAGS+=-DSCTP
-
-.if ${MK_INET6_SUPPORT} != "no"
-SRCS+= inet6.c
-CFLAGS+=-DINET6
-.endif
-
-BINGRP= kmem
-BINMODE=2555
-DPADD= ${LIBKVM} ${LIBMEMSTAT} ${LIBUTIL}
-LDADD= -lkvm -lmemstat -lutil
-
-.if ${MK_NETGRAPH_SUPPORT} != "no"
-SRCS+= netgraph.c
-DPADD+= ${LIBNETGRAPH}
-LDADD+= -lnetgraph
-CFLAGS+=-DNETGRAPH
-.endif
-
-.if ${MK_IPX_SUPPORT} != "no"
-SRCS+= ipx.c
-DPADD+= ${LIBIPX}
-LDADD+= -lipx
-CFLAGS+=-DIPX
-.endif
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/netstat/atalk.c b/usr.bin/netstat/atalk.c
deleted file mode 100644
index 9ed4820..0000000
--- a/usr.bin/netstat/atalk.c
+++ /dev/null
@@ -1,289 +0,0 @@
-/*-
- * Copyright (c) 1983, 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)atalk.c 1.1 (Whistle) 6/6/96";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/protosw.h>
-
-#include <arpa/inet.h>
-#include <net/route.h>
-
-#include <netatalk/at.h>
-#include <netatalk/ddp_var.h>
-
-#include <errno.h>
-#include <nlist.h>
-#include <netdb.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-#include "netstat.h"
-
-struct ddpcb ddpcb;
-struct socket sockb;
-
-static int first = 1;
-
-/*
- * Print a summary of connections related to a Network Systems
- * protocol. For XXX, also give state of connection.
- * Listening processes (aflag) are suppressed unless the
- * -a (all) flag is specified.
- */
-
-static const char *
-at_pr_net(struct sockaddr_at *sat, int numeric)
-{
-static char mybuf[50];
-
- if (!numeric) {
- switch(sat->sat_addr.s_net) {
- case 0xffff:
- return "????";
- case ATADDR_ANYNET:
- return("*");
- }
- }
- sprintf(mybuf,"%hu",ntohs(sat->sat_addr.s_net));
- return mybuf;
-}
-
-static const char *
-at_pr_host(struct sockaddr_at *sat, int numeric)
-{
-static char mybuf[50];
-
- if (!numeric) {
- switch(sat->sat_addr.s_node) {
- case ATADDR_BCAST:
- return "bcast";
- case ATADDR_ANYNODE:
- return("*");
- }
- }
- sprintf(mybuf,"%d",(unsigned int)sat->sat_addr.s_node);
- return mybuf;
-}
-
-static const char *
-at_pr_port(struct sockaddr_at *sat)
-{
-static char mybuf[50];
- struct servent *serv;
-
- switch(sat->sat_port) {
- case ATADDR_ANYPORT:
- return("*");
- case 0xff:
- return "????";
- default:
- if (numeric_port) {
- (void)snprintf(mybuf, sizeof(mybuf), "%d",
- (unsigned int)sat->sat_port);
- } else {
- serv = getservbyport(sat->sat_port, "ddp");
- if (serv == NULL)
- (void)snprintf(mybuf, sizeof(mybuf), "%d",
- (unsigned int) sat->sat_port);
- else
- (void) snprintf(mybuf, sizeof(mybuf), "%s",
- serv->s_name);
- }
- }
- return mybuf;
-}
-
-static char *
-at_pr_range(struct sockaddr_at *sat)
-{
-static char mybuf[50];
-
- if(sat->sat_range.r_netrange.nr_firstnet
- != sat->sat_range.r_netrange.nr_lastnet) {
- sprintf(mybuf,"%d-%d",
- ntohs(sat->sat_range.r_netrange.nr_firstnet),
- ntohs(sat->sat_range.r_netrange.nr_lastnet));
- } else {
- sprintf(mybuf,"%d",
- ntohs(sat->sat_range.r_netrange.nr_firstnet));
- }
- return mybuf;
-}
-
-
-/* what == 0 for addr only == 3 */
-/* 1 for net */
-/* 2 for host */
-/* 4 for port */
-/* 8 for numeric only */
-char *
-atalk_print(struct sockaddr *sa, int what)
-{
- struct sockaddr_at *sat = (struct sockaddr_at *)sa;
- static char mybuf[50];
- int numeric = (what & 0x08);
-
- mybuf[0] = 0;
- switch (what & 0x13) {
- case 0:
- mybuf[0] = 0;
- break;
- case 1:
- sprintf(mybuf,"%s",at_pr_net(sat, numeric));
- break;
- case 2:
- sprintf(mybuf,"%s",at_pr_host(sat, numeric));
- break;
- case 3:
- sprintf(mybuf,"%s.%s",
- at_pr_net(sat, numeric),
- at_pr_host(sat, numeric));
- break;
- case 0x10:
- sprintf(mybuf,"%s", at_pr_range(sat));
- }
- if (what & 4) {
- sprintf(mybuf+strlen(mybuf),".%s",at_pr_port(sat));
- }
- return mybuf;
-}
-
-char *
-atalk_print2(struct sockaddr *sa, struct sockaddr *mask, int what)
-{
- int n;
- static char buf[100];
- struct sockaddr_at *sat1, *sat2;
- struct sockaddr_at thesockaddr;
- struct sockaddr *sa2;
-
- sat1 = (struct sockaddr_at *)sa;
- sat2 = (struct sockaddr_at *)mask;
- sa2 = (struct sockaddr *)&thesockaddr;
-
- thesockaddr.sat_addr.s_net = sat1->sat_addr.s_net & sat2->sat_addr.s_net;
- snprintf(buf, sizeof(buf), "%s", atalk_print(sa2, 1 |(what & 8)));
- if(sat2->sat_addr.s_net != 0xFFFF) {
- thesockaddr.sat_addr.s_net = sat1->sat_addr.s_net | ~sat2->sat_addr.s_net;
- n = strlen(buf);
- snprintf(buf + n, sizeof(buf) - n, "-%s", atalk_print(sa2, 1 |(what & 8)));
- }
- if(what & 2) {
- n = strlen(buf);
- snprintf(buf + n, sizeof(buf) - n, ".%s", atalk_print(sa, what & (~1)));
- }
- return(buf);
-}
-
-void
-atalkprotopr(u_long off __unused, const char *name, int af1 __unused,
- int proto __unused)
-{
- struct ddpcb *this, *next;
-
- if (off == 0)
- return;
- kread(off, (char *)&this, sizeof (struct ddpcb *));
- for ( ; this != NULL; this = next) {
- kread((u_long)this, (char *)&ddpcb, sizeof (ddpcb));
- next = ddpcb.ddp_next;
-#if 0
- if (!aflag && atalk_nullhost(ddpcb.ddp_lsat) ) {
- continue;
- }
-#endif
- kread((u_long)ddpcb.ddp_socket, (char *)&sockb, sizeof (sockb));
- if (first) {
- printf("Active ATALK connections");
- if (aflag)
- printf(" (including servers)");
- putchar('\n');
- if (Aflag)
- printf("%-8.8s ", "PCB");
- printf(Aflag ?
- "%-5.5s %-6.6s %-6.6s %-18.18s %-18.18s %s\n" :
- "%-5.5s %-6.6s %-6.6s %-22.22s %-22.22s %s\n",
- "Proto", "Recv-Q", "Send-Q",
- "Local Address", "Foreign Address", "(state)");
- first = 0;
- }
- if (Aflag)
- printf("%8lx ", (u_long) this);
- printf("%-5.5s %6u %6u ", name, sockb.so_rcv.sb_cc,
- sockb.so_snd.sb_cc);
- printf(Aflag?" %-18.18s":" %-22.22s", atalk_print(
- (struct sockaddr *)&ddpcb.ddp_lsat,7));
- printf(Aflag?" %-18.18s":" %-22.22s", atalk_print(
- (struct sockaddr *)&ddpcb.ddp_fsat,7));
- putchar('\n');
- }
-}
-
-#define ANY(x,y,z) if (x || sflag <= 1) \
- printf("\t%lu %s%s%s\n",x,y,plural(x),z)
-
-/*
- * Dump DDP statistics structure.
- */
-void
-ddp_stats(u_long off __unused, const char *name, int af1 __unused,
- int proto __unused)
-{
- struct ddpstat ddpstat;
-
- if (off == 0)
- return;
- kread(off, (char *)&ddpstat, sizeof (ddpstat));
- printf("%s:\n", name);
- ANY(ddpstat.ddps_short, "packet", " with short headers ");
- ANY(ddpstat.ddps_long, "packet", " with long headers ");
- ANY(ddpstat.ddps_nosum, "packet", " with no checksum ");
- ANY(ddpstat.ddps_tooshort, "packet", " too short ");
- ANY(ddpstat.ddps_badsum, "packet", " with bad checksum ");
- ANY(ddpstat.ddps_toosmall, "packet", " with not enough data ");
- ANY(ddpstat.ddps_forward, "packet", " forwarded ");
- ANY(ddpstat.ddps_encap, "packet", " encapsulated ");
- ANY(ddpstat.ddps_cantforward, "packet", " rcvd for unreachable dest ");
- ANY(ddpstat.ddps_nosockspace, "packet", " dropped due to no socket space ");
-}
diff --git a/usr.bin/netstat/bpf.c b/usr.bin/netstat/bpf.c
deleted file mode 100644
index 4455d04..0000000
--- a/usr.bin/netstat/bpf.c
+++ /dev/null
@@ -1,135 +0,0 @@
-/*-
- * Copyright (c) 2005 Christian S.J. Peron
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/protosw.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/sysctl.h>
-#include <sys/param.h>
-#include <sys/user.h>
-
-#include <net/if.h>
-#include <net/if_var.h>
-#include <net/bpf.h>
-#include <net/bpfdesc.h>
-#include <arpa/inet.h>
-
-#include <err.h>
-#include <errno.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "netstat.h"
-
-/* print bpf stats */
-
-static char *
-bpf_pidname(pid_t pid)
-{
- struct kinfo_proc newkp;
- int error, mib[4];
- size_t size;
-
- mib[0] = CTL_KERN;
- mib[1] = KERN_PROC;
- mib[2] = KERN_PROC_PID;
- mib[3] = pid;
- size = sizeof(newkp);
- error = sysctl(mib, 4, &newkp, &size, NULL, 0);
- if (error < 0) {
- warn("kern.proc.pid failed");
- return (strdup("??????"));
- }
- return (strdup(newkp.ki_comm));
-}
-
-static void
-bpf_flags(struct xbpf_d *bd, char *flagbuf)
-{
-
- *flagbuf++ = bd->bd_promisc ? 'p' : '-';
- *flagbuf++ = bd->bd_immediate ? 'i' : '-';
- *flagbuf++ = bd->bd_hdrcmplt ? '-' : 'f';
- *flagbuf++ = (bd->bd_direction == BPF_D_IN) ? '-' :
- ((bd->bd_direction == BPF_D_OUT) ? 'o' : 's');
- *flagbuf++ = bd->bd_feedback ? 'b' : '-';
- *flagbuf++ = bd->bd_async ? 'a' : '-';
- *flagbuf++ = bd->bd_locked ? 'l' : '-';
- *flagbuf++ = '\0';
-}
-
-void
-bpf_stats(char *ifname)
-{
- struct xbpf_d *d, *bd;
- char *pname, flagbuf[12];
- size_t size;
-
- if (sysctlbyname("net.bpf.stats", NULL, &size,
- NULL, 0) < 0) {
- warn("net.bpf.stats");
- return;
- }
- if (size == 0)
- return;
- bd = malloc(size);
- if (bd == NULL) {
- warn("malloc failed");
- return;
- }
- if (sysctlbyname("net.bpf.stats", bd, &size,
- NULL, 0) < 0) {
- warn("net.bpf.stats");
- free(bd);
- return;
- }
- (void) printf("%5s %6s %7s %9s %9s %9s %5s %5s %s\n",
- "Pid", "Netif", "Flags", "Recv", "Drop", "Match", "Sblen",
- "Hblen", "Command");
- for (d = &bd[0]; d < &bd[size / sizeof(*d)]; d++) {
- if (d->bd_structsize != sizeof(*d)) {
- warnx("bpf_stats_extended: version mismatch");
- return;
- }
- if (ifname && strcmp(ifname, d->bd_ifname) != 0)
- continue;
- bpf_flags(d, flagbuf);
- pname = bpf_pidname(d->bd_pid);
- (void) printf("%5d %6s %7s %9ju %9ju %9ju %5d %5d %s\n",
- d->bd_pid, d->bd_ifname, flagbuf,
- d->bd_rcount, d->bd_dcount, d->bd_fcount,
- d->bd_slen, d->bd_hlen, pname);
- free(pname);
- }
- free(bd);
-}
diff --git a/usr.bin/netstat/if.c b/usr.bin/netstat/if.c
deleted file mode 100644
index aa28a6f..0000000
--- a/usr.bin/netstat/if.c
+++ /dev/null
@@ -1,701 +0,0 @@
-/*-
- * Copyright (c) 1983, 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)if.c 8.3 (Berkeley) 4/28/95";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/protosw.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/sysctl.h>
-#include <sys/time.h>
-
-#include <net/if.h>
-#include <net/if_var.h>
-#include <net/if_dl.h>
-#include <net/if_types.h>
-#include <net/ethernet.h>
-#include <net/pfvar.h>
-#include <net/if_pfsync.h>
-#include <netinet/in.h>
-#include <netinet/in_var.h>
-#include <netipx/ipx.h>
-#include <netipx/ipx_if.h>
-#include <arpa/inet.h>
-
-#include <err.h>
-#include <errno.h>
-#include <libutil.h>
-#include <signal.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "netstat.h"
-
-#define YES 1
-#define NO 0
-
-static void sidewaysintpr(int, u_long);
-static void catchalarm(int);
-
-#ifdef INET6
-static char ntop_buf[INET6_ADDRSTRLEN]; /* for inet_ntop() */
-#endif
-
-/*
- * Dump pfsync statistics structure.
- */
-void
-pfsync_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
-{
- struct pfsyncstats pfsyncstat, zerostat;
- size_t len = sizeof(struct pfsyncstats);
-
- if (live) {
- if (zflag)
- memset(&zerostat, 0, len);
- if (sysctlbyname("net.inet.pfsync.stats", &pfsyncstat, &len,
- zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
- if (errno != ENOENT)
- warn("sysctl: net.inet.pfsync.stats");
- return;
- }
- } else
- kread(off, &pfsyncstat, len);
-
- printf("%s:\n", name);
-
-#define p(f, m) if (pfsyncstat.f || sflag <= 1) \
- printf(m, (uintmax_t)pfsyncstat.f, plural(pfsyncstat.f))
-#define p2(f, m) if (pfsyncstat.f || sflag <= 1) \
- printf(m, (uintmax_t)pfsyncstat.f)
-
- p(pfsyncs_ipackets, "\t%ju packet%s received (IPv4)\n");
- p(pfsyncs_ipackets6, "\t%ju packet%s received (IPv6)\n");
- p(pfsyncs_badif, "\t\t%ju packet%s discarded for bad interface\n");
- p(pfsyncs_badttl, "\t\t%ju packet%s discarded for bad ttl\n");
- p(pfsyncs_hdrops, "\t\t%ju packet%s shorter than header\n");
- p(pfsyncs_badver, "\t\t%ju packet%s discarded for bad version\n");
- p(pfsyncs_badauth, "\t\t%ju packet%s discarded for bad HMAC\n");
- p(pfsyncs_badact,"\t\t%ju packet%s discarded for bad action\n");
- p(pfsyncs_badlen, "\t\t%ju packet%s discarded for short packet\n");
- p(pfsyncs_badval, "\t\t%ju state%s discarded for bad values\n");
- p(pfsyncs_stale, "\t\t%ju stale state%s\n");
- p(pfsyncs_badstate, "\t\t%ju failed state lookup/insert%s\n");
- p(pfsyncs_opackets, "\t%ju packet%s sent (IPv4)\n");
- p(pfsyncs_opackets6, "\t%ju packet%s sent (IPv6)\n");
- p2(pfsyncs_onomem, "\t\t%ju send failed due to mbuf memory error\n");
- p2(pfsyncs_oerrors, "\t\t%ju send error\n");
-#undef p
-#undef p2
-}
-
-/*
- * Display a formatted value, or a '-' in the same space.
- */
-static void
-show_stat(const char *fmt, int width, u_long value, short showvalue)
-{
- const char *lsep, *rsep;
- char newfmt[32];
-
- lsep = "";
- if (strncmp(fmt, "LS", 2) == 0) {
- lsep = " ";
- fmt += 2;
- }
- rsep = " ";
- if (strncmp(fmt, "NRS", 3) == 0) {
- rsep = "";
- fmt += 3;
- }
- if (showvalue == 0) {
- /* Print just dash. */
- sprintf(newfmt, "%s%%%ds%s", lsep, width, rsep);
- printf(newfmt, "-");
- return;
- }
-
- if (hflag) {
- char buf[5];
-
- /* Format in human readable form. */
- humanize_number(buf, sizeof(buf), (int64_t)value, "",
- HN_AUTOSCALE, HN_NOSPACE | HN_DECIMAL);
- sprintf(newfmt, "%s%%%ds%s", lsep, width, rsep);
- printf(newfmt, buf);
- } else {
- /* Construct the format string. */
- sprintf(newfmt, "%s%%%d%s%s", lsep, width, fmt, rsep);
- printf(newfmt, value);
- }
-}
-
-/*
- * Print a description of the network interfaces.
- */
-void
-intpr(int interval1, u_long ifnetaddr, void (*pfunc)(char *))
-{
- struct ifnet ifnet;
- struct ifnethead ifnethead;
- union {
- struct ifaddr ifa;
- struct in_ifaddr in;
-#ifdef INET6
- struct in6_ifaddr in6;
-#endif
- struct ipx_ifaddr ipx;
- } ifaddr;
- u_long ifaddraddr;
- u_long ifaddrfound;
- u_long ifnetfound;
- u_long opackets;
- u_long ipackets;
- u_long obytes;
- u_long ibytes;
- u_long omcasts;
- u_long imcasts;
- u_long oerrors;
- u_long ierrors;
- u_long collisions;
- short timer;
- int drops;
- struct sockaddr *sa = NULL;
- char name[IFNAMSIZ];
- short network_layer;
- short link_layer;
-
- if (ifnetaddr == 0) {
- printf("ifnet: symbol not defined\n");
- return;
- }
- if (interval1) {
- sidewaysintpr(interval1, ifnetaddr);
- return;
- }
- if (kread(ifnetaddr, (char *)&ifnethead, sizeof ifnethead) != 0)
- return;
- ifnetaddr = (u_long)TAILQ_FIRST(&ifnethead);
- if (kread(ifnetaddr, (char *)&ifnet, sizeof ifnet) != 0)
- return;
-
- if (!pfunc) {
- if (Wflag)
- printf("%-7.7s", "Name");
- else
- printf("%-5.5s", "Name");
- printf(" %5.5s %-13.13s %-17.17s %8.8s %5.5s",
- "Mtu", "Network", "Address", "Ipkts", "Ierrs");
- if (bflag)
- printf(" %10.10s","Ibytes");
- printf(" %8.8s %5.5s", "Opkts", "Oerrs");
- if (bflag)
- printf(" %10.10s","Obytes");
- printf(" %5s", "Coll");
- if (tflag)
- printf(" %s", "Time");
- if (dflag)
- printf(" %s", "Drop");
- putchar('\n');
- }
- ifaddraddr = 0;
- while (ifnetaddr || ifaddraddr) {
- struct sockaddr_in *sockin;
-#ifdef INET6
- struct sockaddr_in6 *sockin6;
-#endif
- char *cp;
- int n, m;
-
- network_layer = 0;
- link_layer = 0;
-
- if (ifaddraddr == 0) {
- ifnetfound = ifnetaddr;
- if (kread(ifnetaddr, (char *)&ifnet, sizeof ifnet) != 0)
- return;
- strlcpy(name, ifnet.if_xname, sizeof(name));
- ifnetaddr = (u_long)TAILQ_NEXT(&ifnet, if_link);
- if (interface != 0 && strcmp(name, interface) != 0)
- continue;
- cp = index(name, '\0');
-
- if (pfunc) {
- (*pfunc)(name);
- continue;
- }
-
- if ((ifnet.if_flags&IFF_UP) == 0)
- *cp++ = '*';
- *cp = '\0';
- ifaddraddr = (u_long)TAILQ_FIRST(&ifnet.if_addrhead);
- }
- ifaddrfound = ifaddraddr;
-
- /*
- * Get the interface stats. These may get
- * overriden below on a per-interface basis.
- */
- opackets = ifnet.if_opackets;
- ipackets = ifnet.if_ipackets;
- obytes = ifnet.if_obytes;
- ibytes = ifnet.if_ibytes;
- omcasts = ifnet.if_omcasts;
- imcasts = ifnet.if_imcasts;
- oerrors = ifnet.if_oerrors;
- ierrors = ifnet.if_ierrors;
- collisions = ifnet.if_collisions;
- timer = ifnet.if_timer;
- drops = ifnet.if_snd.ifq_drops;
-
- if (ifaddraddr == 0) {
- if (Wflag)
- printf("%-7.7s", name);
- else
- printf("%-5.5s", name);
- printf(" %5lu ", ifnet.if_mtu);
- printf("%-13.13s ", "none");
- printf("%-17.17s ", "none");
- } else {
- if (kread(ifaddraddr, (char *)&ifaddr, sizeof ifaddr)
- != 0) {
- ifaddraddr = 0;
- continue;
- }
-#define CP(x) ((char *)(x))
- cp = (CP(ifaddr.ifa.ifa_addr) - CP(ifaddraddr)) +
- CP(&ifaddr);
- sa = (struct sockaddr *)cp;
- if (af != AF_UNSPEC && sa->sa_family != af) {
- ifaddraddr =
- (u_long)TAILQ_NEXT(&ifaddr.ifa, ifa_link);
- continue;
- }
- if (Wflag)
- printf("%-7.7s", name);
- else
- printf("%-5.5s", name);
- printf(" %5lu ", ifnet.if_mtu);
- switch (sa->sa_family) {
- case AF_UNSPEC:
- printf("%-13.13s ", "none");
- printf("%-15.15s ", "none");
- break;
- case AF_INET:
- sockin = (struct sockaddr_in *)sa;
-#ifdef notdef
- /* can't use inet_makeaddr because kernel
- * keeps nets unshifted.
- */
- in = inet_makeaddr(ifaddr.in.ia_subnet,
- INADDR_ANY);
- printf("%-13.13s ", netname(in.s_addr,
- ifaddr.in.ia_subnetmask));
-#else
- printf("%-13.13s ",
- netname(htonl(ifaddr.in.ia_subnet),
- ifaddr.in.ia_subnetmask));
-#endif
- printf("%-17.17s ",
- routename(sockin->sin_addr.s_addr));
-
- network_layer = 1;
- break;
-#ifdef INET6
- case AF_INET6:
- sockin6 = (struct sockaddr_in6 *)sa;
- printf("%-13.13s ",
- netname6(&ifaddr.in6.ia_addr,
- &ifaddr.in6.ia_prefixmask.sin6_addr));
- printf("%-17.17s ",
- inet_ntop(AF_INET6,
- &sockin6->sin6_addr,
- ntop_buf, sizeof(ntop_buf)));
-
- network_layer = 1;
- break;
-#endif /*INET6*/
- case AF_IPX:
- {
- struct sockaddr_ipx *sipx =
- (struct sockaddr_ipx *)sa;
- u_long net;
- char netnum[10];
-
- *(union ipx_net *) &net = sipx->sipx_addr.x_net;
- sprintf(netnum, "%lx", (u_long)ntohl(net));
- printf("ipx:%-8s ", netnum);
-/* printf("ipx:%-8s ", netname(net, 0L)); */
- printf("%-17s ",
- ipx_phost((struct sockaddr *)sipx));
- }
-
- network_layer = 1;
- break;
-
- case AF_APPLETALK:
- printf("atalk:%-12.12s ",atalk_print(sa,0x10) );
- printf("%-11.11s ",atalk_print(sa,0x0b) );
- break;
- case AF_LINK:
- {
- struct sockaddr_dl *sdl =
- (struct sockaddr_dl *)sa;
- char linknum[10];
- cp = (char *)LLADDR(sdl);
- n = sdl->sdl_alen;
- sprintf(linknum, "<Link#%d>", sdl->sdl_index);
- m = printf("%-13.13s ", linknum);
- }
- goto hexprint;
- default:
- m = printf("(%d)", sa->sa_family);
- for (cp = sa->sa_len + (char *)sa;
- --cp > sa->sa_data && (*cp == 0);) {}
- n = cp - sa->sa_data + 1;
- cp = sa->sa_data;
- hexprint:
- while (--n >= 0)
- m += printf("%02x%c", *cp++ & 0xff,
- n > 0 ? ':' : ' ');
- m = 32 - m;
- while (m-- > 0)
- putchar(' ');
-
- link_layer = 1;
- break;
- }
-
- /*
- * Fixup the statistics for interfaces that
- * update stats for their network addresses
- */
- if (network_layer) {
- opackets = ifaddr.in.ia_ifa.if_opackets;
- ipackets = ifaddr.in.ia_ifa.if_ipackets;
- obytes = ifaddr.in.ia_ifa.if_obytes;
- ibytes = ifaddr.in.ia_ifa.if_ibytes;
- }
-
- ifaddraddr = (u_long)TAILQ_NEXT(&ifaddr.ifa, ifa_link);
- }
-
- show_stat("lu", 8, ipackets, link_layer|network_layer);
- show_stat("lu", 5, ierrors, link_layer);
- if (bflag)
- show_stat("lu", 10, ibytes, link_layer|network_layer);
-
- show_stat("lu", 8, opackets, link_layer|network_layer);
- show_stat("lu", 5, oerrors, link_layer);
- if (bflag)
- show_stat("lu", 10, obytes, link_layer|network_layer);
-
- show_stat("NRSlu", 5, collisions, link_layer);
- if (tflag)
- show_stat("LSd", 4, timer, link_layer);
- if (dflag)
- show_stat("LSd", 4, drops, link_layer);
- putchar('\n');
-
- if (aflag && ifaddrfound) {
- /*
- * Print family's multicast addresses
- */
- struct ifmultiaddr *multiaddr;
- struct ifmultiaddr ifma;
- union {
- struct sockaddr sa;
- struct sockaddr_in in;
-#ifdef INET6
- struct sockaddr_in6 in6;
-#endif /* INET6 */
- struct sockaddr_dl dl;
- } msa;
- const char *fmt;
-
- TAILQ_FOREACH(multiaddr, &ifnet.if_multiaddrs, ifma_link) {
- if (kread((u_long)multiaddr, (char *)&ifma,
- sizeof ifma) != 0)
- break;
- multiaddr = &ifma;
- if (kread((u_long)ifma.ifma_addr, (char *)&msa,
- sizeof msa) != 0)
- break;
- if (msa.sa.sa_family != sa->sa_family)
- continue;
-
- fmt = 0;
- switch (msa.sa.sa_family) {
- case AF_INET:
- fmt = routename(msa.in.sin_addr.s_addr);
- break;
-#ifdef INET6
- case AF_INET6:
- printf("%*s %-19.19s(refs: %d)\n",
- Wflag ? 27 : 25, "",
- inet_ntop(AF_INET6,
- &msa.in6.sin6_addr,
- ntop_buf,
- sizeof(ntop_buf)),
- ifma.ifma_refcount);
- break;
-#endif /* INET6 */
- case AF_LINK:
- switch (msa.dl.sdl_type) {
- case IFT_ETHER:
- case IFT_FDDI:
- fmt = ether_ntoa(
- (struct ether_addr *)
- LLADDR(&msa.dl));
- break;
- }
- break;
- }
- if (fmt) {
- printf("%*s %-17.17s",
- Wflag ? 27 : 25, "", fmt);
- if (msa.sa.sa_family == AF_LINK) {
- printf(" %8lu", imcasts);
- printf("%*s",
- bflag ? 17 : 6, "");
- printf(" %8lu", omcasts);
- }
- putchar('\n');
- }
- }
- }
- }
-}
-
-struct iftot {
- SLIST_ENTRY(iftot) chain;
- char ift_name[IFNAMSIZ]; /* interface name */
- u_long ift_ip; /* input packets */
- u_long ift_ie; /* input errors */
- u_long ift_op; /* output packets */
- u_long ift_oe; /* output errors */
- u_long ift_co; /* collisions */
- u_int ift_dr; /* drops */
- u_long ift_ib; /* input bytes */
- u_long ift_ob; /* output bytes */
-};
-
-u_char signalled; /* set if alarm goes off "early" */
-
-/*
- * Print a running summary of interface statistics.
- * Repeat display every interval1 seconds, showing statistics
- * collected over that interval. Assumes that interval1 is non-zero.
- * First line printed at top of screen is always cumulative.
- * XXX - should be rewritten to use ifmib(4).
- */
-static void
-sidewaysintpr(int interval1, u_long off)
-{
- struct ifnet ifnet;
- u_long firstifnet;
- struct ifnethead ifnethead;
- struct itimerval interval_it;
- struct iftot *iftot, *ip, *ipn, *total, *sum, *interesting;
- int line;
- int oldmask, first;
- u_long interesting_off;
-
- if (kread(off, (char *)&ifnethead, sizeof ifnethead) != 0)
- return;
- firstifnet = (u_long)TAILQ_FIRST(&ifnethead);
-
- if ((iftot = malloc(sizeof(struct iftot))) == NULL) {
- printf("malloc failed\n");
- exit(1);
- }
- memset(iftot, 0, sizeof(struct iftot));
-
- interesting = NULL;
- interesting_off = 0;
- for (off = firstifnet, ip = iftot; off;) {
- char name[IFNAMSIZ];
-
- if (kread(off, (char *)&ifnet, sizeof ifnet) != 0)
- break;
- strlcpy(name, ifnet.if_xname, sizeof(name));
- if (interface && strcmp(name, interface) == 0) {
- interesting = ip;
- interesting_off = off;
- }
- snprintf(ip->ift_name, sizeof(ip->ift_name), "(%s)", name);;
- if ((ipn = malloc(sizeof(struct iftot))) == NULL) {
- printf("malloc failed\n");
- exit(1);
- }
- memset(ipn, 0, sizeof(struct iftot));
- SLIST_NEXT(ip, chain) = ipn;
- ip = ipn;
- off = (u_long)TAILQ_NEXT(&ifnet, if_link);
- }
- if (interface && interesting == NULL)
- errx(1, "%s: unknown interface", interface);
- if ((total = malloc(sizeof(struct iftot))) == NULL) {
- printf("malloc failed\n");
- exit(1);
- }
- memset(total, 0, sizeof(struct iftot));
- if ((sum = malloc(sizeof(struct iftot))) == NULL) {
- printf("malloc failed\n");
- exit(1);
- }
- memset(sum, 0, sizeof(struct iftot));
-
- (void)signal(SIGALRM, catchalarm);
- signalled = NO;
- interval_it.it_interval.tv_sec = interval1;
- interval_it.it_interval.tv_usec = 0;
- interval_it.it_value = interval_it.it_interval;
- setitimer(ITIMER_REAL, &interval_it, NULL);
- first = 1;
-banner:
- printf("%17s %14s %16s", "input",
- interesting ? interesting->ift_name : "(Total)", "output");
- putchar('\n');
- printf("%10s %5s %10s %10s %5s %10s %5s",
- "packets", "errs", "bytes", "packets", "errs", "bytes", "colls");
- if (dflag)
- printf(" %5.5s", "drops");
- putchar('\n');
- fflush(stdout);
- line = 0;
-loop:
- if (interesting != NULL) {
- ip = interesting;
- if (kread(interesting_off, (char *)&ifnet, sizeof ifnet) != 0) {
- printf("???\n");
- exit(1);
- };
- if (!first) {
- show_stat("lu", 10, ifnet.if_ipackets - ip->ift_ip, 1);
- show_stat("lu", 5, ifnet.if_ierrors - ip->ift_ie, 1);
- show_stat("lu", 10, ifnet.if_ibytes - ip->ift_ib, 1);
- show_stat("lu", 10, ifnet.if_opackets - ip->ift_op, 1);
- show_stat("lu", 5, ifnet.if_oerrors - ip->ift_oe, 1);
- show_stat("lu", 10, ifnet.if_obytes - ip->ift_ob, 1);
- show_stat("NRSlu", 5,
- ifnet.if_collisions - ip->ift_co, 1);
- if (dflag)
- show_stat("LSu", 5,
- ifnet.if_snd.ifq_drops - ip->ift_dr, 1);
- }
- ip->ift_ip = ifnet.if_ipackets;
- ip->ift_ie = ifnet.if_ierrors;
- ip->ift_ib = ifnet.if_ibytes;
- ip->ift_op = ifnet.if_opackets;
- ip->ift_oe = ifnet.if_oerrors;
- ip->ift_ob = ifnet.if_obytes;
- ip->ift_co = ifnet.if_collisions;
- ip->ift_dr = ifnet.if_snd.ifq_drops;
- } else {
- sum->ift_ip = 0;
- sum->ift_ie = 0;
- sum->ift_ib = 0;
- sum->ift_op = 0;
- sum->ift_oe = 0;
- sum->ift_ob = 0;
- sum->ift_co = 0;
- sum->ift_dr = 0;
- for (off = firstifnet, ip = iftot;
- off && SLIST_NEXT(ip, chain) != NULL;
- ip = SLIST_NEXT(ip, chain)) {
- if (kread(off, (char *)&ifnet, sizeof ifnet) != 0) {
- off = 0;
- continue;
- }
- sum->ift_ip += ifnet.if_ipackets;
- sum->ift_ie += ifnet.if_ierrors;
- sum->ift_ib += ifnet.if_ibytes;
- sum->ift_op += ifnet.if_opackets;
- sum->ift_oe += ifnet.if_oerrors;
- sum->ift_ob += ifnet.if_obytes;
- sum->ift_co += ifnet.if_collisions;
- sum->ift_dr += ifnet.if_snd.ifq_drops;
- off = (u_long)TAILQ_NEXT(&ifnet, if_link);
- }
- if (!first) {
- show_stat("lu", 10, sum->ift_ip - total->ift_ip, 1);
- show_stat("lu", 5, sum->ift_ie - total->ift_ie, 1);
- show_stat("lu", 10, sum->ift_ib - total->ift_ib, 1);
- show_stat("lu", 10, sum->ift_op - total->ift_op, 1);
- show_stat("lu", 5, sum->ift_oe - total->ift_oe, 1);
- show_stat("lu", 10, sum->ift_ob - total->ift_ob, 1);
- show_stat("NRSlu", 5, sum->ift_co - total->ift_co, 1);
- if (dflag)
- show_stat("LSu", 5,
- sum->ift_dr - total->ift_dr, 1);
- }
- *total = *sum;
- }
- if (!first)
- putchar('\n');
- fflush(stdout);
- oldmask = sigblock(sigmask(SIGALRM));
- while (!signalled)
- sigpause(0);
- signalled = NO;
- sigsetmask(oldmask);
- line++;
- first = 0;
- if (line == 21)
- goto banner;
- else
- goto loop;
- /*NOTREACHED*/
-}
-
-/*
- * Set a flag to indicate that a signal from the periodic itimer has been
- * caught.
- */
-static void
-catchalarm(int signo __unused)
-{
- signalled = YES;
-}
diff --git a/usr.bin/netstat/inet.c b/usr.bin/netstat/inet.c
deleted file mode 100644
index bdf23bf..0000000
--- a/usr.bin/netstat/inet.c
+++ /dev/null
@@ -1,1156 +0,0 @@
-/*-
- * Copyright (c) 1983, 1988, 1993, 1995
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)inet.c 8.5 (Berkeley) 5/24/95";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/domain.h>
-#include <sys/protosw.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/sysctl.h>
-
-#include <net/route.h>
-#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#include <netinet/ip_carp.h>
-#ifdef INET6
-#include <netinet/ip6.h>
-#endif /* INET6 */
-#include <netinet/in_pcb.h>
-#include <netinet/ip_icmp.h>
-#include <netinet/icmp_var.h>
-#include <netinet/igmp_var.h>
-#include <netinet/ip_var.h>
-#include <netinet/pim_var.h>
-#include <netinet/tcp.h>
-#include <netinet/tcpip.h>
-#include <netinet/tcp_seq.h>
-#define TCPSTATES
-#include <netinet/tcp_fsm.h>
-#include <netinet/tcp_timer.h>
-#include <netinet/tcp_var.h>
-#include <netinet/tcp_debug.h>
-#include <netinet/udp.h>
-#include <netinet/udp_var.h>
-
-#include <arpa/inet.h>
-#include <err.h>
-#include <errno.h>
-#include <libutil.h>
-#include <netdb.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "netstat.h"
-
-char *inetname(struct in_addr *);
-void inetprint(struct in_addr *, int, const char *, int);
-#ifdef INET6
-static int udp_done, tcp_done;
-#endif /* INET6 */
-
-static int
-pcblist_sysctl(int proto, char **bufp, int istcp)
-{
- const char *mibvar;
- char *buf;
- size_t len;
-
- switch (proto) {
- case IPPROTO_TCP:
- mibvar = "net.inet.tcp.pcblist";
- break;
- case IPPROTO_UDP:
- mibvar = "net.inet.udp.pcblist";
- break;
- case IPPROTO_DIVERT:
- mibvar = "net.inet.divert.pcblist";
- break;
- default:
- mibvar = "net.inet.raw.pcblist";
- break;
- }
-
- len = 0;
- if (sysctlbyname(mibvar, 0, &len, 0, 0) < 0) {
- if (errno != ENOENT)
- warn("sysctl: %s", mibvar);
- return (0);
- }
- if ((buf = malloc(len)) == 0) {
- warnx("malloc %lu bytes", (u_long)len);
- return (0);
- }
- if (sysctlbyname(mibvar, buf, &len, 0, 0) < 0) {
- warn("sysctl: %s", mibvar);
- free(buf);
- return (0);
- }
- *bufp = buf;
- return (1);
-}
-
-/*
- * Copied directly from uipc_socket2.c. We leave out some fields that are in
- * nested structures that aren't used to avoid extra work.
- */
-static void
-sbtoxsockbuf(struct sockbuf *sb, struct xsockbuf *xsb)
-{
- xsb->sb_cc = sb->sb_cc;
- xsb->sb_hiwat = sb->sb_hiwat;
- xsb->sb_mbcnt = sb->sb_mbcnt;
- xsb->sb_mcnt = sb->sb_mcnt;
- xsb->sb_ccnt = sb->sb_ccnt;
- xsb->sb_mbmax = sb->sb_mbmax;
- xsb->sb_lowat = sb->sb_lowat;
- xsb->sb_flags = sb->sb_flags;
- xsb->sb_timeo = sb->sb_timeo;
-}
-
-int
-sotoxsocket(struct socket *so, struct xsocket *xso)
-{
- struct protosw proto;
- struct domain domain;
-
- bzero(xso, sizeof *xso);
- xso->xso_len = sizeof *xso;
- xso->xso_so = so;
- xso->so_type = so->so_type;
- xso->so_options = so->so_options;
- xso->so_linger = so->so_linger;
- xso->so_state = so->so_state;
- xso->so_pcb = so->so_pcb;
- if (kread((uintptr_t)so->so_proto, &proto, sizeof(proto)) != 0)
- return (-1);
- xso->xso_protocol = proto.pr_protocol;
- if (kread((uintptr_t)proto.pr_domain, &domain, sizeof(domain)) != 0)
- return (-1);
- xso->xso_family = domain.dom_family;
- xso->so_qlen = so->so_qlen;
- xso->so_incqlen = so->so_incqlen;
- xso->so_qlimit = so->so_qlimit;
- xso->so_timeo = so->so_timeo;
- xso->so_error = so->so_error;
- xso->so_oobmark = so->so_oobmark;
- sbtoxsockbuf(&so->so_snd, &xso->so_snd);
- sbtoxsockbuf(&so->so_rcv, &xso->so_rcv);
- return (0);
-}
-
-static int
-pcblist_kvm(u_long off, char **bufp, int istcp)
-{
- struct inpcbinfo pcbinfo;
- struct inpcbhead listhead;
- struct inpcb *inp;
- struct xinpcb xi;
- struct xinpgen xig;
- struct xtcpcb xt;
- struct socket so;
- struct xsocket *xso;
- char *buf, *p;
- size_t len;
-
- if (off == 0)
- return (0);
- kread(off, &pcbinfo, sizeof(pcbinfo));
- if (istcp)
- len = 2 * sizeof(xig) +
- (pcbinfo.ipi_count + pcbinfo.ipi_count / 8) *
- sizeof(struct xtcpcb);
- else
- len = 2 * sizeof(xig) +
- (pcbinfo.ipi_count + pcbinfo.ipi_count / 8) *
- sizeof(struct xinpcb);
- if ((buf = malloc(len)) == 0) {
- warnx("malloc %lu bytes", (u_long)len);
- return (0);
- }
- p = buf;
-
-#define COPYOUT(obj, size) do { \
- if (len < (size)) { \
- warnx("buffer size exceeded"); \
- goto fail; \
- } \
- bcopy((obj), p, (size)); \
- len -= (size); \
- p += (size); \
-} while (0)
-
-#define KREAD(off, buf, len) do { \
- if (kread((uintptr_t)(off), (buf), (len)) != 0) \
- goto fail; \
-} while (0)
-
- /* Write out header. */
- xig.xig_len = sizeof xig;
- xig.xig_count = pcbinfo.ipi_count;
- xig.xig_gen = pcbinfo.ipi_gencnt;
- xig.xig_sogen = 0;
- COPYOUT(&xig, sizeof xig);
-
- /* Walk the PCB list. */
- xt.xt_len = sizeof xt;
- xi.xi_len = sizeof xi;
- if (istcp)
- xso = &xt.xt_socket;
- else
- xso = &xi.xi_socket;
- KREAD(pcbinfo.ipi_listhead, &listhead, sizeof(listhead));
- LIST_FOREACH(inp, &listhead, inp_list) {
- if (istcp) {
- KREAD(inp, &xt.xt_inp, sizeof(*inp));
- inp = &xt.xt_inp;
- } else {
- KREAD(inp, &xi.xi_inp, sizeof(*inp));
- inp = &xi.xi_inp;
- }
-
- if (inp->inp_gencnt > pcbinfo.ipi_gencnt)
- continue;
-
- if (istcp) {
- if (inp->inp_ppcb == NULL)
- bzero(&xt.xt_tp, sizeof xt.xt_tp);
- else if (inp->inp_vflag & INP_TIMEWAIT) {
- bzero(&xt.xt_tp, sizeof xt.xt_tp);
- xt.xt_tp.t_state = TCPS_TIME_WAIT;
- } else
- KREAD(inp->inp_ppcb, &xt.xt_tp,
- sizeof xt.xt_tp);
- }
- if (inp->inp_socket) {
- KREAD(inp->inp_socket, &so, sizeof(so));
- if (sotoxsocket(&so, xso) != 0)
- goto fail;
- } else {
- bzero(xso, sizeof(*xso));
- if (istcp)
- xso->xso_protocol = IPPROTO_TCP;
- }
- if (istcp)
- COPYOUT(&xt, sizeof xt);
- else
- COPYOUT(&xi, sizeof xi);
- }
-
- /* Reread the pcbinfo and write out the footer. */
- kread(off, &pcbinfo, sizeof(pcbinfo));
- xig.xig_count = pcbinfo.ipi_count;
- xig.xig_gen = pcbinfo.ipi_gencnt;
- COPYOUT(&xig, sizeof xig);
-
- *bufp = buf;
- return (1);
-
-fail:
- free(buf);
- return (0);
-#undef COPYOUT
-#undef KREAD
-}
-
-/*
- * Print a summary of connections related to an Internet
- * protocol. For TCP, also give state of connection.
- * Listening processes (aflag) are suppressed unless the
- * -a (all) flag is specified.
- */
-void
-protopr(u_long off, const char *name, int af1, int proto)
-{
- int istcp;
- static int first = 1;
- char *buf;
- const char *vchar;
- struct tcpcb *tp = NULL;
- struct inpcb *inp;
- struct xinpgen *xig, *oxig;
- struct xsocket *so;
-
- istcp = 0;
- switch (proto) {
- case IPPROTO_TCP:
-#ifdef INET6
- if (tcp_done != 0)
- return;
- else
- tcp_done = 1;
-#endif
- istcp = 1;
- break;
- case IPPROTO_UDP:
-#ifdef INET6
- if (udp_done != 0)
- return;
- else
- udp_done = 1;
-#endif
- break;
- }
- if (live) {
- if (!pcblist_sysctl(proto, &buf, istcp))
- return;
- } else {
- if (!pcblist_kvm(off, &buf, istcp))
- return;
- }
-
- oxig = xig = (struct xinpgen *)buf;
- for (xig = (struct xinpgen *)((char *)xig + xig->xig_len);
- xig->xig_len > sizeof(struct xinpgen);
- xig = (struct xinpgen *)((char *)xig + xig->xig_len)) {
- if (istcp) {
- tp = &((struct xtcpcb *)xig)->xt_tp;
- inp = &((struct xtcpcb *)xig)->xt_inp;
- so = &((struct xtcpcb *)xig)->xt_socket;
- } else {
- inp = &((struct xinpcb *)xig)->xi_inp;
- so = &((struct xinpcb *)xig)->xi_socket;
- }
-
- /* Ignore sockets for protocols other than the desired one. */
- if (so->xso_protocol != proto)
- continue;
-
- /* Ignore PCBs which were freed during copyout. */
- if (inp->inp_gencnt > oxig->xig_gen)
- continue;
-
- if ((af1 == AF_INET && (inp->inp_vflag & INP_IPV4) == 0)
-#ifdef INET6
- || (af1 == AF_INET6 && (inp->inp_vflag & INP_IPV6) == 0)
-#endif /* INET6 */
- || (af1 == AF_UNSPEC && ((inp->inp_vflag & INP_IPV4) == 0
-#ifdef INET6
- && (inp->inp_vflag & INP_IPV6) == 0
-#endif /* INET6 */
- ))
- )
- continue;
- if (!aflag &&
- (
- (istcp && tp->t_state == TCPS_LISTEN)
- || (af1 == AF_INET &&
- inet_lnaof(inp->inp_laddr) == INADDR_ANY)
-#ifdef INET6
- || (af1 == AF_INET6 &&
- IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_laddr))
-#endif /* INET6 */
- || (af1 == AF_UNSPEC &&
- (((inp->inp_vflag & INP_IPV4) != 0 &&
- inet_lnaof(inp->inp_laddr) == INADDR_ANY)
-#ifdef INET6
- || ((inp->inp_vflag & INP_IPV6) != 0 &&
- IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_laddr))
-#endif
- ))
- ))
- continue;
-
- if (first) {
- if (!Lflag) {
- printf("Active Internet connections");
- if (aflag)
- printf(" (including servers)");
- } else
- printf(
- "Current listen queue sizes (qlen/incqlen/maxqlen)");
- putchar('\n');
- if (Aflag)
- printf("%-8.8s ", "Tcpcb");
- if (Lflag)
- printf("%-5.5s %-14.14s %-22.22s\n",
- "Proto", "Listen", "Local Address");
- printf((Aflag && !Wflag) ?
- "%-5.5s %-6.6s %-6.6s %-18.18s %-18.18s" :
- "%-5.5s %-6.6s %-6.6s %-22.22s %-22.22s",
- "Proto", "Recv-Q", "Send-Q",
- "Local Address", "Foreign Address");
- if (xflag)
- printf("%-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %s\n",
- "R-MBUF", "S-MBUF", "R-CLUS", "S-CLUS",
- "R-HIWA", "S-HIWA", "R-LOWA", "S-LOWA",
- "R-BCNT", "S-BCNT", "R-BMAX", "S-BMAX",
- "(state)");
- else
- printf("(state)\n");
- first = 0;
- }
- if (Lflag && so->so_qlimit == 0)
- continue;
- if (Aflag) {
- if (istcp)
- printf("%8lx ", (u_long)inp->inp_ppcb);
- else
- printf("%8lx ", (u_long)so->so_pcb);
- }
-#ifdef INET6
- if ((inp->inp_vflag & INP_IPV6) != 0)
- vchar = ((inp->inp_vflag & INP_IPV4) != 0) ?
- "46" : "6 ";
- else
-#endif
- vchar = ((inp->inp_vflag & INP_IPV4) != 0) ?
- "4 " : " ";
- printf("%-3.3s%-2.2s ", name, vchar);
- if (Lflag) {
- char buf1[15];
-
- snprintf(buf1, 15, "%d/%d/%d", so->so_qlen,
- so->so_incqlen, so->so_qlimit);
- printf("%-14.14s ", buf1);
- } else {
- printf("%6u %6u ", so->so_rcv.sb_cc, so->so_snd.sb_cc);
- }
- if (numeric_port) {
- if (inp->inp_vflag & INP_IPV4) {
- inetprint(&inp->inp_laddr, (int)inp->inp_lport,
- name, 1);
- if (!Lflag)
- inetprint(&inp->inp_faddr,
- (int)inp->inp_fport, name, 1);
- }
-#ifdef INET6
- else if (inp->inp_vflag & INP_IPV6) {
- inet6print(&inp->in6p_laddr,
- (int)inp->inp_lport, name, 1);
- if (!Lflag)
- inet6print(&inp->in6p_faddr,
- (int)inp->inp_fport, name, 1);
- } /* else nothing printed now */
-#endif /* INET6 */
- } else if (inp->inp_flags & INP_ANONPORT) {
- if (inp->inp_vflag & INP_IPV4) {
- inetprint(&inp->inp_laddr, (int)inp->inp_lport,
- name, 1);
- if (!Lflag)
- inetprint(&inp->inp_faddr,
- (int)inp->inp_fport, name, 0);
- }
-#ifdef INET6
- else if (inp->inp_vflag & INP_IPV6) {
- inet6print(&inp->in6p_laddr,
- (int)inp->inp_lport, name, 1);
- if (!Lflag)
- inet6print(&inp->in6p_faddr,
- (int)inp->inp_fport, name, 0);
- } /* else nothing printed now */
-#endif /* INET6 */
- } else {
- if (inp->inp_vflag & INP_IPV4) {
- inetprint(&inp->inp_laddr, (int)inp->inp_lport,
- name, 0);
- if (!Lflag)
- inetprint(&inp->inp_faddr,
- (int)inp->inp_fport, name,
- inp->inp_lport != inp->inp_fport);
- }
-#ifdef INET6
- else if (inp->inp_vflag & INP_IPV6) {
- inet6print(&inp->in6p_laddr,
- (int)inp->inp_lport, name, 0);
- if (!Lflag)
- inet6print(&inp->in6p_faddr,
- (int)inp->inp_fport, name,
- inp->inp_lport != inp->inp_fport);
- } /* else nothing printed now */
-#endif /* INET6 */
- }
- if (xflag) {
- if (Lflag)
- printf("%21s %6u %6u %6u %6u %6u %6u %6u %6u %6u %6u %6u %6u ",
- " ",
- so->so_rcv.sb_mcnt, so->so_snd.sb_mcnt,
- so->so_rcv.sb_ccnt, so->so_snd.sb_ccnt,
- so->so_rcv.sb_hiwat, so->so_snd.sb_hiwat,
- so->so_rcv.sb_lowat, so->so_snd.sb_lowat,
- so->so_rcv.sb_mbcnt, so->so_snd.sb_mbcnt,
- so->so_rcv.sb_mbmax, so->so_snd.sb_mbmax);
- else
- printf("%6u %6u %6u %6u %6u %6u %6u %6u %6u %6u %6u %6u ",
- so->so_rcv.sb_mcnt, so->so_snd.sb_mcnt,
- so->so_rcv.sb_ccnt, so->so_snd.sb_ccnt,
- so->so_rcv.sb_hiwat, so->so_snd.sb_hiwat,
- so->so_rcv.sb_lowat, so->so_snd.sb_lowat,
- so->so_rcv.sb_mbcnt, so->so_snd.sb_mbcnt,
- so->so_rcv.sb_mbmax, so->so_snd.sb_mbmax);
- }
- if (istcp && !Lflag) {
- if (tp->t_state < 0 || tp->t_state >= TCP_NSTATES)
- printf("%d", tp->t_state);
- else {
- printf("%s", tcpstates[tp->t_state]);
-#if defined(TF_NEEDSYN) && defined(TF_NEEDFIN)
- /* Show T/TCP `hidden state' */
- if (tp->t_flags & (TF_NEEDSYN|TF_NEEDFIN))
- putchar('*');
-#endif /* defined(TF_NEEDSYN) && defined(TF_NEEDFIN) */
- }
- }
- putchar('\n');
- }
- if (xig != oxig && xig->xig_gen != oxig->xig_gen) {
- if (oxig->xig_count > xig->xig_count) {
- printf("Some %s sockets may have been deleted.\n",
- name);
- } else if (oxig->xig_count < xig->xig_count) {
- printf("Some %s sockets may have been created.\n",
- name);
- } else {
- printf(
- "Some %s sockets may have been created or deleted.\n",
- name);
- }
- }
- free(buf);
-}
-
-/*
- * Dump TCP statistics structure.
- */
-void
-tcp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
-{
- struct tcpstat tcpstat, zerostat;
- size_t len = sizeof tcpstat;
-
-#ifdef INET6
- if (tcp_done != 0)
- return;
- else
- tcp_done = 1;
-#endif
-
- if (live) {
- if (zflag)
- memset(&zerostat, 0, len);
- if (sysctlbyname("net.inet.tcp.stats", &tcpstat, &len,
- zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
- warn("sysctl: net.inet.tcp.stats");
- return;
- }
- } else
- kread(off, &tcpstat, len);
-
- printf ("%s:\n", name);
-
-#define p(f, m) if (tcpstat.f || sflag <= 1) \
- printf(m, tcpstat.f, plural(tcpstat.f))
-#define p1a(f, m) if (tcpstat.f || sflag <= 1) \
- printf(m, tcpstat.f)
-#define p2(f1, f2, m) if (tcpstat.f1 || tcpstat.f2 || sflag <= 1) \
- printf(m, tcpstat.f1, plural(tcpstat.f1), tcpstat.f2, plural(tcpstat.f2))
-#define p2a(f1, f2, m) if (tcpstat.f1 || tcpstat.f2 || sflag <= 1) \
- printf(m, tcpstat.f1, plural(tcpstat.f1), tcpstat.f2)
-#define p3(f, m) if (tcpstat.f || sflag <= 1) \
- printf(m, tcpstat.f, pluralies(tcpstat.f))
-
- p(tcps_sndtotal, "\t%lu packet%s sent\n");
- p2(tcps_sndpack,tcps_sndbyte, "\t\t%lu data packet%s (%lu byte%s)\n");
- p2(tcps_sndrexmitpack, tcps_sndrexmitbyte,
- "\t\t%lu data packet%s (%lu byte%s) retransmitted\n");
- p(tcps_sndrexmitbad,
- "\t\t%lu data packet%s unnecessarily retransmitted\n");
- p(tcps_mturesent, "\t\t%lu resend%s initiated by MTU discovery\n");
- p2a(tcps_sndacks, tcps_delack,
- "\t\t%lu ack-only packet%s (%lu delayed)\n");
- p(tcps_sndurg, "\t\t%lu URG only packet%s\n");
- p(tcps_sndprobe, "\t\t%lu window probe packet%s\n");
- p(tcps_sndwinup, "\t\t%lu window update packet%s\n");
- p(tcps_sndctrl, "\t\t%lu control packet%s\n");
- p(tcps_rcvtotal, "\t%lu packet%s received\n");
- p2(tcps_rcvackpack, tcps_rcvackbyte,
- "\t\t%lu ack%s (for %lu byte%s)\n");
- p(tcps_rcvdupack, "\t\t%lu duplicate ack%s\n");
- p(tcps_rcvacktoomuch, "\t\t%lu ack%s for unsent data\n");
- p2(tcps_rcvpack, tcps_rcvbyte,
- "\t\t%lu packet%s (%lu byte%s) received in-sequence\n");
- p2(tcps_rcvduppack, tcps_rcvdupbyte,
- "\t\t%lu completely duplicate packet%s (%lu byte%s)\n");
- p(tcps_pawsdrop, "\t\t%lu old duplicate packet%s\n");
- p2(tcps_rcvpartduppack, tcps_rcvpartdupbyte,
- "\t\t%lu packet%s with some dup. data (%lu byte%s duped)\n");
- p2(tcps_rcvoopack, tcps_rcvoobyte,
- "\t\t%lu out-of-order packet%s (%lu byte%s)\n");
- p2(tcps_rcvpackafterwin, tcps_rcvbyteafterwin,
- "\t\t%lu packet%s (%lu byte%s) of data after window\n");
- p(tcps_rcvwinprobe, "\t\t%lu window probe%s\n");
- p(tcps_rcvwinupd, "\t\t%lu window update packet%s\n");
- p(tcps_rcvafterclose, "\t\t%lu packet%s received after close\n");
- p(tcps_rcvbadsum, "\t\t%lu discarded for bad checksum%s\n");
- p(tcps_rcvbadoff, "\t\t%lu discarded for bad header offset field%s\n");
- p1a(tcps_rcvshort, "\t\t%lu discarded because packet too short\n");
- p1a(tcps_rcvmemdrop, "\t\t%lu discarded due to memory problems\n");
- p(tcps_connattempt, "\t%lu connection request%s\n");
- p(tcps_accepts, "\t%lu connection accept%s\n");
- p(tcps_badsyn, "\t%lu bad connection attempt%s\n");
- p(tcps_listendrop, "\t%lu listen queue overflow%s\n");
- p(tcps_badrst, "\t%lu ignored RSTs in the window%s\n");
- p(tcps_connects, "\t%lu connection%s established (including accepts)\n");
- p2(tcps_closed, tcps_drops,
- "\t%lu connection%s closed (including %lu drop%s)\n");
- p(tcps_cachedrtt, "\t\t%lu connection%s updated cached RTT on close\n");
- p(tcps_cachedrttvar,
- "\t\t%lu connection%s updated cached RTT variance on close\n");
- p(tcps_cachedssthresh,
- "\t\t%lu connection%s updated cached ssthresh on close\n");
- p(tcps_conndrops, "\t%lu embryonic connection%s dropped\n");
- p2(tcps_rttupdated, tcps_segstimed,
- "\t%lu segment%s updated rtt (of %lu attempt%s)\n");
- p(tcps_rexmttimeo, "\t%lu retransmit timeout%s\n");
- p(tcps_timeoutdrop, "\t\t%lu connection%s dropped by rexmit timeout\n");
- p(tcps_persisttimeo, "\t%lu persist timeout%s\n");
- p(tcps_persistdrop, "\t\t%lu connection%s dropped by persist timeout\n");
- p(tcps_finwait2_drops,
- "\t%lu Connection%s (fin_wait_2) dropped because of timeout\n");
- p(tcps_keeptimeo, "\t%lu keepalive timeout%s\n");
- p(tcps_keepprobe, "\t\t%lu keepalive probe%s sent\n");
- p(tcps_keepdrops, "\t\t%lu connection%s dropped by keepalive\n");
- p(tcps_predack, "\t%lu correct ACK header prediction%s\n");
- p(tcps_preddat, "\t%lu correct data packet header prediction%s\n");
-
- p3(tcps_sc_added, "\t%lu syncache entr%s added\n");
- p1a(tcps_sc_retransmitted, "\t\t%lu retransmitted\n");
- p1a(tcps_sc_dupsyn, "\t\t%lu dupsyn\n");
- p1a(tcps_sc_dropped, "\t\t%lu dropped\n");
- p1a(tcps_sc_completed, "\t\t%lu completed\n");
- p1a(tcps_sc_bucketoverflow, "\t\t%lu bucket overflow\n");
- p1a(tcps_sc_cacheoverflow, "\t\t%lu cache overflow\n");
- p1a(tcps_sc_reset, "\t\t%lu reset\n");
- p1a(tcps_sc_stale, "\t\t%lu stale\n");
- p1a(tcps_sc_aborted, "\t\t%lu aborted\n");
- p1a(tcps_sc_badack, "\t\t%lu badack\n");
- p1a(tcps_sc_unreach, "\t\t%lu unreach\n");
- p(tcps_sc_zonefail, "\t\t%lu zone failure%s\n");
- p(tcps_sc_sendcookie, "\t%lu cookie%s sent\n");
- p(tcps_sc_recvcookie, "\t%lu cookie%s received\n");
-
- p(tcps_sack_recovery_episode, "\t%lu SACK recovery episode%s\n");
- p(tcps_sack_rexmits,
- "\t%lu segment rexmit%s in SACK recovery episodes\n");
- p(tcps_sack_rexmit_bytes,
- "\t%lu byte rexmit%s in SACK recovery episodes\n");
- p(tcps_sack_rcv_blocks,
- "\t%lu SACK option%s (SACK blocks) received\n");
- p(tcps_sack_send_blocks, "\t%lu SACK option%s (SACK blocks) sent\n");
- p1a(tcps_sack_sboverflow, "\t%lu SACK scoreboard overflow\n");
-
- p(tcps_ecn_ce, "\t%lu packet%s with ECN CE bit set\n");
- p(tcps_ecn_ect0, "\t%lu packet%s with ECN ECT(0) bit set\n");
- p(tcps_ecn_ect1, "\t%lu packet%s with ECN ECT(1) bit set\n");
- p(tcps_ecn_shs, "\t%lu successful ECN handshake%s\n");
- p(tcps_ecn_rcwnd, "\t%lu time%s ECN reduced the congestion window\n");
-#undef p
-#undef p1a
-#undef p2
-#undef p2a
-#undef p3
-}
-
-/*
- * Dump UDP statistics structure.
- */
-void
-udp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
-{
- struct udpstat udpstat, zerostat;
- size_t len = sizeof udpstat;
- u_long delivered;
-
-#ifdef INET6
- if (udp_done != 0)
- return;
- else
- udp_done = 1;
-#endif
-
- if (live) {
- if (zflag)
- memset(&zerostat, 0, len);
- if (sysctlbyname("net.inet.udp.stats", &udpstat, &len,
- zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
- warn("sysctl: net.inet.udp.stats");
- return;
- }
- } else
- kread(off, &udpstat, len);
-
- printf("%s:\n", name);
-#define p(f, m) if (udpstat.f || sflag <= 1) \
- printf(m, udpstat.f, plural(udpstat.f))
-#define p1a(f, m) if (udpstat.f || sflag <= 1) \
- printf(m, udpstat.f)
- p(udps_ipackets, "\t%lu datagram%s received\n");
- p1a(udps_hdrops, "\t%lu with incomplete header\n");
- p1a(udps_badlen, "\t%lu with bad data length field\n");
- p1a(udps_badsum, "\t%lu with bad checksum\n");
- p1a(udps_nosum, "\t%lu with no checksum\n");
- p1a(udps_noport, "\t%lu dropped due to no socket\n");
- p(udps_noportbcast,
- "\t%lu broadcast/multicast datagram%s undelivered\n");
- p1a(udps_fullsock, "\t%lu dropped due to full socket buffers\n");
- p1a(udpps_pcbhashmiss, "\t%lu not for hashed pcb\n");
- delivered = udpstat.udps_ipackets -
- udpstat.udps_hdrops -
- udpstat.udps_badlen -
- udpstat.udps_badsum -
- udpstat.udps_noport -
- udpstat.udps_noportbcast -
- udpstat.udps_fullsock;
- if (delivered || sflag <= 1)
- printf("\t%lu delivered\n", delivered);
- p(udps_opackets, "\t%lu datagram%s output\n");
- /* the next statistic is cumulative in udps_noportbcast */
- p(udps_filtermcast,
- "\t%lu time%s multicast source filter matched\n");
-#undef p
-#undef p1a
-}
-
-/*
- * Dump CARP statistics structure.
- */
-void
-carp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
-{
- struct carpstats carpstat, zerostat;
- size_t len = sizeof(struct carpstats);
-
- if (live) {
- if (zflag)
- memset(&zerostat, 0, len);
- if (sysctlbyname("net.inet.carp.stats", &carpstat, &len,
- zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
- if (errno != ENOENT)
- warn("sysctl: net.inet.carp.stats");
- return;
- }
- } else {
- if (off == 0)
- return;
- kread(off, &carpstat, len);
- }
-
- printf("%s:\n", name);
-
-#define p(f, m) if (carpstat.f || sflag <= 1) \
- printf(m, (uintmax_t)carpstat.f, plural(carpstat.f))
-#define p2(f, m) if (carpstat.f || sflag <= 1) \
- printf(m, (uintmax_t)carpstat.f)
-
- p(carps_ipackets, "\t%ju packet%s received (IPv4)\n");
- p(carps_ipackets6, "\t%ju packet%s received (IPv6)\n");
- p(carps_badttl, "\t\t%ju packet%s discarded for wrong TTL\n");
- p(carps_hdrops, "\t\t%ju packet%s shorter than header\n");
- p(carps_badsum, "\t\t%ju discarded for bad checksum%s\n");
- p(carps_badver, "\t\t%ju discarded packet%s with a bad version\n");
- p2(carps_badlen, "\t\t%ju discarded because packet too short\n");
- p2(carps_badauth, "\t\t%ju discarded for bad authentication\n");
- p2(carps_badvhid, "\t\t%ju discarded for bad vhid\n");
- p2(carps_badaddrs, "\t\t%ju discarded because of a bad address list\n");
- p(carps_opackets, "\t%ju packet%s sent (IPv4)\n");
- p(carps_opackets6, "\t%ju packet%s sent (IPv6)\n");
- p2(carps_onomem, "\t\t%ju send failed due to mbuf memory error\n");
-#if notyet
- p(carps_ostates, "\t\t%s state update%s sent\n");
-#endif
-#undef p
-#undef p2
-}
-
-/*
- * Dump IP statistics structure.
- */
-void
-ip_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
-{
- struct ipstat ipstat, zerostat;
- size_t len = sizeof ipstat;
-
- if (live) {
- if (zflag)
- memset(&zerostat, 0, len);
- if (sysctlbyname("net.inet.ip.stats", &ipstat, &len,
- zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
- warn("sysctl: net.inet.ip.stats");
- return;
- }
- } else
- kread(off, &ipstat, len);
-
- printf("%s:\n", name);
-
-#define p(f, m) if (ipstat.f || sflag <= 1) \
- printf(m, ipstat.f, plural(ipstat.f))
-#define p1a(f, m) if (ipstat.f || sflag <= 1) \
- printf(m, ipstat.f)
-
- p(ips_total, "\t%lu total packet%s received\n");
- p(ips_badsum, "\t%lu bad header checksum%s\n");
- p1a(ips_toosmall, "\t%lu with size smaller than minimum\n");
- p1a(ips_tooshort, "\t%lu with data size < data length\n");
- p1a(ips_toolong, "\t%lu with ip length > max ip packet size\n");
- p1a(ips_badhlen, "\t%lu with header length < data size\n");
- p1a(ips_badlen, "\t%lu with data length < header length\n");
- p1a(ips_badoptions, "\t%lu with bad options\n");
- p1a(ips_badvers, "\t%lu with incorrect version number\n");
- p(ips_fragments, "\t%lu fragment%s received\n");
- p(ips_fragdropped, "\t%lu fragment%s dropped (dup or out of space)\n");
- p(ips_fragtimeout, "\t%lu fragment%s dropped after timeout\n");
- p(ips_reassembled, "\t%lu packet%s reassembled ok\n");
- p(ips_delivered, "\t%lu packet%s for this host\n");
- p(ips_noproto, "\t%lu packet%s for unknown/unsupported protocol\n");
- p(ips_forward, "\t%lu packet%s forwarded");
- p(ips_fastforward, " (%lu packet%s fast forwarded)");
- if (ipstat.ips_forward || sflag <= 1)
- putchar('\n');
- p(ips_cantforward, "\t%lu packet%s not forwardable\n");
- p(ips_notmember,
- "\t%lu packet%s received for unknown multicast group\n");
- p(ips_redirectsent, "\t%lu redirect%s sent\n");
- p(ips_localout, "\t%lu packet%s sent from this host\n");
- p(ips_rawout, "\t%lu packet%s sent with fabricated ip header\n");
- p(ips_odropped,
- "\t%lu output packet%s dropped due to no bufs, etc.\n");
- p(ips_noroute, "\t%lu output packet%s discarded due to no route\n");
- p(ips_fragmented, "\t%lu output datagram%s fragmented\n");
- p(ips_ofragments, "\t%lu fragment%s created\n");
- p(ips_cantfrag, "\t%lu datagram%s that can't be fragmented\n");
- p(ips_nogif, "\t%lu tunneling packet%s that can't find gif\n");
- p(ips_badaddr, "\t%lu datagram%s with bad address in header\n");
-#undef p
-#undef p1a
-}
-
-static const char *icmpnames[ICMP_MAXTYPE + 1] = {
- "echo reply", /* RFC 792 */
- "#1",
- "#2",
- "destination unreachable", /* RFC 792 */
- "source quench", /* RFC 792 */
- "routing redirect", /* RFC 792 */
- "#6",
- "#7",
- "echo", /* RFC 792 */
- "router advertisement", /* RFC 1256 */
- "router solicitation", /* RFC 1256 */
- "time exceeded", /* RFC 792 */
- "parameter problem", /* RFC 792 */
- "time stamp", /* RFC 792 */
- "time stamp reply", /* RFC 792 */
- "information request", /* RFC 792 */
- "information request reply", /* RFC 792 */
- "address mask request", /* RFC 950 */
- "address mask reply", /* RFC 950 */
- "#19",
- "#20",
- "#21",
- "#22",
- "#23",
- "#24",
- "#25",
- "#26",
- "#27",
- "#28",
- "#29",
- "icmp traceroute", /* RFC 1393 */
- "datagram conversion error", /* RFC 1475 */
- "mobile host redirect",
- "IPv6 where-are-you",
- "IPv6 i-am-here",
- "mobile registration req",
- "mobile registration reply",
- "domain name request", /* RFC 1788 */
- "domain name reply", /* RFC 1788 */
- "icmp SKIP",
- "icmp photuris", /* RFC 2521 */
-};
-
-/*
- * Dump ICMP statistics.
- */
-void
-icmp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
-{
- struct icmpstat icmpstat, zerostat;
- int i, first;
- size_t len;
-
- len = sizeof icmpstat;
- if (live) {
- if (zflag)
- memset(&zerostat, 0, len);
- if (sysctlbyname("net.inet.icmp.stats", &icmpstat, &len,
- zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
- warn("sysctl: net.inet.icmp.stats");
- return;
- }
- } else
- kread(off, &icmpstat, len);
-
- printf("%s:\n", name);
-
-#define p(f, m) if (icmpstat.f || sflag <= 1) \
- printf(m, icmpstat.f, plural(icmpstat.f))
-#define p1a(f, m) if (icmpstat.f || sflag <= 1) \
- printf(m, icmpstat.f)
-#define p2(f, m) if (icmpstat.f || sflag <= 1) \
- printf(m, icmpstat.f, plurales(icmpstat.f))
-
- p(icps_error, "\t%lu call%s to icmp_error\n");
- p(icps_oldicmp,
- "\t%lu error%s not generated in response to an icmp message\n");
- for (first = 1, i = 0; i < ICMP_MAXTYPE + 1; i++)
- if (icmpstat.icps_outhist[i] != 0) {
- if (first) {
- printf("\tOutput histogram:\n");
- first = 0;
- }
- if (icmpnames[i] != NULL)
- printf("\t\t%s: %lu\n", icmpnames[i],
- icmpstat.icps_outhist[i]);
- else
- printf("\t\tunknown ICMP #%d: %lu\n", i,
- icmpstat.icps_outhist[i]);
- }
- p(icps_badcode, "\t%lu message%s with bad code fields\n");
- p(icps_tooshort, "\t%lu message%s less than the minimum length\n");
- p(icps_checksum, "\t%lu message%s with bad checksum\n");
- p(icps_badlen, "\t%lu message%s with bad length\n");
- p1a(icps_bmcastecho, "\t%lu multicast echo requests ignored\n");
- p1a(icps_bmcasttstamp, "\t%lu multicast timestamp requests ignored\n");
- for (first = 1, i = 0; i < ICMP_MAXTYPE + 1; i++)
- if (icmpstat.icps_inhist[i] != 0) {
- if (first) {
- printf("\tInput histogram:\n");
- first = 0;
- }
- if (icmpnames[i] != NULL)
- printf("\t\t%s: %lu\n", icmpnames[i],
- icmpstat.icps_inhist[i]);
- else
- printf("\t\tunknown ICMP #%d: %lu\n", i,
- icmpstat.icps_inhist[i]);
- }
- p(icps_reflect, "\t%lu message response%s generated\n");
- p2(icps_badaddr, "\t%lu invalid return address%s\n");
- p(icps_noroute, "\t%lu no return route%s\n");
-#undef p
-#undef p1a
-#undef p2
- if (live) {
- len = sizeof i;
- if (sysctlbyname("net.inet.icmp.maskrepl", &i, &len, NULL, 0) <
- 0)
- return;
- printf("\tICMP address mask responses are %sabled\n",
- i ? "en" : "dis");
- }
-}
-
-/*
- * Dump IGMP statistics structure.
- */
-void
-igmp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
-{
- struct igmpstat igmpstat, zerostat;
- size_t len = sizeof igmpstat;
-
- if (live) {
- if (zflag)
- memset(&zerostat, 0, len);
- if (sysctlbyname("net.inet.igmp.stats", &igmpstat, &len,
- zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
- warn("sysctl: net.inet.igmp.stats");
- return;
- }
- } else
- kread(off, &igmpstat, len);
-
- printf("%s:\n", name);
-
-#define p(f, m) if (igmpstat.f || sflag <= 1) \
- printf(m, igmpstat.f, plural(igmpstat.f))
-#define py(f, m) if (igmpstat.f || sflag <= 1) \
- printf(m, igmpstat.f, igmpstat.f != 1 ? "ies" : "y")
- p(igps_rcv_total, "\t%u message%s received\n");
- p(igps_rcv_tooshort, "\t%u message%s received with too few bytes\n");
- p(igps_rcv_badsum, "\t%u message%s received with bad checksum\n");
- py(igps_rcv_queries, "\t%u membership quer%s received\n");
- py(igps_rcv_badqueries,
- "\t%u membership quer%s received with invalid field(s)\n");
- p(igps_rcv_reports, "\t%u membership report%s received\n");
- p(igps_rcv_badreports,
- "\t%u membership report%s received with invalid field(s)\n");
- p(igps_rcv_ourreports,
-"\t%u membership report%s received for groups to which we belong\n");
- p(igps_snd_reports, "\t%u membership report%s sent\n");
-#undef p
-#undef py
-}
-
-/*
- * Dump PIM statistics structure.
- */
-void
-pim_stats(u_long off __unused, const char *name, int af1 __unused,
- int proto __unused)
-{
- struct pimstat pimstat, zerostat;
- size_t len = sizeof pimstat;
-
- if (live) {
- if (zflag)
- memset(&zerostat, 0, len);
- if (sysctlbyname("net.inet.pim.stats", &pimstat, &len,
- zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
- if (errno != ENOENT)
- warn("sysctl: net.inet.pim.stats");
- return;
- }
- } else {
- if (off == 0)
- return;
- kread(off, &pimstat, len);
- }
-
- printf("%s:\n", name);
-
-#define p(f, m) if (pimstat.f || sflag <= 1) \
- printf(m, (uintmax_t)pimstat.f, plural(pimstat.f))
-#define py(f, m) if (pimstat.f || sflag <= 1) \
- printf(m, (uintmax_t)pimstat.f, pimstat.f != 1 ? "ies" : "y")
- p(pims_rcv_total_msgs, "\t%ju message%s received\n");
- p(pims_rcv_total_bytes, "\t%ju byte%s received\n");
- p(pims_rcv_tooshort, "\t%ju message%s received with too few bytes\n");
- p(pims_rcv_badsum, "\t%ju message%s received with bad checksum\n");
- p(pims_rcv_badversion, "\t%ju message%s received with bad version\n");
- p(pims_rcv_registers_msgs, "\t%ju data register message%s received\n");
- p(pims_rcv_registers_bytes, "\t%ju data register byte%s received\n");
- p(pims_rcv_registers_wrongiif,
- "\t%ju data register message%s received on wrong iif\n");
- p(pims_rcv_badregisters, "\t%ju bad register%s received\n");
- p(pims_snd_registers_msgs, "\t%ju data register message%s sent\n");
- p(pims_snd_registers_bytes, "\t%ju data register byte%s sent\n");
-#undef p
-#undef py
-}
-
-/*
- * Pretty print an Internet address (net address + port).
- */
-void
-inetprint(struct in_addr *in, int port, const char *proto, int num_port)
-{
- struct servent *sp = 0;
- char line[80], *cp;
- int width;
-
- if (Wflag)
- sprintf(line, "%s.", inetname(in));
- else
- sprintf(line, "%.*s.", (Aflag && !num_port) ? 12 : 16, inetname(in));
- cp = index(line, '\0');
- if (!num_port && port)
- sp = getservbyport((int)port, proto);
- if (sp || port == 0)
- sprintf(cp, "%.15s ", sp ? sp->s_name : "*");
- else
- sprintf(cp, "%d ", ntohs((u_short)port));
- width = (Aflag && !Wflag) ? 18 : 22;
- if (Wflag)
- printf("%-*s ", width, line);
- else
- printf("%-*.*s ", width, width, line);
-}
-
-/*
- * Construct an Internet address representation.
- * If numeric_addr has been supplied, give
- * numeric value, otherwise try for symbolic name.
- */
-char *
-inetname(struct in_addr *inp)
-{
- char *cp;
- static char line[MAXHOSTNAMELEN];
- struct hostent *hp;
- struct netent *np;
-
- cp = 0;
- if (!numeric_addr && inp->s_addr != INADDR_ANY) {
- int net = inet_netof(*inp);
- int lna = inet_lnaof(*inp);
-
- if (lna == INADDR_ANY) {
- np = getnetbyaddr(net, AF_INET);
- if (np)
- cp = np->n_name;
- }
- if (cp == 0) {
- hp = gethostbyaddr((char *)inp, sizeof (*inp), AF_INET);
- if (hp) {
- cp = hp->h_name;
- trimdomain(cp, strlen(cp));
- }
- }
- }
- if (inp->s_addr == INADDR_ANY)
- strcpy(line, "*");
- else if (cp) {
- strlcpy(line, cp, sizeof(line));
- } else {
- inp->s_addr = ntohl(inp->s_addr);
-#define C(x) ((u_int)((x) & 0xff))
- sprintf(line, "%u.%u.%u.%u", C(inp->s_addr >> 24),
- C(inp->s_addr >> 16), C(inp->s_addr >> 8), C(inp->s_addr));
- }
- return (line);
-}
diff --git a/usr.bin/netstat/inet6.c b/usr.bin/netstat/inet6.c
deleted file mode 100644
index cd069c8..0000000
--- a/usr.bin/netstat/inet6.c
+++ /dev/null
@@ -1,1156 +0,0 @@
-/* BSDI inet.c,v 2.3 1995/10/24 02:19:29 prb Exp */
-/*-
- * Copyright (c) 1983, 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)inet6.c 8.4 (Berkeley) 4/20/94";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifdef INET6
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/ioctl.h>
-#include <sys/mbuf.h>
-#include <sys/protosw.h>
-#include <sys/sysctl.h>
-
-#include <net/route.h>
-#include <net/if.h>
-#include <net/if_var.h>
-#include <netinet/in.h>
-#include <netinet/ip6.h>
-#include <netinet/icmp6.h>
-#include <netinet/in_systm.h>
-#include <netinet6/in6_pcb.h>
-#include <netinet6/in6_var.h>
-#include <netinet6/ip6_var.h>
-#include <netinet6/pim6_var.h>
-#include <netinet6/raw_ip6.h>
-
-#include <arpa/inet.h>
-#include <netdb.h>
-
-#include <err.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-#include "netstat.h"
-
-struct socket sockb;
-
-char *inet6name(struct in6_addr *);
-
-static char ntop_buf[INET6_ADDRSTRLEN];
-
-static const char *ip6nh[] = {
- "hop by hop",
- "ICMP",
- "IGMP",
- "#3",
- "IP",
- "#5",
- "TCP",
- "#7",
- "#8",
- "#9",
- "#10",
- "#11",
- "#12",
- "#13",
- "#14",
- "#15",
- "#16",
- "UDP",
- "#18",
- "#19",
- "#20",
- "#21",
- "IDP",
- "#23",
- "#24",
- "#25",
- "#26",
- "#27",
- "#28",
- "TP",
- "#30",
- "#31",
- "#32",
- "#33",
- "#34",
- "#35",
- "#36",
- "#37",
- "#38",
- "#39",
- "#40",
- "IP6",
- "#42",
- "routing",
- "fragment",
- "#45",
- "#46",
- "#47",
- "#48",
- "#49",
- "ESP",
- "AH",
- "#52",
- "#53",
- "#54",
- "#55",
- "#56",
- "#57",
- "ICMP6",
- "no next header",
- "destination option",
- "#61",
- "mobility",
- "#63",
- "#64",
- "#65",
- "#66",
- "#67",
- "#68",
- "#69",
- "#70",
- "#71",
- "#72",
- "#73",
- "#74",
- "#75",
- "#76",
- "#77",
- "#78",
- "#79",
- "ISOIP",
- "#81",
- "#82",
- "#83",
- "#84",
- "#85",
- "#86",
- "#87",
- "#88",
- "OSPF",
- "#80",
- "#91",
- "#92",
- "#93",
- "#94",
- "#95",
- "#96",
- "Ethernet",
- "#98",
- "#99",
- "#100",
- "#101",
- "#102",
- "PIM",
- "#104",
- "#105",
- "#106",
- "#107",
- "#108",
- "#109",
- "#110",
- "#111",
- "#112",
- "#113",
- "#114",
- "#115",
- "#116",
- "#117",
- "#118",
- "#119",
- "#120",
- "#121",
- "#122",
- "#123",
- "#124",
- "#125",
- "#126",
- "#127",
- "#128",
- "#129",
- "#130",
- "#131",
- "#132",
- "#133",
- "#134",
- "#135",
- "#136",
- "#137",
- "#138",
- "#139",
- "#140",
- "#141",
- "#142",
- "#143",
- "#144",
- "#145",
- "#146",
- "#147",
- "#148",
- "#149",
- "#150",
- "#151",
- "#152",
- "#153",
- "#154",
- "#155",
- "#156",
- "#157",
- "#158",
- "#159",
- "#160",
- "#161",
- "#162",
- "#163",
- "#164",
- "#165",
- "#166",
- "#167",
- "#168",
- "#169",
- "#170",
- "#171",
- "#172",
- "#173",
- "#174",
- "#175",
- "#176",
- "#177",
- "#178",
- "#179",
- "#180",
- "#181",
- "#182",
- "#183",
- "#184",
- "#185",
- "#186",
- "#187",
- "#188",
- "#189",
- "#180",
- "#191",
- "#192",
- "#193",
- "#194",
- "#195",
- "#196",
- "#197",
- "#198",
- "#199",
- "#200",
- "#201",
- "#202",
- "#203",
- "#204",
- "#205",
- "#206",
- "#207",
- "#208",
- "#209",
- "#210",
- "#211",
- "#212",
- "#213",
- "#214",
- "#215",
- "#216",
- "#217",
- "#218",
- "#219",
- "#220",
- "#221",
- "#222",
- "#223",
- "#224",
- "#225",
- "#226",
- "#227",
- "#228",
- "#229",
- "#230",
- "#231",
- "#232",
- "#233",
- "#234",
- "#235",
- "#236",
- "#237",
- "#238",
- "#239",
- "#240",
- "#241",
- "#242",
- "#243",
- "#244",
- "#245",
- "#246",
- "#247",
- "#248",
- "#249",
- "#250",
- "#251",
- "#252",
- "#253",
- "#254",
- "#255",
-};
-
-static char *srcrule_str[] = {
- "first candidate",
- "same address",
- "appropriate scope",
- "deprecated address",
- "home address",
- "outgoing interface",
- "matching label",
- "public/temporary address",
- "alive interface",
- "preferred interface",
- "rule #10",
- "rule #11",
- "rule #12",
- "rule #13",
- "longest match",
- "rule #15",
-};
-
-/*
- * Dump IP6 statistics structure.
- */
-void
-ip6_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
-{
- struct ip6stat ip6stat;
- int first, i;
- size_t len;
-
- len = sizeof ip6stat;
- if (live) {
- memset(&ip6stat, 0, len);
- if (sysctlbyname("net.inet6.ip6.stats", &ip6stat, &len, NULL,
- 0) < 0) {
- if (errno != ENOENT)
- warn("sysctl: net.inet6.ip6.stats");
- return;
- }
- } else
- kread(off, &ip6stat, len);
-
- printf("%s:\n", name);
-
-#define p(f, m) if (ip6stat.f || sflag <= 1) \
- printf(m, (uintmax_t)ip6stat.f, plural(ip6stat.f))
-#define p1a(f, m) if (ip6stat.f || sflag <= 1) \
- printf(m, (uintmax_t)ip6stat.f)
-
- p(ip6s_total, "\t%ju total packet%s received\n");
- p1a(ip6s_toosmall, "\t%ju with size smaller than minimum\n");
- p1a(ip6s_tooshort, "\t%ju with data size < data length\n");
- p1a(ip6s_badoptions, "\t%ju with bad options\n");
- p1a(ip6s_badvers, "\t%ju with incorrect version number\n");
- p(ip6s_fragments, "\t%ju fragment%s received\n");
- p(ip6s_fragdropped, "\t%ju fragment%s dropped (dup or out of space)\n");
- p(ip6s_fragtimeout, "\t%ju fragment%s dropped after timeout\n");
- p(ip6s_fragoverflow, "\t%ju fragment%s that exceeded limit\n");
- p(ip6s_reassembled, "\t%ju packet%s reassembled ok\n");
- p(ip6s_delivered, "\t%ju packet%s for this host\n");
- p(ip6s_forward, "\t%ju packet%s forwarded\n");
- p(ip6s_cantforward, "\t%ju packet%s not forwardable\n");
- p(ip6s_redirectsent, "\t%ju redirect%s sent\n");
- p(ip6s_localout, "\t%ju packet%s sent from this host\n");
- p(ip6s_rawout, "\t%ju packet%s sent with fabricated ip header\n");
- p(ip6s_odropped, "\t%ju output packet%s dropped due to no bufs, etc.\n");
- p(ip6s_noroute, "\t%ju output packet%s discarded due to no route\n");
- p(ip6s_fragmented, "\t%ju output datagram%s fragmented\n");
- p(ip6s_ofragments, "\t%ju fragment%s created\n");
- p(ip6s_cantfrag, "\t%ju datagram%s that can't be fragmented\n");
- p(ip6s_badscope, "\t%ju packet%s that violated scope rules\n");
- p(ip6s_notmember, "\t%ju multicast packet%s which we don't join\n");
- for (first = 1, i = 0; i < 256; i++)
- if (ip6stat.ip6s_nxthist[i] != 0) {
- if (first) {
- printf("\tInput histogram:\n");
- first = 0;
- }
- printf("\t\t%s: %ju\n", ip6nh[i],
- (uintmax_t)ip6stat.ip6s_nxthist[i]);
- }
- printf("\tMbuf statistics:\n");
- printf("\t\t%ju one mbuf\n", (uintmax_t)ip6stat.ip6s_m1);
- for (first = 1, i = 0; i < 32; i++) {
- char ifbuf[IFNAMSIZ];
- if (ip6stat.ip6s_m2m[i] != 0) {
- if (first) {
- printf("\t\ttwo or more mbuf:\n");
- first = 0;
- }
- printf("\t\t\t%s= %ju\n",
- if_indextoname(i, ifbuf),
- (uintmax_t)ip6stat.ip6s_m2m[i]);
- }
- }
- printf("\t\t%ju one ext mbuf\n",
- (uintmax_t)ip6stat.ip6s_mext1);
- printf("\t\t%ju two or more ext mbuf\n",
- (uintmax_t)ip6stat.ip6s_mext2m);
- p(ip6s_exthdrtoolong,
- "\t%ju packet%s whose headers are not continuous\n");
- p(ip6s_nogif, "\t%ju tunneling packet%s that can't find gif\n");
- p(ip6s_toomanyhdr,
- "\t%ju packet%s discarded because of too many headers\n");
-
- /* for debugging source address selection */
-#define PRINT_SCOPESTAT(s,i) do {\
- switch(i) { /* XXX hardcoding in each case */\
- case 1:\
- p(s, "\t\t%ju node-local%s\n");\
- break;\
- case 2:\
- p(s,"\t\t%ju link-local%s\n");\
- break;\
- case 5:\
- p(s,"\t\t%ju site-local%s\n");\
- break;\
- case 14:\
- p(s,"\t\t%ju global%s\n");\
- break;\
- default:\
- printf("\t\t%ju addresses scope=%x\n",\
- (uintmax_t)ip6stat.s, i);\
- }\
- } while (0);
-
- p(ip6s_sources_none,
- "\t%ju failure%s of source address selection\n");
- for (first = 1, i = 0; i < 16; i++) {
- if (ip6stat.ip6s_sources_sameif[i]) {
- if (first) {
- printf("\tsource addresses on an outgoing I/F\n");
- first = 0;
- }
- PRINT_SCOPESTAT(ip6s_sources_sameif[i], i);
- }
- }
- for (first = 1, i = 0; i < 16; i++) {
- if (ip6stat.ip6s_sources_otherif[i]) {
- if (first) {
- printf("\tsource addresses on a non-outgoing I/F\n");
- first = 0;
- }
- PRINT_SCOPESTAT(ip6s_sources_otherif[i], i);
- }
- }
- for (first = 1, i = 0; i < 16; i++) {
- if (ip6stat.ip6s_sources_samescope[i]) {
- if (first) {
- printf("\tsource addresses of same scope\n");
- first = 0;
- }
- PRINT_SCOPESTAT(ip6s_sources_samescope[i], i);
- }
- }
- for (first = 1, i = 0; i < 16; i++) {
- if (ip6stat.ip6s_sources_otherscope[i]) {
- if (first) {
- printf("\tsource addresses of a different scope\n");
- first = 0;
- }
- PRINT_SCOPESTAT(ip6s_sources_otherscope[i], i);
- }
- }
- for (first = 1, i = 0; i < 16; i++) {
- if (ip6stat.ip6s_sources_deprecated[i]) {
- if (first) {
- printf("\tdeprecated source addresses\n");
- first = 0;
- }
- PRINT_SCOPESTAT(ip6s_sources_deprecated[i], i);
- }
- }
-
- p1a(ip6s_forward_cachehit, "\t%ju forward cache hit\n");
- p1a(ip6s_forward_cachemiss, "\t%ju forward cache miss\n");
- printf("\tSource addresses selection rule applied:\n");
- for (i = 0; i < 16; i++) {
- if (ip6stat.ip6s_sources_rule[i])
- printf("\t\t%ju %s\n",
- (uintmax_t)ip6stat.ip6s_sources_rule[i],
- srcrule_str[i]);
- }
-#undef p
-#undef p1a
-}
-
-/*
- * Dump IPv6 per-interface statistics based on RFC 2465.
- */
-void
-ip6_ifstats(char *ifname)
-{
- struct in6_ifreq ifr;
- int s;
-#define p(f, m) if (ifr.ifr_ifru.ifru_stat.f || sflag <= 1) \
- printf(m, (uintmax_t)ifr.ifr_ifru.ifru_stat.f, plural(ifr.ifr_ifru.ifru_stat.f))
-#define p_5(f, m) if (ifr.ifr_ifru.ifru_stat.f || sflag <= 1) \
- printf(m, (uintmax_t)ip6stat.f)
-
- if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
- perror("Warning: socket(AF_INET6)");
- return;
- }
-
- strcpy(ifr.ifr_name, ifname);
- printf("ip6 on %s:\n", ifr.ifr_name);
-
- if (ioctl(s, SIOCGIFSTAT_IN6, (char *)&ifr) < 0) {
- perror("Warning: ioctl(SIOCGIFSTAT_IN6)");
- goto end;
- }
-
- p(ifs6_in_receive, "\t%ju total input datagram%s\n");
- p(ifs6_in_hdrerr, "\t%ju datagram%s with invalid header received\n");
- p(ifs6_in_toobig, "\t%ju datagram%s exceeded MTU received\n");
- p(ifs6_in_noroute, "\t%ju datagram%s with no route received\n");
- p(ifs6_in_addrerr, "\t%ju datagram%s with invalid dst received\n");
- p(ifs6_in_protounknown, "\t%ju datagram%s with unknown proto received\n");
- p(ifs6_in_truncated, "\t%ju truncated datagram%s received\n");
- p(ifs6_in_discard, "\t%ju input datagram%s discarded\n");
- p(ifs6_in_deliver,
- "\t%ju datagram%s delivered to an upper layer protocol\n");
- p(ifs6_out_forward, "\t%ju datagram%s forwarded to this interface\n");
- p(ifs6_out_request,
- "\t%ju datagram%s sent from an upper layer protocol\n");
- p(ifs6_out_discard, "\t%ju total discarded output datagram%s\n");
- p(ifs6_out_fragok, "\t%ju output datagram%s fragmented\n");
- p(ifs6_out_fragfail, "\t%ju output datagram%s failed on fragment\n");
- p(ifs6_out_fragcreat, "\t%ju output datagram%s succeeded on fragment\n");
- p(ifs6_reass_reqd, "\t%ju incoming datagram%s fragmented\n");
- p(ifs6_reass_ok, "\t%ju datagram%s reassembled\n");
- p(ifs6_reass_fail, "\t%ju datagram%s failed on reassembly\n");
- p(ifs6_in_mcast, "\t%ju multicast datagram%s received\n");
- p(ifs6_out_mcast, "\t%ju multicast datagram%s sent\n");
-
- end:
- close(s);
-
-#undef p
-#undef p_5
-}
-
-static const char *icmp6names[] = {
- "#0",
- "unreach",
- "packet too big",
- "time exceed",
- "parameter problem",
- "#5",
- "#6",
- "#7",
- "#8",
- "#9",
- "#10",
- "#11",
- "#12",
- "#13",
- "#14",
- "#15",
- "#16",
- "#17",
- "#18",
- "#19",
- "#20",
- "#21",
- "#22",
- "#23",
- "#24",
- "#25",
- "#26",
- "#27",
- "#28",
- "#29",
- "#30",
- "#31",
- "#32",
- "#33",
- "#34",
- "#35",
- "#36",
- "#37",
- "#38",
- "#39",
- "#40",
- "#41",
- "#42",
- "#43",
- "#44",
- "#45",
- "#46",
- "#47",
- "#48",
- "#49",
- "#50",
- "#51",
- "#52",
- "#53",
- "#54",
- "#55",
- "#56",
- "#57",
- "#58",
- "#59",
- "#60",
- "#61",
- "#62",
- "#63",
- "#64",
- "#65",
- "#66",
- "#67",
- "#68",
- "#69",
- "#70",
- "#71",
- "#72",
- "#73",
- "#74",
- "#75",
- "#76",
- "#77",
- "#78",
- "#79",
- "#80",
- "#81",
- "#82",
- "#83",
- "#84",
- "#85",
- "#86",
- "#87",
- "#88",
- "#89",
- "#80",
- "#91",
- "#92",
- "#93",
- "#94",
- "#95",
- "#96",
- "#97",
- "#98",
- "#99",
- "#100",
- "#101",
- "#102",
- "#103",
- "#104",
- "#105",
- "#106",
- "#107",
- "#108",
- "#109",
- "#110",
- "#111",
- "#112",
- "#113",
- "#114",
- "#115",
- "#116",
- "#117",
- "#118",
- "#119",
- "#120",
- "#121",
- "#122",
- "#123",
- "#124",
- "#125",
- "#126",
- "#127",
- "echo",
- "echo reply",
- "multicast listener query",
- "multicast listener report",
- "multicast listener done",
- "router solicitation",
- "router advertisement",
- "neighbor solicitation",
- "neighbor advertisement",
- "redirect",
- "router renumbering",
- "node information request",
- "node information reply",
- "inverse neighbor solicitation",
- "inverse neighbor advertisement",
- "#143",
- "#144",
- "#145",
- "#146",
- "#147",
- "#148",
- "#149",
- "#150",
- "#151",
- "#152",
- "#153",
- "#154",
- "#155",
- "#156",
- "#157",
- "#158",
- "#159",
- "#160",
- "#161",
- "#162",
- "#163",
- "#164",
- "#165",
- "#166",
- "#167",
- "#168",
- "#169",
- "#170",
- "#171",
- "#172",
- "#173",
- "#174",
- "#175",
- "#176",
- "#177",
- "#178",
- "#179",
- "#180",
- "#181",
- "#182",
- "#183",
- "#184",
- "#185",
- "#186",
- "#187",
- "#188",
- "#189",
- "#180",
- "#191",
- "#192",
- "#193",
- "#194",
- "#195",
- "#196",
- "#197",
- "#198",
- "#199",
- "#200",
- "#201",
- "#202",
- "#203",
- "#204",
- "#205",
- "#206",
- "#207",
- "#208",
- "#209",
- "#210",
- "#211",
- "#212",
- "#213",
- "#214",
- "#215",
- "#216",
- "#217",
- "#218",
- "#219",
- "#220",
- "#221",
- "#222",
- "#223",
- "#224",
- "#225",
- "#226",
- "#227",
- "#228",
- "#229",
- "#230",
- "#231",
- "#232",
- "#233",
- "#234",
- "#235",
- "#236",
- "#237",
- "#238",
- "#239",
- "#240",
- "#241",
- "#242",
- "#243",
- "#244",
- "#245",
- "#246",
- "#247",
- "#248",
- "#249",
- "#250",
- "#251",
- "#252",
- "#253",
- "#254",
- "#255",
-};
-
-/*
- * Dump ICMP6 statistics.
- */
-void
-icmp6_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
-{
- struct icmp6stat icmp6stat;
- int i, first;
- size_t len;
-
- len = sizeof icmp6stat;
- if (live) {
- memset(&icmp6stat, 0, len);
- if (sysctlbyname("net.inet6.icmp6.stats", &icmp6stat, &len,
- NULL, 0) < 0) {
- if (errno != ENOENT)
- warn("sysctl: net.inet6.icmp6.stats");
- return;
- }
- } else
- kread(off, &icmp6stat, len);
-
- printf("%s:\n", name);
-
-#define p(f, m) if (icmp6stat.f || sflag <= 1) \
- printf(m, (uintmax_t)icmp6stat.f, plural(icmp6stat.f))
-#define p_5(f, m) printf(m, (uintmax_t)icmp6stat.f)
-
- p(icp6s_error, "\t%ju call%s to icmp6_error\n");
- p(icp6s_canterror,
- "\t%ju error%s not generated in response to an icmp6 message\n");
- p(icp6s_toofreq,
- "\t%ju error%s not generated because of rate limitation\n");
-#define NELEM (int)(sizeof(icmp6stat.icp6s_outhist)/sizeof(icmp6stat.icp6s_outhist[0]))
- for (first = 1, i = 0; i < NELEM; i++)
- if (icmp6stat.icp6s_outhist[i] != 0) {
- if (first) {
- printf("\tOutput histogram:\n");
- first = 0;
- }
- printf("\t\t%s: %ju\n", icmp6names[i],
- (uintmax_t)icmp6stat.icp6s_outhist[i]);
- }
-#undef NELEM
- p(icp6s_badcode, "\t%ju message%s with bad code fields\n");
- p(icp6s_tooshort, "\t%ju message%s < minimum length\n");
- p(icp6s_checksum, "\t%ju bad checksum%s\n");
- p(icp6s_badlen, "\t%ju message%s with bad length\n");
-#define NELEM (int)(sizeof(icmp6stat.icp6s_inhist)/sizeof(icmp6stat.icp6s_inhist[0]))
- for (first = 1, i = 0; i < NELEM; i++)
- if (icmp6stat.icp6s_inhist[i] != 0) {
- if (first) {
- printf("\tInput histogram:\n");
- first = 0;
- }
- printf("\t\t%s: %ju\n", icmp6names[i],
- (uintmax_t)icmp6stat.icp6s_inhist[i]);
- }
-#undef NELEM
- printf("\tHistogram of error messages to be generated:\n");
- p_5(icp6s_odst_unreach_noroute, "\t\t%ju no route\n");
- p_5(icp6s_odst_unreach_admin, "\t\t%ju administratively prohibited\n");
- p_5(icp6s_odst_unreach_beyondscope, "\t\t%ju beyond scope\n");
- p_5(icp6s_odst_unreach_addr, "\t\t%ju address unreachable\n");
- p_5(icp6s_odst_unreach_noport, "\t\t%ju port unreachable\n");
- p_5(icp6s_opacket_too_big, "\t\t%ju packet too big\n");
- p_5(icp6s_otime_exceed_transit, "\t\t%ju time exceed transit\n");
- p_5(icp6s_otime_exceed_reassembly, "\t\t%ju time exceed reassembly\n");
- p_5(icp6s_oparamprob_header, "\t\t%ju erroneous header field\n");
- p_5(icp6s_oparamprob_nextheader, "\t\t%ju unrecognized next header\n");
- p_5(icp6s_oparamprob_option, "\t\t%ju unrecognized option\n");
- p_5(icp6s_oredirect, "\t\t%ju redirect\n");
- p_5(icp6s_ounknown, "\t\t%ju unknown\n");
-
- p(icp6s_reflect, "\t%ju message response%s generated\n");
- p(icp6s_nd_toomanyopt, "\t%ju message%s with too many ND options\n");
- p(icp6s_nd_badopt, "\t%ju message%s with bad ND options\n");
- p(icp6s_badns, "\t%ju bad neighbor solicitation message%s\n");
- p(icp6s_badna, "\t%ju bad neighbor advertisement message%s\n");
- p(icp6s_badrs, "\t%ju bad router solicitation message%s\n");
- p(icp6s_badra, "\t%ju bad router advertisement message%s\n");
- p(icp6s_badredirect, "\t%ju bad redirect message%s\n");
- p(icp6s_pmtuchg, "\t%ju path MTU change%s\n");
-#undef p
-#undef p_5
-}
-
-/*
- * Dump ICMPv6 per-interface statistics based on RFC 2466.
- */
-void
-icmp6_ifstats(char *ifname)
-{
- struct in6_ifreq ifr;
- int s;
-#define p(f, m) if (ifr.ifr_ifru.ifru_icmp6stat.f || sflag <= 1) \
- printf(m, (uintmax_t)ifr.ifr_ifru.ifru_icmp6stat.f, plural(ifr.ifr_ifru.ifru_icmp6stat.f))
-#define p2(f, m) if (ifr.ifr_ifru.ifru_icmp6stat.f || sflag <= 1) \
- printf(m, (uintmax_t)ifr.ifr_ifru.ifru_icmp6stat.f, pluralies(ifr.ifr_ifru.ifru_icmp6stat.f))
-
- if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
- perror("Warning: socket(AF_INET6)");
- return;
- }
-
- strcpy(ifr.ifr_name, ifname);
- printf("icmp6 on %s:\n", ifr.ifr_name);
-
- if (ioctl(s, SIOCGIFSTAT_ICMP6, (char *)&ifr) < 0) {
- perror("Warning: ioctl(SIOCGIFSTAT_ICMP6)");
- goto end;
- }
-
- p(ifs6_in_msg, "\t%ju total input message%s\n");
- p(ifs6_in_error, "\t%ju total input error message%s\n");
- p(ifs6_in_dstunreach, "\t%ju input destination unreachable error%s\n");
- p(ifs6_in_adminprohib, "\t%ju input administratively prohibited error%s\n");
- p(ifs6_in_timeexceed, "\t%ju input time exceeded error%s\n");
- p(ifs6_in_paramprob, "\t%ju input parameter problem error%s\n");
- p(ifs6_in_pkttoobig, "\t%ju input packet too big error%s\n");
- p(ifs6_in_echo, "\t%ju input echo request%s\n");
- p2(ifs6_in_echoreply, "\t%ju input echo repl%s\n");
- p(ifs6_in_routersolicit, "\t%ju input router solicitation%s\n");
- p(ifs6_in_routeradvert, "\t%ju input router advertisement%s\n");
- p(ifs6_in_neighborsolicit, "\t%ju input neighbor solicitation%s\n");
- p(ifs6_in_neighboradvert, "\t%ju input neighbor advertisement%s\n");
- p(ifs6_in_redirect, "\t%ju input redirect%s\n");
- p2(ifs6_in_mldquery, "\t%ju input MLD quer%s\n");
- p(ifs6_in_mldreport, "\t%ju input MLD report%s\n");
- p(ifs6_in_mlddone, "\t%ju input MLD done%s\n");
-
- p(ifs6_out_msg, "\t%ju total output message%s\n");
- p(ifs6_out_error, "\t%ju total output error message%s\n");
- p(ifs6_out_dstunreach, "\t%ju output destination unreachable error%s\n");
- p(ifs6_out_adminprohib, "\t%ju output administratively prohibited error%s\n");
- p(ifs6_out_timeexceed, "\t%ju output time exceeded error%s\n");
- p(ifs6_out_paramprob, "\t%ju output parameter problem error%s\n");
- p(ifs6_out_pkttoobig, "\t%ju output packet too big error%s\n");
- p(ifs6_out_echo, "\t%ju output echo request%s\n");
- p2(ifs6_out_echoreply, "\t%ju output echo repl%s\n");
- p(ifs6_out_routersolicit, "\t%ju output router solicitation%s\n");
- p(ifs6_out_routeradvert, "\t%ju output router advertisement%s\n");
- p(ifs6_out_neighborsolicit, "\t%ju output neighbor solicitation%s\n");
- p(ifs6_out_neighboradvert, "\t%ju output neighbor advertisement%s\n");
- p(ifs6_out_redirect, "\t%ju output redirect%s\n");
- p2(ifs6_out_mldquery, "\t%ju output MLD quer%s\n");
- p(ifs6_out_mldreport, "\t%ju output MLD report%s\n");
- p(ifs6_out_mlddone, "\t%ju output MLD done%s\n");
-
- end:
- close(s);
-#undef p
-}
-
-/*
- * Dump PIM statistics structure.
- */
-void
-pim6_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
-{
- struct pim6stat pim6stat, zerostat;
- size_t len = sizeof pim6stat;
-
- if (live) {
- if (zflag)
- memset(&zerostat, 0, len);
- if (sysctlbyname("net.inet6.pim.stats", &pim6stat, &len,
- zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
- if (errno != ENOENT)
- warn("sysctl: net.inet6.pim.stats");
- return;
- }
- } else {
- if (off == 0)
- return;
- kread(off, &pim6stat, len);
- }
-
- printf("%s:\n", name);
-
-#define p(f, m) if (pim6stat.f || sflag <= 1) \
- printf(m, (uintmax_t)pim6stat.f, plural(pim6stat.f))
- p(pim6s_rcv_total, "\t%ju message%s received\n");
- p(pim6s_rcv_tooshort, "\t%ju message%s received with too few bytes\n");
- p(pim6s_rcv_badsum, "\t%ju message%s received with bad checksum\n");
- p(pim6s_rcv_badversion, "\t%ju message%s received with bad version\n");
- p(pim6s_rcv_registers, "\t%ju register%s received\n");
- p(pim6s_rcv_badregisters, "\t%ju bad register%s received\n");
- p(pim6s_snd_registers, "\t%ju register%s sent\n");
-#undef p
-}
-
-/*
- * Dump raw ip6 statistics structure.
- */
-void
-rip6_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
-{
- struct rip6stat rip6stat;
- u_quad_t delivered;
- size_t len;
-
- len = sizeof(rip6stat);
- if (live) {
- if (sysctlbyname("net.inet6.ip6.rip6stats", &rip6stat, &len,
- NULL, 0) < 0) {
- if (errno != ENOENT)
- warn("sysctl: net.inet6.ip6.rip6stats");
- return;
- }
- } else
- kread(off, &rip6stat, len);
-
- printf("%s:\n", name);
-
-#define p(f, m) if (rip6stat.f || sflag <= 1) \
- printf(m, (uintmax_t)rip6stat.f, plural(rip6stat.f))
- p(rip6s_ipackets, "\t%ju message%s received\n");
- p(rip6s_isum, "\t%ju checksum calcuration%s on inbound\n");
- p(rip6s_badsum, "\t%ju message%s with bad checksum\n");
- p(rip6s_nosock, "\t%ju message%s dropped due to no socket\n");
- p(rip6s_nosockmcast,
- "\t%ju multicast message%s dropped due to no socket\n");
- p(rip6s_fullsock,
- "\t%ju message%s dropped due to full socket buffers\n");
- delivered = rip6stat.rip6s_ipackets -
- rip6stat.rip6s_badsum -
- rip6stat.rip6s_nosock -
- rip6stat.rip6s_nosockmcast -
- rip6stat.rip6s_fullsock;
- if (delivered || sflag <= 1)
- printf("\t%ju delivered\n", (uintmax_t)delivered);
- p(rip6s_opackets, "\t%ju datagram%s output\n");
-#undef p
-}
-
-/*
- * Pretty print an Internet address (net address + port).
- * Take numeric_addr and numeric_port into consideration.
- */
-#define GETSERVBYPORT6(port, proto, ret)\
-{\
- if (strcmp((proto), "tcp6") == 0)\
- (ret) = getservbyport((int)(port), "tcp");\
- else if (strcmp((proto), "udp6") == 0)\
- (ret) = getservbyport((int)(port), "udp");\
- else\
- (ret) = getservbyport((int)(port), (proto));\
-};
-
-void
-inet6print(struct in6_addr *in6, int port, const char *proto, int numeric)
-{
- struct servent *sp = 0;
- char line[80], *cp;
- int width;
-
- sprintf(line, "%.*s.", Wflag ? 39 :
- (Aflag && !numeric) ? 12 : 16, inet6name(in6));
- cp = index(line, '\0');
- if (!numeric && port)
- GETSERVBYPORT6(port, proto, sp);
- if (sp || port == 0)
- sprintf(cp, "%.15s", sp ? sp->s_name : "*");
- else
- sprintf(cp, "%d", ntohs((u_short)port));
- width = Wflag ? 45 : Aflag ? 18 : 22;
- printf("%-*.*s ", width, width, line);
-}
-
-/*
- * Construct an Internet address representation.
- * If the numeric_addr has been supplied, give
- * numeric value, otherwise try for symbolic name.
- */
-
-char *
-inet6name(struct in6_addr *in6p)
-{
- char *cp;
- static char line[50];
- struct hostent *hp;
- static char domain[MAXHOSTNAMELEN];
- static int first = 1;
-
- if (first && !numeric_addr) {
- first = 0;
- if (gethostname(domain, MAXHOSTNAMELEN) == 0 &&
- (cp = index(domain, '.')))
- (void) strcpy(domain, cp + 1);
- else
- domain[0] = 0;
- }
- cp = 0;
- if (!numeric_addr && !IN6_IS_ADDR_UNSPECIFIED(in6p)) {
- hp = gethostbyaddr((char *)in6p, sizeof(*in6p), AF_INET6);
- if (hp) {
- if ((cp = index(hp->h_name, '.')) &&
- !strcmp(cp + 1, domain))
- *cp = 0;
- cp = hp->h_name;
- }
- }
- if (IN6_IS_ADDR_UNSPECIFIED(in6p))
- strcpy(line, "*");
- else if (cp)
- strcpy(line, cp);
- else
- sprintf(line, "%s",
- inet_ntop(AF_INET6, (void *)in6p, ntop_buf,
- sizeof(ntop_buf)));
- return (line);
-}
-#endif /*INET6*/
diff --git a/usr.bin/netstat/ipsec.c b/usr.bin/netstat/ipsec.c
deleted file mode 100644
index bfd8ce0..0000000
--- a/usr.bin/netstat/ipsec.c
+++ /dev/null
@@ -1,464 +0,0 @@
-/* $KAME: ipsec.c,v 1.33 2003/07/25 09:54:32 itojun Exp $ */
-
-/*-
- * Copyright (c) 2005 NTT Multimedia Communications Laboratories, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*-
- * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*-
- * Copyright (c) 1983, 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)inet.c 8.5 (Berkeley) 5/24/95";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-
-#include <netinet/in.h>
-
-#ifdef IPSEC
-#include <netipsec/ipsec.h>
-#include <netipsec/ah_var.h>
-#include <netipsec/esp_var.h>
-#include <netipsec/ipcomp_var.h>
-#endif
-
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include "netstat.h"
-
-#ifdef IPSEC
-struct val2str {
- int val;
- const char *str;
-};
-
-static struct val2str ipsec_ahnames[] = {
- { SADB_AALG_NONE, "none", },
- { SADB_AALG_MD5HMAC, "hmac-md5", },
- { SADB_AALG_SHA1HMAC, "hmac-sha1", },
- { SADB_X_AALG_MD5, "md5", },
- { SADB_X_AALG_SHA, "sha", },
- { SADB_X_AALG_NULL, "null", },
-#ifdef SADB_X_AALG_SHA2_256
- { SADB_X_AALG_SHA2_256, "hmac-sha2-256", },
-#endif
-#ifdef SADB_X_AALG_SHA2_384
- { SADB_X_AALG_SHA2_384, "hmac-sha2-384", },
-#endif
-#ifdef SADB_X_AALG_SHA2_512
- { SADB_X_AALG_SHA2_512, "hmac-sha2-512", },
-#endif
-#ifdef SADB_X_AALG_RIPEMD160HMAC
- { SADB_X_AALG_RIPEMD160HMAC, "hmac-ripemd160", },
-#endif
-#ifdef SADB_X_AALG_AES_XCBC_MAC
- { SADB_X_AALG_AES_XCBC_MAC, "aes-xcbc-mac", },
-#endif
- { -1, NULL },
-};
-
-static struct val2str ipsec_espnames[] = {
- { SADB_EALG_NONE, "none", },
- { SADB_EALG_DESCBC, "des-cbc", },
- { SADB_EALG_3DESCBC, "3des-cbc", },
- { SADB_EALG_NULL, "null", },
- { SADB_X_EALG_CAST128CBC, "cast128-cbc", },
- { SADB_X_EALG_BLOWFISHCBC, "blowfish-cbc", },
-#ifdef SADB_X_EALG_RIJNDAELCBC
- { SADB_X_EALG_RIJNDAELCBC, "rijndael-cbc", },
-#endif
-#ifdef SADB_X_EALG_AESCTR
- { SADB_X_EALG_AESCTR, "aes-ctr", },
-#endif
- { -1, NULL },
-};
-
-static struct val2str ipsec_compnames[] = {
- { SADB_X_CALG_NONE, "none", },
- { SADB_X_CALG_OUI, "oui", },
- { SADB_X_CALG_DEFLATE, "deflate", },
- { SADB_X_CALG_LZS, "lzs", },
- { -1, NULL },
-};
-
-static void ipsec_hist(const u_quad_t *hist, size_t histmax,
- const struct val2str *name, const char *title);
-static void print_ipsecstats(const struct ipsecstat *ipsecstat);
-
-
-/*
- * Dump IPSEC statistics structure.
- */
-static void
-ipsec_hist(const u_quad_t *hist, size_t histmax, const struct val2str *name,
- const char *title)
-{
- int first;
- size_t proto;
- const struct val2str *p;
-
- first = 1;
- for (proto = 0; proto < histmax; proto++) {
- if (hist[proto] <= 0)
- continue;
- if (first) {
- printf("\t%s histogram:\n", title);
- first = 0;
- }
- for (p = name; p && p->str; p++) {
- if (p->val == (int)proto)
- break;
- }
- if (p && p->str) {
- printf("\t\t%s: %ju\n", p->str, (uintmax_t)hist[proto]);
- } else {
- printf("\t\t#%ld: %ju\n", (long)proto,
- (uintmax_t)hist[proto]);
- }
- }
-}
-
-static void
-print_ipsecstats(const struct ipsecstat *ipsecstat)
-{
-#define p(f, m) if (ipsecstat->f || sflag <= 1) \
- printf(m, (uintmax_t)ipsecstat->f, plural(ipsecstat->f))
-#define pes(f, m) if (ipsecstat->f || sflag <= 1) \
- printf(m, (uintmax_t)ipsecstat->f, plurales(ipsecstat->f))
-#define hist(f, n, t) \
- ipsec_hist((f), sizeof(f)/sizeof(f[0]), (n), (t));
-
- p(in_success, "\t%ju inbound packet%s processed successfully\n");
- p(in_polvio, "\t%ju inbound packet%s violated process security "
- "policy\n");
- p(in_nosa, "\t%ju inbound packet%s with no SA available\n");
- p(in_inval, "\t%ju invalid inbound packet%s\n");
- p(in_nomem, "\t%ju inbound packet%s failed due to insufficient memory\n");
- p(in_badspi, "\t%ju inbound packet%s failed getting SPI\n");
- p(in_ahreplay, "\t%ju inbound packet%s failed on AH replay check\n");
- p(in_espreplay, "\t%ju inbound packet%s failed on ESP replay check\n");
- p(in_ahauthsucc, "\t%ju inbound packet%s considered authentic\n");
- p(in_ahauthfail, "\t%ju inbound packet%s failed on authentication\n");
- hist(ipsecstat->in_ahhist, ipsec_ahnames, "AH input");
- hist(ipsecstat->in_esphist, ipsec_espnames, "ESP input");
- hist(ipsecstat->in_comphist, ipsec_compnames, "IPComp input");
-
- p(out_success, "\t%ju outbound packet%s processed successfully\n");
- p(out_polvio, "\t%ju outbound packet%s violated process security "
- "policy\n");
- p(out_nosa, "\t%ju outbound packet%s with no SA available\n");
- p(out_inval, "\t%ju invalid outbound packet%s\n");
- p(out_nomem, "\t%ju outbound packet%s failed due to insufficient memory\n");
- p(out_noroute, "\t%ju outbound packet%s with no route\n");
- hist(ipsecstat->out_ahhist, ipsec_ahnames, "AH output");
- hist(ipsecstat->out_esphist, ipsec_espnames, "ESP output");
- hist(ipsecstat->out_comphist, ipsec_compnames, "IPComp output");
- p(spdcachelookup, "\t%ju SPD cache lookup%s\n");
- pes(spdcachemiss, "\t%ju SPD cache miss%s\n");
-#undef pes
-#undef hist
- p(ips_in_polvio, "\t%ju inbound packet%s violated process "
- "security policy\n");
- p(ips_out_polvio, "\t%ju outbound packet%s violated process "
- "security policy\n");
- p(ips_out_nosa, "\t%ju outbound packet%s with no SA available\n");
- p(ips_out_nomem, "\t%ju outbound packet%s failed due to "
- "insufficient memory\n");
- p(ips_out_noroute, "\t%ju outbound packet%s with no route "
- "available\n");
- p(ips_out_inval, "\t%ju invalid outbound packet%s\n");
- p(ips_out_bundlesa, "\t%ju outbound packet%s with bundled SAs\n");
- p(ips_mbcoalesced, "\t%ju mbuf%s coalesced during clone\n");
- p(ips_clcoalesced, "\t%ju cluster%s coalesced during clone\n");
- p(ips_clcopied, "\t%ju cluster%s copied during clone\n");
- p(ips_mbinserted, "\t%ju mbuf%s inserted during makespace\n");
-#undef p
-}
-
-void
-ipsec_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
-{
- struct ipsecstat ipsecstat;
-
- if (off == 0)
- return;
- printf ("%s:\n", name);
- kread(off, (char *)&ipsecstat, sizeof(ipsecstat));
-
- print_ipsecstats(&ipsecstat);
-}
-
-
-static void ipsec_hist_new(const u_int32_t *hist, size_t histmax,
- const struct val2str *name, const char *title);
-static void print_ahstats(const struct ahstat *ahstat);
-static void print_espstats(const struct espstat *espstat);
-static void print_ipcompstats(const struct ipcompstat *ipcompstat);
-
-/*
- * Dump IPSEC statistics structure.
- */
-static void
-ipsec_hist_new(const u_int32_t *hist, size_t histmax,
- const struct val2str *name, const char *title)
-{
- int first;
- size_t proto;
- const struct val2str *p;
-
- first = 1;
- for (proto = 0; proto < histmax; proto++) {
- if (hist[proto] <= 0)
- continue;
- if (first) {
- printf("\t%s histogram:\n", title);
- first = 0;
- }
- for (p = name; p && p->str; p++) {
- if (p->val == (int)proto)
- break;
- }
- if (p && p->str) {
- printf("\t\t%s: %u\n", p->str, hist[proto]);
- } else {
- printf("\t\t#%lu: %u\n", (unsigned long)proto,
- hist[proto]);
- }
- }
-}
-
-static void
-print_ahstats(const struct ahstat *ahstat)
-{
-#define p32(f, m) if (ahstat->f || sflag <= 1) \
- printf("\t%u" m, (unsigned int)ahstat->f, plural(ahstat->f))
-#define p64(f, m) if (ahstat->f || sflag <= 1) \
- printf("\t%ju" m, (uintmax_t)ahstat->f, plural(ahstat->f))
-#define hist(f, n, t) \
- ipsec_hist_new((f), sizeof(f)/sizeof(f[0]), (n), (t));
-
- p32(ahs_hdrops, " packet%s shorter than header shows\n");
- p32(ahs_nopf, " packet%s dropped; protocol family not supported\n");
- p32(ahs_notdb, " packet%s dropped; no TDB\n");
- p32(ahs_badkcr, " packet%s dropped; bad KCR\n");
- p32(ahs_qfull, " packet%s dropped; queue full\n");
- p32(ahs_noxform, " packet%s dropped; no transform\n");
- p32(ahs_wrap, " replay counter wrap%s\n");
- p32(ahs_badauth, " packet%s dropped; bad authentication detected\n");
- p32(ahs_badauthl, " packet%s dropped; bad authentication length\n");
- p32(ahs_replay, " possible replay packet%s detected\n");
- p32(ahs_input, " packet%s in\n");
- p32(ahs_output, " packet%s out\n");
- p32(ahs_invalid, " packet%s dropped; invalid TDB\n");
- p64(ahs_ibytes, " byte%s in\n");
- p64(ahs_obytes, " byte%s out\n");
- p32(ahs_toobig, " packet%s dropped; larger than IP_MAXPACKET\n");
- p32(ahs_pdrops, " packet%s blocked due to policy\n");
- p32(ahs_crypto, " crypto processing failure%s\n");
- p32(ahs_tunnel, " tunnel sanity check failure%s\n");
- hist(ahstat->ahs_hist, ipsec_ahnames, "AH output");
-
-#undef p32
-#undef p64
-#undef hist
-}
-
-void
-ah_stats(u_long off, const char *name, int family __unused, int proto __unused)
-{
- struct ahstat ahstat;
-
- if (off == 0)
- return;
- printf ("%s:\n", name);
- kread(off, (char *)&ahstat, sizeof(ahstat));
-
- print_ahstats(&ahstat);
-}
-
-static void
-print_espstats(const struct espstat *espstat)
-{
-#define p32(f, m) if (espstat->f || sflag <= 1) \
- printf("\t%u" m, (unsigned int)espstat->f, plural(espstat->f))
-#define p64(f, m) if (espstat->f || sflag <= 1) \
- printf("\t%ju" m, (uintmax_t)espstat->f, plural(espstat->f))
-#define hist(f, n, t) \
- ipsec_hist_new((f), sizeof(f)/sizeof(f[0]), (n), (t));
-
- p32(esps_hdrops, " packet%s shorter than header shows\n");
- p32(esps_nopf, " packet%s dropped; protocol family not supported\n");
- p32(esps_notdb, " packet%s dropped; no TDB\n");
- p32(esps_badkcr, " packet%s dropped; bad KCR\n");
- p32(esps_qfull, " packet%s dropped; queue full\n");
- p32(esps_noxform, " packet%s dropped; no transform\n");
- p32(esps_badilen, " packet%s dropped; bad ilen\n");
- p32(esps_wrap, " replay counter wrap%s\n");
- p32(esps_badenc, " packet%s dropped; bad encryption detected\n");
- p32(esps_badauth, " packet%s dropped; bad authentication detected\n");
- p32(esps_replay, " possible replay packet%s detected\n");
- p32(esps_input, " packet%s in\n");
- p32(esps_output, " packet%s out\n");
- p32(esps_invalid, " packet%s dropped; invalid TDB\n");
- p64(esps_ibytes, " byte%s in\n");
- p64(esps_obytes, " byte%s out\n");
- p32(esps_toobig, " packet%s dropped; larger than IP_MAXPACKET\n");
- p32(esps_pdrops, " packet%s blocked due to policy\n");
- p32(esps_crypto, " crypto processing failure%s\n");
- p32(esps_tunnel, " tunnel sanity check failure%s\n");
- hist(espstat->esps_hist, ipsec_espnames, "ESP output");
-
-#undef p32
-#undef p64
-#undef hist
-}
-
-void
-esp_stats(u_long off, const char *name, int family __unused, int proto __unused)
-{
- struct espstat espstat;
-
- if (off == 0)
- return;
- printf ("%s:\n", name);
- kread(off, (char *)&espstat, sizeof(espstat));
-
- print_espstats(&espstat);
-}
-
-static void
-print_ipcompstats(const struct ipcompstat *ipcompstat)
-{
-#define p32(f, m) if (ipcompstat->f || sflag <= 1) \
- printf("\t%u" m, (unsigned int)ipcompstat->f, plural(ipcompstat->f))
-#define p64(f, m) if (ipcompstat->f || sflag <= 1) \
- printf("\t%ju" m, (uintmax_t)ipcompstat->f, plural(ipcompstat->f))
-#define hist(f, n, t) \
- ipsec_hist_new((f), sizeof(f)/sizeof(f[0]), (n), (t));
-
- p32(ipcomps_hdrops, " packet%s shorter than header shows\n");
- p32(ipcomps_nopf, " packet%s dropped; protocol family not supported\n");
- p32(ipcomps_notdb, " packet%s dropped; no TDB\n");
- p32(ipcomps_badkcr, " packet%s dropped; bad KCR\n");
- p32(ipcomps_qfull, " packet%s dropped; queue full\n");
- p32(ipcomps_noxform, " packet%s dropped; no transform\n");
- p32(ipcomps_wrap, " replay counter wrap%s\n");
- p32(ipcomps_input, " packet%s in\n");
- p32(ipcomps_output, " packet%s out\n");
- p32(ipcomps_invalid, " packet%s dropped; invalid TDB\n");
- p64(ipcomps_ibytes, " byte%s in\n");
- p64(ipcomps_obytes, " byte%s out\n");
- p32(ipcomps_toobig, " packet%s dropped; larger than IP_MAXPACKET\n");
- p32(ipcomps_pdrops, " packet%s blocked due to policy\n");
- p32(ipcomps_crypto, " crypto processing failure%s\n");
- hist(ipcompstat->ipcomps_hist, ipsec_compnames, "COMP output");
-
-#undef p32
-#undef p64
-#undef hist
-}
-
-void
-ipcomp_stats(u_long off, const char *name, int family __unused,
- int proto __unused)
-{
- struct ipcompstat ipcompstat;
-
- if (off == 0)
- return;
- printf ("%s:\n", name);
- kread(off, (char *)&ipcompstat, sizeof(ipcompstat));
-
- print_ipcompstats(&ipcompstat);
-}
-
-#endif /*IPSEC*/
diff --git a/usr.bin/netstat/ipx.c b/usr.bin/netstat/ipx.c
deleted file mode 100644
index b79a93b..0000000
--- a/usr.bin/netstat/ipx.c
+++ /dev/null
@@ -1,350 +0,0 @@
-/*-
- * Copyright (c) 2004, Robert N. M. Watson
- * Copyright (c) 1983, 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)ns.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/protosw.h>
-
-#include <net/route.h>
-
-#define TCPSTATES
-#include <netinet/tcp_fsm.h>
-
-#include <netipx/ipx.h>
-#include <netipx/ipx_pcb.h>
-#include <netipx/ipx_var.h>
-#ifdef IPXERRORMSGS
-#include <netipx/ipx_error.h>
-#endif
-#include <netipx/spx.h>
-#include <netipx/spx_timer.h>
-#include <netipx/spx_var.h>
-#define SANAMES
-#include <netipx/spx_debug.h>
-
-#include <nlist.h>
-#include <errno.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-#include "netstat.h"
-
-static char *ipx_prpr(struct ipx_addr *);
-
-/*
- * Print a summary of connections related to a Network Systems
- * protocol. For SPX, also give state of connection.
- * Listening processes (aflag) are suppressed unless the
- * -a (all) flag is specified.
- */
-
-void
-ipxprotopr(u_long off, const char *name, int af1 __unused, int proto __unused)
-{
- struct ipxpcbhead cb;
- struct ipxpcb *ipxp;
- struct ipxpcb ipxpcb;
- struct spxpcb spxpcb;
- struct socket sockb;
- static int first = 1;
- int isspx;
-
- if (off == 0)
- return;
-
- isspx = strcmp(name, "spx") == 0;
- kread(off, (char *)&cb, sizeof (struct ipxpcbhead));
- ipxp = LIST_FIRST(&cb);
- while (ipxp != NULL) {
- u_long ppcb;
-
- kread((u_long)ipxp, (char *)&ipxpcb, sizeof (ipxpcb));
- ipxp = LIST_NEXT(&ipxpcb, ipxp_list);
-
- if (!aflag && ipx_nullhost(ipxpcb.ipxp_faddr) ) {
- continue;
- }
- kread((u_long)ipxpcb.ipxp_socket,
- (char *)&sockb, sizeof (sockb));
- ppcb = (u_long) ipxpcb.ipxp_pcb;
- if (ppcb) {
- if (isspx) {
- kread(ppcb, (char *)&spxpcb, sizeof (spxpcb));
- } else continue;
- } else
- if (isspx) continue;
- if (first) {
- printf("Active IPX connections");
- if (aflag)
- printf(" (including servers)");
- putchar('\n');
- if (Aflag)
- printf("%-8.8s ", "PCB");
- printf(Aflag ?
- "%-5.5s %-6.6s %-6.6s %-18.18s %-18.18s %s\n" :
- "%-5.5s %-6.6s %-6.6s %-22.22s %-22.22s %s\n",
- "Proto", "Recv-Q", "Send-Q",
- "Local Address", "Foreign Address", "(state)");
- first = 0;
- }
- if (Aflag)
- printf("%8lx ", ppcb);
- printf("%-5.5s %6u %6u ", name, sockb.so_rcv.sb_cc,
- sockb.so_snd.sb_cc);
- printf(Aflag?" %-18.18s":" %-22.22s", ipx_prpr(&ipxpcb.ipxp_laddr));
- printf(Aflag?" %-18.18s":" %-22.22s", ipx_prpr(&ipxpcb.ipxp_faddr));
- if (isspx) {
- if (spxpcb.s_state >= TCP_NSTATES)
- printf(" %d", spxpcb.s_state);
- else
- printf(" %s", tcpstates[spxpcb.s_state]);
- }
- putchar('\n');
- }
-}
-
-#define ANY(x,y,z) \
- if (x || sflag <= 1) printf("\t%u %s%s%s\n", x, y, plural(x), z)
-#define ANYl(x,y,z) \
- if (x || sflag <= 1) printf("\t%lu %s%s%s\n", x, y, plural(x), z)
-
-/*
- * Dump SPX statistics structure.
- */
-void
-spx_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
-{
- struct spx_istat spx_istat;
-#define spxstat spx_istat.newstats
-
- if (off == 0)
- return;
- kread(off, (char *)&spx_istat, sizeof (spx_istat));
- printf("%s:\n", name);
- ANY(spx_istat.nonucn, "connection", " dropped due to no new sockets ");
- ANY(spx_istat.gonawy, "connection", " terminated due to our end dying");
- ANY(spx_istat.nonucn, "connection",
- " dropped due to inability to connect");
- ANY(spx_istat.noconn, "connection",
- " dropped due to inability to connect");
- ANY(spx_istat.notme, "connection",
- " incompleted due to mismatched id's");
- ANY(spx_istat.wrncon, "connection", " dropped due to mismatched id's");
- ANY(spx_istat.bdreas, "packet", " dropped out of sequence");
- ANY(spx_istat.lstdup, "packet", " duplicating the highest packet");
- ANY(spx_istat.notyet, "packet", " refused as exceeding allocation");
- ANYl(spxstat.spxs_connattempt, "connection", " initiated");
- ANYl(spxstat.spxs_accepts, "connection", " accepted");
- ANYl(spxstat.spxs_connects, "connection", " established");
- ANYl(spxstat.spxs_drops, "connection", " dropped");
- ANYl(spxstat.spxs_conndrops, "embryonic connection", " dropped");
- ANYl(spxstat.spxs_closed, "connection", " closed (includes drops)");
- ANYl(spxstat.spxs_segstimed, "packet", " where we tried to get rtt");
- ANYl(spxstat.spxs_rttupdated, "time", " we got rtt");
- ANYl(spxstat.spxs_delack, "delayed ack", " sent");
- ANYl(spxstat.spxs_timeoutdrop, "connection",
- " dropped in rxmt timeout");
- ANYl(spxstat.spxs_rexmttimeo, "retransmit timeout", "");
- ANYl(spxstat.spxs_persisttimeo, "persist timeout", "");
- ANYl(spxstat.spxs_keeptimeo, "keepalive timeout", "");
- ANYl(spxstat.spxs_keepprobe, "keepalive probe", " sent");
- ANYl(spxstat.spxs_keepdrops, "connection", " dropped in keepalive");
- ANYl(spxstat.spxs_sndtotal, "total packet", " sent");
- ANYl(spxstat.spxs_sndpack, "data packet", " sent");
- ANYl(spxstat.spxs_sndbyte, "data byte", " sent");
- ANYl(spxstat.spxs_sndrexmitpack, "data packet", " retransmitted");
- ANYl(spxstat.spxs_sndrexmitbyte, "data byte", " retransmitted");
- ANYl(spxstat.spxs_sndacks, "ack-only packet", " sent");
- ANYl(spxstat.spxs_sndprobe, "window probe", " sent");
- ANYl(spxstat.spxs_sndurg, "packet", " sent with URG only");
- ANYl(spxstat.spxs_sndwinup, "window update-only packet", " sent");
- ANYl(spxstat.spxs_sndctrl, "control (SYN|FIN|RST) packet", " sent");
- ANYl(spxstat.spxs_sndvoid, "request", " to send a non-existant packet");
- ANYl(spxstat.spxs_rcvtotal, "total packet", " received");
- ANYl(spxstat.spxs_rcvpack, "packet", " received in sequence");
- ANYl(spxstat.spxs_rcvbyte, "byte", " received in sequence");
- ANYl(spxstat.spxs_rcvbadsum, "packet", " received with ccksum errs");
- ANYl(spxstat.spxs_rcvbadoff, "packet", " received with bad offset");
- ANYl(spxstat.spxs_rcvshort, "packet", " received too short");
- ANYl(spxstat.spxs_rcvduppack, "duplicate-only packet", " received");
- ANYl(spxstat.spxs_rcvdupbyte, "duplicate-only byte", " received");
- ANYl(spxstat.spxs_rcvpartduppack, "packet",
- " with some duplicate data");
- ANYl(spxstat.spxs_rcvpartdupbyte, "dup. byte", " in part-dup. packet");
- ANYl(spxstat.spxs_rcvoopack, "out-of-order packet", " received");
- ANYl(spxstat.spxs_rcvoobyte, "out-of-order byte", " received");
- ANYl(spxstat.spxs_rcvpackafterwin, "packet", " with data after window");
- ANYl(spxstat.spxs_rcvbyteafterwin, "byte", " rcvd after window");
- ANYl(spxstat.spxs_rcvafterclose, "packet", " rcvd after 'close'");
- ANYl(spxstat.spxs_rcvwinprobe, "rcvd window probe packet", "");
- ANYl(spxstat.spxs_rcvdupack, "rcvd duplicate ack", "");
- ANYl(spxstat.spxs_rcvacktoomuch, "rcvd ack", " for unsent data");
- ANYl(spxstat.spxs_rcvackpack, "rcvd ack packet", "");
- ANYl(spxstat.spxs_rcvackbyte, "byte", " acked by rcvd acks");
- ANYl(spxstat.spxs_rcvwinupd, "rcvd window update packet", "");
-}
-
-/*
- * Dump IPX statistics structure.
- */
-void
-ipx_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
-{
- struct ipxstat ipxstat;
-
- if (off == 0)
- return;
- kread(off, (char *)&ipxstat, sizeof (ipxstat));
- printf("%s:\n", name);
- ANYl(ipxstat.ipxs_total, "total packet", " received");
- ANYl(ipxstat.ipxs_badsum, "packet", " with bad checksums");
- ANYl(ipxstat.ipxs_tooshort, "packet", " smaller than advertised");
- ANYl(ipxstat.ipxs_toosmall, "packet", " smaller than a header");
- ANYl(ipxstat.ipxs_forward, "packet", " forwarded");
- ANYl(ipxstat.ipxs_cantforward, "packet", " not forwardable");
- ANYl(ipxstat.ipxs_delivered, "packet", " for this host");
- ANYl(ipxstat.ipxs_localout, "packet", " sent from this host");
- ANYl(ipxstat.ipxs_odropped, "packet", " dropped due to no bufs, etc.");
- ANYl(ipxstat.ipxs_noroute, "packet", " discarded due to no route");
- ANYl(ipxstat.ipxs_mtutoosmall, "packet", " too big");
-}
-
-#ifdef IPXERRORMSGS
-static struct {
- u_short code;
- char *name;
- char *where;
-} ipx_errnames[] = {
- {0, "Unspecified Error", " at Destination"},
- {1, "Bad Checksum", " at Destination"},
- {2, "No Listener", " at Socket"},
- {3, "Packet", " Refused due to lack of space at Destination"},
- {01000, "Unspecified Error", " while gatewayed"},
- {01001, "Bad Checksum", " while gatewayed"},
- {01002, "Packet", " forwarded too many times"},
- {01003, "Packet", " too large to be forwarded"},
- {-1, 0, 0},
-};
-
-/*
- * Dump IPX Error statistics structure.
- */
-/*ARGSUSED*/
-void
-ipxerr_stats(u_long off, const char *name, int af __unused, int proto __unused)
-{
- struct ipx_errstat ipx_errstat;
- int j;
- int histoprint = 1;
- int z;
-
- if (off == 0)
- return;
- kread(off, (char *)&ipx_errstat, sizeof (ipx_errstat));
- printf("IPX error statistics:\n");
- ANY(ipx_errstat.ipx_es_error, "call", " to ipx_error");
- ANY(ipx_errstat.ipx_es_oldshort, "error",
- " ignored due to insufficient addressing");
- ANY(ipx_errstat.ipx_es_oldipx_err, "error request",
- " in response to error packets");
- ANY(ipx_errstat.ipx_es_tooshort, "error packet",
- " received incomplete");
- ANY(ipx_errstat.ipx_es_badcode, "error packet",
- " received of unknown type");
- for(j = 0; j < IPX_ERR_MAX; j ++) {
- z = ipx_errstat.ipx_es_outhist[j];
- if (z && histoprint) {
- printf("Output Error Histogram:\n");
- histoprint = 0;
- }
- ipx_erputil(z, ipx_errstat.ipx_es_codes[j]);
- }
- histoprint = 1;
- for(j = 0; j < IPX_ERR_MAX; j ++) {
- z = ipx_errstat.ipx_es_inhist[j];
- if (z && histoprint) {
- printf("Input Error Histogram:\n");
- histoprint = 0;
- }
- ipx_erputil(z, ipx_errstat.ipx_es_codes[j]);
- }
-}
-
-static void
-ipx_erputil(int z, int c)
-{
- int j;
- char codebuf[30];
- char *name, *where;
-
- for(j = 0;; j ++) {
- if ((name = ipx_errnames[j].name) == 0)
- break;
- if (ipx_errnames[j].code == c)
- break;
- }
- if (name == 0) {
- if (c > 01000)
- where = "in transit";
- else
- where = "at destination";
- sprintf(codebuf, "Unknown IPX error code 0%o", c);
- name = codebuf;
- } else
- where = ipx_errnames[j].where;
- ANY(z, name, where);
-}
-#endif /* IPXERRORMSGS */
-
-static struct sockaddr_ipx ssipx = { .sipx_family = AF_IPX };
-
-static
-char *ipx_prpr(struct ipx_addr *x)
-{
- struct sockaddr_ipx *sipx = &ssipx;
-
- sipx->sipx_addr = *x;
- return(ipx_print((struct sockaddr *)sipx));
-}
diff --git a/usr.bin/netstat/main.c b/usr.bin/netstat/main.c
deleted file mode 100644
index 1f2f0e1..0000000
--- a/usr.bin/netstat/main.c
+++ /dev/null
@@ -1,788 +0,0 @@
-/*-
- * Copyright (c) 1983, 1988, 1993
- * Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-char const copyright[] =
-"@(#) Copyright (c) 1983, 1988, 1993\n\
- Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)main.c 8.4 (Berkeley) 3/1/94";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/file.h>
-#include <sys/protosw.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-
-#include <netinet/in.h>
-
-#ifdef NETGRAPH
-#include <netgraph/ng_socket.h>
-#endif
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <kvm.h>
-#include <limits.h>
-#include <netdb.h>
-#include <nlist.h>
-#include <paths.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "netstat.h"
-
-static struct nlist nl[] = {
-#define N_IFNET 0
- { .n_name = "_ifnet" },
-#define N_RTSTAT 1
- { .n_name = "_rtstat" },
-#define N_RTREE 2
- { .n_name = "_rt_tables"},
-#define N_MRTSTAT 3
- { .n_name = "_mrtstat" },
-#define N_MFCTABLE 4
- { .n_name = "_mfctable" },
-#define N_VIFTABLE 5
- { .n_name = "_viftable" },
-#define N_IPX 6
- { .n_name = "_ipxpcb_list"},
-#define N_IPXSTAT 7
- { .n_name = "_ipxstat"},
-#define N_SPXSTAT 8
- { .n_name = "_spx_istat"},
-#define N_DDPSTAT 9
- { .n_name = "_ddpstat"},
-#define N_DDPCB 10
- { .n_name = "_ddpcb"},
-#define N_NGSOCKS 11
- { .n_name = "_ngsocklist"},
-#define N_IP6STAT 12
- { .n_name = "_ip6stat" },
-#define N_ICMP6STAT 13
- { .n_name = "_icmp6stat" },
-#define N_IPSECSTAT 14
- { .n_name = "_ipsec4stat" },
-#define N_IPSEC6STAT 15
- { .n_name = "_ipsec6stat" },
-#define N_PIM6STAT 16
- { .n_name = "_pim6stat" },
-#define N_MRT6STAT 17
- { .n_name = "_mrt6stat" },
-#define N_MF6CTABLE 18
- { .n_name = "_mf6ctable" },
-#define N_MIF6TABLE 19
- { .n_name = "_mif6table" },
-#define N_PFKEYSTAT 20
- { .n_name = "_pfkeystat" },
-#define N_MBSTAT 21
- { .n_name = "_mbstat" },
-#define N_MBTYPES 22
- { .n_name = "_mbtypes" },
-#define N_NMBCLUSTERS 23
- { .n_name = "_nmbclusters" },
-#define N_NMBUFS 24
- { .n_name = "_nmbufs" },
-#define N_MBHI 25
- { .n_name = "_mbuf_hiwm" },
-#define N_CLHI 26
- { .n_name = "_clust_hiwm" },
-#define N_NCPUS 27
- { .n_name = "_smp_cpus" },
-#define N_PAGESZ 28
- { .n_name = "_pagesize" },
-#define N_MBPSTAT 29
- { .n_name = "_mb_statpcpu" },
-#define N_RTTRASH 30
- { .n_name = "_rttrash" },
-#define N_MBLO 31
- { .n_name = "_mbuf_lowm" },
-#define N_CLLO 32
- { .n_name = "_clust_lowm" },
-#define N_CARPSTAT 33
- { .n_name = "_carpstats" },
-#define N_PFSYNCSTAT 34
- { .n_name = "_pfsyncstats" },
-#define N_AHSTAT 35
- { .n_name = "_ahstat" },
-#define N_ESPSTAT 36
- { .n_name = "_espstat" },
-#define N_IPCOMPSTAT 37
- { .n_name = "_ipcompstat" },
-#define N_TCPSTAT 38
- { .n_name = "_tcpstat" },
-#define N_UDPSTAT 39
- { .n_name = "_udpstat" },
-#define N_IPSTAT 40
- { .n_name = "_ipstat" },
-#define N_ICMPSTAT 41
- { .n_name = "_icmpstat" },
-#define N_IGMPSTAT 42
- { .n_name = "_igmpstat" },
-#define N_PIMSTAT 43
- { .n_name = "_pimstat" },
-#define N_TCBINFO 44
- { .n_name = "_tcbinfo" },
-#define N_UDBINFO 45
- { .n_name = "_udbinfo" },
-#define N_DIVCBINFO 46
- { .n_name = "_divcbinfo" },
-#define N_RIPCBINFO 47
- { .n_name = "_ripcbinfo" },
-#define N_UNP_COUNT 48
- { .n_name = "_unp_count" },
-#define N_UNP_GENCNT 49
- { .n_name = "_unp_gencnt" },
-#define N_UNP_DHEAD 50
- { .n_name = "_unp_dhead" },
-#define N_UNP_SHEAD 51
- { .n_name = "_unp_shead" },
-#define N_RIP6STAT 52
- { .n_name = "_rip6stat" },
-#define N_SCTPSTAT 53
- { .n_name = "_sctpstat" },
- { .n_name = NULL },
-};
-
-struct protox {
- int pr_index; /* index into nlist of cb head */
- int pr_sindex; /* index into nlist of stat block */
- u_char pr_wanted; /* 1 if wanted, 0 otherwise */
- void (*pr_cblocks)(u_long, const char *, int, int);
- /* control blocks printing routine */
- void (*pr_stats)(u_long, const char *, int, int);
- /* statistics printing routine */
- void (*pr_istats)(char *); /* per/if statistics printing routine */
- const char *pr_name; /* well-known name */
- int pr_usesysctl; /* non-zero if we use sysctl, not kvm */
- int pr_protocol;
-} protox[] = {
- { N_TCBINFO, N_TCPSTAT, 1, protopr,
- tcp_stats, NULL, "tcp", 1, IPPROTO_TCP },
- { N_UDBINFO, N_UDPSTAT, 1, protopr,
- udp_stats, NULL, "udp", 1, IPPROTO_UDP },
-#ifdef SCTP
- { -1, N_SCTPSTAT, 1, sctp_protopr,
- sctp_stats, NULL, "sctp", 1, IPPROTO_SCTP },
-#endif
- { N_DIVCBINFO, -1, 1, protopr,
- NULL, NULL, "divert", 1, IPPROTO_DIVERT },
- { N_RIPCBINFO, N_IPSTAT, 1, protopr,
- ip_stats, NULL, "ip", 1, IPPROTO_RAW },
- { N_RIPCBINFO, N_ICMPSTAT, 1, protopr,
- icmp_stats, NULL, "icmp", 1, IPPROTO_ICMP },
- { N_RIPCBINFO, N_IGMPSTAT, 1, protopr,
- igmp_stats, NULL, "igmp", 1, IPPROTO_IGMP },
-#ifdef IPSEC
- { -1, N_IPSECSTAT, 1, NULL, /* keep as compat */
- ipsec_stats, NULL, "ipsec", 0, 0},
- { -1, N_AHSTAT, 1, NULL,
- ah_stats, NULL, "ah", 0, 0},
- { -1, N_ESPSTAT, 1, NULL,
- esp_stats, NULL, "esp", 0, 0},
- { -1, N_IPCOMPSTAT, 1, NULL,
- ipcomp_stats, NULL, "ipcomp", 0, 0},
-#endif
- { N_RIPCBINFO, N_PIMSTAT, 1, protopr,
- pim_stats, NULL, "pim", 1, IPPROTO_PIM },
- { -1, N_CARPSTAT, 1, NULL,
- carp_stats, NULL, "carp", 1, 0 },
- { -1, N_PFSYNCSTAT, 1, NULL,
- pfsync_stats, NULL, "pfsync", 1, 0 },
- { -1, -1, 0, NULL,
- NULL, NULL, NULL, 0, 0 }
-};
-
-#ifdef INET6
-struct protox ip6protox[] = {
- { N_TCBINFO, N_TCPSTAT, 1, protopr,
- tcp_stats, NULL, "tcp", 1, IPPROTO_TCP },
- { N_UDBINFO, N_UDPSTAT, 1, protopr,
- udp_stats, NULL, "udp", 1, IPPROTO_UDP },
- { N_RIPCBINFO, N_IP6STAT, 1, protopr,
- ip6_stats, ip6_ifstats, "ip6", 1, IPPROTO_RAW },
- { N_RIPCBINFO, N_ICMP6STAT, 1, protopr,
- icmp6_stats, icmp6_ifstats, "icmp6", 1, IPPROTO_ICMPV6 },
-#ifdef IPSEC
- { -1, N_IPSEC6STAT, 1, NULL,
- ipsec_stats, NULL, "ipsec6", 0, 0 },
-#endif
-#ifdef notyet
- { -1, N_PIM6STAT, 1, NULL,
- pim6_stats, NULL, "pim6", 1, 0 },
-#endif
- { -1, N_RIP6STAT, 1, NULL,
- rip6_stats, NULL, "rip6", 1, 0 },
- { -1, -1, 0, NULL,
- NULL, NULL, NULL, 0, 0 }
-};
-#endif /*INET6*/
-
-#ifdef IPSEC
-struct protox pfkeyprotox[] = {
- { -1, N_PFKEYSTAT, 1, NULL,
- pfkey_stats, NULL, "pfkey", 0, 0 },
- { -1, -1, 0, NULL,
- NULL, NULL, NULL, 0, 0 }
-};
-#endif
-
-struct protox atalkprotox[] = {
- { N_DDPCB, N_DDPSTAT, 1, atalkprotopr,
- ddp_stats, NULL, "ddp", 0, 0 },
- { -1, -1, 0, NULL,
- NULL, NULL, NULL, 0, 0 }
-};
-#ifdef NETGRAPH
-struct protox netgraphprotox[] = {
- { N_NGSOCKS, -1, 1, netgraphprotopr,
- NULL, NULL, "ctrl", 0, 0 },
- { N_NGSOCKS, -1, 1, netgraphprotopr,
- NULL, NULL, "data", 0, 0 },
- { -1, -1, 0, NULL,
- NULL, NULL, NULL, 0, 0 }
-};
-#endif
-#ifdef IPX
-struct protox ipxprotox[] = {
- { N_IPX, N_IPXSTAT, 1, ipxprotopr,
- ipx_stats, NULL, "ipx", 0, 0 },
- { N_IPX, N_SPXSTAT, 1, ipxprotopr,
- spx_stats, NULL, "spx", 0, 0 },
- { -1, -1, 0, NULL,
- NULL, NULL, 0, 0, 0 }
-};
-#endif
-
-struct protox *protoprotox[] = {
- protox,
-#ifdef INET6
- ip6protox,
-#endif
-#ifdef IPSEC
- pfkeyprotox,
-#endif
-#ifdef IPX
- ipxprotox,
-#endif
- atalkprotox, NULL };
-
-static void printproto(struct protox *, const char *);
-static void usage(void);
-static struct protox *name2protox(const char *);
-static struct protox *knownname(const char *);
-
-static kvm_t *kvmd;
-static char *nlistf = NULL, *memf = NULL;
-
-int Aflag; /* show addresses of protocol control block */
-int aflag; /* show all sockets (including servers) */
-int Bflag; /* show information about bpf consumers */
-int bflag; /* show i/f total bytes in/out */
-int dflag; /* show i/f dropped packets */
-int gflag; /* show group (multicast) routing or stats */
-int hflag; /* show counters in human readable format */
-int iflag; /* show interfaces */
-int Lflag; /* show size of listen queues */
-int mflag; /* show memory stats */
-int numeric_addr; /* show addresses numerically */
-int numeric_port; /* show ports numerically */
-static int pflag; /* show given protocol */
-int rflag; /* show routing tables (or routing stats) */
-int sflag; /* show protocol statistics */
-int tflag; /* show i/f watchdog timers */
-int Wflag; /* wide display */
-int xflag; /* extra information, includes all socket buffer info */
-int zflag; /* zero stats */
-
-int interval; /* repeat interval for i/f stats */
-
-char *interface; /* desired i/f for stats, or NULL for all i/fs */
-int unit; /* unit number for above */
-
-int af; /* address family */
-int live; /* true if we are examining a live system */
-
-int
-main(int argc, char *argv[])
-{
- struct protox *tp = NULL; /* for printing cblocks & stats */
- int ch;
-
- af = AF_UNSPEC;
-
- while ((ch = getopt(argc, argv, "AaBbdf:ghI:iLlM:mN:np:rSstuWw:xz")) != -1)
- switch(ch) {
- case 'A':
- Aflag = 1;
- break;
- case 'a':
- aflag = 1;
- break;
- case 'B':
- Bflag = 1;
- break;
- case 'b':
- bflag = 1;
- break;
- case 'd':
- dflag = 1;
- break;
- case 'f':
- if (strcmp(optarg, "ipx") == 0)
- af = AF_IPX;
- else if (strcmp(optarg, "inet") == 0)
- af = AF_INET;
-#ifdef INET6
- else if (strcmp(optarg, "inet6") == 0)
- af = AF_INET6;
-#endif
-#ifdef IPSEC
- else if (strcmp(optarg, "pfkey") == 0)
- af = PF_KEY;
-#endif
- else if (strcmp(optarg, "unix") == 0)
- af = AF_UNIX;
- else if (strcmp(optarg, "atalk") == 0)
- af = AF_APPLETALK;
-#ifdef NETGRAPH
- else if (strcmp(optarg, "ng") == 0
- || strcmp(optarg, "netgraph") == 0)
- af = AF_NETGRAPH;
-#endif
- else if (strcmp(optarg, "link") == 0)
- af = AF_LINK;
- else {
- errx(1, "%s: unknown address family", optarg);
- }
- break;
- case 'g':
- gflag = 1;
- break;
- case 'h':
- hflag = 1;
- break;
- case 'I': {
- char *cp;
-
- iflag = 1;
- for (cp = interface = optarg; isalpha(*cp); cp++)
- continue;
- unit = atoi(cp);
- break;
- }
- case 'i':
- iflag = 1;
- break;
- case 'L':
- Lflag = 1;
- break;
- case 'M':
- memf = optarg;
- break;
- case 'm':
- mflag = 1;
- break;
- case 'N':
- nlistf = optarg;
- break;
- case 'n':
- numeric_addr = numeric_port = 1;
- break;
- case 'p':
- if ((tp = name2protox(optarg)) == NULL) {
- errx(1,
- "%s: unknown or uninstrumented protocol",
- optarg);
- }
- pflag = 1;
- break;
- case 'r':
- rflag = 1;
- break;
- case 's':
- ++sflag;
- break;
- case 'S':
- numeric_addr = 1;
- break;
- case 't':
- tflag = 1;
- break;
- case 'u':
- af = AF_UNIX;
- break;
- case 'W':
- case 'l':
- Wflag = 1;
- break;
- case 'w':
- interval = atoi(optarg);
- iflag = 1;
- break;
- case 'x':
- xflag = 1;
- break;
- case 'z':
- zflag = 1;
- break;
- case '?':
- default:
- usage();
- }
- argv += optind;
- argc -= optind;
-
-#define BACKWARD_COMPATIBILITY
-#ifdef BACKWARD_COMPATIBILITY
- if (*argv) {
- if (isdigit(**argv)) {
- interval = atoi(*argv);
- if (interval <= 0)
- usage();
- ++argv;
- iflag = 1;
- }
- if (*argv) {
- nlistf = *argv;
- if (*++argv)
- memf = *argv;
- }
- }
-#endif
-
- /*
- * Discard setgid privileges if not the running kernel so that bad
- * guys can't print interesting stuff from kernel memory.
- */
- live = (nlistf == NULL && memf == NULL);
- if (!live)
- setgid(getgid());
-
- if (Bflag) {
- if (!live)
- usage();
- bpf_stats(interface);
- exit(0);
- }
- if (mflag) {
- if (memf != NULL) {
- if (kread(0, NULL, 0) == 0)
- mbpr(kvmd, nl[N_MBSTAT].n_value);
- } else
- mbpr(NULL, 0);
- exit(0);
- }
-#if 0
- /*
- * Keep file descriptors open to avoid overhead
- * of open/close on each call to get* routines.
- */
- sethostent(1);
- setnetent(1);
-#else
- /*
- * This does not make sense any more with DNS being default over
- * the files. Doing a setXXXXent(1) causes a tcp connection to be
- * used for the queries, which is slower.
- */
-#endif
- kread(0, NULL, 0);
- if (iflag && !sflag) {
- intpr(interval, nl[N_IFNET].n_value, NULL);
- exit(0);
- }
- if (rflag) {
- if (sflag)
- rt_stats(nl[N_RTSTAT].n_value, nl[N_RTTRASH].n_value);
- else
- routepr(nl[N_RTREE].n_value);
- exit(0);
- }
- if (gflag) {
- if (sflag) {
- if (af == AF_INET || af == AF_UNSPEC)
- mrt_stats(nl[N_MRTSTAT].n_value);
-#ifdef INET6
- if (af == AF_INET6 || af == AF_UNSPEC)
- mrt6_stats(nl[N_MRT6STAT].n_value);
-#endif
- } else {
- if (af == AF_INET || af == AF_UNSPEC)
- mroutepr(nl[N_MFCTABLE].n_value,
- nl[N_VIFTABLE].n_value);
-#ifdef INET6
- if (af == AF_INET6 || af == AF_UNSPEC)
- mroute6pr(nl[N_MF6CTABLE].n_value,
- nl[N_MIF6TABLE].n_value);
-#endif
- }
- ifmalist_dump();
- exit(0);
- }
-
- if (tp) {
- printproto(tp, tp->pr_name);
- exit(0);
- }
- if (af == AF_INET || af == AF_UNSPEC)
- for (tp = protox; tp->pr_name; tp++)
- printproto(tp, tp->pr_name);
-#ifdef INET6
- if (af == AF_INET6 || af == AF_UNSPEC)
- for (tp = ip6protox; tp->pr_name; tp++)
- printproto(tp, tp->pr_name);
-#endif /*INET6*/
-#ifdef IPSEC
- if (af == PF_KEY || af == AF_UNSPEC)
- for (tp = pfkeyprotox; tp->pr_name; tp++)
- printproto(tp, tp->pr_name);
-#endif /*IPSEC*/
-#ifdef IPX
- if (af == AF_IPX || af == AF_UNSPEC) {
- for (tp = ipxprotox; tp->pr_name; tp++)
- printproto(tp, tp->pr_name);
- }
-#endif /* IPX */
- if (af == AF_APPLETALK || af == AF_UNSPEC)
- for (tp = atalkprotox; tp->pr_name; tp++)
- printproto(tp, tp->pr_name);
-#ifdef NETGRAPH
- if (af == AF_NETGRAPH || af == AF_UNSPEC)
- for (tp = netgraphprotox; tp->pr_name; tp++)
- printproto(tp, tp->pr_name);
-#endif /* NETGRAPH */
- if ((af == AF_UNIX || af == AF_UNSPEC) && !Lflag && !sflag)
- unixpr(nl[N_UNP_COUNT].n_value, nl[N_UNP_GENCNT].n_value,
- nl[N_UNP_DHEAD].n_value, nl[N_UNP_SHEAD].n_value);
- exit(0);
-}
-
-/*
- * Print out protocol statistics or control blocks (per sflag).
- * If the interface was not specifically requested, and the symbol
- * is not in the namelist, ignore this one.
- */
-static void
-printproto(tp, name)
- struct protox *tp;
- const char *name;
-{
- void (*pr)(u_long, const char *, int, int);
- u_long off;
-
- if (sflag) {
- if (iflag) {
- if (tp->pr_istats)
- intpr(interval, nl[N_IFNET].n_value,
- tp->pr_istats);
- else if (pflag)
- printf("%s: no per-interface stats routine\n",
- tp->pr_name);
- return;
- } else {
- pr = tp->pr_stats;
- if (!pr) {
- if (pflag)
- printf("%s: no stats routine\n",
- tp->pr_name);
- return;
- }
- if (tp->pr_usesysctl && live)
- off = 0;
- else if (tp->pr_sindex < 0) {
- if (pflag)
- printf(
- "%s: stats routine doesn't work on cores\n",
- tp->pr_name);
- return;
- } else
- off = nl[tp->pr_sindex].n_value;
- }
- } else {
- pr = tp->pr_cblocks;
- if (!pr) {
- if (pflag)
- printf("%s: no PCB routine\n", tp->pr_name);
- return;
- }
- if (tp->pr_usesysctl && live)
- off = 0;
- else if (tp->pr_index < 0) {
- if (pflag)
- printf(
- "%s: PCB routine doesn't work on cores\n",
- tp->pr_name);
- return;
- } else
- off = nl[tp->pr_index].n_value;
- }
- if (pr != NULL && (off || (live && tp->pr_usesysctl) ||
- af != AF_UNSPEC))
- (*pr)(off, name, af, tp->pr_protocol);
-}
-
-/*
- * Read kernel memory, return 0 on success.
- */
-int
-kread(u_long addr, void *buf, size_t size)
-{
- char errbuf[_POSIX2_LINE_MAX];
-
- if (kvmd == NULL) {
- kvmd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf);
- setgid(getgid());
- if (kvmd != NULL) {
- if (kvm_nlist(kvmd, nl) < 0) {
- if (nlistf)
- errx(1, "%s: kvm_nlist: %s", nlistf,
- kvm_geterr(kvmd));
- else
- errx(1, "kvm_nlist: %s", kvm_geterr(kvmd));
- }
-
- if (nl[0].n_type == 0) {
- if (nlistf)
- errx(1, "%s: no namelist", nlistf);
- else
- errx(1, "no namelist");
- }
- } else {
- warnx("kvm not available: %s", errbuf);
- return(-1);
- }
- }
- if (!buf)
- return (0);
- if (kvm_read(kvmd, addr, buf, size) != (ssize_t)size) {
- warnx("%s", kvm_geterr(kvmd));
- return (-1);
- }
- return (0);
-}
-
-const char *
-plural(uintmax_t n)
-{
- return (n != 1 ? "s" : "");
-}
-
-const char *
-plurales(uintmax_t n)
-{
- return (n != 1 ? "es" : "");
-}
-
-const char *
-pluralies(uintmax_t n)
-{
- return (n != 1 ? "ies" : "y");
-}
-
-/*
- * Find the protox for the given "well-known" name.
- */
-static struct protox *
-knownname(const char *name)
-{
- struct protox **tpp, *tp;
-
- for (tpp = protoprotox; *tpp; tpp++)
- for (tp = *tpp; tp->pr_name; tp++)
- if (strcmp(tp->pr_name, name) == 0)
- return (tp);
- return (NULL);
-}
-
-/*
- * Find the protox corresponding to name.
- */
-static struct protox *
-name2protox(const char *name)
-{
- struct protox *tp;
- char **alias; /* alias from p->aliases */
- struct protoent *p;
-
- /*
- * Try to find the name in the list of "well-known" names. If that
- * fails, check if name is an alias for an Internet protocol.
- */
- if ((tp = knownname(name)) != NULL)
- return (tp);
-
- setprotoent(1); /* make protocol lookup cheaper */
- while ((p = getprotoent()) != NULL) {
- /* assert: name not same as p->name */
- for (alias = p->p_aliases; *alias; alias++)
- if (strcmp(name, *alias) == 0) {
- endprotoent();
- return (knownname(p->p_name));
- }
- }
- endprotoent();
- return (NULL);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
-"usage: netstat [-AaLnSW] [-f protocol_family | -p protocol]\n"
-" [-M core] [-N system]",
-" netstat -i | -I interface [-abdhnt] [-f address_family]\n"
-" [-M core] [-N system]",
-" netstat -w wait [-I interface] [-d] [-M core] [-N system]",
-" netstat -s [-s] [-z] [-f protocol_family | -p protocol] [-M core]",
-" netstat -i | -I interface -s [-f protocol_family | -p protocol]\n"
-" [-M core] [-N system]",
-" netstat -m [-M core] [-N system]",
-" netstat -B [ -I interface]",
-" netstat -r [-AenW] [-f address_family] [-M core] [-N system]",
-" netstat -rs [-s] [-M core] [-N system]",
-" netstat -g [-W] [-f address_family] [-M core] [-N system]",
-" netstat -gs [-s] [-f address_family] [-M core] [-N system]");
- exit(1);
-}
diff --git a/usr.bin/netstat/mbuf.c b/usr.bin/netstat/mbuf.c
deleted file mode 100644
index 7f65701..0000000
--- a/usr.bin/netstat/mbuf.c
+++ /dev/null
@@ -1,313 +0,0 @@
-/*-
- * Copyright (c) 1983, 1988, 1993
- * The Regents of the University of California.
- * Copyright (c) 2005 Robert N. M. Watson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)mbuf.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/mbuf.h>
-#include <sys/protosw.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/sysctl.h>
-
-#include <err.h>
-#include <kvm.h>
-#include <memstat.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "netstat.h"
-
-/*
- * Print mbuf statistics.
- */
-void
-mbpr(void *kvmd, u_long mbaddr)
-{
- struct memory_type_list *mtlp;
- struct memory_type *mtp;
- uintmax_t mbuf_count, mbuf_bytes, mbuf_free, mbuf_failures, mbuf_size;
- uintmax_t cluster_count, cluster_bytes, cluster_limit, cluster_free;
- uintmax_t cluster_failures, cluster_size;
- uintmax_t packet_count, packet_bytes, packet_free, packet_failures;
- uintmax_t tag_count, tag_bytes;
- uintmax_t jumbop_count, jumbop_bytes, jumbop_limit, jumbop_free;
- uintmax_t jumbop_failures, jumbop_size;
- uintmax_t jumbo9_count, jumbo9_bytes, jumbo9_limit, jumbo9_free;
- uintmax_t jumbo9_failures, jumbo9_size;
- uintmax_t jumbo16_count, jumbo16_bytes, jumbo16_limit, jumbo16_free;
- uintmax_t jumbo16_failures, jumbo16_size;
- uintmax_t bytes_inuse, bytes_incache, bytes_total;
- int nsfbufs, nsfbufspeak, nsfbufsused;
- struct mbstat mbstat;
- size_t mlen;
- int error;
-
- mtlp = memstat_mtl_alloc();
- if (mtlp == NULL) {
- warn("memstat_mtl_alloc");
- return;
- }
-
- /*
- * Use memstat_*_all() because some mbuf-related memory is in uma(9),
- * and some malloc(9).
- */
- if (live) {
- if (memstat_sysctl_all(mtlp, 0) < 0) {
- warnx("memstat_sysctl_all: %s",
- memstat_strerror(memstat_mtl_geterror(mtlp)));
- goto out;
- }
- } else {
- if (memstat_kvm_all(mtlp, kvmd) < 0) {
- error = memstat_mtl_geterror(mtlp);
- if (error == MEMSTAT_ERROR_KVM)
- warnx("memstat_kvm_all: %s",
- kvm_geterr(kvmd));
- else
- warnx("memstat_kvm_all: %s",
- memstat_strerror(error));
- goto out;
- }
- }
-
- mtp = memstat_mtl_find(mtlp, ALLOCATOR_UMA, MBUF_MEM_NAME);
- if (mtp == NULL) {
- warnx("memstat_mtl_find: zone %s not found", MBUF_MEM_NAME);
- goto out;
- }
- mbuf_count = memstat_get_count(mtp);
- mbuf_bytes = memstat_get_bytes(mtp);
- mbuf_free = memstat_get_free(mtp);
- mbuf_failures = memstat_get_failures(mtp);
- mbuf_size = memstat_get_size(mtp);
-
- mtp = memstat_mtl_find(mtlp, ALLOCATOR_UMA, MBUF_PACKET_MEM_NAME);
- if (mtp == NULL) {
- warnx("memstat_mtl_find: zone %s not found",
- MBUF_PACKET_MEM_NAME);
- goto out;
- }
- packet_count = memstat_get_count(mtp);
- packet_bytes = memstat_get_bytes(mtp);
- packet_free = memstat_get_free(mtp);
- packet_failures = memstat_get_failures(mtp);
-
- mtp = memstat_mtl_find(mtlp, ALLOCATOR_UMA, MBUF_CLUSTER_MEM_NAME);
- if (mtp == NULL) {
- warnx("memstat_mtl_find: zone %s not found",
- MBUF_CLUSTER_MEM_NAME);
- goto out;
- }
- cluster_count = memstat_get_count(mtp);
- cluster_bytes = memstat_get_bytes(mtp);
- cluster_limit = memstat_get_countlimit(mtp);
- cluster_free = memstat_get_free(mtp);
- cluster_failures = memstat_get_failures(mtp);
- cluster_size = memstat_get_size(mtp);
-
- mtp = memstat_mtl_find(mtlp, ALLOCATOR_MALLOC, MBUF_TAG_MEM_NAME);
- if (mtp == NULL) {
- warnx("memstat_mtl_find: malloc type %s not found",
- MBUF_TAG_MEM_NAME);
- goto out;
- }
- tag_count = memstat_get_count(mtp);
- tag_bytes = memstat_get_bytes(mtp);
-
- mtp = memstat_mtl_find(mtlp, ALLOCATOR_UMA, MBUF_JUMBOP_MEM_NAME);
- if (mtp == NULL) {
- warnx("memstat_mtl_find: zone %s not found",
- MBUF_JUMBOP_MEM_NAME);
- goto out;
- }
- jumbop_count = memstat_get_count(mtp);
- jumbop_bytes = memstat_get_bytes(mtp);
- jumbop_limit = memstat_get_countlimit(mtp);
- jumbop_free = memstat_get_free(mtp);
- jumbop_failures = memstat_get_failures(mtp);
- jumbop_size = memstat_get_size(mtp);
-
- mtp = memstat_mtl_find(mtlp, ALLOCATOR_UMA, MBUF_JUMBO9_MEM_NAME);
- if (mtp == NULL) {
- warnx("memstat_mtl_find: zone %s not found",
- MBUF_JUMBO9_MEM_NAME);
- goto out;
- }
- jumbo9_count = memstat_get_count(mtp);
- jumbo9_bytes = memstat_get_bytes(mtp);
- jumbo9_limit = memstat_get_countlimit(mtp);
- jumbo9_free = memstat_get_free(mtp);
- jumbo9_failures = memstat_get_failures(mtp);
- jumbo9_size = memstat_get_size(mtp);
-
- mtp = memstat_mtl_find(mtlp, ALLOCATOR_UMA, MBUF_JUMBO16_MEM_NAME);
- if (mtp == NULL) {
- warnx("memstat_mtl_find: zone %s not found",
- MBUF_JUMBO16_MEM_NAME);
- goto out;
- }
- jumbo16_count = memstat_get_count(mtp);
- jumbo16_bytes = memstat_get_bytes(mtp);
- jumbo16_limit = memstat_get_countlimit(mtp);
- jumbo16_free = memstat_get_free(mtp);
- jumbo16_failures = memstat_get_failures(mtp);
- jumbo16_size = memstat_get_size(mtp);
-
- printf("%ju/%ju/%ju mbufs in use (current/cache/total)\n",
- mbuf_count + packet_count, mbuf_free + packet_free,
- mbuf_count + packet_count + mbuf_free + packet_free);
-
- printf("%ju/%ju/%ju/%ju mbuf clusters in use "
- "(current/cache/total/max)\n",
- cluster_count - packet_free, cluster_free + packet_free,
- cluster_count + cluster_free, cluster_limit);
-
- printf("%ju/%ju mbuf+clusters out of packet secondary zone in use "
- "(current/cache)\n",
- packet_count, packet_free);
-
- printf("%ju/%ju/%ju/%ju %juk (page size) jumbo clusters in use "
- "(current/cache/total/max)\n",
- jumbop_count, jumbop_free, jumbop_count + jumbop_free,
- jumbop_limit, jumbop_size / 1024);
-
- printf("%ju/%ju/%ju/%ju 9k jumbo clusters in use "
- "(current/cache/total/max)\n",
- jumbo9_count, jumbo9_free, jumbo9_count + jumbo9_free,
- jumbo9_limit);
-
- printf("%ju/%ju/%ju/%ju 16k jumbo clusters in use "
- "(current/cache/total/max)\n",
- jumbo16_count, jumbo16_free, jumbo16_count + jumbo16_free,
- jumbo16_limit);
-
-#if 0
- printf("%ju mbuf tags in use\n", tag_count);
-#endif
-
- /*-
- * Calculate in-use bytes as:
- * - straight mbuf memory
- * - mbuf memory in packets
- * - the clusters attached to packets
- * - and the rest of the non-packet-attached clusters.
- * - m_tag memory
- * This avoids counting the clusters attached to packets in the cache.
- * This currently excludes sf_buf space.
- */
- bytes_inuse =
- mbuf_bytes + /* straight mbuf memory */
- packet_bytes + /* mbufs in packets */
- (packet_count * cluster_size) + /* clusters in packets */
- /* other clusters */
- ((cluster_count - packet_count - packet_free) * cluster_size) +
- tag_bytes +
- (jumbop_count * jumbop_size) + /* jumbo clusters */
- (jumbo9_count * jumbo9_size) +
- (jumbo16_count * jumbo16_size);
-
- /*
- * Calculate in-cache bytes as:
- * - cached straught mbufs
- * - cached packet mbufs
- * - cached packet clusters
- * - cached straight clusters
- * This currently excludes sf_buf space.
- */
- bytes_incache =
- (mbuf_free * mbuf_size) + /* straight free mbufs */
- (packet_free * mbuf_size) + /* mbufs in free packets */
- (packet_free * cluster_size) + /* clusters in free packets */
- (cluster_free * cluster_size) + /* free clusters */
- (jumbop_free * jumbop_size) + /* jumbo clusters */
- (jumbo9_free * jumbo9_size) +
- (jumbo16_free * jumbo16_size);
-
- /*
- * Total is bytes in use + bytes in cache. This doesn't take into
- * account various other misc data structures, overhead, etc, but
- * gives the user something useful despite that.
- */
- bytes_total = bytes_inuse + bytes_incache;
-
- printf("%juK/%juK/%juK bytes allocated to network "
- "(current/cache/total)\n", bytes_inuse / 1024,
- bytes_incache / 1024, bytes_total / 1024);
-
- printf("%ju/%ju/%ju requests for mbufs denied (mbufs/clusters/"
- "mbuf+clusters)\n", mbuf_failures, cluster_failures,
- packet_failures);
-
- printf("%ju/%ju/%ju requests for jumbo clusters denied "
- "(%juk/9k/16k)\n", jumbop_failures, jumbo9_failures,
- jumbo16_failures, jumbop_size / 1024);
-
- if (live) {
- mlen = sizeof(nsfbufs);
- if (!sysctlbyname("kern.ipc.nsfbufs", &nsfbufs, &mlen, NULL,
- 0) &&
- !sysctlbyname("kern.ipc.nsfbufsused", &nsfbufsused,
- &mlen, NULL, 0) &&
- !sysctlbyname("kern.ipc.nsfbufspeak", &nsfbufspeak,
- &mlen, NULL, 0))
- printf("%d/%d/%d sfbufs in use (current/peak/max)\n",
- nsfbufsused, nsfbufspeak, nsfbufs);
- mlen = sizeof(mbstat);
- if (sysctlbyname("kern.ipc.mbstat", &mbstat, &mlen, NULL, 0)) {
- warn("kern.ipc.mbstat");
- goto out;
- }
- } else {
- if (kread(mbaddr, (char *)&mbstat, sizeof mbstat) != 0)
- goto out;
- }
- printf("%lu requests for sfbufs denied\n", mbstat.sf_allocfail);
- printf("%lu requests for sfbufs delayed\n", mbstat.sf_allocwait);
- printf("%lu requests for I/O initiated by sendfile\n",
- mbstat.sf_iocnt);
- printf("%lu calls to protocol drain routines\n", mbstat.m_drain);
-out:
- memstat_mtl_free(mtlp);
-}
diff --git a/usr.bin/netstat/mcast.c b/usr.bin/netstat/mcast.c
deleted file mode 100644
index 218d630..0000000
--- a/usr.bin/netstat/mcast.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/*-
- * Copyright (c) 2007 Bruce M. Simpson <bms@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Print the running system's current multicast group memberships.
- * As this relies on getifmaddrs(), it may not be used with a core file.
- */
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-
-#include <net/if.h>
-#include <net/if_var.h>
-#include <net/if_mib.h>
-#include <net/if_types.h>
-#include <net/if_dl.h>
-#include <net/route.h>
-#include <netinet/in.h>
-#include <netinet/if_ether.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <ifaddrs.h>
-#include <sysexits.h>
-
-#include <stddef.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "netstat.h"
-
-#define __NETSTAT_BURN_BRIDGES
-
-#ifdef __NETSTAT_BURN_BRIDGES
-
-union sockunion {
- struct sockaddr_storage ss;
- struct sockaddr sa;
- struct sockaddr_dl sdl;
- struct sockaddr_in sin;
- struct sockaddr_in6 sin6;
-};
-typedef union sockunion sockunion_t;
-
-void ifmalist_dump_af(const struct ifmaddrs * const ifmap, int const af);
-
-void
-ifmalist_dump_af(const struct ifmaddrs * const ifmap, int const af)
-{
- const struct ifmaddrs *ifma;
- sockunion_t *psa;
- char myifname[IFNAMSIZ];
-#ifdef INET6
- char addrbuf[INET6_ADDRSTRLEN];
-#endif
- char *pcolon;
- char *pafname, *pifname, *plladdr, *pgroup;
-#ifdef INET6
- void *in6addr;
-#endif
-
- switch (af) {
- case AF_INET:
- pafname = "IPv4";
- break;
-#ifdef INET6
- case AF_INET6:
- pafname = "IPv6";
- break;
-#endif
- case AF_LINK:
- pafname = "Link-layer";
- break;
- default:
- return; /* XXX */
- }
-
- fprintf(stdout, "%s Multicast Group Memberships\n", pafname);
- fprintf(stdout, "%-20s\t%-16s\t%s\n", "Group", "Link-layer Address",
- "Netif");
-
- for (ifma = ifmap; ifma; ifma = ifma->ifma_next) {
-
- if (ifma->ifma_name == NULL || ifma->ifma_addr == NULL)
- continue;
-
- /* Group address */
- psa = (sockunion_t *)ifma->ifma_addr;
- if (psa->sa.sa_family != af)
- continue;
-
- switch (psa->sa.sa_family) {
- case AF_INET:
- pgroup = inet_ntoa(psa->sin.sin_addr);
- break;
-#ifdef INET6
- case AF_INET6:
- in6addr = &psa->sin6.sin6_addr;
- inet_ntop(psa->sa.sa_family, in6addr, addrbuf,
- sizeof(addrbuf));
- pgroup = addrbuf;
- break;
-#endif
- case AF_LINK:
- if ((psa->sdl.sdl_alen == ETHER_ADDR_LEN) ||
- (psa->sdl.sdl_type == IFT_ETHER)) {
- pgroup =
-ether_ntoa((struct ether_addr *)&psa->sdl.sdl_data);
-#ifdef notyet
- } else {
- pgroup = addr2ascii(AF_LINK,
- &psa->sdl,
- sizeof(struct sockaddr_dl),
- addrbuf);
-#endif
- }
- break;
- default:
- continue; /* XXX */
- }
-
- /* Link-layer mapping, if any */
- psa = (sockunion_t *)ifma->ifma_lladdr;
- if (psa != NULL) {
- if (psa->sa.sa_family == AF_LINK) {
- if ((psa->sdl.sdl_alen == ETHER_ADDR_LEN) ||
- (psa->sdl.sdl_type == IFT_ETHER)) {
- /* IEEE 802 */
- plladdr =
-ether_ntoa((struct ether_addr *)&psa->sdl.sdl_data);
-#ifdef notyet
- } else {
- /* something more exotic */
- plladdr = addr2ascii(AF_LINK,
- &psa->sdl,
- sizeof(struct sockaddr_dl),
- addrbuf);
-#endif
- }
- } else {
- /* not a link-layer address */
- plladdr = "<invalid>";
- }
- } else {
- plladdr = "<none>";
- }
-
- /* Interface upon which the membership exists */
- psa = (sockunion_t *)ifma->ifma_name;
- if (psa != NULL && psa->sa.sa_family == AF_LINK) {
- strlcpy(myifname, link_ntoa(&psa->sdl), IFNAMSIZ);
- pcolon = strchr(myifname, ':');
- if (pcolon)
- *pcolon = '\0';
- pifname = myifname;
- } else {
- pifname = "";
- }
-
- fprintf(stdout, "%-20s\t%-16s\t%s\n", pgroup, plladdr, pifname);
- }
-}
-
-void
-ifmalist_dump(void)
-{
- struct ifmaddrs *ifmap;
-
- fprintf(stderr,
- "WARNING: This functionality is deprecated, and will be removed\n"
- "in FreeBSD 7.0. Please consider using ifmcstat(8) instead.\n");
-
- if (getifmaddrs(&ifmap))
- err(EX_OSERR, "getifmaddrs");
-
- ifmalist_dump_af(ifmap, AF_LINK);
- fputs("\n", stdout);
- ifmalist_dump_af(ifmap, AF_INET);
-#ifdef INET6
- fputs("\n", stdout);
- ifmalist_dump_af(ifmap, AF_INET6);
-#endif
-
- freeifmaddrs(ifmap);
-}
-#endif /* __NETSTAT_BURN_BRIDGES */
diff --git a/usr.bin/netstat/mroute.c b/usr.bin/netstat/mroute.c
deleted file mode 100644
index dbce318..0000000
--- a/usr.bin/netstat/mroute.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/*-
- * Copyright (c) 1989 Stephen Deering
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Stephen Deering of Stanford University.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)mroute.c 8.2 (Berkeley) 4/28/95
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Print multicast routing structures and statistics.
- *
- * MROUTING 1.0
- */
-
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/sysctl.h>
-#include <sys/protosw.h>
-#include <sys/mbuf.h>
-#include <sys/time.h>
-
-#include <net/if.h>
-#include <netinet/in.h>
-#include <netinet/igmp.h>
-#include <net/route.h>
-#include <netinet/ip_mroute.h>
-
-#include <err.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "netstat.h"
-
-static void print_bw_meter(struct bw_meter *bw_meter, int *banner_printed);
-
-void
-mroutepr(u_long mfcaddr, u_long vifaddr)
-{
- struct mfc *mfctable[MFCTBLSIZ];
- struct vif viftable[MAXVIFS];
- struct mfc mfc, *m;
- struct vif *v;
- vifi_t vifi;
- int i;
- int banner_printed;
- int saved_numeric_addr;
- vifi_t maxvif = 0;
- size_t len;
-
- len = sizeof(mfctable);
- if (live) {
- if (sysctlbyname("net.inet.ip.mfctable", mfctable, &len, NULL,
- 0) < 0) {
- warn("sysctl: net.inet.ip.mfctable");
- return;
- }
- } else
- kread(mfcaddr, (char *)mfctable, sizeof(mfctable));
-
- len = sizeof(viftable);
- if (live) {
- if (sysctlbyname("net.inet.ip.viftable", viftable, &len, NULL,
- 0) < 0) {
- warn("sysctl: net.inet.ip.viftable");
- return;
- }
- } else
- kread(vifaddr, (char *)viftable, sizeof(viftable));
-
- saved_numeric_addr = numeric_addr;
- numeric_addr = 1;
-
- banner_printed = 0;
- for (vifi = 0, v = viftable; vifi < MAXVIFS; ++vifi, ++v) {
- if (v->v_lcl_addr.s_addr == 0)
- continue;
-
- maxvif = vifi;
- if (!banner_printed) {
- printf("\nIPv4 Virtual Interface Table\n"
- " Vif Thresh Rate Local-Address "
- "Remote-Address Pkts-In Pkts-Out\n");
- banner_printed = 1;
- }
-
- printf(" %2u %6u %4d %-15.15s",
- /* opposite math of add_vif() */
- vifi, v->v_threshold, v->v_rate_limit * 1000 / 1024,
- routename(v->v_lcl_addr.s_addr));
- printf(" %-15.15s", (v->v_flags & VIFF_TUNNEL) ?
- routename(v->v_rmt_addr.s_addr) : "");
-
- printf(" %9lu %9lu\n", v->v_pkt_in, v->v_pkt_out);
- }
- if (!banner_printed)
- printf("\nIPv4 Virtual Interface Table is empty\n");
-
- banner_printed = 0;
- for (i = 0; i < MFCTBLSIZ; ++i) {
- m = mfctable[i];
- while(m) {
- /* XXX KVM */
- kread((u_long)m, (char *)&mfc, sizeof mfc);
-
- if (!banner_printed) {
- printf("\nIPv4 Multicast Forwarding Table\n"
- " Origin Group "
- " Packets In-Vif Out-Vifs:Ttls\n");
- banner_printed = 1;
- }
-
- printf(" %-15.15s", routename(mfc.mfc_origin.s_addr));
- printf(" %-15.15s", routename(mfc.mfc_mcastgrp.s_addr));
- printf(" %9lu", mfc.mfc_pkt_cnt);
- printf(" %3d ", mfc.mfc_parent);
- for (vifi = 0; vifi <= maxvif; vifi++) {
- if (mfc.mfc_ttls[vifi] > 0)
- printf(" %u:%u", vifi,
- mfc.mfc_ttls[vifi]);
- }
- printf("\n");
-
- /* Print the bw meter information */
- {
- struct bw_meter bw_meter, *bwm;
- int banner_printed2 = 0;
-
- bwm = mfc.mfc_bw_meter;
- while (bwm) {
- /* XXX KVM */
- kread((u_long)bwm, (char *)&bw_meter,
- sizeof bw_meter);
- print_bw_meter(&bw_meter,
- &banner_printed2);
- bwm = bw_meter.bm_mfc_next;
- }
-#if 0 /* Don't ever print it? */
- if (! banner_printed2)
- printf("\n No Bandwidth Meters\n");
-#endif
- }
-
- m = mfc.mfc_next;
- }
- }
- if (!banner_printed)
- printf("\nIPv4 Multicast Forwarding Table is empty\n");
-
- printf("\n");
- numeric_addr = saved_numeric_addr;
-}
-
-static void
-print_bw_meter(struct bw_meter *bw_meter, int *banner_printed)
-{
- char s0[256], s1[256], s2[256], s3[256];
- struct timeval now, end, delta;
-
- gettimeofday(&now, NULL);
-
- if (! *banner_printed) {
- printf(" Bandwidth Meters\n");
- printf(" %-30s", "Measured(Start|Packets|Bytes)");
- printf(" %s", "Type");
- printf(" %-30s", "Thresh(Interval|Packets|Bytes)");
- printf(" Remain");
- printf("\n");
- *banner_printed = 1;
- }
-
- /* The measured values */
- if (bw_meter->bm_flags & BW_METER_UNIT_PACKETS)
- sprintf(s1, "%ju", (uintmax_t)bw_meter->bm_measured.b_packets);
- else
- sprintf(s1, "?");
- if (bw_meter->bm_flags & BW_METER_UNIT_BYTES)
- sprintf(s2, "%ju", (uintmax_t)bw_meter->bm_measured.b_bytes);
- else
- sprintf(s2, "?");
- sprintf(s0, "%lu.%lu|%s|%s",
- (u_long)bw_meter->bm_start_time.tv_sec,
- (u_long)bw_meter->bm_start_time.tv_usec,
- s1, s2);
- printf(" %-30s", s0);
-
- /* The type of entry */
- sprintf(s0, "%s", "?");
- if (bw_meter->bm_flags & BW_METER_GEQ)
- sprintf(s0, "%s", ">=");
- else if (bw_meter->bm_flags & BW_METER_LEQ)
- sprintf(s0, "%s", "<=");
- printf(" %-3s", s0);
-
- /* The threshold values */
- if (bw_meter->bm_flags & BW_METER_UNIT_PACKETS)
- sprintf(s1, "%ju", (uintmax_t)bw_meter->bm_threshold.b_packets);
- else
- sprintf(s1, "?");
- if (bw_meter->bm_flags & BW_METER_UNIT_BYTES)
- sprintf(s2, "%ju", (uintmax_t)bw_meter->bm_threshold.b_bytes);
- else
- sprintf(s2, "?");
- sprintf(s0, "%lu.%lu|%s|%s",
- (u_long)bw_meter->bm_threshold.b_time.tv_sec,
- (u_long)bw_meter->bm_threshold.b_time.tv_usec,
- s1, s2);
- printf(" %-30s", s0);
-
- /* Remaining time */
- timeradd(&bw_meter->bm_start_time,
- &bw_meter->bm_threshold.b_time, &end);
- if (timercmp(&now, &end, <=)) {
- timersub(&end, &now, &delta);
- sprintf(s3, "%lu.%lu",
- (u_long)delta.tv_sec,
- (u_long)delta.tv_usec);
- } else {
- /* Negative time */
- timersub(&now, &end, &delta);
- sprintf(s3, "-%lu.%lu",
- (u_long)delta.tv_sec,
- (u_long)delta.tv_usec);
- }
- printf(" %s", s3);
-
- printf("\n");
-}
-
-void
-mrt_stats(u_long mstaddr)
-{
- struct mrtstat mrtstat;
- size_t len = sizeof mrtstat;
-
- if (live) {
- if (sysctlbyname("net.inet.ip.mrtstat", &mrtstat, &len, NULL,
- 0) < 0) {
- warn("sysctl: net.inet.ip.mrtstat");
- return;
- }
- } else
- kread(mstaddr, (char *)&mrtstat, sizeof(mrtstat));
-
- printf("IPv4 multicast forwarding:\n");
-
-#define p(f, m) if (mrtstat.f || sflag <= 1) \
- printf(m, mrtstat.f, plural(mrtstat.f))
-#define p2(f, m) if (mrtstat.f || sflag <= 1) \
- printf(m, mrtstat.f, plurales(mrtstat.f))
-
- p(mrts_mfc_lookups, "\t%lu multicast forwarding cache lookup%s\n");
- p2(mrts_mfc_misses, "\t%lu multicast forwarding cache miss%s\n");
- p(mrts_upcalls, "\t%lu upcall%s to multicast routing daemon\n");
- p(mrts_upq_ovflw, "\t%lu upcall queue overflow%s\n");
- p(mrts_upq_sockfull,
- "\t%lu upcall%s dropped due to full socket buffer\n");
- p(mrts_cache_cleanups, "\t%lu cache cleanup%s\n");
- p(mrts_no_route, "\t%lu datagram%s with no route for origin\n");
- p(mrts_bad_tunnel, "\t%lu datagram%s arrived with bad tunneling\n");
- p(mrts_cant_tunnel, "\t%lu datagram%s could not be tunneled\n");
- p(mrts_wrong_if, "\t%lu datagram%s arrived on wrong interface\n");
- p(mrts_drop_sel, "\t%lu datagram%s selectively dropped\n");
- p(mrts_q_overflow, "\t%lu datagram%s dropped due to queue overflow\n");
- p(mrts_pkt2large, "\t%lu datagram%s dropped for being too large\n");
-
-#undef p2
-#undef p
-}
diff --git a/usr.bin/netstat/mroute6.c b/usr.bin/netstat/mroute6.c
deleted file mode 100644
index c526d7c..0000000
--- a/usr.bin/netstat/mroute6.c
+++ /dev/null
@@ -1,260 +0,0 @@
-/*-
- * Copyright (C) 1998 WIDE Project.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*-
- * Copyright (c) 1989 Stephen Deering
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Stephen Deering of Stanford University.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)mroute.c 8.2 (Berkeley) 4/28/95
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifdef INET6
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/sysctl.h>
-#include <sys/protosw.h>
-#include <sys/mbuf.h>
-#include <sys/time.h>
-
-#include <net/if.h>
-#include <net/if_var.h>
-#include <net/route.h>
-
-#include <netinet/in.h>
-
-#include <err.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#define KERNEL 1
-#include <netinet6/ip6_mroute.h>
-#undef KERNEL
-
-#include "netstat.h"
-
-#define WID_ORG (Wflag ? 39 : (numeric_addr ? 29 : 18)) /* width of origin column */
-#define WID_GRP (Wflag ? 18 : (numeric_addr ? 16 : 18)) /* width of group column */
-
-void
-mroute6pr(u_long mfcaddr, u_long mifaddr)
-{
- struct mf6c *mf6ctable[MF6CTBLSIZ], *mfcp;
- struct mif6 mif6table[MAXMIFS];
- struct mf6c mfc;
- struct rtdetq rte, *rtep;
- struct mif6 *mifp;
- mifi_t mifi;
- int i;
- int banner_printed;
- int saved_numeric_addr;
- mifi_t maxmif = 0;
- long int waitings;
- size_t len;
-
- len = sizeof(mif6table);
- if (live) {
- if (sysctlbyname("net.inet6.ip6.mif6table", mif6table, &len,
- NULL, 0) < 0) {
- warn("sysctl: net.inet6.ip6.mif6table");
- return;
- }
- } else
- kread(mifaddr, (char *)mif6table, sizeof(mif6table));
-
- saved_numeric_addr = numeric_addr;
- numeric_addr = 1;
- banner_printed = 0;
-
- for (mifi = 0, mifp = mif6table; mifi < MAXMIFS; ++mifi, ++mifp) {
- struct ifnet ifnet;
- char ifname[IFNAMSIZ];
-
- if (mifp->m6_ifp == NULL)
- continue;
-
- /* XXX KVM */
- kread((u_long)mifp->m6_ifp, (char *)&ifnet, sizeof(ifnet));
-
- maxmif = mifi;
- if (!banner_printed) {
- printf("\nIPv6 Multicast Interface Table\n"
- " Mif Rate PhyIF "
- "Pkts-In Pkts-Out\n");
- banner_printed = 1;
- }
-
- printf(" %2u %4d",
- mifi, mifp->m6_rate_limit);
- printf(" %5s", (mifp->m6_flags & MIFF_REGISTER) ?
- "reg0" : if_indextoname(ifnet.if_index, ifname));
-
- printf(" %9ju %9ju\n", (uintmax_t)mifp->m6_pkt_in,
- (uintmax_t)mifp->m6_pkt_out);
- }
- if (!banner_printed)
- printf("\nIPv6 Multicast Interface Table is empty\n");
-
- len = sizeof(mf6ctable);
- if (live) {
- if (sysctlbyname("net.inet6.ip6.mf6ctable", mf6ctable, &len,
- NULL, 0) < 0) {
- warn("sysctl: net.inet6.ip6.mf6ctable");
- return;
- }
- } else
- kread(mfcaddr, (char *)mf6ctable, sizeof(mf6ctable));
-
- banner_printed = 0;
-
- for (i = 0; i < MF6CTBLSIZ; ++i) {
- mfcp = mf6ctable[i];
- while(mfcp) {
- kread((u_long)mfcp, (char *)&mfc, sizeof(mfc));
- if (!banner_printed) {
- printf ("\nIPv6 Multicast Forwarding Cache\n");
- printf(" %-*.*s %-*.*s %s",
- WID_ORG, WID_ORG, "Origin",
- WID_GRP, WID_GRP, "Group",
- " Packets Waits In-Mif Out-Mifs\n");
- banner_printed = 1;
- }
-
- printf(" %-*.*s", WID_ORG, WID_ORG,
- routename6(&mfc.mf6c_origin));
- printf(" %-*.*s", WID_GRP, WID_GRP,
- routename6(&mfc.mf6c_mcastgrp));
- printf(" %9ju", (uintmax_t)mfc.mf6c_pkt_cnt);
-
- for (waitings = 0, rtep = mfc.mf6c_stall; rtep; ) {
- waitings++;
- /* XXX KVM */
- kread((u_long)rtep, (char *)&rte, sizeof(rte));
- rtep = rte.next;
- }
- printf(" %3ld", waitings);
-
- if (mfc.mf6c_parent == MF6C_INCOMPLETE_PARENT)
- printf(" --- ");
- else
- printf(" %3d ", mfc.mf6c_parent);
- for (mifi = 0; mifi <= maxmif; mifi++) {
- if (IF_ISSET(mifi, &mfc.mf6c_ifset))
- printf(" %u", mifi);
- }
- printf("\n");
-
- mfcp = mfc.mf6c_next;
- }
- }
- if (!banner_printed)
- printf("\nIPv6 Multicast Forwarding Table is empty\n");
-
- printf("\n");
- numeric_addr = saved_numeric_addr;
-}
-
-void
-mrt6_stats(u_long mstaddr)
-{
- struct mrt6stat mrtstat;
- size_t len = sizeof mrtstat;
-
- if (live) {
- if (sysctlbyname("net.inet6.ip6.mrt6stat", &mrtstat, &len,
- NULL, 0) < 0) {
- warn("sysctl: net.inet6.ip6.mrt6stat");
- return;
- }
- } else
- kread(mstaddr, (char *)&mrtstat, sizeof(mrtstat));
-
- printf("IPv6 multicast forwarding:\n");
-
-#define p(f, m) if (mrtstat.f || sflag <= 1) \
- printf(m, (uintmax_t)mrtstat.f, plural(mrtstat.f))
-#define p2(f, m) if (mrtstat.f || sflag <= 1) \
- printf(m, (uintmax_t)mrtstat.f, plurales(mrtstat.f))
-
- p(mrt6s_mfc_lookups, "\t%ju multicast forwarding cache lookup%s\n");
- p2(mrt6s_mfc_misses, "\t%ju multicast forwarding cache miss%s\n");
- p(mrt6s_upcalls, "\t%ju upcall%s to multicast routing daemon\n");
- p(mrt6s_upq_ovflw, "\t%ju upcall queue overflow%s\n");
- p(mrt6s_upq_sockfull,
- "\t%ju upcall%s dropped due to full socket buffer\n");
- p(mrt6s_cache_cleanups, "\t%ju cache cleanup%s\n");
- p(mrt6s_no_route, "\t%ju datagram%s with no route for origin\n");
- p(mrt6s_bad_tunnel, "\t%ju datagram%s arrived with bad tunneling\n");
- p(mrt6s_cant_tunnel, "\t%ju datagram%s could not be tunneled\n");
- p(mrt6s_wrong_if, "\t%ju datagram%s arrived on wrong interface\n");
- p(mrt6s_drop_sel, "\t%ju datagram%s selectively dropped\n");
- p(mrt6s_q_overflow,
- "\t%ju datagram%s dropped due to queue overflow\n");
- p(mrt6s_pkt2large, "\t%ju datagram%s dropped for being too large\n");
-
-#undef p2
-#undef p
-}
-#endif /*INET6*/
diff --git a/usr.bin/netstat/netgraph.c b/usr.bin/netstat/netgraph.c
deleted file mode 100644
index c4dd647..0000000
--- a/usr.bin/netstat/netgraph.c
+++ /dev/null
@@ -1,191 +0,0 @@
-/*-
- * Copyright (c) 1996-1999 Whistle Communications, Inc.
- * All rights reserved.
- *
- * Subject to the following obligations and disclaimer of warranty, use and
- * redistribution of this software, in source or object code forms, with or
- * without modifications are expressly permitted by Whistle Communications;
- * provided, however, that:
- * 1. Any and all reproductions of the source or object code must include the
- * copyright notice above and the following disclaimer of warranties; and
- * 2. No rights are granted, in any manner or form, to use Whistle
- * Communications, Inc. trademarks, including the mark "WHISTLE
- * COMMUNICATIONS" on advertising, endorsements, or otherwise except as
- * such appears in the above copyright notice or in the software.
- *
- * THIS SOFTWARE IS BEING PROVIDED BY WHISTLE COMMUNICATIONS "AS IS", AND
- * TO THE MAXIMUM EXTENT PERMITTED BY LAW, WHISTLE COMMUNICATIONS MAKES NO
- * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THIS SOFTWARE,
- * INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
- * WHISTLE COMMUNICATIONS DOES NOT WARRANT, GUARANTEE, OR MAKE ANY
- * REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS OF THE USE OF THIS
- * SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY OR OTHERWISE.
- * IN NO EVENT SHALL WHISTLE COMMUNICATIONS BE LIABLE FOR ANY DAMAGES
- * RESULTING FROM OR ARISING OUT OF ANY USE OF THIS SOFTWARE, INCLUDING
- * WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- * PUNITIVE, OR CONSEQUENTIAL DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/protosw.h>
-#include <sys/linker.h>
-
-#include <net/route.h>
-
-#include <netgraph.h>
-#include <netgraph/ng_message.h>
-#include <netgraph/ng_socket.h>
-#include <netgraph/ng_socketvar.h>
-
-#include <nlist.h>
-#include <errno.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <err.h>
-#include "netstat.h"
-
-static int first = 1;
-static int csock = -1;
-
-void
-netgraphprotopr(u_long off, const char *name, int af1 __unused,
- int proto __unused)
-{
- struct ngpcb *this, *next;
- struct ngpcb ngpcb;
- struct ngsock info;
- struct socket sockb;
- int debug = 1;
-
- /* If symbol not found, try looking in the KLD module */
- if (off == 0) {
- const char *const modname = "ng_socket.ko";
-/* XXX We should get "mpath" from "sysctl kern.module_path" */
- const char *mpath[] = { "/", "/boot/", "/modules/", NULL };
- struct nlist sym[] = { { .n_name = "_ngsocklist" },
- { .n_name = NULL } };
- const char **pre;
- struct kld_file_stat ks;
- int fileid;
-
- /* Can't do this for core dumps. */
- if (!live)
- return;
-
- /* See if module is loaded */
- if ((fileid = kldfind(modname)) < 0) {
- if (debug)
- warn("kldfind(%s)", modname);
- return;
- }
-
- /* Get module info */
- memset(&ks, 0, sizeof(ks));
- ks.version = sizeof(struct kld_file_stat);
- if (kldstat(fileid, &ks) < 0) {
- if (debug)
- warn("kldstat(%d)", fileid);
- return;
- }
-
- /* Get symbol table from module file */
- for (pre = mpath; *pre; pre++) {
- char path[MAXPATHLEN];
-
- snprintf(path, sizeof(path), "%s%s", *pre, modname);
- if (nlist(path, sym) == 0)
- break;
- }
-
- /* Did we find it? */
- if (sym[0].n_value == 0) {
- if (debug)
- warnx("%s not found", modname);
- return;
- }
-
- /* Symbol found at load address plus symbol offset */
- off = (u_long) ks.address + sym[0].n_value;
- }
-
- /* Get pointer to first socket */
- kread(off, (char *)&this, sizeof(this));
-
- /* Get my own socket node */
- if (csock == -1)
- NgMkSockNode(NULL, &csock, NULL);
-
- for (; this != NULL; this = next) {
- u_char rbuf[sizeof(struct ng_mesg) + sizeof(struct nodeinfo)];
- struct ng_mesg *resp = (struct ng_mesg *) rbuf;
- struct nodeinfo *ni = (struct nodeinfo *) resp->data;
- char path[64];
-
- /* Read in ngpcb structure */
- kread((u_long)this, (char *)&ngpcb, sizeof(ngpcb));
- next = LIST_NEXT(&ngpcb, socks);
-
- /* Read in socket structure */
- kread((u_long)ngpcb.ng_socket, (char *)&sockb, sizeof(sockb));
-
- /* Check type of socket */
- if (strcmp(name, "ctrl") == 0 && ngpcb.type != NG_CONTROL)
- continue;
- if (strcmp(name, "data") == 0 && ngpcb.type != NG_DATA)
- continue;
-
- /* Do headline */
- if (first) {
- printf("Netgraph sockets\n");
- if (Aflag)
- printf("%-8.8s ", "PCB");
- printf("%-5.5s %-6.6s %-6.6s %-14.14s %s\n",
- "Type", "Recv-Q", "Send-Q",
- "Node Address", "#Hooks");
- first = 0;
- }
-
- /* Show socket */
- if (Aflag)
- printf("%8lx ", (u_long) this);
- printf("%-5.5s %6u %6u ",
- name, sockb.so_rcv.sb_cc, sockb.so_snd.sb_cc);
-
- /* Get ngsock structure */
- if (ngpcb.sockdata == 0) /* unconnected data socket */
- goto finish;
- kread((u_long)ngpcb.sockdata, (char *)&info, sizeof(info));
-
- /* Get info on associated node */
- if (info.node == 0 || csock == -1)
- goto finish;
- snprintf(path, sizeof(path), "[%lx]:", (u_long) info.node);
- if (NgSendMsg(csock, path,
- NGM_GENERIC_COOKIE, NGM_NODEINFO, NULL, 0) < 0)
- goto finish;
- if (NgRecvMsg(csock, resp, sizeof(rbuf), NULL) < 0)
- goto finish;
-
- /* Display associated node info */
- if (*ni->name != '\0')
- snprintf(path, sizeof(path), "%s:", ni->name);
- printf("%-14.14s %4d", path, ni->hooks);
-finish:
- putchar('\n');
- }
-}
-
diff --git a/usr.bin/netstat/netstat.1 b/usr.bin/netstat/netstat.1
deleted file mode 100644
index de87477..0000000
--- a/usr.bin/netstat/netstat.1
+++ /dev/null
@@ -1,506 +0,0 @@
-.\" Copyright (c) 1983, 1990, 1992, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)netstat.1 8.8 (Berkeley) 4/18/94
-.\" $FreeBSD$
-.\"
-.Dd June 10, 2007
-.Dt NETSTAT 1
-.Os
-.Sh NAME
-.Nm netstat
-.Nd show network status
-.Sh DESCRIPTION
-The
-.Nm
-command symbolically displays the contents of various network-related
-data structures.
-There are a number of output formats,
-depending on the options for the information presented.
-.Bl -tag -width indent
-.It Xo
-.Bk -words
-.Nm
-.Op Fl AaLnSWx
-.Op Fl f Ar protocol_family | Fl p Ar protocol
-.Op Fl M Ar core
-.Op Fl N Ar system
-.Ek
-.Xc
-Display a list of active sockets
-(protocol control blocks)
-for each network protocol,
-for a particular
-.Ar protocol_family ,
-or for a single
-.Ar protocol .
-If
-.Fl A
-is also present,
-show the address of a protocol control block (PCB)
-associated with a socket; used for debugging.
-If
-.Fl a
-is also present,
-show the state of all sockets;
-normally sockets used by server processes are not shown.
-If
-.Fl L
-is also present,
-show the size of the various listen queues.
-The first count shows the number of unaccepted connections,
-the second count shows the amount of unaccepted incomplete connections,
-and the third count is the maximum number of queued connections.
-If
-.Fl S
-is also present,
-show network addresses as numbers (as with
-.Fl n )
-but show ports symbolically.
-If
-.Fl x
-is present display full socket buffer statistics for each internet socket.
-.It Xo
-.Bk -words
-.Nm
-.Fl i | I Ar interface
-.Op Fl abdhntW
-.Op Fl f Ar address_family
-.Op Fl M Ar core
-.Op Fl N Ar system
-.Ek
-.Xc
-Show the state of all network interfaces or a single
-.Ar interface
-which have been auto-configured
-(interfaces statically configured into a system, but not
-located at boot time are not shown).
-An asterisk
-.Pq Dq Li *
-after an interface name indicates that the interface is
-.Dq down .
-If
-.Fl a
-is also present, multicast addresses currently in use are shown
-for each Ethernet interface and for each IP interface address.
-Multicast addresses are shown on separate lines following the interface
-address with which they are associated.
-If
-.Fl b
-is also present, show the number of bytes in and out.
-If
-.Fl d
-is also present, show the number of dropped packets.
-If
-.Fl h
-is also present, print all counters in human readable form.
-If
-.Fl t
-is also present, show the contents of watchdog timers.
-If
-.Fl W
-is also present, print interface names using a wider field size.
-.It Xo
-.Bk -words
-.Nm
-.Fl w Ar wait
-.Op Fl I Ar interface
-.Op Fl d
-.Op Fl M Ar core
-.Op Fl N Ar system
-.Ek
-.Xc
-At intervals of
-.Ar wait
-seconds,
-display the information regarding packet
-traffic on all configured network interfaces
-or a single
-.Ar interface .
-If
-.Fl d
-is also present, show the number of dropped packets.
-.It Xo
-.Bk -words
-.Nm
-.Fl s Op Fl s
-.Op Fl z
-.Op Fl f Ar protocol_family | Fl p Ar protocol
-.Op Fl M Ar core
-.Op Fl N Ar system
-.Ek
-.Xc
-Display system-wide statistics for each network protocol,
-for a particular
-.Ar protocol_family ,
-or for a single
-.Ar protocol .
-If
-.Fl s
-is repeated, counters with a value of zero are suppressed.
-If
-.Fl z
-is also present, reset statistic counters after displaying them.
-.It Xo
-.Bk -words
-.Nm
-.Fl i | I Ar interface Fl s
-.Op Fl f Ar protocol_family | Fl p Ar protocol
-.Op Fl M Ar core
-.Op Fl N Ar system
-.Ek
-.Xc
-Display per-interface statistics for each network protocol,
-for a particular
-.Ar protocol_family ,
-or for a single
-.Ar protocol .
-.It Xo
-.Bk -words
-.Nm
-.Fl m
-.Op Fl M Ar core
-.Op Fl N Ar system
-.Ek
-.Xc
-Show statistics recorded by the memory management routines
-.Pq Xr mbuf 9 .
-The network manages a private pool of memory buffers.
-.It Xo
-.Bk -words
-.Nm
-.Fl B
-.Op Fl I Ar interface
-.Ek
-.Xc
-Show statistics about
-.Xr bpf 4
-peers.
-This includes information like
-how many packets have been matched, dropped and received by the
-bpf device, also information about current buffer sizes and device
-states.
-.It Xo
-.Bk -words
-.Nm
-.Fl r
-.Op Fl AanW
-.Op Fl f Ar address_family
-.Op Fl M Ar core
-.Op Fl N Ar system
-.Ek
-.Xc
-Display the contents of all routing tables,
-or a routing table for a particular
-.Ar address_family .
-If
-.Fl A
-is also present,
-show the contents of the internal Patricia tree
-structures; used for debugging.
-If
-.Fl a
-is also present,
-show protocol-cloned routes
-(routes generated by an
-.Dv RTF_PRCLONING
-parent route);
-normally these routes are not shown.
-When
-.Fl W
-is also present,
-show the path MTU
-for each route,
-and print interface
-names with a wider
-field size.
-.It Xo
-.Bk -words
-.Nm
-.Fl rs
-.Op Fl s
-.Op Fl M Ar core
-.Op Fl N Ar system
-.Ek
-.Xc
-Display routing statistics.
-If
-.Fl s
-is repeated, counters with a value of zero are suppressed.
-.It Xo
-.Bk -words
-.Nm
-.Fl g
-.Op Fl W
-.Op Fl f Ar address_family
-.Op Fl M Ar core
-.Op Fl N Ar system
-.Ek
-.Xc
-Show information related to multicast (group address) routing.
-By default, show the IP Multicast virtual-interface and routing tables,
-and multicast group memberships.
-.It Xo
-.Bk -words
-.Nm
-.Fl gs
-.Op Fl s
-.Op Fl f Ar address_family
-.Op Fl M Ar core
-.Op Fl N Ar system
-.Ek
-.Xc
-Show multicast routing statistics.
-If
-.Fl s
-is repeated, counters with a value of zero are suppressed.
-.El
-.Pp
-Some options have the general meaning:
-.Bl -tag -width flag
-.It Fl f Ar address_family , Fl p Ar protocol
-Limit display to those records
-of the specified
-.Ar address_family
-or a single
-.Ar protocol .
-The following address families and protocols are recognized:
-.Pp
-.Bl -tag -width ".Cm netgraph , ng Pq Dv AF_NETGRAPH" -compact
-.It Em Family
-.Em Protocols
-.It Cm inet Pq Dv AF_INET
-.Cm divert , icmp , igmp , ip , ipsec , pim, sctp , tcp , udp
-.It Cm inet6 Pq Dv AF_INET6
-.Cm icmp6 , ip6 , ipsec6 , rip6 , tcp , udp
-.It Cm pfkey Pq Dv PF_KEY
-.Cm pfkey
-.It Cm atalk Pq Dv AF_APPLETALK
-.Cm ddp
-.It Cm netgraph , ng Pq Dv AF_NETGRAPH
-.Cm ctrl , data
-.It Cm ipx Pq Dv AF_IPX
-.Cm ipx , spx
-.\".It Cm ns Pq Dv AF_NS
-.\".Cm idp , ns_err , spp
-.\".It Cm iso Pq Dv AF_ISO
-.\".Cm clnp , cltp , esis , tp
-.It Cm unix Pq Dv AF_UNIX
-.It Cm link Pq Dv AF_LINK
-.El
-.Pp
-The program will complain if
-.Ar protocol
-is unknown or if there is no statistics routine for it.
-.It Fl M
-Extract values associated with the name list from the specified core
-instead of the default
-.Pa /dev/kmem .
-.It Fl N
-Extract the name list from the specified system instead of the default,
-which is the kernel image the system has booted from.
-.It Fl n
-Show network addresses and ports as numbers.
-Normally
-.Nm
-attempts to resolve addresses and ports,
-and display them symbolically.
-.It Fl W
-In certain displays, avoid truncating addresses even if this causes
-some fields to overflow.
-.El
-.Pp
-The default display, for active sockets, shows the local
-and remote addresses, send and receive queue sizes (in bytes), protocol,
-and the internal state of the protocol.
-Address formats are of the form
-.Dq host.port
-or
-.Dq network.port
-if a socket's address specifies a network but no specific host address.
-When known, the host and network addresses are displayed symbolically
-according to the databases
-.Xr hosts 5
-and
-.Xr networks 5 ,
-respectively.
-If a symbolic name for an address is unknown, or if
-the
-.Fl n
-option is specified, the address is printed numerically, according
-to the address family.
-For more information regarding
-the Internet IPv4
-.Dq dot format ,
-refer to
-.Xr inet 3 .
-Unspecified,
-or
-.Dq wildcard ,
-addresses and ports appear as
-.Dq Li * .
-.Pp
-The interface display provides a table of cumulative
-statistics regarding packets transferred, errors, and collisions.
-The network addresses of the interface
-and the maximum transmission unit
-.Pq Dq mtu
-are also displayed.
-.Pp
-The routing table display indicates the available routes and their status.
-Each route consists of a destination host or network, and a gateway to use
-in forwarding packets.
-The flags field shows a collection of information about the route stored
-as binary choices.
-The individual flags are discussed in more detail in the
-.Xr route 8
-and
-.Xr route 4
-manual pages.
-The mapping between letters and flags is:
-.Bl -column ".Li W" ".Dv RTF_WASCLONED"
-.It Li 1 Ta Dv RTF_PROTO1 Ta "Protocol specific routing flag #1"
-.It Li 2 Ta Dv RTF_PROTO2 Ta "Protocol specific routing flag #2"
-.It Li 3 Ta Dv RTF_PROTO3 Ta "Protocol specific routing flag #3"
-.It Li B Ta Dv RTF_BLACKHOLE Ta "Just discard pkts (during updates)"
-.It Li b Ta Dv RTF_BROADCAST Ta "The route represents a broadcast address"
-.It Li C Ta Dv RTF_CLONING Ta "Generate new routes on use"
-.It Li c Ta Dv RTF_PRCLONING Ta "Protocol-specified generate new routes on use"
-.It Li D Ta Dv RTF_DYNAMIC Ta "Created dynamically (by redirect)"
-.It Li G Ta Dv RTF_GATEWAY Ta "Destination requires forwarding by intermediary"
-.It Li H Ta Dv RTF_HOST Ta "Host entry (net otherwise)"
-.It Li L Ta Dv RTF_LLINFO Ta "Valid protocol to link address translation"
-.It Li M Ta Dv RTF_MODIFIED Ta "Modified dynamically (by redirect)"
-.It Li R Ta Dv RTF_REJECT Ta "Host or net unreachable"
-.It Li S Ta Dv RTF_STATIC Ta "Manually added"
-.It Li U Ta Dv RTF_UP Ta "Route usable"
-.It Li W Ta Dv RTF_WASCLONED Ta "Route was generated as a result of cloning"
-.It Li X Ta Dv RTF_XRESOLVE Ta "External daemon translates proto to link address"
-.El
-.Pp
-Direct routes are created for each
-interface attached to the local host;
-the gateway field for such entries shows the address of the outgoing interface.
-The refcnt field gives the
-current number of active uses of the route.
-Connection oriented
-protocols normally hold on to a single route for the duration of
-a connection while connectionless protocols obtain a route while sending
-to the same destination.
-The use field provides a count of the number of packets
-sent using that route.
-The interface entry indicates the network interface utilized for the route.
-.Pp
-When
-.Nm
-is invoked with the
-.Fl w
-option and a
-.Ar wait
-interval argument, it displays a running count of statistics related to
-network interfaces.
-An obsolescent version of this option used a numeric parameter
-with no option, and is currently supported for backward compatibility.
-By default, this display summarizes information for all interfaces.
-Information for a specific interface may be displayed with the
-.Fl I
-option.
-.Pp
-The
-.Xr bpf 4
-flags displayed when
-.Nm
-is invoked with the
-.Fl B
-option represent the underlying parameters of the bpf peer.
-Each flag is
-represented as a single lower case letter.
-The mapping between the letters and flags in order of appearance are:
-.Bl -column ".Li i"
-.It Li p Ta Set if listening promiscuously
-.It Li i Ta Dv BIOCIMMEDIATE No has been set on the device
-.It Li f Ta Dv BIOCGHDRCMPLT No status: source link addresses are being
-filled automatically
-.It Li s Ta Dv BIOCGSEESENT No status: see packets originating locally and
-remotely on the interface.
-.It Li a Ta Packet reception generates a signal
-.It Li l Ta Dv BIOCLOCK No status: descriptor has been locked
-.El
-.Pp
-For more information about these flags, please refer to
-.Xr bpf 4 .
-.Pp
-The
-.Fl x
-flag causes netstat to output all the information recorded about data
-stored in the socket buffers. The fields are:
-.Bl -column ".Li R-MBUF"
-.It Li R-MBUF Ta Number of mbufs in the receive queue.
-.It Li S-MBUF Ta Number of mbufs in the send queue.
-.It Li R-CLUS Ta Number of clusters, of any type, in the recieve
-queue.
-.It Li S-CLUS Ta Number of clusters, of any type, in the send queue.
-.It Li R-HIWA Ta Receive buffer high water mark, in bytes.
-.It Li S-HIWA Ta Send buffer high water mark, in bytes.
-.It Li R-LOWA Ta Receive buffer low water mark, in bytes.
-.It Li S-LOWA Ta Send buffer low water mark, in bytes.
-.It Li R-BCNT Ta Receive buffer byte count.
-.It Li S-BCNT Ta Send buffer byte count.
-.It Li R-BMAX Ta Maximum bytes that can be used in the receive buffer.
-.It Li S-BMAX Ta Maximum bytes that can be used in the send buffer.
-.El
-.Sh SEE ALSO
-.Xr fstat 1 ,
-.Xr nfsstat 1 ,
-.Xr ps 1 ,
-.Xr sockstat 1 ,
-.Xr bpf 4 ,
-.Xr inet 4 ,
-.Xr route 4 ,
-.Xr unix 4 ,
-.Xr hosts 5 ,
-.Xr networks 5 ,
-.Xr protocols 5 ,
-.Xr services 5 ,
-.Xr iostat 8 ,
-.Xr route 8 ,
-.Xr trpt 8 ,
-.Xr vmstat 8 ,
-.Xr mbuf 9
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.2 .
-.Pp
-IPv6 support was added by WIDE/KAME project.
-.Sh BUGS
-The notion of errors is ill-defined.
diff --git a/usr.bin/netstat/netstat.h b/usr.bin/netstat/netstat.h
deleted file mode 100644
index 3812e63..0000000
--- a/usr.bin/netstat/netstat.h
+++ /dev/null
@@ -1,166 +0,0 @@
-/*-
- * Copyright (c) 1992, 1993
- * Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)netstat.h 8.2 (Berkeley) 1/4/94
- * $FreeBSD$
- */
-
-#include <sys/cdefs.h>
-
-extern int Aflag; /* show addresses of protocol control block */
-extern int aflag; /* show all sockets (including servers) */
-extern int bflag; /* show i/f total bytes in/out */
-extern int dflag; /* show i/f dropped packets */
-extern int gflag; /* show group (multicast) routing or stats */
-extern int hflag; /* show counters in human readable format */
-extern int iflag; /* show interfaces */
-extern int Lflag; /* show size of listen queues */
-extern int mflag; /* show memory stats */
-extern int numeric_addr; /* show addresses numerically */
-extern int numeric_port; /* show ports numerically */
-extern int rflag; /* show routing tables (or routing stats) */
-extern int sflag; /* show protocol statistics */
-extern int tflag; /* show i/f watchdog timers */
-extern int Wflag; /* wide display */
-extern int xflag; /* extended display, includes all socket buffer info */
-extern int zflag; /* zero stats */
-
-extern int interval; /* repeat interval for i/f stats */
-
-extern char *interface; /* desired i/f for stats, or NULL for all i/fs */
-extern int unit; /* unit number for above */
-
-extern int af; /* address family */
-extern int live; /* true if we are examining a live system */
-
-int kread(u_long addr, void *buf, size_t size);
-const char *plural(uintmax_t);
-const char *plurales(uintmax_t);
-const char *pluralies(uintmax_t);
-
-int sotoxsocket(struct socket *, struct xsocket *);
-void protopr(u_long, const char *, int, int);
-void tcp_stats(u_long, const char *, int, int);
-void udp_stats(u_long, const char *, int, int);
-#ifdef SCTP
-void sctp_protopr(u_long, const char *, int, int);
-void sctp_stats(u_long, const char *, int, int);
-#endif
-void ip_stats(u_long, const char *, int, int);
-void icmp_stats(u_long, const char *, int, int);
-void igmp_stats(u_long, const char *, int, int);
-void pim_stats(u_long, const char *, int, int);
-void carp_stats(u_long, const char *, int, int);
-void pfsync_stats(u_long, const char *, int, int);
-#ifdef IPSEC
-void ipsec_stats(u_long, const char *, int, int);
-void esp_stats(u_long, const char *, int, int);
-void ah_stats(u_long, const char *, int, int);
-void ipcomp_stats(u_long, const char *, int, int);
-#endif
-
-#ifdef INET6
-void ip6_stats(u_long, const char *, int, int);
-void ip6_ifstats(char *);
-void icmp6_stats(u_long, const char *, int, int);
-void icmp6_ifstats(char *);
-void pim6_stats(u_long, const char *, int, int);
-void rip6_stats(u_long, const char *, int, int);
-void mroute6pr(u_long, u_long);
-void mrt6_stats(u_long);
-
-struct sockaddr_in6;
-struct in6_addr;
-char *routename6(struct sockaddr_in6 *);
-const char *netname6(struct sockaddr_in6 *, struct in6_addr *);
-void inet6print(struct in6_addr *, int, const char *, int);
-#endif /*INET6*/
-
-#ifdef IPSEC
-void pfkey_stats(u_long, const char *, int, int);
-#endif
-
-void mbpr(void *, u_long);
-
-void hostpr(u_long, u_long);
-void impstats(u_long, u_long);
-
-void intpr(int, u_long, void (*)(char *));
-
-void pr_rthdr(int);
-void pr_family(int);
-void rt_stats(u_long, u_long);
-char *ipx_pnet(struct sockaddr *);
-char *ipx_phost(struct sockaddr *);
-char *ns_phost(struct sockaddr *);
-void upHex(char *);
-
-char *routename(in_addr_t);
-char *netname(in_addr_t, u_long);
-char *atalk_print(struct sockaddr *, int);
-char *atalk_print2(struct sockaddr *, struct sockaddr *, int);
-char *ipx_print(struct sockaddr *);
-char *ns_print(struct sockaddr *);
-void routepr(u_long);
-
-void ipxprotopr(u_long, const char *, int, int);
-void spx_stats(u_long, const char *, int, int);
-void ipx_stats(u_long, const char *, int, int);
-void ipxerr_stats(u_long, const char *, int, int);
-
-void nsprotopr(u_long, const char *, int, int);
-void spp_stats(u_long, const char *, int, int);
-void idp_stats(u_long, const char *, int, int);
-void nserr_stats(u_long, const char *, int, int);
-
-void atalkprotopr(u_long, const char *, int, int);
-void ddp_stats(u_long, const char *, int, int);
-
-#ifdef NETGRAPH
-void netgraphprotopr(u_long, const char *, int, int);
-#endif
-
-void unixpr(u_long, u_long, u_long, u_long);
-
-void esis_stats(u_long, const char *, int, int);
-void clnp_stats(u_long, const char *, int, int);
-void cltp_stats(u_long, const char *, int, int);
-void iso_protopr(u_long, const char *, int, int);
-void iso_protopr1(u_long, int);
-void tp_protopr(u_long, const char *, int, int);
-void tp_inproto(u_long);
-void tp_stats(caddr_t, caddr_t);
-
-void ifmalist_dump(void);
-void mroutepr(u_long, u_long);
-void mrt_stats(u_long);
-void bpf_stats(char *);
diff --git a/usr.bin/netstat/pfkey.c b/usr.bin/netstat/pfkey.c
deleted file mode 100644
index 2ab58e9..0000000
--- a/usr.bin/netstat/pfkey.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/* $NetBSD: inet.c,v 1.35.2.1 1999/04/29 14:57:08 perry Exp $ */
-/* $KAME: ipsec.c,v 1.25 2001/03/12 09:04:39 itojun Exp $ */
-/*-
- * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*-
- * Copyright (c) 1983, 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)inet.c 8.5 (Berkeley) 5/24/95";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-
-#include <netinet/in.h>
-
-#ifdef IPSEC
-#include <netipsec/keysock.h>
-#endif
-
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include "netstat.h"
-
-#ifdef IPSEC
-
-static const char *pfkey_msgtypenames[] = {
- "reserved", "getspi", "update", "add", "delete",
- "get", "acquire", "register", "expire", "flush",
- "dump", "x_promisc", "x_pchange", "x_spdupdate", "x_spdadd",
- "x_spddelete", "x_spdget", "x_spdacquire", "x_spddump", "x_spdflush",
- "x_spdsetidx", "x_spdexpire", "x_spddelete2"
-};
-
-static const char *pfkey_msgtype_names (int);
-
-
-static const char *
-pfkey_msgtype_names(int x)
-{
- const int max =
- sizeof(pfkey_msgtypenames)/sizeof(pfkey_msgtypenames[0]);
- static char buf[20];
-
- if (x < max && pfkey_msgtypenames[x])
- return pfkey_msgtypenames[x];
- snprintf(buf, sizeof(buf), "#%d", x);
- return buf;
-}
-
-void
-pfkey_stats(u_long off, const char *name, int family __unused,
- int proto __unused)
-{
- struct pfkeystat pfkeystat;
- unsigned first, type;
-
- if (off == 0)
- return;
- printf ("%s:\n", name);
- kread(off, (char *)&pfkeystat, sizeof(pfkeystat));
-
-#define p(f, m) if (pfkeystat.f || sflag <= 1) \
- printf(m, (uintmax_t)pfkeystat.f, plural(pfkeystat.f))
-
- /* userland -> kernel */
- p(out_total, "\t%ju request%s sent from userland\n");
- p(out_bytes, "\t%ju byte%s sent from userland\n");
- for (first = 1, type = 0;
- type < sizeof(pfkeystat.out_msgtype)/sizeof(pfkeystat.out_msgtype[0]);
- type++) {
- if (pfkeystat.out_msgtype[type] <= 0)
- continue;
- if (first) {
- printf("\thistogram by message type:\n");
- first = 0;
- }
- printf("\t\t%s: %ju\n", pfkey_msgtype_names(type),
- (uintmax_t)pfkeystat.out_msgtype[type]);
- }
- p(out_invlen, "\t%ju message%s with invalid length field\n");
- p(out_invver, "\t%ju message%s with invalid version field\n");
- p(out_invmsgtype, "\t%ju message%s with invalid message type field\n");
- p(out_tooshort, "\t%ju message%s too short\n");
- p(out_nomem, "\t%ju message%s with memory allocation failure\n");
- p(out_dupext, "\t%ju message%s with duplicate extension\n");
- p(out_invexttype, "\t%ju message%s with invalid extension type\n");
- p(out_invsatype, "\t%ju message%s with invalid sa type\n");
- p(out_invaddr, "\t%ju message%s with invalid address extension\n");
-
- /* kernel -> userland */
- p(in_total, "\t%ju request%s sent to userland\n");
- p(in_bytes, "\t%ju byte%s sent to userland\n");
- for (first = 1, type = 0;
- type < sizeof(pfkeystat.in_msgtype)/sizeof(pfkeystat.in_msgtype[0]);
- type++) {
- if (pfkeystat.in_msgtype[type] <= 0)
- continue;
- if (first) {
- printf("\thistogram by message type:\n");
- first = 0;
- }
- printf("\t\t%s: %ju\n", pfkey_msgtype_names(type),
- (uintmax_t)pfkeystat.in_msgtype[type]);
- }
- p(in_msgtarget[KEY_SENDUP_ONE],
- "\t%ju message%s toward single socket\n");
- p(in_msgtarget[KEY_SENDUP_ALL],
- "\t%ju message%s toward all sockets\n");
- p(in_msgtarget[KEY_SENDUP_REGISTERED],
- "\t%ju message%s toward registered sockets\n");
- p(in_nomem, "\t%ju message%s with memory allocation failure\n");
-#undef p
-}
-#endif /* IPSEC */
diff --git a/usr.bin/netstat/route.c b/usr.bin/netstat/route.c
deleted file mode 100644
index 01311e5..0000000
--- a/usr.bin/netstat/route.c
+++ /dev/null
@@ -1,1142 +0,0 @@
-/*-
- * Copyright (c) 1983, 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "From: @(#)route.c 8.6 (Berkeley) 4/28/95";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/protosw.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/time.h>
-
-#include <net/ethernet.h>
-#include <net/if.h>
-#include <net/if_var.h>
-#include <net/if_dl.h>
-#include <net/if_types.h>
-#include <net/radix.h>
-#include <net/route.h>
-
-#include <netinet/in.h>
-#include <netipx/ipx.h>
-#include <netatalk/at.h>
-#include <netgraph/ng_socket.h>
-
-#include <sys/sysctl.h>
-
-#include <arpa/inet.h>
-#include <libutil.h>
-#include <netdb.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysexits.h>
-#include <unistd.h>
-#include <err.h>
-#include "netstat.h"
-
-#define kget(p, d) (kread((u_long)(p), (char *)&(d), sizeof (d)))
-
-/*
- * Definitions for showing gateway flags.
- */
-struct bits {
- u_long b_mask;
- char b_val;
-} bits[] = {
- { RTF_UP, 'U' },
- { RTF_GATEWAY, 'G' },
- { RTF_HOST, 'H' },
- { RTF_REJECT, 'R' },
- { RTF_DYNAMIC, 'D' },
- { RTF_MODIFIED, 'M' },
- { RTF_DONE, 'd' }, /* Completed -- for routing messages only */
- { RTF_CLONING, 'C' },
- { RTF_XRESOLVE, 'X' },
- { RTF_LLINFO, 'L' },
- { RTF_STATIC, 'S' },
- { RTF_PROTO1, '1' },
- { RTF_PROTO2, '2' },
- { RTF_WASCLONED,'W' },
- { RTF_PRCLONING,'c' },
- { RTF_PROTO3, '3' },
- { RTF_BLACKHOLE,'B' },
- { RTF_BROADCAST,'b' },
- { 0 , 0 }
-};
-
-typedef union {
- long dummy; /* Helps align structure. */
- struct sockaddr u_sa;
- u_short u_data[128];
-} sa_u;
-
-static sa_u pt_u;
-
-int fibnum;
-int do_rtent = 0;
-struct rtentry rtentry;
-struct radix_node rnode;
-struct radix_mask rmask;
-struct rtline {
- struct radix_node_head *tables[AF_MAX+1]; /*xxx*/
-};
-struct rtline *rt_tables;
-
-struct radix_node_head *rt_tables_line[1][AF_MAX+1]; /*xxx*/
-
-int NewTree = 0;
-
-struct timespec uptime;
-
-static struct sockaddr *kgetsa(struct sockaddr *);
-static void size_cols(int ef, struct radix_node *rn);
-static void size_cols_tree(struct radix_node *rn);
-static void size_cols_rtentry(struct rtentry *rt);
-static void p_tree(struct radix_node *);
-static void p_rtnode(void);
-static void ntreestuff(void);
-static void np_rtentry(struct rt_msghdr *);
-static void p_sockaddr(struct sockaddr *, struct sockaddr *, int, int);
-static const char *fmt_sockaddr(struct sockaddr *sa, struct sockaddr *mask,
- int flags);
-static void p_flags(int, const char *);
-static const char *fmt_flags(int f);
-static void p_rtentry(struct rtentry *);
-static void domask(char *, in_addr_t, u_long);
-
-/*
- * Print routing tables.
- */
-void
-routepr(u_long rtree)
-{
- struct radix_node_head *rnh, head;
- size_t intsize;
- int i;
- int numfibs;
-
- intsize = sizeof(int);
- if (sysctlbyname("net.my_fibnum", &fibnum, &intsize, NULL, 0) == -1)
- fibnum = 0;
- if (sysctlbyname("net.fibs", &numfibs, &intsize, NULL, 0) == -1)
- numfibs = 1;
- rt_tables = calloc(numfibs, sizeof(struct rtline));
- if (rt_tables == NULL)
- err(EX_OSERR, "memory allocation failed");
- /*
- * Since kernel & userland use different timebase
- * (time_uptime vs time_second) and we are reading kernel memory
- * directly we should do rt_rmx.rmx_expire --> expire_time conversion.
- */
- if (clock_gettime(CLOCK_UPTIME, &uptime) < 0)
- err(EX_OSERR, "clock_gettime() failed");
-
- printf("Routing tables\n");
-
- if (Aflag == 0 && NewTree)
- ntreestuff();
- else {
- if (rtree == 0) {
- printf("rt_tables: symbol not in namelist\n");
- return;
- }
-
- if (kread((u_long)(rtree), (char *)(rt_tables),
- (numfibs * sizeof(struct rtline))) != 0)
- return;
- for (i = 0; i <= AF_MAX; i++) {
- int tmpfib;
- if (i != AF_INET)
- tmpfib = 0;
- else
- tmpfib = fibnum;
- if ((rnh = rt_tables[tmpfib].tables[i]) == 0)
- continue;
- if (kget(rnh, head) != 0)
- continue;
- if (i == AF_UNSPEC) {
- if (Aflag && af == 0) {
- printf("Netmasks:\n");
- p_tree(head.rnh_treetop);
- }
- } else if (af == AF_UNSPEC || af == i) {
- size_cols(i, head.rnh_treetop);
- pr_family(i);
- do_rtent = 1;
- pr_rthdr(i);
- p_tree(head.rnh_treetop);
- }
- }
- }
-}
-
-/*
- * Print address family header before a section of the routing table.
- */
-void
-pr_family(int af1)
-{
- const char *afname;
-
- switch (af1) {
- case AF_INET:
- afname = "Internet";
- break;
-#ifdef INET6
- case AF_INET6:
- afname = "Internet6";
- break;
-#endif /*INET6*/
- case AF_IPX:
- afname = "IPX";
- break;
- case AF_ISO:
- afname = "ISO";
- break;
- case AF_APPLETALK:
- afname = "AppleTalk";
- break;
- case AF_CCITT:
- afname = "X.25";
- break;
- case AF_NETGRAPH:
- afname = "Netgraph";
- break;
- default:
- afname = NULL;
- break;
- }
- if (afname)
- printf("\n%s:\n", afname);
- else
- printf("\nProtocol Family %d:\n", af1);
-}
-
-/* column widths; each followed by one space */
-#ifndef INET6
-#define WID_DST_DEFAULT(af) 18 /* width of destination column */
-#define WID_GW_DEFAULT(af) 18 /* width of gateway column */
-#define WID_IF_DEFAULT(af) (Wflag ? 8 : 6) /* width of netif column */
-#else
-#define WID_DST_DEFAULT(af) \
- ((af) == AF_INET6 ? (numeric_addr ? 33: 18) : 18)
-#define WID_GW_DEFAULT(af) \
- ((af) == AF_INET6 ? (numeric_addr ? 29 : 18) : 18)
-#define WID_IF_DEFAULT(af) ((af) == AF_INET6 ? 8 : (Wflag ? 8 : 6))
-#endif /*INET6*/
-
-static int wid_dst;
-static int wid_gw;
-static int wid_flags;
-static int wid_refs;
-static int wid_use;
-static int wid_mtu;
-static int wid_if;
-static int wid_expire;
-
-static void
-size_cols(int ef __unused, struct radix_node *rn)
-{
- wid_dst = WID_DST_DEFAULT(ef);
- wid_gw = WID_GW_DEFAULT(ef);
- wid_flags = 6;
- wid_refs = 6;
- wid_use = 8;
- wid_mtu = 6;
- wid_if = WID_IF_DEFAULT(ef);
- wid_expire = 6;
-
- if (Wflag)
- size_cols_tree(rn);
-}
-
-static void
-size_cols_tree(struct radix_node *rn)
-{
-again:
- if (kget(rn, rnode) != 0)
- return;
- if (!(rnode.rn_flags & RNF_ACTIVE))
- return;
- if (rnode.rn_bit < 0) {
- if ((rnode.rn_flags & RNF_ROOT) == 0) {
- if (kget(rn, rtentry) != 0)
- return;
- size_cols_rtentry(&rtentry);
- }
- if ((rn = rnode.rn_dupedkey))
- goto again;
- } else {
- rn = rnode.rn_right;
- size_cols_tree(rnode.rn_left);
- size_cols_tree(rn);
- }
-}
-
-static void
-size_cols_rtentry(struct rtentry *rt)
-{
- static struct ifnet ifnet, *lastif;
- struct rtentry parent;
- static char buffer[100];
- const char *bp;
- struct sockaddr *sa;
- sa_u addr, mask;
- int len;
-
- /*
- * Don't print protocol-cloned routes unless -a.
- */
- if (rt->rt_flags & RTF_WASCLONED && !aflag) {
- if (kget(rt->rt_parent, parent) != 0)
- return;
- if (parent.rt_flags & RTF_PRCLONING)
- return;
- }
-
- bzero(&addr, sizeof(addr));
- if ((sa = kgetsa(rt_key(rt))))
- bcopy(sa, &addr, sa->sa_len);
- bzero(&mask, sizeof(mask));
- if (rt_mask(rt) && (sa = kgetsa(rt_mask(rt))))
- bcopy(sa, &mask, sa->sa_len);
- bp = fmt_sockaddr(&addr.u_sa, &mask.u_sa, rt->rt_flags);
- len = strlen(bp);
- wid_dst = MAX(len, wid_dst);
-
- bp = fmt_sockaddr(kgetsa(rt->rt_gateway), NULL, RTF_HOST);
- len = strlen(bp);
- wid_gw = MAX(len, wid_gw);
-
- bp = fmt_flags(rt->rt_flags);
- len = strlen(bp);
- wid_flags = MAX(len, wid_flags);
-
- if (addr.u_sa.sa_family == AF_INET || Wflag) {
- len = snprintf(buffer, sizeof(buffer), "%ld", rt->rt_refcnt);
- wid_refs = MAX(len, wid_refs);
- len = snprintf(buffer, sizeof(buffer), "%lu", rt->rt_use);
- wid_use = MAX(len, wid_use);
- if (Wflag && rt->rt_rmx.rmx_mtu != 0) {
- len = snprintf(buffer, sizeof(buffer),
- "%lu", rt->rt_rmx.rmx_mtu);
- wid_mtu = MAX(len, wid_mtu);
- }
- }
- if (rt->rt_ifp) {
- if (rt->rt_ifp != lastif) {
- if (kget(rt->rt_ifp, ifnet) == 0)
- len = strlen(ifnet.if_xname);
- else
- len = strlen("---");
- lastif = rt->rt_ifp;
- wid_if = MAX(len, wid_if);
- }
- if (rt->rt_rmx.rmx_expire) {
- time_t expire_time;
-
- if ((expire_time =
- rt->rt_rmx.rmx_expire - uptime.tv_sec) > 0) {
- len = snprintf(buffer, sizeof(buffer), "%d",
- (int)expire_time);
- wid_expire = MAX(len, wid_expire);
- }
- }
- }
-}
-
-
-/*
- * Print header for routing table columns.
- */
-void
-pr_rthdr(int af1)
-{
-
- if (Aflag)
- printf("%-8.8s ","Address");
- if (af1 == AF_INET || Wflag) {
- if (Wflag) {
- printf("%-*.*s %-*.*s %-*.*s %*.*s %*.*s %*.*s %*.*s %*s\n",
- wid_dst, wid_dst, "Destination",
- wid_gw, wid_gw, "Gateway",
- wid_flags, wid_flags, "Flags",
- wid_refs, wid_refs, "Refs",
- wid_use, wid_use, "Use",
- wid_mtu, wid_mtu, "Mtu",
- wid_if, wid_if, "Netif",
- wid_expire, "Expire");
- } else {
- printf("%-*.*s %-*.*s %-*.*s %*.*s %*.*s %*.*s %*s\n",
- wid_dst, wid_dst, "Destination",
- wid_gw, wid_gw, "Gateway",
- wid_flags, wid_flags, "Flags",
- wid_refs, wid_refs, "Refs",
- wid_use, wid_use, "Use",
- wid_if, wid_if, "Netif",
- wid_expire, "Expire");
- }
- } else {
- printf("%-*.*s %-*.*s %-*.*s %*.*s %*s\n",
- wid_dst, wid_dst, "Destination",
- wid_gw, wid_gw, "Gateway",
- wid_flags, wid_flags, "Flags",
- wid_if, wid_if, "Netif",
- wid_expire, "Expire");
- }
-}
-
-static struct sockaddr *
-kgetsa(struct sockaddr *dst)
-{
-
- if (kget(dst, pt_u.u_sa) != 0)
- return (NULL);
- if (pt_u.u_sa.sa_len > sizeof (pt_u.u_sa))
- kread((u_long)dst, (char *)pt_u.u_data, pt_u.u_sa.sa_len);
- return (&pt_u.u_sa);
-}
-
-static void
-p_tree(struct radix_node *rn)
-{
-
-again:
- if (kget(rn, rnode) != 0)
- return;
- if (!(rnode.rn_flags & RNF_ACTIVE))
- return;
- if (rnode.rn_bit < 0) {
- if (Aflag)
- printf("%-8.8lx ", (u_long)rn);
- if (rnode.rn_flags & RNF_ROOT) {
- if (Aflag)
- printf("(root node)%s",
- rnode.rn_dupedkey ? " =>\n" : "\n");
- } else if (do_rtent) {
- if (kget(rn, rtentry) == 0) {
- p_rtentry(&rtentry);
- if (Aflag)
- p_rtnode();
- }
- } else {
- p_sockaddr(kgetsa((struct sockaddr *)rnode.rn_key),
- NULL, 0, 44);
- putchar('\n');
- }
- if ((rn = rnode.rn_dupedkey))
- goto again;
- } else {
- if (Aflag && do_rtent) {
- printf("%-8.8lx ", (u_long)rn);
- p_rtnode();
- }
- rn = rnode.rn_right;
- p_tree(rnode.rn_left);
- p_tree(rn);
- }
-}
-
-char nbuf[20];
-
-static void
-p_rtnode(void)
-{
- struct radix_mask *rm = rnode.rn_mklist;
-
- if (rnode.rn_bit < 0) {
- if (rnode.rn_mask) {
- printf("\t mask ");
- p_sockaddr(kgetsa((struct sockaddr *)rnode.rn_mask),
- NULL, 0, -1);
- } else if (rm == 0)
- return;
- } else {
- sprintf(nbuf, "(%d)", rnode.rn_bit);
- printf("%6.6s %8.8lx : %8.8lx", nbuf, (u_long)rnode.rn_left, (u_long)rnode.rn_right);
- }
- while (rm) {
- if (kget(rm, rmask) != 0)
- break;
- sprintf(nbuf, " %d refs, ", rmask.rm_refs);
- printf(" mk = %8.8lx {(%d),%s",
- (u_long)rm, -1 - rmask.rm_bit, rmask.rm_refs ? nbuf : " ");
- if (rmask.rm_flags & RNF_NORMAL) {
- struct radix_node rnode_aux;
- printf(" <normal>, ");
- if (kget(rmask.rm_leaf, rnode_aux) == 0)
- p_sockaddr(kgetsa((struct sockaddr *)rnode_aux.rn_mask),
- NULL, 0, -1);
- else
- p_sockaddr(NULL, NULL, 0, -1);
- } else
- p_sockaddr(kgetsa((struct sockaddr *)rmask.rm_mask),
- NULL, 0, -1);
- putchar('}');
- if ((rm = rmask.rm_mklist))
- printf(" ->");
- }
- putchar('\n');
-}
-
-static void
-ntreestuff(void)
-{
- size_t needed;
- int mib[6];
- char *buf, *next, *lim;
- struct rt_msghdr *rtm;
-
- mib[0] = CTL_NET;
- mib[1] = PF_ROUTE;
- mib[2] = 0;
- mib[3] = 0;
- mib[4] = NET_RT_DUMP;
- mib[5] = 0;
- if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) {
- err(1, "sysctl: net.route.0.0.dump estimate");
- }
-
- if ((buf = malloc(needed)) == 0) {
- errx(2, "malloc(%lu)", (unsigned long)needed);
- }
- if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) {
- err(1, "sysctl: net.route.0.0.dump");
- }
- lim = buf + needed;
- for (next = buf; next < lim; next += rtm->rtm_msglen) {
- rtm = (struct rt_msghdr *)next;
- np_rtentry(rtm);
- }
-}
-
-static void
-np_rtentry(struct rt_msghdr *rtm)
-{
- struct sockaddr *sa = (struct sockaddr *)(rtm + 1);
-#ifdef notdef
- static int masks_done, banner_printed;
-#endif
- static int old_af;
- int af1 = 0, interesting = RTF_UP | RTF_GATEWAY | RTF_HOST;
-
-#ifdef notdef
- /* for the moment, netmasks are skipped over */
- if (!banner_printed) {
- printf("Netmasks:\n");
- banner_printed = 1;
- }
- if (masks_done == 0) {
- if (rtm->rtm_addrs != RTA_DST ) {
- masks_done = 1;
- af1 = sa->sa_family;
- }
- } else
-#endif
- af1 = sa->sa_family;
- if (af1 != old_af) {
- pr_family(af1);
- old_af = af1;
- }
- if (rtm->rtm_addrs == RTA_DST)
- p_sockaddr(sa, NULL, 0, 36);
- else {
- p_sockaddr(sa, NULL, rtm->rtm_flags, 16);
- sa = (struct sockaddr *)(SA_SIZE(sa) + (char *)sa);
- p_sockaddr(sa, NULL, 0, 18);
- }
- p_flags(rtm->rtm_flags & interesting, "%-6.6s ");
- putchar('\n');
-}
-
-static void
-p_sockaddr(struct sockaddr *sa, struct sockaddr *mask, int flags, int width)
-{
- const char *cp;
-
- cp = fmt_sockaddr(sa, mask, flags);
-
- if (width < 0 )
- printf("%s ", cp);
- else {
- if (numeric_addr)
- printf("%-*s ", width, cp);
- else
- printf("%-*.*s ", width, width, cp);
- }
-}
-
-static const char *
-fmt_sockaddr(struct sockaddr *sa, struct sockaddr *mask, int flags)
-{
- static char workbuf[128];
- const char *cp;
-
- if (sa == NULL)
- return ("null");
-
- switch(sa->sa_family) {
- case AF_INET:
- {
- struct sockaddr_in *sockin = (struct sockaddr_in *)sa;
-
- if ((sockin->sin_addr.s_addr == INADDR_ANY) &&
- mask &&
- ntohl(((struct sockaddr_in *)mask)->sin_addr.s_addr)
- ==0L)
- cp = "default" ;
- else if (flags & RTF_HOST)
- cp = routename(sockin->sin_addr.s_addr);
- else if (mask)
- cp = netname(sockin->sin_addr.s_addr,
- ntohl(((struct sockaddr_in *)mask)
- ->sin_addr.s_addr));
- else
- cp = netname(sockin->sin_addr.s_addr, 0L);
- break;
- }
-
-#ifdef INET6
- case AF_INET6:
- {
- struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)sa;
- struct in6_addr *in6 = &sa6->sin6_addr;
-
- /*
- * XXX: This is a special workaround for KAME kernels.
- * sin6_scope_id field of SA should be set in the future.
- */
- if (IN6_IS_ADDR_LINKLOCAL(in6) ||
- IN6_IS_ADDR_MC_LINKLOCAL(in6)) {
- /* XXX: override is ok? */
- sa6->sin6_scope_id = (u_int32_t)ntohs(*(u_short *)&in6->s6_addr[2]);
- *(u_short *)&in6->s6_addr[2] = 0;
- }
-
- if (flags & RTF_HOST)
- cp = routename6(sa6);
- else if (mask)
- cp = netname6(sa6,
- &((struct sockaddr_in6 *)mask)->sin6_addr);
- else {
- cp = netname6(sa6, NULL);
- }
- break;
- }
-#endif /*INET6*/
-
- case AF_IPX:
- {
- struct ipx_addr work = ((struct sockaddr_ipx *)sa)->sipx_addr;
- if (ipx_nullnet(satoipx_addr(work)))
- cp = "default";
- else
- cp = ipx_print(sa);
- break;
- }
- case AF_APPLETALK:
- {
- if (!(flags & RTF_HOST) && mask)
- cp = atalk_print2(sa,mask,9);
- else
- cp = atalk_print(sa,11);
- break;
- }
- case AF_NETGRAPH:
- {
- strlcpy(workbuf, ((struct sockaddr_ng *)sa)->sg_data,
- sizeof(workbuf));
- cp = workbuf;
- break;
- }
-
- case AF_LINK:
- {
- struct sockaddr_dl *sdl = (struct sockaddr_dl *)sa;
-
- if (sdl->sdl_nlen == 0 && sdl->sdl_alen == 0 &&
- sdl->sdl_slen == 0) {
- (void) sprintf(workbuf, "link#%d", sdl->sdl_index);
- cp = workbuf;
- } else
- switch (sdl->sdl_type) {
-
- case IFT_ETHER:
- case IFT_L2VLAN:
- case IFT_BRIDGE:
- if (sdl->sdl_alen == ETHER_ADDR_LEN) {
- cp = ether_ntoa((struct ether_addr *)
- (sdl->sdl_data + sdl->sdl_nlen));
- break;
- }
- /* FALLTHROUGH */
- default:
- cp = link_ntoa(sdl);
- break;
- }
- break;
- }
-
- default:
- {
- u_char *s = (u_char *)sa->sa_data, *slim;
- char *cq, *cqlim;
-
- cq = workbuf;
- slim = sa->sa_len + (u_char *) sa;
- cqlim = cq + sizeof(workbuf) - 6;
- cq += sprintf(cq, "(%d)", sa->sa_family);
- while (s < slim && cq < cqlim) {
- cq += sprintf(cq, " %02x", *s++);
- if (s < slim)
- cq += sprintf(cq, "%02x", *s++);
- }
- cp = workbuf;
- }
- }
-
- return (cp);
-}
-
-static void
-p_flags(int f, const char *format)
-{
- printf(format, fmt_flags(f));
-}
-
-static const char *
-fmt_flags(int f)
-{
- static char name[33];
- char *flags;
- struct bits *p = bits;
-
- for (flags = name; p->b_mask; p++)
- if (p->b_mask & f)
- *flags++ = p->b_val;
- *flags = '\0';
- return (name);
-}
-
-static void
-p_rtentry(struct rtentry *rt)
-{
- static struct ifnet ifnet, *lastif;
- struct rtentry parent;
- static char buffer[128];
- static char prettyname[128];
- struct sockaddr *sa;
- sa_u addr, mask;
-
- /*
- * Don't print protocol-cloned routes unless -a.
- */
- if (rt->rt_flags & RTF_WASCLONED && !aflag) {
- if (kget(rt->rt_parent, parent) != 0)
- return;
- if (parent.rt_flags & RTF_PRCLONING)
- return;
- }
-
- bzero(&addr, sizeof(addr));
- if ((sa = kgetsa(rt_key(rt))))
- bcopy(sa, &addr, sa->sa_len);
- bzero(&mask, sizeof(mask));
- if (rt_mask(rt) && (sa = kgetsa(rt_mask(rt))))
- bcopy(sa, &mask, sa->sa_len);
- p_sockaddr(&addr.u_sa, &mask.u_sa, rt->rt_flags, wid_dst);
- p_sockaddr(kgetsa(rt->rt_gateway), NULL, RTF_HOST, wid_gw);
- snprintf(buffer, sizeof(buffer), "%%-%d.%ds ", wid_flags, wid_flags);
- p_flags(rt->rt_flags, buffer);
- if (addr.u_sa.sa_family == AF_INET || Wflag) {
- printf("%*ld %*lu ", wid_refs, rt->rt_refcnt,
- wid_use, rt->rt_use);
- if (Wflag) {
- if (rt->rt_rmx.rmx_mtu != 0)
- printf("%*lu ", wid_mtu, rt->rt_rmx.rmx_mtu);
- else
- printf("%*s ", wid_mtu, "");
- }
- }
- if (rt->rt_ifp) {
- if (rt->rt_ifp != lastif) {
- if (kget(rt->rt_ifp, ifnet) == 0)
- strlcpy(prettyname, ifnet.if_xname,
- sizeof(prettyname));
- else
- strlcpy(prettyname, "---", sizeof(prettyname));
- lastif = rt->rt_ifp;
- }
- printf("%*.*s", wid_if, wid_if, prettyname);
- if (rt->rt_rmx.rmx_expire) {
- time_t expire_time;
-
- if ((expire_time =
- rt->rt_rmx.rmx_expire - uptime.tv_sec) > 0)
- printf(" %*d", wid_expire, (int)expire_time);
- }
- if (rt->rt_nodes[0].rn_dupedkey)
- printf(" =>");
- }
- putchar('\n');
-}
-
-char *
-routename(in_addr_t in)
-{
- char *cp;
- static char line[MAXHOSTNAMELEN];
- struct hostent *hp;
-
- cp = 0;
- if (!numeric_addr) {
- hp = gethostbyaddr(&in, sizeof (struct in_addr), AF_INET);
- if (hp) {
- cp = hp->h_name;
- trimdomain(cp, strlen(cp));
- }
- }
- if (cp) {
- strlcpy(line, cp, sizeof(line));
- } else {
-#define C(x) ((x) & 0xff)
- in = ntohl(in);
- sprintf(line, "%u.%u.%u.%u",
- C(in >> 24), C(in >> 16), C(in >> 8), C(in));
- }
- return (line);
-}
-
-#define NSHIFT(m) ( \
- (m) == IN_CLASSA_NET ? IN_CLASSA_NSHIFT : \
- (m) == IN_CLASSB_NET ? IN_CLASSB_NSHIFT : \
- (m) == IN_CLASSC_NET ? IN_CLASSC_NSHIFT : \
- 0)
-
-static void
-domask(char *dst, in_addr_t addr __unused, u_long mask)
-{
- int b, i;
-
- if (mask == 0 || (!numeric_addr && NSHIFT(mask) != 0)) {
- *dst = '\0';
- return;
- }
- i = 0;
- for (b = 0; b < 32; b++)
- if (mask & (1 << b)) {
- int bb;
-
- i = b;
- for (bb = b+1; bb < 32; bb++)
- if (!(mask & (1 << bb))) {
- i = -1; /* noncontig */
- break;
- }
- break;
- }
- if (i == -1)
- sprintf(dst, "&0x%lx", mask);
- else
- sprintf(dst, "/%d", 32-i);
-}
-
-/*
- * Return the name of the network whose address is given.
- * The address is assumed to be that of a net or subnet, not a host.
- */
-char *
-netname(in_addr_t in, u_long mask)
-{
- char *cp = 0;
- static char line[MAXHOSTNAMELEN];
- struct netent *np = 0;
- in_addr_t i;
-
- i = ntohl(in);
- if (!numeric_addr && i) {
- np = getnetbyaddr(i >> NSHIFT(mask), AF_INET);
- if (np != NULL) {
- cp = np->n_name;
- trimdomain(cp, strlen(cp));
- }
- }
- if (cp != NULL) {
- strlcpy(line, cp, sizeof(line));
- } else {
- inet_ntop(AF_INET, &in, line, sizeof(line) - 1);
- }
- domask(line + strlen(line), i, mask);
- return (line);
-}
-
-#undef NSHIFT
-
-#ifdef INET6
-const char *
-netname6(struct sockaddr_in6 *sa6, struct in6_addr *mask)
-{
- static char line[MAXHOSTNAMELEN];
- u_char *p = (u_char *)mask;
- u_char *lim;
- int masklen, illegal = 0, flag = 0;
-
- if (mask) {
- for (masklen = 0, lim = p + 16; p < lim; p++) {
- switch (*p) {
- case 0xff:
- masklen += 8;
- break;
- case 0xfe:
- masklen += 7;
- break;
- case 0xfc:
- masklen += 6;
- break;
- case 0xf8:
- masklen += 5;
- break;
- case 0xf0:
- masklen += 4;
- break;
- case 0xe0:
- masklen += 3;
- break;
- case 0xc0:
- masklen += 2;
- break;
- case 0x80:
- masklen += 1;
- break;
- case 0x00:
- break;
- default:
- illegal ++;
- break;
- }
- }
- if (illegal)
- fprintf(stderr, "illegal prefixlen\n");
- }
- else
- masklen = 128;
-
- if (masklen == 0 && IN6_IS_ADDR_UNSPECIFIED(&sa6->sin6_addr))
- return("default");
-
- if (numeric_addr)
- flag |= NI_NUMERICHOST;
- getnameinfo((struct sockaddr *)sa6, sa6->sin6_len, line, sizeof(line),
- NULL, 0, flag);
-
- if (numeric_addr)
- sprintf(&line[strlen(line)], "/%d", masklen);
-
- return line;
-}
-
-char *
-routename6(struct sockaddr_in6 *sa6)
-{
- static char line[MAXHOSTNAMELEN];
- int flag = 0;
- /* use local variable for safety */
- struct sockaddr_in6 sa6_local;
-
- sa6_local.sin6_family = AF_INET6;
- sa6_local.sin6_len = sizeof(sa6_local);
- sa6_local.sin6_addr = sa6->sin6_addr;
- sa6_local.sin6_scope_id = sa6->sin6_scope_id;
-
- if (numeric_addr)
- flag |= NI_NUMERICHOST;
-
- getnameinfo((struct sockaddr *)&sa6_local, sa6_local.sin6_len,
- line, sizeof(line), NULL, 0, flag);
-
- return line;
-}
-#endif /*INET6*/
-
-/*
- * Print routing statistics
- */
-void
-rt_stats(u_long rtsaddr, u_long rttaddr)
-{
- struct rtstat rtstat;
- int rttrash;
-
- if (rtsaddr == 0) {
- printf("rtstat: symbol not in namelist\n");
- return;
- }
- if (rttaddr == 0) {
- printf("rttrash: symbol not in namelist\n");
- return;
- }
- kread(rtsaddr, (char *)&rtstat, sizeof (rtstat));
- kread(rttaddr, (char *)&rttrash, sizeof (rttrash));
- printf("routing:\n");
-
-#define p(f, m) if (rtstat.f || sflag <= 1) \
- printf(m, rtstat.f, plural(rtstat.f))
-
- p(rts_badredirect, "\t%u bad routing redirect%s\n");
- p(rts_dynamic, "\t%u dynamically created route%s\n");
- p(rts_newgateway, "\t%u new gateway%s due to redirects\n");
- p(rts_unreach, "\t%u destination%s found unreachable\n");
- p(rts_wildcard, "\t%u use%s of a wildcard route\n");
-#undef p
-
- if (rttrash || sflag <= 1)
- printf("\t%u route%s not in table but not freed\n",
- rttrash, plural(rttrash));
-}
-
-char *
-ipx_print(struct sockaddr *sa)
-{
- u_short port;
- struct servent *sp = 0;
- const char *net = "", *host = "";
- char *p;
- u_char *q;
- struct ipx_addr work = ((struct sockaddr_ipx *)sa)->sipx_addr;
- static char mybuf[50];
- char cport[10], chost[15], cnet[15];
-
- port = ntohs(work.x_port);
-
- if (ipx_nullnet(work) && ipx_nullhost(work)) {
-
- if (port) {
- if (sp)
- sprintf(mybuf, "*.%s", sp->s_name);
- else
- sprintf(mybuf, "*.%x", port);
- } else
- sprintf(mybuf, "*.*");
-
- return (mybuf);
- }
-
- if (ipx_wildnet(work))
- net = "any";
- else if (ipx_nullnet(work))
- net = "*";
- else {
- q = work.x_net.c_net;
- sprintf(cnet, "%02x%02x%02x%02x",
- q[0], q[1], q[2], q[3]);
- for (p = cnet; *p == '0' && p < cnet + 8; p++)
- continue;
- net = p;
- }
-
- if (ipx_wildhost(work))
- host = "any";
- else if (ipx_nullhost(work))
- host = "*";
- else {
- q = work.x_host.c_host;
- sprintf(chost, "%02x%02x%02x%02x%02x%02x",
- q[0], q[1], q[2], q[3], q[4], q[5]);
- for (p = chost; *p == '0' && p < chost + 12; p++)
- continue;
- host = p;
- }
-
- if (port) {
- if (strcmp(host, "*") == 0)
- host = "";
- if (sp)
- snprintf(cport, sizeof(cport),
- "%s%s", *host ? "." : "", sp->s_name);
- else
- snprintf(cport, sizeof(cport),
- "%s%x", *host ? "." : "", port);
- } else
- *cport = 0;
-
- snprintf(mybuf, sizeof(mybuf), "%s.%s%s", net, host, cport);
- return(mybuf);
-}
-
-char *
-ipx_phost(struct sockaddr *sa)
-{
- struct sockaddr_ipx *sipx = (struct sockaddr_ipx *)sa;
- struct sockaddr_ipx work;
- static union ipx_net ipx_zeronet;
- char *p;
- struct ipx_addr in;
-
- work = *sipx;
- in = work.sipx_addr;
-
- work.sipx_addr.x_port = 0;
- work.sipx_addr.x_net = ipx_zeronet;
- p = ipx_print((struct sockaddr *)&work);
- if (strncmp("*.", p, 2) == 0) p += 2;
-
- return(p);
-}
-
-void
-upHex(char *p0)
-{
- char *p = p0;
-
- for (; *p; p++)
- switch (*p) {
-
- case 'a':
- case 'b':
- case 'c':
- case 'd':
- case 'e':
- case 'f':
- *p += ('A' - 'a');
- break;
- }
-}
diff --git a/usr.bin/netstat/sctp.c b/usr.bin/netstat/sctp.c
deleted file mode 100644
index fe29787..0000000
--- a/usr.bin/netstat/sctp.c
+++ /dev/null
@@ -1,690 +0,0 @@
-/*-
- * Copyright (c) 2001-2007, by Weongyo Jeong. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * a) Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * b) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the distribution.
- *
- * c) Neither the name of Cisco Systems, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)sctp.c 0.1 (Berkeley) 4/18/2007";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/sysctl.h>
-#include <sys/protosw.h>
-
-#include <netinet/in.h>
-#include <netinet/sctp.h>
-#include <netinet/sctp_constants.h>
-#include <arpa/inet.h>
-
-#include <err.h>
-#include <errno.h>
-#include <libutil.h>
-#include <netdb.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "netstat.h"
-
-#ifdef SCTP
-
-void inetprint(struct in_addr *, int, const char *, int);
-static void sctp_statesprint(uint32_t state);
-
-#define NETSTAT_SCTP_STATES_CLOSED 0x0
-#define NETSTAT_SCTP_STATES_BOUND 0x1
-#define NETSTAT_SCTP_STATES_LISTEN 0x2
-#define NETSTAT_SCTP_STATES_COOKIE_WAIT 0x3
-#define NETSTAT_SCTP_STATES_COOKIE_ECHOED 0x4
-#define NETSTAT_SCTP_STATES_ESTABLISHED 0x5
-#define NETSTAT_SCTP_STATES_SHUTDOWN_SENT 0x6
-#define NETSTAT_SCTP_STATES_SHUTDOWN_RECEIVED 0x7
-#define NETSTAT_SCTP_STATES_SHUTDOWN_ACK_SENT 0x8
-#define NETSTAT_SCTP_STATES_SHUTDOWN_PENDING 0x9
-
-char *sctpstates[] = {
- "CLOSED",
- "BOUND",
- "LISTEN",
- "COOKIE_WAIT",
- "COOKIE_ECHOED",
- "ESTABLISHED",
- "SHUTDOWN_SENT",
- "SHUTDOWN_RECEIVED",
- "SHUTDOWN_ACK_SENT",
- "SHUTDOWN_PENDING"
-};
-
-LIST_HEAD(xladdr_list, xladdr_entry) xladdr_head;
-struct xladdr_entry {
- struct xsctp_laddr *xladdr;
- LIST_ENTRY(xladdr_entry) xladdr_entries;
-};
-
-LIST_HEAD(xraddr_list, xraddr_entry) xraddr_head;
-struct xraddr_entry {
- struct xsctp_raddr *xraddr;
- LIST_ENTRY(xraddr_entry) xraddr_entries;
-};
-
-static int
-sctp_skip_xinpcb_ifneed(char *buf, const size_t buflen, size_t *offset)
-{
- int exist_tcb = 0;
- struct xsctp_tcb *xstcb;
- struct xsctp_raddr *xraddr;
- struct xsctp_laddr *xladdr;
-
- while (*offset < buflen) {
- xladdr = (struct xsctp_laddr *)(buf + *offset);
- *offset += sizeof(struct xsctp_laddr);
- if (xladdr->last == 1)
- break;
- }
-
- while (*offset < buflen) {
- xstcb = (struct xsctp_tcb *)(buf + *offset);
- *offset += sizeof(struct xsctp_tcb);
- if (xstcb->last == 1)
- break;
-
- exist_tcb = 1;
-
- while (*offset < buflen) {
- xladdr = (struct xsctp_laddr *)(buf + *offset);
- *offset += sizeof(struct xsctp_laddr);
- if (xladdr->last == 1)
- break;
- }
-
- while (*offset < buflen) {
- xraddr = (struct xsctp_raddr *)(buf + *offset);
- *offset += sizeof(struct xsctp_raddr);
- if (xraddr->last == 1)
- break;
- }
- }
-
- /*
- * If Lflag is set, we don't care about the return value.
- */
- if (Lflag)
- return 0;
-
- return exist_tcb;
-}
-
-static void
-sctp_process_tcb(struct xsctp_tcb *xstcb, const char *name,
- char *buf, const size_t buflen, size_t *offset, int *indent)
-{
- int i, xl_total = 0, xr_total = 0, x_max;
- struct sockaddr *sa;
- struct xsctp_raddr *xraddr;
- struct xsctp_laddr *xladdr;
- struct xladdr_entry *prev_xl = NULL, *xl = NULL, *xl_tmp;
- struct xraddr_entry *prev_xr = NULL, *xr = NULL, *xr_tmp;
-#ifdef INET6
- struct sockaddr_in6 *in6;
-#endif
-
- LIST_INIT(&xladdr_head);
- LIST_INIT(&xraddr_head);
-
- /*
- * Make `struct xladdr_list' list and `struct xraddr_list' list
- * to handle the address flexibly.
- */
- while (*offset < buflen) {
- xladdr = (struct xsctp_laddr *)(buf + *offset);
- *offset += sizeof(struct xsctp_laddr);
- if (xladdr->last == 1)
- break;
-
- prev_xl = xl;
- xl = malloc(sizeof(struct xladdr_entry));
- if (xl == NULL) {
- warnx("malloc %lu bytes",
- (u_long)sizeof(struct xladdr_entry));
- goto out;
- }
- xl->xladdr = xladdr;
- if (prev_xl == NULL)
- LIST_INSERT_HEAD(&xladdr_head, xl, xladdr_entries);
- else
- LIST_INSERT_AFTER(prev_xl, xl, xladdr_entries);
- xl_total++;
- }
-
- while (*offset < buflen) {
- xraddr = (struct xsctp_raddr *)(buf + *offset);
- *offset += sizeof(struct xsctp_raddr);
- if (xraddr->last == 1)
- break;
-
- prev_xr = xr;
- xr = malloc(sizeof(struct xraddr_entry));
- if (xr == NULL) {
- warnx("malloc %lu bytes",
- (u_long)sizeof(struct xraddr_entry));
- goto out;
- }
- xr->xraddr = xraddr;
- if (prev_xr == NULL)
- LIST_INSERT_HEAD(&xraddr_head, xr, xraddr_entries);
- else
- LIST_INSERT_AFTER(prev_xr, xr, xraddr_entries);
- xr_total++;
- }
-
- /*
- * Let's print the address infos.
- */
- xl = LIST_FIRST(&xladdr_head);
- xr = LIST_FIRST(&xraddr_head);
- x_max = (xl_total > xr_total) ? xl_total : xr_total;
- for (i = 0; i < x_max; i++) {
- if (((*indent == 0) && i > 0) || *indent > 0)
- printf("%-11s ", " ");
-
- if (xl != NULL) {
- sa = &(xl->xladdr->address.sa);
- if ((sa->sa_family) == AF_INET)
- inetprint(&((struct sockaddr_in *)sa)->sin_addr,
- htons(xstcb->local_port),
- name, numeric_port);
-#ifdef INET6
- else {
- in6 = (struct sockaddr_in6 *)sa;
- inet6print(&in6->sin6_addr,
- htons(xstcb->local_port),
- name, numeric_port);
- }
-#endif
- }
-
- if (xr != NULL && !Lflag) {
- sa = &(xr->xraddr->address.sa);
- if ((sa->sa_family) == AF_INET)
- inetprint(&((struct sockaddr_in *)sa)->sin_addr,
- htons(xstcb->remote_port),
- name, numeric_port);
-#ifdef INET6
- else {
- in6 = (struct sockaddr_in6 *)sa;
- inet6print(&in6->sin6_addr,
- htons(xstcb->remote_port),
- name, numeric_port);
- }
-#endif
- }
-
- if (xl != NULL)
- xl = LIST_NEXT(xl, xladdr_entries);
- if (xr != NULL)
- xr = LIST_NEXT(xr, xraddr_entries);
-
- if (i == 0 && !Lflag)
- sctp_statesprint(xstcb->state);
-
- if (i < x_max)
- putchar('\n');
- }
-
-out:
- /*
- * Free the list which be used to handle the address.
- */
- xl = LIST_FIRST(&xladdr_head);
- while (xl != NULL) {
- xl_tmp = LIST_NEXT(xl, xladdr_entries);
- free(xl);
- xl = xl_tmp;
- }
-
- xr = LIST_FIRST(&xraddr_head);
- while (xr != NULL) {
- xr_tmp = LIST_NEXT(xr, xraddr_entries);
- free(xr);
- xr = xr_tmp;
- }
-}
-
-#ifdef SCTP_DEBUG
-uint32_t sctp_pdup[64];
-int sctp_pcnt = 0;
-#endif
-
-static void
-sctp_process_inpcb(struct xsctp_inpcb *xinpcb, const char *name,
- char *buf, const size_t buflen, size_t *offset)
-{
- int offset_backup, indent = 0, xladdr_total = 0, is_listening = 0;
- static int first = 1;
- char *tname;
- struct xsctp_tcb *xstcb;
- struct xsctp_laddr *xladdr;
- struct sockaddr *sa;
-#ifdef INET6
- struct sockaddr_in6 *in6;
-#endif
-
- if ((xinpcb->flags & SCTP_PCB_FLAGS_TCPTYPE) ==
- SCTP_PCB_FLAGS_TCPTYPE && xinpcb->maxqlen > 0)
- is_listening = 1;
-
- if (!Lflag && !is_listening &&
- !(xinpcb->flags & SCTP_PCB_FLAGS_CONNECTED)) {
-#ifdef SCTP_DEBUG
- int i, found = 0;
-
- for (i = 0; i < sctp_pcnt; i++) {
- if (sctp_pdup[i] == xinpcb->flags) {
- found = 1;
- break;
- }
- }
- if (!found) {
- sctp_pdup[sctp_pcnt++] = xinpcb->flags;
- if (sctp_pcnt >= 64)
- sctp_pcnt = 0;
- printf("[0x%08x]", xinpcb->flags);
- }
-#endif
- offset_backup = *offset;
- if (!sctp_skip_xinpcb_ifneed(buf, buflen, offset))
- return;
- *offset = offset_backup;
- }
-
- if (first) {
- if (!Lflag) {
- printf("Active SCTP associations");
- if (aflag)
- printf(" (including servers)");
- } else
- printf("Current listen queue sizes (qlen/maxqlen)");
- putchar('\n');
- if (Aflag)
- printf("%-8.8s ", "Socket");
- if (Lflag)
- printf("%-5.5s %-5.5s %-8.8s %-22.22s\n",
- "Proto", "Type", "Listen", "Local Address");
- else
- printf((Aflag && !Wflag) ?
- "%-5.5s %-5.5s %-18.18s %-18.18s %s\n" :
- "%-5.5s %-5.5s %-22.22s %-22.22s %s\n",
- "Proto", "Type",
- "Local Address", "Foreign Address",
- "(state)");
- first = 0;
- }
- if (Lflag && xinpcb->maxqlen == 0) {
- (int)sctp_skip_xinpcb_ifneed(buf, buflen, offset);
- return;
- }
- if (Aflag)
- printf("%8lx ", (u_long)xinpcb);
-
- printf("%-5.5s ", name);
-
- if (xinpcb->flags & SCTP_PCB_FLAGS_TCPTYPE)
- tname = "1to1";
- else if (xinpcb->flags & SCTP_PCB_FLAGS_UDPTYPE)
- tname = "1toN";
- else
- return;
-
- printf("%-5.5s ", tname);
-
- if (Lflag) {
- char buf1[9];
-
- snprintf(buf1, 9, "%hu/%hu", xinpcb->qlen, xinpcb->maxqlen);
- printf("%-8.8s ", buf1);
- }
- /*
- * process the local address. This routine are used for Lflag.
- */
- while (*offset < buflen) {
- xladdr = (struct xsctp_laddr *)(buf + *offset);
- *offset += sizeof(struct xsctp_laddr);
- if (xladdr->last == 1)
- break;
-
- if (!Lflag && !is_listening)
- continue;
-
- if (xladdr_total != 0)
- putchar('\n');
- if (xladdr_total > 0)
- printf((Lflag) ?
- "%-20.20s " : "%-11.11s ", " ");
-
- sa = &(xladdr->address.sa);
- if ((sa->sa_family) == AF_INET)
- inetprint(&((struct sockaddr_in *)sa)->sin_addr,
- htons(xinpcb->local_port), name, numeric_port);
-#ifdef INET6
- else {
- in6 = (struct sockaddr_in6 *)sa;
- inet6print(&in6->sin6_addr,
- htons(xinpcb->local_port), name, numeric_port);
- }
-#endif
-
- if (!Lflag && xladdr_total == 0 && is_listening == 1)
- printf("%-22.22s LISTEN", " ");
-
- xladdr_total++;
- }
-
- xstcb = (struct xsctp_tcb *)(buf + *offset);
- *offset += sizeof(struct xsctp_tcb);
- while (xstcb->last == 0 && *offset < buflen) {
- sctp_process_tcb(xstcb, name, buf, buflen, offset, &indent);
- indent++;
- xstcb = (struct xsctp_tcb *)(buf + *offset);
- *offset += sizeof(struct xsctp_tcb);
- }
-
- putchar('\n');
-}
-
-/*
- * Print a summary of SCTP connections related to an Internet
- * protocol.
- */
-void
-sctp_protopr(u_long off __unused,
- const char *name, int af1, int proto)
-{
- char *buf;
- const char *mibvar = "net.inet.sctp.assoclist";
- size_t offset = 0;
- size_t len = 0;
- struct xsctp_inpcb *xinpcb;
-
- if (proto != IPPROTO_SCTP)
- return;
-
- if (sysctlbyname(mibvar, 0, &len, 0, 0) < 0) {
- if (errno != ENOENT)
- warn("sysctl: %s", mibvar);
- return;
- }
- if ((buf = malloc(len)) == 0) {
- warnx("malloc %lu bytes", (u_long)len);
- return;
- }
- if (sysctlbyname(mibvar, buf, &len, 0, 0) < 0) {
- warn("sysctl: %s", mibvar);
- free(buf);
- return;
- }
-
- xinpcb = (struct xsctp_inpcb *)(buf + offset);
- offset += sizeof(struct xsctp_inpcb);
- while (xinpcb->last == 0 && offset < len) {
- sctp_process_inpcb(xinpcb, name, buf, (const size_t)len,
- &offset);
-
- xinpcb = (struct xsctp_inpcb *)(buf + offset);
- offset += sizeof(struct xsctp_inpcb);
- }
-
- free(buf);
-}
-
-static void
-sctp_statesprint(uint32_t state)
-{
- int idx;
-
- switch (state) {
- case SCTP_STATE_COOKIE_WAIT:
- idx = NETSTAT_SCTP_STATES_COOKIE_WAIT;
- break;
- case SCTP_STATE_COOKIE_ECHOED:
- idx = NETSTAT_SCTP_STATES_COOKIE_ECHOED;
- break;
- case SCTP_STATE_OPEN:
- idx = NETSTAT_SCTP_STATES_ESTABLISHED;
- break;
- case SCTP_STATE_SHUTDOWN_SENT:
- idx = NETSTAT_SCTP_STATES_SHUTDOWN_SENT;
- break;
- case SCTP_STATE_SHUTDOWN_RECEIVED:
- idx = NETSTAT_SCTP_STATES_SHUTDOWN_RECEIVED;
- break;
- case SCTP_STATE_SHUTDOWN_ACK_SENT:
- idx = NETSTAT_SCTP_STATES_SHUTDOWN_ACK_SENT;
- break;
- case SCTP_STATE_SHUTDOWN_PENDING:
- idx = NETSTAT_SCTP_STATES_SHUTDOWN_PENDING;
- break;
- default:
- printf("UNKNOWN 0x%08x", state);
- return;
- }
-
- printf("%s", sctpstates[idx]);
-}
-
-/*
- * Dump SCTP statistics structure.
- */
-void
-sctp_stats(u_long off, const char *name, int af1 __unused, int proto __unused)
-{
- struct sctpstat sctpstat, zerostat;
- size_t len = sizeof(sctpstat);
-
- if (live) {
- if (zflag)
- memset(&zerostat, 0, len);
- if (sysctlbyname("net.inet.sctp.stats", &sctpstat, &len,
- zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
- warn("sysctl: net.inet.sctp.stats");
- return;
- }
- } else
- kread(off, &sctpstat, len);
-
- printf ("%s:\n", name);
-
-#define p(f, m) if (sctpstat.f || sflag <= 1) \
- printf(m, (uintmax_t)sctpstat.f, plural(sctpstat.f))
-#define p1a(f, m) if (sctpstat.f || sflag <= 1) \
- printf(m, (uintmax_t)sctpstat.f)
-
- /*
- * input statistics
- */
- p(sctps_recvpackets, "\t%ju input packet%s\n");
- p(sctps_recvdatagrams, "\t\t%ju datagram%s\n");
- p(sctps_recvpktwithdata, "\t\t%ju packet%s that had data\n");
- p(sctps_recvsacks, "\t\t%ju input SACK chunk%s\n");
- p(sctps_recvdata, "\t\t%ju input DATA chunk%s\n");
- p(sctps_recvdupdata, "\t\t%ju duplicate DATA chunk%s\n");
- p(sctps_recvheartbeat, "\t\t%ju input HB chunk%s\n");
- p(sctps_recvheartbeatack, "\t\t%ju HB-ACK chunk%s\n");
- p(sctps_recvecne, "\t\t%ju input ECNE chunk%s\n");
- p(sctps_recvauth, "\t\t%ju input AUTH chunk%s\n");
- p(sctps_recvauthmissing, "\t\t%ju chunk%s missing AUTH\n");
- p(sctps_recvivalhmacid, "\t\t%ju invalid HMAC id%s received\n");
- p(sctps_recvivalkeyid, "\t\t%ju invalid secret id%s received\n");
- p1a(sctps_recvauthfailed, "\t\t%ju auth failed\n");
- p1a(sctps_recvexpress, "\t\t%ju fast path receives all one chunk\n");
- p1a(sctps_recvexpressm, "\t\t%ju fast path multi-part data\n");
-
- /*
- * output statistics
- */
- p(sctps_sendpackets, "\t%ju output packet%s\n");
- p(sctps_sendsacks, "\t\t%ju output SACK%s\n");
- p(sctps_senddata, "\t\t%ju output DATA chunk%s\n");
- p(sctps_sendretransdata, "\t\t%ju retransmitted DATA chunk%s\n");
- p(sctps_sendfastretrans, "\t\t%ju fast retransmitted DATA chunk%s\n");
- p(sctps_sendmultfastretrans, "\t\t%ju FR'%s that happened more "
- "than once to same chunk\n");
- p(sctps_sendheartbeat, "\t\t%ju intput HB chunk%s\n");
- p(sctps_sendecne, "\t\t%ju output ECNE chunk%s\n");
- p(sctps_sendauth, "\t\t%ju output AUTH chunk%s\n");
- p1a(sctps_senderrors, "\t\t%ju ip_output error counter\n");
-
- /*
- * PCKDROPREP statistics
- */
- printf("\tPacket drop statistics:\n");
- p1a(sctps_pdrpfmbox, "\t\t%ju from middle box\n");
- p1a(sctps_pdrpfehos, "\t\t%ju from end host\n");
- p1a(sctps_pdrpmbda, "\t\t%ju with data\n");
- p1a(sctps_pdrpmbct, "\t\t%ju non-data, non-endhost\n");
- p1a(sctps_pdrpbwrpt, "\t\t%ju non-endhost, bandwidth rep only\n");
- p1a(sctps_pdrpcrupt, "\t\t%ju not enough for chunk header\n");
- p1a(sctps_pdrpnedat, "\t\t%ju not enough data to confirm\n");
- p1a(sctps_pdrppdbrk, "\t\t%ju where process_chunk_drop said break\n");
- p1a(sctps_pdrptsnnf, "\t\t%ju failed to find TSN\n");
- p1a(sctps_pdrpdnfnd, "\t\t%ju attempt reverse TSN lookup\n");
- p1a(sctps_pdrpdiwnp, "\t\t%ju e-host confirms zero-rwnd\n");
- p1a(sctps_pdrpdizrw, "\t\t%ju midbox confirms no space\n");
- p1a(sctps_pdrpbadd, "\t\t%ju data did not match TSN\n");
- p(sctps_pdrpmark, "\t\t%ju TSN'%s marked for Fast Retran\n");
-
- /*
- * Timeouts
- */
- printf("\tTimeouts:\n");
- p(sctps_timoiterator, "\t\t%ju iterator timer%s fired\n");
- p(sctps_timodata, "\t\t%ju T3 data time out%s\n");
- p(sctps_timowindowprobe, "\t\t%ju window probe (T3) timer%s fired\n");
- p(sctps_timoinit, "\t\t%ju INIT timer%s fired\n");
- p(sctps_timosack, "\t\t%ju sack timer%s fired\n");
- p(sctps_timoshutdown, "\t\t%ju shutdown timer%s fired\n");
- p(sctps_timoheartbeat, "\t\t%ju heartbeat timer%s fired\n");
- p1a(sctps_timocookie, "\t\t%ju a cookie timeout fired\n");
- p1a(sctps_timosecret, "\t\t%ju an endpoint changed its cookie"
- "secret\n");
- p(sctps_timopathmtu, "\t\t%ju PMTU timer%s fired\n");
- p(sctps_timoshutdownack, "\t\t%ju shutdown ack timer%s fired\n");
- p(sctps_timoshutdownguard, "\t\t%ju shutdown guard timer%s fired\n");
- p(sctps_timostrmrst, "\t\t%ju stream reset timer%s fired\n");
- p(sctps_timoearlyfr, "\t\t%ju early FR timer%s fired\n");
- p1a(sctps_timoasconf, "\t\t%ju an asconf timer fired\n");
- p1a(sctps_timoautoclose, "\t\t%ju auto close timer fired\n");
- p(sctps_timoassockill, "\t\t%ju asoc free timer%s expired\n");
- p(sctps_timoinpkill, "\t\t%ju inp free timer%s expired\n");
-
-#if 0
- /*
- * Early fast retransmission counters
- */
- p(sctps_earlyfrstart, "\t%ju TODO:sctps_earlyfrstart\n");
- p(sctps_earlyfrstop, "\t%ju TODO:sctps_earlyfrstop\n");
- p(sctps_earlyfrmrkretrans, "\t%ju TODO:sctps_earlyfrmrkretrans\n");
- p(sctps_earlyfrstpout, "\t%ju TODO:sctps_earlyfrstpout\n");
- p(sctps_earlyfrstpidsck1, "\t%ju TODO:sctps_earlyfrstpidsck1\n");
- p(sctps_earlyfrstpidsck2, "\t%ju TODO:sctps_earlyfrstpidsck2\n");
- p(sctps_earlyfrstpidsck3, "\t%ju TODO:sctps_earlyfrstpidsck3\n");
- p(sctps_earlyfrstpidsck4, "\t%ju TODO:sctps_earlyfrstpidsck4\n");
- p(sctps_earlyfrstrid, "\t%ju TODO:sctps_earlyfrstrid\n");
- p(sctps_earlyfrstrout, "\t%ju TODO:sctps_earlyfrstrout\n");
- p(sctps_earlyfrstrtmr, "\t%ju TODO:sctps_earlyfrstrtmr\n");
-#endif
-
- /*
- * Others
- */
- p1a(sctps_hdrops, "\t%ju packet shorter than header\n");
- p1a(sctps_badsum, "\t%ju checksum error\n");
- p1a(sctps_noport, "\t%ju no endpoint for port\n");
- p1a(sctps_badvtag, "\t%ju bad v-tag\n");
- p1a(sctps_badsid, "\t%ju bad SID\n");
- p1a(sctps_nomem, "\t%ju no memory\n");
- p1a(sctps_fastretransinrtt, "\t%ju number of multiple FR in a RTT "
- "window\n");
-#if 0
- p(sctps_markedretrans, "\t%ju TODO:sctps_markedretrans\n");
-#endif
- p1a(sctps_naglesent, "\t%ju RFC813 allowed sending\n");
- p1a(sctps_naglequeued, "\t%ju RFC813 does not allow sending\n");
- p1a(sctps_maxburstqueued, "\t%ju times max burst prohibited sending\n");
- p1a(sctps_ifnomemqueued, "\t%ju look ahead tells us no memory in "
- "interface\n");
- p(sctps_windowprobed, "\t%ju number%s of window probes sent\n");
- p(sctps_lowlevelerr, "\t%ju time%s an output error to clamp "
- "down on next user send\n");
- p(sctps_lowlevelerrusr, "\t%ju time%s sctp_senderrors were "
- "caused from a user\n");
- p(sctps_datadropchklmt, "\t%ju number of in data drop%s due to "
- "chunk limit reached\n");
- p(sctps_datadroprwnd, "\t%ju number of in data drop%s due to rwnd "
- "limit reached\n");
- p(sctps_ecnereducedcwnd, "\t%ju time%s a ECN reduced "
- "the cwnd\n");
- p1a(sctps_vtagexpress, "\t%ju used express lookup via vtag\n");
- p1a(sctps_vtagbogus, "\t%ju collision in express lookup\n");
- p(sctps_primary_randry, "\t%ju time%s the sender ran dry "
- "of user data on primary\n");
- p1a(sctps_cmt_randry, "\t%ju same for above\n");
- p(sctps_slowpath_sack, "\t%ju sack%s the slow way\n");
- p(sctps_wu_sacks_sent, "\t%ju window update only sack%s sent\n");
- p(sctps_sends_with_flags, "\t%ju send%s with sinfo_flags !=0\n");
- p(sctps_sends_with_unord, "\t%ju unordered send%s\n");
- p(sctps_sends_with_eof, "\t%ju send%s with EOF flag set\n");
- p(sctps_sends_with_abort, "\t%ju send%s with ABORT flag set\n");
- p(sctps_protocol_drain_calls, "\t%ju time%s protocol drain called\n");
- p(sctps_protocol_drains_done, "\t%ju time%s we did a protocol "
- "drain\n");
- p(sctps_read_peeks, "\t%ju time%s recv was called with peek\n");
- p(sctps_cached_chk, "\t%ju cached chunk%s used\n");
- p1a(sctps_cached_strmoq, "\t%ju cached stream oq's used\n");
- p(sctps_left_abandon, "\t%ju unread message%s abandonded by close\n");
- p1a(sctps_send_burst_avoid, "\t%ju send burst avoidance, already "
- "max burst inflight to net\n");
- p1a(sctps_send_cwnd_avoid, "\t%ju send cwnd full avoidance, already "
- "max burst inflight to net\n");
- p(sctps_fwdtsn_map_over, "\t%ju number of map array over-run%s via "
- "fwd-tsn's\n");
-
-#undef p
-#undef p1a
-}
-
-#endif /* SCTP */
diff --git a/usr.bin/netstat/unix.c b/usr.bin/netstat/unix.c
deleted file mode 100644
index 0778bac..0000000
--- a/usr.bin/netstat/unix.c
+++ /dev/null
@@ -1,275 +0,0 @@
-/*-
- * Copyright (c) 1983, 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)unix.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Display protocol blocks in the unix domain.
- */
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/protosw.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/mbuf.h>
-#include <sys/sysctl.h>
-#include <sys/un.h>
-#include <sys/unpcb.h>
-
-#include <netinet/in.h>
-
-#include <errno.h>
-#include <err.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <strings.h>
-#include <kvm.h>
-#include "netstat.h"
-
-static void unixdomainpr(struct xunpcb *, struct xsocket *);
-
-static const char *const socktype[] =
- { "#0", "stream", "dgram", "raw", "rdm", "seqpacket" };
-
-static int
-pcblist_sysctl(int type, char **bufp)
-{
- char *buf;
- size_t len;
- char mibvar[sizeof "net.local.seqpacket.pcblist"];
-
- sprintf(mibvar, "net.local.%s.pcblist", socktype[type]);
-
- len = 0;
- if (sysctlbyname(mibvar, 0, &len, 0, 0) < 0) {
- if (errno != ENOENT)
- warn("sysctl: %s", mibvar);
- return (-1);
- }
- if ((buf = malloc(len)) == 0) {
- warnx("malloc %lu bytes", (u_long)len);
- return (-2);
- }
- if (sysctlbyname(mibvar, buf, &len, 0, 0) < 0) {
- warn("sysctl: %s", mibvar);
- free(buf);
- return (-2);
- }
- *bufp = buf;
- return (0);
-}
-
-static int
-pcblist_kvm(u_long count_off, u_long gencnt_off, u_long head_off, char **bufp)
-{
- struct unp_head head;
- struct unpcb *unp, unp_conn;
- u_char sun_len;
- struct socket so;
- struct xunpgen xug;
- struct xunpcb xu;
- unp_gen_t unp_gencnt;
- u_int unp_count;
- char *buf, *p;
- size_t len;
-
- if (count_off == 0 || gencnt_off == 0)
- return (-2);
- if (head_off == 0)
- return (-1);
- kread(count_off, &unp_count, sizeof(unp_count));
- len = 2 * sizeof(xug) + (unp_count + unp_count / 8) * sizeof(xu);
- if ((buf = malloc(len)) == 0) {
- warnx("malloc %lu bytes", (u_long)len);
- return (-2);
- }
- p = buf;
-
-#define COPYOUT(obj, size) do { \
- if (len < (size)) { \
- warnx("buffer size exceeded"); \
- goto fail; \
- } \
- bcopy((obj), p, (size)); \
- len -= (size); \
- p += (size); \
-} while (0)
-
-#define KREAD(off, buf, len) do { \
- if (kread((uintptr_t)(off), (buf), (len)) != 0) \
- goto fail; \
-} while (0)
-
- /* Write out header. */
- kread(gencnt_off, &unp_gencnt, sizeof(unp_gencnt));
- xug.xug_len = sizeof xug;
- xug.xug_count = unp_count;
- xug.xug_gen = unp_gencnt;
- xug.xug_sogen = 0;
- COPYOUT(&xug, sizeof xug);
-
- /* Walk the PCB list. */
- xu.xu_len = sizeof xu;
- KREAD(head_off, &head, sizeof(head));
- LIST_FOREACH(unp, &head, unp_link) {
- xu.xu_unpp = unp;
- KREAD(unp, &xu.xu_unp, sizeof (*unp));
- unp = &xu.xu_unp;
-
- if (unp->unp_gencnt > unp_gencnt)
- continue;
- if (unp->unp_addr != NULL) {
- KREAD(unp->unp_addr, &sun_len, sizeof(sun_len));
- KREAD(unp->unp_addr, &xu.xu_addr, sun_len);
- }
- if (unp->unp_conn != NULL) {
- KREAD(unp->unp_conn, &unp_conn, sizeof(unp_conn));
- if (unp_conn.unp_addr != NULL) {
- KREAD(unp_conn.unp_addr, &sun_len,
- sizeof(sun_len));
- KREAD(unp_conn.unp_addr, &xu.xu_caddr, sun_len);
- }
- }
- KREAD(unp->unp_socket, &so, sizeof(so));
- if (sotoxsocket(&so, &xu.xu_socket) != 0)
- goto fail;
- COPYOUT(&xu, sizeof(xu));
- }
-
- /* Reread the counts and write the footer. */
- kread(count_off, &unp_count, sizeof(unp_count));
- kread(gencnt_off, &unp_gencnt, sizeof(unp_gencnt));
- xug.xug_count = unp_count;
- xug.xug_gen = unp_gencnt;
- COPYOUT(&xug, sizeof xug);
-
- *bufp = buf;
- return (0);
-
-fail:
- free(buf);
- return (-1);
-#undef COPYOUT
-#undef KREAD
-}
-
-void
-unixpr(u_long count_off, u_long gencnt_off, u_long dhead_off, u_long shead_off)
-{
- char *buf;
- int ret, type;
- struct xsocket *so;
- struct xunpgen *xug, *oxug;
- struct xunpcb *xunp;
-
- for (type = SOCK_STREAM; type <= SOCK_SEQPACKET; type++) {
- if (live)
- ret = pcblist_sysctl(type, &buf);
- else
- ret = pcblist_kvm(count_off, gencnt_off,
- type == SOCK_STREAM ? shead_off :
- (type == SOCK_DGRAM ? dhead_off : 0), &buf);
- if (ret == -1)
- continue;
- if (ret < 0)
- return;
-
- oxug = xug = (struct xunpgen *)buf;
- for (xug = (struct xunpgen *)((char *)xug + xug->xug_len);
- xug->xug_len > sizeof(struct xunpgen);
- xug = (struct xunpgen *)((char *)xug + xug->xug_len)) {
- xunp = (struct xunpcb *)xug;
- so = &xunp->xu_socket;
-
- /* Ignore PCBs which were freed during copyout. */
- if (xunp->xu_unp.unp_gencnt > oxug->xug_gen)
- continue;
- unixdomainpr(xunp, so);
- }
- if (xug != oxug && xug->xug_gen != oxug->xug_gen) {
- if (oxug->xug_count > xug->xug_count) {
- printf("Some %s sockets may have been deleted.\n",
- socktype[type]);
- } else if (oxug->xug_count < xug->xug_count) {
- printf("Some %s sockets may have been created.\n",
- socktype[type]);
- } else {
- printf("Some %s sockets may have been created or deleted",
- socktype[type]);
- }
- }
- free(buf);
- }
-}
-
-static void
-unixdomainpr(struct xunpcb *xunp, struct xsocket *so)
-{
- struct unpcb *unp;
- struct sockaddr_un *sa;
- static int first = 1;
-
- unp = &xunp->xu_unp;
- if (unp->unp_addr)
- sa = &xunp->xu_addr;
- else
- sa = (struct sockaddr_un *)0;
-
- if (first) {
- printf("Active UNIX domain sockets\n");
- printf(
-"%-8.8s %-6.6s %-6.6s %-6.6s %8.8s %8.8s %8.8s %8.8s Addr\n",
- "Address", "Type", "Recv-Q", "Send-Q",
- "Inode", "Conn", "Refs", "Nextref");
- first = 0;
- }
- printf("%8lx %-6.6s %6u %6u %8lx %8lx %8lx %8lx",
- (long)so->so_pcb, socktype[so->so_type], so->so_rcv.sb_cc,
- so->so_snd.sb_cc,
- (long)unp->unp_vnode, (long)unp->unp_conn,
- (long)LIST_FIRST(&unp->unp_refs), (long)LIST_NEXT(unp, unp_reflink));
- if (sa)
- printf(" %.*s",
- (int)(sa->sun_len - offsetof(struct sockaddr_un, sun_path)),
- sa->sun_path);
- putchar('\n');
-}
diff --git a/usr.bin/newgrp/Makefile b/usr.bin/newgrp/Makefile
deleted file mode 100644
index 8195348..0000000
--- a/usr.bin/newgrp/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-# $FreeBSD$
-
-PROG= newgrp
-DPADD= ${LIBCRYPT} ${LIBUTIL}
-LDADD= -lcrypt -lutil
-
-.if defined(ENABLE_SUID_NEWGRP)
-BINMODE= 4555
-PRECIOUSPROG=
-.endif
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/newgrp/newgrp.1 b/usr.bin/newgrp/newgrp.1
deleted file mode 100644
index 44ab9fd..0000000
--- a/usr.bin/newgrp/newgrp.1
+++ /dev/null
@@ -1,95 +0,0 @@
-.\" Copyright (c) 2002 Tim J. Robbins.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd May 23, 2002
-.Dt NEWGRP 1
-.Os
-.Sh NAME
-.Nm newgrp
-.Nd change to a new group
-.Sh SYNOPSIS
-.Nm
-.Op Fl l
-.Op Ar group
-.Sh DESCRIPTION
-The
-.Nm
-utility creates a new shell execution environment with modified
-real and effective group IDs.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl l
-Simulate a full login.
-The environment and umask are set to what would be expected if the user
-actually logged in again.
-.El
-.Pp
-If the
-.Ar group
-operand is present, a new shell is started with the specified effective
-and real group IDs.
-The user will be prompted for a password if they are not a member of the
-specified group.
-.Pp
-Otherwise, the real, effective and supplementary group IDs are restored to
-those from the current user's password database entry.
-.Sh EXIT STATUS
-The
-.Nm
-utility attempts to start the shell regardless of whether group IDs
-were successfully changed.
-.Pp
-If an error occurs and the shell cannot be started,
-.Nm
-exits >0.
-Otherwise, the exit status of
-.Nm
-is the exit status of the shell.
-.Sh SEE ALSO
-.Xr csh 1 ,
-.Xr groups 1 ,
-.Xr login 1 ,
-.Xr sh 1 ,
-.Xr su 1 ,
-.Xr umask 1 ,
-.Xr group 5 ,
-.Xr passwd 5 ,
-.Xr environ 7
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-.Sh HISTORY
-A
-.Nm
-utility appeared in
-.At v6 .
-.Sh BUGS
-Group passwords are inherently insecure as there is no way to stop
-users obtaining the crypted passwords from the group database.
-Their use is discouraged.
diff --git a/usr.bin/newgrp/newgrp.c b/usr.bin/newgrp/newgrp.c
deleted file mode 100644
index 62d552f..0000000
--- a/usr.bin/newgrp/newgrp.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/*-
- * Copyright (c) 2002 Tim J. Robbins.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * newgrp -- change to a new group
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <err.h>
-#include <errno.h>
-#include <grp.h>
-#include <libgen.h>
-#include <limits.h>
-#include <login_cap.h>
-#include <paths.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-static void addgroup(const char *grpname);
-static void doshell(void);
-static int inarray(gid_t, const gid_t[], int);
-static void loginshell(void);
-static void restoregrps(void);
-static void usage(void);
-
-static struct passwd *pwd;
-static uid_t euid;
-
-extern char **environ;
-
-/* Manipulate effective user ID. */
-#define PRIV_START do { \
- if (seteuid(euid) < 0) \
- err(1, "seteuid"); \
- } while (0)
-#define PRIV_END do { \
- if (seteuid(getuid()) < 0) \
- err(1, "seteuid"); \
- } while (0)
-
-int
-main(int argc, char *argv[])
-{
- int ch, login;
-
- euid = geteuid();
- if (seteuid(getuid()) < 0)
- err(1, "seteuid");
-
- if ((pwd = getpwuid(getuid())) == NULL)
- errx(1, "unknown user");
-
- login = 0;
- while ((ch = getopt(argc, argv, "-l")) != -1) {
- switch (ch) {
- case '-': /* Obsolescent */
- case 'l':
- login = 1;
- break;
- default:
- usage();
- }
- }
- argc -= optind;
- argv += optind;
-
- switch (argc) {
- case 0:
- restoregrps();
- break;
- case 1:
- addgroup(*argv);
- break;
- default:
- usage();
- }
-
- if (seteuid(euid) < 0)
- err(1, "seteuid");
- if (setuid(getuid()) < 0)
- err(1, "setuid");
-
- if (login)
- loginshell();
- else
- doshell();
-
- /*NOTREACHED*/
- exit(1);
-}
-
-static void
-usage(void)
-{
-
- fprintf(stderr, "usage: newgrp [-l] [group]\n");
- exit(1);
-}
-
-static void
-restoregrps(void)
-{
- int initres, setres;
-
- PRIV_START;
- initres = initgroups(pwd->pw_name, pwd->pw_gid);
- setres = setgid(pwd->pw_gid);
- PRIV_END;
-
- if (initres < 0)
- warn("initgroups");
- if (setres < 0)
- warn("setgroups");
-}
-
-static void
-addgroup(const char *grpname)
-{
- gid_t grps[NGROUPS_MAX];
- long lgid;
- int dbmember, i, ngrps;
- gid_t egid;
- struct group *grp;
- char *ep, *pass;
- char **p;
-
- egid = getegid();
-
- /* Try it as a group name, then a group id. */
- if ((grp = getgrnam(grpname)) == NULL)
- if ((lgid = strtol(grpname, &ep, 10)) <= 0 || *ep != '\0' ||
- (grp = getgrgid((gid_t)lgid)) == NULL ) {
- warnx("%s: bad group name", grpname);
- return;
- }
-
- /*
- * If the user is not a member of the requested group and the group
- * has a password, prompt and check it.
- */
- dbmember = 0;
- if (pwd->pw_gid == grp->gr_gid)
- dbmember = 1;
- for (p = grp->gr_mem; *p != NULL; p++)
- if (strcmp(*p, pwd->pw_name) == 0) {
- dbmember = 1;
- break;
- }
- if (!dbmember && *grp->gr_passwd != '\0' && getuid() != 0) {
- pass = getpass("Password:");
- if (pass == NULL ||
- strcmp(grp->gr_passwd, crypt(pass, grp->gr_passwd)) != 0) {
- fprintf(stderr, "Sorry\n");
- return;
- }
- }
-
- if ((ngrps = getgroups(NGROUPS_MAX, (gid_t *)grps)) < 0) {
- warn("getgroups");
- return;
- }
-
- /* Remove requested gid from supp. list if it exists. */
- if (grp->gr_gid != egid && inarray(grp->gr_gid, grps, ngrps)) {
- for (i = 0; i < ngrps; i++)
- if (grps[i] == grp->gr_gid)
- break;
- ngrps--;
- memmove(&grps[i], &grps[i + 1], (ngrps - i) * sizeof(gid_t));
- PRIV_START;
- if (setgroups(ngrps, (const gid_t *)grps) < 0) {
- PRIV_END;
- warn("setgroups");
- return;
- }
- PRIV_END;
- }
-
- PRIV_START;
- if (setgid(grp->gr_gid)) {
- PRIV_END;
- warn("setgid");
- return;
- }
- PRIV_END;
- grps[0] = grp->gr_gid;
-
- /* Add old effective gid to supp. list if it does not exist. */
- if (egid != grp->gr_gid && !inarray(egid, grps, ngrps)) {
- if (ngrps == NGROUPS_MAX)
- warnx("too many groups");
- else {
- grps[ngrps++] = egid;
- PRIV_START;
- if (setgroups(ngrps, (const gid_t *)grps)) {
- PRIV_END;
- warn("setgroups");
- return;
- }
- PRIV_END;
- }
- }
-
-}
-
-static int
-inarray(gid_t gid, const gid_t grps[], int ngrps)
-{
- int i;
-
- for (i = 0; i < ngrps; i++)
- if (grps[i] == gid)
- return (1);
- return (0);
-}
-
-/*
- * Set the environment to what would be expected if the user logged in
- * again; this performs the same steps as su(1)'s -l option.
- */
-static void
-loginshell(void)
-{
- char *args[2], **cleanenv, *term, *ticket;
- const char *shell;
- login_cap_t *lc;
-
- shell = pwd->pw_shell;
- if (*shell == '\0')
- shell = _PATH_BSHELL;
- if (chdir(pwd->pw_dir) < 0) {
- warn("%s", pwd->pw_dir);
- chdir("/");
- }
-
- term = getenv("TERM");
- ticket = getenv("KRBTKFILE");
-
- if ((cleanenv = calloc(20, sizeof(char *))) == NULL)
- err(1, "calloc");
- *cleanenv = NULL;
- environ = cleanenv;
-
- lc = login_getpwclass(pwd);
- setusercontext(lc, pwd, pwd->pw_uid,
- LOGIN_SETPATH|LOGIN_SETUMASK|LOGIN_SETENV);
- login_close(lc);
- setenv("USER", pwd->pw_name, 1);
- setenv("SHELL", shell, 1);
- setenv("HOME", pwd->pw_dir, 1);
- if (term != NULL)
- setenv("TERM", term, 1);
- if (ticket != NULL)
- setenv("KRBTKFILE", ticket, 1);
-
- if (asprintf(args, "-%s", basename(shell)) < 0)
- err(1, "asprintf");
- args[1] = NULL;
-
- execv(shell, args);
- err(1, "%s", shell);
-}
-
-static void
-doshell(void)
-{
- const char *shell;
-
- shell = pwd->pw_shell;
- if (*shell == '\0')
- shell = _PATH_BSHELL;
- execl(shell, basename(shell), (char *)NULL);
- err(1, "%s", shell);
-}
diff --git a/usr.bin/newkey/Makefile b/usr.bin/newkey/Makefile
deleted file mode 100644
index b3b5b51..0000000
--- a/usr.bin/newkey/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-# $FreeBSD$
-
-.include <bsd.own.mk>
-
-PROG= newkey
-SRCS= newkey.c generic.c update.c
-.if ${MK_NIS} != "no"
-CFLAGS+= -DYP
-.endif
-MAN= newkey.8
-DPADD= ${LIBRPCSVC} ${LIBMP} ${LIBCRYPTO}
-LDADD= -lrpcsvc -lmp -lcrypto
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/newkey/extern.h b/usr.bin/newkey/extern.h
deleted file mode 100644
index 7a5fb42..0000000
--- a/usr.bin/newkey/extern.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user or with the express written consent of
- * Sun Microsystems, Inc.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- *
- * $FreeBSD$
- */
-
-#ifdef YP
-#define MAXMAPNAMELEN 256
-#else
-#define YPOP_CHANGE 1 /* change, do not add */
-#define YPOP_INSERT 2 /* add, do not change */
-#define YPOP_DELETE 3 /* delete this entry */
-#define YPOP_STORE 4 /* add, or change */
-#endif
-
-void genkeys(char *, char *, char *);
-int setpublicmap(char *, char *, char *);
-int mapupdate(char *, char *, u_int, u_int, char *, u_int, char *);
-void xencrypt(char *, char *);
-void xdecrypt(char *, char *);
-int localupdate(char *, char *, u_int, u_int, char *, u_int, char *);
diff --git a/usr.bin/newkey/generic.c b/usr.bin/newkey/generic.c
deleted file mode 100644
index 3572df9..0000000
--- a/usr.bin/newkey/generic.c
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user or with the express written consent of
- * Sun Microsystems, Inc.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#if !defined(lint) && defined(SCCSIDS)
-#if 0
-static char sccsid[] = "@(#)generic.c 1.2 91/03/11 Copyr 1986 Sun Micro";
-#endif
-#endif
-
-/*
- * Copyright (C) 1986, Sun Microsystems, Inc.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/file.h>
-
-#include <rpc/rpc.h>
-#include <rpc/key_prot.h>
-
-#include <mp.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "extern.h"
-
-static void adjust(char[], char *);
-static void getseed(char *, int, unsigned char *);
-
-/*
- * Generate a seed
- */
-static void
-getseed(char *seed, int seedsize, unsigned char *pass)
-{
- int i;
-
- for (i = 0; i < seedsize; i++) {
- seed[i] = (arc4random() & 0xff) ^ pass[i % 8];
- }
-}
-
-/*
- * Generate a random public/secret key pair
- */
-void
-genkeys(char *public, char *secret, char *pass)
-{
- unsigned int i;
-
-# define BASEBITS (8*sizeof (short) - 1)
-# define BASE (1 << BASEBITS)
-
- MINT *pk = itom(0);
- MINT *sk = itom(0);
- MINT *tmp;
- MINT *base = itom(BASE);
- MINT *root = itom(PROOT);
- MINT *modulus = xtom(HEXMODULUS);
- short r;
- unsigned short seed[KEYSIZE/BASEBITS + 1];
- char *xkey;
-
- getseed((char *)seed, sizeof (seed), (u_char *)pass);
- for (i = 0; i < KEYSIZE/BASEBITS + 1; i++) {
- r = seed[i] % BASE;
- tmp = itom(r);
- mult(sk, base, sk);
- madd(sk, tmp, sk);
- mfree(tmp);
- }
- tmp = itom(0);
- mdiv(sk, modulus, tmp, sk);
- mfree(tmp);
- pow(root, sk, modulus, pk);
- xkey = mtox(sk);
- adjust(secret, xkey);
- xkey = mtox(pk);
- adjust(public, xkey);
- mfree(sk);
- mfree(base);
- mfree(pk);
- mfree(root);
- mfree(modulus);
-}
-
-/*
- * Adjust the input key so that it is 0-filled on the left
- */
-static void
-adjust(char keyout[HEXKEYBYTES+1], char *keyin)
-{
- char *p;
- char *s;
-
- for (p = keyin; *p; p++)
- ;
- for (s = keyout + HEXKEYBYTES; p >= keyin; p--, s--) {
- *s = *p;
- }
- while (s >= keyout) {
- *s-- = '0';
- }
-}
diff --git a/usr.bin/newkey/newkey.8 b/usr.bin/newkey/newkey.8
deleted file mode 100644
index 09b00e9..0000000
--- a/usr.bin/newkey/newkey.8
+++ /dev/null
@@ -1,59 +0,0 @@
-.\" @(#)newkey.8 1.3 91/03/11 TIRPC 1.0; from 1.12 90/02/03 SMI;
-.\" $FreeBSD$
-.Dd October 12, 1987
-.Dt NEWKEY 8
-.Os
-.Sh NAME
-.Nm newkey
-.Nd create a new key in the publickey database
-.Sh SYNOPSIS
-.Nm
-.Fl h Ar hostname
-.Nm
-.Fl u Ar username
-.Sh DESCRIPTION
-The
-.Nm
-utility is normally run by the network administrator on the
-Network Interface Service
-(\s-1NIS\s0)
-master machine in order to establish public keys for
-users and super-users on the network.
-These keys are needed for using secure
-RPC
-or secure
-NFS\s0.
-.Pp
-The
-.Nm
-utility will prompt for the login password of the given username and then
-create a new public/secret key pair in
-.Pa /etc/publickey
-encrypted with the login password of the given user.
-.Pp
-Use of this program is
-not required: users may create their own keys using
-.Xr chkey 1 .
-.Sh OPTIONS
-.Bl -tag -width indent
-.It Fl h Ar hostname
-Create a new public key for the super-user at the given hostname.
-Prompts for the root password of the given hostname.
-.It Fl u Ar username
-Create a new public key for the given username.
-Prompts for the
-NIS
-password of the given username.
-.El
-.Sh SEE ALSO
-.Xr chkey 1 ,
-.Xr keylogin 1 ,
-.Xr publickey 5 ,
-.Xr keyserv 8
-.Sh NOTES
-The Network Information Service
-(\s-1NIS\s0)
-was formerly known as Sun Yellow Pages
-(\s-1YP\s0).
-The functionality of the two remains the same;
-only the name has changed.
diff --git a/usr.bin/newkey/newkey.c b/usr.bin/newkey/newkey.c
deleted file mode 100644
index 22d34e7..0000000
--- a/usr.bin/newkey/newkey.c
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user or with the express written consent of
- * Sun Microsystems, Inc.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#if !defined(lint) && defined(SCCSIDS)
-#if 0
-static char sccsid[] = "@(#)newkey.c 1.8 91/03/11 Copyr 1986 Sun Micro";
-#endif
-#endif
-
-/*
- * Copyright (C) 1986, Sun Microsystems, Inc.
- */
-
-/*
- * Administrative tool to add a new user to the publickey database
- */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-
-#include <rpc/rpc.h>
-#include <rpc/key_prot.h>
-
-#ifdef YP
-#include <sys/wait.h>
-#include <rpcsvc/yp_prot.h>
-#include <rpcsvc/ypclnt.h>
-#include <netdb.h>
-#endif /* YP */
-
-#include <err.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-#ifdef YP
-#define MAXMAPNAMELEN 256
-#else
-#define YPOP_CHANGE 1 /* change, do not add */
-#define YPOP_INSERT 2 /* add, do not change */
-#define YPOP_DELETE 3 /* delete this entry */
-#define YPOP_STORE 4 /* add, or change */
-#define ERR_ACCESS 1
-#define ERR_MALLOC 2
-#define ERR_READ 3
-#define ERR_WRITE 4
-#define ERR_DBASE 5
-#define ERR_KEY 6
-#endif
-
-#ifdef YP
-static char YPDBPATH[]="/var/yp";
-static char PKMAP[] = "publickey.byname";
-#else
-static char PKFILE[] = "/etc/publickey";
-static char *err_string();
-#endif /* YP */
-
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- char name[MAXNETNAMELEN + 1];
- char public[HEXKEYBYTES + 1];
- char secret[HEXKEYBYTES + 1];
- char crypt1[HEXKEYBYTES + KEYCHECKSUMSIZE + 1];
- char crypt2[HEXKEYBYTES + KEYCHECKSUMSIZE + 1];
- int status;
- char *pass;
- struct passwd *pw;
-#ifdef undef
- struct hostent *h;
-#endif
-
- if (argc != 3 || !(strcmp(argv[1], "-u") == 0 ||
- strcmp(argv[1], "-h") == 0)) {
- usage();
- }
- if (geteuid() != 0)
- errx(1, "must be superuser");
-
-#ifdef YP
- if (chdir(YPDBPATH) < 0)
- warn("cannot chdir to %s", YPDBPATH);
-#endif /* YP */
- if (strcmp(argv[1], "-u") == 0) {
- pw = getpwnam(argv[2]);
- if (pw == NULL)
- errx(1, "unknown user: %s", argv[2]);
- (void)user2netname(name, (int)pw->pw_uid, (char *)NULL);
- } else {
-#ifdef undef
- h = gethostbyname(argv[2]);
- if (h == NULL)
- errx(1, "unknown host: %s", argv[1]);
- (void)host2netname(name, h->h_name, (char *)NULL);
-#else
- (void)host2netname(name, argv[2], (char *)NULL);
-#endif
- }
-
- (void)printf("Adding new key for %s.\n", name);
- pass = getpass("New password:");
- genkeys(public, secret, pass);
-
- memcpy(crypt1, secret, HEXKEYBYTES);
- memcpy(crypt1 + HEXKEYBYTES, secret, KEYCHECKSUMSIZE);
- crypt1[HEXKEYBYTES + KEYCHECKSUMSIZE] = 0;
- xencrypt(crypt1, pass);
-
- memcpy(crypt2, crypt1, HEXKEYBYTES + KEYCHECKSUMSIZE + 1);
- xdecrypt(crypt2, getpass("Retype password:"));
- if (memcmp(crypt2, crypt2 + HEXKEYBYTES, KEYCHECKSUMSIZE) != 0 ||
- memcmp(crypt2, secret, HEXKEYBYTES) != 0)
- errx(1, "password incorrect");
-
-#ifdef YP
- (void)printf("Please wait for the database to get updated...\n");
-#endif
- if ((status = setpublicmap(name, public, crypt1))) {
-#ifdef YP
- errx(1, "unable to update NIS database (%u): %s",
- status, yperr_string(status));
-#else
- errx(1, "unable to update publickey database (%u): %s",
- status, err_string(status));
-#endif
- }
- (void)printf("Your new key has been successfully stored away.\n");
- exit(0);
- /* NOTREACHED */
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "%s\n%s\n",
- "usage: newkey -h hostname",
- " newkey -u username");
- exit(1);
-}
-
-/*
- * Set the entry in the public key file
- */
-int
-setpublicmap(char *name, char *public, char *secret)
-{
- char pkent[1024];
-
- (void)sprintf(pkent, "%s:%s", public, secret);
-#ifdef YP
- return (mapupdate(name, PKMAP, YPOP_STORE,
- strlen(name), name, strlen(pkent), pkent));
-#else
- return (localupdate(name, PKFILE, YPOP_STORE,
- strlen(name), name, strlen(pkent), pkent));
-#endif
- }
-
-#ifndef YP
- /*
- * This returns a pointer to an error message string appropriate
- * to an input error code. An input value of zero will return
- * a success message.
- */
-static char *
-err_string(int code)
-{
- char *pmesg;
-
- switch (code) {
- case 0:
- pmesg = "update operation succeeded";
- break;
- case ERR_KEY:
- pmesg = "no such key in file";
- break;
- case ERR_READ:
- pmesg = "cannot read the database";
- break;
- case ERR_WRITE:
- pmesg = "cannot write to the database";
- break;
- case ERR_DBASE:
- pmesg = "cannot update database";
- break;
- case ERR_ACCESS:
- pmesg = "permission denied";
- break;
- case ERR_MALLOC:
- pmesg = "malloc failed";
- break;
- default:
- pmesg = "unknown error";
- break;
- }
- return (pmesg);
-}
-#endif
diff --git a/usr.bin/newkey/update.c b/usr.bin/newkey/update.c
deleted file mode 100644
index 533568f..0000000
--- a/usr.bin/newkey/update.c
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user or with the express written consent of
- * Sun Microsystems, Inc.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)update.c 1.2 91/03/11 Copyr 1986 Sun Micro";
-#endif
-#endif
-
-/*
- * Copyright (C) 1986, 1989, Sun Microsystems, Inc.
- */
-
-/*
- * Administrative tool to add a new user to the publickey database
- */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-
-#include <rpc/rpc.h>
-#include <rpc/key_prot.h>
-
-#ifdef YP
-#include <sys/wait.h>
-#include <rpcsvc/yp_prot.h>
-#include <rpcsvc/ypclnt.h>
-#include <netdb.h>
-#endif /* YP */
-
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-#ifdef YP
-static char SHELL[] = "/bin/sh";
-static char YPDBPATH[]="/var/yp"; /* This is defined but not used! */
-static char UPDATEFILE[] = "updaters";
-#else
-static char PKFILE[] = "/etc/publickey";
-#endif /* YP */
-
-#ifdef YP
-static int _openchild(char *, FILE **, FILE **);
-static char *basename(char *path);
-
-/*
- * Determine if requester is allowed to update the given map,
- * and update it if so. Returns the yp status, which is zero
- * if there is no access violation.
- */
-int
-mapupdate(char *requester, char *mapname, u_int op, u_int keylen,
- char *key, u_int datalen, char *data)
-{
- char updater[MAXMAPNAMELEN + 40];
- FILE *childargs;
- FILE *childrslt;
-#ifdef WEXITSTATUS
- int status;
-#else
- union wait status;
-#endif
- pid_t pid;
- u_int yperrno;
-
-
-#ifdef DEBUG
- printf("%s %s\n", key, data);
-#endif
- (void)sprintf(updater, "make -s -f %s/%s %s", YPDBPATH, /* !!! */
- UPDATEFILE, mapname);
- pid = _openchild(updater, &childargs, &childrslt);
- if (pid < 0) {
- return (YPERR_YPERR);
- }
-
- /*
- * Write to child
- */
- (void)fprintf(childargs, "%s\n", requester);
- (void)fprintf(childargs, "%u\n", op);
- (void)fprintf(childargs, "%u\n", keylen);
- (void)fwrite(key, (int)keylen, 1, childargs);
- (void)fprintf(childargs, "\n");
- (void)fprintf(childargs, "%u\n", datalen);
- (void)fwrite(data, (int)datalen, 1, childargs);
- (void)fprintf(childargs, "\n");
- (void)fclose(childargs);
-
- /*
- * Read from child
- */
- (void)fscanf(childrslt, "%d", &yperrno);
- (void)fclose(childrslt);
-
- (void)wait(&status);
-#ifdef WEXITSTATUS
- if (WEXITSTATUS(status) != 0) {
-#else
- if (status.w_retcode != 0) {
-#endif
- return (YPERR_YPERR);
- }
- return (yperrno);
-}
-
-/*
- * returns pid, or -1 for failure
- */
-static pid_t
-_openchild(char *command, FILE **fto, FILE **ffrom)
-{
- int i;
- pid_t pid;
- int pdto[2];
- int pdfrom[2];
- char *com;
- struct rlimit rl;
-
- if (pipe(pdto) < 0) {
- goto error1;
- }
- if (pipe(pdfrom) < 0) {
- goto error2;
- }
- switch (pid = fork()) {
- case -1:
- goto error3;
-
- case 0:
- /*
- * child: read from pdto[0], write into pdfrom[1]
- */
- (void)close(0);
- (void)dup(pdto[0]);
- (void)close(1);
- (void)dup(pdfrom[1]);
- getrlimit(RLIMIT_NOFILE, &rl);
- for (i = rl.rlim_max - 1; i >= 3; i--) {
- (void) close(i);
- }
- com = malloc((unsigned) strlen(command) + 6);
- if (com == NULL) {
- _exit(~0);
- }
- (void)sprintf(com, "exec %s", command);
- execl(SHELL, basename(SHELL), "-c", com, (char *)NULL);
- _exit(~0);
-
- default:
- /*
- * parent: write into pdto[1], read from pdfrom[0]
- */
- *fto = fdopen(pdto[1], "w");
- (void)close(pdto[0]);
- *ffrom = fdopen(pdfrom[0], "r");
- (void)close(pdfrom[1]);
- break;
- }
- return (pid);
-
- /*
- * error cleanup and return
- */
-error3:
- (void)close(pdfrom[0]);
- (void)close(pdfrom[1]);
-error2:
- (void)close(pdto[0]);
- (void)close(pdto[1]);
-error1:
- return (-1);
-}
-
-static char *
-basename(char *path)
-{
- char *p;
-
- p = strrchr(path, '/');
- if (p == NULL) {
- return (path);
- } else {
- return (p + 1);
- }
-}
-
-#else /* YP */
-
-#define ERR_ACCESS 1
-#define ERR_MALLOC 2
-#define ERR_READ 3
-#define ERR_WRITE 4
-#define ERR_DBASE 5
-#define ERR_KEY 6
-
-static int match(char *, char *);
-
-/*
- * Determine if requester is allowed to update the given map,
- * and update it if so. Returns the status, which is zero
- * if there is no access violation. This function updates
- * the local file and then shuts up.
- */
-int
-localupdate(char *name, char *filename, u_int op, u_int keylen,
- char *key, u_int datalen, char *data)
-{
- char line[256];
- FILE *rf;
- FILE *wf;
- char *tmpname;
- int err;
-
- /*
- * Check permission
- */
- if (strcmp(name, key) != 0) {
- return (ERR_ACCESS);
- }
- if (strcmp(name, "nobody") == 0) {
- /*
- * Can't change "nobody"s key.
- */
- return (ERR_ACCESS);
- }
-
- /*
- * Open files
- */
- tmpname = malloc(strlen(filename) + 4);
- if (tmpname == NULL) {
- return (ERR_MALLOC);
- }
- sprintf(tmpname, "%s.tmp", filename);
- rf = fopen(filename, "r");
- if (rf == NULL) {
- return (ERR_READ);
- }
- wf = fopen(tmpname, "w");
- if (wf == NULL) {
- return (ERR_WRITE);
- }
- err = -1;
- while (fgets(line, sizeof (line), rf)) {
- if (err < 0 && match(line, name)) {
- switch (op) {
- case YPOP_INSERT:
- err = ERR_KEY;
- break;
- case YPOP_STORE:
- case YPOP_CHANGE:
- fprintf(wf, "%s %s\n", key, data);
- err = 0;
- break;
- case YPOP_DELETE:
- /* do nothing */
- err = 0;
- break;
- }
- } else {
- fputs(line, wf);
- }
- }
- if (err < 0) {
- switch (op) {
- case YPOP_CHANGE:
- case YPOP_DELETE:
- err = ERR_KEY;
- break;
- case YPOP_INSERT:
- case YPOP_STORE:
- err = 0;
- fprintf(wf, "%s %s\n", key, data);
- break;
- }
- }
- fclose(wf);
- fclose(rf);
- if (err == 0) {
- if (rename(tmpname, filename) < 0) {
- return (ERR_DBASE);
- }
- } else {
- if (unlink(tmpname) < 0) {
- return (ERR_DBASE);
- }
- }
- return (err);
-}
-
-static int
-match(char *line, char *name)
-{
- int len;
-
- len = strlen(name);
- return (strncmp(line, name, len) == 0 &&
- (line[len] == ' ' || line[len] == '\t'));
-}
-#endif /* !YP */
diff --git a/usr.bin/nfsstat/Makefile b/usr.bin/nfsstat/Makefile
deleted file mode 100644
index ce4c7c6..0000000
--- a/usr.bin/nfsstat/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= nfsstat
-CFLAGS+=-DNFS
-DPADD= ${LIBKVM}
-LDADD= -lkvm
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/nfsstat/nfsstat.1 b/usr.bin/nfsstat/nfsstat.1
deleted file mode 100644
index a7c2a13..0000000
--- a/usr.bin/nfsstat/nfsstat.1
+++ /dev/null
@@ -1,106 +0,0 @@
-.\" Copyright (c) 1989, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" From: @(#)nfsstat.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd October 18, 2007
-.Dt NFSSTAT 1
-.Os
-.Sh NAME
-.Nm nfsstat
-.Nd display
-.Tn NFS
-statistics
-.Sh SYNOPSIS
-.Nm
-.Op Fl cszW
-.Op Fl M Ar core
-.Op Fl N Ar system
-.Op Fl w Ar wait
-.Sh DESCRIPTION
-The
-.Nm
-command displays statistics kept about
-.Tn NFS
-client and server activity.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl c
-Only display client side statistics.
-.It Fl M
-Extract values associated with the name list from the specified core
-instead of the default
-.Pa /dev/kmem .
-.It Fl N
-Extract the name list from the specified system instead of the default
-.Pa /boot/kernel/kernel .
-.It Fl s
-Only display server side statistics.
-.It Fl W
-Use wide format with interval short summary.
-This option is especially
-useful when combined with
-.Fl c
-or
-.Fl s
-and a time delay.
-.It Fl w
-Display a shorter summary of
-.Tn NFS
-activity for both the client and server at
-.Ar wait
-second intervals.
-.It Fl z
-Reset statistics after displaying them.
-.El
-.Sh FILES
-.Bl -tag -width ".Pa /boot/kernel/kernel" -compact
-.It Pa /boot/kernel/kernel
-default kernel namelist
-.It Pa /dev/kmem
-default memory file
-.El
-.Sh SEE ALSO
-.Xr fstat 1 ,
-.Xr netstat 1 ,
-.Xr ps 1 ,
-.Xr systat 1 ,
-.Xr sysctl 3 ,
-.Xr iostat 8 ,
-.Xr pstat 8 ,
-.Xr vmstat 8
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.4 .
diff --git a/usr.bin/nfsstat/nfsstat.c b/usr.bin/nfsstat/nfsstat.c
deleted file mode 100644
index 5a1495a..0000000
--- a/usr.bin/nfsstat/nfsstat.c
+++ /dev/null
@@ -1,519 +0,0 @@
-/*
- * Copyright (c) 1983, 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Rick Macklem at The University of Guelph.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1983, 1989, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)nfsstat.c 8.2 (Berkeley) 3/31/95";
-#endif
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/mount.h>
-#include <sys/time.h>
-#include <sys/sysctl.h>
-#include <nfs/rpcv2.h>
-#include <nfs/nfsproto.h>
-#include <nfsclient/nfs.h>
-#include <nfsserver/nfs.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <ctype.h>
-#include <errno.h>
-#include <kvm.h>
-#include <limits.h>
-#include <nlist.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <paths.h>
-#include <err.h>
-
-struct nlist nl[] = {
-#define N_NFSSTAT 0
- { "nfsstats" },
-#define N_NFSRVSTAT 1
- { "nfsrvstats" },
- "",
-};
-kvm_t *kd;
-
-static int deadkernel = 0;
-static int widemode = 0;
-static int zflag = 0;
-
-void intpr(int, int);
-void printhdr(int, int);
-void sidewaysintpr(u_int, int, int);
-void usage(void);
-char *sperc1(int, int);
-char *sperc2(int, int);
-
-#define DELTA(field) (nfsstats.field - lastst.field)
-
-int
-main(int argc, char **argv)
-{
- u_int interval;
- int clientOnly = -1;
- int serverOnly = -1;
- int ch;
- char *memf, *nlistf;
- char errbuf[_POSIX2_LINE_MAX];
-
- interval = 0;
- memf = nlistf = NULL;
- while ((ch = getopt(argc, argv, "csWM:N:w:z")) != -1)
- switch(ch) {
- case 'M':
- memf = optarg;
- break;
- case 'N':
- nlistf = optarg;
- break;
- case 'W':
- widemode = 1;
- break;
- case 'w':
- interval = atoi(optarg);
- break;
- case 'c':
- clientOnly = 1;
- if (serverOnly < 0)
- serverOnly = 0;
- break;
- case 's':
- serverOnly = 1;
- if (clientOnly < 0)
- clientOnly = 0;
- break;
- case 'z':
- zflag = 1;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
-#define BACKWARD_COMPATIBILITY
-#ifdef BACKWARD_COMPATIBILITY
- if (*argv) {
- interval = atoi(*argv);
- if (*++argv) {
- nlistf = *argv;
- if (*++argv)
- memf = *argv;
- }
- }
-#endif
- if (nlistf != NULL || memf != NULL) {
- deadkernel = 1;
-
- if ((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY,
- errbuf)) == 0) {
- errx(1, "kvm_openfiles: %s", errbuf);
- }
- if (kvm_nlist(kd, nl) != 0) {
- errx(1, "kvm_nlist: can't get names");
- }
- }
-
- if (interval)
- sidewaysintpr(interval, clientOnly, serverOnly);
- else
- intpr(clientOnly, serverOnly);
- exit(0);
-}
-
-/*
- * Read the nfs stats using sysctl(3) for live kernels, or kvm_read
- * for dead ones.
- */
-void
-readstats(struct nfsstats **stp, struct nfsrvstats **srvstp, int zero)
-{
- union {
- struct nfsstats client;
- struct nfsrvstats server;
- } zerostat;
- size_t buflen;
-
- if (deadkernel) {
- if (*stp != NULL && kvm_read(kd, (u_long)nl[N_NFSSTAT].n_value,
- *stp, sizeof(struct nfsstats)) < 0) {
- *stp = NULL;
- }
- if (*srvstp != NULL && kvm_read(kd,
- (u_long)nl[N_NFSRVSTAT].n_value, *srvstp,
- sizeof(struct nfsrvstats)) < 0) {
- *srvstp = NULL;
- }
- } else {
- if (zero)
- bzero(&zerostat, sizeof(zerostat));
- buflen = sizeof(struct nfsstats);
- if (*stp != NULL && sysctlbyname("vfs.nfs.nfsstats", *stp,
- &buflen, zero ? &zerostat : NULL, zero ? buflen : 0) < 0) {
- if (errno != ENOENT)
- err(1, "sysctl: vfs.nfs.nfsstats");
- *stp = NULL;
- }
- buflen = sizeof(struct nfsrvstats);
- if (*srvstp != NULL && sysctlbyname("vfs.nfsrv.nfsrvstats",
- *srvstp, &buflen, zero ? &zerostat : NULL,
- zero ? buflen : 0) < 0) {
- if (errno != ENOENT)
- err(1, "sysctl: vfs.nfsrv.nfsrvstats");
- *srvstp = NULL;
- }
- }
-}
-
-/*
- * Print a description of the nfs stats.
- */
-void
-intpr(int clientOnly, int serverOnly)
-{
- struct nfsstats nfsstats, *nfsstatsp;
- struct nfsrvstats nfsrvstats, *nfsrvstatsp;
-
- /*
- * Only read the stats we are going to display to avoid zeroing
- * stats the user didn't request.
- */
- if (clientOnly)
- nfsstatsp = &nfsstats;
- else
- nfsstatsp = NULL;
- if (serverOnly)
- nfsrvstatsp = &nfsrvstats;
- else
- nfsrvstatsp = NULL;
-
- readstats(&nfsstatsp, &nfsrvstatsp, zflag);
-
- if (clientOnly && !nfsstatsp) {
- printf("Client not present!\n");
- clientOnly = 0;
- }
- if (clientOnly) {
- printf("Client Info:\n");
- printf("Rpc Counts:\n");
- printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n",
- "Getattr", "Setattr", "Lookup", "Readlink", "Read",
- "Write", "Create", "Remove");
- printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
- nfsstats.rpccnt[NFSPROC_GETATTR],
- nfsstats.rpccnt[NFSPROC_SETATTR],
- nfsstats.rpccnt[NFSPROC_LOOKUP],
- nfsstats.rpccnt[NFSPROC_READLINK],
- nfsstats.rpccnt[NFSPROC_READ],
- nfsstats.rpccnt[NFSPROC_WRITE],
- nfsstats.rpccnt[NFSPROC_CREATE],
- nfsstats.rpccnt[NFSPROC_REMOVE]);
- printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n",
- "Rename", "Link", "Symlink", "Mkdir", "Rmdir",
- "Readdir", "RdirPlus", "Access");
- printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
- nfsstats.rpccnt[NFSPROC_RENAME],
- nfsstats.rpccnt[NFSPROC_LINK],
- nfsstats.rpccnt[NFSPROC_SYMLINK],
- nfsstats.rpccnt[NFSPROC_MKDIR],
- nfsstats.rpccnt[NFSPROC_RMDIR],
- nfsstats.rpccnt[NFSPROC_READDIR],
- nfsstats.rpccnt[NFSPROC_READDIRPLUS],
- nfsstats.rpccnt[NFSPROC_ACCESS]);
- printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n",
- "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit");
- printf("%9d %9d %9d %9d %9d\n",
- nfsstats.rpccnt[NFSPROC_MKNOD],
- nfsstats.rpccnt[NFSPROC_FSSTAT],
- nfsstats.rpccnt[NFSPROC_FSINFO],
- nfsstats.rpccnt[NFSPROC_PATHCONF],
- nfsstats.rpccnt[NFSPROC_COMMIT]);
- printf("Rpc Info:\n");
- printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n",
- "TimedOut", "Invalid", "X Replies", "Retries",
- "Requests");
- printf("%9d %9d %9d %9d %9d\n",
- nfsstats.rpctimeouts,
- nfsstats.rpcinvalid,
- nfsstats.rpcunexpected,
- nfsstats.rpcretries,
- nfsstats.rpcrequests);
- printf("Cache Info:\n");
- printf("%9.9s %9.9s %9.9s %9.9s",
- "Attr Hits", "Misses", "Lkup Hits", "Misses");
- printf(" %9.9s %9.9s %9.9s %9.9s\n",
- "BioR Hits", "Misses", "BioW Hits", "Misses");
- printf("%9d %9d %9d %9d",
- nfsstats.attrcache_hits, nfsstats.attrcache_misses,
- nfsstats.lookupcache_hits, nfsstats.lookupcache_misses);
- printf(" %9d %9d %9d %9d\n",
- nfsstats.biocache_reads-nfsstats.read_bios,
- nfsstats.read_bios,
- nfsstats.biocache_writes-nfsstats.write_bios,
- nfsstats.write_bios);
- printf("%9.9s %9.9s %9.9s %9.9s",
- "BioRLHits", "Misses", "BioD Hits", "Misses");
- printf(" %9.9s %9.9s\n", "DirE Hits", "Misses");
- printf("%9d %9d %9d %9d",
- nfsstats.biocache_readlinks-nfsstats.readlink_bios,
- nfsstats.readlink_bios,
- nfsstats.biocache_readdirs-nfsstats.readdir_bios,
- nfsstats.readdir_bios);
- printf(" %9d %9d\n",
- nfsstats.direofcache_hits, nfsstats.direofcache_misses);
- }
- if (serverOnly && !nfsrvstatsp) {
- printf("Server not present!\n");
- serverOnly = 0;
- }
- if (serverOnly) {
- printf("\nServer Info:\n");
- printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n",
- "Getattr", "Setattr", "Lookup", "Readlink", "Read",
- "Write", "Create", "Remove");
- printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
- nfsrvstats.srvrpccnt[NFSPROC_GETATTR],
- nfsrvstats.srvrpccnt[NFSPROC_SETATTR],
- nfsrvstats.srvrpccnt[NFSPROC_LOOKUP],
- nfsrvstats.srvrpccnt[NFSPROC_READLINK],
- nfsrvstats.srvrpccnt[NFSPROC_READ],
- nfsrvstats.srvrpccnt[NFSPROC_WRITE],
- nfsrvstats.srvrpccnt[NFSPROC_CREATE],
- nfsrvstats.srvrpccnt[NFSPROC_REMOVE]);
- printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n",
- "Rename", "Link", "Symlink", "Mkdir", "Rmdir",
- "Readdir", "RdirPlus", "Access");
- printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
- nfsrvstats.srvrpccnt[NFSPROC_RENAME],
- nfsrvstats.srvrpccnt[NFSPROC_LINK],
- nfsrvstats.srvrpccnt[NFSPROC_SYMLINK],
- nfsrvstats.srvrpccnt[NFSPROC_MKDIR],
- nfsrvstats.srvrpccnt[NFSPROC_RMDIR],
- nfsrvstats.srvrpccnt[NFSPROC_READDIR],
- nfsrvstats.srvrpccnt[NFSPROC_READDIRPLUS],
- nfsrvstats.srvrpccnt[NFSPROC_ACCESS]);
- printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n",
- "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit");
- printf("%9d %9d %9d %9d %9d\n",
- nfsrvstats.srvrpccnt[NFSPROC_MKNOD],
- nfsrvstats.srvrpccnt[NFSPROC_FSSTAT],
- nfsrvstats.srvrpccnt[NFSPROC_FSINFO],
- nfsrvstats.srvrpccnt[NFSPROC_PATHCONF],
- nfsrvstats.srvrpccnt[NFSPROC_COMMIT]);
- printf("Server Ret-Failed\n");
- printf("%17d\n", nfsrvstats.srvrpc_errs);
- printf("Server Faults\n");
- printf("%13d\n", nfsrvstats.srv_errs);
- printf("Server Cache Stats:\n");
- printf("%9.9s %9.9s %9.9s %9.9s\n",
- "Inprog", "Idem", "Non-idem", "Misses");
- printf("%9d %9d %9d %9d\n",
- nfsrvstats.srvcache_inproghits,
- nfsrvstats.srvcache_idemdonehits,
- nfsrvstats.srvcache_nonidemdonehits,
- nfsrvstats.srvcache_misses);
- printf("Server Write Gathering:\n");
- printf("%9.9s %9.9s %9.9s\n",
- "WriteOps", "WriteRPC", "Opsaved");
- printf("%9d %9d %9d\n",
- nfsrvstats.srvvop_writes,
- nfsrvstats.srvrpccnt[NFSPROC_WRITE],
- nfsrvstats.srvrpccnt[NFSPROC_WRITE] -
- nfsrvstats.srvvop_writes);
- }
-}
-
-u_char signalled; /* set if alarm goes off "early" */
-
-/*
- * Print a running summary of nfs statistics.
- * Repeat display every interval seconds, showing statistics
- * collected over that interval. Assumes that interval is non-zero.
- * First line printed at top of screen is always cumulative.
- */
-void
-sidewaysintpr(u_int interval, int clientOnly, int serverOnly)
-{
- struct nfsstats nfsstats, lastst, *nfsstatsp;
- struct nfsrvstats nfsrvstats, lastsrvst, *nfsrvstatsp;
- int hdrcnt = 1;
-
- nfsstatsp = &lastst;
- nfsrvstatsp = &lastsrvst;
- readstats(&nfsstatsp, &nfsrvstatsp, 0);
- if (clientOnly && !nfsstatsp) {
- printf("Client not present!\n");
- clientOnly = 0;
- }
- if (serverOnly && !nfsrvstatsp) {
- printf("Server not present!\n");
- serverOnly = 0;
- }
- sleep(interval);
-
- for (;;) {
- nfsstatsp = &nfsstats;
- nfsrvstatsp = &nfsrvstats;
- readstats(&nfsstatsp, &nfsrvstatsp, 0);
-
- if (--hdrcnt == 0) {
- printhdr(clientOnly, serverOnly);
- if (clientOnly && serverOnly)
- hdrcnt = 10;
- else
- hdrcnt = 20;
- }
- if (clientOnly) {
- printf("%s %6d %6d %6d %6d %6d %6d %6d %6d",
- ((clientOnly && serverOnly) ? "Client:" : ""),
- DELTA(attrcache_hits) + DELTA(attrcache_misses),
- DELTA(lookupcache_hits) + DELTA(lookupcache_misses),
- DELTA(biocache_readlinks),
- DELTA(biocache_reads),
- DELTA(biocache_writes),
- nfsstats.rpccnt[NFSPROC_RENAME]-lastst.rpccnt[NFSPROC_RENAME],
- DELTA(accesscache_hits) + DELTA(accesscache_misses),
- DELTA(biocache_readdirs)
- );
- if (widemode) {
- printf(" %s %s %s %s %s %s",
- sperc1(DELTA(attrcache_hits),
- DELTA(attrcache_misses)),
- sperc1(DELTA(lookupcache_hits),
- DELTA(lookupcache_misses)),
- sperc2(DELTA(biocache_reads),
- DELTA(read_bios)),
- sperc2(DELTA(biocache_writes),
- DELTA(write_bios)),
- sperc1(DELTA(accesscache_hits),
- DELTA(accesscache_misses)),
- sperc2(DELTA(biocache_readdirs),
- DELTA(readdir_bios))
- );
- }
- printf("\n");
- lastst = nfsstats;
- }
- if (serverOnly) {
- printf("%s %6d %6d %6d %6d %6d %6d %6d %6d",
- ((clientOnly && serverOnly) ? "Server:" : ""),
- nfsrvstats.srvrpccnt[NFSPROC_GETATTR]-lastsrvst.srvrpccnt[NFSPROC_GETATTR],
- nfsrvstats.srvrpccnt[NFSPROC_LOOKUP]-lastsrvst.srvrpccnt[NFSPROC_LOOKUP],
- nfsrvstats.srvrpccnt[NFSPROC_READLINK]-lastsrvst.srvrpccnt[NFSPROC_READLINK],
- nfsrvstats.srvrpccnt[NFSPROC_READ]-lastsrvst.srvrpccnt[NFSPROC_READ],
- nfsrvstats.srvrpccnt[NFSPROC_WRITE]-lastsrvst.srvrpccnt[NFSPROC_WRITE],
- nfsrvstats.srvrpccnt[NFSPROC_RENAME]-lastsrvst.srvrpccnt[NFSPROC_RENAME],
- nfsrvstats.srvrpccnt[NFSPROC_ACCESS]-lastsrvst.srvrpccnt[NFSPROC_ACCESS],
- (nfsrvstats.srvrpccnt[NFSPROC_READDIR]-lastsrvst.srvrpccnt[NFSPROC_READDIR])
- +(nfsrvstats.srvrpccnt[NFSPROC_READDIRPLUS]-lastsrvst.srvrpccnt[NFSPROC_READDIRPLUS]));
- printf("\n");
- lastsrvst = nfsrvstats;
- }
- fflush(stdout);
- sleep(interval);
- }
- /*NOTREACHED*/
-}
-
-void
-printhdr(int clientOnly, int serverOnly)
-{
- printf("%s%6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s",
- ((serverOnly && clientOnly) ? " " : " "),
- "GtAttr", "Lookup", "Rdlink", "Read", "Write", "Rename",
- "Access", "Rddir");
- if (widemode && clientOnly) {
- printf(" Attr Lkup BioR BioW Accs BioD");
- }
- printf("\n");
- fflush(stdout);
-}
-
-void
-usage(void)
-{
- (void)fprintf(stderr,
- "usage: nfsstat [-cszW] [-M core] [-N system] [-w interval]\n");
- exit(1);
-}
-
-static char SPBuf[64][8];
-static int SPIndex;
-
-char *
-sperc1(int hits, int misses)
-{
- char *p = SPBuf[SPIndex];
-
- if (hits + misses) {
- sprintf(p, "%3d%%",
- (int)(char)((quad_t)hits * 100 / (hits + misses)));
- } else {
- sprintf(p, " -");
- }
- SPIndex = (SPIndex + 1) & 63;
- return(p);
-}
-
-char *
-sperc2(int ttl, int misses)
-{
- char *p = SPBuf[SPIndex];
-
- if (ttl) {
- sprintf(p, "%3d%%",
- (int)(char)((quad_t)(ttl - misses) * 100 / ttl));
- } else {
- sprintf(p, " -");
- }
- SPIndex = (SPIndex + 1) & 63;
- return(p);
-}
-
diff --git a/usr.bin/nice/Makefile b/usr.bin/nice/Makefile
deleted file mode 100644
index 0d2733a..0000000
--- a/usr.bin/nice/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= nice
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/nice/nice.1 b/usr.bin/nice/nice.1
deleted file mode 100644
index eb804bd..0000000
--- a/usr.bin/nice/nice.1
+++ /dev/null
@@ -1,124 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)nice.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 6, 1993
-.Dt NICE 1
-.Os
-.Sh NAME
-.Nm nice
-.Nd execute a utility at an altered scheduling priority
-.Sh SYNOPSIS
-.Nm
-.Op Fl n Ar increment
-.Ar utility
-.Op Ar argument ...
-.Sh DESCRIPTION
-The
-.Nm
-utility runs
-.Ar utility
-at an altered scheduling priority, by incrementing its
-.Dq nice
-value by the specified
-.Ar increment ,
-or a default value of 10.
-The lower the nice value of a process, the higher its scheduling priority.
-.Pp
-The superuser may specify a negative increment in order to run a utility
-with a higher scheduling priority.
-.Pp
-Some shells may provide a builtin
-.Nm
-command which is similar or identical to this utility.
-Consult the
-.Xr builtin 1
-manual page.
-.Sh ENVIRONMENT
-The
-.Ev PATH
-environment variable is used to locate the requested
-.Ar utility
-if the name contains no
-.Ql /
-characters.
-.Sh EXIT STATUS
-If
-.Ar utility
-is invoked, the exit status of
-.Nm
-is the exit status of
-.Ar utility .
-.Pp
-An exit status of 126 indicates
-.Ar utility
-was found, but could not be executed.
-An exit status of 127 indicates
-.Ar utility
-could not be found.
-.Sh EXAMPLES
-Execute utility
-.Sq date
-at priority 5 assuming the priority of the
-shell is 0:
-.Pp
-.Dl "nice -n 5 date"
-.Pp
-Execute utility
-.Sq date
-at priority -19 assuming the priority of the
-shell is 0 and you are the super-user:
-.Pp
-.Dl "nice -n 16 nice -n -35 date"
-.Sh COMPATIBILITY
-The traditional
-.Fl Ns Ar increment
-option has been deprecated but is still supported.
-.Sh SEE ALSO
-.Xr builtin 1 ,
-.Xr csh 1 ,
-.Xr idprio 1 ,
-.Xr rtprio 1 ,
-.Xr getpriority 2 ,
-.Xr setpriority 2 ,
-.Xr renice 8
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-.Sh HISTORY
-A
-.Nm
-utility appeared in
-.At v4 .
diff --git a/usr.bin/nice/nice.c b/usr.bin/nice/nice.c
deleted file mode 100644
index 1aed481..0000000
--- a/usr.bin/nice/nice.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (c) 1989, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1989, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)nice.c 8.2 (Berkeley) 4/16/94";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-
-#define DEFNICE 10
-
-void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- long niceness = DEFNICE;
- int ch;
- char *ep;
-
- /* Obsolescent syntax: -number, --number */
- if (argc >= 2 && argv[1][0] == '-' && (argv[1][1] == '-' ||
- isdigit((unsigned char)argv[1][1])) && strcmp(argv[1], "--") != 0)
- if (asprintf(&argv[1], "-n%s", argv[1] + 1) < 0)
- err(1, "asprintf");
-
- while ((ch = getopt(argc, argv, "n:")) != -1) {
- switch (ch) {
- case 'n':
- errno = 0;
- niceness = strtol(optarg, &ep, 10);
- if (ep == optarg || *ep != '\0' || errno ||
- niceness < INT_MIN || niceness > INT_MAX)
- errx(1, "%s: invalid nice value", optarg);
- break;
- default:
- usage();
- }
- }
- argc -= optind;
- argv += optind;
-
- if (argc == 0)
- usage();
-
- errno = 0;
- niceness += getpriority(PRIO_PROCESS, 0);
- if (errno)
- warn("getpriority");
- else if (setpriority(PRIO_PROCESS, 0, (int)niceness))
- warn("setpriority");
- execvp(*argv, argv);
- err(errno == ENOENT ? 127 : 126, "%s", *argv);
-}
-
-void
-usage(void)
-{
-
- (void)fprintf(stderr,
- "usage: nice [-n increment] utility [argument ...]\n");
- exit(1);
-}
diff --git a/usr.bin/nl/Makefile b/usr.bin/nl/Makefile
deleted file mode 100644
index 9b1f292..0000000
--- a/usr.bin/nl/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-PROG= nl
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/nl/nl.1 b/usr.bin/nl/nl.1
deleted file mode 100644
index f21ce93..0000000
--- a/usr.bin/nl/nl.1
+++ /dev/null
@@ -1,253 +0,0 @@
-.\" $FreeBSD$
-.\"
-.\" Copyright (c) 1999 The NetBSD Foundation, Inc.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to The NetBSD Foundation
-.\" by Klaus Klein.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the NetBSD
-.\" Foundation, Inc. and its contributors.
-.\" 4. Neither the name of The NetBSD Foundation nor the names of its
-.\" contributors may be used to endorse or promote products derived
-.\" from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-.\" POSSIBILITY OF SUCH DAMAGE.
-.\"
-.Dd January 26, 2005
-.Dt NL 1
-.Os
-.Sh NAME
-.Nm nl
-.Nd line numbering filter
-.Sh SYNOPSIS
-.Nm
-.Op Fl p
-.Bk -words
-.Op Fl b Ar type
-.Ek
-.Bk -words
-.Op Fl d Ar delim
-.Ek
-.Bk -words
-.Op Fl f Ar type
-.Ek
-.Bk -words
-.Op Fl h Ar type
-.Ek
-.Bk -words
-.Op Fl i Ar incr
-.Ek
-.Bk -words
-.Op Fl l Ar num
-.Ek
-.Bk -words
-.Op Fl n Ar format
-.Ek
-.Bk -words
-.Op Fl s Ar sep
-.Ek
-.Bk -words
-.Op Fl v Ar startnum
-.Ek
-.Bk -words
-.Op Fl w Ar width
-.Ek
-.Op Ar file
-.Sh DESCRIPTION
-The
-.Nm
-utility reads lines from the named
-.Ar file
-or the standard input if the
-.Ar file
-argument is omitted,
-applies a configurable line numbering filter operation and writes the result
-to the standard output.
-.Pp
-The
-.Nm
-utility treats the text it reads in terms of logical pages.
-Unless specified otherwise, line numbering is reset at the start of each
-logical page.
-A logical page consists of a header, a body and a footer
-section; empty sections are valid.
-Different line numbering options are
-independently available for header, body and footer sections.
-.Pp
-The starts of logical page sections are signalled by input lines containing
-nothing but one of the following sequences of delimiter characters:
-.Pp
-.Bl -column "\e:\e:\e:" "Start of" -offset indent
-.Em "Line Start of"
-.It "\e:\e:\e: header"
-.It "\e:\e: body"
-.It "\e: footer"
-.El
-.Pp
-If the input does not contain any logical page section signalling directives,
-the text being read is assumed to consist of a single logical page body.
-.Pp
-The following options are available:
-.Bl -tag -width ".Fl v Ar startnum"
-.It Fl b Ar type
-Specify the logical page body lines to be numbered.
-Recognized
-.Ar type
-arguments are:
-.Bl -tag -width indent
-.It Cm a
-Number all lines.
-.It Cm t
-Number only non-empty lines.
-.It Cm n
-No line numbering.
-.It Cm p Ns Ar expr
-Number only those lines that contain the basic regular expression specified
-by
-.Ar expr .
-.El
-.Pp
-The default
-.Ar type
-for logical page body lines is
-.Cm t .
-.It Fl d Ar delim
-Specify the delimiter characters used to indicate the start of a logical
-page section in the input file.
-At most two characters may be specified;
-if only one character is specified, the first character is replaced and the
-second character remains unchanged.
-The default
-.Ar delim
-characters are
-.Dq Li \e: .
-.It Fl f Ar type
-Specify the same as
-.Fl b Ar type
-except for logical page footer lines.
-The default
-.Ar type
-for logical page footer lines is
-.Cm n .
-.It Fl h Ar type
-Specify the same as
-.Fl b Ar type
-except for logical page header lines.
-The default
-.Ar type
-for logical page header lines is
-.Cm n .
-.It Fl i Ar incr
-Specify the increment value used to number logical page lines.
-The default
-.Ar incr
-value is 1.
-.It Fl l Ar num
-If numbering of all lines is specified for the current logical section
-using the corresponding
-.Fl b Cm a ,
-.Fl f Cm a
-or
-.Fl h Cm a
-option,
-specify the number of adjacent blank lines to be considered as one.
-For example,
-.Fl l
-2 results in only the second adjacent blank line being numbered.
-The default
-.Ar num
-value is 1.
-.It Fl n Ar format
-Specify the line numbering output format.
-Recognized
-.Ar format
-arguments are:
-.Bl -tag -width indent -compact
-.It Cm ln
-Left justified.
-.It Cm rn
-Right justified, leading zeros suppressed.
-.It Cm rz
-Right justified, leading zeros kept.
-.El
-.Pp
-The default
-.Ar format
-is
-.Cm rn .
-.It Fl p
-Specify that line numbering should not be restarted at logical page delimiters.
-.It Fl s Ar sep
-Specify the characters used in separating the line number and the corresponding
-text line.
-The default
-.Ar sep
-setting is a single tab character.
-.It Fl v Ar startnum
-Specify the initial value used to number logical page lines; see also the
-description of the
-.Fl p
-option.
-The default
-.Ar startnum
-value is 1.
-.It Fl w Ar width
-Specify the number of characters to be occupied by the line number;
-in case the
-.Ar width
-is insufficient to hold the line number, it will be truncated to its
-.Ar width
-least significant digits.
-The default
-.Ar width
-is 6.
-.El
-.Sh ENVIRONMENT
-The
-.Ev LANG , LC_ALL , LC_CTYPE
-and
-.Ev LC_COLLATE
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr jot 1 ,
-.Xr pr 1
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-.Sh HISTORY
-The
-.Nm
-utility first appeared in
-.At V.2 .
-.Sh BUGS
-Input lines are limited to
-.Dv LINE_MAX
-(2048) bytes in length.
diff --git a/usr.bin/nl/nl.c b/usr.bin/nl/nl.c
deleted file mode 100644
index afc3c860..0000000
--- a/usr.bin/nl/nl.c
+++ /dev/null
@@ -1,425 +0,0 @@
-/*-
- * Copyright (c) 1999 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Klaus Klein.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#ifndef lint
-__COPYRIGHT(
-"@(#) Copyright (c) 1999\
- The NetBSD Foundation, Inc. All rights reserved.");
-__RCSID("$FreeBSD$");
-#endif
-
-#include <sys/types.h>
-
-#include <err.h>
-#include <errno.h>
-#include <limits.h>
-#include <locale.h>
-#include <regex.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-
-typedef enum {
- number_all, /* number all lines */
- number_nonempty, /* number non-empty lines */
- number_none, /* no line numbering */
- number_regex /* number lines matching regular expression */
-} numbering_type;
-
-struct numbering_property {
- const char * const name; /* for diagnostics */
- numbering_type type; /* numbering type */
- regex_t expr; /* for type == number_regex */
-};
-
-/* line numbering formats */
-#define FORMAT_LN "%-*d" /* left justified, leading zeros suppressed */
-#define FORMAT_RN "%*d" /* right justified, leading zeros suppressed */
-#define FORMAT_RZ "%0*d" /* right justified, leading zeros kept */
-
-#define FOOTER 0
-#define BODY 1
-#define HEADER 2
-#define NP_LAST HEADER
-
-static struct numbering_property numbering_properties[NP_LAST + 1] = {
- { "footer", number_none },
- { "body", number_nonempty },
- { "header", number_none }
-};
-
-#define max(a, b) ((a) > (b) ? (a) : (b))
-
-/*
- * Maximum number of characters required for a decimal representation of a
- * (signed) int; courtesy of tzcode.
- */
-#define INT_STRLEN_MAXIMUM \
- ((sizeof (int) * CHAR_BIT - 1) * 302 / 1000 + 2)
-
-static void filter(void);
-static void parse_numbering(const char *, int);
-static void usage(void);
-
-/*
- * Pointer to dynamically allocated input line buffer, and its size.
- */
-static char *buffer;
-static size_t buffersize;
-
-/*
- * Dynamically allocated buffer suitable for string representation of ints.
- */
-static char *intbuffer;
-
-/* delimiter characters that indicate the start of a logical page section */
-static char delim[2 * MB_LEN_MAX];
-static int delimlen;
-
-/*
- * Configurable parameters.
- */
-
-/* line numbering format */
-static const char *format = FORMAT_RN;
-
-/* increment value used to number logical page lines */
-static int incr = 1;
-
-/* number of adjacent blank lines to be considered (and numbered) as one */
-static unsigned int nblank = 1;
-
-/* whether to restart numbering at logical page delimiters */
-static int restart = 1;
-
-/* characters used in separating the line number and the corrsp. text line */
-static const char *sep = "\t";
-
-/* initial value used to number logical page lines */
-static int startnum = 1;
-
-/* number of characters to be used for the line number */
-/* should be unsigned but required signed by `*' precision conversion */
-static int width = 6;
-
-
-int
-main(argc, argv)
- int argc;
- char *argv[];
-{
- int c;
- long val;
- unsigned long uval;
- char *ep;
- size_t intbuffersize, clen;
- char delim1[MB_LEN_MAX] = { '\\' }, delim2[MB_LEN_MAX] = { ':' };
- size_t delim1len = 1, delim2len = 1;
-
- (void)setlocale(LC_ALL, "");
-
- while ((c = getopt(argc, argv, "pb:d:f:h:i:l:n:s:v:w:")) != -1) {
- switch (c) {
- case 'p':
- restart = 0;
- break;
- case 'b':
- parse_numbering(optarg, BODY);
- break;
- case 'd':
- clen = mbrlen(optarg, MB_CUR_MAX, NULL);
- if (clen == (size_t)-1 || clen == (size_t)-2)
- errc(EXIT_FAILURE, EILSEQ, NULL);
- if (clen != 0) {
- memcpy(delim1, optarg, delim1len = clen);
- clen = mbrlen(optarg + delim1len,
- MB_CUR_MAX, NULL);
- if (clen == (size_t)-1 ||
- clen == (size_t)-2)
- errc(EXIT_FAILURE, EILSEQ, NULL);
- if (clen != 0) {
- memcpy(delim2, optarg + delim1len,
- delim2len = clen);
- if (optarg[delim1len + clen] != '\0')
- errx(EXIT_FAILURE,
- "invalid delim argument -- %s",
- optarg);
- }
- }
- break;
- case 'f':
- parse_numbering(optarg, FOOTER);
- break;
- case 'h':
- parse_numbering(optarg, HEADER);
- break;
- case 'i':
- errno = 0;
- val = strtol(optarg, &ep, 10);
- if ((ep != NULL && *ep != '\0') ||
- ((val == LONG_MIN || val == LONG_MAX) && errno != 0))
- errx(EXIT_FAILURE,
- "invalid incr argument -- %s", optarg);
- incr = (int)val;
- break;
- case 'l':
- errno = 0;
- uval = strtoul(optarg, &ep, 10);
- if ((ep != NULL && *ep != '\0') ||
- (uval == ULONG_MAX && errno != 0))
- errx(EXIT_FAILURE,
- "invalid num argument -- %s", optarg);
- nblank = (unsigned int)uval;
- break;
- case 'n':
- if (strcmp(optarg, "ln") == 0) {
- format = FORMAT_LN;
- } else if (strcmp(optarg, "rn") == 0) {
- format = FORMAT_RN;
- } else if (strcmp(optarg, "rz") == 0) {
- format = FORMAT_RZ;
- } else
- errx(EXIT_FAILURE,
- "illegal format -- %s", optarg);
- break;
- case 's':
- sep = optarg;
- break;
- case 'v':
- errno = 0;
- val = strtol(optarg, &ep, 10);
- if ((ep != NULL && *ep != '\0') ||
- ((val == LONG_MIN || val == LONG_MAX) && errno != 0))
- errx(EXIT_FAILURE,
- "invalid startnum value -- %s", optarg);
- startnum = (int)val;
- break;
- case 'w':
- errno = 0;
- val = strtol(optarg, &ep, 10);
- if ((ep != NULL && *ep != '\0') ||
- ((val == LONG_MIN || val == LONG_MAX) && errno != 0))
- errx(EXIT_FAILURE,
- "invalid width value -- %s", optarg);
- width = (int)val;
- if (!(width > 0))
- errx(EXIT_FAILURE,
- "width argument must be > 0 -- %d",
- width);
- break;
- case '?':
- default:
- usage();
- /* NOTREACHED */
- }
- }
- argc -= optind;
- argv += optind;
-
- switch (argc) {
- case 0:
- break;
- case 1:
- if (freopen(argv[0], "r", stdin) == NULL)
- err(EXIT_FAILURE, "%s", argv[0]);
- break;
- default:
- usage();
- /* NOTREACHED */
- }
-
- /* Generate the delimiter sequence */
- memcpy(delim, delim1, delim1len);
- memcpy(delim + delim1len, delim2, delim2len);
- delimlen = delim1len + delim2len;
-
- /* Determine the maximum input line length to operate on. */
- if ((val = sysconf(_SC_LINE_MAX)) == -1) /* ignore errno */
- val = LINE_MAX;
- /* Allocate sufficient buffer space (including the terminating NUL). */
- buffersize = (size_t)val + 1;
- if ((buffer = malloc(buffersize)) == NULL)
- err(EXIT_FAILURE, "cannot allocate input line buffer");
-
- /* Allocate a buffer suitable for preformatting line number. */
- intbuffersize = max(INT_STRLEN_MAXIMUM, width) + 1; /* NUL */
- if ((intbuffer = malloc(intbuffersize)) == NULL)
- err(EXIT_FAILURE, "cannot allocate preformatting buffer");
-
- /* Do the work. */
- filter();
-
- exit(EXIT_SUCCESS);
- /* NOTREACHED */
-}
-
-static void
-filter()
-{
- int line; /* logical line number */
- int section; /* logical page section */
- unsigned int adjblank; /* adjacent blank lines */
- int consumed; /* intbuffer measurement */
- int donumber = 0, idx;
-
- adjblank = 0;
- line = startnum;
- section = BODY;
-
- while (fgets(buffer, (int)buffersize, stdin) != NULL) {
- for (idx = FOOTER; idx <= NP_LAST; idx++) {
- /* Does it look like a delimiter? */
- if (memcmp(buffer + delimlen * idx, delim,
- delimlen) == 0) {
- /* Was this the whole line? */
- if (buffer[delimlen * (idx + 1)] == '\n') {
- section = idx;
- adjblank = 0;
- if (restart)
- line = startnum;
- goto nextline;
- }
- } else {
- break;
- }
- }
-
- switch (numbering_properties[section].type) {
- case number_all:
- /*
- * Doing this for number_all only is disputable, but
- * the standard expresses an explicit dependency on
- * `-b a' etc.
- */
- if (buffer[0] == '\n' && ++adjblank < nblank)
- donumber = 0;
- else
- donumber = 1, adjblank = 0;
- break;
- case number_nonempty:
- donumber = (buffer[0] != '\n');
- break;
- case number_none:
- donumber = 0;
- break;
- case number_regex:
- donumber =
- (regexec(&numbering_properties[section].expr,
- buffer, 0, NULL, 0) == 0);
- break;
- }
-
- if (donumber) {
- /* Note: sprintf() is safe here. */
- consumed = sprintf(intbuffer, format, width, line);
- (void)printf("%s",
- intbuffer + max(0, consumed - width));
- line += incr;
- } else {
- (void)printf("%*s", width, "");
- }
- (void)printf("%s%s", sep, buffer);
-
- if (ferror(stdout))
- err(EXIT_FAILURE, "output error");
-nextline:
- ;
- }
-
- if (ferror(stdin))
- err(EXIT_FAILURE, "input error");
-}
-
-/*
- * Various support functions.
- */
-
-static void
-parse_numbering(argstr, section)
- const char *argstr;
- int section;
-{
- int error;
- char errorbuf[NL_TEXTMAX];
-
- switch (argstr[0]) {
- case 'a':
- numbering_properties[section].type = number_all;
- break;
- case 'n':
- numbering_properties[section].type = number_none;
- break;
- case 't':
- numbering_properties[section].type = number_nonempty;
- break;
- case 'p':
- /* If there was a previous expression, throw it away. */
- if (numbering_properties[section].type == number_regex)
- regfree(&numbering_properties[section].expr);
- else
- numbering_properties[section].type = number_regex;
-
- /* Compile/validate the supplied regular expression. */
- if ((error = regcomp(&numbering_properties[section].expr,
- &argstr[1], REG_NEWLINE|REG_NOSUB)) != 0) {
- (void)regerror(error,
- &numbering_properties[section].expr,
- errorbuf, sizeof (errorbuf));
- errx(EXIT_FAILURE,
- "%s expr: %s -- %s",
- numbering_properties[section].name, errorbuf,
- &argstr[1]);
- }
- break;
- default:
- errx(EXIT_FAILURE,
- "illegal %s line numbering type -- %s",
- numbering_properties[section].name, argstr);
- }
-}
-
-static void
-usage()
-{
-
- (void)fprintf(stderr,
-"usage: nl [-p] [-b type] [-d delim] [-f type] [-h type] [-i incr] [-l num]\n"
-" [-n format] [-s sep] [-v startnum] [-w width] [file]\n");
- exit(EXIT_FAILURE);
-}
diff --git a/usr.bin/nohup/Makefile b/usr.bin/nohup/Makefile
deleted file mode 100644
index cd635ce..0000000
--- a/usr.bin/nohup/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= nohup
-WARNS?= 4
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/nohup/nohup.1 b/usr.bin/nohup/nohup.1
deleted file mode 100644
index bf74dd6..0000000
--- a/usr.bin/nohup/nohup.1
+++ /dev/null
@@ -1,124 +0,0 @@
-.\" Copyright (c) 1989, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)nohup.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd July 19, 2001
-.Dt NOHUP 1
-.Os
-.Sh NAME
-.Nm nohup
-.Nd invoke a utility immune to hangups
-.Sh SYNOPSIS
-.Nm
-.Op Fl Fl
-.Ar utility
-.Op Ar arguments
-.Sh DESCRIPTION
-The
-.Nm
-utility invokes
-.Ar utility
-with its
-.Ar arguments
-and at this time sets the signal
-.Dv SIGHUP
-to be ignored.
-If the standard output is a terminal, the standard output is
-appended to the file
-.Pa nohup.out
-in the current directory.
-If standard error is a terminal, it is directed to the same place
-as the standard output.
-.Pp
-Some shells may provide a builtin
-.Nm
-command which is similar or identical to this utility.
-Consult the
-.Xr builtin 1
-manual page.
-.Sh ENVIRONMENT
-The following variables are utilized by
-.Nm :
-.Bl -tag -width flag
-.It Ev HOME
-If the output file
-.Pa nohup.out
-cannot be created in the current directory, the
-.Nm
-utility uses the directory named by
-.Ev HOME
-to create the file.
-.It Ev PATH
-Used to locate the requested
-.Ar utility
-if the name contains no
-.Ql /
-characters.
-.El
-.Sh EXIT STATUS
-The
-.Nm
-utility exits with one of the following values:
-.Bl -tag -width Ds
-.It 126
-The
-.Ar utility
-was found, but could not be invoked.
-.It 127
-The
-.Ar utility
-could not be found or an error occurred in
-.Nm .
-.El
-.Pp
-Otherwise, the exit status of
-.Nm
-will be that of
-.Ar utility .
-.Sh SEE ALSO
-.Xr builtin 1 ,
-.Xr csh 1 ,
-.Xr signal 3
-.Sh STANDARDS
-The
-.Nm
-utility is expected to be
-.St -p1003.2
-compatible.
-.Sh BUGS
-Two or more instances of
-.Nm
-can append to the same file, which makes for a confusing output.
diff --git a/usr.bin/nohup/nohup.c b/usr.bin/nohup/nohup.c
deleted file mode 100644
index 06f2244..0000000
--- a/usr.bin/nohup/nohup.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1989, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static char sccsid[] = "@(#)nohup.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-static void dofile(void);
-static void usage(void);
-
-#define FILENAME "nohup.out"
-/*
- * POSIX mandates that we exit with:
- * 126 - If the utility was found, but failed to execute.
- * 127 - If any other error occurred.
- */
-#define EXIT_NOEXEC 126
-#define EXIT_NOTFOUND 127
-#define EXIT_MISC 127
-
-int
-main(int argc, char *argv[])
-{
- int exit_status;
-
- while (getopt(argc, argv, "") != -1)
- usage();
- argc -= optind;
- argv += optind;
- if (argc < 1)
- usage();
-
- if (isatty(STDOUT_FILENO))
- dofile();
- if (isatty(STDERR_FILENO) && dup2(STDOUT_FILENO, STDERR_FILENO) == -1)
- /* may have just closed stderr */
- err(EXIT_MISC, "%s", argv[0]);
-
- (void)signal(SIGHUP, SIG_IGN);
-
- execvp(*argv, argv);
- exit_status = (errno == ENOENT) ? EXIT_NOTFOUND : EXIT_NOEXEC;
- err(exit_status, "%s", argv[0]);
-}
-
-static void
-dofile(void)
-{
- int fd;
- char path[MAXPATHLEN];
- const char *p;
-
- /*
- * POSIX mandates if the standard output is a terminal, the standard
- * output is appended to nohup.out in the working directory. Failing
- * that, it will be appended to nohup.out in the directory obtained
- * from the HOME environment variable. If file creation is required,
- * the mode_t is set to S_IRUSR | S_IWUSR.
- */
- p = FILENAME;
- fd = open(p, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
- if (fd != -1)
- goto dupit;
- if ((p = getenv("HOME")) != NULL && *p != '\0' &&
- (size_t)snprintf(path, sizeof(path), "%s/%s", p, FILENAME) <
- sizeof(path)) {
- fd = open(p = path, O_RDWR | O_CREAT | O_APPEND,
- S_IRUSR | S_IWUSR);
- if (fd != -1)
- goto dupit;
- }
- errx(EXIT_MISC, "can't open a nohup.out file");
-
-dupit:
- if (dup2(fd, STDOUT_FILENO) == -1)
- err(EXIT_MISC, NULL);
- (void)fprintf(stderr, "appending output to %s\n", p);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "usage: nohup [--] utility [arguments]\n");
- exit(EXIT_MISC);
-}
diff --git a/usr.bin/nslookup/Makefile b/usr.bin/nslookup/Makefile
deleted file mode 100644
index 004efa2..0000000
--- a/usr.bin/nslookup/Makefile
+++ /dev/null
@@ -1,23 +0,0 @@
-# $FreeBSD$
-
-BIND_DIR= ${.CURDIR}/../../contrib/bind9
-LIB_BIND_REL= ../../lib/bind
-LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
-SRCDIR= ${BIND_DIR}/bin/dig
-
-.include "${LIB_BIND_DIR}/config.mk"
-
-PROG= nslookup
-
-.PATH: ${SRCDIR}
-SRCS+= dighost.c nslookup.c
-
-CFLAGS+= -I${SRCDIR}/include
-CFLAGS+= -I${BIND_DIR}/lib/isc/${ISC_ATOMIC_ARCH}/include
-
-DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
-LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
-
-MANFILTER= sed -e "s@^host \[server\]@\\\fBhost\\\fR \\\fI[server]\\\fR@"
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/nsupdate/Makefile b/usr.bin/nsupdate/Makefile
deleted file mode 100644
index e77ea39..0000000
--- a/usr.bin/nsupdate/Makefile
+++ /dev/null
@@ -1,26 +0,0 @@
-# $FreeBSD$
-
-BIND_DIR= ${.CURDIR}/../../contrib/bind9
-LIB_BIND_REL= ../../lib/bind
-LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
-SRCDIR= ${BIND_DIR}/bin/nsupdate
-
-.include "${LIB_BIND_DIR}/config.mk"
-
-PROG= nsupdate
-
-.PATH: ${SRCDIR}
-SRCS+= nsupdate.c
-
-CFLAGS+= -I${SRCDIR}/include
-CFLAGS+= -I${BIND_DIR}/lib/isc/${ISC_ATOMIC_ARCH}/include
-
-DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
-LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
-
-MAN= nsupdate.8
-
-MANFILTER= sed -e "s@/etc/named\.conf@/etc/namedb/named.conf@g" \
- -e "s@^\.HP [0-9]* @@"
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/objformat/Makefile b/usr.bin/objformat/Makefile
deleted file mode 100644
index 9550ff0..0000000
--- a/usr.bin/objformat/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# $FreeBSD$
-
-SCRIPTS=objformat.sh
-NO_MAN=
-
-.include <bsd.prog.mk>
-
diff --git a/usr.bin/objformat/objformat.sh b/usr.bin/objformat/objformat.sh
deleted file mode 100644
index edd9607..0000000
--- a/usr.bin/objformat/objformat.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-#! /bin/sh
-# $FreeBSD$
-# /usr/bin/objformat has been obsolete and deprecated for years.
-# Please remove any build/configure script references. New software
-# should only have to only support elf on FreeBSD.
-#
-# FreeBSD-2.0, 2.1.x and 2.2.x will use a.out
-# FreeBSD-3.x will have a real /usr/bin/objformat and are more likely
-# to be elf than a.out.
-# Assume that FreeBSD-4.x will be using elf even though it is
-# **theoretically** possible to build an a.out world.
-# FreeBSD-5.x and higher only support elf.
-#
-
-echo '========================================================' 1>&2
-echo '== PLEASE REMOVE ALL REFERENCES TO /usr/bin/objformat ==' 1>&2
-echo '=========== IT HAS BEEN OBSOLETE FOR YEARS! ====-=======' 1>&2
-echo '========================================================' 1>&2
-(echo '========================================================' >/dev/tty) 2>/dev/null
-(echo '== PLEASE REMOVE ALL REFERENCES TO /usr/bin/objformat ==' >/dev/tty) 2>/dev/null
-(echo '=========== IT HAS BEEN OBSOLETE FOR YEARS! ====-=======' >/dev/tty) 2>/dev/null
-(echo '========================================================' >/dev/tty) 2>/dev/null
-# highlight the nag or it will never be fixed!
-sleep 10
-echo elf
-exit 0
diff --git a/usr.bin/opieinfo/Makefile b/usr.bin/opieinfo/Makefile
deleted file mode 100644
index 0375111..0000000
--- a/usr.bin/opieinfo/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-# $FreeBSD$
-#
-OPIE_DIST?= ${.CURDIR}/../../contrib/opie
-
-PROG= opieinfo
-
-CFLAGS+=-I${.CURDIR}/../../lib/libopie
-CFLAGS+=-I${OPIE_DIST}
-CFLAGS+=-DINSECURE_OVERRIDE
-
-DPADD= ${LIBOPIE} ${LIBMD}
-LDADD= -lopie -lmd
-
-BINOWN= root
-BINMODE=4555
-PRECIOUSPROG=
-
-.PATH: ${OPIE_DIST}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/opiekey/Makefile b/usr.bin/opiekey/Makefile
deleted file mode 100644
index 215c86b..0000000
--- a/usr.bin/opiekey/Makefile
+++ /dev/null
@@ -1,22 +0,0 @@
-# $FreeBSD$
-#
-OPIE_DIST?= ${.CURDIR}/../../contrib/opie
-
-PROG= opiekey
-
-CFLAGS+=-I${.CURDIR}/../../lib/libopie
-CFLAGS+=-I${OPIE_DIST}
-CFLAGS+=-DINSECURE_OVERRIDE
-
-DPADD= ${LIBOPIE} ${LIBMD}
-LDADD= -lopie -lmd
-
-LINKS= ${BINDIR}/opiekey ${BINDIR}/otp-md4
-LINKS+= ${BINDIR}/opiekey ${BINDIR}/otp-md5
-LINKS+= ${BINDIR}/opiekey ${BINDIR}/otp-sha
-
-MLINKS= opiekey.1 otp-md4.1 opiekey.1 otp-md5.1 opiekey.1 otp-sha.1
-
-.PATH: ${OPIE_DIST}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/opiepasswd/Makefile b/usr.bin/opiepasswd/Makefile
deleted file mode 100644
index 0d75a21..0000000
--- a/usr.bin/opiepasswd/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-# $FreeBSD$
-#
-OPIE_DIST?= ${.CURDIR}/../../contrib/opie
-
-PROG= opiepasswd
-
-CFLAGS+=-I${.CURDIR}/../../lib/libopie
-CFLAGS+=-I${OPIE_DIST}
-CFLAGS+=-DINSECURE_OVERRIDE
-
-DPADD= ${LIBOPIE} ${LIBMD}
-LDADD= -lopie -lmd
-
-BINOWN= root
-BINMODE=4555
-PRECIOUSPROG=
-
-.PATH: ${OPIE_DIST}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/pagesize/Makefile b/usr.bin/pagesize/Makefile
deleted file mode 100644
index 6ca205d..0000000
--- a/usr.bin/pagesize/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile 8.2 (Berkeley) 4/3/94
-# $FreeBSD$
-
-SCRIPTS=pagesize.sh
-MAN= pagesize.1
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/pagesize/pagesize.1 b/usr.bin/pagesize/pagesize.1
deleted file mode 100644
index e4287e1..0000000
--- a/usr.bin/pagesize/pagesize.1
+++ /dev/null
@@ -1,58 +0,0 @@
-.\" Copyright (c) 1983, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)pagesize.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 6, 1993
-.Dt PAGESIZE 1
-.Os
-.Sh NAME
-.Nm pagesize
-.Nd print system page size
-.Sh SYNOPSIS
-.Nm
-.Sh DESCRIPTION
-The
-.Nm
-utility prints the size of a page of memory in bytes, as
-returned by
-.Xr getpagesize 3 .
-This program is useful in constructing portable
-shell scripts.
-.Sh SEE ALSO
-.Xr getpagesize 3
-.Sh HISTORY
-The
-.Nm
-command
-appeared in
-.Bx 4.2 .
diff --git a/usr.bin/pagesize/pagesize.sh b/usr.bin/pagesize/pagesize.sh
deleted file mode 100644
index fd5477b..0000000
--- a/usr.bin/pagesize/pagesize.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/sh -
-#
-# Copyright (c) 1994
-# The Regents of the University of California. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 4. Neither the name of the University nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# @(#)pagesize.sh 8.1 (Berkeley) 4/3/94
-# $FreeBSD$
-#
-
-PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH
-
-exec sysctl -n hw.pagesize
diff --git a/usr.bin/passwd/Makefile b/usr.bin/passwd/Makefile
deleted file mode 100644
index a1ce76b..0000000
--- a/usr.bin/passwd/Makefile
+++ /dev/null
@@ -1,26 +0,0 @@
-# From: @(#)Makefile 8.3 (Berkeley) 4/2/94
-# $FreeBSD$
-
-.include <bsd.own.mk>
-
-PROG = passwd
-BINOWN = root
-BINMODE = 4555
-DPADD = ${LIBPAM}
-LDADD = ${MINUSLPAM}
-.if ${MK_NIS} != "no"
-LINKS = ${BINDIR}/passwd ${BINDIR}/yppasswd
-MLINKS = passwd.1 yppasswd.1
-.endif
-WARNS ?= 4
-
-beforeinstall:
-.for i in passwd yppasswd
- [ ! -e ${DESTDIR}${BINDIR}/$i ] || \
- chflags noschg ${DESTDIR}${BINDIR}/$i || true
-.endfor
-
-afterinstall:
- -chflags schg ${DESTDIR}${BINDIR}/passwd
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/passwd/passwd.1 b/usr.bin/passwd/passwd.1
deleted file mode 100644
index 6015952..0000000
--- a/usr.bin/passwd/passwd.1
+++ /dev/null
@@ -1,256 +0,0 @@
-.\" Copyright (c) 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)passwd.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 6, 1993
-.Dt PASSWD 1
-.Os
-.Sh NAME
-.Nm passwd , yppasswd
-.Nd modify a user's password
-.Sh SYNOPSIS
-.Nm
-.Op Fl l
-.Op Ar user
-.Nm yppasswd
-.Op Fl l
-.Op Fl y
-.Op Fl d Ar domain
-.Op Fl h Ar host
-.Op Fl o
-.Sh DESCRIPTION
-The
-.Nm
-utility changes the user's local, Kerberos, or NIS password.
-If the user is not the super-user,
-.Nm
-first prompts for the current password and will not continue unless the correct
-password is entered.
-.Pp
-When entering the new password, the characters entered do not echo, in order to
-avoid the password being seen by a passer-by.
-The
-.Nm
-utility prompts for the new password twice in order to detect typing errors.
-.Pp
-The new password should be at least six characters long (which
-may be overridden using the
-.Xr login.conf 5
-.Dq minpasswordlen
-setting for a user's login class) and not purely alphabetic.
-Its total length must be less than
-.Dv _PASSWORD_LEN
-(currently 128 characters).
-.Pp
-The new password should contain a mixture of upper and lower case
-characters (which may be overridden using the
-.Xr login.conf 5
-.Dq mixpasswordcase
-setting for a user's login class).
-Allowing lower case passwords may
-be useful where the password file will be used in situations where only
-lower case passwords are permissible, such as when using Samba to
-authenticate Windows clients.
-In all other situations, numbers, upper
-case letters and meta characters are encouraged.
-.Pp
-Once the password has been verified,
-.Nm
-communicates the new password information to
-the Kerberos authenticating host.
-.Pp
-The following option is available:
-.Bl -tag -width indent
-.It Fl l
-Cause the password to be updated only in the local
-password file, and not with the Kerberos database.
-When changing only the local password,
-.Xr pwd_mkdb 8
-is used to update the password databases.
-.El
-.Pp
-When changing local or NIS password, the next password change date
-is set according to
-.Dq passwordtime
-capability in the user's login class.
-.Pp
-To change another user's Kerberos password, one must first
-run
-.Xr kinit 1
-followed by
-.Nm .
-The super-user is not required to provide a user's current password
-if only the local password is modified.
-.Sh NIS INTERACTION
-The
-.Nm
-utility has built-in support for NIS.
-If a user exists in the NIS password
-database but does not exist locally,
-.Nm
-automatically switches into
-.Nm yppasswd
-mode.
-If the specified
-user does not exist in either the local password database or the
-NIS password maps,
-.Nm
-returns an error.
-.Pp
-When changing an NIS password, unprivileged users are required to provide
-their old password for authentication (the
-.Xr rpc.yppasswdd 8
-daemon requires the original password before
-it will allow any changes to the NIS password maps).
-This restriction applies even to the
-super-user, with one important exception: the password authentication is
-bypassed for the super-user on the NIS master server.
-This means that
-the super-user on the NIS master server can make unrestricted changes to
-anyone's NIS password.
-The super-user on NIS client systems and NIS slave
-servers still needs to provide a password before the update will be processed.
-.Pp
-The following additional options are supported for use with NIS:
-.Bl -tag -width indent
-.It Fl y
-Override
-.Nm Ns 's
-checking heuristics and forces
-it into NIS mode.
-.It Fl l
-When NIS is enabled, the
-.Fl l
-flag can be used to force
-.Nm
-into
-.Dq local only
-mode.
-This flag can be used to change the entry
-for a local user when an NIS user exists with the same login name.
-For example, you will sometimes find entries for system
-.Dq placeholder
-users such as
-.Pa bin
-or
-.Pa daemon
-in both the NIS password maps and the local user database.
-By
-default,
-.Nm
-will try to change the NIS password.
-The
-.Fl l
-flag can be used to change the local password instead.
-.It Fl d Ar domain
-Specify what domain to use when changing an NIS password.
-By default,
-.Nm
-assumes that the system default domain should be used.
-This flag is
-primarily for use by the superuser on the NIS master server: a single
-NIS server can support multiple domains.
-It is also possible that the
-domainname on the NIS master may not be set (it is not necessary for
-an NIS server to also be a client) in which case the
-.Nm
-command needs to be told what domain to operate on.
-.It Fl h Ar host
-Specify the name of an NIS server.
-This option, in conjunction
-with the
-.Fl d
-option, can be used to change an NIS password on a non-local NIS
-server.
-When a domain is specified with the
-.Fl d
-option and
-.Nm
-is unable to determine the name of the NIS master server (possibly because
-the local domainname is not set), the name of the NIS master is assumed to
-be
-.Dq localhost .
-This can be overridden with the
-.Fl h
-flag.
-The specified hostname need not be the name of an NIS master: the
-name of the NIS master for a given map can be determined by querying any
-NIS server (master or slave) in a domain, so specifying the name of a
-slave server will work equally well.
-.It Fl o
-Do not automatically override the password authentication checks for the
-super-user on the NIS master server; assume
-.Dq old
-mode instead.
-This
-flag is of limited practical use but is useful for testing.
-.El
-.Sh FILES
-.Bl -tag -width /etc/master.passwd -compact
-.It Pa /etc/master.passwd
-the user database
-.It Pa /etc/passwd
-a Version 7 format password file
-.It Pa /etc/passwd.XXXXXX
-temporary copy of the password file
-.It Pa /etc/login.conf
-login class capabilities database
-.It Pa /etc/auth.conf
-configure authentication services
-.El
-.Sh SEE ALSO
-.Xr chpass 1 ,
-.Xr kinit 1 ,
-.Xr login 1 ,
-.Xr login.conf 5 ,
-.Xr passwd 5 ,
-.Xr kerberos 8 ,
-.Xr kpasswdd 8 ,
-.Xr pw 8 ,
-.Xr pwd_mkdb 8 ,
-.Xr vipw 8
-.Rs
-.%A Robert Morris
-.%A Ken Thompson
-.%T "UNIX password security"
-.Re
-.Sh NOTES
-The
-.Nm yppasswd
-command is really only a link to
-.Nm .
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v6 .
diff --git a/usr.bin/passwd/passwd.c b/usr.bin/passwd/passwd.c
deleted file mode 100644
index d35458c..0000000
--- a/usr.bin/passwd/passwd.c
+++ /dev/null
@@ -1,164 +0,0 @@
-/*-
- * Copyright (c) 2002 Networks Associates Technologies, Inc.
- * All rights reserved.
- *
- * This software was developed for the FreeBSD Project by ThinkSec AS and
- * NAI Labs, the Security Research Division of Network Associates, Inc.
- * under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the
- * DARPA CHATS research program.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-
-#include <err.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <syslog.h>
-#include <unistd.h>
-
-#include <security/pam_appl.h>
-#include <security/openpam.h>
-
-static pam_handle_t *pamh;
-static struct pam_conv pamc = {
- openpam_ttyconv,
- NULL
-};
-
-static char *yp_domain;
-static char *yp_host;
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: passwd [-ly] [-d domain] [-h host] [user]\n");
- exit(1);
-}
-
-int
-main(int argc, char *argv[])
-{
- char hostname[MAXHOSTNAMELEN];
- struct passwd *pwd;
- int o, pam_err;
- uid_t uid;
-
- while ((o = getopt(argc, argv, "d:h:loy")) != -1)
- switch (o) {
- case 'd':
- yp_domain = optarg;
- break;
- case 'h':
- yp_host = optarg;
- break;
- case 'l':
- case 'o':
- case 'y':
- /* compatibility */
- break;
- default:
- usage();
- }
-
- argc -= optind;
- argv += optind;
-
- uid = getuid();
-
- switch (argc) {
- case 0:
- if ((pwd = getpwuid(uid)) == NULL)
- errx(1, "who are you?");
- break;
- case 1:
- if ((pwd = getpwnam(*argv)) == NULL)
- errx(1, "%s: no such user", *argv);
- break;
- default:
- usage();
- }
-
- if (uid != 0 && uid != pwd->pw_uid)
- errx(1, "permission denied");
-
- /* check where the user's from */
- switch (pwd->pw_fields & _PWF_SOURCE) {
- case _PWF_FILES:
- fprintf(stderr, "Changing local password for %s\n",
- pwd->pw_name);
- break;
- case _PWF_NIS:
- fprintf(stderr, "Changing NIS password for %s\n",
- pwd->pw_name);
- break;
- default:
- /* XXX: Green men ought to be supported via PAM. */
- errx(1,
- "Sorry, `passwd' can only change passwords for local or NIS users.");
- }
-
-#define pam_check(func) do { \
- if (pam_err != PAM_SUCCESS) { \
- if (pam_err == PAM_AUTH_ERR || pam_err == PAM_PERM_DENIED || \
- pam_err == PAM_AUTHTOK_RECOVERY_ERR) \
- warnx("sorry"); \
- else \
- warnx("%s(): %s", func, pam_strerror(pamh, pam_err)); \
- goto end; \
- } \
-} while (0)
-
- /* initialize PAM */
- pam_err = pam_start("passwd", pwd->pw_name, &pamc, &pamh);
- pam_check("pam_start");
-
- pam_err = pam_set_item(pamh, PAM_TTY, ttyname(STDERR_FILENO));
- pam_check("pam_set_item");
- gethostname(hostname, sizeof hostname);
- pam_err = pam_set_item(pamh, PAM_RHOST, hostname);
- pam_check("pam_set_item");
- pam_err = pam_set_item(pamh, PAM_RUSER, getlogin());
- pam_check("pam_set_item");
-
- /* set YP domain and host */
- pam_err = pam_set_data(pamh, "yp_domain", yp_domain, NULL);
- pam_check("pam_set_data");
- pam_err = pam_set_data(pamh, "yp_server", yp_host, NULL);
- pam_check("pam_set_data");
-
- /* set new password */
- pam_err = pam_chauthtok(pamh, 0);
- pam_check("pam_chauthtok");
-
- end:
- pam_end(pamh, pam_err);
- exit(pam_err == PAM_SUCCESS ? 0 : 1);
-}
diff --git a/usr.bin/paste/Makefile b/usr.bin/paste/Makefile
deleted file mode 100644
index aa237fb..0000000
--- a/usr.bin/paste/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-
-PROG= paste
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/paste/paste.1 b/usr.bin/paste/paste.1
deleted file mode 100644
index 6b8ed0d..0000000
--- a/usr.bin/paste/paste.1
+++ /dev/null
@@ -1,150 +0,0 @@
-.\" Copyright (c) 1989, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Adam S. Moskowitz and the Institute of Electrical and Electronics
-.\" Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)paste.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 25, 2004
-.Dt PASTE 1
-.Os
-.Sh NAME
-.Nm paste
-.Nd merge corresponding or subsequent lines of files
-.Sh SYNOPSIS
-.Nm
-.Op Fl s
-.Op Fl d Ar list
-.Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility concatenates the corresponding lines of the given input files,
-replacing all but the last file's newline characters with a single tab
-character, and writes the resulting lines to standard output.
-If end-of-file is reached on an input file while other input files
-still contain data, the file is treated as if it were an endless source
-of empty lines.
-.Pp
-The options are as follows:
-.Bl -tag -width Fl
-.It Fl d Ar list
-Use one or more of the provided characters to replace the newline
-characters instead of the default tab.
-The characters in
-.Ar list
-are used circularly, i.e., when
-.Ar list
-is exhausted the first character from
-.Ar list
-is reused.
-This continues until a line from the last input file (in default operation)
-or the last line in each file (using the
-.Fl s
-option) is displayed, at which
-time
-.Nm
-begins selecting characters from the beginning of
-.Ar list
-again.
-.Pp
-The following special characters can also be used in list:
-.Pp
-.Bl -tag -width flag -compact
-.It Li \en
-newline character
-.It Li \et
-tab character
-.It Li \e\e
-backslash character
-.It Li \e0
-Empty string (not a null character).
-.El
-.Pp
-Any other character preceded by a backslash is equivalent to the
-character itself.
-.It Fl s
-Concatenate all of the lines of each separate input file in command line
-order.
-The newline character of every line except the last line in each input
-file is replaced with the tab character, unless otherwise specified by
-the
-.Fl d
-option.
-.El
-.Pp
-If
-.Sq Fl
-is specified for one or more of the input files, the standard
-input is used; standard input is read one line at a time, circularly,
-for each instance of
-.Sq Fl .
-.Sh EXIT STATUS
-.Ex -std
-.Sh EXAMPLES
-List the files in the current directory in three columns:
-.Pp
-.Dl "ls | paste - - -"
-.Pp
-Combine pairs of lines from a file into single lines:
-.Pp
-.Dl "paste -s -d '\et\en' myfile"
-.Pp
-Number the lines in a file, similar to
-.Xr nl 1 :
-.Pp
-.Dl "sed = myfile | paste -s -d '\et\en' - -"
-.Pp
-Create a colon-separated list of directories named
-.Pa bin ,
-suitable
-for use in the
-.Ev PATH
-environment variable:
-.Pp
-.Dl "find / -name bin -type d | paste -s -d : -"
-.Sh SEE ALSO
-.Xr cut 1 ,
-.Xr lam 1
-.Sh STANDARDS
-The
-.Nm
-utility is expected to be
-.St -p1003.2
-compatible.
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At 32v .
diff --git a/usr.bin/paste/paste.c b/usr.bin/paste/paste.c
deleted file mode 100644
index 6e3e553..0000000
--- a/usr.bin/paste/paste.c
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Adam S. Moskowitz of Menlo Consulting.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1989, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)paste.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <err.h>
-#include <errno.h>
-#include <limits.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-
-wchar_t *delim;
-int delimcnt;
-
-int parallel(char **);
-int sequential(char **);
-int tr(wchar_t *);
-static void usage(void);
-
-wchar_t tab[] = L"\t";
-
-int
-main(int argc, char *argv[])
-{
- int ch, rval, seq;
- wchar_t *warg;
- const char *arg;
- size_t len;
-
- setlocale(LC_CTYPE, "");
-
- seq = 0;
- while ((ch = getopt(argc, argv, "d:s")) != -1)
- switch(ch) {
- case 'd':
- arg = optarg;
- len = mbsrtowcs(NULL, &arg, 0, NULL);
- if (len == (size_t)-1)
- err(1, "delimiters");
- warg = malloc((len + 1) * sizeof(*warg));
- if (warg == NULL)
- err(1, NULL);
- arg = optarg;
- len = mbsrtowcs(warg, &arg, len + 1, NULL);
- if (len == (size_t)-1)
- err(1, "delimiters");
- delimcnt = tr(delim = warg);
- break;
- case 's':
- seq = 1;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (*argv == NULL)
- usage();
- if (!delim) {
- delimcnt = 1;
- delim = tab;
- }
-
- if (seq)
- rval = sequential(argv);
- else
- rval = parallel(argv);
- exit(rval);
-}
-
-typedef struct _list {
- struct _list *next;
- FILE *fp;
- int cnt;
- char *name;
-} LIST;
-
-int
-parallel(char **argv)
-{
- LIST *lp;
- int cnt;
- wint_t ich;
- wchar_t ch;
- char *p;
- LIST *head, *tmp;
- int opencnt, output;
-
- for (cnt = 0, head = tmp = NULL; (p = *argv); ++argv, ++cnt) {
- if ((lp = malloc(sizeof(LIST))) == NULL)
- err(1, NULL);
- if (p[0] == '-' && !p[1])
- lp->fp = stdin;
- else if (!(lp->fp = fopen(p, "r")))
- err(1, "%s", p);
- lp->next = NULL;
- lp->cnt = cnt;
- lp->name = p;
- if (!head)
- head = tmp = lp;
- else {
- tmp->next = lp;
- tmp = lp;
- }
- }
-
- for (opencnt = cnt; opencnt;) {
- for (output = 0, lp = head; lp; lp = lp->next) {
- if (!lp->fp) {
- if (output && lp->cnt &&
- (ch = delim[(lp->cnt - 1) % delimcnt]))
- putwchar(ch);
- continue;
- }
- if ((ich = getwc(lp->fp)) == WEOF) {
- if (!--opencnt)
- break;
- lp->fp = NULL;
- if (output && lp->cnt &&
- (ch = delim[(lp->cnt - 1) % delimcnt]))
- putwchar(ch);
- continue;
- }
- /*
- * make sure that we don't print any delimiters
- * unless there's a non-empty file.
- */
- if (!output) {
- output = 1;
- for (cnt = 0; cnt < lp->cnt; ++cnt)
- if ((ch = delim[cnt % delimcnt]))
- putwchar(ch);
- } else if ((ch = delim[(lp->cnt - 1) % delimcnt]))
- putwchar(ch);
- if (ich == '\n')
- continue;
- do {
- putwchar(ich);
- } while ((ich = getwc(lp->fp)) != WEOF && ich != '\n');
- }
- if (output)
- putwchar('\n');
- }
-
- return (0);
-}
-
-int
-sequential(char **argv)
-{
- FILE *fp;
- int cnt, failed, needdelim;
- wint_t ch;
- char *p;
-
- failed = 0;
- for (; (p = *argv); ++argv) {
- if (p[0] == '-' && !p[1])
- fp = stdin;
- else if (!(fp = fopen(p, "r"))) {
- warn("%s", p);
- failed = 1;
- continue;
- }
- cnt = needdelim = 0;
- while ((ch = getwc(fp)) != WEOF) {
- if (needdelim) {
- needdelim = 0;
- if (delim[cnt] != '\0')
- putwchar(delim[cnt]);
- if (++cnt == delimcnt)
- cnt = 0;
- }
- if (ch != '\n')
- putwchar(ch);
- else
- needdelim = 1;
- }
- if (needdelim)
- putwchar('\n');
- if (fp != stdin)
- (void)fclose(fp);
- }
-
- return (failed != 0);
-}
-
-int
-tr(wchar_t *arg)
-{
- int cnt;
- wchar_t ch, *p;
-
- for (p = arg, cnt = 0; (ch = *p++); ++arg, ++cnt)
- if (ch == '\\')
- switch(ch = *p++) {
- case 'n':
- *arg = '\n';
- break;
- case 't':
- *arg = '\t';
- break;
- case '0':
- *arg = '\0';
- break;
- default:
- *arg = ch;
- break;
- } else
- *arg = ch;
-
- if (!cnt)
- errx(1, "no delimiters specified");
- return(cnt);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "usage: paste [-s] [-d delimiters] file ...\n");
- exit(1);
-}
diff --git a/usr.bin/pathchk/Makefile b/usr.bin/pathchk/Makefile
deleted file mode 100644
index b5bea85..0000000
--- a/usr.bin/pathchk/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-PROG= pathchk
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/pathchk/pathchk.1 b/usr.bin/pathchk/pathchk.1
deleted file mode 100644
index e863955..0000000
--- a/usr.bin/pathchk/pathchk.1
+++ /dev/null
@@ -1,121 +0,0 @@
-.\" Copyright (c) 2001, 2002 Chuck Rouillard
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. The name of the author may not be used to endorse or promote
-.\" products derived from this software without specific prior written
-.\" permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd May 21, 2002
-.Dt PATHCHK 1
-.Os
-.Sh NAME
-.Nm pathchk
-.Nd check pathnames
-.Sh SYNOPSIS
-.Nm
-.Op Fl p
-.Ar pathname ...
-.Sh DESCRIPTION
-The
-.Nm
-utility checks whether each of the specified
-.Ar pathname
-arguments is valid or portable.
-.Pp
-A diagnostic message is written for each argument that:
-.Bl -bullet
-.It
-Is longer than
-.Dv PATH_MAX
-bytes.
-.It
-Contains any component longer than
-.Dv NAME_MAX
-bytes.
-(The value of
-.Dv NAME_MAX
-depends on the underlying file system.)
-.It
-Contains a directory component that is not searchable.
-.El
-.Pp
-It is not considered an error if a
-.Ar pathname
-argument contains a nonexistent component as long as a component by that
-name could be created.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl p
-Perform portability checks on the specified
-.Ar pathname
-arguments.
-Diagnostic messages will be written for each argument that:
-.Bl -bullet
-.It
-Is longer than
-.Dv _POSIX_PATH_MAX
-.Pq 255
-bytes.
-.It
-Contains a component longer than
-.Dv _POSIX_NAME_MAX
-.Pq 14
-bytes.
-.It
-Contains any character not in the portable filename character set (that is,
-alphanumeric characters,
-.Ql \&. ,
-.Ql \&-
-and
-.Ql _ ) .
-No component may start with the hyphen
-.Pq Ql \&-
-character.
-.El
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh EXAMPLES
-Check whether the names of files in the current directory are portable to
-other
-.Tn POSIX
-systems:
-.Pp
-.Dl "find . -print | xargs pathchk -p"
-.Sh SEE ALSO
-.Xr getconf 1 ,
-.Xr pathconf 2 ,
-.Xr stat 2
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-.Sh HISTORY
-A
-.Nm
-utility appeared in
-.Fx 5.0 .
diff --git a/usr.bin/pathchk/pathchk.c b/usr.bin/pathchk/pathchk.c
deleted file mode 100644
index dd9768a..0000000
--- a/usr.bin/pathchk/pathchk.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/*-
- * Copyright (c) 2002 Tim J. Robbins.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * pathchk -- check pathnames
- *
- * Check whether files could be created with the names specified on the
- * command line. If -p is specified, check whether the pathname is portable
- * to all POSIX systems.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <errno.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-static int check(const char *);
-static int portable(const char *);
-static void usage(void);
-
-static int pflag; /* Perform portability checks */
-
-int
-main(int argc, char *argv[])
-{
- int ch, rval;
- const char *arg;
-
- while ((ch = getopt(argc, argv, "p")) > 0) {
- switch (ch) {
- case 'p':
- pflag = 1;
- break;
- default:
- usage();
- /*NOTREACHED*/
- }
- }
- argc -= optind;
- argv += optind;
-
- if (argc == 0)
- usage();
-
- rval = 0;
- while ((arg = *argv++) != NULL)
- rval |= check(arg);
-
- exit(rval);
-}
-
-static void
-usage(void)
-{
-
- fprintf(stderr, "usage: pathchk [-p] pathname ...\n");
- exit(1);
-}
-
-static int
-check(const char *path)
-{
- struct stat sb;
- long complen, namemax, pathmax, svnamemax;
- int badch, last;
- char *end, *p, *pathd;
-
- if ((pathd = strdup(path)) == NULL)
- err(1, "strdup");
-
- p = pathd;
-
- if (!pflag) {
- errno = 0;
- namemax = pathconf(*p == '/' ? "/" : ".", _PC_NAME_MAX);
- if (namemax == -1 && errno != 0)
- namemax = NAME_MAX;
- } else
- namemax = _POSIX_NAME_MAX;
-
- for (;;) {
- p += strspn(p, "/");
- complen = (long)strcspn(p, "/");
- end = p + complen;
- last = *end == '\0';
- *end = '\0';
-
- if (namemax != -1 && complen > namemax) {
- warnx("%s: %s: component too long (limit %ld)", path,
- p, namemax);
- goto bad;
- }
-
- if (!pflag && stat(pathd, &sb) == -1 && errno != ENOENT) {
- warn("%s: %.*s", path, (int)(strlen(pathd) -
- complen - 1), pathd);
- goto bad;
- }
-
- if (pflag && (badch = portable(p)) >= 0) {
- warnx("%s: %s: component contains non-portable "
- "character `%c'", path, p, badch);
- goto bad;
- }
-
- if (last)
- break;
-
- if (!pflag) {
- errno = 0;
- svnamemax = namemax;
- namemax = pathconf(pathd, _PC_NAME_MAX);
- if (namemax == -1 && errno != 0)
- namemax = svnamemax;
- }
-
- *end = '/';
- p = end + 1;
- }
-
- if (!pflag) {
- errno = 0;
- pathmax = pathconf(path, _PC_PATH_MAX);
- if (pathmax == -1 && errno != 0)
- pathmax = PATH_MAX;
- } else
- pathmax = _POSIX_PATH_MAX;
- if (pathmax != -1 && strlen(path) >= (size_t)pathmax) {
- warnx("%s: path too long (limit %ld)", path, pathmax - 1);
- goto bad;
- }
-
- free(pathd);
- return (0);
-
-bad: free(pathd);
- return (1);
-}
-
-/*
- * Check whether a path component contains only portable characters. Return
- * the first non-portable character found.
- */
-static int
-portable(const char *path)
-{
- static const char charset[] =
- "abcdefghijklmnopqrstuvwxyz"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "0123456789._-";
- long s;
-
- if (*path == '-')
- return (*path);
-
- s = strspn(path, charset);
- if (path[s] != '\0')
- return (path[s]);
-
- return (-1);
-}
diff --git a/usr.bin/pr/Makefile b/usr.bin/pr/Makefile
deleted file mode 100644
index 70a921d..0000000
--- a/usr.bin/pr/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-
-PROG= pr
-SRCS= pr.c egetopt.c
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/pr/egetopt.c b/usr.bin/pr/egetopt.c
deleted file mode 100644
index 277459e..0000000
--- a/usr.bin/pr/egetopt.c
+++ /dev/null
@@ -1,218 +0,0 @@
-/*-
- * Copyright (c) 1991 Keith Muller.
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Keith Muller of the University of California, San Diego.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)egetopt.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "extern.h"
-
-/*
- * egetopt: get option letter from argument vector (an extended
- * version of getopt).
- *
- * Non standard additions to the ostr specs are:
- * 1) '?': immediate value following arg is optional (no white space
- * between the arg and the value)
- * 2) '#': +/- followed by a number (with an optional sign but
- * no white space between the arg and the number). The - may be
- * combined with other options, but the + cannot.
- */
-
-int eopterr = 1; /* if error message should be printed */
-int eoptind = 1; /* index into parent argv vector */
-int eoptopt; /* character checked for validity */
-char *eoptarg; /* argument associated with option */
-
-#define BADCH (int)'?'
-
-static char emsg[] = "";
-
-int
-egetopt(int nargc, char * const *nargv, const char *ostr)
-{
- static char *place = emsg; /* option letter processing */
- char *oli; /* option letter list index */
- static int delim; /* which option delimeter */
- char *p;
- static char savec = '\0';
-
- if (savec != '\0') {
- *place = savec;
- savec = '\0';
- }
-
- if (!*place) {
- /*
- * update scanning pointer
- */
- if ((eoptind >= nargc) ||
- ((*(place = nargv[eoptind]) != '-') && (*place != '+'))) {
- place = emsg;
- return (-1);
- }
-
- delim = (int)*place;
- if (place[1] && *++place == '-' && !place[1]) {
- /*
- * found "--"
- */
- ++eoptind;
- place = emsg;
- return (-1);
- }
- }
-
- /*
- * check option letter
- */
- if ((eoptopt = (int)*place++) == (int)':' || (eoptopt == (int)'?') ||
- !(oli = strchr(ostr, eoptopt))) {
- /*
- * if the user didn't specify '-' as an option,
- * assume it means -1 when by itself.
- */
- if ((eoptopt == (int)'-') && !*place)
- return (-1);
- if (strchr(ostr, '#') && (isdigit(eoptopt) ||
- (((eoptopt == (int)'-') || (eoptopt == (int)'+')) &&
- isdigit(*place)))) {
- /*
- * # option: +/- with a number is ok
- */
- for (p = place; *p != '\0'; ++p) {
- if (!isdigit(*p))
- break;
- }
- eoptarg = place-1;
-
- if (*p == '\0') {
- place = emsg;
- ++eoptind;
- } else {
- place = p;
- savec = *p;
- *place = '\0';
- }
- return (delim);
- }
-
- if (!*place)
- ++eoptind;
- if (eopterr) {
- if (!(p = strrchr(*nargv, '/')))
- p = *nargv;
- else
- ++p;
- (void)fprintf(stderr, "%s: illegal option -- %c\n",
- p, eoptopt);
- }
- return (BADCH);
- }
- if (delim == (int)'+') {
- /*
- * '+' is only allowed with numbers
- */
- if (!*place)
- ++eoptind;
- if (eopterr) {
- if (!(p = strrchr(*nargv, '/')))
- p = *nargv;
- else
- ++p;
- (void)fprintf(stderr,
- "%s: illegal '+' delimiter with option -- %c\n",
- p, eoptopt);
- }
- return (BADCH);
- }
- ++oli;
- if ((*oli != ':') && (*oli != '?')) {
- /*
- * don't need argument
- */
- eoptarg = NULL;
- if (!*place)
- ++eoptind;
- return (eoptopt);
- }
-
- if (*place) {
- /*
- * no white space
- */
- eoptarg = place;
- } else if (*oli == '?') {
- /*
- * no arg, but NOT required
- */
- eoptarg = NULL;
- } else if (nargc <= ++eoptind) {
- /*
- * no arg, but IS required
- */
- place = emsg;
- if (eopterr) {
- if (!(p = strrchr(*nargv, '/')))
- p = *nargv;
- else
- ++p;
- (void)fprintf(stderr,
- "%s: option requires an argument -- %c\n", p,
- eoptopt);
- }
- return (BADCH);
- } else {
- /*
- * arg has white space
- */
- eoptarg = nargv[eoptind];
- }
- place = emsg;
- ++eoptind;
- return (eoptopt);
-}
diff --git a/usr.bin/pr/extern.h b/usr.bin/pr/extern.h
deleted file mode 100644
index da552c0..0000000
--- a/usr.bin/pr/extern.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*-
- * Copyright (c) 1991 Keith Muller.
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Keith Muller of the University of California, San Diego.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-extern int eoptind;
-extern char *eoptarg;
-
-void addnum(char *, int, int);
-int egetopt(int, char * const *, const char *);
-void flsh_errs(void);
-int horzcol(int, char **);
-int inln(FILE *, char *, int, int *, int, int *);
-int inskip(FILE *, int, int);
-void mfail(void);
-int mulfile(int, char **);
-FILE *nxtfile(int, char **, const char **, char *, int);
-int onecol(int, char **);
-int otln(char *, int, int *, int *, int);
-void pfail(void);
-int prhead(char *, const char *, int);
-int prtail(int, int);
-int setup(int, char **);
-void terminate(int);
-void usage(void);
-int vertcol(int, char **);
diff --git a/usr.bin/pr/pr.1 b/usr.bin/pr/pr.1
deleted file mode 100644
index 035958e..0000000
--- a/usr.bin/pr/pr.1
+++ /dev/null
@@ -1,395 +0,0 @@
-.\" Copyright (c) 1991 Keith Muller.
-.\" Copyright (c) 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Keith Muller of the University of California, San Diego.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)pr.1 8.3 (Berkeley) 4/18/94
-.\" $FreeBSD$
-.\"
-.Dd July 3, 2004
-.Dt PR 1
-.Os
-.Sh NAME
-.Nm pr
-.Nd print files
-.Sh SYNOPSIS
-.Nm
-.Bk -words
-.Op Ar \&+page
-.Ek
-.Bk -words
-.Op Fl Ar column
-.Ek
-.Op Fl adFfmprt
-.Bk -words
-.Oo
-.Op Fl e
-.Op Ar char
-.Op Ar gap
-.Oc
-.Ek
-.Bk -words
-.Op Fl L Ar locale
-.Ek
-.Bk -words
-.Op Fl h Ar header
-.Ek
-.Bk -words
-.Oo
-.Op Fl i
-.Op Ar char
-.Op Ar gap
-.Oc
-.Ek
-.Bk -words
-.Op Fl l Ar lines
-.Ek
-.Bk -words
-.Op Fl o Ar offset
-.Ek
-.Bk -words
-.Oo
-.Op Fl s
-.Op Ar char
-.Oc
-.Ek
-.Bk -words
-.Oo
-.Op Fl n
-.Op Ar char
-.Op Ar width
-.Oc
-.Ek
-.Bk -words
-.Op Fl w Ar width
-.Ek
-.Op -
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility is a printing and pagination filter for text files.
-When multiple input files are specified, each is read, formatted,
-and written to standard output.
-By default, the input is separated into 66-line pages, each with
-.Bl -bullet
-.It
-A 5-line header with the page number, date, time, and
-the pathname of the file.
-.It
-A 5-line trailer consisting of blank lines.
-.El
-.Pp
-If standard output is associated with a terminal,
-diagnostic messages are suppressed until the
-.Nm
-utility has completed processing.
-.Pp
-When multiple column output is specified,
-text columns are of equal width.
-By default text columns are separated by at least one
-.Em <blank> .
-Input lines that do not fit into a text column are truncated.
-Lines are not truncated under single column output.
-.Sh OPTIONS
-In the following option descriptions, column, lines, offset, page, and
-width are positive decimal integers and gap is a nonnegative decimal integer.
-.Bl -tag -width 4n
-.It Ar \&+page
-Begin output at page number
-.Ar page
-of the formatted input.
-.It Fl Ar column
-Produce output that is
-.Ar columns
-wide (default is 1) that is written vertically
-down each column in the order in which the text
-is received from the input file.
-The options
-.Fl e
-and
-.Fl i
-are assumed.
-This option should not be used with
-.Fl m .
-When used with
-.Fl t ,
-the minimum number of lines is used to display the output.
-(To columnify and reshape text files more generally and without additional
-formatting, see the
-.Xr rs 1
-utility.)
-.It Fl a
-Modify the effect of the
-.Fl column
-option so that the columns are filled across the page in a round-robin order
-(e.g., when column is 2, the first input line heads column
-1, the second heads column 2, the third is the second line
-in column 1, etc.).
-This option requires the use of the
-.Fl column
-option.
-.It Fl d
-Produce output that is double spaced.
-An extra
-.Em <newline>
-character is output following every
-.Em <newline>
-found in the input.
-.It Fl e Xo
-.Op Ar char Ns
-.Op Ar gap
-.Xc
-Expand each input
-.Em <tab>
-to the next greater column
-position specified by the formula
-.Ar n*gap+1 ,
-where
-.Em n
-is an integer > 0.
-If
-.Ar gap
-is zero or is omitted the default is 8.
-All
-.Em <tab>
-characters in the input are expanded into the appropriate
-number of
-.Em <space>s .
-If any nondigit character,
-.Ar char ,
-is specified, it is used as the input tab character.
-.It Fl F
-Use a
-.Em <form-feed>
-character for new pages,
-instead of the default behavior that uses a
-sequence of
-.Em <newline>
-characters.
-.It Fl f
-Same as
-.Fl F
-but pause before beginning the first page if standard output is a terminal.
-.It Fl h Ar header
-Use the string
-.Ar header
-to replace the
-.Ar file name
-in the header line.
-.It Fl i Xo
-.Op Ar char Ns
-.Op Ar gap
-.Xc
-In output, replace multiple
-.Em <space>s
-with
-.Em <tab>s
-whenever two or more
-adjacent
-.Em <space>s
-reach column positions
-.Ar gap+1 ,
-.Ar 2*gap+1 ,
-etc.
-If
-.Ar gap
-is zero or omitted, default
-.Em <tab>
-settings at every eighth column position
-is used.
-If any nondigit character,
-.Ar char ,
-is specified, it is used as the output
-.Em <tab>
-character.
-.It Fl L Ar locale
-Use
-.Ar locale
-specified as argument instead of one found in environment.
-Use "C" to reset locale to default.
-.It Fl l Ar lines
-Override the 66 line default and reset the page length to
-.Ar lines .
-If
-.Ar lines
-is not greater than the sum of both the header and trailer
-depths (in lines), the
-.Nm
-utility suppresses output of both the header and trailer, as if the
-.Fl t
-option were in effect.
-.It Fl m
-Merge the contents of multiple files.
-One line from each file specified by a file operand is
-written side by side into text columns of equal fixed widths, in
-terms of the number of column positions.
-The number of text columns depends on the number of
-file operands successfully opened.
-The maximum number of files merged depends on page width and the
-per process open file limit.
-The options
-.Fl e
-and
-.Fl i
-are assumed.
-.It Fl n Xo
-.Op Ar char Ns
-.Op Ar width
-.Xc
-Provide
-.Ar width
-digit line numbering.
-The default for
-.Ar width ,
-if not specified, is 5.
-The number occupies the first
-.Ar width
-column positions of each text column or each line of
-.Fl m
-output.
-If
-.Ar char
-(any nondigit character) is given, it is appended to the line number to
-separate it from whatever follows.
-The default for
-.Ar char
-is a
-.Em <tab> .
-Line numbers longer than
-.Ar width
-columns are truncated.
-.It Fl o Ar offset
-Each line of output is preceded by
-.Ar offset
-.Em <spaces>s .
-If the
-.Fl o
-option is not specified, the default is zero.
-The space taken is in addition to the output line width.
-.It Fl p
-Pause before each page if the standard output is a terminal.
-.Nm
-will write an alert character to standard error and wait for a carriage
-return to be read on the terminal.
-.It Fl r
-Write no diagnostic reports on failure to open a file.
-.It Fl s Ar char
-Separate text columns by the single character
-.Ar char
-instead of by the appropriate number of
-.Em <space>s
-(default for
-.Ar char
-is the
-.Em <tab>
-character).
-.It Fl t
-Print neither the five-line identifying
-header nor the five-line trailer usually supplied for each page.
-Quit printing after the last line of each file without spacing to the
-end of the page.
-.It Fl w Ar width
-Set the width of the line to
-.Ar width
-column positions for multiple text-column output only.
-If the
-.Fl w
-option is not specified and the
-.Fl s
-option is not specified, the default width is 72.
-If the
-.Fl w
-option is not specified and the
-.Fl s
-option is specified, the default width is 512.
-.It Ar file
-A pathname of a file to be printed.
-If no
-.Ar file
-operands are specified, or if a
-.Ar file
-operand is
-.Sq Fl ,
-the standard input is used.
-The standard input is used only if no
-.Ar file
-operands are specified, or if a
-.Ar file
-operand is
-.Sq Fl .
-.El
-.Pp
-The
-.Fl s
-option does not allow the option letter to be separated from its
-argument, and the options
-.Fl e ,
-.Fl i ,
-and
-.Fl n
-require that both arguments, if present, not be separated from the option
-letter.
-.Sh EXIT STATUS
-The
-.Nm
-utility exits 0 on success, and 1 if an error occurs.
-.Sh DIAGNOSTICS
-If
-.Nm
-receives an interrupt while printing to a terminal, it
-flushes all accumulated error messages to the screen before
-terminating.
-.Pp
-Error messages are written to standard error during the printing
-process (if output is redirected) or after all successful
-file printing is complete (when printing to a terminal).
-.Sh SEE ALSO
-.Xr cat 1 ,
-.Xr more 1 ,
-.Xr rs 1
-.Sh STANDARDS
-The
-.Nm
-utility is
-.St -p1003.1-2001
-compatible.
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v1 .
-.Sh BUGS
-The
-.Nm
-utility does not recognize multibyte characters.
diff --git a/usr.bin/pr/pr.c b/usr.bin/pr/pr.c
deleted file mode 100644
index fed27f2..0000000
--- a/usr.bin/pr/pr.c
+++ /dev/null
@@ -1,1833 +0,0 @@
-/*-
- * Copyright (c) 1991 Keith Muller.
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Keith Muller of the University of California, San Diego.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)pr.c 8.2 (Berkeley) 4/16/94";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-
-#include <ctype.h>
-#include <errno.h>
-#include <langinfo.h>
-#include <locale.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "pr.h"
-#include "extern.h"
-
-/*
- * pr: a printing and pagination filter. If multiple input files
- * are specified, each is read, formatted, and written to standard
- * output. By default, input is separated into 66-line pages, each
- * with a header that includes the page number, date, time and the
- * files pathname.
- *
- * Complies with posix P1003.2/D11
- */
-
-/*
- * parameter variables
- */
-int pgnm; /* starting page number */
-int clcnt; /* number of columns */
-int colwd; /* column data width - multiple columns */
-int across; /* mult col flag; write across page */
-int dspace; /* double space flag */
-char inchar; /* expand input char */
-int ingap; /* expand input gap */
-int pausefst; /* Pause before first page */
-int pauseall; /* Pause before each page */
-int formfeed; /* use formfeed as trailer */
-char *header; /* header name instead of file name */
-char ochar; /* contract output char */
-int ogap; /* contract output gap */
-int lines; /* number of lines per page */
-int merge; /* merge multiple files in output */
-char nmchar; /* line numbering append char */
-int nmwd; /* width of line number field */
-int offst; /* number of page offset spaces */
-int nodiag; /* do not report file open errors */
-char schar; /* text column separation character */
-int sflag; /* -s option for multiple columns */
-int nohead; /* do not write head and trailer */
-int pgwd; /* page width with multiple col output */
-const char *timefrmt; /* time conversion string */
-
-/*
- * misc globals
- */
-FILE *err; /* error message file pointer */
-int addone; /* page length is odd with double space */
-int errcnt; /* error count on file processing */
-char digs[] = "0123456789"; /* page number translation map */
-
-char fnamedefault[] = FNAME;
-
-int
-main(int argc, char *argv[])
-{
- int ret_val;
-
- if (signal(SIGINT, SIG_IGN) != SIG_IGN)
- (void)signal(SIGINT, terminate);
- ret_val = setup(argc, argv);
- if (!ret_val) {
- /*
- * select the output format based on options
- */
- if (merge)
- ret_val = mulfile(argc, argv);
- else if (clcnt == 1)
- ret_val = onecol(argc, argv);
- else if (across)
- ret_val = horzcol(argc, argv);
- else
- ret_val = vertcol(argc, argv);
- } else
- usage();
- flsh_errs();
- if (errcnt || ret_val)
- exit(1);
- return(0);
-}
-
-/*
- * Check if we should pause and write an alert character and wait for a
- * carriage return on /dev/tty.
- */
-static void
-ttypause(int pagecnt)
-{
- int pch;
- FILE *ttyfp;
-
- if ((pauseall || (pausefst && pagecnt == 1)) &&
- isatty(STDOUT_FILENO)) {
- if ((ttyfp = fopen("/dev/tty", "r")) != NULL) {
- (void)putc('\a', stderr);
- while ((pch = getc(ttyfp)) != '\n' && pch != EOF)
- ;
- (void)fclose(ttyfp);
- }
- }
-}
-
-/*
- * onecol: print files with only one column of output.
- * Line length is unlimited.
- */
-int
-onecol(int argc, char *argv[])
-{
- int cnt = -1;
- int off;
- int lrgln;
- int linecnt;
- int num;
- int lncnt;
- int pagecnt;
- int ips;
- int ops;
- int cps;
- char *obuf;
- char *lbuf;
- char *nbuf;
- char *hbuf;
- char *ohbuf;
- FILE *inf;
- const char *fname;
- int mor;
-
- if (nmwd)
- num = nmwd + 1;
- else
- num = 0;
- off = num + offst;
-
- /*
- * allocate line buffer
- */
- if ((obuf = malloc((unsigned)(LBUF + off)*sizeof(char))) == NULL) {
- mfail();
- return(1);
- }
- /*
- * allocate header buffer
- */
- if ((hbuf = malloc((unsigned)(HDBUF + offst)*sizeof(char))) == NULL) {
- mfail();
- return(1);
- }
-
- ohbuf = hbuf + offst;
- nbuf = obuf + offst;
- lbuf = nbuf + num;
- if (num)
- nbuf[--num] = nmchar;
- if (offst) {
- (void)memset(obuf, (int)' ', offst);
- (void)memset(hbuf, (int)' ', offst);
- }
-
- /*
- * loop by file
- */
- while ((inf = nxtfile(argc, argv, &fname, ohbuf, 0)) != NULL) {
- if (pgnm) {
- /*
- * skip to specified page
- */
- if (inskip(inf, pgnm, lines))
- continue;
- pagecnt = pgnm;
- } else
- pagecnt = 1;
- lncnt = 0;
-
- /*
- * loop by page
- */
- for(;;) {
- linecnt = 0;
- lrgln = 0;
- ops = 0;
- ips = 0;
- cps = 0;
-
- ttypause(pagecnt);
-
- /*
- * loop by line
- */
- while (linecnt < lines) {
- /*
- * input next line
- */
- if ((cnt = inln(inf,lbuf,LBUF,&cps,0,&mor)) < 0)
- break;
- if (!linecnt && !nohead &&
- prhead(hbuf, fname, pagecnt))
- return(1);
-
- /*
- * start of new line.
- */
- if (!lrgln) {
- if (num)
- addnum(nbuf, num, ++lncnt);
- if (otln(obuf,cnt+off, &ips, &ops, mor))
- return(1);
- } else if (otln(lbuf, cnt, &ips, &ops, mor))
- return(1);
-
- /*
- * if line bigger than buffer, get more
- */
- if (mor) {
- lrgln = 1;
- continue;
- }
-
- /*
- * whole line rcvd. reset tab proc. state
- */
- ++linecnt;
- lrgln = 0;
- ops = 0;
- ips = 0;
- }
-
- /*
- * fill to end of page
- */
- if (linecnt && prtail(lines-linecnt-lrgln, lrgln))
- return(1);
-
- /*
- * On EOF go to next file
- */
- if (cnt < 0)
- break;
- ++pagecnt;
- }
- if (inf != stdin)
- (void)fclose(inf);
- }
- if (eoptind < argc)
- return(1);
- return(0);
-}
-
-/*
- * vertcol: print files with more than one column of output down a page
- */
-int
-vertcol(int argc, char *argv[])
-{
- char *ptbf;
- char **lstdat;
- int i;
- int j;
- int cnt = -1;
- int pln;
- int *indy;
- int cvc;
- int *lindy;
- int lncnt;
- int stp;
- int pagecnt;
- int col = colwd + 1;
- int mxlen = pgwd + offst + 1;
- int mclcnt = clcnt - 1;
- struct vcol *vc;
- int mvc;
- int tvc;
- int cw = nmwd + 1;
- int fullcol;
- char *buf;
- char *hbuf;
- char *ohbuf;
- const char *fname;
- FILE *inf;
- int ips = 0;
- int cps = 0;
- int ops = 0;
- int mor = 0;
-
- /*
- * allocate page buffer
- */
- if ((buf = malloc((unsigned)lines*mxlen*sizeof(char))) == NULL) {
- mfail();
- return(1);
- }
-
- /*
- * allocate page header
- */
- if ((hbuf = malloc((unsigned)(HDBUF + offst)*sizeof(char))) == NULL) {
- mfail();
- return(1);
- }
- ohbuf = hbuf + offst;
- if (offst)
- (void)memset(hbuf, (int)' ', offst);
-
- /*
- * col pointers when no headers
- */
- mvc = lines * clcnt;
- if ((vc =
- (struct vcol *)malloc((unsigned)mvc*sizeof(struct vcol))) == NULL) {
- mfail();
- return(1);
- }
-
- /*
- * pointer into page where last data per line is located
- */
- if ((lstdat = (char **)malloc((unsigned)lines*sizeof(char *))) == NULL){
- mfail();
- return(1);
- }
-
- /*
- * fast index lookups to locate start of lines
- */
- if ((indy = (int *)malloc((unsigned)lines*sizeof(int))) == NULL) {
- mfail();
- return(1);
- }
- if ((lindy = (int *)malloc((unsigned)lines*sizeof(int))) == NULL) {
- mfail();
- return(1);
- }
-
- if (nmwd)
- fullcol = col + cw;
- else
- fullcol = col;
-
- /*
- * initialize buffer lookup indexes and offset area
- */
- for (j = 0; j < lines; ++j) {
- lindy[j] = j * mxlen;
- indy[j] = lindy[j] + offst;
- if (offst) {
- ptbf = buf + lindy[j];
- (void)memset(ptbf, (int)' ', offst);
- ptbf += offst;
- } else
- ptbf = buf + indy[j];
- lstdat[j] = ptbf;
- }
-
- /*
- * loop by file
- */
- while ((inf = nxtfile(argc, argv, &fname, ohbuf, 0)) != NULL) {
- if (pgnm) {
- /*
- * skip to requested page
- */
- if (inskip(inf, pgnm, lines))
- continue;
- pagecnt = pgnm;
- } else
- pagecnt = 1;
- lncnt = 0;
-
- /*
- * loop by page
- */
- for(;;) {
- ttypause(pagecnt);
-
- /*
- * loop by column
- */
- cvc = 0;
- for (i = 0; i < clcnt; ++i) {
- j = 0;
- /*
- * if last column, do not pad
- */
- if (i == mclcnt)
- stp = 1;
- else
- stp = 0;
- /*
- * loop by line
- */
- for(;;) {
- /*
- * is this first column
- */
- if (!i) {
- ptbf = buf + indy[j];
- lstdat[j] = ptbf;
- } else
- ptbf = lstdat[j];
- vc[cvc].pt = ptbf;
-
- /*
- * add number
- */
- if (nmwd) {
- addnum(ptbf, nmwd, ++lncnt);
- ptbf += nmwd;
- *ptbf++ = nmchar;
- }
-
- /*
- * input next line
- */
- cnt = inln(inf,ptbf,colwd,&cps,1,&mor);
- vc[cvc++].cnt = cnt;
- if (cnt < 0)
- break;
- ptbf += cnt;
-
- /*
- * pad all but last column on page
- */
- if (!stp) {
- /*
- * pad to end of column
- */
- if (sflag)
- *ptbf++ = schar;
- else if ((pln = col-cnt) > 0) {
- (void)memset(ptbf,
- (int)' ',pln);
- ptbf += pln;
- }
- }
- /*
- * remember last char in line
- */
- lstdat[j] = ptbf;
- if (++j >= lines)
- break;
- }
- if (cnt < 0)
- break;
- }
-
- /*
- * when -t (no header) is specified the spec requires
- * the min number of lines. The last page may not have
- * balanced length columns. To fix this we must reorder
- * the columns. This is a very slow technique so it is
- * only used under limited conditions. Without -t, the
- * balancing of text columns is unspecified. To NOT
- * balance the last page, add the global variable
- * nohead to the if statement below e.g.
- *
- * if ((cnt < 0) && nohead && cvc ......
- */
- --cvc;
-
- /*
- * check to see if last page needs to be reordered
- */
- if ((cnt < 0) && cvc && ((mvc-cvc) >= clcnt)){
- pln = cvc/clcnt;
- if (cvc % clcnt)
- ++pln;
-
- /*
- * print header
- */
- if (!nohead && prhead(hbuf, fname, pagecnt))
- return(1);
- for (i = 0; i < pln; ++i) {
- ips = 0;
- ops = 0;
- if (offst&& otln(buf,offst,&ips,&ops,1))
- return(1);
- tvc = i;
-
- for (j = 0; j < clcnt; ++j) {
- /*
- * determine column length
- */
- if (j == mclcnt) {
- /*
- * last column
- */
- cnt = vc[tvc].cnt;
- if (nmwd)
- cnt += cw;
- } else if (sflag) {
- /*
- * single ch between
- */
- cnt = vc[tvc].cnt + 1;
- if (nmwd)
- cnt += cw;
- } else
- cnt = fullcol;
- if (otln(vc[tvc].pt, cnt, &ips,
- &ops, 1))
- return(1);
- tvc += pln;
- if (tvc >= cvc)
- break;
- }
- /*
- * terminate line
- */
- if (otln(buf, 0, &ips, &ops, 0))
- return(1);
- }
- /*
- * pad to end of page
- */
- if (prtail((lines - pln), 0))
- return(1);
- /*
- * done with output, go to next file
- */
- break;
- }
-
- /*
- * determine how many lines to output
- */
- if (i > 0)
- pln = lines;
- else
- pln = j;
-
- /*
- * print header
- */
- if (pln && !nohead && prhead(hbuf, fname, pagecnt))
- return(1);
-
- /*
- * output each line
- */
- for (i = 0; i < pln; ++i) {
- ptbf = buf + lindy[i];
- if ((j = lstdat[i] - ptbf) <= offst)
- break;
- if (otln(ptbf, j, &ips, &ops, 0))
- return(1);
- }
-
- /*
- * pad to end of page
- */
- if (pln && prtail((lines - pln), 0))
- return(1);
-
- /*
- * if EOF go to next file
- */
- if (cnt < 0)
- break;
- ++pagecnt;
- }
- if (inf != stdin)
- (void)fclose(inf);
- }
- if (eoptind < argc)
- return(1);
- return(0);
-}
-
-/*
- * horzcol: print files with more than one column of output across a page
- */
-int
-horzcol(int argc, char *argv[])
-{
- char *ptbf;
- int pln;
- int cnt = -1;
- char *lstdat;
- int col = colwd + 1;
- int j;
- int i;
- int lncnt;
- int pagecnt;
- char *buf;
- char *hbuf;
- char *ohbuf;
- const char *fname;
- FILE *inf;
- int ips = 0;
- int cps = 0;
- int ops = 0;
- int mor = 0;
-
- if ((buf = malloc((unsigned)(pgwd+offst+1)*sizeof(char))) == NULL) {
- mfail();
- return(1);
- }
-
- /*
- * page header
- */
- if ((hbuf = malloc((unsigned)(HDBUF + offst)*sizeof(char))) == NULL) {
- mfail();
- return(1);
- }
- ohbuf = hbuf + offst;
- if (offst) {
- (void)memset(buf, (int)' ', offst);
- (void)memset(hbuf, (int)' ', offst);
- }
-
- /*
- * loop by file
- */
- while ((inf = nxtfile(argc, argv, &fname, ohbuf, 0)) != NULL) {
- if (pgnm) {
- if (inskip(inf, pgnm, lines))
- continue;
- pagecnt = pgnm;
- } else
- pagecnt = 1;
- lncnt = 0;
-
- /*
- * loop by page
- */
- for(;;) {
- ttypause(pagecnt);
-
- /*
- * loop by line
- */
- for (i = 0; i < lines; ++i) {
- ptbf = buf + offst;
- lstdat = ptbf;
- j = 0;
- /*
- * loop by col
- */
- for(;;) {
- if (nmwd) {
- /*
- * add number to column
- */
- addnum(ptbf, nmwd, ++lncnt);
- ptbf += nmwd;
- *ptbf++ = nmchar;
- }
- /*
- * input line
- */
- if ((cnt = inln(inf,ptbf,colwd,&cps,1,
- &mor)) < 0)
- break;
- ptbf += cnt;
- lstdat = ptbf;
-
- /*
- * if last line skip padding
- */
- if (++j >= clcnt)
- break;
-
- /*
- * pad to end of column
- */
- if (sflag)
- *ptbf++ = schar;
- else if ((pln = col - cnt) > 0) {
- (void)memset(ptbf,(int)' ',pln);
- ptbf += pln;
- }
- }
-
- /*
- * determine line length
- */
- if ((j = lstdat - buf) <= offst)
- break;
- if (!i && !nohead &&
- prhead(hbuf, fname, pagecnt))
- return(1);
- /*
- * output line
- */
- if (otln(buf, j, &ips, &ops, 0))
- return(1);
- }
-
- /*
- * pad to end of page
- */
- if (i && prtail(lines-i, 0))
- return(1);
-
- /*
- * if EOF go to next file
- */
- if (cnt < 0)
- break;
- ++pagecnt;
- }
- if (inf != stdin)
- (void)fclose(inf);
- }
- if (eoptind < argc)
- return(1);
- return(0);
-}
-
-/*
- * mulfile: print files with more than one column of output and
- * more than one file concurrently
- */
-int
-mulfile(int argc, char *argv[])
-{
- char *ptbf;
- int j;
- int pln;
- int cnt;
- char *lstdat;
- int i;
- FILE **fbuf;
- int actf;
- int lncnt;
- int col;
- int pagecnt;
- int fproc;
- char *buf;
- char *hbuf;
- char *ohbuf;
- const char *fname;
- int ips = 0;
- int cps = 0;
- int ops = 0;
- int mor = 0;
-
- /*
- * array of FILE *, one for each operand
- */
- if ((fbuf = (FILE **)malloc((unsigned)clcnt*sizeof(FILE *))) == NULL) {
- mfail();
- return(1);
- }
-
- /*
- * page header
- */
- if ((hbuf = malloc((unsigned)(HDBUF + offst)*sizeof(char))) == NULL) {
- mfail();
- return(1);
- }
- ohbuf = hbuf + offst;
-
- /*
- * do not know how many columns yet. The number of operands provide an
- * upper bound on the number of columns. We use the number of files
- * we can open successfully to set the number of columns. The operation
- * of the merge operation (-m) in relation to unsuccesful file opens
- * is unspecified by posix.
- */
- j = 0;
- while (j < clcnt) {
- if ((fbuf[j] = nxtfile(argc, argv, &fname, ohbuf, 1)) == NULL)
- break;
- if (pgnm && (inskip(fbuf[j], pgnm, lines)))
- fbuf[j] = NULL;
- ++j;
- }
-
- /*
- * if no files, exit
- */
- if (!j)
- return(1);
-
- /*
- * calculate page boundries based on open file count
- */
- clcnt = j;
- if (nmwd) {
- colwd = (pgwd - clcnt - nmwd)/clcnt;
- pgwd = ((colwd + 1) * clcnt) - nmwd - 2;
- } else {
- colwd = (pgwd + 1 - clcnt)/clcnt;
- pgwd = ((colwd + 1) * clcnt) - 1;
- }
- if (colwd < 1) {
- (void)fprintf(err,
- "pr: page width too small for %d columns\n", clcnt);
- return(1);
- }
- actf = clcnt;
- col = colwd + 1;
-
- /*
- * line buffer
- */
- if ((buf = malloc((unsigned)(pgwd+offst+1)*sizeof(char))) == NULL) {
- mfail();
- return(1);
- }
- if (offst) {
- (void)memset(buf, (int)' ', offst);
- (void)memset(hbuf, (int)' ', offst);
- }
- if (pgnm)
- pagecnt = pgnm;
- else
- pagecnt = 1;
- lncnt = 0;
-
- /*
- * continue to loop while any file still has data
- */
- while (actf > 0) {
- ttypause(pagecnt);
-
- /*
- * loop by line
- */
- for (i = 0; i < lines; ++i) {
- ptbf = buf + offst;
- lstdat = ptbf;
- if (nmwd) {
- /*
- * add line number to line
- */
- addnum(ptbf, nmwd, ++lncnt);
- ptbf += nmwd;
- *ptbf++ = nmchar;
- }
- j = 0;
- fproc = 0;
-
- /*
- * loop by column
- */
- for (j = 0; j < clcnt; ++j) {
- if (fbuf[j] == NULL) {
- /*
- * empty column; EOF
- */
- cnt = 0;
- } else if ((cnt = inln(fbuf[j], ptbf, colwd,
- &cps, 1, &mor)) < 0) {
- /*
- * EOF hit; no data
- */
- if (fbuf[j] != stdin)
- (void)fclose(fbuf[j]);
- fbuf[j] = NULL;
- --actf;
- cnt = 0;
- } else {
- /*
- * process file data
- */
- ptbf += cnt;
- lstdat = ptbf;
- fproc++;
- }
-
- /*
- * if last ACTIVE column, done with line
- */
- if (fproc >= actf)
- break;
-
- /*
- * pad to end of column
- */
- if (sflag) {
- *ptbf++ = schar;
- } else if ((pln = col - cnt) > 0) {
- (void)memset(ptbf, (int)' ', pln);
- ptbf += pln;
- }
- }
-
- /*
- * calculate data in line
- */
- if ((j = lstdat - buf) <= offst)
- break;
-
- if (!i && !nohead && prhead(hbuf, fname, pagecnt))
- return(1);
-
- /*
- * output line
- */
- if (otln(buf, j, &ips, &ops, 0))
- return(1);
-
- /*
- * if no more active files, done
- */
- if (actf <= 0) {
- ++i;
- break;
- }
- }
-
- /*
- * pad to end of page
- */
- if (i && prtail(lines-i, 0))
- return(1);
- ++pagecnt;
- }
- if (eoptind < argc)
- return(1);
- return(0);
-}
-
-/*
- * inln(): input a line of data (unlimited length lines supported)
- * Input is optionally expanded to spaces
- *
- * inf: file
- * buf: buffer
- * lim: buffer length
- * cps: column positon 1st char in buffer (large line support)
- * trnc: throw away data more than lim up to \n
- * mor: set if more data in line (not truncated)
- */
-int
-inln(FILE *inf, char *buf, int lim, int *cps, int trnc, int *mor)
-{
- int col;
- int gap = ingap;
- int ch = EOF;
- char *ptbuf;
- int chk = (int)inchar;
-
- ptbuf = buf;
-
- if (gap) {
- /*
- * expanding input option
- */
- while ((--lim >= 0) && ((ch = getc(inf)) != EOF)) {
- /*
- * is this the input "tab" char
- */
- if (ch == chk) {
- /*
- * expand to number of spaces
- */
- col = (ptbuf - buf) + *cps;
- col = gap - (col % gap);
-
- /*
- * if more than this line, push back
- */
- if ((col > lim) && (ungetc(ch, inf) == EOF))
- return(1);
-
- /*
- * expand to spaces
- */
- while ((--col >= 0) && (--lim >= 0))
- *ptbuf++ = ' ';
- continue;
- }
- if (ch == '\n')
- break;
- *ptbuf++ = ch;
- }
- } else {
- /*
- * no expansion
- */
- while ((--lim >= 0) && ((ch = getc(inf)) != EOF)) {
- if (ch == '\n')
- break;
- *ptbuf++ = ch;
- }
- }
- col = ptbuf - buf;
- if (ch == EOF) {
- *mor = 0;
- *cps = 0;
- if (!col)
- return(-1);
- return(col);
- }
- if (ch == '\n') {
- /*
- * entire line processed
- */
- *mor = 0;
- *cps = 0;
- return(col);
- }
-
- /*
- * line was larger than limit
- */
- if (trnc) {
- /*
- * throw away rest of line
- */
- while ((ch = getc(inf)) != EOF) {
- if (ch == '\n')
- break;
- }
- *cps = 0;
- *mor = 0;
- } else {
- /*
- * save column offset if not truncated
- */
- *cps += col;
- *mor = 1;
- }
-
- return(col);
-}
-
-/*
- * otln(): output a line of data. (Supports unlimited length lines)
- * output is optionally contracted to tabs
- *
- * buf: output buffer with data
- * cnt: number of chars of valid data in buf
- * svips: buffer input column position (for large lines)
- * svops: buffer output column position (for large lines)
- * mor: output line not complete in this buf; more data to come.
- * 1 is more, 0 is complete, -1 is no \n's
- */
-int
-otln(char *buf, int cnt, int *svips, int *svops, int mor)
-{
- int ops; /* last col output */
- int ips; /* last col in buf examined */
- int gap = ogap;
- int tbps;
- char *endbuf;
-
- if (ogap) {
- /*
- * contracting on output
- */
- endbuf = buf + cnt;
- ops = *svops;
- ips = *svips;
- while (buf < endbuf) {
- /*
- * count number of spaces and ochar in buffer
- */
- if (*buf == ' ') {
- ++ips;
- ++buf;
- continue;
- }
-
- /*
- * simulate ochar processing
- */
- if (*buf == ochar) {
- ips += gap - (ips % gap);
- ++buf;
- continue;
- }
-
- /*
- * got a non space char; contract out spaces
- */
- while (ips - ops > 1) {
- /*
- * use as many ochar as will fit
- */
- if ((tbps = ops + gap - (ops % gap)) > ips)
- break;
- if (putchar(ochar) == EOF) {
- pfail();
- return(1);
- }
- ops = tbps;
- }
-
- while (ops < ips) {
- /*
- * finish off with spaces
- */
- if (putchar(' ') == EOF) {
- pfail();
- return(1);
- }
- ++ops;
- }
-
- /*
- * output non space char
- */
- if (putchar(*buf++) == EOF) {
- pfail();
- return(1);
- }
- ++ips;
- ++ops;
- }
-
- if (mor > 0) {
- /*
- * if incomplete line, save position counts
- */
- *svops = ops;
- *svips = ips;
- return(0);
- }
-
- if (mor < 0) {
- while (ips - ops > 1) {
- /*
- * use as many ochar as will fit
- */
- if ((tbps = ops + gap - (ops % gap)) > ips)
- break;
- if (putchar(ochar) == EOF) {
- pfail();
- return(1);
- }
- ops = tbps;
- }
- while (ops < ips) {
- /*
- * finish off with spaces
- */
- if (putchar(' ') == EOF) {
- pfail();
- return(1);
- }
- ++ops;
- }
- return(0);
- }
- } else {
- /*
- * output is not contracted
- */
- if (cnt && (fwrite(buf, sizeof(char), cnt, stdout) <= 0)) {
- pfail();
- return(1);
- }
- if (mor != 0)
- return(0);
- }
-
- /*
- * process line end and double space as required
- */
- if ((putchar('\n') == EOF) || (dspace && (putchar('\n') == EOF))) {
- pfail();
- return(1);
- }
- return(0);
-}
-
-/*
- * inskip(): skip over pgcnt pages with lncnt lines per page
- * file is closed at EOF (if not stdin).
- *
- * inf FILE * to read from
- * pgcnt number of pages to skip
- * lncnt number of lines per page
- */
-int
-inskip(FILE *inf, int pgcnt, int lncnt)
-{
- int c;
- int cnt;
-
- while(--pgcnt > 0) {
- cnt = lncnt;
- while ((c = getc(inf)) != EOF) {
- if ((c == '\n') && (--cnt == 0))
- break;
- }
- if (c == EOF) {
- if (inf != stdin)
- (void)fclose(inf);
- return(1);
- }
- }
- return(0);
-}
-
-/*
- * nxtfile: returns a FILE * to next file in arg list and sets the
- * time field for this file (or current date).
- *
- * buf array to store proper date for the header.
- * dt if set skips the date processing (used with -m)
- */
-FILE *
-nxtfile(int argc, char **argv, const char **fname, char *buf, int dt)
-{
- FILE *inf = NULL;
- struct timeval tv;
- time_t tv_sec;
- struct timezone tz;
- struct tm *timeptr = NULL;
- struct stat statbuf;
- static int twice = -1;
-
- ++twice;
- if (eoptind >= argc) {
- /*
- * no file listed; default, use standard input
- */
- if (twice)
- return(NULL);
- clearerr(stdin);
- inf = stdin;
- if (header != NULL)
- *fname = header;
- else
- *fname = fnamedefault;
- if (nohead)
- return(inf);
- if (gettimeofday(&tv, &tz) < 0) {
- ++errcnt;
- (void)fprintf(err, "pr: cannot get time of day, %s\n",
- strerror(errno));
- eoptind = argc - 1;
- return(NULL);
- }
- tv_sec = tv.tv_sec;
- timeptr = localtime(&tv_sec);
- }
- for (; eoptind < argc; ++eoptind) {
- if (strcmp(argv[eoptind], "-") == 0) {
- /*
- * process a "-" for filename
- */
- clearerr(stdin);
- inf = stdin;
- if (header != NULL)
- *fname = header;
- else
- *fname = fnamedefault;
- ++eoptind;
- if (nohead || (dt && twice))
- return(inf);
- if (gettimeofday(&tv, &tz) < 0) {
- ++errcnt;
- (void)fprintf(err,
- "pr: cannot get time of day, %s\n",
- strerror(errno));
- return(NULL);
- }
- tv_sec = tv.tv_sec;
- timeptr = localtime(&tv_sec);
- } else {
- /*
- * normal file processing
- */
- if ((inf = fopen(argv[eoptind], "r")) == NULL) {
- ++errcnt;
- if (nodiag)
- continue;
- (void)fprintf(err, "pr: cannot open %s, %s\n",
- argv[eoptind], strerror(errno));
- continue;
- }
- if (header != NULL)
- *fname = header;
- else if (dt)
- *fname = fnamedefault;
- else
- *fname = argv[eoptind];
- ++eoptind;
- if (nohead || (dt && twice))
- return(inf);
-
- if (dt) {
- if (gettimeofday(&tv, &tz) < 0) {
- ++errcnt;
- (void)fprintf(err,
- "pr: cannot get time of day, %s\n",
- strerror(errno));
- return(NULL);
- }
- tv_sec = tv.tv_sec;
- timeptr = localtime(&tv_sec);
- } else {
- if (fstat(fileno(inf), &statbuf) < 0) {
- ++errcnt;
- (void)fclose(inf);
- (void)fprintf(err,
- "pr: cannot stat %s, %s\n",
- argv[eoptind], strerror(errno));
- return(NULL);
- }
- timeptr = localtime(&(statbuf.st_mtime));
- }
- }
- break;
- }
- if (inf == NULL)
- return(NULL);
-
- /*
- * set up time field used in header
- */
- if (strftime(buf, HDBUF, timefrmt, timeptr) <= 0) {
- ++errcnt;
- if (inf != stdin)
- (void)fclose(inf);
- (void)fputs("pr: time conversion failed\n", err);
- return(NULL);
- }
- return(inf);
-}
-
-/*
- * addnum(): adds the line number to the column
- * Truncates from the front or pads with spaces as required.
- * Numbers are right justified.
- *
- * buf buffer to store the number
- * wdth width of buffer to fill
- * line line number
- *
- * NOTE: numbers occupy part of the column. The posix
- * spec does not specify if -i processing should or should not
- * occur on number padding. The spec does say it occupies
- * part of the column. The usage of addnum currently treats
- * numbers as part of the column so spaces may be replaced.
- */
-void
-addnum(char *buf, int wdth, int line)
-{
- char *pt = buf + wdth;
-
- do {
- *--pt = digs[line % 10];
- line /= 10;
- } while (line && (pt > buf));
-
- /*
- * pad with space as required
- */
- while (pt > buf)
- *--pt = ' ';
-}
-
-/*
- * prhead(): prints the top of page header
- *
- * buf buffer with time field (and offset)
- * cnt number of chars in buf
- * fname fname field for header
- * pagcnt page number
- */
-int
-prhead(char *buf, const char *fname, int pagcnt)
-{
- int ips = 0;
- int ops = 0;
-
- if ((putchar('\n') == EOF) || (putchar('\n') == EOF)) {
- pfail();
- return(1);
- }
- /*
- * posix is not clear if the header is subject to line length
- * restrictions. The specification for header line format
- * in the spec clearly does not limit length. No pr currently
- * restricts header length. However if we need to truncate in
- * a reasonable way, adjust the length of the printf by
- * changing HDFMT to allow a length max as an argument to printf.
- * buf (which contains the offset spaces and time field could
- * also be trimmed
- *
- * note only the offset (if any) is processed for tab expansion
- */
- if (offst && otln(buf, offst, &ips, &ops, -1))
- return(1);
- (void)printf(HDFMT,buf+offst, fname, pagcnt);
- return(0);
-}
-
-/*
- * prtail(): pad page with empty lines (if required) and print page trailer
- * if requested
- *
- * cnt number of lines of padding needed
- * incomp was a '\n' missing from last line output
- */
-int
-prtail(int cnt, int incomp)
-{
- if (nohead) {
- /*
- * only pad with no headers when incomplete last line
- */
- if (incomp &&
- ((dspace && (putchar('\n') == EOF)) ||
- (putchar('\n') == EOF))) {
- pfail();
- return(1);
- }
- /*
- * but honor the formfeed request
- */
- if (formfeed) {
- if (putchar('\f') == EOF) {
- pfail();
- return(1);
- }
- }
- return(0);
- }
- /*
- * if double space output two \n
- */
- if (dspace)
- cnt *= 2;
-
- /*
- * if an odd number of lines per page, add an extra \n
- */
- if (addone)
- ++cnt;
-
- /*
- * pad page
- */
- if (formfeed) {
- if ((incomp && (putchar('\n') == EOF)) ||
- (putchar('\f') == EOF)) {
- pfail();
- return(1);
- }
- return(0);
- }
- cnt += TAILLEN;
- while (--cnt >= 0) {
- if (putchar('\n') == EOF) {
- pfail();
- return(1);
- }
- }
- return(0);
-}
-
-/*
- * terminate(): when a SIGINT is recvd
- */
-void
-terminate(int which_sig __unused)
-{
- flsh_errs();
- exit(1);
-}
-
-
-/*
- * flsh_errs(): output saved up diagnostic messages after all normal
- * processing has completed
- */
-void
-flsh_errs(void)
-{
- char buf[BUFSIZ];
-
- (void)fflush(stdout);
- (void)fflush(err);
- if (err == stderr)
- return;
- rewind(err);
- while (fgets(buf, BUFSIZ, err) != NULL)
- (void)fputs(buf, stderr);
-}
-
-void
-mfail(void)
-{
- (void)fputs("pr: memory allocation failed\n", err);
-}
-
-void
-pfail(void)
-{
- (void)fprintf(err, "pr: write failure, %s\n", strerror(errno));
-}
-
-void
-usage(void)
-{
- (void)fputs(
- "usage: pr [+page] [-col] [-adFfmprt] [-e[ch][gap]] [-h header]\n",
- err);
- (void)fputs(
- " [-i[ch][gap]] [-l line] [-n[ch][width]] [-o offset]\n",err);
- (void)fputs(
- " [-L locale] [-s[ch]] [-w width] [-] [file ...]\n", err);
-}
-
-/*
- * setup: Validate command args, initialize and perform sanity
- * checks on options
- */
-int
-setup(int argc, char *argv[])
-{
- int c;
- int d_first;
- int eflag = 0;
- int iflag = 0;
- int wflag = 0;
- int cflag = 0;
- char *Lflag = NULL;
-
- if (isatty(fileno(stdout))) {
- /*
- * defer diagnostics until processing is done
- */
- if ((err = tmpfile()) == NULL) {
- err = stderr;
- (void)fputs("Cannot defer diagnostic messages\n",stderr);
- return(1);
- }
- } else
- err = stderr;
- while ((c = egetopt(argc, argv, "#adFfmrte?h:i?L:l:n?o:ps?w:")) != -1) {
- switch (c) {
- case '+':
- if ((pgnm = atoi(eoptarg)) < 1) {
- (void)fputs("pr: +page number must be 1 or more\n",
- err);
- return(1);
- }
- break;
- case '-':
- if ((clcnt = atoi(eoptarg)) < 1) {
- (void)fputs("pr: -columns must be 1 or more\n",err);
- return(1);
- }
- if (clcnt > 1)
- ++cflag;
- break;
- case 'a':
- ++across;
- break;
- case 'd':
- ++dspace;
- break;
- case 'e':
- ++eflag;
- if ((eoptarg != NULL) && !isdigit((unsigned char)*eoptarg))
- inchar = *eoptarg++;
- else
- inchar = INCHAR;
- if ((eoptarg != NULL) && isdigit((unsigned char)*eoptarg)) {
- if ((ingap = atoi(eoptarg)) < 0) {
- (void)fputs(
- "pr: -e gap must be 0 or more\n", err);
- return(1);
- }
- if (ingap == 0)
- ingap = INGAP;
- } else if ((eoptarg != NULL) && (*eoptarg != '\0')) {
- (void)fprintf(err,
- "pr: invalid value for -e %s\n", eoptarg);
- return(1);
- } else
- ingap = INGAP;
- break;
- case 'f':
- ++pausefst;
- /*FALLTHROUGH*/
- case 'F':
- ++formfeed;
- break;
- case 'h':
- header = eoptarg;
- break;
- case 'i':
- ++iflag;
- if ((eoptarg != NULL) && !isdigit((unsigned char)*eoptarg))
- ochar = *eoptarg++;
- else
- ochar = OCHAR;
- if ((eoptarg != NULL) && isdigit((unsigned char)*eoptarg)) {
- if ((ogap = atoi(eoptarg)) < 0) {
- (void)fputs(
- "pr: -i gap must be 0 or more\n", err);
- return(1);
- }
- if (ogap == 0)
- ogap = OGAP;
- } else if ((eoptarg != NULL) && (*eoptarg != '\0')) {
- (void)fprintf(err,
- "pr: invalid value for -i %s\n", eoptarg);
- return(1);
- } else
- ogap = OGAP;
- break;
- case 'L':
- Lflag = eoptarg;
- break;
- case 'l':
- if (!isdigit((unsigned char)*eoptarg) || ((lines=atoi(eoptarg)) < 1)) {
- (void)fputs(
- "pr: number of lines must be 1 or more\n",err);
- return(1);
- }
- break;
- case 'm':
- ++merge;
- break;
- case 'n':
- if ((eoptarg != NULL) && !isdigit((unsigned char)*eoptarg))
- nmchar = *eoptarg++;
- else
- nmchar = NMCHAR;
- if ((eoptarg != NULL) && isdigit((unsigned char)*eoptarg)) {
- if ((nmwd = atoi(eoptarg)) < 1) {
- (void)fputs(
- "pr: -n width must be 1 or more\n",err);
- return(1);
- }
- } else if ((eoptarg != NULL) && (*eoptarg != '\0')) {
- (void)fprintf(err,
- "pr: invalid value for -n %s\n", eoptarg);
- return(1);
- } else
- nmwd = NMWD;
- break;
- case 'o':
- if (!isdigit((unsigned char)*eoptarg) || ((offst = atoi(eoptarg))< 1)){
- (void)fputs("pr: -o offset must be 1 or more\n",
- err);
- return(1);
- }
- break;
- case 'p':
- ++pauseall;
- break;
- case 'r':
- ++nodiag;
- break;
- case 's':
- ++sflag;
- if (eoptarg == NULL)
- schar = SCHAR;
- else {
- schar = *eoptarg++;
- if (*eoptarg != '\0') {
- (void)fprintf(err,
- "pr: invalid value for -s %s\n",
- eoptarg);
- return(1);
- }
- }
- break;
- case 't':
- ++nohead;
- break;
- case 'w':
- ++wflag;
- if (!isdigit((unsigned char)*eoptarg) || ((pgwd = atoi(eoptarg)) < 1)){
- (void)fputs(
- "pr: -w width must be 1 or more \n",err);
- return(1);
- }
- break;
- case '?':
- default:
- return(1);
- }
- }
-
- /*
- * default and sanity checks
- */
- if (!clcnt) {
- if (merge) {
- if ((clcnt = argc - eoptind) <= 1) {
- clcnt = CLCNT;
- merge = 0;
- }
- } else
- clcnt = CLCNT;
- }
- if (across) {
- if (clcnt == 1) {
- (void)fputs("pr: -a flag requires multiple columns\n",
- err);
- return(1);
- }
- if (merge) {
- (void)fputs("pr: -m cannot be used with -a\n", err);
- return(1);
- }
- }
- if (!wflag) {
- if (sflag)
- pgwd = SPGWD;
- else
- pgwd = PGWD;
- }
- if (cflag || merge) {
- if (!eflag) {
- inchar = INCHAR;
- ingap = INGAP;
- }
- if (!iflag) {
- ochar = OCHAR;
- ogap = OGAP;
- }
- }
- if (cflag) {
- if (merge) {
- (void)fputs(
- "pr: -m cannot be used with multiple columns\n", err);
- return(1);
- }
- if (nmwd) {
- colwd = (pgwd + 1 - (clcnt * (nmwd + 2)))/clcnt;
- pgwd = ((colwd + nmwd + 2) * clcnt) - 1;
- } else {
- colwd = (pgwd + 1 - clcnt)/clcnt;
- pgwd = ((colwd + 1) * clcnt) - 1;
- }
- if (colwd < 1) {
- (void)fprintf(err,
- "pr: page width is too small for %d columns\n",clcnt);
- return(1);
- }
- }
- if (!lines)
- lines = LINES;
-
- /*
- * make sure long enough for headers. if not disable
- */
- if (lines <= HEADLEN + TAILLEN)
- ++nohead;
- else if (!nohead)
- lines -= HEADLEN + TAILLEN;
-
- /*
- * adjust for double space on odd length pages
- */
- if (dspace) {
- if (lines == 1)
- dspace = 0;
- else {
- if (lines & 1)
- ++addone;
- lines /= 2;
- }
- }
-
- (void) setlocale(LC_TIME, (Lflag != NULL) ? Lflag : "");
-
- d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
- timefrmt = strdup(d_first ? TIMEFMTD : TIMEFMTM);
-
- return(0);
-}
diff --git a/usr.bin/pr/pr.h b/usr.bin/pr/pr.h
deleted file mode 100644
index a4346c7..0000000
--- a/usr.bin/pr/pr.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*-
- * Copyright (c) 1991 Keith Muller.
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Keith Muller of the University of California, San Diego.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)pr.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-/*
- * parameter defaults
- */
-#define CLCNT 1
-#define INCHAR '\t'
-#define INGAP 8
-#define OCHAR '\t'
-#define OGAP 8
-#define LINES 66
-#define NMWD 5
-#define NMCHAR '\t'
-#define SCHAR '\t'
-#define PGWD 72
-#define SPGWD 512
-
-/*
- * misc default values
- */
-#define HDFMT "%s %s Page %d\n\n\n"
-#define HEADLEN 5
-#define TAILLEN 5
-#define TIMEFMTD "%e %b %H:%M %Y"
-#define TIMEFMTM "%b %e %H:%M %Y"
-#define FNAME ""
-#define LBUF 8192
-#define HDBUF 512
-
-/*
- * structure for vertical columns. Used to balance cols on last page
- */
-struct vcol {
- char *pt; /* ptr to col */
- int cnt; /* char count */
-};
diff --git a/usr.bin/printenv/Makefile b/usr.bin/printenv/Makefile
deleted file mode 100644
index bcb5952..0000000
--- a/usr.bin/printenv/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= printenv
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/printenv/printenv.1 b/usr.bin/printenv/printenv.1
deleted file mode 100644
index 776e265..0000000
--- a/usr.bin/printenv/printenv.1
+++ /dev/null
@@ -1,88 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)printenv.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd May 12, 2003
-.Dt PRINTENV 1
-.Os
-.Sh NAME
-.Nm printenv
-.Nd print out the environment
-.Sh SYNOPSIS
-.Nm
-.Op Ar name
-.Sh DESCRIPTION
-The
-.Nm
-utility prints out the names and values of the variables in the environment,
-with one name/value pair per line.
-If
-.Ar name
-is specified, only
-its value is printed.
-.Pp
-Some shells may provide a builtin
-.Nm
-command which is similar or identical to this utility.
-Consult the
-.Xr builtin 1
-manual page.
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr csh 1 ,
-.Xr env 1 ,
-.Xr sh 1 ,
-.Xr environ 7
-.Sh STANDARDS
-The
-.Nm
-utility is provided for compatibility with earlier
-.Bx
-and
-.Fx
-releases and is not specified by any standards.
-The functionality of
-.Nm
-can be duplicated with the
-.Xr echo 1
-and
-.Xr env 1
-utilities.
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3.0 .
diff --git a/usr.bin/printenv/printenv.c b/usr.bin/printenv/printenv.c
deleted file mode 100644
index 8ad23c7..0000000
--- a/usr.bin/printenv/printenv.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 1987, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1987, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)printenv.c 8.2 (Berkeley) 5/4/95";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-void usage(void);
-
-/*
- * printenv
- *
- * Bill Joy, UCB
- * February, 1979
- */
-int
-main(int argc, char *argv[])
-{
- extern char **environ;
- char *cp, **ep;
- size_t len;
- int ch;
-
- while ((ch = getopt(argc, argv, "")) != -1)
- switch(ch) {
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (argc == 0) {
- for (ep = environ; *ep; ep++)
- (void)printf("%s\n", *ep);
- exit(0);
- }
- len = strlen(*argv);
- for (ep = environ; *ep; ep++)
- if (!memcmp(*ep, *argv, len)) {
- cp = *ep + len;
- if (!*cp || *cp == '=') {
- (void)printf("%s\n", *cp ? cp + 1 : cp);
- exit(0);
- }
- }
- exit(1);
-}
-
-void
-usage(void)
-{
- (void)fprintf(stderr, "usage: printenv [name]\n");
- exit(1);
-}
diff --git a/usr.bin/printf/Makefile b/usr.bin/printf/Makefile
deleted file mode 100644
index 78cdd0d..0000000
--- a/usr.bin/printf/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= printf
-WARNS?= 6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/printf/printf.1 b/usr.bin/printf/printf.1
deleted file mode 100644
index 4a30851..0000000
--- a/usr.bin/printf/printf.1
+++ /dev/null
@@ -1,351 +0,0 @@
-.\" Copyright (c) 1989, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)printf.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd April 14, 2005
-.Dt PRINTF 1
-.Os
-.Sh NAME
-.Nm printf
-.Nd formatted output
-.Sh SYNOPSIS
-.Nm
-.Ar format Op Ar arguments ...
-.Sh DESCRIPTION
-The
-.Nm
-utility formats and prints its arguments, after the first, under control
-of the
-.Ar format .
-The
-.Ar format
-is a character string which contains three types of objects: plain characters,
-which are simply copied to standard output, character escape sequences which
-are converted and copied to the standard output, and format specifications,
-each of which causes printing of the next successive
-.Ar argument .
-.Pp
-The
-.Ar arguments
-after the first are treated as strings if the corresponding format is
-either
-.Cm c , b
-or
-.Cm s ;
-otherwise it is evaluated as a C constant, with the following extensions:
-.Pp
-.Bl -bullet -offset indent -compact
-.It
-A leading plus or minus sign is allowed.
-.It
-If the leading character is a single or double quote, the value is the
-.Tn ASCII
-code of the next character.
-.El
-.Pp
-The format string is reused as often as necessary to satisfy the
-.Ar arguments .
-Any extra format specifications are evaluated with zero or the null
-string.
-.Pp
-Character escape sequences are in backslash notation as defined in the
-.St -ansiC ,
-with extensions.
-The characters and their meanings
-are as follows:
-.Pp
-.Bl -tag -width Ds -offset indent -compact
-.It Cm \ea
-Write a <bell> character.
-.It Cm \eb
-Write a <backspace> character.
-.It Cm \ec
-Ignore remaining characters in this string.
-.It Cm \ef
-Write a <form-feed> character.
-.It Cm \en
-Write a <new-line> character.
-.It Cm \er
-Write a <carriage return> character.
-.It Cm \et
-Write a <tab> character.
-.It Cm \ev
-Write a <vertical tab> character.
-.It Cm \e\'
-Write a <single quote> character.
-.It Cm \e\e
-Write a backslash character.
-.It Cm \e Ns Ar num
-.It Cm \e0 Ns Ar num
-Write an 8-bit character whose
-.Tn ASCII
-value is the 1-, 2-, or 3-digit
-octal number
-.Ar num .
-.El
-.Pp
-Each format specification is introduced by the percent character
-(``%'').
-The remainder of the format specification includes,
-in the following order:
-.Bl -tag -width Ds
-.It "Zero or more of the following flags:"
-.Bl -tag -width Ds
-.It Cm #
-A `#' character
-specifying that the value should be printed in an ``alternate form''.
-For
-.Cm c , d ,
-and
-.Cm s ,
-formats, this option has no effect.
-For the
-.Cm o
-formats the precision of the number is increased to force the first
-character of the output string to a zero.
-For the
-.Cm x
-.Pq Cm X
-format, a non-zero result has the string
-.Li 0x
-.Pq Li 0X
-prepended to it.
-For
-.Cm e , E , f , g ,
-and
-.Cm G ,
-formats, the result will always contain a decimal point, even if no
-digits follow the point (normally, a decimal point only appears in the
-results of those formats if a digit follows the decimal point).
-For
-.Cm g
-and
-.Cm G
-formats, trailing zeros are not removed from the result as they
-would otherwise be;
-.It Cm \&\-
-A minus sign `\-' which specifies
-.Em left adjustment
-of the output in the indicated field;
-.It Cm \&+
-A `+' character specifying that there should always be
-a sign placed before the number when using signed formats.
-.It Sq \&\ \&
-A space specifying that a blank should be left before a positive number
-for a signed format.
-A `+' overrides a space if both are used;
-.It Cm \&0
-A zero `0' character indicating that zero-padding should be used
-rather than blank-padding.
-A `\-' overrides a `0' if both are used;
-.El
-.It "Field Width:"
-An optional digit string specifying a
-.Em field width ;
-if the output string has fewer characters than the field width it will
-be blank-padded on the left (or right, if the left-adjustment indicator
-has been given) to make up the field width (note that a leading zero
-is a flag, but an embedded zero is part of a field width);
-.It Precision:
-An optional period,
-.Sq Cm \&.\& ,
-followed by an optional digit string giving a
-.Em precision
-which specifies the number of digits to appear after the decimal point,
-for
-.Cm e
-and
-.Cm f
-formats, or the maximum number of characters to be printed
-from a string; if the digit string is missing, the precision is treated
-as zero;
-.It Format:
-A character which indicates the type of format to use (one of
-.Cm diouxXfFeEgGaAcsb ) .
-The uppercase formats differ from their lowercase counterparts only in
-that the output of the former is entirely in uppercase.
-The floating-point format specifiers
-.Pq Cm fFeEgGaA
-may be prefixed by an
-.Cm L
-to request that additional precision be used, if available.
-.El
-.Pp
-A field width or precision may be
-.Sq Cm \&*
-instead of a digit string.
-In this case an
-.Ar argument
-supplies the field width or precision.
-.Pp
-The format characters and their meanings are:
-.Bl -tag -width Fl
-.It Cm diouXx
-The
-.Ar argument
-is printed as a signed decimal (d or i), unsigned octal, unsigned decimal,
-or unsigned hexadecimal (X or x), respectively.
-.It Cm fF
-The
-.Ar argument
-is printed in the style `[\-]ddd.ddd' where the number of d's
-after the decimal point is equal to the precision specification for
-the argument.
-If the precision is missing, 6 digits are given; if the precision
-is explicitly 0, no digits and no decimal point are printed.
-The values \*[If] and \*[Na] are printed as
-.Ql inf
-and
-.Ql nan ,
-respectively.
-.It Cm eE
-The
-.Ar argument
-is printed in the style
-.Cm e
-.Sm off
-.Sq Op - Ar d.ddd No \(+- Ar dd
-.Sm on
-where there
-is one digit before the decimal point and the number after is equal to
-the precision specification for the argument; when the precision is
-missing, 6 digits are produced.
-The values \*[If] and \*[Na] are printed as
-.Ql inf
-and
-.Ql nan ,
-respectively.
-.It Cm gG
-The
-.Ar argument
-is printed in style
-.Cm f
-.Pq Cm F
-or in style
-.Cm e
-.Pq Cm E
-whichever gives full precision in minimum space.
-.It Cm aA
-The
-.Ar argument
-is printed in style
-.Sm off
-.Sq Op - Ar h.hhh No \(+- Li p Ar d
-.Sm on
-where there is one digit before the hexadecimal point and the number
-after is equal to the precision specification for the argument;
-when the precision is missing, enough digits are produced to convey
-the argument's exact double-precision floating-point representation.
-The values \*[If] and \*[Na] are printed as
-.Ql inf
-and
-.Ql nan ,
-respectively.
-.It Cm c
-The first character of
-.Ar argument
-is printed.
-.It Cm s
-Characters from the string
-.Ar argument
-are printed until the end is reached or until the number of characters
-indicated by the precision specification is reached; however if the
-precision is 0 or missing, all characters in the string are printed.
-.It Cm b
-As for
-.Cm s ,
-but interpret character escapes in backslash notation in the string
-.Ar argument .
-.It Cm \&%
-Print a `%'; no argument is used.
-.El
-.Pp
-The decimal point
-character is defined in the program's locale (category
-.Dv LC_NUMERIC ) .
-.Pp
-In no case does a non-existent or small field width cause truncation of
-a field; padding takes place only if the specified field width exceeds
-the actual width.
-.Sh EXIT STATUS
-.Ex -std
-.Sh COMPATIBILITY
-The traditional
-.Bx
-behavior of converting arguments of numeric formats not beginning
-with a digit to the
-.Tn ASCII
-code of the first character is not supported.
-.Sh SEE ALSO
-.Xr echo 1 ,
-.Xr printf 3
-.Sh STANDARDS
-The
-.Nm
-command is expected to be compatible with the
-.St -p1003.2
-specification.
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.3 Reno .
-It is modeled
-after the standard library function,
-.Xr printf 3 .
-.Sh BUGS
-Since the floating point numbers are translated from
-.Tn ASCII
-to floating-point and
-then back again, floating-point precision may be lost.
-(By default, the number is translated to an IEEE-754 double-precision
-value before being printed.
-The
-.Cm L
-modifier may produce additional precision, depending on the hardware platform.)
-.Pp
-.Tn ANSI
-hexadecimal character constants were deliberately not provided.
-.Pp
-The escape sequence \e000 is the string terminator.
-When present in the argument for the
-.Cm b
-format, the argument will be truncated at the \e000 character.
-.Pp
-Multibyte characters are not recognized in format strings (this is only
-a problem if
-.Ql %
-can appear inside a multibyte character).
diff --git a/usr.bin/printf/printf.c b/usr.bin/printf/printf.c
deleted file mode 100644
index 5e7a935..0000000
--- a/usr.bin/printf/printf.c
+++ /dev/null
@@ -1,558 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if !defined(BUILTIN) && !defined(SHELL)
-#ifndef lint
-static char const copyright[] =
-"@(#) Copyright (c) 1989, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-#endif
-
-#ifndef lint
-#if 0
-static char const sccsid[] = "@(#)printf.c 8.1 (Berkeley) 7/20/93";
-#endif
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <sys/types.h>
-
-#include <err.h>
-#include <errno.h>
-#include <inttypes.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifdef SHELL
-#define main printfcmd
-#include "bltin/bltin.h"
-#include "memalloc.h"
-#else
-#define warnx1(a, b, c) warnx(a)
-#define warnx2(a, b, c) warnx(a, b)
-#define warnx3(a, b, c) warnx(a, b, c)
-#endif
-
-#ifndef BUILTIN
-#include <locale.h>
-#endif
-
-#define PF(f, func) do { \
- char *b = NULL; \
- if (havewidth) \
- if (haveprec) \
- (void)asprintf(&b, f, fieldwidth, precision, func); \
- else \
- (void)asprintf(&b, f, fieldwidth, func); \
- else if (haveprec) \
- (void)asprintf(&b, f, precision, func); \
- else \
- (void)asprintf(&b, f, func); \
- if (b) { \
- (void)fputs(b, stdout); \
- free(b); \
- } \
-} while (0)
-
-static int asciicode(void);
-static char *doformat(char *, int *);
-static int escape(char *, int, size_t *);
-static int getchr(void);
-static int getfloating(long double *, int);
-static int getint(int *);
-static int getnum(intmax_t *, uintmax_t *, int);
-static const char
- *getstr(void);
-static char *mknum(char *, int);
-static void usage(void);
-
-static char **gargv;
-
-int
-#ifdef BUILTIN
-progprintf(int argc, char *argv[])
-#else
-main(int argc, char *argv[])
-#endif
-{
- size_t len;
- int ch, chopped, end, rval;
- char *format, *fmt, *start;
-
-#ifndef BUILTIN
- (void) setlocale(LC_NUMERIC, "");
-#endif
- while ((ch = getopt(argc, argv, "")) != -1)
- switch (ch) {
- case '?':
- default:
- usage();
- return (1);
- }
- argc -= optind;
- argv += optind;
-
- if (argc < 1) {
- usage();
- return (1);
- }
-
- /*
- * Basic algorithm is to scan the format string for conversion
- * specifications -- once one is found, find out if the field
- * width or precision is a '*'; if it is, gather up value. Note,
- * format strings are reused as necessary to use up the provided
- * arguments, arguments of zero/null string are provided to use
- * up the format string.
- */
- fmt = format = *argv;
- chopped = escape(fmt, 1, &len); /* backslash interpretation */
- rval = end = 0;
- gargv = ++argv;
- for (;;) {
- start = fmt;
- while (fmt < format + len) {
- if (fmt[0] == '%') {
- fwrite(start, 1, fmt - start, stdout);
- if (fmt[1] == '%') {
- /* %% prints a % */
- putchar('%');
- fmt += 2;
- } else {
- fmt = doformat(fmt, &rval);
- if (fmt == NULL)
- return (1);
- end = 0;
- }
- start = fmt;
- } else
- fmt++;
- }
-
- if (end == 1) {
- warnx1("missing format character", NULL, NULL);
- return (1);
- }
- fwrite(start, 1, fmt - start, stdout);
- if (chopped || !*gargv)
- return (rval);
- /* Restart at the beginning of the format string. */
- fmt = format;
- end = 1;
- }
- /* NOTREACHED */
-}
-
-
-static char *
-doformat(char *start, int *rval)
-{
- static const char skip1[] = "#'-+ 0";
- static const char skip2[] = "0123456789";
- char *fmt;
- int fieldwidth, haveprec, havewidth, mod_ldbl, precision;
- char convch, nextch;
-
- fmt = start + 1;
- /* skip to field width */
- fmt += strspn(fmt, skip1);
- if (*fmt == '*') {
- if (getint(&fieldwidth))
- return (NULL);
- havewidth = 1;
- ++fmt;
- } else {
- havewidth = 0;
-
- /* skip to possible '.', get following precision */
- fmt += strspn(fmt, skip2);
- }
- if (*fmt == '.') {
- /* precision present? */
- ++fmt;
- if (*fmt == '*') {
- if (getint(&precision))
- return (NULL);
- haveprec = 1;
- ++fmt;
- } else {
- haveprec = 0;
-
- /* skip to conversion char */
- fmt += strspn(fmt, skip2);
- }
- } else
- haveprec = 0;
- if (!*fmt) {
- warnx1("missing format character", NULL, NULL);
- return (NULL);
- }
-
- /*
- * Look for a length modifier. POSIX doesn't have these, so
- * we only support them for floating-point conversions, which
- * are extensions. This is useful because the L modifier can
- * be used to gain extra range and precision, while omitting
- * it is more likely to produce consistent results on different
- * architectures. This is not so important for integers
- * because overflow is the only bad thing that can happen to
- * them, but consider the command printf %a 1.1
- */
- if (*fmt == 'L') {
- mod_ldbl = 1;
- fmt++;
- if (!strchr("aAeEfFgG", *fmt)) {
- warnx2("bad modifier L for %%%c", *fmt, NULL);
- return (NULL);
- }
- } else {
- mod_ldbl = 0;
- }
-
- convch = *fmt;
- nextch = *++fmt;
- *fmt = '\0';
- switch (convch) {
- case 'b': {
- size_t len;
- char *p;
- int getout;
-
-#ifdef SHELL
- p = savestr(getstr());
-#else
- p = strdup(getstr());
-#endif
- if (p == NULL) {
- warnx2("%s", strerror(ENOMEM), NULL);
- return (NULL);
- }
- getout = escape(p, 0, &len);
- *(fmt - 1) = 's';
- PF(start, p);
- *(fmt - 1) = 'b';
-#ifdef SHELL
- ckfree(p);
-#else
- free(p);
-#endif
- if (getout)
- return (fmt);
- break;
- }
- case 'c': {
- char p;
-
- p = getchr();
- PF(start, p);
- break;
- }
- case 's': {
- const char *p;
-
- p = getstr();
- PF(start, p);
- break;
- }
- case 'd': case 'i': case 'o': case 'u': case 'x': case 'X': {
- char *f;
- intmax_t val;
- uintmax_t uval;
- int signedconv;
-
- signedconv = (convch == 'd' || convch == 'i');
- if ((f = mknum(start, convch)) == NULL)
- return (NULL);
- if (getnum(&val, &uval, signedconv))
- *rval = 1;
- if (signedconv)
- PF(f, val);
- else
- PF(f, uval);
- break;
- }
- case 'e': case 'E':
- case 'f': case 'F':
- case 'g': case 'G':
- case 'a': case 'A': {
- long double p;
-
- if (getfloating(&p, mod_ldbl))
- *rval = 1;
- if (mod_ldbl)
- PF(start, p);
- else
- PF(start, (double)p);
- break;
- }
- default:
- warnx2("illegal format character %c", convch, NULL);
- return (NULL);
- }
- *fmt = nextch;
- return (fmt);
-}
-
-static char *
-mknum(char *str, int ch)
-{
- static char *copy;
- static size_t copy_size;
- char *newcopy;
- size_t len, newlen;
-
- len = strlen(str) + 2;
- if (len > copy_size) {
- newlen = ((len + 1023) >> 10) << 10;
-#ifdef SHELL
- if ((newcopy = ckrealloc(copy, newlen)) == NULL)
-#else
- if ((newcopy = realloc(copy, newlen)) == NULL)
-#endif
- {
- warnx2("%s", strerror(ENOMEM), NULL);
- return (NULL);
- }
- copy = newcopy;
- copy_size = newlen;
- }
-
- memmove(copy, str, len - 3);
- copy[len - 3] = 'j';
- copy[len - 2] = ch;
- copy[len - 1] = '\0';
- return (copy);
-}
-
-static int
-escape(char *fmt, int percent, size_t *len)
-{
- char *save, *store;
- int value, c;
-
- for (save = store = fmt; (c = *fmt); ++fmt, ++store) {
- if (c != '\\') {
- *store = c;
- continue;
- }
- switch (*++fmt) {
- case '\0': /* EOS, user error */
- *store = '\\';
- *++store = '\0';
- *len = store - save;
- return (0);
- case '\\': /* backslash */
- case '\'': /* single quote */
- *store = *fmt;
- break;
- case 'a': /* bell/alert */
- *store = '\a';
- break;
- case 'b': /* backspace */
- *store = '\b';
- break;
- case 'c':
- *store = '\0';
- *len = store - save;
- return (1);
- case 'f': /* form-feed */
- *store = '\f';
- break;
- case 'n': /* newline */
- *store = '\n';
- break;
- case 'r': /* carriage-return */
- *store = '\r';
- break;
- case 't': /* horizontal tab */
- *store = '\t';
- break;
- case 'v': /* vertical tab */
- *store = '\v';
- break;
- /* octal constant */
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- c = (!percent && *fmt == '0') ? 4 : 3;
- for (value = 0;
- c-- && *fmt >= '0' && *fmt <= '7'; ++fmt) {
- value <<= 3;
- value += *fmt - '0';
- }
- --fmt;
- if (percent && value == '%') {
- *store++ = '%';
- *store = '%';
- } else
- *store = value;
- break;
- default:
- *store = *fmt;
- break;
- }
- }
- *store = '\0';
- *len = store - save;
- return (0);
-}
-
-static int
-getchr(void)
-{
- if (!*gargv)
- return ('\0');
- return ((int)**gargv++);
-}
-
-static const char *
-getstr(void)
-{
- if (!*gargv)
- return ("");
- return (*gargv++);
-}
-
-static int
-getint(int *ip)
-{
- intmax_t val;
- uintmax_t uval;
- int rval;
-
- if (getnum(&val, &uval, 1))
- return (1);
- rval = 0;
- if (val < INT_MIN || val > INT_MAX) {
- warnx3("%s: %s", *gargv, strerror(ERANGE));
- rval = 1;
- }
- *ip = (int)val;
- return (rval);
-}
-
-static int
-getnum(intmax_t *ip, uintmax_t *uip, int signedconv)
-{
- char *ep;
- int rval;
-
- if (!*gargv) {
- *ip = 0;
- return (0);
- }
- if (**gargv == '"' || **gargv == '\'') {
- if (signedconv)
- *ip = asciicode();
- else
- *uip = asciicode();
- return (0);
- }
- rval = 0;
- errno = 0;
- if (signedconv)
- *ip = strtoimax(*gargv, &ep, 0);
- else
- *uip = strtoumax(*gargv, &ep, 0);
- if (ep == *gargv) {
- warnx2("%s: expected numeric value", *gargv, NULL);
- rval = 1;
- }
- else if (*ep != '\0') {
- warnx2("%s: not completely converted", *gargv, NULL);
- rval = 1;
- }
- if (errno == ERANGE) {
- warnx3("%s: %s", *gargv, strerror(ERANGE));
- rval = 1;
- }
- ++gargv;
- return (rval);
-}
-
-static int
-getfloating(long double *dp, int mod_ldbl)
-{
- char *ep;
- int rval;
-
- if (!*gargv) {
- *dp = 0.0;
- return (0);
- }
- if (**gargv == '"' || **gargv == '\'') {
- *dp = asciicode();
- return (0);
- }
- rval = 0;
- errno = 0;
- if (mod_ldbl)
- *dp = strtold(*gargv, &ep);
- else
- *dp = strtod(*gargv, &ep);
- if (ep == *gargv) {
- warnx2("%s: expected numeric value", *gargv, NULL);
- rval = 1;
- } else if (*ep != '\0') {
- warnx2("%s: not completely converted", *gargv, NULL);
- rval = 1;
- }
- if (errno == ERANGE) {
- warnx3("%s: %s", *gargv, strerror(ERANGE));
- rval = 1;
- }
- ++gargv;
- return (rval);
-}
-
-static int
-asciicode(void)
-{
- int ch;
-
- ch = **gargv;
- if (ch == '\'' || ch == '"')
- ch = (*gargv)[1];
- ++gargv;
- return (ch);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "usage: printf format [arguments ...]\n");
-}
diff --git a/usr.bin/procstat/Makefile b/usr.bin/procstat/Makefile
deleted file mode 100644
index e3c77e4..0000000
--- a/usr.bin/procstat/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-# $FreeBSD$
-
-PROG= procstat
-MAN= procstat.1
-SRCS= procstat.c \
- procstat_args.c \
- procstat_basic.c \
- procstat_bin.c \
- procstat_cred.c \
- procstat_files.c \
- procstat_kstack.c \
- procstat_threads.c \
- procstat_vm.c
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/procstat/procstat.1 b/usr.bin/procstat/procstat.1
deleted file mode 100644
index 43761fd..0000000
--- a/usr.bin/procstat/procstat.1
+++ /dev/null
@@ -1,361 +0,0 @@
-.\"-
-.\" Copyright (c) 2007-2008 Robert N. M. Watson
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd August 20, 2008
-.Dt PROCSTAT 1
-.Os
-.Sh NAME
-.Nm procstat
-.Nd get detailed process information
-.Sh SYNOPSIS
-.Nm
-.Op Fl h
-.Op Fl w Ar interval
-.Op Fl b | c | f | k | s | t | v
-.Op Fl a | Ar pid ...
-.Sh DESCRIPTION
-The
-.Nm
-utility displays detailed information about the processes identified by the
-.Ar pid
-arguments, or if the
-.Fl a
-flag is used, all processes.
-.Pp
-By default, basic process statistics are printed; one of the following
-options may be specified in order to select more detailed process information
-for printing:
-.Bl -tag -width indent
-.It Fl b
-Display binary information for the process.
-.It Fl c
-Display command line arguments for the process.
-.It Fl f
-Display file descriptor information for the process.
-.It Fl k
-Display the stacks of kernel threads in the process, excluding stacks of
-threads currently running on a CPU and threads with stacks swapped to disk.
-If the flag is repeated, function offsets as well as function names are
-printed.
-.It Fl s
-Display security credential information for the process.
-.It Fl t
-Display thread information for the process.
-.It Fl v
-Display virtual memory mappings for the process.
-.El
-.Pp
-All options generate output in the format of a table, the first field of
-which is the process ID to which the row of information corresponds.
-The
-.Fl h
-flag may be used to suppress table headers.
-.Pp
-The
-.Fl w
-flag may be used to specify a wait interval at which to repeat the printing
-of the requested process information.
-If the
-.Fl w
-flag is not specified, the output will not repeat.
-.Pp
-Some information, such as VM and file descriptor information, is available
-only to the owner of a process or the superuser.
-.Ss Binary Information
-Display the process ID, command, and path to the process binary:
-.Pp
-.Bl -tag -width indent -compact
-.It PID
-process ID
-.It COMM
-command
-.It PATH
-path to process binary (if available)
-.El
-.Ss Command Line Arguments
-Display the process ID, command, and command line arguments:
-.Pp
-.Bl -tag -width indent -compact
-.It PID
-process ID
-.It COMM
-command
-.It ARGS
-command line arguments (if available)
-.El
-.Ss File Descriptors
-Display detailed information about each file descriptor referenced by a
-process, including the process ID, command, file descriptor number, and
-per-file descriptor object information, such as object type and file system
-path:
-.Pp
-.Bl -tag -width indent -compact
-.It PID
-process ID
-.It COMM
-command
-.It FD
-file descriptor number or cwd/root/jail
-.It T
-file descriptor type
-.It V
-vnode type
-.It FLAGS
-file descriptor flags
-.It REF
-file descriptor reference count
-.It OFFSET
-file descriptor offset
-.It PRO
-network protocol
-.It NAME
-file path or socket addresses (if available)
-.El
-.Pp
-The following file descriptor types may be displayed:
-.Pp
-.Bl -tag -width X -compact
-.It c
-crypto
-.It f
-fifo
-.It h
-shared memory
-.It k
-kqueue
-.It m
-message queue
-.It p
-pipe
-.It s
-socket
-.It t
-pseudo-terminal master
-.It v
-vnode
-.El
-.Pp
-The following vnode types may be displayed:
-.Pp
-.Bl -tag -width X -compact
-.It -
-not a vnode
-.It b
-block device
-.It c
-character device
-.It f
-fifo
-.It l
-symbolic link
-.It s
-socket
-.It x
-revoked device
-.El
-.Pp
-The following file descriptor flags may be displayed:
-.Pp
-.Bl -tag -width X -compact
-.It r
-read
-.It w
-write
-.It a
-append
-.It s
-async
-.It f
-fsync
-.It n
-non-blocking
-.It d
-direct I/O
-.It l
-lock held
-.El
-.Ss Kernel Thread Stacks
-Display kernel thread stacks for a process, allowing further interpretation
-of thread wait channels.
-If the
-.Fl k
-flag is reeated, function offsets, not just function names, are printed.
-.Pp
-This feature requires
-.Cd "options STACK"
-or
-.Cd "options DDB"
-to be compiled into the kernel.
-.Pp
-.Bl -tag -width indent -compact
-.It PID
-process ID
-.It TID
-thread ID
-.It COMM
-command
-.It TDNAME
-thread name
-.It KSTACK
-kernel thread call stack
-.El
-.Ss Security Credentials
-Display process credential information:
-.Pp
-.Bl -tag -width indent -compact
-.It PID
-process ID
-.It COMM
-command
-.It EUID
-effective user ID
-.It RUID
-real user ID
-.It SVUID
-saved user ID
-.It EGID
-effective group ID
-.It RGID
-real group ID
-.It SVGID
-saved group ID
-.It GROUPS
-group set
-.El
-.Ss Thread Information
-Display per-thread information, including process ID, per-thread ID, name,
-CPU, and execution state:
-.Pp
-.Bl -tag -width indent -compact
-.It PID
-process ID
-.It TID
-thread ID
-.It COMM
-command
-.It TDNAME
-thread name
-.It CPU
-current or most recent CPU run on
-.It PRI
-thread priority
-.It STATE
-thread state
-.It WCHAN
-thread wait channel
-.El
-.Ss Virtual Memory Mappings
-Display process virtual memory mappings, including addresses, mapping
-meta-data, and mapped object information:
-.Pp
-.Bl -tag -width indent -compact
-.It PID
-process ID
-.It START
-starting address of mapping
-.It END
-ending address of mapping
-.It PRT
-protection flags
-.It RES
-resident pages
-.It PRES
-private resident pages
-.It REF
-reference count
-.It SHD
-shadow page count
-.It FL
-mapping flags
-.It TP
-VM object type
-.El
-.Pp
-The following protection flags may be displayed:
-.Pp
-.Bl -tag -width X -compact
-.It r
-read
-.It w
-write
-.It x
-execute
-.El
-.Pp
-The following VM object types may be displayed:
-.Pp
-.Bl -tag -width XX -compact
-.It --
-none
-.It dd
-dead
-.It df
-default
-.It dv
-device
-.It ph
-physical
-.It sw
-swap
-.It vn
-vnode
-.El
-.Pp
-The following mapping flags may be displayed:
-.Pp
-.Bl -tag -width X -compact
-.It C
-copy-on-write
-.It N
-needs copy
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr fstat 1 ,
-.Xr ps 1 ,
-.Xr sockstat 1 ,
-.Xr ddb 4 ,
-.Xr stack 9
-.Sh AUTHORS
-.An Robert N M Watson
-.Sh BUGS
-Some field values may include spaces, which limits the extent to which the
-output of
-.Nm
-may be mechanically parsed.
-.Pp
-The display of open file or memory mapping pathnames is implemented using the
-kernel's name cache.
-It therefore does not work for file systems
-that do not use the name cache, such as
-.Xr devfs 4 ,
-or if the name is not present in the cache due to removal.
-.Pp
-.Nm
-currently supports extracting data only from a live kernel, and not from
-kernel crash dumps.
diff --git a/usr.bin/procstat/procstat.c b/usr.bin/procstat/procstat.c
deleted file mode 100644
index 48f7051..0000000
--- a/usr.bin/procstat/procstat.c
+++ /dev/null
@@ -1,253 +0,0 @@
-/*-
- * Copyright (c) 2007 Robert N. M. Watson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#include <sys/user.h>
-
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sysexits.h>
-#include <unistd.h>
-
-#include "procstat.h"
-
-static int aflag, bflag, cflag, fflag, kflag, sflag, tflag, vflag;
-int hflag;
-
-static void
-usage(void)
-{
-
- fprintf(stderr, "usage: procstat [-h] [-w interval] [-b | -c | -f | "
- "-k | -s | -t | -v]\n");
- fprintf(stderr, " [-a | pid ...]\n");
- exit(EX_USAGE);
-}
-
-static void
-procstat(pid_t pid, struct kinfo_proc *kipp)
-{
-
- if (bflag)
- procstat_bin(pid, kipp);
- else if (cflag)
- procstat_args(pid, kipp);
- else if (fflag)
- procstat_files(pid, kipp);
- else if (kflag)
- procstat_kstack(pid, kipp, kflag);
- else if (sflag)
- procstat_cred(pid, kipp);
- else if (tflag)
- procstat_threads(pid, kipp);
- else if (vflag)
- procstat_vm(pid, kipp);
- else
- procstat_basic(pid, kipp);
-}
-
-/*
- * Sort processes first by pid and then tid.
- */
-static int
-kinfo_proc_compare(const void *a, const void *b)
-{
- int i;
-
- i = ((const struct kinfo_proc *)a)->ki_pid -
- ((const struct kinfo_proc *)b)->ki_pid;
- if (i != 0)
- return (i);
- i = ((const struct kinfo_proc *)a)->ki_tid -
- ((const struct kinfo_proc *)b)->ki_tid;
- return (i);
-}
-
-void
-kinfo_proc_sort(struct kinfo_proc *kipp, int count)
-{
-
- qsort(kipp, count, sizeof(*kipp), kinfo_proc_compare);
-}
-
-int
-main(int argc, char *argv[])
-{
- int ch, interval, name[4], tmp;
- unsigned int i;
- struct kinfo_proc *kipp;
- size_t len;
- long l;
- pid_t pid;
- char *dummy;
-
- interval = 0;
- while ((ch = getopt(argc, argv, "abcfkhstvw:")) != -1) {
- switch (ch) {
- case 'a':
- aflag++;
- break;
-
- case 'b':
- bflag++;
- break;
-
- case 'c':
- cflag++;
- break;
-
- case 'f':
- fflag++;
- break;
-
- case 'k':
- kflag++;
- break;
-
- case 'h':
- hflag++;
- break;
-
- case 's':
- sflag++;
- break;
-
- case 't':
- tflag++;
- break;
-
- case 'v':
- vflag++;
- break;
-
- case 'w':
- l = strtol(optarg, &dummy, 10);
- if (*dummy != '\0')
- usage();
- if (l < 1 || l > INT_MAX)
- usage();
- interval = l;
- break;
-
- case '?':
- default:
- usage();
- }
-
- }
- argc -= optind;
- argv += optind;
-
- /* We require that either 0 or 1 mode flags be set. */
- tmp = bflag + cflag + fflag + (kflag ? 1 : 0) + sflag + tflag + vflag;
- if (!(tmp == 0 || tmp == 1))
- usage();
-
- /* We allow -k to be specified up to twice, but not more. */
- if (kflag > 2)
- usage();
-
- /* Must specify either the -a flag or a list of pids. */
- if (!(aflag == 1 && argc == 0) && !(aflag == 0 && argc > 0))
- usage();
-
- do {
- if (aflag) {
- name[0] = CTL_KERN;
- name[1] = KERN_PROC;
- name[2] = KERN_PROC_PROC;
-
- len = 0;
- if (sysctl(name, 3, NULL, &len, NULL, 0) < 0)
- err(-1, "sysctl: kern.proc.all");
-
- kipp = malloc(len);
- if (kipp == NULL)
- err(-1, "malloc");
-
- if (sysctl(name, 3, kipp, &len, NULL, 0) < 0) {
- free(kipp);
- err(-1, "sysctl: kern.proc.all");
- }
- if (len % sizeof(*kipp) != 0)
- err(-1, "kinfo_proc mismatch");
- if (kipp->ki_structsize != sizeof(*kipp))
- err(-1, "kinfo_proc structure mismatch");
- kinfo_proc_sort(kipp, len / sizeof(*kipp));
- for (i = 0; i < len / sizeof(*kipp); i++) {
- procstat(kipp[i].ki_pid, &kipp[i]);
-
- /* Suppress header after first process. */
- hflag = 1;
- }
- free(kipp);
- }
- for (i = 0; i < (unsigned int)argc; i++) {
- l = strtol(argv[i], &dummy, 10);
- if (*dummy != '\0')
- usage();
- if (l < 0)
- usage();
- pid = l;
-
- name[0] = CTL_KERN;
- name[1] = KERN_PROC;
- name[2] = KERN_PROC_PID;
- name[3] = pid;
-
- len = 0;
- if (sysctl(name, 4, NULL, &len, NULL, 0) < 0)
- err(-1, "sysctl: kern.proc.pid: %d", pid);
-
- kipp = malloc(len);
- if (kipp == NULL)
- err(-1, "malloc");
-
- if (sysctl(name, 4, kipp, &len, NULL, 0) < 0) {
- free(kipp);
- err(-1, "sysctl: kern.proc.pid: %d", pid);
- }
- if (len != sizeof(*kipp))
- err(-1, "kinfo_proc mismatch");
- if (kipp->ki_structsize != sizeof(*kipp))
- errx(-1, "kinfo_proc structure mismatch");
- if (kipp->ki_pid != pid)
- errx(-1, "kinfo_proc pid mismatch");
- procstat(pid, kipp);
- free(kipp);
-
- /* Suppress header after first process. */
- hflag = 1;
- }
- if (interval)
- sleep(interval);
- } while (interval);
- exit(0);
-}
diff --git a/usr.bin/procstat/procstat.h b/usr.bin/procstat/procstat.h
deleted file mode 100644
index 8bacab7..0000000
--- a/usr.bin/procstat/procstat.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*-
- * Copyright (c) 2007 Robert N. M. Watson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef PROCSTAT_H
-#define PROCSTAT_H
-
-extern int hflag;
-
-struct kinfo_proc;
-void kinfo_proc_sort(struct kinfo_proc *kipp, int count);
-
-void procstat_args(pid_t pid, struct kinfo_proc *kipp);
-void procstat_basic(pid_t pid, struct kinfo_proc *kipp);
-void procstat_bin(pid_t pid, struct kinfo_proc *kipp);
-void procstat_cred(pid_t pid, struct kinfo_proc *kipp);
-void procstat_files(pid_t pid, struct kinfo_proc *kipp);
-void procstat_kstack(pid_t pid, struct kinfo_proc *kipp, int kflag);
-void procstat_threads(pid_t pid, struct kinfo_proc *kipp);
-void procstat_vm(pid_t pid, struct kinfo_proc *kipp);
-
-#endif /* !PROCSTAT_H */
diff --git a/usr.bin/procstat/procstat_args.c b/usr.bin/procstat/procstat_args.c
deleted file mode 100644
index 84da1d8..0000000
--- a/usr.bin/procstat/procstat_args.c
+++ /dev/null
@@ -1,76 +0,0 @@
-/*-
- * Copyright (c) 2007 Robert N. M. Watson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#include <sys/user.h>
-
-#include <err.h>
-#include <errno.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "procstat.h"
-
-static char args[ARG_MAX];
-
-void
-procstat_args(pid_t pid, struct kinfo_proc *kipp)
-{
- int error, name[4];
- size_t len;
- char *cp;
-
- if (!hflag)
- printf("%5s %-16s %-53s\n", "PID", "COMM", "ARGS");
-
- name[0] = CTL_KERN;
- name[1] = KERN_PROC;
- name[2] = KERN_PROC_ARGS;
- name[3] = pid;
- len = sizeof(args);
- error = sysctl(name, 4, args, &len, NULL, 0);
- if (error < 0 && errno != ESRCH) {
- warn("sysctl: kern.proc.args: %d", pid);
- return;
- }
- if (error < 0)
- return;
- if (len == 0 || strlen(args) == 0) {
- strcpy(args, "-");
- len = strlen(args) + 1;
- }
-
- printf("%5d ", pid);
- printf("%-16s ", kipp->ki_comm);
- for (cp = args; cp < args + len; cp += strlen(cp) + 1)
- printf("%s%s", cp != args ? " " : "", cp);
- printf("\n");
-}
diff --git a/usr.bin/procstat/procstat_basic.c b/usr.bin/procstat/procstat_basic.c
deleted file mode 100644
index 7d7928c..0000000
--- a/usr.bin/procstat/procstat_basic.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/*-
- * Copyright (c) 2007 Robert N. M. Watson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#include <sys/user.h>
-
-#include <err.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "procstat.h"
-
-void
-procstat_basic(pid_t pid __unused, struct kinfo_proc *kipp)
-{
-
- if (!hflag)
- printf("%5s %5s %5s %5s %5s %3s %-8s %-9s %-13s %-12s\n",
- "PID", "PPID", "PGID", "SID", "TSID", "THR", "LOGIN",
- "WCHAN", "EMUL", "COMM");
-
- printf("%5d ", kipp->ki_pid);
- printf("%5d ", kipp->ki_ppid);
- printf("%5d ", kipp->ki_pgid);
- printf("%5d ", kipp->ki_sid);
- printf("%5d ", kipp->ki_tsid);
- printf("%3d ", kipp->ki_numthreads);
- printf("%-8s ", strlen(kipp->ki_login) ? kipp->ki_login : "-");
- if (kipp->ki_kiflag & KI_LOCKBLOCK) {
- printf("*%-8s ", strlen(kipp->ki_lockname) ?
- kipp->ki_lockname : "-");
- } else {
- printf("%-9s ", strlen(kipp->ki_wmesg) ?
- kipp->ki_wmesg : "-");
- }
- printf("%-13s ", strcmp(kipp->ki_emul, "null") ? kipp->ki_emul : "-");
- printf("%-12s\n", kipp->ki_comm);
-}
diff --git a/usr.bin/procstat/procstat_bin.c b/usr.bin/procstat/procstat_bin.c
deleted file mode 100644
index 178d0a4..0000000
--- a/usr.bin/procstat/procstat_bin.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/*-
- * Copyright (c) 2007 Robert N. M. Watson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#include <sys/user.h>
-
-#include <err.h>
-#include <errno.h>
-#include <limits.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "procstat.h"
-
-void
-procstat_bin(pid_t pid, struct kinfo_proc *kipp)
-{
- char pathname[PATH_MAX];
- int error, name[4];
- size_t len;
-
- if (!hflag)
- printf("%5s %-16s %-53s\n", "PID", "COMM", "PATH");
-
- name[0] = CTL_KERN;
- name[1] = KERN_PROC;
- name[2] = KERN_PROC_PATHNAME;
- name[3] = pid;
-
- len = sizeof(pathname);
- error = sysctl(name, 4, pathname, &len, NULL, 0);
- if (error < 0 && errno != ESRCH) {
- warn("sysctl: kern.proc.pathname: %d", pid);
- return;
- }
- if (error < 0)
- return;
- if (len == 0 || strlen(pathname) == 0)
- strcpy(pathname, "-");
-
- printf("%5d ", pid);
- printf("%-16s ", kipp->ki_comm);
- printf("%s\n", pathname);
-}
diff --git a/usr.bin/procstat/procstat_cred.c b/usr.bin/procstat/procstat_cred.c
deleted file mode 100644
index 82ac6ad..0000000
--- a/usr.bin/procstat/procstat_cred.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/*-
- * Copyright (c) 2007 Robert N. M. Watson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#include <sys/user.h>
-
-#include <err.h>
-#include <stdio.h>
-
-#include "procstat.h"
-
-void
-procstat_cred(pid_t pid, struct kinfo_proc *kipp)
-{
- int i;
-
- if (!hflag)
- printf("%5s %-16s %5s %5s %5s %5s %5s %5s %-20s\n", "PID",
- "COMM", "EUID", "RUID", "SVUID", "EGID", "RGID", "SVGID",
- "GROUPS");
-
- printf("%5d ", pid);
- printf("%-16s ", kipp->ki_comm);
- printf("%5d ", kipp->ki_uid);
- printf("%5d ", kipp->ki_ruid);
- printf("%5d ", kipp->ki_svuid);
- printf("%5d ", kipp->ki_groups[0]);
- printf("%5d ", kipp->ki_rgid);
- printf("%5d ", kipp->ki_svgid);
- for (i = 0; i < kipp->ki_ngroups; i++)
- printf("%s%d", (i > 0) ? "," : "", kipp->ki_groups[i]);
- printf("\n");
-}
diff --git a/usr.bin/procstat/procstat_files.c b/usr.bin/procstat/procstat_files.c
deleted file mode 100644
index 3667913..0000000
--- a/usr.bin/procstat/procstat_files.c
+++ /dev/null
@@ -1,342 +0,0 @@
-/*-
- * Copyright (c) 2007 Robert N. M. Watson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/sysctl.h>
-#include <sys/un.h>
-#include <sys/user.h>
-
-#include <netinet/in.h>
-
-#include <arpa/inet.h>
-
-#include <err.h>
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "procstat.h"
-
-static const char *
-protocol_to_string(int domain, int type, int protocol)
-{
-
- switch (domain) {
- case AF_INET:
- case AF_INET6:
- switch (protocol) {
- case IPPROTO_TCP:
- return ("TCP");
- case IPPROTO_UDP:
- return ("UDP");
- case IPPROTO_ICMP:
- return ("ICM");
- case IPPROTO_RAW:
- return ("RAW");
- case IPPROTO_SCTP:
- return ("SCT");
- case IPPROTO_DIVERT:
- return ("IPD");
- default:
- return ("IP?");
- }
-
- case AF_LOCAL:
- switch (type) {
- case SOCK_STREAM:
- return ("UDS");
- case SOCK_DGRAM:
- return ("UDD");
- default:
- return ("UD?");
- }
- default:
- return ("?");
- }
-}
-
-static void
-addr_to_string(struct sockaddr_storage *ss, char *buffer, int buflen)
-{
- char buffer2[INET6_ADDRSTRLEN];
- struct sockaddr_in6 *sin6;
- struct sockaddr_in *sin;
- struct sockaddr_un *sun;
-
- switch (ss->ss_family) {
- case AF_LOCAL:
- sun = (struct sockaddr_un *)ss;
- if (strlen(sun->sun_path) == 0)
- strlcpy(buffer, "-", buflen);
- else
- strlcpy(buffer, sun->sun_path, buflen);
- break;
-
- case AF_INET:
- sin = (struct sockaddr_in *)ss;
- snprintf(buffer, buflen, "%s:%d", inet_ntoa(sin->sin_addr),
- ntohs(sin->sin_port));
- break;
-
- case AF_INET6:
- sin6 = (struct sockaddr_in6 *)ss;
- if (inet_ntop(AF_INET6, &sin6->sin6_addr, buffer2,
- sizeof(buffer2)) != NULL)
- snprintf(buffer, buflen, "%s.%d", buffer2,
- ntohs(sin6->sin6_port));
- else
- strlcpy(buffer, "-", sizeof(buffer));
- break;
-
- default:
- strlcpy(buffer, "", buflen);
- break;
- }
-}
-
-static void
-print_address(struct sockaddr_storage *ss)
-{
- char addr[PATH_MAX];
-
- addr_to_string(ss, addr, sizeof(addr));
- printf("%s", addr);
-}
-
-void
-procstat_files(pid_t pid, struct kinfo_proc *kipp)
-{
- struct kinfo_file *freep, *kif;
- int error, name[4];
- unsigned int i;
- const char *str;
- size_t len;
-
- if (!hflag)
- printf("%5s %-16s %4s %1s %1s %-8s %3s %7s %-3s %-12s\n",
- "PID", "COMM", "FD", "T", "V", "FLAGS", "REF", "OFFSET",
- "PRO", "NAME");
-
- name[0] = CTL_KERN;
- name[1] = KERN_PROC;
- name[2] = KERN_PROC_FILEDESC;
- name[3] = pid;
-
- error = sysctl(name, 4, NULL, &len, NULL, 0);
- if (error < 0 && errno != ESRCH && errno != EPERM) {
- warn("sysctl: kern.proc.filedesc: %d", pid);
- return;
- }
- if (error < 0)
- return;
-
- freep = kif = malloc(len);
- if (kif == NULL)
- err(-1, "malloc");
-
- if (sysctl(name, 4, kif, &len, NULL, 0) < 0) {
- warn("sysctl: kern.proc.filedesc %d", pid);
- free(freep);
- return;
- }
-
- for (i = 0; i < len / sizeof(*kif); i++, kif++) {
- if (kif->kf_structsize != sizeof(*kif))
- errx(-1, "kinfo_file mismatch");
- printf("%5d ", pid);
- printf("%-16s ", kipp->ki_comm);
- switch (kif->kf_fd) {
- case KF_FD_TYPE_CWD:
- printf(" cwd ");
- break;
-
- case KF_FD_TYPE_ROOT:
- printf("root ");
- break;
-
- case KF_FD_TYPE_JAIL:
- printf("jail ");
- break;
-
- default:
- printf("%4d ", kif->kf_fd);
- break;
- }
- switch (kif->kf_type) {
- case KF_TYPE_VNODE:
- str = "v";
- break;
-
- case KF_TYPE_SOCKET:
- str = "s";
- break;
-
- case KF_TYPE_PIPE:
- str = "p";
- break;
-
- case KF_TYPE_FIFO:
- str = "f";
- break;
-
- case KF_TYPE_KQUEUE:
- str = "k";
- break;
-
- case KF_TYPE_CRYPTO:
- str = "c";
- break;
-
- case KF_TYPE_MQUEUE:
- str = "m";
- break;
-
- case KF_TYPE_SHM:
- str = "h";
- break;
-
- case KF_TYPE_PTS:
- str = "t";
- break;
-
- case KF_TYPE_SEM:
- str = "e";
- break;
-
- case KF_TYPE_NONE:
- case KF_TYPE_UNKNOWN:
- default:
- str = "?";
- break;
- }
- printf("%1s ", str);
- str = "-";
- if (kif->kf_type == KF_TYPE_VNODE) {
- switch (kif->kf_vnode_type) {
- case KF_VTYPE_VREG:
- str = "r";
- break;
-
- case KF_VTYPE_VDIR:
- str = "d";
- break;
-
- case KF_VTYPE_VBLK:
- str = "b";
- break;
-
- case KF_VTYPE_VCHR:
- str = "c";
- break;
-
- case KF_VTYPE_VLNK:
- str = "l";
- break;
-
- case KF_VTYPE_VSOCK:
- str = "s";
- break;
-
- case KF_VTYPE_VFIFO:
- str = "f";
- break;
-
- case KF_VTYPE_VBAD:
- str = "x";
- break;
-
- case KF_VTYPE_VNON:
- case KF_VTYPE_UNKNOWN:
- default:
- str = "?";
- break;
- }
- }
- printf("%1s ", str);
- printf("%s", kif->kf_flags & KF_FLAG_READ ? "r" : "-");
- printf("%s", kif->kf_flags & KF_FLAG_WRITE ? "w" : "-");
- printf("%s", kif->kf_flags & KF_FLAG_APPEND ? "a" : "-");
- printf("%s", kif->kf_flags & KF_FLAG_ASYNC ? "s" : "-");
- printf("%s", kif->kf_flags & KF_FLAG_FSYNC ? "f" : "-");
- printf("%s", kif->kf_flags & KF_FLAG_NONBLOCK ? "n" : "-");
- printf("%s", kif->kf_flags & KF_FLAG_DIRECT ? "d" : "-");
- printf("%s ", kif->kf_flags & KF_FLAG_HASLOCK ? "l" : "-");
- if (kif->kf_ref_count > -1)
- printf("%3d ", kif->kf_ref_count);
- else
- printf("%3c ", '-');
- if (kif->kf_offset > -1)
- printf("%7jd ", (intmax_t)kif->kf_offset);
- else
- printf("%7c ", '-');
-
- switch (kif->kf_type) {
- case KF_TYPE_VNODE:
- case KF_TYPE_FIFO:
- case KF_TYPE_PTS:
- printf("%-3s ", "-");
- printf("%-18s", kif->kf_path);
- break;
-
- case KF_TYPE_SOCKET:
- printf("%-3s ",
- protocol_to_string(kif->kf_sock_domain,
- kif->kf_sock_type, kif->kf_sock_protocol));
- /*
- * While generally we like to print two addresses,
- * local and peer, for sockets, it turns out to be
- * more useful to print the first non-nul address for
- * local sockets, as typically they aren't bound and
- * connected, and the path strings can get long.
- */
- if (kif->kf_sock_domain == AF_LOCAL) {
- struct sockaddr_un *sun =
- (struct sockaddr_un *)&kif->kf_sa_local;
-
- if (sun->sun_path[0] != 0)
- print_address(&kif->kf_sa_local);
- else
- print_address(&kif->kf_sa_peer);
- } else {
- print_address(&kif->kf_sa_local);
- printf(" ");
- print_address(&kif->kf_sa_peer);
- }
- break;
-
- default:
- printf("%-3s ", "-");
- printf("%-18s", "-");
- }
-
- printf("\n");
- }
- free(freep);
-}
diff --git a/usr.bin/procstat/procstat_kstack.c b/usr.bin/procstat/procstat_kstack.c
deleted file mode 100644
index bd7c34c..0000000
--- a/usr.bin/procstat/procstat_kstack.c
+++ /dev/null
@@ -1,246 +0,0 @@
-/*-
- * Copyright (c) 2007 Robert N. M. Watson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#include <sys/user.h>
-
-#include <err.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "procstat.h"
-
-/*
- * Walk the stack trace provided by the kernel and reduce it to what we
- * actually want to print. This involves stripping true instruction pointers,
- * frame numbers, and carriage returns as generated by stack(9). If -kk is
- * specified, print the function and offset, otherwise just the function.
- */
-enum trace_state { TS_FRAMENUM, TS_PC, TS_AT, TS_FUNC, TS_OFF };
-
-static enum trace_state
-kstack_nextstate(enum trace_state ts)
-{
-
- switch (ts) {
- case TS_FRAMENUM:
- return (TS_PC);
-
- case TS_PC:
- return (TS_AT);
-
- case TS_AT:
- return (TS_FUNC);
-
- case TS_FUNC:
- return (TS_OFF);
-
- case TS_OFF:
- return TS_FRAMENUM;
-
- default:
- errx(-1, "kstack_nextstate");
- }
-}
-
-static void
-kstack_cleanup(const char *old, char *new, int kflag)
-{
- enum trace_state old_ts, ts;
- const char *cp_old;
- char *cp_new;
-
- ts = TS_FRAMENUM;
- for (cp_old = old, cp_new = new; *cp_old != '\0'; cp_old++) {
- switch (*cp_old) {
- case ' ':
- case '\n':
- case '+':
- old_ts = ts;
- ts = kstack_nextstate(old_ts);
- if (old_ts == TS_OFF) {
- *cp_new = ' ';
- cp_new++;
- }
- if (kflag > 1 && old_ts == TS_FUNC) {
- *cp_new = '+';
- cp_new++;
- }
- continue;
- }
- if (ts == TS_FUNC || (kflag > 1 && ts == TS_OFF)) {
- *cp_new = *cp_old;
- cp_new++;
- }
- }
- *cp_new = '\0';
-}
-
-/*
- * Sort threads by tid.
- */
-static int
-kinfo_kstack_compare(const void *a, const void *b)
-{
-
- return ((const struct kinfo_kstack *)a)->kkst_tid -
- ((const struct kinfo_kstack *)b)->kkst_tid;
-}
-
-static void
-kinfo_kstack_sort(struct kinfo_kstack *kkstp, int count)
-{
-
- qsort(kkstp, count, sizeof(*kkstp), kinfo_kstack_compare);
-}
-
-
-void
-procstat_kstack(pid_t pid, struct kinfo_proc *kipp, int kflag)
-{
- struct kinfo_kstack *kkstp, *kkstp_free;
- struct kinfo_proc *kip, *kip_free;
- char trace[KKST_MAXLEN];
- int error, name[4];
- unsigned int i, j;
- size_t kip_len, kstk_len;
-
- if (!hflag)
- printf("%5s %6s %-16s %-16s %-29s\n", "PID", "TID", "COMM",
- "TDNAME", "KSTACK");
-
- name[0] = CTL_KERN;
- name[1] = KERN_PROC;
- name[2] = KERN_PROC_KSTACK;
- name[3] = pid;
-
- kstk_len = 0;
- error = sysctl(name, 4, NULL, &kstk_len, NULL, 0);
- if (error < 0 && errno != ESRCH && errno != EPERM && errno != ENOENT) {
- warn("sysctl: kern.proc.kstack: %d", pid);
- return;
- }
- if (error < 0 && errno == ENOENT) {
- warnx("sysctl: kern.proc.kstack unavailable");
- errx(-1, "options DDB or options STACK required in kernel");
- }
- if (error < 0)
- return;
-
- kkstp = kkstp_free = malloc(kstk_len);
- if (kkstp == NULL)
- err(-1, "malloc");
-
- if (sysctl(name, 4, kkstp, &kstk_len, NULL, 0) < 0) {
- warn("sysctl: kern.proc.pid: %d", pid);
- free(kkstp);
- return;
- }
-
- /*
- * We need to re-query for thread information, so don't use *kipp.
- */
- name[0] = CTL_KERN;
- name[1] = KERN_PROC;
- name[2] = KERN_PROC_PID | KERN_PROC_INC_THREAD;
- name[3] = pid;
-
- kip_len = 0;
- error = sysctl(name, 4, NULL, &kip_len, NULL, 0);
- if (error < 0 && errno != ESRCH) {
- warn("sysctl: kern.proc.pid: %d", pid);
- return;
- }
- if (error < 0)
- return;
-
- kip = kip_free = malloc(kip_len);
- if (kip == NULL)
- err(-1, "malloc");
-
- if (sysctl(name, 4, kip, &kip_len, NULL, 0) < 0) {
- warn("sysctl: kern.proc.pid: %d", pid);
- free(kip);
- return;
- }
-
- kinfo_kstack_sort(kkstp, kstk_len / sizeof(*kkstp));
- for (i = 0; i < kstk_len / sizeof(*kkstp); i++) {
- kkstp = &kkstp_free[i];
-
- /*
- * Look up the specific thread using its tid so we can
- * display the per-thread command line.
- */
- kipp = NULL;
- for (j = 0; j < kip_len / sizeof(*kipp); j++) {
- kipp = &kip_free[j];
- if (kkstp->kkst_tid == kipp->ki_tid)
- break;
- }
- if (kipp == NULL)
- continue;
-
- printf("%5d ", pid);
- printf("%6d ", kkstp->kkst_tid);
- printf("%-16s ", kipp->ki_comm);
- printf("%-16s ", (strlen(kipp->ki_ocomm) &&
- (strcmp(kipp->ki_comm, kipp->ki_ocomm) != 0)) ?
- kipp->ki_ocomm : "-");
-
- switch (kkstp->kkst_state) {
- case KKST_STATE_RUNNING:
- printf("%-29s\n", "<running>");
- continue;
-
- case KKST_STATE_SWAPPED:
- printf("%-29s\n", "<swapped>");
- continue;
-
- case KKST_STATE_STACKOK:
- break;
-
- default:
- printf("%-29s\n", "<unknown>");
- continue;
- }
-
- /*
- * The kernel generates a trace with carriage returns between
- * entries, but for a more compact view, we convert carriage
- * returns to spaces.
- */
- kstack_cleanup(kkstp->kkst_trace, trace, kflag);
- printf("%-29s\n", trace);
- }
- free(kip_free);
- free(kkstp_free);
-}
diff --git a/usr.bin/procstat/procstat_threads.c b/usr.bin/procstat/procstat_threads.c
deleted file mode 100644
index 2f34012..0000000
--- a/usr.bin/procstat/procstat_threads.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/*-
- * Copyright (c) 2007 Robert N. M. Watson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#include <sys/user.h>
-
-#include <err.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "procstat.h"
-
-void
-procstat_threads(pid_t pid, struct kinfo_proc *kipp)
-{
- struct kinfo_proc *kip;
- int error, name[4];
- unsigned int i;
- const char *str;
- size_t len;
-
- if (!hflag)
- printf("%5s %6s %-16s %-16s %2s %4s %-7s %-9s\n", "PID",
- "TID", "COMM", "TDNAME", "CPU", "PRI", "STATE", "WCHAN");
-
- /*
- * We need to re-query for thread information, so don't use *kipp.
- */
- name[0] = CTL_KERN;
- name[1] = KERN_PROC;
- name[2] = KERN_PROC_PID | KERN_PROC_INC_THREAD;
- name[3] = pid;
-
- len = 0;
- error = sysctl(name, 4, NULL, &len, NULL, 0);
- if (error < 0 && errno != ESRCH) {
- warn("sysctl: kern.proc.pid: %d", pid);
- return;
- }
- if (error < 0)
- return;
-
- kip = malloc(len);
- if (kip == NULL)
- err(-1, "malloc");
-
- if (sysctl(name, 4, kip, &len, NULL, 0) < 0) {
- warn("sysctl: kern.proc.pid: %d", pid);
- free(kip);
- return;
- }
-
- kinfo_proc_sort(kip, len / sizeof(*kipp));
- for (i = 0; i < len / sizeof(*kipp); i++) {
- kipp = &kip[i];
- printf("%5d ", pid);
- printf("%6d ", kipp->ki_tid);
- printf("%-16s ", strlen(kipp->ki_comm) ?
- kipp->ki_comm : "-");
- printf("%-16s ", (strlen(kipp->ki_ocomm) &&
- (strcmp(kipp->ki_comm, kipp->ki_ocomm) != 0)) ?
- kipp->ki_ocomm : "-");
- if (kipp->ki_oncpu != 255)
- printf("%3d ", kipp->ki_oncpu);
- else if (kipp->ki_lastcpu != 255)
- printf("%3d ", kipp->ki_lastcpu);
- else
- printf("%3s ", "-");
- printf("%4d ", kipp->ki_pri.pri_level);
- switch (kipp->ki_stat) {
- case SRUN:
- str = "run";
- break;
-
- case SSTOP:
- str = "stop";
- break;
-
- case SSLEEP:
- str = "sleep";
- break;
-
- case SLOCK:
- str = "lock";
- break;
-
- case SWAIT:
- str = "wait";
- break;
-
- case SZOMB:
- str = "zomb";
- break;
-
- case SIDL:
- str = "idle";
- break;
-
- default:
- str = "??";
- break;
- }
- printf("%-7s ", str);
- if (kipp->ki_kiflag & KI_LOCKBLOCK) {
- printf("*%-8s ", strlen(kipp->ki_lockname) ?
- kipp->ki_lockname : "-");
- } else {
- printf("%-9s ", strlen(kipp->ki_wmesg) ?
- kipp->ki_wmesg : "-");
- }
- printf("\n");
- }
- free(kip);
-}
diff --git a/usr.bin/procstat/procstat_vm.c b/usr.bin/procstat/procstat_vm.c
deleted file mode 100644
index a658382..0000000
--- a/usr.bin/procstat/procstat_vm.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/*-
- * Copyright (c) 2007 Robert N. M. Watson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#include <sys/user.h>
-
-#include <err.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "procstat.h"
-
-void
-procstat_vm(pid_t pid, struct kinfo_proc *kipp __unused)
-{
- struct kinfo_vmentry *freep, *kve;
- int error, name[4], ptrwidth;
- unsigned int i;
- const char *str;
- size_t len;
-
- ptrwidth = 2*sizeof(void *) + 2;
- if (!hflag)
- printf("%5s %*s %*s %3s %4s %4s %3s %3s %2s %-2s %-s\n",
- "PID", ptrwidth, "START", ptrwidth, "END", "PRT", "RES",
- "PRES", "REF", "SHD", "FL", "TP", "PATH");
-
- name[0] = CTL_KERN;
- name[1] = KERN_PROC;
- name[2] = KERN_PROC_VMMAP;
- name[3] = pid;
-
- len = 0;
- error = sysctl(name, 4, NULL, &len, NULL, 0);
- if (error < 0 && errno != ESRCH && errno != EPERM) {
- warn("sysctl: kern.proc.vmmap: %d", pid);
- return;
- }
- if (error < 0)
- return;
-
- /*
- * Especially if running procstat -sv, we may need room for more
- * mappings when printing than were present when we queried, so pad
- * out the allocation a bit.
- */
- len += sizeof(*kve) * 3;
- freep = kve = malloc(len);
- if (kve == NULL)
- err(-1, "malloc");
- if (sysctl(name, 4, kve, &len, NULL, 0) < 0) {
- warn("sysctl: kern.proc.vmmap: %d", pid);
- free(freep);
- return;
- }
-
- for (i = 0; i < (len / sizeof(*kve)); i++, kve++) {
- if (kve->kve_structsize != sizeof(*kve))
- errx(-1, "kinfo_vmentry structure mismatch");
- printf("%5d ", pid);
- printf("%*p ", ptrwidth, kve->kve_start);
- printf("%*p ", ptrwidth, kve->kve_end);
- printf("%s", kve->kve_protection & KVME_PROT_READ ? "r" : "-");
- printf("%s", kve->kve_protection & KVME_PROT_WRITE ? "w" : "-");
- printf("%s ", kve->kve_protection & KVME_PROT_EXEC ? "x" : "-");
- printf("%4d ", kve->kve_resident);
- printf("%4d ", kve->kve_private_resident);
- printf("%3d ", kve->kve_ref_count);
- printf("%3d ", kve->kve_shadow_count);
- printf("%-1s", kve->kve_flags & KVME_FLAG_COW ? "C" : "-");
- printf("%-1s ", kve->kve_flags & KVME_FLAG_NEEDS_COPY ? "N" :
- "-");
- switch (kve->kve_type) {
- case KVME_TYPE_NONE:
- str = "--";
- break;
- case KVME_TYPE_DEFAULT:
- str = "df";
- break;
- case KVME_TYPE_VNODE:
- str = "vn";
- break;
- case KVME_TYPE_SWAP:
- str = "sw";
- break;
- case KVME_TYPE_DEVICE:
- str = "dv";
- break;
- case KVME_TYPE_PHYS:
- str = "ph";
- break;
- case KVME_TYPE_DEAD:
- str = "dd";
- break;
- case KVME_TYPE_UNKNOWN:
- default:
- str = "??";
- break;
- }
- printf("%-2s ", str);
- printf("%-s\n", kve->kve_path);
- }
- free(freep);
-}
diff --git a/usr.bin/quota/Makefile b/usr.bin/quota/Makefile
deleted file mode 100644
index a479402..0000000
--- a/usr.bin/quota/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= quota
-BINOWN= root
-
-DPADD= ${LIBRPCSVC} ${LIBUTIL}
-LDADD= -lrpcsvc -lutil
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/quota/quota.1 b/usr.bin/quota/quota.1
deleted file mode 100644
index fb06d44..0000000
--- a/usr.bin/quota/quota.1
+++ /dev/null
@@ -1,180 +0,0 @@
-.\" Copyright (c) 1983, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Robert Elz at The University of Melbourne.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" from: @(#)quota.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd February 3, 2007
-.Dt QUOTA 1
-.Os
-.Sh NAME
-.Nm quota
-.Nd display disk usage and limits
-.Sh SYNOPSIS
-.Nm
-.Op Fl ghlu
-.Op Fl f Ar path
-.Op Fl v | q | r
-.Nm
-.Op Fl hlu
-.Op Fl f Ar path
-.Op Fl v | q | r
-.Ar user ...
-.Nm
-.Fl g
-.Op Fl hl
-.Op Fl f Ar path
-.Op Fl v | q | r
-.Ar group ...
-.Sh DESCRIPTION
-The
-.Nm
-utility displays users' disk usage and limits.
-By default only the user quotas are printed.
-Disk block usage and limits are shown in 1024-byte blocks.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl f Ar path
-Only display quota information for the file system
-that contains the specified path.
-This can be any file within a mounted file system.
-.It Fl g
-Print group quotas for the group
-of which the user is a member.
-.It Fl h
-"Human-readable" output.
-Use unit suffixes: Byte, Kilobyte, Megabyte, Gigabyte, Terabyte and Petabyte.
-.It Fl l
-Do not report quotas on
-.Tn NFS
-file systems.
-.It Fl q
-Print a more terse message,
-containing only information
-on file systems where usage is over quota.
-The
-.Fl q
-flag takes precedence over the
-.Fl v
-flag.
-.It Fl r
-Display the raw quota information as it appears in the quota structure.
-Non-zero time values will also be displayed in
-.Xr ctime 3
-format.
-This option implies
-.Fl v
-and will override the
-.Fl q
-flag.
-.It Fl u
-Print the user quotas.
-This is the default unless
-.Fl g
-is specified.
-.It Fl v
-Display quotas on file systems
-where no storage is allocated.
-.El
-.Pp
-Specifying both
-.Fl g
-and
-.Fl u
-displays both the user quotas and the group quotas (for
-the user).
-.Pp
-Only the super-user may use the
-.Fl u
-flag and the optional
-.Ar user
-argument to view the limits of other users.
-Non-super-users can use the
-.Fl g
-flag and optional
-.Ar group
-argument to view only the limits of groups of which they are members.
-.Pp
-The
-.Nm
-utility tries to report the quotas of all mounted file systems.
-If the file system is mounted via
-.Tn NFS ,
-it will attempt to contact the
-.Xr rpc.rquotad 8
-daemon on the
-.Tn NFS
-server.
-For
-.Tn UFS
-file systems, quotas must be turned on in
-.Pa /etc/fstab .
-If
-.Nm
-exits with a non-zero status, one or more file systems
-are over quota or the path specified with the
-.Fl f
-option does not exist.
-.Pp
-If the
-.Fl l
-flag is specified,
-.Nm
-will not check
-.Tn NFS
-file systems.
-.Sh FILES
-.Bl -tag -width quota.group -compact
-.It Pa quota.user
-located at the file system root with user quotas
-.It Pa quota.group
-located at the file system root with group quotas
-.It Pa /etc/fstab
-to find file system names and locations
-.El
-.Sh SEE ALSO
-.Xr quotactl 2 ,
-.Xr ctime 3 ,
-.Xr fstab 5 ,
-.Xr edquota 8 ,
-.Xr quotacheck 8 ,
-.Xr quotaon 8 ,
-.Xr repquota 8 ,
-.Xr rpc.rquotad 8
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.2 .
diff --git a/usr.bin/quota/quota.c b/usr.bin/quota/quota.c
deleted file mode 100644
index 503b43d..0000000
--- a/usr.bin/quota/quota.c
+++ /dev/null
@@ -1,764 +0,0 @@
-/*
- * Copyright (c) 1980, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Elz at The University of Melbourne.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1990, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "from: @(#)quota.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-
-/*
- * Disk quota reporting program.
- */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/file.h>
-#include <sys/stat.h>
-#include <sys/mount.h>
-#include <sys/socket.h>
-
-#include <rpc/rpc.h>
-#include <rpc/pmap_prot.h>
-#include <rpcsvc/rquota.h>
-
-#include <ufs/ufs/quota.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <fstab.h>
-#include <grp.h>
-#include <libutil.h>
-#include <netdb.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-const char *qfname = QUOTAFILENAME;
-const char *qfextension[] = INITQFNAMES;
-
-struct quotause {
- struct quotause *next;
- long flags;
- struct dqblk dqblk;
- char fsname[MAXPATHLEN + 1];
-};
-
-static char *timeprt(time_t seconds);
-static struct quotause *getprivs(long id, int quotatype);
-static void usage(void);
-static int showuid(u_long uid);
-static int showgid(u_long gid);
-static int showusrname(char *name);
-static int showgrpname(char *name);
-static int showquotas(int type, u_long id, const char *name);
-static void showrawquotas(int type, u_long id, struct quotause *qup);
-static void heading(int type, u_long id, const char *name, const char *tag);
-static int ufshasquota(struct fstab *fs, int type, char **qfnamep);
-static int getufsquota(struct fstab *fs, struct quotause *qup, long id,
- int quotatype);
-static int getnfsquota(struct statfs *fst, struct quotause *qup, long id,
- int quotatype);
-static int callaurpc(char *host, int prognum, int versnum, int procnum,
- xdrproc_t inproc, char *in, xdrproc_t outproc, char *out);
-static int alldigits(char *s);
-
-int hflag;
-int lflag;
-int rflag;
-int qflag;
-int vflag;
-char *filename = NULL;
-
-int
-main(int argc, char *argv[])
-{
- int ngroups;
- gid_t mygid, gidset[NGROUPS];
- int i, ch, gflag = 0, uflag = 0, errflag = 0;
-
- while ((ch = getopt(argc, argv, "f:ghlrquv")) != -1) {
- switch(ch) {
- case 'f':
- filename = optarg;
- break;
- case 'g':
- gflag++;
- break;
- case 'h':
- hflag++;
- break;
- case 'l':
- lflag++;
- break;
- case 'q':
- qflag++;
- break;
- case 'r':
- rflag++;
- break;
- case 'u':
- uflag++;
- break;
- case 'v':
- vflag++;
- break;
- default:
- usage();
- }
- }
- argc -= optind;
- argv += optind;
- if (!uflag && !gflag)
- uflag++;
- if (argc == 0) {
- if (uflag)
- errflag += showuid(getuid());
- if (gflag) {
- mygid = getgid();
- ngroups = getgroups(NGROUPS, gidset);
- if (ngroups < 0)
- err(1, "getgroups");
- errflag += showgid(mygid);
- for (i = 0; i < ngroups; i++)
- if (gidset[i] != mygid)
- errflag += showgid(gidset[i]);
- }
- return(errflag);
- }
- if (uflag && gflag)
- usage();
- if (uflag) {
- for (; argc > 0; argc--, argv++) {
- if (alldigits(*argv))
- errflag += showuid(atoi(*argv));
- else
- errflag += showusrname(*argv);
- }
- return(errflag);
- }
- if (gflag) {
- for (; argc > 0; argc--, argv++) {
- if (alldigits(*argv))
- errflag += showgid(atoi(*argv));
- else
- errflag += showgrpname(*argv);
- }
- }
- return(errflag);
-}
-
-static void
-usage(void)
-{
-
- fprintf(stderr, "%s\n%s\n%s\n",
- "usage: quota [-ghlu] [-f path] [-v | -q | -r]",
- " quota [-hlu] [-f path] [-v | -q | -r] user ...",
- " quota -g [-hl] [-f path] [-v | -q | -r] group ...");
- exit(1);
-}
-
-/*
- * Print out quotas for a specified user identifier.
- */
-static int
-showuid(u_long uid)
-{
- struct passwd *pwd = getpwuid(uid);
- const char *name;
-
- if (pwd == NULL)
- name = "(no account)";
- else
- name = pwd->pw_name;
- return(showquotas(USRQUOTA, uid, name));
-}
-
-/*
- * Print out quotas for a specifed user name.
- */
-static int
-showusrname(char *name)
-{
- struct passwd *pwd = getpwnam(name);
-
- if (pwd == NULL) {
- warnx("%s: unknown user", name);
- return(1);
- }
- return(showquotas(USRQUOTA, pwd->pw_uid, name));
-}
-
-/*
- * Print out quotas for a specified group identifier.
- */
-static int
-showgid(u_long gid)
-{
- struct group *grp = getgrgid(gid);
- const char *name;
-
- if (grp == NULL)
- name = "(no entry)";
- else
- name = grp->gr_name;
- return(showquotas(GRPQUOTA, gid, name));
-}
-
-/*
- * Print out quotas for a specifed group name.
- */
-static int
-showgrpname(char *name)
-{
- struct group *grp = getgrnam(name);
-
- if (grp == NULL) {
- warnx("%s: unknown group", name);
- return(1);
- }
- return(showquotas(GRPQUOTA, grp->gr_gid, name));
-}
-
-static void
-prthumanval(int len, int64_t bytes)
-{
- char buf[len + 1];
-
- humanize_number(buf, sizeof(buf), bytes, "", HN_AUTOSCALE,
- HN_B | HN_NOSPACE | HN_DECIMAL);
-
- (void)printf(" %*s", len, buf);
-}
-
-static int
-showquotas(int type, u_long id, const char *name)
-{
- struct quotause *qup;
- struct quotause *quplist;
- const char *msgi, *msgb;
- const char *nam;
- char *bgrace = NULL, *igrace = NULL;
- int lines = 0, overquota = 0;
- static time_t now;
-
- if (now == 0)
- time(&now);
- quplist = getprivs(id, type);
- for (qup = quplist; qup; qup = qup->next) {
- msgi = (char *)0;
- if (qup->dqblk.dqb_ihardlimit &&
- qup->dqblk.dqb_curinodes >= qup->dqblk.dqb_ihardlimit) {
- overquota++;
- msgi = "File limit reached on";
- }
- else if (qup->dqblk.dqb_isoftlimit &&
- qup->dqblk.dqb_curinodes >= qup->dqblk.dqb_isoftlimit) {
- overquota++;
- if (qup->dqblk.dqb_itime > now)
- msgi = "In file grace period on";
- else
- msgi = "Over file quota on";
- }
- msgb = (char *)0;
- if (qup->dqblk.dqb_bhardlimit &&
- qup->dqblk.dqb_curblocks >= qup->dqblk.dqb_bhardlimit) {
- overquota++;
- msgb = "Block limit reached on";
- }
- else if (qup->dqblk.dqb_bsoftlimit &&
- qup->dqblk.dqb_curblocks >= qup->dqblk.dqb_bsoftlimit) {
- overquota++;
- if (qup->dqblk.dqb_btime > now)
- msgb = "In block grace period on";
- else
- msgb = "Over block quota on";
- }
- if (rflag) {
- showrawquotas(type, id, qup);
- continue;
- }
- if (!vflag &&
- qup->dqblk.dqb_isoftlimit == 0 &&
- qup->dqblk.dqb_ihardlimit == 0 &&
- qup->dqblk.dqb_bsoftlimit == 0 &&
- qup->dqblk.dqb_bhardlimit == 0)
- continue;
- if (qflag) {
- if ((msgi != (char *)0 || msgb != (char *)0) &&
- lines++ == 0)
- heading(type, id, name, "");
- if (msgi != (char *)0)
- printf("\t%s %s\n", msgi, qup->fsname);
- if (msgb != (char *)0)
- printf("\t%s %s\n", msgb, qup->fsname);
- continue;
- }
- if (vflag ||
- qup->dqblk.dqb_curblocks ||
- qup->dqblk.dqb_curinodes) {
- if (lines++ == 0)
- heading(type, id, name, "");
- nam = qup->fsname;
- if (strlen(qup->fsname) > 15) {
- printf("%s\n", qup->fsname);
- nam = "";
- }
- printf("%15s", nam);
- if (hflag) {
- printf(" ");
- prthumanval(4, dbtob(qup->dqblk.dqb_curblocks));
- printf("%c ", (msgb == (char *)0) ? ' ' : '*');
- prthumanval(4, dbtob(qup->dqblk.dqb_bsoftlimit));
- printf(" ");
- prthumanval(4, dbtob(qup->dqblk.dqb_bhardlimit));
- } else {
- printf(" %7ju%c %6ju %7ju",
- (uintmax_t)(dbtob(qup->dqblk.dqb_curblocks)
- / 1024),
- (msgb == NULL) ? ' ' : '*',
- (uintmax_t)(dbtob(qup->dqblk.dqb_bsoftlimit)
- / 1024),
- (uintmax_t)(dbtob(qup->dqblk.dqb_bhardlimit)
- / 1024));
- }
- if (msgb != NULL)
- bgrace = timeprt(qup->dqblk.dqb_btime);
- if (msgi != NULL)
- igrace = timeprt(qup->dqblk.dqb_itime);
- printf(" %7s %7ju%c %6ju %7ju %7s\n",
- (msgb == NULL) ? "" : bgrace,
- (uintmax_t)qup->dqblk.dqb_curinodes,
- (msgi == NULL) ? ' ' : '*',
- (uintmax_t)qup->dqblk.dqb_isoftlimit,
- (uintmax_t)qup->dqblk.dqb_ihardlimit,
- (msgi == NULL) ? "" : igrace
- );
- if (msgb != NULL)
- free(bgrace);
- if (msgi != NULL)
- free(igrace);
- continue;
- }
- }
- if (!qflag && !rflag && lines == 0)
- heading(type, id, name, "none");
- return(overquota);
-}
-
-static void
-showrawquotas(int type, u_long id, struct quotause *qup)
-{
- time_t tt;
- printf("Raw %s quota information for id %lu on %s\n",
- type == USRQUOTA ? "user" : "group", id, qup->fsname);
- printf("block hard limit: %ju\n", (uintmax_t)qup->dqblk.dqb_bhardlimit);
- printf("block soft limit: %ju\n", (uintmax_t)qup->dqblk.dqb_bsoftlimit);
- printf("current block count: %ju\n", (uintmax_t)qup->dqblk.dqb_curblocks);
- printf("i-node hard limit: %ju\n", (uintmax_t)qup->dqblk.dqb_ihardlimit);
- printf("i-node soft limit: %ju\n", (uintmax_t)qup->dqblk.dqb_isoftlimit);
- printf("current i-node count: %ju\n", (uintmax_t)qup->dqblk.dqb_curinodes);
- printf("block grace time: %jd", (intmax_t)qup->dqblk.dqb_btime);
- if (qup->dqblk.dqb_btime != 0) {
- tt = qup->dqblk.dqb_btime;
- printf(" %s", ctime(&tt));
- } else
- printf("\n");
- printf("i-node grace time: %jd", (intmax_t)qup->dqblk.dqb_itime);
- if (qup->dqblk.dqb_itime != 0) {
- tt = qup->dqblk.dqb_itime;
- printf(" %s", ctime(&tt));
- } else
- printf("\n");
-}
-
-
-static void
-heading(int type, u_long id, const char *name, const char *tag)
-{
-
- printf("Disk quotas for %s %s (%cid %lu): %s\n", qfextension[type],
- name, *qfextension[type], id, tag);
- if (!qflag && tag[0] == '\0') {
- printf("%15s %7s %6s %7s %7s %7s %6s %7s %7s\n"
- , "Filesystem"
- , "usage"
- , "quota"
- , "limit"
- , "grace"
- , "files"
- , "quota"
- , "limit"
- , "grace"
- );
- }
-}
-
-/*
- * Calculate the grace period and return a printable string for it.
- */
-static char *
-timeprt(time_t seconds)
-{
- time_t hours, minutes;
- char *buf;
- static time_t now;
-
- if (now == 0)
- time(&now);
- if (now > seconds) {
- return strdup("none");
- }
- seconds -= now;
- minutes = (seconds + 30) / 60;
- hours = (minutes + 30) / 60;
- if (hours >= 36) {
- if (asprintf(&buf, "%lddays", ((long)hours + 12) / 24) < 0)
- errx(1, "asprintf failed in timeprt(1)");
- return (buf);
- }
- if (minutes >= 60) {
- if (asprintf(&buf, "%2ld:%ld", (long)minutes / 60,
- (long)minutes % 60) < 0)
- errx(1, "asprintf failed in timeprt(2)");
- return (buf);
- }
- if (asprintf(&buf, "%2ld", (long)minutes) < 0)
- errx(1, "asprintf failed in timeprt(3)");
- return (buf);
-}
-
-/*
- * Collect the requested quota information.
- */
-static struct quotause *
-getprivs(long id, int quotatype)
-{
- struct quotause *qup, *quptail = NULL;
- struct fstab *fs;
- struct quotause *quphead;
- struct statfs *fst;
- int nfst, i;
- struct statfs sfb;
-
- qup = quphead = (struct quotause *)0;
-
- if (filename != NULL && statfs(filename, &sfb) != 0)
- err(1, "cannot statfs %s", filename);
- nfst = getmntinfo(&fst, MNT_NOWAIT);
- if (nfst == 0)
- errx(2, "no filesystems mounted!");
- setfsent();
- for (i=0; i<nfst; i++) {
- if (qup == NULL) {
- if ((qup = (struct quotause *)malloc(sizeof *qup))
- == NULL)
- errx(2, "out of memory");
- }
- /*
- * See if the user requested a specific file system
- * or specified a file inside a mounted file system.
- */
- if (filename != NULL &&
- strcmp(sfb.f_mntonname, fst[i].f_mntonname) != 0)
- continue;
- if (strcmp(fst[i].f_fstypename, "nfs") == 0) {
- if (lflag)
- continue;
- if (getnfsquota(&fst[i], qup, id, quotatype) == 0)
- continue;
- } else if (strcmp(fst[i].f_fstypename, "ufs") == 0) {
- /*
- * XXX
- * UFS filesystems must be in /etc/fstab, and must
- * indicate that they have quotas on (?!) This is quite
- * unlike SunOS where quotas can be enabled/disabled
- * on a filesystem independent of /etc/fstab, and it
- * will still print quotas for them.
- */
- if ((fs = getfsspec(fst[i].f_mntfromname)) == NULL)
- continue;
- if (getufsquota(fs, qup, id, quotatype) == 0)
- continue;
- } else
- continue;
- strcpy(qup->fsname, fst[i].f_mntonname);
- if (quphead == NULL)
- quphead = qup;
- else
- quptail->next = qup;
- quptail = qup;
- quptail->next = 0;
- qup = NULL;
- }
- if (qup)
- free(qup);
- endfsent();
- return (quphead);
-}
-
-/*
- * Check to see if a particular quota is to be enabled.
- */
-static int
-ufshasquota(struct fstab *fs, int type, char **qfnamep)
-{
- char *opt;
- char *cp;
- struct statfs sfb;
- static char initname, usrname[100], grpname[100];
- static char buf[BUFSIZ];
-
- if (!initname) {
- (void)snprintf(usrname, sizeof(usrname), "%s%s",
- qfextension[USRQUOTA], qfname);
- (void)snprintf(grpname, sizeof(grpname), "%s%s",
- qfextension[GRPQUOTA], qfname);
- initname = 1;
- }
- strcpy(buf, fs->fs_mntops);
- for (opt = strtok(buf, ","); opt; opt = strtok(NULL, ",")) {
- if ((cp = index(opt, '=')))
- *cp++ = '\0';
- if (type == USRQUOTA && strcmp(opt, usrname) == 0)
- break;
- if (type == GRPQUOTA && strcmp(opt, grpname) == 0)
- break;
- }
- if (!opt)
- return (0);
- if (cp)
- *qfnamep = cp;
- else {
- (void)snprintf(buf, sizeof(buf), "%s/%s.%s", fs->fs_file,
- qfname, qfextension[type]);
- *qfnamep = buf;
- }
- if (statfs(fs->fs_file, &sfb) != 0) {
- warn("cannot statfs mount point %s", fs->fs_file);
- return (0);
- }
- if (strcmp(fs->fs_file, sfb.f_mntonname)) {
- warnx("%s not mounted for %s quotas", fs->fs_file,
- type == USRQUOTA ? "user" : "group");
- return (0);
- }
- return (1);
-}
-
-static int
-getufsquota(struct fstab *fs, struct quotause *qup, long id, int quotatype)
-{
- char *qfpathname;
- int fd, qcmd;
-
- qcmd = QCMD(Q_GETQUOTA, quotatype);
- if (!ufshasquota(fs, quotatype, &qfpathname))
- return (0);
-
- if (quotactl(fs->fs_file, qcmd, id, (char *)&qup->dqblk) != 0) {
- if ((fd = open(qfpathname, O_RDONLY)) < 0) {
- warn("%s", qfpathname);
- return (0);
- }
- (void) lseek(fd, (off_t)(id * sizeof(struct dqblk)), L_SET);
- switch (read(fd, &qup->dqblk, sizeof(struct dqblk))) {
- case 0: /* EOF */
- /*
- * Convert implicit 0 quota (EOF)
- * into an explicit one (zero'ed dqblk)
- */
- bzero((caddr_t)&qup->dqblk, sizeof(struct dqblk));
- break;
- case sizeof(struct dqblk): /* OK */
- break;
- default: /* ERROR */
- warn("read error: %s", qfpathname);
- close(fd);
- return (0);
- }
- close(fd);
- }
- return (1);
-}
-
-static int
-getnfsquota(struct statfs *fst, struct quotause *qup, long id, int quotatype)
-{
- struct getquota_args gq_args;
- struct getquota_rslt gq_rslt;
- struct dqblk *dqp = &qup->dqblk;
- struct timeval tv;
- char *cp;
-
- if (fst->f_flags & MNT_LOCAL)
- return (0);
-
- /*
- * rpc.rquotad does not support group quotas
- */
- if (quotatype != USRQUOTA)
- return (0);
-
- /*
- * must be some form of "hostname:/path"
- */
- cp = strchr(fst->f_mntfromname, ':');
- if (cp == NULL) {
- warnx("cannot find hostname for %s", fst->f_mntfromname);
- return (0);
- }
-
- *cp = '\0';
- if (*(cp+1) != '/') {
- *cp = ':';
- return (0);
- }
-
- /* Avoid attempting the RPC for special amd(8) filesystems. */
- if (strncmp(fst->f_mntfromname, "pid", 3) == 0 &&
- strchr(fst->f_mntfromname, '@') != NULL) {
- *cp = ':';
- return (0);
- }
-
- gq_args.gqa_pathp = cp + 1;
- gq_args.gqa_uid = id;
- if (callaurpc(fst->f_mntfromname, RQUOTAPROG, RQUOTAVERS,
- RQUOTAPROC_GETQUOTA, (xdrproc_t)xdr_getquota_args, (char *)&gq_args,
- (xdrproc_t)xdr_getquota_rslt, (char *)&gq_rslt) != 0) {
- *cp = ':';
- return (0);
- }
-
- switch (gq_rslt.status) {
- case Q_NOQUOTA:
- break;
- case Q_EPERM:
- warnx("quota permission error, host: %s",
- fst->f_mntfromname);
- break;
- case Q_OK:
- gettimeofday(&tv, NULL);
- /* blocks*/
- dqp->dqb_bhardlimit =
- gq_rslt.getquota_rslt_u.gqr_rquota.rq_bhardlimit *
- (gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsize / DEV_BSIZE);
- dqp->dqb_bsoftlimit =
- gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsoftlimit *
- (gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsize / DEV_BSIZE);
- dqp->dqb_curblocks =
- gq_rslt.getquota_rslt_u.gqr_rquota.rq_curblocks *
- (gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsize / DEV_BSIZE);
- /* inodes */
- dqp->dqb_ihardlimit =
- gq_rslt.getquota_rslt_u.gqr_rquota.rq_fhardlimit;
- dqp->dqb_isoftlimit =
- gq_rslt.getquota_rslt_u.gqr_rquota.rq_fsoftlimit;
- dqp->dqb_curinodes =
- gq_rslt.getquota_rslt_u.gqr_rquota.rq_curfiles;
- /* grace times */
- dqp->dqb_btime =
- tv.tv_sec + gq_rslt.getquota_rslt_u.gqr_rquota.rq_btimeleft;
- dqp->dqb_itime =
- tv.tv_sec + gq_rslt.getquota_rslt_u.gqr_rquota.rq_ftimeleft;
- *cp = ':';
- return (1);
- default:
- warnx("bad rpc result, host: %s", fst->f_mntfromname);
- break;
- }
- *cp = ':';
- return (0);
-}
-
-static int
-callaurpc(char *host, int prognum, int versnum, int procnum,
- xdrproc_t inproc, char *in, xdrproc_t outproc, char *out)
-{
- struct sockaddr_in server_addr;
- enum clnt_stat clnt_stat;
- struct hostent *hp;
- struct timeval timeout, tottimeout;
-
- CLIENT *client = NULL;
- int sock = RPC_ANYSOCK;
-
- if ((hp = gethostbyname(host)) == NULL)
- return ((int) RPC_UNKNOWNHOST);
- timeout.tv_usec = 0;
- timeout.tv_sec = 6;
- bcopy(hp->h_addr, &server_addr.sin_addr,
- MIN(hp->h_length,(int)sizeof(server_addr.sin_addr)));
- server_addr.sin_family = AF_INET;
- server_addr.sin_port = 0;
-
- if ((client = clntudp_create(&server_addr, prognum,
- versnum, timeout, &sock)) == NULL)
- return ((int) rpc_createerr.cf_stat);
-
- client->cl_auth = authunix_create_default();
- tottimeout.tv_sec = 25;
- tottimeout.tv_usec = 0;
- clnt_stat = clnt_call(client, procnum, inproc, in,
- outproc, out, tottimeout);
-
- return ((int) clnt_stat);
-}
-
-static int
-alldigits(char *s)
-{
- int c;
-
- c = *s++;
- do {
- if (!isdigit(c))
- return (0);
- } while ((c = *s++));
- return (1);
-}
diff --git a/usr.bin/renice/Makefile b/usr.bin/renice/Makefile
deleted file mode 100644
index d547137..0000000
--- a/usr.bin/renice/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/9/93
-# $FreeBSD$
-
-PROG= renice
-MAN= renice.8
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/renice/renice.8 b/usr.bin/renice/renice.8
deleted file mode 100644
index 4420d8e..0000000
--- a/usr.bin/renice/renice.8
+++ /dev/null
@@ -1,140 +0,0 @@
-.\" Copyright (c) 1983, 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)renice.8 8.1 (Berkeley) 6/9/93
-.\" $FreeBSD$
-.\"
-.Dd June 9, 1993
-.Dt RENICE 8
-.Os
-.Sh NAME
-.Nm renice
-.Nd alter priority of running processes
-.Sh SYNOPSIS
-.Nm
-.Ar priority
-.Op Oo Fl p Oc Ar pid ...
-.Op Oo Fl g Oc Ar pgrp ...
-.Op Oo Fl u Oc Ar user ...
-.Nm
-.Fl n Ar increment
-.Op Oo Fl p Oc Ar pid ...
-.Op Oo Fl g Oc Ar pgrp ...
-.Op Oo Fl u Oc Ar user ...
-.Sh DESCRIPTION
-The
-.Nm
-utility alters the
-scheduling priority of one or more running processes.
-The following
-.Ar who
-parameters are interpreted as process ID's, process group
-ID's, user ID's or user names.
-The
-.Nm Ns 'ing
-of a process group causes all processes in the process group
-to have their scheduling priority altered.
-The
-.Nm Ns 'ing
-of a user causes all processes owned by the user to have
-their scheduling priority altered.
-By default, the processes to be affected are specified by
-their process ID's.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl g
-Force
-.Ar who
-parameters to be interpreted as process group ID's.
-.It Fl n
-Instead of changing the specified processes to the given priority,
-interpret the following argument as an increment to be applied to
-the current priority of each process.
-.It Fl u
-Force the
-.Ar who
-parameters to be interpreted as user names or user ID's.
-.It Fl p
-Reset the
-.Ar who
-interpretation to be (the default) process ID's.
-.El
-.Pp
-For example,
-.Pp
-.Dl "renice +1 987 -u daemon root -p 32"
-.Pp
-would change the priority of process ID's 987 and 32, and
-all processes owned by users daemon and root.
-.Pp
-Users other than the super-user may only alter the priority of
-processes they own,
-and can only monotonically increase their ``nice value''
-within the range 0 to
-.Dv PRIO_MAX
-(20).
-(This prevents overriding administrative fiats.)
-The super-user
-may alter the priority of any process
-and set the priority to any value in the range
-.Dv PRIO_MIN
-(\-20)
-to
-.Dv PRIO_MAX .
-Useful priorities are:
-20 (the affected processes will run only when nothing else
-in the system wants to),
-0 (the ``base'' scheduling priority),
-anything negative (to make things go very fast).
-.Sh FILES
-.Bl -tag -width /etc/passwd -compact
-.It Pa /etc/passwd
-to map user names to user ID's
-.El
-.Sh SEE ALSO
-.Xr nice 1 ,
-.Xr rtprio 1 ,
-.Xr getpriority 2 ,
-.Xr setpriority 2
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-.Sh HISTORY
-The
-.Nm
-utility appeared in
-.Bx 4.0 .
-.Sh BUGS
-Non super-users cannot increase scheduling priorities of their own processes,
-even if they were the ones that decreased the priorities in the first place.
diff --git a/usr.bin/renice/renice.c b/usr.bin/renice/renice.c
deleted file mode 100644
index 21bb4c2..0000000
--- a/usr.bin/renice/renice.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright (c) 1983, 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1983, 1989, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)renice.c 8.1 (Berkeley) 6/9/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-
-#include <err.h>
-#include <errno.h>
-#include <limits.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-static int donice(int, int, int, int);
-static int getnum(const char *, const char *, int *);
-static void usage(void);
-
-/*
- * Change the priority (nice) of processes
- * or groups of processes which are already
- * running.
- */
-int
-main(int argc, char *argv[])
-{
- struct passwd *pwd;
- int errs, incr, prio, which, who;
-
- errs = 0;
- incr = 0;
- which = PRIO_PROCESS;
- who = 0;
- argc--, argv++;
- if (argc < 2)
- usage();
- if (strcmp(*argv, "-n") == 0) {
- incr = 1;
- argc--, argv++;
- if (argc < 2)
- usage();
- }
- if (getnum("priority", *argv, &prio))
- return (1);
- argc--, argv++;
- for (; argc > 0; argc--, argv++) {
- if (strcmp(*argv, "-g") == 0) {
- which = PRIO_PGRP;
- continue;
- }
- if (strcmp(*argv, "-u") == 0) {
- which = PRIO_USER;
- continue;
- }
- if (strcmp(*argv, "-p") == 0) {
- which = PRIO_PROCESS;
- continue;
- }
- if (which == PRIO_USER) {
- if ((pwd = getpwnam(*argv)) != NULL)
- who = pwd->pw_uid;
- else if (getnum("uid", *argv, &who)) {
- errs++;
- continue;
- } else if (who < 0) {
- warnx("%s: bad value", *argv);
- errs++;
- continue;
- }
- } else {
- if (getnum("pid", *argv, &who)) {
- errs++;
- continue;
- }
- if (who < 0) {
- warnx("%s: bad value", *argv);
- errs++;
- continue;
- }
- }
- errs += donice(which, who, prio, incr);
- }
- exit(errs != 0);
-}
-
-static int
-donice(int which, int who, int prio, int incr)
-{
- int oldprio;
-
- errno = 0;
- oldprio = getpriority(which, who);
- if (oldprio == -1 && errno) {
- warn("%d: getpriority", who);
- return (1);
- }
- if (incr)
- prio = oldprio + prio;
- if (prio > PRIO_MAX)
- prio = PRIO_MAX;
- if (prio < PRIO_MIN)
- prio = PRIO_MIN;
- if (setpriority(which, who, prio) < 0) {
- warn("%d: setpriority", who);
- return (1);
- }
- fprintf(stderr, "%d: old priority %d, new priority %d\n", who,
- oldprio, prio);
- return (0);
-}
-
-static int
-getnum(const char *com, const char *str, int *val)
-{
- long v;
- char *ep;
-
- errno = 0;
- v = strtol(str, &ep, 10);
- if (v < INT_MIN || v > INT_MAX || errno == ERANGE) {
- warnx("%s argument %s is out of range.", com, str);
- return (1);
- }
- if (ep == str || *ep != '\0' || errno != 0) {
- warnx("Bad %s argument: %s.", com, str);
- return (1);
- }
-
- *val = (int)v;
- return (0);
-}
-
-static void
-usage()
-{
- fprintf(stderr, "%s\n%s\n",
-"usage: renice priority [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...]",
-" renice -n increment [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...]");
- exit(1);
-}
diff --git a/usr.bin/rev/Makefile b/usr.bin/rev/Makefile
deleted file mode 100644
index 27137ff..0000000
--- a/usr.bin/rev/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/9/93
-# $FreeBSD$
-
-PROG= rev
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/rev/rev.1 b/usr.bin/rev/rev.1
deleted file mode 100644
index 68b00bf..0000000
--- a/usr.bin/rev/rev.1
+++ /dev/null
@@ -1,49 +0,0 @@
-.\" Copyright (c) 1985, 1992, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)rev.1 8.1 (Berkeley) 6/9/93
-.\" $FreeBSD$
-.\"
-.Dd June 9, 1993
-.Dt REV 1
-.Os
-.Sh NAME
-.Nm rev
-.Nd reverse lines of a file
-.Sh SYNOPSIS
-.Nm
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility copies the specified files to the standard output, reversing the
-order of characters in every line.
-If no files are specified, the standard input is read.
diff --git a/usr.bin/rev/rev.c b/usr.bin/rev/rev.c
deleted file mode 100644
index 8b38897..0000000
--- a/usr.bin/rev/rev.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/*-
- * Copyright (c) 1987, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1987, 1992, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)rev.c 8.3 (Berkeley) 5/4/95";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <err.h>
-#include <errno.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- const char *filename;
- wchar_t *p, *t;
- FILE *fp;
- size_t len;
- int ch, rval;
-
- setlocale(LC_ALL, "");
-
- while ((ch = getopt(argc, argv, "")) != -1)
- switch(ch) {
- case '?':
- default:
- usage();
- }
-
- argc -= optind;
- argv += optind;
-
- fp = stdin;
- filename = "stdin";
- rval = 0;
- do {
- if (*argv) {
- if ((fp = fopen(*argv, "r")) == NULL) {
- warn("%s", *argv);
- rval = 1;
- ++argv;
- continue;
- }
- filename = *argv++;
- }
- while ((p = fgetwln(fp, &len)) != NULL) {
- if (p[len - 1] == '\n')
- --len;
- for (t = p + len - 1; t >= p; --t)
- putwchar(*t);
- putwchar('\n');
- }
- if (ferror(fp)) {
- warn("%s", filename);
- clearerr(fp);
- rval = 1;
- }
- (void)fclose(fp);
- } while(*argv);
- exit(rval);
-}
-
-void
-usage(void)
-{
- (void)fprintf(stderr, "usage: rev [file ...]\n");
- exit(1);
-}
diff --git a/usr.bin/rlogin/Makefile b/usr.bin/rlogin/Makefile
deleted file mode 100644
index 195bffb..0000000
--- a/usr.bin/rlogin/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 7/19/93
-# $FreeBSD$
-
-PROG= rlogin
-
-BINOWN= root
-BINMODE=4555
-PRECIOUSPROG=
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/rlogin/rlogin.1 b/usr.bin/rlogin/rlogin.1
deleted file mode 100644
index 9a29f66..0000000
--- a/usr.bin/rlogin/rlogin.1
+++ /dev/null
@@ -1,164 +0,0 @@
-.\" Copyright (c) 1983, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)rlogin.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd September 26, 2003
-.Dt RLOGIN 1
-.Os
-.Sh NAME
-.Nm rlogin
-.Nd remote login
-.Sh SYNOPSIS
-.Ar rlogin
-.Op Fl 468DEd
-.Op Fl e Ar char
-.Op Fl i Ar localname
-.Op Fl l Ar username
-.Ar host
-.Sh DESCRIPTION
-The
-.Nm
-utility starts a terminal session on a remote host
-.Ar host .
-.Pp
-The standard Berkeley
-.Pa rhosts
-authorization mechanism is used.
-.Pp
-The following options are available:
-.Bl -tag -width flag
-.It Fl 4
-Use IPv4 addresses only.
-.It Fl 6
-Use IPv6 addresses only.
-.It Fl 8
-Allow an eight-bit input data path at all times; otherwise
-parity bits are stripped except when the remote side's stop and start
-characters are other than
-^S/^Q.
-.It Fl D
-Set the TCP_NODELAY socket option which can improve interactive response
-at the expense of increased network load.
-.It Fl E
-Stop any character from being recognized as an escape character.
-When used with the
-.Fl 8
-option, this provides a completely transparent connection.
-.It Fl d
-Turn on socket debugging (see
-.Xr setsockopt 2 )
-on the TCP sockets used for communication with the remote host.
-.It Fl e
-Allow user specification of the escape character, which is
-.Dq ~
-by default.
-This specification may be as a literal character, or as an octal
-value in the form \ennn.
-.It Fl i
-Allow the caller to specify a different local name to be used
-for authentication.
-This option is restricted to processes with uid 0.
-.It Fl l
-Specify a different
-.Ar username
-for the remote login.
-If this option is not specified, your local username will be used.
-.El
-.Pp
-A line of the form
-.Dq Ao escape char Ac Ns \&.
-disconnects from the remote host.
-Similarly, the line
-.Dq Ao escape char Ac Ns ^Z
-will suspend the
-.Nm
-session, and
-.Dq Ao escape\ char Ac Ns Ao delayed-suspend\ char Ac
-suspends the
-send portion of the
-.Nm
-session, but allows output from the remote system.
-By default, the tilde
-.Pq Dq ~
-character is the escape character, and
-normally control-Y
-.Pq Dq ^Y
-is the delayed-suspend character.
-.Pp
-All echoing takes place at the remote site, so that (except for delays)
-the
-.Nm
-is transparent.
-Flow control via ^S/^Q and flushing of input and output on interrupts
-are handled properly.
-.Sh ENVIRONMENT
-The following environment variable is utilized by
-.Nm :
-.Bl -tag -width TERM
-.It Ev TERM
-Determines the user's terminal type.
-.El
-.Sh FILES
-.Bl -tag -width /etc/hosts -compact
-.It Pa /etc/hosts
-.It Pa /etc/hosts.equiv
-.It Pa /etc/auth.conf
-.It Ev $HOME Ns Pa /.rhosts
-.El
-.Sh SEE ALSO
-.Xr login 1 ,
-.Xr rsh 1 ,
-.Xr telnet 1 ,
-.Xr setsockopt 2 ,
-.Xr ruserok 3 ,
-.Xr tty 4 ,
-.Xr auth.conf 5 ,
-.Xr hosts 5 ,
-.Xr hosts.equiv 5 ,
-.Xr rlogind 8 ,
-.Xr rshd 8
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.2 .
-.Pp
-IPv6 support was added by WIDE/KAME project.
-.Sh BUGS
-The
-.Nm
-utility will be replaced by
-.Xr telnet 1
-in the near future.
-.Pp
-More of the environment should be propagated.
diff --git a/usr.bin/rlogin/rlogin.c b/usr.bin/rlogin/rlogin.c
deleted file mode 100644
index c279535..0000000
--- a/usr.bin/rlogin/rlogin.c
+++ /dev/null
@@ -1,723 +0,0 @@
-/*
- * Copyright (c) 1983, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 2002 Networks Associates Technology, Inc.
- * All rights reserved.
- *
- * Portions of this software were developed for the FreeBSD Project by
- * ThinkSec AS and NAI Labs, the Security Research Division of Network
- * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
- * ("CBOSS"), as part of the DARPA CHATS research program.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1983, 1990, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static const char sccsid[] = "@(#)rlogin.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * rlogin - remote login
- */
-
-#include <sys/param.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/wait.h>
-
-#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#include <netinet/tcp.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <libutil.h>
-#include <netdb.h>
-#include <paths.h>
-#include <pwd.h>
-#include <setjmp.h>
-#include <termios.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifndef TIOCPKT_WINDOW
-#define TIOCPKT_WINDOW 0x80
-#endif
-
-/* concession to Sun */
-#ifndef SIGUSR1
-#define SIGUSR1 30
-#endif
-
-int eight, rem;
-struct termios deftty;
-
-int family = PF_UNSPEC;
-
-int noescape;
-u_char escapechar = '~';
-
-#define get_window_size(fd, wp) ioctl(fd, TIOCGWINSZ, wp)
-struct winsize winsize;
-
-void catch_child(int);
-void copytochild(int);
-void doit(long) __dead2;
-void done(int) __dead2;
-void echo(char);
-u_int getescape(const char *);
-void lostpeer(int);
-void mode(int);
-void msg(const char *);
-void oob(int);
-int reader(int);
-void sendwindow(void);
-void setsignal(int);
-void sigwinch(int);
-void stop(char);
-void usage(void) __dead2;
-void writer(void);
-void writeroob(int);
-
-int
-main(int argc, char *argv[])
-{
- struct passwd *pw;
- struct servent *sp;
- struct termios tty;
- long omask;
- int argoff, ch, dflag, Dflag, one;
- uid_t uid;
- char *host, *localname, *p, *user, term[1024];
- speed_t ospeed;
- struct sockaddr_storage ss;
- socklen_t sslen;
- size_t len, len2;
- int i;
-
- argoff = dflag = Dflag = 0;
- one = 1;
- host = localname = user = NULL;
-
- if ((p = rindex(argv[0], '/')))
- ++p;
- else
- p = argv[0];
-
- if (strcmp(p, "rlogin"))
- host = p;
-
- /* handle "rlogin host flags" */
- if (!host && argc > 2 && argv[1][0] != '-') {
- host = argv[1];
- argoff = 1;
- }
-
-#define OPTIONS "468DEde:i:l:"
- while ((ch = getopt(argc - argoff, argv + argoff, OPTIONS)) != -1)
- switch(ch) {
- case '4':
- family = PF_INET;
- break;
-
- case '6':
- family = PF_INET6;
- break;
-
- case '8':
- eight = 1;
- break;
- case 'D':
- Dflag = 1;
- break;
- case 'E':
- noescape = 1;
- break;
- case 'd':
- dflag = 1;
- break;
- case 'e':
- noescape = 0;
- escapechar = getescape(optarg);
- break;
- case 'i':
- if (getuid() != 0)
- errx(1, "-i user: permission denied");
- localname = optarg;
- break;
- case 'l':
- user = optarg;
- break;
- case '?':
- default:
- usage();
- }
- optind += argoff;
-
- /* if haven't gotten a host yet, do so */
- if (!host && !(host = argv[optind++]))
- usage();
-
- if (argv[optind])
- usage();
-
- if (!(pw = getpwuid(uid = getuid())))
- errx(1, "unknown user id");
- if (!user)
- user = pw->pw_name;
- if (!localname)
- localname = pw->pw_name;
-
- sp = NULL;
- sp = getservbyname("login", "tcp");
- if (sp == NULL)
- errx(1, "login/tcp: unknown service");
-
- if ((p = getenv("TERM")) != NULL)
- (void)strlcpy(term, p, sizeof(term));
- len = strlen(term);
- if (len < (sizeof(term) - 1) && tcgetattr(0, &tty) == 0) {
- /* start at 2 to include the / */
- for (ospeed = i = cfgetospeed(&tty), len2 = 2; i > 9; len2++)
- i /= 10;
- if (len + len2 < sizeof(term))
- (void)snprintf(term + len, len2 + 1, "/%d", ospeed);
- }
-
- (void)get_window_size(0, &winsize);
-
- (void)signal(SIGPIPE, lostpeer);
- /* will use SIGUSR1 for window size hack, so hold it off */
- omask = sigblock(sigmask(SIGURG) | sigmask(SIGUSR1));
- /*
- * We set SIGURG and SIGUSR1 below so that an
- * incoming signal will be held pending rather than being
- * discarded. Note that these routines will be ready to get
- * a signal by the time that they are unblocked below.
- */
- (void)signal(SIGURG, copytochild);
- (void)signal(SIGUSR1, writeroob);
-
- rem = rcmd_af(&host, sp->s_port, localname, user, term, 0, family);
-
- if (rem < 0)
- exit(1);
-
- if (dflag &&
- setsockopt(rem, SOL_SOCKET, SO_DEBUG, &one, sizeof(one)) < 0)
- warn("setsockopt");
- if (Dflag &&
- setsockopt(rem, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one)) < 0)
- warn("setsockopt NODELAY (ignored)");
-
- sslen = sizeof(ss);
- one = IPTOS_LOWDELAY;
- if (getsockname(rem, (struct sockaddr *)&ss, &sslen) == 0 &&
- ss.ss_family == AF_INET) {
- if (setsockopt(rem, IPPROTO_IP, IP_TOS, (char *)&one,
- sizeof(int)) < 0)
- warn("setsockopt TOS (ignored)");
- } else
- if (ss.ss_family == AF_INET)
- warn("setsockopt getsockname failed");
-
- (void)setuid(uid);
- doit(omask);
- /*NOTREACHED*/
-}
-
-int child;
-
-void
-doit(long omask)
-{
-
- (void)signal(SIGINT, SIG_IGN);
- setsignal(SIGHUP);
- setsignal(SIGQUIT);
- mode(1);
- child = fork();
- if (child == -1) {
- warn("fork");
- done(1);
- }
- if (child == 0) {
- if (reader(omask) == 0) {
- msg("connection closed");
- exit(0);
- }
- sleep(1);
- msg("\007connection closed");
- exit(1);
- }
-
- /*
- * We may still own the socket, and may have a pending SIGURG (or might
- * receive one soon) that we really want to send to the reader. When
- * one of these comes in, the trap copytochild simply copies such
- * signals to the child. We can now unblock SIGURG and SIGUSR1
- * that were set above.
- */
- (void)sigsetmask(omask);
- (void)signal(SIGCHLD, catch_child);
- writer();
- msg("closed connection");
- done(0);
-}
-
-/* trap a signal, unless it is being ignored. */
-void
-setsignal(int sig)
-{
- int omask = sigblock(sigmask(sig));
-
- if (signal(sig, exit) == SIG_IGN)
- (void)signal(sig, SIG_IGN);
- (void)sigsetmask(omask);
-}
-
-void
-done(int status)
-{
- int w, wstatus;
-
- mode(0);
- if (child > 0) {
- /* make sure catch_child does not snap it up */
- (void)signal(SIGCHLD, SIG_DFL);
- if (kill(child, SIGKILL) >= 0)
- while ((w = wait(&wstatus)) > 0 && w != child);
- }
- exit(status);
-}
-
-int dosigwinch;
-
-/*
- * This is called when the reader process gets the out-of-band (urgent)
- * request to turn on the window-changing protocol.
- */
-/* ARGSUSED */
-void
-writeroob(int signo __unused)
-{
- if (dosigwinch == 0) {
- sendwindow();
- (void)signal(SIGWINCH, sigwinch);
- }
- dosigwinch = 1;
-}
-
-/* ARGSUSED */
-void
-catch_child(int signo __unused)
-{
- pid_t pid;
- int status;
-
- for (;;) {
- pid = wait3(&status, WNOHANG|WUNTRACED, NULL);
- if (pid == 0)
- return;
- /* if the child (reader) dies, just quit */
- if (pid < 0 || (pid == child && !WIFSTOPPED(status)))
- done(WTERMSIG(status) | WEXITSTATUS(status));
- }
- /* NOTREACHED */
-}
-
-/*
- * writer: write to remote: 0 -> line.
- * ~. terminate
- * ~^Z suspend rlogin process.
- * ~<delayed-suspend char> suspend rlogin process, but leave reader alone.
- */
-void
-writer(void)
-{
- int bol, local, n;
- char c;
-
- bol = 1; /* beginning of line */
- local = 0;
- for (;;) {
- n = read(STDIN_FILENO, &c, 1);
- if (n <= 0) {
- if (n < 0 && errno == EINTR)
- continue;
- break;
- }
- /*
- * If we're at the beginning of the line and recognize a
- * command character, then we echo locally. Otherwise,
- * characters are echo'd remotely. If the command character
- * is doubled, this acts as a force and local echo is
- * suppressed.
- */
- if (bol) {
- bol = 0;
- if (!noescape && c == escapechar) {
- local = 1;
- continue;
- }
- } else if (local) {
- local = 0;
- if (c == '.' || CCEQ(deftty.c_cc[VEOF], c)) {
- echo(c);
- break;
- }
- if (CCEQ(deftty.c_cc[VSUSP], c) ||
- CCEQ(deftty.c_cc[VDSUSP], c)) {
- bol = 1;
- echo(c);
- stop(c);
- continue;
- }
- if (c != escapechar)
- (void)write(rem, &escapechar, 1);
- }
-
- if (write(rem, &c, 1) == 0) {
- msg("line gone");
- break;
- }
- bol = CCEQ(deftty.c_cc[VKILL], c) ||
- CCEQ(deftty.c_cc[VEOF], c) ||
- CCEQ(deftty.c_cc[VINTR], c) ||
- CCEQ(deftty.c_cc[VSUSP], c) ||
- c == '\r' || c == '\n';
- }
-}
-
-void
-echo(char c)
-{
- char *p;
- char buf[8];
-
- p = buf;
- c &= 0177;
- *p++ = escapechar;
- if (c < ' ') {
- *p++ = '^';
- *p++ = c + '@';
- } else if (c == 0177) {
- *p++ = '^';
- *p++ = '?';
- } else
- *p++ = c;
- *p++ = '\r';
- *p++ = '\n';
- (void)write(STDOUT_FILENO, buf, p - buf);
-}
-
-void
-stop(char cmdc)
-{
- mode(0);
- (void)signal(SIGCHLD, SIG_IGN);
- (void)kill(CCEQ(deftty.c_cc[VSUSP], cmdc) ? 0 : getpid(), SIGTSTP);
- (void)signal(SIGCHLD, catch_child);
- mode(1);
- sigwinch(0); /* check for size changes */
-}
-
-/* ARGSUSED */
-void
-sigwinch(int signo __unused)
-{
- struct winsize ws;
-
- if (dosigwinch && get_window_size(0, &ws) == 0 &&
- bcmp(&ws, &winsize, sizeof(ws))) {
- winsize = ws;
- sendwindow();
- }
-}
-
-/*
- * Send the window size to the server via the magic escape
- */
-void
-sendwindow(void)
-{
- struct winsize *wp;
- char obuf[4 + sizeof (struct winsize)];
-
- wp = (struct winsize *)(obuf+4);
- obuf[0] = 0377;
- obuf[1] = 0377;
- obuf[2] = 's';
- obuf[3] = 's';
- wp->ws_row = htons(winsize.ws_row);
- wp->ws_col = htons(winsize.ws_col);
- wp->ws_xpixel = htons(winsize.ws_xpixel);
- wp->ws_ypixel = htons(winsize.ws_ypixel);
-
- (void)write(rem, obuf, sizeof(obuf));
-}
-
-/*
- * reader: read from remote: line -> 1
- */
-#define READING 1
-#define WRITING 2
-
-jmp_buf rcvtop;
-int rcvcnt, rcvstate;
-pid_t ppid;
-char rcvbuf[8 * 1024];
-
-/* ARGSUSED */
-void
-oob(int signo __unused)
-{
- struct termios tty;
- int atmark, n, rcvd;
- char waste[BUFSIZ], mark;
-
- rcvd = 0;
- while (recv(rem, &mark, 1, MSG_OOB) < 0) {
- switch (errno) {
- case EWOULDBLOCK:
- /*
- * Urgent data not here yet. It may not be possible
- * to send it yet if we are blocked for output and
- * our input buffer is full.
- */
- if (rcvcnt < (int)sizeof(rcvbuf)) {
- n = read(rem, rcvbuf + rcvcnt,
- sizeof(rcvbuf) - rcvcnt);
- if (n <= 0)
- return;
- rcvd += n;
- } else {
- n = read(rem, waste, sizeof(waste));
- if (n <= 0)
- return;
- }
- continue;
- default:
- return;
- }
- }
- if (mark & TIOCPKT_WINDOW) {
- /* Let server know about window size changes */
- (void)kill(ppid, SIGUSR1);
- }
- if (!eight && (mark & TIOCPKT_NOSTOP)) {
- (void)tcgetattr(0, &tty);
- tty.c_iflag &= ~IXON;
- (void)tcsetattr(0, TCSANOW, &tty);
- }
- if (!eight && (mark & TIOCPKT_DOSTOP)) {
- (void)tcgetattr(0, &tty);
- tty.c_iflag |= (deftty.c_iflag & IXON);
- (void)tcsetattr(0, TCSANOW, &tty);
- }
- if (mark & TIOCPKT_FLUSHWRITE) {
- (void)tcflush(1, TCIOFLUSH);
- for (;;) {
- if (ioctl(rem, SIOCATMARK, &atmark) < 0) {
- warn("ioctl");
- break;
- }
- if (atmark)
- break;
- n = read(rem, waste, sizeof (waste));
- if (n <= 0)
- break;
- }
- /*
- * Don't want any pending data to be output, so clear the recv
- * buffer. If we were hanging on a write when interrupted,
- * don't want it to restart. If we were reading, restart
- * anyway.
- */
- rcvcnt = 0;
- longjmp(rcvtop, 1);
- }
-
- /* oob does not do FLUSHREAD (alas!) */
-
- /*
- * If we filled the receive buffer while a read was pending, longjmp
- * to the top to restart appropriately. Don't abort a pending write,
- * however, or we won't know how much was written.
- */
- if (rcvd && rcvstate == READING)
- longjmp(rcvtop, 1);
-}
-
-/* reader: read from remote: line -> 1 */
-int
-reader(int omask)
-{
- int n, remaining;
- char *bufp;
- pid_t pid;
-
- pid = getpid();
- (void)signal(SIGTTOU, SIG_IGN);
- (void)signal(SIGURG, oob);
- (void)signal(SIGUSR1, oob); /* When propogating SIGURG from parent */
- ppid = getppid();
- (void)fcntl(rem, F_SETOWN, pid);
- (void)setjmp(rcvtop);
- (void)sigsetmask(omask);
- bufp = rcvbuf;
- for (;;) {
- while ((remaining = rcvcnt - (bufp - rcvbuf)) > 0) {
- rcvstate = WRITING;
- n = write(STDOUT_FILENO, bufp, remaining);
- if (n < 0) {
- if (errno != EINTR)
- return (-1);
- continue;
- }
- bufp += n;
- }
- bufp = rcvbuf;
- rcvcnt = 0;
- rcvstate = READING;
-
- rcvcnt = read(rem, rcvbuf, sizeof (rcvbuf));
- if (rcvcnt == 0)
- return (0);
- if (rcvcnt < 0) {
- if (errno == EINTR)
- continue;
- warn("read");
- return (-1);
- }
- }
-}
-
-void
-mode(int f)
-{
- struct termios tty;
-
- switch (f) {
- case 0:
- (void)tcsetattr(0, TCSANOW, &deftty);
- break;
- case 1:
- (void)tcgetattr(0, &deftty);
- tty = deftty;
- /* This is loosely derived from sys/kern/tty_compat.c. */
- tty.c_lflag &= ~(ECHO|ICANON|ISIG|IEXTEN);
- tty.c_iflag &= ~ICRNL;
- tty.c_oflag &= ~OPOST;
- tty.c_cc[VMIN] = 1;
- tty.c_cc[VTIME] = 0;
- if (eight) {
- tty.c_iflag &= IXOFF;
- tty.c_cflag &= ~(CSIZE|PARENB);
- tty.c_cflag |= CS8;
- }
- (void)tcsetattr(0, TCSANOW, &tty);
- break;
- default:
- return;
- }
-}
-
-/* ARGSUSED */
-void
-lostpeer(int signo __unused)
-{
- (void)signal(SIGPIPE, SIG_IGN);
- msg("\007connection closed");
- done(1);
-}
-
-/* copy SIGURGs to the child process via SIGUSR1. */
-/* ARGSUSED */
-void
-copytochild(int signo __unused)
-{
- (void)kill(child, SIGUSR1);
-}
-
-void
-msg(const char *str)
-{
- (void)fprintf(stderr, "rlogin: %s\r\n", str);
-}
-
-void
-usage(void)
-{
- (void)fprintf(stderr,
- "usage: rlogin [-46%s]%s[-e char] [-i localname] [-l username] host\n",
- "8DEd", " ");
- exit(1);
-}
-
-u_int
-getescape(const char *p)
-{
- long val;
- size_t len;
-
- if ((len = strlen(p)) == 1) /* use any single char, including '\' */
- return ((u_int)*p);
- /* otherwise, \nnn */
- if (*p == '\\' && len >= 2 && len <= 4) {
- val = strtol(++p, NULL, 8);
- for (;;) {
- if (!*++p)
- return ((u_int)val);
- if (*p < '0' || *p > '8')
- break;
- }
- }
- msg("illegal option value -- e");
- usage();
- /* NOTREACHED */
-}
diff --git a/usr.bin/rpcgen/Makefile b/usr.bin/rpcgen/Makefile
deleted file mode 100644
index c298820..0000000
--- a/usr.bin/rpcgen/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# $FreeBSD$
-
-PROG= rpcgen
-SRCS= rpc_main.c rpc_clntout.c rpc_cout.c rpc_hout.c rpc_parse.c \
- rpc_sample.c rpc_scan.c rpc_svcout.c rpc_tblout.c rpc_util.c
-
-WARNS?= 2
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/rpcgen/rpc_clntout.c b/usr.bin/rpcgen/rpc_clntout.c
deleted file mode 100644
index 713cba1..0000000
--- a/usr.bin/rpcgen/rpc_clntout.c
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#if 0
-#ifndef lint
-#ident "@(#)rpc_clntout.c 1.15 94/04/25 SMI"
-static char sccsid[] = "@(#)rpc_clntout.c 1.11 89/02/22 (C) 1987 SMI";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * rpc_clntout.c, Client-stub outputter for the RPC protocol compiler
- * Copyright (C) 1987, Sun Microsytsems, Inc.
- */
-#include <stdio.h>
-#include <string.h>
-#include <rpc/types.h>
-#include "rpc_parse.h"
-#include "rpc_scan.h"
-#include "rpc_util.h"
-
-static void write_program( definition * );
-static void printbody( proc_list * );
-
-static char RESULT[] = "clnt_res";
-
-
-#define DEFAULT_TIMEOUT 25 /* in seconds */
-
-
-void
-write_stubs(void)
-{
- list *l;
- definition *def;
-
- f_print(fout,
- "\n/* Default timeout can be changed using clnt_control() */\n");
- f_print(fout, "static struct timeval TIMEOUT = { %d, 0 };\n",
- DEFAULT_TIMEOUT);
- for (l = defined; l != NULL; l = l->next) {
- def = (definition *) l->val;
- if (def->def_kind == DEF_PROGRAM) {
- write_program(def);
- }
- }
-}
-
-static void
-write_program(definition *def)
-{
- version_list *vp;
- proc_list *proc;
-
- for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- for (proc = vp->procs; proc != NULL; proc = proc->next) {
- f_print(fout, "\n");
- if (mtflag == 0) {
- ptype(proc->res_prefix, proc->res_type, 1);
- f_print(fout, "*\n");
- pvname(proc->proc_name, vp->vers_num);
- printarglist(proc, RESULT, "clnt", "CLIENT *");
- } else {
- f_print(fout, "enum clnt_stat \n");
- pvname(proc->proc_name, vp->vers_num);
- printarglist(proc, RESULT, "clnt", "CLIENT *");
-
- }
- f_print(fout, "{\n");
- printbody(proc);
-
- f_print(fout, "}\n");
- }
- }
-}
-
-/*
- * Writes out declarations of procedure's argument list.
- * In either ANSI C style, in one of old rpcgen style (pass by reference),
- * or new rpcgen style (multiple arguments, pass by value);
- */
-
-/* sample addargname = "clnt"; sample addargtype = "CLIENT * " */
-
-void
-printarglist(proc_list *proc, const char *result, const char *addargname,
- const char *addargtype)
-{
-
- decl_list *l;
-
- if (!newstyle) {
- /* old style: always pass argument by reference */
- f_print(fout, "(");
- ptype(proc->args.decls->decl.prefix,
- proc->args.decls->decl.type, 1);
-
- if (mtflag) {/* Generate result field */
- f_print(fout, "*argp, ");
- ptype(proc->res_prefix, proc->res_type, 1);
- f_print(fout, "*%s, %s%s)\n",
- result, addargtype, addargname);
- } else
- f_print(fout, "*argp, %s%s)\n", addargtype, addargname);
- } else if (streq(proc->args.decls->decl.type, "void")) {
- /* newstyle, 0 argument */
- if (mtflag) {
- f_print(fout, "(");
- ptype(proc->res_prefix, proc->res_type, 1);
- f_print(fout, "*%s, %s%s)\n",
- result, addargtype, addargname);
- } else
- f_print(fout, "(%s%s)\n", addargtype, addargname);
- } else {
- /* new style, 1 or multiple arguments */
- f_print(fout, "(");
- for (l = proc->args.decls; l != NULL; l = l->next) {
- pdeclaration(proc->args.argname, &l->decl, 0, ", ");
- }
- if (mtflag) {
- ptype(proc->res_prefix, proc->res_type, 1);
- f_print(fout, "*%s, ", result);
-
- }
- f_print(fout, "%s%s)\n", addargtype, addargname);
- }
-}
-
-
-
-static const char *
-ampr(const char *type)
-{
- if (isvectordef(type, REL_ALIAS)) {
- return ("");
- } else {
- return ("&");
- }
-}
-
-static void
-printbody(proc_list *proc)
-{
- decl_list *l;
- bool_t args2 = (proc->arg_num > 1);
-
- /*
- * For new style with multiple arguments, need a structure in which
- * to stuff the arguments.
- */
-
-
- if (newstyle && args2) {
- f_print(fout, "\t%s", proc->args.argname);
- f_print(fout, " arg;\n");
- }
- if (!mtflag) {
- f_print(fout, "\tstatic ");
- if (streq(proc->res_type, "void")) {
- f_print(fout, "char ");
- } else {
- ptype(proc->res_prefix, proc->res_type, 0);
- }
- f_print(fout, "%s;\n", RESULT);
- f_print(fout, "\n");
- f_print(fout, "\tmemset((char *)%s%s, 0, sizeof (%s));\n",
- ampr(proc->res_type), RESULT, RESULT);
-
- }
- if (newstyle && !args2 &&
- (streq(proc->args.decls->decl.type, "void"))) {
- /* newstyle, 0 arguments */
-
- if (mtflag)
- f_print(fout, "\t return ");
- else
- f_print(fout, "\t if ");
-
- f_print(fout,
- "(clnt_call(clnt, %s,\n\t\t(xdrproc_t) xdr_void, ",
- proc->proc_name);
- f_print(fout,
- "(caddr_t) NULL,\n\t\t(xdrproc_t) xdr_%s, (caddr_t) %s%s,",
- stringfix(proc->res_type), (mtflag)?"":ampr(proc->res_type),
- RESULT);
-
- if (mtflag)
- f_print(fout, "\n\t\tTIMEOUT));\n");
- else
- f_print(fout, "\n\t\tTIMEOUT) != RPC_SUCCESS) {\n");
-
- } else if (newstyle && args2) {
- /*
- * Newstyle, multiple arguments
- * stuff arguments into structure
- */
- for (l = proc->args.decls; l != NULL; l = l->next) {
- f_print(fout, "\targ.%s = %s;\n",
- l->decl.name, l->decl.name);
- }
- if (mtflag)
- f_print(fout, "\treturn ");
- else
- f_print(fout, "\tif ");
- f_print(fout,
- "(clnt_call(clnt, %s,\n\t\t(xdrproc_t) xdr_%s",
- proc->proc_name,proc->args.argname);
- f_print(fout,
- ", (caddr_t) &arg,\n\t\t(xdrproc_t) xdr_%s, (caddr_t) %s%s,",
- stringfix(proc->res_type), (mtflag)?"":ampr(proc->res_type),
- RESULT);
- if (mtflag)
- f_print(fout, "\n\t\tTIMEOUT));\n");
- else
- f_print(fout, "\n\t\tTIMEOUT) != RPC_SUCCESS) {\n");
- } else { /* single argument, new or old style */
- if (!mtflag)
- f_print(fout,
- "\tif (clnt_call(clnt, %s,\n\t\t(xdrproc_t) xdr_%s, (caddr_t) %s%s,\n\t\t(xdrproc_t) xdr_%s, (caddr_t) %s%s,\n\t\tTIMEOUT) != RPC_SUCCESS) {\n",
- proc->proc_name,
- stringfix(proc->args.decls->decl.type),
- (newstyle ? "&" : ""),
- (newstyle ? proc->args.decls->decl.name : "argp"),
- stringfix(proc->res_type), ampr(proc->res_type),
- RESULT);
- else
-
- f_print(fout,
- "\treturn (clnt_call(clnt, %s,\n\t\t(xdrproc_t) xdr_%s, (caddr_t) %s%s,\n\t\t(xdrproc_t) xdr_%s, (caddr_t) %s%s,\n\t\tTIMEOUT));\n",
- proc->proc_name,
- stringfix(proc->args.decls->decl.type),
- (newstyle ? "&" : ""),
- (newstyle ? proc->args.decls->decl.name : "argp"),
- stringfix(proc->res_type), "",
- RESULT);
- }
- if (!mtflag) {
- f_print(fout, "\t\treturn (NULL);\n");
- f_print(fout, "\t}\n");
-
- if (streq(proc->res_type, "void")) {
- f_print(fout, "\treturn ((void *)%s%s);\n",
- ampr(proc->res_type), RESULT);
- } else {
- f_print(fout, "\treturn (%s%s);\n",
- ampr(proc->res_type), RESULT);
- }
- }
-}
diff --git a/usr.bin/rpcgen/rpc_cout.c b/usr.bin/rpcgen/rpc_cout.c
deleted file mode 100644
index 8bbd5d3..0000000
--- a/usr.bin/rpcgen/rpc_cout.c
+++ /dev/null
@@ -1,718 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#if 0
-#ifndef lint
-#ident "@(#)rpc_cout.c 1.14 93/07/05 SMI"
-static char sccsid[] = "@(#)rpc_cout.c 1.13 89/02/22 (C) 1987 SMI";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * rpc_cout.c, XDR routine outputter for the RPC protocol compiler
- * Copyright (C) 1987, Sun Microsystems, Inc.
- */
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-#include "rpc_parse.h"
-#include "rpc_scan.h"
-#include "rpc_util.h"
-
-static void print_header( definition * );
-static void print_trailer( void );
-static void print_stat( int , declaration * );
-static void emit_enum( definition * );
-static void emit_program( definition * );
-static void emit_union( definition * );
-static void emit_struct( definition * );
-static void emit_typedef( definition * );
-static void emit_inline( int, declaration *, int );
-static void emit_single_in_line( int, declaration *, int, relation );
-
-/*
- * Emit the C-routine for the given definition
- */
-void
-emit(definition *def)
-{
- if (def->def_kind == DEF_CONST) {
- return;
- }
- if (def->def_kind == DEF_PROGRAM) {
- emit_program(def);
- return;
- }
- if (def->def_kind == DEF_TYPEDEF) {
- /*
- * now we need to handle declarations like
- * struct typedef foo foo;
- * since we dont want this to be expanded into 2 calls to xdr_foo
- */
-
- if (strcmp(def->def.ty.old_type, def->def_name) == 0)
- return;
- };
- print_header(def);
- switch (def->def_kind) {
- case DEF_UNION:
- emit_union(def);
- break;
- case DEF_ENUM:
- emit_enum(def);
- break;
- case DEF_STRUCT:
- emit_struct(def);
- break;
- case DEF_TYPEDEF:
- emit_typedef(def);
- break;
- /* DEF_CONST and DEF_PROGRAM have already been handled */
- default:
- break;
- }
- print_trailer();
-}
-
-static int
-findtype(definition *def, const char *type)
-{
-
- if (def->def_kind == DEF_PROGRAM || def->def_kind == DEF_CONST) {
- return (0);
- } else {
- return (streq(def->def_name, type));
- }
-}
-
-static int
-undefined(const char *type)
-{
- definition *def;
-
- def = (definition *) FINDVAL(defined, type, findtype);
- return (def == NULL);
-}
-
-
-static void
-print_generic_header(const char *procname, int pointerp)
-{
- f_print(fout, "\n");
- f_print(fout, "bool_t\n");
- f_print(fout, "xdr_%s(", procname);
- f_print(fout, "XDR *xdrs, ");
- f_print(fout, "%s ", procname);
- if (pointerp)
- f_print(fout, "*");
- f_print(fout, "objp)\n{\n\n");
-}
-
-static void
-print_header(definition *def)
-{
- print_generic_header(def->def_name,
- def->def_kind != DEF_TYPEDEF ||
- !isvectordef(def->def.ty.old_type,
- def->def.ty.rel));
- /* Now add Inline support */
-
- if (inline_size == 0)
- return;
- /* May cause lint to complain. but ... */
- f_print(fout, "\tregister long *buf;\n\n");
-}
-
-static void
-print_prog_header(proc_list *plist)
-{
- print_generic_header(plist->args.argname, 1);
-}
-
-static void
-print_trailer(void)
-{
- f_print(fout, "\treturn (TRUE);\n");
- f_print(fout, "}\n");
-}
-
-
-static void
-print_ifopen(int indent, const char *name)
-{
- tabify(fout, indent);
- f_print(fout, "if (!xdr_%s(xdrs", name);
-}
-
-static void
-print_ifarg(const char *arg)
-{
- f_print(fout, ", %s", arg);
-}
-
-static void
-print_ifsizeof(int indent, const char *prefix, const char *type)
-{
- if (indent) {
- f_print(fout, ",\n");
- tabify(fout, indent);
- } else {
- f_print(fout, ", ");
- }
- if (streq(type, "bool")) {
- f_print(fout, "sizeof (bool_t), (xdrproc_t) xdr_bool");
- } else {
- f_print(fout, "sizeof (");
- if (undefined(type) && prefix) {
- f_print(fout, "%s ", prefix);
- }
- f_print(fout, "%s), (xdrproc_t) xdr_%s", type, type);
- }
-}
-
-static void
-print_ifclose(int indent, int brace)
-{
- f_print(fout, "))\n");
- tabify(fout, indent);
- f_print(fout, "\treturn (FALSE);\n");
- if (brace)
- f_print(fout, "\t}\n");
-}
-
-static void
-print_ifstat(int indent, const char *prefix, const char *type, relation rel,
- const char *amax, const char *objname, const char *name)
-{
- const char *alt = NULL;
- int brace = 0;
-
- switch (rel) {
- case REL_POINTER:
- brace = 1;
- f_print(fout, "\t{\n");
- f_print(fout, "\t%s **pp = %s;\n", type, objname);
- print_ifopen(indent, "pointer");
- print_ifarg("(char **)");
- f_print(fout, "pp");
- print_ifsizeof(0, prefix, type);
- break;
- case REL_VECTOR:
- if (streq(type, "string")) {
- alt = "string";
- } else if (streq(type, "opaque")) {
- alt = "opaque";
- }
- if (alt) {
- print_ifopen(indent, alt);
- print_ifarg(objname);
- } else {
- print_ifopen(indent, "vector");
- print_ifarg("(char *)");
- f_print(fout, "%s", objname);
- }
- print_ifarg(amax);
- if (!alt) {
- print_ifsizeof(indent + 1, prefix, type);
- }
- break;
- case REL_ARRAY:
- if (streq(type, "string")) {
- alt = "string";
- } else if (streq(type, "opaque")) {
- alt = "bytes";
- }
- if (streq(type, "string")) {
- print_ifopen(indent, alt);
- print_ifarg(objname);
- } else {
- if (alt) {
- print_ifopen(indent, alt);
- } else {
- print_ifopen(indent, "array");
- }
- print_ifarg("(char **)");
- if (*objname == '&') {
- f_print(fout, "%s.%s_val, (u_int *) %s.%s_len",
- objname, name, objname, name);
- } else {
- f_print(fout,
- "&%s->%s_val, (u_int *) &%s->%s_len",
- objname, name, objname, name);
- }
- }
- print_ifarg(amax);
- if (!alt) {
- print_ifsizeof(indent + 1, prefix, type);
- }
- break;
- case REL_ALIAS:
- print_ifopen(indent, type);
- print_ifarg(objname);
- break;
- }
- print_ifclose(indent, brace);
-}
-
-/* ARGSUSED */
-static void
-emit_enum(definition *def __unused)
-{
- print_ifopen(1, "enum");
- print_ifarg("(enum_t *)objp");
- print_ifclose(1, 0);
-}
-
-static void
-emit_program(definition *def)
-{
- decl_list *dl;
- version_list *vlist;
- proc_list *plist;
-
- for (vlist = def->def.pr.versions; vlist != NULL; vlist = vlist->next)
- for (plist = vlist->procs; plist != NULL; plist = plist->next) {
- if (!newstyle || plist->arg_num < 2)
- continue; /* old style, or single argument */
- print_prog_header(plist);
- for (dl = plist->args.decls; dl != NULL;
- dl = dl->next)
- print_stat(1, &dl->decl);
- print_trailer();
- }
-}
-
-
-static void
-emit_union(definition *def)
-{
- declaration *dflt;
- case_list *cl;
- declaration *cs;
- char *object;
- const char *vecformat = "objp->%s_u.%s";
- const char *format = "&objp->%s_u.%s";
-
- print_stat(1, &def->def.un.enum_decl);
- f_print(fout, "\tswitch (objp->%s) {\n", def->def.un.enum_decl.name);
- for (cl = def->def.un.cases; cl != NULL; cl = cl->next) {
-
- f_print(fout, "\tcase %s:\n", cl->case_name);
- if (cl->contflag == 1) /* a continued case statement */
- continue;
- cs = &cl->case_decl;
- if (!streq(cs->type, "void")) {
- object = xmalloc(strlen(def->def_name) +
- strlen(format) + strlen(cs->name) + 1);
- if (isvectordef (cs->type, cs->rel)) {
- s_print(object, vecformat, def->def_name,
- cs->name);
- } else {
- s_print(object, format, def->def_name,
- cs->name);
- }
- print_ifstat(2, cs->prefix, cs->type, cs->rel,
- cs->array_max, object, cs->name);
- free(object);
- }
- f_print(fout, "\t\tbreak;\n");
- }
- dflt = def->def.un.default_decl;
- if (dflt != NULL) {
- if (!streq(dflt->type, "void")) {
- f_print(fout, "\tdefault:\n");
- object = xmalloc(strlen(def->def_name) +
- strlen(format) + strlen(dflt->name) + 1);
- if (isvectordef (dflt->type, dflt->rel)) {
- s_print(object, vecformat, def->def_name,
- dflt->name);
- } else {
- s_print(object, format, def->def_name,
- dflt->name);
- }
-
- print_ifstat(2, dflt->prefix, dflt->type, dflt->rel,
- dflt->array_max, object, dflt->name);
- free(object);
- f_print(fout, "\t\tbreak;\n");
- } else {
- f_print(fout, "\tdefault:\n");
- f_print(fout, "\t\tbreak;\n");
- }
- } else {
- f_print(fout, "\tdefault:\n");
- f_print(fout, "\t\treturn (FALSE);\n");
- }
-
- f_print(fout, "\t}\n");
-}
-
-static void
-inline_struct(definition *def, int flag)
-{
- decl_list *dl;
- int i, size;
- decl_list *cur, *psav;
- bas_type *ptr;
- char *sizestr;
- const char *plus;
- char ptemp[256];
- int indent = 1;
-
- cur = NULL;
- if (flag == PUT)
- f_print(fout, "\n\tif (xdrs->x_op == XDR_ENCODE) {\n");
- else
- f_print(fout, "\t\treturn (TRUE);\n\t} else if (xdrs->x_op == XDR_DECODE) {\n");
-
- i = 0;
- size = 0;
- sizestr = NULL;
- for (dl = def->def.st.decls; dl != NULL; dl = dl->next) { /* xxx */
- /* now walk down the list and check for basic types */
- if ((dl->decl.prefix == NULL) &&
- ((ptr = find_type(dl->decl.type)) != NULL) &&
- ((dl->decl.rel == REL_ALIAS) ||
- (dl->decl.rel == REL_VECTOR))){
- if (i == 0)
- cur = dl;
- i++;
-
- if (dl->decl.rel == REL_ALIAS)
- size += ptr->length;
- else {
- /* this code is required to handle arrays */
- if (sizestr == NULL)
- plus = "";
- else
- plus = " + ";
-
- if (ptr->length != 1)
- s_print(ptemp, "%s%s * %d",
- plus, dl->decl.array_max,
- ptr->length);
- else
- s_print(ptemp, "%s%s", plus,
- dl->decl.array_max);
-
- /* now concatenate to sizestr !!!! */
- if (sizestr == NULL) {
- sizestr = xstrdup(ptemp);
- }
- else{
- sizestr = xrealloc(sizestr,
- strlen(sizestr)
- +strlen(ptemp)+1);
- sizestr = strcat(sizestr, ptemp);
- /* build up length of array */
- }
- }
- } else {
- if (i > 0) {
- if (sizestr == NULL && size < inline_size){
- /*
- * don't expand into inline code
- * if size < inline_size
- */
- while (cur != dl){
- print_stat(indent + 1, &cur->decl);
- cur = cur->next;
- }
- } else {
- /* were already looking at a xdr_inlineable structure */
- tabify(fout, indent + 1);
- if (sizestr == NULL)
- f_print(fout, "buf = XDR_INLINE(xdrs, %d * BYTES_PER_XDR_UNIT);",
- size);
- else {
- if (size == 0)
- f_print(fout,
- "buf = XDR_INLINE(xdrs, (%s) * BYTES_PER_XDR_UNIT);",
- sizestr);
- else
- f_print(fout,
- "buf = XDR_INLINE(xdrs, (%d + (%s)) * BYTES_PER_XDR_UNIT);",
- size, sizestr);
-
- }
- f_print(fout, "\n");
- tabify(fout, indent + 1);
- f_print(fout,
- "if (buf == NULL) {\n");
-
- psav = cur;
- while (cur != dl){
- print_stat(indent + 2, &cur->decl);
- cur = cur->next;
- }
-
- f_print(fout, "\n\t\t} else {\n");
-
- cur = psav;
- while (cur != dl){
- emit_inline(indent + 2, &cur->decl, flag);
- cur = cur->next;
- }
-
- tabify(fout, indent + 1);
- f_print(fout, "}\n");
- }
- }
- size = 0;
- i = 0;
- sizestr = NULL;
- print_stat(indent + 1, &dl->decl);
- }
- }
-
- if (i > 0) {
- if (sizestr == NULL && size < inline_size){
- /* don't expand into inline code if size < inline_size */
- while (cur != dl){
- print_stat(indent + 1, &cur->decl);
- cur = cur->next;
- }
- } else {
- /* were already looking at a xdr_inlineable structure */
- if (sizestr == NULL)
- f_print(fout, "\t\tbuf = XDR_INLINE(xdrs, %d * BYTES_PER_XDR_UNIT);",
- size);
- else
- if (size == 0)
- f_print(fout,
- "\t\tbuf = XDR_INLINE(xdrs, (%s) * BYTES_PER_XDR_UNIT);",
- sizestr);
- else
- f_print(fout,
- "\t\tbuf = XDR_INLINE(xdrs, (%d + (%s)) * BYTES_PER_XDR_UNIT);",
- size, sizestr);
-
- f_print(fout, "\n\t\tif (buf == NULL) {\n");
- psav = cur;
- while (cur != NULL){
- print_stat(indent + 2, &cur->decl);
- cur = cur->next;
- }
- f_print(fout, "\t\t} else {\n");
-
- cur = psav;
- while (cur != dl){
- emit_inline(indent + 2, &cur->decl, flag);
- cur = cur->next;
- }
- f_print(fout, "\t\t}\n");
- }
- }
-}
-
-static void
-emit_struct(definition *def)
-{
- decl_list *dl;
- int j, size, flag;
- bas_type *ptr;
- int can_inline;
-
- if (inline_size == 0) {
- /* No xdr_inlining at all */
- for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
- print_stat(1, &dl->decl);
- return;
- }
-
- for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
- if (dl->decl.rel == REL_VECTOR){
- f_print(fout, "\tint i;\n");
- break;
- }
-
- size = 0;
- can_inline = 0;
- /*
- * Make a first pass and see if inling is possible.
- */
- for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
- if ((dl->decl.prefix == NULL) &&
- ((ptr = find_type(dl->decl.type)) != NULL) &&
- ((dl->decl.rel == REL_ALIAS)||
- (dl->decl.rel == REL_VECTOR))){
- if (dl->decl.rel == REL_ALIAS)
- size += ptr->length;
- else {
- can_inline = 1;
- break; /* can be inlined */
- }
- } else {
- if (size >= inline_size){
- can_inline = 1;
- break; /* can be inlined */
- }
- size = 0;
- }
- if (size >= inline_size)
- can_inline = 1;
-
- if (can_inline == 0){ /* can not inline, drop back to old mode */
- for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
- print_stat(1, &dl->decl);
- return;
- }
-
- flag = PUT;
- for (j = 0; j < 2; j++){
- inline_struct(def, flag);
- if (flag == PUT)
- flag = GET;
- }
-
- f_print(fout, "\t\treturn (TRUE);\n\t}\n\n");
-
- /* now take care of XDR_FREE case */
-
- for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
- print_stat(1, &dl->decl);
-
-}
-
-static void
-emit_typedef(definition *def)
-{
- const char *prefix = def->def.ty.old_prefix;
- const char *type = def->def.ty.old_type;
- const char *amax = def->def.ty.array_max;
- relation rel = def->def.ty.rel;
-
- print_ifstat(1, prefix, type, rel, amax, "objp", def->def_name);
-}
-
-static void
-print_stat(int indent, declaration *dec)
-{
- const char *prefix = dec->prefix;
- const char *type = dec->type;
- const char *amax = dec->array_max;
- relation rel = dec->rel;
- char name[256];
-
- if (isvectordef(type, rel)) {
- s_print(name, "objp->%s", dec->name);
- } else {
- s_print(name, "&objp->%s", dec->name);
- }
- print_ifstat(indent, prefix, type, rel, amax, name, dec->name);
-}
-
-
-char *upcase(const char *);
-
-static void
-emit_inline(int indent, declaration *decl, int flag)
-{
- switch (decl->rel) {
- case REL_ALIAS :
- emit_single_in_line(indent, decl, flag, REL_ALIAS);
- break;
- case REL_VECTOR :
- tabify(fout, indent);
- f_print(fout, "{\n");
- tabify(fout, indent + 1);
- f_print(fout, "%s *genp;\n\n", decl->type);
- tabify(fout, indent + 1);
- f_print(fout,
- "for (i = 0, genp = objp->%s;\n", decl->name);
- tabify(fout, indent + 2);
- f_print(fout, "i < %s; i++) {\n", decl->array_max);
- emit_single_in_line(indent + 2, decl, flag, REL_VECTOR);
- tabify(fout, indent + 1);
- f_print(fout, "}\n");
- tabify(fout, indent);
- f_print(fout, "}\n");
- break;
- default:
- break;
- }
-}
-
-static void
-emit_single_in_line(int indent, declaration *decl, int flag, relation rel)
-{
- char *upp_case;
-
- tabify(fout, indent);
- if (flag == PUT)
- f_print(fout, "IXDR_PUT_");
- else
- if (rel == REL_ALIAS)
- f_print(fout, "objp->%s = IXDR_GET_", decl->name);
- else
- f_print(fout, "*genp++ = IXDR_GET_");
-
- upp_case = upcase(decl->type);
-
- /* hack - XX */
- if (strcmp(upp_case, "INT") == 0)
- {
- free(upp_case);
- upp_case = strdup("LONG");
- }
-
- if (strcmp(upp_case, "U_INT") == 0)
- {
- free(upp_case);
- upp_case = strdup("U_LONG");
- }
- if (flag == PUT)
- if (rel == REL_ALIAS)
- f_print(fout,
- "%s(buf, objp->%s);\n", upp_case, decl->name);
- else
- f_print(fout, "%s(buf, *genp++);\n", upp_case);
-
- else
- f_print(fout, "%s(buf);\n", upp_case);
- free(upp_case);
-}
-
-char *
-upcase(const char *str)
-{
- char *ptr, *hptr;
-
- ptr = (char *)xmalloc(strlen(str)+1);
-
- hptr = ptr;
- while (*str != '\0')
- *ptr++ = toupper(*str++);
-
- *ptr = '\0';
- return (hptr);
-}
diff --git a/usr.bin/rpcgen/rpc_hout.c b/usr.bin/rpcgen/rpc_hout.c
deleted file mode 100644
index 7068363..0000000
--- a/usr.bin/rpcgen/rpc_hout.c
+++ /dev/null
@@ -1,527 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#if 0
-#ifndef lint
-#ident "@(#)rpc_hout.c 1.16 94/04/25 SMI"
-static char sccsid[] = "@(#)rpc_hout.c 1.12 89/02/22 (C) 1987 SMI";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * rpc_hout.c, Header file outputter for the RPC protocol compiler
- * Copyright (C) 1987, Sun Microsystems, Inc.
- */
-#include <stdio.h>
-#include <ctype.h>
-#include "rpc_parse.h"
-#include "rpc_scan.h"
-#include "rpc_util.h"
-
-void storexdrfuncdecl(const char *, int );
-static void pconstdef( definition * );
-static void pstructdef( definition * );
-static void puniondef( definition * );
-static void pprogramdef( definition *, int );
-static void penumdef( definition * );
-static void ptypedef( definition * );
-static void pdefine(const char *, const char *);
-static int undefined2(const char *, const char *);
-static void parglist(proc_list *, const char *);
-static void pprocdef(proc_list *, version_list *, const char *, int);
-
-/*
- * Print the C-version of an xdr definition
- */
-void
-print_datadef(definition *def, int headeronly)
-{
-
- if (def->def_kind == DEF_PROGRAM) /* handle data only */
- return;
-
- if (def->def_kind != DEF_CONST) {
- f_print(fout, "\n");
- }
- switch (def->def_kind) {
- case DEF_STRUCT:
- pstructdef(def);
- break;
- case DEF_UNION:
- puniondef(def);
- break;
- case DEF_ENUM:
- penumdef(def);
- break;
- case DEF_TYPEDEF:
- ptypedef(def);
- break;
- case DEF_PROGRAM:
- pprogramdef(def, headeronly);
- break;
- case DEF_CONST:
- pconstdef(def);
- break;
- }
- if (def->def_kind != DEF_PROGRAM && def->def_kind != DEF_CONST) {
- storexdrfuncdecl(def->def_name,
- def->def_kind != DEF_TYPEDEF ||
- !isvectordef(def->def.ty.old_type,
- def->def.ty.rel));
- }
-}
-
-
-void
-print_funcdef(definition *def, int headeronly)
-{
- switch (def->def_kind) {
- case DEF_PROGRAM:
- f_print(fout, "\n");
- pprogramdef(def, headeronly);
- break;
- default:
- break;
- }
-}
-
-/* store away enough information to allow the XDR functions to be spat
- out at the end of the file */
-
-void
-storexdrfuncdecl(const char *name, int pointerp)
-{
- xdrfunc * xdrptr;
-
- xdrptr = XALLOC(struct xdrfunc);
-
- xdrptr->name = name;
- xdrptr->pointerp = pointerp;
- xdrptr->next = NULL;
-
- if (xdrfunc_tail == NULL){
- xdrfunc_head = xdrptr;
- xdrfunc_tail = xdrptr;
- } else {
- xdrfunc_tail->next = xdrptr;
- xdrfunc_tail = xdrptr;
- }
-
-
-}
-
-void
-print_xdr_func_def(const char *name, int pointerp)
-{
- f_print(fout, "extern bool_t xdr_%s(XDR *, %s%s);\n", name,
- name, pointerp ? "*" : "");
-}
-
-
-static void
-pconstdef(def)
- definition *def;
-{
- pdefine(def->def_name, def->def.co);
-}
-
-/* print out the definitions for the arguments of functions in the
- header file
-*/
-static void
-pargdef(definition *def)
-{
- decl_list *l;
- version_list *vers;
- char *name;
- proc_list *plist;
-
-
- for (vers = def->def.pr.versions; vers != NULL; vers = vers->next) {
- for (plist = vers->procs; plist != NULL;
- plist = plist->next) {
-
- if (!newstyle || plist->arg_num < 2) {
- continue; /* old style or single args */
- }
- name = plist->args.argname;
- f_print(fout, "struct %s {\n", name);
- for (l = plist->args.decls;
- l != NULL; l = l->next) {
- pdeclaration(name, &l->decl, 1,
- ";\n");
- }
- f_print(fout, "};\n");
- f_print(fout, "typedef struct %s %s;\n",
- name, name);
- storexdrfuncdecl(name, 1);
- f_print(fout, "\n");
- }
- }
-}
-
-
-static void
-pstructdef(definition *def)
-{
- decl_list *l;
- const char *name = def->def_name;
-
- f_print(fout, "struct %s {\n", name);
- for (l = def->def.st.decls; l != NULL; l = l->next) {
- pdeclaration(name, &l->decl, 1, ";\n");
- }
- f_print(fout, "};\n");
- f_print(fout, "typedef struct %s %s;\n", name, name);
-}
-
-static void
-puniondef(def)
- definition *def;
-{
- case_list *l;
- const char *name = def->def_name;
- declaration *decl;
-
- f_print(fout, "struct %s {\n", name);
- decl = &def->def.un.enum_decl;
- if (streq(decl->type, "bool")) {
- f_print(fout, "\tbool_t %s;\n", decl->name);
- } else {
- f_print(fout, "\t%s %s;\n", decl->type, decl->name);
- }
- f_print(fout, "\tunion {\n");
- for (l = def->def.un.cases; l != NULL; l = l->next) {
- if (l->contflag == 0)
- pdeclaration(name, &l->case_decl, 2, ";\n");
- }
- decl = def->def.un.default_decl;
- if (decl && !streq(decl->type, "void")) {
- pdeclaration(name, decl, 2, ";\n");
- }
- f_print(fout, "\t} %s_u;\n", name);
- f_print(fout, "};\n");
- f_print(fout, "typedef struct %s %s;\n", name, name);
-}
-
-static void
-pdefine(const char *name, const char *num)
-{
- f_print(fout, "#define\t%s %s\n", name, num);
-}
-
-static void
-puldefine(const char *name, const char *num)
-{
- f_print(fout, "#define\t%s ((unsigned long)(%s))\n", name, num);
-}
-
-static int
-define_printed(proc_list *stop, version_list *start)
-{
- version_list *vers;
- proc_list *proc;
-
- for (vers = start; vers != NULL; vers = vers->next) {
- for (proc = vers->procs; proc != NULL; proc = proc->next) {
- if (proc == stop) {
- return (0);
- } else if (streq(proc->proc_name, stop->proc_name)) {
- return (1);
- }
- }
- }
- abort();
- /* NOTREACHED */
-}
-
-static void
-pfreeprocdef(const char * name, const char *vers)
-{
- f_print(fout, "extern int ");
- pvname(name, vers);
- f_print(fout, "_freeresult(SVCXPRT *, xdrproc_t, caddr_t);\n");
-}
-
-static void
-pdispatch(const char * name, const char *vers)
-{
-
- f_print(fout, "void ");
- pvname(name, vers);
- f_print(fout, "(struct svc_req *rqstp, SVCXPRT *transp);\n");
-}
-
-static void
-pprogramdef(definition *def, int headeronly)
-{
- version_list *vers;
- proc_list *proc;
- const char *ext;
-
- pargdef(def);
-
- puldefine(def->def_name, def->def.pr.prog_num);
- for (vers = def->def.pr.versions; vers != NULL; vers = vers->next) {
- if (tblflag) {
- f_print(fout,
- "extern struct rpcgen_table %s_%s_table[];\n",
- locase(def->def_name), vers->vers_num);
- f_print(fout,
- "extern %s_%s_nproc;\n",
- locase(def->def_name), vers->vers_num);
- }
- puldefine(vers->vers_name, vers->vers_num);
-
- f_print(fout, "\n");
- ext = "extern ";
- if (headeronly) {
- f_print(fout, "%s", ext);
- pdispatch(def->def_name, vers->vers_num);
- }
- for (proc = vers->procs; proc != NULL; proc = proc->next) {
- if (!define_printed(proc, def->def.pr.versions)) {
- puldefine(proc->proc_name, proc->proc_num);
- }
- f_print(fout, "%s", ext);
- pprocdef(proc, vers, "CLIENT *", 0);
- f_print(fout, "%s", ext);
- pprocdef(proc, vers, "struct svc_req *", 1);
- }
- pfreeprocdef(def->def_name, vers->vers_num);
- }
-}
-
-static void
-pprocdef(proc_list *proc, version_list *vp, const char *addargtype, int server_p)
-{
- if (mtflag) {/* Print MT style stubs */
- if (server_p)
- f_print(fout, "bool_t ");
- else
- f_print(fout, "enum clnt_stat ");
- } else {
- ptype(proc->res_prefix, proc->res_type, 1);
- f_print(fout, "* ");
- }
- if (server_p)
- pvname_svc(proc->proc_name, vp->vers_num);
- else
- pvname(proc->proc_name, vp->vers_num);
-
- parglist(proc, addargtype);
-}
-
-
-
-/* print out argument list of procedure */
-static void
-parglist(proc_list *proc, const char *addargtype)
-{
- decl_list *dl;
-
- f_print(fout, "(");
- if (proc->arg_num < 2 && newstyle &&
- streq(proc->args.decls->decl.type, "void")) {
- /* 0 argument in new style: do nothing*/
- }
- else {
- for (dl = proc->args.decls; dl != NULL; dl = dl->next) {
- ptype(dl->decl.prefix, dl->decl.type, 1);
- if (!newstyle)
- f_print(fout, "*");
- /* old style passes by reference */
- f_print(fout, ", ");
- }
- }
-
- if (mtflag) {
- ptype(proc->res_prefix, proc->res_type, 1);
- f_print(fout, "*, ");
- }
-
- f_print(fout, "%s);\n", addargtype);
-
-}
-
-static void
-penumdef(def)
- definition *def;
-{
- const char *name = def->def_name;
- enumval_list *l;
- const char *last = NULL;
- int count = 0;
-
- f_print(fout, "enum %s {\n", name);
- for (l = def->def.en.vals; l != NULL; l = l->next) {
- f_print(fout, "\t%s", l->name);
- if (l->assignment) {
- f_print(fout, " = %s", l->assignment);
- last = l->assignment;
- count = 1;
- } else {
- if (last == NULL) {
- f_print(fout, " = %d", count++);
- } else {
- f_print(fout, " = %s + %d", last, count++);
- }
- }
- if (l->next)
- f_print(fout, ",\n");
- else
- f_print(fout, "\n");
- }
- f_print(fout, "};\n");
- f_print(fout, "typedef enum %s %s;\n", name, name);
-}
-
-static void
-ptypedef(def)
- definition *def;
-{
- const char *name = def->def_name;
- const char *old = def->def.ty.old_type;
- char prefix[8]; /* enough to contain "struct ", including NUL */
- relation rel = def->def.ty.rel;
-
-
- if (!streq(name, old)) {
- if (streq(old, "string")) {
- old = "char";
- rel = REL_POINTER;
- } else if (streq(old, "opaque")) {
- old = "char";
- } else if (streq(old, "bool")) {
- old = "bool_t";
- }
- if (undefined2(old, name) && def->def.ty.old_prefix) {
- s_print(prefix, "%s ", def->def.ty.old_prefix);
- } else {
- prefix[0] = 0;
- }
- f_print(fout, "typedef ");
- switch (rel) {
- case REL_ARRAY:
- f_print(fout, "struct {\n");
- f_print(fout, "\tu_int %s_len;\n", name);
- f_print(fout, "\t%s%s *%s_val;\n", prefix, old, name);
- f_print(fout, "} %s", name);
- break;
- case REL_POINTER:
- f_print(fout, "%s%s *%s", prefix, old, name);
- break;
- case REL_VECTOR:
- f_print(fout, "%s%s %s[%s]", prefix, old, name,
- def->def.ty.array_max);
- break;
- case REL_ALIAS:
- f_print(fout, "%s%s %s", prefix, old, name);
- break;
- }
- f_print(fout, ";\n");
- }
-}
-
-void
-pdeclaration(const char *name, declaration *dec, int tab, const char *separator)
-{
- char buf[8]; /* enough to hold "struct ", include NUL */
- const char *prefix;
- const char *type;
-
- if (streq(dec->type, "void")) {
- return;
- }
- tabify(fout, tab);
- if (streq(dec->type, name) && !dec->prefix) {
- f_print(fout, "struct ");
- }
- if (streq(dec->type, "string")) {
- f_print(fout, "char *%s", dec->name);
- } else {
- prefix = "";
- if (streq(dec->type, "bool")) {
- type = "bool_t";
- } else if (streq(dec->type, "opaque")) {
- type = "char";
- } else {
- if (dec->prefix) {
- s_print(buf, "%s ", dec->prefix);
- prefix = buf;
- }
- type = dec->type;
- }
- switch (dec->rel) {
- case REL_ALIAS:
- f_print(fout, "%s%s %s", prefix, type, dec->name);
- break;
- case REL_VECTOR:
- f_print(fout, "%s%s %s[%s]", prefix, type, dec->name,
- dec->array_max);
- break;
- case REL_POINTER:
- f_print(fout, "%s%s *%s", prefix, type, dec->name);
- break;
- case REL_ARRAY:
- f_print(fout, "struct {\n");
- tabify(fout, tab);
- f_print(fout, "\tu_int %s_len;\n", dec->name);
- tabify(fout, tab);
- f_print(fout,
- "\t%s%s *%s_val;\n", prefix, type, dec->name);
- tabify(fout, tab);
- f_print(fout, "} %s", dec->name);
- break;
- }
- }
- f_print(fout, separator);
-}
-
-static int
-undefined2(const char *type, const char *stop)
-{
- list *l;
- definition *def;
-
- for (l = defined; l != NULL; l = l->next) {
- def = (definition *) l->val;
- if (def->def_kind != DEF_PROGRAM) {
- if (streq(def->def_name, stop)) {
- return (1);
- } else if (streq(def->def_name, type)) {
- return (0);
- }
- }
- }
- return (1);
-}
diff --git a/usr.bin/rpcgen/rpc_main.c b/usr.bin/rpcgen/rpc_main.c
deleted file mode 100644
index fb3813f..0000000
--- a/usr.bin/rpcgen/rpc_main.c
+++ /dev/null
@@ -1,1258 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-
-#if 0
-#ifndef lint
-#ident "@(#)rpc_main.c 1.21 94/04/25 SMI"
-static char sccsid[] = "@(#)rpc_main.c 1.30 89/03/30 (C) 1987 SMI";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * rpc_main.c, Top level of the RPC protocol compiler.
- * Copyright (C) 1987, Sun Microsystems, Inc.
- */
-
-#include <err.h>
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/file.h>
-#include <sys/stat.h>
-#include "rpc_parse.h"
-#include "rpc_scan.h"
-#include "rpc_util.h"
-
-static void c_output(const char *, const char *, int, const char *);
-static void h_output(const char *, const char *, int, const char *, int);
-static void l_output(const char *, const char *, int, const char *);
-static void t_output(const char *, const char *, int, const char *);
-static void clnt_output(const char *, const char *, int, const char * );
-static char *generate_guard(const char *);
-static void c_initialize(void);
-
-#if !defined(__FreeBSD__) && !defined(__NetBSD__)
-char * rindex();
-#endif
-
-static void usage(void);
-static void options_usage(void);
-static int do_registers(int, const char **);
-static int parseargs(int, const char **, struct commandline *);
-static void svc_output(const char *, const char *, int, const char *);
-static void mkfile_output(struct commandline *);
-static void s_output(int, const char **, const char *, const char *, int, const char *, int, int);
-
-#define EXTEND 1 /* alias for TRUE */
-#define DONT_EXTEND 0 /* alias for FALSE */
-
-#define SVR4_CPP "/usr/ccs/lib/cpp"
-#define SUNOS_CPP "/usr/bin/cpp"
-
-static int cppDefined = 0; /* explicit path for C preprocessor */
-
-static const char *svcclosetime = "120";
-static const char *CPP = SVR4_CPP;
-static const char CPPFLAGS[] = "-C";
-static char pathbuf[MAXPATHLEN + 1];
-static const char *allv[] = {
- "rpcgen", "-s", "udp", "-s", "tcp",
-};
-static int allc = sizeof (allv)/sizeof (allv[0]);
-static const char *allnv[] = {
- "rpcgen", "-s", "netpath",
-};
-static int allnc = sizeof (allnv)/sizeof (allnv[0]);
-
-/*
- * machinations for handling expanding argument list
- */
-static void addarg(const char *); /* add another argument to the list */
-static void putarg(int, const char *); /* put argument at specified location */
-static void clear_args(void); /* clear argument list */
-static void checkfiles(const char *, const char *);
- /* check if out file already exists */
-
-
-
-#define ARGLISTLEN 20
-#define FIXEDARGS 2
-
-static char *arglist[ARGLISTLEN];
-static int argcount = FIXEDARGS;
-
-
-int nonfatalerrors; /* errors */
-int inetdflag = 0; /* Support for inetd is disabled by default, use -I */
-int pmflag = 0; /* Support for port monitors is disabled by default */
-int tirpc_socket = 1; /* TI-RPC on socket, no TLI library */
-int logflag; /* Use syslog instead of fprintf for errors */
-int tblflag; /* Support for dispatch table file */
-int mtflag = 0; /* Support for MT */
-
-#define INLINE 0
-/* length at which to start doing an inline */
-
-int inline_size = INLINE;
-/*
- * Length at which to start doing an inline. INLINE = default
- * if 0, no xdr_inline code
- */
-
-int indefinitewait; /* If started by port monitors, hang till it wants */
-int exitnow; /* If started by port monitors, exit after the call */
-int timerflag; /* TRUE if !indefinite && !exitnow */
-int newstyle; /* newstyle of passing arguments (by value) */
-int CCflag = 0; /* C++ files */
-static int allfiles; /* generate all files */
-int tirpcflag = 1; /* generating code for tirpc, by default */
-xdrfunc *xdrfunc_head = NULL; /* xdr function list */
-xdrfunc *xdrfunc_tail = NULL; /* xdr function list */
-pid_t childpid;
-
-
-int
-main(int argc, const char *argv[])
-{
- struct commandline cmd;
-
- (void) memset((char *)&cmd, 0, sizeof (struct commandline));
- clear_args();
- if (!parseargs(argc, argv, &cmd))
- usage();
- /*
- * Only the client and server side stubs are likely to be customized,
- * so in that case only, check if the outfile exists, and if so,
- * print an error message and exit.
- */
- if (cmd.Ssflag || cmd.Scflag || cmd.makefileflag) {
- checkfiles(cmd.infile, cmd.outfile);
- }
- else
- checkfiles(cmd.infile, NULL);
-
- if (cmd.cflag) {
- c_output(cmd.infile, "-DRPC_XDR", DONT_EXTEND, cmd.outfile);
- } else if (cmd.hflag) {
- h_output(cmd.infile, "-DRPC_HDR", DONT_EXTEND, cmd.outfile,
- cmd.hflag);
- } else if (cmd.lflag) {
- l_output(cmd.infile, "-DRPC_CLNT", DONT_EXTEND, cmd.outfile);
- } else if (cmd.sflag || cmd.mflag || (cmd.nflag)) {
- s_output(argc, argv, cmd.infile, "-DRPC_SVC", DONT_EXTEND,
- cmd.outfile, cmd.mflag, cmd.nflag);
- } else if (cmd.tflag) {
- t_output(cmd.infile, "-DRPC_TBL", DONT_EXTEND, cmd.outfile);
- } else if (cmd.Ssflag) {
- svc_output(cmd.infile, "-DRPC_SERVER", DONT_EXTEND,
- cmd.outfile);
- } else if (cmd.Scflag) {
- clnt_output(cmd.infile, "-DRPC_CLIENT", DONT_EXTEND,
- cmd.outfile);
- } else if (cmd.makefileflag) {
- mkfile_output(&cmd);
- } else {
- /* the rescans are required, since cpp may effect input */
- c_output(cmd.infile, "-DRPC_XDR", EXTEND, "_xdr.c");
- reinitialize();
- h_output(cmd.infile, "-DRPC_HDR", EXTEND, ".h", cmd.hflag);
- reinitialize();
- l_output(cmd.infile, "-DRPC_CLNT", EXTEND, "_clnt.c");
- reinitialize();
- if (inetdflag || !tirpcflag)
- s_output(allc, allv, cmd.infile, "-DRPC_SVC", EXTEND,
- "_svc.c", cmd.mflag, cmd.nflag);
- else
- s_output(allnc, allnv, cmd.infile, "-DRPC_SVC",
- EXTEND, "_svc.c", cmd.mflag, cmd.nflag);
- if (tblflag) {
- reinitialize();
- t_output(cmd.infile, "-DRPC_TBL", EXTEND, "_tbl.i");
- }
-
- if (allfiles) {
- reinitialize();
- svc_output(cmd.infile, "-DRPC_SERVER", EXTEND,
- "_server.c");
- reinitialize();
- clnt_output(cmd.infile, "-DRPC_CLIENT", EXTEND,
- "_client.c");
-
- }
- if (allfiles || (cmd.makefileflag == 1)){
- reinitialize();
- mkfile_output(&cmd);
- }
-
- }
- exit(nonfatalerrors);
- /* NOTREACHED */
-}
-
-
-/*
- * add extension to filename
- */
-static char *
-extendfile(const char *path, const char *ext)
-{
- char *res;
- const char *p;
- const char *file;
-
- if ((file = rindex(path, '/')) == NULL)
- file = path;
- else
- file++;
- res = xmalloc(strlen(file) + strlen(ext) + 1);
- p = strrchr(file, '.');
- if (p == NULL) {
- p = file + strlen(file);
- }
- (void) strcpy(res, file);
- (void) strcpy(res + (p - file), ext);
- return (res);
-}
-
-/*
- * Open output file with given extension
- */
-static void
-open_output(const char *infile, const char *outfile)
-{
-
- if (outfile == NULL) {
- fout = stdout;
- return;
- }
-
- if (infile != NULL && streq(outfile, infile)) {
- warnx("%s already exists. No output generated", infile);
- crash();
- }
- fout = fopen(outfile, "w");
- if (fout == NULL) {
- warn("unable to open %s", outfile);
- crash();
- }
- record_open(outfile);
-
- return;
-}
-
-static void
-add_warning(void)
-{
- f_print(fout, "/*\n");
- f_print(fout, " * Please do not edit this file.\n");
- f_print(fout, " * It was generated using rpcgen.\n");
- f_print(fout, " */\n\n");
-}
-
-/* clear list of arguments */
-static void
-clear_args(void)
-{
- int i;
- for (i = FIXEDARGS; i < ARGLISTLEN; i++)
- arglist[i] = NULL;
- argcount = FIXEDARGS;
-}
-
-/* make sure that a CPP exists */
-static void
-find_cpp(void)
-{
- struct stat buf;
-
- if (stat(CPP, &buf) < 0) { /* SVR4 or explicit cpp does not exist */
- if (cppDefined) {
- warnx("cannot find C preprocessor: %s", CPP);
- crash();
- } else { /* try the other one */
- CPP = SUNOS_CPP;
- if (stat(CPP, &buf) < 0) { /* can't find any cpp */
- warnx("cannot find C preprocessor: %s", CPP);
- crash();
- }
- }
- }
-}
-
-/*
- * Open input file with given define for C-preprocessor
- */
-static void
-open_input(const char *infile, const char *define)
-{
- int pd[2];
-
- infilename = (infile == NULL) ? "<stdin>" : infile;
- (void) pipe(pd);
- switch (childpid = fork()) {
- case 0:
- find_cpp();
- putarg(0, CPP);
- putarg(1, CPPFLAGS);
- addarg(define);
- if (infile)
- addarg(infile);
- addarg((char *)NULL);
- (void) close(1);
- (void) dup2(pd[1], 1);
- (void) close(pd[0]);
- execv(arglist[0], arglist);
- err(1, "execv");
- case -1:
- err(1, "fork");
- }
- (void) close(pd[1]);
- fin = fdopen(pd[0], "r");
- if (fin == NULL) {
- warn("%s", infilename);
- crash();
- }
-}
-
-/* valid tirpc nettypes */
-static const char *valid_ti_nettypes[] =
-{
- "netpath",
- "visible",
- "circuit_v",
- "datagram_v",
- "circuit_n",
- "datagram_n",
- "udp",
- "tcp",
- "raw",
- NULL
- };
-
-/* valid inetd nettypes */
-static const char *valid_i_nettypes[] =
-{
- "udp",
- "tcp",
- NULL
- };
-
-static int
-check_nettype(const char *name, const char *list_to_check[])
-{
- int i;
- for (i = 0; list_to_check[i] != NULL; i++) {
- if (strcmp(name, list_to_check[i]) == 0) {
- return (1);
- }
- }
- warnx("illegal nettype :\'%s\'", name);
- return (0);
-}
-
-static const char *
-file_name(const char *file, const char *ext)
-{
- char *temp;
- temp = extendfile(file, ext);
-
- if (access(temp, F_OK) != -1)
- return (temp);
- else
- return (" ");
-
-}
-
-
-static void
-c_output(const char *infile, const char *define, int extend, const char *outfile)
-{
- definition *def;
- char *include;
- const char *outfilename;
- long tell;
-
- c_initialize();
- open_input(infile, define);
- outfilename = extend ? extendfile(infile, outfile) : outfile;
- open_output(infile, outfilename);
- add_warning();
- if (infile && (include = extendfile(infile, ".h"))) {
- f_print(fout, "#include \"%s\"\n", include);
- free(include);
- /* .h file already contains rpc/rpc.h */
- } else
- f_print(fout, "#include <rpc/rpc.h>\n");
- tell = ftell(fout);
- while ( (def = get_definition()) ) {
- emit(def);
- }
- if (extend && tell == ftell(fout)) {
- (void) unlink(outfilename);
- }
-}
-
-
-void
-c_initialize(void)
-{
-
- /* add all the starting basic types */
- add_type(1, "int");
- add_type(1, "long");
- add_type(1, "short");
- add_type(1, "bool");
- add_type(1, "u_int");
- add_type(1, "u_long");
- add_type(1, "u_short");
-
-}
-
-const char rpcgen_table_dcl[] = "struct rpcgen_table {\n\
- char *(*proc)(); \n\
- xdrproc_t xdr_arg; \n\
- unsigned len_arg; \n\
- xdrproc_t xdr_res; \n\
- unsigned len_res; \n\
-}; \n";
-
-
-char *
-generate_guard(const char *pathname)
-{
- const char *filename;
- char *guard, *tmp, *stopat;
-
- filename = strrchr(pathname, '/'); /* find last component */
- filename = ((filename == 0) ? pathname : filename+1);
- guard = xstrdup(filename);
- stopat = strrchr(guard, '.');
-
- /*
- * Convert to a valid C macro name and make it upper case.
- * Map macro unfriendly characterss to '_'.
- */
- for (tmp = guard; *tmp != '\000'; ++tmp) {
- if (islower(*tmp))
- *tmp = toupper(*tmp);
- else if (isupper(*tmp) || *tmp == '_')
- /* OK for C */;
- else if (tmp == guard)
- *tmp = '_';
- else if (isdigit(*tmp))
- /* OK for all but first character */;
- else if (tmp == stopat) {
- *tmp = '\0';
- break;
- } else
- *tmp = '_';
- }
- /*
- * Can't have a '_' in front, because it'll end up being "__".
- * "__" macros shoudln't be used. So, remove all of the
- * '_' characters from the front.
- */
- if (*guard == '_') {
- for (tmp = guard; *tmp == '_'; ++tmp)
- ;
- strcpy(guard, tmp);
- }
- guard = extendfile(guard, "_H_RPCGEN");
- return (guard);
-}
-
-/*
- * Compile into an XDR header file
- */
-
-
-static void
-h_output(const char *infile, const char *define, int extend, const char *outfile, int headeronly)
-{
- definition *def;
- const char *outfilename;
- long tell;
- const char *guard;
- list *l;
- xdrfunc *xdrfuncp;
-
- open_input(infile, define);
- outfilename = extend ? extendfile(infile, outfile) : outfile;
- open_output(infile, outfilename);
- add_warning();
- if (outfilename || infile){
- guard = generate_guard(outfilename ? outfilename: infile);
- } else
- guard = "STDIN_";
-
- f_print(fout, "#ifndef _%s\n#define _%s\n\n", guard,
- guard);
-
- f_print(fout, "#include <rpc/rpc.h>\n");
-
- if (mtflag)
- f_print(fout, "#include <pthread.h>\n");
-
- /* put the C++ support */
- if (!CCflag) {
- f_print(fout, "\n#ifdef __cplusplus\n");
- f_print(fout, "extern \"C\" {\n");
- f_print(fout, "#endif\n\n");
- }
-
- /* put in a typedef for quadprecision. Only with Cflag */
-
- tell = ftell(fout);
-
- /* print data definitions */
- while ( (def = get_definition()) ) {
- print_datadef(def, headeronly);
- }
-
- /*
- * print function declarations.
- * Do this after data definitions because they might be used as
- * arguments for functions
- */
- for (l = defined; l != NULL; l = l->next) {
- print_funcdef(l->val, headeronly);
- }
- /* Now print all xdr func declarations */
- if (xdrfunc_head != NULL){
-
- f_print(fout,
- "\n/* the xdr functions */\n");
-
- if (CCflag){
- f_print(fout, "\n#ifdef __cplusplus\n");
- f_print(fout, "extern \"C\" {\n");
- f_print(fout, "#endif\n");
- }
-
- xdrfuncp = xdrfunc_head;
- while (xdrfuncp != NULL){
- print_xdr_func_def(xdrfuncp->name, xdrfuncp->pointerp);
- xdrfuncp = xdrfuncp->next;
- }
- }
-
- if (extend && tell == ftell(fout)) {
- (void) unlink(outfilename);
- } else if (tblflag) {
- f_print(fout, rpcgen_table_dcl);
- }
-
- f_print(fout, "\n#ifdef __cplusplus\n");
- f_print(fout, "}\n");
- f_print(fout, "#endif\n");
-
- f_print(fout, "\n#endif /* !_%s */\n", guard);
-}
-
-/*
- * Compile into an RPC service
- */
-static void
-s_output(int argc, const char *argv[], const char *infile, const char *define,
- int extend, const char *outfile, int nomain, int netflag)
-{
- char *include;
- definition *def;
- int foundprogram = 0;
- const char *outfilename;
-
- open_input(infile, define);
- outfilename = extend ? extendfile(infile, outfile) : outfile;
- open_output(infile, outfilename);
- add_warning();
- if (infile && (include = extendfile(infile, ".h"))) {
- f_print(fout, "#include \"%s\"\n", include);
- free(include);
- } else
- f_print(fout, "#include <rpc/rpc.h>\n");
-
- f_print(fout, "#include <stdio.h>\n");
- f_print(fout, "#include <stdlib.h> /* getenv, exit */\n");
- f_print (fout, "#include <rpc/pmap_clnt.h> /* for pmap_unset */\n");
- f_print (fout, "#include <string.h> /* strcmp */\n");
- if (tirpcflag)
- f_print(fout, "#include <rpc/rpc_com.h>\n");
- if (strcmp(svcclosetime, "-1") == 0)
- indefinitewait = 1;
- else if (strcmp(svcclosetime, "0") == 0)
- exitnow = 1;
- else if (inetdflag || pmflag) {
- f_print(fout, "#include <signal.h>\n");
- timerflag = 1;
- }
-
- if (!tirpcflag && inetdflag)
- f_print(fout, "#include <sys/ttycom.h> /* TIOCNOTTY */\n");
- if (inetdflag || pmflag) {
- f_print(fout, "#ifdef __cplusplus\n");
- f_print(fout,
- "#include <sys/sysent.h> /* getdtablesize, open */\n");
- f_print(fout, "#endif /* __cplusplus */\n");
- }
- if (tirpcflag) {
- f_print(fout, "#include <fcntl.h> /* open */\n");
- f_print(fout, "#include <unistd.h> /* fork / setsid */\n");
- f_print(fout, "#include <sys/types.h>\n");
- }
-
- f_print(fout, "#include <string.h>\n");
- if (inetdflag || !tirpcflag) {
- f_print(fout, "#include <sys/socket.h>\n");
- f_print(fout, "#include <netinet/in.h>\n");
- }
-
- if ((netflag || pmflag) && tirpcflag && !nomain) {
- f_print(fout, "#include <netconfig.h>\n");
- }
- if (tirpcflag)
- f_print(fout, "#include <sys/resource.h> /* rlimit */\n");
- if (logflag || inetdflag || pmflag || tirpcflag)
- f_print(fout, "#include <syslog.h>\n");
-
- f_print(fout, "\n#ifdef DEBUG\n#define RPC_SVC_FG\n#endif\n");
- if (timerflag)
- f_print(fout, "\n#define _RPCSVC_CLOSEDOWN %s\n",
- svcclosetime);
- while ( (def = get_definition()) ) {
- foundprogram |= (def->def_kind == DEF_PROGRAM);
- }
- if (extend && !foundprogram) {
- (void) unlink(outfilename);
- return;
- }
- write_most(infile, netflag, nomain);
- if (!nomain) {
- if (!do_registers(argc, argv)) {
- if (outfilename)
- (void) unlink(outfilename);
- usage();
- }
- write_rest();
- }
-}
-
-/*
- * generate client side stubs
- */
-static void
-l_output(const char *infile, const char *define, int extend, const char *outfile)
-{
- char *include;
- definition *def;
- int foundprogram = 0;
- const char *outfilename;
-
- open_input(infile, define);
- outfilename = extend ? extendfile(infile, outfile) : outfile;
- open_output(infile, outfilename);
- add_warning();
- f_print (fout, "#include <string.h> /* for memset */\n");
- if (infile && (include = extendfile(infile, ".h"))) {
- f_print(fout, "#include \"%s\"\n", include);
- free(include);
- } else
- f_print(fout, "#include <rpc/rpc.h>\n");
- while ( (def = get_definition()) ) {
- foundprogram |= (def->def_kind == DEF_PROGRAM);
- }
- if (extend && !foundprogram) {
- (void) unlink(outfilename);
- return;
- }
- write_stubs();
-}
-
-/*
- * generate the dispatch table
- */
-static void
-t_output(const char *infile, const char *define, int extend, const char *outfile)
-{
- definition *def;
- int foundprogram = 0;
- const char *outfilename;
-
- open_input(infile, define);
- outfilename = extend ? extendfile(infile, outfile) : outfile;
- open_output(infile, outfilename);
- add_warning();
- while ( (def = get_definition()) ) {
- foundprogram |= (def->def_kind == DEF_PROGRAM);
- }
- if (extend && !foundprogram) {
- (void) unlink(outfilename);
- return;
- }
- write_tables();
-}
-
-/* sample routine for the server template */
-static void
-svc_output(const char *infile, const char *define, int extend, const char *outfile)
-{
- definition *def;
- char *include;
- const char *outfilename;
- long tell;
- open_input(infile, define);
- outfilename = extend ? extendfile(infile, outfile) : outfile;
- checkfiles(infile, outfilename);
- /*
- * Check if outfile already exists.
- * if so, print an error message and exit
- */
- open_output(infile, outfilename);
- add_sample_msg();
-
- if (infile && (include = extendfile(infile, ".h"))) {
- f_print(fout, "#include \"%s\"\n", include);
- free(include);
- } else
- f_print(fout, "#include <rpc/rpc.h>\n");
-
- tell = ftell(fout);
- while ( (def = get_definition()) ) {
- write_sample_svc(def);
- }
- if (extend && tell == ftell(fout)) {
- (void) unlink(outfilename);
- }
-}
-
-/* sample main routine for client */
-static void
-clnt_output(const char *infile, const char *define, int extend, const char *outfile)
-{
- definition *def;
- char *include;
- const char *outfilename;
- long tell;
- int has_program = 0;
-
- open_input(infile, define);
- outfilename = extend ? extendfile(infile, outfile) : outfile;
- checkfiles(infile, outfilename);
- /*
- * Check if outfile already exists.
- * if so, print an error message and exit
- */
-
- open_output(infile, outfilename);
- add_sample_msg();
- if (infile && (include = extendfile(infile, ".h"))) {
- f_print(fout, "#include \"%s\"\n", include);
- free(include);
- } else
- f_print(fout, "#include <rpc/rpc.h>\n");
- tell = ftell(fout);
- while ( (def = get_definition()) ) {
- has_program += write_sample_clnt(def);
- }
-
- if (has_program)
- write_sample_clnt_main();
-
- if (extend && tell == ftell(fout)) {
- (void) unlink(outfilename);
- }
-}
-
-
-static void mkfile_output(struct commandline *cmd)
-{
- const char *mkfilename, *clientname, *clntname, *xdrname, *hdrname;
- const char *servername, *svcname, *servprogname, *clntprogname;
- char *temp, *mkftemp;
-
- svcname = file_name(cmd->infile, "_svc.c");
- clntname = file_name(cmd->infile, "_clnt.c");
- xdrname = file_name(cmd->infile, "_xdr.c");
- hdrname = file_name(cmd->infile, ".h");
-
-
- if (allfiles){
- servername = extendfile(cmd->infile, "_server.c");
- clientname = extendfile(cmd->infile, "_client.c");
- }else{
- servername = " ";
- clientname = " ";
- }
- servprogname = extendfile(cmd->infile, "_server");
- clntprogname = extendfile(cmd->infile, "_client");
-
- if (allfiles){
- mkftemp = xmalloc(strlen("makefile.") +
- strlen(cmd->infile) + 1);
- temp = (char *)rindex(cmd->infile, '.');
- strcpy(mkftemp, "makefile.");
- (void) strncat(mkftemp, cmd->infile,
- (temp - cmd->infile));
- mkfilename = mkftemp;
- } else
- mkfilename = cmd->outfile;
-
-
- checkfiles(NULL, mkfilename);
- open_output(NULL, mkfilename);
-
- f_print(fout, "\n# This is a template makefile generated\
- by rpcgen \n");
-
- f_print(fout, "\n# Parameters \n\n");
-
- f_print(fout, "CLIENT = %s\nSERVER = %s\n\n",
- clntprogname, servprogname);
- f_print(fout, "SOURCES_CLNT.c = \nSOURCES_CLNT.h = \n");
- f_print(fout, "SOURCES_SVC.c = \nSOURCES_SVC.h = \n");
- f_print(fout, "SOURCES.x = %s\n\n", cmd->infile);
- f_print(fout, "TARGETS_SVC.c = %s %s %s \n",
- svcname, servername, xdrname);
- f_print(fout, "TARGETS_CLNT.c = %s %s %s \n",
- clntname, clientname, xdrname);
- f_print(fout, "TARGETS = %s %s %s %s %s %s\n\n",
- hdrname, xdrname, clntname,
- svcname, clientname, servername);
-
- f_print(fout, "OBJECTS_CLNT = $(SOURCES_CLNT.c:%%.c=%%.o) \
-$(TARGETS_CLNT.c:%%.c=%%.o) ");
-
- f_print(fout, "\nOBJECTS_SVC = $(SOURCES_SVC.c:%%.c=%%.o) \
-$(TARGETS_SVC.c:%%.c=%%.o) ");
-
-
- f_print(fout, "\n# Compiler flags \n");
- if (mtflag)
- f_print(fout, "\nCFLAGS += -D_REENTRANT -D_THEAD_SAFE \nLDLIBS += -pthread\n");
-
- f_print(fout, "RPCGENFLAGS = \n");
-
- f_print(fout, "\n# Targets \n\n");
-
- f_print(fout, "all : $(CLIENT) $(SERVER)\n\n");
- f_print(fout, "$(TARGETS) : $(SOURCES.x) \n");
- f_print(fout, "\trpcgen $(RPCGENFLAGS) $(SOURCES.x)\n\n");
- f_print(fout, "$(OBJECTS_CLNT) : $(SOURCES_CLNT.c) $(SOURCES_CLNT.h) \
-$(TARGETS_CLNT.c) \n\n");
-
- f_print(fout, "$(OBJECTS_SVC) : $(SOURCES_SVC.c) $(SOURCES_SVC.h) \
-$(TARGETS_SVC.c) \n\n");
- f_print(fout, "$(CLIENT) : $(OBJECTS_CLNT) \n");
- f_print(fout, "\t$(CC) -o $(CLIENT) $(OBJECTS_CLNT) \
-$(LDLIBS) \n\n");
- f_print(fout, "$(SERVER) : $(OBJECTS_SVC) \n");
- f_print(fout, "\t$(CC) -o $(SERVER) $(OBJECTS_SVC) $(LDLIBS)\n\n ");
- f_print(fout, "clean:\n\t $(RM) -f core $(TARGETS) $(OBJECTS_CLNT) \
-$(OBJECTS_SVC) $(CLIENT) $(SERVER)\n\n");
-}
-
-
-
-/*
- * Perform registrations for service output
- * Return 0 if failed; 1 otherwise.
- */
-static int
-do_registers(int argc, const char *argv[])
-{
- int i;
-
- if (inetdflag || !tirpcflag) {
- for (i = 1; i < argc; i++) {
- if (streq(argv[i], "-s")) {
- if (!check_nettype(argv[i + 1],
- valid_i_nettypes))
- return (0);
- write_inetd_register(argv[i + 1]);
- i++;
- }
- }
- } else {
- for (i = 1; i < argc; i++)
- if (streq(argv[i], "-s")) {
- if (!check_nettype(argv[i + 1],
- valid_ti_nettypes))
- return (0);
- write_nettype_register(argv[i + 1]);
- i++;
- } else if (streq(argv[i], "-n")) {
- write_netid_register(argv[i + 1]);
- i++;
- }
- }
- return (1);
-}
-
-/*
- * Add another argument to the arg list
- */
-static void
-addarg(const char *cp)
-{
- if (argcount >= ARGLISTLEN) {
- warnx("too many defines");
- crash();
- /*NOTREACHED*/
- }
- if (cp != NULL)
- arglist[argcount++] = xstrdup(cp);
- else
- arglist[argcount++] = NULL;
-
-}
-
-static void
-putarg(int place, const char *cp)
-{
- if (place >= ARGLISTLEN) {
- warnx("arglist coding error");
- crash();
- /*NOTREACHED*/
- }
- if (cp != NULL)
- arglist[place] = xstrdup(cp);
- else
- arglist[place] = NULL;
-}
-
-/*
- * if input file is stdin and an output file is specified then complain
- * if the file already exists. Otherwise the file may get overwritten
- * If input file does not exist, exit with an error
- */
-
-static void
-checkfiles(const char *infile, const char *outfile)
-{
-
- struct stat buf;
-
- if (infile) /* infile ! = NULL */
- if (stat(infile, &buf) < 0)
- {
- warn("%s", infile);
- crash();
- };
- if (outfile) {
- if (stat(outfile, &buf) < 0)
- return; /* file does not exist */
- else {
- warnx("file '%s' already exists and may be overwritten", outfile);
- crash();
- }
- }
-}
-
-/*
- * Parse command line arguments
- */
-static int
-parseargs(int argc, const char *argv[], struct commandline *cmd)
-{
- int i;
- int j;
- char c, ch;
- char flag[(1 << 8 * sizeof (char))];
- int nflags;
-
- cmd->infile = cmd->outfile = NULL;
- if (argc < 2) {
- return (0);
- }
- allfiles = 0;
- flag['c'] = 0;
- flag['h'] = 0;
- flag['l'] = 0;
- flag['m'] = 0;
- flag['o'] = 0;
- flag['s'] = 0;
- flag['n'] = 0;
- flag['t'] = 0;
- flag['S'] = 0;
- flag['C'] = 0;
- flag['M'] = 0;
-
- for (i = 1; i < argc; i++) {
- if (argv[i][0] != '-') {
- if (cmd->infile) {
- warnx("cannot specify more than one input file");
- return (0);
- }
- cmd->infile = argv[i];
- } else {
- for (j = 1; argv[i][j] != 0; j++) {
- c = argv[i][j];
- switch (c) {
- case 'a':
- allfiles = 1;
- break;
- case 'c':
- case 'h':
- case 'l':
- case 'm':
- case 't':
- if (flag[(int)c]) {
- return (0);
- }
- flag[(int)c] = 1;
- break;
- case 'S':
- /*
- * sample flag: Ss or Sc.
- * Ss means set flag['S'];
- * Sc means set flag['C'];
- * Sm means set flag['M'];
- */
- ch = argv[i][++j]; /* get next char */
- if (ch == 's')
- ch = 'S';
- else if (ch == 'c')
- ch = 'C';
- else if (ch == 'm')
- ch = 'M';
- else
- return (0);
-
- if (flag[(int)ch]) {
- return (0);
- }
- flag[(int)ch] = 1;
- break;
- case 'C': /* ANSI C syntax */
- ch = argv[i][j+1]; /* get next char */
-
- if (ch != 'C')
- break;
- CCflag = 1;
- break;
- case 'b':
- /*
- * Turn TIRPC flag off for
- * generating backward compatible
- * code
- */
- tirpcflag = 0;
- break;
-
- case 'I':
- inetdflag = 1;
- break;
- case 'N':
- newstyle = 1;
- break;
- case 'L':
- logflag = 1;
- break;
- case 'P':
- pmflag = 1;
- break;
- case 'K':
- if (++i == argc) {
- return (0);
- }
- svcclosetime = argv[i];
- goto nextarg;
- case 'T':
- tblflag = 1;
- break;
- case 'M':
- mtflag = 1;
- break;
- case 'i' :
- if (++i == argc) {
- return (0);
- }
- inline_size = atoi(argv[i]);
- goto nextarg;
- case 'n':
- case 'o':
- case 's':
- if (argv[i][j - 1] != '-' ||
- argv[i][j + 1] != 0) {
- return (0);
- }
- flag[(int)c] = 1;
- if (++i == argc) {
- return (0);
- }
- if (c == 'o') {
- if (cmd->outfile) {
- return (0);
- }
- cmd->outfile = argv[i];
- }
- goto nextarg;
- case 'D':
- if (argv[i][j - 1] != '-') {
- return (0);
- }
- (void) addarg(argv[i]);
- goto nextarg;
- case 'Y':
- if (++i == argc) {
- return (0);
- }
- (void) strlcpy(pathbuf, argv[i], sizeof(pathbuf));
- if (strlcat(pathbuf, "/cpp", sizeof(pathbuf))
- >= sizeof(pathbuf)) {
- warnx("argument too long");
- return (0);
- }
- CPP = pathbuf;
- cppDefined = 1;
- goto nextarg;
-
-
-
- default:
- return (0);
- }
- }
- nextarg:
- ;
- }
- }
-
- cmd->cflag = flag['c'];
- cmd->hflag = flag['h'];
- cmd->lflag = flag['l'];
- cmd->mflag = flag['m'];
- cmd->nflag = flag['n'];
- cmd->sflag = flag['s'];
- cmd->tflag = flag['t'];
- cmd->Ssflag = flag['S'];
- cmd->Scflag = flag['C'];
- cmd->makefileflag = flag['M'];
-
- if (tirpcflag) {
- if (inetdflag)
- pmflag = 0;
- if ((inetdflag && cmd->nflag)) {
- /* netid not allowed with inetdflag */
- warnx("cannot use netid flag with inetd flag");
- return (0);
- }
- } else { /* 4.1 mode */
- pmflag = 0; /* set pmflag only in tirpcmode */
- if (cmd->nflag) { /* netid needs TIRPC */
- warnx("cannot use netid flag without TIRPC");
- return (0);
- }
- }
-
- if (newstyle && (tblflag || cmd->tflag)) {
- warnx("cannot use table flags with newstyle");
- return (0);
- }
-
- /* check no conflicts with file generation flags */
- nflags = cmd->cflag + cmd->hflag + cmd->lflag + cmd->mflag +
- cmd->sflag + cmd->nflag + cmd->tflag + cmd->Ssflag +
- cmd->Scflag + cmd->makefileflag;
-
- if (nflags == 0) {
- if (cmd->outfile != NULL || cmd->infile == NULL) {
- return (0);
- }
- } else if (cmd->infile == NULL &&
- (cmd->Ssflag || cmd->Scflag || cmd->makefileflag)) {
- warnx("\"infile\" is required for template generation flags");
- return (0);
- } if (nflags > 1) {
- warnx("cannot have more than one file generation flag");
- return (0);
- }
- return (1);
-}
-
-static void
-usage()
-{
- f_print(stderr, "%s\n%s\n%s\n%s\n%s\n",
- "usage: rpcgen infile",
- " rpcgen [-abCLNTM] [-Dname[=value]] [-i size]\
-[-I -P [-K seconds]] [-Y path] infile",
- " rpcgen [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm]\
-[-o outfile] [infile]",
- " rpcgen [-s nettype]* [-o outfile] [infile]",
- " rpcgen [-n netid]* [-o outfile] [infile]");
- options_usage();
- exit(1);
-}
-
-static void
-options_usage()
-{
- f_print(stderr, "options:\n");
- f_print(stderr, "-a\t\tgenerate all files, including samples\n");
- f_print(stderr, "-b\t\tbackward compatibility mode (generates code \
-for FreeBSD 4.X)\n");
- f_print(stderr, "-c\t\tgenerate XDR routines\n");
- f_print(stderr, "-C\t\tANSI C mode\n");
- f_print(stderr, "-Dname[=value]\tdefine a symbol (same as #define)\n");
- f_print(stderr, "-h\t\tgenerate header file\n");
- f_print(stderr, "-i size\t\tsize at which to start generating\
-inline code\n");
- f_print(stderr, "-I\t\tgenerate code for inetd support in server\n");
- f_print(stderr, "-K seconds\tserver exits after K seconds of\
-inactivity\n");
- f_print(stderr, "-l\t\tgenerate client side stubs\n");
- f_print(stderr, "-L\t\tserver errors will be printed to syslog\n");
- f_print(stderr, "-m\t\tgenerate server side stubs\n");
- f_print(stderr, "-M\t\tgenerate MT-safe code\n");
- f_print(stderr, "-n netid\tgenerate server code that supports\
-named netid\n");
- f_print(stderr, "-N\t\tsupports multiple arguments and\
-call-by-value\n");
- f_print(stderr, "-o outfile\tname of the output file\n");
- f_print(stderr, "-P\t\tgenerate code for port monitoring support in server\n");
- f_print(stderr, "-s nettype\tgenerate server code that supports named\
-nettype\n");
- f_print(stderr, "-Sc\t\tgenerate sample client code that uses remote\
-procedures\n");
- f_print(stderr, "-Ss\t\tgenerate sample server code that defines\
-remote procedures\n");
- f_print(stderr, "-Sm \t\tgenerate makefile template \n");
-
- f_print(stderr, "-t\t\tgenerate RPC dispatch table\n");
- f_print(stderr, "-T\t\tgenerate code to support RPC dispatch tables\n");
- f_print(stderr, "-Y path\t\tpath where cpp is found\n");
- exit(1);
-}
diff --git a/usr.bin/rpcgen/rpc_parse.c b/usr.bin/rpcgen/rpc_parse.c
deleted file mode 100644
index f7f857a..0000000
--- a/usr.bin/rpcgen/rpc_parse.c
+++ /dev/null
@@ -1,639 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#if 0
-#ifndef lint
-#ident "@(#)rpc_parse.c 1.12 93/07/05 SMI"
-static char sccsid[] = "@(#)rpc_parse.c 1.8 89/02/22 (C) 1987 SMI";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * rpc_parse.c, Parser for the RPC protocol compiler
- * Copyright (C) 1987 Sun Microsystems, Inc.
- */
-#include <stdio.h>
-#include <string.h>
-#include "rpc/types.h"
-#include "rpc_parse.h"
-#include "rpc_scan.h"
-#include "rpc_util.h"
-
-#define ARGNAME "arg"
-
-static void isdefined( definition * );
-static void def_struct( definition * );
-static void def_program( definition * );
-static void def_enum( definition * );
-static void def_const( definition * );
-static void def_union( definition * );
-static void def_typedef( definition * );
-static void get_declaration( declaration *, defkind );
-static void get_prog_declaration( declaration *, defkind, int );
-static void get_type(const char **, const char **, defkind);
-static void unsigned_dec(const char ** );
-
-/*
- * return the next definition you see
- */
-definition *
-get_definition(void)
-{
- definition *defp;
- token tok;
-
- defp = XALLOC(definition);
- get_token(&tok);
- switch (tok.kind) {
- case TOK_STRUCT:
- def_struct(defp);
- break;
- case TOK_UNION:
- def_union(defp);
- break;
- case TOK_TYPEDEF:
- def_typedef(defp);
- break;
- case TOK_ENUM:
- def_enum(defp);
- break;
- case TOK_PROGRAM:
- def_program(defp);
- break;
- case TOK_CONST:
- def_const(defp);
- break;
- case TOK_EOF:
- return (NULL);
- default:
- error("definition keyword expected");
- }
- scan(TOK_SEMICOLON, &tok);
- isdefined(defp);
- return (defp);
-}
-
-static void
-isdefined(definition *defp)
-{
- STOREVAL(&defined, defp);
-}
-
-static void
-def_struct(definition *defp)
-{
- token tok;
- declaration dec;
- decl_list *decls;
- decl_list **tailp;
-
- defp->def_kind = DEF_STRUCT;
-
- scan(TOK_IDENT, &tok);
- defp->def_name = tok.str;
- scan(TOK_LBRACE, &tok);
- tailp = &defp->def.st.decls;
- do {
- get_declaration(&dec, DEF_STRUCT);
- decls = XALLOC(decl_list);
- decls->decl = dec;
- *tailp = decls;
- tailp = &decls->next;
- scan(TOK_SEMICOLON, &tok);
- peek(&tok);
- } while (tok.kind != TOK_RBRACE);
- get_token(&tok);
- *tailp = NULL;
-}
-
-static void
-def_program(definition *defp)
-{
- token tok;
- declaration dec;
- decl_list *decls;
- decl_list **tailp;
- version_list *vlist;
- version_list **vtailp;
- proc_list *plist;
- proc_list **ptailp;
- int num_args;
- bool_t isvoid = FALSE; /* whether first argument is void */
- defp->def_kind = DEF_PROGRAM;
- scan(TOK_IDENT, &tok);
- defp->def_name = tok.str;
- scan(TOK_LBRACE, &tok);
- vtailp = &defp->def.pr.versions;
- tailp = &defp->def.st.decls;
- scan(TOK_VERSION, &tok);
- do {
- scan(TOK_IDENT, &tok);
- vlist = XALLOC(version_list);
- vlist->vers_name = tok.str;
- scan(TOK_LBRACE, &tok);
- ptailp = &vlist->procs;
- do {
- /* get result type */
- plist = XALLOC(proc_list);
- get_type(&plist->res_prefix, &plist->res_type,
- DEF_PROGRAM);
- if (streq(plist->res_type, "opaque")) {
- error("illegal result type");
- }
- scan(TOK_IDENT, &tok);
- plist->proc_name = tok.str;
- scan(TOK_LPAREN, &tok);
- /* get args - first one */
- num_args = 1;
- isvoid = FALSE;
- /*
- * type of DEF_PROGRAM in the first
- * get_prog_declaration and DEF_STURCT in the next
- * allows void as argument if it is the only argument
- */
- get_prog_declaration(&dec, DEF_PROGRAM, num_args);
- if (streq(dec.type, "void"))
- isvoid = TRUE;
- decls = XALLOC(decl_list);
- plist->args.decls = decls;
- decls->decl = dec;
- tailp = &decls->next;
- /* get args */
- while (peekscan(TOK_COMMA, &tok)) {
- num_args++;
- get_prog_declaration(&dec, DEF_STRUCT,
- num_args);
- decls = XALLOC(decl_list);
- decls->decl = dec;
- *tailp = decls;
- if (streq(dec.type, "void"))
- isvoid = TRUE;
- tailp = &decls->next;
- }
- /* multiple arguments are only allowed in newstyle */
- if (!newstyle && num_args > 1) {
- error("only one argument is allowed");
- }
- if (isvoid && num_args > 1) {
- error("illegal use of void in program definition");
- }
- *tailp = NULL;
- scan(TOK_RPAREN, &tok);
- scan(TOK_EQUAL, &tok);
- scan_num(&tok);
- scan(TOK_SEMICOLON, &tok);
- plist->proc_num = tok.str;
- plist->arg_num = num_args;
- *ptailp = plist;
- ptailp = &plist->next;
- peek(&tok);
- } while (tok.kind != TOK_RBRACE);
- *ptailp = NULL;
- *vtailp = vlist;
- vtailp = &vlist->next;
- scan(TOK_RBRACE, &tok);
- scan(TOK_EQUAL, &tok);
- scan_num(&tok);
- vlist->vers_num = tok.str;
- /* make the argument structure name for each arg */
- for (plist = vlist->procs; plist != NULL;
- plist = plist->next) {
- plist->args.argname = make_argname(plist->proc_name,
- vlist->vers_num);
- /* free the memory ?? */
- }
- scan(TOK_SEMICOLON, &tok);
- scan2(TOK_VERSION, TOK_RBRACE, &tok);
- } while (tok.kind == TOK_VERSION);
- scan(TOK_EQUAL, &tok);
- scan_num(&tok);
- defp->def.pr.prog_num = tok.str;
- *vtailp = NULL;
-}
-
-
-static void
-def_enum(definition *defp)
-{
- token tok;
- enumval_list *elist;
- enumval_list **tailp;
-
- defp->def_kind = DEF_ENUM;
- scan(TOK_IDENT, &tok);
- defp->def_name = tok.str;
- scan(TOK_LBRACE, &tok);
- tailp = &defp->def.en.vals;
- do {
- scan(TOK_IDENT, &tok);
- elist = XALLOC(enumval_list);
- elist->name = tok.str;
- elist->assignment = NULL;
- scan3(TOK_COMMA, TOK_RBRACE, TOK_EQUAL, &tok);
- if (tok.kind == TOK_EQUAL) {
- scan_num(&tok);
- elist->assignment = tok.str;
- scan2(TOK_COMMA, TOK_RBRACE, &tok);
- }
- *tailp = elist;
- tailp = &elist->next;
- } while (tok.kind != TOK_RBRACE);
- *tailp = NULL;
-}
-
-static void
-def_const(definition *defp)
-{
- token tok;
-
- defp->def_kind = DEF_CONST;
- scan(TOK_IDENT, &tok);
- defp->def_name = tok.str;
- scan(TOK_EQUAL, &tok);
- scan2(TOK_IDENT, TOK_STRCONST, &tok);
- defp->def.co = tok.str;
-}
-
-static void
-def_union(definition *defp)
-{
- token tok;
- declaration dec;
- case_list *cases;
- case_list **tailp;
- int flag;
-
- defp->def_kind = DEF_UNION;
- scan(TOK_IDENT, &tok);
- defp->def_name = tok.str;
- scan(TOK_SWITCH, &tok);
- scan(TOK_LPAREN, &tok);
- get_declaration(&dec, DEF_UNION);
- defp->def.un.enum_decl = dec;
- tailp = &defp->def.un.cases;
- scan(TOK_RPAREN, &tok);
- scan(TOK_LBRACE, &tok);
- scan(TOK_CASE, &tok);
- while (tok.kind == TOK_CASE) {
- scan2(TOK_IDENT, TOK_CHARCONST, &tok);
- cases = XALLOC(case_list);
- cases->case_name = tok.str;
- scan(TOK_COLON, &tok);
- /* now peek at next token */
- flag = 0;
- if (peekscan(TOK_CASE, &tok)){
- do {
- scan2(TOK_IDENT, TOK_CHARCONST, &tok);
- cases->contflag = 1;
- /* continued case statement */
- *tailp = cases;
- tailp = &cases->next;
- cases = XALLOC(case_list);
- cases->case_name = tok.str;
- scan(TOK_COLON, &tok);
- } while (peekscan(TOK_CASE, &tok));
- }
- else
- if (flag)
- {
-
- *tailp = cases;
- tailp = &cases->next;
- cases = XALLOC(case_list);
- };
-
- get_declaration(&dec, DEF_UNION);
- cases->case_decl = dec;
- cases->contflag = 0; /* no continued case statement */
- *tailp = cases;
- tailp = &cases->next;
- scan(TOK_SEMICOLON, &tok);
-
- scan3(TOK_CASE, TOK_DEFAULT, TOK_RBRACE, &tok);
- }
- *tailp = NULL;
- if (tok.kind == TOK_DEFAULT) {
- scan(TOK_COLON, &tok);
- get_declaration(&dec, DEF_UNION);
- defp->def.un.default_decl = XALLOC(declaration);
- *defp->def.un.default_decl = dec;
- scan(TOK_SEMICOLON, &tok);
- scan(TOK_RBRACE, &tok);
- } else {
- defp->def.un.default_decl = NULL;
- }
-}
-
-static const char *reserved_words[] =
-{
- "array",
- "bytes",
- "destroy",
- "free",
- "getpos",
- "inline",
- "pointer",
- "reference",
- "setpos",
- "sizeof",
- "union",
- "vector",
- NULL
- };
-
-static const char *reserved_types[] =
-{
- "opaque",
- "string",
- NULL
- };
-
-/*
- * check that the given name is not one that would eventually result in
- * xdr routines that would conflict with internal XDR routines.
- */
-static void
-check_type_name(const char *name, int new_type)
-{
- int i;
- char tmp[100];
-
- for (i = 0; reserved_words[i] != NULL; i++) {
- if (strcmp(name, reserved_words[i]) == 0) {
- sprintf(tmp,
- "illegal (reserved) name :\'%s\' in type definition",
- name);
- error(tmp);
- }
- }
- if (new_type) {
- for (i = 0; reserved_types[i] != NULL; i++) {
- if (strcmp(name, reserved_types[i]) == 0) {
- sprintf(tmp,
- "illegal (reserved) name :\'%s\' in type definition",
- name);
- error(tmp);
- }
- }
- }
-}
-
-
-
-static void
-def_typedef(definition *defp)
-{
- declaration dec;
-
- defp->def_kind = DEF_TYPEDEF;
- get_declaration(&dec, DEF_TYPEDEF);
- defp->def_name = dec.name;
- check_type_name(dec.name, 1);
- defp->def.ty.old_prefix = dec.prefix;
- defp->def.ty.old_type = dec.type;
- defp->def.ty.rel = dec.rel;
- defp->def.ty.array_max = dec.array_max;
-}
-
-static void
-get_declaration(declaration *dec, defkind dkind)
-{
- token tok;
-
- get_type(&dec->prefix, &dec->type, dkind);
- dec->rel = REL_ALIAS;
- if (streq(dec->type, "void")) {
- return;
- }
-
- check_type_name(dec->type, 0);
- scan2(TOK_STAR, TOK_IDENT, &tok);
- if (tok.kind == TOK_STAR) {
- dec->rel = REL_POINTER;
- scan(TOK_IDENT, &tok);
- }
- dec->name = tok.str;
- if (peekscan(TOK_LBRACKET, &tok)) {
- if (dec->rel == REL_POINTER) {
- error("no array-of-pointer declarations -- use typedef");
- }
- dec->rel = REL_VECTOR;
- scan_num(&tok);
- dec->array_max = tok.str;
- scan(TOK_RBRACKET, &tok);
- } else if (peekscan(TOK_LANGLE, &tok)) {
- if (dec->rel == REL_POINTER) {
- error("no array-of-pointer declarations -- use typedef");
- }
- dec->rel = REL_ARRAY;
- if (peekscan(TOK_RANGLE, &tok)) {
- dec->array_max = "~0"; /* unspecified size, use max */
- } else {
- scan_num(&tok);
- dec->array_max = tok.str;
- scan(TOK_RANGLE, &tok);
- }
- }
- if (streq(dec->type, "opaque")) {
- if (dec->rel != REL_ARRAY && dec->rel != REL_VECTOR) {
- error("array declaration expected");
- }
- } else if (streq(dec->type, "string")) {
- if (dec->rel != REL_ARRAY) {
- error("variable-length array declaration expected");
- }
- }
-}
-
-
-static void
-get_prog_declaration(declaration *dec, defkind dkind, int num)
-{
- token tok;
- char name[10]; /* argument name */
-
- if (dkind == DEF_PROGRAM) {
- peek(&tok);
- if (tok.kind == TOK_RPAREN) { /* no arguments */
- dec->rel = REL_ALIAS;
- dec->type = "void";
- dec->prefix = NULL;
- dec->name = NULL;
- return;
- }
- }
- get_type(&dec->prefix, &dec->type, dkind);
- dec->rel = REL_ALIAS;
- if (peekscan(TOK_IDENT, &tok)) /* optional name of argument */
- strcpy(name, tok.str);
- else
- sprintf(name, "%s%d", ARGNAME, num);
- /* default name of argument */
-
- dec->name = (char *) xstrdup(name);
- if (streq(dec->type, "void")) {
- return;
- }
-
- if (streq(dec->type, "opaque")) {
- error("opaque -- illegal argument type");
- }
- if (peekscan(TOK_STAR, &tok)) {
- if (streq(dec->type, "string")) {
- error("pointer to string not allowed in program arguments");
- }
- dec->rel = REL_POINTER;
- if (peekscan(TOK_IDENT, &tok)) {
- /* optional name of argument */
- dec->name = xstrdup(tok.str);
- }
- }
- if (peekscan(TOK_LANGLE, &tok)) {
- if (!streq(dec->type, "string")) {
- error("arrays cannot be declared as arguments to procedures -- use typedef");
- }
- dec->rel = REL_ARRAY;
- if (peekscan(TOK_RANGLE, &tok)) {
- dec->array_max = "~0";
- /* unspecified size, use max */
- } else {
- scan_num(&tok);
- dec->array_max = tok.str;
- scan(TOK_RANGLE, &tok);
- }
- }
- if (streq(dec->type, "string")) {
- if (dec->rel != REL_ARRAY) {
- /*
- * .x specifies just string as
- * type of argument
- * - make it string<>
- */
- dec->rel = REL_ARRAY;
- dec->array_max = "~0"; /* unspecified size, use max */
- }
- }
-}
-
-
-
-static void
-get_type(const char **prefixp, const char **typep, defkind dkind)
-{
- token tok;
-
- *prefixp = NULL;
- get_token(&tok);
- switch (tok.kind) {
- case TOK_IDENT:
- *typep = tok.str;
- break;
- case TOK_STRUCT:
- case TOK_ENUM:
- case TOK_UNION:
- *prefixp = tok.str;
- scan(TOK_IDENT, &tok);
- *typep = tok.str;
- break;
- case TOK_UNSIGNED:
- unsigned_dec(typep);
- break;
- case TOK_SHORT:
- *typep = "short";
- (void) peekscan(TOK_INT, &tok);
- break;
- case TOK_LONG:
- *typep = "long";
- (void) peekscan(TOK_INT, &tok);
- break;
- case TOK_HYPER:
- *typep = "int64_t";
- (void) peekscan(TOK_INT, &tok);
- break;
-
- case TOK_VOID:
- if (dkind != DEF_UNION && dkind != DEF_PROGRAM) {
- error("voids allowed only inside union and program definitions with one argument");
- }
- *typep = tok.str;
- break;
- case TOK_STRING:
- case TOK_OPAQUE:
- case TOK_CHAR:
- case TOK_INT:
- case TOK_FLOAT:
- case TOK_DOUBLE:
- case TOK_BOOL:
- case TOK_QUAD:
- *typep = tok.str;
- break;
- default:
- error("expected type specifier");
- }
-}
-
-static void
-unsigned_dec(const char **typep)
-{
- token tok;
-
- peek(&tok);
- switch (tok.kind) {
- case TOK_CHAR:
- get_token(&tok);
- *typep = "u_char";
- break;
- case TOK_SHORT:
- get_token(&tok);
- *typep = "u_short";
- (void) peekscan(TOK_INT, &tok);
- break;
- case TOK_LONG:
- get_token(&tok);
- *typep = "u_long";
- (void) peekscan(TOK_INT, &tok);
- break;
- case TOK_HYPER:
- get_token(&tok);
- *typep = "u_int64_t";
-
- (void) peekscan(TOK_INT, &tok);
- break;
- case TOK_INT:
- get_token(&tok);
- *typep = "u_int";
- break;
- default:
- *typep = "u_int";
- break;
- }
-}
diff --git a/usr.bin/rpcgen/rpc_parse.h b/usr.bin/rpcgen/rpc_parse.h
deleted file mode 100644
index 3ca874e..0000000
--- a/usr.bin/rpcgen/rpc_parse.h
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * $FreeBSD$
- */
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-/* #pragma ident "@(#)rpc_parse.h 1.10 94/05/15 SMI" */
-
-/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
-/* All Rights Reserved */
-
-/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */
-/* The copyright notice above does not evidence any */
-/* actual or intended publication of such source code. */
-
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-* PROPRIETARY NOTICE (Combined)
-*
-* This source code is unpublished proprietary information
-* constituting, or derived under license from AT&T's UNIX(r) System V.
-* In addition, portions of such source code were derived from Berkeley
-* 4.3 BSD under license from the Regents of the University of
-* California.
-*
-*
-*
-* Copyright Notice
-*
-* Notice of copyright on this source code product does not indicate
-* publication.
-*
-* (c) 1986,1987,1988.1989 Sun Microsystems, Inc
-* (c) 1983,1984,1985,1986,1987,1988,1989 AT&T.
-* All rights reserved.
-*/
-
-/* @(#)rpc_parse.h 1.3 90/08/29 (C) 1987 SMI */
-
-/*
- * rpc_parse.h, Definitions for the RPCL parser
- */
-
-enum defkind {
- DEF_CONST,
- DEF_STRUCT,
- DEF_UNION,
- DEF_ENUM,
- DEF_TYPEDEF,
- DEF_PROGRAM
-};
-typedef enum defkind defkind;
-
-typedef const char *const_def;
-
-enum relation {
- REL_VECTOR, /* fixed length array */
- REL_ARRAY, /* variable length array */
- REL_POINTER, /* pointer */
- REL_ALIAS, /* simple */
-};
-typedef enum relation relation;
-
-struct typedef_def {
- const char *old_prefix;
- const char *old_type;
- relation rel;
- const char *array_max;
-};
-typedef struct typedef_def typedef_def;
-
-struct enumval_list {
- const char *name;
- const char *assignment;
- struct enumval_list *next;
-};
-typedef struct enumval_list enumval_list;
-
-struct enum_def {
- enumval_list *vals;
-};
-typedef struct enum_def enum_def;
-
-struct declaration {
- const char *prefix;
- const char *type;
- const char *name;
- relation rel;
- const char *array_max;
-};
-typedef struct declaration declaration;
-
-struct decl_list {
- declaration decl;
- struct decl_list *next;
-};
-typedef struct decl_list decl_list;
-
-struct struct_def {
- decl_list *decls;
-};
-typedef struct struct_def struct_def;
-
-struct case_list {
- const char *case_name;
- int contflag;
- declaration case_decl;
- struct case_list *next;
-};
-typedef struct case_list case_list;
-
-struct union_def {
- declaration enum_decl;
- case_list *cases;
- declaration *default_decl;
-};
-typedef struct union_def union_def;
-
-struct arg_list {
- char *argname; /* name of struct for arg*/
- decl_list *decls;
-};
-
-typedef struct arg_list arg_list;
-
-struct proc_list {
- const char *proc_name;
- const char *proc_num;
- arg_list args;
- int arg_num;
- const char *res_type;
- const char *res_prefix;
- struct proc_list *next;
-};
-typedef struct proc_list proc_list;
-
-struct version_list {
- const char *vers_name;
- const char *vers_num;
- proc_list *procs;
- struct version_list *next;
-};
-typedef struct version_list version_list;
-
-struct program_def {
- const char *prog_num;
- version_list *versions;
-};
-typedef struct program_def program_def;
-
-struct definition {
- const char *def_name;
- defkind def_kind;
- union {
- const_def co;
- struct_def st;
- union_def un;
- enum_def en;
- typedef_def ty;
- program_def pr;
- } def;
-};
-typedef struct definition definition;
-
-definition *get_definition(void);
-
-
-struct bas_type
-{
- const char *name;
- int length;
- struct bas_type *next;
-};
-
-typedef struct bas_type bas_type;
diff --git a/usr.bin/rpcgen/rpc_sample.c b/usr.bin/rpcgen/rpc_sample.c
deleted file mode 100644
index 3a4e392..0000000
--- a/usr.bin/rpcgen/rpc_sample.c
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-/* #pragma ident "@(#)rpc_sample.c 1.9 94/04/25 SMI" */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * rpc_sample.c, Sample client-server code outputter for the RPC protocol compiler
- * Copyright (C) 1987, Sun Microsystems, Inc.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include "rpc_parse.h"
-#include "rpc_scan.h"
-#include "rpc_util.h"
-
-
-static char RQSTP[] = "rqstp";
-
-static void write_sample_client(const char *, version_list * );
-static void write_sample_server( definition * );
-static void return_type( proc_list * );
-
-void
-write_sample_svc(definition *def)
-{
-
- if (def->def_kind != DEF_PROGRAM)
- return;
- write_sample_server(def);
-}
-
-
-int
-write_sample_clnt(definition *def)
-{
- version_list *vp;
- int count = 0;
-
- if (def->def_kind != DEF_PROGRAM)
- return(0);
- /* generate sample code for each version */
- for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- write_sample_client(def->def_name, vp);
- ++count;
- }
- return(count);
-}
-
-
-static void
-write_sample_client(const char *program_name, version_list *vp)
-{
- proc_list *proc;
- int i;
- decl_list *l;
-
- f_print(fout, "\n\nvoid\n");
- pvname(program_name, vp->vers_num);
- f_print(fout, "(char *host)\n{\n");
- f_print(fout, "\tCLIENT *clnt;\n");
-
- i = 0;
- for (proc = vp->procs; proc != NULL; proc = proc->next) {
- f_print(fout, "\t");
- if (mtflag) {
- f_print(fout, "enum clnt_stat retval_%d;\n\t", ++i);
- ptype(proc->res_prefix, proc->res_type, 1);
- f_print(fout, "result_%d;\n", i);
- } else {
- ptype(proc->res_prefix, proc->res_type, 1);
- f_print(fout, " *result_%d;\n",++i);
- }
- /* print out declarations for arguments */
- if(proc->arg_num < 2 && !newstyle) {
- f_print(fout, "\t");
- if(!streq(proc->args.decls->decl.type, "void"))
- ptype(proc->args.decls->decl.prefix,
- proc->args.decls->decl.type, 1);
- else
- f_print(fout, "char * "); /* cannot have "void" type */
- f_print(fout, " ");
- pvname(proc->proc_name, vp->vers_num);
- f_print(fout, "_arg;\n");
- } else if (!streq(proc->args.decls->decl.type, "void")) {
- for (l = proc->args.decls; l != NULL; l = l->next) {
- f_print(fout, "\t");
- ptype(l->decl.prefix, l->decl.type, 1);
- if (strcmp(l->decl.type,"string") == 1)
- f_print(fout, " ");
- pvname(proc->proc_name, vp->vers_num);
- f_print(fout, "_%s;\n", l->decl.name);
- }
- }
- }
-
- /* generate creation of client handle */
- f_print(fout, "\n#ifndef\tDEBUG\n");
- f_print(fout, "\tclnt = clnt_create(host, %s, %s, \"%s\");\n",
- program_name, vp->vers_name, tirpcflag? "netpath" : "udp");
- f_print(fout, "\tif (clnt == (CLIENT *) NULL) {\n");
- f_print(fout, "\t\tclnt_pcreateerror(host);\n");
- f_print(fout, "\t\texit(1);\n\t}\n");
- f_print(fout, "#endif\t/* DEBUG */\n\n");
-
- /* generate calls to procedures */
- i = 0;
- for (proc = vp->procs; proc != NULL; proc = proc->next) {
- if (mtflag)
- f_print(fout, "\tretval_%d = ",++i);
- else
- f_print(fout, "\tresult_%d = ",++i);
- pvname(proc->proc_name, vp->vers_num);
- if (proc->arg_num < 2 && !newstyle) {
- f_print(fout, "(");
- if(streq(proc->args.decls->decl.type, "void"))
- /* cast to void * */
- f_print(fout, "(void *)");
- f_print(fout, "&");
- pvname(proc->proc_name, vp->vers_num);
- if (mtflag)
- f_print(fout, "_arg, &result_%d, clnt);\n",
- i);
- else
- f_print(fout, "_arg, clnt);\n");
-
- } else if (streq(proc->args.decls->decl.type, "void")) {
- if (mtflag)
- f_print(fout, "(&result_%d, clnt);\n", i);
- else
- f_print(fout, "(clnt);\n");
- }
- else {
- f_print(fout, "(");
- for (l = proc->args.decls; l != NULL; l = l->next) {
- pvname(proc->proc_name, vp->vers_num);
- f_print(fout, "_%s, ", l->decl.name);
- }
- if (mtflag)
- f_print(fout, "&result_%d, ", i);
-
- f_print(fout, "clnt);\n");
- }
- if (mtflag) {
- f_print(fout, "\tif (retval_%d != RPC_SUCCESS) {\n", i);
-
- } else {
- f_print(fout, "\tif (result_%d == (", i);
- ptype(proc->res_prefix, proc->res_type, 1);
- f_print(fout, "*) NULL) {\n");
- }
- f_print(fout, "\t\tclnt_perror(clnt, \"call failed\");\n");
- f_print(fout, "\t}\n");
- }
-
- f_print(fout, "#ifndef\tDEBUG\n");
- f_print(fout, "\tclnt_destroy(clnt);\n");
- f_print(fout, "#endif\t /* DEBUG */\n");
- f_print(fout, "}\n");
-}
-
-static void
-write_sample_server(definition *def)
-{
- version_list *vp;
- proc_list *proc;
-
- for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- for (proc = vp->procs; proc != NULL; proc = proc->next) {
- f_print(fout, "\n");
- if (!mtflag) {
- return_type(proc);
- f_print(fout, "*\n");
- } else
- f_print(fout, "bool_t\n");
- pvname_svc(proc->proc_name, vp->vers_num);
- printarglist(proc, "result", RQSTP, "struct svc_req *");
-
- f_print(fout, "{\n");
- if (!mtflag) {
- f_print(fout, "\tstatic ");
- if(!streq(proc->res_type, "void"))
- return_type(proc);
- else
- f_print(fout, "char *");
- /* cannot have void type */
- f_print(fout, " result;\n");
- }
- else
- f_print(fout, "\tbool_t retval;\n");
- f_print(fout,
- "\n\t/*\n\t * insert server code here\n\t */\n\n");
-
- if (!mtflag)
- if(!streq(proc->res_type, "void"))
- f_print(fout, "\treturn (&result);\n}\n");
- else /* cast back to void * */
- f_print(fout, "\treturn((void *) &result);\n}\n");
- else
- f_print(fout, "\treturn (retval);\n}\n");
- }
- /* put in sample freeing routine */
- if (mtflag) {
- f_print(fout, "\nint\n");
- pvname(def->def_name, vp->vers_num);
- f_print(fout,"_freeresult(SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result)\n");
- f_print(fout, "{\n");
- f_print(fout, "\t(void) xdr_free(xdr_result, result);\n");
- f_print(fout,
- "\n\t/*\n\t * Insert additional freeing code here, if needed\n\t */\n");
- f_print(fout, "\n}\n");
-
-
- }
- }
-}
-
-
-
-static void
-return_type(proc_list *plist)
-{
- ptype(plist->res_prefix, plist->res_type, 1);
-}
-
-void
-add_sample_msg(void)
-{
- f_print(fout, "/*\n");
- f_print(fout, " * This is sample code generated by rpcgen.\n");
- f_print(fout, " * These are only templates and you can use them\n");
- f_print(fout, " * as a guideline for developing your own functions.\n");
- f_print(fout, " */\n\n");
-}
-
-void
-write_sample_clnt_main(void)
-{
- list *l;
- definition *def;
- version_list *vp;
-
- f_print(fout, "\n\n");
- f_print(fout, "main(int argc, char *argv[])\n{\n");
-
- f_print(fout, "\tchar *host;");
- f_print(fout, "\n\n\tif (argc < 2) {");
- f_print(fout, "\n\t\tprintf(\"usage: %%s server_host\\n\", argv[0]);\n");
- f_print(fout, "\t\texit(1);\n\t}");
- f_print(fout, "\n\thost = argv[1];\n");
-
- for (l = defined; l != NULL; l = l->next) {
- def = l->val;
- if (def->def_kind != DEF_PROGRAM) {
- continue;
- }
- for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- f_print(fout, "\t");
- pvname(def->def_name, vp->vers_num);
- f_print(fout, "(host);\n");
- }
- }
- f_print(fout, "}\n");
-}
diff --git a/usr.bin/rpcgen/rpc_scan.c b/usr.bin/rpcgen/rpc_scan.c
deleted file mode 100644
index 421b055..0000000
--- a/usr.bin/rpcgen/rpc_scan.c
+++ /dev/null
@@ -1,501 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#if 0
-#ifndef lint
-#ident "@(#)rpc_scan.c 1.13 93/07/05 SMI"
-static char sccsid[] = "@(#)rpc_scan.c 1.11 89/02/22 (C) 1987 SMI";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * rpc_scan.c, Scanner for the RPC protocol compiler
- * Copyright (C) 1987, Sun Microsystems, Inc.
- */
-
-#include <sys/types.h>
-
-#include <sys/wait.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <string.h>
-#include "rpc_parse.h"
-#include "rpc_scan.h"
-#include "rpc_util.h"
-
-#define startcomment(where) (where[0] == '/' && where[1] == '*')
-#define endcomment(where) (where[-1] == '*' && where[0] == '/')
-
-static int pushed = 0; /* is a token pushed */
-static token lasttok; /* last token, if pushed */
-
-static void unget_token( token * );
-static void findstrconst(char **, const char **);
-static void findchrconst(char **, const char **);
-static void findconst(char **, const char **);
-static void findkind( char **, token * );
-static int cppline( char * );
-static int directive( char * );
-static void printdirective( char * );
-static void docppline(char *, int *, const char **);
-
-/*
- * scan expecting 1 given token
- */
-void
-scan(tok_kind expect, token *tokp)
-{
- get_token(tokp);
- if (tokp->kind != expect) {
- expected1(expect);
- }
-}
-
-/*
- * scan expecting any of the 2 given tokens
- */
-void
-scan2(tok_kind expect1, tok_kind expect2, token *tokp)
-{
- get_token(tokp);
- if (tokp->kind != expect1 && tokp->kind != expect2) {
- expected2(expect1, expect2);
- }
-}
-
-/*
- * scan expecting any of the 3 given token
- */
-void
-scan3(tok_kind expect1, tok_kind expect2, tok_kind expect3, token *tokp)
-{
- get_token(tokp);
- if (tokp->kind != expect1 && tokp->kind != expect2
- && tokp->kind != expect3) {
- expected3(expect1, expect2, expect3);
- }
-}
-
-/*
- * scan expecting a constant, possibly symbolic
- */
-void
-scan_num(token *tokp)
-{
- get_token(tokp);
- switch (tokp->kind) {
- case TOK_IDENT:
- break;
- default:
- error("constant or identifier expected");
- }
-}
-
-/*
- * Peek at the next token
- */
-void
-peek(token *tokp)
-{
- get_token(tokp);
- unget_token(tokp);
-}
-
-/*
- * Peek at the next token and scan it if it matches what you expect
- */
-int
-peekscan(tok_kind expect, token *tokp)
-{
- peek(tokp);
- if (tokp->kind == expect) {
- get_token(tokp);
- return (1);
- }
- return (0);
-}
-
-/*
- * Get the next token, printing out any directive that are encountered.
- */
-void
-get_token(token *tokp)
-{
- int commenting;
- int stat = 0;
-
-
- if (pushed) {
- pushed = 0;
- *tokp = lasttok;
- return;
- }
- commenting = 0;
- for (;;) {
- if (*where == 0) {
- for (;;) {
- if (!fgets(curline, MAXLINESIZE, fin)) {
- tokp->kind = TOK_EOF;
- /* now check if cpp returned non NULL value */
- waitpid(childpid, &stat, WUNTRACED);
- if (stat > 0) {
- /* Set return value from rpcgen */
- nonfatalerrors = stat >> 8;
- }
- *where = 0;
- return;
- }
- linenum++;
- if (commenting) {
- break;
- } else if (cppline(curline)) {
- docppline(curline, &linenum,
- &infilename);
- } else if (directive(curline)) {
- printdirective(curline);
- } else {
- break;
- }
- }
- where = curline;
- } else if (isspace(*where)) {
- while (isspace(*where)) {
- where++; /* eat */
- }
- } else if (commenting) {
- for (where++; *where; where++) {
- if (endcomment(where)) {
- where++;
- commenting--;
- break;
- }
- }
- } else if (startcomment(where)) {
- where += 2;
- commenting++;
- } else {
- break;
- }
- }
-
- /*
- * 'where' is not whitespace, comment or directive Must be a token!
- */
- switch (*where) {
- case ':':
- tokp->kind = TOK_COLON;
- where++;
- break;
- case ';':
- tokp->kind = TOK_SEMICOLON;
- where++;
- break;
- case ',':
- tokp->kind = TOK_COMMA;
- where++;
- break;
- case '=':
- tokp->kind = TOK_EQUAL;
- where++;
- break;
- case '*':
- tokp->kind = TOK_STAR;
- where++;
- break;
- case '[':
- tokp->kind = TOK_LBRACKET;
- where++;
- break;
- case ']':
- tokp->kind = TOK_RBRACKET;
- where++;
- break;
- case '{':
- tokp->kind = TOK_LBRACE;
- where++;
- break;
- case '}':
- tokp->kind = TOK_RBRACE;
- where++;
- break;
- case '(':
- tokp->kind = TOK_LPAREN;
- where++;
- break;
- case ')':
- tokp->kind = TOK_RPAREN;
- where++;
- break;
- case '<':
- tokp->kind = TOK_LANGLE;
- where++;
- break;
- case '>':
- tokp->kind = TOK_RANGLE;
- where++;
- break;
-
- case '"':
- tokp->kind = TOK_STRCONST;
- findstrconst(&where, &tokp->str);
- break;
- case '\'':
- tokp->kind = TOK_CHARCONST;
- findchrconst(&where, &tokp->str);
- break;
-
- case '-':
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- tokp->kind = TOK_IDENT;
- findconst(&where, &tokp->str);
- break;
-
- default:
- if (!(isalpha(*where) || *where == '_')) {
- char buf[100];
- char *p;
-
- s_print(buf, "illegal character in file: ");
- p = buf + strlen(buf);
- if (isprint(*where)) {
- s_print(p, "%c", *where);
- } else {
- s_print(p, "%d", *where);
- }
- error(buf);
- }
- findkind(&where, tokp);
- break;
- }
-}
-
-static void
-unget_token(token *tokp)
-{
- lasttok = *tokp;
- pushed = 1;
-}
-
-static void
-findstrconst(char **str, const char **val)
-{
- char *p;
- char *tmp;
- int size;
-
- p = *str;
- do {
- p++;
- } while (*p && *p != '"');
- if (*p == 0) {
- error("unterminated string constant");
- }
- p++;
- size = p - *str;
- tmp = xmalloc(size + 1);
- (void) strncpy(tmp, *str, size);
- tmp[size] = 0;
- *val = tmp;
- *str = p;
-}
-
-static void
-findchrconst(char **str, const char **val)
-{
- char *p;
- char *tmp;
- int size;
-
- p = *str;
- do {
- p++;
- } while (*p && *p != '\'');
- if (*p == 0) {
- error("unterminated string constant");
- }
- p++;
- size = p - *str;
- if (size != 3) {
- error("empty char string");
- }
- tmp = xmalloc(size + 1);
- (void) strncpy(tmp, *str, size);
- tmp[size] = 0;
- *val = tmp;
- *str = p;
-}
-
-static void
-findconst(char **str, const char **val)
-{
- char *p;
- char *tmp;
- int size;
-
- p = *str;
- if (*p == '0' && *(p + 1) == 'x') {
- p++;
- do {
- p++;
- } while (isxdigit(*p));
- } else {
- do {
- p++;
- } while (isdigit(*p));
- }
- size = p - *str;
- tmp = xmalloc(size + 1);
- (void) strncpy(tmp, *str, size);
- tmp[size] = 0;
- *val = tmp;
- *str = p;
-}
-
-static token symbols[] = {
- {TOK_CONST, "const"},
- {TOK_UNION, "union"},
- {TOK_SWITCH, "switch"},
- {TOK_CASE, "case"},
- {TOK_DEFAULT, "default"},
- {TOK_STRUCT, "struct"},
- {TOK_TYPEDEF, "typedef"},
- {TOK_ENUM, "enum"},
- {TOK_OPAQUE, "opaque"},
- {TOK_BOOL, "bool"},
- {TOK_VOID, "void"},
- {TOK_CHAR, "char"},
- {TOK_INT, "int"},
- {TOK_UNSIGNED, "unsigned"},
- {TOK_SHORT, "short"},
- {TOK_LONG, "long"},
- {TOK_HYPER, "hyper"},
- {TOK_FLOAT, "float"},
- {TOK_DOUBLE, "double"},
- {TOK_QUAD, "quadruple"},
- {TOK_STRING, "string"},
- {TOK_PROGRAM, "program"},
- {TOK_VERSION, "version"},
- {TOK_EOF, "??????"},
-};
-
-static void
-findkind(char **mark, token *tokp)
-{
- int len;
- token *s;
- char *str, *tmp;
-
- str = *mark;
- for (s = symbols; s->kind != TOK_EOF; s++) {
- len = strlen(s->str);
- if (strncmp(str, s->str, len) == 0) {
- if (!isalnum(str[len]) && str[len] != '_') {
- tokp->kind = s->kind;
- tokp->str = s->str;
- *mark = str + len;
- return;
- }
- }
- }
- tokp->kind = TOK_IDENT;
- for (len = 0; isalnum(str[len]) || str[len] == '_'; len++);
- tmp = xmalloc(len + 1);
- (void) strncpy(tmp, str, len);
- tmp[len] = 0;
- tokp->str = tmp;
- *mark = str + len;
-}
-
-static int
-cppline(char *line)
-{
- return (line == curline && *line == '#');
-}
-
-static int
-directive(char *line)
-{
- return (line == curline && *line == '%');
-}
-
-static void
-printdirective(char *line)
-{
- f_print(fout, "%s", line + 1);
-}
-
-static void
-docppline(char *line, int *lineno, const char **fname)
-{
- char *file;
- int num;
- char *p;
-
- line++;
- while (isspace(*line)) {
- line++;
- }
- num = atoi(line);
- while (isdigit(*line)) {
- line++;
- }
- while (isspace(*line)) {
- line++;
- }
- if (*line != '"') {
- error("preprocessor error");
- }
- line++;
- p = file = xmalloc(strlen(line) + 1);
- while (*line && *line != '"') {
- *p++ = *line++;
- }
- if (*line == 0) {
- error("preprocessor error");
- }
- *p = 0;
- if (*file == 0) {
- *fname = NULL;
- } else {
- *fname = file;
- }
- *lineno = num - 1;
-}
diff --git a/usr.bin/rpcgen/rpc_scan.h b/usr.bin/rpcgen/rpc_scan.h
deleted file mode 100644
index a57eb3b..0000000
--- a/usr.bin/rpcgen/rpc_scan.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * $FreeBSD$
- */
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-/* #pragma ident "@(#)rpc_scan.h 1.11 94/05/15 SMI" */
-
-/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
-/* All Rights Reserved */
-
-/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */
-/* The copyright notice above does not evidence any */
-/* actual or intended publication of such source code. */
-
-
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-* PROPRIETARY NOTICE (Combined)
-*
-* This source code is unpublished proprietary information
-* constituting, or derived under license from AT&T's UNIX(r) System V.
-* In addition, portions of such source code were derived from Berkeley
-* 4.3 BSD under license from the Regents of the University of
-* California.
-*
-*
-*
-* Copyright Notice
-*
-* Notice of copyright on this source code product does not indicate
-* publication.
-*
-* (c) 1986,1987,1988.1989 Sun Microsystems, Inc
-* (c) 1983,1984,1985,1986,1987,1988,1989 AT&T.
-* All rights reserved.
-*/
-
-/* @(#)rpc_scan.h 1.3 90/08/29 (C) 1987 SMI */
-
-/*
- * rpc_scan.h, Definitions for the RPCL scanner
- */
-
-/*
- * kinds of tokens
- */
-enum tok_kind {
- TOK_IDENT,
- TOK_CHARCONST,
- TOK_STRCONST,
- TOK_LPAREN,
- TOK_RPAREN,
- TOK_LBRACE,
- TOK_RBRACE,
- TOK_LBRACKET,
- TOK_RBRACKET,
- TOK_LANGLE,
- TOK_RANGLE,
- TOK_STAR,
- TOK_COMMA,
- TOK_EQUAL,
- TOK_COLON,
- TOK_SEMICOLON,
- TOK_CONST,
- TOK_STRUCT,
- TOK_UNION,
- TOK_SWITCH,
- TOK_CASE,
- TOK_DEFAULT,
- TOK_ENUM,
- TOK_TYPEDEF,
- TOK_INT,
- TOK_SHORT,
- TOK_LONG,
- TOK_HYPER,
- TOK_UNSIGNED,
- TOK_FLOAT,
- TOK_DOUBLE,
- TOK_QUAD,
- TOK_OPAQUE,
- TOK_CHAR,
- TOK_STRING,
- TOK_BOOL,
- TOK_VOID,
- TOK_PROGRAM,
- TOK_VERSION,
- TOK_EOF
-};
-typedef enum tok_kind tok_kind;
-
-/*
- * a token
- */
-struct token {
- tok_kind kind;
- const char *str;
-};
-typedef struct token token;
-
-
-/*
- * routine interface
- */
-void scan(tok_kind expect, token *tokp);
-void scan2(tok_kind expect1, tok_kind expect2, token *tokp);
-void scan3(tok_kind expect1, tok_kind expect2, tok_kind expect3, token *tokp);
-void scan_num(token *tokp);
-void peek(token *tokp);
-int peekscan(tok_kind expect, token *tokp);
-void get_token(token *tokp);
diff --git a/usr.bin/rpcgen/rpc_svcout.c b/usr.bin/rpcgen/rpc_svcout.c
deleted file mode 100644
index 40fc61c..0000000
--- a/usr.bin/rpcgen/rpc_svcout.c
+++ /dev/null
@@ -1,1020 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#if 0
-#ifndef lint
-#ident "@(#)rpc_svcout.c 1.4 90/04/13 SMI"
-static char sccsid[] = "@(#)rpc_svcout.c 1.29 89/03/30 (C) 1987 SMI";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * rpc_svcout.c, Server-skeleton outputter for the RPC protocol compiler
- * Copyright (C) 1987, Sun Microsystems, Inc.
- */
-#include <stdio.h>
-#include <string.h>
-#include "rpc_parse.h"
-#include "rpc_scan.h"
-#include "rpc_util.h"
-
-static char RQSTP[] = "rqstp";
-static char TRANSP[] = "transp";
-static char ARG[] = "argument";
-static char RESULT[] = "result";
-static char ROUTINE[] = "local";
-static char RETVAL[] = "retval";
-
-char _errbuf[256]; /* For all messages */
-
-void internal_proctype( proc_list * );
-static void write_real_program( definition * );
-static void write_program(definition *, const char *);
-static void printerr(const char *, const char *);
-static void printif(const char *, const char *, const char *, const char *);
-static void write_inetmost(const char *);
-static void print_return(const char *);
-static void print_pmapunset(const char *);
-static void print_err_message(const char *);
-static void write_timeout_func( void );
-static void write_pm_most(const char *, int);
-static void write_rpc_svc_fg(const char *, const char *);
-static void open_log_file(const char *, const char *);
-static void write_msg_out( void );
-
-
-static void
-p_xdrfunc(const char *rname, const char *typename)
-{
- f_print(fout, "\t\txdr_%s = (xdrproc_t) xdr_%s;\n",
- rname, stringfix(typename));
-}
-
-void
-internal_proctype(proc_list *plist)
-{
- f_print(fout, "static ");
- ptype(plist->res_prefix, plist->res_type, 1);
- f_print(fout, "*");
-}
-
-
-/*
- * write most of the service, that is, everything but the registrations.
- */
-void
-write_most(const char *infile, int netflag, int nomain)
-{
- if (inetdflag || pmflag) {
- const char *var_type;
- var_type = (nomain? "extern" : "static");
- f_print(fout, "%s int _rpcpmstart;", var_type);
- f_print(fout, "\t\t/* Started by a port monitor ? */\n");
- if (!tirpcflag || tirpc_socket) {
- f_print(fout, "%s int _rpcfdtype;", var_type);
- f_print(fout, "\n\t\t /* Whether Stream or \
-Datagram ? */\n");
- }
-
- if (timerflag) {
- f_print(fout, " /* States a server can be in \
-wrt request */\n\n");
- f_print(fout, "#define\t_IDLE 0\n");
- f_print(fout, "#define\t_SERVED 1\n");
- f_print(fout, "#define\t_SERVING 2\n\n");
- f_print(fout, "static int _rpcsvcstate = _IDLE;");
- f_print(fout, "\t /* Set when a request is \
-serviced */\n");
-
- if (mtflag) {
- f_print(fout, "pthread_mutex_t _svcstate_lock;");
- f_print(fout, "\t\t\t/* Mutex lock for variable _rpcsvcstate */\n");
-
- }
-
- }
-
- write_svc_aux(nomain);
- }
- /* write out dispatcher and stubs */
- write_programs((char *)NULL);
-
- if (nomain)
- return;
-
- f_print(fout, "\nint\n");
- f_print(fout, "main()\n");
- f_print(fout, "{\n");
- if (inetdflag) {
- write_inetmost(infile);
- /* Includes call to write_rpc_svc_fg() */
- } else {
- if (tirpcflag) {
- if (netflag) {
- f_print(fout,
- "\tregister SVCXPRT *%s;\n", TRANSP);
- f_print(fout,
- "\tstruct netconfig *nconf = NULL;\n");
- }
- f_print(fout, "\tpid_t pid;\n");
- f_print(fout, "\tint i;\n");
- if (pmflag) {
- if (tirpc_socket) {
- f_print(fout, "\tstruct sockaddr_storage saddr;\n");
- f_print(fout, "\tsocklen_t asize = sizeof (saddr);\n\n");
- } else
- f_print(fout, "\tchar mname[FMNAMESZ + 1];\n\n");
- }
-
- if (mtflag & timerflag)
- f_print(fout, "\tmutex_init(&_svcstate_lock, USYNC_THREAD, NULL);\n");
- if (pmflag) {
- write_pm_most(infile, netflag);
- f_print(fout, "\telse {\n");
- write_rpc_svc_fg(infile, "\t\t");
- f_print(fout, "\t}\n");
- } else
- write_rpc_svc_fg(infile, "\t\t");
-
- } else {
- f_print(fout, "\tregister SVCXPRT *%s;\n", TRANSP);
- f_print(fout, "\n");
- print_pmapunset("\t");
- }
- }
-
- if (logflag && !inetdflag) {
- open_log_file(infile, "\t");
- }
-}
-
-/*
- * write a registration for the given transport
- */
-void
-write_netid_register(const char *transp)
-{
- list *l;
- definition *def;
- version_list *vp;
- const char *sp;
- char tmpbuf[32];
-
- sp = "";
- f_print(fout, "\n");
- f_print(fout, "%s\tnconf = getnetconfigent(\"%s\");\n", sp, transp);
- f_print(fout, "%s\tif (nconf == NULL) {\n", sp);
- (void) sprintf(_errbuf, "cannot find %s netid.", transp);
- sprintf(tmpbuf, "%s\t\t", sp);
- print_err_message(tmpbuf);
- f_print(fout, "%s\t\texit(1);\n", sp);
- f_print(fout, "%s\t}\n", sp);
- if (tirpcflag) {
- f_print(fout, "%s\t%s = svc_tli_create(RPC_ANYFD, ",
- sp, TRANSP);
- f_print(fout,"nconf, 0, RPC_MAXDATASIZE, RPC_MAXDATASIZE);\n");
- } else {
- f_print(fout,
- "%s\t%s = svc_tli_create(RPC_ANYFD, nconf, 0, 0, 0);\n",
- sp, TRANSP);
- }
- f_print(fout, "%s\tif (%s == NULL) {\n", sp, TRANSP);
- (void) sprintf(_errbuf, "cannot create %s service.", transp);
- print_err_message(tmpbuf);
- f_print(fout, "%s\t\texit(1);\n", sp);
- f_print(fout, "%s\t}\n", sp);
-
- for (l = defined; l != NULL; l = l->next) {
- def = (definition *) l->val;
- if (def->def_kind != DEF_PROGRAM) {
- continue;
- }
- for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- f_print(fout,
- "%s\t(void) rpcb_unset(%s, %s, nconf);\n",
- sp, def->def_name, vp->vers_name);
- f_print(fout,
- "%s\tif (!svc_reg(%s, %s, %s, ",
- sp, TRANSP, def->def_name, vp->vers_name);
- pvname(def->def_name, vp->vers_num);
- f_print(fout, ", nconf)) {\n");
- (void) sprintf(_errbuf,
- "unable to register (%s, %s, %s).",
- def->def_name, vp->vers_name, transp);
- print_err_message(tmpbuf);
- f_print(fout, "%s\t\texit(1);\n", sp);
- f_print(fout, "%s\t}\n", sp);
- }
- }
- f_print(fout, "%s\tfreenetconfigent(nconf);\n", sp);
-}
-
-/*
- * write a registration for the given transport for TLI
- */
-void
-write_nettype_register(const char *transp)
-{
- list *l;
- definition *def;
- version_list *vp;
-
- for (l = defined; l != NULL; l = l->next) {
- def = (definition *) l->val;
- if (def->def_kind != DEF_PROGRAM) {
- continue;
- }
- for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- f_print(fout, "\tif (!svc_create(");
- pvname(def->def_name, vp->vers_num);
- f_print(fout, ", %s, %s, \"%s\")) {\n",
- def->def_name, vp->vers_name, transp);
- (void) sprintf(_errbuf,
- "unable to create (%s, %s) for %s.",
- def->def_name, vp->vers_name, transp);
- print_err_message("\t\t");
- f_print(fout, "\t\texit(1);\n");
- f_print(fout, "\t}\n");
- }
- }
-}
-
-/*
- * write the rest of the service
- */
-void
-write_rest(void)
-{
- f_print(fout, "\n");
- if (inetdflag) {
- f_print(fout, "\tif (%s == (SVCXPRT *)NULL) {\n", TRANSP);
- (void) sprintf(_errbuf, "could not create a handle");
- print_err_message("\t\t");
- f_print(fout, "\t\texit(1);\n");
- f_print(fout, "\t}\n");
- if (timerflag) {
- f_print(fout, "\tif (_rpcpmstart) {\n");
- f_print(fout,
- "\t\t(void) signal(SIGALRM, closedown);\n");
- f_print(fout, "\t\t(void) \
-alarm(_RPCSVC_CLOSEDOWN/2);\n");
- f_print(fout, "\t}\n");
- }
- }
- f_print(fout, "\tsvc_run();\n");
- (void) sprintf(_errbuf, "svc_run returned");
- print_err_message("\t");
- f_print(fout, "\texit(1);\n");
- f_print(fout, "\t/* NOTREACHED */\n");
- f_print(fout, "}\n");
-}
-
-void
-write_programs(const char *storage)
-{
- list *l;
- definition *def;
-
- /* write out stubs for procedure definitions */
- for (l = defined; l != NULL; l = l->next) {
- def = (definition *) l->val;
- if (def->def_kind == DEF_PROGRAM) {
- write_real_program(def);
- }
- }
-
- /* write out dispatcher for each program */
- for (l = defined; l != NULL; l = l->next) {
- def = (definition *) l->val;
- if (def->def_kind == DEF_PROGRAM) {
- write_program(def, storage);
- }
- }
-
-
-}
-
-/*
- * write out definition of internal function (e.g. _printmsg_1(...))
- * which calls server's defintion of actual function (e.g. printmsg_1(...)).
- * Unpacks single user argument of printmsg_1 to call-by-value format
- * expected by printmsg_1.
- */
-static void
-write_real_program(definition *def)
-{
- version_list *vp;
- proc_list *proc;
- decl_list *l;
-
- if (!newstyle) return; /* not needed for old style */
- for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- for (proc = vp->procs; proc != NULL; proc = proc->next) {
- f_print(fout, "\n");
- if (!mtflag)
- internal_proctype(proc);
- else
- f_print(fout, "int");
- f_print(fout, "\n_");
- pvname(proc->proc_name, vp->vers_num);
- f_print(fout, "(");
- /* arg name */
- if (proc->arg_num > 1)
- f_print(fout, proc->args.argname);
- else
- ptype(proc->args.decls->decl.prefix,
- proc->args.decls->decl.type, 0);
- if (mtflag) {
- f_print(fout, " *argp, void *%s, struct svc_req *%s)\n",
- RESULT, RQSTP);
-
-
- }
- else
- f_print(fout, " *argp, struct svc_req *%s)\n",
- RQSTP);
-
- f_print(fout, "{\n");
- f_print(fout, "\treturn (");
- pvname_svc(proc->proc_name, vp->vers_num);
- f_print(fout, "(");
- if (proc->arg_num < 2) { /* single argument */
- if (!streq(proc->args.decls->decl.type, "void"))
- f_print(fout, "*argp, "); /* non-void */
- } else {
- for (l = proc->args.decls; l != NULL;
- l = l->next)
- f_print(fout, "argp->%s, ",
- l->decl.name);
- }
- if (mtflag)
- f_print(fout, "%s, ",RESULT);
- f_print(fout, "%s));\n}\n", RQSTP);
- }
- }
-}
-
-static void
-write_program(definition *def, const char *storage)
-{
- version_list *vp;
- proc_list *proc;
- int filled;
-
- for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- f_print(fout, "\n");
- if (storage != NULL) {
- f_print(fout, "%s ", storage);
- }
- f_print(fout, "void\n");
- pvname(def->def_name, vp->vers_num);
-
- f_print(fout, "(struct svc_req *%s, ", RQSTP);
- f_print(fout, "SVCXPRT *%s)\n", TRANSP);
- f_print(fout, "{\n");
-
- filled = 0;
- f_print(fout, "\tunion {\n");
- for (proc = vp->procs; proc != NULL; proc = proc->next) {
- if (proc->arg_num < 2) { /* single argument */
- if (streq(proc->args.decls->decl.type,
- "void")) {
- continue;
- }
- filled = 1;
- f_print(fout, "\t\t");
- ptype(proc->args.decls->decl.prefix,
- proc->args.decls->decl.type, 0);
- pvname(proc->proc_name, vp->vers_num);
- f_print(fout, "_arg;\n");
-
- } else {
- filled = 1;
- f_print(fout, "\t\t%s", proc->args.argname);
- f_print(fout, " ");
- pvname(proc->proc_name, vp->vers_num);
- f_print(fout, "_arg;\n");
- }
- }
- if (!filled) {
- f_print(fout, "\t\tint fill;\n");
- }
- f_print(fout, "\t} %s;\n", ARG);
-
- if (mtflag) {
- f_print(fout, "\tunion {\n");
- for (proc = vp->procs; proc != NULL; proc = proc->next) {
- if (streq(proc->res_type, "void")) {
- continue;
- }
- f_print(fout, "\t\t");
- ptype(proc->res_prefix, proc->res_type, 0);
- pvname(proc->proc_name, vp->vers_num);
- f_print(fout, "_res;\n");
- }
- f_print(fout, "\t} %s;\n", RESULT);
- f_print(fout, "\tbool_t %s;\n", RETVAL);
-
- } else
- f_print(fout, "\tchar *%s;\n", RESULT);
-
- f_print(fout, "\txdrproc_t xdr_%s, xdr_%s;\n", ARG, RESULT);
- if (mtflag)
- f_print(fout,
- "\tbool_t (*%s)(char *, void *, struct svc_req *);\n",
- ROUTINE);
- else
- f_print(fout,
- "\tchar *(*%s)(char *, struct svc_req *);\n",
- ROUTINE);
- f_print(fout, "\n");
-
- if (timerflag) {
- if (mtflag)
- f_print(fout, "\tpthread_mutex_lock(&_svcstate_lock);\n");
-
- f_print(fout, "\t_rpcsvcstate = _SERVING;\n");
- if (mtflag)
- f_print(fout, "\tpthread_mutex_unlock(&_svcstate_lock);\n");
- }
-
- f_print(fout, "\tswitch (%s->rq_proc) {\n", RQSTP);
- if (!nullproc(vp->procs)) {
- f_print(fout, "\tcase NULLPROC:\n");
- f_print(fout,
- "\t\t(void) svc_sendreply(%s,\n\t\t\t"
- "(xdrproc_t) xdr_void, (char *)NULL);\n",
- TRANSP);
- print_return("\t\t");
- f_print(fout, "\n");
- }
- for (proc = vp->procs; proc != NULL; proc = proc->next) {
- f_print(fout, "\tcase %s:\n", proc->proc_name);
- if (proc->arg_num < 2) { /* single argument */
- p_xdrfunc(ARG, proc->args.decls->decl.type);
- } else {
- p_xdrfunc(ARG, proc->args.argname);
- }
- p_xdrfunc(RESULT, proc->res_type);
-
- if (mtflag)
- f_print(fout,
- "\t\t%s = (bool_t (*) (char *, void *, struct svc_req *))",
- ROUTINE);
- else
- f_print(fout,
- "\t\t%s = (char *(*)(char *, struct svc_req *)) ",
- ROUTINE);
- if (newstyle) { /* new style: calls internal routine */
- f_print(fout, "_");
- }
- if (!newstyle)
- pvname_svc(proc->proc_name, vp->vers_num);
- else
- pvname(proc->proc_name, vp->vers_num);
- f_print(fout, ";\n");
- f_print(fout, "\t\tbreak;\n\n");
- }
- f_print(fout, "\tdefault:\n");
- printerr("noproc", TRANSP);
- print_return("\t\t");
- f_print(fout, "\t}\n");
-
- f_print(fout,
- "\t(void) memset((char *)&%s, 0, sizeof (%s));\n",
- ARG, ARG);
- printif("getargs", TRANSP, "(caddr_t) &", ARG);
- printerr("decode", TRANSP);
- print_return("\t\t");
- f_print(fout, "\t}\n");
-
- if (!mtflag)
- f_print(fout, "\t%s = (*%s)((char *)&%s, %s);\n",
- RESULT, ROUTINE, ARG, RQSTP);
- else
- f_print(fout, "\t%s = (bool_t) (*%s)((char *)&%s, (void *)&%s, %s);\n",
- RETVAL, ROUTINE, ARG, RESULT, RQSTP);
-
-
- if (mtflag)
- f_print(fout,
- "\tif (%s > 0 && !svc_sendreply(%s, xdr_%s, (char *)&%s)) {\n",
- RETVAL, TRANSP, RESULT, RESULT);
- else
- f_print(fout,
- "\tif (%s != NULL && !svc_sendreply(%s, xdr_%s, %s)) {\n",
- RESULT, TRANSP, RESULT, RESULT);
-
- printerr("systemerr", TRANSP);
- f_print(fout, "\t}\n");
-
- printif("freeargs", TRANSP, "(caddr_t) &", ARG);
- (void) sprintf(_errbuf, "unable to free arguments");
- print_err_message("\t\t");
- f_print(fout, "\t\texit(1);\n");
- f_print(fout, "\t}\n");
- /* print out free routine */
- if (mtflag) {
- f_print(fout,"\tif (!");
- pvname(def->def_name, vp->vers_num);
- f_print(fout,"_freeresult(%s, xdr_%s, (caddr_t) &%s))\n",
- TRANSP, RESULT, RESULT);
- (void) sprintf(_errbuf, "unable to free results");
- print_err_message("\t\t");
- f_print(fout, "\n");
- };
- print_return("\t");
- f_print(fout, "}\n");
- }
-}
-
-static void
-printerr(const char *err, const char *transp)
-{
- f_print(fout, "\t\tsvcerr_%s(%s);\n", err, transp);
-}
-
-static void
-printif(const char *proc, const char *transp, const char *prefix,
- const char *arg)
-{
- f_print(fout, "\tif (!svc_%s(%s, xdr_%s, (char *)%s%s)) {\n",
- proc, transp, arg, prefix, arg);
-}
-
-int
-nullproc(proc_list *proc)
-{
- for (; proc != NULL; proc = proc->next) {
- if (streq(proc->proc_num, "0")) {
- return (1);
- }
- }
- return (0);
-}
-
-static void
-write_inetmost(const char *infile)
-{
- f_print(fout, "\tregister SVCXPRT *%s;\n", TRANSP);
- f_print(fout, "\tint sock;\n");
- f_print(fout, "\tint proto;\n");
- f_print(fout, "\tstruct sockaddr_in saddr;\n");
- f_print(fout, "\tsocklen_t asize = sizeof (saddr);\n");
- f_print(fout, "\n");
- f_print(fout,
- "\tif (getsockname(0, (struct sockaddr *)&saddr, &asize) == 0) {\n");
- f_print(fout, "\t\tsocklen_t ssize = sizeof (int);\n\n");
- f_print(fout, "\t\tif (saddr.sin_family != AF_INET)\n");
- f_print(fout, "\t\t\texit(1);\n");
- f_print(fout, "\t\tif (getsockopt(0, SOL_SOCKET, SO_TYPE,\n");
- f_print(fout, "\t\t\t\t(char *)&_rpcfdtype, &ssize) == -1)\n");
- f_print(fout, "\t\t\texit(1);\n");
- f_print(fout, "\t\tsock = 0;\n");
- f_print(fout, "\t\t_rpcpmstart = 1;\n");
- f_print(fout, "\t\tproto = 0;\n");
- open_log_file(infile, "\t\t");
- f_print(fout, "\t} else {\n");
- write_rpc_svc_fg(infile, "\t\t");
- f_print(fout, "\t\tsock = RPC_ANYSOCK;\n");
- print_pmapunset("\t\t");
- f_print(fout, "\t}\n");
-}
-
-static void
-print_return(const char *space)
-{
- if (exitnow)
- f_print(fout, "%sexit(0);\n", space);
- else {
- if (timerflag) {
- if (mtflag)
- f_print(fout, "%spthread_mutex_lock(&_svcstate_lock);\n", space);
- f_print(fout, "%s_rpcsvcstate = _SERVED;\n", space);
- if (mtflag)
- f_print(fout, "%spthread_mutex_unlock(&_svcstate_lock);\n", space);
- }
- f_print(fout, "%sreturn;\n", space);
- }
-}
-
-static void
-print_pmapunset(const char *space)
-{
- list *l;
- definition *def;
- version_list *vp;
-
- for (l = defined; l != NULL; l = l->next) {
- def = (definition *) l->val;
- if (def->def_kind == DEF_PROGRAM) {
- for (vp = def->def.pr.versions; vp != NULL;
- vp = vp->next) {
- f_print(fout, "%s(void) pmap_unset(%s, %s);\n",
- space, def->def_name, vp->vers_name);
- }
- }
- }
-}
-
-static void
-print_err_message(const char *space)
-{
- if (logflag)
- f_print(fout, "%ssyslog(LOG_ERR, \"%s\");\n", space, _errbuf);
- else if (inetdflag || pmflag)
- f_print(fout, "%s_msgout(\"%s\");\n", space, _errbuf);
- else
- f_print(fout, "%sfprintf(stderr, \"%s\");\n", space, _errbuf);
-}
-
-/*
- * Write the server auxiliary function (_msgout, timeout)
- */
-void
-write_svc_aux(int nomain)
-{
- if (!logflag)
- write_msg_out();
- if (!nomain)
- write_timeout_func();
-}
-
-/*
- * Write the _msgout function
- */
-
-static void
-write_msg_out(void)
-{
- f_print(fout, "\n");
-/*
- * Avoid making _msgout() static -- it's useful to have it visible
- * in the toplevel RPC server code.
- */
- f_print(fout, "static\n");
- f_print(fout, "void _msgout(const char* msg)\n");
- f_print(fout, "{\n");
- f_print(fout, "#ifdef RPC_SVC_FG\n");
- if (inetdflag || pmflag)
- f_print(fout, "\tif (_rpcpmstart)\n");
- f_print(fout, "\t\tsyslog(LOG_ERR, \"%%s\", msg);\n");
- f_print(fout, "\telse\n");
- f_print(fout,
- "\t\t(void) fprintf(stderr, \"%%s\\n\", msg);\n");
- f_print(fout, "#else\n");
- f_print(fout, "\tsyslog(LOG_ERR, \"%%s\", msg);\n");
- f_print(fout, "#endif\n");
- f_print(fout, "}\n");
-}
-
-/*
- * Write the timeout function
- */
-static void
-write_timeout_func(void)
-{
- if (!timerflag)
- return;
-
- f_print(fout, "\n");
- f_print(fout, "static void\n");
- f_print(fout, "closedown(int sig)\n");
- f_print(fout, "{\n");
- if (mtflag)
- f_print(fout, "\tpthread_mutex_lock(&_svcstate_lock);\n");
- f_print(fout, "\tif (_rpcsvcstate == _IDLE) {\n");
- f_print(fout, "\t\textern fd_set svc_fdset;\n");
- f_print(fout, "\t\tstatic int size;\n");
- f_print(fout, "\t\tint i, openfd;\n");
- if (tirpcflag && pmflag) {
- f_print(fout, "\t\tstruct t_info tinfo;\n\n");
- f_print(fout,
- "\t\tif (!t_getinfo(0, &tinfo) && (tinfo.servtype == T_CLTS))\n");
- } else {
- f_print(fout, "\n\t\tif (_rpcfdtype == SOCK_DGRAM)\n");
- }
- f_print(fout, "\t\t\texit(0);\n");
- f_print(fout, "\t\tif (size == 0) {\n");
- if (tirpcflag) {
- f_print(fout, "\t\t\tstruct rlimit rl;\n\n");
- f_print(fout, "\t\t\trl.rlim_max = 0;\n");
- f_print(fout, "\t\t\tgetrlimit(RLIMIT_NOFILE, &rl);\n");
- f_print(fout, "\t\t\tif ((size = rl.rlim_max) == 0) {\n");
-
- if (mtflag)
- f_print(fout, "\t\t\t\tpthread_mutex_unlock(&_svcstate_lock);\n");
-
- f_print(fout, "\t\t\t\treturn;\n\t\t\t}\n");
- } else {
- f_print(fout, "\t\t\tsize = getdtablesize();\n");
- }
- f_print(fout, "\t\t}\n");
- f_print(fout,
- "\t\tfor (i = 0, openfd = 0; i < size && openfd < 2; i++)\n");
- f_print(fout, "\t\t\tif (FD_ISSET(i, &svc_fdset))\n");
- f_print(fout, "\t\t\t\topenfd++;\n");
- f_print(fout, "\t\tif (openfd <= 1)\n");
- f_print(fout, "\t\t\texit(0);\n");
- f_print(fout, "\t}\n");
- f_print(fout, "\tif (_rpcsvcstate == _SERVED)\n");
- f_print(fout, "\t\t_rpcsvcstate = _IDLE;\n\n");
- if (mtflag)
- f_print(fout, "\tpthread_mutex_unlock(&_svcstate_lock);\n");
-
- f_print(fout, "\t(void) signal(SIGALRM, closedown);\n");
- f_print(fout, "\t(void) alarm(_RPCSVC_CLOSEDOWN/2);\n");
- f_print(fout, "}\n");
-
-}
-
-/*
- * Write the most of port monitor support
- */
-static void
-write_pm_most(const char *infile, int netflag)
-{
- list *l;
- definition *def;
- version_list *vp;
-
- if (tirpc_socket) {
- f_print(fout,
- "\tif (getsockname(0, (struct sockaddr *)&saddr, &asize) == 0) {\n");
- f_print(fout, "\t\tsocklen_t ssize = sizeof (int);\n");
- } else {
- f_print(fout, "\tif (!ioctl(0, I_LOOK, mname) &&\n");
- f_print(fout, "\t\t(!strcmp(mname, \"sockmod\") ||");
- f_print(fout, " !strcmp(mname, \"timod\"))) {\n");
- }
- f_print(fout, "\t\tchar *netid;\n");
- if (!netflag) { /* Not included by -n option */
- f_print(fout, "\t\tstruct netconfig *nconf = NULL;\n");
- f_print(fout, "\t\tSVCXPRT *%s;\n", TRANSP);
- }
- if (timerflag)
- f_print(fout, "\t\tint pmclose;\n");
-/*
- * Not necessary, defined in /usr/include/stdlib
- * f_print(fout, "\t\textern char *getenv();\n");
- */
- f_print(fout, "\n");
- if (tirpc_socket) {
- f_print(fout, "\t\tif (saddr.ss_family != AF_INET &&\n");
- f_print(fout, "\t\t saddr.ss_family != AF_INET6)\n");
- f_print(fout, "\t\t\texit(1);\n");
- f_print(fout, "\t\tif (getsockopt(0, SOL_SOCKET, SO_TYPE,\n");
- f_print(fout, "\t\t\t\t(char *)&_rpcfdtype, &ssize) == -1)\n");
- f_print(fout, "\t\t\texit(1);\n");
- }
- f_print(fout, "\t\t_rpcpmstart = 1;\n");
- open_log_file(infile, "\t\t");
- f_print(fout, "\n\t\tif ((netid = \
-getenv(\"NLSPROVIDER\")) == NULL) {\n");
-
- if (timerflag) {
- f_print(fout, "\t\t/* started from inetd */\n");
- f_print(fout, "\t\t\tpmclose = 1;\n");
- }
- f_print(fout,
- "\t\t} else {\n");
- f_print(fout, "\t\t\tif ((nconf = getnetconfigent(netid)) == NULL)\n");
- sprintf(_errbuf, "cannot get transport info");
- print_err_message("\t\t\t\t");
- if (timerflag) {
- if (tirpc_socket)
- f_print(fout, "\n\t\t\tpmclose = 1;\t/* XXX */\n");
- else
- f_print(fout,
- "\n\t\t\tpmclose = (t_getstate(0) != T_DATAXFER);\n");
- }
- f_print(fout, "\t\t}\n");
- /*
- * A kludgy support for inetd services. Inetd only works with
- * sockmod, and RPC works only with timod, hence all this jugglery
- */
- if (!tirpc_socket) {
- f_print(fout, "\t\tif (strcmp(mname, \"sockmod\") == 0) {\n");
- f_print(fout, "\t\t\tif (ioctl(0, I_POP, 0) || ");
- f_print(fout, "ioctl(0, I_PUSH, \"timod\")) {\n");
- sprintf(_errbuf, "could not get the right module");
- print_err_message("\t\t\t\t");
- f_print(fout, "\t\t\t\texit(1);\n");
- f_print(fout, "\t\t\t}\n");
- f_print(fout, "\t\t}\n");
- }
- if (tirpcflag) {
- f_print(fout,
- "\t\tif ((%s = svc_tli_create(0, nconf, NULL, \
- RPC_MAXDATASIZE, RPC_MAXDATASIZE)) \
- == NULL) {\n",
- TRANSP);
- } else {
- f_print(fout,
- "\t\tif ((%s = svc_tli_create(0, nconf, NULL, 0, 0)) \
- == NULL) {\n",
- TRANSP);
- }
- sprintf(_errbuf, "cannot create server handle");
- print_err_message("\t\t\t");
- f_print(fout, "\t\t\texit(1);\n");
- f_print(fout, "\t\t}\n");
- f_print(fout, "\t\tif (nconf)\n");
- f_print(fout, "\t\t\tfreenetconfigent(nconf);\n");
- for (l = defined; l != NULL; l = l->next) {
- def = (definition *) l->val;
- if (def->def_kind != DEF_PROGRAM) {
- continue;
- }
- for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- f_print(fout,
- "\t\tif (!svc_reg(%s, %s, %s, ",
- TRANSP, def->def_name, vp->vers_name);
- pvname(def->def_name, vp->vers_num);
- f_print(fout, ", 0)) {\n");
- (void) sprintf(_errbuf, "unable to register (%s, %s).",
- def->def_name, vp->vers_name);
- print_err_message("\t\t\t");
- f_print(fout, "\t\t\texit(1);\n");
- f_print(fout, "\t\t}\n");
- }
- }
- if (timerflag) {
- f_print(fout, "\t\tif (pmclose) {\n");
- f_print(fout, "\t\t\t(void) signal(SIGALRM, closedown);\n");
- f_print(fout, "\t\t\t(void) alarm(_RPCSVC_CLOSEDOWN/2);\n");
- f_print(fout, "\t\t}\n");
- }
- f_print(fout, "\t\tsvc_run();\n");
- f_print(fout, "\t\texit(1);\n");
- f_print(fout, "\t\t/* NOTREACHED */\n");
- f_print(fout, "\t}");
-}
-
-/*
- * Support for backgrounding the server if self started.
- */
-static void
-write_rpc_svc_fg(const char *infile, const char *sp)
-{
- f_print(fout, "#ifndef RPC_SVC_FG\n");
- f_print(fout, "%sint size;\n", sp);
- if (tirpcflag)
- f_print(fout, "%sstruct rlimit rl;\n", sp);
- if (inetdflag)
- f_print(fout, "%sint pid, i;\n\n", sp);
- f_print(fout, "%spid = fork();\n", sp);
- f_print(fout, "%sif (pid < 0) {\n", sp);
- f_print(fout, "%s\tperror(\"cannot fork\");\n", sp);
- f_print(fout, "%s\texit(1);\n", sp);
- f_print(fout, "%s}\n", sp);
- f_print(fout, "%sif (pid)\n", sp);
- f_print(fout, "%s\texit(0);\n", sp);
- /* get number of file descriptors */
- if (tirpcflag) {
- f_print(fout, "%srl.rlim_max = 0;\n", sp);
- f_print(fout, "%sgetrlimit(RLIMIT_NOFILE, &rl);\n", sp);
- f_print(fout, "%sif ((size = rl.rlim_max) == 0)\n", sp);
- f_print(fout, "%s\texit(1);\n", sp);
- } else {
- f_print(fout, "%ssize = getdtablesize();\n", sp);
- }
-
- f_print(fout, "%sfor (i = 0; i < size; i++)\n", sp);
- f_print(fout, "%s\t(void) close(i);\n", sp);
- /* Redirect stderr and stdout to console */
- f_print(fout, "%si = open(\"/dev/console\", 2);\n", sp);
- f_print(fout, "%s(void) dup2(i, 1);\n", sp);
- f_print(fout, "%s(void) dup2(i, 2);\n", sp);
- /* This removes control of the controlling terminal */
- if (tirpcflag)
- f_print(fout, "%ssetsid();\n", sp);
- else {
- f_print(fout, "%si = open(\"/dev/tty\", 2);\n", sp);
- f_print(fout, "%sif (i >= 0) {\n", sp);
- f_print(fout,
- "%s\t(void) ioctl(i, TIOCNOTTY, (char *)NULL);\n", sp);
- f_print(fout, "%s\t(void) close(i);\n", sp);
- f_print(fout, "%s}\n", sp);
- }
- if (!logflag)
- open_log_file(infile, sp);
- f_print(fout, "#endif\n");
- if (logflag)
- open_log_file(infile, sp);
-}
-
-static void
-open_log_file(const char *infile, const char *sp)
-{
- char *s;
-
- s = strrchr(infile, '.');
- if (s)
- *s = '\0';
- f_print(fout, "%sopenlog(\"%s\", LOG_PID, LOG_DAEMON);\n", sp, infile);
- if (s)
- *s = '.';
-}
-
-
-
-
-/*
- * write a registration for the given transport for Inetd
- */
-void
-write_inetd_register(const char *transp)
-{
- list *l;
- definition *def;
- version_list *vp;
- const char *sp;
- int isudp;
- char tmpbuf[32];
-
- if (inetdflag)
- sp = "\t";
- else
- sp = "";
- if (streq(transp, "udp"))
- isudp = 1;
- else
- isudp = 0;
- f_print(fout, "\n");
- if (inetdflag) {
- f_print(fout,
- "\tif ((_rpcfdtype == 0) || (_rpcfdtype == %s)) {\n",
- isudp ? "SOCK_DGRAM" : "SOCK_STREAM");
- }
- f_print(fout, "%s\t%s = svc%s_create(%s",
- sp, TRANSP, transp, inetdflag? "sock": "RPC_ANYSOCK");
- if (!isudp)
- f_print(fout, ", 0, 0");
- f_print(fout, ");\n");
- f_print(fout, "%s\tif (%s == NULL) {\n", sp, TRANSP);
- (void) sprintf(_errbuf, "cannot create %s service.", transp);
- (void) sprintf(tmpbuf, "%s\t\t", sp);
- print_err_message(tmpbuf);
- f_print(fout, "%s\t\texit(1);\n", sp);
- f_print(fout, "%s\t}\n", sp);
-
- if (inetdflag) {
- f_print(fout, "%s\tif (!_rpcpmstart)\n\t", sp);
- f_print(fout, "%s\tproto = IPPROTO_%s;\n",
- sp, isudp ? "UDP": "TCP");
- }
- for (l = defined; l != NULL; l = l->next) {
- def = (definition *) l->val;
- if (def->def_kind != DEF_PROGRAM) {
- continue;
- }
- for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- f_print(fout, "%s\tif (!svc_register(%s, %s, %s, ",
- sp, TRANSP, def->def_name, vp->vers_name);
- pvname(def->def_name, vp->vers_num);
- if (inetdflag)
- f_print(fout, ", proto)) {\n");
- else
- f_print(fout, ", IPPROTO_%s)) {\n",
- isudp ? "UDP": "TCP");
- (void) sprintf(_errbuf,
- "unable to register (%s, %s, %s).",
- def->def_name, vp->vers_name, transp);
- print_err_message(tmpbuf);
- f_print(fout, "%s\t\texit(1);\n", sp);
- f_print(fout, "%s\t}\n", sp);
- }
- }
- if (inetdflag)
- f_print(fout, "\t}\n");
-}
diff --git a/usr.bin/rpcgen/rpc_tblout.c b/usr.bin/rpcgen/rpc_tblout.c
deleted file mode 100644
index f96bdfc..0000000
--- a/usr.bin/rpcgen/rpc_tblout.c
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#if 0
-#ifndef lint
-#ident "@(#)rpc_tblout.c 1.11 93/07/05 SMI"
-static char sccsid[] = "@(#)rpc_tblout.c 1.4 89/02/22 (C) 1988 SMI";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * rpc_tblout.c, Dispatch table outputter for the RPC protocol compiler
- * Copyright (C) 1989, Sun Microsystems, Inc.
- */
-#include <err.h>
-#include <stdio.h>
-#include <string.h>
-#include "rpc_parse.h"
-#include "rpc_scan.h"
-#include "rpc_util.h"
-
-#define TABSIZE 8
-#define TABCOUNT 5
-#define TABSTOP (TABSIZE*TABCOUNT)
-
-static char tabstr[TABCOUNT+1] = "\t\t\t\t\t";
-
-static char tbl_hdr[] = "struct rpcgen_table %s_table[] = {\n";
-static char tbl_end[] = "};\n";
-
-static char null_entry[] = "\n\t(char *(*)())0,\n\
- \t(xdrproc_t) xdr_void,\t\t\t0,\n\
- \t(xdrproc_t) xdr_void,\t\t\t0,\n";
-
-
-static char tbl_nproc[] = "int %s_nproc =\n\tsizeof(%s_table)/sizeof(%s_table[0]);\n\n";
-
-static void write_table( definition * );
-static void printit(const char *, const char *);
-
-void
-write_tables(void)
-{
- list *l;
- definition *def;
-
- f_print(fout, "\n");
- for (l = defined; l != NULL; l = l->next) {
- def = (definition *) l->val;
- if (def->def_kind == DEF_PROGRAM) {
- write_table(def);
- }
- }
-}
-
-static void
-write_table(definition *def)
-{
- version_list *vp;
- proc_list *proc;
- int current;
- int expected;
- char progvers[100];
- int warning;
-
- for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- warning = 0;
- s_print(progvers, "%s_%s",
- locase(def->def_name), vp->vers_num);
- /* print the table header */
- f_print(fout, tbl_hdr, progvers);
-
- if (nullproc(vp->procs)) {
- expected = 0;
- } else {
- expected = 1;
- f_print(fout, null_entry);
- }
- for (proc = vp->procs; proc != NULL; proc = proc->next) {
- current = atoi(proc->proc_num);
- if (current != expected++) {
- f_print(fout,
- "\n/*\n * WARNING: table out of order\n */\n");
- if (warning == 0) {
- warnx("WARNING %s table is out of order", progvers);
- warning = 1;
- nonfatalerrors = 1;
- }
- expected = current + 1;
- }
- f_print(fout, "\n\t(char *(*)())RPCGEN_ACTION(");
-
- /* routine to invoke */
- if( !newstyle )
- pvname_svc(proc->proc_name, vp->vers_num);
- else {
- if( newstyle )
- f_print( fout, "_"); /* calls internal func */
- pvname(proc->proc_name, vp->vers_num);
- }
- f_print(fout, "),\n");
-
- /* argument info */
- if( proc->arg_num > 1 )
- printit((char*) NULL, proc->args.argname );
- else
- /* do we have to do something special for newstyle */
- printit( proc->args.decls->decl.prefix,
- proc->args.decls->decl.type );
- /* result info */
- printit(proc->res_prefix, proc->res_type);
- }
-
- /* print the table trailer */
- f_print(fout, tbl_end);
- f_print(fout, tbl_nproc, progvers, progvers, progvers);
- }
-}
-
-static void
-printit(const char *prefix, const char *type)
-{
- int len;
- int tabs;
-
-
- len = fprintf(fout, "\txdr_%s,", stringfix(type));
- /* account for leading tab expansion */
- len += TABSIZE - 1;
- /* round up to tabs required */
- tabs = (TABSTOP - len + TABSIZE - 1)/TABSIZE;
- f_print(fout, "%s", &tabstr[TABCOUNT-tabs]);
-
- if (streq(type, "void")) {
- f_print(fout, "0");
- } else {
- f_print(fout, "sizeof ( ");
- /* XXX: should "follow" be 1 ??? */
- ptype(prefix, type, 0);
- f_print(fout, ")");
- }
- f_print(fout, ",\n");
-}
diff --git a/usr.bin/rpcgen/rpc_util.c b/usr.bin/rpcgen/rpc_util.c
deleted file mode 100644
index 9d1c85b..0000000
--- a/usr.bin/rpcgen/rpc_util.c
+++ /dev/null
@@ -1,511 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#if 0
-#ifndef lint
-#ident "@(#)rpc_util.c 1.14 93/07/05 SMI"
-static char sccsid[] = "@(#)rpc_util.c 1.11 89/02/22 (C) 1987 SMI";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * rpc_util.c, Utility routines for the RPC protocol compiler
- * Copyright (C) 1989, Sun Microsystems, Inc.
- */
-#include <err.h>
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include "rpc_parse.h"
-#include "rpc_scan.h"
-#include "rpc_util.h"
-
-#define ARGEXT "argument"
-
-char curline[MAXLINESIZE]; /* current read line */
-char *where = curline; /* current point in line */
-int linenum = 0; /* current line number */
-
-const char *infilename; /* input filename */
-
-#define NFILES 7
-const char *outfiles[NFILES]; /* output file names */
-int nfiles;
-
-FILE *fout; /* file pointer of current output */
-FILE *fin; /* file pointer of current input */
-
-list *defined; /* list of defined things */
-
-static void printwhere( void );
-
-/*
- * Reinitialize the world
- */
-void
-reinitialize(void)
-{
- memset(curline, 0, MAXLINESIZE);
- where = curline;
- linenum = 0;
- defined = NULL;
-}
-
-/*
- * string equality
- */
-int
-streq(const char *a, const char *b)
-{
- return (strcmp(a, b) == 0);
-}
-
-/*
- * find a value in a list
- */
-definition *
-findval(list *lst, const char *val, int (*cmp)(definition *, const char *))
-{
- for (; lst != NULL; lst = lst->next) {
- if ((*cmp) (lst->val, val)) {
- return (lst->val);
- }
- }
- return (NULL);
-}
-
-/*
- * store a value in a list
- */
-void
-storeval(list **lstp, definition *val)
-{
- list **l;
- list *lst;
-
- for (l = lstp; *l != NULL; l = (list **) & (*l)->next);
- lst = XALLOC(list);
- lst->val = val;
- lst->next = NULL;
- *l = lst;
-}
-
-static int
-findit(definition *def, const char *type)
-{
- return (streq(def->def_name, type));
-}
-
-static const char *
-fixit(const char *type, const char *orig)
-{
- definition *def;
-
- def = (definition *) FINDVAL(defined, type, findit);
- if (def == NULL || def->def_kind != DEF_TYPEDEF) {
- return (orig);
- }
- switch (def->def.ty.rel) {
- case REL_VECTOR:
- if (streq(def->def.ty.old_type, "opaque"))
- return ("char");
- else
- return (def->def.ty.old_type);
-
- case REL_ALIAS:
- return (fixit(def->def.ty.old_type, orig));
- default:
- return (orig);
- }
-}
-
-const char *
-fixtype(const char *type)
-{
- return (fixit(type, type));
-}
-
-const char *
-stringfix(const char *type)
-{
- if (streq(type, "string")) {
- return ("wrapstring");
- } else {
- return (type);
- }
-}
-
-void
-ptype(const char *prefix, const char *type, int follow)
-{
- if (prefix != NULL) {
- if (streq(prefix, "enum")) {
- f_print(fout, "enum ");
- } else {
- f_print(fout, "struct ");
- }
- }
- if (streq(type, "bool")) {
- f_print(fout, "bool_t ");
- } else if (streq(type, "string")) {
- f_print(fout, "char *");
- } else {
- f_print(fout, "%s ", follow ? fixtype(type) : type);
- }
-}
-
-static int
-typedefed(definition *def, const char *type)
-{
- if (def->def_kind != DEF_TYPEDEF || def->def.ty.old_prefix != NULL) {
- return (0);
- } else {
- return (streq(def->def_name, type));
- }
-}
-
-int
-isvectordef(const char *type, relation rel)
-{
- definition *def;
-
- for (;;) {
- switch (rel) {
- case REL_VECTOR:
- return (!streq(type, "string"));
- case REL_ARRAY:
- return (0);
- case REL_POINTER:
- return (0);
- case REL_ALIAS:
- def = (definition *) FINDVAL(defined, type, typedefed);
- if (def == NULL) {
- return (0);
- }
- type = def->def.ty.old_type;
- rel = def->def.ty.rel;
- }
- }
-
- return (0);
-}
-
-char *
-locase(const char *str)
-{
- char c;
- static char buf[100];
- char *p = buf;
-
- while ( (c = *str++) ) {
- *p++ = (c >= 'A' && c <= 'Z') ? (c - 'A' + 'a') : c;
- }
- *p = 0;
- return (buf);
-}
-
-void
-pvname_svc(const char *pname, const char *vnum)
-{
- f_print(fout, "%s_%s_svc", locase(pname), vnum);
-}
-
-void
-pvname(const char *pname, const char *vnum)
-{
- f_print(fout, "%s_%s", locase(pname), vnum);
-}
-
-/*
- * print a useful (?) error message, and then die
- */
-void
-error(const char *msg)
-{
- printwhere();
- warnx("%s, line %d: %s", infilename, linenum, msg);
- crash();
-}
-
-/*
- * Something went wrong, unlink any files that we may have created and then
- * die.
- */
-void
-crash(void)
-{
- int i;
-
- for (i = 0; i < nfiles; i++) {
- (void) unlink(outfiles[i]);
- }
- exit(1);
-}
-
-void
-record_open(const char *file)
-{
- if (nfiles < NFILES) {
- outfiles[nfiles++] = file;
- } else {
- warnx("too many files");
- crash();
- }
-}
-
-static char expectbuf[100];
-static const char *toktostr(tok_kind kind);
-
-/*
- * error, token encountered was not the expected one
- */
-void
-expected1(tok_kind exp1)
-{
- s_print(expectbuf, "expected '%s'",
- toktostr(exp1));
- error(expectbuf);
-}
-
-/*
- * error, token encountered was not one of two expected ones
- */
-void
-expected2(tok_kind exp1, tok_kind exp2)
-{
- s_print(expectbuf, "expected '%s' or '%s'",
- toktostr(exp1),
- toktostr(exp2));
- error(expectbuf);
-}
-
-/*
- * error, token encountered was not one of 3 expected ones
- */
-void
-expected3(tok_kind exp1, tok_kind exp2, tok_kind exp3)
-{
- s_print(expectbuf, "expected '%s', '%s' or '%s'",
- toktostr(exp1),
- toktostr(exp2),
- toktostr(exp3));
- error(expectbuf);
-}
-
-void
-tabify(FILE *f, int tab)
-{
- while (tab--) {
- (void) fputc('\t', f);
- }
-}
-
-
-static token tokstrings[] = {
- {TOK_IDENT, "identifier"},
- {TOK_CONST, "const"},
- {TOK_RPAREN, ")"},
- {TOK_LPAREN, "("},
- {TOK_RBRACE, "}"},
- {TOK_LBRACE, "{"},
- {TOK_LBRACKET, "["},
- {TOK_RBRACKET, "]"},
- {TOK_STAR, "*"},
- {TOK_COMMA, ","},
- {TOK_EQUAL, "="},
- {TOK_COLON, ":"},
- {TOK_SEMICOLON, ";"},
- {TOK_UNION, "union"},
- {TOK_STRUCT, "struct"},
- {TOK_SWITCH, "switch"},
- {TOK_CASE, "case"},
- {TOK_DEFAULT, "default"},
- {TOK_ENUM, "enum"},
- {TOK_TYPEDEF, "typedef"},
- {TOK_INT, "int"},
- {TOK_SHORT, "short"},
- {TOK_LONG, "long"},
- {TOK_UNSIGNED, "unsigned"},
- {TOK_DOUBLE, "double"},
- {TOK_FLOAT, "float"},
- {TOK_CHAR, "char"},
- {TOK_STRING, "string"},
- {TOK_OPAQUE, "opaque"},
- {TOK_BOOL, "bool"},
- {TOK_VOID, "void"},
- {TOK_PROGRAM, "program"},
- {TOK_VERSION, "version"},
- {TOK_EOF, "??????"}
-};
-
-static const char *
-toktostr(tok_kind kind)
-{
- token *sp;
-
- for (sp = tokstrings; sp->kind != TOK_EOF && sp->kind != kind; sp++);
- return (sp->str);
-}
-
-static void
-printbuf(void)
-{
- char c;
- int i;
- int cnt;
-
-# define TABSIZE 4
-
- for (i = 0; (c = curline[i]); i++) {
- if (c == '\t') {
- cnt = 8 - (i % TABSIZE);
- c = ' ';
- } else {
- cnt = 1;
- }
- while (cnt--) {
- (void) fputc(c, stderr);
- }
- }
-}
-
-static void
-printwhere(void)
-{
- int i;
- char c;
- int cnt;
-
- printbuf();
- for (i = 0; i < where - curline; i++) {
- c = curline[i];
- if (c == '\t') {
- cnt = 8 - (i % TABSIZE);
- } else {
- cnt = 1;
- }
- while (cnt--) {
- (void) fputc('^', stderr);
- }
- }
- (void) fputc('\n', stderr);
-}
-
-char *
-make_argname(const char *pname, const char *vname)
-{
- char *name;
-
- name = xmalloc(strlen(pname) + strlen(vname) + strlen(ARGEXT) + 3);
- sprintf(name, "%s_%s_%s", locase(pname), vname, ARGEXT);
- return (name);
-}
-
-bas_type *typ_list_h;
-bas_type *typ_list_t;
-
-void
-add_type(int len, const char *type)
-{
- bas_type *ptr;
-
- ptr = XALLOC(bas_type);
-
- ptr->name = type;
- ptr->length = len;
- ptr->next = NULL;
- if (typ_list_t == NULL)
- {
-
- typ_list_t = ptr;
- typ_list_h = ptr;
- }
- else
- {
- typ_list_t->next = ptr;
- typ_list_t = ptr;
- };
-}
-
-
-bas_type *
-find_type(const char *type)
-{
- bas_type * ptr;
-
- ptr = typ_list_h;
- while (ptr != NULL)
- {
- if (strcmp(ptr->name, type) == 0)
- return (ptr);
- else
- ptr = ptr->next;
- };
- return (NULL);
-}
-
-void *
-xmalloc(size_t size)
-{
- void *p;
-
- if ((p = malloc(size)) == NULL) {
- warnx("malloc failed");
- crash();
- }
- return (p);
-}
-
-void *
-xrealloc(void *ptr, size_t size)
-{
- void *p;
-
- if ((p = realloc(ptr, size)) == NULL) {
- warnx("realloc failed");
- crash();
- }
- return (p);
-}
-
-char *
-xstrdup(const char *str)
-{
- char *p;
-
- if ((p = strdup(str)) == NULL) {
- warnx("strdup failed");
- crash();
- }
- return (p);
-}
diff --git a/usr.bin/rpcgen/rpc_util.h b/usr.bin/rpcgen/rpc_util.h
deleted file mode 100644
index 644cbea..0000000
--- a/usr.bin/rpcgen/rpc_util.h
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * $FreeBSD$
- */
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-/* #pragma ident "@(#)rpc_util.h 1.16 94/05/15 SMI" */
-
-/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
-/* All Rights Reserved */
-
-/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */
-/* The copyright notice above does not evidence any */
-/* actual or intended publication of such source code. */
-
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-* PROPRIETARY NOTICE (Combined)
-*
-* This source code is unpublished proprietary information
-* constituting, or derived under license from AT&T's UNIX(r) System V.
-* In addition, portions of such source code were derived from Berkeley
-* 4.3 BSD under license from the Regents of the University of
-* California.
-*
-*
-*
-* Copyright Notice
-*
-* Notice of copyright on this source code product does not indicate
-* publication.
-*
-* (c) 1986,1987,1988.1989 Sun Microsystems, Inc
-* (c) 1983,1984,1985,1986,1987,1988,1989 AT&T.
-* All rights reserved.
-*/
-
-/* @(#)rpc_util.h 1.5 90/08/29 (C) 1987 SMI */
-
-/*
- * rpc_util.h, Useful definitions for the RPC protocol compiler
- */
-#include <sys/types.h>
-#include <stdlib.h>
-
-#define XALLOC(object) (object *) xmalloc(sizeof(object))
-
-#define s_print (void) sprintf
-#define f_print (void) fprintf
-
-struct list {
- definition *val;
- struct list *next;
-};
-typedef struct list list;
-
-struct xdrfunc {
- const char *name;
- int pointerp;
- struct xdrfunc *next;
-};
-typedef struct xdrfunc xdrfunc;
-
-struct commandline {
- int cflag; /* xdr C routines */
- int hflag; /* header file */
- int lflag; /* client side stubs */
- int mflag; /* server side stubs */
- int nflag; /* netid flag */
- int sflag; /* server stubs for the given transport */
- int tflag; /* dispatch Table file */
- int Ssflag; /* produce server sample code */
- int Scflag; /* produce client sample code */
- int makefileflag; /* Generate a template Makefile */
- const char *infile; /* input module name */
- const char *outfile; /* output module name */
-};
-
-#define PUT 1
-#define GET 2
-
-/*
- * Global variables
- */
-#define MAXLINESIZE 1024
-extern char curline[MAXLINESIZE];
-extern char *where;
-extern int linenum;
-extern int tirpc_socket;
-
-extern const char *infilename;
-extern FILE *fout;
-extern FILE *fin;
-
-extern list *defined;
-
-
-extern bas_type *typ_list_h;
-extern bas_type *typ_list_t;
-extern xdrfunc *xdrfunc_head, *xdrfunc_tail;
-
-/*
- * All the option flags
- */
-extern int inetdflag;
-extern int pmflag;
-extern int tblflag;
-extern int logflag;
-extern int newstyle;
-extern int CCflag; /* C++ flag */
-extern int tirpcflag; /* flag for generating tirpc code */
-extern int inline_size; /* if this is 0, then do not generate inline code */
-extern int mtflag;
-
-/*
- * Other flags related with inetd jumpstart.
- */
-extern int indefinitewait;
-extern int exitnow;
-extern int timerflag;
-
-extern int nonfatalerrors;
-
-extern pid_t childpid;
-
-/*
- * rpc_util routines
- */
-void reinitialize(void);
-void crash(void);
-void add_type(int len, const char *type);
-void storeval(list **lstp, definition *val);
-void *xmalloc(size_t size);
-void *xrealloc(void *ptr, size_t size);
-char *xstrdup(const char *);
-char *make_argname(const char *pname, const char *vname);
-
-#define STOREVAL(list,item) \
- storeval(list,item)
-
-definition *findval(list *lst, const char *val, int (*cmp)(definition *, const char *));
-
-#define FINDVAL(list,item,finder) \
- findval(list, item, finder)
-
-const char *fixtype(const char *type);
-const char *stringfix(const char *type);
-char *locase(const char *str);
-void pvname_svc(const char *pname, const char *vnum);
-void pvname(const char *pname, const char *vnum);
-void ptype(const char *prefix, const char *type, int follow);
-int isvectordef(const char *type, relation rel);
-int streq(const char *a, const char *b);
-void error(const char *msg);
-void expected1(tok_kind exp1);
-void expected2(tok_kind exp1, tok_kind exp2);
-void expected3(tok_kind exp1, tok_kind exp2, tok_kind exp3);
-void tabify(FILE *f, int tab);
-void record_open(const char *file);
-bas_type *find_type(const char *type);
-
-/*
- * rpc_cout routines
- */
-void emit(definition *def);
-
-/*
- * rpc_hout routines
- */
-void pdeclaration(const char *name, declaration *dec, int tab, const char *separator);
-void print_datadef(definition *def, int headeronly);
-void print_funcdef(definition *def, int headeronly);
-void print_xdr_func_def(const char* name, int pointerp);
-
-/*
- * rpc_svcout routines
- */
-void write_most(const char *infile, int netflag, int nomain);
-void write_rest(void);
-void write_programs(const char *storage);
-void write_svc_aux(int nomain);
-void write_inetd_register(const char *transp);
-void write_netid_register(const char *transp);
-void write_nettype_register(const char *transp);
-int nullproc(proc_list *proc);
-
-/*
- * rpc_clntout routines
- */
-void write_stubs(void);
-void printarglist(proc_list *proc, const char *result, const char *addargname,
- const char *addargtype);
-
-/*
- * rpc_tblout routines
- */
-void write_tables(void);
-
-/*
- * rpc_sample routines
- */
-void write_sample_svc(definition *);
-int write_sample_clnt(definition *);
-void write_sample_clnt_main(void);
-void add_sample_msg(void);
diff --git a/usr.bin/rpcgen/rpcgen.1 b/usr.bin/rpcgen/rpcgen.1
deleted file mode 100644
index 2a4a25e..0000000
--- a/usr.bin/rpcgen/rpcgen.1
+++ /dev/null
@@ -1,532 +0,0 @@
-.\" @(#)rpcgen.1 1.35 93/06/02 SMI
-.\" $FreeBSD$
-.\" Copyright 1985-1993 Sun Microsystems, Inc.
-.\"
-.Dd September 2, 2005
-.Dt RPCGEN 1
-.Os
-.Sh NAME
-.Nm rpcgen
-.Nd an RPC protocol compiler
-.Sh SYNOPSIS
-.Nm
-.Ar infile
-.Nm
-.Op Fl a
-.Op Fl b
-.Op Fl C
-.Oo
-.Fl D Ns Ar name Ns Op Ar =value
-.Oc
-.Op Fl i Ar size
-.Op Fl I Fl P Op Fl K Ar seconds
-.Op Fl L
-.Op Fl M
-.Op Fl N
-.Op Fl T
-.Op Fl Y Ar pathname
-.Ar infile
-.Nm
-.Oo
-.Fl c |
-.Fl h |
-.Fl l |
-.Fl m |
-.Fl t |
-.Fl \&Sc |
-.Fl \&Ss |
-.Fl \&Sm
-.Oc
-.Op Fl o Ar outfile
-.Op Ar infile
-.Nm
-.Op Fl s Ar nettype
-.Op Fl o Ar outfile
-.Op Ar infile
-.Nm
-.Op Fl n Ar netid
-.Op Fl o Ar outfile
-.Op Ar infile
-.\" .SH AVAILABILITY
-.\" .LP
-.\" SUNWcsu
-.Sh DESCRIPTION
-The
-.Nm
-utility is a tool that generates C code to implement an
-.Tn RPC
-protocol.
-The input to
-.Nm
-is a language similar to C known as
-.Tn RPC
-Language (Remote Procedure Call Language).
-.Pp
-The
-.Nm
-utility is normally used as in the first synopsis where
-it takes an input file and generates three output files.
-If the
-.Ar infile
-is named
-.Pa proto.x ,
-then
-.Nm
-generates a header in
-.Pa proto.h ,
-XDR routines in
-.Pa proto_xdr.c ,
-server-side stubs in
-.Pa proto_svc.c ,
-and client-side stubs in
-.Pa proto_clnt.c .
-With the
-.Fl T
-option,
-it also generates the
-.Tn RPC
-dispatch table in
-.Pa proto_tbl.i .
-.Pp
-The
-.Nm
-utility can also generate sample client and server files
-that can be customized to suit a particular application.
-The
-.Fl \&Sc ,
-.Fl \&Ss
-and
-.Fl \&Sm
-options generate sample client, server and makefile, respectively.
-The
-.Fl a
-option generates all files, including sample files.
-If the
-.Ar infile
-is
-.Pa proto.x ,
-then the client side sample file is written to
-.Pa proto_client.c ,
-the server side sample file to
-.Pa proto_server.c
-and the sample makefile to
-.Pa makefile.proto .
-.Pp
-If option
-.Fl I
-is set,
-the server created can be started both by the port monitors
-(for example,
-.Xr inetd 8 )
-or by itself.
-When it is started by a port monitor,
-it creates servers only for the transport for which
-the file descriptor
-.Em 0
-was passed.
-The name of the transport may be specified
-by setting up the environment variable
-.Ev NLSPROVIDER .
-When the server generated by
-.Nm
-is executed,
-it creates server handles for all the transports
-specified in
-.Ev NETPATH
-environment variable,
-or if it is unset,
-it creates server handles for all the visible transports from
-.Pa /etc/netconfig
-file.
-Note:
-the transports are chosen at run time and not at compile time.
-When the server is self-started,
-it backgrounds itself by default.
-A special define symbol
-.Em RPC_SVC_FG
-can be used to run the server process in foreground.
-.Pp
-The second synopsis provides special features which allow
-for the creation of more sophisticated
-.Tn RPC
-servers.
-These features include support for user provided
-.Em #defines
-and
-.Tn RPC
-dispatch tables.
-The entries in the
-.Tn RPC
-dispatch table contain:
-.Bl -bullet -offset indent -compact
-.It
-pointers to the service routine corresponding to that procedure,
-.It
-a pointer to the input and output arguments,
-.It
-the size of these routines.
-.El
-A server can use the dispatch table to check authorization
-and then to execute the service routine;
-a client library may use it to deal with the details of storage
-management and XDR data conversion.
-.Pp
-The other three synopses shown above are used when
-one does not want to generate all the output files,
-but only a particular one.
-See the
-.Sx EXAMPLES
-section below for examples of
-.Nm
-usage.
-When
-.Nm
-is executed with the
-.Fl s
-option,
-it creates servers for that particular class of transports.
-When
-executed with the
-.Fl n
-option,
-it creates a server for the transport specified by
-.Ar netid .
-If
-.Ar infile
-is not specified,
-.Nm
-accepts the standard input.
-.Pp
-The C preprocessor,
-.Em cc -E
-is run on the input file before it is actually interpreted by
-.Nm .
-For each type of output file,
-.Nm
-defines a special preprocessor symbol for use by the
-.Nm
-programmer:
-.Bl -tag -width indent
-.It RPC_HDR
-defined when compiling into headers
-.It RPC_XDR
-defined when compiling into XDR routines
-.It RPC_SVC
-defined when compiling into server-side stubs
-.It RPC_CLNT
-defined when compiling into client-side stubs
-.It RPC_TBL
-defined when compiling into RPC dispatch tables
-.El
-.Pp
-Any line beginning with
-.Dq %
-is passed directly into the output file,
-uninterpreted by
-.Nm .
-To specify the path name of the C preprocessor use
-.Fl Y
-flag.
-.Pp
-For every data type referred to in
-.Ar infile ,
-.Nm
-assumes that there exists a
-routine with the string
-.Em xdr_
-prepended to the name of the data type.
-If this routine does not exist in the
-.Tn RPC/XDR
-library, it must be provided.
-Providing an undefined data type
-allows customization of
-.Xr xdr 3
-routines.
-.Sh OPTIONS
-The following options are available:
-.Bl -tag -width indent
-.It Fl a
-Generate all files, including sample files.
-.It Fl b
-Backward compatibility mode.
-Generate transport specific
-.Tn RPC
-code for older versions
-of the operating system.
-.It Fl c
-Compile into
-.Tn XDR
-routines.
-.It Fl C
-Generate ANSI C code.
-This is always done, the flag is only provided for backwards compatibility.
-.It Fl D Ns Ar name
-.It Fl D Ns Ar name=value
-.\".It Fl D Ns Ar name Ns Op Ar =value
-Define a symbol
-.Ar name .
-Equivalent to the
-.Em #define
-directive in the source.
-If no
-.Ar value
-is given,
-.Ar value
-is defined as
-.Em 1 .
-This option may be specified more than once.
-.It Fl h
-Compile into C data-definitions (a header).
-.Fl T
-option can be used in conjunction to produce a
-header which supports
-.Tn RPC
-dispatch tables.
-.It Fl i Ar size
-Size at which to start generating inline code.
-This option is useful for optimization.
-The default size is 5.
-.Pp
-Note: in order to provide backwards compatibility with the older
-.Nm
-on the
-.Fx
-platform, the default is actually 0 (which means
-that inline code generation is disabled by default).
-You must specify
-a non-zero value explicitly to override this default.
-.It Fl I
-Compile support for
-.Xr inetd 8
-in the server side stubs.
-Such servers can be self-started or can be started by
-.Xr inetd 8 .
-When the server is self-started, it backgrounds itself by default.
-A special define symbol
-.Em RPC_SVC_FG
-can be used to run the
-server process in foreground, or the user may simply compile without
-the
-.Fl I
-option.
-.Pp
-If there are no pending client requests, the
-.Xr inetd 8
-servers exit after 120 seconds (default).
-The default can be changed with the
-.Fl K
-option.
-All the error messages for
-.Xr inetd 8
-servers
-are always logged with
-.Xr syslog 3 .
-.Pp
-Note:
-Contrary to some systems, in
-.Fx
-this option is needed to generate
-servers that can be invoked through portmonitors and
-.Xr inetd 8 .
-.Pp
-.It Fl K Ar seconds
-By default, services created using
-.Nm
-and invoked through
-port monitors wait 120 seconds
-after servicing a request before exiting.
-That interval can be changed using the
-.Fl K
-flag.
-To create a server that exits immediately upon servicing a request,
-use
-.Fl K Ar 0 .
-To create a server that never exits, the appropriate argument is
-.Fl K Ar -1 .
-.Pp
-When monitoring for a server,
-some portmonitors
-.Em always
-spawn a new process in response to a service request.
-If it is known that a server will be used with such a monitor, the
-server should exit immediately on completion.
-For such servers,
-.Nm
-should be used with
-.Fl K Ar 0 .
-.It Fl l
-Compile into client-side stubs.
-.It Fl L
-When the servers are started in foreground, use
-.Xr syslog 3
-to log the server errors instead of printing them on the standard
-error.
-.It Fl m
-Compile into server-side stubs,
-but do not generate a
-.Qq main
-routine.
-This option is useful for doing callback-routines
-and for users who need to write their own
-.Qq main
-routine to do initialization.
-.It Fl M
-Generate multithread-safe stubs for passing arguments and results between
-rpcgen generated code and user written code.
-This option is useful
-for users who want to use threads in their code.
-However, the
-.Xr rpc_svc_calls 3
-functions are not yet MT-safe, which means that rpcgen generated server-side
-code will not be MT-safe.
-.It Fl N
-Allow procedures to have multiple arguments.
-It also uses the style of parameter passing that closely resembles C.
-So, when passing an argument to a remote procedure, you do not have to
-pass a pointer to the argument, but can pass the argument itself.
-This behavior is different from the old style of
-.Nm
-generated code.
-To maintain backward compatibility,
-this option is not the default.
-.It Fl n Ar netid
-Compile into server-side stubs for the transport
-specified by
-.Ar netid .
-There should be an entry for
-.Ar netid
-in the
-netconfig database.
-This option may be specified more than once,
-so as to compile a server that serves multiple transports.
-.It Fl o Ar outfile
-Specify the name of the output file.
-If none is specified,
-standard output is used
-.Fl ( c ,
-.Fl h ,
-.Fl l ,
-.Fl m ,
-.Fl n ,
-.Fl s ,
-.Fl \&Sc ,
-.Fl \&Sm ,
-.Fl \&Ss ,
-and
-.Fl t
-modes only).
-.It Fl P
-Compile support for
-port monitors
-in the server side stubs.
-.Pp
-Note:
-Contrary to some systems, in
-.Fx
-this option is needed to generate
-servers that can be monitored.
-.Pp
-If the
-.Fl I
-option has been specified,
-.Fl P
-is turned off automatically.
-.It Fl s Ar nettype
-Compile into server-side stubs for all the
-transports belonging to the class
-.Ar nettype .
-The supported classes are
-.Em netpath ,
-.Em visible ,
-.Em circuit_n ,
-.Em circuit_v ,
-.Em datagram_n ,
-.Em datagram_v ,
-.Em tcp ,
-and
-.Em udp
-(see
-.Xr rpc 3
-for the meanings associated with these classes).
-This option may be specified more than once.
-Note:
-the transports are chosen at run time and not at compile time.
-.It Fl \&Sc
-Generate sample client code that uses remote procedure calls.
-.It Fl \&Sm
-Generate a sample
-.Pa Makefile
-which can be used for compiling the application.
-.It Fl \&Ss
-Generate sample server code that uses remote procedure calls.
-.It Fl t
-Compile into
-.Tn RPC
-dispatch table.
-.It Fl T
-Generate the code to support
-.Tn RPC
-dispatch tables.
-.Pp
-The options
-.Fl c ,
-.Fl h ,
-.Fl l ,
-.Fl m ,
-.Fl s ,
-.Fl \&Sc ,
-.Fl \&Sm ,
-.Fl \&Ss ,
-and
-.Fl t
-are used exclusively to generate a particular type of file,
-while the options
-.Fl D
-and
-.Fl T
-are global and can be used with the other options.
-.It Fl Y Ar pathname
-Give the name of the directory where
-.Nm
-will start looking for the C-preprocessor.
-.El
-.Sh EXAMPLES
-The following example:
-.Dl example% rpcgen -T prot.x
-.Pp
-generates all the five files:
-.Pa prot.h ,
-.Pa prot_clnt.c ,
-.Pa prot_svc.c ,
-.Pa prot_xdr.c
-and
-.Pa prot_tbl.i .
-.Pp
-The following example sends the C data-definitions (header)
-to the standard output.
-.Dl example% rpcgen -h prot.x
-.Pp
-To send the test version of the
-.Fl D Ns Ar TEST ,
-server side stubs for
-all the transport belonging to the class
-.Ar datagram_n
-to standard output, use:
-.Dl example% rpcgen -s datagram_n -DTEST prot.x
-.Pp
-To create the server side stubs for the transport indicated
-by
-.Ar netid
-tcp,
-use:
-.Dl example% rpcgen -n tcp -o prot_svc.c prot.x
-.Sh SEE ALSO
-.Xr cc 1 ,
-.Xr rpc 3 ,
-.Xr rpc_svc_calls 3 ,
-.Xr syslog 3 ,
-.Xr xdr 3 ,
-.Xr inetd 8
-.Rs
-.%T The rpcgen chapter in the NETP manual
-.Re
diff --git a/usr.bin/rpcinfo/Makefile b/usr.bin/rpcinfo/Makefile
deleted file mode 100644
index c89b5b3..0000000
--- a/usr.bin/rpcinfo/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-# from: @(#)Makefile 5.2 (Berkeley) 5/11/90
-# $FreeBSD$
-
-PROG= rpcinfo
-SRCS= rpcinfo.c
-MAN= rpcinfo.8
-
-CFLAGS+= -DPORTMAP
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/rpcinfo/rpcinfo.8 b/usr.bin/rpcinfo/rpcinfo.8
deleted file mode 100644
index f4c7fc7..0000000
--- a/usr.bin/rpcinfo/rpcinfo.8
+++ /dev/null
@@ -1,341 +0,0 @@
-.\" @(#)rpcinfo.1m 1.23 93/03/29 SMI; from SVr4
-.\" Copyright 1989 AT&T
-.\" Copyright 1991 Sun Microsystems, Inc.
-.\" $NetBSD: rpcinfo.8,v 1.6 2000/06/02 23:19:38 fvdl Exp $
-.\" $FreeBSD$
-.Dd August 18, 1992
-.Dt RPCINFO 8
-.Os
-.Sh NAME
-.Nm rpcinfo
-.Nd report RPC information
-.Sh SYNOPSIS
-.Nm
-.Op Fl m | s
-.Op Ar host
-.Nm
-.Op Ar host
-.Nm
-.Fl T Ar transport
-.Ar host prognum
-.Op Ar versnum
-.Nm
-.Fl l
-.Op Fl T Ar transport
-.Ar host prognum
-.Op Ar versnum
-.Nm
-.Op Fl n Ar portnum
-.Fl u
-.Ar host prognum
-.Op Ar versnum
-.Nm
-.Op Fl n Ar portnum
-.Op Fl t
-.Ar host prognum
-.Op Ar versnum
-.Nm
-.Fl a Ar serv_address
-.Fl T Ar transport
-.Ar prognum
-.Op Ar versnum
-.Nm
-.Fl b
-.Op Fl T Ar transport
-.Ar prognum versnum
-.Nm
-.Fl d
-.Op Fl T Ar transport
-.Ar prognum versnum
-.Sh DESCRIPTION
-The
-.Nm
-utility makes an RPC call to an RPC
-server and reports what it finds.
-.Pp
-In the first synopsis,
-.Nm
-lists all the registered RPC services with
-.Nm rpcbind
-on
-.Ar host .
-If
-.Ar host
-is not specified, the local host is the default.
-If
-.Fl s
-is used, the information is displayed in a concise format.
-.Pp
-In the second synopsis,
-.Nm
-lists all the RPC services registered with
-.Nm rpcbind ,
-version 2.
-Also note that the format of the information
-is different in the first and the second synopsis.
-This is because the second synopsis is an older protocol used to
-collect the information displayed (version 2 of the
-.Nm rpcbind
-protocol).
-.Pp
-The third synopsis makes an RPC call to procedure 0
-of
-.Ar prognum
-and
-.Ar versnum
-on the specified
-.Ar host
-and reports whether a response was received.
-.Ar transport
-is the transport which has to be used for contacting the
-given service.
-The remote address of the service is obtained by
-making a call to the remote
-.Nm rpcbind .
-.Pp
-The
-.Ar prognum
-argument is a number that represents an RPC program number
-If a
-.Ar versnum
-is specified,
-.Nm
-attempts to call that version of the specified
-.Ar prognum .
-Otherwise,
-.Nm
-attempts to find all the registered version
-numbers for the specified
-.Ar prognum
-by calling version 0,
-which is presumed not to exist;
-if it does exist,
-.Nm
-attempts to obtain this information by calling
-an extremely high version number instead,
-and attempts to call each registered version.
-Note:
-the version number is required for
-.Fl b
-and
-.Fl d
-options.
-.Sh OPTIONS
-.Bl -tag -width indent
-.It Fl T Ar transport
-Specify the transport on which the service is required.
-If this option is not specified,
-.Nm
-uses the transport specified in the
-.Ev NETPATH
-environment variable, or if that is unset or empty, the transport
-in the
-.Xr netconfig 5
-database is used.
-This is a generic option,
-and can be used in conjunction with other options as
-shown in the
-.Sx SYNOPSIS .
-.It Fl a Ar serv_address
-Use
-.Ar serv_address
-as the (universal) address for the service on
-.Ar transport
-to ping procedure 0
-of the specified
-.Ar prognum
-and report whether a response was received.
-The
-.Fl T
-option is required with the
-.Fl a
-option.
-.Pp
-If
-.Ar versnum
-is not specified,
-.Nm
-tries to ping all
-available version numbers for that program number.
-This option avoids calls to remote
-.Nm rpcbind
-to find the address of the service.
-The
-.Ar serv_address
-is specified in universal address format of the given transport.
-.It Fl b
-Make an RPC broadcast to procedure 0
-of the specified
-.Ar prognum
-and
-.Ar versnum
-and report all hosts that respond.
-If
-.Ar transport
-is specified, it broadcasts its request only on the
-specified transport.
-If broadcasting is not supported by any
-transport,
-an error message is printed.
-Use of broadcasting should be limited because of the potential for adverse
-effect on other systems.
-.It Fl d
-Delete registration for the RPC service of the specified
-.Ar prognum
-and
-.Ar versnum .
-If
-.Ar transport
-is specified,
-unregister the service on only that transport,
-otherwise unregister the service on all
-the transports on which it was registered.
-Only the owner of a service can delete a registration, except the
-super-user who can delete any service.
-.It Fl l
-Display a list of entries with a given
-.Ar prognum
-and
-.Ar versnum
-on the specified
-.Ar host .
-Entries are returned for all transports
-in the same protocol family as that used to contact the remote
-.Nm rpcbind .
-.It Fl m
-Display a table of statistics of
-.Nm rpcbind
-operations on the given
-.Ar host .
-The table shows statistics for each version of
-.Nm rpcbind
-(versions 2, 3 and 4), giving the number of times each procedure was
-requested and successfully serviced, the number and type of remote call
-requests that were made, and information about RPC address lookups that were
-handled.
-This is useful for monitoring RPC activities on
-.Ar host .
-.It Fl n Ar portnum
-Use
-.Ar portnum
-as the port number for the
-.Fl t
-and
-.Fl u
-options instead of the port number given by
-.Nm rpcbind .
-Use of this option avoids a call to the remote
-.Nm rpcbind
-to find out the address of the service.
-This option is made
-obsolete by the
-.Fl a
-option.
-.It Fl p
-Probe
-.Nm rpcbind
-on
-.Ar host
-using version 2 of the
-.Nm rpcbind
-protocol,
-and display a list of all registered RPC programs.
-If
-.Ar host
-is not specified, it defaults to the local host.
-Note: Version 2 of the
-.Nm rpcbind
-protocol was previously known as the portmapper protocol.
-.It Fl s
-Display a concise list of all registered RPC programs on
-.Ar host .
-If
-.Ar host
-is not specified, it defaults to the local host.
-.It Fl t
-Make an RPC call to procedure 0 of
-.Ar prognum
-on the specified
-.Ar host
-using TCP,
-and report whether a response was received.
-This option is made
-obsolete by the
-.Fl T
-option as shown in the third synopsis.
-.It Fl u
-Make an RPC call to procedure 0 of
-.Ar prognum
-on the specified
-.Ar host
-using UDP,
-and report whether a response was received.
-This option is made
-obsolete by the
-.Fl T
-option as shown in the third synopsis.
-.El
-.Sh EXAMPLES
-To show all of the RPC services registered on the local machine use:
-.Pp
-.Dl "example% rpcinfo"
-.Pp
-To show all of the RPC
-services registered with
-.Nm rpcbind
-on the machine named
-.Dq klaxon
-use:
-.Pp
-.Dl "example% rpcinfo klaxon"
-.Pp
-The information displayed by the above commands can be quite lengthy.
-Use the
-.Fl s
-option to display a more concise list:
-.Pp
-.Dl "example$ rpcinfo -s klaxon"
-.Bl -column "program" "version(s)" "unix,tcp,udp,tcp6,udp6" "nlockmgr" "super-user"
-.It "program version(s) netid(s) service owner"
-.It "100000 2,3,4 unix,tcp,udp,tcp6,udp6 rpcbind super-user"
-.It "100008 1 udp,tcp,udp6,tcp6 walld super-user"
-.It "100002 2,1 udp,udp6 rusersd super-user"
-.It "100001 2,3,4 udp,udp6 rstatd super-user"
-.It "100012 1 udp,tcp sprayd super-user"
-.It "100007 3 udp,tcp ypbind super-user"
-.El
-.Pp
-To show whether the RPC
-service with program number
-.Ar prognum
-and version
-.Ar versnum
-is
-registered on the machine named
-.Dq klaxon
-for the transport TCP
-use:
-.Pp
-.Dl "example% rpcinfo -T tcp klaxon prognum versnum"
-.Pp
-To show all RPC
-services registered with version 2 of the
-.Nm rpcbind
-protocol on the local machine use:
-.Pp
-.Dl "example% rpcinfo -p"
-.Pp
-To delete the registration for version
-1 of the
-.Nm walld
-(program number 100008)
-service for all transports use:
-.Pp
-.Dl "example# rpcinfo -d 100008 1"
-or
-.Dl "example# rpcinfo -d walld 1"
-.Sh SEE ALSO
-.Xr rpc 3 ,
-.Xr netconfig 5 ,
-.Xr rpc 5 ,
-.Xr rpcbind 8
diff --git a/usr.bin/rpcinfo/rpcinfo.c b/usr.bin/rpcinfo/rpcinfo.c
deleted file mode 100644
index a2e6629..0000000
--- a/usr.bin/rpcinfo/rpcinfo.c
+++ /dev/null
@@ -1,1667 +0,0 @@
-/* $NetBSD: rpcinfo.c,v 1.15 2000/10/04 20:09:05 mjl Exp $ */
-
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-/*
- * Copyright (c) 1986 - 1991 by Sun Microsystems, Inc.
- */
-
-/* #ident "@(#)rpcinfo.c 1.18 93/07/05 SMI" */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)rpcinfo.c 1.16 89/04/05 Copyr 1986 Sun Micro";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * rpcinfo: ping a particular rpc program
- * or dump the the registered programs on the remote machine.
- */
-
-/*
- * We are for now defining PORTMAP here. It doesnt even compile
- * unless it is defined.
- */
-#ifndef PORTMAP
-#define PORTMAP
-#endif
-
-/*
- * If PORTMAP is defined, rpcinfo will talk to both portmapper and
- * rpcbind programs; else it talks only to rpcbind. In the latter case
- * all the portmapper specific options such as -u, -t, -p become void.
- */
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <rpc/rpc.h>
-#include <stdio.h>
-#include <rpc/rpcb_prot.h>
-#include <rpc/rpcent.h>
-#include <rpc/nettype.h>
-#include <rpc/rpc_com.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <err.h>
-#include <ctype.h>
-
-#ifdef PORTMAP /* Support for version 2 portmapper */
-#include <netinet/in.h>
-#include <netdb.h>
-#include <arpa/inet.h>
-#include <rpc/pmap_prot.h>
-#include <rpc/pmap_clnt.h>
-#endif
-
-#define MAXHOSTLEN 256
-#define MIN_VERS ((u_long) 0)
-#define MAX_VERS ((u_long) 4294967295UL)
-#define UNKNOWN "unknown"
-
-/*
- * Functions to be performed.
- */
-#define NONE 0 /* no function */
-#define PMAPDUMP 1 /* dump portmapper registrations */
-#define TCPPING 2 /* ping TCP service */
-#define UDPPING 3 /* ping UDP service */
-#define BROADCAST 4 /* ping broadcast service */
-#define DELETES 5 /* delete registration for the service */
-#define ADDRPING 6 /* pings at the given address */
-#define PROGPING 7 /* pings a program on a given host */
-#define RPCBDUMP 8 /* dump rpcbind registrations */
-#define RPCBDUMP_SHORT 9 /* dump rpcbind registrations - short version */
-#define RPCBADDRLIST 10 /* dump addr list about one prog */
-#define RPCBGETSTAT 11 /* Get statistics */
-
-struct netidlist {
- char *netid;
- struct netidlist *next;
-};
-
-struct verslist {
- int vers;
- struct verslist *next;
-};
-
-struct rpcbdump_short {
- u_long prog;
- struct verslist *vlist;
- struct netidlist *nlist;
- struct rpcbdump_short *next;
- char *owner;
-};
-
-
-
-#ifdef PORTMAP
-static void ip_ping(u_short, char *, int, char **);
-static CLIENT *clnt_com_create(struct sockaddr_in *, u_long, u_long, int *,
- char *);
-static void pmapdump(int, char **);
-static void get_inet_address(struct sockaddr_in *, char *);
-#endif
-
-static bool_t reply_proc(void *, struct netbuf *, struct netconfig *);
-static void brdcst(int, char **);
-static void addrping(char *, char *, int, char **);
-static void progping(char *, int, char **);
-static CLIENT *clnt_addr_create(char *, struct netconfig *, u_long, u_long);
-static CLIENT *clnt_rpcbind_create(char *, int, struct netbuf **);
-static CLIENT *getclnthandle(char *, struct netconfig *, u_long,
- struct netbuf **);
-static CLIENT *local_rpcb(u_long, u_long);
-static int pstatus(CLIENT *, u_long, u_long);
-static void rpcbdump(int, char *, int, char **);
-static void rpcbgetstat(int, char **);
-static void rpcbaddrlist(char *, int, char **);
-static void deletereg(char *, int, char **);
-static void print_rmtcallstat(int, rpcb_stat *);
-static void print_getaddrstat(int, rpcb_stat *);
-static void usage(void);
-static u_long getprognum(char *);
-static u_long getvers(char *);
-static char *spaces(int);
-static bool_t add_version(struct rpcbdump_short *, u_long);
-static bool_t add_netid(struct rpcbdump_short *, char *);
-
-int
-main(int argc, char **argv)
-{
- register int c;
- int errflg;
- int function;
- char *netid = NULL;
- char *address = NULL;
-#ifdef PORTMAP
- char *strptr;
- u_short portnum = 0;
-#endif
-
- function = NONE;
- errflg = 0;
-#ifdef PORTMAP
- while ((c = getopt(argc, argv, "a:bdlmn:pstT:u")) != -1) {
-#else
- while ((c = getopt(argc, argv, "a:bdlmn:sT:")) != -1) {
-#endif
- switch (c) {
-#ifdef PORTMAP
- case 'p':
- if (function != NONE)
- errflg = 1;
- else
- function = PMAPDUMP;
- break;
-
- case 't':
- if (function != NONE)
- errflg = 1;
- else
- function = TCPPING;
- break;
-
- case 'u':
- if (function != NONE)
- errflg = 1;
- else
- function = UDPPING;
- break;
-
- case 'n':
- portnum = (u_short) strtol(optarg, &strptr, 10);
- if (strptr == optarg || *strptr != '\0')
- errx(1, "%s is illegal port number", optarg);
- break;
-#endif
- case 'a':
- address = optarg;
- if (function != NONE)
- errflg = 1;
- else
- function = ADDRPING;
- break;
- case 'b':
- if (function != NONE)
- errflg = 1;
- else
- function = BROADCAST;
- break;
-
- case 'd':
- if (function != NONE)
- errflg = 1;
- else
- function = DELETES;
- break;
-
- case 'l':
- if (function != NONE)
- errflg = 1;
- else
- function = RPCBADDRLIST;
- break;
-
- case 'm':
- if (function != NONE)
- errflg = 1;
- else
- function = RPCBGETSTAT;
- break;
-
- case 's':
- if (function != NONE)
- errflg = 1;
- else
- function = RPCBDUMP_SHORT;
- break;
-
- case 'T':
- netid = optarg;
- break;
- case '?':
- errflg = 1;
- break;
- }
- }
-
- if (errflg || ((function == ADDRPING) && !netid))
- usage();
-
- if (function == NONE) {
- if (argc - optind > 1)
- function = PROGPING;
- else
- function = RPCBDUMP;
- }
-
- switch (function) {
-#ifdef PORTMAP
- case PMAPDUMP:
- if (portnum != 0)
- usage();
- pmapdump(argc - optind, argv + optind);
- break;
-
- case UDPPING:
- ip_ping(portnum, "udp", argc - optind, argv + optind);
- break;
-
- case TCPPING:
- ip_ping(portnum, "tcp", argc - optind, argv + optind);
- break;
-#endif
- case BROADCAST:
- brdcst(argc - optind, argv + optind);
- break;
- case DELETES:
- deletereg(netid, argc - optind, argv + optind);
- break;
- case ADDRPING:
- addrping(address, netid, argc - optind, argv + optind);
- break;
- case PROGPING:
- progping(netid, argc - optind, argv + optind);
- break;
- case RPCBDUMP:
- case RPCBDUMP_SHORT:
- rpcbdump(function, netid, argc - optind, argv + optind);
- break;
- case RPCBGETSTAT:
- rpcbgetstat(argc - optind, argv + optind);
- break;
- case RPCBADDRLIST:
- rpcbaddrlist(netid, argc - optind, argv + optind);
- break;
- }
- return (0);
-}
-
-static CLIENT *
-local_rpcb(u_long prog, u_long vers)
-{
- void *localhandle;
- struct netconfig *nconf;
- CLIENT *clnt;
-
- localhandle = setnetconfig();
- while ((nconf = getnetconfig(localhandle)) != NULL) {
- if (nconf->nc_protofmly != NULL &&
- strcmp(nconf->nc_protofmly, NC_LOOPBACK) == 0)
- break;
- }
- if (nconf == NULL) {
- warnx("getnetconfig: %s", nc_sperror());
- return (NULL);
- }
-
- clnt = clnt_tp_create(NULL, prog, vers, nconf);
- endnetconfig(localhandle);
- return clnt;
-}
-
-#ifdef PORTMAP
-static CLIENT *
-clnt_com_create(struct sockaddr_in *addr, u_long prog, u_long vers,
- int *fdp, char *trans)
-{
- CLIENT *clnt;
-
- if (strcmp(trans, "tcp") == 0) {
- clnt = clnttcp_create(addr, prog, vers, fdp, 0, 0);
- } else {
- struct timeval to;
-
- to.tv_sec = 5;
- to.tv_usec = 0;
- clnt = clntudp_create(addr, prog, vers, to, fdp);
- }
- if (clnt == (CLIENT *)NULL) {
- clnt_pcreateerror("rpcinfo");
- if (vers == MIN_VERS)
- printf("program %lu is not available\n", prog);
- else
- printf("program %lu version %lu is not available\n",
- prog, vers);
- exit(1);
- }
- return (clnt);
-}
-
-/*
- * If portnum is 0, then go and get the address from portmapper, which happens
- * transparently through clnt*_create(); If version number is not given, it
- * tries to find out the version number by making a call to version 0 and if
- * that fails, it obtains the high order and the low order version number. If
- * version 0 calls succeeds, it tries for MAXVERS call and repeats the same.
- */
-static void
-ip_ping(u_short portnum, char *trans, int argc, char **argv)
-{
- CLIENT *client;
- int fd = RPC_ANYFD;
- struct timeval to;
- struct sockaddr_in addr;
- enum clnt_stat rpc_stat;
- u_long prognum, vers, minvers, maxvers;
- struct rpc_err rpcerr;
- int failure = 0;
-
- if (argc < 2 || argc > 3)
- usage();
- to.tv_sec = 10;
- to.tv_usec = 0;
- prognum = getprognum(argv[1]);
- get_inet_address(&addr, argv[0]);
- if (argc == 2) { /* Version number not known */
- /*
- * A call to version 0 should fail with a program/version
- * mismatch, and give us the range of versions supported.
- */
- vers = MIN_VERS;
- } else {
- vers = getvers(argv[2]);
- }
- addr.sin_port = htons(portnum);
- client = clnt_com_create(&addr, prognum, vers, &fd, trans);
- rpc_stat = CLNT_CALL(client, NULLPROC, (xdrproc_t) xdr_void,
- (char *)NULL, (xdrproc_t) xdr_void, (char *)NULL,
- to);
- if (argc != 2) {
- /* Version number was known */
- if (pstatus(client, prognum, vers) < 0)
- exit(1);
- (void) CLNT_DESTROY(client);
- return;
- }
- /* Version number not known */
- (void) CLNT_CONTROL(client, CLSET_FD_NCLOSE, (char *)NULL);
- if (rpc_stat == RPC_PROGVERSMISMATCH) {
- clnt_geterr(client, &rpcerr);
- minvers = rpcerr.re_vers.low;
- maxvers = rpcerr.re_vers.high;
- } else if (rpc_stat == RPC_SUCCESS) {
- /*
- * Oh dear, it DOES support version 0.
- * Let's try version MAX_VERS.
- */
- (void) CLNT_DESTROY(client);
- addr.sin_port = htons(portnum);
- client = clnt_com_create(&addr, prognum, MAX_VERS, &fd, trans);
- rpc_stat = CLNT_CALL(client, NULLPROC, (xdrproc_t) xdr_void,
- (char *)NULL, (xdrproc_t) xdr_void,
- (char *)NULL, to);
- if (rpc_stat == RPC_PROGVERSMISMATCH) {
- clnt_geterr(client, &rpcerr);
- minvers = rpcerr.re_vers.low;
- maxvers = rpcerr.re_vers.high;
- } else if (rpc_stat == RPC_SUCCESS) {
- /*
- * It also supports version MAX_VERS.
- * Looks like we have a wise guy.
- * OK, we give them information on all
- * 4 billion versions they support...
- */
- minvers = 0;
- maxvers = MAX_VERS;
- } else {
- (void) pstatus(client, prognum, MAX_VERS);
- exit(1);
- }
- } else {
- (void) pstatus(client, prognum, (u_long)0);
- exit(1);
- }
- (void) CLNT_DESTROY(client);
- for (vers = minvers; vers <= maxvers; vers++) {
- addr.sin_port = htons(portnum);
- client = clnt_com_create(&addr, prognum, vers, &fd, trans);
- rpc_stat = CLNT_CALL(client, NULLPROC, (xdrproc_t) xdr_void,
- (char *)NULL, (xdrproc_t) xdr_void,
- (char *)NULL, to);
- if (pstatus(client, prognum, vers) < 0)
- failure = 1;
- (void) CLNT_DESTROY(client);
- }
- if (failure)
- exit(1);
- (void) close(fd);
- return;
-}
-
-/*
- * Dump all the portmapper registerations
- */
-static void
-pmapdump(int argc, char **argv)
-{
- struct sockaddr_in server_addr;
- struct pmaplist *head = NULL;
- int socket = RPC_ANYSOCK;
- struct timeval minutetimeout;
- register CLIENT *client;
- struct rpcent *rpc;
- enum clnt_stat clnt_st;
- struct rpc_err err;
- char *host;
-
- if (argc > 1)
- usage();
- if (argc == 1) {
- host = argv[0];
- get_inet_address(&server_addr, host);
- server_addr.sin_port = htons(PMAPPORT);
- client = clnttcp_create(&server_addr, PMAPPROG, PMAPVERS,
- &socket, 50, 500);
- } else
- client = local_rpcb(PMAPPROG, PMAPVERS);
-
- if (client == NULL) {
- if (rpc_createerr.cf_stat == RPC_TLIERROR) {
- /*
- * "Misc. TLI error" is not too helpful. Most likely
- * the connection to the remote server timed out, so
- * this error is at least less perplexing.
- */
- rpc_createerr.cf_stat = RPC_PMAPFAILURE;
- rpc_createerr.cf_error.re_status = RPC_FAILED;
- }
- clnt_pcreateerror("rpcinfo: can't contact portmapper");
- exit(1);
- }
-
- minutetimeout.tv_sec = 60;
- minutetimeout.tv_usec = 0;
-
- clnt_st = CLNT_CALL(client, PMAPPROC_DUMP, (xdrproc_t) xdr_void,
- NULL, (xdrproc_t) xdr_pmaplist_ptr, (char *)&head,
- minutetimeout);
- if (clnt_st != RPC_SUCCESS) {
- if ((clnt_st == RPC_PROGVERSMISMATCH) ||
- (clnt_st == RPC_PROGUNAVAIL)) {
- CLNT_GETERR(client, &err);
- if (err.re_vers.low > PMAPVERS)
- warnx(
- "%s does not support portmapper. Try rpcinfo %s instead",
- host, host);
- exit(1);
- }
- clnt_perror(client, "rpcinfo: can't contact portmapper");
- exit(1);
- }
- if (head == NULL) {
- printf("No remote programs registered.\n");
- } else {
- printf(" program vers proto port service\n");
- for (; head != NULL; head = head->pml_next) {
- printf("%10ld%5ld",
- head->pml_map.pm_prog,
- head->pml_map.pm_vers);
- if (head->pml_map.pm_prot == IPPROTO_UDP)
- printf("%6s", "udp");
- else if (head->pml_map.pm_prot == IPPROTO_TCP)
- printf("%6s", "tcp");
- else if (head->pml_map.pm_prot == IPPROTO_ST)
- printf("%6s", "local");
- else
- printf("%6ld", head->pml_map.pm_prot);
- printf("%7ld", head->pml_map.pm_port);
- rpc = getrpcbynumber(head->pml_map.pm_prog);
- if (rpc)
- printf(" %s\n", rpc->r_name);
- else
- printf("\n");
- }
- }
-}
-
-static void
-get_inet_address(struct sockaddr_in *addr, char *host)
-{
- struct netconfig *nconf;
- struct addrinfo hints, *res;
- int error;
-
- (void) memset((char *)addr, 0, sizeof (*addr));
- addr->sin_addr.s_addr = inet_addr(host);
- if (addr->sin_addr.s_addr == -1 || addr->sin_addr.s_addr == 0) {
- if ((nconf = __rpc_getconfip("udp")) == NULL &&
- (nconf = __rpc_getconfip("tcp")) == NULL)
- errx(1, "couldn't find a suitable transport");
- else {
- memset(&hints, 0, sizeof hints);
- hints.ai_family = AF_INET;
- if ((error = getaddrinfo(host, "rpcbind", &hints, &res))
- != 0)
- errx(1, "%s: %s", host, gai_strerror(error));
- else {
- memcpy(addr, res->ai_addr, res->ai_addrlen);
- freeaddrinfo(res);
- }
- (void) freenetconfigent(nconf);
- }
- } else {
- addr->sin_family = AF_INET;
- }
-}
-#endif /* PORTMAP */
-
-/*
- * reply_proc collects replies from the broadcast.
- * to get a unique list of responses the output of rpcinfo should
- * be piped through sort(1) and then uniq(1).
- */
-
-/*ARGSUSED*/
-static bool_t
-reply_proc(void *res, struct netbuf *who, struct netconfig *nconf)
- /* void *res; Nothing comes back */
- /* struct netbuf *who; Who sent us the reply */
- /* struct netconfig *nconf; On which transport the reply came */
-{
- char *uaddr;
- char hostbuf[NI_MAXHOST];
- char *hostname;
- struct sockaddr *sa = (struct sockaddr *)who->buf;
-
- if (getnameinfo(sa, sa->sa_len, hostbuf, NI_MAXHOST, NULL, 0, 0)) {
- hostname = UNKNOWN;
- } else {
- hostname = hostbuf;
- }
- if (!(uaddr = taddr2uaddr(nconf, who))) {
- uaddr = UNKNOWN;
- }
- printf("%s\t%s\n", uaddr, hostname);
- if (strcmp(uaddr, UNKNOWN))
- free((char *)uaddr);
- return (FALSE);
-}
-
-static void
-brdcst(int argc, char **argv)
-{
- enum clnt_stat rpc_stat;
- u_long prognum, vers;
-
- if (argc != 2)
- usage();
- prognum = getprognum(argv[0]);
- vers = getvers(argv[1]);
- rpc_stat = rpc_broadcast(prognum, vers, NULLPROC,
- (xdrproc_t) xdr_void, (char *)NULL, (xdrproc_t) xdr_void,
- (char *)NULL, (resultproc_t) reply_proc, NULL);
- if ((rpc_stat != RPC_SUCCESS) && (rpc_stat != RPC_TIMEDOUT))
- errx(1, "broadcast failed: %s", clnt_sperrno(rpc_stat));
- exit(0);
-}
-
-static bool_t
-add_version(struct rpcbdump_short *rs, u_long vers)
-{
- struct verslist *vl;
-
- for (vl = rs->vlist; vl; vl = vl->next)
- if (vl->vers == vers)
- break;
- if (vl)
- return (TRUE);
- vl = (struct verslist *)malloc(sizeof (struct verslist));
- if (vl == NULL)
- return (FALSE);
- vl->vers = vers;
- vl->next = rs->vlist;
- rs->vlist = vl;
- return (TRUE);
-}
-
-static bool_t
-add_netid(struct rpcbdump_short *rs, char *netid)
-{
- struct netidlist *nl;
-
- for (nl = rs->nlist; nl; nl = nl->next)
- if (strcmp(nl->netid, netid) == 0)
- break;
- if (nl)
- return (TRUE);
- nl = (struct netidlist *)malloc(sizeof (struct netidlist));
- if (nl == NULL)
- return (FALSE);
- nl->netid = netid;
- nl->next = rs->nlist;
- rs->nlist = nl;
- return (TRUE);
-}
-
-static void
-rpcbdump(int dumptype, char *netid, int argc, char **argv)
-{
- rpcblist_ptr head = NULL;
- struct timeval minutetimeout;
- register CLIENT *client;
- struct rpcent *rpc;
- char *host;
- struct netidlist *nl;
- struct verslist *vl;
- struct rpcbdump_short *rs, *rs_tail;
- char buf[256];
- enum clnt_stat clnt_st;
- struct rpc_err err;
- struct rpcbdump_short *rs_head = NULL;
-
- if (argc > 1)
- usage();
- if (argc == 1) {
- host = argv[0];
- if (netid == NULL) {
- client = clnt_rpcbind_create(host, RPCBVERS, NULL);
- } else {
- struct netconfig *nconf;
-
- nconf = getnetconfigent(netid);
- if (nconf == NULL) {
- nc_perror("rpcinfo: invalid transport");
- exit(1);
- }
- client = getclnthandle(host, nconf, RPCBVERS, NULL);
- if (nconf)
- (void) freenetconfigent(nconf);
- }
- } else
- client = local_rpcb(PMAPPROG, RPCBVERS);
-
- if (client == (CLIENT *)NULL) {
- clnt_pcreateerror("rpcinfo: can't contact rpcbind");
- exit(1);
- }
-
- minutetimeout.tv_sec = 60;
- minutetimeout.tv_usec = 0;
- clnt_st = CLNT_CALL(client, RPCBPROC_DUMP, (xdrproc_t) xdr_void,
- NULL, (xdrproc_t) xdr_rpcblist_ptr, (char *) &head,
- minutetimeout);
- if (clnt_st != RPC_SUCCESS) {
- if ((clnt_st == RPC_PROGVERSMISMATCH) ||
- (clnt_st == RPC_PROGUNAVAIL)) {
- int vers;
-
- CLNT_GETERR(client, &err);
- if (err.re_vers.low == RPCBVERS4) {
- vers = RPCBVERS4;
- clnt_control(client, CLSET_VERS, (char *)&vers);
- clnt_st = CLNT_CALL(client, RPCBPROC_DUMP,
- (xdrproc_t) xdr_void, NULL,
- (xdrproc_t) xdr_rpcblist_ptr, (char *) &head,
- minutetimeout);
- if (clnt_st != RPC_SUCCESS)
- goto failed;
- } else {
- if (err.re_vers.high == PMAPVERS) {
- int high, low;
- struct pmaplist *pmaphead = NULL;
- rpcblist_ptr list, prev;
-
- vers = PMAPVERS;
- clnt_control(client, CLSET_VERS, (char *)&vers);
- clnt_st = CLNT_CALL(client, PMAPPROC_DUMP,
- (xdrproc_t) xdr_void, NULL,
- (xdrproc_t) xdr_pmaplist_ptr,
- (char *)&pmaphead, minutetimeout);
- if (clnt_st != RPC_SUCCESS)
- goto failed;
- /*
- * convert to rpcblist_ptr format
- */
- for (head = NULL; pmaphead != NULL;
- pmaphead = pmaphead->pml_next) {
- list = (rpcblist *)malloc(sizeof (rpcblist));
- if (list == NULL)
- goto error;
- if (head == NULL)
- head = list;
- else
- prev->rpcb_next = (rpcblist_ptr) list;
-
- list->rpcb_next = NULL;
- list->rpcb_map.r_prog = pmaphead->pml_map.pm_prog;
- list->rpcb_map.r_vers = pmaphead->pml_map.pm_vers;
- if (pmaphead->pml_map.pm_prot == IPPROTO_UDP)
- list->rpcb_map.r_netid = "udp";
- else if (pmaphead->pml_map.pm_prot == IPPROTO_TCP)
- list->rpcb_map.r_netid = "tcp";
- else {
-#define MAXLONG_AS_STRING "2147483648"
- list->rpcb_map.r_netid =
- malloc(strlen(MAXLONG_AS_STRING) + 1);
- if (list->rpcb_map.r_netid == NULL)
- goto error;
- sprintf(list->rpcb_map.r_netid, "%6ld",
- pmaphead->pml_map.pm_prot);
- }
- list->rpcb_map.r_owner = UNKNOWN;
- low = pmaphead->pml_map.pm_port & 0xff;
- high = (pmaphead->pml_map.pm_port >> 8) & 0xff;
- list->rpcb_map.r_addr = strdup("0.0.0.0.XXX.XXX");
- sprintf(&list->rpcb_map.r_addr[8], "%d.%d",
- high, low);
- prev = list;
- }
- }
- }
- } else { /* any other error */
-failed:
- clnt_perror(client, "rpcinfo: can't contact rpcbind: ");
- exit(1);
- }
- }
- if (head == NULL) {
- printf("No remote programs registered.\n");
- } else if (dumptype == RPCBDUMP) {
- printf(
-" program version netid address service owner\n");
- for (; head != NULL; head = head->rpcb_next) {
- printf("%10u%5u ",
- head->rpcb_map.r_prog, head->rpcb_map.r_vers);
- printf("%-9s ", head->rpcb_map.r_netid);
- printf("%-22s", head->rpcb_map.r_addr);
- rpc = getrpcbynumber(head->rpcb_map.r_prog);
- if (rpc)
- printf(" %-10s", rpc->r_name);
- else
- printf(" %-10s", "-");
- printf(" %s\n", head->rpcb_map.r_owner);
- }
- } else if (dumptype == RPCBDUMP_SHORT) {
- for (; head != NULL; head = head->rpcb_next) {
- for (rs = rs_head; rs; rs = rs->next)
- if (head->rpcb_map.r_prog == rs->prog)
- break;
- if (rs == NULL) {
- rs = (struct rpcbdump_short *)
- malloc(sizeof (struct rpcbdump_short));
- if (rs == NULL)
- goto error;
- rs->next = NULL;
- if (rs_head == NULL) {
- rs_head = rs;
- rs_tail = rs;
- } else {
- rs_tail->next = rs;
- rs_tail = rs;
- }
- rs->prog = head->rpcb_map.r_prog;
- rs->owner = head->rpcb_map.r_owner;
- rs->nlist = NULL;
- rs->vlist = NULL;
- }
- if (add_version(rs, head->rpcb_map.r_vers) == FALSE)
- goto error;
- if (add_netid(rs, head->rpcb_map.r_netid) == FALSE)
- goto error;
- }
- printf(
-" program version(s) netid(s) service owner\n");
- for (rs = rs_head; rs; rs = rs->next) {
- char *p = buf;
-
- printf("%10ld ", rs->prog);
- for (vl = rs->vlist; vl; vl = vl->next) {
- sprintf(p, "%d", vl->vers);
- p = p + strlen(p);
- if (vl->next)
- sprintf(p++, ",");
- }
- printf("%-10s", buf);
- buf[0] = '\0';
- for (nl = rs->nlist; nl; nl = nl->next) {
- strcat(buf, nl->netid);
- if (nl->next)
- strcat(buf, ",");
- }
- printf("%-32s", buf);
- rpc = getrpcbynumber(rs->prog);
- if (rpc)
- printf(" %-11s", rpc->r_name);
- else
- printf(" %-11s", "-");
- printf(" %s\n", rs->owner);
- }
- }
- clnt_destroy(client);
- return;
-error: warnx("no memory");
- return;
-}
-
-static char nullstring[] = "\000";
-
-static void
-rpcbaddrlist(char *netid, int argc, char **argv)
-{
- rpcb_entry_list_ptr head = NULL;
- struct timeval minutetimeout;
- register CLIENT *client;
- struct rpcent *rpc;
- char *host;
- RPCB parms;
- struct netbuf *targaddr;
-
- if (argc != 3)
- usage();
- host = argv[0];
- if (netid == NULL) {
- client = clnt_rpcbind_create(host, RPCBVERS4, &targaddr);
- } else {
- struct netconfig *nconf;
-
- nconf = getnetconfigent(netid);
- if (nconf == NULL) {
- nc_perror("rpcinfo: invalid transport");
- exit(1);
- }
- client = getclnthandle(host, nconf, RPCBVERS4, &targaddr);
- if (nconf)
- (void) freenetconfigent(nconf);
- }
- if (client == (CLIENT *)NULL) {
- clnt_pcreateerror("rpcinfo: can't contact rpcbind");
- exit(1);
- }
- minutetimeout.tv_sec = 60;
- minutetimeout.tv_usec = 0;
-
- parms.r_prog = getprognum(argv[1]);
- parms.r_vers = getvers(argv[2]);
- parms.r_netid = client->cl_netid;
- if (targaddr == NULL) {
- parms.r_addr = nullstring; /* for XDRing */
- } else {
- /*
- * We also send the remote system the address we
- * used to contact it in case it can help it
- * connect back with us
- */
- struct netconfig *nconf;
-
- nconf = getnetconfigent(client->cl_netid);
- if (nconf != NULL) {
- parms.r_addr = taddr2uaddr(nconf, targaddr);
- if (parms.r_addr == NULL)
- parms.r_addr = nullstring;
- freenetconfigent(nconf);
- } else {
- parms.r_addr = nullstring; /* for XDRing */
- }
- free(targaddr->buf);
- free(targaddr);
- }
- parms.r_owner = nullstring;
-
- if (CLNT_CALL(client, RPCBPROC_GETADDRLIST, (xdrproc_t) xdr_rpcb,
- (char *) &parms, (xdrproc_t) xdr_rpcb_entry_list_ptr,
- (char *) &head, minutetimeout) != RPC_SUCCESS) {
- clnt_perror(client, "rpcinfo: can't contact rpcbind: ");
- exit(1);
- }
- if (head == NULL) {
- printf("No remote programs registered.\n");
- } else {
- printf(
- " program vers tp_family/name/class address\t\t service\n");
- for (; head != NULL; head = head->rpcb_entry_next) {
- rpcb_entry *re;
- char buf[128];
-
- re = &head->rpcb_entry_map;
- printf("%10u%3u ",
- parms.r_prog, parms.r_vers);
- sprintf(buf, "%s/%s/%s ",
- re->r_nc_protofmly, re->r_nc_proto,
- re->r_nc_semantics == NC_TPI_CLTS ? "clts" :
- re->r_nc_semantics == NC_TPI_COTS ? "cots" :
- "cots_ord");
- printf("%-24s", buf);
- printf("%-24s", re->r_maddr);
- rpc = getrpcbynumber(parms.r_prog);
- if (rpc)
- printf(" %-13s", rpc->r_name);
- else
- printf(" %-13s", "-");
- printf("\n");
- }
- }
- clnt_destroy(client);
- return;
-}
-
-/*
- * monitor rpcbind
- */
-static void
-rpcbgetstat(int argc, char **argv)
-{
- rpcb_stat_byvers inf;
- struct timeval minutetimeout;
- register CLIENT *client;
- char *host;
- int i, j;
- rpcbs_addrlist *pa;
- rpcbs_rmtcalllist *pr;
- int cnt, flen;
-#define MAXFIELD 64
- char fieldbuf[MAXFIELD];
-#define MAXLINE 256
- char linebuf[MAXLINE];
- char *cp, *lp;
- char *pmaphdr[] = {
- "NULL", "SET", "UNSET", "GETPORT",
- "DUMP", "CALLIT"
- };
- char *rpcb3hdr[] = {
- "NULL", "SET", "UNSET", "GETADDR", "DUMP", "CALLIT", "TIME",
- "U2T", "T2U"
- };
- char *rpcb4hdr[] = {
- "NULL", "SET", "UNSET", "GETADDR", "DUMP", "CALLIT", "TIME",
- "U2T", "T2U", "VERADDR", "INDRECT", "GETLIST", "GETSTAT"
- };
-
-#define TABSTOP 8
-
- if (argc >= 1) {
- host = argv[0];
- client = clnt_rpcbind_create(host, RPCBVERS4, NULL);
- } else
- client = local_rpcb(PMAPPROG, RPCBVERS4);
- if (client == (CLIENT *)NULL) {
- clnt_pcreateerror("rpcinfo: can't contact rpcbind");
- exit(1);
- }
- minutetimeout.tv_sec = 60;
- minutetimeout.tv_usec = 0;
- memset((char *)&inf, 0, sizeof (rpcb_stat_byvers));
- if (CLNT_CALL(client, RPCBPROC_GETSTAT, (xdrproc_t) xdr_void, NULL,
- (xdrproc_t) xdr_rpcb_stat_byvers, (char *)&inf, minutetimeout)
- != RPC_SUCCESS) {
- clnt_perror(client, "rpcinfo: can't contact rpcbind: ");
- exit(1);
- }
- printf("PORTMAP (version 2) statistics\n");
- lp = linebuf;
- for (i = 0; i <= rpcb_highproc_2; i++) {
- fieldbuf[0] = '\0';
- switch (i) {
- case PMAPPROC_SET:
- sprintf(fieldbuf, "%d/", inf[RPCBVERS_2_STAT].setinfo);
- break;
- case PMAPPROC_UNSET:
- sprintf(fieldbuf, "%d/",
- inf[RPCBVERS_2_STAT].unsetinfo);
- break;
- case PMAPPROC_GETPORT:
- cnt = 0;
- for (pa = inf[RPCBVERS_2_STAT].addrinfo; pa;
- pa = pa->next)
- cnt += pa->success;
- sprintf(fieldbuf, "%d/", cnt);
- break;
- case PMAPPROC_CALLIT:
- cnt = 0;
- for (pr = inf[RPCBVERS_2_STAT].rmtinfo; pr;
- pr = pr->next)
- cnt += pr->success;
- sprintf(fieldbuf, "%d/", cnt);
- break;
- default: break; /* For the remaining ones */
- }
- cp = &fieldbuf[0] + strlen(fieldbuf);
- sprintf(cp, "%d", inf[RPCBVERS_2_STAT].info[i]);
- flen = strlen(fieldbuf);
- printf("%s%s", pmaphdr[i],
- spaces((TABSTOP * (1 + flen / TABSTOP))
- - strlen(pmaphdr[i])));
- sprintf(lp, "%s%s", fieldbuf,
- spaces(cnt = ((TABSTOP * (1 + flen / TABSTOP))
- - flen)));
- lp += (flen + cnt);
- }
- printf("\n%s\n\n", linebuf);
-
- if (inf[RPCBVERS_2_STAT].info[PMAPPROC_CALLIT]) {
- printf("PMAP_RMTCALL call statistics\n");
- print_rmtcallstat(RPCBVERS_2_STAT, &inf[RPCBVERS_2_STAT]);
- printf("\n");
- }
-
- if (inf[RPCBVERS_2_STAT].info[PMAPPROC_GETPORT]) {
- printf("PMAP_GETPORT call statistics\n");
- print_getaddrstat(RPCBVERS_2_STAT, &inf[RPCBVERS_2_STAT]);
- printf("\n");
- }
-
- printf("RPCBIND (version 3) statistics\n");
- lp = linebuf;
- for (i = 0; i <= rpcb_highproc_3; i++) {
- fieldbuf[0] = '\0';
- switch (i) {
- case RPCBPROC_SET:
- sprintf(fieldbuf, "%d/", inf[RPCBVERS_3_STAT].setinfo);
- break;
- case RPCBPROC_UNSET:
- sprintf(fieldbuf, "%d/",
- inf[RPCBVERS_3_STAT].unsetinfo);
- break;
- case RPCBPROC_GETADDR:
- cnt = 0;
- for (pa = inf[RPCBVERS_3_STAT].addrinfo; pa;
- pa = pa->next)
- cnt += pa->success;
- sprintf(fieldbuf, "%d/", cnt);
- break;
- case RPCBPROC_CALLIT:
- cnt = 0;
- for (pr = inf[RPCBVERS_3_STAT].rmtinfo; pr;
- pr = pr->next)
- cnt += pr->success;
- sprintf(fieldbuf, "%d/", cnt);
- break;
- default: break; /* For the remaining ones */
- }
- cp = &fieldbuf[0] + strlen(fieldbuf);
- sprintf(cp, "%d", inf[RPCBVERS_3_STAT].info[i]);
- flen = strlen(fieldbuf);
- printf("%s%s", rpcb3hdr[i],
- spaces((TABSTOP * (1 + flen / TABSTOP))
- - strlen(rpcb3hdr[i])));
- sprintf(lp, "%s%s", fieldbuf,
- spaces(cnt = ((TABSTOP * (1 + flen / TABSTOP))
- - flen)));
- lp += (flen + cnt);
- }
- printf("\n%s\n\n", linebuf);
-
- if (inf[RPCBVERS_3_STAT].info[RPCBPROC_CALLIT]) {
- printf("RPCB_RMTCALL (version 3) call statistics\n");
- print_rmtcallstat(RPCBVERS_3_STAT, &inf[RPCBVERS_3_STAT]);
- printf("\n");
- }
-
- if (inf[RPCBVERS_3_STAT].info[RPCBPROC_GETADDR]) {
- printf("RPCB_GETADDR (version 3) call statistics\n");
- print_getaddrstat(RPCBVERS_3_STAT, &inf[RPCBVERS_3_STAT]);
- printf("\n");
- }
-
- printf("RPCBIND (version 4) statistics\n");
-
- for (j = 0; j <= 9; j += 9) { /* Just two iterations for printing */
- lp = linebuf;
- for (i = j; i <= MAX(8, rpcb_highproc_4 - 9 + j); i++) {
- fieldbuf[0] = '\0';
- switch (i) {
- case RPCBPROC_SET:
- sprintf(fieldbuf, "%d/",
- inf[RPCBVERS_4_STAT].setinfo);
- break;
- case RPCBPROC_UNSET:
- sprintf(fieldbuf, "%d/",
- inf[RPCBVERS_4_STAT].unsetinfo);
- break;
- case RPCBPROC_GETADDR:
- cnt = 0;
- for (pa = inf[RPCBVERS_4_STAT].addrinfo; pa;
- pa = pa->next)
- cnt += pa->success;
- sprintf(fieldbuf, "%d/", cnt);
- break;
- case RPCBPROC_CALLIT:
- cnt = 0;
- for (pr = inf[RPCBVERS_4_STAT].rmtinfo; pr;
- pr = pr->next)
- cnt += pr->success;
- sprintf(fieldbuf, "%d/", cnt);
- break;
- default: break; /* For the remaining ones */
- }
- cp = &fieldbuf[0] + strlen(fieldbuf);
- /*
- * XXX: We also add RPCBPROC_GETADDRLIST queries to
- * RPCB_GETADDR because rpcbind includes the
- * RPCB_GETADDRLIST successes in RPCB_GETADDR.
- */
- if (i != RPCBPROC_GETADDR)
- sprintf(cp, "%d", inf[RPCBVERS_4_STAT].info[i]);
- else
- sprintf(cp, "%d", inf[RPCBVERS_4_STAT].info[i] +
- inf[RPCBVERS_4_STAT].info[RPCBPROC_GETADDRLIST]);
- flen = strlen(fieldbuf);
- printf("%s%s", rpcb4hdr[i],
- spaces((TABSTOP * (1 + flen / TABSTOP))
- - strlen(rpcb4hdr[i])));
- sprintf(lp, "%s%s", fieldbuf,
- spaces(cnt = ((TABSTOP * (1 + flen / TABSTOP))
- - flen)));
- lp += (flen + cnt);
- }
- printf("\n%s\n", linebuf);
- }
-
- if (inf[RPCBVERS_4_STAT].info[RPCBPROC_CALLIT] ||
- inf[RPCBVERS_4_STAT].info[RPCBPROC_INDIRECT]) {
- printf("\n");
- printf("RPCB_RMTCALL (version 4) call statistics\n");
- print_rmtcallstat(RPCBVERS_4_STAT, &inf[RPCBVERS_4_STAT]);
- }
-
- if (inf[RPCBVERS_4_STAT].info[RPCBPROC_GETADDR]) {
- printf("\n");
- printf("RPCB_GETADDR (version 4) call statistics\n");
- print_getaddrstat(RPCBVERS_4_STAT, &inf[RPCBVERS_4_STAT]);
- }
- clnt_destroy(client);
-}
-
-/*
- * Delete registeration for this (prog, vers, netid)
- */
-static void
-deletereg(char *netid, int argc, char **argv)
-{
- struct netconfig *nconf = NULL;
-
- if (argc != 2)
- usage();
- if (netid) {
- nconf = getnetconfigent(netid);
- if (nconf == NULL)
- errx(1, "netid %s not supported", netid);
- }
- if ((rpcb_unset(getprognum(argv[0]), getvers(argv[1]), nconf)) == 0)
- errx(1,
- "could not delete registration for prog %s version %s",
- argv[0], argv[1]);
-}
-
-/*
- * Create and return a handle for the given nconf.
- * Exit if cannot create handle.
- */
-static CLIENT *
-clnt_addr_create(char *address, struct netconfig *nconf,
- u_long prog, u_long vers)
-{
- CLIENT *client;
- static struct netbuf *nbuf;
- static int fd = RPC_ANYFD;
-
- if (fd == RPC_ANYFD) {
- if ((fd = __rpc_nconf2fd(nconf)) == -1) {
- rpc_createerr.cf_stat = RPC_TLIERROR;
- clnt_pcreateerror("rpcinfo");
- exit(1);
- }
- /* Convert the uaddr to taddr */
- nbuf = uaddr2taddr(nconf, address);
- if (nbuf == NULL)
- errx(1, "no address for client handle");
- }
- client = clnt_tli_create(fd, nconf, nbuf, prog, vers, 0, 0);
- if (client == (CLIENT *)NULL) {
- clnt_pcreateerror("rpcinfo");
- exit(1);
- }
- return (client);
-}
-
-/*
- * If the version number is given, ping that (prog, vers); else try to find
- * the version numbers supported for that prog and ping all the versions.
- * Remote rpcbind is not contacted for this service. The requests are
- * sent directly to the services themselves.
- */
-static void
-addrping(char *address, char *netid, int argc, char **argv)
-{
- CLIENT *client;
- struct timeval to;
- enum clnt_stat rpc_stat;
- u_long prognum, versnum, minvers, maxvers;
- struct rpc_err rpcerr;
- int failure = 0;
- struct netconfig *nconf;
- int fd;
-
- if (argc < 1 || argc > 2 || (netid == NULL))
- usage();
- nconf = getnetconfigent(netid);
- if (nconf == (struct netconfig *)NULL)
- errx(1, "could not find %s", netid);
- to.tv_sec = 10;
- to.tv_usec = 0;
- prognum = getprognum(argv[0]);
- if (argc == 1) { /* Version number not known */
- /*
- * A call to version 0 should fail with a program/version
- * mismatch, and give us the range of versions supported.
- */
- versnum = MIN_VERS;
- } else {
- versnum = getvers(argv[1]);
- }
- client = clnt_addr_create(address, nconf, prognum, versnum);
- rpc_stat = CLNT_CALL(client, NULLPROC, (xdrproc_t) xdr_void,
- (char *)NULL, (xdrproc_t) xdr_void,
- (char *)NULL, to);
- if (argc == 2) {
- /* Version number was known */
- if (pstatus(client, prognum, versnum) < 0)
- failure = 1;
- (void) CLNT_DESTROY(client);
- if (failure)
- exit(1);
- return;
- }
- /* Version number not known */
- (void) CLNT_CONTROL(client, CLSET_FD_NCLOSE, (char *)NULL);
- (void) CLNT_CONTROL(client, CLGET_FD, (char *)&fd);
- if (rpc_stat == RPC_PROGVERSMISMATCH) {
- clnt_geterr(client, &rpcerr);
- minvers = rpcerr.re_vers.low;
- maxvers = rpcerr.re_vers.high;
- } else if (rpc_stat == RPC_SUCCESS) {
- /*
- * Oh dear, it DOES support version 0.
- * Let's try version MAX_VERS.
- */
- (void) CLNT_DESTROY(client);
- client = clnt_addr_create(address, nconf, prognum, MAX_VERS);
- rpc_stat = CLNT_CALL(client, NULLPROC, (xdrproc_t) xdr_void,
- (char *)NULL, (xdrproc_t) xdr_void,
- (char *)NULL, to);
- if (rpc_stat == RPC_PROGVERSMISMATCH) {
- clnt_geterr(client, &rpcerr);
- minvers = rpcerr.re_vers.low;
- maxvers = rpcerr.re_vers.high;
- } else if (rpc_stat == RPC_SUCCESS) {
- /*
- * It also supports version MAX_VERS.
- * Looks like we have a wise guy.
- * OK, we give them information on all
- * 4 billion versions they support...
- */
- minvers = 0;
- maxvers = MAX_VERS;
- } else {
- (void) pstatus(client, prognum, MAX_VERS);
- exit(1);
- }
- } else {
- (void) pstatus(client, prognum, (u_long)0);
- exit(1);
- }
- (void) CLNT_DESTROY(client);
- for (versnum = minvers; versnum <= maxvers; versnum++) {
- client = clnt_addr_create(address, nconf, prognum, versnum);
- rpc_stat = CLNT_CALL(client, NULLPROC, (xdrproc_t) xdr_void,
- (char *)NULL, (xdrproc_t) xdr_void,
- (char *)NULL, to);
- if (pstatus(client, prognum, versnum) < 0)
- failure = 1;
- (void) CLNT_DESTROY(client);
- }
- (void) close(fd);
- if (failure)
- exit(1);
- return;
-}
-
-/*
- * If the version number is given, ping that (prog, vers); else try to find
- * the version numbers supported for that prog and ping all the versions.
- * Remote rpcbind is *contacted* for this service. The requests are
- * then sent directly to the services themselves.
- */
-static void
-progping(char *netid, int argc, char **argv)
-{
- CLIENT *client;
- struct timeval to;
- enum clnt_stat rpc_stat;
- u_long prognum, versnum, minvers, maxvers;
- struct rpc_err rpcerr;
- int failure = 0;
- struct netconfig *nconf;
-
- if (argc < 2 || argc > 3 || (netid == NULL))
- usage();
- prognum = getprognum(argv[1]);
- if (argc == 2) { /* Version number not known */
- /*
- * A call to version 0 should fail with a program/version
- * mismatch, and give us the range of versions supported.
- */
- versnum = MIN_VERS;
- } else {
- versnum = getvers(argv[2]);
- }
- if (netid) {
- nconf = getnetconfigent(netid);
- if (nconf == (struct netconfig *)NULL)
- errx(1, "could not find %s", netid);
- client = clnt_tp_create(argv[0], prognum, versnum, nconf);
- } else {
- client = clnt_create(argv[0], prognum, versnum, "NETPATH");
- }
- if (client == (CLIENT *)NULL) {
- clnt_pcreateerror("rpcinfo");
- exit(1);
- }
- to.tv_sec = 10;
- to.tv_usec = 0;
- rpc_stat = CLNT_CALL(client, NULLPROC, (xdrproc_t) xdr_void,
- (char *)NULL, (xdrproc_t) xdr_void,
- (char *)NULL, to);
- if (argc == 3) {
- /* Version number was known */
- if (pstatus(client, prognum, versnum) < 0)
- failure = 1;
- (void) CLNT_DESTROY(client);
- if (failure)
- exit(1);
- return;
- }
- /* Version number not known */
- if (rpc_stat == RPC_PROGVERSMISMATCH) {
- clnt_geterr(client, &rpcerr);
- minvers = rpcerr.re_vers.low;
- maxvers = rpcerr.re_vers.high;
- } else if (rpc_stat == RPC_SUCCESS) {
- /*
- * Oh dear, it DOES support version 0.
- * Let's try version MAX_VERS.
- */
- versnum = MAX_VERS;
- (void) CLNT_CONTROL(client, CLSET_VERS, (char *)&versnum);
- rpc_stat = CLNT_CALL(client, NULLPROC,
- (xdrproc_t) xdr_void, (char *)NULL,
- (xdrproc_t) xdr_void, (char *)NULL, to);
- if (rpc_stat == RPC_PROGVERSMISMATCH) {
- clnt_geterr(client, &rpcerr);
- minvers = rpcerr.re_vers.low;
- maxvers = rpcerr.re_vers.high;
- } else if (rpc_stat == RPC_SUCCESS) {
- /*
- * It also supports version MAX_VERS.
- * Looks like we have a wise guy.
- * OK, we give them information on all
- * 4 billion versions they support...
- */
- minvers = 0;
- maxvers = MAX_VERS;
- } else {
- (void) pstatus(client, prognum, MAX_VERS);
- exit(1);
- }
- } else {
- (void) pstatus(client, prognum, (u_long)0);
- exit(1);
- }
- for (versnum = minvers; versnum <= maxvers; versnum++) {
- (void) CLNT_CONTROL(client, CLSET_VERS, (char *)&versnum);
- rpc_stat = CLNT_CALL(client, NULLPROC, (xdrproc_t) xdr_void,
- (char *)NULL, (xdrproc_t) xdr_void,
- (char *)NULL, to);
- if (pstatus(client, prognum, versnum) < 0)
- failure = 1;
- }
- (void) CLNT_DESTROY(client);
- if (failure)
- exit(1);
- return;
-}
-
-static void
-usage()
-{
- fprintf(stderr, "usage: rpcinfo [-m | -s] [host]\n");
-#ifdef PORTMAP
- fprintf(stderr, " rpcinfo -p [host]\n");
-#endif
- fprintf(stderr, " rpcinfo -T netid host prognum [versnum]\n");
- fprintf(stderr, " rpcinfo -l host prognum versnum\n");
-#ifdef PORTMAP
- fprintf(stderr,
-" rpcinfo [-n portnum] -u | -t host prognum [versnum]\n");
-#endif
- fprintf(stderr,
-" rpcinfo -a serv_address -T netid prognum [version]\n");
- fprintf(stderr, " rpcinfo -b prognum versnum\n");
- fprintf(stderr, " rpcinfo -d [-T netid] prognum versnum\n");
- exit(1);
-}
-
-static u_long
-getprognum (char *arg)
-{
- char *strptr;
- register struct rpcent *rpc;
- register u_long prognum;
- char *tptr = arg;
-
- while (*tptr && isdigit(*tptr++));
- if (*tptr || isalpha(*(tptr - 1))) {
- rpc = getrpcbyname(arg);
- if (rpc == NULL)
- errx(1, "%s is unknown service", arg);
- prognum = rpc->r_number;
- } else {
- prognum = strtol(arg, &strptr, 10);
- if (strptr == arg || *strptr != '\0')
- errx(1, "%s is illegal program number", arg);
- }
- return (prognum);
-}
-
-static u_long
-getvers(char *arg)
-{
- char *strptr;
- register u_long vers;
-
- vers = (int) strtol(arg, &strptr, 10);
- if (strptr == arg || *strptr != '\0')
- errx(1, "%s is illegal version number", arg);
- return (vers);
-}
-
-/*
- * This routine should take a pointer to an "rpc_err" structure, rather than
- * a pointer to a CLIENT structure, but "clnt_perror" takes a pointer to
- * a CLIENT structure rather than a pointer to an "rpc_err" structure.
- * As such, we have to keep the CLIENT structure around in order to print
- * a good error message.
- */
-static int
-pstatus(register CLIENT *client, u_long prog, u_long vers)
-{
- struct rpc_err rpcerr;
-
- clnt_geterr(client, &rpcerr);
- if (rpcerr.re_status != RPC_SUCCESS) {
- clnt_perror(client, "rpcinfo");
- printf("program %lu version %lu is not available\n",
- prog, vers);
- return (-1);
- } else {
- printf("program %lu version %lu ready and waiting\n",
- prog, vers);
- return (0);
- }
-}
-
-static CLIENT *
-clnt_rpcbind_create(char *host, int rpcbversnum, struct netbuf **targaddr)
-{
- static char *tlist[3] = {
- "circuit_n", "circuit_v", "datagram_v"
- };
- int i;
- struct netconfig *nconf;
- CLIENT *clnt = NULL;
- void *handle;
-
- rpc_createerr.cf_stat = RPC_SUCCESS;
- for (i = 0; i < 3; i++) {
- if ((handle = __rpc_setconf(tlist[i])) == NULL)
- continue;
- while (clnt == (CLIENT *)NULL) {
- if ((nconf = __rpc_getconf(handle)) == NULL) {
- if (rpc_createerr.cf_stat == RPC_SUCCESS)
- rpc_createerr.cf_stat = RPC_UNKNOWNPROTO;
- break;
- }
- clnt = getclnthandle(host, nconf, rpcbversnum,
- targaddr);
- }
- if (clnt)
- break;
- __rpc_endconf(handle);
- }
- return (clnt);
-}
-
-static CLIENT*
-getclnthandle(char *host, struct netconfig *nconf,
- u_long rpcbversnum, struct netbuf **targaddr)
-{
- struct netbuf addr;
- struct addrinfo hints, *res;
- CLIENT *client = NULL;
-
- /* Get the address of the rpcbind */
- memset(&hints, 0, sizeof hints);
- if (getaddrinfo(host, "rpcbind", &hints, &res) != 0) {
- rpc_createerr.cf_stat = RPC_N2AXLATEFAILURE;
- return (NULL);
- }
- addr.len = addr.maxlen = res->ai_addrlen;
- addr.buf = res->ai_addr;
- client = clnt_tli_create(RPC_ANYFD, nconf, &addr, RPCBPROG,
- rpcbversnum, 0, 0);
- if (client) {
- if (targaddr != NULL) {
- *targaddr =
- (struct netbuf *)malloc(sizeof (struct netbuf));
- if (*targaddr != NULL) {
- (*targaddr)->maxlen = addr.maxlen;
- (*targaddr)->len = addr.len;
- (*targaddr)->buf = (char *)malloc(addr.len);
- if ((*targaddr)->buf != NULL) {
- memcpy((*targaddr)->buf, addr.buf,
- addr.len);
- }
- }
- }
- } else {
- if (rpc_createerr.cf_stat == RPC_TLIERROR) {
- /*
- * Assume that the other system is dead; this is a
- * better error to display to the user.
- */
- rpc_createerr.cf_stat = RPC_RPCBFAILURE;
- rpc_createerr.cf_error.re_status = RPC_FAILED;
- }
- }
- freeaddrinfo(res);
- return (client);
-}
-
-static void
-print_rmtcallstat(int rtype, rpcb_stat *infp)
-{
- register rpcbs_rmtcalllist_ptr pr;
- struct rpcent *rpc;
-
- if (rtype == RPCBVERS_4_STAT)
- printf(
- "prog\t\tvers\tproc\tnetid\tindirect success failure\n");
- else
- printf("prog\t\tvers\tproc\tnetid\tsuccess\tfailure\n");
- for (pr = infp->rmtinfo; pr; pr = pr->next) {
- rpc = getrpcbynumber(pr->prog);
- if (rpc)
- printf("%-16s", rpc->r_name);
- else
- printf("%-16d", pr->prog);
- printf("%d\t%d\t%s\t",
- pr->vers, pr->proc, pr->netid);
- if (rtype == RPCBVERS_4_STAT)
- printf("%d\t ", pr->indirect);
- printf("%d\t%d\n", pr->success, pr->failure);
- }
-}
-
-static void
-print_getaddrstat(int rtype, rpcb_stat *infp)
-{
- rpcbs_addrlist_ptr al;
- register struct rpcent *rpc;
-
- printf("prog\t\tvers\tnetid\t success\tfailure\n");
- for (al = infp->addrinfo; al; al = al->next) {
- rpc = getrpcbynumber(al->prog);
- if (rpc)
- printf("%-16s", rpc->r_name);
- else
- printf("%-16d", al->prog);
- printf("%d\t%s\t %-12d\t%d\n",
- al->vers, al->netid,
- al->success, al->failure);
- }
-}
-
-static char *
-spaces(int howmany)
-{
- static char space_array[] = /* 64 spaces */
- " ";
-
- if (howmany <= 0 || howmany > sizeof (space_array)) {
- return ("");
- }
- return (&space_array[sizeof (space_array) - howmany - 1]);
-}
diff --git a/usr.bin/rs/Makefile b/usr.bin/rs/Makefile
deleted file mode 100644
index 21da34d..0000000
--- a/usr.bin/rs/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-
-PROG= rs
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/rs/rs.1 b/usr.bin/rs/rs.1
deleted file mode 100644
index 4aa3382..0000000
--- a/usr.bin/rs/rs.1
+++ /dev/null
@@ -1,244 +0,0 @@
-.\" Copyright (c) 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)rs.1 8.2 (Berkeley) 12/30/93
-.\" $FreeBSD$
-.\"
-.Dd July 30, 2004
-.Dt RS 1
-.Os
-.Sh NAME
-.Nm rs
-.Nd reshape a data array
-.Sh SYNOPSIS
-.Nm
-.Oo
-.Fl Oo Cm csCS Oc Ns Op Ar x
-.Oo Cm kKgGw Oc Ns Op Ar N
-.Cm tTeEnyjhHmz
-.Oc
-.Op Ar rows Op Ar cols
-.Sh DESCRIPTION
-The
-.Nm
-utility reads the standard input, interpreting each line as a row
-of blank-separated entries in an array,
-transforms the array according to the options,
-and writes it on the standard output.
-With no arguments it transforms stream input into a columnar
-format convenient for terminal viewing.
-.Pp
-The shape of the input array is deduced from the number of lines
-and the number of columns on the first line.
-If that shape is inconvenient, a more useful one might be
-obtained by skipping some of the input with the
-.Fl k
-option.
-Other options control interpretation of the input columns.
-.Pp
-The shape of the output array is influenced by the
-.Ar rows
-and
-.Ar cols
-specifications, which should be positive integers.
-If only one of them is a positive integer,
-.Nm
-computes a value for the other which will accommodate
-all of the data.
-When necessary, missing data are supplied in a manner
-specified by the options and surplus data are deleted.
-There are options to control presentation of the output columns,
-including transposition of the rows and columns.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl c Ns Ar x
-Input columns are delimited by the single character
-.Ar x .
-A missing
-.Ar x
-is taken to be `^I'.
-.It Fl s Ns Ar x
-Like
-.Fl c ,
-but maximal strings of
-.Ar x
-are delimiters.
-.It Fl C Ns Ar x
-Output columns are delimited by the single character
-.Ar x .
-A missing
-.Ar x
-is taken to be `^I'.
-.It Fl S Ns Ar x
-Like
-.Fl C ,
-but padded strings of
-.Ar x
-are delimiters.
-.It Fl t
-Fill in the rows of the output array using the columns of the
-input array, that is, transpose the input while honoring any
-.Ar rows
-and
-.Ar cols
-specifications.
-.It Fl T
-Print the pure transpose of the input, ignoring any
-.Ar rows
-or
-.Ar cols
-specification.
-.It Fl k Ns Ar N
-Ignore the first
-.Ar N
-lines of input.
-.It Fl K Ns Ar N
-Like
-.Fl k ,
-but print the ignored lines.
-.It Fl g Ns Ar N
-The gutter width (inter-column space), normally 2, is taken to be
-.Ar N .
-.It Fl G Ns Ar N
-The gutter width has
-.Ar N
-percent of the maximum column width added to it.
-.It Fl e
-Consider each line of input as an array entry.
-.It Fl n
-On lines having fewer entries than the first line,
-use null entries to pad out the line.
-Normally, missing entries are taken from the next line of input.
-.It Fl y
-If there are too few entries to make up the output dimensions,
-pad the output by recycling the input from the beginning.
-Normally, the output is padded with blanks.
-.It Fl h
-Print the shape of the input array and do nothing else.
-The shape is just the number of lines and the number of
-entries on the first line.
-.It Fl H
-Like
-.Fl h ,
-but also print the length of each line.
-.It Fl j
-Right adjust entries within columns.
-.It Fl w Ns Ar N
-The width of the display, normally 80, is taken to be the positive
-integer
-.Ar N .
-.It Fl m
-Do not trim excess delimiters from the ends of the output array.
-.It Fl z
-Adapt column widths to fit the largest entries appearing in them.
-.El
-.Pp
-With no arguments,
-.Nm
-transposes its input, and assumes one array entry per input line
-unless the first non-ignored line is longer than the display width.
-Option letters which take numerical arguments interpret a missing
-number as zero unless otherwise indicated.
-.Sh EXAMPLES
-The
-.Nm
-utility can be used as a filter to convert the stream output
-of certain programs (e.g.,
-.Xr spell 1 ,
-.Xr du 1 ,
-.Xr file 1 ,
-.Xr look 1 ,
-.Xr nm 1 ,
-.Xr who 1 ,
-and
-.Xr wc 1 )
-into a convenient ``window'' format, as in
-.Bd -literal -offset indent
-% who | rs
-.Ed
-.Pp
-This function has been incorporated into the
-.Xr ls 1
-program, though for most programs with similar output
-.Nm
-suffices.
-.Pp
-To convert stream input into vector output and back again, use
-.Bd -literal -offset indent
-% rs 1 0 | rs 0 1
-.Ed
-.Pp
-A 10 by 10 array of random numbers from 1 to 100 and
-its transpose can be generated with
-.Bd -literal -offset indent
-% jot \-r 100 | rs 10 10 | tee array | rs \-T > tarray
-.Ed
-.Pp
-In the editor
-.Xr vi 1 ,
-a file consisting of a multi-line vector with 9 elements per line
-can undergo insertions and deletions,
-and then be neatly reshaped into 9 columns with
-.Bd -literal -offset indent
-:1,$!rs 0 9
-.Ed
-.Pp
-Finally, to sort a database by the first line of each 4-line field, try
-.Bd -literal -offset indent
-% rs \-eC 0 4 | sort | rs \-c 0 1
-.Ed
-.Sh SEE ALSO
-.Xr jot 1 ,
-.Xr pr 1 ,
-.Xr sort 1 ,
-.Xr vi 1
-.Sh HISTORY
-The
-.Nm
-utility first appeared in
-.Bx 4.2 .
-.Sh BUGS
-.Bl -item
-.It
-Handles only two dimensional arrays.
-.It
-The algorithm currently reads the whole file into memory,
-so files that do not fit in memory will not be reshaped.
-.It
-Fields cannot be defined yet on character positions.
-.It
-Re-ordering of columns is not yet possible.
-.It
-There are too many options.
-.It
-Multibyte characters are not recognized.
-.El
diff --git a/usr.bin/rs/rs.c b/usr.bin/rs/rs.c
deleted file mode 100644
index 82aaa9a..0000000
--- a/usr.bin/rs/rs.c
+++ /dev/null
@@ -1,548 +0,0 @@
-/*-
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static const char sccsid[] = "@(#)rs.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-
-/*
- * rs - reshape a data array
- * Author: John Kunze, Office of Comp. Affairs, UCB
- * BEWARE: lots of unfinished edges
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-long flags;
-#define TRANSPOSE 000001
-#define MTRANSPOSE 000002
-#define ONEPERLINE 000004
-#define ONEISEPONLY 000010
-#define ONEOSEPONLY 000020
-#define NOTRIMENDCOL 000040
-#define SQUEEZE 000100
-#define SHAPEONLY 000200
-#define DETAILSHAPE 000400
-#define RIGHTADJUST 001000
-#define NULLPAD 002000
-#define RECYCLE 004000
-#define SKIPPRINT 010000
-#define ICOLBOUNDS 020000
-#define OCOLBOUNDS 040000
-#define ONEPERCHAR 0100000
-#define NOARGS 0200000
-
-short *colwidths;
-short *cord;
-short *icbd;
-short *ocbd;
-int nelem;
-char **elem;
-char **endelem;
-char *curline;
-int allocsize = BUFSIZ;
-int curlen;
-int irows, icols;
-int orows = 0, ocols = 0;
-int maxlen;
-int skip;
-int propgutter;
-char isep = ' ', osep = ' ';
-char blank[] = "";
-int owidth = 80, gutter = 2;
-
-void getargs(int, char *[]);
-void getfile(void);
-int getline(void);
-char *getlist(short **, char *);
-char *getnum(int *, char *, int);
-char **getptrs(char **);
-void prepfile(void);
-void prints(char *, int);
-void putfile(void);
-static void usage(void);
-
-#define INCR(ep) do { \
- if (++ep >= endelem) \
- ep = getptrs(ep); \
-} while(0)
-
-int
-main(int argc, char *argv[])
-{
- getargs(argc, argv);
- getfile();
- if (flags & SHAPEONLY) {
- printf("%d %d\n", irows, icols);
- exit(0);
- }
- prepfile();
- putfile();
- exit(0);
-}
-
-void
-getfile(void)
-{
- char *p;
- char *endp;
- char **ep;
- int multisep = (flags & ONEISEPONLY ? 0 : 1);
- int nullpad = flags & NULLPAD;
- char **padto;
-
- while (skip--) {
- getline();
- if (flags & SKIPPRINT)
- puts(curline);
- }
- getline();
- if (flags & NOARGS && curlen < owidth)
- flags |= ONEPERLINE;
- if (flags & ONEPERLINE)
- icols = 1;
- else /* count cols on first line */
- for (p = curline, endp = curline + curlen; p < endp; p++) {
- if (*p == isep && multisep)
- continue;
- icols++;
- while (*p && *p != isep)
- p++;
- }
- ep = getptrs(elem);
- do {
- if (flags & ONEPERLINE) {
- *ep = curline;
- INCR(ep); /* prepare for next entry */
- if (maxlen < curlen)
- maxlen = curlen;
- irows++;
- continue;
- }
- for (p = curline, endp = curline + curlen; p < endp; p++) {
- if (*p == isep && multisep)
- continue; /* eat up column separators */
- if (*p == isep) /* must be an empty column */
- *ep = blank;
- else /* store column entry */
- *ep = p;
- while (p < endp && *p != isep)
- p++; /* find end of entry */
- *p = '\0'; /* mark end of entry */
- if (maxlen < p - *ep) /* update maxlen */
- maxlen = p - *ep;
- INCR(ep); /* prepare for next entry */
- }
- irows++; /* update row count */
- if (nullpad) { /* pad missing entries */
- padto = elem + irows * icols;
- while (ep < padto) {
- *ep = blank;
- INCR(ep);
- }
- }
- } while (getline() != EOF);
- *ep = 0; /* mark end of pointers */
- nelem = ep - elem;
-}
-
-void
-putfile(void)
-{
- char **ep;
- int i, j, k;
-
- ep = elem;
- if (flags & TRANSPOSE)
- for (i = 0; i < orows; i++) {
- for (j = i; j < nelem; j += orows)
- prints(ep[j], (j - i) / orows);
- putchar('\n');
- }
- else
- for (i = k = 0; i < orows; i++) {
- for (j = 0; j < ocols; j++, k++)
- if (k < nelem)
- prints(ep[k], j);
- putchar('\n');
- }
-}
-
-void
-prints(char *s, int col)
-{
- int n;
- char *p = s;
-
- while (*p)
- p++;
- n = (flags & ONEOSEPONLY ? 1 : colwidths[col] - (p - s));
- if (flags & RIGHTADJUST)
- while (n-- > 0)
- putchar(osep);
- for (p = s; *p; p++)
- putchar(*p);
- while (n-- > 0)
- putchar(osep);
-}
-
-static void
-usage(void)
-{
- fprintf(stderr,
- "usage: rs [-[csCS][x][kKgGw][N]tTeEnyjhHmz] [rows [cols]]\n");
- exit(1);
-}
-
-void
-prepfile(void)
-{
- char **ep;
- int i;
- int j;
- char **lp;
- int colw;
- int max;
- int n;
-
- if (!nelem)
- exit(0);
- gutter += maxlen * propgutter / 100.0;
- colw = maxlen + gutter;
- if (flags & MTRANSPOSE) {
- orows = icols;
- ocols = irows;
- }
- else if (orows == 0 && ocols == 0) { /* decide rows and cols */
- ocols = owidth / colw;
- if (ocols == 0) {
- warnx("display width %d is less than column width %d",
- owidth, colw);
- ocols = 1;
- }
- if (ocols > nelem)
- ocols = nelem;
- orows = nelem / ocols + (nelem % ocols ? 1 : 0);
- }
- else if (orows == 0) /* decide on rows */
- orows = nelem / ocols + (nelem % ocols ? 1 : 0);
- else if (ocols == 0) /* decide on cols */
- ocols = nelem / orows + (nelem % orows ? 1 : 0);
- lp = elem + orows * ocols;
- while (lp > endelem) {
- getptrs(elem + nelem);
- lp = elem + orows * ocols;
- }
- if (flags & RECYCLE) {
- for (ep = elem + nelem; ep < lp; ep++)
- *ep = *(ep - nelem);
- nelem = lp - elem;
- }
- if (!(colwidths = (short *) malloc(ocols * sizeof(short))))
- errx(1, "malloc");
- if (flags & SQUEEZE) {
- ep = elem;
- if (flags & TRANSPOSE)
- for (i = 0; i < ocols; i++) {
- max = 0;
- for (j = 0; *ep != NULL && j < orows; j++)
- if ((n = strlen(*ep++)) > max)
- max = n;
- colwidths[i] = max + gutter;
- }
- else
- for (i = 0; i < ocols; i++) {
- max = 0;
- for (j = i; j < nelem; j += ocols)
- if ((n = strlen(ep[j])) > max)
- max = n;
- colwidths[i] = max + gutter;
- }
- }
- /* for (i = 0; i < orows; i++) {
- for (j = i; j < nelem; j += orows)
- prints(ep[j], (j - i) / orows);
- putchar('\n');
- }
- else
- for (i = 0; i < orows; i++) {
- for (j = 0; j < ocols; j++)
- prints(*ep++, j);
- putchar('\n');
- }*/
- else
- for (i = 0; i < ocols; i++)
- colwidths[i] = colw;
- if (!(flags & NOTRIMENDCOL)) {
- if (flags & RIGHTADJUST)
- colwidths[0] -= gutter;
- else
- colwidths[ocols - 1] = 0;
- }
- n = orows * ocols;
- if (n > nelem && (flags & RECYCLE))
- nelem = n;
- /*for (i = 0; i < ocols; i++)
- warnx("%d is colwidths, nelem %d", colwidths[i], nelem);*/
-}
-
-#define BSIZE 2048
-char ibuf[BSIZE]; /* two screenfuls should do */
-
-int
-getline(void) /* get line; maintain curline, curlen; manage storage */
-{
- static int putlength;
- static char *endblock = ibuf + BSIZE;
- char *p;
- int c, i;
-
- if (!irows) {
- curline = ibuf;
- putlength = flags & DETAILSHAPE;
- }
- else if (skip <= 0) { /* don't waste storage */
- curline += curlen + 1;
- if (putlength) { /* print length, recycle storage */
- printf(" %d line %d\n", curlen, irows);
- curline = ibuf;
- }
- }
- if (!putlength && endblock - curline < BUFSIZ) { /* need storage */
- /*ww = endblock-curline; tt += ww;*/
- /*printf("#wasted %d total %d\n",ww,tt);*/
- if (!(curline = (char *) malloc(BSIZE)))
- errx(1, "file too large");
- endblock = curline + BSIZE;
- /*printf("#endb %d curline %d\n",endblock,curline);*/
- }
- for (p = curline, i = 1; i < BUFSIZ; *p++ = c, i++)
- if ((c = getchar()) == EOF || c == '\n')
- break;
- *p = '\0';
- curlen = i - 1;
- return(c);
-}
-
-char **
-getptrs(char **sp)
-{
- char **p;
-
- allocsize += allocsize;
- p = (char **)realloc(elem, allocsize * sizeof(char *));
- if (p == NULL)
- err(1, "no memory");
-
- sp += (p - elem);
- endelem = (elem = p) + allocsize;
- return(sp);
-}
-
-void
-getargs(int ac, char *av[])
-{
- char *p;
-
- if (ac == 1) {
- flags |= NOARGS | TRANSPOSE;
- }
- while (--ac && **++av == '-')
- for (p = *av+1; *p; p++)
- switch (*p) {
- case 'T':
- flags |= MTRANSPOSE;
- case 't':
- flags |= TRANSPOSE;
- break;
- case 'c': /* input col. separator */
- flags |= ONEISEPONLY;
- case 's': /* one or more allowed */
- if (p[1])
- isep = *++p;
- else
- isep = '\t'; /* default is ^I */
- break;
- case 'C':
- flags |= ONEOSEPONLY;
- case 'S':
- if (p[1])
- osep = *++p;
- else
- osep = '\t'; /* default is ^I */
- break;
- case 'w': /* window width, default 80 */
- p = getnum(&owidth, p, 0);
- if (owidth <= 0)
- errx(1, "width must be a positive integer");
- break;
- case 'K': /* skip N lines */
- flags |= SKIPPRINT;
- case 'k': /* skip, do not print */
- p = getnum(&skip, p, 0);
- if (!skip)
- skip = 1;
- break;
- case 'm':
- flags |= NOTRIMENDCOL;
- break;
- case 'g': /* gutter space */
- p = getnum(&gutter, p, 0);
- break;
- case 'G':
- p = getnum(&propgutter, p, 0);
- break;
- case 'e': /* each line is an entry */
- flags |= ONEPERLINE;
- break;
- case 'E':
- flags |= ONEPERCHAR;
- break;
- case 'j': /* right adjust */
- flags |= RIGHTADJUST;
- break;
- case 'n': /* null padding for missing values */
- flags |= NULLPAD;
- break;
- case 'y':
- flags |= RECYCLE;
- break;
- case 'H': /* print shape only */
- flags |= DETAILSHAPE;
- case 'h':
- flags |= SHAPEONLY;
- break;
- case 'z': /* squeeze col width */
- flags |= SQUEEZE;
- break;
- /*case 'p':
- ipagespace = atoi(++p); (default is 1)
- break;*/
- case 'o': /* col order */
- p = getlist(&cord, p);
- break;
- case 'b':
- flags |= ICOLBOUNDS;
- p = getlist(&icbd, p);
- break;
- case 'B':
- flags |= OCOLBOUNDS;
- p = getlist(&ocbd, p);
- break;
- default:
- usage();
- }
- /*if (!osep)
- osep = isep;*/
- switch (ac) {
- /*case 3:
- opages = atoi(av[2]);*/
- case 2:
- if ((ocols = atoi(av[1])) < 0)
- ocols = 0;
- case 1:
- if ((orows = atoi(av[0])) < 0)
- orows = 0;
- case 0:
- break;
- default:
- errx(1, "too many arguments");
- }
-}
-
-char *
-getlist(short **list, char *p)
-{
- int count = 1;
- char *t;
-
- for (t = p + 1; *t; t++) {
- if (!isdigit((unsigned char)*t))
- errx(1,
- "option %.1s requires a list of unsigned numbers separated by commas", t);
- count++;
- while (*t && isdigit((unsigned char)*t))
- t++;
- if (*t != ',')
- break;
- }
- if (!(*list = (short *) malloc(count * sizeof(short))))
- errx(1, "no list space");
- count = 0;
- for (t = p + 1; *t; t++) {
- (*list)[count++] = atoi(t);
- printf("++ %d ", (*list)[count-1]);
- fflush(stdout);
- while (*t && isdigit((unsigned char)*t))
- t++;
- if (*t != ',')
- break;
- }
- (*list)[count] = 0;
- return(t - 1);
-}
-
-/*
- * num = number p points to; if (strict) complain
- * returns pointer to end of num
- */
-char *
-getnum(int *num, char *p, int strict)
-{
- char *t = p;
-
- if (!isdigit((unsigned char)*++t)) {
- if (strict || *t == '-' || *t == '+')
- errx(1, "option %.1s requires an unsigned integer", p);
- *num = 0;
- return(p);
- }
- *num = atoi(t);
- while (*++t)
- if (!isdigit((unsigned char)*t))
- break;
- return(--t);
-}
diff --git a/usr.bin/rsh/Makefile b/usr.bin/rsh/Makefile
deleted file mode 100644
index cf052f7..0000000
--- a/usr.bin/rsh/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 7/19/93
-# $FreeBSD$
-
-PROG= rsh
-CFLAGS+=-I${.CURDIR}/../../libexec/rlogind
-
-BINOWN= root
-BINMODE=4555
-PRECIOUSPROG=
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/rsh/rsh.1 b/usr.bin/rsh/rsh.1
deleted file mode 100644
index ee5d0dd..0000000
--- a/usr.bin/rsh/rsh.1
+++ /dev/null
@@ -1,178 +0,0 @@
-.\" Copyright (c) 1983, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)rsh.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd October 16, 2002
-.Dt RSH 1
-.Os
-.Sh NAME
-.Nm rsh
-.Nd remote shell
-.Sh SYNOPSIS
-.Nm
-.Op Fl 46dn
-.Op Fl l Ar username
-.Op Fl t Ar timeout
-.Ar host
-.Op command
-.Sh DESCRIPTION
-The
-.Nm
-utility executes
-.Ar command
-on
-.Ar host .
-.Pp
-The
-.Nm
-utility copies its standard input to the remote command, the standard
-output of the remote command to its standard output, and the
-standard error of the remote command to its standard error.
-Interrupt, quit and terminate signals are propagated to the remote
-command;
-.Nm
-normally terminates when the remote command does.
-The options are as follows:
-.Bl -tag -width flag
-.It Fl 4
-Use IPv4 addresses only.
-.It Fl 6
-Use IPv6 addresses only.
-.It Fl d
-Turn on socket debugging (using
-.Xr setsockopt 2 )
-on the
-.Tn TCP
-sockets used for communication with the remote host.
-.It Fl l Ar username
-Allow the remote
-.Ar username
-to be specified.
-By default, the remote username is the same as the local username.
-Authorization is determined
-as in
-.Xr rlogin 1 .
-.It Fl n
-Redirect input from the special device
-.Pa /dev/null
-(see the
-.Sx BUGS
-section of this manual page).
-.It Fl t Ar timeout
-Allow a
-.Ar timeout
-to be specified (in seconds).
-If no
-data is sent or received in this time,
-.Nm
-will exit.
-.El
-.Pp
-If no
-.Ar command
-is specified, you will be logged in on the remote host using
-.Xr rlogin 1 .
-.Pp
-Shell metacharacters which are not quoted are interpreted on local machine,
-while quoted metacharacters are interpreted on the remote machine.
-For example, the command
-.Pp
-.Dl rsh otherhost cat remotefile >> localfile
-.Pp
-appends the remote file
-.Ar remotefile
-to the local file
-.Ar localfile ,
-while
-.Pp
-.Dl rsh otherhost cat remotefile \&">>\&" other_remotefile
-.Pp
-appends
-.Ar remotefile
-to
-.Ar other_remotefile .
-.\" .Pp
-.\" Many sites specify a large number of host names as commands in the
-.\" directory /usr/hosts.
-.\" If this directory is included in your search path, you can use the
-.\" shorthand ``host command'' for the longer form ``rsh host command''.
-.Sh FILES
-.Bl -tag -width /etc/hosts -compact
-.It Pa /etc/hosts
-.It Pa /etc/auth.conf
-.El
-.Sh SEE ALSO
-.Xr rlogin 1 ,
-.Xr setsockopt 2 ,
-.Xr rcmd 3 ,
-.Xr ruserok 3 ,
-.Xr auth.conf 5 ,
-.Xr hosts 5 ,
-.Xr hosts.equiv 5 ,
-.Xr rlogind 8 ,
-.Xr rshd 8
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.2 .
-.Sh BUGS
-If you are using
-.Xr csh 1
-and put a
-.Nm
-in the background without redirecting its input away from the terminal,
-it will block even if no reads are posted by the remote command.
-If no input is desired you should redirect the input of
-.Nm
-to
-.Pa /dev/null
-using the
-.Fl n
-option.
-.Pp
-You cannot run an interactive command
-(like
-.Xr ee 1
-or
-.Xr vi 1 )
-using
-.Nm ;
-use
-.Xr rlogin 1
-instead.
-.Pp
-Stop signals stop the local
-.Nm
-process only; this is arguably wrong, but currently hard to fix for reasons
-too complicated to explain here.
diff --git a/usr.bin/rsh/rsh.c b/usr.bin/rsh/rsh.c
deleted file mode 100644
index a366830..0000000
--- a/usr.bin/rsh/rsh.c
+++ /dev/null
@@ -1,376 +0,0 @@
-/*-
- * Copyright (c) 1983, 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 2002 Networks Associates Technology, Inc.
- * All rights reserved.
- *
- * Portions of this software were developed for the FreeBSD Project by
- * ThinkSec AS and NAI Labs, the Security Research Division of Network
- * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
- * ("CBOSS"), as part of the DARPA CHATS research program.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1983, 1990, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static const char sccsid[] = "From: @(#)rsh.c 8.3 (Berkeley) 4/6/94";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/signal.h>
-#include <sys/socket.h>
-#include <sys/ioctl.h>
-#include <sys/file.h>
-#include <sys/time.h>
-
-#include <netinet/in.h>
-#include <netdb.h>
-
-#include <err.h>
-#include <errno.h>
-#include <libutil.h>
-#include <paths.h>
-#include <pwd.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-/*
- * rsh - remote shell
- */
-int rfd2;
-
-int family = PF_UNSPEC;
-char rlogin[] = "rlogin";
-
-void connect_timeout(int);
-char *copyargs(char * const *);
-void sendsig(int);
-void talk(int, long, pid_t, int, int);
-void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- struct passwd const *pw;
- struct servent const *sp;
- long omask;
- int argoff, asrsh, ch, dflag, nflag, one, rem;
- pid_t pid = 0;
- uid_t uid;
- char *args, *host, *p, *user;
- int timeout = 0;
-
- argoff = asrsh = dflag = nflag = 0;
- one = 1;
- host = user = NULL;
-
- /* if called as something other than "rsh", use it as the host name */
- if ((p = strrchr(argv[0], '/')))
- ++p;
- else
- p = argv[0];
- if (strcmp(p, "rsh"))
- host = p;
- else
- asrsh = 1;
-
- /* handle "rsh host flags" */
- if (!host && argc > 2 && argv[1][0] != '-') {
- host = argv[1];
- argoff = 1;
- }
-
-#define OPTIONS "468Lde:l:nt:w"
- while ((ch = getopt(argc - argoff, argv + argoff, OPTIONS)) != -1)
- switch(ch) {
- case '4':
- family = PF_INET;
- break;
-
- case '6':
- family = PF_INET6;
- break;
-
- case 'L': /* -8Lew are ignored to allow rlogin aliases */
- case 'e':
- case 'w':
- case '8':
- break;
- case 'd':
- dflag = 1;
- break;
- case 'l':
- user = optarg;
- break;
- case 'n':
- nflag = 1;
- break;
- case 't':
- timeout = atoi(optarg);
- break;
- case '?':
- default:
- usage();
- }
- optind += argoff;
-
- /* if haven't gotten a host yet, do so */
- if (!host && !(host = argv[optind++]))
- usage();
-
- /* if no further arguments, must have been called as rlogin. */
- if (!argv[optind]) {
- if (asrsh)
- *argv = rlogin;
- execv(_PATH_RLOGIN, argv);
- err(1, "can't exec %s", _PATH_RLOGIN);
- }
-
- argc -= optind;
- argv += optind;
-
- if (!(pw = getpwuid(uid = getuid())))
- errx(1, "unknown user id");
- if (!user)
- user = pw->pw_name;
-
- args = copyargs(argv);
-
- sp = NULL;
- if (sp == NULL)
- sp = getservbyname("shell", "tcp");
- if (sp == NULL)
- errx(1, "shell/tcp: unknown service");
-
- if (timeout) {
- signal(SIGALRM, connect_timeout);
- alarm(timeout);
- }
- rem = rcmd_af(&host, sp->s_port, pw->pw_name, user, args, &rfd2,
- family);
- if (timeout) {
- signal(SIGALRM, SIG_DFL);
- alarm(0);
- }
-
- if (rem < 0)
- exit(1);
-
- if (rfd2 < 0)
- errx(1, "can't establish stderr");
- if (dflag) {
- if (setsockopt(rem, SOL_SOCKET, SO_DEBUG, &one,
- sizeof(one)) < 0)
- warn("setsockopt");
- if (setsockopt(rfd2, SOL_SOCKET, SO_DEBUG, &one,
- sizeof(one)) < 0)
- warn("setsockopt");
- }
-
- (void)setuid(uid);
- omask = sigblock(sigmask(SIGINT)|sigmask(SIGQUIT)|sigmask(SIGTERM));
- if (signal(SIGINT, SIG_IGN) != SIG_IGN)
- (void)signal(SIGINT, sendsig);
- if (signal(SIGQUIT, SIG_IGN) != SIG_IGN)
- (void)signal(SIGQUIT, sendsig);
- if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
- (void)signal(SIGTERM, sendsig);
-
- if (!nflag) {
- pid = fork();
- if (pid < 0)
- err(1, "fork");
- }
- else
- (void)shutdown(rem, SHUT_WR);
-
- (void)ioctl(rfd2, FIONBIO, &one);
- (void)ioctl(rem, FIONBIO, &one);
-
- talk(nflag, omask, pid, rem, timeout);
-
- if (!nflag)
- (void)kill(pid, SIGKILL);
- exit(0);
-}
-
-void
-talk(int nflag, long omask, pid_t pid, int rem, int timeout)
-{
- int cc, wc;
- fd_set readfrom, ready, rembits;
- char buf[BUFSIZ];
- const char *bp;
- struct timeval tvtimeout;
- int nfds, srval;
-
- if (!nflag && pid == 0) {
- (void)close(rfd2);
-
-reread: errno = 0;
- if ((cc = read(0, buf, sizeof buf)) <= 0)
- goto done;
- bp = buf;
-
-rewrite:
- if (rem >= FD_SETSIZE)
- errx(1, "descriptor too big");
- FD_ZERO(&rembits);
- FD_SET(rem, &rembits);
- nfds = rem + 1;
- if (select(nfds, 0, &rembits, 0, 0) < 0) {
- if (errno != EINTR)
- err(1, "select");
- goto rewrite;
- }
- if (!FD_ISSET(rem, &rembits))
- goto rewrite;
- wc = write(rem, bp, cc);
- if (wc < 0) {
- if (errno == EWOULDBLOCK)
- goto rewrite;
- goto done;
- }
- bp += wc;
- cc -= wc;
- if (cc == 0)
- goto reread;
- goto rewrite;
-done:
- (void)shutdown(rem, SHUT_WR);
- exit(0);
- }
-
- tvtimeout.tv_sec = timeout;
- tvtimeout.tv_usec = 0;
-
- (void)sigsetmask(omask);
- if (rfd2 >= FD_SETSIZE || rem >= FD_SETSIZE)
- errx(1, "descriptor too big");
- FD_ZERO(&readfrom);
- FD_SET(rfd2, &readfrom);
- FD_SET(rem, &readfrom);
- nfds = MAX(rfd2+1, rem+1);
- do {
- ready = readfrom;
- if (timeout) {
- srval = select(nfds, &ready, 0, 0, &tvtimeout);
- } else {
- srval = select(nfds, &ready, 0, 0, 0);
- }
-
- if (srval < 0) {
- if (errno != EINTR)
- err(1, "select");
- continue;
- }
- if (srval == 0)
- errx(1, "timeout reached (%d seconds)", timeout);
- if (FD_ISSET(rfd2, &ready)) {
- errno = 0;
- cc = read(rfd2, buf, sizeof buf);
- if (cc <= 0) {
- if (errno != EWOULDBLOCK)
- FD_CLR(rfd2, &readfrom);
- } else
- (void)write(STDERR_FILENO, buf, cc);
- }
- if (FD_ISSET(rem, &ready)) {
- errno = 0;
- cc = read(rem, buf, sizeof buf);
- if (cc <= 0) {
- if (errno != EWOULDBLOCK)
- FD_CLR(rem, &readfrom);
- } else
- (void)write(STDOUT_FILENO, buf, cc);
- }
- } while (FD_ISSET(rfd2, &readfrom) || FD_ISSET(rem, &readfrom));
-}
-
-void
-connect_timeout(int sig)
-{
- char message[] = "timeout reached before connection completed.\n";
-
- write(STDERR_FILENO, message, sizeof(message) - 1);
- _exit(1);
-}
-
-void
-sendsig(int sig)
-{
- char signo;
-
- signo = sig;
- (void)write(rfd2, &signo, 1);
-}
-
-char *
-copyargs(char * const *argv)
-{
- int cc;
- char *args, *p;
- char * const *ap;
-
- cc = 0;
- for (ap = argv; *ap; ++ap)
- cc += strlen(*ap) + 1;
- if (!(args = malloc((u_int)cc)))
- err(1, NULL);
- for (p = args, ap = argv; *ap; ++ap) {
- (void)strcpy(p, *ap);
- for (p = strcpy(p, *ap); *p; ++p);
- if (ap[1])
- *p++ = ' ';
- }
- return (args);
-}
-
-void
-usage(void)
-{
-
- (void)fprintf(stderr,
- "usage: rsh [-46dn] [-l username] [-t timeout] host [command]\n");
- exit(1);
-}
diff --git a/usr.bin/rup/Makefile b/usr.bin/rup/Makefile
deleted file mode 100644
index 6d32977..0000000
--- a/usr.bin/rup/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# $FreeBSD$
-
-PROG= rup
-
-DPADD= ${LIBRPCSVC}
-LDADD= -lrpcsvc
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/rup/rup.1 b/usr.bin/rup/rup.1
deleted file mode 100644
index fca4cdb..0000000
--- a/usr.bin/rup/rup.1
+++ /dev/null
@@ -1,99 +0,0 @@
-.\" -*- nroff -*-
-.\"
-.\" Copyright (c) 1985, 1991 The Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd June 7, 1993
-.Dt RUP 1
-.Os
-.Sh NAME
-.Nm rup
-.Nd remote status display
-.Sh SYNOPSIS
-.Nm
-.Op Ar host ...
-.Sh DESCRIPTION
-The
-.Nm
-utility displays a summary of the current system status of a particular
-.Ar host
-or all hosts on the local network.
-The output shows the current time of day, how long the system has
-been up,
-and the load averages.
-The load average numbers give the number of jobs in the run queue
-averaged over 1, 5 and 15 minutes.
-.Pp
-The
-.Xr rpc.rstatd 8
-daemon must be running on the remote host for this command to
-work.
-The
-.Nm
-utility uses an RPC protocol defined in
-.In rpcsvc/rstat.x .
-.Sh EXAMPLES
-.Bd -literal
-example% rup otherhost
-otherhost 7:36am up 6 days, 16:45, load average: 0.20, 0.23, 0.18
-example%
-.Ed
-.Sh DIAGNOSTICS
-.Bl -diag
-.It rup: RPC: Program not registered
-The
-.Xr rpc.rstatd 8
-daemon has not been started on the remote host.
-.It rup: RPC: Timed out
-A communication error occurred.
-Either the network is
-excessively congested, or the
-.Xr rpc.rstatd 8
-daemon has terminated on the remote host.
-.It rup: RPC: Port mapper failure - RPC: Timed out
-The remote host is not running the portmapper (see
-.Xr rpcbind 8 ) ,
-and cannot accommodate any RPC-based services.
-The host may be down.
-.El
-.Sh SEE ALSO
-.Xr rpcbind 8 ,
-.Xr rpc.rstatd 8
-.Sh HISTORY
-The
-.Nm
-command
-appeared in
-.Tn Sun-OS .
-.Sh BUGS
-The sorting options are not implemented.
diff --git a/usr.bin/rup/rup.c b/usr.bin/rup/rup.c
deleted file mode 100644
index 239b313..0000000
--- a/usr.bin/rup/rup.c
+++ /dev/null
@@ -1,254 +0,0 @@
-/*-
- * Copyright (c) 1993, John Brezak
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/socket.h>
-
-#include <rpc/rpc.h>
-#include <rpc/pmap_clnt.h>
-
-#undef FSHIFT /* Use protocol's shift and scale values */
-#undef FSCALE
-
-#include <rpcsvc/rstat.h>
-
-#include <arpa/inet.h>
-
-#include <err.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <time.h>
-#include <unistd.h>
-
-#define HOST_WIDTH 15
-
-struct host_list {
- struct host_list *next;
- struct in_addr addr;
-} *hosts;
-
-static int
-search_host(struct in_addr addr)
-{
- struct host_list *hp;
-
- if (!hosts)
- return(0);
-
- for (hp = hosts; hp != NULL; hp = hp->next) {
- if (hp->addr.s_addr == addr.s_addr)
- return(1);
- }
- return(0);
-}
-
-static void
-remember_host(struct in_addr addr)
-{
- struct host_list *hp;
-
- if (!(hp = (struct host_list *)malloc(sizeof(struct host_list))))
- errx(1, "no memory");
- hp->addr.s_addr = addr.s_addr;
- hp->next = hosts;
- hosts = hp;
-}
-
-static bool_t
-rstat_reply(caddr_t replyp, struct sockaddr_in *raddrp)
-{
- struct tm *tmp_time;
- struct tm host_time;
- struct tm host_uptime;
- char days_buf[16];
- char hours_buf[16];
- struct hostent *hp;
- char *host;
- statstime *host_stat = (statstime *)replyp;
- time_t tmp_time_t;
-
- if (search_host(raddrp->sin_addr))
- return(0);
-
- hp = gethostbyaddr((char *)&raddrp->sin_addr.s_addr,
- sizeof(struct in_addr), AF_INET);
- if (hp)
- host = hp->h_name;
- else
- host = inet_ntoa(raddrp->sin_addr);
-
- /* truncate hostname to fit nicely into field */
- if (strlen(host) > HOST_WIDTH)
- host[HOST_WIDTH] = '\0';
-
- printf("%-*s\t", HOST_WIDTH, host);
-
- if (sizeof(time_t) == sizeof(host_stat->curtime.tv_sec)) {
- tmp_time = localtime((time_t *)&host_stat->curtime.tv_sec);
- host_time = *tmp_time;
-
- host_stat->curtime.tv_sec -= host_stat->boottime.tv_sec;
-
- tmp_time = gmtime((time_t *)&host_stat->curtime.tv_sec);
- host_uptime = *tmp_time;
- }
- else { /* non-32-bit time_t */
- tmp_time_t = host_stat->curtime.tv_sec;
- tmp_time = localtime(&tmp_time_t);
- host_time = *tmp_time;
-
- host_stat->curtime.tv_sec -= host_stat->boottime.tv_sec;
-
- tmp_time_t = host_stat->curtime.tv_sec;
- tmp_time = gmtime(&tmp_time_t);
- host_uptime = *tmp_time;
- }
-
- #define updays (host_stat->curtime.tv_sec / 86400)
- if (host_uptime.tm_yday != 0)
- sprintf(days_buf, "%3d day%s, ", updays,
- (updays > 1) ? "s" : "");
- else
- days_buf[0] = '\0';
-
- if (host_uptime.tm_hour != 0)
- sprintf(hours_buf, "%2d:%02d, ",
- host_uptime.tm_hour, host_uptime.tm_min);
- else
- if (host_uptime.tm_min != 0)
- sprintf(hours_buf, "%2d mins, ", host_uptime.tm_min);
- else if (host_stat->curtime.tv_sec < 60)
- sprintf(hours_buf, "%2d secs, ", host_uptime.tm_sec);
- else
- hours_buf[0] = '\0';
-
- printf(" %2d:%02d%cm up %9.9s%9.9s load average: %.2f %.2f %.2f\n",
- (host_time.tm_hour % 12) ? host_time.tm_hour % 12 : 12,
- host_time.tm_min,
- (host_time.tm_hour >= 12) ? 'p' : 'a',
- days_buf,
- hours_buf,
- (double)host_stat->avenrun[0]/FSCALE,
- (double)host_stat->avenrun[1]/FSCALE,
- (double)host_stat->avenrun[2]/FSCALE);
-
- remember_host(raddrp->sin_addr);
- return(0);
-}
-
-static int
-onehost(char *host)
-{
- CLIENT *rstat_clnt;
- statstime host_stat;
- struct sockaddr_in addr;
- struct hostent *hp;
- struct timeval tv;
-
- hp = gethostbyname(host);
- if (hp == NULL) {
- warnx("unknown host \"%s\"", host);
- return(-1);
- }
-
- rstat_clnt = clnt_create(host, RSTATPROG, RSTATVERS_TIME, "udp");
- if (rstat_clnt == NULL) {
- warnx("%s %s", host, clnt_spcreateerror(""));
- return(-1);
- }
-
- bzero((char *)&host_stat, sizeof(host_stat));
- tv.tv_sec = 15; /* XXX ??? */
- tv.tv_usec = 0;
- if (clnt_call(rstat_clnt, RSTATPROC_STATS,
- (xdrproc_t)xdr_void, NULL,
- (xdrproc_t)xdr_statstime, &host_stat, tv) != RPC_SUCCESS) {
- warnx("%s: %s", host, clnt_sperror(rstat_clnt, host));
- clnt_destroy(rstat_clnt);
- return(-1);
- }
-
- addr.sin_addr.s_addr = *(int *)hp->h_addr;
- rstat_reply((caddr_t)&host_stat, &addr);
- clnt_destroy(rstat_clnt);
- return (0);
-}
-
-static void
-allhosts(void)
-{
- statstime host_stat;
- enum clnt_stat clnt_stat;
-
- clnt_stat = clnt_broadcast(RSTATPROG, RSTATVERS_TIME, RSTATPROC_STATS,
- (xdrproc_t)xdr_void, NULL,
- (xdrproc_t)xdr_statstime, &host_stat,
- (resultproc_t)rstat_reply);
- if (clnt_stat != RPC_SUCCESS && clnt_stat != RPC_TIMEDOUT)
- errx(1, "%s", clnt_sperrno(clnt_stat));
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: rup [host ...]\n");
- exit(1);
-}
-
-int
-main(int argc, char *argv[])
-{
- int ch;
-
- while ((ch = getopt(argc, argv, "?")) != -1)
- switch (ch) {
- default:
- usage();
- /*NOTREACHED*/
- }
-
- setlinebuf(stdout);
- if (argc == optind)
- allhosts();
- else {
- for (; optind < argc; optind++)
- (void) onehost(argv[optind]);
- }
- exit(0);
-}
diff --git a/usr.bin/ruptime/Makefile b/usr.bin/ruptime/Makefile
deleted file mode 100644
index 57f1e15..0000000
--- a/usr.bin/ruptime/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-
-PROG= ruptime
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ruptime/ruptime.1 b/usr.bin/ruptime/ruptime.1
deleted file mode 100644
index 3d09381..0000000
--- a/usr.bin/ruptime/ruptime.1
+++ /dev/null
@@ -1,94 +0,0 @@
-.\" Copyright (c) 1983, 1990, 1993, 1994
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)ruptime.1 8.2 (Berkeley) 4/5/94
-.\" $FreeBSD$
-.\"
-.Dd March 1, 2003
-.Dt RUPTIME 1
-.Os
-.Sh NAME
-.Nm ruptime
-.Nd show host status of local machines
-.Sh SYNOPSIS
-.Nm
-.Op Fl alrtu
-.Op Ar host ...
-.Sh DESCRIPTION
-The
-.Nm
-utility gives a status line like
-.Xr uptime 1
-for each machine on the local network; these are formed from packets
-broadcast by each host on the network once every three minutes.
-.Pp
-If no operands are given,
-.Nm
-displays uptime status for all machines;
-otherwise only those hosts specified on the command line are displayed.
-If hosts are specified on the command line, the sort order is equivalent
-to the order hosts were specified on the command line.
-.Pp
-Machines for which no status report has been received for 11
-minutes are shown as being down, and machines for which no status
-report has been received for 4 days are not shown in the list at all.
-.Pp
-The options are as follows:
-.Bl -tag -width Ds
-.It Fl a
-Include all users.
-By default, if a user has not typed to the system for
-an hour or more, then the user will be omitted from the output.
-.It Fl l
-Sort by load average.
-.It Fl r
-Reverse the sort order.
-.It Fl t
-Sort by uptime.
-.It Fl u
-Sort by number of users.
-.El
-.Pp
-The default listing is sorted by host name.
-.Sh FILES
-.Bl -tag -width /var/rwho/whod.* -compact
-.It Pa /var/rwho/whod.*
-data files
-.El
-.Sh SEE ALSO
-.Xr rwho 1 ,
-.Xr uptime 1 ,
-.Xr rwhod 8
-.Sh HISTORY
-A
-.Nm
-utility appeared in
-.Bx 4.2 .
diff --git a/usr.bin/ruptime/ruptime.c b/usr.bin/ruptime/ruptime.c
deleted file mode 100644
index 1e3356f..0000000
--- a/usr.bin/ruptime/ruptime.c
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- * Copyright (c) 1983, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1983, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static const char sccsid[] = "@(#)ruptime.c 8.2 (Berkeley) 4/5/94";
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-
-#include <protocols/rwhod.h>
-
-#include <dirent.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-struct hs {
- struct whod *hs_wd;
- int hs_nusers;
-} *hs;
-struct whod awhod;
-#define LEFTEARTH(h) (now - (h) > 4*24*60*60)
-#define ISDOWN(h) (now - (h)->hs_wd->wd_recvtime > 11 * 60)
-#define WHDRSIZE (sizeof (awhod) - sizeof (awhod.wd_we))
-
-size_t nhosts;
-time_t now;
-int rflg = 1;
-DIR *dirp;
-
-int hscmp(const void *, const void *);
-char *interval(time_t, const char *);
-int lcmp(const void *, const void *);
-void morehosts(void);
-void ruptime(const char *, int, int (*)(const void *, const void *));
-int tcmp(const void *, const void *);
-int ucmp(const void *, const void *);
-void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- int (*cmp)(const void *, const void *);
- int aflg, ch;
-
- aflg = 0;
- cmp = hscmp;
- while ((ch = getopt(argc, argv, "alrut")) != -1)
- switch (ch) {
- case 'a':
- aflg = 1;
- break;
- case 'l':
- cmp = lcmp;
- break;
- case 'r':
- rflg = -1;
- break;
- case 't':
- cmp = tcmp;
- break;
- case 'u':
- cmp = ucmp;
- break;
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (chdir(_PATH_RWHODIR) || (dirp = opendir(".")) == NULL)
- err(1, "%s", _PATH_RWHODIR);
-
- ruptime(*argv, aflg, cmp);
- while (*argv++ != NULL) {
- if (*argv == NULL)
- break;
- ruptime(*argv, aflg, cmp);
- }
- exit(0);
-}
-
-char *
-interval(time_t tval, const char *updown)
-{
- static char resbuf[32];
- int days, hours, minutes;
-
- if (tval < 0) {
- (void)snprintf(resbuf, sizeof(resbuf), " %s ??:??", updown);
- return (resbuf);
- }
- /* round to minutes. */
- minutes = (tval + (60 - 1)) / 60;
- hours = minutes / 60;
- minutes %= 60;
- days = hours / 24;
- hours %= 24;
- if (days)
- (void)snprintf(resbuf, sizeof(resbuf),
- "%s %3d+%02d:%02d", updown, days, hours, minutes);
- else
- (void)snprintf(resbuf, sizeof(resbuf),
- "%s %2d:%02d", updown, hours, minutes);
- return (resbuf);
-}
-
-#define HS(a) ((const struct hs *)(a))
-
-/* Alphabetical comparison. */
-int
-hscmp(const void *a1, const void *a2)
-{
- return (rflg *
- strcmp(HS(a1)->hs_wd->wd_hostname, HS(a2)->hs_wd->wd_hostname));
-}
-
-/* Load average comparison. */
-int
-lcmp(const void *a1, const void *a2)
-{
- if (ISDOWN(HS(a1)))
- if (ISDOWN(HS(a2)))
- return (tcmp(a1, a2));
- else
- return (rflg);
- else if (ISDOWN(HS(a2)))
- return (-rflg);
- else
- return (rflg *
- (HS(a2)->hs_wd->wd_loadav[0] - HS(a1)->hs_wd->wd_loadav[0]));
-}
-
-void
-ruptime(const char *host, int aflg, int (*cmp)(const void *, const void *))
-{
- struct hs *hsp;
- struct whod *wd;
- struct whoent *we;
- struct dirent *dp;
- const char *hostname;
- char buf[sizeof(struct whod)];
- int fd, i, maxloadav;
- size_t hspace;
- u_int cc;
-
- rewinddir(dirp);
- hsp = NULL;
- maxloadav = -1;
- (void)time(&now);
- for (nhosts = hspace = 0; (dp = readdir(dirp)) != NULL;) {
- if (dp->d_ino == 0 || strncmp(dp->d_name, "whod.", 5) != 0)
- continue;
- if ((fd = open(dp->d_name, O_RDONLY, 0)) < 0) {
- warn("%s", dp->d_name);
- continue;
- }
- cc = read(fd, buf, sizeof(struct whod));
- (void)close(fd);
- if (host != NULL) {
- hostname = ((struct whod *)buf)->wd_hostname;
- if (strcasecmp(hostname, host) != 0)
- continue;
- }
-
- if (cc < WHDRSIZE)
- continue;
- if (LEFTEARTH(((struct whod *)buf)->wd_recvtime))
- continue;
- if (nhosts == hspace) {
- if ((hs =
- realloc(hs, (hspace += 40) * sizeof(*hs))) == NULL)
- err(1, NULL);
- hsp = hs + nhosts;
- }
-
- if ((hsp->hs_wd = malloc((size_t)WHDRSIZE)) == NULL)
- err(1, NULL);
- memmove(hsp->hs_wd, buf, (size_t)WHDRSIZE);
-
- for (wd = (struct whod *)buf, i = 0; i < 2; ++i)
- if (wd->wd_loadav[i] > maxloadav)
- maxloadav = wd->wd_loadav[i];
-
- for (hsp->hs_nusers = 0,
- we = (struct whoent *)(buf + cc); --we >= wd->wd_we;)
- if (aflg || we->we_idle < 3600)
- ++hsp->hs_nusers;
- ++hsp;
- ++nhosts;
- }
- if (nhosts == 0) {
- if (host == NULL)
- errx(1, "no hosts in %s", _PATH_RWHODIR);
- else
- warnx("host %s not in %s", host, _PATH_RWHODIR);
- }
-
- qsort(hs, nhosts, sizeof(hs[0]), cmp);
- for (i = 0; i < (int)nhosts; i++) {
- hsp = &hs[i];
- if (ISDOWN(hsp)) {
- (void)printf("%-12.12s%s\n", hsp->hs_wd->wd_hostname,
- interval(now - hsp->hs_wd->wd_recvtime, "down"));
- continue;
- }
- (void)printf(
- "%-12.12s%s, %4d user%s load %*.2f, %*.2f, %*.2f\n",
- hsp->hs_wd->wd_hostname,
- interval((time_t)hsp->hs_wd->wd_sendtime -
- (time_t)hsp->hs_wd->wd_boottime, " up"),
- hsp->hs_nusers,
- hsp->hs_nusers == 1 ? ", " : "s,",
- maxloadav >= 1000 ? 5 : 4,
- hsp->hs_wd->wd_loadav[0] / 100.0,
- maxloadav >= 1000 ? 5 : 4,
- hsp->hs_wd->wd_loadav[1] / 100.0,
- maxloadav >= 1000 ? 5 : 4,
- hsp->hs_wd->wd_loadav[2] / 100.0);
- free(hsp->hs_wd);
- }
- free(hs);
- hs = NULL;
-}
-
-/* Number of users comparison. */
-int
-ucmp(const void *a1, const void *a2)
-{
- if (ISDOWN(HS(a1)))
- if (ISDOWN(HS(a2)))
- return (tcmp(a1, a2));
- else
- return (rflg);
- else if (ISDOWN(HS(a2)))
- return (-rflg);
- else
- return (rflg * (HS(a2)->hs_nusers - HS(a1)->hs_nusers));
-}
-
-/* Uptime comparison. */
-int
-tcmp(const void *a1, const void *a2)
-{
- return (rflg * (
- (ISDOWN(HS(a2)) ? HS(a2)->hs_wd->wd_recvtime - now
- : HS(a2)->hs_wd->wd_sendtime - HS(a2)->hs_wd->wd_boottime)
- -
- (ISDOWN(HS(a1)) ? HS(a1)->hs_wd->wd_recvtime - now
- : HS(a1)->hs_wd->wd_sendtime - HS(a1)->hs_wd->wd_boottime)
- ));
-}
-
-void
-usage(void)
-{
- (void)fprintf(stderr, "usage: ruptime [-alrtu] [host ...]\n");
- exit(1);
-}
diff --git a/usr.bin/rusers/Makefile b/usr.bin/rusers/Makefile
deleted file mode 100644
index 21d0ce2..0000000
--- a/usr.bin/rusers/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# $FreeBSD$
-
-PROG = rusers
-WARNS?= 6
-
-DPADD= ${LIBRPCSVC}
-LDADD= -lrpcsvc
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/rusers/rusers.1 b/usr.bin/rusers/rusers.1
deleted file mode 100644
index f528bb8..0000000
--- a/usr.bin/rusers/rusers.1
+++ /dev/null
@@ -1,108 +0,0 @@
-.\" Copyright (c) 1983, 1990 The Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" from: @(#)rusers.1 6.7 (Berkeley) 4/23/91
-.\" $FreeBSD$
-.\"
-.Dd April 23, 1991
-.Dt RUSERS 1
-.Os
-.Sh NAME
-.Nm rusers
-.Nd who is logged in to machines on local network
-.Sh SYNOPSIS
-.Nm
-.Op Fl al
-.Op Ar host ...
-.Sh DESCRIPTION
-The
-.Nm
-command produces output similar to
-.Xr who 1 ,
-but for the list of
-.Ar host Ns s
-or all machines on the local
-network.
-For each
-.Ar host
-responding to the
-.Nm
-query,
-the hostname with the names of the users currently logged
-on is printed on each line.
-The
-.Nm
-command will wait for
-one minute to catch late responders.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl a
-Print all machines responding even if no one is currently logged in.
-.It Fl l
-Print a long format listing.
-This includes the user name, host name,
-tty that the user is logged in to, the date and time the user
-logged in, the amount of time since the user typed on the keyboard,
-and the remote host they logged in from (if applicable).
-.El
-.Sh DIAGNOSTICS
-.Bl -diag
-.It rusers: RPC: Program not registered
-The
-.Xr rpc.rusersd 8
-daemon has not been started on the remote host.
-.It rusers: RPC: Timed out
-A communication error occurred.
-Either the network is
-excessively congested, or the
-.Xr rpc.rusersd 8
-daemon has terminated on the remote host.
-.It rusers: "RPC: Port mapper failure - RPC: Timed out"
-The remote host is not running the portmapper (see
-.Xr rpcbind 8 ) ,
-and cannot accommodate any RPC-based services.
-The host may be down.
-.El
-.Sh SEE ALSO
-.Xr rwho 1 ,
-.Xr users 1 ,
-.Xr who 1 ,
-.Xr rpcbind 8 ,
-.Xr rpc.rusersd 8
-.Sh HISTORY
-The
-.Nm
-command
-appeared in
-.Em Sun-OS .
-.Sh BUGS
-The sorting options are not implemented.
diff --git a/usr.bin/rusers/rusers.c b/usr.bin/rusers/rusers.c
deleted file mode 100644
index 705c887..0000000
--- a/usr.bin/rusers/rusers.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/*-
- * Copyright (c) 1993, John Brezak
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <rpc/rpc.h>
-#include <rpc/pmap_clnt.h>
-#include <rpcsvc/rnusers.h>
-
-#include <arpa/inet.h>
-
-#include <err.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <timeconv.h>
-#include <unistd.h>
-
-#define MAX_INT 0x7fffffff
-#define HOST_WIDTH 20
-#define LINE_WIDTH 15
-
-int longopt;
-int allopt;
-
-struct host_list {
- struct host_list *next;
- struct in_addr addr;
-} *hosts;
-
-static int
-search_host(struct in_addr addr)
-{
- struct host_list *hp;
-
- if (hosts == NULL)
- return (0);
-
- for (hp = hosts; hp != NULL; hp = hp->next) {
- if (hp->addr.s_addr == addr.s_addr)
- return (1);
- }
- return (0);
-}
-
-static void
-remember_host(struct in_addr addr)
-{
- struct host_list *hp;
-
- if ((hp = (struct host_list *)malloc(sizeof(struct host_list))) == NULL)
- errx(1, "no memory");
- hp->addr.s_addr = addr.s_addr;
- hp->next = hosts;
- hosts = hp;
-}
-
-static int
-rusers_reply(caddr_t replyp, struct sockaddr_in *raddrp)
-{
- u_int x;
- int idle;
- char date[32], idle_time[64], remote[64];
- struct hostent *hp;
- utmpidlearr *up, u;
- char *host;
- int days, hours, minutes, seconds;
-
- up = &u;
- memcpy(up, replyp, sizeof(*up));
- if (search_host(raddrp->sin_addr))
- return (0);
-
- if (!allopt && up->utmpidlearr_len == 0)
- return (0);
-
- hp = gethostbyaddr((char *)&raddrp->sin_addr.s_addr,
- sizeof(struct in_addr), AF_INET);
- if (hp != NULL)
- host = hp->h_name;
- else
- host = inet_ntoa(raddrp->sin_addr);
-
- if (!longopt)
- printf("%-*s ", HOST_WIDTH, host);
-
- for (x = 0; x < up->utmpidlearr_len; x++) {
- time_t t = _int_to_time(up->utmpidlearr_val[x].ui_utmp.ut_time);
- strncpy(date, &(ctime(&t)[4]), sizeof(date) - 1);
-
- idle = up->utmpidlearr_val[x].ui_idle;
- sprintf(idle_time, " :%02d", idle);
- if (idle == MAX_INT)
- strcpy(idle_time, "??");
- else if (idle == 0)
- strcpy(idle_time, "");
- else {
- seconds = idle;
- days = seconds / (60 * 60 * 24);
- seconds %= (60 * 60 * 24);
- hours = seconds / (60 * 60);
- seconds %= (60 * 60);
- minutes = seconds / 60;
- seconds %= 60;
- if (idle > 60)
- sprintf(idle_time, "%d:%02d", minutes, seconds);
- if (idle >= (60 * 60))
- sprintf(idle_time, "%d:%02d:%02d",
- hours, minutes, seconds);
- if (idle >= (24 * 60 * 60))
- sprintf(idle_time, "%d days, %d:%02d:%02d",
- days, hours, minutes, seconds);
- }
-
- strncpy(remote, up->utmpidlearr_val[x].ui_utmp.ut_host,
- sizeof(remote) - 1);
- if (strlen(remote) != 0)
- sprintf(remote, "(%.16s)",
- up->utmpidlearr_val[x].ui_utmp.ut_host);
-
- if (longopt)
- printf("%-8.8s %*s:%-*.*s %-12.12s %6s %.18s\n",
- up->utmpidlearr_val[x].ui_utmp.ut_name,
- HOST_WIDTH, host, LINE_WIDTH, LINE_WIDTH,
- up->utmpidlearr_val[x].ui_utmp.ut_line, date,
- idle_time, remote );
- else
- printf("%s ",
- up->utmpidlearr_val[x].ui_utmp.ut_name);
- }
- if (!longopt)
- putchar('\n');
-
- remember_host(raddrp->sin_addr);
- return (0);
-}
-
-static void
-onehost(char *host)
-{
- utmpidlearr up;
- CLIENT *rusers_clnt;
- struct sockaddr_in addr;
- struct hostent *hp;
- struct timeval tv;
-
- hp = gethostbyname(host);
- if (hp == NULL)
- errx(1, "unknown host \"%s\"", host);
-
- rusers_clnt = clnt_create(host, RUSERSPROG, RUSERSVERS_IDLE, "udp");
- if (rusers_clnt == NULL)
- errx(1, "%s", clnt_spcreateerror(""));
-
- bzero((char *)&up, sizeof(up));
- tv.tv_sec = 15; /* XXX ?? */
- tv.tv_usec = 0;
- if (clnt_call(rusers_clnt, RUSERSPROC_NAMES, (xdrproc_t)xdr_void, NULL,
- (xdrproc_t)xdr_utmpidlearr, &up, tv) != RPC_SUCCESS)
- errx(1, "%s", clnt_sperror(rusers_clnt, ""));
- memcpy(&addr.sin_addr.s_addr, hp->h_addr, sizeof(addr.sin_addr.s_addr));
- rusers_reply((caddr_t)&up, &addr);
- clnt_destroy(rusers_clnt);
-}
-
-static void
-allhosts(void)
-{
- utmpidlearr up;
- enum clnt_stat clnt_stat;
-
- bzero((char *)&up, sizeof(up));
- clnt_stat = clnt_broadcast(RUSERSPROG, RUSERSVERS_IDLE,
- RUSERSPROC_NAMES, (xdrproc_t)xdr_void, NULL,
- (xdrproc_t)xdr_utmpidlearr, (char *)&up,
- (resultproc_t)rusers_reply);
- if (clnt_stat != RPC_SUCCESS && clnt_stat != RPC_TIMEDOUT)
- errx(1, "%s", clnt_sperrno(clnt_stat));
-}
-
-static void
-usage(void)
-{
-
- fprintf(stderr, "usage: rusers [-al] [host ...]\n");
- exit(1);
-}
-
-int
-main(int argc, char *argv[])
-{
- int ch;
-
- while ((ch = getopt(argc, argv, "al")) != -1)
- switch (ch) {
- case 'a':
- allopt++;
- break;
- case 'l':
- longopt++;
- break;
- default:
- usage();
- /* NOTREACHED */
- }
-
- setlinebuf(stdout);
- if (argc == optind)
- allhosts();
- else {
- for (; optind < argc; optind++)
- (void)onehost(argv[optind]);
- }
- exit(0);
-}
diff --git a/usr.bin/rwall/Makefile b/usr.bin/rwall/Makefile
deleted file mode 100644
index 4e448db..0000000
--- a/usr.bin/rwall/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-PROG = rwall
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/rwall/rwall.1 b/usr.bin/rwall/rwall.1
deleted file mode 100644
index 2de83d4..0000000
--- a/usr.bin/rwall/rwall.1
+++ /dev/null
@@ -1,83 +0,0 @@
-.\" Copyright (c) 1983, 1990 The Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" from: @(#)rwall.1 6.7 (Berkeley) 4/23/91
-.\" $FreeBSD$
-.\"
-.Dd April 23, 1991
-.Dt RWALL 1
-.Os
-.Sh NAME
-.Nm rwall
-.Nd send a message to users logged on a host
-.Sh SYNOPSIS
-.Nm
-.Ar host
-.Op Ar file
-.Sh DESCRIPTION
-The
-.Nm
-command sends a message to the users logged into the specified
-.Ar host .
-The
-message to be sent can be typed in and terminated with EOF or it can
-be in a
-.Ar file .
-.Sh DIAGNOSTICS
-.Bl -diag
-.It rwall: RPC: Program not registered
-The
-.Xr rpc.rwalld 8
-daemon has not been started on the remote host.
-.It rwall: RPC: Timed out
-A communication error occurred.
-Either the network is
-excessively congested, or the
-.Xr rpc.rwalld 8
-daemon has terminated on the remote host.
-.It rwall: RPC: Port mapper failure - RPC: Timed out
-The remote host is not running the portmapper (see
-.Xr rpcbind 8 ) ,
-and cannot accomodate any RPC-based services.
-The host may be down.
-.El
-.Sh SEE ALSO
-.Xr who 1 ,
-.Xr rpcbind 8 ,
-.Xr rpc.rwalld 8
-.Sh HISTORY
-The
-.Nm
-command
-appeared in
-.Em Sun-OS .
-.Sh BUGS
-The sorting options are not implemented.
diff --git a/usr.bin/rwall/rwall.c b/usr.bin/rwall/rwall.c
deleted file mode 100644
index 042b72f..0000000
--- a/usr.bin/rwall/rwall.c
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (c) 1993 Christopher G. Demetriou
- * Copyright (c) 1988, 1990 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1988 Regents of the University of California.\n\
- All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static const char sccsid[] = "from: @(#)wall.c 5.14 (Berkeley) 3/2/91";
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * This program is not related to David Wall, whose Stanford Ph.D. thesis
- * is entitled "Mechanisms for Broadcast and Selective Broadcast".
- */
-
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/uio.h>
-#include <rpc/rpc.h>
-#include <rpcsvc/rwall.h>
-#include <err.h>
-#include <paths.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-char *mbuf;
-
-static char notty[] = "no tty";
-
-void makemsg(const char *);
-static void usage(void);
-
-/* ARGSUSED */
-int
-main(int argc, char *argv[])
-{
- char *wallhost, res;
- CLIENT *cl;
- struct timeval tv;
-
- if ((argc < 2) || (argc > 3))
- usage();
-
- wallhost = argv[1];
-
- makemsg(argv[2]);
-
- /*
- * Create client "handle" used for calling MESSAGEPROG on the
- * server designated on the command line. We tell the rpc package
- * to use the "tcp" protocol when contacting the server.
- */
- cl = clnt_create(wallhost, WALLPROG, WALLVERS, "udp");
- if (cl == NULL) {
- /*
- * Couldn't establish connection with server.
- * Print error message and die.
- */
- errx(1, "%s", clnt_spcreateerror(wallhost));
- }
-
- tv.tv_sec = 15; /* XXX ?? */
- tv.tv_usec = 0;
- if (clnt_call(cl, WALLPROC_WALL, (xdrproc_t)xdr_wrapstring, &mbuf,
- (xdrproc_t)xdr_void, &res, tv) != RPC_SUCCESS) {
- /*
- * An error occurred while calling the server.
- * Print error message and die.
- */
- errx(1, "%s", clnt_sperror(cl, wallhost));
- }
-
- return (0);
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: rwall host [file]\n");
- exit(1);
-}
-
-void
-makemsg(const char *fname)
-{
- struct tm *lt;
- struct passwd *pw;
- struct stat sbuf;
- time_t now;
- FILE *fp;
- int fd;
- size_t mbufsize;
- char *tty, hostname[MAXHOSTNAMELEN], lbuf[256], tmpname[64];
- const char *whom;
-
- snprintf(tmpname, sizeof(tmpname), "%s/wall.XXXXXX", _PATH_TMP);
- if ((fd = mkstemp(tmpname)) == -1 || (fp = fdopen(fd, "r+")) == NULL)
- err(1, "can't open temporary file");
- unlink(tmpname);
-
- whom = getlogin();
- if (!whom) {
- pw = getpwuid(getuid());
- whom = pw ? pw->pw_name : "???";
- }
- gethostname(hostname, sizeof(hostname));
- time(&now);
- lt = localtime(&now);
-
- /*
- * all this stuff is to blank out a square for the message;
- * we wrap message lines at column 79, not 80, because some
- * terminals wrap after 79, some do not, and we can't tell.
- * Which means that we may leave a non-blank character
- * in column 80, but that can't be helped.
- */
- fprintf(fp, "Remote Broadcast Message from %s@%s\n",
- whom, hostname);
- tty = ttyname(STDERR_FILENO);
- if (tty == NULL)
- tty = notty;
- fprintf(fp, " (%s) at %d:%02d ...\n", tty,
- lt->tm_hour, lt->tm_min);
-
- putc('\n', fp);
-
- if (fname && !(freopen(fname, "r", stdin)))
- err(1, "can't read %s", fname);
- while (fgets(lbuf, sizeof(lbuf), stdin))
- fputs(lbuf, fp);
- rewind(fp);
-
- if (fstat(fd, &sbuf))
- err(1, "can't stat temporary file");
- mbufsize = (size_t)sbuf.st_size;
- mbuf = malloc(mbufsize);
- if (mbuf == NULL)
- err(1, "out of memory");
- if (fread(mbuf, sizeof(*mbuf), mbufsize, fp) != (u_int)mbufsize)
- err(1, "can't read temporary file");
- close(fd);
-}
diff --git a/usr.bin/rwho/Makefile b/usr.bin/rwho/Makefile
deleted file mode 100644
index 328aa38..0000000
--- a/usr.bin/rwho/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-
-PROG= rwho
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/rwho/rwho.1 b/usr.bin/rwho/rwho.1
deleted file mode 100644
index 684e508..0000000
--- a/usr.bin/rwho/rwho.1
+++ /dev/null
@@ -1,84 +0,0 @@
-.\" Copyright (c) 1983, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)rwho.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 6, 1993
-.Dt RWHO 1
-.Os
-.Sh NAME
-.Nm rwho
-.Nd who is logged in on local machines
-.Sh SYNOPSIS
-.Nm
-.Op Fl a
-.Sh DESCRIPTION
-The
-.Nm
-command produces output similar to
-.Xr who 1 ,
-but for all machines on the local network.
-If no report has been
-received from a machine for 11 minutes then
-.Nm
-assumes the machine is down, and does not report users last known
-to be logged into that machine.
-.Pp
-If a user has not typed to the system for a minute or more, then
-.Nm
-reports this idle time.
-.Pp
-The following option is available:
-.Bl -tag -width indent
-.It Fl a
-Include all users.
-By default, if a user has not typed to the system for
-an hour or more, then the user will be omitted from the output.
-.El
-.Sh FILES
-.Bl -tag -width /var/rwho/whod.* -compact
-.It Pa /var/rwho/whod.*
-information about other machines
-.El
-.Sh SEE ALSO
-.Xr ruptime 1 ,
-.Xr who 1 ,
-.Xr rwhod 8
-.Sh HISTORY
-The
-.Nm
-command
-appeared in
-.Bx 4.3 .
-.Sh BUGS
-This is unwieldy when the number of machines
-on the local net is large.
diff --git a/usr.bin/rwho/rwho.c b/usr.bin/rwho/rwho.c
deleted file mode 100644
index be82ad3..0000000
--- a/usr.bin/rwho/rwho.c
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1983, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)rwho.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/file.h>
-
-#include <protocols/rwhod.h>
-
-#include <dirent.h>
-#include <err.h>
-#include <langinfo.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <timeconv.h>
-#include <unistd.h>
-#include <utmp.h>
-
-DIR *dirp;
-
-struct whod wd;
-#define NUSERS 1000
-struct myutmp {
- char myhost[sizeof(wd.wd_hostname)];
- int myidle;
- struct outmp myutmp;
-} myutmp[NUSERS];
-int nusers;
-
-#define WHDRSIZE (ssize_t)(sizeof (wd) - sizeof (wd.wd_we))
-/*
- * this macro should be shared with ruptime.
- */
-#define down(w,now) ((now) - (w)->wd_recvtime > 11 * 60)
-
-time_t now;
-int aflg;
-
-static void usage(void);
-int utmpcmp(const void *, const void *);
-
-int
-main(int argc, char *argv[])
-{
- int ch;
- struct dirent *dp;
- int width;
- ssize_t cc;
- register struct whod *w = &wd;
- register struct whoent *we;
- register struct myutmp *mp;
- int f, n, i;
- int d_first;
-
- (void) setlocale(LC_TIME, "");
- d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
-
- while ((ch = getopt(argc, argv, "a")) != -1)
- switch((char)ch) {
- case 'a':
- aflg = 1;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (argc != 0)
- usage();
-
- if (chdir(_PATH_RWHODIR) || (dirp = opendir(".")) == NULL)
- err(1, "%s", _PATH_RWHODIR);
- mp = myutmp;
- (void)time(&now);
- while ((dp = readdir(dirp))) {
- if (dp->d_ino == 0 || strncmp(dp->d_name, "whod.", 5))
- continue;
- f = open(dp->d_name, O_RDONLY);
- if (f < 0)
- continue;
- cc = read(f, (char *)&wd, sizeof (struct whod));
- if (cc < WHDRSIZE) {
- (void) close(f);
- continue;
- }
- if (down(w,now)) {
- (void) close(f);
- continue;
- }
- cc -= WHDRSIZE;
- we = w->wd_we;
- for (n = cc / sizeof (struct whoent); n > 0; n--) {
- if (aflg == 0 && we->we_idle >= 60*60) {
- we++;
- continue;
- }
- if (nusers >= NUSERS)
- errx(1, "too many users");
- mp->myutmp = we->we_utmp; mp->myidle = we->we_idle;
- (void) strcpy(mp->myhost, w->wd_hostname);
- nusers++; we++; mp++;
- }
- (void) close(f);
- }
- qsort((char *)myutmp, nusers, sizeof (struct myutmp), utmpcmp);
- mp = myutmp;
- width = 0;
- for (i = 0; i < nusers; i++) {
- /* append one for the blank and use 8 for the out_line */
- int j = strlen(mp->myhost) + 1 + sizeof(mp->myutmp.out_line);
- if (j > width)
- width = j;
- mp++;
- }
- mp = myutmp;
- for (i = 0; i < nusers; i++) {
- char buf[BUFSIZ], cbuf[80];
- time_t t = _int_to_time(mp->myutmp.out_time);
-
- strftime(cbuf, sizeof(cbuf),
- d_first ? "%e %b %R" : "%b %e %R",
- localtime(&t));
- (void)sprintf(buf, "%s:%-.*s", mp->myhost,
- sizeof(mp->myutmp.out_line), mp->myutmp.out_line);
- printf("%-*.*s %-*s %s",
- UT_NAMESIZE, sizeof(mp->myutmp.out_name),
- mp->myutmp.out_name,
- width,
- buf,
- cbuf);
- mp->myidle /= 60;
- if (mp->myidle) {
- if (aflg) {
- if (mp->myidle >= 100*60)
- mp->myidle = 100*60 - 1;
- if (mp->myidle >= 60)
- printf(" %2d", mp->myidle / 60);
- else
- printf(" ");
- } else
- printf(" ");
- printf(":%02d", mp->myidle % 60);
- }
- printf("\n");
- mp++;
- }
- exit(0);
-}
-
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: rwho [-a]\n");
- exit(1);
-}
-
-#define MYUTMP(a) ((const struct myutmp *)(a))
-
-int
-utmpcmp(const void *u1, const void *u2)
-{
- int rc;
-
- rc = strncmp(MYUTMP(u1)->myutmp.out_name, MYUTMP(u2)->myutmp.out_name,
- sizeof(MYUTMP(u2)->myutmp.out_name));
- if (rc)
- return (rc);
- rc = strcmp(MYUTMP(u1)->myhost, MYUTMP(u2)->myhost);
- if (rc)
- return (rc);
- return (strncmp(MYUTMP(u1)->myutmp.out_line, MYUTMP(u2)->myutmp.out_line,
- sizeof(MYUTMP(u2)->myutmp.out_line)));
-}
diff --git a/usr.bin/script/Makefile b/usr.bin/script/Makefile
deleted file mode 100644
index 50ba12e..0000000
--- a/usr.bin/script/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= script
-LDADD= -lutil
-DPADD= ${LIBUTIL}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/script/script.1 b/usr.bin/script/script.1
deleted file mode 100644
index 1c93b3e..0000000
--- a/usr.bin/script/script.1
+++ /dev/null
@@ -1,159 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)script.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd January 22, 2004
-.Dt SCRIPT 1
-.Os
-.Sh NAME
-.Nm script
-.Nd make typescript of terminal session
-.Sh SYNOPSIS
-.Nm
-.Op Fl akq
-.Op Fl t Ar time
-.Op Ar file Op Ar command ...
-.Sh DESCRIPTION
-The
-.Nm
-utility makes a typescript of everything printed on your terminal.
-It is useful for students who need a hardcopy record of an interactive
-session as proof of an assignment, as the typescript file
-can be printed out later with
-.Xr lpr 1 .
-.Pp
-If the argument
-.Ar file
-is given,
-.Nm
-saves all dialogue in
-.Ar file .
-If no file name is given, the typescript is saved in the file
-.Pa typescript .
-.Pp
-If the argument
-.Ar command
-is given,
-.Nm
-will run the specified command with an optional argument vector
-instead of an interactive shell.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl a
-Append the output to
-.Ar file
-or
-.Pa typescript ,
-retaining the prior contents.
-.It Fl k
-Log keys sent to program as well as output.
-.It Fl q
-Run in quiet mode, omit the start and stop status messages.
-.It Fl t Ar time
-Specify time interval between flushing script output file.
-A value of 0
-causes
-.Nm
-to flush for every character I/O event.
-The default interval is
-30 seconds.
-.El
-.Pp
-The script ends when the forked shell (or command) exits (a
-.Em control-D
-to exit
-the Bourne shell
-.Pf ( Xr sh 1 ) ,
-and
-.Em exit ,
-.Em logout
-or
-.Em control-D
-(if
-.Em ignoreeof
-is not set) for the
-C-shell,
-.Xr csh 1 ) .
-.Pp
-Certain interactive commands, such as
-.Xr vi 1 ,
-create garbage in the typescript file.
-The
-.Nm
-utility works best with commands that do not manipulate the screen.
-The results are meant to emulate a hardcopy terminal, not an addressable one.
-.Sh ENVIRONMENT
-The following environment variable is utilized by
-.Nm :
-.Bl -tag -width SHELL
-.It Ev SHELL
-If the variable
-.Ev SHELL
-exists, the shell forked by
-.Nm
-will be that shell.
-If
-.Ev SHELL
-is not set, the Bourne shell
-is assumed.
-(Most shells set this variable automatically).
-.El
-.Sh SEE ALSO
-.Xr csh 1
-(for the
-.Em history
-mechanism).
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3.0 .
-.Sh BUGS
-The
-.Nm
-utility places
-.Sy everything
-in the log file, including linefeeds and backspaces.
-This is not what the naive user expects.
-.Pp
-It is not possible to specify a command without also naming the script file
-because of argument parsing compatibility issues.
-.Pp
-When running in
-.Fl k
-mode, echo cancelling is far from ideal.
-The slave terminal mode is checked
-for ECHO mode to check when to avoid manual echo logging.
-This does not
-work when in a raw mode where the program being run is doing manual echo.
diff --git a/usr.bin/script/script.c b/usr.bin/script/script.c
deleted file mode 100644
index ad706dc..0000000
--- a/usr.bin/script/script.c
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Copyright (c) 1980, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1992, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "@(#)script.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <libutil.h>
-#include <paths.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <termios.h>
-#include <unistd.h>
-
-FILE *fscript;
-int master, slave;
-int child;
-const char *fname;
-int qflg, ttyflg;
-
-struct termios tt;
-
-void done(int) __dead2;
-void dooutput(void);
-void doshell(char **);
-void fail(void);
-void finish(void);
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- int cc;
- struct termios rtt, stt;
- struct winsize win;
- int aflg, kflg, ch, n;
- struct timeval tv, *tvp;
- time_t tvec, start;
- char obuf[BUFSIZ];
- char ibuf[BUFSIZ];
- fd_set rfd;
- int flushtime = 30;
-
- aflg = kflg = 0;
- while ((ch = getopt(argc, argv, "aqkt:")) != -1)
- switch(ch) {
- case 'a':
- aflg = 1;
- break;
- case 'q':
- qflg = 1;
- break;
- case 'k':
- kflg = 1;
- break;
- case 't':
- flushtime = atoi(optarg);
- if (flushtime < 0)
- err(1, "invalid flush time %d", flushtime);
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (argc > 0) {
- fname = argv[0];
- argv++;
- argc--;
- } else
- fname = "typescript";
-
- if ((fscript = fopen(fname, aflg ? "a" : "w")) == NULL)
- err(1, "%s", fname);
-
- if (ttyflg = isatty(STDIN_FILENO)) {
- if (tcgetattr(STDIN_FILENO, &tt) == -1)
- err(1, "tcgetattr");
- if (ioctl(STDIN_FILENO, TIOCGWINSZ, &win) == -1)
- err(1, "ioctl");
- if (openpty(&master, &slave, NULL, &tt, &win) == -1)
- err(1, "openpty");
- } else {
- if (openpty(&master, &slave, NULL, NULL, NULL) == -1)
- err(1, "openpty");
- }
-
- if (!qflg) {
- tvec = time(NULL);
- (void)printf("Script started, output file is %s\n", fname);
- (void)fprintf(fscript, "Script started on %s", ctime(&tvec));
- fflush(fscript);
- }
- if (ttyflg) {
- rtt = tt;
- cfmakeraw(&rtt);
- rtt.c_lflag &= ~ECHO;
- (void)tcsetattr(STDIN_FILENO, TCSAFLUSH, &rtt);
- }
-
- child = fork();
- if (child < 0) {
- warn("fork");
- done(1);
- }
- if (child == 0)
- doshell(argv);
-
- if (flushtime > 0)
- tvp = &tv;
- else
- tvp = NULL;
-
- start = time(0);
- FD_ZERO(&rfd);
- for (;;) {
- FD_SET(master, &rfd);
- FD_SET(STDIN_FILENO, &rfd);
- if (flushtime > 0) {
- tv.tv_sec = flushtime;
- tv.tv_usec = 0;
- }
- n = select(master + 1, &rfd, 0, 0, tvp);
- if (n < 0 && errno != EINTR)
- break;
- if (n > 0 && FD_ISSET(STDIN_FILENO, &rfd)) {
- cc = read(STDIN_FILENO, ibuf, BUFSIZ);
- if (cc < 0)
- break;
- if (cc == 0)
- (void)write(master, ibuf, 0);
- if (cc > 0) {
- (void)write(master, ibuf, cc);
- if (kflg && tcgetattr(master, &stt) >= 0 &&
- ((stt.c_lflag & ECHO) == 0)) {
- (void)fwrite(ibuf, 1, cc, fscript);
- }
- }
- }
- if (n > 0 && FD_ISSET(master, &rfd)) {
- cc = read(master, obuf, sizeof (obuf));
- if (cc <= 0)
- break;
- (void)write(STDOUT_FILENO, obuf, cc);
- (void)fwrite(obuf, 1, cc, fscript);
- }
- tvec = time(0);
- if (tvec - start >= flushtime) {
- fflush(fscript);
- start = tvec;
- }
- }
- finish();
- done(0);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr,
- "usage: script [-akq] [-t time] [file [command ...]]\n");
- exit(1);
-}
-
-void
-finish(void)
-{
- pid_t pid;
- int die, e, status;
-
- die = e = 0;
- while ((pid = wait3(&status, WNOHANG, 0)) > 0)
- if (pid == child) {
- die = 1;
- if (WIFEXITED(status))
- e = WEXITSTATUS(status);
- else if (WIFSIGNALED(status))
- e = WTERMSIG(status);
- else /* can't happen */
- e = 1;
- }
-
- if (die)
- done(e);
-}
-
-void
-doshell(char **av)
-{
- const char *shell;
-
- shell = getenv("SHELL");
- if (shell == NULL)
- shell = _PATH_BSHELL;
-
- (void)close(master);
- (void)fclose(fscript);
- login_tty(slave);
- if (av[0]) {
- execvp(av[0], av);
- warn("%s", av[0]);
- } else {
- execl(shell, shell, "-i", (char *)NULL);
- warn("%s", shell);
- }
- fail();
-}
-
-void
-fail(void)
-{
- (void)kill(0, SIGTERM);
- done(1);
-}
-
-void
-done(int eno)
-{
- time_t tvec;
-
- if (ttyflg)
- (void)tcsetattr(STDIN_FILENO, TCSAFLUSH, &tt);
- tvec = time(NULL);
- if (!qflg) {
- (void)fprintf(fscript,"\nScript done on %s", ctime(&tvec));
- (void)printf("\nScript done, output file is %s\n", fname);
- }
- (void)fclose(fscript);
- (void)close(master);
- exit(eno);
-}
diff --git a/usr.bin/sed/Makefile b/usr.bin/sed/Makefile
deleted file mode 100644
index 9d9886f..0000000
--- a/usr.bin/sed/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= sed
-SRCS= compile.c main.c misc.c process.c
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/sed/POSIX b/usr.bin/sed/POSIX
deleted file mode 100644
index 239acf8..0000000
--- a/usr.bin/sed/POSIX
+++ /dev/null
@@ -1,204 +0,0 @@
-# @(#)POSIX 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-Comments on the IEEE P1003.2 Draft 12
- Part 2: Shell and Utilities
- Section 4.55: sed - Stream editor
-
-Diomidis Spinellis <dds@doc.ic.ac.uk>
-Keith Bostic <bostic@cs.berkeley.edu>
-
-In the following paragraphs, "wrong" usually means "inconsistent with
-historic practice", as most of the following comments refer to
-undocumented inconsistencies between the historical versions of sed and
-the POSIX 1003.2 standard. All the comments are notes taken while
-implementing a POSIX-compatible version of sed, and should not be
-interpreted as official opinions or criticism towards the POSIX committee.
-All uses of "POSIX" refer to section 4.55, Draft 12 of POSIX 1003.2.
-
- 1. 32V and BSD derived implementations of sed strip the text
- arguments of the a, c and i commands of their initial blanks,
- i.e.
-
- #!/bin/sed -f
- a\
- foo\
- \ indent\
- bar
-
- produces:
-
- foo
- indent
- bar
-
- POSIX does not specify this behavior as the System V versions of
- sed do not do this stripping. The argument against stripping is
- that it is difficult to write sed scripts that have leading blanks
- if they are stripped. The argument for stripping is that it is
- difficult to write readable sed scripts unless indentation is allowed
- and ignored, and leading whitespace is obtainable by entering a
- backslash in front of it. This implementation follows the BSD
- historic practice.
-
- 2. Historical versions of sed required that the w flag be the last
- flag to an s command as it takes an additional argument. This
- is obvious, but not specified in POSIX.
-
- 3. Historical versions of sed required that whitespace follow a w
- flag to an s command. This is not specified in POSIX. This
- implementation permits whitespace but does not require it.
-
- 4. Historical versions of sed permitted any number of whitespace
- characters to follow the w command. This is not specified in
- POSIX. This implementation permits whitespace but does not
- require it.
-
- 5. The rule for the l command differs from historic practice. Table
- 2-15 includes the various ANSI C escape sequences, including \\
- for backslash. Some historical versions of sed displayed two
- digit octal numbers, too, not three as specified by POSIX. POSIX
- is a cleanup, and is followed by this implementation.
-
- 6. The POSIX specification for ! does not specify that for a single
- command the command must not contain an address specification
- whereas the command list can contain address specifications. The
- specification for ! implies that "3!/hello/p" works, and it never
- has, historically. Note,
-
- 3!{
- /hello/p
- }
-
- does work.
-
- 7. POSIX does not specify what happens with consecutive ! commands
- (e.g. /foo/!!!p). Historic implementations allow any number of
- !'s without changing the behaviour. (It seems logical that each
- one might reverse the behaviour.) This implementation follows
- historic practice.
-
- 8. Historic versions of sed permitted commands to be separated
- by semi-colons, e.g. 'sed -ne '1p;2p;3q' printed the first
- three lines of a file. This is not specified by POSIX.
- Note, the ; command separator is not allowed for the commands
- a, c, i, w, r, :, b, t, # and at the end of a w flag in the s
- command. This implementation follows historic practice and
- implements the ; separator.
-
- 9. Historic versions of sed terminated the script if EOF was reached
- during the execution of the 'n' command, i.e.:
-
- sed -e '
- n
- i\
- hello
- ' </dev/null
-
- did not produce any output. POSIX does not specify this behavior.
- This implementation follows historic practice.
-
-10. Deleted.
-
-11. Historical implementations do not output the change text of a c
- command in the case of an address range whose first line number
- is greater than the second (e.g. 3,1). POSIX requires that the
- text be output. Since the historic behavior doesn't seem to have
- any particular purpose, this implementation follows the POSIX
- behavior.
-
-12. POSIX does not specify whether address ranges are checked and
- reset if a command is not executed due to a jump. The following
- program will behave in different ways depending on whether the
- 'c' command is triggered at the third line, i.e. will the text
- be output even though line 3 of the input will never logically
- encounter that command.
-
- 2,4b
- 1,3c\
- text
-
- Historic implementations did not output the text in the above
- example. Therefore it was believed that a range whose second
- address was never matched extended to the end of the input.
- However, the current practice adopted by this implementation,
- as well as by those from GNU and SUN, is as follows: The text
- from the 'c' command still isn't output because the second address
- isn't actually matched; but the range is reset after all if its
- second address is a line number. In the above example, only the
- first line of the input will be deleted.
-
-13. Historical implementations allow an output suppressing #n at the
- beginning of -e arguments as well as in a script file. POSIX
- does not specify this. This implementation follows historical
- practice.
-
-14. POSIX does not explicitly specify how sed behaves if no script is
- specified. Since the sed Synopsis permits this form of the command,
- and the language in the Description section states that the input
- is output, it seems reasonable that it behave like the cat(1)
- command. Historic sed implementations behave differently for "ls |
- sed", where they produce no output, and "ls | sed -e#", where they
- behave like cat. This implementation behaves like cat in both cases.
-
-15. The POSIX requirement to open all w files at the beginning makes
- sed behave nonintuitively when the w commands are preceded by
- addresses or are within conditional blocks. This implementation
- follows historic practice and POSIX, by default, and provides the
- -a option which opens the files only when they are needed.
-
-16. POSIX does not specify how escape sequences other than \n and \D
- (where D is the delimiter character) are to be treated. This is
- reasonable, however, it also doesn't state that the backslash is
- to be discarded from the output regardless. A strict reading of
- POSIX would be that "echo xyz | sed s/./\a" would display "\ayz".
- As historic sed implementations always discarded the backslash,
- this implementation does as well.
-
-17. POSIX specifies that an address can be "empty". This implies
- that constructs like ",d" or "1,d" and ",5d" are allowed. This
- is not true for historic implementations or this implementation
- of sed.
-
-18. The b t and : commands are documented in POSIX to ignore leading
- white space, but no mention is made of trailing white space.
- Historic implementations of sed assigned different locations to
- the labels "x" and "x ". This is not useful, and leads to subtle
- programming errors, but it is historic practice and changing it
- could theoretically break working scripts. This implementation
- follows historic practice.
-
-19. Although POSIX specifies that reading from files that do not exist
- from within the script must not terminate the script, it does not
- specify what happens if a write command fails. Historic practice
- is to fail immediately if the file cannot be opened or written.
- This implementation follows historic practice.
-
-20. Historic practice is that the \n construct can be used for either
- string1 or string2 of the y command. This is not specified by
- POSIX. This implementation follows historic practice.
-
-21. Deleted.
-
-22. Historic implementations of sed ignore the RE delimiter characters
- within character classes. This is not specified in POSIX. This
- implementation follows historic practice.
-
-23. Historic implementations handle empty RE's in a special way: the
- empty RE is interpreted as if it were the last RE encountered,
- whether in an address or elsewhere. POSIX does not document this
- behavior. For example the command:
-
- sed -e /abc/s//XXX/
-
- substitutes XXX for the pattern abc. The semantics of "the last
- RE" can be defined in two different ways:
-
- 1. The last RE encountered when compiling (lexical/static scope).
- 2. The last RE encountered while running (dynamic scope).
-
- While many historical implementations fail on programs depending
- on scope differences, the SunOS version exhibited dynamic scope
- behaviour. This implementation does dynamic scoping, as this seems
- the most useful and in order to remain consistent with historical
- practice.
diff --git a/usr.bin/sed/compile.c b/usr.bin/sed/compile.c
deleted file mode 100644
index 2e3a2ce..0000000
--- a/usr.bin/sed/compile.c
+++ /dev/null
@@ -1,929 +0,0 @@
-/*-
- * Copyright (c) 1992 Diomidis Spinellis.
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Diomidis Spinellis of Imperial College, University of London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)compile.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <regex.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <wchar.h>
-
-#include "defs.h"
-#include "extern.h"
-
-#define LHSZ 128
-#define LHMASK (LHSZ - 1)
-static struct labhash {
- struct labhash *lh_next;
- u_int lh_hash;
- struct s_command *lh_cmd;
- int lh_ref;
-} *labels[LHSZ];
-
-static char *compile_addr(char *, struct s_addr *);
-static char *compile_ccl(char **, char *);
-static char *compile_delimited(char *, char *);
-static char *compile_flags(char *, struct s_subst *);
-static regex_t *compile_re(char *, int);
-static char *compile_subst(char *, struct s_subst *);
-static char *compile_text(void);
-static char *compile_tr(char *, struct s_tr **);
-static struct s_command
- **compile_stream(struct s_command **);
-static char *duptoeol(char *, const char *);
-static void enterlabel(struct s_command *);
-static struct s_command
- *findlabel(char *);
-static void fixuplabel(struct s_command *, struct s_command *);
-static void uselabel(void);
-
-/*
- * Command specification. This is used to drive the command parser.
- */
-struct s_format {
- char code; /* Command code */
- int naddr; /* Number of address args */
- enum e_args args; /* Argument type */
-};
-
-static struct s_format cmd_fmts[] = {
- {'{', 2, GROUP},
- {'}', 0, ENDGROUP},
- {'a', 1, TEXT},
- {'b', 2, BRANCH},
- {'c', 2, TEXT},
- {'d', 2, EMPTY},
- {'D', 2, EMPTY},
- {'g', 2, EMPTY},
- {'G', 2, EMPTY},
- {'h', 2, EMPTY},
- {'H', 2, EMPTY},
- {'i', 1, TEXT},
- {'l', 2, EMPTY},
- {'n', 2, EMPTY},
- {'N', 2, EMPTY},
- {'p', 2, EMPTY},
- {'P', 2, EMPTY},
- {'q', 1, EMPTY},
- {'r', 1, RFILE},
- {'s', 2, SUBST},
- {'t', 2, BRANCH},
- {'w', 2, WFILE},
- {'x', 2, EMPTY},
- {'y', 2, TR},
- {'!', 2, NONSEL},
- {':', 0, LABEL},
- {'#', 0, COMMENT},
- {'=', 1, EMPTY},
- {'\0', 0, COMMENT},
-};
-
-/* The compiled program. */
-struct s_command *prog;
-
-/*
- * Compile the program into prog.
- * Initialise appends.
- */
-void
-compile(void)
-{
- *compile_stream(&prog) = NULL;
- fixuplabel(prog, NULL);
- uselabel();
- if (appendnum == 0)
- appends = NULL;
- else if ((appends = malloc(sizeof(struct s_appends) * appendnum)) ==
- NULL)
- err(1, "malloc");
- if ((match = malloc((maxnsub + 1) * sizeof(regmatch_t))) == NULL)
- err(1, "malloc");
-}
-
-#define EATSPACE() do { \
- if (p) \
- while (*p && isspace((unsigned char)*p)) \
- p++; \
- } while (0)
-
-static struct s_command **
-compile_stream(struct s_command **link)
-{
- char *p;
- static char lbuf[_POSIX2_LINE_MAX + 1]; /* To save stack */
- struct s_command *cmd, *cmd2, *stack;
- struct s_format *fp;
- char re[_POSIX2_LINE_MAX + 1];
- int naddr; /* Number of addresses */
-
- stack = 0;
- for (;;) {
- if ((p = cu_fgets(lbuf, sizeof(lbuf), NULL)) == NULL) {
- if (stack != 0)
- errx(1, "%lu: %s: unexpected EOF (pending }'s)",
- linenum, fname);
- return (link);
- }
-
-semicolon: EATSPACE();
- if (p) {
- if (*p == '#' || *p == '\0')
- continue;
- else if (*p == ';') {
- p++;
- goto semicolon;
- }
- }
- if ((*link = cmd = malloc(sizeof(struct s_command))) == NULL)
- err(1, "malloc");
- link = &cmd->next;
- cmd->nonsel = cmd->inrange = 0;
- /* First parse the addresses */
- naddr = 0;
-
-/* Valid characters to start an address */
-#define addrchar(c) (strchr("0123456789/\\$", (c)))
- if (addrchar(*p)) {
- naddr++;
- if ((cmd->a1 = malloc(sizeof(struct s_addr))) == NULL)
- err(1, "malloc");
- p = compile_addr(p, cmd->a1);
- EATSPACE(); /* EXTENSION */
- if (*p == ',') {
- p++;
- EATSPACE(); /* EXTENSION */
- naddr++;
- if ((cmd->a2 = malloc(sizeof(struct s_addr)))
- == NULL)
- err(1, "malloc");
- p = compile_addr(p, cmd->a2);
- EATSPACE();
- } else
- cmd->a2 = 0;
- } else
- cmd->a1 = cmd->a2 = 0;
-
-nonsel: /* Now parse the command */
- if (!*p)
- errx(1, "%lu: %s: command expected", linenum, fname);
- cmd->code = *p;
- for (fp = cmd_fmts; fp->code; fp++)
- if (fp->code == *p)
- break;
- if (!fp->code)
- errx(1, "%lu: %s: invalid command code %c", linenum, fname, *p);
- if (naddr > fp->naddr)
- errx(1,
- "%lu: %s: command %c expects up to %d address(es), found %d",
- linenum, fname, *p, fp->naddr, naddr);
- switch (fp->args) {
- case NONSEL: /* ! */
- p++;
- EATSPACE();
- cmd->nonsel = ! cmd->nonsel;
- goto nonsel;
- case GROUP: /* { */
- p++;
- EATSPACE();
- cmd->next = stack;
- stack = cmd;
- link = &cmd->u.c;
- if (*p)
- goto semicolon;
- break;
- case ENDGROUP:
- /*
- * Short-circuit command processing, since end of
- * group is really just a noop.
- */
- cmd->nonsel = 1;
- if (stack == 0)
- errx(1, "%lu: %s: unexpected }", linenum, fname);
- cmd2 = stack;
- stack = cmd2->next;
- cmd2->next = cmd;
- /*FALLTHROUGH*/
- case EMPTY: /* d D g G h H l n N p P q x = \0 */
- p++;
- EATSPACE();
- if (*p == ';') {
- p++;
- link = &cmd->next;
- goto semicolon;
- }
- if (*p)
- errx(1, "%lu: %s: extra characters at the end of %c command",
- linenum, fname, cmd->code);
- break;
- case TEXT: /* a c i */
- p++;
- EATSPACE();
- if (*p != '\\')
- errx(1,
-"%lu: %s: command %c expects \\ followed by text", linenum, fname, cmd->code);
- p++;
- EATSPACE();
- if (*p)
- errx(1,
- "%lu: %s: extra characters after \\ at the end of %c command",
- linenum, fname, cmd->code);
- cmd->t = compile_text();
- break;
- case COMMENT: /* \0 # */
- break;
- case WFILE: /* w */
- p++;
- EATSPACE();
- if (*p == '\0')
- errx(1, "%lu: %s: filename expected", linenum, fname);
- cmd->t = duptoeol(p, "w command");
- if (aflag)
- cmd->u.fd = -1;
- else if ((cmd->u.fd = open(p,
- O_WRONLY|O_APPEND|O_CREAT|O_TRUNC,
- DEFFILEMODE)) == -1)
- err(1, "%s", p);
- break;
- case RFILE: /* r */
- p++;
- EATSPACE();
- if (*p == '\0')
- errx(1, "%lu: %s: filename expected", linenum, fname);
- else
- cmd->t = duptoeol(p, "read command");
- break;
- case BRANCH: /* b t */
- p++;
- EATSPACE();
- if (*p == '\0')
- cmd->t = NULL;
- else
- cmd->t = duptoeol(p, "branch");
- break;
- case LABEL: /* : */
- p++;
- EATSPACE();
- cmd->t = duptoeol(p, "label");
- if (strlen(p) == 0)
- errx(1, "%lu: %s: empty label", linenum, fname);
- enterlabel(cmd);
- break;
- case SUBST: /* s */
- p++;
- if (*p == '\0' || *p == '\\')
- errx(1,
-"%lu: %s: substitute pattern can not be delimited by newline or backslash",
- linenum, fname);
- if ((cmd->u.s = calloc(1, sizeof(struct s_subst))) == NULL)
- err(1, "malloc");
- p = compile_delimited(p, re);
- if (p == NULL)
- errx(1,
- "%lu: %s: unterminated substitute pattern", linenum, fname);
- --p;
- p = compile_subst(p, cmd->u.s);
- p = compile_flags(p, cmd->u.s);
- if (*re == '\0')
- cmd->u.s->re = NULL;
- else
- cmd->u.s->re = compile_re(re, cmd->u.s->icase);
- EATSPACE();
- if (*p == ';') {
- p++;
- link = &cmd->next;
- goto semicolon;
- }
- break;
- case TR: /* y */
- p++;
- p = compile_tr(p, &cmd->u.y);
- EATSPACE();
- if (*p == ';') {
- p++;
- link = &cmd->next;
- goto semicolon;
- }
- if (*p)
- errx(1,
-"%lu: %s: extra text at the end of a transform command", linenum, fname);
- break;
- }
- }
-}
-
-/*
- * Get a delimited string. P points to the delimeter of the string; d points
- * to a buffer area. Newline and delimiter escapes are processed; other
- * escapes are ignored.
- *
- * Returns a pointer to the first character after the final delimiter or NULL
- * in the case of a non-terminated string. The character array d is filled
- * with the processed string.
- */
-static char *
-compile_delimited(char *p, char *d)
-{
- char c;
-
- c = *p++;
- if (c == '\0')
- return (NULL);
- else if (c == '\\')
- errx(1, "%lu: %s: \\ can not be used as a string delimiter",
- linenum, fname);
- else if (c == '\n')
- errx(1, "%lu: %s: newline can not be used as a string delimiter",
- linenum, fname);
- while (*p) {
- if (*p == '[') {
- if ((d = compile_ccl(&p, d)) == NULL)
- errx(1, "%lu: %s: unbalanced brackets ([])", linenum, fname);
- continue;
- } else if (*p == '\\' && p[1] == '[') {
- *d++ = *p++;
- } else if (*p == '\\' && p[1] == c)
- p++;
- else if (*p == '\\' && p[1] == 'n') {
- *d++ = '\n';
- p += 2;
- continue;
- } else if (*p == '\\' && p[1] == '\\')
- *d++ = *p++;
- else if (*p == c) {
- *d = '\0';
- return (p + 1);
- }
- *d++ = *p++;
- }
- return (NULL);
-}
-
-
-/* compile_ccl: expand a POSIX character class */
-static char *
-compile_ccl(char **sp, char *t)
-{
- int c, d;
- char *s = *sp;
-
- *t++ = *s++;
- if (*s == '^')
- *t++ = *s++;
- if (*s == ']')
- *t++ = *s++;
- for (; *s && (*t = *s) != ']'; s++, t++)
- if (*s == '[' && ((d = *(s+1)) == '.' || d == ':' || d == '=')) {
- *++t = *++s, t++, s++;
- for (c = *s; (*t = *s) != ']' || c != d; s++, t++)
- if ((c = *s) == '\0')
- return NULL;
- } else if (*s == '\\' && s[1] == 'n')
- *t = '\n', s++;
- return (*s == ']') ? *sp = ++s, ++t : NULL;
-}
-
-/*
- * Compiles the regular expression in RE and returns a pointer to the compiled
- * regular expression.
- * Cflags are passed to regcomp.
- */
-static regex_t *
-compile_re(char *re, int case_insensitive)
-{
- regex_t *rep;
- int eval, flags;
-
-
- flags = rflags;
- if (case_insensitive)
- flags |= REG_ICASE;
- if ((rep = malloc(sizeof(regex_t))) == NULL)
- err(1, "malloc");
- if ((eval = regcomp(rep, re, flags)) != 0)
- errx(1, "%lu: %s: RE error: %s",
- linenum, fname, strregerror(eval, rep));
- if (maxnsub < rep->re_nsub)
- maxnsub = rep->re_nsub;
- return (rep);
-}
-
-/*
- * Compile the substitution string of a regular expression and set res to
- * point to a saved copy of it. Nsub is the number of parenthesized regular
- * expressions.
- */
-static char *
-compile_subst(char *p, struct s_subst *s)
-{
- static char lbuf[_POSIX2_LINE_MAX + 1];
- int asize, size;
- u_char ref;
- char c, *text, *op, *sp;
- int more = 1, sawesc = 0;
-
- c = *p++; /* Terminator character */
- if (c == '\0')
- return (NULL);
-
- s->maxbref = 0;
- s->linenum = linenum;
- asize = 2 * _POSIX2_LINE_MAX + 1;
- if ((text = malloc(asize)) == NULL)
- err(1, "malloc");
- size = 0;
- do {
- op = sp = text + size;
- for (; *p; p++) {
- if (*p == '\\' || sawesc) {
- /*
- * If this is a continuation from the last
- * buffer, we won't have a character to
- * skip over.
- */
- if (sawesc)
- sawesc = 0;
- else
- p++;
-
- if (*p == '\0') {
- /*
- * This escaped character is continued
- * in the next part of the line. Note
- * this fact, then cause the loop to
- * exit w/ normal EOL case and reenter
- * above with the new buffer.
- */
- sawesc = 1;
- p--;
- continue;
- } else if (strchr("123456789", *p) != NULL) {
- *sp++ = '\\';
- ref = *p - '0';
- if (s->re != NULL &&
- ref > s->re->re_nsub)
- errx(1, "%lu: %s: \\%c not defined in the RE",
- linenum, fname, *p);
- if (s->maxbref < ref)
- s->maxbref = ref;
- } else if (*p == '&' || *p == '\\')
- *sp++ = '\\';
- } else if (*p == c) {
- if (*++p == '\0' && more) {
- if (cu_fgets(lbuf, sizeof(lbuf), &more))
- p = lbuf;
- }
- *sp++ = '\0';
- size += sp - op;
- if ((s->new = realloc(text, size)) == NULL)
- err(1, "realloc");
- return (p);
- } else if (*p == '\n') {
- errx(1,
-"%lu: %s: unescaped newline inside substitute pattern", linenum, fname);
- /* NOTREACHED */
- }
- *sp++ = *p;
- }
- size += sp - op;
- if (asize - size < _POSIX2_LINE_MAX + 1) {
- asize *= 2;
- if ((text = realloc(text, asize)) == NULL)
- err(1, "realloc");
- }
- } while (cu_fgets(p = lbuf, sizeof(lbuf), &more));
- errx(1, "%lu: %s: unterminated substitute in regular expression",
- linenum, fname);
- /* NOTREACHED */
-}
-
-/*
- * Compile the flags of the s command
- */
-static char *
-compile_flags(char *p, struct s_subst *s)
-{
- int gn; /* True if we have seen g or n */
- unsigned long nval;
- char wfile[_POSIX2_LINE_MAX + 1], *q;
-
- s->n = 1; /* Default */
- s->p = 0;
- s->wfile = NULL;
- s->wfd = -1;
- s->icase = 0;
- for (gn = 0;;) {
- EATSPACE(); /* EXTENSION */
- switch (*p) {
- case 'g':
- if (gn)
- errx(1,
-"%lu: %s: more than one number or 'g' in substitute flags", linenum, fname);
- gn = 1;
- s->n = 0;
- break;
- case '\0':
- case '\n':
- case ';':
- return (p);
- case 'p':
- s->p = 1;
- break;
- case 'I':
- s->icase = 1;
- break;
- case '1': case '2': case '3':
- case '4': case '5': case '6':
- case '7': case '8': case '9':
- if (gn)
- errx(1,
-"%lu: %s: more than one number or 'g' in substitute flags", linenum, fname);
- gn = 1;
- errno = 0;
- nval = strtol(p, &p, 10);
- if (errno == ERANGE || nval > INT_MAX)
- errx(1,
-"%lu: %s: overflow in the 'N' substitute flag", linenum, fname);
- s->n = nval;
- p--;
- break;
- case 'w':
- p++;
-#ifdef HISTORIC_PRACTICE
- if (*p != ' ') {
- warnx("%lu: %s: space missing before w wfile", linenum, fname);
- return (p);
- }
-#endif
- EATSPACE();
- q = wfile;
- while (*p) {
- if (*p == '\n')
- break;
- *q++ = *p++;
- }
- *q = '\0';
- if (q == wfile)
- errx(1, "%lu: %s: no wfile specified", linenum, fname);
- s->wfile = strdup(wfile);
- if (!aflag && (s->wfd = open(wfile,
- O_WRONLY|O_APPEND|O_CREAT|O_TRUNC,
- DEFFILEMODE)) == -1)
- err(1, "%s", wfile);
- return (p);
- default:
- errx(1, "%lu: %s: bad flag in substitute command: '%c'",
- linenum, fname, *p);
- break;
- }
- p++;
- }
-}
-
-/*
- * Compile a translation set of strings into a lookup table.
- */
-static char *
-compile_tr(char *p, struct s_tr **py)
-{
- struct s_tr *y;
- int i;
- const char *op, *np;
- char old[_POSIX2_LINE_MAX + 1];
- char new[_POSIX2_LINE_MAX + 1];
- size_t oclen, oldlen, nclen, newlen;
- mbstate_t mbs1, mbs2;
-
- if ((*py = y = malloc(sizeof(*y))) == NULL)
- err(1, NULL);
- y->multis = NULL;
- y->nmultis = 0;
-
- if (*p == '\0' || *p == '\\')
- errx(1,
- "%lu: %s: transform pattern can not be delimited by newline or backslash",
- linenum, fname);
- p = compile_delimited(p, old);
- if (p == NULL)
- errx(1, "%lu: %s: unterminated transform source string",
- linenum, fname);
- p = compile_delimited(p - 1, new);
- if (p == NULL)
- errx(1, "%lu: %s: unterminated transform target string",
- linenum, fname);
- EATSPACE();
- op = old;
- oldlen = mbsrtowcs(NULL, &op, 0, NULL);
- if (oldlen == (size_t)-1)
- err(1, NULL);
- np = new;
- newlen = mbsrtowcs(NULL, &np, 0, NULL);
- if (newlen == (size_t)-1)
- err(1, NULL);
- if (newlen != oldlen)
- errx(1, "%lu: %s: transform strings are not the same length",
- linenum, fname);
- if (MB_CUR_MAX == 1) {
- /*
- * The single-byte encoding case is easy: generate a
- * lookup table.
- */
- for (i = 0; i <= UCHAR_MAX; i++)
- y->bytetab[i] = (char)i;
- for (; *op; op++, np++)
- y->bytetab[(u_char)*op] = *np;
- } else {
- /*
- * Multi-byte encoding case: generate a lookup table as
- * above, but only for single-byte characters. The first
- * bytes of multi-byte characters have their lookup table
- * entries set to 0, which causes do_tr() to search through
- * an auxiliary vector of multi-byte mappings.
- */
- memset(&mbs1, 0, sizeof(mbs1));
- memset(&mbs2, 0, sizeof(mbs2));
- for (i = 0; i <= UCHAR_MAX; i++)
- y->bytetab[i] = (btowc(i) != WEOF) ? i : 0;
- while (*op != '\0') {
- oclen = mbrlen(op, MB_LEN_MAX, &mbs1);
- if (oclen == (size_t)-1 || oclen == (size_t)-2)
- errc(1, EILSEQ, NULL);
- nclen = mbrlen(np, MB_LEN_MAX, &mbs2);
- if (nclen == (size_t)-1 || nclen == (size_t)-2)
- errc(1, EILSEQ, NULL);
- if (oclen == 1 && nclen == 1)
- y->bytetab[(u_char)*op] = *np;
- else {
- y->bytetab[(u_char)*op] = 0;
- y->multis = realloc(y->multis,
- (y->nmultis + 1) * sizeof(*y->multis));
- if (y->multis == NULL)
- err(1, NULL);
- i = y->nmultis++;
- y->multis[i].fromlen = oclen;
- memcpy(y->multis[i].from, op, oclen);
- y->multis[i].tolen = nclen;
- memcpy(y->multis[i].to, np, nclen);
- }
- op += oclen;
- np += nclen;
- }
- }
- return (p);
-}
-
-/*
- * Compile the text following an a or i command.
- */
-static char *
-compile_text(void)
-{
- int asize, esc_nl, size;
- char *text, *p, *op, *s;
- char lbuf[_POSIX2_LINE_MAX + 1];
-
- asize = 2 * _POSIX2_LINE_MAX + 1;
- if ((text = malloc(asize)) == NULL)
- err(1, "malloc");
- size = 0;
- while (cu_fgets(lbuf, sizeof(lbuf), NULL)) {
- op = s = text + size;
- p = lbuf;
- EATSPACE();
- for (esc_nl = 0; *p != '\0'; p++) {
- if (*p == '\\' && p[1] != '\0' && *++p == '\n')
- esc_nl = 1;
- *s++ = *p;
- }
- size += s - op;
- if (!esc_nl) {
- *s = '\0';
- break;
- }
- if (asize - size < _POSIX2_LINE_MAX + 1) {
- asize *= 2;
- if ((text = realloc(text, asize)) == NULL)
- err(1, "realloc");
- }
- }
- text[size] = '\0';
- if ((p = realloc(text, size + 1)) == NULL)
- err(1, "realloc");
- return (p);
-}
-
-/*
- * Get an address and return a pointer to the first character after
- * it. Fill the structure pointed to according to the address.
- */
-static char *
-compile_addr(char *p, struct s_addr *a)
-{
- char *end, re[_POSIX2_LINE_MAX + 1];
- int icase;
-
- icase = 0;
-
- switch (*p) {
- case '\\': /* Context address */
- ++p;
- /* FALLTHROUGH */
- case '/': /* Context address */
- p = compile_delimited(p, re);
- if (p == NULL)
- errx(1, "%lu: %s: unterminated regular expression", linenum, fname);
- /* Check for case insensitive regexp flag */
- if (*p == 'I') {
- icase = 1;
- p++;
- }
- if (*re == '\0')
- a->u.r = NULL;
- else
- a->u.r = compile_re(re, icase);
- a->type = AT_RE;
- return (p);
-
- case '$': /* Last line */
- a->type = AT_LAST;
- return (p + 1);
- /* Line number */
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- a->type = AT_LINE;
- a->u.l = strtol(p, &end, 10);
- return (end);
- default:
- errx(1, "%lu: %s: expected context address", linenum, fname);
- return (NULL);
- }
-}
-
-/*
- * duptoeol --
- * Return a copy of all the characters up to \n or \0.
- */
-static char *
-duptoeol(char *s, const char *ctype)
-{
- size_t len;
- int ws;
- char *p, *start;
-
- ws = 0;
- for (start = s; *s != '\0' && *s != '\n'; ++s)
- ws = isspace((unsigned char)*s);
- *s = '\0';
- if (ws)
- warnx("%lu: %s: whitespace after %s", linenum, fname, ctype);
- len = s - start + 1;
- if ((p = malloc(len)) == NULL)
- err(1, "malloc");
- return (memmove(p, start, len));
-}
-
-/*
- * Convert goto label names to addresses, and count a and r commands, in
- * the given subset of the script. Free the memory used by labels in b
- * and t commands (but not by :).
- *
- * TODO: Remove } nodes
- */
-static void
-fixuplabel(struct s_command *cp, struct s_command *end)
-{
-
- for (; cp != end; cp = cp->next)
- switch (cp->code) {
- case 'a':
- case 'r':
- appendnum++;
- break;
- case 'b':
- case 't':
- /* Resolve branch target. */
- if (cp->t == NULL) {
- cp->u.c = NULL;
- break;
- }
- if ((cp->u.c = findlabel(cp->t)) == NULL)
- errx(1, "%lu: %s: undefined label '%s'", linenum, fname, cp->t);
- free(cp->t);
- break;
- case '{':
- /* Do interior commands. */
- fixuplabel(cp->u.c, cp->next);
- break;
- }
-}
-
-/*
- * Associate the given command label for later lookup.
- */
-static void
-enterlabel(struct s_command *cp)
-{
- struct labhash **lhp, *lh;
- u_char *p;
- u_int h, c;
-
- for (h = 0, p = (u_char *)cp->t; (c = *p) != 0; p++)
- h = (h << 5) + h + c;
- lhp = &labels[h & LHMASK];
- for (lh = *lhp; lh != NULL; lh = lh->lh_next)
- if (lh->lh_hash == h && strcmp(cp->t, lh->lh_cmd->t) == 0)
- errx(1, "%lu: %s: duplicate label '%s'", linenum, fname, cp->t);
- if ((lh = malloc(sizeof *lh)) == NULL)
- err(1, "malloc");
- lh->lh_next = *lhp;
- lh->lh_hash = h;
- lh->lh_cmd = cp;
- lh->lh_ref = 0;
- *lhp = lh;
-}
-
-/*
- * Find the label contained in the command l in the command linked
- * list cp. L is excluded from the search. Return NULL if not found.
- */
-static struct s_command *
-findlabel(char *name)
-{
- struct labhash *lh;
- u_char *p;
- u_int h, c;
-
- for (h = 0, p = (u_char *)name; (c = *p) != 0; p++)
- h = (h << 5) + h + c;
- for (lh = labels[h & LHMASK]; lh != NULL; lh = lh->lh_next) {
- if (lh->lh_hash == h && strcmp(name, lh->lh_cmd->t) == 0) {
- lh->lh_ref = 1;
- return (lh->lh_cmd);
- }
- }
- return (NULL);
-}
-
-/*
- * Warn about any unused labels. As a side effect, release the label hash
- * table space.
- */
-static void
-uselabel(void)
-{
- struct labhash *lh, *next;
- int i;
-
- for (i = 0; i < LHSZ; i++) {
- for (lh = labels[i]; lh != NULL; lh = next) {
- next = lh->lh_next;
- if (!lh->lh_ref)
- warnx("%lu: %s: unused label '%s'",
- linenum, fname, lh->lh_cmd->t);
- free(lh);
- }
- }
-}
diff --git a/usr.bin/sed/defs.h b/usr.bin/sed/defs.h
deleted file mode 100644
index 895e719..0000000
--- a/usr.bin/sed/defs.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/*-
- * Copyright (c) 1992 Diomidis Spinellis.
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Diomidis Spinellis of Imperial College, University of London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)defs.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-/*
- * Types of address specifications
- */
-enum e_atype {
- AT_RE, /* Line that match RE */
- AT_LINE, /* Specific line */
- AT_LAST, /* Last line */
-};
-
-/*
- * Format of an address
- */
-struct s_addr {
- enum e_atype type; /* Address type */
- union {
- u_long l; /* Line number */
- regex_t *r; /* Regular expression */
- } u;
-};
-
-/*
- * Substitution command
- */
-struct s_subst {
- int n; /* Occurrence to subst. */
- int p; /* True if p flag */
- int icase; /* True if I flag */
- char *wfile; /* NULL if no wfile */
- int wfd; /* Cached file descriptor */
- regex_t *re; /* Regular expression */
- unsigned int maxbref; /* Largest backreference. */
- u_long linenum; /* Line number. */
- char *new; /* Replacement text */
-};
-
-/*
- * Translate command.
- */
-struct s_tr {
- unsigned char bytetab[256];
- struct trmulti {
- size_t fromlen;
- char from[MB_LEN_MAX];
- size_t tolen;
- char to[MB_LEN_MAX];
- } *multis;
- int nmultis;
-};
-
-/*
- * An internally compiled command.
- * Initialy, label references are stored in t, on a second pass they
- * are updated to pointers.
- */
-struct s_command {
- struct s_command *next; /* Pointer to next command */
- struct s_addr *a1, *a2; /* Start and end address */
- char *t; /* Text for : a c i r w */
- union {
- struct s_command *c; /* Command(s) for b t { */
- struct s_subst *s; /* Substitute command */
- struct s_tr *y; /* Replace command array */
- int fd; /* File descriptor for w */
- } u;
- char code; /* Command code */
- u_int nonsel:1; /* True if ! */
- u_int inrange:1; /* True if in range */
-};
-
-/*
- * Types of command arguments recognised by the parser
- */
-enum e_args {
- EMPTY, /* d D g G h H l n N p P q x = \0 */
- TEXT, /* a c i */
- NONSEL, /* ! */
- GROUP, /* { */
- ENDGROUP, /* } */
- COMMENT, /* # */
- BRANCH, /* b t */
- LABEL, /* : */
- RFILE, /* r */
- WFILE, /* w */
- SUBST, /* s */
- TR /* y */
-};
-
-/*
- * Structure containing things to append before a line is read
- */
-struct s_appends {
- enum {AP_STRING, AP_FILE} type;
- char *s;
- size_t len;
-};
-
-enum e_spflag {
- APPEND, /* Append to the contents. */
- REPLACE, /* Replace the contents. */
-};
-
-/*
- * Structure for a space (process, hold, otherwise).
- */
-typedef struct {
- char *space; /* Current space pointer. */
- size_t len; /* Current length. */
- int deleted; /* If deleted. */
- char *back; /* Backing memory. */
- size_t blen; /* Backing memory length. */
-} SPACE;
diff --git a/usr.bin/sed/extern.h b/usr.bin/sed/extern.h
deleted file mode 100644
index f2bd71b..0000000
--- a/usr.bin/sed/extern.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*-
- * Copyright (c) 1992 Diomidis Spinellis.
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Diomidis Spinellis of Imperial College, University of London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-extern struct s_command *prog;
-extern struct s_appends *appends;
-extern regmatch_t *match;
-extern size_t maxnsub;
-extern u_long linenum;
-extern int appendnum;
-extern int aflag, eflag, nflag;
-extern const char *fname, *outfname;
-extern FILE *infile, *outfile;
-extern int rflags; /* regex flags to use */
-
-void cfclose(struct s_command *, struct s_command *);
-void compile(void);
-void cspace(SPACE *, const char *, size_t, enum e_spflag);
-char *cu_fgets(char *, int, int *);
-int mf_fgets(SPACE *, enum e_spflag);
-int lastline(void);
-void process(void);
-void resetstate(void);
-char *strregerror(int, regex_t *);
diff --git a/usr.bin/sed/main.c b/usr.bin/sed/main.c
deleted file mode 100644
index 1a140b1..0000000
--- a/usr.bin/sed/main.c
+++ /dev/null
@@ -1,469 +0,0 @@
-/*-
- * Copyright (c) 1992 Diomidis Spinellis.
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Diomidis Spinellis of Imperial College, University of London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1992, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "@(#)main.c 8.2 (Berkeley) 1/3/94";
-#endif
-
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <libgen.h>
-#include <limits.h>
-#include <locale.h>
-#include <regex.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "defs.h"
-#include "extern.h"
-
-/*
- * Linked list of units (strings and files) to be compiled
- */
-struct s_compunit {
- struct s_compunit *next;
- enum e_cut {CU_FILE, CU_STRING} type;
- char *s; /* Pointer to string or fname */
-};
-
-/*
- * Linked list pointer to compilation units and pointer to current
- * next pointer.
- */
-static struct s_compunit *script, **cu_nextp = &script;
-
-/*
- * Linked list of files to be processed
- */
-struct s_flist {
- char *fname;
- struct s_flist *next;
-};
-
-/*
- * Linked list pointer to files and pointer to current
- * next pointer.
- */
-static struct s_flist *files, **fl_nextp = &files;
-
-FILE *infile; /* Current input file */
-FILE *outfile; /* Current output file */
-
-int aflag, eflag, nflag;
-int rflags = 0;
-static int rval; /* Exit status */
-
-static int ispan; /* Whether inplace editing spans across files */
-
-/*
- * Current file and line number; line numbers restart across compilation
- * units, but span across input files. The latter is optional if editing
- * in place.
- */
-const char *fname; /* File name. */
-const char *outfname; /* Output file name */
-static char oldfname[PATH_MAX]; /* Old file name (for in-place editing) */
-static char tmpfname[PATH_MAX]; /* Temporary file name (for in-place editing) */
-static const char *inplace; /* Inplace edit file extension. */
-u_long linenum;
-
-static void add_compunit(enum e_cut, char *);
-static void add_file(char *);
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- int c, fflag;
- char *temp_arg;
-
- (void) setlocale(LC_ALL, "");
-
- fflag = 0;
- inplace = NULL;
-
- while ((c = getopt(argc, argv, "EI:ae:f:i:ln")) != -1)
- switch (c) {
- case 'E':
- rflags = REG_EXTENDED;
- break;
- case 'I':
- inplace = optarg;
- ispan = 1; /* span across input files */
- break;
- case 'a':
- aflag = 1;
- break;
- case 'e':
- eflag = 1;
- if ((temp_arg = malloc(strlen(optarg) + 2)) == NULL)
- err(1, "malloc");
- strcpy(temp_arg, optarg);
- strcat(temp_arg, "\n");
- add_compunit(CU_STRING, temp_arg);
- break;
- case 'f':
- fflag = 1;
- add_compunit(CU_FILE, optarg);
- break;
- case 'i':
- inplace = optarg;
- ispan = 0; /* don't span across input files */
- break;
- case 'l':
- if(setlinebuf(stdout) != 0)
- warnx("setlinebuf() failed");
- break;
- case 'n':
- nflag = 1;
- break;
- default:
- case '?':
- usage();
- }
- argc -= optind;
- argv += optind;
-
- /* First usage case; script is the first arg */
- if (!eflag && !fflag && *argv) {
- add_compunit(CU_STRING, *argv);
- argv++;
- }
-
- compile();
-
- /* Continue with first and start second usage */
- if (*argv)
- for (; *argv; argv++)
- add_file(*argv);
- else
- add_file(NULL);
- process();
- cfclose(prog, NULL);
- if (fclose(stdout))
- err(1, "stdout");
- exit(rval);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "%s\n%s\n",
- "usage: sed script [-Ealn] [-i extension] [file ...]",
- " sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]");
- exit(1);
-}
-
-/*
- * Like fgets, but go through the chain of compilation units chaining them
- * together. Empty strings and files are ignored.
- */
-char *
-cu_fgets(char *buf, int n, int *more)
-{
- static enum {ST_EOF, ST_FILE, ST_STRING} state = ST_EOF;
- static FILE *f; /* Current open file */
- static char *s; /* Current pointer inside string */
- static char string_ident[30];
- char *p;
-
-again:
- switch (state) {
- case ST_EOF:
- if (script == NULL) {
- if (more != NULL)
- *more = 0;
- return (NULL);
- }
- linenum = 0;
- switch (script->type) {
- case CU_FILE:
- if ((f = fopen(script->s, "r")) == NULL)
- err(1, "%s", script->s);
- fname = script->s;
- state = ST_FILE;
- goto again;
- case CU_STRING:
- if (((size_t)snprintf(string_ident,
- sizeof(string_ident), "\"%s\"", script->s)) >=
- sizeof(string_ident) - 1)
- (void)strcpy(string_ident +
- sizeof(string_ident) - 6, " ...\"");
- fname = string_ident;
- s = script->s;
- state = ST_STRING;
- goto again;
- }
- case ST_FILE:
- if ((p = fgets(buf, n, f)) != NULL) {
- linenum++;
- if (linenum == 1 && buf[0] == '#' && buf[1] == 'n')
- nflag = 1;
- if (more != NULL)
- *more = !feof(f);
- return (p);
- }
- script = script->next;
- (void)fclose(f);
- state = ST_EOF;
- goto again;
- case ST_STRING:
- if (linenum == 0 && s[0] == '#' && s[1] == 'n')
- nflag = 1;
- p = buf;
- for (;;) {
- if (n-- <= 1) {
- *p = '\0';
- linenum++;
- if (more != NULL)
- *more = 1;
- return (buf);
- }
- switch (*s) {
- case '\0':
- state = ST_EOF;
- if (s == script->s) {
- script = script->next;
- goto again;
- } else {
- script = script->next;
- *p = '\0';
- linenum++;
- if (more != NULL)
- *more = 0;
- return (buf);
- }
- case '\n':
- *p++ = '\n';
- *p = '\0';
- s++;
- linenum++;
- if (more != NULL)
- *more = 0;
- return (buf);
- default:
- *p++ = *s++;
- }
- }
- }
- /* NOTREACHED */
- return (NULL);
-}
-
-/*
- * Like fgets, but go through the list of files chaining them together.
- * Set len to the length of the line.
- */
-int
-mf_fgets(SPACE *sp, enum e_spflag spflag)
-{
- struct stat sb;
- size_t len;
- char *p;
- int c;
- static int firstfile;
-
- if (infile == NULL) {
- /* stdin? */
- if (files->fname == NULL) {
- if (inplace != NULL)
- errx(1, "-I or -i may not be used with stdin");
- infile = stdin;
- fname = "stdin";
- outfile = stdout;
- outfname = "stdout";
- }
- firstfile = 1;
- }
-
- for (;;) {
- if (infile != NULL && (c = getc(infile)) != EOF) {
- (void)ungetc(c, infile);
- break;
- }
- /* If we are here then either eof or no files are open yet */
- if (infile == stdin) {
- sp->len = 0;
- return (0);
- }
- if (infile != NULL) {
- fclose(infile);
- if (*oldfname != '\0') {
- if (rename(fname, oldfname) != 0) {
- warn("rename()");
- unlink(tmpfname);
- exit(1);
- }
- *oldfname = '\0';
- }
- if (*tmpfname != '\0') {
- if (outfile != NULL && outfile != stdout)
- fclose(outfile);
- outfile = NULL;
- rename(tmpfname, fname);
- *tmpfname = '\0';
- }
- outfname = NULL;
- }
- if (firstfile == 0)
- files = files->next;
- else
- firstfile = 0;
- if (files == NULL) {
- sp->len = 0;
- return (0);
- }
- fname = files->fname;
- if (inplace != NULL) {
- if (lstat(fname, &sb) != 0)
- err(1, "%s", fname);
- if (!(sb.st_mode & S_IFREG))
- errx(1, "%s: %s %s", fname,
- "in-place editing only",
- "works for regular files");
- if (*inplace != '\0') {
- strlcpy(oldfname, fname,
- sizeof(oldfname));
- len = strlcat(oldfname, inplace,
- sizeof(oldfname));
- if (len > sizeof(oldfname))
- errx(1, "%s: name too long", fname);
- }
- len = snprintf(tmpfname, sizeof(tmpfname),
- "%s/.!%ld!%s", dirname(fname), (long)getpid(),
- basename(fname));
- if (len >= sizeof(tmpfname))
- errx(1, "%s: name too long", fname);
- unlink(tmpfname);
- if ((outfile = fopen(tmpfname, "w")) == NULL)
- err(1, "%s", fname);
- fchown(fileno(outfile), sb.st_uid, sb.st_gid);
- fchmod(fileno(outfile), sb.st_mode & ALLPERMS);
- outfname = tmpfname;
- if (!ispan) {
- linenum = 0;
- resetstate();
- }
- } else {
- outfile = stdout;
- outfname = "stdout";
- }
- if ((infile = fopen(fname, "r")) == NULL) {
- warn("%s", fname);
- rval = 1;
- continue;
- }
- }
- /*
- * We are here only when infile is open and we still have something
- * to read from it.
- *
- * Use fgetln so that we can handle essentially infinite input data.
- * Can't use the pointer into the stdio buffer as the process space
- * because the ungetc() can cause it to move.
- */
- p = fgetln(infile, &len);
- if (ferror(infile))
- errx(1, "%s: %s", fname, strerror(errno ? errno : EIO));
- if (len != 0 && p[len - 1] == '\n')
- len--;
- cspace(sp, p, len, spflag);
-
- linenum++;
-
- return (1);
-}
-
-/*
- * Add a compilation unit to the linked list
- */
-static void
-add_compunit(enum e_cut type, char *s)
-{
- struct s_compunit *cu;
-
- if ((cu = malloc(sizeof(struct s_compunit))) == NULL)
- err(1, "malloc");
- cu->type = type;
- cu->s = s;
- cu->next = NULL;
- *cu_nextp = cu;
- cu_nextp = &cu->next;
-}
-
-/*
- * Add a file to the linked list
- */
-static void
-add_file(char *s)
-{
- struct s_flist *fp;
-
- if ((fp = malloc(sizeof(struct s_flist))) == NULL)
- err(1, "malloc");
- fp->next = NULL;
- *fl_nextp = fp;
- fp->fname = s;
- fl_nextp = &fp->next;
-}
-
-int
-lastline(void)
-{
- int ch;
-
- if (files->next != NULL && (inplace == NULL || ispan))
- return (0);
- if ((ch = getc(infile)) == EOF)
- return (1);
- ungetc(ch, infile);
- return (0);
-}
diff --git a/usr.bin/sed/misc.c b/usr.bin/sed/misc.c
deleted file mode 100644
index f3b5137..0000000
--- a/usr.bin/sed/misc.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*-
- * Copyright (c) 1992 Diomidis Spinellis.
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Diomidis Spinellis of Imperial College, University of London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <sys/types.h>
-
-#include <err.h>
-#include <limits.h>
-#include <regex.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "defs.h"
-#include "extern.h"
-
-/*
- * Return a string for a regular expression error passed. This is overkill,
- * because of the silly semantics of regerror (we can never know the size of
- * the buffer).
- */
-char *
-strregerror(int errcode, regex_t *preg)
-{
- static char *oe;
- size_t s;
-
- if (oe != NULL)
- free(oe);
- s = regerror(errcode, preg, NULL, 0);
- if ((oe = malloc(s)) == NULL)
- err(1, "malloc");
- (void)regerror(errcode, preg, oe, s);
- return (oe);
-}
diff --git a/usr.bin/sed/process.c b/usr.bin/sed/process.c
deleted file mode 100644
index a29fe0e..0000000
--- a/usr.bin/sed/process.c
+++ /dev/null
@@ -1,756 +0,0 @@
-/*-
- * Copyright (c) 1992 Diomidis Spinellis.
- * Copyright (c) 1992, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Diomidis Spinellis of Imperial College, University of London.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)process.c 8.6 (Berkeley) 4/20/94";
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <sys/uio.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <regex.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-#include <wctype.h>
-
-#include "defs.h"
-#include "extern.h"
-
-static SPACE HS, PS, SS, YS;
-#define pd PS.deleted
-#define ps PS.space
-#define psl PS.len
-#define hs HS.space
-#define hsl HS.len
-
-static __inline int applies(struct s_command *);
-static void do_tr(struct s_tr *);
-static void flush_appends(void);
-static void lputs(char *, size_t);
-static __inline int regexec_e(regex_t *, const char *, int, int, size_t);
-static void regsub(SPACE *, char *, char *);
-static int substitute(struct s_command *);
-
-struct s_appends *appends; /* Array of pointers to strings to append. */
-static int appendx; /* Index into appends array. */
-int appendnum; /* Size of appends array. */
-
-static int lastaddr; /* Set by applies if last address of a range. */
-static int sdone; /* If any substitutes since last line input. */
- /* Iov structure for 'w' commands. */
-static regex_t *defpreg;
-size_t maxnsub;
-regmatch_t *match;
-
-#define OUT() do {fwrite(ps, 1, psl, outfile); fputc('\n', outfile);} while (0)
-
-void
-process(void)
-{
- struct s_command *cp;
- SPACE tspace;
- size_t oldpsl = 0;
- char *p;
-
- p = NULL;
-
- for (linenum = 0; mf_fgets(&PS, REPLACE);) {
- pd = 0;
-top:
- cp = prog;
-redirect:
- while (cp != NULL) {
- if (!applies(cp)) {
- cp = cp->next;
- continue;
- }
- switch (cp->code) {
- case '{':
- cp = cp->u.c;
- goto redirect;
- case 'a':
- if (appendx >= appendnum)
- if ((appends = realloc(appends,
- sizeof(struct s_appends) *
- (appendnum *= 2))) == NULL)
- err(1, "realloc");
- appends[appendx].type = AP_STRING;
- appends[appendx].s = cp->t;
- appends[appendx].len = strlen(cp->t);
- appendx++;
- break;
- case 'b':
- cp = cp->u.c;
- goto redirect;
- case 'c':
- pd = 1;
- psl = 0;
- if (cp->a2 == NULL || lastaddr || lastline())
- (void)fprintf(outfile, "%s", cp->t);
- break;
- case 'd':
- pd = 1;
- goto new;
- case 'D':
- if (pd)
- goto new;
- if (psl == 0 ||
- (p = memchr(ps, '\n', psl)) == NULL) {
- pd = 1;
- goto new;
- } else {
- psl -= (p + 1) - ps;
- memmove(ps, p + 1, psl);
- goto top;
- }
- case 'g':
- cspace(&PS, hs, hsl, REPLACE);
- break;
- case 'G':
- cspace(&PS, "\n", 1, APPEND);
- cspace(&PS, hs, hsl, APPEND);
- break;
- case 'h':
- cspace(&HS, ps, psl, REPLACE);
- break;
- case 'H':
- cspace(&HS, "\n", 1, APPEND);
- cspace(&HS, ps, psl, APPEND);
- break;
- case 'i':
- (void)fprintf(outfile, "%s", cp->t);
- break;
- case 'l':
- lputs(ps, psl);
- break;
- case 'n':
- if (!nflag && !pd)
- OUT();
- flush_appends();
- if (!mf_fgets(&PS, REPLACE))
- exit(0);
- pd = 0;
- break;
- case 'N':
- flush_appends();
- cspace(&PS, "\n", 1, APPEND);
- if (!mf_fgets(&PS, APPEND))
- exit(0);
- break;
- case 'p':
- if (pd)
- break;
- OUT();
- break;
- case 'P':
- if (pd)
- break;
- if ((p = memchr(ps, '\n', psl)) != NULL) {
- oldpsl = psl;
- psl = p - ps;
- }
- OUT();
- if (p != NULL)
- psl = oldpsl;
- break;
- case 'q':
- if (!nflag && !pd)
- OUT();
- flush_appends();
- exit(0);
- case 'r':
- if (appendx >= appendnum)
- if ((appends = realloc(appends,
- sizeof(struct s_appends) *
- (appendnum *= 2))) == NULL)
- err(1, "realloc");
- appends[appendx].type = AP_FILE;
- appends[appendx].s = cp->t;
- appends[appendx].len = strlen(cp->t);
- appendx++;
- break;
- case 's':
- sdone |= substitute(cp);
- break;
- case 't':
- if (sdone) {
- sdone = 0;
- cp = cp->u.c;
- goto redirect;
- }
- break;
- case 'w':
- if (pd)
- break;
- if (cp->u.fd == -1 && (cp->u.fd = open(cp->t,
- O_WRONLY|O_APPEND|O_CREAT|O_TRUNC,
- DEFFILEMODE)) == -1)
- err(1, "%s", cp->t);
- if (write(cp->u.fd, ps, psl) != (ssize_t)psl ||
- write(cp->u.fd, "\n", 1) != 1)
- err(1, "%s", cp->t);
- break;
- case 'x':
- /*
- * If the hold space is null, make it empty
- * but not null. Otherwise the pattern space
- * will become null after the swap, which is
- * an abnormal condition.
- */
- if (hs == NULL)
- cspace(&HS, "", 0, REPLACE);
- tspace = PS;
- PS = HS;
- HS = tspace;
- break;
- case 'y':
- if (pd || psl == 0)
- break;
- do_tr(cp->u.y);
- break;
- case ':':
- case '}':
- break;
- case '=':
- (void)fprintf(outfile, "%lu\n", linenum);
- }
- cp = cp->next;
- } /* for all cp */
-
-new: if (!nflag && !pd)
- OUT();
- flush_appends();
- } /* for all lines */
-}
-
-/*
- * TRUE if the address passed matches the current program state
- * (lastline, linenumber, ps).
- */
-#define MATCH(a) \
- ((a)->type == AT_RE ? regexec_e((a)->u.r, ps, 0, 1, psl) : \
- (a)->type == AT_LINE ? linenum == (a)->u.l : lastline())
-
-/*
- * Return TRUE if the command applies to the current line. Sets the inrange
- * flag to process ranges. Interprets the non-select (``!'') flag.
- */
-static __inline int
-applies(struct s_command *cp)
-{
- int r;
-
- lastaddr = 0;
- if (cp->a1 == NULL && cp->a2 == NULL)
- r = 1;
- else if (cp->a2)
- if (cp->inrange) {
- if (MATCH(cp->a2)) {
- cp->inrange = 0;
- lastaddr = 1;
- r = 1;
- } else if (cp->a2->type == AT_LINE &&
- linenum > cp->a2->u.l) {
- /*
- * We missed the 2nd address due to a branch,
- * so just close the range and return false.
- */
- cp->inrange = 0;
- r = 0;
- } else
- r = 1;
- } else if (MATCH(cp->a1)) {
- /*
- * If the second address is a number less than or
- * equal to the line number first selected, only
- * one line shall be selected.
- * -- POSIX 1003.2
- */
- if (cp->a2->type == AT_LINE &&
- linenum >= cp->a2->u.l)
- lastaddr = 1;
- else
- cp->inrange = 1;
- r = 1;
- } else
- r = 0;
- else
- r = MATCH(cp->a1);
- return (cp->nonsel ? ! r : r);
-}
-
-/*
- * Reset the sed processor to its initial state.
- */
-void
-resetstate(void)
-{
- struct s_command *cp;
-
- /*
- * Reset all inrange markers.
- */
- for (cp = prog; cp; cp = cp->code == '{' ? cp->u.c : cp->next)
- if (cp->a2)
- cp->inrange = 0;
-
- /*
- * Clear out the hold space.
- */
- cspace(&HS, "", 0, REPLACE);
-}
-
-/*
- * substitute --
- * Do substitutions in the pattern space. Currently, we build a
- * copy of the new pattern space in the substitute space structure
- * and then swap them.
- */
-static int
-substitute(struct s_command *cp)
-{
- SPACE tspace;
- regex_t *re;
- regoff_t re_off, slen;
- int lastempty, n;
- char *s;
-
- s = ps;
- re = cp->u.s->re;
- if (re == NULL) {
- if (defpreg != NULL && cp->u.s->maxbref > defpreg->re_nsub) {
- linenum = cp->u.s->linenum;
- errx(1, "%lu: %s: \\%u not defined in the RE",
- linenum, fname, cp->u.s->maxbref);
- }
- }
- if (!regexec_e(re, s, 0, 0, psl))
- return (0);
-
- SS.len = 0; /* Clean substitute space. */
- slen = psl;
- n = cp->u.s->n;
- lastempty = 1;
-
- switch (n) {
- case 0: /* Global */
- do {
- if (lastempty || match[0].rm_so != match[0].rm_eo) {
- /* Locate start of replaced string. */
- re_off = match[0].rm_so;
- /* Copy leading retained string. */
- cspace(&SS, s, re_off, APPEND);
- /* Add in regular expression. */
- regsub(&SS, s, cp->u.s->new);
- }
-
- /* Move past this match. */
- if (match[0].rm_so != match[0].rm_eo) {
- s += match[0].rm_eo;
- slen -= match[0].rm_eo;
- lastempty = 0;
- } else {
- if (match[0].rm_so < slen)
- cspace(&SS, s + match[0].rm_so, 1,
- APPEND);
- s += match[0].rm_so + 1;
- slen -= match[0].rm_so + 1;
- lastempty = 1;
- }
- } while (slen >= 0 && regexec_e(re, s, REG_NOTBOL, 0, slen));
- /* Copy trailing retained string. */
- if (slen > 0)
- cspace(&SS, s, slen, APPEND);
- break;
- default: /* Nth occurrence */
- while (--n) {
- if (match[0].rm_eo == match[0].rm_so)
- match[0].rm_eo = match[0].rm_so + 1;
- s += match[0].rm_eo;
- slen -= match[0].rm_eo;
- if (slen < 0)
- return (0);
- if (!regexec_e(re, s, REG_NOTBOL, 0, slen))
- return (0);
- }
- /* FALLTHROUGH */
- case 1: /* 1st occurrence */
- /* Locate start of replaced string. */
- re_off = match[0].rm_so + (s - ps);
- /* Copy leading retained string. */
- cspace(&SS, ps, re_off, APPEND);
- /* Add in regular expression. */
- regsub(&SS, s, cp->u.s->new);
- /* Copy trailing retained string. */
- s += match[0].rm_eo;
- slen -= match[0].rm_eo;
- cspace(&SS, s, slen, APPEND);
- break;
- }
-
- /*
- * Swap the substitute space and the pattern space, and make sure
- * that any leftover pointers into stdio memory get lost.
- */
- tspace = PS;
- PS = SS;
- SS = tspace;
- SS.space = SS.back;
-
- /* Handle the 'p' flag. */
- if (cp->u.s->p)
- OUT();
-
- /* Handle the 'w' flag. */
- if (cp->u.s->wfile && !pd) {
- if (cp->u.s->wfd == -1 && (cp->u.s->wfd = open(cp->u.s->wfile,
- O_WRONLY|O_APPEND|O_CREAT|O_TRUNC, DEFFILEMODE)) == -1)
- err(1, "%s", cp->u.s->wfile);
- if (write(cp->u.s->wfd, ps, psl) != (ssize_t)psl ||
- write(cp->u.s->wfd, "\n", 1) != 1)
- err(1, "%s", cp->u.s->wfile);
- }
- return (1);
-}
-
-/*
- * do_tr --
- * Perform translation ('y' command) in the pattern space.
- */
-static void
-do_tr(struct s_tr *y)
-{
- SPACE tmp;
- char c, *p;
- size_t clen, left;
- int i;
-
- if (MB_CUR_MAX == 1) {
- /*
- * Single-byte encoding: perform in-place translation
- * of the pattern space.
- */
- for (p = ps; p < &ps[psl]; p++)
- *p = y->bytetab[(u_char)*p];
- } else {
- /*
- * Multi-byte encoding: perform translation into the
- * translation space, then swap the translation and
- * pattern spaces.
- */
- /* Clean translation space. */
- YS.len = 0;
- for (p = ps, left = psl; left > 0; p += clen, left -= clen) {
- if ((c = y->bytetab[(u_char)*p]) != '\0') {
- cspace(&YS, &c, 1, APPEND);
- clen = 1;
- continue;
- }
- for (i = 0; i < y->nmultis; i++)
- if (left >= y->multis[i].fromlen &&
- memcmp(p, y->multis[i].from,
- y->multis[i].fromlen) == 0)
- break;
- if (i < y->nmultis) {
- cspace(&YS, y->multis[i].to,
- y->multis[i].tolen, APPEND);
- clen = y->multis[i].fromlen;
- } else {
- cspace(&YS, p, 1, APPEND);
- clen = 1;
- }
- }
- /* Swap the translation space and the pattern space. */
- tmp = PS;
- PS = YS;
- YS = tmp;
- YS.space = YS.back;
- }
-}
-
-/*
- * Flush append requests. Always called before reading a line,
- * therefore it also resets the substitution done (sdone) flag.
- */
-static void
-flush_appends(void)
-{
- FILE *f;
- int count, i;
- char buf[8 * 1024];
-
- for (i = 0; i < appendx; i++)
- switch (appends[i].type) {
- case AP_STRING:
- fwrite(appends[i].s, sizeof(char), appends[i].len,
- outfile);
- break;
- case AP_FILE:
- /*
- * Read files probably shouldn't be cached. Since
- * it's not an error to read a non-existent file,
- * it's possible that another program is interacting
- * with the sed script through the filesystem. It
- * would be truly bizarre, but possible. It's probably
- * not that big a performance win, anyhow.
- */
- if ((f = fopen(appends[i].s, "r")) == NULL)
- break;
- while ((count = fread(buf, sizeof(char), sizeof(buf), f)))
- (void)fwrite(buf, sizeof(char), count, outfile);
- (void)fclose(f);
- break;
- }
- if (ferror(outfile))
- errx(1, "%s: %s", outfname, strerror(errno ? errno : EIO));
- appendx = sdone = 0;
-}
-
-static void
-lputs(char *s, size_t len)
-{
- static const char escapes[] = "\\\a\b\f\r\t\v";
- int c, col, width;
- const char *p;
- struct winsize win;
- static int termwidth = -1;
- size_t clen, i;
- wchar_t wc;
- mbstate_t mbs;
-
- if (outfile != stdout)
- termwidth = 60;
- if (termwidth == -1) {
- if ((p = getenv("COLUMNS")) && *p != '\0')
- termwidth = atoi(p);
- else if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &win) == 0 &&
- win.ws_col > 0)
- termwidth = win.ws_col;
- else
- termwidth = 60;
- }
- if (termwidth <= 0)
- termwidth = 1;
-
- memset(&mbs, 0, sizeof(mbs));
- col = 0;
- while (len != 0) {
- clen = mbrtowc(&wc, s, len, &mbs);
- if (clen == 0)
- clen = 1;
- if (clen == (size_t)-1 || clen == (size_t)-2) {
- wc = (unsigned char)*s;
- clen = 1;
- memset(&mbs, 0, sizeof(mbs));
- }
- if (wc == '\n') {
- if (col + 1 >= termwidth)
- fprintf(outfile, "\\\n");
- fputc('$', outfile);
- fputc('\n', outfile);
- col = 0;
- } else if (iswprint(wc)) {
- width = wcwidth(wc);
- if (col + width >= termwidth) {
- fprintf(outfile, "\\\n");
- col = 0;
- }
- fwrite(s, 1, clen, outfile);
- col += width;
- } else if (wc != L'\0' && (c = wctob(wc)) != EOF &&
- (p = strchr(escapes, c)) != NULL) {
- if (col + 2 >= termwidth) {
- fprintf(outfile, "\\\n");
- col = 0;
- }
- fprintf(outfile, "\\%c", "\\abfrtv"[p - escapes]);
- col += 2;
- } else {
- if (col + 4 * clen >= (unsigned)termwidth) {
- fprintf(outfile, "\\\n");
- col = 0;
- }
- for (i = 0; i < clen; i++)
- fprintf(outfile, "\\%03o",
- (int)(unsigned char)s[i]);
- col += 4 * clen;
- }
- s += clen;
- len -= clen;
- }
- if (col + 1 >= termwidth)
- fprintf(outfile, "\\\n");
- (void)fputc('$', outfile);
- (void)fputc('\n', outfile);
- if (ferror(outfile))
- errx(1, "%s: %s", outfname, strerror(errno ? errno : EIO));
-}
-
-static __inline int
-regexec_e(regex_t *preg, const char *string, int eflags, int nomatch,
- size_t slen)
-{
- int eval;
-
- if (preg == NULL) {
- if (defpreg == NULL)
- errx(1, "first RE may not be empty");
- } else
- defpreg = preg;
-
- /* Set anchors */
- match[0].rm_so = 0;
- match[0].rm_eo = slen;
-
- eval = regexec(defpreg, string,
- nomatch ? 0 : maxnsub + 1, match, eflags | REG_STARTEND);
- switch(eval) {
- case 0:
- return (1);
- case REG_NOMATCH:
- return (0);
- }
- errx(1, "RE error: %s", strregerror(eval, defpreg));
- /* NOTREACHED */
-}
-
-/*
- * regsub - perform substitutions after a regexp match
- * Based on a routine by Henry Spencer
- */
-static void
-regsub(SPACE *sp, char *string, char *src)
-{
- int len, no;
- char c, *dst;
-
-#define NEEDSP(reqlen) \
- /* XXX What is the +1 for? */ \
- if (sp->len + (reqlen) + 1 >= sp->blen) { \
- sp->blen += (reqlen) + 1024; \
- if ((sp->space = sp->back = realloc(sp->back, sp->blen)) \
- == NULL) \
- err(1, "realloc"); \
- dst = sp->space + sp->len; \
- }
-
- dst = sp->space + sp->len;
- while ((c = *src++) != '\0') {
- if (c == '&')
- no = 0;
- else if (c == '\\' && isdigit((unsigned char)*src))
- no = *src++ - '0';
- else
- no = -1;
- if (no < 0) { /* Ordinary character. */
- if (c == '\\' && (*src == '\\' || *src == '&'))
- c = *src++;
- NEEDSP(1);
- *dst++ = c;
- ++sp->len;
- } else if (match[no].rm_so != -1 && match[no].rm_eo != -1) {
- len = match[no].rm_eo - match[no].rm_so;
- NEEDSP(len);
- memmove(dst, string + match[no].rm_so, len);
- dst += len;
- sp->len += len;
- }
- }
- NEEDSP(1);
- *dst = '\0';
-}
-
-/*
- * cspace --
- * Concatenate space: append the source space to the destination space,
- * allocating new space as necessary.
- */
-void
-cspace(SPACE *sp, const char *p, size_t len, enum e_spflag spflag)
-{
- size_t tlen;
-
- /* Make sure SPACE has enough memory and ramp up quickly. */
- tlen = sp->len + len + 1;
- if (tlen > sp->blen) {
- sp->blen = tlen + 1024;
- if ((sp->space = sp->back = realloc(sp->back, sp->blen)) ==
- NULL)
- err(1, "realloc");
- }
-
- if (spflag == REPLACE)
- sp->len = 0;
-
- memmove(sp->space + sp->len, p, len);
-
- sp->space[sp->len += len] = '\0';
-}
-
-/*
- * Close all cached opened files and report any errors
- */
-void
-cfclose(struct s_command *cp, struct s_command *end)
-{
-
- for (; cp != end; cp = cp->next)
- switch(cp->code) {
- case 's':
- if (cp->u.s->wfd != -1 && close(cp->u.s->wfd))
- err(1, "%s", cp->u.s->wfile);
- cp->u.s->wfd = -1;
- break;
- case 'w':
- if (cp->u.fd != -1 && close(cp->u.fd))
- err(1, "%s", cp->t);
- cp->u.fd = -1;
- break;
- case '{':
- cfclose(cp->u.c, cp->next);
- break;
- }
-}
diff --git a/usr.bin/sed/sed.1 b/usr.bin/sed/sed.1
deleted file mode 100644
index f694f40..0000000
--- a/usr.bin/sed/sed.1
+++ /dev/null
@@ -1,626 +0,0 @@
-.\" Copyright (c) 1992, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)sed.1 8.2 (Berkeley) 12/30/93
-.\" $FreeBSD$
-.\"
-.Dd August 24, 2008
-.Dt SED 1
-.Os
-.Sh NAME
-.Nm sed
-.Nd stream editor
-.Sh SYNOPSIS
-.Nm
-.Op Fl Ealn
-.Ar command
-.Op Ar
-.Nm
-.Op Fl Ealn
-.Op Fl e Ar command
-.Op Fl f Ar command_file
-.Op Fl I Ar extension
-.Op Fl i Ar extension
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility reads the specified files, or the standard input if no files
-are specified, modifying the input as specified by a list of commands.
-The input is then written to the standard output.
-.Pp
-A single command may be specified as the first argument to
-.Nm .
-Multiple commands may be specified by using the
-.Fl e
-or
-.Fl f
-options.
-All commands are applied to the input in the order they are specified
-regardless of their origin.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl E
-Interpret regular expressions as extended (modern) regular expressions
-rather than basic regular expressions (BRE's).
-The
-.Xr re_format 7
-manual page fully describes both formats.
-.It Fl a
-The files listed as parameters for the
-.Dq w
-functions are created (or truncated) before any processing begins,
-by default.
-The
-.Fl a
-option causes
-.Nm
-to delay opening each file until a command containing the related
-.Dq w
-function is applied to a line of input.
-.It Fl e Ar command
-Append the editing commands specified by the
-.Ar command
-argument
-to the list of commands.
-.It Fl f Ar command_file
-Append the editing commands found in the file
-.Ar command_file
-to the list of commands.
-The editing commands should each be listed on a separate line.
-.It Fl I Ar extension
-Edit files in-place, saving backups with the specified
-.Ar extension .
-If a zero-length
-.Ar extension
-is given, no backup will be saved.
-It is not recommended to give a zero-length
-.Ar extension
-when in-place editing files, as you risk corruption or partial content
-in situations where disk space is exhausted, etc.
-.Pp
-Note that in-place editing with
-.Fl I
-still takes place in a single continuous line address space covering
-all files, although each file preserves its individuality instead of
-forming one output stream.
-The line counter is never reset between files, address ranges can span
-file boundaries, and the
-.Dq $
-address matches only the last line of the last file.
-(See
-.Sx "Sed Addresses" . )
-That can lead to unexpected results in many cases of in-place editing,
-where using
-.Fl i
-is desired.
-.It Fl i Ar extension
-Edit files in-place similarly to
-.Fl I ,
-but treat each file independently from other files.
-In particular, line numbers in each file start at 1,
-the
-.Dq $
-address matches the last line of the current file,
-and address ranges are limited to the current file.
-(See
-.Sx "Sed Addresses" . )
-The net result is as though each file were edited by a separate
-.Nm
-instance.
-.It Fl l
-Make output line buffered.
-.It Fl n
-By default, each line of input is echoed to the standard output after
-all of the commands have been applied to it.
-The
-.Fl n
-option suppresses this behavior.
-.El
-.Pp
-The form of a
-.Nm
-command is as follows:
-.Pp
-.Dl [address[,address]]function[arguments]
-.Pp
-Whitespace may be inserted before the first address and the function
-portions of the command.
-.Pp
-Normally,
-.Nm
-cyclically copies a line of input, not including its terminating newline
-character, into a
-.Em "pattern space" ,
-(unless there is something left after a
-.Dq D
-function),
-applies all of the commands with addresses that select that pattern space,
-copies the pattern space to the standard output, appending a newline, and
-deletes the pattern space.
-.Pp
-Some of the functions use a
-.Em "hold space"
-to save all or part of the pattern space for subsequent retrieval.
-.Sh "Sed Addresses"
-An address is not required, but if specified must have one of the
-following formats:
-.Bl -bullet -offset indent
-.It
-a number that counts
-input lines
-cumulatively across input files (or in each file independently
-if a
-.Fl i
-option is in effect);
-.It
-a dollar
-.Pq Dq $
-character that addresses the last line of input (or the last line
-of the current file if a
-.Fl i
-option was specified);
-.It
-a context address
-that consists of a regular expression preceded and followed by a
-delimiter. The closing delimiter can also optionally be followed by the
-.Dq I
-character, to indicate that the regular expression is to be matched
-in a case-insensitive way.
-.El
-.Pp
-A command line with no addresses selects every pattern space.
-.Pp
-A command line with one address selects all of the pattern spaces
-that match the address.
-.Pp
-A command line with two addresses selects an inclusive range.
-This
-range starts with the first pattern space that matches the first
-address.
-The end of the range is the next following pattern space
-that matches the second address.
-If the second address is a number
-less than or equal to the line number first selected, only that
-line is selected.
-In the case when the second address is a context
-address,
-.Nm
-does not re-match the second address against the
-pattern space that matched the first address.
-Starting at the
-first line following the selected range,
-.Nm
-starts looking again for the first address.
-.Pp
-Editing commands can be applied to non-selected pattern spaces by use
-of the exclamation character
-.Pq Dq \&!
-function.
-.Sh "Sed Regular Expressions"
-The regular expressions used in
-.Nm ,
-by default, are basic regular expressions (BREs, see
-.Xr re_format 7
-for more information), but extended (modern) regular expressions can be used
-instead if the
-.Fl E
-flag is given.
-In addition,
-.Nm
-has the following two additions to regular expressions:
-.Pp
-.Bl -enum -compact
-.It
-In a context address, any character other than a backslash
-.Pq Dq \e
-or newline character may be used to delimit the regular expression.
-The opening delimiter needs to be preceded by a backslash
-unless it is a slash.
-For example, the context address
-.Li \exabcx
-is equivalent to
-.Li /abc/ .
-Also, putting a backslash character before the delimiting character
-within the regular expression causes the character to be treated literally.
-For example, in the context address
-.Li \exabc\exdefx ,
-the RE delimiter is an
-.Dq x
-and the second
-.Dq x
-stands for itself, so that the regular expression is
-.Dq abcxdef .
-.Pp
-.It
-The escape sequence \en matches a newline character embedded in the
-pattern space.
-You cannot, however, use a literal newline character in an address or
-in the substitute command.
-.El
-.Pp
-One special feature of
-.Nm
-regular expressions is that they can default to the last regular
-expression used.
-If a regular expression is empty, i.e., just the delimiter characters
-are specified, the last regular expression encountered is used instead.
-The last regular expression is defined as the last regular expression
-used as part of an address or substitute command, and at run-time, not
-compile-time.
-For example, the command
-.Dq /abc/s//XXX/
-will substitute
-.Dq XXX
-for the pattern
-.Dq abc .
-.Sh "Sed Functions"
-In the following list of commands, the maximum number of permissible
-addresses for each command is indicated by [0addr], [1addr], or [2addr],
-representing zero, one, or two addresses.
-.Pp
-The argument
-.Em text
-consists of one or more lines.
-To embed a newline in the text, precede it with a backslash.
-Other backslashes in text are deleted and the following character
-taken literally.
-.Pp
-The
-.Dq r
-and
-.Dq w
-functions take an optional file parameter, which should be separated
-from the function letter by white space.
-Each file given as an argument to
-.Nm
-is created (or its contents truncated) before any input processing begins.
-.Pp
-The
-.Dq b ,
-.Dq r ,
-.Dq s ,
-.Dq t ,
-.Dq w ,
-.Dq y ,
-.Dq \&! ,
-and
-.Dq \&:
-functions all accept additional arguments.
-The following synopses indicate which arguments have to be separated from
-the function letters by white space characters.
-.Pp
-Two of the functions take a function-list.
-This is a list of
-.Nm
-functions separated by newlines, as follows:
-.Bd -literal -offset indent
-{ function
- function
- ...
- function
-}
-.Ed
-.Pp
-The
-.Dq {
-can be preceded by white space and can be followed by white space.
-The function can be preceded by white space.
-The terminating
-.Dq }
-must be preceded by a newline or optional white space.
-.Pp
-.Bl -tag -width "XXXXXX" -compact
-.It [2addr] function-list
-Execute function-list only when the pattern space is selected.
-.Pp
-.It [1addr]a\e
-.It text
-Write
-.Em text
-to standard output immediately before each attempt to read a line of input,
-whether by executing the
-.Dq N
-function or by beginning a new cycle.
-.Pp
-.It [2addr]b[label]
-Branch to the
-.Dq \&:
-function with the specified label.
-If the label is not specified, branch to the end of the script.
-.Pp
-.It [2addr]c\e
-.It text
-Delete the pattern space.
-With 0 or 1 address or at the end of a 2-address range,
-.Em text
-is written to the standard output.
-.Pp
-.It [2addr]d
-Delete the pattern space and start the next cycle.
-.Pp
-.It [2addr]D
-Delete the initial segment of the pattern space through the first
-newline character and start the next cycle.
-.Pp
-.It [2addr]g
-Replace the contents of the pattern space with the contents of the
-hold space.
-.Pp
-.It [2addr]G
-Append a newline character followed by the contents of the hold space
-to the pattern space.
-.Pp
-.It [2addr]h
-Replace the contents of the hold space with the contents of the
-pattern space.
-.Pp
-.It [2addr]H
-Append a newline character followed by the contents of the pattern space
-to the hold space.
-.Pp
-.It [1addr]i\e
-.It text
-Write
-.Em text
-to the standard output.
-.Pp
-.It [2addr]l
-(The letter ell.)
-Write the pattern space to the standard output in a visually unambiguous
-form.
-This form is as follows:
-.Pp
-.Bl -tag -width "carriage-returnXX" -offset indent -compact
-.It backslash
-\e\e
-.It alert
-\ea
-.It form-feed
-\ef
-.It carriage-return
-\er
-.It tab
-\et
-.It vertical tab
-\ev
-.El
-.Pp
-Nonprintable characters are written as three-digit octal numbers (with a
-preceding backslash) for each byte in the character (most significant byte
-first).
-Long lines are folded, with the point of folding indicated by displaying
-a backslash followed by a newline.
-The end of each line is marked with a
-.Dq $ .
-.Pp
-.It [2addr]n
-Write the pattern space to the standard output if the default output has
-not been suppressed, and replace the pattern space with the next line of
-input.
-.Pp
-.It [2addr]N
-Append the next line of input to the pattern space, using an embedded
-newline character to separate the appended material from the original
-contents.
-Note that the current line number changes.
-.Pp
-.It [2addr]p
-Write the pattern space to standard output.
-.Pp
-.It [2addr]P
-Write the pattern space, up to the first newline character to the
-standard output.
-.Pp
-.It [1addr]q
-Branch to the end of the script and quit without starting a new cycle.
-.Pp
-.It [1addr]r file
-Copy the contents of
-.Em file
-to the standard output immediately before the next attempt to read a
-line of input.
-If
-.Em file
-cannot be read for any reason, it is silently ignored and no error
-condition is set.
-.Pp
-.It [2addr]s/regular expression/replacement/flags
-Substitute the replacement string for the first instance of the regular
-expression in the pattern space.
-Any character other than backslash or newline can be used instead of
-a slash to delimit the RE and the replacement.
-Within the RE and the replacement, the RE delimiter itself can be used as
-a literal character if it is preceded by a backslash.
-.Pp
-An ampersand
-.Pq Dq &
-appearing in the replacement is replaced by the string matching the RE.
-The special meaning of
-.Dq &
-in this context can be suppressed by preceding it by a backslash.
-The string
-.Dq \e# ,
-where
-.Dq #
-is a digit, is replaced by the text matched
-by the corresponding backreference expression (see
-.Xr re_format 7 ) .
-.Pp
-A line can be split by substituting a newline character into it.
-To specify a newline character in the replacement string, precede it with
-a backslash.
-.Pp
-The value of
-.Em flags
-in the substitute function is zero or more of the following:
-.Bl -tag -width "XXXXXX" -offset indent
-.It Ar N
-Make the substitution only for the
-.Ar N Ns 'th
-occurrence of the regular expression in the pattern space.
-.It g
-Make the substitution for all non-overlapping matches of the
-regular expression, not just the first one.
-.It p
-Write the pattern space to standard output if a replacement was made.
-If the replacement string is identical to that which it replaces, it
-is still considered to have been a replacement.
-.It w Em file
-Append the pattern space to
-.Em file
-if a replacement was made.
-If the replacement string is identical to that which it replaces, it
-is still considered to have been a replacement.
-.It I
-Match the regular expression in a case-insensitive way.
-.El
-.Pp
-.It [2addr]t [label]
-Branch to the
-.Dq \&:
-function bearing the label if any substitutions have been made since the
-most recent reading of an input line or execution of a
-.Dq t
-function.
-If no label is specified, branch to the end of the script.
-.Pp
-.It [2addr]w Em file
-Append the pattern space to the
-.Em file .
-.Pp
-.It [2addr]x
-Swap the contents of the pattern and hold spaces.
-.Pp
-.It [2addr]y/string1/string2/
-Replace all occurrences of characters in
-.Em string1
-in the pattern space with the corresponding characters from
-.Em string2 .
-Any character other than a backslash or newline can be used instead of
-a slash to delimit the strings.
-Within
-.Em string1
-and
-.Em string2 ,
-a backslash followed by any character other than a newline is that literal
-character, and a backslash followed by an ``n'' is replaced by a newline
-character.
-.Pp
-.It [2addr]!function
-.It [2addr]!function-list
-Apply the function or function-list only to the lines that are
-.Em not
-selected by the address(es).
-.Pp
-.It [0addr]:label
-This function does nothing; it bears a label to which the
-.Dq b
-and
-.Dq t
-commands may branch.
-.Pp
-.It [1addr]=
-Write the line number to the standard output followed by a newline
-character.
-.Pp
-.It [0addr]
-Empty lines are ignored.
-.Pp
-.It [0addr]#
-The
-.Dq #
-and the remainder of the line are ignored (treated as a comment), with
-the single exception that if the first two characters in the file are
-.Dq #n ,
-the default output is suppressed.
-This is the same as specifying the
-.Fl n
-option on the command line.
-.El
-.Sh ENVIRONMENT
-The
-.Ev COLUMNS , LANG , LC_ALL , LC_CTYPE
-and
-.Ev LC_COLLATE
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr awk 1 ,
-.Xr ed 1 ,
-.Xr grep 1 ,
-.Xr regex 3 ,
-.Xr re_format 7
-.Sh STANDARDS
-The
-.Nm
-utility is expected to be a superset of the
-.St -p1003.2
-specification.
-.Pp
-The
-.Fl E , I , a
-and
-.Fl i
-options, as well as the
-.Dq I
-flag to the address regular expression and substitution command are
-non-standard
-.Fx
-extensions and may not be available on other operating systems.
-.Sh HISTORY
-A
-.Nm
-command, written by
-.An L. E. McMahon ,
-appeared in
-.At v7 .
-.Sh AUTHORS
-.An "Diomidis D. Spinellis" Aq dds@FreeBSD.org
-.Sh BUGS
-Multibyte characters containing a byte with value 0x5C
-.Tn ( ASCII
-.Ql \e )
-may be incorrectly treated as line continuation characters in arguments to the
-.Dq a ,
-.Dq c
-and
-.Dq i
-commands.
-Multibyte characters cannot be used as delimiters with the
-.Dq s
-and
-.Dq y
-commands.
diff --git a/usr.bin/setchannel/Makefile b/usr.bin/setchannel/Makefile
deleted file mode 100644
index 0ffb330..0000000
--- a/usr.bin/setchannel/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-PROG= setchannel
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/setchannel/setchannel.1 b/usr.bin/setchannel/setchannel.1
deleted file mode 100644
index c51ec3c..0000000
--- a/usr.bin/setchannel/setchannel.1
+++ /dev/null
@@ -1,104 +0,0 @@
-.\"
-.\ Copyright (C) 2004-2006 The FreeBSD Project. All rights reserved.
-.\
-.\ Redistribution and use in source and binary forms, with or without
-.\ modification, are permitted provided that the following conditions
-.\ are met:
-.\ 1. Redistributions of source code must retain the above copyright
-.\ notice, this list of conditions and the following disclaimer.
-.\ 2. Redistributions in binary form must reproduce the above copyright
-.\ notice, this list of conditions and the following disclaimer in the
-.\ documentation and/or other materials provided with the distribution.
-.\
-.\ THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\ ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
-.\ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\ SUCH DAMAGE.
-.\
-.\" $Id: cxm.4,v 1.1 2004/10/16 00:12:35 mavetju Exp $
-.\" $FreeBSD$
-.\"
-.Dd November 30, 2006
-.Dt pvr250-setchannel 1
-.Os
-.Sh NAME
-.Nm pvr250-setchannel
-.Nd Hauppage PVR250/350 channel selector
-.Sh SYNOPSIS
-.Cd pvr250-setchannel [-a {on | off}] [-c | -r | -s | -t] [-g geom] [-m channel_set] [channel | freq]
-.Pp
-.Sh DESCRIPTION
-.Nm
-provides support for selecting channels on Hauppauge WinTV cards,
-including the PVR 150, PVR 250, PVR 350 and PVR 500.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl a Cm on
-Enable AFC.
-.It Fl a Cm off
-Disable AFC.
-.It Fl c
-Select composite input.
-.It Fl d
-Select the tuner unit number.
-This is appended to the base device file name
-.Pa /dev/cxm
-to form a device name such as
-.Pa /dev/cxm0
-or
-.Pa /dev/cxm1 .
-.It Fl r
-Select radio input.
-.It Fl s
-Select svideo input.
-.It Fl t
-Select tuner.
-.It Fl g Cm geom
-Select geometry. The first resolution is for NTSC, the second for
-PAL.
-.Pp
- VCD: 352x240 or 352x288
- SVCD: 480x480 or 480x576
- DVD (half D1): 352x480 or 352x576
- DVD (full D1): 720x480 or 720x576
-.It Fl m Cm channel-set
-Select channel set and system.
-.Pp
- 0 = Tuner Default
- 1 = US Broadcast (NTSC)
- 2 = US Cable (NTSC)
- 4 = Western Europe (PAL)
- 5 = Japan Broadcast (NTSC)
- 6 = Japan Cable (NTSC)
- 8 = Australia (PAL)
- 9 = France (SECAM)
-.It Cm channel
-Channel number to set.
-.It Cm freq
-Frequency in MHz (must include decimal point).
-.El
-.Sh AUTHORS
-.An -nosplit
-This program is made by
-.An John Wehle <john@feith.com>
-.Pp
-This man page is made by
-.An Edwin Groothuis <edwin@FreeBSD.org>
-.Sh SEE ALSO
-.Xr cxm 4 ,
-.Xr bktr 4 ,
-.Xr meteor 4
-.Sh HISTORY
-The
-.Nm
-program first appeared in the -multimedia mailing-list in January 2004. The
-.Nm
-program first appeared in the FreeBSD Ports collection in October 2004.
diff --git a/usr.bin/setchannel/setchannel.c b/usr.bin/setchannel/setchannel.c
deleted file mode 100644
index f6f3e20..0000000
--- a/usr.bin/setchannel/setchannel.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Copyright (c) 2003, 2004, 2005
- * John Wehle <john@feith.com>. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/* Set the channel of the tuner card. */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-
-#if __FreeBSD_version < 503001
-# include <machine/ioctl_meteor.h>
-# include <machine/ioctl_bt848.h>
-#else
-# include <dev/bktr/ioctl_meteor.h>
-# include <dev/bktr/ioctl_bt848.h>
-#endif
-
-
-static void
-usage()
-{
- printf
- ("Usage: setchannel [-a {on|off}] [-c | -r | -s | -t] "
- "[-g geom] [-m chnl_set] [chnl | freq]\n"
- " -a Enable / disable AFC.\n"
- " -c Select composite input.\n"
- " -d Select tuner unit number.\n"
- " -r Select radio input.\n"
- " -s Select svideo input.\n"
- " -t Select tuner.\n"
- " -g Select geometry.\n"
- " 352x240 or 352x288 = VCD\n"
- " 480x480 or 480x576 = SVCD\n"
- " 352x480 or 352x576 = DVD (half D1)\n"
- " 720x480 or 720x576 = DVD (full D1)\n"
- " -m Select channel set / system.\n"
- " 0 = Tuner Default\n"
- " %u = US Broadcast / NTSC\n"
- " %u = US Cable / NTSC\n"
- " %u = Western Europe / PAL\n"
- " %u = Japan Broadcast / NTSC\n"
- " %u = Japan Cable / NTSC\n"
- " %u = Australia / PAL\n"
- " %u = France / SECAM\n"
- " chnl Channel\n"
- " freq Frequency in MHz (must include decimal point).\n",
- CHNLSET_NABCST, CHNLSET_CABLEIRC, CHNLSET_WEUROPE, CHNLSET_JPNBCST,
- CHNLSET_JPNCABLE, CHNLSET_AUSTRALIA, CHNLSET_FRANCE);
-}
-
-#define DEVNAME_BASE "/dev/cxm"
-char dev_name[16];
-
-int
-main(int argc, char *argv[])
-{
- char *ptr;
- char *endptr;
- int afc;
- int audio;
- int c;
- int channel_set;
- int i;
- int status;
- int unit;
- int tfd;
- unsigned int channel;
- unsigned int fraction;
- unsigned int freq;
- unsigned int x_size;
- unsigned int y_size;
- unsigned long device;
- struct bktr_capture_area cap;
-
- afc = -1;
- audio = -1;
- channel = 0;
- channel_set = -1;
- device = 0;
- freq = 0;
- status = 0;
- unit = 0;
- x_size = 0;
- y_size = 0;
-
- while ((c = getopt(argc, argv, "a:cd:rg:m:st")) != -1)
- switch (c) {
-
- case 'a':
- if (strcasecmp(optarg, "on") == 0)
- afc = 1;
- else if (strcasecmp(optarg, "off") == 0)
- afc = 0;
- else {
- usage();
- exit(1);
- }
- break;
-
- case 'c':
- device = METEOR_INPUT_DEV2;
- audio = -1;
- break;
-
- case 'd':
- unit = atoi(optarg);
- break;
-
- case 'r':
- device = 0;
- audio = AUDIO_INTERN;
- break;
-
- case 's':
- device = METEOR_INPUT_DEV_SVIDEO;
- audio = -1;
- break;
-
- case 't':
- device = METEOR_INPUT_DEV1;
- audio = -1;
- break;
-
- case 'g':
- if (sscanf(optarg, "%ux%u", &x_size, &y_size) != 2
- || x_size == 0 || y_size == 0) {
- usage();
- exit(1);
- }
- break;
-
- case 'm':
- channel_set = atoi(optarg);
- if (channel_set < 0 || channel_set > CHNLSET_MAX) {
- usage();
- exit(1);
- }
- break;
-
- default:
- usage();
- exit(1);
- }
-
- if (optind < argc) {
-
- /*
- * A number containing a decimal point is the frequency in MHz.
- */
-
- if ((ptr = strchr(argv[optind], '.')) != NULL) {
- freq = strtol(argv[optind], &endptr, 10) * 1000;
- if (ptr != endptr) {
- usage();
- exit(1);
- }
-
- ptr++;
-
- fraction = strtol(ptr, &endptr, 10);
- if (!isdigit(*ptr) || *endptr != '\0') {
- usage();
- exit(1);
- }
-
- for (i = endptr - ptr; i > 3; i--)
- fraction /= 10;
- for (; i < 3; i++)
- fraction *= 10;
-
- freq += fraction;
- }
-
- /* An integer is the channel. */
- else
- channel = atoi(argv[optind]);
- }
-
- if (afc == -1 && audio == -1 && !device && x_size == 0 && y_size == 0
- && channel_set == -1 && !channel && !freq) {
- usage();
- exit(1);
- }
-
- sprintf(dev_name, DEVNAME_BASE "%d", unit);
- tfd = open(dev_name, O_RDONLY);
- if (tfd < 0) {
- fprintf(stderr, "Can't open %s: %s (%d)\n", dev_name,
- strerror(errno), errno);
- exit(1);
- }
-
- if (afc != -1)
- if (ioctl(tfd, TVTUNER_SETAFC, &afc) < 0) {
- perror("ioctl(tfd, TVTUNER_SETAFC) failed.");
- status = 1;
- }
-
- if (device)
- if (ioctl(tfd, METEORSINPUT, &device) < 0) {
- perror("ioctl(tfd, METEORSINPUT) failed.");
- status = 1;
- }
-
- if (audio != -1)
- if (ioctl(tfd, BT848_SAUDIO, &audio) < 0) {
- perror("ioctl(tfd, BT848_SAUDIO) failed.");
- status = 1;
- }
-
- if (ioctl(tfd, BT848_GAUDIO, &audio) < 0) {
- perror("ioctl(tfd, BT848_GAUDIO) failed.");
- status = 1;
- }
-
- if (x_size && y_size) {
- memset(&cap, 0, sizeof(cap));
- cap.x_size = x_size;
- cap.y_size = y_size;
- if (ioctl(tfd, BT848_SCAPAREA, &cap) < 0) {
- perror("ioctl(tfd, BT848_SCAPAREA) failed.");
- status = 1;
- }
- }
-
- if (channel_set != -1)
- if (ioctl(tfd, TVTUNER_SETTYPE, &channel_set) < 0) {
- perror("ioctl(tfd, TVTUNER_SETTYPE) failed.");
- status = 1;
- }
-
- if (channel) {
- if (ioctl(tfd, TVTUNER_SETCHNL, &channel) < 0) {
- perror("ioctl(tfd, TVTUNER_SETCHNL) failed.");
- status = 1;
- }
- } else if (freq) {
- if (audio == AUDIO_INTERN) {
- /* Convert from kHz to MHz * 100 */
- freq = freq / 10;
-
- if (ioctl(tfd, RADIO_SETFREQ, &freq) < 0) {
- perror("ioctl(tfd, RADIO_SETFREQ) failed.");
- status = 1;
- }
- } else {
- /* Convert from kHz to MHz * 16 */
- freq = (freq * 16) / 1000;
-
- if (ioctl(tfd, TVTUNER_SETFREQ, &freq) < 0) {
- perror("ioctl(tfd, TVTUNER_SETFREQ) failed.");
- status = 1;
- }
- }
- }
-
- close(tfd);
- exit(status);
-}
diff --git a/usr.bin/shar/Makefile b/usr.bin/shar/Makefile
deleted file mode 100644
index 9970eb5..0000000
--- a/usr.bin/shar/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-SCRIPTS=shar.sh
-MAN= shar.1
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/shar/shar.1 b/usr.bin/shar/shar.1
deleted file mode 100644
index 1143f9c..0000000
--- a/usr.bin/shar/shar.1
+++ /dev/null
@@ -1,111 +0,0 @@
-.\" Copyright (c) 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)shar.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 6, 1993
-.Dt SHAR 1
-.Os
-.Sh NAME
-.Nm shar
-.Nd create a shell archive of files
-.Sh SYNOPSIS
-.Nm
-.Ar
-.Sh DESCRIPTION
-The
-.Nm
-command writes a
-.Xr sh 1
-shell script to the standard output which will recreate the file
-hierarchy specified by the command line operands.
-Directories will be recreated and must be specified before the
-files they contain (the
-.Xr find 1
-utility does this correctly).
-.Pp
-The
-.Nm
-command is normally used for distributing files by
-.Xr ftp 1
-or
-.Xr mail 1 .
-.Sh EXAMPLES
-To create a shell archive of the program
-.Xr ls 1
-and mail it to Rick:
-.Bd -literal -offset indent
-cd ls
-shar `find . -print` \&| mail -s "ls source" rick
-.Ed
-.Pp
-To recreate the program directory:
-.Bd -literal -offset indent
-mkdir ls
-cd ls
-\&...
-<delete header lines and examine mailed archive>
-\&...
-sh archive
-.Ed
-.Sh SEE ALSO
-.Xr compress 1 ,
-.Xr mail 1 ,
-.Xr tar 1 ,
-.Xr uuencode 1
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.4 .
-.Sh BUGS
-The
-.Nm
-command makes no provisions for special types of files or files containing
-magic characters.
-The
-.Nm
-command cannot handle files without a newline ('\\n')
-as the last character.
-.Pp
-It is easy to insert trojan horses into
-.Nm
-files.
-It is strongly recommended that all shell archive files be examined
-before running them through
-.Xr sh 1 .
-Archives produced using this implementation of
-.Nm
-may be easily examined with the command:
-.Bd -literal -offset indent
-egrep -v '^[X#]' shar.file
-.Ed
diff --git a/usr.bin/shar/shar.sh b/usr.bin/shar/shar.sh
deleted file mode 100644
index 154c650..0000000
--- a/usr.bin/shar/shar.sh
+++ /dev/null
@@ -1,84 +0,0 @@
-#!/bin/sh -
-#
-# Copyright (c) 1990, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 4. Neither the name of the University nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# @(#)shar.sh 8.1 (Berkeley) 6/6/93
-#
-# $FreeBSD$
-
-if [ $# -eq 0 ]; then
- echo 'usage: shar file ...' 1>&2
- exit 64 # EX_USAGE
-fi
-
-for i
-do
- if [ ! \( -d $i -o -r $i \) ]; then
- echo "$i inaccessible or not exist" 1>&2
- exit 66 # EX_NOINPUT
- fi
-done
-
-cat << EOF
-# This is a shell archive. Save it in a file, remove anything before
-# this line, and then unpack it by entering "sh file". Note, it may
-# create directories; files and directories will be owned by you and
-# have default permissions.
-#
-# This archive contains:
-#
-EOF
-
-for i
-do
- echo "# $i"
-done
-
-echo "#"
-
-for i
-do
- if [ -d $i ]; then
- echo "echo c - $i"
- echo "mkdir -p $i > /dev/null 2>&1"
- else
- md5sum=`echo -n $i | md5`
- echo "echo x - $i"
- echo "sed 's/^X//' >$i << '$md5sum'"
- sed 's/^/X/' $i || exit
- echo "$md5sum"
- fi
-done
-echo exit
-echo ""
-
-exit 0
diff --git a/usr.bin/showmount/Makefile b/usr.bin/showmount/Makefile
deleted file mode 100644
index 5919909..0000000
--- a/usr.bin/showmount/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= showmount
-MAN= showmount.8
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/showmount/showmount.8 b/usr.bin/showmount/showmount.8
deleted file mode 100644
index fe53d88..0000000
--- a/usr.bin/showmount/showmount.8
+++ /dev/null
@@ -1,104 +0,0 @@
-.\" Copyright (c) 1989, 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Rick Macklem at The University of Guelph.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)showmount.8 8.3 (Berkeley) 3/29/95
-.\" $FreeBSD$
-.\"
-.Dd March 29, 1995
-.Dt SHOWMOUNT 8
-.Os
-.Sh NAME
-.Nm showmount
-.Nd show remote nfs mounts on host
-.Sh SYNOPSIS
-.Nm
-.Op Fl a | d
-.Op Fl e3
-.Op Ar host
-.Sh DESCRIPTION
-The
-.Nm
-utility shows status information about the
-.Tn NFS
-server on
-.Ar host .
-By default it prints the names of all hosts that have
-.Tn NFS
-file systems mounted
-on the host.
-See
-.%T "NFS: Network File System Protocol Specification" ,
-RFC 1094,
-Appendix A,
-and
-.%T "NFS: Network File System Version 3 Protocol Specification" ,
-Appendix I,
-for a detailed description of the protocol.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl a
-List all mount points in the form:
-.Bd -ragged -offset indent -compact
-.Ar host : Ns Ar dirpath .
-.Ed
-.It Fl d
-List directory paths of mount points instead of hosts.
-.It Fl e
-Show the
-.Ar host Ns 's
-exports list.
-.It Fl 3
-Use mount protocol Version 3, compatible with
-.Tn NFS
-Version 3.
-.El
-.Sh SEE ALSO
-.Xr mount 8 ,
-.Xr mountd 8 ,
-.Xr mount_nfs 8
-.Sh HISTORY
-The
-.Nm
-utility first appeared in
-.Bx 4.4 .
-.Sh BUGS
-The mount daemon running on the server only has an idea of the actual mounts,
-since the
-.Tn NFS
-server is stateless.
-The
-.Nm
-utility will only display the information
-as accurately as the mount daemon reports it.
diff --git a/usr.bin/showmount/showmount.c b/usr.bin/showmount/showmount.c
deleted file mode 100644
index b9ea200..0000000
--- a/usr.bin/showmount/showmount.c
+++ /dev/null
@@ -1,404 +0,0 @@
-/*
- * Copyright (c) 1989, 1993, 1995
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Rick Macklem at The University of Guelph.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1989, 1993, 1995\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)showmount.c 8.3 (Berkeley) 3/29/95";
-#endif
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <sys/types.h>
-#include <sys/queue.h>
-#include <sys/file.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-
-#include <err.h>
-#include <netdb.h>
-#include <rpc/rpc.h>
-#include <rpc/pmap_clnt.h>
-#include <rpc/pmap_prot.h>
-#include <nfs/rpcv2.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-/* Constant defs */
-#define ALL 1
-#define DIRS 2
-
-#define DODUMP 0x1
-#define DOEXPORTS 0x2
-
-struct mountlist {
- struct mountlist *ml_left;
- struct mountlist *ml_right;
- char ml_host[RPCMNT_NAMELEN+1];
- char ml_dirp[RPCMNT_PATHLEN+1];
-};
-
-struct grouplist {
- struct grouplist *gr_next;
- char gr_name[RPCMNT_NAMELEN+1];
-};
-
-struct exportslist {
- struct exportslist *ex_next;
- struct grouplist *ex_groups;
- char ex_dirp[RPCMNT_PATHLEN+1];
-};
-
-static struct mountlist *mntdump;
-static struct exportslist *exports;
-static int type = 0;
-
-void print_dump(struct mountlist *);
-static void usage(void);
-int xdr_mntdump(XDR *, struct mountlist **);
-int xdr_exports(XDR *, struct exportslist **);
-int tcp_callrpc(const char *host, int prognum, int versnum, int procnum,
- xdrproc_t inproc, char *in, xdrproc_t outproc, char *out);
-
-/*
- * This command queries the NFS mount daemon for it's mount list and/or
- * it's exports list and prints them out.
- * See "NFS: Network File System Protocol Specification, RFC1094, Appendix A"
- * and the "Network File System Protocol XXX.."
- * for detailed information on the protocol.
- */
-int
-main(argc, argv)
- int argc;
- char **argv;
-{
- register struct exportslist *exp;
- register struct grouplist *grp;
- register int rpcs = 0, mntvers = 1;
- const char *host;
- int ch, estat;
-
- while ((ch = getopt(argc, argv, "ade3")) != -1)
- switch (ch) {
- case 'a':
- if (type == 0) {
- type = ALL;
- rpcs |= DODUMP;
- } else
- usage();
- break;
- case 'd':
- if (type == 0) {
- type = DIRS;
- rpcs |= DODUMP;
- } else
- usage();
- break;
- case 'e':
- rpcs |= DOEXPORTS;
- break;
- case '3':
- mntvers = 3;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (argc > 0)
- host = *argv;
- else
- host = "localhost";
-
- if (rpcs == 0)
- rpcs = DODUMP;
-
- if (rpcs & DODUMP)
- if ((estat = tcp_callrpc(host, RPCPROG_MNT, mntvers,
- RPCMNT_DUMP, (xdrproc_t)xdr_void, (char *)0,
- (xdrproc_t)xdr_mntdump, (char *)&mntdump)) != 0) {
- clnt_perrno(estat);
- errx(1, "can't do mountdump rpc");
- }
- if (rpcs & DOEXPORTS)
- if ((estat = tcp_callrpc(host, RPCPROG_MNT, mntvers,
- RPCMNT_EXPORT, (xdrproc_t)xdr_void, (char *)0,
- (xdrproc_t)xdr_exports, (char *)&exports)) != 0) {
- clnt_perrno(estat);
- errx(1, "can't do exports rpc");
- }
-
- /* Now just print out the results */
- if (rpcs & DODUMP) {
- switch (type) {
- case ALL:
- printf("All mount points on %s:\n", host);
- break;
- case DIRS:
- printf("Directories on %s:\n", host);
- break;
- default:
- printf("Hosts on %s:\n", host);
- break;
- };
- print_dump(mntdump);
- }
- if (rpcs & DOEXPORTS) {
- printf("Exports list on %s:\n", host);
- exp = exports;
- while (exp) {
- printf("%-35s", exp->ex_dirp);
- grp = exp->ex_groups;
- if (grp == NULL) {
- printf("Everyone\n");
- } else {
- while (grp) {
- printf("%s ", grp->gr_name);
- grp = grp->gr_next;
- }
- printf("\n");
- }
- exp = exp->ex_next;
- }
- }
- exit(0);
-}
-
-/*
- * tcp_callrpc has the same interface as callrpc, but tries to
- * use tcp as transport method in order to handle large replies.
- */
-int
-tcp_callrpc(host, prognum, versnum, procnum, inproc, in, outproc, out)
- const char *host;
- int prognum;
- int versnum;
- int procnum;
- xdrproc_t inproc;
- char *in;
- xdrproc_t outproc;
- char *out;
-{
- CLIENT *client;
- struct timeval timeout;
- int rval;
-
- if ((client = clnt_create(host, prognum, versnum, "tcp")) == NULL &&
- (client = clnt_create(host, prognum, versnum, "udp")) == NULL)
- return ((int) rpc_createerr.cf_stat);
-
- timeout.tv_sec = 25;
- timeout.tv_usec = 0;
- rval = (int) clnt_call(client, procnum,
- inproc, in,
- outproc, out,
- timeout);
- clnt_destroy(client);
- return rval;
-}
-
-/*
- * Xdr routine for retrieving the mount dump list
- */
-int
-xdr_mntdump(xdrsp, mlp)
- XDR *xdrsp;
- struct mountlist **mlp;
-{
- register struct mountlist *mp;
- register struct mountlist *tp;
- register struct mountlist **otp;
- int val, val2;
- int bool;
- char *strp;
-
- *mlp = (struct mountlist *)0;
- if (!xdr_bool(xdrsp, &bool))
- return (0);
- while (bool) {
- mp = (struct mountlist *)malloc(sizeof(struct mountlist));
- if (mp == NULL)
- return (0);
- mp->ml_left = mp->ml_right = (struct mountlist *)0;
- strp = mp->ml_host;
- if (!xdr_string(xdrsp, &strp, RPCMNT_NAMELEN))
- return (0);
- strp = mp->ml_dirp;
- if (!xdr_string(xdrsp, &strp, RPCMNT_PATHLEN))
- return (0);
-
- /*
- * Build a binary tree on sorted order of either host or dirp.
- * Drop any duplications.
- */
- if (*mlp == NULL) {
- *mlp = mp;
- } else {
- tp = *mlp;
- while (tp) {
- val = strcmp(mp->ml_host, tp->ml_host);
- val2 = strcmp(mp->ml_dirp, tp->ml_dirp);
- switch (type) {
- case ALL:
- if (val == 0) {
- if (val2 == 0) {
- free((caddr_t)mp);
- goto next;
- }
- val = val2;
- }
- break;
- case DIRS:
- if (val2 == 0) {
- free((caddr_t)mp);
- goto next;
- }
- val = val2;
- break;
- default:
- if (val == 0) {
- free((caddr_t)mp);
- goto next;
- }
- break;
- };
- if (val < 0) {
- otp = &tp->ml_left;
- tp = tp->ml_left;
- } else {
- otp = &tp->ml_right;
- tp = tp->ml_right;
- }
- }
- *otp = mp;
- }
-next:
- if (!xdr_bool(xdrsp, &bool))
- return (0);
- }
- return (1);
-}
-
-/*
- * Xdr routine to retrieve exports list
- */
-int
-xdr_exports(xdrsp, exp)
- XDR *xdrsp;
- struct exportslist **exp;
-{
- register struct exportslist *ep;
- register struct grouplist *gp;
- int bool, grpbool;
- char *strp;
-
- *exp = (struct exportslist *)0;
- if (!xdr_bool(xdrsp, &bool))
- return (0);
- while (bool) {
- ep = (struct exportslist *)malloc(sizeof(struct exportslist));
- if (ep == NULL)
- return (0);
- ep->ex_groups = (struct grouplist *)0;
- strp = ep->ex_dirp;
- if (!xdr_string(xdrsp, &strp, RPCMNT_PATHLEN))
- return (0);
- if (!xdr_bool(xdrsp, &grpbool))
- return (0);
- while (grpbool) {
- gp = (struct grouplist *)malloc(sizeof(struct grouplist));
- if (gp == NULL)
- return (0);
- strp = gp->gr_name;
- if (!xdr_string(xdrsp, &strp, RPCMNT_NAMELEN))
- return (0);
- gp->gr_next = ep->ex_groups;
- ep->ex_groups = gp;
- if (!xdr_bool(xdrsp, &grpbool))
- return (0);
- }
- ep->ex_next = *exp;
- *exp = ep;
- if (!xdr_bool(xdrsp, &bool))
- return (0);
- }
- return (1);
-}
-
-static void
-usage()
-{
- fprintf(stderr, "usage: showmount [-a | -d] [-e3] [host]\n");
- exit(1);
-}
-
-/*
- * Print the binary tree in inorder so that output is sorted.
- */
-void
-print_dump(mp)
- struct mountlist *mp;
-{
-
- if (mp == NULL)
- return;
- if (mp->ml_left)
- print_dump(mp->ml_left);
- switch (type) {
- case ALL:
- printf("%s:%s\n", mp->ml_host, mp->ml_dirp);
- break;
- case DIRS:
- printf("%s\n", mp->ml_dirp);
- break;
- default:
- printf("%s\n", mp->ml_host);
- break;
- };
- if (mp->ml_right)
- print_dump(mp->ml_right);
-}
diff --git a/usr.bin/smbutil/Makefile b/usr.bin/smbutil/Makefile
deleted file mode 100644
index 13b5078..0000000
--- a/usr.bin/smbutil/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-# $FreeBSD$
-
-PROG= smbutil
-SRCS= smbutil.c dumptree.c login.c lookup.c view.c print.c
-
-DPADD= ${LIBSMB} ${LIBKICONV}
-LDADD= -lsmb -lkiconv
-
-CONTRIBDIR= ${.CURDIR}/../../contrib/smbfs
-CFLAGS+= -I${CONTRIBDIR}/include
-
-.PATH: ${CONTRIBDIR}/smbutil
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/sockstat/Makefile b/usr.bin/sockstat/Makefile
deleted file mode 100644
index 55e7025..0000000
--- a/usr.bin/sockstat/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# $FreeBSD$
-
-PROG= sockstat
-WARNS?= 4
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/sockstat/sockstat.1 b/usr.bin/sockstat/sockstat.1
deleted file mode 100644
index 3edf0cf..0000000
--- a/usr.bin/sockstat/sockstat.1
+++ /dev/null
@@ -1,168 +0,0 @@
-.\"-
-.\" Copyright (c) 1999 Dag-Erling Coïdan Smørgrav
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer
-.\" in this position and unchanged.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. The name of the author may not be used to endorse or promote products
-.\" derived from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd May 18, 2008
-.Dt SOCKSTAT 1
-.Os
-.Sh NAME
-.Nm sockstat
-.Nd list open sockets
-.Sh SYNOPSIS
-.Nm
-.Op Fl 46cLlu
-.Op Fl p Ar ports
-.Op Fl P Ar protocols
-.Sh DESCRIPTION
-The
-.Nm
-command lists open Internet or
-.Ux
-domain sockets.
-.Pp
-The following options are available:
-.Bl -tag -width Fl
-.It Fl 4
-Show
-.Dv AF_INET
-(IPv4) sockets.
-.It Fl 6
-Show
-.Dv AF_INET6
-(IPv6) sockets.
-.It Fl c
-Show connected sockets.
-.It Fl L
-Only show Internet sockets if the local or foreign addresses are not
-in the loopback network prefix
-.Li 127.0.0.0/8 ,
-or do not contain the IPv6 loopback address
-.Li ::1 .
-.It Fl l
-Show listening sockets.
-.It Fl p Ar ports
-Only show Internet sockets if either the local or foreign port number
-is on the specified list.
-The
-.Ar ports
-argument is a comma-separated list of port numbers and ranges
-specified as first and last port separated by a dash.
-.It Fl P Ar protocols
-Only show sockets of the specified
-.Ar protocols .
-The
-.Ar protocols
-argument is a comma-separated list of protocol names,
-as they are defined in
-.Xr protocols 5 .
-.It Fl u
-Show
-.Dv AF_LOCAL
-.Pq Ux
-sockets.
-.El
-.Pp
-If neither
-.Fl 4 , 6
-or
-.Fl u
-is specified,
-.Nm
-will list sockets in all three domains.
-.Pp
-If neither
-.Fl c
-or
-.Fl l
-is specified,
-.Nm
-will list both listening and connected sockets.
-.Pp
-The information listed for each
-socket is:
-.Bl -tag -width "FOREIGN ADDRESS"
-.It Li USER
-The user who owns the socket.
-.It Li COMMAND
-The command which holds the socket.
-.It Li PID
-The process ID of the command which holds the socket.
-.It Li FD
-The file descriptor number of the socket.
-.It Li PROTO
-The transport protocol associated with the socket for Internet
-sockets, or the type of socket (stream or datagram) for
-.Ux
-sockets.
-.It Li LOCAL ADDRESS
-For Internet sockets, this is the address the local end of the socket
-is bound to (see
-.Xr getsockname 2 ) .
-For bound
-.Ux
-sockets, it is the socket's filename.
-For other
-.Ux
-sockets, it is a right arrow followed by the endpoint's filename, or
-.Dq Li ??
-if the endpoint could not be determined.
-.It Li FOREIGN ADDRESS
-(Internet sockets only)
-The address the foreign end of the socket is bound to (see
-.Xr getpeername 2 ) .
-.El
-.Pp
-Note that TCP sockets in the
-.Dv AF_INET
-or
-.Dv AF_INET6
-domains that are not in one of the
-.Dv LISTEN , SYN_SENT ,
-or
-.Dv ESTABLISHED
-states may not be shown by
-.Nm ;
-use
-.Xr netstat 1
-to examine them instead.
-.Sh SEE ALSO
-.Xr fstat 1 ,
-.Xr netstat 1 ,
-.Xr inet 4 ,
-.Xr inet6 4 ,
-.Xr protocols 5
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Fx 3.1 .
-.Sh AUTHORS
-The
-.Nm
-command and this manual page were written by
-.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org .
diff --git a/usr.bin/sockstat/sockstat.c b/usr.bin/sockstat/sockstat.c
deleted file mode 100644
index 627c958..0000000
--- a/usr.bin/sockstat/sockstat.c
+++ /dev/null
@@ -1,754 +0,0 @@
-/*-
- * Copyright (c) 2002 Dag-Erling Coïdan Smørgrav
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/sysctl.h>
-#include <sys/file.h>
-#include <sys/user.h>
-
-#include <sys/un.h>
-#include <sys/unpcb.h>
-
-#include <net/route.h>
-
-#include <netinet/in.h>
-#include <netinet/in_pcb.h>
-#include <netinet/tcp.h>
-#include <netinet/tcp_seq.h>
-#include <netinet/tcp_var.h>
-#include <arpa/inet.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <netdb.h>
-#include <pwd.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-static int opt_4; /* Show IPv4 sockets */
-static int opt_6; /* Show IPv6 sockets */
-static int opt_c; /* Show connected sockets */
-static int opt_L; /* Don't show IPv4 or IPv6 loopback sockets */
-static int opt_l; /* Show listening sockets */
-static int opt_u; /* Show Unix domain sockets */
-static int opt_v; /* Verbose mode */
-
-/*
- * Default protocols to use if no -P was defined.
- */
-static const char *default_protos[] = {"tcp", "udp", "divert" };
-static size_t default_numprotos =
- sizeof(default_protos) / sizeof(default_protos[0]);
-
-static int *protos; /* protocols to use */
-static size_t numprotos; /* allocated size of protos[] */
-
-static int *ports;
-
-#define INT_BIT (sizeof(int)*CHAR_BIT)
-#define SET_PORT(p) do { ports[p / INT_BIT] |= 1 << (p % INT_BIT); } while (0)
-#define CHK_PORT(p) (ports[p / INT_BIT] & (1 << (p % INT_BIT)))
-
-struct sock {
- void *socket;
- void *pcb;
- int vflag;
- int family;
- int proto;
- const char *protoname;
- struct sockaddr_storage laddr;
- struct sockaddr_storage faddr;
- struct sock *next;
-};
-
-#define HASHSIZE 1009
-static struct sock *sockhash[HASHSIZE];
-
-static struct xfile *xfiles;
-static int nxfiles;
-
-static int
-xprintf(const char *fmt, ...)
-{
- va_list ap;
- int len;
-
- va_start(ap, fmt);
- len = vprintf(fmt, ap);
- va_end(ap);
- if (len < 0)
- err(1, "printf()");
- return (len);
-}
-
-
-static int
-get_proto_type(const char *proto)
-{
- struct protoent *pent;
-
- if (strlen(proto) == 0)
- return (0);
- pent = getprotobyname(proto);
- if (pent == NULL) {
- warn("getprotobyname");
- return (-1);
- }
- return (pent->p_proto);
-}
-
-
-static void init_protos(int num)
-{
- int proto_count = 0;
-
- if (num > 0) {
- proto_count = num;
- } else {
- /* Find the maximum number of possible protocols. */
- while (getprotoent() != NULL)
- proto_count++;
- endprotoent();
- }
-
- if ((protos = malloc(sizeof(int) * proto_count)) == NULL)
- err(1, "malloc");
- numprotos = proto_count;
-}
-
-
-static int
-parse_protos(char *protospec)
-{
- char *prot;
- char *tmp = protospec;
- int proto_type, proto_index;
-
- if (protospec == NULL)
- return (-1);
-
- init_protos(0);
- proto_index = 0;
- while ((prot = strsep(&tmp, ",")) != NULL) {
- if (strlen(prot) == 0)
- continue;
- proto_type = get_proto_type(prot);
- if (proto_type != -1)
- protos[proto_index++] = proto_type;
- }
- numprotos = proto_index;
- return (proto_index);
-}
-
-
-static void
-parse_ports(const char *portspec)
-{
- const char *p, *q;
- int port, end;
-
- if (ports == NULL)
- if ((ports = calloc(65536 / INT_BIT, sizeof(int))) == NULL)
- err(1, "calloc()");
- p = portspec;
- while (*p != '\0') {
- if (!isdigit(*p))
- errx(1, "syntax error in port range");
- for (q = p; *q != '\0' && isdigit(*q); ++q)
- /* nothing */ ;
- for (port = 0; p < q; ++p)
- port = port * 10 + digittoint(*p);
- if (port < 0 || port > 65535)
- errx(1, "invalid port number");
- SET_PORT(port);
- switch (*p) {
- case '-':
- ++p;
- break;
- case ',':
- ++p;
- /* fall through */
- case '\0':
- default:
- continue;
- }
- for (q = p; *q != '\0' && isdigit(*q); ++q)
- /* nothing */ ;
- for (end = 0; p < q; ++p)
- end = end * 10 + digittoint(*p);
- if (end < port || end > 65535)
- errx(1, "invalid port number");
- while (port++ < end)
- SET_PORT(port);
- if (*p == ',')
- ++p;
- }
-}
-
-static void
-sockaddr(struct sockaddr_storage *sa, int af, void *addr, int port)
-{
- struct sockaddr_in *sin4;
- struct sockaddr_in6 *sin6;
-
- bzero(sa, sizeof *sa);
- switch (af) {
- case AF_INET:
- sin4 = (struct sockaddr_in *)sa;
- sin4->sin_len = sizeof *sin4;
- sin4->sin_family = af;
- sin4->sin_port = port;
- sin4->sin_addr = *(struct in_addr *)addr;
- break;
- case AF_INET6:
- sin6 = (struct sockaddr_in6 *)sa;
- sin6->sin6_len = sizeof *sin6;
- sin6->sin6_family = af;
- sin6->sin6_port = port;
- sin6->sin6_addr = *(struct in6_addr *)addr;
- break;
- default:
- abort();
- }
-}
-
-static void
-gather_inet(int proto)
-{
- struct xinpgen *xig, *exig;
- struct xinpcb *xip;
- struct xtcpcb *xtp;
- struct inpcb *inp;
- struct xsocket *so;
- struct sock *sock;
- const char *varname, *protoname;
- size_t len, bufsize;
- void *buf;
- int hash, retry, vflag;
-
- vflag = 0;
- if (opt_4)
- vflag |= INP_IPV4;
- if (opt_6)
- vflag |= INP_IPV6;
-
- switch (proto) {
- case IPPROTO_TCP:
- varname = "net.inet.tcp.pcblist";
- protoname = "tcp";
- break;
- case IPPROTO_UDP:
- varname = "net.inet.udp.pcblist";
- protoname = "udp";
- break;
- case IPPROTO_DIVERT:
- varname = "net.inet.divert.pcblist";
- protoname = "div";
- break;
- default:
- errx(1, "protocol %d not supported", proto);
- }
-
- buf = NULL;
- bufsize = 8192;
- retry = 5;
- do {
- for (;;) {
- if ((buf = realloc(buf, bufsize)) == NULL)
- err(1, "realloc()");
- len = bufsize;
- if (sysctlbyname(varname, buf, &len, NULL, 0) == 0)
- break;
- if (errno == ENOENT)
- goto out;
- if (errno != ENOMEM)
- err(1, "sysctlbyname()");
- bufsize *= 2;
- }
- xig = (struct xinpgen *)buf;
- exig = (struct xinpgen *)(void *)
- ((char *)buf + len - sizeof *exig);
- if (xig->xig_len != sizeof *xig ||
- exig->xig_len != sizeof *exig)
- errx(1, "struct xinpgen size mismatch");
- } while (xig->xig_gen != exig->xig_gen && retry--);
-
- if (xig->xig_gen != exig->xig_gen && opt_v)
- warnx("warning: data may be inconsistent");
-
- for (;;) {
- xig = (struct xinpgen *)(void *)((char *)xig + xig->xig_len);
- if (xig >= exig)
- break;
- switch (proto) {
- case IPPROTO_TCP:
- xtp = (struct xtcpcb *)xig;
- if (xtp->xt_len != sizeof *xtp) {
- warnx("struct xtcpcb size mismatch");
- goto out;
- }
- inp = &xtp->xt_inp;
- so = &xtp->xt_socket;
- break;
- case IPPROTO_UDP:
- case IPPROTO_DIVERT:
- xip = (struct xinpcb *)xig;
- if (xip->xi_len != sizeof *xip) {
- warnx("struct xinpcb size mismatch");
- goto out;
- }
- inp = &xip->xi_inp;
- so = &xip->xi_socket;
- break;
- default:
- errx(1, "protocol %d not supported", proto);
- }
- if ((inp->inp_vflag & vflag) == 0)
- continue;
- if (inp->inp_vflag & INP_IPV4) {
- if ((inp->inp_fport == 0 && !opt_l) ||
- (inp->inp_fport != 0 && !opt_c))
- continue;
-#define __IN_IS_ADDR_LOOPBACK(pina) \
- ((ntohl((pina)->s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET)
- if (opt_L &&
- (__IN_IS_ADDR_LOOPBACK(&inp->inp_faddr) ||
- __IN_IS_ADDR_LOOPBACK(&inp->inp_laddr)))
- continue;
-#undef __IN_IS_ADDR_LOOPBACK
- } else if (inp->inp_vflag & INP_IPV6) {
- if ((inp->in6p_fport == 0 && !opt_l) ||
- (inp->in6p_fport != 0 && !opt_c))
- continue;
- if (opt_L &&
- (IN6_IS_ADDR_LOOPBACK(&inp->in6p_faddr) ||
- IN6_IS_ADDR_LOOPBACK(&inp->in6p_laddr)))
- continue;
- } else {
- if (opt_v)
- warnx("invalid vflag 0x%x", inp->inp_vflag);
- continue;
- }
- if ((sock = calloc(1, sizeof *sock)) == NULL)
- err(1, "malloc()");
- sock->socket = so->xso_so;
- sock->proto = proto;
- if (inp->inp_vflag & INP_IPV4) {
- sock->family = AF_INET;
- sockaddr(&sock->laddr, sock->family,
- &inp->inp_laddr, inp->inp_lport);
- sockaddr(&sock->faddr, sock->family,
- &inp->inp_faddr, inp->inp_fport);
- } else if (inp->inp_vflag & INP_IPV6) {
- sock->family = AF_INET6;
- sockaddr(&sock->laddr, sock->family,
- &inp->in6p_laddr, inp->in6p_lport);
- sockaddr(&sock->faddr, sock->family,
- &inp->in6p_faddr, inp->in6p_fport);
- }
- sock->vflag = inp->inp_vflag;
- sock->protoname = protoname;
- hash = (int)((uintptr_t)sock->socket % HASHSIZE);
- sock->next = sockhash[hash];
- sockhash[hash] = sock;
- }
-out:
- free(buf);
-}
-
-static void
-gather_unix(int proto)
-{
- struct xunpgen *xug, *exug;
- struct xunpcb *xup;
- struct sock *sock;
- const char *varname, *protoname;
- size_t len, bufsize;
- void *buf;
- int hash, retry;
-
- switch (proto) {
- case SOCK_STREAM:
- varname = "net.local.stream.pcblist";
- protoname = "stream";
- break;
- case SOCK_DGRAM:
- varname = "net.local.dgram.pcblist";
- protoname = "dgram";
- break;
- default:
- abort();
- }
- buf = NULL;
- bufsize = 8192;
- retry = 5;
- do {
- for (;;) {
- if ((buf = realloc(buf, bufsize)) == NULL)
- err(1, "realloc()");
- len = bufsize;
- if (sysctlbyname(varname, buf, &len, NULL, 0) == 0)
- break;
- if (errno != ENOMEM)
- err(1, "sysctlbyname()");
- bufsize *= 2;
- }
- xug = (struct xunpgen *)buf;
- exug = (struct xunpgen *)(void *)
- ((char *)buf + len - sizeof *exug);
- if (xug->xug_len != sizeof *xug ||
- exug->xug_len != sizeof *exug) {
- warnx("struct xinpgen size mismatch");
- goto out;
- }
- } while (xug->xug_gen != exug->xug_gen && retry--);
-
- if (xug->xug_gen != exug->xug_gen && opt_v)
- warnx("warning: data may be inconsistent");
-
- for (;;) {
- xug = (struct xunpgen *)(void *)((char *)xug + xug->xug_len);
- if (xug >= exug)
- break;
- xup = (struct xunpcb *)xug;
- if (xup->xu_len != sizeof *xup) {
- warnx("struct xunpcb size mismatch");
- goto out;
- }
- if ((xup->xu_unp.unp_conn == NULL && !opt_l) ||
- (xup->xu_unp.unp_conn != NULL && !opt_c))
- continue;
- if ((sock = calloc(1, sizeof *sock)) == NULL)
- err(1, "malloc()");
- sock->socket = xup->xu_socket.xso_so;
- sock->pcb = xup->xu_unpp;
- sock->proto = proto;
- sock->family = AF_UNIX;
- sock->protoname = protoname;
- if (xup->xu_unp.unp_addr != NULL)
- sock->laddr =
- *(struct sockaddr_storage *)(void *)&xup->xu_addr;
- else if (xup->xu_unp.unp_conn != NULL)
- *(void **)&sock->faddr = xup->xu_unp.unp_conn;
- hash = (int)((uintptr_t)sock->socket % HASHSIZE);
- sock->next = sockhash[hash];
- sockhash[hash] = sock;
- }
-out:
- free(buf);
-}
-
-static void
-getfiles(void)
-{
- size_t len;
-
- if ((xfiles = malloc(len = sizeof *xfiles)) == NULL)
- err(1, "malloc()");
- while (sysctlbyname("kern.file", xfiles, &len, 0, 0) == -1) {
- if (errno != ENOMEM)
- err(1, "sysctlbyname()");
- len *= 2;
- if ((xfiles = realloc(xfiles, len)) == NULL)
- err(1, "realloc()");
- }
- if (len > 0 && xfiles->xf_size != sizeof *xfiles)
- errx(1, "struct xfile size mismatch");
- nxfiles = len / sizeof *xfiles;
-}
-
-static int
-printaddr(int af, struct sockaddr_storage *ss)
-{
- char addrstr[INET6_ADDRSTRLEN] = { '\0', '\0' };
- struct sockaddr_un *sun;
- void *addr;
- int off, port;
-
- switch (af) {
- case AF_INET:
- addr = &((struct sockaddr_in *)ss)->sin_addr;
- if (inet_lnaof(*(struct in_addr *)addr) == INADDR_ANY)
- addrstr[0] = '*';
- port = ntohs(((struct sockaddr_in *)ss)->sin_port);
- break;
- case AF_INET6:
- addr = &((struct sockaddr_in6 *)ss)->sin6_addr;
- if (IN6_IS_ADDR_UNSPECIFIED((struct in6_addr *)addr))
- addrstr[0] = '*';
- port = ntohs(((struct sockaddr_in6 *)ss)->sin6_port);
- break;
- case AF_UNIX:
- sun = (struct sockaddr_un *)ss;
- off = (int)((char *)&sun->sun_path - (char *)sun);
- return (xprintf("%.*s", sun->sun_len - off, sun->sun_path));
- }
- if (addrstr[0] == '\0')
- inet_ntop(af, addr, addrstr, sizeof addrstr);
- if (port == 0)
- return xprintf("%s:*", addrstr);
- else
- return xprintf("%s:%d", addrstr, port);
-}
-
-static const char *
-getprocname(pid_t pid)
-{
- static struct kinfo_proc proc;
- size_t len;
- int mib[4];
-
- mib[0] = CTL_KERN;
- mib[1] = KERN_PROC;
- mib[2] = KERN_PROC_PID;
- mib[3] = (int)pid;
- len = sizeof proc;
- if (sysctl(mib, 4, &proc, &len, NULL, 0) == -1) {
- /* Do not warn if the process exits before we get its name. */
- if (errno != ESRCH)
- warn("sysctl()");
- return ("??");
- }
- return (proc.ki_comm);
-}
-
-static int
-check_ports(struct sock *s)
-{
- int port;
-
- if (ports == NULL)
- return (1);
- if ((s->family != AF_INET) && (s->family != AF_INET6))
- return (1);
- if (s->family == AF_INET)
- port = ntohs(((struct sockaddr_in *)(&s->laddr))->sin_port);
- else
- port = ntohs(((struct sockaddr_in6 *)(&s->laddr))->sin6_port);
- if (CHK_PORT(port))
- return (1);
- if (s->family == AF_INET)
- port = ntohs(((struct sockaddr_in *)(&s->faddr))->sin_port);
- else
- port = ntohs(((struct sockaddr_in6 *)(&s->faddr))->sin6_port);
- if (CHK_PORT(port))
- return (1);
- return (0);
-}
-
-static void
-display(void)
-{
- struct passwd *pwd;
- struct xfile *xf;
- struct sock *s;
- void *p;
- int hash, n, pos;
-
- printf("%-8s %-10s %-5s %-2s %-6s %-21s %-21s\n",
- "USER", "COMMAND", "PID", "FD", "PROTO",
- "LOCAL ADDRESS", "FOREIGN ADDRESS");
- setpassent(1);
- for (xf = xfiles, n = 0; n < nxfiles; ++n, ++xf) {
- if (xf->xf_data == NULL)
- continue;
- hash = (int)((uintptr_t)xf->xf_data % HASHSIZE);
- for (s = sockhash[hash]; s != NULL; s = s->next)
- if ((void *)s->socket == xf->xf_data)
- break;
- if (s == NULL)
- continue;
- if (!check_ports(s))
- continue;
- pos = 0;
- if ((pwd = getpwuid(xf->xf_uid)) == NULL)
- pos += xprintf("%lu", (u_long)xf->xf_uid);
- else
- pos += xprintf("%s", pwd->pw_name);
- while (pos < 9)
- pos += xprintf(" ");
- pos += xprintf("%.10s", getprocname(xf->xf_pid));
- while (pos < 20)
- pos += xprintf(" ");
- pos += xprintf("%lu", (u_long)xf->xf_pid);
- while (pos < 26)
- pos += xprintf(" ");
- pos += xprintf("%d", xf->xf_fd);
- while (pos < 29)
- pos += xprintf(" ");
- pos += xprintf("%s", s->protoname);
- if (s->vflag & INP_IPV4)
- pos += xprintf("4");
- if (s->vflag & INP_IPV6)
- pos += xprintf("6");
- while (pos < 36)
- pos += xprintf(" ");
- switch (s->family) {
- case AF_INET:
- case AF_INET6:
- pos += printaddr(s->family, &s->laddr);
- while (pos < 58)
- pos += xprintf(" ");
- pos += printaddr(s->family, &s->faddr);
- break;
- case AF_UNIX:
- /* server */
- if (s->laddr.ss_len > 0) {
- pos += printaddr(s->family, &s->laddr);
- break;
- }
- /* client */
- p = *(void **)&s->faddr;
- if (p == NULL) {
- pos += xprintf("(not connected)");
- break;
- }
- pos += xprintf("-> ");
- for (hash = 0; hash < HASHSIZE; ++hash) {
- for (s = sockhash[hash]; s != NULL; s = s->next)
- if (s->pcb == p)
- break;
- if (s != NULL)
- break;
- }
- if (s == NULL || s->laddr.ss_len == 0)
- pos += xprintf("??");
- else
- pos += printaddr(s->family, &s->laddr);
- break;
- default:
- abort();
- }
- xprintf("\n");
- }
-}
-
-static int set_default_protos(void)
-{
- struct protoent *prot;
- const char *pname;
- size_t pindex;
-
- init_protos(default_numprotos);
-
- for (pindex = 0; pindex < default_numprotos; pindex++) {
- pname = default_protos[pindex];
- prot = getprotobyname(pname);
- if (prot == NULL)
- err(1, "getprotobyname: %s", pname);
- protos[pindex] = prot->p_proto;
- }
- numprotos = pindex;
- return (pindex);
-}
-
-
-static void
-usage(void)
-{
- fprintf(stderr,
- "Usage: sockstat [-46cLlu] [-p ports] [-P protocols]\n");
- exit(1);
-}
-
-int
-main(int argc, char *argv[])
-{
- int protos_defined = -1;
- int o, i;
-
- while ((o = getopt(argc, argv, "46cLlp:P:uv")) != -1)
- switch (o) {
- case '4':
- opt_4 = 1;
- break;
- case '6':
- opt_6 = 1;
- break;
- case 'c':
- opt_c = 1;
- break;
- case 'L':
- opt_L = 1;
- break;
- case 'l':
- opt_l = 1;
- break;
- case 'p':
- parse_ports(optarg);
- break;
- case 'P':
- protos_defined = parse_protos(optarg);
- break;
- case 'u':
- opt_u = 1;
- break;
- case 'v':
- ++opt_v;
- break;
- default:
- usage();
- }
-
- argc -= optind;
- argv += optind;
-
- if (argc > 0)
- usage();
-
- if ((!opt_4 && !opt_6) && protos_defined != -1)
- opt_4 = opt_6 = 1;
- if (!opt_4 && !opt_6 && !opt_u)
- opt_4 = opt_6 = opt_u = 1;
- if ((opt_4 || opt_6) && protos_defined == -1)
- protos_defined = set_default_protos();
- if (!opt_c && !opt_l)
- opt_c = opt_l = 1;
-
- if (opt_4 || opt_6) {
- for (i = 0; i < protos_defined; i++)
- gather_inet(protos[i]);
- }
-
- if (opt_u || (protos_defined == -1 && !opt_4 && !opt_6)) {
- gather_unix(SOCK_STREAM);
- gather_unix(SOCK_DGRAM);
- }
- getfiles();
- display();
- exit(0);
-}
diff --git a/usr.bin/split/Makefile b/usr.bin/split/Makefile
deleted file mode 100644
index d176fdd..0000000
--- a/usr.bin/split/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= split
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/split/split.1 b/usr.bin/split/split.1
deleted file mode 100644
index 7825219..0000000
--- a/usr.bin/split/split.1
+++ /dev/null
@@ -1,179 +0,0 @@
-.\" Copyright (c) 1990, 1991, 1993, 1994
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)split.1 8.3 (Berkeley) 4/16/94
-.\" $FreeBSD$
-.\"
-.Dd March 16, 2008
-.Dt SPLIT 1
-.Os
-.Sh NAME
-.Nm split
-.Nd split a file into pieces
-.Sh SYNOPSIS
-.Nm
-.Op Fl l Ar line_count
-.Op Fl a Ar suffix_length
-.Op Ar file Op Ar prefix
-.Nm
-.Fl b Ar byte_count Ns
-.Oo
-.Sm off
-.Cm K | k | M | m | G | g
-.Sm on
-.Oc
-.Op Fl a Ar suffix_length
-.Op Ar file Op Ar prefix
-.Nm
-.Fl n Ar chunk_count
-.Op Fl a Ar suffix_length
-.Op Ar file Op Ar prefix
-.Nm
-.Fl p Ar pattern
-.Op Fl a Ar suffix_length
-.Op Ar file Op Ar prefix
-.Sh DESCRIPTION
-The
-.Nm
-utility reads the given
-.Ar file
-and breaks it up into files of 1000 lines each
-(if no options are specified), leaving the
-.Ar file
-unchanged.
-If
-.Ar file
-is a single dash
-.Pq Sq Fl
-or absent,
-.Nm
-reads from the standard input.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl a Ar suffix_length
-Use
-.Ar suffix_length
-letters to form the suffix of the file name.
-.It Fl b Ar byte_count Ns Oo
-.Sm off
-.Cm K | k | M | m | G | g
-.Sm on
-.Oc
-Create smaller files
-.Ar byte_count
-bytes in length.
-If
-.Cm k
-or
-.Cm K
-is appended to the number, the file is split into
-.Ar byte_count
-kilobyte pieces.
-If
-.Cm m
-or
-.Cm M
-is appended to the number, the file is split into
-.Ar byte_count
-megabyte pieces.
-If
-.Cm g
-or
-.Cm G
-is appended to the number, the file is split into
-.Ar byte_count
-gigabyte pieces.
-.It Fl l Ar line_count
-Create smaller files
-.Ar line_count
-lines in length.
-.It Fl n Ar chunk_count
-Split file int
-.Ar chunk_count
-smaller files.
-.It Fl p Ar pattern
-The file is split whenever an input line matches
-.Ar pattern ,
-which is interpreted as an extended regular expression.
-The matching line will be the first line of the next output file.
-This option is incompatible with the
-.Fl b
-and
-.Fl l
-options.
-.El
-.Pp
-If additional arguments are specified, the first is used as the name
-of the input file which is to be split.
-If a second additional argument is specified, it is used as a prefix
-for the names of the files into which the file is split.
-In this case, each file into which the file is split is named by the
-prefix followed by a lexically ordered suffix using
-.Ar suffix_length
-characters in the range
-.Dq Li a Ns - Ns Li z .
-If
-.Fl a
-is not specified, two letters are used as the suffix.
-.Pp
-If the
-.Ar prefix
-argument is not specified, the file is split into lexically ordered
-files named with the prefix
-.Dq Li x
-and with suffixes as above.
-.Sh ENVIRONMENT
-The
-.Ev LANG , LC_ALL , LC_CTYPE
-and
-.Ev LC_COLLATE
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr csplit 1 ,
-.Xr re_format 7
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v3 .
-.Sh BUGS
-The maximum line length for matching patterns is 65536.
diff --git a/usr.bin/split/split.c b/usr.bin/split/split.c
deleted file mode 100644
index 22818e4..0000000
--- a/usr.bin/split/split.c
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- * Copyright (c) 1987, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1987, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "@(#)split.c 8.2 (Berkeley) 4/16/94";
-#endif
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <limits.h>
-#include <locale.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <regex.h>
-#include <sysexits.h>
-
-#define DEFLINE 1000 /* Default num lines per file. */
-
-off_t bytecnt; /* Byte count to split on. */
-off_t chunks = 0; /* Chunks count to split into. */
-long numlines; /* Line count to split on. */
-int file_open; /* If a file open. */
-int ifd = -1, ofd = -1; /* Input/output file descriptors. */
-char bfr[MAXBSIZE]; /* I/O buffer. */
-char fname[MAXPATHLEN]; /* File name prefix. */
-regex_t rgx;
-int pflag;
-long sufflen = 2; /* File name suffix length. */
-
-static void newfile(void);
-static void split1(void);
-static void split2(void);
-static void split3(void);
-static void usage(void);
-
-int
-main(int argc, char **argv)
-{
- intmax_t bytecnti;
- long scale;
- int ch;
- char *ep, *p;
-
- setlocale(LC_ALL, "");
-
- while ((ch = getopt(argc, argv, "0123456789a:b:l:n:p:")) != -1)
- switch (ch) {
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- /*
- * Undocumented kludge: split was originally designed
- * to take a number after a dash.
- */
- if (numlines == 0) {
- p = argv[optind - 1];
- if (p[0] == '-' && p[1] == ch && !p[2])
- numlines = strtol(++p, &ep, 10);
- else
- numlines =
- strtol(argv[optind] + 1, &ep, 10);
- if (numlines <= 0 || *ep)
- errx(EX_USAGE,
- "%s: illegal line count", optarg);
- }
- break;
- case 'a': /* Suffix length */
- if ((sufflen = strtol(optarg, &ep, 10)) <= 0 || *ep)
- errx(EX_USAGE,
- "%s: illegal suffix length", optarg);
- break;
- case 'b': /* Byte count. */
- errno = 0;
- if ((bytecnti = strtoimax(optarg, &ep, 10)) <= 0 ||
- strchr("kKmMgG", *ep) == NULL || errno != 0)
- errx(EX_USAGE,
- "%s: illegal byte count", optarg);
- if (*ep == 'k' || *ep == 'K')
- scale = 1024;
- else if (*ep == 'm' || *ep == 'M')
- scale = 1024 * 1024;
- else if (*ep == 'g' || *ep == 'G')
- scale = 1024 * 1024 * 1024;
- else
- scale = 1;
- if (bytecnti > OFF_MAX / scale)
- errx(EX_USAGE, "%s: offset too large", optarg);
- bytecnt = (off_t)(bytecnti * scale);
- break;
- case 'l': /* Line count. */
- if (numlines != 0)
- usage();
- if ((numlines = strtol(optarg, &ep, 10)) <= 0 || *ep)
- errx(EX_USAGE,
- "%s: illegal line count", optarg);
- break;
- case 'n': /* Chunks. */
- if (!isdigit((unsigned char)optarg[0]) ||
- (chunks = (size_t)strtoul(optarg, &ep, 10)) == 0 ||
- *ep != '\0') {
- errx(EX_USAGE, "%s: illegal number of chunks",
- optarg);
- }
- break;
-
- case 'p': /* pattern matching. */
- if (regcomp(&rgx, optarg, REG_EXTENDED|REG_NOSUB) != 0)
- errx(EX_USAGE, "%s: illegal regexp", optarg);
- pflag = 1;
- break;
- default:
- usage();
- }
- argv += optind;
- argc -= optind;
-
- if (*argv != NULL) { /* Input file. */
- if (strcmp(*argv, "-") == 0)
- ifd = STDIN_FILENO;
- else if ((ifd = open(*argv, O_RDONLY, 0)) < 0)
- err(EX_NOINPUT, "%s", *argv);
- ++argv;
- }
- if (*argv != NULL) /* File name prefix. */
- if (strlcpy(fname, *argv++, sizeof(fname)) >= sizeof(fname))
- errx(EX_USAGE, "file name prefix is too long");
- if (*argv != NULL)
- usage();
-
- if (strlen(fname) + (unsigned long)sufflen >= sizeof(fname))
- errx(EX_USAGE, "suffix is too long");
- if (pflag && (numlines != 0 || bytecnt != 0 || chunks != 0))
- usage();
-
- if (numlines == 0)
- numlines = DEFLINE;
- else if (bytecnt != 0 || chunks != 0)
- usage();
-
- if (bytecnt && chunks)
- usage();
-
- if (ifd == -1) /* Stdin by default. */
- ifd = 0;
-
- if (bytecnt) {
- split1();
- exit (0);
- } else if (chunks) {
- split3();
- exit (0);
- }
- split2();
- if (pflag)
- regfree(&rgx);
- exit(0);
-}
-
-/*
- * split1 --
- * Split the input by bytes.
- */
-static void
-split1(void)
-{
- off_t bcnt;
- char *C;
- ssize_t dist, len;
- int nfiles;
-
- nfiles = 0;
-
- for (bcnt = 0;;)
- switch ((len = read(ifd, bfr, MAXBSIZE))) {
- case 0:
- exit(0);
- case -1:
- err(EX_IOERR, "read");
- /* NOTREACHED */
- default:
- if (!file_open) {
- if (!chunks || (nfiles < chunks)) {
- newfile();
- nfiles++;
- }
- }
- if (bcnt + len >= bytecnt) {
- dist = bytecnt - bcnt;
- if (write(ofd, bfr, dist) != dist)
- err(EX_IOERR, "write");
- len -= dist;
- for (C = bfr + dist; len >= bytecnt;
- len -= bytecnt, C += bytecnt) {
- if (!chunks || (nfiles < chunks)) {
- newfile();
- nfiles++;
- }
- if (write(ofd,
- C, bytecnt) != bytecnt)
- err(EX_IOERR, "write");
- }
- if (len != 0) {
- if (!chunks || (nfiles < chunks)) {
- newfile();
- nfiles++;
- }
- if (write(ofd, C, len) != len)
- err(EX_IOERR, "write");
- } else
- file_open = 0;
- bcnt = len;
- } else {
- bcnt += len;
- if (write(ofd, bfr, len) != len)
- err(EX_IOERR, "write");
- }
- }
-}
-
-/*
- * split2 --
- * Split the input by lines.
- */
-static void
-split2(void)
-{
- long lcnt = 0;
- FILE *infp;
-
- /* Stick a stream on top of input file descriptor */
- if ((infp = fdopen(ifd, "r")) == NULL)
- err(EX_NOINPUT, "fdopen");
-
- /* Process input one line at a time */
- while (fgets(bfr, sizeof(bfr), infp) != NULL) {
- const int len = strlen(bfr);
-
- /* If line is too long to deal with, just write it out */
- if (bfr[len - 1] != '\n')
- goto writeit;
-
- /* Check if we need to start a new file */
- if (pflag) {
- regmatch_t pmatch;
-
- pmatch.rm_so = 0;
- pmatch.rm_eo = len - 1;
- if (regexec(&rgx, bfr, 0, &pmatch, REG_STARTEND) == 0)
- newfile();
- } else if (lcnt++ == numlines) {
- newfile();
- lcnt = 1;
- }
-
-writeit:
- /* Open output file if needed */
- if (!file_open)
- newfile();
-
- /* Write out line */
- if (write(ofd, bfr, len) != len)
- err(EX_IOERR, "write");
- }
-
- /* EOF or error? */
- if (ferror(infp))
- err(EX_IOERR, "read");
- else
- exit(0);
-}
-
-/*
- * split3 --
- * Split the input into specified number of chunks
- */
-static void
-split3(void)
-{
- struct stat sb;
-
- if (fstat(ifd, &sb) == -1) {
- err(1, "stat");
- /* NOTREACHED */
- }
-
- if (chunks > sb.st_size) {
- errx(1, "can't split into more than %d files",
- (int)sb.st_size);
- /* NOTREACHED */
- }
-
- bytecnt = sb.st_size / chunks;
- split1();
-}
-
-
-/*
- * newfile --
- * Open a new output file.
- */
-static void
-newfile(void)
-{
- long i, maxfiles, tfnum;
- static long fnum;
- static int defname;
- static char *fpnt;
-
- if (ofd == -1) {
- if (fname[0] == '\0') {
- fname[0] = 'x';
- fpnt = fname + 1;
- defname = 1;
- } else {
- fpnt = fname + strlen(fname);
- defname = 0;
- }
- ofd = fileno(stdout);
- }
-
- /* maxfiles = 26^sufflen, but don't use libm. */
- for (maxfiles = 1, i = 0; i < sufflen; i++)
- if ((maxfiles *= 26) <= 0)
- errx(EX_USAGE, "suffix is too long (max %ld)", i);
-
- if (fnum == maxfiles)
- errx(EX_DATAERR, "too many files");
-
- /* Generate suffix of sufflen letters */
- tfnum = fnum;
- i = sufflen - 1;
- do {
- fpnt[i] = tfnum % 26 + 'a';
- tfnum /= 26;
- } while (i-- > 0);
- fpnt[sufflen] = '\0';
-
- ++fnum;
- if (!freopen(fname, "w", stdout))
- err(EX_IOERR, "%s", fname);
- file_open = 1;
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr,
-"usage: split [-l line_count] [-a suffix_length] [file [prefix]]\n"
-" split -b byte_count[K|k|M|m|G|g] [-a suffix_length] [file [prefix]]\n"
-" split -n chunk_count [-a suffix_length] [file [prefix]]\n"
-" split -p pattern [-a suffix_length] [file [prefix]]\n");
- exit(EX_USAGE);
-}
diff --git a/usr.bin/stat/Makefile b/usr.bin/stat/Makefile
deleted file mode 100644
index 808c41e..0000000
--- a/usr.bin/stat/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# $FreeBSD$
-
-PROG= stat
-WARNS?= 2
-
-LINKS= ${BINDIR}/stat ${BINDIR}/readlink
-MLINKS= stat.1 readlink.1
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/stat/stat.1 b/usr.bin/stat/stat.1
deleted file mode 100644
index b629341..0000000
--- a/usr.bin/stat/stat.1
+++ /dev/null
@@ -1,549 +0,0 @@
-.\" $NetBSD: stat.1,v 1.11 2003/05/08 13:07:10 wiz Exp $
-.\"
-.\" Copyright (c) 2002 The NetBSD Foundation, Inc.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to The NetBSD Foundation
-.\" by Andrew Brown and Jan Schaumann.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the NetBSD
-.\" Foundation, Inc. and its contributors.
-.\" 4. Neither the name of The NetBSD Foundation nor the names of its
-.\" contributors may be used to endorse or promote products derived
-.\" from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-.\" POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd April 27, 2007
-.Dt STAT 1
-.Os
-.Sh NAME
-.Nm stat ,
-.Nm readlink
-.Nd display file status
-.Sh SYNOPSIS
-.Nm
-.Op Fl FLnq
-.Op Fl f Ar format | Fl l | r | s | x
-.Op Fl t Ar timefmt
-.Op Ar
-.Nm readlink
-.Op Fl n
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility displays information about the file pointed to by
-.Ar file .
-Read, write or execute permissions of the named file are not required, but
-all directories listed in the path name leading to the file must be
-searchable.
-If no argument is given,
-.Nm
-displays information about the file descriptor for standard input.
-.Pp
-When invoked as
-.Nm readlink ,
-only the target of the symbolic link is printed.
-If the given argument is not a symbolic link,
-.Nm readlink
-will print nothing and exit with an error.
-.Pp
-The information displayed is obtained by calling
-.Xr lstat 2
-with the given argument and evaluating the returned structure.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl F
-As in
-.Xr ls 1 ,
-display a slash
-.Pq Ql /
-immediately after each pathname that is a directory,
-an asterisk
-.Pq Ql *
-after each that is executable,
-an at sign
-.Pq Ql @
-after each symbolic link,
-a percent sign
-.Pq Ql %
-after each whiteout,
-an equal sign
-.Pq Ql =
-after each socket,
-and a vertical bar
-.Pq Ql |
-after each that is a FIFO.
-The use of
-.Fl F
-implies
-.Fl l .
-.It Fl L
-Use
-.Xr stat 2
-instead of
-.Xr lstat 2 .
-The information reported by
-.Nm
-will refer to the target of
-.Ar file ,
-if file is a symbolic link, and not to
-.Ar file
-itself.
-.It Fl n
-Do not force a newline to appear at the end of each piece of output.
-.It Fl q
-Suppress failure messages if calls to
-.Xr stat 2
-or
-.Xr lstat 2
-fail.
-When run as
-.Nm readlink ,
-error messages are automatically suppressed.
-.It Fl f Ar format
-Display information using the specified format.
-See the
-.Sx Formats
-section for a description of valid formats.
-.It Fl l
-Display output in
-.Nm ls Fl lT
-format.
-.It Fl r
-Display raw information.
-That is, for all the fields in the
-.Vt stat
-structure,
-display the raw, numerical value (for example, times in seconds since the
-epoch, etc.).
-.It Fl s
-Display information in
-.Dq "shell output" ,
-suitable for initializing variables.
-.It Fl x
-Display information in a more verbose way as known from some
-.Tn Linux
-distributions.
-.It Fl t Ar timefmt
-Display timestamps using the specified format.
-This format is
-passed directly to
-.Xr strftime 3 .
-.El
-.Ss Formats
-Format strings are similar to
-.Xr printf 3
-formats in that they start with
-.Cm % ,
-are then followed by a sequence of formatting characters, and end in
-a character that selects the field of the
-.Vt "struct stat"
-which is to be formatted.
-If the
-.Cm %
-is immediately followed by one of
-.Cm n , t , % ,
-or
-.Cm @ ,
-then a newline character, a tab character, a percent character,
-or the current file number is printed, otherwise the string is
-examined for the following:
-.Pp
-Any of the following optional flags:
-.Bl -tag -width indent
-.It Cm #
-Selects an alternate output form for octal and hexadecimal output.
-Non-zero octal output will have a leading zero, and non-zero
-hexadecimal output will have
-.Dq Li 0x
-prepended to it.
-.It Cm +
-Asserts that a sign indicating whether a number is positive or negative
-should always be printed.
-Non-negative numbers are not usually printed
-with a sign.
-.It Cm -
-Aligns string output to the left of the field, instead of to the right.
-.It Cm 0
-Sets the fill character for left padding to the
-.Ql 0
-character, instead of a space.
-.It space
-Reserves a space at the front of non-negative signed output fields.
-A
-.Sq Cm +
-overrides a space if both are used.
-.El
-.Pp
-Then the following fields:
-.Bl -tag -width indent
-.It Ar size
-An optional decimal digit string specifying the minimum field width.
-.It Ar prec
-An optional precision composed of a decimal point
-.Sq Cm \&.
-and a decimal digit string that indicates the maximum string length,
-the number of digits to appear after the decimal point in floating point
-output, or the minimum number of digits to appear in numeric output.
-.It Ar fmt
-An optional output format specifier which is one of
-.Cm D , O , U , X , F ,
-or
-.Cm S .
-These represent signed decimal output, octal output, unsigned decimal
-output, hexadecimal output, floating point output, and string output,
-respectively.
-Some output formats do not apply to all fields.
-Floating point output only applies to
-.Vt timespec
-fields (the
-.Cm a , m ,
-and
-.Cm c
-fields).
-.Pp
-The special output specifier
-.Cm S
-may be used to indicate that the output, if
-applicable, should be in string format.
-May be used in combination with:
-.Bl -tag -width indent
-.It Cm amc
-Display date in
-.Xr strftime 3
-format.
-.It Cm dr
-Display actual device name.
-.It Cm gu
-Display group or user name.
-.It Cm p
-Display the mode of
-.Ar file
-as in
-.Nm ls Fl lTd .
-.It Cm N
-Displays the name of
-.Ar file .
-.It Cm T
-Displays the type of
-.Ar file .
-.It Cm Y
-Insert a
-.Dq Li " -\*[Gt] "
-into the output.
-Note that the default output format
-for
-.Cm Y
-is a string, but if specified explicitly, these four characters are
-prepended.
-.El
-.It Ar sub
-An optional sub field specifier (high, middle, low).
-Only applies to
-the
-.Cm p , d , r ,
-and
-.Cm T
-output formats.
-It can be one of the following:
-.Bl -tag -width indent
-.It Cm H
-.Dq High
-\[em]
-specifies the major number for devices from
-.Cm r
-or
-.Cm d ,
-the
-.Dq user
-bits for permissions from the string form of
-.Cm p ,
-the file
-.Dq type
-bits from the numeric forms of
-.Cm p ,
-and the long output form of
-.Cm T .
-.It Cm L
-.Dq Low
-\[em]
-specifies the minor number for devices from
-.Cm r
-or
-.Cm d ,
-the
-.Dq other
-bits for permissions from the string form of
-.Cm p ,
-the
-.Dq user ,
-.Dq group ,
-and
-.Dq other
-bits from the numeric forms of
-.Cm p ,
-and the
-.Nm ls Fl F
-style output character for file type when used with
-.Cm T
-(the use of
-.Cm L
-for this is optional).
-.It Cm M
-.Dq Middle
-\[em]
-specifies the
-.Dq group
-bits for permissions from the
-string output form of
-.Cm p ,
-or the
-.Dq suid ,
-.Dq sgid ,
-and
-.Dq sticky
-bits for the numeric forms of
-.Cm p .
-.El
-.It Ar datum
-A required field specifier, being one of the following:
-.Bl -tag -width indent
-.It Cm d
-Device upon which
-.Ar file
-resides.
-.It Cm i
-.Ar file Ns 's
-inode number.
-.It Cm p
-File type and permissions.
-.It Cm l
-Number of hard links to
-.Ar file .
-.It Cm u , g
-User ID and group ID of
-.Ar file Ns 's
-owner.
-.It Cm r
-Device number for character and block device special files.
-.It Cm a , m , c , B
-The time
-.Ar file
-was last accessed or modified, of when the inode was last changed, or
-the birth time of the inode.
-.It Cm z
-The size of
-.Ar file
-in bytes.
-.It Cm b
-Number of blocks allocated for
-.Ar file .
-.It Cm k
-Optimal file system I/O operation block size.
-.It Cm f
-User defined flags for
-.Ar file .
-.It Cm v
-Inode generation number.
-.El
-.Pp
-The following four field specifiers are not drawn directly from the
-data in
-.Vt "struct stat" ,
-but are:
-.Bl -tag -width indent
-.It Cm N
-The name of the file.
-.It Cm T
-The file type, either as in
-.Nm ls Fl F
-or in a more descriptive form if the
-.Ar sub
-field specifier
-.Cm H
-is given.
-.It Cm Y
-The target of a symbolic link.
-.It Cm Z
-Expands to
-.Dq major,minor
-from the
-.Va rdev
-field for character or block
-special devices and gives size output for all others.
-.El
-.El
-.Pp
-Only the
-.Cm %
-and the field specifier are required.
-Most field specifiers default to
-.Cm U
-as an output form, with the
-exception of
-.Cm p
-which defaults to
-.Cm O ,
-.Cm a , m ,
-and
-.Cm c
-which default to
-.Cm D ,
-and
-.Cm Y , T ,
-and
-.Cm N
-which default to
-.Cm S .
-.Sh EXIT STATUS
-.Ex -std stat readlink
-.Sh EXAMPLES
-Given a symbolic link
-.Pa foo
-that points from
-.Pa /tmp/foo
-to
-.Pa / ,
-you would use
-.Nm
-as follows:
-.Bd -literal -offset indent
-\*[Gt] stat -F /tmp/foo
-lrwxrwxrwx 1 jschauma cs 1 Apr 24 16:37:28 2002 /tmp/foo@ -\*[Gt] /
-
-\*[Gt] stat -LF /tmp/foo
-drwxr-xr-x 16 root wheel 512 Apr 19 10:57:54 2002 /tmp/foo/
-.Ed
-.Pp
-To initialize some shell variables, you could use the
-.Fl s
-flag as follows:
-.Bd -literal -offset indent
-\*[Gt] csh
-% eval set `stat -s .cshrc`
-% echo $st_size $st_mtimespec
-1148 1015432481
-
-\*[Gt] sh
-$ eval $(stat -s .profile)
-$ echo $st_size $st_mtimespec
-1148 1015432481
-.Ed
-.Pp
-In order to get a list of file types including files pointed to if the
-file is a symbolic link, you could use the following format:
-.Bd -literal -offset indent
-$ stat -f "%N: %HT%SY" /tmp/*
-/tmp/bar: Symbolic Link -\*[Gt] /tmp/foo
-/tmp/output25568: Regular File
-/tmp/blah: Directory
-/tmp/foo: Symbolic Link -\*[Gt] /
-.Ed
-.Pp
-In order to get a list of the devices, their types and the major and minor
-device numbers, formatted with tabs and linebreaks, you could use the
-following format:
-.Bd -literal -offset indent
-stat -f "Name: %N%n%tType: %HT%n%tMajor: %Hr%n%tMinor: %Lr%n%n" /dev/*
-[...]
-Name: /dev/wt8
- Type: Block Device
- Major: 3
- Minor: 8
-
-Name: /dev/zero
- Type: Character Device
- Major: 2
- Minor: 12
-.Ed
-.Pp
-In order to determine the permissions set on a file separately, you could use
-the following format:
-.Bd -literal -offset indent
-\*[Gt] stat -f "%Sp -\*[Gt] owner=%SHp group=%SMp other=%SLp" .
-drwxr-xr-x -\*[Gt] owner=rwx group=r-x other=r-x
-.Ed
-.Pp
-In order to determine the three files that have been modified most recently,
-you could use the following format:
-.Bd -literal -offset indent
-\*[Gt] stat -f "%m%t%Sm %N" /tmp/* | sort -rn | head -3 | cut -f2-
-Apr 25 11:47:00 2002 /tmp/blah
-Apr 25 10:36:34 2002 /tmp/bar
-Apr 24 16:47:35 2002 /tmp/foo
-.Ed
-.Pp
-To display a file's modification time:
-.Bd -literal -offset indent
-\*[Gt] stat -f %m /tmp/foo
-1177697733
-.Ed
-.Pp
-To display the same modification time in a readable format:
-.Bd -literal -offset indent
-\*[Gt] stat -f %Sm /tmp/foo
-Apr 27 11:15:33 2007
-.Ed
-.Pp
-To display the same modification time in a readable and sortable format:
-.Bd -literal -offset indent
-\*[Gt] stat -f %Sm -t %Y%m%d%H%M%S /tmp/foo
-20070427111533
-.Ed
-.Pp
-To display the same in UTC:
-.Bd -literal -offset indent
-\*[Gt] sh
-$ TZ= stat -f %Sm -t %Y%m%d%H%M%S /tmp/foo
-20070427181533
-.Ed
-.Sh SEE ALSO
-.Xr file 1 ,
-.Xr ls 1 ,
-.Xr lstat 2 ,
-.Xr readlink 2 ,
-.Xr stat 2 ,
-.Xr printf 3 ,
-.Xr strftime 3
-.Sh HISTORY
-The
-.Nm
-utility appeared in
-.Nx 1.6
-and
-.Fx 4.10 .
-.Sh AUTHORS
-.An -nosplit
-The
-.Nm
-utility was written by
-.An Andrew Brown
-.Aq atatat@NetBSD.org .
-This man page was written by
-.An Jan Schaumann
-.Aq jschauma@NetBSD.org .
diff --git a/usr.bin/stat/stat.c b/usr.bin/stat/stat.c
deleted file mode 100644
index b67627e..0000000
--- a/usr.bin/stat/stat.c
+++ /dev/null
@@ -1,988 +0,0 @@
-/*
- * Copyright (c) 2002 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Andrew Brown.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if 0
-#ifndef lint
-__RCSID("$NetBSD: stat.c,v 1.13 2003/07/25 03:21:17 atatat Exp $");
-#endif
-#endif
-
-__FBSDID("$FreeBSD$");
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#else /* HAVE_CONFIG_H */
-#define HAVE_STRUCT_STAT_ST_FLAGS 1
-#define HAVE_STRUCT_STAT_ST_GEN 1
-#define HAVE_STRUCT_STAT_ST_BIRTHTIME 1
-#define HAVE_STRUCT_STAT_ST_MTIMENSEC 1
-#define HAVE_DEVNAME 1
-#endif /* HAVE_CONFIG_H */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <grp.h>
-#include <limits.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#if HAVE_STRUCT_STAT_ST_FLAGS
-#define DEF_F "%#Xf "
-#define RAW_F "%f "
-#define SHELL_F " st_flags=%f"
-#else /* HAVE_STRUCT_STAT_ST_FLAGS */
-#define DEF_F
-#define RAW_F
-#define SHELL_F
-#endif /* HAVE_STRUCT_STAT_ST_FLAGS */
-
-#if HAVE_STRUCT_STAT_ST_BIRTHTIME
-#define DEF_B "\"%SB\" "
-#define RAW_B "%B "
-#define SHELL_B "st_birthtime=%B "
-#else /* HAVE_STRUCT_STAT_ST_BIRTHTIME */
-#define DEF_B
-#define RAW_B
-#define SHELL_B
-#endif /* HAVE_STRUCT_STAT_ST_BIRTHTIME */
-
-#if HAVE_STRUCT_STAT_ST_ATIM
-#define st_atimespec st_atim
-#define st_ctimespec st_ctim
-#define st_mtimespec st_mtim
-#endif /* HAVE_STRUCT_STAT_ST_ATIM */
-
-#define DEF_FORMAT \
- "%d %i %Sp %l %Su %Sg %r %z \"%Sa\" \"%Sm\" \"%Sc\" " DEF_B \
- "%k %b " DEF_F "%N"
-#define RAW_FORMAT "%d %i %#p %l %u %g %r %z %a %m %c " RAW_B \
- "%k %b " RAW_F "%N"
-#define LS_FORMAT "%Sp %l %Su %Sg %Z %Sm %N%SY"
-#define LSF_FORMAT "%Sp %l %Su %Sg %Z %Sm %N%T%SY"
-#define SHELL_FORMAT \
- "st_dev=%d st_ino=%i st_mode=%#p st_nlink=%l " \
- "st_uid=%u st_gid=%g st_rdev=%r st_size=%z " \
- "st_atime=%a st_mtime=%m st_ctime=%c " SHELL_B \
- "st_blksize=%k st_blocks=%b" SHELL_F
-#define LINUX_FORMAT \
- " File: \"%N\"%n" \
- " Size: %-11z FileType: %HT%n" \
- " Mode: (%04OLp/%.10Sp) Uid: (%5u/%8Su) Gid: (%5g/%8Sg)%n" \
- "Device: %Hd,%Ld Inode: %i Links: %l%n" \
- "Access: %Sa%n" \
- "Modify: %Sm%n" \
- "Change: %Sc"
-
-#define TIME_FORMAT "%b %e %T %Y"
-
-#define FLAG_POUND 0x01
-#define FLAG_SPACE 0x02
-#define FLAG_PLUS 0x04
-#define FLAG_ZERO 0x08
-#define FLAG_MINUS 0x10
-
-/*
- * These format characters must all be unique, except the magic one.
- */
-#define FMT_MAGIC '%'
-#define FMT_DOT '.'
-
-#define SIMPLE_NEWLINE 'n'
-#define SIMPLE_TAB 't'
-#define SIMPLE_PERCENT '%'
-#define SIMPLE_NUMBER '@'
-
-#define FMT_POUND '#'
-#define FMT_SPACE ' '
-#define FMT_PLUS '+'
-#define FMT_ZERO '0'
-#define FMT_MINUS '-'
-
-#define FMT_DECIMAL 'D'
-#define FMT_OCTAL 'O'
-#define FMT_UNSIGNED 'U'
-#define FMT_HEX 'X'
-#define FMT_FLOAT 'F'
-#define FMT_STRING 'S'
-
-#define FMTF_DECIMAL 0x01
-#define FMTF_OCTAL 0x02
-#define FMTF_UNSIGNED 0x04
-#define FMTF_HEX 0x08
-#define FMTF_FLOAT 0x10
-#define FMTF_STRING 0x20
-
-#define HIGH_PIECE 'H'
-#define MIDDLE_PIECE 'M'
-#define LOW_PIECE 'L'
-
-#define SHOW_st_dev 'd'
-#define SHOW_st_ino 'i'
-#define SHOW_st_mode 'p'
-#define SHOW_st_nlink 'l'
-#define SHOW_st_uid 'u'
-#define SHOW_st_gid 'g'
-#define SHOW_st_rdev 'r'
-#define SHOW_st_atime 'a'
-#define SHOW_st_mtime 'm'
-#define SHOW_st_ctime 'c'
-#define SHOW_st_btime 'B'
-#define SHOW_st_size 'z'
-#define SHOW_st_blocks 'b'
-#define SHOW_st_blksize 'k'
-#define SHOW_st_flags 'f'
-#define SHOW_st_gen 'v'
-#define SHOW_symlink 'Y'
-#define SHOW_filetype 'T'
-#define SHOW_filename 'N'
-#define SHOW_sizerdev 'Z'
-
-void usage(const char *);
-void output(const struct stat *, const char *,
- const char *, int, int, int);
-int format1(const struct stat *, /* stat info */
- const char *, /* the file name */
- const char *, int, /* the format string itself */
- char *, size_t, /* a place to put the output */
- int, int, int, int, /* the parsed format */
- int, int);
-
-char *timefmt;
-int linkfail;
-
-#define addchar(s, c, nl) \
- do { \
- (void)fputc((c), (s)); \
- (*nl) = ((c) == '\n'); \
- } while (0/*CONSTCOND*/)
-
-int
-main(int argc, char *argv[])
-{
- struct stat st;
- int ch, rc, errs, am_readlink;
- int lsF, fmtchar, usestat, fn, nonl, quiet;
- char *statfmt, *options, *synopsis;
-
- am_readlink = 0;
- lsF = 0;
- fmtchar = '\0';
- usestat = 0;
- nonl = 0;
- quiet = 0;
- linkfail = 0;
- statfmt = NULL;
- timefmt = NULL;
-
- if (strcmp(getprogname(), "readlink") == 0) {
- am_readlink = 1;
- options = "n";
- synopsis = "[-n] [file ...]";
- statfmt = "%Y";
- fmtchar = 'f';
- quiet = 1;
- } else {
- options = "f:FlLnqrst:x";
- synopsis = "[-FlLnqrsx] [-f format] [-t timefmt] [file ...]";
- }
-
- while ((ch = getopt(argc, argv, options)) != -1)
- switch (ch) {
- case 'F':
- lsF = 1;
- break;
- case 'L':
- usestat = 1;
- break;
- case 'n':
- nonl = 1;
- break;
- case 'q':
- quiet = 1;
- break;
- case 'f':
- statfmt = optarg;
- /* FALLTHROUGH */
- case 'l':
- case 'r':
- case 's':
- case 'x':
- if (fmtchar != 0)
- errx(1, "can't use format '%c' with '%c'",
- fmtchar, ch);
- fmtchar = ch;
- break;
- case 't':
- timefmt = optarg;
- break;
- default:
- usage(synopsis);
- }
-
- argc -= optind;
- argv += optind;
- fn = 1;
-
- if (fmtchar == '\0') {
- if (lsF)
- fmtchar = 'l';
- else {
- fmtchar = 'f';
- statfmt = DEF_FORMAT;
- }
- }
-
- if (lsF && fmtchar != 'l')
- errx(1, "can't use format '%c' with -F", fmtchar);
-
- switch (fmtchar) {
- case 'f':
- /* statfmt already set */
- break;
- case 'l':
- statfmt = lsF ? LSF_FORMAT : LS_FORMAT;
- break;
- case 'r':
- statfmt = RAW_FORMAT;
- break;
- case 's':
- statfmt = SHELL_FORMAT;
- break;
- case 'x':
- statfmt = LINUX_FORMAT;
- if (timefmt == NULL)
- timefmt = "%c";
- break;
- default:
- usage(synopsis);
- /*NOTREACHED*/
- }
-
- if (timefmt == NULL)
- timefmt = TIME_FORMAT;
-
- errs = 0;
- do {
- if (argc == 0)
- rc = fstat(STDIN_FILENO, &st);
- else if (usestat)
- rc = stat(argv[0], &st);
- else
- rc = lstat(argv[0], &st);
-
- if (rc == -1) {
- errs = 1;
- linkfail = 1;
- if (!quiet)
- warn("%s: stat",
- argc == 0 ? "(stdin)" : argv[0]);
- }
- else
- output(&st, argv[0], statfmt, fn, nonl, quiet);
-
- argv++;
- argc--;
- fn++;
- } while (argc > 0);
-
- return (am_readlink ? linkfail : errs);
-}
-
-void
-usage(const char *synopsis)
-{
-
- (void)fprintf(stderr, "usage: %s %s\n", getprogname(), synopsis);
- exit(1);
-}
-
-/*
- * Parses a format string.
- */
-void
-output(const struct stat *st, const char *file,
- const char *statfmt, int fn, int nonl, int quiet)
-{
- int flags, size, prec, ofmt, hilo, what;
- char buf[PATH_MAX];
- const char *subfmt;
- int nl, t, i;
-
- nl = 1;
- while (*statfmt != '\0') {
-
- /*
- * Non-format characters go straight out.
- */
- if (*statfmt != FMT_MAGIC) {
- addchar(stdout, *statfmt, &nl);
- statfmt++;
- continue;
- }
-
- /*
- * The current format "substring" starts here,
- * and then we skip the magic.
- */
- subfmt = statfmt;
- statfmt++;
-
- /*
- * Some simple one-character "formats".
- */
- switch (*statfmt) {
- case SIMPLE_NEWLINE:
- addchar(stdout, '\n', &nl);
- statfmt++;
- continue;
- case SIMPLE_TAB:
- addchar(stdout, '\t', &nl);
- statfmt++;
- continue;
- case SIMPLE_PERCENT:
- addchar(stdout, '%', &nl);
- statfmt++;
- continue;
- case SIMPLE_NUMBER: {
- char num[12], *p;
-
- snprintf(num, sizeof(num), "%d", fn);
- for (p = &num[0]; *p; p++)
- addchar(stdout, *p, &nl);
- statfmt++;
- continue;
- }
- }
-
- /*
- * This must be an actual format string. Format strings are
- * similar to printf(3) formats up to a point, and are of
- * the form:
- *
- * % required start of format
- * [-# +0] opt. format characters
- * size opt. field width
- * . opt. decimal separator, followed by
- * prec opt. precision
- * fmt opt. output specifier (string, numeric, etc.)
- * sub opt. sub field specifier (high, middle, low)
- * datum required field specifier (size, mode, etc)
- *
- * Only the % and the datum selector are required. All data
- * have reasonable default output forms. The "sub" specifier
- * only applies to certain data (mode, dev, rdev, filetype).
- * The symlink output defaults to STRING, yet will only emit
- * the leading " -> " if STRING is explicitly specified. The
- * sizerdev datum will generate rdev output for character or
- * block devices, and size output for all others.
- */
- flags = 0;
- do {
- if (*statfmt == FMT_POUND)
- flags |= FLAG_POUND;
- else if (*statfmt == FMT_SPACE)
- flags |= FLAG_SPACE;
- else if (*statfmt == FMT_PLUS)
- flags |= FLAG_PLUS;
- else if (*statfmt == FMT_ZERO)
- flags |= FLAG_ZERO;
- else if (*statfmt == FMT_MINUS)
- flags |= FLAG_MINUS;
- else
- break;
- statfmt++;
- } while (1/*CONSTCOND*/);
-
- size = -1;
- if (isdigit((unsigned)*statfmt)) {
- size = 0;
- while (isdigit((unsigned)*statfmt)) {
- size = (size * 10) + (*statfmt - '0');
- statfmt++;
- if (size < 0)
- goto badfmt;
- }
- }
-
- prec = -1;
- if (*statfmt == FMT_DOT) {
- statfmt++;
-
- prec = 0;
- while (isdigit((unsigned)*statfmt)) {
- prec = (prec * 10) + (*statfmt - '0');
- statfmt++;
- if (prec < 0)
- goto badfmt;
- }
- }
-
-#define fmtcase(x, y) case (y): (x) = (y); statfmt++; break
-#define fmtcasef(x, y, z) case (y): (x) = (z); statfmt++; break
- switch (*statfmt) {
- fmtcasef(ofmt, FMT_DECIMAL, FMTF_DECIMAL);
- fmtcasef(ofmt, FMT_OCTAL, FMTF_OCTAL);
- fmtcasef(ofmt, FMT_UNSIGNED, FMTF_UNSIGNED);
- fmtcasef(ofmt, FMT_HEX, FMTF_HEX);
- fmtcasef(ofmt, FMT_FLOAT, FMTF_FLOAT);
- fmtcasef(ofmt, FMT_STRING, FMTF_STRING);
- default:
- ofmt = 0;
- break;
- }
-
- switch (*statfmt) {
- fmtcase(hilo, HIGH_PIECE);
- fmtcase(hilo, MIDDLE_PIECE);
- fmtcase(hilo, LOW_PIECE);
- default:
- hilo = 0;
- break;
- }
-
- switch (*statfmt) {
- fmtcase(what, SHOW_st_dev);
- fmtcase(what, SHOW_st_ino);
- fmtcase(what, SHOW_st_mode);
- fmtcase(what, SHOW_st_nlink);
- fmtcase(what, SHOW_st_uid);
- fmtcase(what, SHOW_st_gid);
- fmtcase(what, SHOW_st_rdev);
- fmtcase(what, SHOW_st_atime);
- fmtcase(what, SHOW_st_mtime);
- fmtcase(what, SHOW_st_ctime);
- fmtcase(what, SHOW_st_btime);
- fmtcase(what, SHOW_st_size);
- fmtcase(what, SHOW_st_blocks);
- fmtcase(what, SHOW_st_blksize);
- fmtcase(what, SHOW_st_flags);
- fmtcase(what, SHOW_st_gen);
- fmtcase(what, SHOW_symlink);
- fmtcase(what, SHOW_filetype);
- fmtcase(what, SHOW_filename);
- fmtcase(what, SHOW_sizerdev);
- default:
- goto badfmt;
- }
-#undef fmtcasef
-#undef fmtcase
-
- t = format1(st,
- file,
- subfmt, statfmt - subfmt,
- buf, sizeof(buf),
- flags, size, prec, ofmt, hilo, what);
-
- for (i = 0; i < t && i < sizeof(buf); i++)
- addchar(stdout, buf[i], &nl);
-
- continue;
-
- badfmt:
- errx(1, "%.*s: bad format",
- (int)(statfmt - subfmt + 1), subfmt);
- }
-
- if (!nl && !nonl)
- (void)fputc('\n', stdout);
- (void)fflush(stdout);
-}
-
-/*
- * Arranges output according to a single parsed format substring.
- */
-int
-format1(const struct stat *st,
- const char *file,
- const char *fmt, int flen,
- char *buf, size_t blen,
- int flags, int size, int prec, int ofmt,
- int hilo, int what)
-{
- u_int64_t data;
- char *sdata, lfmt[24], tmp[20];
- char smode[12], sid[12], path[PATH_MAX + 4];
- struct passwd *pw;
- struct group *gr;
- const struct timespec *tsp;
- struct timespec ts;
- struct tm *tm;
- int l, small, formats;
-
- tsp = NULL;
- formats = 0;
- small = 0;
-
- /*
- * First, pick out the data and tweak it based on hilo or
- * specified output format (symlink output only).
- */
- switch (what) {
- case SHOW_st_dev:
- case SHOW_st_rdev:
- small = (sizeof(st->st_dev) == 4);
- data = (what == SHOW_st_dev) ? st->st_dev : st->st_rdev;
-#if HAVE_DEVNAME
- sdata = (what == SHOW_st_dev) ?
- devname(st->st_dev, S_IFBLK) :
- devname(st->st_rdev,
- S_ISCHR(st->st_mode) ? S_IFCHR :
- S_ISBLK(st->st_mode) ? S_IFBLK :
- 0U);
- if (sdata == NULL)
- sdata = "???";
-#endif /* HAVE_DEVNAME */
- if (hilo == HIGH_PIECE) {
- data = major(data);
- hilo = 0;
- }
- else if (hilo == LOW_PIECE) {
- data = minor((unsigned)data);
- hilo = 0;
- }
- formats = FMTF_DECIMAL | FMTF_OCTAL | FMTF_UNSIGNED | FMTF_HEX |
-#if HAVE_DEVNAME
- FMTF_STRING;
-#else /* HAVE_DEVNAME */
- 0;
-#endif /* HAVE_DEVNAME */
- if (ofmt == 0)
- ofmt = FMTF_UNSIGNED;
- break;
- case SHOW_st_ino:
- small = (sizeof(st->st_ino) == 4);
- data = st->st_ino;
- sdata = NULL;
- formats = FMTF_DECIMAL | FMTF_OCTAL | FMTF_UNSIGNED | FMTF_HEX;
- if (ofmt == 0)
- ofmt = FMTF_UNSIGNED;
- break;
- case SHOW_st_mode:
- small = (sizeof(st->st_mode) == 4);
- data = st->st_mode;
- strmode(st->st_mode, smode);
- sdata = smode;
- l = strlen(sdata);
- if (sdata[l - 1] == ' ')
- sdata[--l] = '\0';
- if (hilo == HIGH_PIECE) {
- data >>= 12;
- sdata += 1;
- sdata[3] = '\0';
- hilo = 0;
- }
- else if (hilo == MIDDLE_PIECE) {
- data = (data >> 9) & 07;
- sdata += 4;
- sdata[3] = '\0';
- hilo = 0;
- }
- else if (hilo == LOW_PIECE) {
- data &= 0777;
- sdata += 7;
- sdata[3] = '\0';
- hilo = 0;
- }
- formats = FMTF_DECIMAL | FMTF_OCTAL | FMTF_UNSIGNED | FMTF_HEX |
- FMTF_STRING;
- if (ofmt == 0)
- ofmt = FMTF_OCTAL;
- break;
- case SHOW_st_nlink:
- small = (sizeof(st->st_dev) == 4);
- data = st->st_nlink;
- sdata = NULL;
- formats = FMTF_DECIMAL | FMTF_OCTAL | FMTF_UNSIGNED | FMTF_HEX;
- if (ofmt == 0)
- ofmt = FMTF_UNSIGNED;
- break;
- case SHOW_st_uid:
- small = (sizeof(st->st_uid) == 4);
- data = st->st_uid;
- if ((pw = getpwuid(st->st_uid)) != NULL)
- sdata = pw->pw_name;
- else {
- snprintf(sid, sizeof(sid), "(%ld)", (long)st->st_uid);
- sdata = sid;
- }
- formats = FMTF_DECIMAL | FMTF_OCTAL | FMTF_UNSIGNED | FMTF_HEX |
- FMTF_STRING;
- if (ofmt == 0)
- ofmt = FMTF_UNSIGNED;
- break;
- case SHOW_st_gid:
- small = (sizeof(st->st_gid) == 4);
- data = st->st_gid;
- if ((gr = getgrgid(st->st_gid)) != NULL)
- sdata = gr->gr_name;
- else {
- snprintf(sid, sizeof(sid), "(%ld)", (long)st->st_gid);
- sdata = sid;
- }
- formats = FMTF_DECIMAL | FMTF_OCTAL | FMTF_UNSIGNED | FMTF_HEX |
- FMTF_STRING;
- if (ofmt == 0)
- ofmt = FMTF_UNSIGNED;
- break;
- case SHOW_st_atime:
- tsp = &st->st_atimespec;
- /* FALLTHROUGH */
- case SHOW_st_mtime:
- if (tsp == NULL)
- tsp = &st->st_mtimespec;
- /* FALLTHROUGH */
- case SHOW_st_ctime:
- if (tsp == NULL)
- tsp = &st->st_ctimespec;
- /* FALLTHROUGH */
-#if HAVE_STRUCT_STAT_ST_BIRTHTIME
- case SHOW_st_btime:
- if (tsp == NULL)
- tsp = &st->st_birthtimespec;
-#endif /* HAVE_STRUCT_STAT_ST_BIRTHTIME */
- ts = *tsp; /* copy so we can muck with it */
- small = (sizeof(ts.tv_sec) == 4);
- data = ts.tv_sec;
- small = 1;
- tm = localtime(&ts.tv_sec);
- (void)strftime(path, sizeof(path), timefmt, tm);
- sdata = path;
- formats = FMTF_DECIMAL | FMTF_OCTAL | FMTF_UNSIGNED | FMTF_HEX |
- FMTF_FLOAT | FMTF_STRING;
- if (ofmt == 0)
- ofmt = FMTF_DECIMAL;
- break;
- case SHOW_st_size:
- small = (sizeof(st->st_size) == 4);
- data = st->st_size;
- sdata = NULL;
- formats = FMTF_DECIMAL | FMTF_OCTAL | FMTF_UNSIGNED | FMTF_HEX;
- if (ofmt == 0)
- ofmt = FMTF_UNSIGNED;
- break;
- case SHOW_st_blocks:
- small = (sizeof(st->st_blocks) == 4);
- data = st->st_blocks;
- sdata = NULL;
- formats = FMTF_DECIMAL | FMTF_OCTAL | FMTF_UNSIGNED | FMTF_HEX;
- if (ofmt == 0)
- ofmt = FMTF_UNSIGNED;
- break;
- case SHOW_st_blksize:
- small = (sizeof(st->st_blksize) == 4);
- data = st->st_blksize;
- sdata = NULL;
- formats = FMTF_DECIMAL | FMTF_OCTAL | FMTF_UNSIGNED | FMTF_HEX;
- if (ofmt == 0)
- ofmt = FMTF_UNSIGNED;
- break;
-#if HAVE_STRUCT_STAT_ST_FLAGS
- case SHOW_st_flags:
- small = (sizeof(st->st_flags) == 4);
- data = st->st_flags;
- sdata = NULL;
- formats = FMTF_DECIMAL | FMTF_OCTAL | FMTF_UNSIGNED | FMTF_HEX;
- if (ofmt == 0)
- ofmt = FMTF_UNSIGNED;
- break;
-#endif /* HAVE_STRUCT_STAT_ST_FLAGS */
-#if HAVE_STRUCT_STAT_ST_GEN
- case SHOW_st_gen:
- small = (sizeof(st->st_gen) == 4);
- data = st->st_gen;
- sdata = NULL;
- formats = FMTF_DECIMAL | FMTF_OCTAL | FMTF_UNSIGNED | FMTF_HEX;
- if (ofmt == 0)
- ofmt = FMTF_UNSIGNED;
- break;
-#endif /* HAVE_STRUCT_STAT_ST_GEN */
- case SHOW_symlink:
- small = 0;
- data = 0;
- if (S_ISLNK(st->st_mode)) {
- snprintf(path, sizeof(path), " -> ");
- l = readlink(file, path + 4, sizeof(path) - 4 - 1);
- if (l == -1) {
- linkfail = 1;
- l = 0;
- path[0] = '\0';
- }
- path[l + 4] = '\0';
- sdata = path + (ofmt == FMTF_STRING ? 0 : 4);
- }
- else {
- linkfail = 1;
- sdata = "";
- }
- formats = FMTF_STRING;
- if (ofmt == 0)
- ofmt = FMTF_STRING;
- break;
- case SHOW_filetype:
- small = 0;
- data = 0;
- sdata = smode;
- sdata[0] = '\0';
- if (hilo == 0 || hilo == LOW_PIECE) {
- switch (st->st_mode & S_IFMT) {
- case S_IFIFO: (void)strcat(sdata, "|"); break;
- case S_IFDIR: (void)strcat(sdata, "/"); break;
- case S_IFREG:
- if (st->st_mode &
- (S_IXUSR | S_IXGRP | S_IXOTH))
- (void)strcat(sdata, "*");
- break;
- case S_IFLNK: (void)strcat(sdata, "@"); break;
- case S_IFSOCK: (void)strcat(sdata, "="); break;
-#ifdef S_IFWHT
- case S_IFWHT: (void)strcat(sdata, "%"); break;
-#endif /* S_IFWHT */
-#ifdef S_IFDOOR
- case S_IFDOOR: (void)strcat(sdata, ">"); break;
-#endif /* S_IFDOOR */
- }
- hilo = 0;
- }
- else if (hilo == HIGH_PIECE) {
- switch (st->st_mode & S_IFMT) {
- case S_IFIFO: sdata = "Fifo File"; break;
- case S_IFCHR: sdata = "Character Device"; break;
- case S_IFDIR: sdata = "Directory"; break;
- case S_IFBLK: sdata = "Block Device"; break;
- case S_IFREG: sdata = "Regular File"; break;
- case S_IFLNK: sdata = "Symbolic Link"; break;
- case S_IFSOCK: sdata = "Socket"; break;
-#ifdef S_IFWHT
- case S_IFWHT: sdata = "Whiteout File"; break;
-#endif /* S_IFWHT */
-#ifdef S_IFDOOR
- case S_IFDOOR: sdata = "Door"; break;
-#endif /* S_IFDOOR */
- default: sdata = "???"; break;
- }
- hilo = 0;
- }
- formats = FMTF_STRING;
- if (ofmt == 0)
- ofmt = FMTF_STRING;
- break;
- case SHOW_filename:
- small = 0;
- data = 0;
- if (file == NULL)
- (void)strncpy(path, "(stdin)", sizeof(path));
- else
- (void)strncpy(path, file, sizeof(path));
- sdata = path;
- formats = FMTF_STRING;
- if (ofmt == 0)
- ofmt = FMTF_STRING;
- break;
- case SHOW_sizerdev:
- if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode)) {
- char majdev[20], mindev[20];
- int l1, l2;
-
- l1 = format1(st,
- file,
- fmt, flen,
- majdev, sizeof(majdev),
- flags, size, prec,
- ofmt, HIGH_PIECE, SHOW_st_rdev);
- l2 = format1(st,
- file,
- fmt, flen,
- mindev, sizeof(mindev),
- flags, size, prec,
- ofmt, LOW_PIECE, SHOW_st_rdev);
- return (snprintf(buf, blen, "%.*s,%.*s",
- l1, majdev, l2, mindev));
- }
- else {
- return (format1(st,
- file,
- fmt, flen,
- buf, blen,
- flags, size, prec,
- ofmt, 0, SHOW_st_size));
- }
- /*NOTREACHED*/
- default:
- errx(1, "%.*s: bad format", (int)flen, fmt);
- }
-
- /*
- * If a subdatum was specified but not supported, or an output
- * format was selected that is not supported, that's an error.
- */
- if (hilo != 0 || (ofmt & formats) == 0)
- errx(1, "%.*s: bad format", (int)flen, fmt);
-
- /*
- * Assemble the format string for passing to printf(3).
- */
- lfmt[0] = '\0';
- (void)strcat(lfmt, "%");
- if (flags & FLAG_POUND)
- (void)strcat(lfmt, "#");
- if (flags & FLAG_SPACE)
- (void)strcat(lfmt, " ");
- if (flags & FLAG_PLUS)
- (void)strcat(lfmt, "+");
- if (flags & FLAG_MINUS)
- (void)strcat(lfmt, "-");
- if (flags & FLAG_ZERO)
- (void)strcat(lfmt, "0");
-
- /*
- * Only the timespecs support the FLOAT output format, and that
- * requires work that differs from the other formats.
- */
- if (ofmt == FMTF_FLOAT) {
- /*
- * Nothing after the decimal point, so just print seconds.
- */
- if (prec == 0) {
- if (size != -1) {
- (void)snprintf(tmp, sizeof(tmp), "%d", size);
- (void)strcat(lfmt, tmp);
- }
- (void)strcat(lfmt, "d");
- return (snprintf(buf, blen, lfmt, ts.tv_sec));
- }
-
- /*
- * Unspecified precision gets all the precision we have:
- * 9 digits.
- */
- if (prec == -1)
- prec = 9;
-
- /*
- * Adjust the size for the decimal point and the digits
- * that will follow.
- */
- size -= prec + 1;
-
- /*
- * Any leftover size that's legitimate will be used.
- */
- if (size > 0) {
- (void)snprintf(tmp, sizeof(tmp), "%d", size);
- (void)strcat(lfmt, tmp);
- }
- (void)strcat(lfmt, "d");
-
- /*
- * The stuff after the decimal point always needs zero
- * filling.
- */
- (void)strcat(lfmt, ".%0");
-
- /*
- * We can "print" at most nine digits of precision. The
- * rest we will pad on at the end.
- */
- (void)snprintf(tmp, sizeof(tmp), "%dd", prec > 9 ? 9 : prec);
- (void)strcat(lfmt, tmp);
-
- /*
- * For precision of less that nine digits, trim off the
- * less significant figures.
- */
- for (; prec < 9; prec++)
- ts.tv_nsec /= 10;
-
- /*
- * Use the format, and then tack on any zeroes that
- * might be required to make up the requested precision.
- */
- l = snprintf(buf, blen, lfmt, ts.tv_sec, ts.tv_nsec);
- for (; prec > 9 && l < blen; prec--, l++)
- (void)strcat(buf, "0");
- return (l);
- }
-
- /*
- * Add on size and precision, if specified, to the format.
- */
- if (size != -1) {
- (void)snprintf(tmp, sizeof(tmp), "%d", size);
- (void)strcat(lfmt, tmp);
- }
- if (prec != -1) {
- (void)snprintf(tmp, sizeof(tmp), ".%d", prec);
- (void)strcat(lfmt, tmp);
- }
-
- /*
- * String output uses the temporary sdata.
- */
- if (ofmt == FMTF_STRING) {
- if (sdata == NULL)
- errx(1, "%.*s: bad format", (int)flen, fmt);
- (void)strcat(lfmt, "s");
- return (snprintf(buf, blen, lfmt, sdata));
- }
-
- /*
- * Ensure that sign extension does not cause bad looking output
- * for some forms.
- */
- if (small && ofmt != FMTF_DECIMAL)
- data = (u_int32_t)data;
-
- /*
- * The four "numeric" output forms.
- */
- (void)strcat(lfmt, "ll");
- switch (ofmt) {
- case FMTF_DECIMAL: (void)strcat(lfmt, "d"); break;
- case FMTF_OCTAL: (void)strcat(lfmt, "o"); break;
- case FMTF_UNSIGNED: (void)strcat(lfmt, "u"); break;
- case FMTF_HEX: (void)strcat(lfmt, "x"); break;
- }
-
- return (snprintf(buf, blen, lfmt, data));
-}
diff --git a/usr.bin/su/Makefile b/usr.bin/su/Makefile
deleted file mode 100644
index 25216cf..0000000
--- a/usr.bin/su/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 7/19/93
-# $FreeBSD$
-
-.include <bsd.own.mk>
-
-PROG= su
-
-DPADD= ${LIBUTIL} ${LIBPAM}
-LDADD= -lutil ${MINUSLPAM}
-
-.if ${MK_AUDIT} != "no"
-CFLAGS+= -DUSE_BSM_AUDIT
-DPADD+= ${LIBBSM}
-LDADD+= -lbsm
-.endif
-
-BINOWN= root
-BINMODE=4555
-PRECIOUSPROG=
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/su/su.1 b/usr.bin/su/su.1
deleted file mode 100644
index b8c14ca..0000000
--- a/usr.bin/su/su.1
+++ /dev/null
@@ -1,246 +0,0 @@
-.\" Copyright (c) 1988, 1990, 1993, 1994
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)su.1 8.2 (Berkeley) 4/18/94
-.\" $FreeBSD$
-.\"
-.Dd July 1, 2008
-.Dt SU 1
-.Os
-.Sh NAME
-.Nm su
-.Nd substitute user identity
-.Sh SYNOPSIS
-.Nm
-.Op Fl
-.Op Fl flms
-.Op Fl c Ar class
-.Op Ar login Op Ar args
-.Sh DESCRIPTION
-The
-.Nm
-utility requests appropriate user credentials via PAM
-and switches to that user ID
-(the default user is the superuser).
-A shell is then executed.
-.Pp
-PAM is used to set the policy
-.Xr su 1
-will use.
-In particular, by default only users in the
-.Dq Li wheel
-group can switch to UID 0
-.Pq Dq Li root .
-This group requirement may be changed by modifying the
-.Dq Li pam_group
-section of
-.Pa /etc/pam.d/su .
-See
-.Xr pam_group 8
-for details on how to modify this setting.
-.Pp
-By default, the environment is unmodified with the exception of
-.Ev USER ,
-.Ev HOME ,
-and
-.Ev SHELL .
-.Ev HOME
-and
-.Ev SHELL
-are set to the target login's default values.
-.Ev USER
-is set to the target login, unless the target login has a user ID of 0,
-in which case it is unmodified.
-The invoked shell is the one belonging to the target login.
-This is the traditional behavior of
-.Nm .
-Resource limits and session priority applicable to the original user's
-login class (see
-.Xr login.conf 5 )
-are also normally retained unless the target login has a user ID of 0.
-.Pp
-The options are as follows:
-.Bl -tag -width Ds
-.It Fl f
-If the invoked shell is
-.Xr csh 1 ,
-this option prevents it from reading the
-.Dq Pa .cshrc
-file.
-.It Fl l
-Simulate a full login.
-The environment is discarded except for
-.Ev HOME ,
-.Ev SHELL ,
-.Ev PATH ,
-.Ev TERM ,
-and
-.Ev USER .
-.Ev HOME
-and
-.Ev SHELL
-are modified as above.
-.Ev USER
-is set to the target login.
-.Ev PATH
-is set to
-.Dq Pa /bin:/usr/bin .
-.Ev TERM
-is imported from your current environment.
-Environment variables may be set or overridden from the login class
-capabilities database according to the class of the target login.
-The invoked shell is the target login's, and
-.Nm
-will change directory to the target login's home directory.
-Resource limits and session priority are modified to that for the
-target account's login class.
-.It Fl
-(no letter) The same as
-.Fl l .
-.It Fl m
-Leave the environment unmodified.
-The invoked shell is your login shell, and no directory changes are made.
-As a security precaution, if the target user's shell is a non-standard
-shell (as defined by
-.Xr getusershell 3 )
-and the caller's real uid is
-non-zero,
-.Nm
-will fail.
-.It Fl s
-Set the MAC label to the user's default label as part of the user
-credential setup.
-Setting the MAC label may fail if the MAC label of the invoking process
-is not sufficient to transition to the user's default MAC label.
-If the label cannot be set,
-.Nm
-will fail.
-.It Fl c Ar class
-Use the settings of the specified login class.
-Only allowed for the super-user.
-.El
-.Pp
-The
-.Fl l
-(or
-.Fl )
-and
-.Fl m
-options are mutually exclusive; the last one specified
-overrides any previous ones.
-.Pp
-If the optional
-.Ar args
-are provided on the command line, they are passed to the login shell of
-the target login.
-Note that all command line arguments before the target login name are
-processed by
-.Nm
-itself, everything after the target login name gets passed to the login
-shell.
-.Pp
-By default (unless the prompt is reset by a startup file) the super-user
-prompt is set to
-.Dq Sy \&#
-to remind one of its awesome power.
-.Sh ENVIRONMENT
-Environment variables used by
-.Nm :
-.Bl -tag -width HOME
-.It Ev HOME
-Default home directory of real user ID unless modified as
-specified above.
-.It Ev PATH
-Default search path of real user ID unless modified as specified above.
-.It Ev TERM
-Provides terminal type which may be retained for the substituted
-user ID.
-.It Ev USER
-The user ID is always the effective ID (the target user ID) after an
-.Nm
-unless the user ID is 0 (root).
-.El
-.Sh FILES
-.Bl -tag -width ".Pa /etc/pam.d/su" -compact
-.It Pa /etc/pam.d/su
-PAM configuration for
-.Nm .
-.El
-.Sh EXAMPLES
-.Bl -tag -width 5n -compact
-.It Li "su -m man -c catman"
-Runs the command
-.Li catman
-as user
-.Li man .
-You will be asked for man's password unless your real UID is 0.
-Note that the
-.Fl m
-option is required since user
-.Dq man
-does not have a valid shell by default.
-.It Li "su -m man -c 'catman /usr/share/man /usr/local/man'"
-Same as above, but the target command consists of more than a
-single word and hence is quoted for use with the
-.Fl c
-option being passed to the shell.
-(Most shells expect the argument to
-.Fl c
-to be a single word).
-.It Li "su -m -c staff man -c 'catman /usr/share/man /usr/local/man'"
-Same as above, but the target command is run with the resource limits of
-the login class
-.Dq staff .
-Note: in this example, the first
-.Fl c
-option applies to
-.Nm
-while the second is an argument to the shell being invoked.
-.It Li "su -l foo"
-Simulate a login for user foo.
-.It Li "su - foo"
-Same as above.
-.It Li "su -"
-Simulate a login for root.
-.El
-.Sh SEE ALSO
-.Xr csh 1 ,
-.Xr sh 1 ,
-.Xr group 5 ,
-.Xr login.conf 5 ,
-.Xr passwd 5 ,
-.Xr environ 7 ,
-.Xr pam_group 8
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v1 .
diff --git a/usr.bin/su/su.c b/usr.bin/su/su.c
deleted file mode 100644
index 36d8326..0000000
--- a/usr.bin/su/su.c
+++ /dev/null
@@ -1,643 +0,0 @@
-/*
- * Copyright (c) 2002, 2005 Networks Associates Technologies, Inc.
- * All rights reserved.
- *
- * Portions of this software were developed for the FreeBSD Project by
- * ThinkSec AS and NAI Labs, the Security Research Division of Network
- * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
- * ("CBOSS"), as part of the DARPA CHATS research program.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*-
- * Copyright (c) 1988, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1988, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)su.c 8.3 (Berkeley) 4/2/94";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/wait.h>
-
-#ifdef USE_BSM_AUDIT
-#include <bsm/libbsm.h>
-#include <bsm/audit_uevents.h>
-#endif
-
-#include <err.h>
-#include <errno.h>
-#include <grp.h>
-#include <login_cap.h>
-#include <paths.h>
-#include <pwd.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-#include <unistd.h>
-#include <stdarg.h>
-
-#include <security/pam_appl.h>
-#include <security/openpam.h>
-
-#define PAM_END() do { \
- int local_ret; \
- if (pamh != NULL) { \
- local_ret = pam_setcred(pamh, PAM_DELETE_CRED); \
- if (local_ret != PAM_SUCCESS) \
- syslog(LOG_ERR, "pam_setcred: %s", \
- pam_strerror(pamh, local_ret)); \
- if (asthem) { \
- local_ret = pam_close_session(pamh, 0); \
- if (local_ret != PAM_SUCCESS) \
- syslog(LOG_ERR, "pam_close_session: %s",\
- pam_strerror(pamh, local_ret)); \
- } \
- local_ret = pam_end(pamh, local_ret); \
- if (local_ret != PAM_SUCCESS) \
- syslog(LOG_ERR, "pam_end: %s", \
- pam_strerror(pamh, local_ret)); \
- } \
-} while (0)
-
-
-#define PAM_SET_ITEM(what, item) do { \
- int local_ret; \
- local_ret = pam_set_item(pamh, what, item); \
- if (local_ret != PAM_SUCCESS) { \
- syslog(LOG_ERR, "pam_set_item(" #what "): %s", \
- pam_strerror(pamh, local_ret)); \
- errx(1, "pam_set_item(" #what "): %s", \
- pam_strerror(pamh, local_ret)); \
- /* NOTREACHED */ \
- } \
-} while (0)
-
-enum tristate { UNSET, YES, NO };
-
-static pam_handle_t *pamh = NULL;
-static char **environ_pam;
-
-static char *ontty(void);
-static int chshell(const char *);
-static void usage(void) __dead2;
-static void export_pam_environment(void);
-static int ok_to_export(const char *);
-
-extern char **environ;
-
-int
-main(int argc, char *argv[])
-{
- static char *cleanenv;
- struct passwd *pwd;
- struct pam_conv conv = { openpam_ttyconv, NULL };
- enum tristate iscsh;
- login_cap_t *lc;
- union {
- const char **a;
- char * const *b;
- } np;
- uid_t ruid;
- pid_t child_pid, child_pgrp, pid;
- int asme, ch, asthem, fastlogin, prio, i, retcode,
- statusp, setmaclabel;
- u_int setwhat;
- char *username, *class, shellbuf[MAXPATHLEN];
- const char *p, *user, *shell, *mytty, **nargv;
- const void *v;
- struct sigaction sa, sa_int, sa_quit, sa_pipe;
- int temp, fds[2];
-#ifdef USE_BSM_AUDIT
- const char *aerr;
- au_id_t auid;
-#endif
-
- shell = class = cleanenv = NULL;
- asme = asthem = fastlogin = statusp = 0;
- user = "root";
- iscsh = UNSET;
- setmaclabel = 0;
-
- while ((ch = getopt(argc, argv, "-flmsc:")) != -1)
- switch ((char)ch) {
- case 'f':
- fastlogin = 1;
- break;
- case '-':
- case 'l':
- asme = 0;
- asthem = 1;
- break;
- case 'm':
- asme = 1;
- asthem = 0;
- break;
- case 's':
- setmaclabel = 1;
- break;
- case 'c':
- class = optarg;
- break;
- case '?':
- default:
- usage();
- /* NOTREACHED */
- }
-
- if (optind < argc)
- user = argv[optind++];
-
- if (user == NULL)
- usage();
- /* NOTREACHED */
-
- /*
- * Try to provide more helpful debugging output if su(1) is running
- * non-setuid, or was run from a file system not mounted setuid.
- */
- if (geteuid() != 0)
- errx(1, "not running setuid");
-
-#ifdef USE_BSM_AUDIT
- if (getauid(&auid) < 0 && errno != ENOSYS) {
- syslog(LOG_AUTH | LOG_ERR, "getauid: %s", strerror(errno));
- errx(1, "Permission denied");
- }
-#endif
- if (strlen(user) > MAXLOGNAME - 1) {
-#ifdef USE_BSM_AUDIT
- if (audit_submit(AUE_su, auid,
- 1, EPERM, "username too long: '%s'", user))
- errx(1, "Permission denied");
-#endif
- errx(1, "username too long");
- }
-
- nargv = malloc(sizeof(char *) * (size_t)(argc + 4));
- if (nargv == NULL)
- errx(1, "malloc failure");
-
- nargv[argc + 3] = NULL;
- for (i = argc; i >= optind; i--)
- nargv[i + 3] = argv[i];
- np.a = &nargv[i + 3];
-
- argv += optind;
-
- errno = 0;
- prio = getpriority(PRIO_PROCESS, 0);
- if (errno)
- prio = 0;
-
- setpriority(PRIO_PROCESS, 0, -2);
- openlog("su", LOG_CONS, LOG_AUTH);
-
- /* get current login name, real uid and shell */
- ruid = getuid();
- username = getlogin();
- pwd = getpwnam(username);
- if (username == NULL || pwd == NULL || pwd->pw_uid != ruid)
- pwd = getpwuid(ruid);
- if (pwd == NULL) {
-#ifdef USE_BSM_AUDIT
- if (audit_submit(AUE_su, auid, 1, EPERM,
- "unable to determine invoking subject: '%s'", username))
- errx(1, "Permission denied");
-#endif
- errx(1, "who are you?");
- }
-
- username = strdup(pwd->pw_name);
- if (username == NULL)
- err(1, "strdup failure");
-
- if (asme) {
- if (pwd->pw_shell != NULL && *pwd->pw_shell != '\0') {
- /* must copy - pwd memory is recycled */
- shell = strncpy(shellbuf, pwd->pw_shell,
- sizeof(shellbuf));
- shellbuf[sizeof(shellbuf) - 1] = '\0';
- }
- else {
- shell = _PATH_BSHELL;
- iscsh = NO;
- }
- }
-
- /* Do the whole PAM startup thing */
- retcode = pam_start("su", user, &conv, &pamh);
- if (retcode != PAM_SUCCESS) {
- syslog(LOG_ERR, "pam_start: %s", pam_strerror(pamh, retcode));
- errx(1, "pam_start: %s", pam_strerror(pamh, retcode));
- }
-
- PAM_SET_ITEM(PAM_RUSER, username);
-
- mytty = ttyname(STDERR_FILENO);
- if (!mytty)
- mytty = "tty";
- PAM_SET_ITEM(PAM_TTY, mytty);
-
- retcode = pam_authenticate(pamh, 0);
- if (retcode != PAM_SUCCESS) {
-#ifdef USE_BSM_AUDIT
- if (audit_submit(AUE_su, auid, 1, EPERM, "bad su %s to %s on %s",
- username, user, mytty))
- errx(1, "Permission denied");
-#endif
- syslog(LOG_AUTH|LOG_WARNING, "BAD SU %s to %s on %s",
- username, user, mytty);
- errx(1, "Sorry");
- }
-#ifdef USE_BSM_AUDIT
- if (audit_submit(AUE_su, auid, 0, 0, "successful authentication"))
- errx(1, "Permission denied");
-#endif
- retcode = pam_get_item(pamh, PAM_USER, &v);
- if (retcode == PAM_SUCCESS)
- user = v;
- else
- syslog(LOG_ERR, "pam_get_item(PAM_USER): %s",
- pam_strerror(pamh, retcode));
- pwd = getpwnam(user);
- if (pwd == NULL) {
-#ifdef USE_BSM_AUDIT
- if (audit_submit(AUE_su, auid, 1, EPERM,
- "unknown subject: %s", user))
- errx(1, "Permission denied");
-#endif
- errx(1, "unknown login: %s", user);
- }
-
- retcode = pam_acct_mgmt(pamh, 0);
- if (retcode == PAM_NEW_AUTHTOK_REQD) {
- retcode = pam_chauthtok(pamh,
- PAM_CHANGE_EXPIRED_AUTHTOK);
- if (retcode != PAM_SUCCESS) {
-#ifdef USE_BSM_AUDIT
- aerr = pam_strerror(pamh, retcode);
- if (aerr == NULL)
- aerr = "Unknown PAM error";
- if (audit_submit(AUE_su, auid, 1, EPERM,
- "pam_chauthtok: %s", aerr))
- errx(1, "Permission denied");
-#endif
- syslog(LOG_ERR, "pam_chauthtok: %s",
- pam_strerror(pamh, retcode));
- errx(1, "Sorry");
- }
- }
- if (retcode != PAM_SUCCESS) {
-#ifdef USE_BSM_AUDIT
- if (audit_submit(AUE_su, auid, 1, EPERM, "pam_acct_mgmt: %s",
- pam_strerror(pamh, retcode)))
- errx(1, "Permission denied");
-#endif
- syslog(LOG_ERR, "pam_acct_mgmt: %s",
- pam_strerror(pamh, retcode));
- errx(1, "Sorry");
- }
-
- /* get target login information */
- if (class == NULL)
- lc = login_getpwclass(pwd);
- else {
- if (ruid != 0) {
-#ifdef USE_BSM_AUDIT
- if (audit_submit(AUE_su, auid, 1, EPERM,
- "only root may use -c"))
- errx(1, "Permission denied");
-#endif
- errx(1, "only root may use -c");
- }
- lc = login_getclass(class);
- if (lc == NULL)
- errx(1, "unknown class: %s", class);
- }
-
- /* if asme and non-standard target shell, must be root */
- if (asme) {
- if (ruid != 0 && !chshell(pwd->pw_shell))
- errx(1, "permission denied (shell)");
- }
- else if (pwd->pw_shell && *pwd->pw_shell) {
- shell = pwd->pw_shell;
- iscsh = UNSET;
- }
- else {
- shell = _PATH_BSHELL;
- iscsh = NO;
- }
-
- /* if we're forking a csh, we want to slightly muck the args */
- if (iscsh == UNSET) {
- p = strrchr(shell, '/');
- if (p)
- ++p;
- else
- p = shell;
- iscsh = strcmp(p, "csh") ? (strcmp(p, "tcsh") ? NO : YES) : YES;
- }
- setpriority(PRIO_PROCESS, 0, prio);
-
- /*
- * PAM modules might add supplementary groups in pam_setcred(), so
- * initialize them first.
- */
- if (setusercontext(lc, pwd, pwd->pw_uid, LOGIN_SETGROUP) < 0)
- err(1, "setusercontext");
-
- retcode = pam_setcred(pamh, PAM_ESTABLISH_CRED);
- if (retcode != PAM_SUCCESS) {
- syslog(LOG_ERR, "pam_setcred: %s",
- pam_strerror(pamh, retcode));
- errx(1, "failed to establish credentials.");
- }
- if (asthem) {
- retcode = pam_open_session(pamh, 0);
- if (retcode != PAM_SUCCESS) {
- syslog(LOG_ERR, "pam_open_session: %s",
- pam_strerror(pamh, retcode));
- errx(1, "failed to open session.");
- }
- }
-
- /*
- * We must fork() before setuid() because we need to call
- * pam_setcred(pamh, PAM_DELETE_CRED) as root.
- */
- sa.sa_flags = SA_RESTART;
- sa.sa_handler = SIG_IGN;
- sigemptyset(&sa.sa_mask);
- sigaction(SIGINT, &sa, &sa_int);
- sigaction(SIGQUIT, &sa, &sa_quit);
- sigaction(SIGPIPE, &sa, &sa_pipe);
- sa.sa_handler = SIG_DFL;
- sigaction(SIGTSTP, &sa, NULL);
- statusp = 1;
- if (pipe(fds) == -1) {
- PAM_END();
- err(1, "pipe");
- }
- child_pid = fork();
- switch (child_pid) {
- default:
- sa.sa_handler = SIG_IGN;
- sigaction(SIGTTOU, &sa, NULL);
- close(fds[0]);
- setpgid(child_pid, child_pid);
- if (tcgetpgrp(STDERR_FILENO) == getpgrp())
- tcsetpgrp(STDERR_FILENO, child_pid);
- close(fds[1]);
- sigaction(SIGPIPE, &sa_pipe, NULL);
- while ((pid = waitpid(child_pid, &statusp, WUNTRACED)) != -1) {
- if (WIFSTOPPED(statusp)) {
- child_pgrp = getpgid(child_pid);
- if (tcgetpgrp(STDERR_FILENO) == child_pgrp)
- tcsetpgrp(STDERR_FILENO, getpgrp());
- kill(getpid(), SIGSTOP);
- if (tcgetpgrp(STDERR_FILENO) == getpgrp()) {
- child_pgrp = getpgid(child_pid);
- tcsetpgrp(STDERR_FILENO, child_pgrp);
- }
- kill(child_pid, SIGCONT);
- statusp = 1;
- continue;
- }
- break;
- }
- tcsetpgrp(STDERR_FILENO, getpgrp());
- if (pid == -1)
- err(1, "waitpid");
- PAM_END();
- exit(WEXITSTATUS(statusp));
- case -1:
- PAM_END();
- err(1, "fork");
- case 0:
- close(fds[1]);
- read(fds[0], &temp, 1);
- close(fds[0]);
- sigaction(SIGPIPE, &sa_pipe, NULL);
- sigaction(SIGINT, &sa_int, NULL);
- sigaction(SIGQUIT, &sa_quit, NULL);
-
- /*
- * Set all user context except for: Environmental variables
- * Umask Login records (wtmp, etc) Path
- */
- setwhat = LOGIN_SETALL & ~(LOGIN_SETENV | LOGIN_SETUMASK |
- LOGIN_SETLOGIN | LOGIN_SETPATH | LOGIN_SETGROUP |
- LOGIN_SETMAC);
- /*
- * If -s is present, also set the MAC label.
- */
- if (setmaclabel)
- setwhat |= LOGIN_SETMAC;
- /*
- * Don't touch resource/priority settings if -m has been used
- * or -l and -c hasn't, and we're not su'ing to root.
- */
- if ((asme || (!asthem && class == NULL)) && pwd->pw_uid)
- setwhat &= ~(LOGIN_SETPRIORITY | LOGIN_SETRESOURCES);
- if (setusercontext(lc, pwd, pwd->pw_uid, setwhat) < 0)
- err(1, "setusercontext");
-
- if (!asme) {
- if (asthem) {
- p = getenv("TERM");
- environ = &cleanenv;
- }
-
- if (asthem || pwd->pw_uid)
- setenv("USER", pwd->pw_name, 1);
- setenv("HOME", pwd->pw_dir, 1);
- setenv("SHELL", shell, 1);
-
- if (asthem) {
- /*
- * Add any environmental variables that the
- * PAM modules may have set.
- */
- environ_pam = pam_getenvlist(pamh);
- if (environ_pam)
- export_pam_environment();
-
- /* set the su'd user's environment & umask */
- setusercontext(lc, pwd, pwd->pw_uid,
- LOGIN_SETPATH | LOGIN_SETUMASK |
- LOGIN_SETENV);
- if (p)
- setenv("TERM", p, 1);
-
- p = pam_getenv(pamh, "HOME");
- if (chdir(p ? p : pwd->pw_dir) < 0)
- errx(1, "no directory");
- }
- }
- login_close(lc);
-
- if (iscsh == YES) {
- if (fastlogin)
- *np.a-- = "-f";
- if (asme)
- *np.a-- = "-m";
- }
- /* csh strips the first character... */
- *np.a = asthem ? "-su" : iscsh == YES ? "_su" : "su";
-
- if (ruid != 0)
- syslog(LOG_NOTICE, "%s to %s%s", username, user,
- ontty());
-
- execv(shell, np.b);
- err(1, "%s", shell);
- }
-}
-
-static void
-export_pam_environment(void)
-{
- char **pp;
- char *p;
-
- for (pp = environ_pam; *pp != NULL; pp++) {
- if (ok_to_export(*pp)) {
- p = strchr(*pp, '=');
- *p = '\0';
- setenv(*pp, p + 1, 1);
- }
- free(*pp);
- }
-}
-
-/*
- * Sanity checks on PAM environmental variables:
- * - Make sure there is an '=' in the string.
- * - Make sure the string doesn't run on too long.
- * - Do not export certain variables. This list was taken from the
- * Solaris pam_putenv(3) man page.
- * Note that if the user is chrooted, PAM may have a better idea than we
- * do of where her home directory is.
- */
-static int
-ok_to_export(const char *s)
-{
- static const char *noexport[] = {
- "SHELL", /* "HOME", */ "LOGNAME", "MAIL", "CDPATH",
- "IFS", "PATH", NULL
- };
- const char **pp;
- size_t n;
-
- if (strlen(s) > 1024 || strchr(s, '=') == NULL)
- return 0;
- if (strncmp(s, "LD_", 3) == 0)
- return 0;
- for (pp = noexport; *pp != NULL; pp++) {
- n = strlen(*pp);
- if (s[n] == '=' && strncmp(s, *pp, n) == 0)
- return 0;
- }
- return 1;
-}
-
-static void
-usage(void)
-{
-
- fprintf(stderr, "usage: su [-] [-flms] [-c class] [login [args]]\n");
- exit(1);
- /* NOTREACHED */
-}
-
-static int
-chshell(const char *sh)
-{
- int r;
- char *cp;
-
- r = 0;
- setusershell();
- while ((cp = getusershell()) != NULL && !r)
- r = (strcmp(cp, sh) == 0);
- endusershell();
- return r;
-}
-
-static char *
-ontty(void)
-{
- char *p;
- static char buf[MAXPATHLEN + 4];
-
- buf[0] = 0;
- p = ttyname(STDERR_FILENO);
- if (p)
- snprintf(buf, sizeof(buf), " on %s", p);
- return buf;
-}
diff --git a/usr.bin/systat/Makefile b/usr.bin/systat/Makefile
deleted file mode 100644
index 4f5f229..0000000
--- a/usr.bin/systat/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-.include <bsd.own.mk>
-
-PROG= systat
-SRCS= cmds.c cmdtab.c devs.c fetch.c iostat.c keyboard.c main.c \
- mbufs.c netcmds.c netstat.c pigs.c swap.c icmp.c \
- mode.c ip.c tcp.c \
- vmstat.c convtbl.c ifcmds.c ifstat.c
-
-.if ${MK_INET6_SUPPORT} != "no"
-SRCS+= icmp6.c ip6.c
-CFLAGS+= -DINET6
-.endif
-
-DPADD= ${LIBCURSES} ${LIBM} ${LIBDEVSTAT} ${LIBKVM}
-LDADD= -lcurses -lm -ldevstat -lkvm
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/systat/cmds.c b/usr.bin/systat/cmds.c
deleted file mode 100644
index f283056..0000000
--- a/usr.bin/systat/cmds.c
+++ /dev/null
@@ -1,197 +0,0 @@
-/*-
- * Copyright (c) 1980, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifdef lint
-static const char sccsid[] = "@(#)cmds.c 8.2 (Berkeley) 4/29/95";
-#endif
-
-#include <ctype.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "systat.h"
-#include "extern.h"
-
-void
-command(const char *cmd)
-{
- struct cmdtab *p;
- char *cp, *tmpstr, *tmpstr1;
- int interval, omask;
-
- tmpstr = tmpstr1 = strdup(cmd);
- omask = sigblock(sigmask(SIGALRM));
- for (cp = tmpstr1; *cp && !isspace(*cp); cp++)
- ;
- if (*cp)
- *cp++ = '\0';
- if (*tmpstr1 == '\0')
- return;
- for (; *cp && isspace(*cp); cp++)
- ;
- if (strcmp(tmpstr1, "quit") == 0 || strcmp(tmpstr1, "q") == 0)
- die(0);
- if (strcmp(tmpstr1, "load") == 0) {
- load();
- goto done;
- }
- if (strcmp(tmpstr1, "stop") == 0) {
- alarm(0);
- mvaddstr(CMDLINE, 0, "Refresh disabled.");
- clrtoeol();
- goto done;
- }
- if (strcmp(tmpstr1, "help") == 0) {
- int _col, _len;
-
- move(CMDLINE, _col = 0);
- for (p = cmdtab; p->c_name; p++) {
- _len = strlen(p->c_name);
- if (_col + _len > COLS)
- break;
- addstr(p->c_name); _col += _len;
- if (_col + 1 < COLS)
- addch(' ');
- }
- clrtoeol();
- goto done;
- }
- interval = atoi(tmpstr1);
- if (interval <= 0 &&
- (strcmp(tmpstr1, "start") == 0 || strcmp(tmpstr1, "interval") == 0)) {
- interval = *cp ? atoi(cp) : naptime;
- if (interval <= 0) {
- error("%d: bad interval.", interval);
- goto done;
- }
- }
- if (interval > 0) {
- alarm(0);
- naptime = interval;
- display(0);
- status();
- goto done;
- }
- p = lookup(tmpstr1);
- if (p == (struct cmdtab *)-1) {
- error("%s: Ambiguous command.", tmpstr1);
- goto done;
- }
- if (p) {
- if (curcmd == p)
- goto done;
- alarm(0);
- (*curcmd->c_close)(wnd);
- curcmd->c_flags &= ~CF_INIT;
- wnd = (*p->c_open)();
- if (wnd == 0) {
- error("Couldn't open new display");
- wnd = (*curcmd->c_open)();
- if (wnd == 0) {
- error("Couldn't change back to previous cmd");
- exit(1);
- }
- p = curcmd;
- }
- if ((p->c_flags & CF_INIT) == 0) {
- if ((*p->c_init)())
- p->c_flags |= CF_INIT;
- else
- goto done;
- }
- curcmd = p;
- labels();
- display(0);
- status();
- goto done;
- }
- if (curcmd->c_cmd == 0 || !(*curcmd->c_cmd)(tmpstr1, cp))
- error("%s: Unknown command.", tmpstr1);
-done:
- sigsetmask(omask);
- free(tmpstr);
-}
-
-struct cmdtab *
-lookup(const char *name)
-{
- const char *p, *q;
- struct cmdtab *ct, *found;
- int nmatches, longest;
-
- longest = 0;
- nmatches = 0;
- found = (struct cmdtab *) 0;
- for (ct = cmdtab; (p = ct->c_name); ct++) {
- for (q = name; *q == *p++; q++)
- if (*q == 0) /* exact match? */
- return (ct);
- if (!*q) { /* the name was a prefix */
- if (q - name > longest) {
- longest = q - name;
- nmatches = 1;
- found = ct;
- } else if (q - name == longest)
- nmatches++;
- }
- }
- if (nmatches > 1)
- return ((struct cmdtab *)-1);
- return (found);
-}
-
-void
-status(void)
-{
-
- error("Showing %s, refresh every %d seconds.",
- curcmd->c_name, naptime);
-}
-
-int
-prefix(const char *s1, const char *s2)
-{
-
- while (*s1 == *s2) {
- if (*s1 == '\0')
- return (1);
- s1++, s2++;
- }
- return (*s1 == '\0');
-}
diff --git a/usr.bin/systat/cmdtab.c b/usr.bin/systat/cmdtab.c
deleted file mode 100644
index a8daa13..0000000
--- a/usr.bin/systat/cmdtab.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*-
- * Copyright (c) 1980, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifdef lint
-static const char sccsid[] = "@(#)cmdtab.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include "systat.h"
-#include "extern.h"
-#include "mode.h"
-
-struct cmdtab cmdtab[] = {
- { "pigs", showpigs, fetchpigs, labelpigs,
- initpigs, openpigs, closepigs, 0,
- 0, CF_LOADAV },
- { "swap", showswap, fetchswap, labelswap,
- initswap, openswap, closeswap, 0,
- 0, CF_LOADAV },
- { "mbufs", showmbufs, fetchmbufs, labelmbufs,
- initmbufs, openmbufs, closembufs, 0,
- 0, CF_LOADAV },
- { "iostat", showiostat, fetchiostat, labeliostat,
- initiostat, openiostat, closeiostat, cmdiostat,
- 0, CF_LOADAV },
- { "vmstat", showkre, fetchkre, labelkre,
- initkre, openkre, closekre, cmdkre,
- 0, 0 },
- { "netstat", shownetstat, fetchnetstat, labelnetstat,
- initnetstat, opennetstat, closenetstat, cmdnetstat,
- 0, CF_LOADAV },
- { "icmp", showicmp, fetchicmp, labelicmp,
- initicmp, openicmp, closeicmp, cmdmode,
- reseticmp, CF_LOADAV },
- { "ip", showip, fetchip, labelip,
- initip, openip, closeip, cmdmode,
- resetip, CF_LOADAV },
-#ifdef INET6
- { "icmp6", showicmp6, fetchicmp6, labelicmp6,
- initicmp6, openicmp6, closeicmp6, cmdmode,
- reseticmp6, CF_LOADAV },
- { "ip6", showip6, fetchip6, labelip6,
- initip6, openip6, closeip6, cmdmode,
- resetip6, CF_LOADAV },
-#endif
- { "tcp", showtcp, fetchtcp, labeltcp,
- inittcp, opentcp, closetcp, cmdmode,
- resettcp, CF_LOADAV },
- { "ifstat", showifstat, fetchifstat, labelifstat,
- initifstat, openifstat, closeifstat, cmdifstat,
- 0, CF_LOADAV },
- { NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0 }
-};
-struct cmdtab *curcmd = &cmdtab[0];
diff --git a/usr.bin/systat/convtbl.c b/usr.bin/systat/convtbl.c
deleted file mode 100644
index bebb040..0000000
--- a/usr.bin/systat/convtbl.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (c) 2003, Trent Nelson, <trent@arpa.com>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-#include <stdlib.h>
-#include <string.h>
-#include "convtbl.h"
-
-#define BIT (8)
-#define BITS (1)
-#define KILOBIT (1000LL)
-#define MEGABIT (KILOBIT * 1000)
-#define GIGABIT (MEGABIT * 1000)
-#define TERABIT (GIGABIT * 1000)
-
-#define BYTE (1)
-#define BYTES (1)
-#define KILOBYTE (1024LL)
-#define MEGABYTE (KILOBYTE * 1024)
-#define GIGABYTE (MEGABYTE * 1024)
-#define TERABYTE (GIGABYTE * 1024)
-
-struct convtbl {
- uintmax_t mul;
- uintmax_t scale;
- const char *str;
- const char *name;
-};
-
-static struct convtbl convtbl[] = {
- /* mul, scale, str, name */
- [SC_BYTE] = { BYTE, BYTES, "B", "byte" },
- [SC_KILOBYTE] = { BYTE, KILOBYTE, "KB", "kbyte" },
- [SC_MEGABYTE] = { BYTE, MEGABYTE, "MB", "mbyte" },
- [SC_GIGABYTE] = { BYTE, GIGABYTE, "GB", "gbyte" },
- [SC_TERABYTE] = { BYTE, TERABYTE, "TB", "tbyte" },
-
- [SC_BIT] = { BIT, BITS, "b", "bit" },
- [SC_KILOBIT] = { BIT, KILOBIT, "Kb", "kbit" },
- [SC_MEGABIT] = { BIT, MEGABIT, "Mb", "mbit" },
- [SC_GIGABIT] = { BIT, GIGABIT, "Gb", "gbit" },
- [SC_TERABIT] = { BIT, TERABIT, "Tb", "tbit" },
-
- [SC_AUTO] = { 0, 0, "", "auto" }
-};
-
-static
-struct convtbl *
-get_tbl_ptr(const uintmax_t size, const int scale)
-{
- uintmax_t tmp;
- int idx;
-
- /* If our index is out of range, default to auto-scaling. */
- idx = scale < SC_AUTO ? scale : SC_AUTO;
-
- if (idx == SC_AUTO)
- /*
- * Simple but elegant algorithm. Count how many times
- * we can shift our size value right by a factor of ten,
- * incrementing an index each time. We then use the
- * index as the array index into the conversion table.
- */
- for (tmp = size, idx = SC_KILOBYTE;
- tmp >= MEGABYTE && idx < SC_BIT - 1;
- tmp >>= 10, idx++);
-
- return (&convtbl[idx]);
-}
-
-double
-convert(const uintmax_t size, const int scale)
-{
- struct convtbl *tp;
-
- tp = get_tbl_ptr(size, scale);
- return ((double)size * tp->mul / tp->scale);
-
-}
-
-const char *
-get_string(const uintmax_t size, const int scale)
-{
- struct convtbl *tp;
-
- tp = get_tbl_ptr(size, scale);
- return (tp->str);
-}
-
-int
-get_scale(const char *name)
-{
- int i;
-
- for (i = 0; i <= SC_AUTO; i++)
- if (strcmp(convtbl[i].name, name) == 0)
- return (i);
- return (-1);
-}
-
-const char *
-get_helplist(void)
-{
- int i;
- size_t len;
- static char *buf;
-
- if (buf == NULL) {
- len = 0;
- for (i = 0; i <= SC_AUTO; i++)
- len += strlen(convtbl[i].name) + 2;
- if ((buf = malloc(len)) != NULL) {
- buf[0] = '\0';
- for (i = 0; i <= SC_AUTO; i++) {
- strcat(buf, convtbl[i].name);
- if (i < SC_AUTO)
- strcat(buf, ", ");
- }
- } else
- return ("");
- }
- return (buf);
-}
diff --git a/usr.bin/systat/convtbl.h b/usr.bin/systat/convtbl.h
deleted file mode 100644
index 051e1cd..0000000
--- a/usr.bin/systat/convtbl.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2003, Trent Nelson, <trent@arpa.com>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef _CONVTBL_H_
-#define _CONVTBL_H_
-
-#include <sys/types.h>
-#include <stdint.h>
-
-/*
- * Keep the order in the enum.
- */
-enum scale {
- SC_BYTE,
- SC_KILOBYTE,
- SC_MEGABYTE,
- SC_GIGABYTE,
- SC_TERABYTE,
- SC_BIT,
- SC_KILOBIT,
- SC_MEGABIT,
- SC_GIGABIT,
- SC_TERABIT,
- SC_AUTO /* KEEP THIS LAST */
-};
-
-extern double convert(const uintmax_t, const int);
-extern const char *get_helplist(void);
-extern int get_scale(const char *);
-extern const char *get_string(const uintmax_t, const int);
-
-#endif /* ! _CONVTBL_H_ */
diff --git a/usr.bin/systat/devs.c b/usr.bin/systat/devs.c
deleted file mode 100644
index 58e6d58..0000000
--- a/usr.bin/systat/devs.c
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- * Copyright (c) 1998 Kenneth D. Merry.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*-
- * Copyright (c) 1980, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifdef lint
-static const char sccsid[] = "@(#)disks.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <sys/types.h>
-#include <sys/devicestat.h>
-#include <sys/resource.h>
-
-#include <ctype.h>
-#include <devstat.h>
-#include <err.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "systat.h"
-#include "extern.h"
-#include "devs.h"
-
-typedef enum {
- DS_MATCHTYPE_NONE,
- DS_MATCHTYPE_SPEC,
- DS_MATCHTYPE_PATTERN
-} last_match_type;
-
-last_match_type last_type;
-struct device_selection *dev_select;
-long generation;
-int num_devices, num_selected;
-int num_selections;
-long select_generation;
-struct devstat_match *matches = NULL;
-int num_matches = 0;
-char **specified_devices;
-int num_devices_specified = 0;
-
-static int dsmatchselect(const char *args, devstat_select_mode select_mode,
- int maxshowdevs, struct statinfo *s1);
-static int dsselect(const char *args, devstat_select_mode select_mode,
- int maxshowdevs, struct statinfo *s1);
-
-int
-dsinit(int maxshowdevs, struct statinfo *s1, struct statinfo *s2 __unused,
- struct statinfo *s3 __unused)
-{
-
- /*
- * Make sure that the userland devstat version matches the kernel
- * devstat version. If not, exit and print a message informing
- * the user of his mistake.
- */
- if (devstat_checkversion(NULL) < 0)
- errx(1, "%s", devstat_errbuf);
-
- generation = 0;
- num_devices = 0;
- num_selected = 0;
- num_selections = 0;
- select_generation = 0;
- last_type = DS_MATCHTYPE_NONE;
-
- if (devstat_getdevs(NULL, s1) == -1)
- errx(1, "%s", devstat_errbuf);
-
- num_devices = s1->dinfo->numdevs;
- generation = s1->dinfo->generation;
-
- dev_select = NULL;
-
- /*
- * At this point, selectdevs will almost surely indicate that the
- * device list has changed, so we don't look for return values of 0
- * or 1. If we get back -1, though, there is an error.
- */
- if (devstat_selectdevs(&dev_select, &num_selected, &num_selections,
- &select_generation, generation, s1->dinfo->devices, num_devices,
- NULL, 0, NULL, 0, DS_SELECT_ADD, maxshowdevs, 0) == -1)
- errx(1, "%d %s", __LINE__, devstat_errbuf);
-
- return(1);
-}
-
-int
-dscmd(const char *cmd, const char *args, int maxshowdevs, struct statinfo *s1)
-{
- int retval;
-
- if (prefix(cmd, "display") || prefix(cmd, "add"))
- return(dsselect(args, DS_SELECT_ADDONLY, maxshowdevs, s1));
- if (prefix(cmd, "ignore") || prefix(cmd, "delete"))
- return(dsselect(args, DS_SELECT_REMOVE, maxshowdevs, s1));
- if (prefix(cmd, "show") || prefix(cmd, "only"))
- return(dsselect(args, DS_SELECT_ONLY, maxshowdevs, s1));
- if (prefix(cmd, "type") || prefix(cmd, "match"))
- return(dsmatchselect(args, DS_SELECT_ONLY, maxshowdevs, s1));
- if (prefix(cmd, "refresh")) {
- retval = devstat_selectdevs(&dev_select, &num_selected,
- &num_selections, &select_generation, generation,
- s1->dinfo->devices, num_devices,
- (last_type ==DS_MATCHTYPE_PATTERN) ? matches : NULL,
- (last_type ==DS_MATCHTYPE_PATTERN) ? num_matches : 0,
- (last_type == DS_MATCHTYPE_SPEC) ?specified_devices : NULL,
- (last_type == DS_MATCHTYPE_SPEC) ?num_devices_specified : 0,
- (last_type == DS_MATCHTYPE_NONE) ? DS_SELECT_ADD :
- DS_SELECT_ADDONLY, maxshowdevs, 0);
- if (retval == -1) {
- warnx("%s", devstat_errbuf);
- return(0);
- } else if (retval == 1)
- return(2);
- }
- if (prefix(cmd, "drives")) {
- int i;
- move(CMDLINE, 0);
- clrtoeol();
- for (i = 0; i < num_devices; i++) {
- printw("%s%d ", s1->dinfo->devices[i].device_name,
- s1->dinfo->devices[i].unit_number);
- }
- return(1);
- }
- return(0);
-}
-
-static int
-dsmatchselect(const char *args, devstat_select_mode select_mode, int maxshowdevs,
- struct statinfo *s1)
-{
- char **tempstr, *tmpstr, *tmpstr1;
- char *tstr[100];
- int num_args = 0;
- int i;
- int retval = 0;
-
- /*
- * Break the (pipe delimited) input string out into separate
- * strings.
- */
- tmpstr = tmpstr1 = strdup(args);
- for (tempstr = tstr, num_args = 0;
- (*tempstr = strsep(&tmpstr1, "|")) != NULL && (num_args < 100);
- num_args++)
- if (**tempstr != '\0')
- if (++tempstr >= &tstr[100])
- break;
- free(tmpstr);
-
- if (num_args > 99) {
- warnx("dsmatchselect: too many match arguments");
- return(0);
- }
-
- /*
- * If we've gone through the matching code before, clean out
- * previously used memory.
- */
- if (num_matches > 0) {
- free(matches);
- matches = NULL;
- num_matches = 0;
- }
-
- for (i = 0; i < num_args; i++) {
- if (devstat_buildmatch(tstr[i], &matches, &num_matches) != 0) {
- warnx("%s", devstat_errbuf);
- return(0);
- }
- }
- if (num_args > 0) {
-
- last_type = DS_MATCHTYPE_PATTERN;
-
- retval = devstat_selectdevs(&dev_select, &num_selected,
- &num_selections, &select_generation, generation,
- s1->dinfo->devices, num_devices, matches, num_matches,
- NULL, 0, select_mode, maxshowdevs, 0);
- if (retval == -1)
- err(1, "device selection error");
- else if (retval == 1)
- return(2);
- }
- return(1);
-}
-
-static int
-dsselect(const char *args, devstat_select_mode select_mode, int maxshowdevs,
- struct statinfo *s1)
-{
- char *cp, *tmpstr, *tmpstr1, *buffer;
- int i;
- int retval = 0;
-
- /*
- * If we've gone through this code before, free previously
- * allocated resources.
- */
- if (num_devices_specified > 0) {
- for (i = 0; i < num_devices_specified; i++)
- free(specified_devices[i]);
- free(specified_devices);
- specified_devices = NULL;
- num_devices_specified = 0;
- }
-
- /* do an initial malloc */
- specified_devices = (char **)malloc(sizeof(char *));
-
- tmpstr = tmpstr1 = strdup(args);
- cp = index(tmpstr1, '\n');
- if (cp)
- *cp = '\0';
- for (;;) {
- for (cp = tmpstr1; *cp && isspace(*cp); cp++)
- ;
- tmpstr1 = cp;
- for (; *cp && !isspace(*cp); cp++)
- ;
- if (*cp)
- *cp++ = '\0';
- if (cp - args == 0)
- break;
- for (i = 0; i < num_devices; i++) {
- asprintf(&buffer, "%s%d", dev_select[i].device_name,
- dev_select[i].unit_number);
- if (strcmp(buffer, tmpstr1) == 0) {
-
- num_devices_specified++;
-
- specified_devices =(char **)realloc(
- specified_devices,
- sizeof(char *) *
- num_devices_specified);
- specified_devices[num_devices_specified -1]=
- strdup(tmpstr1);
- free(buffer);
-
- break;
- }
- else
- free(buffer);
- }
- if (i >= num_devices)
- error("%s: unknown drive", args);
- args = cp;
- }
- free(tmpstr);
-
- if (num_devices_specified > 0) {
- last_type = DS_MATCHTYPE_SPEC;
-
- retval = devstat_selectdevs(&dev_select, &num_selected,
- &num_selections, &select_generation, generation,
- s1->dinfo->devices, num_devices, NULL, 0,
- specified_devices, num_devices_specified,
- select_mode, maxshowdevs, 0);
- if (retval == -1)
- err(1, "%s", devstat_errbuf);
- else if (retval == 1)
- return(2);
- }
- return(1);
-}
diff --git a/usr.bin/systat/devs.h b/usr.bin/systat/devs.h
deleted file mode 100644
index 9217008..0000000
--- a/usr.bin/systat/devs.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*-
- * Copyright (c) 1998 David E. O'Brien
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-int dsinit(int, struct statinfo *, struct statinfo *, struct statinfo *);
-int dscmd(const char *, const char *, int, struct statinfo *);
diff --git a/usr.bin/systat/extern.h b/usr.bin/systat/extern.h
deleted file mode 100644
index 84af89c..0000000
--- a/usr.bin/systat/extern.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#include <sys/cdefs.h>
-#include <fcntl.h>
-#include <kvm.h>
-
-extern struct cmdtab *curcmd;
-extern struct cmdtab cmdtab[];
-extern struct text *xtext;
-extern WINDOW *wnd;
-extern char **dr_name;
-extern char c, *namp, hostname[];
-extern double avenrun[3];
-extern float *dk_mspw;
-extern kvm_t *kd;
-extern long ntext, textp;
-extern int *dk_select;
-extern int CMDLINE;
-extern int dk_ndrive;
-extern int hz, stathz;
-extern double hertz; /* sampling frequency for cp_time and dk_time */
-extern int naptime, col;
-extern int nhosts;
-extern int nports;
-extern int protos;
-extern int verbose;
-
-struct inpcb;
-
-extern struct device_selection *dev_select;
-extern long generation;
-extern int num_devices;
-extern int num_selected;
-extern int num_selections;
-extern long select_generation;
-
-extern struct nlist namelist[];
-
-int checkhost(struct inpcb *);
-int checkport(struct inpcb *);
-void closeicmp(WINDOW *);
-void closeicmp6(WINDOW *);
-void closeifstat(WINDOW *);
-void closeiostat(WINDOW *);
-void closeip(WINDOW *);
-void closeip6(WINDOW *);
-void closekre(WINDOW *);
-void closembufs(WINDOW *);
-void closenetstat(WINDOW *);
-void closepigs(WINDOW *);
-void closeswap(WINDOW *);
-void closetcp(WINDOW *);
-int cmdifstat(const char *, const char *);
-int cmdiostat(const char *, const char *);
-int cmdkre(const char *, const char *);
-int cmdnetstat(const char *, const char *);
-struct cmdtab *lookup(const char *);
-void command(const char *);
-void die(int);
-void display(int);
-int dkinit(void);
-int dkcmd(char *, char *);
-void error(const char *fmt, ...) __printflike(1, 2);
-void fetchicmp(void);
-void fetchicmp6(void);
-void fetchifstat(void);
-void fetchip(void);
-void fetchip6(void);
-void fetchiostat(void);
-void fetchkre(void);
-void fetchmbufs(void);
-void fetchnetstat(void);
-void fetchpigs(void);
-void fetchswap(void);
-void fetchtcp(void);
-void getsysctl(const char *, void *, size_t);
-int ifcmd(const char *cmd, const char *args);
-int initicmp(void);
-int initicmp6(void);
-int initifstat(void);
-int initip(void);
-int initip6(void);
-int initiostat(void);
-int initkre(void);
-int initmbufs(void);
-int initnetstat(void);
-int initpigs(void);
-int initswap(void);
-int inittcp(void);
-int keyboard(void);
-int kvm_ckread(void *, void *, int);
-void labelicmp(void);
-void labelicmp6(void);
-void labelifstat(void);
-void labelip(void);
-void labelip6(void);
-void labeliostat(void);
-void labelkre(void);
-void labelmbufs(void);
-void labelnetstat(void);
-void labelpigs(void);
-void labels(void);
-void labelswap(void);
-void labeltcp(void);
-void load(void);
-int netcmd(const char *, const char *);
-void nlisterr(struct nlist []);
-WINDOW *openicmp(void);
-WINDOW *openicmp6(void);
-WINDOW *openifstat(void);
-WINDOW *openip(void);
-WINDOW *openip6(void);
-WINDOW *openiostat(void);
-WINDOW *openkre(void);
-WINDOW *openmbufs(void);
-WINDOW *opennetstat(void);
-WINDOW *openpigs(void);
-WINDOW *openswap(void);
-WINDOW *opentcp(void);
-int prefix(const char *, const char *);
-void reseticmp(void);
-void reseticmp6(void);
-void resetip(void);
-void resetip6(void);
-void resettcp(void);
-void showicmp(void);
-void showicmp6(void);
-void showifstat(void);
-void showip(void);
-void showip6(void);
-void showiostat(void);
-void showkre(void);
-void showmbufs(void);
-void shownetstat(void);
-void showpigs(void);
-void showswap(void);
-void showtcp(void);
-void status(void);
-void suspend(int);
-char *sysctl_dynread(const char *, size_t *);
diff --git a/usr.bin/systat/fetch.c b/usr.bin/systat/fetch.c
deleted file mode 100644
index 0edce34..0000000
--- a/usr.bin/systat/fetch.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/*-
- * Copyright (c) 1980, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifdef lint
-static const char sccsid[] = "@(#)fetch.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <sys/types.h>
-#include <sys/sysctl.h>
-
-#include <err.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "systat.h"
-#include "extern.h"
-
-int
-kvm_ckread(void *a, void *b, int l)
-{
- if (kvm_read(kd, (u_long)a, b, l) != l) {
- if (verbose)
- error("error reading kmem at %p", a);
- return (0);
- }
- else
- return (1);
-}
-
-void getsysctl(const char *name, void *ptr, size_t len)
-{
- size_t nlen = len;
- if (sysctlbyname(name, ptr, &nlen, NULL, 0) != 0) {
- error("sysctl(%s...) failed: %s", name,
- strerror(errno));
- }
- if (nlen != len) {
- error("sysctl(%s...) expected %lu, got %lu", name,
- (unsigned long)len, (unsigned long)nlen);
- }
-}
-
-/*
- * Read sysctl data with variable size. Try some times (with increasing
- * buffers), fail if still too small.
- * This is needed sysctls with possibly raplidly increasing data sizes,
- * but imposes little overhead in the case of constant sizes.
- * Returns NULL on error, or a pointer to freshly malloc()'ed memory that holds
- * the requested data.
- * If szp is not NULL, the size of the returned data will be written into *szp.
- */
-
-/* Some defines: Number of tries. */
-#define SD_NTRIES 10
-/* Percent of over-allocation (initial) */
-#define SD_MARGIN 10
-/*
- * Factor for over-allocation in percent (the margin is increased by this on
- * any failed try).
- */
-#define SD_FACTOR 50
-/* Maximum supported MIB depth */
-#define SD_MAXMIB 16
-
-char *
-sysctl_dynread(const char *n, size_t *szp)
-{
- char *rv = NULL;
- int mib[SD_MAXMIB];
- size_t mibsz = SD_MAXMIB;
- size_t mrg = SD_MARGIN;
- size_t sz;
- int i;
-
- /* cache the MIB */
- if (sysctlnametomib(n, mib, &mibsz) == -1) {
- if (errno == ENOMEM) {
- error("XXX: SD_MAXMIB too small, please bump!");
- }
- return NULL;
- }
- for (i = 0; i < SD_NTRIES; i++) {
- /* get needed buffer size */
- if (sysctl(mib, mibsz, NULL, &sz, NULL, 0) == -1)
- break;
- sz += sz * mrg / 100;
- if ((rv = (char *)malloc(sz)) == NULL) {
- error("Out of memory!");
- return NULL;
- }
- if (sysctl(mib, mibsz, rv, &sz, NULL, 0) == -1) {
- free(rv);
- rv = NULL;
- if (errno == ENOMEM) {
- mrg += mrg * SD_FACTOR / 100;
- } else
- break;
- } else {
- /* success */
- if (szp != NULL)
- *szp = sz;
- break;
- }
- }
-
- return rv;
-}
diff --git a/usr.bin/systat/icmp.c b/usr.bin/systat/icmp.c
deleted file mode 100644
index 2d5f8e4..0000000
--- a/usr.bin/systat/icmp.c
+++ /dev/null
@@ -1,284 +0,0 @@
-/*-
- * Copyright (c) 1980, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifdef lint
-static char sccsid[] = "@(#)mbufs.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-/* From:
- "Id: mbufs.c,v 1.5 1997/02/24 20:59:03 wollman Exp"
-*/
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/sysctl.h>
-
-#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#include <netinet/ip_icmp.h>
-#include <netinet/icmp_var.h>
-
-#include <stdlib.h>
-#include <string.h>
-#include <paths.h>
-#include "systat.h"
-#include "extern.h"
-#include "mode.h"
-
-static struct icmpstat icmpstat, initstat, oldstat;
-
-/*-
---0 1 2 3 4 5 6 7
---0123456789012345678901234567890123456789012345678901234567890123456789012345
-00 ICMP Input ICMP Output
-01999999999 total messages 999999999 total messages
-02999999999 with bad code 999999999 errors generated
-03999999999 with bad length 999999999 suppressed - original too short
-04999999999 with bad checksum 999999999 suppressed - original was ICMP
-05999999999 with insufficient data 999999999 responses sent
-06 999999999 suppressed - multicast echo
-07 999999999 suppressed - multicast tstamp
-08
-09 Input Histogram Output Histogram
-10999999999 echo response 999999999 echo response
-11999999999 echo request 999999999 echo request
-12999999999 destination unreachable 999999999 destination unreachable
-13999999999 redirect 999999999 redirect
-14999999999 time-to-live exceeded 999999999 time-to-line exceeded
-15999999999 parameter problem 999999999 parameter problem
-16999999999 router advertisement 999999999 router solicitation
-17
-18
---0123456789012345678901234567890123456789012345678901234567890123456789012345
---0 1 2 3 4 5 6 7
-*/
-
-WINDOW *
-openicmp(void)
-{
- return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0));
-}
-
-void
-closeicmp(WINDOW *w)
-{
- if (w == NULL)
- return;
- wclear(w);
- wrefresh(w);
- delwin(w);
-}
-
-void
-labelicmp(void)
-{
- wmove(wnd, 0, 0); wclrtoeol(wnd);
-#define L(row, str) mvwprintw(wnd, row, 10, str)
-#define R(row, str) mvwprintw(wnd, row, 45, str);
- L(0, "ICMP Input"); R(0, "ICMP Output");
- L(1, "total messages"); R(1, "total messages");
- L(2, "with bad code"); R(2, "errors generated");
- L(3, "with bad length"); R(3, "suppressed - original too short");
- L(4, "with bad checksum"); R(4, "suppressed - original was ICMP");
- L(5, "with insufficient data"); R(5, "responses sent");
- R(6, "suppressed - multicast echo");
- R(7, "suppressed - multicast tstamp");
- L(9, "Input Histogram"); R(9, "Output Histogram");
-#define B(row, str) L(row, str); R(row, str)
- B(10, "echo response");
- B(11, "echo request");
- B(12, "destination unreachable");
- B(13, "redirect");
- B(14, "time-to-live exceeded");
- B(15, "parameter problem");
- L(16, "router advertisement"); R(16, "router solicitation");
-#undef L
-#undef R
-#undef B
-}
-
-static void
-domode(struct icmpstat *ret)
-{
- const struct icmpstat *sub;
- int i, divisor = 1;
-
- switch(currentmode) {
- case display_RATE:
- sub = &oldstat;
- divisor = naptime;
- break;
- case display_DELTA:
- sub = &oldstat;
- break;
- case display_SINCE:
- sub = &initstat;
- break;
- default:
- *ret = icmpstat;
- return;
- }
-#define DO(stat) ret->stat = (icmpstat.stat - sub->stat) / divisor
- DO(icps_error);
- DO(icps_oldshort);
- DO(icps_oldicmp);
- for (i = 0; i <= ICMP_MAXTYPE; i++) {
- DO(icps_outhist[i]);
- }
- DO(icps_badcode);
- DO(icps_tooshort);
- DO(icps_checksum);
- DO(icps_badlen);
- DO(icps_reflect);
- for (i = 0; i <= ICMP_MAXTYPE; i++) {
- DO(icps_inhist[i]);
- }
- DO(icps_bmcastecho);
- DO(icps_bmcasttstamp);
-#undef DO
-}
-
-void
-showicmp(void)
-{
- struct icmpstat stats;
- u_long totalin, totalout;
- int i;
-
- memset(&stats, 0, sizeof stats);
- domode(&stats);
- for (i = totalin = totalout = 0; i <= ICMP_MAXTYPE; i++) {
- totalin += stats.icps_inhist[i];
- totalout += stats.icps_outhist[i];
- }
- totalin += stats.icps_badcode + stats.icps_badlen +
- stats.icps_checksum + stats.icps_tooshort;
- mvwprintw(wnd, 1, 0, "%9lu", totalin);
- mvwprintw(wnd, 1, 35, "%9lu", totalout);
-
-#define DO(stat, row, col) \
- mvwprintw(wnd, row, col, "%9lu", stats.stat)
-
- DO(icps_badcode, 2, 0);
- DO(icps_badlen, 3, 0);
- DO(icps_checksum, 4, 0);
- DO(icps_tooshort, 5, 0);
- DO(icps_error, 2, 35);
- DO(icps_oldshort, 3, 35);
- DO(icps_oldicmp, 4, 35);
- DO(icps_reflect, 5, 35);
- DO(icps_bmcastecho, 6, 35);
- DO(icps_bmcasttstamp, 7, 35);
-#define DO2(type, row) DO(icps_inhist[type], row, 0); DO(icps_outhist[type], \
- row, 35)
- DO2(ICMP_ECHOREPLY, 10);
- DO2(ICMP_ECHO, 11);
- DO2(ICMP_UNREACH, 12);
- DO2(ICMP_REDIRECT, 13);
- DO2(ICMP_TIMXCEED, 14);
- DO2(ICMP_PARAMPROB, 15);
- DO(icps_inhist[ICMP_ROUTERADVERT], 16, 0);
- DO(icps_outhist[ICMP_ROUTERSOLICIT], 16, 35);
-#undef DO
-#undef DO2
-}
-
-int
-initicmp(void)
-{
- size_t len;
- int name[4];
-
- name[0] = CTL_NET;
- name[1] = PF_INET;
- name[2] = IPPROTO_ICMP;
- name[3] = ICMPCTL_STATS;
-
- len = 0;
- if (sysctl(name, 4, 0, &len, 0, 0) < 0) {
- error("sysctl getting icmpstat size failed");
- return 0;
- }
- if (len > sizeof icmpstat) {
- error("icmpstat structure has grown--recompile systat!");
- return 0;
- }
- if (sysctl(name, 4, &initstat, &len, 0, 0) < 0) {
- error("sysctl getting icmpstat size failed");
- return 0;
- }
- oldstat = initstat;
- return 1;
-}
-
-void
-reseticmp(void)
-{
- size_t len;
- int name[4];
-
- name[0] = CTL_NET;
- name[1] = PF_INET;
- name[2] = IPPROTO_ICMP;
- name[3] = ICMPCTL_STATS;
-
- len = sizeof initstat;
- if (sysctl(name, 4, &initstat, &len, 0, 0) < 0) {
- error("sysctl getting icmpstat size failed");
- }
- oldstat = initstat;
-}
-
-void
-fetchicmp(void)
-{
- int name[4];
- size_t len;
-
- oldstat = icmpstat;
- name[0] = CTL_NET;
- name[1] = PF_INET;
- name[2] = IPPROTO_ICMP;
- name[3] = ICMPCTL_STATS;
- len = sizeof icmpstat;
-
- if (sysctl(name, 4, &icmpstat, &len, 0, 0) < 0)
- return;
-}
-
diff --git a/usr.bin/systat/icmp6.c b/usr.bin/systat/icmp6.c
deleted file mode 100644
index 5415170..0000000
--- a/usr.bin/systat/icmp6.c
+++ /dev/null
@@ -1,282 +0,0 @@
-/*-
- * Copyright (c) 1980, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifdef lint
-static char sccsid[] = "@(#)mbufs.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-/* From:
- "Id: mbufs.c,v 1.5 1997/02/24 20:59:03 wollman Exp"
-*/
-
-#ifdef INET6
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/sysctl.h>
-
-#include <netinet/in.h>
-#include <netinet/icmp6.h>
-
-#include <stdlib.h>
-#include <string.h>
-#include <paths.h>
-#include "systat.h"
-#include "extern.h"
-#include "mode.h"
-
-static struct icmp6stat icmp6stat, initstat, oldstat;
-
-/*-
---0 1 2 3 4 5 6 7
---0123456789012345678901234567890123456789012345678901234567890123456789012345
-00 ICMPv6 Input ICMPv6 Output
-01999999999 total messages 999999999 total messages
-02999999999 with bad code 999999999 errors generated
-03999999999 with bad length 999999999 suppressed - original too short
-04999999999 with bad checksum 999999999 suppressed - original was ICMP
-05999999999 with insufficient data 999999999 responses sent
-06
-07 Input Histogram Output Histogram
-08999999999 echo response 999999999 echo response
-09999999999 echo request 999999999 echo request
-10999999999 destination unreachable 999999999 destination unreachable
-11999999999 redirect 999999999 redirect
-12999999999 time-to-live exceeded 999999999 time-to-line exceeded
-13999999999 parameter problem 999999999 parameter problem
-14999999999 neighbor solicitation 999999999 neighbor solicitation
-15999999999 neighbor advertisment 999999999 neighbor advertisment
-16999999999 router advertisement 999999999 router solicitation
-17
-18
---0123456789012345678901234567890123456789012345678901234567890123456789012345
---0 1 2 3 4 5 6 7
-*/
-
-WINDOW *
-openicmp6(void)
-{
- return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0));
-}
-
-void
-closeicmp6(WINDOW *w)
-{
- if (w == NULL)
- return;
- wclear(w);
- wrefresh(w);
- delwin(w);
-}
-
-void
-labelicmp6(void)
-{
- wmove(wnd, 0, 0); wclrtoeol(wnd);
-#define L(row, str) mvwprintw(wnd, row, 10, str)
-#define R(row, str) mvwprintw(wnd, row, 45, str);
- L(0, "ICMPv6 Input"); R(0, "ICMPv6 Output");
- L(1, "total messages"); R(1, "total messages");
- L(2, "with bad code"); R(2, "errors generated");
- L(3, "with bad length"); R(3, "suppressed - original too short");
- L(4, "with bad checksum"); R(4, "suppressed - original was ICMP");
- L(5, "with insufficient data"); R(5, "responses sent");
-
- L(7, "Input Histogram"); R(7, "Output Histogram");
-#define B(row, str) L(row, str); R(row, str)
- B(8, "echo response");
- B(9, "echo request");
- B(10, "destination unreachable");
- B(11, "redirect");
- B(12, "time-to-live exceeded");
- B(13, "parameter problem");
- B(14, "neighbor solicitation");
- B(15, "neighbor advertisment");
- L(16, "router advertisement"); R(16, "router solicitation");
-#undef L
-#undef R
-#undef B
-}
-
-static void
-domode(struct icmp6stat *ret)
-{
- const struct icmp6stat *sub;
- int i, divisor = 1;
-
- switch(currentmode) {
- case display_RATE:
- sub = &oldstat;
- divisor = naptime;
- break;
- case display_DELTA:
- sub = &oldstat;
- break;
- case display_SINCE:
- sub = &initstat;
- break;
- default:
- *ret = icmp6stat;
- return;
- }
-#define DO(stat) ret->stat = (icmp6stat.stat - sub->stat) / divisor
- DO(icp6s_error);
- DO(icp6s_tooshort);
- DO(icp6s_canterror);
- for (i = 0; i <= ICMP6_MAXTYPE; i++) {
- DO(icp6s_outhist[i]);
- }
- DO(icp6s_badcode);
- DO(icp6s_tooshort);
- DO(icp6s_checksum);
- DO(icp6s_badlen);
- DO(icp6s_reflect);
- for (i = 0; i <= ICMP6_MAXTYPE; i++) {
- DO(icp6s_inhist[i]);
- }
-#undef DO
-}
-
-void
-showicmp6(void)
-{
- struct icmp6stat stats;
- u_long totalin, totalout;
- int i;
-
- memset(&stats, 0, sizeof stats);
- domode(&stats);
- for (i = totalin = totalout = 0; i <= ICMP6_MAXTYPE; i++) {
- totalin += stats.icp6s_inhist[i];
- totalout += stats.icp6s_outhist[i];
- }
- totalin += stats.icp6s_badcode + stats.icp6s_badlen +
- stats.icp6s_checksum + stats.icp6s_tooshort;
- mvwprintw(wnd, 1, 0, "%9lu", totalin);
- mvwprintw(wnd, 1, 35, "%9lu", totalout);
-
-#define DO(stat, row, col) \
- mvwprintw(wnd, row, col, "%9lu", stats.stat)
-
- DO(icp6s_badcode, 2, 0);
- DO(icp6s_badlen, 3, 0);
- DO(icp6s_checksum, 4, 0);
- DO(icp6s_tooshort, 5, 0);
- DO(icp6s_error, 2, 35);
- DO(icp6s_tooshort, 3, 35);
- DO(icp6s_canterror, 4, 35);
- DO(icp6s_reflect, 5, 35);
-#define DO2(type, row) DO(icp6s_inhist[type], row, 0); DO(icp6s_outhist[type], \
- row, 35)
- DO2(ICMP6_ECHO_REPLY, 8);
- DO2(ICMP6_ECHO_REQUEST, 9);
- DO2(ICMP6_DST_UNREACH, 10);
- DO2(ND_REDIRECT, 11);
- DO2(ICMP6_TIME_EXCEEDED, 12);
- DO2(ICMP6_PARAM_PROB, 13);
- DO2(ND_NEIGHBOR_SOLICIT, 14);
- DO2(ND_NEIGHBOR_ADVERT, 15);
- DO(icp6s_inhist[ND_ROUTER_SOLICIT], 16, 0);
- DO(icp6s_outhist[ND_ROUTER_ADVERT], 16, 35);
-#undef DO
-#undef DO2
-}
-
-int
-initicmp6(void)
-{
- size_t len;
- int name[4];
-
- name[0] = CTL_NET;
- name[1] = PF_INET6;
- name[2] = IPPROTO_ICMPV6;
- name[3] = ICMPV6CTL_STATS;
-
- len = 0;
- if (sysctl(name, 4, 0, &len, 0, 0) < 0) {
- error("sysctl getting icmp6stat size failed");
- return 0;
- }
- if (len > sizeof icmp6stat) {
- error("icmp6stat structure has grown--recompile systat!");
- return 0;
- }
- if (sysctl(name, 4, &initstat, &len, 0, 0) < 0) {
- error("sysctl getting icmp6stat size failed");
- return 0;
- }
- oldstat = initstat;
- return 1;
-}
-
-void
-reseticmp6(void)
-{
- size_t len;
- int name[4];
-
- name[0] = CTL_NET;
- name[1] = PF_INET6;
- name[2] = IPPROTO_ICMPV6;
- name[3] = ICMPV6CTL_STATS;
-
- len = sizeof initstat;
- if (sysctl(name, 4, &initstat, &len, 0, 0) < 0) {
- error("sysctl getting icmp6stat size failed");
- }
- oldstat = initstat;
-}
-
-void
-fetchicmp6(void)
-{
- int name[4];
- size_t len;
-
- oldstat = icmp6stat;
- name[0] = CTL_NET;
- name[1] = PF_INET6;
- name[2] = IPPROTO_ICMPV6;
- name[3] = ICMPV6CTL_STATS;
- len = sizeof icmp6stat;
-
- if (sysctl(name, 4, &icmp6stat, &len, 0, 0) < 0)
- return;
-}
-
-#endif
diff --git a/usr.bin/systat/ifcmds.c b/usr.bin/systat/ifcmds.c
deleted file mode 100644
index 495ac46..0000000
--- a/usr.bin/systat/ifcmds.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2003, Trent Nelson, <trent@arpa.com>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include "systat.h"
-#include "extern.h"
-#include "convtbl.h"
-
-int curscale = SC_AUTO;
-
-int
-ifcmd(const char *cmd, const char *args)
-{
- int scale;
-
- if (prefix(cmd, "scale")) {
- if ((scale = get_scale(args)) != -1)
- curscale = scale;
- else {
- move(CMDLINE, 0);
- clrtoeol();
- addstr("what scale? ");
- addstr(get_helplist());
- }
- }
- return (1);
-}
diff --git a/usr.bin/systat/ifstat.c b/usr.bin/systat/ifstat.c
deleted file mode 100644
index 62773e9..0000000
--- a/usr.bin/systat/ifstat.c
+++ /dev/null
@@ -1,405 +0,0 @@
-/*
- * Copyright (c) 2003, Trent Nelson, <trent@arpa.com>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTIFSTAT_ERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/sysctl.h>
-#include <net/if.h>
-#include <net/if_mib.h>
-
-#include <stdlib.h>
-#include <string.h>
-#include <err.h>
-#include <errno.h>
-
-#include "systat.h"
-#include "extern.h"
-#include "convtbl.h"
-
- /* Column numbers */
-
-#define C1 0 /* 0-19 */
-#define C2 20 /* 20-39 */
-#define C3 40 /* 40-59 */
-#define C4 60 /* 60-80 */
-#define C5 80 /* Used for label positioning. */
-
-static const int col0 = 0;
-static const int col1 = C1;
-static const int col2 = C2;
-static const int col3 = C3;
-static const int col4 = C4;
-static const int col5 = C5;
-
-
-SLIST_HEAD(, if_stat) curlist;
-SLIST_HEAD(, if_stat_disp) displist;
-
-struct if_stat {
- SLIST_ENTRY(if_stat) link;
- char if_name[IF_NAMESIZE];
- struct ifmibdata if_mib;
- struct timeval tv;
- struct timeval tv_lastchanged;
- u_long if_in_curtraffic;
- u_long if_out_curtraffic;
- u_long if_in_traffic_peak;
- u_long if_out_traffic_peak;
- u_int if_row; /* Index into ifmib sysctl */
- u_int if_ypos; /* 0 if not being displayed */
- u_int display;
-};
-
-extern u_int curscale;
-
-static void right_align_string(struct if_stat *);
-static void getifmibdata(const int, struct ifmibdata *);
-static void sort_interface_list(void);
-static u_int getifnum(void);
-
-#define IFSTAT_ERR(n, s) do { \
- putchar(' '); \
- closeifstat(wnd); \
- err((n), (s)); \
-} while (0)
-
-#define TOPLINE 3
-#define TOPLABEL \
-" Interface Traffic Peak Total"
-
-#define STARTING_ROW (TOPLINE + 1)
-#define ROW_SPACING (3)
-
-#define CLEAR_LINE(y, x) do { \
- wmove(wnd, y, x); \
- wclrtoeol(wnd); \
-} while (0)
-
-#define IN_col2 (ifp->if_in_curtraffic)
-#define OUT_col2 (ifp->if_out_curtraffic)
-#define IN_col3 (ifp->if_in_traffic_peak)
-#define OUT_col3 (ifp->if_out_traffic_peak)
-#define IN_col4 (ifp->if_mib.ifmd_data.ifi_ibytes)
-#define OUT_col4 (ifp->if_mib.ifmd_data.ifi_obytes)
-
-#define EMPTY_COLUMN " "
-#define CLEAR_COLUMN(y, x) mvprintw((y), (x), "%20s", EMPTY_COLUMN);
-
-#define DOPUTRATE(c, r, d) do { \
- CLEAR_COLUMN(r, c); \
- mvprintw(r, (c), "%10.3f %s%s ", \
- convert(d##_##c, curscale), \
- get_string(d##_##c, curscale), \
- "/s"); \
-} while (0)
-
-#define DOPUTTOTAL(c, r, d) do { \
- CLEAR_COLUMN((r), (c)); \
- mvprintw((r), (c), "%12.3f %s ", \
- convert(d##_##c, SC_AUTO), \
- get_string(d##_##c, SC_AUTO)); \
-} while (0)
-
-#define PUTRATE(c, r) do { \
- DOPUTRATE(c, (r), IN); \
- DOPUTRATE(c, (r)+1, OUT); \
-} while (0)
-
-#define PUTTOTAL(c, r) do { \
- DOPUTTOTAL(c, (r), IN); \
- DOPUTTOTAL(c, (r)+1, OUT); \
-} while (0)
-
-#define PUTNAME(p) do { \
- mvprintw(p->if_ypos, 0, "%s", p->if_name); \
- mvprintw(p->if_ypos, col2-3, "%s", (const char *)"in"); \
- mvprintw(p->if_ypos+1, col2-3, "%s", (const char *)"out"); \
-} while (0)
-
-
-WINDOW *
-openifstat(void)
-{
- return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0));
-}
-
-void
-closeifstat(WINDOW *w)
-{
- struct if_stat *node = NULL;
-
- while (!SLIST_EMPTY(&curlist)) {
- node = SLIST_FIRST(&curlist);
- SLIST_REMOVE_HEAD(&curlist, link);
- free(node);
- }
-
- if (w != NULL) {
- wclear(w);
- wrefresh(w);
- delwin(w);
- }
-
- return;
-}
-
-
-void
-labelifstat(void)
-{
-
- wmove(wnd, TOPLINE, 0);
- wclrtoeol(wnd);
- mvprintw(TOPLINE, 0, "%s", TOPLABEL);
-
- return;
-}
-
-void
-showifstat(void)
-{
- struct if_stat *ifp = NULL;
- SLIST_FOREACH(ifp, &curlist, link) {
- if (ifp->display == 0)
- continue;
- PUTNAME(ifp);
- PUTRATE(col2, ifp->if_ypos);
- PUTRATE(col3, ifp->if_ypos);
- PUTTOTAL(col4, ifp->if_ypos);
- }
-
- return;
-}
-
-int
-initifstat(void)
-{
- struct if_stat *p = NULL;
- u_int n = 0, i = 0;
-
- n = getifnum();
- if (n <= 0)
- return -1;
-
- SLIST_INIT(&curlist);
-
- for (i = 0; i < n; i++) {
- p = (struct if_stat *)calloc(1, sizeof(struct if_stat));
- if (p == NULL)
- IFSTAT_ERR(1, "out of memory");
- SLIST_INSERT_HEAD(&curlist, p, link);
- p->if_row = i+1;
- getifmibdata(p->if_row, &p->if_mib);
- right_align_string(p);
-
- /*
- * Initially, we only display interfaces that have
- * received some traffic.
- */
- if (p->if_mib.ifmd_data.ifi_ibytes != 0)
- p->display = 1;
- }
-
- sort_interface_list();
-
- return 1;
-}
-
-void
-fetchifstat(void)
-{
- struct if_stat *ifp = NULL;
- struct timeval tv, new_tv, old_tv;
- double elapsed = 0.0;
- u_int new_inb, new_outb, old_inb, old_outb = 0;
- u_int we_need_to_sort_interface_list = 0;
-
- SLIST_FOREACH(ifp, &curlist, link) {
- /*
- * Grab a copy of the old input/output values before we
- * call getifmibdata().
- */
- old_inb = ifp->if_mib.ifmd_data.ifi_ibytes;
- old_outb = ifp->if_mib.ifmd_data.ifi_obytes;
- ifp->tv_lastchanged = ifp->if_mib.ifmd_data.ifi_lastchange;
-
- if (gettimeofday(&new_tv, (struct timezone *)0) != 0)
- IFSTAT_ERR(2, "error getting time of day");
- (void)getifmibdata(ifp->if_row, &ifp->if_mib);
-
-
- new_inb = ifp->if_mib.ifmd_data.ifi_ibytes;
- new_outb = ifp->if_mib.ifmd_data.ifi_obytes;
-
- /* Display interface if it's received some traffic. */
- if (new_inb > 0 && old_inb == 0) {
- ifp->display = 1;
- we_need_to_sort_interface_list++;
- }
-
- /*
- * The rest is pretty trivial. Calculate the new values
- * for our current traffic rates, and while we're there,
- * see if we have new peak rates.
- */
- old_tv = ifp->tv;
- timersub(&new_tv, &old_tv, &tv);
- elapsed = tv.tv_sec + (tv.tv_usec * 1e-6);
-
- ifp->if_in_curtraffic = new_inb - old_inb;
- ifp->if_out_curtraffic = new_outb - old_outb;
-
- /*
- * Rather than divide by the time specified on the comm-
- * and line, we divide by ``elapsed'' as this is likely
- * to be more accurate.
- */
- ifp->if_in_curtraffic /= elapsed;
- ifp->if_out_curtraffic /= elapsed;
-
- if (ifp->if_in_curtraffic > ifp->if_in_traffic_peak)
- ifp->if_in_traffic_peak = ifp->if_in_curtraffic;
-
- if (ifp->if_out_curtraffic > ifp->if_out_traffic_peak)
- ifp->if_out_traffic_peak = ifp->if_out_curtraffic;
-
- ifp->tv.tv_sec = new_tv.tv_sec;
- ifp->tv.tv_usec = new_tv.tv_usec;
-
- }
-
- if (we_need_to_sort_interface_list)
- sort_interface_list();
-
- return;
-}
-
-/*
- * We want to right justify our interface names against the first column
- * (first sixteen or so characters), so we need to do some alignment.
- */
-static void
-right_align_string(struct if_stat *ifp)
-{
- int str_len = 0, pad_len = 0;
- char *newstr = NULL, *ptr = NULL;
-
- if (ifp == NULL || ifp->if_mib.ifmd_name == NULL)
- return;
- else {
- /* string length + '\0' */
- str_len = strlen(ifp->if_mib.ifmd_name)+1;
- pad_len = IF_NAMESIZE-(str_len);
-
- newstr = ifp->if_name;
- ptr = newstr + pad_len;
- (void)memset((void *)newstr, (int)' ', IF_NAMESIZE);
- (void)strncpy(ptr, (const char *)&ifp->if_mib.ifmd_name,
- str_len);
- }
-
- return;
-}
-
-/*
- * This function iterates through our list of interfaces, identifying
- * those that are to be displayed (ifp->display = 1). For each interf-
- * rface that we're displaying, we generate an appropriate position for
- * it on the screen (ifp->if_ypos).
- *
- * This function is called any time a change is made to an interface's
- * ``display'' state.
- */
-void
-sort_interface_list(void)
-{
- struct if_stat *ifp = NULL;
- u_int y = 0;
-
- y = STARTING_ROW;
- SLIST_FOREACH(ifp, &curlist, link) {
- if (ifp->display) {
- ifp->if_ypos = y;
- y += ROW_SPACING;
- }
- }
-}
-
-static
-unsigned int
-getifnum(void)
-{
- u_int data = 0;
- size_t datalen = 0;
- static int name[] = { CTL_NET,
- PF_LINK,
- NETLINK_GENERIC,
- IFMIB_SYSTEM,
- IFMIB_IFCOUNT };
-
- datalen = sizeof(data);
- if (sysctl(name, 5, (void *)&data, (size_t *)&datalen, (void *)NULL,
- (size_t)0) != 0)
- IFSTAT_ERR(1, "sysctl error");
- return data;
-}
-
-static void
-getifmibdata(int row, struct ifmibdata *data)
-{
- size_t datalen = 0;
- static int name[] = { CTL_NET,
- PF_LINK,
- NETLINK_GENERIC,
- IFMIB_IFDATA,
- 0,
- IFDATA_GENERAL };
- datalen = sizeof(*data);
- name[4] = row;
-
- if ((sysctl(name, 6, (void *)data, (size_t *)&datalen, (void *)NULL,
- (size_t)0) != 0) && (errno != ENOENT))
- IFSTAT_ERR(2, "sysctl error getting interface data");
-}
-
-int
-cmdifstat(const char *cmd, const char *args)
-{
- int retval = 0;
-
- retval = ifcmd(cmd, args);
- /* ifcmd() returns 1 on success */
- if (retval == 1) {
- showifstat();
- refresh();
- }
-
- return retval;
-}
diff --git a/usr.bin/systat/iostat.c b/usr.bin/systat/iostat.c
deleted file mode 100644
index 90e1578..0000000
--- a/usr.bin/systat/iostat.c
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * Copyright (c) 1998 Kenneth D. Merry.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*
- * Copyright (c) 1980, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifdef lint
-static const char sccsid[] = "@(#)iostat.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <sys/param.h>
-#include <sys/sysctl.h>
-#include <sys/resource.h>
-
-#include <devstat.h>
-#include <err.h>
-#include <nlist.h>
-#include <paths.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "systat.h"
-#include "extern.h"
-#include "devs.h"
-
-struct statinfo cur, last;
-
-static int linesperregion;
-static double etime;
-static int numbers = 0; /* default display bar graphs */
-static int kbpt = 0; /* default ms/seek shown */
-
-static int barlabels(int);
-static void histogram(long double, int, double);
-static int numlabels(int);
-static int devstats(int, int, int);
-static void stat1(int, int);
-
-WINDOW *
-openiostat(void)
-{
- return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0));
-}
-
-void
-closeiostat(WINDOW *w)
-{
- if (w == NULL)
- return;
- wclear(w);
- wrefresh(w);
- delwin(w);
-}
-
-int
-initiostat(void)
-{
- if ((num_devices = devstat_getnumdevs(NULL)) < 0)
- return(0);
-
- cur.dinfo = (struct devinfo *)malloc(sizeof(struct devinfo));
- last.dinfo = (struct devinfo *)malloc(sizeof(struct devinfo));
- bzero(cur.dinfo, sizeof(struct devinfo));
- bzero(last.dinfo, sizeof(struct devinfo));
-
- /*
- * This value for maxshowdevs (100) is bogus. I'm not sure exactly
- * how to calculate it, though.
- */
- if (dsinit(100, &cur, &last, NULL) != 1)
- return(0);
-
- return(1);
-}
-
-void
-fetchiostat(void)
-{
- struct devinfo *tmp_dinfo;
- size_t len;
-
- len = sizeof(cur.cp_time);
- if (sysctlbyname("kern.cp_time", &cur.cp_time, &len, NULL, 0)
- || len != sizeof(cur.cp_time)) {
- perror("kern.cp_time");
- exit (1);
- }
- tmp_dinfo = last.dinfo;
- last.dinfo = cur.dinfo;
- cur.dinfo = tmp_dinfo;
-
- last.snap_time = cur.snap_time;
-
- /*
- * Here what we want to do is refresh our device stats.
- * getdevs() returns 1 when the device list has changed.
- * If the device list has changed, we want to go through
- * the selection process again, in case a device that we
- * were previously displaying has gone away.
- */
- switch (devstat_getdevs(NULL, &cur)) {
- case -1:
- errx(1, "%s", devstat_errbuf);
- break;
- case 1:
- cmdiostat("refresh", NULL);
- break;
- default:
- break;
- }
- num_devices = cur.dinfo->numdevs;
- generation = cur.dinfo->generation;
-
-}
-
-#define INSET 10
-
-void
-labeliostat(void)
-{
- int row;
-
- row = 0;
- wmove(wnd, row, 0); wclrtobot(wnd);
- mvwaddstr(wnd, row++, INSET,
- "/0% /10 /20 /30 /40 /50 /60 /70 /80 /90 /100");
- mvwaddstr(wnd, row++, 0, "cpu user|");
- mvwaddstr(wnd, row++, 0, " nice|");
- mvwaddstr(wnd, row++, 0, " system|");
- mvwaddstr(wnd, row++, 0, "interrupt|");
- mvwaddstr(wnd, row++, 0, " idle|");
- if (numbers)
- row = numlabels(row + 1);
- else
- row = barlabels(row + 1);
-}
-
-static int
-numlabels(int row)
-{
- int i, _col, regions, ndrives;
- char tmpstr[10];
-
-#define COLWIDTH 17
-#define DRIVESPERLINE ((wnd->_maxx - INSET) / COLWIDTH)
- for (ndrives = 0, i = 0; i < num_devices; i++)
- if (dev_select[i].selected)
- ndrives++;
- regions = howmany(ndrives, DRIVESPERLINE);
- /*
- * Deduct -regions for blank line after each scrolling region.
- */
- linesperregion = (wnd->_maxy - row - regions) / regions;
- /*
- * Minimum region contains space for two
- * label lines and one line of statistics.
- */
- if (linesperregion < 3)
- linesperregion = 3;
- _col = INSET;
- for (i = 0; i < num_devices; i++)
- if (dev_select[i].selected) {
- if (_col + COLWIDTH >= wnd->_maxx - INSET) {
- _col = INSET, row += linesperregion + 1;
- if (row > wnd->_maxy - (linesperregion + 1))
- break;
- }
- sprintf(tmpstr, "%s%d", dev_select[i].device_name,
- dev_select[i].unit_number);
- mvwaddstr(wnd, row, _col + 4, tmpstr);
- mvwaddstr(wnd, row + 1, _col, " KB/t tps MB/s ");
- _col += COLWIDTH;
- }
- if (_col)
- row += linesperregion + 1;
- return (row);
-}
-
-static int
-barlabels(int row)
-{
- int i;
- char tmpstr[10];
-
- mvwaddstr(wnd, row++, INSET,
- "/0% /10 /20 /30 /40 /50 /60 /70 /80 /90 /100");
- linesperregion = 2 + kbpt;
- for (i = 0; i < num_devices; i++)
- if (dev_select[i].selected) {
- if (row > wnd->_maxy - linesperregion)
- break;
- sprintf(tmpstr, "%s%d", dev_select[i].device_name,
- dev_select[i].unit_number);
- mvwprintw(wnd, row++, 0, "%-5.5s MB/s|",
- tmpstr);
- mvwaddstr(wnd, row++, 0, " tps|");
- if (kbpt)
- mvwaddstr(wnd, row++, 0, " KB/t|");
- }
- return (row);
-}
-
-
-void
-showiostat(void)
-{
- long t;
- int i, row, _col;
-
-#define X(fld) t = cur.fld[i]; cur.fld[i] -= last.fld[i]; last.fld[i] = t
- etime = 0;
- for(i = 0; i < CPUSTATES; i++) {
- X(cp_time);
- etime += cur.cp_time[i];
- }
- if (etime == 0.0)
- etime = 1.0;
- etime /= hertz;
- row = 1;
- for (i = 0; i < CPUSTATES; i++)
- stat1(row++, i);
- if (!numbers) {
- row += 2;
- for (i = 0; i < num_devices; i++)
- if (dev_select[i].selected) {
- if (row > wnd->_maxy - linesperregion)
- break;
- row = devstats(row, INSET, i);
- }
- return;
- }
- _col = INSET;
- wmove(wnd, row + linesperregion, 0);
- wdeleteln(wnd);
- wmove(wnd, row + 3, 0);
- winsertln(wnd);
- for (i = 0; i < num_devices; i++)
- if (dev_select[i].selected) {
- if (_col + COLWIDTH >= wnd->_maxx - INSET) {
- _col = INSET, row += linesperregion + 1;
- if (row > wnd->_maxy - (linesperregion + 1))
- break;
- wmove(wnd, row + linesperregion, 0);
- wdeleteln(wnd);
- wmove(wnd, row + 3, 0);
- winsertln(wnd);
- }
- (void) devstats(row + 3, _col, i);
- _col += COLWIDTH;
- }
-}
-
-static int
-devstats(int row, int _col, int dn)
-{
- long double transfers_per_second;
- long double kb_per_transfer, mb_per_second;
- long double busy_seconds;
- int di;
-
- di = dev_select[dn].position;
-
- busy_seconds = cur.snap_time - last.snap_time;
-
- if (devstat_compute_statistics(&cur.dinfo->devices[di],
- &last.dinfo->devices[di], busy_seconds,
- DSM_KB_PER_TRANSFER, &kb_per_transfer,
- DSM_TRANSFERS_PER_SECOND, &transfers_per_second,
- DSM_MB_PER_SECOND, &mb_per_second, DSM_NONE) != 0)
- errx(1, "%s", devstat_errbuf);
-
- if (numbers) {
- mvwprintw(wnd, row, _col, " %5.2Lf %3.0Lf %5.2Lf ",
- kb_per_transfer, transfers_per_second,
- mb_per_second);
- return(row);
- }
- wmove(wnd, row++, _col);
- histogram(mb_per_second, 50, .5);
- wmove(wnd, row++, _col);
- histogram(transfers_per_second, 50, .5);
- if (kbpt) {
- wmove(wnd, row++, _col);
- histogram(kb_per_transfer, 50, .5);
- }
-
- return(row);
-
-}
-
-static void
-stat1(int row, int o)
-{
- int i;
- double dtime;
-
- dtime = 0.0;
- for (i = 0; i < CPUSTATES; i++)
- dtime += cur.cp_time[i];
- if (dtime == 0.0)
- dtime = 1.0;
- wmove(wnd, row, INSET);
-#define CPUSCALE 0.5
- histogram(100.0 * cur.cp_time[o] / dtime, 50, CPUSCALE);
-}
-
-static void
-histogram(long double val, int colwidth, double scale)
-{
- char buf[10];
- int k;
- int v = (int)(val * scale) + 0.5;
-
- k = MIN(v, colwidth);
- if (v > colwidth) {
- snprintf(buf, sizeof(buf), "%5.2Lf", val);
- k -= strlen(buf);
- while (k--)
- waddch(wnd, 'X');
- waddstr(wnd, buf);
- return;
- }
- while (k--)
- waddch(wnd, 'X');
- wclrtoeol(wnd);
-}
-
-int
-cmdiostat(const char *cmd, const char *args)
-{
-
- if (prefix(cmd, "kbpt"))
- kbpt = !kbpt;
- else if (prefix(cmd, "numbers"))
- numbers = 1;
- else if (prefix(cmd, "bars"))
- numbers = 0;
- else if (!dscmd(cmd, args, 100, &cur))
- return (0);
- wclear(wnd);
- labeliostat();
- refresh();
- return (1);
-}
diff --git a/usr.bin/systat/ip.c b/usr.bin/systat/ip.c
deleted file mode 100644
index 0914328..0000000
--- a/usr.bin/systat/ip.c
+++ /dev/null
@@ -1,344 +0,0 @@
-/*-
- * Copyright (c) 1980, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifdef lint
-static const char sccsid[] = "@(#)mbufs.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-/* From:
- "Id: mbufs.c,v 1.5 1997/02/24 20:59:03 wollman Exp"
-*/
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/sysctl.h>
-
-#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#include <netinet/ip_var.h>
-#include <netinet/udp.h>
-#include <netinet/udp_var.h>
-
-#include <stdlib.h>
-#include <string.h>
-#include <paths.h>
-
-#include "systat.h"
-#include "extern.h"
-#include "mode.h"
-
-struct stat {
- struct ipstat i;
- struct udpstat u;
-};
-
-static struct stat curstat, initstat, oldstat;
-
-/*-
---0 1 2 3 4 5 6 7
---0123456789012345678901234567890123456789012345678901234567890123456789012345
-00 IP Input IP Output
-01999999999 total packets received 999999999 total packets sent
-02999999999 - with bad checksums 999999999 - generated locally
-03999999999 - too short for header 999999999 - output drops
-04999999999 - too short for data 999999999 output fragments generated
-05999999999 - with invalid hlen 999999999 - fragmentation failed
-06999999999 - with invalid length 999999999 destinations unreachable
-07999999999 - with invalid version 999999999 packets output via raw IP
-08999999999 - jumbograms
-09999999999 total fragments received UDP Statistics
-10999999999 - fragments dropped 999999999 total input packets
-11999999999 - fragments timed out 999999999 - too short for header
-12999999999 - packets reassembled ok 999999999 - invalid checksum
-13999999999 packets forwarded 999999999 - no checksum
-14999999999 - unreachable dests 999999999 - invalid length
-15999999999 - redirects generated 999999999 - no socket for dest port
-16999999999 option errors 999999999 - no socket for broadcast
-17999999999 unwanted multicasts 999999999 - socket buffer full
-18999999999 delivered to upper layer 999999999 total output packets
---0123456789012345678901234567890123456789012345678901234567890123456789012345
---0 1 2 3 4 5 6 7
-*/
-
-WINDOW *
-openip(void)
-{
- return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0));
-}
-
-void
-closeip(WINDOW *w)
-{
- if (w == NULL)
- return;
- wclear(w);
- wrefresh(w);
- delwin(w);
-}
-
-void
-labelip(void)
-{
- wmove(wnd, 0, 0); wclrtoeol(wnd);
-#define L(row, str) mvwprintw(wnd, row, 10, str)
-#define R(row, str) mvwprintw(wnd, row, 45, str);
- L(0, "IP Input"); R(0, "IP Output");
- L(1, "total packets received"); R(1, "total packets sent");
- L(2, "- with bad checksums"); R(2, "- generated locally");
- L(3, "- too short for header"); R(3, "- output drops");
- L(4, "- too short for data"); R(4, "output fragments generated");
- L(5, "- with invalid hlen"); R(5, "- fragmentation failed");
- L(6, "- with invalid length"); R(6, "destinations unreachable");
- L(7, "- with invalid version"); R(7, "packets output via raw IP");
- L(8, "- jumbograms");
- L(9, "total fragments received"); R(9, "UDP Statistics");
- L(10, "- fragments dropped"); R(10, "total input packets");
- L(11, "- fragments timed out"); R(11, "- too short for header");
- L(12, "- packets reassembled ok"); R(12, "- invalid checksum");
- L(13, "packets forwarded"); R(13, "- no checksum");
- L(14, "- unreachable dests"); R(14, "- invalid length");
- L(15, "- redirects generated"); R(15, "- no socket for dest port");
- L(16, "option errors"); R(16, "- no socket for broadcast");
- L(17, "unwanted multicasts"); R(17, "- socket buffer full");
- L(18, "delivered to upper layer"); R(18, "total output packets");
-#undef L
-#undef R
-}
-
-static void
-domode(struct stat *ret)
-{
- const struct stat *sub;
- int divisor = 1;
-
- switch(currentmode) {
- case display_RATE:
- sub = &oldstat;
- divisor = naptime;
- break;
- case display_DELTA:
- sub = &oldstat;
- break;
- case display_SINCE:
- sub = &initstat;
- break;
- default:
- *ret = curstat;
- return;
- }
-#define DO(stat) ret->stat = (curstat.stat - sub->stat) / divisor
- DO(i.ips_total);
- DO(i.ips_badsum);
- DO(i.ips_tooshort);
- DO(i.ips_toosmall);
- DO(i.ips_badhlen);
- DO(i.ips_badlen);
- DO(i.ips_fragments);
- DO(i.ips_fragdropped);
- DO(i.ips_fragtimeout);
- DO(i.ips_forward);
- DO(i.ips_cantforward);
- DO(i.ips_redirectsent);
- DO(i.ips_noproto);
- DO(i.ips_delivered);
- DO(i.ips_localout);
- DO(i.ips_odropped);
- DO(i.ips_reassembled);
- DO(i.ips_fragmented);
- DO(i.ips_ofragments);
- DO(i.ips_cantfrag);
- DO(i.ips_badoptions);
- DO(i.ips_noroute);
- DO(i.ips_badvers);
- DO(i.ips_rawout);
- DO(i.ips_toolong);
- DO(i.ips_notmember);
- DO(u.udps_ipackets);
- DO(u.udps_hdrops);
- DO(u.udps_badsum);
- DO(u.udps_nosum);
- DO(u.udps_badlen);
- DO(u.udps_noport);
- DO(u.udps_noportbcast);
- DO(u.udps_fullsock);
- DO(u.udps_opackets);
-#undef DO
-}
-
-void
-showip(void)
-{
- struct stat stats;
- u_long totalout;
-
- domode(&stats);
- totalout = stats.i.ips_forward + stats.i.ips_localout;
-
-#define DO(stat, row, col) \
- mvwprintw(wnd, row, col, "%9lu", stats.stat)
-
- DO(i.ips_total, 1, 0);
- mvwprintw(wnd, 1, 35, "%9lu", totalout);
- DO(i.ips_badsum, 2, 0);
- DO(i.ips_localout, 2, 35);
- DO(i.ips_tooshort, 3, 0);
- DO(i.ips_odropped, 3, 35);
- DO(i.ips_toosmall, 4, 0);
- DO(i.ips_ofragments, 4, 35);
- DO(i.ips_badhlen, 5, 0);
- DO(i.ips_cantfrag, 5, 35);
- DO(i.ips_badlen, 6, 0);
- DO(i.ips_noroute, 6, 35);
- DO(i.ips_badvers, 7, 0);
- DO(i.ips_rawout, 7, 35);
- DO(i.ips_toolong, 8, 0);
- DO(i.ips_fragments, 9, 0);
- DO(i.ips_fragdropped, 10, 0);
- DO(u.udps_ipackets, 10, 35);
- DO(i.ips_fragtimeout, 11, 0);
- DO(u.udps_hdrops, 11, 35);
- DO(i.ips_reassembled, 12, 0);
- DO(u.udps_badsum, 12, 35);
- DO(i.ips_forward, 13, 0);
- DO(u.udps_nosum, 13, 35);
- DO(i.ips_cantforward, 14, 0);
- DO(u.udps_badlen, 14, 35);
- DO(i.ips_redirectsent, 15, 0);
- DO(u.udps_noport, 15, 35);
- DO(i.ips_badoptions, 16, 0);
- DO(u.udps_noportbcast, 16, 35);
- DO(i.ips_notmember, 17, 0);
- DO(u.udps_fullsock, 17, 35);
- DO(i.ips_delivered, 18, 0);
- DO(u.udps_opackets, 18, 35);
-#undef DO
-}
-
-int
-initip(void)
-{
- size_t len;
- int name[4];
-
- name[0] = CTL_NET;
- name[1] = PF_INET;
- name[2] = IPPROTO_IP;
- name[3] = IPCTL_STATS;
-
- len = 0;
- if (sysctl(name, 4, 0, &len, 0, 0) < 0) {
- error("sysctl getting ipstat size failed");
- return 0;
- }
- if (len > sizeof curstat.i) {
- error("ipstat structure has grown--recompile systat!");
- return 0;
- }
- if (sysctl(name, 4, &initstat.i, &len, 0, 0) < 0) {
- error("sysctl getting ipstat failed");
- return 0;
- }
- name[2] = IPPROTO_UDP;
- name[3] = UDPCTL_STATS;
-
- len = 0;
- if (sysctl(name, 4, 0, &len, 0, 0) < 0) {
- error("sysctl getting udpstat size failed");
- return 0;
- }
- if (len > sizeof curstat.u) {
- error("ipstat structure has grown--recompile systat!");
- return 0;
- }
- if (sysctl(name, 4, &initstat.u, &len, 0, 0) < 0) {
- error("sysctl getting udpstat failed");
- return 0;
- }
- oldstat = initstat;
- return 1;
-}
-
-void
-resetip(void)
-{
- size_t len;
- int name[4];
-
- name[0] = CTL_NET;
- name[1] = PF_INET;
- name[2] = IPPROTO_IP;
- name[3] = IPCTL_STATS;
-
- len = sizeof initstat.i;
- if (sysctl(name, 4, &initstat.i, &len, 0, 0) < 0) {
- error("sysctl getting ipstat failed");
- }
- name[2] = IPPROTO_UDP;
- name[3] = UDPCTL_STATS;
-
- len = sizeof initstat.u;
- if (sysctl(name, 4, &initstat.u, &len, 0, 0) < 0) {
- error("sysctl getting udpstat failed");
- }
- oldstat = initstat;
-}
-
-void
-fetchip(void)
-{
- int name[4];
- size_t len;
-
- oldstat = curstat;
- name[0] = CTL_NET;
- name[1] = PF_INET;
- name[2] = IPPROTO_IP;
- name[3] = IPCTL_STATS;
- len = sizeof curstat.i;
-
- if (sysctl(name, 4, &curstat.i, &len, 0, 0) < 0)
- return;
- name[2] = IPPROTO_UDP;
- name[3] = UDPCTL_STATS;
- len = sizeof curstat.u;
-
- if (sysctl(name, 4, &curstat.u, &len, 0, 0) < 0)
- return;
-}
-
diff --git a/usr.bin/systat/ip6.c b/usr.bin/systat/ip6.c
deleted file mode 100644
index bc3f521..0000000
--- a/usr.bin/systat/ip6.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/*-
- * Copyright (c) 1980, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifdef lint
-static const char sccsid[] = "@(#)mbufs.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-/* From:
- "Id: mbufs.c,v 1.5 1997/02/24 20:59:03 wollman Exp"
-*/
-
-#ifdef INET6
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/sysctl.h>
-
-#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#include <netinet6/ip6_var.h>
-
-#include <stdlib.h>
-#include <string.h>
-#include <paths.h>
-
-#include "systat.h"
-#include "extern.h"
-#include "mode.h"
-
-static struct ip6stat curstat, initstat, oldstat;
-
-/*-
---0 1 2 3 4 5 6 7
---0123456789012345678901234567890123456789012345678901234567890123456789012345
-00 IPv6 Input IPv6 Output
-019999999 total packets received 999999999 total packets sent
-029999999 - too short for header 999999999 - generated locally
-039999999 - too short for data 999999999 - output drops
-049999999 - with invalid version 999999999 output fragments generated
-059999999 total fragments received 999999999 - fragmentation failed
-069999999 - fragments dropped 999999999 destinations unreachable
-079999999 - fragments timed out 999999999 packets output via raw IP
-089999999 - fragments overflown
-099999999 - packets reassembled ok Input next-header histogram
-109999999 packets forwarded 999999999 - destination options
-119999999 - unreachable dests 999999999 - hop-by-hop options
-129999999 - redirects generated 999999999 - IPv4
-139999999 option errors 999999999 - TCP
-149999999 unwanted multicasts 999999999 - UDP
-159999999 delivered to upper layer 999999999 - IPv6
-169999999 bad scope packets 999999999 - routing header
-179999999 address selection failed 999999999 - fragmentation header
-18 999999999 - ICMP6
-19 999999999 - none
---0123456789012345678901234567890123456789012345678901234567890123456789012345
---0 1 2 3 4 5 6 7
-*/
-
-WINDOW *
-openip6(void)
-{
- return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0));
-}
-
-void
-closeip6(WINDOW *w)
-{
- if (w == NULL)
- return;
- wclear(w);
- wrefresh(w);
- delwin(w);
-}
-
-void
-labelip6(void)
-{
- wmove(wnd, 0, 0); wclrtoeol(wnd);
-#define L(row, str) mvwprintw(wnd, row, 10, str)
-#define R(row, str) mvwprintw(wnd, row, 45, str);
- L(0, "IPv6 Input"); R(0, "IPv6 Output");
- L(1, "total packets received"); R(1, "total packets sent");
- L(2, "- too short for header"); R(2, "- generated locally");
- L(3, "- too short for data"); R(3, "- output drops");
- L(4, "- with invalid version"); R(4, "output fragments generated");
- L(5, "total fragments received"); R(5, "- fragmentation failed");
- L(6, "- fragments dropped"); R(6, "destinations unreachable");
- L(7, "- fragments timed out"); R(7, "packets output via raw IP");
- L(8, "- fragments overflown");
- L(9, "- packets reassembled ok"); R(9, "Input next-header histogram");
- L(10, "packets forwarded"); R(10, " - destination options");
- L(11, "- unreachable dests"); R(11, " - hop-by-hop options");
- L(12, "- redirects generated"); R(12, " - IPv4");
- L(13, "option errors"); R(13, " - TCP");
- L(14, "unwanted multicasts"); R(14, " - UDP");
- L(15, "delivered to upper layer"); R(15, " - IPv6");
- L(16, "bad scope packets"); R(16, " - routing header");
- L(17, "address selection failed"); R(17, " - fragmentation header");
- R(18, " - ICMP6");
- R(19, " - none");
-#undef L
-#undef R
-}
-
-static void
-domode(struct ip6stat *ret)
-{
- const struct ip6stat *sub;
- int divisor = 1, i;
-
- switch(currentmode) {
- case display_RATE:
- sub = &oldstat;
- divisor = naptime;
- break;
- case display_DELTA:
- sub = &oldstat;
- break;
- case display_SINCE:
- sub = &initstat;
- break;
- default:
- *ret = curstat;
- return;
- }
-#define DO(stat) ret->stat = (curstat.stat - sub->stat) / divisor
- DO(ip6s_total);
- DO(ip6s_tooshort);
- DO(ip6s_toosmall);
- DO(ip6s_fragments);
- DO(ip6s_fragdropped);
- DO(ip6s_fragtimeout);
- DO(ip6s_fragoverflow);
- DO(ip6s_forward);
- DO(ip6s_cantforward);
- DO(ip6s_redirectsent);
- DO(ip6s_delivered);
- DO(ip6s_localout);
- DO(ip6s_odropped);
- DO(ip6s_reassembled);
- DO(ip6s_fragmented);
- DO(ip6s_ofragments);
- DO(ip6s_cantfrag);
- DO(ip6s_badoptions);
- DO(ip6s_noroute);
- DO(ip6s_badvers);
- DO(ip6s_rawout);
- DO(ip6s_notmember);
- for (i = 0; i < 256; i++)
- DO(ip6s_nxthist[i]);
- DO(ip6s_badscope);
- DO(ip6s_sources_none);
-#undef DO
-}
-
-void
-showip6(void)
-{
- struct ip6stat stats;
- u_long totalout;
-
- domode(&stats);
- totalout = stats.ip6s_forward + stats.ip6s_localout;
-
-#define DO(stat, row, col) \
- mvwprintw(wnd, row, col, "%9lu", stats.stat)
-
- DO(ip6s_total, 1, 0);
- mvwprintw(wnd, 1, 35, "%9lu", totalout);
- DO(ip6s_tooshort, 2, 0);
- DO(ip6s_localout, 2, 35);
- DO(ip6s_toosmall, 3, 0);
- DO(ip6s_odropped, 3, 35);
- DO(ip6s_badvers, 4, 0);
- DO(ip6s_ofragments, 4, 35);
- DO(ip6s_fragments, 5, 0);
- DO(ip6s_cantfrag, 5, 35);
- DO(ip6s_fragdropped, 6, 0);
- DO(ip6s_noroute, 6, 35);
- DO(ip6s_fragtimeout, 7, 0);
- DO(ip6s_rawout, 7, 35);
- DO(ip6s_fragoverflow, 8, 0);
- DO(ip6s_reassembled, 9, 0);
- DO(ip6s_forward, 10, 0);
- DO(ip6s_nxthist[IPPROTO_DSTOPTS], 10, 35);
- DO(ip6s_cantforward, 11, 0);
- DO(ip6s_nxthist[IPPROTO_HOPOPTS], 11, 35);
- DO(ip6s_redirectsent, 12, 0);
- DO(ip6s_nxthist[IPPROTO_IPV4], 12, 35);
- DO(ip6s_badoptions, 13, 0);
- DO(ip6s_nxthist[IPPROTO_TCP], 13, 35);
- DO(ip6s_notmember, 14, 0);
- DO(ip6s_nxthist[IPPROTO_UDP], 14, 35);
- DO(ip6s_delivered, 15, 0);
- DO(ip6s_nxthist[IPPROTO_IPV6], 15, 35);
- DO(ip6s_badscope, 16, 0);
- DO(ip6s_nxthist[IPPROTO_ROUTING], 16, 35);
- DO(ip6s_sources_none, 17, 0);
- DO(ip6s_nxthist[IPPROTO_FRAGMENT], 17, 35);
- DO(ip6s_nxthist[IPPROTO_ICMPV6], 18, 35);
- DO(ip6s_nxthist[IPPROTO_NONE], 19, 35);
-#undef DO
-}
-
-int
-initip6(void)
-{
- size_t len;
- int name[4];
-
- name[0] = CTL_NET;
- name[1] = PF_INET6;
- name[2] = IPPROTO_IPV6;
- name[3] = IPV6CTL_STATS;
-
- len = 0;
- if (sysctl(name, 4, 0, &len, 0, 0) < 0) {
- error("sysctl getting ip6stat size failed");
- return 0;
- }
- if (len > sizeof curstat) {
- error("ip6stat structure has grown--recompile systat!");
- return 0;
- }
- if (sysctl(name, 4, &initstat, &len, 0, 0) < 0) {
- error("sysctl getting ip6stat failed");
- return 0;
- }
- oldstat = initstat;
- return 1;
-}
-
-void
-resetip6(void)
-{
- size_t len;
- int name[4];
-
- name[0] = CTL_NET;
- name[1] = PF_INET6;
- name[2] = IPPROTO_IPV6;
- name[3] = IPV6CTL_STATS;
-
- len = sizeof initstat;
- if (sysctl(name, 4, &initstat, &len, 0, 0) < 0) {
- error("sysctl getting ipstat failed");
- }
-
- oldstat = initstat;
-}
-
-void
-fetchip6(void)
-{
- int name[4];
- size_t len;
-
- oldstat = curstat;
- name[0] = CTL_NET;
- name[1] = PF_INET6;
- name[2] = IPPROTO_IPV6;
- name[3] = IPV6CTL_STATS;
- len = sizeof curstat;
-
- if (sysctl(name, 4, &curstat, &len, 0, 0) < 0)
- return;
-}
-
-#endif
diff --git a/usr.bin/systat/keyboard.c b/usr.bin/systat/keyboard.c
deleted file mode 100644
index 7784f5b..0000000
--- a/usr.bin/systat/keyboard.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/*-
- * Copyright (c) 1980, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifdef lint
-static const char sccsid[] = "@(#)keyboard.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <ctype.h>
-#include <signal.h>
-#include <termios.h>
-
-#include "systat.h"
-#include "extern.h"
-
-int
-keyboard(void)
-{
- char ch, line[80];
- int oldmask;
-
- for (;;) {
- col = 0;
- move(CMDLINE, 0);
- do {
- refresh();
- ch = getch() & 0177;
- if (ch == 0177 && ferror(stdin)) {
- clearerr(stdin);
- continue;
- }
- if (ch >= 'A' && ch <= 'Z')
- ch += 'a' - 'A';
- if (col == 0) {
-#define mask(s) (1 << ((s) - 1))
- if (ch == CTRL('l')) {
- oldmask = sigblock(mask(SIGALRM));
- wrefresh(curscr);
- sigsetmask(oldmask);
- continue;
- }
- if (ch == CTRL('g')) {
- oldmask = sigblock(mask(SIGALRM));
- status();
- sigsetmask(oldmask);
- continue;
- }
- if (ch != ':')
- continue;
- move(CMDLINE, 0);
- clrtoeol();
- }
- if (ch == erasechar() && col > 0) {
- if (col == 1 && line[0] == ':')
- continue;
- col--;
- goto doerase;
- }
- if (ch == CTRL('w') && col > 0) {
- while (--col >= 0 && isspace(line[col]))
- ;
- col++;
- while (--col >= 0 && !isspace(line[col]))
- if (col == 0 && line[0] == ':')
- break;
- col++;
- goto doerase;
- }
- if (ch == killchar() && col > 0) {
- col = 0;
- if (line[0] == ':')
- col++;
- doerase:
- move(CMDLINE, col);
- clrtoeol();
- continue;
- }
- if (isprint(ch) || ch == ' ') {
- line[col] = ch;
- mvaddch(CMDLINE, col, ch);
- col++;
- }
- } while (col == 0 || (ch != '\r' && ch != '\n'));
- line[col] = '\0';
- oldmask = sigblock(mask(SIGALRM));
- command(line + 1);
- sigsetmask(oldmask);
- }
- /*NOTREACHED*/
-}
diff --git a/usr.bin/systat/main.c b/usr.bin/systat/main.c
deleted file mode 100644
index 28673e5..0000000
--- a/usr.bin/systat/main.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/*-
- * Copyright (c) 1980, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifdef lint
-static const char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1992, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/sysctl.h>
-
-#include <err.h>
-#include <limits.h>
-#include <locale.h>
-#include <nlist.h>
-#include <paths.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include "systat.h"
-#include "extern.h"
-
-static int dellave;
-
-kvm_t *kd;
-sig_t sigtstpdfl;
-double avenrun[3];
-int col;
-int naptime = 5;
-int verbose = 1; /* to report kvm read errs */
-struct clockinfo clkinfo;
-double hertz;
-char c;
-char *namp;
-char hostname[MAXHOSTNAMELEN];
-WINDOW *wnd;
-int CMDLINE;
-int use_kvm = 1;
-
-static WINDOW *wload; /* one line window for load average */
-
-int
-main(int argc, char **argv)
-{
- char errbuf[_POSIX2_LINE_MAX], dummy;
- size_t size;
-
- (void) setlocale(LC_TIME, "");
-
- argc--, argv++;
- while (argc > 0) {
- if (argv[0][0] == '-') {
- struct cmdtab *p;
-
- p = lookup(&argv[0][1]);
- if (p == (struct cmdtab *)-1)
- errx(1, "%s: ambiguous request", &argv[0][1]);
- if (p == (struct cmdtab *)0)
- errx(1, "%s: unknown request", &argv[0][1]);
- curcmd = p;
- } else {
- naptime = atoi(argv[0]);
- if (naptime <= 0)
- naptime = 5;
- }
- argc--, argv++;
- }
- kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf);
- if (kd != NULL) {
- /*
- * Try to actually read something, we may be in a jail, and
- * have /dev/null opened as /dev/mem.
- */
- if (kvm_nlist(kd, namelist) != 0 || namelist[0].n_value == 0 ||
- kvm_read(kd, namelist[0].n_value, &dummy, sizeof(dummy)) !=
- sizeof(dummy)) {
- kvm_close(kd);
- kd = NULL;
- }
- }
- if (kd == NULL) {
- /*
- * Maybe we are lacking permissions? Retry, this time with bogus
- * devices. We can now use sysctl only.
- */
- use_kvm = 0;
- kd = kvm_openfiles("/dev/null", "/dev/null", "/dev/null",
- O_RDONLY, errbuf);
- if (kd == NULL) {
- error("%s", errbuf);
- exit(1);
- }
- }
- signal(SIGINT, die);
- signal(SIGQUIT, die);
- signal(SIGTERM, die);
-
- /*
- * Initialize display. Load average appears in a one line
- * window of its own. Current command's display appears in
- * an overlapping sub-window of stdscr configured by the display
- * routines to minimize update work by curses.
- */
- initscr();
- CMDLINE = LINES - 1;
- wnd = (*curcmd->c_open)();
- if (wnd == NULL) {
- warnx("couldn't initialize display");
- die(0);
- }
- wload = newwin(1, 0, 1, 20);
- if (wload == NULL) {
- warnx("couldn't set up load average window");
- die(0);
- }
- gethostname(hostname, sizeof (hostname));
- size = sizeof(clkinfo);
- if (sysctlbyname("kern.clockrate", &clkinfo, &size, NULL, 0)
- || size != sizeof(clkinfo)) {
- error("kern.clockrate");
- die(0);
- }
- hertz = clkinfo.stathz;
- (*curcmd->c_init)();
- curcmd->c_flags |= CF_INIT;
- labels();
-
- dellave = 0.0;
-
- signal(SIGALRM, display);
- display(0);
- noecho();
- crmode();
- keyboard();
- /*NOTREACHED*/
-
- return EXIT_SUCCESS;
-}
-
-void
-labels(void)
-{
- if (curcmd->c_flags & CF_LOADAV) {
- mvaddstr(0, 20,
- "/0 /1 /2 /3 /4 /5 /6 /7 /8 /9 /10");
- mvaddstr(1, 5, "Load Average");
- }
- (*curcmd->c_label)();
-#ifdef notdef
- mvprintw(21, 25, "CPU usage on %s", hostname);
-#endif
- refresh();
-}
-
-void
-display(int signo __unused)
-{
- int i, j;
-
- /* Get the load average over the last minute. */
- (void) getloadavg(avenrun, sizeof(avenrun) / sizeof(avenrun[0]));
- (*curcmd->c_fetch)();
- if (curcmd->c_flags & CF_LOADAV) {
- j = 5.0*avenrun[0] + 0.5;
- dellave -= avenrun[0];
- if (dellave >= 0.0)
- c = '<';
- else {
- c = '>';
- dellave = -dellave;
- }
- if (dellave < 0.1)
- c = '|';
- dellave = avenrun[0];
- wmove(wload, 0, 0); wclrtoeol(wload);
- for (i = (j > 50) ? 50 : j; i > 0; i--)
- waddch(wload, c);
- if (j > 50)
- wprintw(wload, " %4.1f", avenrun[0]);
- }
- (*curcmd->c_refresh)();
- if (curcmd->c_flags & CF_LOADAV)
- wrefresh(wload);
- wrefresh(wnd);
- move(CMDLINE, col);
- refresh();
- alarm(naptime);
-}
-
-void
-load(void)
-{
-
- (void) getloadavg(avenrun, sizeof(avenrun)/sizeof(avenrun[0]));
- mvprintw(CMDLINE, 0, "%4.1f %4.1f %4.1f",
- avenrun[0], avenrun[1], avenrun[2]);
- clrtoeol();
-}
-
-void
-die(int signo __unused)
-{
- move(CMDLINE, 0);
- clrtoeol();
- refresh();
- endwin();
- exit(0);
-}
-
-#include <stdarg.h>
-
-void
-error(const char *fmt, ...)
-{
- va_list ap;
- char buf[255];
- int oy, ox;
-
- va_start(ap, fmt);
- if (wnd) {
- getyx(stdscr, oy, ox);
- (void) vsnprintf(buf, sizeof(buf), fmt, ap);
- clrtoeol();
- standout();
- mvaddstr(CMDLINE, 0, buf);
- standend();
- move(oy, ox);
- refresh();
- } else {
- (void) vfprintf(stderr, fmt, ap);
- fprintf(stderr, "\n");
- }
- va_end(ap);
-}
-
-void
-nlisterr(struct nlist n_list[])
-{
- int i, n;
-
- n = 0;
- clear();
- mvprintw(2, 10, "systat: nlist: can't find following symbols:");
- for (i = 0;
- n_list[i].n_name != NULL && *n_list[i].n_name != '\0'; i++)
- if (n_list[i].n_value == 0)
- mvprintw(2 + ++n, 10, "%s", n_list[i].n_name);
- move(CMDLINE, 0);
- clrtoeol();
- refresh();
- endwin();
- exit(1);
-}
diff --git a/usr.bin/systat/mbufs.c b/usr.bin/systat/mbufs.c
deleted file mode 100644
index 37be1ef..0000000
--- a/usr.bin/systat/mbufs.c
+++ /dev/null
@@ -1,197 +0,0 @@
-/*-
- * Copyright (c) 1980, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifdef lint
-static const char sccsid[] = "@(#)mbufs.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/mbuf.h>
-#include <sys/sysctl.h>
-
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <paths.h>
-
-#include "systat.h"
-#include "extern.h"
-
-static struct mbstat *mbstat;
-static long *m_mbtypes;
-static short nmbtypes;
-
-static struct mtnames {
- short mt_type;
- const char *mt_name;
-} mtnames[] = {
- { MT_DATA, "data"},
- { MT_HEADER, "headers"},
- { MT_SONAME, "socknames"},
- { MT_CONTROL, "control"},
- { MT_OOBDATA, "oobdata"}
-};
-#define NNAMES (sizeof (mtnames) / sizeof (mtnames[0]))
-
-WINDOW *
-openmbufs(void)
-{
- return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0));
-}
-
-void
-closembufs(WINDOW *w)
-{
- if (w == NULL)
- return;
- wclear(w);
- wrefresh(w);
- delwin(w);
-}
-
-void
-labelmbufs(void)
-{
- wmove(wnd, 0, 0); wclrtoeol(wnd);
- mvwaddstr(wnd, 0, 10,
- "/0 /5 /10 /15 /20 /25 /30 /35 /40 /45 /50 /55 /60");
-}
-
-void
-showmbufs(void)
-{
- int i, j, max, idx;
- u_long totmbufs;
- char buf[10];
- const char *mtname;
-
- totmbufs = mbstat->m_mbufs;
-
- /*
- * Print totals for different mbuf types.
- */
- for (j = 0; j < wnd->_maxy; j++) {
- max = 0, idx = -1;
- for (i = 0; i < wnd->_maxy; i++) {
- if (i == MT_NOTMBUF)
- continue;
- if (i >= nmbtypes)
- break;
- if (m_mbtypes[i] > max) {
- max = m_mbtypes[i];
- idx = i;
- }
- }
- if (max == 0)
- break;
-
- mtname = NULL;
- for (i = 0; i < (int)NNAMES; i++)
- if (mtnames[i].mt_type == idx)
- mtname = mtnames[i].mt_name;
- if (mtname == NULL)
- mvwprintw(wnd, 1+j, 0, "%10d", idx);
- else
- mvwprintw(wnd, 1+j, 0, "%-10.10s", mtname);
- wmove(wnd, 1 + j, 10);
- if (max > 60) {
- snprintf(buf, sizeof(buf), " %d", max);
- max = 60;
- while (max--)
- waddch(wnd, 'X');
- waddstr(wnd, buf);
- } else
- while (max--)
- waddch(wnd, 'X');
- wclrtoeol(wnd);
- m_mbtypes[idx] = 0;
- }
-
- /*
- * Print total number of free mbufs.
- */
- if (totmbufs > 0) {
- mvwprintw(wnd, 1+j, 0, "%-10.10s", "Mbufs");
- if (totmbufs > 60) {
- snprintf(buf, sizeof(buf), " %lu", totmbufs);
- totmbufs = 60;
- while(totmbufs--)
- waddch(wnd, 'X');
- waddstr(wnd, buf);
- } else {
- while(totmbufs--)
- waddch(wnd, 'X');
- }
- wclrtoeol(wnd);
- j++;
- }
- wmove(wnd, 1+j, 0); wclrtobot(wnd);
-}
-
-int
-initmbufs(void)
-{
- size_t len;
-
- len = sizeof *mbstat;
- if ((mbstat = malloc(len)) == NULL) {
- error("malloc mbstat failed");
- return 0;
- }
- if (sysctlbyname("kern.ipc.mbstat", mbstat, &len, NULL, 0) < 0) {
- error("sysctl retrieving mbstat");
- return 0;
- }
- nmbtypes = mbstat->m_numtypes;
- if ((m_mbtypes = calloc(nmbtypes, sizeof(long *))) == NULL) {
- error("calloc m_mbtypes failed");
- return 0;
- }
-
- return 1;
-}
-
-void
-fetchmbufs(void)
-{
- size_t len;
-
- len = sizeof *mbstat;
- if (sysctlbyname("kern.ipc.mbstat", mbstat, &len, NULL, 0) < 0)
- printw("sysctl: mbstat: %s", strerror(errno));
-}
diff --git a/usr.bin/systat/mode.c b/usr.bin/systat/mode.c
deleted file mode 100644
index 5f64e3e..0000000
--- a/usr.bin/systat/mode.c
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright 1997 Massachusetts Institute of Technology
- *
- * Permission to use, copy, modify, and distribute this software and
- * its documentation for any purpose and without fee is hereby
- * granted, provided that both the above copyright notice and this
- * permission notice appear in all copies, that both the above
- * copyright notice and this permission notice appear in all
- * supporting documentation, and that the name of M.I.T. not be used
- * in advertising or publicity pertaining to distribution of the
- * software without specific, written prior permission. M.I.T. makes
- * no representations about the suitability of this software for any
- * purpose. It is provided "as is" without express or implied
- * warranty.
- *
- * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS
- * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
- * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * mode.c - mechanisms for dealing with SGI-style modal displays.
- *
- * There are four generally-understood useful modes for status displays
- * of the sort exemplified by the IRIX ``netstat -C'' and ``osview''
- * programs. We try to follow their example, although the user interface
- * and terminology slightly differ.
- *
- * RATE - the default mode - displays the precise rate of change in
- * each statistic in units per second, regardless of the actual display
- * update interval.
- *
- * DELTA - displays the change in each statistic over the entire
- * display update interval (i.e., RATE * interval).
- *
- * SINCE - displays the total change in each statistic since the module
- * was last initialized or reset.
- *
- * ABSOLUTE - displays the current value of each statistic.
- *
- * In the SGI programs, these modes are selected by the single-character
- * commands D, W, N, and A. In systat, they are the slightly-harder-to-type
- * ``mode delta'', etc. The initial value for SINCE mode is initialized
- * when the module is first started and can be reset using the ``reset''
- * command (as opposed to the SGI way where changing modes implicitly
- * resets). A ``mode'' command with no arguments displays the current
- * mode in the command line.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include "systat.h"
-#include "extern.h"
-#include "mode.h"
-
-enum mode currentmode = display_RATE;
-
-static const char *const modes[] = { "rate", "delta", "since", "absolute" };
-
-int
-cmdmode(const char *cmd, const char *args)
-{
- if (prefix(cmd, "mode")) {
- if (args[0] == '\0') {
- move(CMDLINE, 0);
- clrtoeol();
- printw("%s", modes[currentmode]);
- } else if (prefix(args, "rate")) {
- currentmode = display_RATE;
- } else if (prefix(args, "delta")) {
- currentmode = display_DELTA;
- } else if (prefix(args, "since")) {
- currentmode = display_SINCE;
- } else if (prefix(args, "absolute")) {
- currentmode = display_ABS;
- } else {
- printw("unknown mode `%s'", args);
- }
- return 1;
- }
- if(prefix(cmd, "reset")) {
- curcmd->c_reset();
- return 1;
- }
- return 0;
-}
diff --git a/usr.bin/systat/mode.h b/usr.bin/systat/mode.h
deleted file mode 100644
index 9fc0fea..0000000
--- a/usr.bin/systat/mode.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 1997 Massachusetts Institute of Technology
- *
- * Permission to use, copy, modify, and distribute this software and
- * its documentation for any purpose and without fee is hereby
- * granted, provided that both the above copyright notice and this
- * permission notice appear in all copies, that both the above
- * copyright notice and this permission notice appear in all
- * supporting documentation, and that the name of M.I.T. not be used
- * in advertising or publicity pertaining to distribution of the
- * software without specific, written prior permission. M.I.T. makes
- * no representations about the suitability of this software for any
- * purpose. It is provided "as is" without express or implied
- * warranty.
- *
- * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS
- * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
- * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/*
- * mode.h - mechanisms for dealing with SGI-style modal displays.
- */
-
-#ifndef MODE_H
-#define MODE_H 1
-
-enum mode { display_RATE, display_DELTA, display_SINCE, display_ABS };
-
-extern int cmdmode(const char *cmd, const char *args);
-extern enum mode currentmode;
-
-#endif /* MODE_H */
diff --git a/usr.bin/systat/netcmds.c b/usr.bin/systat/netcmds.c
deleted file mode 100644
index 32f19a7..0000000
--- a/usr.bin/systat/netcmds.c
+++ /dev/null
@@ -1,313 +0,0 @@
-/*-
- * Copyright (c) 1980, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifdef lint
-static const char sccsid[] = "@(#)netcmds.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-/*
- * Common network command support routines.
- */
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/protosw.h>
-
-#include <net/route.h>
-#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#include <netinet/in_pcb.h>
-#include <arpa/inet.h>
-
-#include <ctype.h>
-#include <netdb.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "systat.h"
-#include "extern.h"
-
-#define streq(a,b) (strcmp(a,b)==0)
-
-static struct hitem {
- struct in_addr addr;
- int onoff;
-} *hosts;
-
-int nports, nhosts, protos;
-
-static void changeitems(const char *, int);
-static int selectproto(const char *);
-static void showprotos(void);
-static int selectport(long, int);
-static void showports(void);
-static int selecthost(struct in_addr *, int);
-static void showhosts(void);
-
-int
-netcmd(const char *cmd, const char *args)
-{
-
- if (prefix(cmd, "proto")) {
- if (*args == '\0') {
- move(CMDLINE, 0);
- clrtoeol();
- addstr("which proto?");
- } else if (!selectproto(args)) {
- error("%s: Unknown protocol.", args);
- }
- return (1);
- }
- if (prefix(cmd, "ignore") || prefix(cmd, "display")) {
- changeitems(args, prefix(cmd, "display"));
- return (1);
- }
- if (prefix(cmd, "reset")) {
- selectproto(0);
- selecthost(0, 0);
- selectport(-1, 0);
- return (1);
- }
- if (prefix(cmd, "show")) {
- move(CMDLINE, 0); clrtoeol();
- if (*args == '\0') {
- showprotos();
- showhosts();
- showports();
- return (1);
- }
- if (prefix(args, "protos"))
- showprotos();
- else if (prefix(args, "hosts"))
- showhosts();
- else if (prefix(args, "ports"))
- showports();
- else
- addstr("show what?");
- return (1);
- }
- return (0);
-}
-
-
-static void
-changeitems(const char *args, int onoff)
-{
- char *cp, *tmpstr, *tmpstr1;
- struct servent *sp;
- struct hostent *hp;
- struct in_addr in;
-
- tmpstr = tmpstr1 = strdup(args);
- cp = index(tmpstr1, '\n');
- if (cp)
- *cp = '\0';
- for (;;tmpstr1 = cp) {
- for (cp = tmpstr1; *cp && isspace(*cp); cp++)
- ;
- tmpstr1 = cp;
- for (; *cp && !isspace(*cp); cp++)
- ;
- if (*cp)
- *cp++ = '\0';
- if (cp - tmpstr1 == 0)
- break;
- sp = getservbyname(tmpstr1,
- protos == TCP ? "tcp" : protos == UDP ? "udp" : 0);
- if (sp) {
- selectport(sp->s_port, onoff);
- continue;
- }
- hp = gethostbyname(tmpstr1);
- if (hp == 0) {
- in.s_addr = inet_addr(tmpstr1);
- if ((int)in.s_addr == -1) {
- error("%s: unknown host or port", tmpstr1);
- continue;
- }
- } else
- in = *(struct in_addr *)hp->h_addr;
- selecthost(&in, onoff);
- }
- free(tmpstr);
-}
-
-static int
-selectproto(const char *proto)
-{
-
- if (proto == 0 || streq(proto, "all"))
- protos = TCP | UDP;
- else if (streq(proto, "tcp"))
- protos = TCP;
- else if (streq(proto, "udp"))
- protos = UDP;
- else
- return (0);
-
- return (protos);
-}
-
-static void
-showprotos(void)
-{
-
- if ((protos&TCP) == 0)
- addch('!');
- addstr("tcp ");
- if ((protos&UDP) == 0)
- addch('!');
- addstr("udp ");
-}
-
-static struct pitem {
- long port;
- int onoff;
-} *ports;
-
-static int
-selectport(long port, int onoff)
-{
- struct pitem *p;
-
- if (port == -1) {
- if (ports == 0)
- return (0);
- free((char *)ports), ports = 0;
- nports = 0;
- return (1);
- }
- for (p = ports; p < ports+nports; p++)
- if (p->port == port) {
- p->onoff = onoff;
- return (0);
- }
- if (nports == 0)
- ports = (struct pitem *)malloc(sizeof (*p));
- else
- ports = (struct pitem *)realloc(ports, (nports+1)*sizeof (*p));
- p = &ports[nports++];
- p->port = port;
- p->onoff = onoff;
- return (1);
-}
-
-int
-checkport(struct inpcb *inp)
-{
- struct pitem *p;
-
- if (ports)
- for (p = ports; p < ports+nports; p++)
- if (p->port == inp->inp_lport || p->port == inp->inp_fport)
- return (p->onoff);
- return (1);
-}
-
-static void
-showports(void)
-{
- struct pitem *p;
- struct servent *sp;
-
- for (p = ports; p < ports+nports; p++) {
- sp = getservbyport(p->port,
- protos == (TCP|UDP) ? 0 : protos == TCP ? "tcp" : "udp");
- if (!p->onoff)
- addch('!');
- if (sp)
- printw("%s ", sp->s_name);
- else
- printw("%d ", p->port);
- }
-}
-
-static int
-selecthost(struct in_addr *in, int onoff)
-{
- struct hitem *p;
-
- if (in == 0) {
- if (hosts == 0)
- return (0);
- free((char *)hosts), hosts = 0;
- nhosts = 0;
- return (1);
- }
- for (p = hosts; p < hosts+nhosts; p++)
- if (p->addr.s_addr == in->s_addr) {
- p->onoff = onoff;
- return (0);
- }
- if (nhosts == 0)
- hosts = (struct hitem *)malloc(sizeof (*p));
- else
- hosts = (struct hitem *)realloc(hosts, (nhosts+1)*sizeof (*p));
- p = &hosts[nhosts++];
- p->addr = *in;
- p->onoff = onoff;
- return (1);
-}
-
-int
-checkhost(struct inpcb *inp)
-{
- struct hitem *p;
-
- if (hosts)
- for (p = hosts; p < hosts+nhosts; p++)
- if (p->addr.s_addr == inp->inp_laddr.s_addr ||
- p->addr.s_addr == inp->inp_faddr.s_addr)
- return (p->onoff);
- return (1);
-}
-
-static void
-showhosts(void)
-{
- struct hitem *p;
- struct hostent *hp;
-
- for (p = hosts; p < hosts+nhosts; p++) {
- hp = gethostbyaddr((char *)&p->addr, sizeof (p->addr), AF_INET);
- if (!p->onoff)
- addch('!');
- printw("%s ", hp ? hp->h_name : (char *)inet_ntoa(p->addr));
- }
-}
diff --git a/usr.bin/systat/netstat.c b/usr.bin/systat/netstat.c
deleted file mode 100644
index 0bafc5a..0000000
--- a/usr.bin/systat/netstat.c
+++ /dev/null
@@ -1,664 +0,0 @@
-/*-
- * Copyright (c) 1980, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifdef lint
-static const char sccsid[] = "@(#)netstat.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-/*
- * netstat
- */
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/protosw.h>
-
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <net/route.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#ifdef INET6
-#include <netinet/ip6.h>
-#endif
-#include <netinet/in_pcb.h>
-#include <netinet/ip_icmp.h>
-#include <netinet/icmp_var.h>
-#include <netinet/ip_var.h>
-#include <netinet/tcp.h>
-#include <netinet/tcpip.h>
-#include <netinet/tcp_seq.h>
-#include <netinet/tcp_var.h>
-#define TCPSTATES
-#include <netinet/tcp_fsm.h>
-#include <netinet/tcp_timer.h>
-#include <netinet/tcp_var.h>
-#include <netinet/tcp_debug.h>
-#include <netinet/udp.h>
-#include <netinet/udp_var.h>
-
-#include <netdb.h>
-#include <nlist.h>
-#include <paths.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "systat.h"
-#include "extern.h"
-
-static struct netinfo *enter(struct inpcb *, int, const char *);
-static void enter_kvm(struct inpcb *, struct socket *, int, const char *);
-static void enter_sysctl(struct inpcb *, struct xsocket *, int, const char *);
-static void fetchnetstat_kvm(void);
-static void fetchnetstat_sysctl(void);
-static char *inetname(struct sockaddr *);
-static void inetprint(struct sockaddr *, const char *);
-
-#define streq(a,b) (strcmp(a,b)==0)
-#define YMAX(w) ((w)->_maxy-1)
-
-WINDOW *
-opennetstat(void)
-{
- sethostent(1);
- setnetent(1);
- return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0));
-}
-
-struct netinfo {
- TAILQ_ENTRY(netinfo) chain;
- short ni_line; /* line on screen */
- short ni_seen; /* 0 when not present in list */
- short ni_flags;
-#define NIF_LACHG 0x1 /* local address changed */
-#define NIF_FACHG 0x2 /* foreign address changed */
- short ni_state; /* tcp state */
- const char *ni_proto; /* protocol */
- struct sockaddr_storage ni_lsa; /* local address */
- struct sockaddr_storage ni_fsa; /* foreign address */
- u_int ni_rcvcc; /* rcv buffer character count */
- u_int ni_sndcc; /* snd buffer character count */
-};
-
-TAILQ_HEAD(netinfohead, netinfo) netcb = TAILQ_HEAD_INITIALIZER(netcb);
-
-static int aflag = 0;
-static int nflag = 0;
-static int lastrow = 1;
-
-void
-closenetstat(WINDOW *w)
-{
- struct netinfo *p;
-
- endhostent();
- endnetent();
- TAILQ_FOREACH(p, &netcb, chain) {
- if (p->ni_line != -1)
- lastrow--;
- p->ni_line = -1;
- }
- if (w != NULL) {
- wclear(w);
- wrefresh(w);
- delwin(w);
- }
-}
-
-static const char *miblist[] = {
- "net.inet.tcp.pcblist",
- "net.inet.udp.pcblist"
-};
-
-static char tcb[] = "tcb", udb[] = "udb";
-
-struct nlist namelist[] = {
-#define X_TCB 0
- { .n_name = tcb },
-#define X_UDB 1
- { .n_name = udb },
- { .n_name = NULL },
-};
-
-int
-initnetstat(void)
-{
- protos = TCP|UDP;
- return(1);
-}
-
-void
-fetchnetstat(void)
-{
- if (use_kvm)
- fetchnetstat_kvm();
- else
- fetchnetstat_sysctl();
-}
-
-static void
-fetchnetstat_kvm(void)
-{
- struct inpcb *next;
- struct netinfo *p;
- struct inpcbhead head;
- struct inpcb inpcb;
- struct socket sockb;
- struct tcpcb tcpcb;
- void *off;
- int istcp;
-
- if (namelist[X_TCB].n_value == 0)
- return;
- TAILQ_FOREACH(p, &netcb, chain)
- p->ni_seen = 0;
- if (protos&TCP) {
- off = NPTR(X_TCB);
- istcp = 1;
- }
- else if (protos&UDP) {
- off = NPTR(X_UDB);
- istcp = 0;
- }
- else {
- error("No protocols to display");
- return;
- }
-again:
- KREAD(off, &head, sizeof (struct inpcbhead));
- LIST_FOREACH(next, &head, inp_list) {
- KREAD(next, &inpcb, sizeof (inpcb));
- next = &inpcb;
- if (!aflag) {
- if (inpcb.inp_vflag & INP_IPV4) {
- if (inet_lnaof(inpcb.inp_laddr) == INADDR_ANY)
- continue;
- }
-#ifdef INET6
- else if (inpcb.inp_vflag & INP_IPV6) {
- if (memcmp(&inpcb.in6p_laddr,
- &in6addr_any, sizeof(in6addr_any)) == 0)
- continue;
- }
-#endif
- }
- if (nhosts && !checkhost(&inpcb))
- continue;
- if (nports && !checkport(&inpcb))
- continue;
- if (istcp) {
- if (inpcb.inp_vflag & INP_TIMEWAIT) {
- bzero(&sockb, sizeof(sockb));
- enter_kvm(&inpcb, &sockb, TCPS_TIME_WAIT,
- "tcp");
- } else {
- KREAD(inpcb.inp_socket, &sockb,
- sizeof (sockb));
- KREAD(inpcb.inp_ppcb, &tcpcb, sizeof (tcpcb));
- enter_kvm(&inpcb, &sockb, tcpcb.t_state,
- "tcp");
- }
- } else
- enter_kvm(&inpcb, &sockb, 0, "udp");
- }
- if (istcp && (protos&UDP)) {
- istcp = 0;
- off = NPTR(X_UDB);
- goto again;
- }
-}
-
-static void
-fetchnetstat_sysctl(void)
-{
- struct netinfo *p;
- int idx;
- struct xinpgen *inpg;
- char *cur, *end;
- struct inpcb *inpcb;
- struct xinpcb *xip = NULL;
- struct xtcpcb *xtp = NULL;
- int plen;
- size_t lsz;
-
- TAILQ_FOREACH(p, &netcb, chain)
- p->ni_seen = 0;
- if (protos&TCP) {
- idx = 0;
- } else if (protos&UDP) {
- idx = 1;
- } else {
- error("No protocols to display");
- return;
- }
-
- for (;idx < 2; idx++) {
- if (idx == 1 && !(protos&UDP))
- break;
- inpg = (struct xinpgen *)sysctl_dynread(miblist[idx], &lsz);
- if (inpg == NULL) {
- error("sysctl(%s...) failed", miblist[idx]);
- continue;
- }
- /*
- * We currently do no require a consistent pcb list.
- * Try to be robust in case of struct size changes
- */
- cur = ((char *)inpg) + inpg->xig_len;
- /* There is also a trailing struct xinpgen */
- end = ((char *)inpg) + lsz - inpg->xig_len;
- if (end <= cur) {
- free(inpg);
- continue;
- }
- if (idx == 0) { /* TCP */
- xtp = (struct xtcpcb *)cur;
- plen = xtp->xt_len;
- } else {
- xip = (struct xinpcb *)cur;
- plen = xip->xi_len;
- }
- while (cur + plen <= end) {
- if (idx == 0) { /* TCP */
- xtp = (struct xtcpcb *)cur;
- inpcb = &xtp->xt_inp;
- } else {
- xip = (struct xinpcb *)cur;
- inpcb = &xip->xi_inp;
- }
- cur += plen;
-
- if (!aflag) {
- if (inpcb->inp_vflag & INP_IPV4) {
- if (inet_lnaof(inpcb->inp_laddr) ==
- INADDR_ANY)
- continue;
- }
-#ifdef INET6
- else if (inpcb->inp_vflag & INP_IPV6) {
- if (memcmp(&inpcb->in6p_laddr,
- &in6addr_any, sizeof(in6addr_any))
- == 0)
- continue;
- }
-#endif
- }
- if (nhosts && !checkhost(inpcb))
- continue;
- if (nports && !checkport(inpcb))
- continue;
- if (idx == 0) /* TCP */
- enter_sysctl(inpcb, &xtp->xt_socket,
- xtp->xt_tp.t_state, "tcp");
- else /* UDP */
- enter_sysctl(inpcb, &xip->xi_socket, 0, "udp");
- }
- free(inpg);
- }
-}
-
-static void
-enter_kvm(struct inpcb *inp, struct socket *so, int state, const char *proto)
-{
- struct netinfo *p;
-
- if ((p = enter(inp, state, proto)) != NULL) {
- p->ni_rcvcc = so->so_rcv.sb_cc;
- p->ni_sndcc = so->so_snd.sb_cc;
- }
-}
-
-static void
-enter_sysctl(struct inpcb *inp, struct xsocket *so, int state, const char *proto)
-{
- struct netinfo *p;
-
- if ((p = enter(inp, state, proto)) != NULL) {
- p->ni_rcvcc = so->so_rcv.sb_cc;
- p->ni_sndcc = so->so_snd.sb_cc;
- }
-}
-
-
-static struct netinfo *
-enter(struct inpcb *inp, int state, const char *proto)
-{
- struct netinfo *p;
- struct sockaddr_storage lsa, fsa;
- struct sockaddr_in *sa4;
-#ifdef INET6
- struct sockaddr_in6 *sa6;
-#endif
-
- memset(&lsa, 0, sizeof(lsa));
- memset(&fsa, 0, sizeof(fsa));
- if (inp->inp_vflag & INP_IPV4) {
- sa4 = (struct sockaddr_in *)&lsa;
- sa4->sin_addr = inp->inp_laddr;
- sa4->sin_port = inp->inp_lport;
- sa4->sin_family = AF_INET;
- sa4->sin_len = sizeof(struct sockaddr_in);
-
- sa4 = (struct sockaddr_in *)&fsa;
- sa4->sin_addr = inp->inp_faddr;
- sa4->sin_port = inp->inp_fport;
- sa4->sin_family = AF_INET;
- sa4->sin_len = sizeof(struct sockaddr_in);
- }
-#ifdef INET6
- else if (inp->inp_vflag & INP_IPV6) {
- sa6 = (struct sockaddr_in6 *)&lsa;
- memcpy(&sa6->sin6_addr, &inp->in6p_laddr,
- sizeof(struct in6_addr));
- sa6->sin6_port = inp->inp_lport;
- sa6->sin6_family = AF_INET6;
- sa6->sin6_len = sizeof(struct sockaddr_in6);
-
- sa6 = (struct sockaddr_in6 *)&fsa;
- memcpy(&sa6->sin6_addr, &inp->in6p_faddr,
- sizeof(struct in6_addr));
- sa6->sin6_port = inp->inp_fport;
- sa6->sin6_family = AF_INET6;
- sa6->sin6_len = sizeof(struct sockaddr_in6);
- }
-#endif
- else
- return NULL;
-
- /*
- * Only take exact matches, any sockets with
- * previously unbound addresses will be deleted
- * below in the display routine because they
- * will appear as ``not seen'' in the kernel
- * data structures.
- */
- TAILQ_FOREACH(p, &netcb, chain) {
- if (!streq(proto, p->ni_proto))
- continue;
- if (p->ni_lsa.ss_family != lsa.ss_family ||
- memcmp(&p->ni_lsa, &lsa, lsa.ss_len) != 0)
- continue;
- if (p->ni_fsa.ss_family == fsa.ss_family &&
- memcmp(&p->ni_fsa, &fsa, fsa.ss_len) == 0)
- break;
- }
- if (p == NULL) {
- if ((p = malloc(sizeof(*p))) == NULL) {
- error("Out of memory");
- return NULL;
- }
- TAILQ_INSERT_HEAD(&netcb, p, chain);
- p->ni_line = -1;
- memcpy(&p->ni_lsa, &lsa, lsa.ss_len);
- memcpy(&p->ni_fsa, &fsa, fsa.ss_len);
- p->ni_proto = strdup(proto);
- p->ni_flags = NIF_LACHG|NIF_FACHG;
- }
- p->ni_state = state;
- p->ni_seen = 1;
- return p;
-}
-
-/* column locations */
-#define LADDR 0
-#define FADDR LADDR+23
-#define PROTO FADDR+23
-#define RCVCC PROTO+6
-#define SNDCC RCVCC+7
-#define STATE SNDCC+7
-
-
-void
-labelnetstat(void)
-{
- if (use_kvm && namelist[X_TCB].n_type == 0)
- return;
- wmove(wnd, 0, 0); wclrtobot(wnd);
- mvwaddstr(wnd, 0, LADDR, "Local Address");
- mvwaddstr(wnd, 0, FADDR, "Foreign Address");
- mvwaddstr(wnd, 0, PROTO, "Proto");
- mvwaddstr(wnd, 0, RCVCC, "Recv-Q");
- mvwaddstr(wnd, 0, SNDCC, "Send-Q");
- mvwaddstr(wnd, 0, STATE, "(state)");
-}
-
-void
-shownetstat(void)
-{
- struct netinfo *p, *q;
- char proto[6];
- const char *family = "";
-
- /*
- * First, delete any connections that have gone
- * away and adjust the position of connections
- * below to reflect the deleted line.
- */
- p = TAILQ_FIRST(&netcb);
- while (p != NULL) {
- if (p->ni_line == -1 || p->ni_seen) {
- p = TAILQ_NEXT(p, chain);
- continue;
- }
- wmove(wnd, p->ni_line, 0); wdeleteln(wnd);
- TAILQ_FOREACH(q, &netcb, chain)
- if (q != p && q->ni_line > p->ni_line) {
- q->ni_line--;
- /* this shouldn't be necessary */
- q->ni_flags |= NIF_LACHG|NIF_FACHG;
- }
- lastrow--;
- q = TAILQ_NEXT(p, chain);
- TAILQ_REMOVE(&netcb, p, chain);
- free(p);
- p = q;
- }
- /*
- * Update existing connections and add new ones.
- */
- TAILQ_FOREACH(p, &netcb, chain) {
- if (p->ni_line == -1) {
- /*
- * Add a new entry if possible.
- */
- if (lastrow > YMAX(wnd))
- continue;
- p->ni_line = lastrow++;
- p->ni_flags |= NIF_LACHG|NIF_FACHG;
- }
- if (p->ni_flags & NIF_LACHG) {
- wmove(wnd, p->ni_line, LADDR);
- inetprint((struct sockaddr *)&p->ni_lsa, p->ni_proto);
- p->ni_flags &= ~NIF_LACHG;
- }
- if (p->ni_flags & NIF_FACHG) {
- wmove(wnd, p->ni_line, FADDR);
- inetprint((struct sockaddr *)&p->ni_fsa, p->ni_proto);
- p->ni_flags &= ~NIF_FACHG;
- }
-#ifdef INET6
- family = (p->ni_lsa.ss_family == AF_INET) ? "4" : "6";
-#endif
- snprintf(proto, sizeof(proto), "%s%s", p->ni_proto, family);
- mvwaddstr(wnd, p->ni_line, PROTO, proto);
- mvwprintw(wnd, p->ni_line, RCVCC, "%6u", p->ni_rcvcc);
- mvwprintw(wnd, p->ni_line, SNDCC, "%6u", p->ni_sndcc);
- if (streq(p->ni_proto, "tcp")) {
- if (p->ni_state < 0 || p->ni_state >= TCP_NSTATES)
- mvwprintw(wnd, p->ni_line, STATE, "%d",
- p->ni_state);
- else
- mvwaddstr(wnd, p->ni_line, STATE,
- tcpstates[p->ni_state]);
- }
- wclrtoeol(wnd);
- }
- if (lastrow < YMAX(wnd)) {
- wmove(wnd, lastrow, 0); wclrtobot(wnd);
- wmove(wnd, YMAX(wnd), 0); wdeleteln(wnd); /* XXX */
- }
-}
-
-/*
- * Pretty print an Internet address (net address + port).
- * If the nflag was specified, use numbers instead of names.
- */
-static void
-inetprint(struct sockaddr *sa, const char *proto)
-{
- struct servent *sp = 0;
- char line[80], *cp;
- int port;
-
- switch (sa->sa_family) {
- case AF_INET:
- port = ((struct sockaddr_in *)sa)->sin_port;
- break;
-#ifdef INET6
- case AF_INET6:
- port = ((struct sockaddr_in6 *)sa)->sin6_port;
- break;
-#endif
- default:
- port = 0;
- break;
- }
- snprintf(line, sizeof(line), "%.*s.", 16, inetname(sa));
- cp = index(line, '\0');
- if (!nflag && port)
- sp = getservbyport(port, proto);
- if (sp || port == 0)
- snprintf(cp, sizeof(line) - (cp - line), "%.8s",
- sp ? sp->s_name : "*");
- else
- snprintf(cp, sizeof(line) - (cp - line), "%d",
- ntohs((u_short)port));
- /* pad to full column to clear any garbage */
- cp = index(line, '\0');
- while (cp - line < 22)
- *cp++ = ' ';
- line[22] = '\0';
- waddstr(wnd, line);
-}
-
-/*
- * Construct an Internet address representation.
- * If the nflag has been supplied, give
- * numeric value, otherwise try for symbolic name.
- */
-static char *
-inetname(struct sockaddr *sa)
-{
- char *cp = 0;
- static char line[NI_MAXHOST];
- struct hostent *hp;
- struct netent *np;
- struct in_addr in;
-
-#ifdef INET6
- if (sa->sa_family == AF_INET6) {
- if (memcmp(&((struct sockaddr_in6 *)sa)->sin6_addr,
- &in6addr_any, sizeof(in6addr_any)) == 0)
- strcpy(line, "*");
- else
- getnameinfo(sa, sa->sa_len, line, sizeof(line), NULL, 0,
- nflag ? NI_NUMERICHOST : 0);
- return (line);
- }
-#endif
-
- in = ((struct sockaddr_in *)sa)->sin_addr;
- if (!nflag && in.s_addr != INADDR_ANY) {
- int net = inet_netof(in);
- int lna = inet_lnaof(in);
-
- if (lna == INADDR_ANY) {
- np = getnetbyaddr(net, AF_INET);
- if (np)
- cp = np->n_name;
- }
- if (cp == 0) {
- hp = gethostbyaddr((char *)&in, sizeof (in), AF_INET);
- if (hp)
- cp = hp->h_name;
- }
- }
- if (in.s_addr == INADDR_ANY)
- strcpy(line, "*");
- else if (cp)
- snprintf(line, sizeof(line), "%s", cp);
- else {
- in.s_addr = ntohl(in.s_addr);
-#define C(x) ((x) & 0xff)
- snprintf(line, sizeof(line), "%u.%u.%u.%u", C(in.s_addr >> 24),
- C(in.s_addr >> 16), C(in.s_addr >> 8), C(in.s_addr));
- }
- return (line);
-}
-
-int
-cmdnetstat(const char *cmd, const char *args)
-{
- if (prefix(cmd, "all")) {
- aflag = !aflag;
- goto fixup;
- }
- if (prefix(cmd, "numbers") || prefix(cmd, "names")) {
- struct netinfo *p;
- int new;
-
- new = prefix(cmd, "numbers");
- if (new == nflag)
- return (1);
- TAILQ_FOREACH(p, &netcb, chain) {
- if (p->ni_line == -1)
- continue;
- p->ni_flags |= NIF_LACHG|NIF_FACHG;
- }
- nflag = new;
- goto redisplay;
- }
- if (!netcmd(cmd, args))
- return (0);
-fixup:
- fetchnetstat();
-redisplay:
- shownetstat();
- refresh();
- return (1);
-}
diff --git a/usr.bin/systat/pigs.c b/usr.bin/systat/pigs.c
deleted file mode 100644
index 3486115..0000000
--- a/usr.bin/systat/pigs.c
+++ /dev/null
@@ -1,198 +0,0 @@
-/*-
- * Copyright (c) 1980, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)pigs.c 8.2 (Berkeley) 9/23/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Pigs display from Bill Reeves at Lucasfilm
- */
-
-#include <sys/param.h>
-#include <sys/proc.h>
-#include <sys/sysctl.h>
-#include <sys/time.h>
-#include <sys/user.h>
-
-#include <curses.h>
-#include <math.h>
-#include <pwd.h>
-#include <stdlib.h>
-
-#include "systat.h"
-#include "extern.h"
-
-int compar(const void *, const void *);
-
-static int nproc;
-static struct p_times {
- float pt_pctcpu;
- struct kinfo_proc *pt_kp;
-} *pt;
-
-static int fscale;
-static double lccpu;
-
-WINDOW *
-openpigs(void)
-{
- return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0));
-}
-
-void
-closepigs(WINDOW *w)
-{
- if (w == NULL)
- return;
- wclear(w);
- wrefresh(w);
- delwin(w);
-}
-
-
-void
-showpigs(void)
-{
- int i, j, y, k;
- const char *uname, *pname;
- char pidname[30];
-
- if (pt == NULL)
- return;
-
- qsort(pt, nproc, sizeof (struct p_times), compar);
- y = 1;
- i = nproc;
- if (i > wnd->_maxy-1)
- i = wnd->_maxy-1;
- for (k = 0; i > 0 && pt[k].pt_pctcpu > 0.01; i--, y++, k++) {
- uname = user_from_uid(pt[k].pt_kp->ki_uid, 0);
- pname = pt[k].pt_kp->ki_comm;
- wmove(wnd, y, 0);
- wclrtoeol(wnd);
- mvwaddstr(wnd, y, 0, uname);
- snprintf(pidname, sizeof(pidname), "%10.10s", pname);
- mvwaddstr(wnd, y, 9, pidname);
- wmove(wnd, y, 20);
- for (j = pt[k].pt_pctcpu * 50 + 0.5; j > 0; j--)
- waddch(wnd, 'X');
- }
- wmove(wnd, y, 0); wclrtobot(wnd);
-}
-
-int
-initpigs(void)
-{
- fixpt_t ccpu;
- size_t len;
- int err;
-
- len = sizeof(ccpu);
- err = sysctlbyname("kern.ccpu", &ccpu, &len, NULL, 0);
- if (err || len != sizeof(ccpu)) {
- perror("kern.ccpu");
- return (0);
- }
-
- len = sizeof(fscale);
- err = sysctlbyname("kern.fscale", &fscale, &len, NULL, 0);
- if (err || len != sizeof(fscale)) {
- perror("kern.fscale");
- return (0);
- }
-
- lccpu = log((double) ccpu / fscale);
-
- return(1);
-}
-
-void
-fetchpigs(void)
-{
- int i;
- float ftime;
- float *pctp;
- struct kinfo_proc *kpp;
- static int lastnproc = 0;
-
- if ((kpp = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nproc)) == NULL) {
- error("%s", kvm_geterr(kd));
- if (pt)
- free(pt);
- return;
- }
- if (nproc > lastnproc) {
- free(pt);
- if ((pt =
- malloc(nproc * sizeof(struct p_times))) == NULL) {
- error("Out of memory");
- die(0);
- }
- }
- lastnproc = nproc;
- /*
- * calculate %cpu for each proc
- */
- for (i = 0; i < nproc; i++) {
- pt[i].pt_kp = &kpp[i];
- pctp = &pt[i].pt_pctcpu;
- ftime = kpp[i].ki_swtime;
- if (ftime == 0 || (kpp[i].ki_flag & P_INMEM) == 0)
- *pctp = 0;
- else
- *pctp = ((double) kpp[i].ki_pctcpu /
- fscale) / (1.0 - exp(ftime * lccpu));
- }
-}
-
-void
-labelpigs(void)
-{
- wmove(wnd, 0, 0);
- wclrtoeol(wnd);
- mvwaddstr(wnd, 0, 20,
- "/0% /10 /20 /30 /40 /50 /60 /70 /80 /90 /100");
-}
-
-int
-compar(const void *a, const void *b)
-{
- return (((const struct p_times *) a)->pt_pctcpu >
- ((const struct p_times *) b)->pt_pctcpu)? -1: 1;
-}
diff --git a/usr.bin/systat/swap.c b/usr.bin/systat/swap.c
deleted file mode 100644
index 43df8eb..0000000
--- a/usr.bin/systat/swap.c
+++ /dev/null
@@ -1,222 +0,0 @@
-/*-
- * Copyright (c) 1980, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifdef lint
-static const char sccsid[] = "@(#)swap.c 8.3 (Berkeley) 4/29/95";
-#endif
-
-/*
- * swapinfo - based on a program of the same name by Kevin Lahey
- */
-
-#include <sys/param.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-
-#include <kvm.h>
-#include <nlist.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <err.h>
-
-#include "systat.h"
-#include "extern.h"
-
-kvm_t *kd;
-
-static char *header;
-static long blocksize;
-static int dlen, odlen;
-static int hlen;
-static int ulen, oulen;
-static int pagesize;
-
-WINDOW *
-openswap(void)
-{
- return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0));
-}
-
-void
-closeswap(WINDOW *w)
-{
- if (w == NULL)
- return;
- wclear(w);
- wrefresh(w);
- delwin(w);
-}
-
-/*
- * The meat of all the swap stuff is stolen from pstat(8)'s
- * swapmode(), which is based on a program called swapinfo written by
- * Kevin Lahey <kml@rokkaku.atl.ga.us>.
- */
-
-#define NSWAP 16
-
-static struct kvm_swap kvmsw[NSWAP];
-static int kvnsw, okvnsw;
-
-static void calclens(void);
-
-#define CONVERT(v) ((int)((int64_t)(v) * pagesize / blocksize))
-
-static void
-calclens(void)
-{
- int i, n;
- int len;
-
- dlen = sizeof("Disk");
- for (i = 0; i < kvnsw; ++i) {
- len = strlen(kvmsw[i].ksw_devname);
- if (dlen < len)
- dlen = len;
- }
-
- ulen = sizeof("Used");
- for (n = CONVERT(kvmsw[kvnsw].ksw_used), len = 2; n /= 10; ++len);
- if (ulen < len)
- ulen = len;
-}
-
-int
-initswap(void)
-{
- static int once = 0;
-
- if (once)
- return (1);
-
- header = getbsize(&hlen, &blocksize);
- pagesize = getpagesize();
-
- if ((kvnsw = kvm_getswapinfo(kd, kvmsw, NSWAP, 0)) < 0) {
- error("systat: kvm_getswapinfo failed");
- return (0);
- }
- okvnsw = kvnsw;
-
- calclens();
- odlen = dlen;
- oulen = ulen;
-
- once = 1;
- return (1);
-}
-
-void
-fetchswap(void)
-{
-
- okvnsw = kvnsw;
- if ((kvnsw = kvm_getswapinfo(kd, kvmsw, NSWAP, 0)) < 0) {
- error("systat: kvm_getswapinfo failed");
- return;
- }
-
- odlen = dlen;
- oulen = ulen;
- calclens();
-}
-
-void
-labelswap(void)
-{
- const char *name;
- int i;
-
- fetchswap();
-
- werase(wnd);
-
- mvwprintw(wnd, 0, 0, "%*s%*s%*s %s",
- -dlen, "Disk", hlen, header, ulen, "Used",
- "/0% /10 /20 /30 /40 /50 /60 /70 /80 /90 /100");
-
- for (i = 0; i <= kvnsw; ++i) {
- if (i == kvnsw) {
- if (kvnsw == 1)
- break;
- name = "Total";
- } else
- name = kvmsw[i].ksw_devname;
- mvwprintw(wnd, i + 1, 0, "%*s", -dlen, name);
- }
-}
-
-void
-showswap(void)
-{
- int count;
- int i;
-
- if (kvnsw != okvnsw || dlen != odlen || ulen != oulen)
- labelswap();
-
- for (i = 0; i <= kvnsw; ++i) {
- if (i == kvnsw) {
- if (kvnsw == 1)
- break;
- }
-
- if (kvmsw[i].ksw_total == 0) {
- mvwprintw(
- wnd,
- i + 1,
- dlen + hlen + ulen + 1,
- "(swap not configured)"
- );
- continue;
- }
-
- wmove(wnd, i + 1, dlen);
-
- wprintw(wnd, "%*d", hlen, CONVERT(kvmsw[i].ksw_total));
- wprintw(wnd, "%*d", ulen, CONVERT(kvmsw[i].ksw_used));
-
- count = 50.0 * kvmsw[i].ksw_used / kvmsw[i].ksw_total + 1;
-
- waddch(wnd, ' ');
- while (count--)
- waddch(wnd, 'X');
- wclrtoeol(wnd);
- }
-}
diff --git a/usr.bin/systat/systat.1 b/usr.bin/systat/systat.1
deleted file mode 100644
index 9d392d9..0000000
--- a/usr.bin/systat/systat.1
+++ /dev/null
@@ -1,641 +0,0 @@
-.\" Copyright (c) 1985, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)systat.1 8.2 (Berkeley) 12/30/93
-.\" $FreeBSD$
-.\"
-.Dd October 14, 2007
-.Dt SYSTAT 1
-.Os
-.Sh NAME
-.Nm systat
-.Nd display system statistics
-.Sh SYNOPSIS
-.Nm
-.Op Fl display
-.Op Ar refresh-interval
-.Sh DESCRIPTION
-The
-.Nm
-utility displays various system statistics in a screen oriented fashion
-using the curses screen display library,
-.Xr ncurses 3 .
-.Pp
-While
-.Nm
-is running the screen is usually divided into two windows (an exception
-is the vmstat display which uses the entire screen).
-The
-upper window depicts the current system load average.
-The
-information displayed in the lower window may vary, depending on
-user commands.
-The last line on the screen is reserved for user
-input and error messages.
-.Pp
-By default
-.Nm
-displays the processes getting the largest percentage of the processor
-in the lower window.
-Other displays show swap space usage, disk
-.Tn I/O
-statistics (a la
-.Xr iostat 8 ) ,
-virtual memory statistics (a la
-.Xr vmstat 8 ) ,
-network ``mbuf'' utilization,
-.Tn TCP/IP
-statistics,
-and network connections (a la
-.Xr netstat 1 ) .
-.Pp
-Input is interpreted at two different levels.
-A ``global'' command interpreter processes all keyboard input.
-If this command interpreter fails to recognize a command, the
-input line is passed to a per-display command interpreter.
-This
-allows each display to have certain display-specific commands.
-.Pp
-Command line options:
-.Bl -tag -width "refresh_interval"
-.It Fl Ns Ar display
-The
-.Fl
-flag expects
-.Ar display
-to be one of:
-.Ic icmp ,
-.Ic icmp6 ,
-.Ic ifstat ,
-.Ic iostat ,
-.Ic ip ,
-.Ic ip6 ,
-.Ic mbufs ,
-.Ic netstat ,
-.Ic pigs ,
-.Ic swap ,
-.Ic tcp ,
-or
-.Ic vmstat .
-These displays can also be requested interactively (without the
-.Dq Fl )
-and are described in
-full detail below.
-.It Ar refresh-interval
-The
-.Ar refresh-value
-specifies the screen refresh time interval in seconds.
-.El
-.Pp
-Certain characters cause immediate action by
-.Nm .
-These are
-.Bl -tag -width Fl
-.It Ic \&^L
-Refresh the screen.
-.It Ic \&^G
-Print the name of the current ``display'' being shown in
-the lower window and the refresh interval.
-.It Ic \&:
-Move the cursor to the command line and interpret the input
-line typed as a command.
-While entering a command the
-current character erase, word erase, and line kill characters
-may be used.
-.El
-.Pp
-The following commands are interpreted by the ``global''
-command interpreter.
-.Bl -tag -width Fl
-.It Ic help
-Print the names of the available displays on the command line.
-.It Ic load
-Print the load average over the past 1, 5, and 15 minutes
-on the command line.
-.It Ic stop
-Stop refreshing the screen.
-.It Xo
-.Op Ic start
-.Op Ar number
-.Xc
-Start (continue) refreshing the screen.
-If a second, numeric,
-argument is provided it is interpreted as a refresh interval
-(in seconds).
-Supplying only a number will set the refresh interval to this
-value.
-.It Ic quit
-Exit
-.Nm .
-(This may be abbreviated to
-.Ic q . )
-.El
-.Pp
-The available displays are:
-.Bl -tag -width Ic
-.It Ic pigs
-Display, in the lower window, those processes resident in main
-memory and getting the
-largest portion of the processor (the default display).
-When less than 100% of the
-processor is scheduled to user processes, the remaining time
-is accounted to the ``idle'' process.
-.It Ic icmp
-Display, in the lower window, statistics about messages received and
-transmitted by the Internet Control Message Protocol
-.Pq Dq Tn ICMP .
-The left half of the screen displays information about received
-packets, and the right half displays information regarding transmitted
-packets.
-.Pp
-The
-.Ic icmp
-display understands two commands:
-.Ic mode
-and
-.Ic reset .
-The
-.Ic mode
-command is used to select one of four display modes, given as its argument:
-.Bl -tag -width absoluteXX -compact
-.It Ic rate :
-show the rate of change of each value in packets (the default)
-per second
-.It Ic delta :
-show the rate of change of each value in packets per refresh interval
-.It Ic since :
-show the total change of each value since the display was last reset
-.It Ic absolute :
-show the absolute value of each statistic
-.El
-.Pp
-The
-.Ic reset
-command resets the baseline for
-.Ic since
-mode.
-The
-.Ic mode
-command with no argument will display the current mode in the command
-line.
-.It Ic icmp6
-This display is like the
-.Ic icmp
-display,
-but displays statistics for IPv6 ICMP.
-.It Ic ip
-Otherwise identical to the
-.Ic icmp
-display, except that it displays
-.Tn IP
-and
-.Tn UDP
-statistics.
-.It Ic ip6
-Like the
-.Ic ip
-display,
-except that it displays
-.Tn IPv6
-statics.
-It does not display
-.Tn UDP statistics.
-.It Ic tcp
-Like
-.Ic icmp ,
-but with
-.Tn TCP
-statistics.
-.It Ic iostat
-Display, in the lower window, statistics about processor use
-and disk throughput.
-Statistics on processor use appear as
-bar graphs of the amount of time executing in user mode (``user''),
-in user mode running low priority processes (``nice''), in
-system mode (``system''), in interrupt mode (``interrupt''),
-and idle (``idle'').
-Statistics
-on disk throughput show, for each drive, megabytes per second,
-average number of disk transactions per second, and
-average kilobytes of data per transaction.
-This information may be
-displayed as bar graphs or as rows of numbers which scroll downward.
-Bar
-graphs are shown by default.
-.Pp
-The following commands are specific to the
-.Ic iostat
-display; the minimum unambiguous prefix may be supplied.
-.Pp
-.Bl -tag -width Fl -compact
-.It Cm numbers
-Show the disk
-.Tn I/O
-statistics in numeric form.
-Values are
-displayed in numeric columns which scroll downward.
-.It Cm bars
-Show the disk
-.Tn I/O
-statistics in bar graph form (default).
-.It Cm kbpt
-Toggle the display of kilobytes per transaction.
-(the default is to
-not display kilobytes per transaction).
-.El
-.It Ic swap
-Show information about swap space usage on all the
-swap areas compiled into the kernel.
-The first column is the device name of the partition.
-The next column is the total space available in the partition.
-The
-.Ar Used
-column indicates the total blocks used so far;
-the graph shows the percentage of space in use on each partition.
-If there are more than one swap partition in use,
-a total line is also shown.
-Areas known to the kernel, but not in use are shown as not available.
-.It Ic mbufs
-Display, in the lower window, the number of mbufs allocated
-for particular uses, i.e., data, socket structures, etc.
-.It Ic vmstat
-Take over the entire display and show a (rather crowded) compendium
-of statistics related to virtual memory usage, process scheduling,
-device interrupts, system name translation caching, disk
-.Tn I/O
-etc.
-.Pp
-The upper left quadrant of the screen shows the number
-of users logged in and the load average over the last one, five,
-and fifteen minute intervals.
-Below this line are statistics on memory utilization.
-The first row of the table reports memory usage only among
-active processes, that is processes that have run in the previous
-twenty seconds.
-The second row reports on memory usage of all processes.
-The first column reports on the number of kilobytes in physical pages
-claimed by processes.
-The second column reports the number of kilobytes in physical pages that
-are devoted to read only text pages.
-The third and fourth columns report the same two figures for
-virtual pages, that is the number of kilobytes in pages that would be
-needed if all processes had all of their pages.
-Finally the last column shows the number of kilobytes in physical pages
-on the free list.
-.Pp
-Below the memory display is a list of the
-average number of processes (over the last refresh interval)
-that are runnable (`r'), in page wait (`p'),
-in disk wait other than paging (`d'),
-sleeping (`s'), and swapped out but desiring to run (`w').
-The row also shows the average number of context switches
-(`Csw'), traps (`Trp'; includes page faults), system calls (`Sys'),
-interrupts (`Int'), network software interrupts (`Sof'), and page
-faults (`Flt').
-.Pp
-Below the process queue length listing is a numerical listing and
-a bar graph showing the amount of
-system (shown as `='), interrupt (shown as `+'), user (shown as `>'),
-nice (shown as `-'), and idle time (shown as ` ').
-.Pp
-Below the process display are statistics on name translations.
-It lists the number of names translated in the previous interval,
-the number and percentage of the translations that were
-handled by the system wide name translation cache, and
-the number and percentage of the translations that were
-handled by the per process name translation cache.
-.Pp
-To the right of the name translations display are lines showing
-the number of dirty buffers in the buffer cache (`dtbuf'),
-desired maximum size of vnode cache (`desvn'),
-number of vnodes actually allocated (`numvn'),
-and
-number of allocated vnodes that are free (`frevn').
-.Pp
-At the bottom left is the disk usage display.
-It reports the number of
-kilobytes per transaction, transactions per second, megabytes
-per second and the percentage of the time the disk was busy averaged
-over the refresh period of the display (by default, five seconds).
-The system keeps statistics on most every storage device.
-In general, up
-to seven devices are displayed.
-The devices displayed by default are the
-first devices in the kernel's device list.
-See
-.Xr devstat 3
-and
-.Xr devstat 9
-for details on the devstat system.
-.Pp
-Under the date in the upper right hand quadrant are statistics
-on paging and swapping activity.
-The first two columns report the average number of pages
-brought in and out per second over the last refresh interval
-due to page faults and the paging daemon.
-The third and fourth columns report the average number of pages
-brought in and out per second over the last refresh interval
-due to swap requests initiated by the scheduler.
-The first row of the display shows the average
-number of disk transfers per second over the last refresh interval;
-the second row of the display shows the average
-number of pages transferred per second over the last refresh interval.
-.Pp
-Below the paging statistics is a column of lines regarding the virtual
-memory system.
-The first few lines describe,
-in units (except as noted below)
-of pages per second averaged over the sampling interval,
-pages copied on write (`cow'),
-pages zero filled on demand (`zfod'),
-pages optimally zero filled on demand (`ozfod'),
-the ratio of the (average) ozfod / zfod as a percentage (`%ozfod'),
-pages freed by the page daemon (`daefr'),
-pages freed by exiting processes (`prcfr'),
-total pages freed (`totfr'),
-pages reactivated from the free list (`react'),
-the average number of
-times per second that the page daemon was awakened (`pdwak'),
-pages analyzed by the page daemon (`pdpgs'),
-and
-in-transit blocking page faults (`intrn').
-Note that the units are special for `%ozfod' and `pdwak'.
-The next few lines describe,
-as amounts of memory in kilobytes,
-pages wired down (`wire'),
-active pages (`act'),
-inactive pages (`inact'),
-pages on the cache queue (`cache'),
-and
-free pages (`free').
-Note that the values displayed are the current transient ones;
-they are not averages.
-.Pp
-At the bottom of this column is a line showing the
-amount of virtual memory, in kilobytes, mapped into the buffer cache (`buf').
-This statistic is not useful.
-It exists only as a placeholder for the corresponding useful statistic
-(the amount of real memory used to cache disks).
-The most important component of the latter (the amount of real memory
-used by the vm system to cache disks) is not available,
-but can be guessed from the `inact' amount under some system loads.
-.Pp
-Running down the right hand side of the display is a breakdown
-of the interrupts being handled by the system.
-At the top of the list is the total interrupts per second
-over the time interval.
-The rest of the column breaks down the total on a device
-by device basis.
-Only devices that have interrupted at least once since boot time are shown.
-.Pp
-The following commands are specific to the
-.Ic vmstat
-display; the minimum unambiguous prefix may be supplied.
-.Pp
-.Bl -tag -width Ar -compact
-.It Cm boot
-Display cumulative statistics since the system was booted.
-.It Cm run
-Display statistics as a running total from the point this
-command is given.
-.It Cm time
-Display statistics averaged over the refresh interval (the default).
-.It Cm zero
-Reset running statistics to zero.
-.El
-.It Ic netstat
-Display, in the lower window, network connections.
-By default,
-network servers awaiting requests are not displayed.
-Each address
-is displayed in the format ``host.port'', with each shown symbolically,
-when possible.
-It is possible to have addresses displayed numerically,
-limit the display to a set of ports, hosts, and/or protocols
-(the minimum unambiguous prefix may be supplied):
-.Pp
-.Bl -tag -width Ar -compact
-.It Cm all
-Toggle the displaying of server processes awaiting requests (this
-is the equivalent of the
-.Fl a
-flag to
-.Xr netstat 1 ) .
-.It Cm numbers
-Display network addresses numerically.
-.It Cm names
-Display network addresses symbolically.
-.It Cm proto Ar protocol
-Display only network connections using the indicated
-.Ar protocol .
-Supported protocols are ``tcp'', ``udp'', and ``all''.
-.It Cm ignore Op Ar items
-Do not display information about connections associated with
-the specified hosts or ports.
-Hosts and ports may be specified
-by name (``vangogh'', ``ftp''), or numerically.
-Host addresses
-use the Internet dot notation (``128.32.0.9'').
-Multiple items
-may be specified with a single command by separating them with
-spaces.
-.It Cm display Op Ar items
-Display information about the connections associated with the
-specified hosts or ports.
-As for
-.Ar ignore ,
-.Op Ar items
-may be names or numbers.
-.It Cm show Op Ar ports\&|hosts
-Show, on the command line, the currently selected protocols,
-hosts, and ports.
-Hosts and ports which are being ignored
-are prefixed with a `!'.
-If
-.Ar ports
-or
-.Ar hosts
-is supplied as an argument to
-.Cm show ,
-then only the requested information will be displayed.
-.It Cm reset
-Reset the port, host, and protocol matching mechanisms to the default
-(any protocol, port, or host).
-.El
-.It Ic ifstat
-Display the network traffic going through active interfaces on the
-system.
-Idle interfaces will not be displayed until they receive some
-traffic.
-.Pp
-For each interface being displayed, the current, peak and total
-statistics are displayed for incoming and outgoing traffic.
-By default,
-the
-.Ic ifstat
-display will automatically scale the units being used so that they are
-in a human-readable format.
-The scaling units used for the current and
-peak
-traffic columns can be altered by the
-.Ic scale
-command.
-.Bl -tag -width ".Cm scale Op Ar units"
-.It Cm scale Op Ar units
-Modify the scale used to display the current and peak traffic over all
-interfaces.
-The following units are recognised: kbit, kbyte, mbit,
-mbyte, gbit, gbyte and auto.
-.El
-.El
-.Pp
-Commands to switch between displays may be abbreviated to the
-minimum unambiguous prefix; for example, ``io'' for ``iostat''.
-Certain information may be discarded when the screen size is
-insufficient for display.
-For example, on a machine with 10
-drives the
-.Ic iostat
-bar graph displays only 3 drives on a 24 line terminal.
-When
-a bar graph would overflow the allotted screen space it is
-truncated and the actual value is printed ``over top'' of the bar.
-.Pp
-The following commands are common to each display which shows
-information about disk drives.
-These commands are used to
-select a set of drives to report on, should your system have
-more drives configured than can normally be displayed on the
-screen.
-.Pp
-.Bl -tag -width Ar -compact
-.It Cm ignore Op Ar drives
-Do not display information about the drives indicated.
-Multiple
-drives may be specified, separated by spaces.
-.It Cm display Op Ar drives
-Display information about the drives indicated.
-Multiple drives
-may be specified, separated by spaces.
-.It Cm only Op Ar drives
-Display only the specified drives.
-Multiple drives may be specified,
-separated by spaces.
-.It Cm drives
-Display a list of available devices.
-.It Cm match Xo
-.Ar type , Ns Ar if , Ns Ar pass
-.Op | Ar ...
-.Xc
-Display devices matching the given pattern.
-The basic matching
-expressions are the same as those used in
-.Xr iostat 8
-with one difference.
-Instead of specifying multiple
-.Fl t
-arguments which are then ORed together, the user instead specifies multiple
-matching expressions joined by the pipe
-.Pq Ql \&|
-character.
-The comma
-separated arguments within each matching expression are ANDed together, and
-then the pipe separated matching expressions are ORed together.
-Any
-device matching the combined expression will be displayed, if there is room
-to display it.
-For example:
-.Pp
-.Dl match da,scsi | cd,ide
-.Pp
-This will display all SCSI Direct Access devices and all IDE CDROM devices.
-.Pp
-.Dl match da | sa | cd,pass
-.Pp
-This will display all Direct Access devices, all Sequential Access devices,
-and all passthrough devices that provide access to CDROM drives.
-.El
-.Sh FILES
-.Bl -tag -width /boot/kernel/kernel -compact
-.It Pa /boot/kernel/kernel
-For the namelist.
-.It Pa /dev/kmem
-For information in main memory.
-.It Pa /etc/hosts
-For host names.
-.It Pa /etc/networks
-For network names.
-.It Pa /etc/services
-For port names.
-.El
-.Sh SEE ALSO
-.Xr netstat 1 ,
-.Xr kvm 3 ,
-.Xr icmp 4 ,
-.Xr icmp6 4 ,
-.Xr ip 4 ,
-.Xr ip6 4 ,
-.Xr tcp 4 ,
-.Xr udp 4 ,
-.Xr gstat 8 ,
-.Xr iostat 8 ,
-.Xr vmstat 8
-.Sh HISTORY
-The
-.Nm
-program appeared in
-.Bx 4.3 .
-The
-.Ic icmp ,
-.Ic ip ,
-and
-.Ic tcp
-displays appeared in
-.Fx 3.0 ;
-the notion of having different display modes for the
-.Tn ICMP ,
-.Tn IP ,
-.Tn TCP ,
-and
-.Tn UDP
-statistics was stolen from the
-.Fl C
-option to
-.Xr netstat 1
-in Silicon Graphics'
-.Tn IRIX
-system.
-.Sh BUGS
-Certain displays presume a minimum of 80 characters per line.
-The
-.Ic vmstat
-display looks out of place because it is (it was added in as
-a separate display rather than created as a new program).
diff --git a/usr.bin/systat/systat.h b/usr.bin/systat/systat.h
deleted file mode 100644
index 501d3d7..0000000
--- a/usr.bin/systat/systat.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*-
- * Copyright (c) 1980, 1989, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * From: @(#)systat.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#include <curses.h>
-
-struct cmdtab {
- const char *c_name; /* command name */
- void (*c_refresh)(void); /* display refresh */
- void (*c_fetch)(void); /* sets up data structures */
- void (*c_label)(void); /* label display */
- int (*c_init)(void); /* initialize namelist, etc. */
- WINDOW *(*c_open)(void); /* open display */
- void (*c_close)(WINDOW *); /* close display */
- int (*c_cmd)(const char *, const char *); /* display command interpreter */
- void (*c_reset)(void); /* reset ``mode since'' display */
- char c_flags; /* see below */
-};
-
-/*
- * If we are started with privileges, use a kmem interface for netstat handling,
- * otherwise use sysctl.
- * In case of many open sockets, the sysctl handling might become slow.
- */
-extern int use_kvm;
-
-#define CF_INIT 0x1 /* been initialized */
-#define CF_LOADAV 0x2 /* display w/ load average */
-
-#define TCP 0x1
-#define UDP 0x2
-
-#define MAINWIN_ROW 3 /* top row for the main/lower window */
-
-#define GETSYSCTL(name, var) getsysctl(name, &(var), sizeof(var))
-#define KREAD(addr, buf, len) kvm_ckread((addr), (buf), (len))
-#define NVAL(indx) namelist[(indx)].n_value
-#define NPTR(indx) (void *)NVAL((indx))
-#define NREAD(indx, buf, len) kvm_ckread(NPTR((indx)), (buf), (len))
diff --git a/usr.bin/systat/tcp.c b/usr.bin/systat/tcp.c
deleted file mode 100644
index b7f7592..0000000
--- a/usr.bin/systat/tcp.c
+++ /dev/null
@@ -1,331 +0,0 @@
-/*-
- * Copyright (c) 1980, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-/* From: */
-static char sccsid[] = "@(#)mbufs.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] =
- "Id: mbufs.c,v 1.5 1997/02/24 20:59:03 wollman Exp";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/sysctl.h>
-
-#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#include <netinet/tcp.h>
-#include <netinet/tcp_seq.h>
-#include <netinet/tcp_fsm.h>
-#include <netinet/tcp_timer.h>
-#include <netinet/tcp_var.h>
-
-#include <stdlib.h>
-#include <string.h>
-#include <paths.h>
-
-#include "systat.h"
-#include "extern.h"
-#include "mode.h"
-
-static struct tcpstat curstat, initstat, oldstat;
-
-/*-
---0 1 2 3 4 5 6 7
---0123456789012345678901234567890123456789012345678901234567890123456789012345
-00 TCP Connections TCP Packets
-01999999999999 connections initiated 999999999999 total packets sent
-02999999999999 connections accepted 999999999999 - data
-03999999999999 connections established 999999999999 - data (retransmit by dupack)
-04999999999999 connections dropped 999999999999 - data (retransmit by sack)
-05999999999999 - in embryonic state 999999999999 - ack-only
-06999999999999 - on retransmit timeout 999999999999 - window probes
-07999999999999 - by keepalive 999999999999 - window updates
-08999999999999 - from listen queue 999999999999 - urgent data only
-09 999999999999 - control
-10 999999999999 - resends by PMTU discovery
-11 TCP Timers 999999999999 total packets received
-12999999999999 potential rtt updates 999999999999 - in sequence
-13999999999999 - successful 999999999999 - completely duplicate
-14999999999999 delayed acks sent 999999999999 - with some duplicate data
-15999999999999 retransmit timeouts 999999999999 - out-of-order
-16999999999999 persist timeouts 999999999999 - duplicate acks
-17999999999999 keepalive probes 999999999999 - acks
-18999999999999 - timeouts 999999999999 - window probes
-19 999999999999 - window updates
-20 999999999999 - bad checksum
---0123456789012345678901234567890123456789012345678901234567890123456789012345
---0 1 2 3 4 5 6 7
-*/
-
-WINDOW *
-opentcp(void)
-{
- return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0));
-}
-
-void
-closetcp(WINDOW *w)
-{
- if (w == NULL)
- return;
- wclear(w);
- wrefresh(w);
- delwin(w);
-}
-
-void
-labeltcp(void)
-{
- wmove(wnd, 0, 0); wclrtoeol(wnd);
-#define L(row, str) mvwprintw(wnd, row, 13, str)
-#define R(row, str) mvwprintw(wnd, row, 51, str);
- L(0, "TCP Connections"); R(0, "TCP Packets");
- L(1, "connections initiated"); R(1, "total packets sent");
- L(2, "connections accepted"); R(2, "- data");
- L(3, "connections established"); R(3, "- data (retransmit by dupack)");
- L(4, "connections dropped"); R(4, "- data (retransmit by sack)");
- L(5, "- in embryonic state"); R(5, "- ack-only");
- L(6, "- on retransmit timeout"); R(6, "- window probes");
- L(7, "- by keepalive"); R(7, "- window updates");
- L(8, "- from listen queue"); R(8, "- urgent data only");
- R(9, "- control");
- R(10, "- resends by PMTU discovery");
- L(11, "TCP Timers"); R(11, "total packets received");
- L(12, "potential rtt updates"); R(12, "- in sequence");
- L(13, "- successful"); R(13, "- completely duplicate");
- L(14, "delayed acks sent"); R(14, "- with some duplicate data");
- L(15, "retransmit timeouts"); R(15, "- out-of-order");
- L(16, "persist timeouts"); R(16, "- duplicate acks");
- L(17, "keepalive probes"); R(17, "- acks");
- L(18, "- timeouts"); R(18, "- window probes");
- R(19, "- window updates");
- R(20, "- bad checksum");
-#undef L
-#undef R
-}
-
-static void
-domode(struct tcpstat *ret)
-{
- const struct tcpstat *sub;
- int divisor = 1;
-
- switch(currentmode) {
- case display_RATE:
- sub = &oldstat;
- divisor = naptime;
- break;
- case display_DELTA:
- sub = &oldstat;
- break;
- case display_SINCE:
- sub = &initstat;
- break;
- default:
- *ret = curstat;
- return;
- }
-#define DO(stat) ret->stat = (curstat.stat - sub->stat) / divisor
- DO(tcps_connattempt);
- DO(tcps_accepts);
- DO(tcps_connects);
- DO(tcps_drops);
- DO(tcps_conndrops);
- DO(tcps_closed);
- DO(tcps_segstimed);
- DO(tcps_rttupdated);
- DO(tcps_delack);
- DO(tcps_timeoutdrop);
- DO(tcps_rexmttimeo);
- DO(tcps_persisttimeo);
- DO(tcps_keeptimeo);
- DO(tcps_keepprobe);
- DO(tcps_keepdrops);
-
- DO(tcps_sndtotal);
- DO(tcps_sndpack);
- DO(tcps_sndbyte);
- DO(tcps_sndrexmitpack);
- DO(tcps_sack_rexmits);
- DO(tcps_sndacks);
- DO(tcps_sndprobe);
- DO(tcps_sndurg);
- DO(tcps_sndwinup);
- DO(tcps_sndctrl);
-
- DO(tcps_rcvtotal);
- DO(tcps_rcvpack);
- DO(tcps_rcvbyte);
- DO(tcps_rcvbadsum);
- DO(tcps_rcvbadoff);
- DO(tcps_rcvshort);
- DO(tcps_rcvduppack);
- DO(tcps_rcvdupbyte);
- DO(tcps_rcvpartduppack);
- DO(tcps_rcvpartdupbyte);
- DO(tcps_rcvoopack);
- DO(tcps_rcvoobyte);
- DO(tcps_rcvpackafterwin);
- DO(tcps_rcvbyteafterwin);
- DO(tcps_rcvafterclose);
- DO(tcps_rcvwinprobe);
- DO(tcps_rcvdupack);
- DO(tcps_rcvacktoomuch);
- DO(tcps_rcvackpack);
- DO(tcps_rcvackbyte);
- DO(tcps_rcvwinupd);
- DO(tcps_pawsdrop);
- DO(tcps_predack);
- DO(tcps_preddat);
- DO(tcps_pcbcachemiss);
- DO(tcps_cachedrtt);
- DO(tcps_cachedrttvar);
- DO(tcps_cachedssthresh);
- DO(tcps_usedrtt);
- DO(tcps_usedrttvar);
- DO(tcps_usedssthresh);
- DO(tcps_persistdrop);
- DO(tcps_badsyn);
- DO(tcps_mturesent);
- DO(tcps_listendrop);
-#undef DO
-}
-
-void
-showtcp(void)
-{
- struct tcpstat stats;
-
- memset(&stats, 0, sizeof stats);
- domode(&stats);
-
-#define DO(stat, row, col) \
- mvwprintw(wnd, row, col, "%12lu", stats.stat)
-#define L(row, stat) DO(stat, row, 0)
-#define R(row, stat) DO(stat, row, 38)
- L(1, tcps_connattempt); R(1, tcps_sndtotal);
- L(2, tcps_accepts); R(2, tcps_sndpack);
- L(3, tcps_connects); R(3, tcps_sndrexmitpack);
- L(4, tcps_drops); R(4, tcps_sack_rexmits);
- L(5, tcps_conndrops); R(5, tcps_sndacks);
- L(6, tcps_timeoutdrop); R(6, tcps_sndprobe);
- L(7, tcps_keepdrops); R(7, tcps_sndwinup);
- L(8, tcps_listendrop); R(8, tcps_sndurg);
- R(9, tcps_sndctrl);
- R(10, tcps_mturesent);
- R(11, tcps_rcvtotal);
- L(12, tcps_segstimed); R(12, tcps_rcvpack);
- L(13, tcps_rttupdated); R(13, tcps_rcvduppack);
- L(14, tcps_delack); R(14, tcps_rcvpartduppack);
- L(15, tcps_rexmttimeo); R(15, tcps_rcvoopack);
- L(16, tcps_persisttimeo); R(16, tcps_rcvdupack);
- L(17, tcps_keepprobe); R(17, tcps_rcvackpack);
- L(18, tcps_keeptimeo); R(18, tcps_rcvwinprobe);
- R(19, tcps_rcvwinupd);
- R(20, tcps_rcvbadsum);
-#undef DO
-#undef L
-#undef R
-}
-
-int
-inittcp(void)
-{
- size_t len;
- int name[4];
-
- name[0] = CTL_NET;
- name[1] = PF_INET;
- name[2] = IPPROTO_TCP;
- name[3] = TCPCTL_STATS;
-
- len = 0;
- if (sysctl(name, 4, 0, &len, 0, 0) < 0) {
- error("sysctl getting tcpstat size failed");
- return 0;
- }
- if (len > sizeof curstat) {
- error("tcpstat structure has grown--recompile systat!");
- return 0;
- }
- if (sysctl(name, 4, &initstat, &len, 0, 0) < 0) {
- error("sysctl getting tcpstat failed");
- return 0;
- }
- oldstat = initstat;
- return 1;
-}
-
-void
-resettcp(void)
-{
- size_t len;
- int name[4];
-
- name[0] = CTL_NET;
- name[1] = PF_INET;
- name[2] = IPPROTO_TCP;
- name[3] = TCPCTL_STATS;
-
- len = sizeof initstat;
- if (sysctl(name, 4, &initstat, &len, 0, 0) < 0) {
- error("sysctl getting tcpstat failed");
- }
- oldstat = initstat;
-}
-
-void
-fetchtcp(void)
-{
- int name[4];
- size_t len;
-
- oldstat = curstat;
- name[0] = CTL_NET;
- name[1] = PF_INET;
- name[2] = IPPROTO_TCP;
- name[3] = TCPCTL_STATS;
- len = sizeof curstat;
-
- if (sysctl(name, 4, &curstat, &len, 0, 0) < 0)
- return;
-}
-
diff --git a/usr.bin/systat/vmstat.c b/usr.bin/systat/vmstat.c
deleted file mode 100644
index f29f21b..0000000
--- a/usr.bin/systat/vmstat.c
+++ /dev/null
@@ -1,884 +0,0 @@
-/*-
- * Copyright (c) 1983, 1989, 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifdef lint
-static const char sccsid[] = "@(#)vmstat.c 8.2 (Berkeley) 1/12/94";
-#endif
-
-/*
- * Cursed vmstat -- from Robert Elz.
- */
-
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/proc.h>
-#include <sys/uio.h>
-#include <sys/namei.h>
-#include <sys/resource.h>
-#include <sys/sysctl.h>
-#include <sys/vmmeter.h>
-
-#include <vm/vm_param.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <langinfo.h>
-#include <nlist.h>
-#include <paths.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-#include <utmp.h>
-#include <devstat.h>
-#include "systat.h"
-#include "extern.h"
-#include "devs.h"
-
-static struct Info {
- long time[CPUSTATES];
- u_int v_swtch; /* context switches */
- u_int v_trap; /* calls to trap */
- u_int v_syscall; /* calls to syscall() */
- u_int v_intr; /* device interrupts */
- u_int v_soft; /* software interrupts */
- /*
- * Virtual memory activity.
- */
- u_int v_vm_faults; /* number of address memory faults */
- u_int v_cow_faults; /* number of copy-on-writes */
- u_int v_zfod; /* pages zero filled on demand */
- u_int v_ozfod; /* optimized zero fill pages */
- u_int v_swapin; /* swap pager pageins */
- u_int v_swapout; /* swap pager pageouts */
- u_int v_swappgsin; /* swap pager pages paged in */
- u_int v_swappgsout; /* swap pager pages paged out */
- u_int v_vnodein; /* vnode pager pageins */
- u_int v_vnodeout; /* vnode pager pageouts */
- u_int v_vnodepgsin; /* vnode_pager pages paged in */
- u_int v_vnodepgsout; /* vnode pager pages paged out */
- u_int v_intrans; /* intransit blocking page faults */
- u_int v_reactivated; /* number of pages reactivated from free list */
- u_int v_pdwakeups; /* number of times daemon has awaken from sleep */
- u_int v_pdpages; /* number of pages analyzed by daemon */
-
- u_int v_dfree; /* pages freed by daemon */
- u_int v_pfree; /* pages freed by exiting processes */
- u_int v_tfree; /* total pages freed */
- /*
- * Distribution of page usages.
- */
- u_int v_page_size; /* page size in bytes */
- u_int v_free_count; /* number of pages free */
- u_int v_wire_count; /* number of pages wired down */
- u_int v_active_count; /* number of pages active */
- u_int v_inactive_count; /* number of pages inactive */
- u_int v_cache_count; /* number of pages on buffer cache queue */
- struct vmtotal Total;
- struct nchstats nchstats;
- long nchcount;
- long *intrcnt;
- int bufspace;
- int desiredvnodes;
- long numvnodes;
- long freevnodes;
- int numdirtybuffers;
-} s, s1, s2, z;
-
-struct statinfo cur, last, run;
-
-#define total s.Total
-#define nchtotal s.nchstats
-#define oldnchtotal s1.nchstats
-
-static enum state { BOOT, TIME, RUN } state = TIME;
-
-static void allocinfo(struct Info *);
-static void copyinfo(struct Info *, struct Info *);
-static float cputime(int);
-static void dinfo(int, int, struct statinfo *, struct statinfo *);
-static void getinfo(struct Info *);
-static void putint(int, int, int, int);
-static void putfloat(double, int, int, int, int, int);
-static void putlongdouble(long double, int, int, int, int, int);
-static int ucount(void);
-
-static int ncpu;
-static int ut;
-static char buf[26];
-static time_t t;
-static double etime;
-static int nintr;
-static long *intrloc;
-static char **intrname;
-static int nextintsrow;
-
-struct utmp utmp;
-
-
-WINDOW *
-openkre(void)
-{
-
- ut = open(_PATH_UTMP, O_RDONLY);
- if (ut < 0)
- error("No utmp");
- return (stdscr);
-}
-
-void
-closekre(WINDOW *w)
-{
-
- (void) close(ut);
- if (w == NULL)
- return;
- wclear(w);
- wrefresh(w);
-}
-
-/*
- * These constants define where the major pieces are laid out
- */
-#define STATROW 0 /* uses 1 row and 67 cols */
-#define STATCOL 0
-#define MEMROW 2 /* uses 4 rows and 45 cols */
-#define MEMCOL 0
-#define PAGEROW 2 /* uses 4 rows and 30 cols */
-#define PAGECOL 47
-#define INTSROW 6 /* uses all rows to bottom and 16 cols */
-#define INTSCOL 64
-#define PROCSROW 6 /* uses 3 rows and 19 cols */
-#define PROCSCOL 0
-#define GENSTATROW 7 /* uses 2 rows and 29 cols */
-#define GENSTATCOL 21
-#define VMSTATROW 7 /* uses 17 rows and 12-14 cols */
-#define VMSTATCOL 49 /* actually 50-51 for some fields */
-#define GRAPHROW 10 /* uses 3 rows and 49-51 cols */
-#define GRAPHCOL 0
-#define VNSTATROW 13 /* uses 4 rows and 13 columns */
-#define VNSTATCOL 35
-#define NAMEIROW 14 /* uses 3 rows and 32 cols */
-#define NAMEICOL 0
-#define DISKROW 18 /* uses 5 rows and 47 cols (for 7 drives) */
-#define DISKCOL 0
-
-#define DRIVESPACE 7 /* max # for space */
-
-#define MAXDRIVES DRIVESPACE /* max # to display */
-
-int
-initkre(void)
-{
- char *cp, *cp1, *cp2, *intrnamebuf, *nextcp;
- int i;
- size_t sz;
-
- if ((num_devices = devstat_getnumdevs(NULL)) < 0) {
- warnx("%s", devstat_errbuf);
- return(0);
- }
-
- cur.dinfo = (struct devinfo *)malloc(sizeof(struct devinfo));
- last.dinfo = (struct devinfo *)malloc(sizeof(struct devinfo));
- run.dinfo = (struct devinfo *)malloc(sizeof(struct devinfo));
- bzero(cur.dinfo, sizeof(struct devinfo));
- bzero(last.dinfo, sizeof(struct devinfo));
- bzero(run.dinfo, sizeof(struct devinfo));
-
- if (dsinit(MAXDRIVES, &cur, &last, &run) != 1)
- return(0);
-
- if (nintr == 0) {
- if (sysctlbyname("hw.intrcnt", NULL, &sz, NULL, 0) == -1) {
- error("sysctl(hw.intrcnt...) failed: %s",
- strerror(errno));
- return (0);
- }
- nintr = sz / sizeof(u_long);
- intrloc = calloc(nintr, sizeof (long));
- intrname = calloc(nintr, sizeof (char *));
- intrnamebuf = sysctl_dynread("hw.intrnames", NULL);
- if (intrnamebuf == NULL || intrname == NULL ||
- intrloc == NULL) {
- error("Out of memory");
- if (intrnamebuf)
- free(intrnamebuf);
- if (intrname)
- free(intrname);
- if (intrloc)
- free(intrloc);
- nintr = 0;
- return(0);
- }
- for (cp = intrnamebuf, i = 0; i < nintr; i++) {
- nextcp = cp + strlen(cp) + 1;
-
- /* Discard trailing spaces. */
- for (cp1 = nextcp - 1; cp1 > cp && *(cp1 - 1) == ' '; )
- *--cp1 = '\0';
-
- /* Convert "irqN: name" to "name irqN". */
- if (strncmp(cp, "irq", 3) == 0) {
- cp1 = cp + 3;
- while (isdigit((u_char)*cp1))
- cp1++;
- if (cp1 != cp && *cp1 == ':' &&
- *(cp1 + 1) == ' ') {
- *cp1 = '\0';
- cp1 = cp1 + 2;
- cp2 = strdup(cp);
- bcopy(cp1, cp, strlen(cp1) + 1);
- strcat(cp, " ");
- strcat(cp, cp2);
- free(cp2);
- }
- }
-
- /*
- * Convert "name irqN" to "name N" if the former is
- * longer than the field width.
- */
- if ((cp1 = strstr(cp, "irq")) != NULL &&
- strlen(cp) > 10)
- bcopy(cp1 + 3, cp1, strlen(cp1 + 3) + 1);
-
- intrname[i] = cp;
- cp = nextcp;
- }
- nextintsrow = INTSROW + 2;
- allocinfo(&s);
- allocinfo(&s1);
- allocinfo(&s2);
- allocinfo(&z);
- }
- getinfo(&s2);
- copyinfo(&s2, &s1);
- return(1);
-}
-
-void
-fetchkre(void)
-{
- time_t now;
- struct tm *tp;
- static int d_first = -1;
-
- if (d_first < 0)
- d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
-
- time(&now);
- tp = localtime(&now);
- (void) strftime(buf, sizeof(buf),
- d_first ? "%e %b %R" : "%b %e %R", tp);
- getinfo(&s);
-}
-
-void
-labelkre(void)
-{
- int i, j;
-
- clear();
- mvprintw(STATROW, STATCOL + 6, "users Load");
- mvprintw(MEMROW, MEMCOL, "Mem:KB REAL VIRTUAL");
- mvprintw(MEMROW + 1, MEMCOL, " Tot Share Tot Share");
- mvprintw(MEMROW + 2, MEMCOL, "Act");
- mvprintw(MEMROW + 3, MEMCOL, "All");
-
- mvprintw(MEMROW + 1, MEMCOL + 41, "Free");
-
- mvprintw(PAGEROW, PAGECOL, " VN PAGER SWAP PAGER");
- mvprintw(PAGEROW + 1, PAGECOL, " in out in out");
- mvprintw(PAGEROW + 2, PAGECOL, "count");
- mvprintw(PAGEROW + 3, PAGECOL, "pages");
-
- mvprintw(INTSROW, INTSCOL + 1, "Interrupts");
- mvprintw(INTSROW + 1, INTSCOL + 6, "total");
-
- mvprintw(VMSTATROW, VMSTATCOL + 9, "cow");
- mvprintw(VMSTATROW + 1, VMSTATCOL + 9, "zfod");
- mvprintw(VMSTATROW + 2, VMSTATCOL + 9, "ozfod");
- mvprintw(VMSTATROW + 3, VMSTATCOL + 9 - 1, "%%ozfod");
- mvprintw(VMSTATROW + 4, VMSTATCOL + 9, "daefr");
- mvprintw(VMSTATROW + 5, VMSTATCOL + 9, "prcfr");
- mvprintw(VMSTATROW + 6, VMSTATCOL + 9, "totfr");
- mvprintw(VMSTATROW + 7, VMSTATCOL + 9, "react");
- mvprintw(VMSTATROW + 8, VMSTATCOL + 9, "pdwak");
- mvprintw(VMSTATROW + 9, VMSTATCOL + 9, "pdpgs");
- mvprintw(VMSTATROW + 10, VMSTATCOL + 9, "intrn");
- mvprintw(VMSTATROW + 11, VMSTATCOL + 9, "wire");
- mvprintw(VMSTATROW + 12, VMSTATCOL + 9, "act");
- mvprintw(VMSTATROW + 13, VMSTATCOL + 9, "inact");
- mvprintw(VMSTATROW + 14, VMSTATCOL + 9, "cache");
- mvprintw(VMSTATROW + 15, VMSTATCOL + 9, "free");
- if (LINES - 1 > VMSTATROW + 16)
- mvprintw(VMSTATROW + 16, VMSTATCOL + 9, "buf");
-
- mvprintw(GENSTATROW, GENSTATCOL, " Csw Trp Sys Int Sof Flt");
-
- mvprintw(GRAPHROW, GRAPHCOL,
- " . %%Sys . %%Intr . %%User . %%Nice . %%Idle");
- mvprintw(PROCSROW, PROCSCOL, "Proc:");
- mvprintw(PROCSROW + 1, PROCSCOL, " r p d s w");
- mvprintw(GRAPHROW + 1, GRAPHCOL,
- "| | | | | | | | | | |");
-
- mvprintw(VNSTATROW, VNSTATCOL + 8, "dtbuf");
- mvprintw(VNSTATROW + 1, VNSTATCOL + 8, "desvn");
- mvprintw(VNSTATROW + 2, VNSTATCOL + 8, "numvn");
- mvprintw(VNSTATROW + 3, VNSTATCOL + 8, "frevn");
-
- mvprintw(NAMEIROW, NAMEICOL, "Namei Name-cache Dir-cache");
- mvprintw(NAMEIROW + 1, NAMEICOL,
- " Calls hits %% hits %%");
- mvprintw(DISKROW, DISKCOL, "Disks");
- mvprintw(DISKROW + 1, DISKCOL, "KB/t");
- mvprintw(DISKROW + 2, DISKCOL, "tps");
- mvprintw(DISKROW + 3, DISKCOL, "MB/s");
- mvprintw(DISKROW + 4, DISKCOL, "%%busy");
- /*
- * For now, we don't support a fourth disk statistic. So there's
- * no point in providing a label for it. If someone can think of a
- * fourth useful disk statistic, there is room to add it.
- */
- /* mvprintw(DISKROW + 4, DISKCOL, " msps"); */
- j = 0;
- for (i = 0; i < num_devices && j < MAXDRIVES; i++)
- if (dev_select[i].selected) {
- char tmpstr[80];
- sprintf(tmpstr, "%s%d", dev_select[i].device_name,
- dev_select[i].unit_number);
- mvprintw(DISKROW, DISKCOL + 5 + 6 * j,
- " %5.5s", tmpstr);
- j++;
- }
-
- for (i = 0; i < nintr; i++) {
- if (intrloc[i] == 0)
- continue;
- mvprintw(intrloc[i], INTSCOL + 6, "%-10.10s", intrname[i]);
- }
-}
-
-#define X(fld) {t=s.fld[i]; s.fld[i]-=s1.fld[i]; if(state==TIME) s1.fld[i]=t;}
-#define Q(fld) {t=cur.fld[i]; cur.fld[i]-=last.fld[i]; if(state==TIME) last.fld[i]=t;}
-#define Y(fld) {t = s.fld; s.fld -= s1.fld; if(state == TIME) s1.fld = t;}
-#define Z(fld) {t = s.nchstats.fld; s.nchstats.fld -= s1.nchstats.fld; \
- if(state == TIME) s1.nchstats.fld = t;}
-#define PUTRATE(fld, l, c, w) \
-do { \
- Y(fld); \
- putint((int)((float)s.fld/etime + 0.5), l, c, w); \
-} while (0)
-#define MAXFAIL 5
-
-static char cpuchar[CPUSTATES] = { '=' , '+', '>', '-', ' ' };
-static char cpuorder[CPUSTATES] = { CP_SYS, CP_INTR, CP_USER, CP_NICE,
- CP_IDLE };
-
-void
-showkre(void)
-{
- float f1, f2;
- int psiz, inttotal;
- int i, l, lc;
- static int failcnt = 0;
-
- etime = 0;
- for(i = 0; i < CPUSTATES; i++) {
- X(time);
- Q(cp_time);
- etime += s.time[i];
- }
- if (etime < 5.0) { /* < 5 ticks - ignore this trash */
- if (failcnt++ >= MAXFAIL) {
- clear();
- mvprintw(2, 10, "The alternate system clock has died!");
- mvprintw(3, 10, "Reverting to ``pigs'' display.");
- move(CMDLINE, 0);
- refresh();
- failcnt = 0;
- sleep(5);
- command("pigs");
- }
- return;
- }
- failcnt = 0;
- etime /= hertz;
- etime /= ncpu;
- inttotal = 0;
- for (i = 0; i < nintr; i++) {
- if (s.intrcnt[i] == 0)
- continue;
- if (intrloc[i] == 0) {
- if (nextintsrow == LINES)
- continue;
- intrloc[i] = nextintsrow++;
- mvprintw(intrloc[i], INTSCOL + 6, "%-10.10s",
- intrname[i]);
- }
- X(intrcnt);
- l = (int)((float)s.intrcnt[i]/etime + 0.5);
- inttotal += l;
- putint(l, intrloc[i], INTSCOL, 5);
- }
- putint(inttotal, INTSROW + 1, INTSCOL, 5);
- Z(ncs_goodhits); Z(ncs_badhits); Z(ncs_miss);
- Z(ncs_long); Z(ncs_pass2); Z(ncs_2passes); Z(ncs_neghits);
- s.nchcount = nchtotal.ncs_goodhits + nchtotal.ncs_badhits +
- nchtotal.ncs_miss + nchtotal.ncs_long + nchtotal.ncs_neghits;
- if (state == TIME)
- s1.nchcount = s.nchcount;
-
- psiz = 0;
- f2 = 0.0;
- for (lc = 0; lc < CPUSTATES; lc++) {
- i = cpuorder[lc];
- f1 = cputime(i);
- f2 += f1;
- l = (int) ((f2 + 1.0) / 2.0) - psiz;
- putfloat(f1, GRAPHROW, GRAPHCOL + 10 * lc, 4, 1, 0);
- move(GRAPHROW + 2, psiz);
- psiz += l;
- while (l-- > 0)
- addch(cpuchar[lc]);
- }
-
- putint(ucount(), STATROW, STATCOL, 5);
- putfloat(avenrun[0], STATROW, STATCOL + 20, 5, 2, 0);
- putfloat(avenrun[1], STATROW, STATCOL + 26, 5, 2, 0);
- putfloat(avenrun[2], STATROW, STATCOL + 32, 5, 2, 0);
- mvaddstr(STATROW, STATCOL + 55, buf);
-#define pgtokb(pg) ((pg) * (s.v_page_size / 1024))
- putint(pgtokb(total.t_arm), MEMROW + 2, MEMCOL + 4, 7);
- putint(pgtokb(total.t_armshr), MEMROW + 2, MEMCOL + 12, 7);
- putint(pgtokb(total.t_avm), MEMROW + 2, MEMCOL + 20, 8);
- putint(pgtokb(total.t_avmshr), MEMROW + 2, MEMCOL + 29, 8);
- putint(pgtokb(total.t_rm), MEMROW + 3, MEMCOL + 4, 7);
- putint(pgtokb(total.t_rmshr), MEMROW + 3, MEMCOL + 12, 7);
- putint(pgtokb(total.t_vm), MEMROW + 3, MEMCOL + 20, 8);
- putint(pgtokb(total.t_vmshr), MEMROW + 3, MEMCOL + 29, 8);
- putint(pgtokb(total.t_free), MEMROW + 2, MEMCOL + 38, 7);
- putint(total.t_rq - 1, PROCSROW + 2, PROCSCOL, 3);
- putint(total.t_pw, PROCSROW + 2, PROCSCOL + 4, 3);
- putint(total.t_dw, PROCSROW + 2, PROCSCOL + 8, 3);
- putint(total.t_sl, PROCSROW + 2, PROCSCOL + 12, 3);
- putint(total.t_sw, PROCSROW + 2, PROCSCOL + 16, 3);
- PUTRATE(v_cow_faults, VMSTATROW, VMSTATCOL + 2, 8 - 2);
- PUTRATE(v_zfod, VMSTATROW + 1, VMSTATCOL + 2, 8 - 2);
- PUTRATE(v_ozfod, VMSTATROW + 2, VMSTATCOL, 8);
- putint(s.v_zfod != 0 ? (int)(s.v_ozfod * 100.0 / s.v_zfod) : 0,
- VMSTATROW + 3, VMSTATCOL + 1, 8 - 1);
- PUTRATE(v_dfree, VMSTATROW + 4, VMSTATCOL + 2, 8 - 2);
- PUTRATE(v_pfree, VMSTATROW + 5, VMSTATCOL + 2, 8 - 2);
- PUTRATE(v_tfree, VMSTATROW + 6, VMSTATCOL, 8);
- PUTRATE(v_reactivated, VMSTATROW + 7, VMSTATCOL, 8);
- PUTRATE(v_pdwakeups, VMSTATROW + 8, VMSTATCOL, 8);
- PUTRATE(v_pdpages, VMSTATROW + 9, VMSTATCOL, 8);
- PUTRATE(v_intrans, VMSTATROW + 10, VMSTATCOL, 8);
- putint(pgtokb(s.v_wire_count), VMSTATROW + 11, VMSTATCOL, 8);
- putint(pgtokb(s.v_active_count), VMSTATROW + 12, VMSTATCOL, 8);
- putint(pgtokb(s.v_inactive_count), VMSTATROW + 13, VMSTATCOL, 8);
- putint(pgtokb(s.v_cache_count), VMSTATROW + 14, VMSTATCOL, 8);
- putint(pgtokb(s.v_free_count), VMSTATROW + 15, VMSTATCOL, 8);
- if (LINES - 1 > VMSTATROW + 16)
- putint(s.bufspace / 1024, VMSTATROW + 16, VMSTATCOL, 8);
- PUTRATE(v_vnodein, PAGEROW + 2, PAGECOL + 6, 5);
- PUTRATE(v_vnodeout, PAGEROW + 2, PAGECOL + 12, 5);
- PUTRATE(v_swapin, PAGEROW + 2, PAGECOL + 19, 5);
- PUTRATE(v_swapout, PAGEROW + 2, PAGECOL + 25, 5);
- PUTRATE(v_vnodepgsin, PAGEROW + 3, PAGECOL + 6, 5);
- PUTRATE(v_vnodepgsout, PAGEROW + 3, PAGECOL + 12, 5);
- PUTRATE(v_swappgsin, PAGEROW + 3, PAGECOL + 19, 5);
- PUTRATE(v_swappgsout, PAGEROW + 3, PAGECOL + 25, 5);
- PUTRATE(v_swtch, GENSTATROW + 1, GENSTATCOL, 4);
- PUTRATE(v_trap, GENSTATROW + 1, GENSTATCOL + 5, 4);
- PUTRATE(v_syscall, GENSTATROW + 1, GENSTATCOL + 10, 4);
- PUTRATE(v_intr, GENSTATROW + 1, GENSTATCOL + 15, 4);
- PUTRATE(v_soft, GENSTATROW + 1, GENSTATCOL + 20, 4);
- PUTRATE(v_vm_faults, GENSTATROW + 1, GENSTATCOL + 25, 4);
- for (i = 0, lc = 0; i < num_devices && lc < MAXDRIVES; i++)
- if (dev_select[i].selected) {
- switch(state) {
- case TIME:
- dinfo(i, ++lc, &cur, &last);
- break;
- case RUN:
- dinfo(i, ++lc, &cur, &run);
- break;
- case BOOT:
- dinfo(i, ++lc, &cur, NULL);
- break;
- }
- }
- putint(s.numdirtybuffers, VNSTATROW, VNSTATCOL, 7);
- putint(s.desiredvnodes, VNSTATROW + 1, VNSTATCOL, 7);
- putint(s.numvnodes, VNSTATROW + 2, VNSTATCOL, 7);
- putint(s.freevnodes, VNSTATROW + 3, VNSTATCOL, 7);
- putint(s.nchcount, NAMEIROW + 2, NAMEICOL, 8);
- putint((nchtotal.ncs_goodhits + nchtotal.ncs_neghits),
- NAMEIROW + 2, NAMEICOL + 9, 7);
-#define nz(x) ((x) ? (x) : 1)
- putfloat((nchtotal.ncs_goodhits+nchtotal.ncs_neghits) *
- 100.0 / nz(s.nchcount),
- NAMEIROW + 2, NAMEICOL + 17, 3, 0, 1);
- putint(nchtotal.ncs_pass2, NAMEIROW + 2, NAMEICOL + 21, 7);
- putfloat(nchtotal.ncs_pass2 * 100.0 / nz(s.nchcount),
- NAMEIROW + 2, NAMEICOL + 29, 3, 0, 1);
-#undef nz
-}
-
-int
-cmdkre(const char *cmd, const char *args)
-{
- int retval;
-
- if (prefix(cmd, "run")) {
- retval = 1;
- copyinfo(&s2, &s1);
- switch (devstat_getdevs(NULL, &run)) {
- case -1:
- errx(1, "%s", devstat_errbuf);
- break;
- case 1:
- num_devices = run.dinfo->numdevs;
- generation = run.dinfo->generation;
- retval = dscmd("refresh", NULL, MAXDRIVES, &cur);
- if (retval == 2)
- labelkre();
- break;
- default:
- break;
- }
- state = RUN;
- return (retval);
- }
- if (prefix(cmd, "boot")) {
- state = BOOT;
- copyinfo(&z, &s1);
- return (1);
- }
- if (prefix(cmd, "time")) {
- state = TIME;
- return (1);
- }
- if (prefix(cmd, "zero")) {
- retval = 1;
- if (state == RUN) {
- getinfo(&s1);
- switch (devstat_getdevs(NULL, &run)) {
- case -1:
- errx(1, "%s", devstat_errbuf);
- break;
- case 1:
- num_devices = run.dinfo->numdevs;
- generation = run.dinfo->generation;
- retval = dscmd("refresh",NULL, MAXDRIVES, &cur);
- if (retval == 2)
- labelkre();
- break;
- default:
- break;
- }
- }
- return (retval);
- }
- retval = dscmd(cmd, args, MAXDRIVES, &cur);
-
- if (retval == 2)
- labelkre();
-
- return(retval);
-}
-
-/* calculate number of users on the system */
-static int
-ucount(void)
-{
- int nusers = 0;
-
- if (ut < 0)
- return (0);
- while (read(ut, &utmp, sizeof(utmp)))
- if (utmp.ut_name[0] != '\0')
- nusers++;
-
- lseek(ut, 0L, L_SET);
- return (nusers);
-}
-
-static float
-cputime(int indx)
-{
- double lt;
- int i;
-
- lt = 0;
- for (i = 0; i < CPUSTATES; i++)
- lt += s.time[i];
- if (lt == 0.0)
- lt = 1.0;
- return (s.time[indx] * 100.0 / lt);
-}
-
-static void
-putint(int n, int l, int lc, int w)
-{
- int snr;
- char b[128];
-
- move(l, lc);
-#ifdef DEBUG
- while (w-- > 0)
- addch('*');
- return;
-#endif
- if (n == 0) {
- while (w-- > 0)
- addch(' ');
- return;
- }
- snr = snprintf(b, sizeof(b), "%*d", w, n);
- if (snr != w)
- snr = snprintf(b, sizeof(b), "%*dk", w - 1, n / 1000);
- if (snr != w)
- snr = snprintf(b, sizeof(b), "%*dM", w - 1, n / 1000000);
- if (snr != w) {
- while (w-- > 0)
- addch('*');
- return;
- }
- addstr(b);
-}
-
-static void
-putfloat(double f, int l, int lc, int w, int d, int nz)
-{
- int snr;
- char b[128];
-
- move(l, lc);
-#ifdef DEBUG
- while (--w >= 0)
- addch('*');
- return;
-#endif
- if (nz && f == 0.0) {
- while (--w >= 0)
- addch(' ');
- return;
- }
- snr = snprintf(b, sizeof(b), "%*.*f", w, d, f);
- if (snr != w)
- snr = snprintf(b, sizeof(b), "%*.0f", w, f);
- if (snr != w) {
- while (--w >= 0)
- addch('*');
- return;
- }
- addstr(b);
-}
-
-static void
-putlongdouble(long double f, int l, int lc, int w, int d, int nz)
-{
- int snr;
- char b[128];
-
- move(l, lc);
-#ifdef DEBUG
- while (--w >= 0)
- addch('*');
- return;
-#endif
- if (nz && f == 0.0) {
- while (--w >= 0)
- addch(' ');
- return;
- }
- snr = snprintf(b, sizeof(b), "%*.*Lf", w, d, f);
- if (snr != w)
- snr = snprintf(b, sizeof(b), "%*.0Lf", w, f);
- if (snr != w) {
- while (--w >= 0)
- addch('*');
- return;
- }
- addstr(b);
-}
-
-static void
-getinfo(struct Info *ls)
-{
- struct devinfo *tmp_dinfo;
- size_t size;
- int mib[2];
-
- GETSYSCTL("kern.cp_time", ls->time);
- GETSYSCTL("kern.cp_time", cur.cp_time);
- GETSYSCTL("vm.stats.sys.v_swtch", ls->v_swtch);
- GETSYSCTL("vm.stats.sys.v_trap", ls->v_trap);
- GETSYSCTL("vm.stats.sys.v_syscall", ls->v_syscall);
- GETSYSCTL("vm.stats.sys.v_intr", ls->v_intr);
- GETSYSCTL("vm.stats.sys.v_soft", ls->v_soft);
- GETSYSCTL("vm.stats.vm.v_vm_faults", ls->v_vm_faults);
- GETSYSCTL("vm.stats.vm.v_cow_faults", ls->v_cow_faults);
- GETSYSCTL("vm.stats.vm.v_zfod", ls->v_zfod);
- GETSYSCTL("vm.stats.vm.v_ozfod", ls->v_ozfod);
- GETSYSCTL("vm.stats.vm.v_swapin", ls->v_swapin);
- GETSYSCTL("vm.stats.vm.v_swapout", ls->v_swapout);
- GETSYSCTL("vm.stats.vm.v_swappgsin", ls->v_swappgsin);
- GETSYSCTL("vm.stats.vm.v_swappgsout", ls->v_swappgsout);
- GETSYSCTL("vm.stats.vm.v_vnodein", ls->v_vnodein);
- GETSYSCTL("vm.stats.vm.v_vnodeout", ls->v_vnodeout);
- GETSYSCTL("vm.stats.vm.v_vnodepgsin", ls->v_vnodepgsin);
- GETSYSCTL("vm.stats.vm.v_vnodepgsout", ls->v_vnodepgsout);
- GETSYSCTL("vm.stats.vm.v_intrans", ls->v_intrans);
- GETSYSCTL("vm.stats.vm.v_reactivated", ls->v_reactivated);
- GETSYSCTL("vm.stats.vm.v_pdwakeups", ls->v_pdwakeups);
- GETSYSCTL("vm.stats.vm.v_pdpages", ls->v_pdpages);
- GETSYSCTL("vm.stats.vm.v_dfree", ls->v_dfree);
- GETSYSCTL("vm.stats.vm.v_pfree", ls->v_pfree);
- GETSYSCTL("vm.stats.vm.v_tfree", ls->v_tfree);
- GETSYSCTL("vm.stats.vm.v_page_size", ls->v_page_size);
- GETSYSCTL("vm.stats.vm.v_free_count", ls->v_free_count);
- GETSYSCTL("vm.stats.vm.v_wire_count", ls->v_wire_count);
- GETSYSCTL("vm.stats.vm.v_active_count", ls->v_active_count);
- GETSYSCTL("vm.stats.vm.v_inactive_count", ls->v_inactive_count);
- GETSYSCTL("vm.stats.vm.v_cache_count", ls->v_cache_count);
- GETSYSCTL("vfs.bufspace", ls->bufspace);
- GETSYSCTL("kern.maxvnodes", ls->desiredvnodes);
- GETSYSCTL("vfs.numvnodes", ls->numvnodes);
- GETSYSCTL("vfs.freevnodes", ls->freevnodes);
- GETSYSCTL("vfs.cache.nchstats", ls->nchstats);
- GETSYSCTL("vfs.numdirtybuffers", ls->numdirtybuffers);
- getsysctl("hw.intrcnt", ls->intrcnt, nintr * sizeof(u_long));
-
- size = sizeof(ls->Total);
- mib[0] = CTL_VM;
- mib[1] = VM_TOTAL;
- if (sysctl(mib, 2, &ls->Total, &size, NULL, 0) < 0) {
- error("Can't get kernel info: %s\n", strerror(errno));
- bzero(&ls->Total, sizeof(ls->Total));
- }
- size = sizeof(ncpu);
- if (sysctlbyname("hw.ncpu", &ncpu, &size, NULL, 0) < 0 ||
- size != sizeof(ncpu))
- ncpu = 1;
-
- tmp_dinfo = last.dinfo;
- last.dinfo = cur.dinfo;
- cur.dinfo = tmp_dinfo;
-
- last.snap_time = cur.snap_time;
- switch (devstat_getdevs(NULL, &cur)) {
- case -1:
- errx(1, "%s", devstat_errbuf);
- break;
- case 1:
- num_devices = cur.dinfo->numdevs;
- generation = cur.dinfo->generation;
- cmdkre("refresh", NULL);
- break;
- default:
- break;
- }
-}
-
-static void
-allocinfo(struct Info *ls)
-{
-
- ls->intrcnt = (long *) calloc(nintr, sizeof(long));
- if (ls->intrcnt == NULL)
- errx(2, "out of memory");
-}
-
-static void
-copyinfo(struct Info *from, struct Info *to)
-{
- long *intrcnt;
-
- /*
- * time, wds, seek, and xfer are malloc'd so we have to
- * save the pointers before the structure copy and then
- * copy by hand.
- */
- intrcnt = to->intrcnt;
- *to = *from;
-
- bcopy(from->intrcnt, to->intrcnt = intrcnt, nintr * sizeof (int));
-}
-
-static void
-dinfo(int dn, int lc, struct statinfo *now, struct statinfo *then)
-{
- long double transfers_per_second;
- long double kb_per_transfer, mb_per_second;
- long double elapsed_time, device_busy;
- int di;
-
- di = dev_select[dn].position;
-
- if (then != NULL) {
- /* Calculate relative to previous sample */
- elapsed_time = now->snap_time - then->snap_time;
- } else {
- /* Calculate relative to device creation */
- elapsed_time = now->snap_time - devstat_compute_etime(
- &now->dinfo->devices[di].creation_time, NULL);
- }
-
- if (devstat_compute_statistics(&now->dinfo->devices[di], then ?
- &then->dinfo->devices[di] : NULL, elapsed_time,
- DSM_KB_PER_TRANSFER, &kb_per_transfer,
- DSM_TRANSFERS_PER_SECOND, &transfers_per_second,
- DSM_MB_PER_SECOND, &mb_per_second,
- DSM_BUSY_PCT, &device_busy,
- DSM_NONE) != 0)
- errx(1, "%s", devstat_errbuf);
-
- lc = DISKCOL + lc * 6;
- putlongdouble(kb_per_transfer, DISKROW + 1, lc, 5, 2, 0);
- putlongdouble(transfers_per_second, DISKROW + 2, lc, 5, 0, 0);
- putlongdouble(mb_per_second, DISKROW + 3, lc, 5, 2, 0);
- putlongdouble(device_busy, DISKROW + 4, lc, 5, 0, 0);
-}
diff --git a/usr.bin/tabs/Makefile b/usr.bin/tabs/Makefile
deleted file mode 100644
index 4b5d40e..0000000
--- a/usr.bin/tabs/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# $FreeBSD$
-
-PROG= tabs
-DPADD= ${LIBTERMCAP}
-LDADD= -ltermcap
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/tabs/tabs.1 b/usr.bin/tabs/tabs.1
deleted file mode 100644
index 9075de5..0000000
--- a/usr.bin/tabs/tabs.1
+++ /dev/null
@@ -1,160 +0,0 @@
-.\" Copyright (c) 2002 Tim J. Robbins.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd May 20, 2002
-.Dt TABS 1
-.Os
-.Sh NAME
-.Nm tabs
-.Nd set terminal tabs
-.Sh SYNOPSIS
-.Nm
-.Op Fl Ar n | Fl a | a2 | c | c2 | c3 | f | p | s | u
-.Op Cm +m Ns Op Ar n
-.Op Fl T Ar type
-.Nm
-.Op Fl T Ar type
-.Op Cm + Ns Op Ar n
-.Ar n1 Ns Op Ns , Ns Ar n2 , Ns ...
-.Sh DESCRIPTION
-The
-.Nm
-utility displays a series of characters that clear the hardware terminal
-tab settings then initialises tab stops at specified positions, and
-optionally adjusts the margin.
-.Pp
-In the first synopsis form, the tab stops set depend on the command line
-options used, and may be one of the predefined formats or at regular
-intervals.
-.Pp
-In the second synopsis form, tab stops are set at positions
-.Ar n1 , n2 ,
-etc.
-If a position is preceded by a
-.Ql + ,
-it is relative to the previous position set.
-No more than 20 positions may be specified.
-.Pp
-If no tab stops are specified, the
-.Dq standard
-.Ux
-tab width of 8 is used.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl Ar n
-Set a tab stop every
-.Ar n
-columns.
-If
-.Ar n
-is 0, the tab stops are cleared but no new ones are set.
-.It Fl a
-Assembler format (columns 1, 10, 16, 36, 72).
-.It Fl a2
-Assembler format (columns 1, 10, 16, 40, 72).
-.It Fl c
-.Tn COBOL
-normal format (columns 1, 8, 12, 16, 20, 55)
-.It Fl c2
-.Tn COBOL
-compact format (columns 1, 6, 10, 14, 49)
-.It Fl c3
-.Tn COBOL
-compact format (columns 1, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46,
-50, 54, 58, 62, 67).
-.It Fl f
-.Tn FORTRAN
-format (columns 1, 7, 11, 15, 19, 23).
-.It Fl p
-.Tn PL/1
-format (columns 1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53,
-57, 61).
-.It Fl s
-.Tn SNOBOL
-format (columns 1, 10, 55).
-.It Fl u
-Assembler format (columns 1, 12, 20, 44).
-.It Xo
-.Cm +m Ns Op Ar n ,
-.Cm + Ns Op Ar n
-.Xc
-Set an
-.Ar n
-character left margin, or 10 if
-.Ar n
-is omitted.
-.It Fl T Ar type
-Output escape sequence for the terminal type
-.Ar type .
-.El
-.Sh ENVIRONMENT
-The
-.Ev LANG , LC_ALL , LC_CTYPE
-and
-.Ev TERM
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Pp
-The
-.Fl T
-option overrides the setting of the
-.Ev TERM
-environment variable.
-If neither
-.Ev TERM
-nor the
-.Fl T
-option are present,
-.Nm
-will fail.
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr expand 1 ,
-.Xr stty 1 ,
-.Xr tput 1 ,
-.Xr unexpand 1 ,
-.Xr termcap 5
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-.Sh HISTORY
-A
-.Nm
-utility appeared in PWB UNIX.
-This implementation was introduced in
-.Fx 5.0 .
-.Sh BUGS
-The current
-.Xr termcap 5
-database does not define the
-.Ql ML
-(set left soft margin) capability for any terminals.
diff --git a/usr.bin/tabs/tabs.c b/usr.bin/tabs/tabs.c
deleted file mode 100644
index d03a741..0000000
--- a/usr.bin/tabs/tabs.c
+++ /dev/null
@@ -1,237 +0,0 @@
-/*-
- * Copyright (c) 2002 Tim J. Robbins.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * tabs -- set terminal tabs
- *
- * This utility displays a series of characters that clears the terminal
- * hardware tab settings, then initialises them to specified values,
- * and optionally sets a soft margin.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/tty.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <term.h>
-#include <unistd.h>
-
-/* Maximum number of tab stops allowed in table. */
-#define NSTOPS 20
-
-#define NELEMS(a) (sizeof(a) / sizeof(a[0]))
-
-/* Predefined formats, taken from IEEE Std 1003.1-2001. */
-static const struct {
- const char *name; /* Format name used on cmd. line */
- long stops[NSTOPS]; /* Column positions */
-} formats[] = {
- { "a", { 1, 10, 16, 36, 72 } },
- { "a2", { 1, 10, 16, 40, 72 } },
- { "c", { 1, 8, 12, 16, 20, 55 } },
- { "c2", { 1, 6, 10, 14, 49 } },
- { "c3", { 1, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 54, 58,
- 62, 67 } },
- { "f", { 1, 7, 11, 15, 19, 23 } },
- { "p", { 1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 57,
- 61 } },
- { "s", { 1, 10, 55 } },
- { "u", { 1, 12, 20, 44 } }
-};
-
-static void gettabs(char *, long *, long *);
-static int ttywidth(void);
-static void usage(void);
-
-int
-main(int argc __unused, char *argv[])
-{
- long cols, i, inc, j, margin, nstops, stops[NSTOPS];
- const char *cr, *ct, *st, *ML;
- char area[1024], *ap, *arg, *end;
-
- setlocale(LC_ALL, "");
-
- inc = 8;
- margin = 0;
- nstops = -1;
- while ((arg = *++argv) != NULL && (*arg == '-' || *arg == '+')) {
- if (*arg == '+') {
- /* +m[n] or +[n] */
- if (*++arg == 'm')
- arg++;
- if (*arg != '\0') {
- errno = 0;
- margin = strtol(arg, &end, 10);
- if (errno != 0 || *end != '\0' || margin < 0)
- errx(1, "%s: invalid margin width",
- arg);
- } else
- margin = 10;
- } else if (isdigit(arg[1])) {
- /* -n */
- errno = 0;
- inc = strtol(arg + 1, &end, 10);
- if (errno != 0 || *end != '\0' || inc < 0)
- errx(1, "%s: invalid increment", arg + 1);
- } else if (arg[1] == 'T') {
- /* -Ttype or -T type */
- if (arg[2] != '\0')
- setenv("TERM", arg + 2, 1);
- else {
- if ((arg = *++argv) == NULL)
- usage();
- setenv("TERM", arg, 1);
- }
- } else if (arg[1] == '-') {
- arg = *++argv;
- break;
- } else {
- /* Predefined format */
- for (i = 0; i < (int)NELEMS(formats); i++)
- if (strcmp(formats[i].name, arg + 1) == 0)
- break;
- if (i == NELEMS(formats))
- usage();
- for (j = nstops = 0; j < NSTOPS &&
- formats[i].stops[j] != 0; j++)
- stops[nstops++] = formats[i].stops[j];
- }
- }
-
- if (arg != NULL) {
- if (nstops != -1)
- usage();
- gettabs(arg, stops, &nstops);
- }
-
- /* Initialise terminal, get the strings we need */
- setupterm(NULL, 1, NULL);
- ap = area;
- if ((ct = tgetstr("ct", &ap)) == NULL)
- errx(1, "terminal cannot clear tabs");
- if ((st = tgetstr("st", &ap)) == NULL)
- errx(1, "terminal cannot set tabs");
- if ((cr = tgetstr("cr", &ap)) == NULL)
- cr = "\r";
- ML = tgetstr("ML", &ap);
- cols = ttywidth();
-
- /* Clear all tabs. */
- putp(cr);
- putp(ct);
-
- /*
- * Set soft margin.
- * XXX Does this actually work?
- */
- if (ML != NULL) {
- printf("%*s", (int)margin, "");
- putp(ML);
- } else if (margin != 0)
- warnx("terminal cannot set left margin");
-
- /* Optionally output new tab stops. */
- if (nstops >= 0) {
- printf("%*s", (int)stops[0] - 1, "");
- putp(st);
- for (i = 1; i < nstops; i++) {
- printf("%*s", (int)(stops[i] - stops[i - 1]), "");
- putp(st);
- }
- } else if (inc > 0) {
- for (i = 0; i < cols / inc; i++) {
- putp(st);
- printf("%*s", (int)inc, "");
- }
- putp(st);
- }
- putp(cr);
-
- exit(0);
-}
-
-static void
-usage(void)
-{
-
- fprintf(stderr,
-"usage: tabs [-n|-a|-a2|-c|-c2|-c3|-f|-p|-s|-u] [+m[n]] [-T type]\n");
- fprintf(stderr,
-" tabs [-T type] [+[n]] n1,[n2,...]\n");
- exit(1);
-}
-
-static void
-gettabs(char *arg, long stops[], long *nstops)
-{
- char *tok, *end;
- long last, stop;
-
- for (last = *nstops = 0, tok = strtok(arg, ","); tok != NULL;
- tok = strtok(NULL, ",")) {
- if (*nstops >= NSTOPS)
- errx(1, "too many tab stops (limit %d)", NSTOPS);
- errno = 0;
- stop = strtol(tok, &end, 10);
- if (errno != 0 || *end != '\0' || stop <= 0)
- errx(1, "%s: invalid tab stop", tok);
- if (*tok == '+') {
- if (tok == arg)
- errx(1, "%s: first tab may not be relative",
- tok);
- stop += last;
- }
- if (last > stop)
- errx(1, "cannot go backwards");
- last = stops[(*nstops)++] = stop;
- }
-}
-
-static int
-ttywidth(void)
-{
- struct winsize ws;
- int width;
-
- if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) != -1)
- width = ws.ws_col;
- else if ((width = tgetnum("co")) == 0) {
- width = 80;
- warnx("cannot find terminal width; defaulted to %d", width);
- }
-
- return (width);
-}
diff --git a/usr.bin/tail/Makefile b/usr.bin/tail/Makefile
deleted file mode 100644
index c816693..0000000
--- a/usr.bin/tail/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# $FreeBSD$
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-
-PROG= tail
-SRCS= forward.c misc.c read.c reverse.c tail.c
-WARNS?= 4
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/tail/extern.h b/usr.bin/tail/extern.h
deleted file mode 100644
index d956680..0000000
--- a/usr.bin/tail/extern.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.1 (Berkeley) 6/6/93
- *
- * $FreeBSD$
- */
-
-#define WR(p, size) do { \
- if (write(STDOUT_FILENO, p, size) != (ssize_t)size) \
- oerr(); \
- } while(0)
-
-#define TAILMAPLEN (4<<20)
-
-struct mapinfo {
- off_t mapoff;
- off_t maxoff;
- size_t maplen;
- char *start;
- int fd;
-};
-
-struct file_info {
- FILE *fp;
- char *file_name;
- struct stat st;
-};
-
-typedef struct file_info file_info_t;
-
-enum STYLE { NOTSET = 0, FBYTES, FLINES, RBYTES, RLINES, REVERSE };
-
-void follow(file_info_t *, enum STYLE, off_t);
-void forward(FILE *, enum STYLE, off_t, struct stat *);
-void reverse(FILE *, enum STYLE, off_t, struct stat *);
-
-int bytes(FILE *, off_t);
-int lines(FILE *, off_t);
-
-void ierr(void);
-void oerr(void);
-int mapprint(struct mapinfo *, off_t, off_t);
-int maparound(struct mapinfo *, off_t);
-
-extern int Fflag, fflag, qflag, rflag, rval, no_files;
-extern const char *fname;
diff --git a/usr.bin/tail/forward.c b/usr.bin/tail/forward.c
deleted file mode 100644
index c79c438..0000000
--- a/usr.bin/tail/forward.c
+++ /dev/null
@@ -1,397 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Sze-Tyan Wang.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)forward.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <sys/param.h>
-#include <sys/mount.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/mman.h>
-#include <sys/event.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-static void rlines(FILE *, off_t, struct stat *);
-static void show(file_info_t *);
-static void set_events(file_info_t *files);
-
-/* defines for inner loop actions */
-#define USE_SLEEP 0
-#define USE_KQUEUE 1
-#define ADD_EVENTS 2
-
-struct kevent *ev;
-int action = USE_SLEEP;
-int kq;
-
-static const file_info_t *last;
-
-/*
- * forward -- display the file, from an offset, forward.
- *
- * There are eight separate cases for this -- regular and non-regular
- * files, by bytes or lines and from the beginning or end of the file.
- *
- * FBYTES byte offset from the beginning of the file
- * REG seek
- * NOREG read, counting bytes
- *
- * FLINES line offset from the beginning of the file
- * REG read, counting lines
- * NOREG read, counting lines
- *
- * RBYTES byte offset from the end of the file
- * REG seek
- * NOREG cyclically read characters into a wrap-around buffer
- *
- * RLINES
- * REG mmap the file and step back until reach the correct offset.
- * NOREG cyclically read lines into a wrap-around array of buffers
- */
-void
-forward(FILE *fp, enum STYLE style, off_t off, struct stat *sbp)
-{
- int ch;
-
- switch(style) {
- case FBYTES:
- if (off == 0)
- break;
- if (S_ISREG(sbp->st_mode)) {
- if (sbp->st_size < off)
- off = sbp->st_size;
- if (fseeko(fp, off, SEEK_SET) == -1) {
- ierr();
- return;
- }
- } else while (off--)
- if ((ch = getc(fp)) == EOF) {
- if (ferror(fp)) {
- ierr();
- return;
- }
- break;
- }
- break;
- case FLINES:
- if (off == 0)
- break;
- for (;;) {
- if ((ch = getc(fp)) == EOF) {
- if (ferror(fp)) {
- ierr();
- return;
- }
- break;
- }
- if (ch == '\n' && !--off)
- break;
- }
- break;
- case RBYTES:
- if (S_ISREG(sbp->st_mode)) {
- if (sbp->st_size >= off &&
- fseeko(fp, -off, SEEK_END) == -1) {
- ierr();
- return;
- }
- } else if (off == 0) {
- while (getc(fp) != EOF);
- if (ferror(fp)) {
- ierr();
- return;
- }
- } else
- if (bytes(fp, off))
- return;
- break;
- case RLINES:
- if (S_ISREG(sbp->st_mode))
- if (!off) {
- if (fseeko(fp, (off_t)0, SEEK_END) == -1) {
- ierr();
- return;
- }
- } else
- rlines(fp, off, sbp);
- else if (off == 0) {
- while (getc(fp) != EOF);
- if (ferror(fp)) {
- ierr();
- return;
- }
- } else
- if (lines(fp, off))
- return;
- break;
- default:
- break;
- }
-
- while ((ch = getc(fp)) != EOF)
- if (putchar(ch) == EOF)
- oerr();
- if (ferror(fp)) {
- ierr();
- return;
- }
- (void)fflush(stdout);
-}
-
-/*
- * rlines -- display the last offset lines of the file.
- */
-static void
-rlines(fp, off, sbp)
- FILE *fp;
- off_t off;
- struct stat *sbp;
-{
- struct mapinfo map;
- off_t curoff, size;
- int i;
-
- if (!(size = sbp->st_size))
- return;
- map.start = NULL;
- map.fd = fileno(fp);
- map.mapoff = map.maxoff = size;
-
- /*
- * Last char is special, ignore whether newline or not. Note that
- * size == 0 is dealt with above, and size == 1 sets curoff to -1.
- */
- curoff = size - 2;
- while (curoff >= 0) {
- if (curoff < map.mapoff && maparound(&map, curoff) != 0) {
- ierr();
- return;
- }
- for (i = curoff - map.mapoff; i >= 0; i--)
- if (map.start[i] == '\n' && --off == 0)
- break;
- /* `i' is either the map offset of a '\n', or -1. */
- curoff = map.mapoff + i;
- if (i >= 0)
- break;
- }
- curoff++;
- if (mapprint(&map, curoff, size - curoff) != 0) {
- ierr();
- exit(1);
- }
-
- /* Set the file pointer to reflect the length displayed. */
- if (fseeko(fp, sbp->st_size, SEEK_SET) == -1) {
- ierr();
- return;
- }
- if (map.start != NULL && munmap(map.start, map.maplen)) {
- ierr();
- return;
- }
-}
-
-static void
-show(file_info_t *file)
-{
- int ch;
-
- while ((ch = getc(file->fp)) != EOF) {
- if (last != file && no_files > 1) {
- if (!qflag)
- (void)printf("\n==> %s <==\n", file->file_name);
- last = file;
- }
- if (putchar(ch) == EOF)
- oerr();
- }
- (void)fflush(stdout);
- if (ferror(file->fp)) {
- file->fp = NULL;
- ierr();
- } else
- clearerr(file->fp);
-}
-
-static void
-set_events(file_info_t *files)
-{
- int i, n = 0;
- file_info_t *file;
- struct timespec ts;
- struct statfs sf;
-
- ts.tv_sec = 0;
- ts.tv_nsec = 0;
-
- action = USE_KQUEUE;
- for (i = 0, file = files; i < no_files; i++, file++) {
- if (! file->fp)
- continue;
-
- if (fstatfs(fileno(file->fp), &sf) == 0 &&
- (sf.f_flags & MNT_LOCAL) == 0) {
- action = USE_SLEEP;
- return;
- }
-
- if (Fflag && fileno(file->fp) != STDIN_FILENO) {
- EV_SET(&ev[n], fileno(file->fp), EVFILT_VNODE,
- EV_ADD | EV_ENABLE | EV_CLEAR,
- NOTE_DELETE | NOTE_RENAME, 0, 0);
- n++;
- }
- EV_SET(&ev[n], fileno(file->fp), EVFILT_READ,
- EV_ADD | EV_ENABLE | EV_CLEAR, 0, 0, 0);
- n++;
- }
-
- if (kevent(kq, ev, n, NULL, 0, &ts) < 0) {
- action = USE_SLEEP;
- }
-}
-
-/*
- * follow -- display the file, from an offset, forward.
- *
- */
-void
-follow(file_info_t *files, enum STYLE style, off_t off)
-{
- int active, i, n = -1;
- struct stat sb2;
- file_info_t *file;
- struct timespec ts;
-
- /* Position each of the files */
-
- file = files;
- active = 0;
- n = 0;
- for (i = 0; i < no_files; i++, file++) {
- if (file->fp) {
- active = 1;
- n++;
- if (no_files > 1 && !qflag)
- (void)printf("\n==> %s <==\n", file->file_name);
- forward(file->fp, style, off, &file->st);
- if (Fflag && fileno(file->fp) != STDIN_FILENO)
- n++;
- }
- }
- if (! active)
- return;
-
- last = --file;
-
- kq = kqueue();
- if (kq < 0)
- err(1, "kqueue");
- ev = malloc(n * sizeof(struct kevent));
- if (! ev)
- err(1, "Couldn't allocate memory for kevents.");
- set_events(files);
-
- for (;;) {
- for (i = 0, file = files; i < no_files; i++, file++) {
- if (! file->fp)
- continue;
- if (Fflag && file->fp && fileno(file->fp) != STDIN_FILENO) {
- if (stat(file->file_name, &sb2) == 0 &&
- (sb2.st_ino != file->st.st_ino ||
- sb2.st_dev != file->st.st_dev ||
- sb2.st_nlink == 0)) {
- show(file);
- file->fp = freopen(file->file_name, "r", file->fp);
- if (file->fp == NULL) {
- ierr();
- continue;
- } else {
- memcpy(&file->st, &sb2, sizeof(struct stat));
- set_events(files);
- }
- }
- }
- show(file);
- }
-
- switch (action) {
- case USE_KQUEUE:
- ts.tv_sec = 1;
- ts.tv_nsec = 0;
- /*
- * In the -F case we set a timeout to ensure that
- * we re-stat the file at least once every second.
- */
- n = kevent(kq, NULL, 0, ev, 1, Fflag ? &ts : NULL);
- if (n < 0)
- err(1, "kevent");
- if (n == 0) {
- /* timeout */
- break;
- } else if (ev->filter == EVFILT_READ && ev->data < 0) {
- /* file shrank, reposition to end */
- if (lseek(ev->ident, (off_t)0, SEEK_END) == -1) {
- ierr();
- continue;
- }
- }
- break;
-
- case USE_SLEEP:
- (void) usleep(250000);
- break;
- }
- }
-}
diff --git a/usr.bin/tail/misc.c b/usr.bin/tail/misc.c
deleted file mode 100644
index 584e3d1..0000000
--- a/usr.bin/tail/misc.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Sze-Tyan Wang.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/mman.h>
-
-#include <err.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-void
-ierr()
-{
- warn("%s", fname);
- rval = 1;
-}
-
-void
-oerr()
-{
- err(1, "stdout");
-}
-
-/*
- * Print `len' bytes from the file associated with `mip', starting at
- * absolute file offset `startoff'. May move map window.
- */
-int
-mapprint(struct mapinfo *mip, off_t startoff, off_t len)
-{
- int n;
-
- while (len > 0) {
- if (startoff < mip->mapoff || startoff >= mip->mapoff +
- (off_t)mip->maplen) {
- if (maparound(mip, startoff) != 0)
- return (1);
- }
- n = (mip->mapoff + mip->maplen) - startoff;
- if (n > len)
- n = len;
- WR(mip->start + (startoff - mip->mapoff), n);
- startoff += n;
- len -= n;
- }
- return (0);
-}
-
-/*
- * Move the map window so that it contains the byte at absolute file
- * offset `offset'. The start of the map window will be TAILMAPLEN
- * aligned.
- */
-int
-maparound(struct mapinfo *mip, off_t offset)
-{
-
- if (mip->start != NULL && munmap(mip->start, mip->maplen) != 0)
- return (1);
-
- mip->mapoff = offset & ~((off_t)TAILMAPLEN - 1);
- mip->maplen = TAILMAPLEN;
- if ((off_t)mip->maplen > mip->maxoff - mip->mapoff)
- mip->maplen = mip->maxoff - mip->mapoff;
- if (mip->maplen <= 0)
- abort();
- if ((mip->start = mmap(NULL, mip->maplen, PROT_READ, MAP_SHARED,
- mip->fd, mip->mapoff)) == MAP_FAILED)
- return (1);
-
- return (0);
-}
diff --git a/usr.bin/tail/read.c b/usr.bin/tail/read.c
deleted file mode 100644
index d290ed4..0000000
--- a/usr.bin/tail/read.c
+++ /dev/null
@@ -1,214 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Sze-Tyan Wang.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)read.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-/*
- * bytes -- read bytes to an offset from the end and display.
- *
- * This is the function that reads to a byte offset from the end of the input,
- * storing the data in a wrap-around buffer which is then displayed. If the
- * rflag is set, the data is displayed in lines in reverse order, and this
- * routine has the usual nastiness of trying to find the newlines. Otherwise,
- * it is displayed from the character closest to the beginning of the input to
- * the end.
- */
-int
-bytes(FILE *fp, off_t off)
-{
- int ch, len, tlen;
- char *ep, *p, *t;
- int wrap;
- char *sp;
-
- if ((sp = p = malloc(off)) == NULL)
- err(1, "malloc");
-
- for (wrap = 0, ep = p + off; (ch = getc(fp)) != EOF;) {
- *p = ch;
- if (++p == ep) {
- wrap = 1;
- p = sp;
- }
- }
- if (ferror(fp)) {
- ierr();
- free(sp);
- return 1;
- }
-
- if (rflag) {
- for (t = p - 1, len = 0; t >= sp; --t, ++len)
- if (*t == '\n' && len) {
- WR(t + 1, len);
- len = 0;
- }
- if (wrap) {
- tlen = len;
- for (t = ep - 1, len = 0; t >= p; --t, ++len)
- if (*t == '\n') {
- if (len) {
- WR(t + 1, len);
- len = 0;
- }
- if (tlen) {
- WR(sp, tlen);
- tlen = 0;
- }
- }
- if (len)
- WR(t + 1, len);
- if (tlen)
- WR(sp, tlen);
- }
- } else {
- if (wrap && (len = ep - p))
- WR(p, len);
- len = p - sp;
- if (len)
- WR(sp, len);
- }
-
- free(sp);
- return 0;
-}
-
-/*
- * lines -- read lines to an offset from the end and display.
- *
- * This is the function that reads to a line offset from the end of the input,
- * storing the data in an array of buffers which is then displayed. If the
- * rflag is set, the data is displayed in lines in reverse order, and this
- * routine has the usual nastiness of trying to find the newlines. Otherwise,
- * it is displayed from the line closest to the beginning of the input to
- * the end.
- */
-int
-lines(FILE *fp, off_t off)
-{
- struct {
- int blen;
- u_int len;
- char *l;
- } *llines;
- int ch, rc;
- char *p, *sp;
- int blen, cnt, recno, wrap;
-
- if ((llines = malloc(off * sizeof(*llines))) == NULL)
- err(1, "malloc");
- bzero(llines, off * sizeof(*llines));
- p = sp = NULL;
- blen = cnt = recno = wrap = 0;
- rc = 0;
-
- while ((ch = getc(fp)) != EOF) {
- if (++cnt > blen) {
- if ((sp = realloc(sp, blen += 1024)) == NULL)
- err(1, "realloc");
- p = sp + cnt - 1;
- }
- *p++ = ch;
- if (ch == '\n') {
- if ((int)llines[recno].blen < cnt) {
- llines[recno].blen = cnt + 256;
- if ((llines[recno].l = realloc(llines[recno].l,
- llines[recno].blen)) == NULL)
- err(1, "realloc");
- }
- bcopy(sp, llines[recno].l, llines[recno].len = cnt);
- cnt = 0;
- p = sp;
- if (++recno == off) {
- wrap = 1;
- recno = 0;
- }
- }
- }
- if (ferror(fp)) {
- ierr();
- rc = 1;
- goto done;
- }
- if (cnt) {
- llines[recno].l = sp;
- sp = NULL;
- llines[recno].len = cnt;
- if (++recno == off) {
- wrap = 1;
- recno = 0;
- }
- }
-
- if (rflag) {
- for (cnt = recno - 1; cnt >= 0; --cnt)
- WR(llines[cnt].l, llines[cnt].len);
- if (wrap)
- for (cnt = off - 1; cnt >= recno; --cnt)
- WR(llines[cnt].l, llines[cnt].len);
- } else {
- if (wrap)
- for (cnt = recno; cnt < off; ++cnt)
- WR(llines[cnt].l, llines[cnt].len);
- for (cnt = 0; cnt < recno; ++cnt)
- WR(llines[cnt].l, llines[cnt].len);
- }
-done:
- for (cnt = 0; cnt < off; cnt++)
- free(llines[cnt].l);
- free(sp);
- free(llines);
- return (rc);
-}
diff --git a/usr.bin/tail/reverse.c b/usr.bin/tail/reverse.c
deleted file mode 100644
index 462b392..0000000
--- a/usr.bin/tail/reverse.c
+++ /dev/null
@@ -1,288 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Sze-Tyan Wang.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)reverse.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/mman.h>
-
-#include <err.h>
-#include <errno.h>
-#include <limits.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-static void r_buf(FILE *);
-static void r_reg(FILE *, enum STYLE, off_t, struct stat *);
-
-/*
- * reverse -- display input in reverse order by line.
- *
- * There are six separate cases for this -- regular and non-regular
- * files by bytes, lines or the whole file.
- *
- * BYTES display N bytes
- * REG mmap the file and display the lines
- * NOREG cyclically read characters into a wrap-around buffer
- *
- * LINES display N lines
- * REG mmap the file and display the lines
- * NOREG cyclically read lines into a wrap-around array of buffers
- *
- * FILE display the entire file
- * REG mmap the file and display the lines
- * NOREG cyclically read input into a linked list of buffers
- */
-void
-reverse(FILE *fp, enum STYLE style, off_t off, struct stat *sbp)
-{
- if (style != REVERSE && off == 0)
- return;
-
- if (S_ISREG(sbp->st_mode))
- r_reg(fp, style, off, sbp);
- else
- switch(style) {
- case FBYTES:
- case RBYTES:
- bytes(fp, off);
- break;
- case FLINES:
- case RLINES:
- lines(fp, off);
- break;
- case REVERSE:
- r_buf(fp);
- break;
- default:
- break;
- }
-}
-
-/*
- * r_reg -- display a regular file in reverse order by line.
- */
-static void
-r_reg(FILE *fp, enum STYLE style, off_t off, struct stat *sbp)
-{
- struct mapinfo map;
- off_t curoff, size, lineend;
- int i;
-
- if (!(size = sbp->st_size))
- return;
-
- map.start = NULL;
- map.mapoff = map.maxoff = size;
- map.fd = fileno(fp);
-
- /*
- * Last char is special, ignore whether newline or not. Note that
- * size == 0 is dealt with above, and size == 1 sets curoff to -1.
- */
- curoff = size - 2;
- lineend = size;
- while (curoff >= 0) {
- if (curoff < map.mapoff ||
- curoff >= map.mapoff + (off_t)map.maplen) {
- if (maparound(&map, curoff) != 0) {
- ierr();
- return;
- }
- }
- for (i = curoff - map.mapoff; i >= 0; i--) {
- if (style == RBYTES && --off == 0)
- break;
- if (map.start[i] == '\n')
- break;
- }
- /* `i' is either the map offset of a '\n', or -1. */
- curoff = map.mapoff + i;
- if (i < 0)
- continue;
-
- /* Print the line and update offsets. */
- if (mapprint(&map, curoff + 1, lineend - curoff - 1) != 0) {
- ierr();
- return;
- }
- lineend = curoff + 1;
- curoff--;
-
- if (style == RLINES)
- off--;
-
- if (off == 0 && style != REVERSE) {
- /* Avoid printing anything below. */
- curoff = 0;
- break;
- }
- }
- if (curoff < 0 && mapprint(&map, 0, lineend) != 0) {
- ierr();
- return;
- }
- if (map.start != NULL && munmap(map.start, map.maplen))
- ierr();
-}
-
-typedef struct bf {
- struct bf *next;
- struct bf *prev;
- int len;
- char *l;
-} BF;
-
-/*
- * r_buf -- display a non-regular file in reverse order by line.
- *
- * This is the function that saves the entire input, storing the data in a
- * doubly linked list of buffers and then displays them in reverse order.
- * It has the usual nastiness of trying to find the newlines, as there's no
- * guarantee that a newline occurs anywhere in the file, let alone in any
- * particular buffer. If we run out of memory, input is discarded (and the
- * user warned).
- */
-static void
-r_buf(FILE *fp)
-{
- BF *mark, *tl, *tr;
- int ch, len, llen;
- char *p;
- off_t enomem;
-
- tl = NULL;
-#define BSZ (128 * 1024)
- for (mark = NULL, enomem = 0;;) {
- /*
- * Allocate a new block and link it into place in a doubly
- * linked list. If out of memory, toss the LRU block and
- * keep going.
- */
- if (enomem || (tl = malloc(sizeof(BF))) == NULL ||
- (tl->l = malloc(BSZ)) == NULL) {
- if (!mark)
- err(1, "malloc");
- tl = enomem ? tl->next : mark;
- enomem += tl->len;
- } else if (mark) {
- tl->next = mark;
- tl->prev = mark->prev;
- mark->prev->next = tl;
- mark->prev = tl;
- } else {
- mark = tl;
- mark->next = mark->prev = mark;
- }
-
- /* Fill the block with input data. */
- for (p = tl->l, len = 0;
- len < BSZ && (ch = getc(fp)) != EOF; ++len)
- *p++ = ch;
-
- if (ferror(fp)) {
- ierr();
- return;
- }
-
- /*
- * If no input data for this block and we tossed some data,
- * recover it.
- */
- if (!len && enomem) {
- enomem -= tl->len;
- tl = tl->prev;
- break;
- }
-
- tl->len = len;
- if (ch == EOF)
- break;
- }
-
- if (enomem) {
- warnx("warning: %jd bytes discarded", (intmax_t)enomem);
- rval = 1;
- }
-
- /*
- * Step through the blocks in the reverse order read. The last char
- * is special, ignore whether newline or not.
- */
- for (mark = tl;;) {
- for (p = tl->l + (len = tl->len) - 1, llen = 0; len--;
- --p, ++llen)
- if (*p == '\n') {
- if (llen) {
- WR(p + 1, llen);
- llen = 0;
- }
- if (tl == mark)
- continue;
- for (tr = tl->next; tr->len; tr = tr->next) {
- WR(tr->l, tr->len);
- tr->len = 0;
- if (tr == mark)
- break;
- }
- }
- tl->len = llen;
- if ((tl = tl->prev) == mark)
- break;
- }
- tl = tl->next;
- if (tl->len) {
- WR(tl->l, tl->len);
- tl->len = 0;
- }
- while ((tl = tl->next)->len) {
- WR(tl->l, tl->len);
- tl->len = 0;
- }
-}
diff --git a/usr.bin/tail/tail.1 b/usr.bin/tail/tail.1
deleted file mode 100644
index 251511a..0000000
--- a/usr.bin/tail/tail.1
+++ /dev/null
@@ -1,188 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)tail.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 29, 2006
-.Dt TAIL 1
-.Os
-.Sh NAME
-.Nm tail
-.Nd display the last part of a file
-.Sh SYNOPSIS
-.Nm
-.Op Fl F | f | r
-.Op Fl q
-.Oo
-.Fl b Ar number | Fl c Ar number | Fl n Ar number
-.Oc
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility displays the contents of
-.Ar file
-or, by default, its standard input, to the standard output.
-.Pp
-The display begins at a byte, line or 512-byte block location in the
-input.
-Numbers having a leading plus
-.Pq Ql +
-sign are relative to the beginning
-of the input, for example,
-.Dq Li "-c +2"
-starts the display at the second
-byte of the input.
-Numbers having a leading minus
-.Pq Ql -
-sign or no explicit sign are
-relative to the end of the input, for example,
-.Dq Li "-n 2"
-displays the last two lines of the input.
-The default starting location is
-.Dq Li "-n 10" ,
-or the last 10 lines of the input.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl b Ar number
-The location is
-.Ar number
-512-byte blocks.
-.It Fl c Ar number
-The location is
-.Ar number
-bytes.
-.It Fl f
-The
-.Fl f
-option causes
-.Nm
-to not stop when end of file is reached, but rather to wait for additional
-data to be appended to the input.
-The
-.Fl f
-option is ignored if the standard input is a pipe, but not if it is a FIFO.
-.It Fl F
-The
-.Fl F
-option implies the
-.Fl f
-option, but
-.Nm
-will also check to see if the file being followed has been renamed or rotated.
-The file is closed and reopened when
-.Nm
-detects that the filename being read from has a new inode number.
-The
-.Fl F
-option is ignored if reading from standard input rather than a file.
-.It Fl n Ar number
-The location is
-.Ar number
-lines.
-.It Fl q
-Suppresses printing of headers when multiple files are being examined.
-.It Fl r
-The
-.Fl r
-option causes the input to be displayed in reverse order, by line.
-Additionally, this option changes the meaning of the
-.Fl b , c
-and
-.Fl n
-options.
-When the
-.Fl r
-option is specified, these options specify the number of bytes, lines
-or 512-byte blocks to display, instead of the bytes, lines or blocks
-from the beginning or end of the input from which to begin the display.
-The default for the
-.Fl r
-option is to display all of the input.
-.El
-.Pp
-If more than a single file is specified, each file is preceded by a
-header consisting of the string
-.Dq Li "==> " Ns Ar XXX Ns Li " <=="
-where
-.Ar XXX
-is the name of the file unless
-.Fl q
-flag is specified.
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr cat 1 ,
-.Xr head 1 ,
-.Xr sed 1
-.Sh STANDARDS
-The
-.Nm
-utility is expected to be a superset of the
-.St -p1003.2-92
-specification.
-In particular, the
-.Fl F ,
-.Fl b
-and
-.Fl r
-options are extensions to that standard.
-.Pp
-The historic command line syntax of
-.Nm
-is supported by this implementation.
-The only difference between this implementation and historic versions
-of
-.Nm ,
-once the command line syntax translation has been done, is that the
-.Fl b ,
-.Fl c
-and
-.Fl n
-options modify the
-.Fl r
-option, i.e.,
-.Dq Li "-r -c 4"
-displays the last 4 characters of the last line
-of the input, while the historic tail (using the historic syntax
-.Dq Li -4cr )
-would ignore the
-.Fl c
-option and display the last 4 lines of the input.
-.Sh HISTORY
-A
-.Nm
-command appeared in PWB UNIX.
diff --git a/usr.bin/tail/tail.c b/usr.bin/tail/tail.c
deleted file mode 100644
index d2f9df7..0000000
--- a/usr.bin/tail/tail.c
+++ /dev/null
@@ -1,339 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Sze-Tyan Wang.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1991, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "@(#)tail.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-int Fflag, fflag, qflag, rflag, rval, no_files;
-const char *fname;
-
-file_info_t *files;
-
-static void obsolete(char **);
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- struct stat sb;
- FILE *fp;
- off_t off;
- enum STYLE style;
- int i, ch, first;
- file_info_t *file;
- char *p;
-
- /*
- * Tail's options are weird. First, -n10 is the same as -n-10, not
- * -n+10. Second, the number options are 1 based and not offsets,
- * so -n+1 is the first line, and -c-1 is the last byte. Third, the
- * number options for the -r option specify the number of things that
- * get displayed, not the starting point in the file. The one major
- * incompatibility in this version as compared to historical versions
- * is that the 'r' option couldn't be modified by the -lbc options,
- * i.e. it was always done in lines. This version treats -rc as a
- * number of characters in reverse order. Finally, the default for
- * -r is the entire file, not 10 lines.
- */
-#define ARG(units, forward, backward) { \
- if (style) \
- usage(); \
- off = strtoll(optarg, &p, 10) * (units); \
- if (*p) \
- errx(1, "illegal offset -- %s", optarg); \
- switch(optarg[0]) { \
- case '+': \
- if (off) \
- off -= (units); \
- style = (forward); \
- break; \
- case '-': \
- off = -off; \
- /* FALLTHROUGH */ \
- default: \
- style = (backward); \
- break; \
- } \
-}
-
- obsolete(argv);
- style = NOTSET;
- off = 0;
- while ((ch = getopt(argc, argv, "Fb:c:fn:qr")) != -1)
- switch(ch) {
- case 'F': /* -F is superset of (and implies) -f */
- Fflag = fflag = 1;
- break;
- case 'b':
- ARG(512, FBYTES, RBYTES);
- break;
- case 'c':
- ARG(1, FBYTES, RBYTES);
- break;
- case 'f':
- fflag = 1;
- break;
- case 'n':
- ARG(1, FLINES, RLINES);
- break;
- case 'q':
- qflag = 1;
- break;
- case 'r':
- rflag = 1;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- no_files = argc ? argc : 1;
-
- /*
- * If displaying in reverse, don't permit follow option, and convert
- * style values.
- */
- if (rflag) {
- if (fflag)
- usage();
- if (style == FBYTES)
- style = RBYTES;
- else if (style == FLINES)
- style = RLINES;
- }
-
- /*
- * If style not specified, the default is the whole file for -r, and
- * the last 10 lines if not -r.
- */
- if (style == NOTSET) {
- if (rflag) {
- off = 0;
- style = REVERSE;
- } else {
- off = 10;
- style = RLINES;
- }
- }
-
- if (*argv && fflag) {
- files = (struct file_info *) malloc(no_files * sizeof(struct file_info));
- if (! files)
- err(1, "Couldn't malloc space for file descriptors.");
-
- for (file = files; (fname = *argv++); file++) {
- file->file_name = malloc(strlen(fname)+1);
- if (! file->file_name)
- errx(1, "Couldn't malloc space for file name.");
- strncpy(file->file_name, fname, strlen(fname)+1);
- if ((file->fp = fopen(file->file_name, "r")) == NULL ||
- fstat(fileno(file->fp), &file->st)) {
- file->fp = NULL;
- ierr();
- continue;
- }
- }
- follow(files, style, off);
- for (i = 0, file = files; i < no_files; i++, file++) {
- free(file->file_name);
- }
- free(files);
- } else if (*argv) {
- for (first = 1; (fname = *argv++);) {
- if ((fp = fopen(fname, "r")) == NULL ||
- fstat(fileno(fp), &sb)) {
- ierr();
- continue;
- }
- if (argc > 1 && !qflag) {
- (void)printf("%s==> %s <==\n",
- first ? "" : "\n", fname);
- first = 0;
- (void)fflush(stdout);
- }
-
- if (rflag)
- reverse(fp, style, off, &sb);
- else
- forward(fp, style, off, &sb);
- }
- } else {
- fname = "stdin";
-
- if (fstat(fileno(stdin), &sb)) {
- ierr();
- exit(1);
- }
-
- /*
- * Determine if input is a pipe. 4.4BSD will set the SOCKET
- * bit in the st_mode field for pipes. Fix this then.
- */
- if (lseek(fileno(stdin), (off_t)0, SEEK_CUR) == -1 &&
- errno == ESPIPE) {
- errno = 0;
- fflag = 0; /* POSIX.2 requires this. */
- }
-
- if (rflag)
- reverse(stdin, style, off, &sb);
- else
- forward(stdin, style, off, &sb);
- }
- exit(rval);
-}
-
-/*
- * Convert the obsolete argument form into something that getopt can handle.
- * This means that anything of the form [+-][0-9][0-9]*[lbc][Ffr] that isn't
- * the option argument for a -b, -c or -n option gets converted.
- */
-static void
-obsolete(char *argv[])
-{
- char *ap, *p, *t;
- size_t len;
- char *start;
-
- while ((ap = *++argv)) {
- /* Return if "--" or not an option of any form. */
- if (ap[0] != '-') {
- if (ap[0] != '+')
- return;
- } else if (ap[1] == '-')
- return;
-
- switch(*++ap) {
- /* Old-style option. */
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
-
- /* Malloc space for dash, new option and argument. */
- len = strlen(*argv);
- if ((start = p = malloc(len + 3)) == NULL)
- err(1, "malloc");
- *p++ = '-';
-
- /*
- * Go to the end of the option argument. Save off any
- * trailing options (-3lf) and translate any trailing
- * output style characters.
- */
- t = *argv + len - 1;
- if (*t == 'F' || *t == 'f' || *t == 'r') {
- *p++ = *t;
- *t-- = '\0';
- }
- switch(*t) {
- case 'b':
- *p++ = 'b';
- *t = '\0';
- break;
- case 'c':
- *p++ = 'c';
- *t = '\0';
- break;
- case 'l':
- *t = '\0';
- /* FALLTHROUGH */
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- *p++ = 'n';
- break;
- default:
- errx(1, "illegal option -- %s", *argv);
- }
- *p++ = *argv[0];
- (void)strcpy(p, ap);
- *argv = start;
- continue;
-
- /*
- * Options w/ arguments, skip the argument and continue
- * with the next option.
- */
- case 'b':
- case 'c':
- case 'n':
- if (!ap[1])
- ++argv;
- /* FALLTHROUGH */
- /* Options w/o arguments, continue with the next option. */
- case 'F':
- case 'f':
- case 'r':
- continue;
-
- /* Illegal option, return and let getopt handle it. */
- default:
- return;
- }
- }
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr,
- "usage: tail [-F | -f | -r] [-q] [-b # | -c # | -n #]"
- " [file ...]\n");
- exit(1);
-}
diff --git a/usr.bin/talk/Makefile b/usr.bin/talk/Makefile
deleted file mode 100644
index 94795d7..0000000
--- a/usr.bin/talk/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= talk
-SRCS= ctl.c ctl_transact.c display.c get_addrs.c get_iface.c get_names.c \
- init_disp.c invite.c io.c look_up.c msgs.c talk.c
-DPADD= ${LIBCURSES}
-LDADD= -lcurses
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/talk/ctl.c b/usr.bin/talk/ctl.c
deleted file mode 100644
index aaaa477..0000000
--- a/usr.bin/talk/ctl.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)ctl.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-/*
- * This file handles haggling with the various talk daemons to
- * get a socket to talk to. sockt is opened and connected in
- * the progress
- */
-
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <string.h>
-
-#include "talk.h"
-
-struct sockaddr_in daemon_addr = { .sin_len = sizeof(daemon_addr), .sin_family = AF_INET };
-struct sockaddr_in ctl_addr = { .sin_len = sizeof(ctl_addr), .sin_family = AF_INET };
-struct sockaddr_in my_addr = { .sin_len = sizeof(my_addr), .sin_family = AF_INET };
-
- /* inet addresses of the two machines */
-struct in_addr my_machine_addr;
-struct in_addr his_machine_addr;
-
-u_short daemon_port; /* port number of the talk daemon */
-
-int ctl_sockt;
-int sockt;
-int invitation_waiting = 0;
-
-CTL_MSG msg;
-
-void
-open_sockt(void)
-{
- socklen_t length;
-
- (void)memset(&my_addr, 0, sizeof(my_addr));
- my_addr.sin_family = AF_INET;
- my_addr.sin_len = sizeof(my_addr);
- my_addr.sin_addr = my_machine_addr;
- my_addr.sin_port = 0;
- sockt = socket(AF_INET, SOCK_STREAM, 0);
- if (sockt == -1)
- p_error("Bad socket");
- if (bind(sockt, (struct sockaddr *)&my_addr, sizeof(my_addr)) != 0)
- p_error("Binding local socket");
- length = sizeof(my_addr);
- if (getsockname(sockt, (struct sockaddr *)&my_addr, &length) == -1)
- p_error("Bad address for socket");
-}
-
-/* open the ctl socket */
-void
-open_ctl(void)
-{
- socklen_t length;
-
- (void)memset(&ctl_addr, 0, sizeof(ctl_addr));
- ctl_addr.sin_family = AF_INET;
- ctl_addr.sin_len = sizeof(my_addr);
- ctl_addr.sin_port = 0;
- ctl_addr.sin_addr = my_machine_addr;
- ctl_sockt = socket(AF_INET, SOCK_DGRAM, 0);
- if (ctl_sockt == -1)
- p_error("Bad socket");
- if (bind(ctl_sockt,
- (struct sockaddr *)&ctl_addr, sizeof(ctl_addr)) != 0)
- p_error("Couldn't bind to control socket");
- length = sizeof(ctl_addr);
- if (getsockname(ctl_sockt,
- (struct sockaddr *)&ctl_addr, &length) == -1)
- p_error("Bad address for ctl socket");
-}
-
-/* print_addr is a debug print routine */
-void
-print_addr(struct sockaddr_in addr)
-{
- int i;
-
- printf("addr = %lx, port = %o, family = %o zero = ",
- (u_long)addr.sin_addr.s_addr, addr.sin_port, addr.sin_family);
- for (i = 0; i<8;i++)
- printf("%o ", (int)addr.sin_zero[i]);
- putchar('\n');
-}
diff --git a/usr.bin/talk/ctl_transact.c b/usr.bin/talk/ctl_transact.c
deleted file mode 100644
index 9c8665d..0000000
--- a/usr.bin/talk/ctl_transact.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)ctl_transact.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <arpa/inet.h>
-
-#include <errno.h>
-#include <string.h>
-
-#include "talk.h"
-#include "talk_ctl.h"
-
-#define CTL_WAIT 2 /* time to wait for a response, in seconds */
-
-/*
- * SOCKDGRAM is unreliable, so we must repeat messages if we have
- * not recieved an acknowledgement within a reasonable amount
- * of time
- */
-void
-ctl_transact(struct in_addr target, CTL_MSG lmsg, int type, CTL_RESPONSE *rp)
-{
- fd_set read_mask, ctl_mask;
- int nready = 0, cc;
- struct timeval wait;
-
- lmsg.type = type;
- daemon_addr.sin_addr = target;
- daemon_addr.sin_port = daemon_port;
- FD_ZERO(&ctl_mask);
- FD_SET(ctl_sockt, &ctl_mask);
-
- /*
- * Keep sending the message until a response of
- * the proper type is obtained.
- */
- do {
- wait.tv_sec = CTL_WAIT;
- wait.tv_usec = 0;
- /* resend message until a response is obtained */
- do {
- cc = sendto(ctl_sockt, (char *)&lmsg, sizeof (lmsg), 0,
- (struct sockaddr *)&daemon_addr,
- sizeof (daemon_addr));
- if (cc != sizeof (lmsg)) {
- if (errno == EINTR)
- continue;
- p_error("Error on write to talk daemon");
- }
- read_mask = ctl_mask;
- nready = select(32, &read_mask, 0, 0, &wait);
- if (nready < 0) {
- if (errno == EINTR)
- continue;
- p_error("Error waiting for daemon response");
- }
- } while (nready == 0);
- /*
- * Keep reading while there are queued messages
- * (this is not necessary, it just saves extra
- * request/acknowledgements being sent)
- */
- do {
- cc = recv(ctl_sockt, (char *)rp, sizeof (*rp), 0);
- if (cc < 0) {
- if (errno == EINTR)
- continue;
- p_error("Error on read from talk daemon");
- }
- read_mask = ctl_mask;
- /* an immediate poll */
- timerclear(&wait);
- nready = select(32, &read_mask, 0, 0, &wait);
- } while (nready > 0 && (rp->vers != TALK_VERSION ||
- rp->type != type));
- } while (rp->vers != TALK_VERSION || rp->type != type);
- rp->id_num = ntohl(rp->id_num);
- rp->addr.sa_family = ntohs(rp->addr.sa_family);
-}
diff --git a/usr.bin/talk/display.c b/usr.bin/talk/display.c
deleted file mode 100644
index f565354..0000000
--- a/usr.bin/talk/display.c
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)display.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-/*
- * The window 'manager', initializes curses and handles the actual
- * displaying of text
- */
-#include <ctype.h>
-
-#include "talk.h"
-
-xwin_t my_win;
-xwin_t his_win;
-WINDOW *line_win;
-
-int curses_initialized = 0;
-
-/*
- * max HAS to be a function, it is called with
- * an argument of the form --foo at least once.
- */
-int
-max(int a, int b)
-{
-
- return (a > b ? a : b);
-}
-
-/*
- * Display some text on somebody's window, processing some control
- * characters while we are at it.
- */
-void
-display(xwin_t *win, char *text, int size)
-{
- int i;
- char cch;
-
- for (i = 0; i < size; i++) {
- if (*text == '\n' || *text == '\r') {
- waddch(win->x_win, '\n');
- getyx(win->x_win, win->x_line, win->x_col);
- text++;
- continue;
- }
- if (*text == 004 && win == &my_win) {
- /* control-D clears the screen */
- werase(my_win.x_win);
- getyx(my_win.x_win, my_win.x_line, my_win.x_col);
- wrefresh(my_win.x_win);
- werase(his_win.x_win);
- getyx(his_win.x_win, his_win.x_line, his_win.x_col);
- wrefresh(his_win.x_win);
- text++;
- continue;
- }
-
- /* erase character */
- if ( *text == win->cerase
- || *text == 010 /* BS */
- || *text == 0177 /* DEL */
- ) {
- wmove(win->x_win, win->x_line, max(--win->x_col, 0));
- getyx(win->x_win, win->x_line, win->x_col);
- waddch(win->x_win, ' ');
- wmove(win->x_win, win->x_line, win->x_col);
- getyx(win->x_win, win->x_line, win->x_col);
- text++;
- continue;
- }
- /*
- * On word erase search backwards until we find
- * the beginning of a word or the beginning of
- * the line.
- */
- if ( *text == win->werase
- || *text == 027 /* ^W */
- ) {
- int endcol, xcol, ii, c;
-
- endcol = win->x_col;
- xcol = endcol - 1;
- while (xcol >= 0) {
- c = readwin(win->x_win, win->x_line, xcol);
- if (c != ' ')
- break;
- xcol--;
- }
- while (xcol >= 0) {
- c = readwin(win->x_win, win->x_line, xcol);
- if (c == ' ')
- break;
- xcol--;
- }
- wmove(win->x_win, win->x_line, xcol + 1);
- for (ii = xcol + 1; ii < endcol; ii++)
- waddch(win->x_win, ' ');
- wmove(win->x_win, win->x_line, xcol + 1);
- getyx(win->x_win, win->x_line, win->x_col);
- text++;
- continue;
- }
- /* line kill */
- if ( *text == win->kill
- || *text == 025 /* ^U */
- ) {
- wmove(win->x_win, win->x_line, 0);
- wclrtoeol(win->x_win);
- getyx(win->x_win, win->x_line, win->x_col);
- text++;
- continue;
- }
- if (*text == '\f') {
- if (win == &my_win)
- wrefresh(curscr);
- text++;
- continue;
- }
- if (*text == '\7') {
- write(STDOUT_FILENO, text, 1);
- text++;
- continue;
- }
- if (!isprint((unsigned char)*text) && *text != '\t') {
- waddch(win->x_win, '^');
- getyx(win->x_win, win->x_line, win->x_col);
- cch = (*text & 63) + 64;
- waddch(win->x_win, cch);
- } else
- waddch(win->x_win, (unsigned char)*text);
- getyx(win->x_win, win->x_line, win->x_col);
- text++;
- }
- wrefresh(win->x_win);
-}
-
-/*
- * Read the character at the indicated position in win
- */
-int
-readwin(WINDOW *win, int line, int col)
-{
- int oldline, oldcol;
- int c;
-
- getyx(win, oldline, oldcol);
- wmove(win, line, col);
- c = winch(win);
- wmove(win, oldline, oldcol);
- return (c);
-}
diff --git a/usr.bin/talk/get_addrs.c b/usr.bin/talk/get_addrs.c
deleted file mode 100644
index 2923021..0000000
--- a/usr.bin/talk/get_addrs.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)get_addrs.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <err.h>
-#include <netdb.h>
-#include <string.h>
-
-#include "talk.h"
-#include "talk_ctl.h"
-
-void
-get_addrs(const char *my_machine_name __unused, const char *his_machine_name)
-{
- struct hostent *hp;
- struct servent *sp;
-
- msg.pid = htonl(getpid());
-
- hp = gethostbyname(his_machine_name);
- if (hp == NULL)
- errx(1, "%s: %s", his_machine_name, hstrerror(h_errno));
- bcopy(hp->h_addr, (char *) &his_machine_addr, hp->h_length);
- if (get_iface(&his_machine_addr, &my_machine_addr) == -1)
- err(1, "failed to find my interface address");
- /* find the server's port */
- sp = getservbyname("ntalk", "udp");
- if (sp == 0)
- errx(1, "ntalk/udp: service is not registered");
- daemon_port = sp->s_port;
-}
diff --git a/usr.bin/talk/get_iface.c b/usr.bin/talk/get_iface.c
deleted file mode 100644
index ebf08bd..0000000
--- a/usr.bin/talk/get_iface.c
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright 1994, 1995 Massachusetts Institute of Technology
- *
- * Permission to use, copy, modify, and distribute this software and
- * its documentation for any purpose and without fee is hereby
- * granted, provided that both the above copyright notice and this
- * permission notice appear in all copies, that both the above
- * copyright notice and this permission notice appear in all
- * supporting documentation, and that the name of M.I.T. not be used
- * in advertising or publicity pertaining to distribution of the
- * software without specific, written prior permission. M.I.T. makes
- * no representations about the suitability of this software for any
- * purpose. It is provided "as is" without express or implied
- * warranty.
- *
- * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS
- * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
- * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-/*
- * From:
- * Id: find_interface.c,v 1.1 1995/08/14 16:08:39 wollman Exp
- */
-
-#include <errno.h>
-#include <string.h>
-
-#include "talk.h"
-
-/*
- * Try to find the interface address that is used to route an IP
- * packet to a remote peer.
- */
-
-int
-get_iface(struct in_addr *dst, struct in_addr *iface)
-{
- static struct sockaddr_in local;
- struct sockaddr_in remote;
- socklen_t namelen;
- int s, rv;
-
- memcpy(&remote.sin_addr, dst, sizeof remote.sin_addr);
- remote.sin_port = htons(60000);
- remote.sin_family = AF_INET;
- remote.sin_len = sizeof remote;
-
- local.sin_addr.s_addr = htonl(INADDR_ANY);
- local.sin_port = htons(60000);
- local.sin_family = AF_INET;
- local.sin_len = sizeof local;
-
- s = socket(PF_INET, SOCK_DGRAM, 0);
- if (s < 0)
- return -1;
-
- do {
- rv = bind(s, (struct sockaddr *)&local, sizeof local);
- local.sin_port = htons(ntohs(local.sin_port) + 1);
- } while(rv < 0 && errno == EADDRINUSE);
-
- if (rv < 0) {
- close(s);
- return -1;
- }
-
- do {
- rv = connect(s, (struct sockaddr *)&remote, sizeof remote);
- remote.sin_port = htons(ntohs(remote.sin_port) + 1);
- } while(rv < 0 && errno == EADDRINUSE);
-
- if (rv < 0) {
- close(s);
- return -1;
- }
-
- namelen = sizeof local;
- rv = getsockname(s, (struct sockaddr *)&local, &namelen);
- close(s);
- if (rv < 0)
- return -1;
-
- memcpy(iface, &local.sin_addr, sizeof local.sin_addr);
- return 0;
-}
diff --git a/usr.bin/talk/get_names.c b/usr.bin/talk/get_names.c
deleted file mode 100644
index 25f4673..0000000
--- a/usr.bin/talk/get_names.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)get_names.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <sys/param.h>
-
-#include <err.h>
-#include <pwd.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "talk.h"
-
-extern CTL_MSG msg;
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: talk person [ttyname]\n");
- exit(1);
-}
-
-/*
- * Determine the local and remote user, tty, and machines
- */
-void
-get_names(int argc, char *argv[])
-{
- char hostname[MAXHOSTNAMELEN];
- char *his_name, *my_name;
- const char *my_machine_name, *his_machine_name;
- const char *his_tty;
- char *cp;
-
- if (argc < 2 )
- usage();
- if (!isatty(0))
- errx(1, "standard input must be a tty, not a pipe or a file");
- if ((my_name = getlogin()) == NULL) {
- struct passwd *pw;
-
- if ((pw = getpwuid(getuid())) == NULL)
- errx(1, "you don't exist. Go away");
- my_name = pw->pw_name;
- }
- gethostname(hostname, sizeof (hostname));
- my_machine_name = hostname;
- /* check for, and strip out, the machine name of the target */
- for (cp = argv[1]; *cp && !index("@:!", *cp); cp++)
- ;
- if (*cp == '\0') {
- /* this is a local to local talk */
- his_name = argv[1];
- my_machine_name = his_machine_name = "localhost";
- } else {
- if (*cp++ == '@') {
- /* user@host */
- his_name = argv[1];
- his_machine_name = cp;
- } else {
- /* host!user or host:user */
- his_name = cp;
- his_machine_name = argv[1];
- }
- *--cp = '\0';
- }
- if (argc > 2)
- his_tty = argv[2]; /* tty name is arg 2 */
- else
- his_tty = "";
- get_addrs(my_machine_name, his_machine_name);
- /*
- * Initialize the message template.
- */
- msg.vers = TALK_VERSION;
- msg.addr.sa_family = htons(AF_INET);
- msg.ctl_addr.sa_family = htons(AF_INET);
- msg.id_num = htonl(0);
- strncpy(msg.l_name, my_name, NAME_SIZE);
- msg.l_name[NAME_SIZE - 1] = '\0';
- strncpy(msg.r_name, his_name, NAME_SIZE);
- msg.r_name[NAME_SIZE - 1] = '\0';
- strncpy(msg.r_tty, his_tty, TTY_SIZE);
- msg.r_tty[TTY_SIZE - 1] = '\0';
-}
diff --git a/usr.bin/talk/init_disp.c b/usr.bin/talk/init_disp.c
deleted file mode 100644
index 4d34cf4..0000000
--- a/usr.bin/talk/init_disp.c
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)init_disp.c 8.2 (Berkeley) 2/16/94";
-#endif
-
-/*
- * Initialization code for the display package,
- * as well as the signal handling routines.
- */
-
-#include <sys/stat.h>
-
-#include <err.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <termios.h>
-
-#include "talk.h"
-
-extern volatile sig_atomic_t gotwinch;
-
-/*
- * Make sure the callee can write to the screen
- */
-void
-check_writeable(void)
-{
- char *tty;
- struct stat sb;
-
- if ((tty = ttyname(STDERR_FILENO)) == NULL)
- err(1, "ttyname");
- if (stat(tty, &sb) < 0)
- err(1, "%s", tty);
- if (!(sb.st_mode & S_IWGRP))
- errx(1, "The callee cannot write to this terminal, use \"mesg y\".");
-}
-
-/*
- * Set up curses, catch the appropriate signals,
- * and build the various windows.
- */
-void
-init_display(void)
-{
- struct sigaction sa;
-
- if (initscr() == NULL)
- errx(1, "Terminal type unset or lacking necessary features.");
- (void) sigaction(SIGTSTP, (struct sigaction *)0, &sa);
- sigaddset(&sa.sa_mask, SIGALRM);
- (void) sigaction(SIGTSTP, &sa, (struct sigaction *)0);
- curses_initialized = 1;
- clear();
- refresh();
- noecho();
- crmode();
- signal(SIGINT, sig_sent);
- signal(SIGPIPE, sig_sent);
- signal(SIGWINCH, sig_winch);
- /* curses takes care of ^Z */
- my_win.x_nlines = LINES / 2;
- my_win.x_ncols = COLS;
- my_win.x_win = newwin(my_win.x_nlines, my_win.x_ncols, 0, 0);
- idlok(my_win.x_win, TRUE);
- scrollok(my_win.x_win, TRUE);
- wclear(my_win.x_win);
-
- his_win.x_nlines = LINES / 2 - 1;
- his_win.x_ncols = COLS;
- his_win.x_win = newwin(his_win.x_nlines, his_win.x_ncols,
- my_win.x_nlines+1, 0);
- idlok(my_win.x_win, TRUE);
- scrollok(his_win.x_win, TRUE);
- wclear(his_win.x_win);
-
- line_win = newwin(1, COLS, my_win.x_nlines, 0);
-#if defined(hline) || defined(whline) || defined(NCURSES_VERSION)
- whline(line_win, 0, COLS);
-#else
- box(line_win, '-', '-');
-#endif
- wrefresh(line_win);
- /* let them know we are working on it */
- current_state = "No connection yet";
-}
-
-/*
- * Trade edit characters with the other talk. By agreement
- * the first three characters each talk transmits after
- * connection are the three edit characters.
- */
-void
-set_edit_chars(void)
-{
- char buf[3];
- int cc;
- struct termios tio;
-
- tcgetattr(0, &tio);
- my_win.cerase = tio.c_cc[VERASE];
- my_win.kill = tio.c_cc[VKILL];
- my_win.werase = tio.c_cc[VWERASE];
- if (my_win.cerase == (char)_POSIX_VDISABLE)
- my_win.kill = CERASE;
- if (my_win.kill == (char)_POSIX_VDISABLE)
- my_win.kill = CKILL;
- if (my_win.werase == (char)_POSIX_VDISABLE)
- my_win.werase = CWERASE;
- buf[0] = my_win.cerase;
- buf[1] = my_win.kill;
- buf[2] = my_win.werase;
- cc = write(sockt, buf, sizeof(buf));
- if (cc != sizeof(buf) )
- p_error("Lost the connection");
- cc = read(sockt, buf, sizeof(buf));
- if (cc != sizeof(buf) )
- p_error("Lost the connection");
- his_win.cerase = buf[0];
- his_win.kill = buf[1];
- his_win.werase = buf[2];
-}
-
-/* ARGSUSED */
-void
-sig_sent(int signo __unused)
-{
-
- message("Connection closing. Exiting");
- quit();
-}
-
-void
-sig_winch(int dummy __unused)
-{
-
- gotwinch = 1;
-}
-
-/*
- * All done talking...hang up the phone and reset terminal thingy's
- */
-void
-quit(void)
-{
-
- if (curses_initialized) {
- wmove(his_win.x_win, his_win.x_nlines-1, 0);
- wclrtoeol(his_win.x_win);
- wrefresh(his_win.x_win);
- endwin();
- }
- if (invitation_waiting)
- send_delete();
- exit(0);
-}
-
-/*
- * If we get SIGWINCH, recompute both window sizes and refresh things.
- */
-void
-resize_display(void)
-{
- struct winsize ws;
-
- if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) < 0 ||
- (ws.ws_row == LINES && ws.ws_col == COLS))
- return;
-
- /* Update curses' internal state with new window size. */
- resizeterm(ws.ws_row, ws.ws_col);
-
- /*
- * Resize each window but wait to refresh the screen until
- * everything has been drawn so the cursor is in the right spot.
- */
- my_win.x_nlines = LINES / 2;
- my_win.x_ncols = COLS;
- wresize(my_win.x_win, my_win.x_nlines, my_win.x_ncols);
- mvwin(my_win.x_win, 0, 0);
- clearok(my_win.x_win, TRUE);
-
- his_win.x_nlines = LINES / 2 - 1;
- his_win.x_ncols = COLS;
- wresize(his_win.x_win, his_win.x_nlines, his_win.x_ncols);
- mvwin(his_win.x_win, my_win.x_nlines + 1, 0);
- clearok(his_win.x_win, TRUE);
-
- wresize(line_win, 1, COLS);
- mvwin(line_win, my_win.x_nlines, 0);
-#if defined(NCURSES_VERSION) || defined(whline)
- whline(line_win, '-', COLS);
-#else
- wmove(line_win, my_win.x_nlines, 0);
- box(line_win, '-', '-');
-#endif
-
- /* Now redraw the screen. */
- wrefresh(his_win.x_win);
- wrefresh(line_win);
- wrefresh(my_win.x_win);
-}
diff --git a/usr.bin/talk/invite.c b/usr.bin/talk/invite.c
deleted file mode 100644
index 99c2514..0000000
--- a/usr.bin/talk/invite.c
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)invite.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <protocols/talkd.h>
-
-#include <err.h>
-#include <errno.h>
-#include <setjmp.h>
-#include <signal.h>
-
-#include "talk_ctl.h"
-#include "talk.h"
-
-/*
- * There wasn't an invitation waiting, so send a request containing
- * our sockt address to the remote talk daemon so it can invite
- * him
- */
-
-/*
- * The msg.id's for the invitations
- * on the local and remote machines.
- * These are used to delete the
- * invitations.
- */
-int local_id, remote_id;
-jmp_buf invitebuf;
-
-void
-invite_remote(void)
-{
- int new_sockt;
- struct itimerval itimer;
- CTL_RESPONSE response;
-
- itimer.it_value.tv_sec = RING_WAIT;
- itimer.it_value.tv_usec = 0;
- itimer.it_interval = itimer.it_value;
- if (listen(sockt, 5) != 0)
- p_error("Error on attempt to listen for caller");
-#ifdef MSG_EOR
- /* copy new style sockaddr to old, swap family (short in old) */
- msg.addr = *(struct osockaddr *)&my_addr; /* XXX new to old style*/
- msg.addr.sa_family = htons(my_addr.sin_family);
-#else
- msg.addr = *(struct sockaddr *)&my_addr;
-#endif
- msg.id_num = htonl(-1); /* an impossible id_num */
- invitation_waiting = 1;
- announce_invite();
- /*
- * Shut off the automatic messages for a while,
- * so we can use the interupt timer to resend the invitation
- */
- end_msgs();
- setitimer(ITIMER_REAL, &itimer, (struct itimerval *)0);
- message("Waiting for your party to respond");
- signal(SIGALRM, re_invite);
- (void) setjmp(invitebuf);
- while ((new_sockt = accept(sockt, 0, 0)) < 0) {
- if (errno == EINTR)
- continue;
- p_error("Unable to connect with your party");
- }
- close(sockt);
- sockt = new_sockt;
-
- /*
- * Have the daemons delete the invitations now that we
- * have connected.
- */
- current_state = "Waiting for your party to respond";
- start_msgs();
-
- msg.id_num = htonl(local_id);
- ctl_transact(my_machine_addr, msg, DELETE, &response);
- msg.id_num = htonl(remote_id);
- ctl_transact(his_machine_addr, msg, DELETE, &response);
- invitation_waiting = 0;
-}
-
-/*
- * Routine called on interupt to re-invite the callee
- */
-/* ARGSUSED */
-void
-re_invite(int signo __unused)
-{
-
- message("Ringing your party again");
- waddch(my_win.x_win, '\n');
- if (current_line < my_win.x_nlines - 1)
- current_line++;
- /* force a re-announce */
- msg.id_num = htonl(remote_id + 1);
- announce_invite();
- longjmp(invitebuf, 1);
-}
-
-static const char *answers[] = {
- "answer #0", /* SUCCESS */
- "Your party is not logged on", /* NOT_HERE */
- "Target machine is too confused to talk to us", /* FAILED */
- "Target machine does not recognize us", /* MACHINE_UNKNOWN */
- "Your party is refusing messages", /* PERMISSION_REFUSED */
- "Target machine can not handle remote talk", /* UNKNOWN_REQUEST */
- "Target machine indicates protocol mismatch", /* BADVERSION */
- "Target machine indicates protocol botch (addr)",/* BADADDR */
- "Target machine indicates protocol botch (ctl_addr)",/* BADCTLADDR */
-};
-#define NANSWERS (sizeof (answers) / sizeof (answers[0]))
-
-/*
- * Transmit the invitation and process the response
- */
-void
-announce_invite(void)
-{
- CTL_RESPONSE response;
-
- current_state = "Trying to connect to your party's talk daemon";
- ctl_transact(his_machine_addr, msg, ANNOUNCE, &response);
- remote_id = response.id_num;
- if (response.answer != SUCCESS) {
- if (response.answer < NANSWERS)
- message(answers[response.answer]);
- quit();
- }
- /* leave the actual invitation on my talk daemon */
- current_state = "Trying to connect to local talk daemon";
- ctl_transact(my_machine_addr, msg, LEAVE_INVITE, &response);
- local_id = response.id_num;
-}
-
-/*
- * Tell the daemon to remove your invitation
- */
-void
-send_delete(void)
-{
-
- msg.type = DELETE;
- /*
- * This is just an extra clean up, so just send it
- * and don't wait for an answer
- */
- msg.id_num = htonl(remote_id);
- daemon_addr.sin_addr = his_machine_addr;
- if (sendto(ctl_sockt, &msg, sizeof (msg), 0,
- (struct sockaddr *)&daemon_addr,
- sizeof (daemon_addr)) != sizeof(msg))
- warn("send_delete (remote)");
- msg.id_num = htonl(local_id);
- daemon_addr.sin_addr = my_machine_addr;
- if (sendto(ctl_sockt, &msg, sizeof (msg), 0,
- (struct sockaddr *)&daemon_addr,
- sizeof (daemon_addr)) != sizeof (msg))
- warn("send_delete (local)");
-}
diff --git a/usr.bin/talk/io.c b/usr.bin/talk/io.c
deleted file mode 100644
index dd6f067..0000000
--- a/usr.bin/talk/io.c
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)io.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-/*
- * This file contains the I/O handling and the exchange of
- * edit characters. This connection itself is established in
- * ctl.c
- */
-
-#include <sys/filio.h>
-
-#include <errno.h>
-#include <signal.h>
-#include <netdb.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "talk.h"
-#include "talk_ctl.h"
-
-#define A_LONG_TIME 10000000
-
-volatile sig_atomic_t gotwinch = 0;
-
-/*
- * The routine to do the actual talking
- */
-void
-talk(void)
-{
- struct hostent *hp, *hp2;
- int nb;
- fd_set read_set, read_template;
- char buf[BUFSIZ], **addr, *his_machine_name;
- struct timeval wait;
-
- his_machine_name = NULL;
- hp = gethostbyaddr((const char *)&his_machine_addr.s_addr,
- sizeof(his_machine_addr.s_addr), AF_INET);
- if (hp != NULL) {
- hp2 = gethostbyname(hp->h_name);
- if (hp2 != NULL && hp2->h_addrtype == AF_INET &&
- hp2->h_length == sizeof(his_machine_addr))
- for (addr = hp2->h_addr_list; *addr != NULL; addr++)
- if (memcmp(*addr, &his_machine_addr,
- sizeof(his_machine_addr)) == 0) {
- his_machine_name = strdup(hp->h_name);
- break;
- }
- }
- if (his_machine_name == NULL)
- his_machine_name = strdup(inet_ntoa(his_machine_addr));
- snprintf(buf, sizeof(buf), "Connection established with %s@%s.",
- msg.r_name, his_machine_name);
- free(his_machine_name);
- message(buf);
- write(STDOUT_FILENO, "\007\007\007", 3);
-
- current_line = 0;
-
- /*
- * Wait on both the other process (sockt_mask) and
- * standard input ( STDIN_MASK )
- */
- FD_ZERO(&read_template);
- FD_SET(sockt, &read_template);
- FD_SET(fileno(stdin), &read_template);
- for (;;) {
- read_set = read_template;
- wait.tv_sec = A_LONG_TIME;
- wait.tv_usec = 0;
- nb = select(32, &read_set, 0, 0, &wait);
- if (gotwinch) {
- resize_display();
- gotwinch = 0;
- }
- if (nb <= 0) {
- if (errno == EINTR) {
- read_set = read_template;
- continue;
- }
- /* panic, we don't know what happened */
- p_error("Unexpected error from select");
- quit();
- }
- if (FD_ISSET(sockt, &read_set)) {
- /* There is data on sockt */
- nb = read(sockt, buf, sizeof buf);
- if (nb <= 0) {
- message("Connection closed. Exiting");
- quit();
- }
- display(&his_win, buf, nb);
- }
- if (FD_ISSET(fileno(stdin), &read_set)) {
- /*
- * We can't make the tty non_blocking, because
- * curses's output routines would screw up
- */
- int i;
- ioctl(0, FIONREAD, (void *) &nb);
- if (nb > (ssize_t)(sizeof buf))
- nb = sizeof buf;
- nb = read(STDIN_FILENO, buf, nb);
- display(&my_win, buf, nb);
- /* might lose data here because sockt is non-blocking */
- for (i = 0; i < nb; ++i)
- if (buf[i] == '\r')
- buf[i] = '\n';
- write(sockt, buf, nb);
- }
- }
-}
-
-/*
- * p_error prints the system error message on the standard location
- * on the screen and then exits. (i.e. a curses version of perror)
- */
-void
-p_error(const char *string)
-{
- wmove(my_win.x_win, current_line, 0);
- wprintw(my_win.x_win, "[%s : %s (%d)]\n",
- string, strerror(errno), errno);
- wrefresh(my_win.x_win);
- move(LINES-1, 0);
- refresh();
- quit();
-}
-
-/*
- * Display string in the standard location
- */
-void
-message(const char *string)
-{
- wmove(my_win.x_win, current_line, 0);
- wprintw(my_win.x_win, "[%s]\n", string);
- if (current_line < my_win.x_nlines - 1)
- current_line++;
- wrefresh(my_win.x_win);
-}
diff --git a/usr.bin/talk/look_up.c b/usr.bin/talk/look_up.c
deleted file mode 100644
index 1ccf23c..0000000
--- a/usr.bin/talk/look_up.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)look_up.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <protocols/talkd.h>
-
-#include <errno.h>
-#include <string.h>
-
-#include "talk_ctl.h"
-#include "talk.h"
-
-/*
- * See if the local daemon has an invitation for us.
- */
-int
-check_local(void)
-{
- CTL_RESPONSE response;
- CTL_RESPONSE *rp = &response;
- struct sockaddr addr;
-
- /* the rest of msg was set up in get_names */
-#ifdef MSG_EOR
- /* copy new style sockaddr to old, swap family (short in old) */
- msg.ctl_addr = *(struct osockaddr *)&ctl_addr;
- msg.ctl_addr.sa_family = htons(ctl_addr.sin_family);
-#else
- msg.ctl_addr = *(struct sockaddr *)&ctl_addr;
-#endif
- /* must be initiating a talk */
- if (!look_for_invite(rp))
- return (0);
- /*
- * There was an invitation waiting for us,
- * so connect with the other (hopefully waiting) party
- */
- current_state = "Waiting to connect with caller";
- do {
- if (rp->addr.sa_family != AF_INET)
- p_error("Response uses invalid network address");
- (void)memcpy(&addr, &rp->addr.sa_family, sizeof(addr));
- addr.sa_family = rp->addr.sa_family;
- addr.sa_len = sizeof(addr);
- errno = 0;
- if (connect(sockt, &addr, sizeof(addr)) != -1)
- return (1);
- } while (errno == EINTR);
- if (errno == ECONNREFUSED) {
- /*
- * The caller gave up, but his invitation somehow
- * was not cleared. Clear it and initiate an
- * invitation. (We know there are no newer invitations,
- * the talkd works LIFO.)
- */
- ctl_transact(his_machine_addr, msg, DELETE, rp);
- close(sockt);
- open_sockt();
- return (0);
- }
- p_error("Unable to connect with initiator");
- /*NOTREACHED*/
- return (0);
-}
-
-/*
- * Look for an invitation on 'machine'
- */
-int
-look_for_invite(CTL_RESPONSE *rp)
-{
- current_state = "Checking for invitation on caller's machine";
- ctl_transact(his_machine_addr, msg, LOOK_UP, rp);
- /* the switch is for later options, such as multiple invitations */
- switch (rp->answer) {
-
- case SUCCESS:
- msg.id_num = htonl(rp->id_num);
- return (1);
-
- default:
- /* there wasn't an invitation waiting for us */
- return (0);
- }
-}
diff --git a/usr.bin/talk/msgs.c b/usr.bin/talk/msgs.c
deleted file mode 100644
index f4cd413..0000000
--- a/usr.bin/talk/msgs.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)msgs.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-/*
- * A package to display what is happening every MSG_INTERVAL seconds
- * if we are slow connecting.
- */
-
-#include <signal.h>
-
-#include "talk.h"
-
-#define MSG_INTERVAL 4
-
-const char *current_state;
-int current_line = 0;
-
-/* ARGSUSED */
-void
-disp_msg(int signo __unused)
-{
- message(current_state);
-}
-
-void
-start_msgs(void)
-{
- struct itimerval itimer;
-
- message(current_state);
- signal(SIGALRM, disp_msg);
- itimer.it_value.tv_sec = itimer.it_interval.tv_sec = MSG_INTERVAL;
- itimer.it_value.tv_usec = itimer.it_interval.tv_usec = 0;
- setitimer(ITIMER_REAL, &itimer, (struct itimerval *)0);
-}
-
-void
-end_msgs(void)
-{
- struct itimerval itimer;
-
- timerclear(&itimer.it_value);
- timerclear(&itimer.it_interval);
- setitimer(ITIMER_REAL, &itimer, (struct itimerval *)0);
- signal(SIGALRM, SIG_DFL);
-}
diff --git a/usr.bin/talk/talk.1 b/usr.bin/talk/talk.1
deleted file mode 100644
index 775b6d1..0000000
--- a/usr.bin/talk/talk.1
+++ /dev/null
@@ -1,163 +0,0 @@
-.\" Copyright (c) 1983, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)talk.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd July 3, 2004
-.Dt TALK 1
-.Os
-.Sh NAME
-.Nm talk
-.Nd talk to another user
-.Sh SYNOPSIS
-.Nm
-.Ar person
-.Op Ar ttyname
-.Sh DESCRIPTION
-The
-.Nm
-utility is a visual communication program which copies lines from your
-terminal to that of another user.
-.Pp
-Options available:
-.Bl -tag -width ttyname
-.It Ar person
-If you wish to talk to someone on your own machine, then
-.Ar person
-is just the person's login name.
-If you wish to talk to a user on
-another host, then
-.Ar person
-is of the form
-.Ql user@host
-or
-.Ql host!user
-or
-.Ql host:user .
-.It Ar ttyname
-If you wish to talk to a user who is logged in more than once, the
-.Ar ttyname
-argument may be used to indicate the appropriate terminal
-name, where
-.Ar ttyname
-is of the form
-.Ql ttyXX .
-.El
-.Pp
-When first called,
-.Nm
-sends the message
-.Bd -literal -offset indent -compact
-Message from TalkDaemon@his_machine...
-talk: connection requested by your_name@your_machine.
-talk: respond with: talk your_name@your_machine
-.Ed
-.Pp
-to the user you wish to talk to.
-At this point, the recipient
-of the message should reply by typing
-.Pp
-.Dl talk \ your_name@your_machine
-.Pp
-It does not matter from which machine the recipient replies, as
-long as his login-name is the same.
-Once communication is established,
-the two parties may type simultaneously, with their output appearing
-in separate windows.
-Typing control-L
-.Ql ^L
-will cause the screen to
-be reprinted.
-Typing control-D
-.Ql ^D
-will clear both parts of your screen to be cleared, while
-the control-D character will be sent to the remote side
-(and just displayed by this
-.Nm
-client).
-Your erase, kill, and word kill characters will
-behave normally.
-To exit, just type your interrupt character;
-.Nm
-then moves the cursor to the bottom of the screen and restores the
-terminal to its previous state.
-.Pp
-Permission to talk may be denied or granted by use of the
-.Xr mesg 1
-command.
-At the outset talking is allowed.
-.Sh FILES
-.Bl -tag -width /var/run/utmp -compact
-.It Pa /etc/hosts
-to find the recipient's machine
-.It Pa /var/run/utmp
-to find the recipient's tty
-.El
-.Sh SEE ALSO
-.Xr mail 1 ,
-.Xr mesg 1 ,
-.Xr wall 1 ,
-.Xr who 1 ,
-.Xr write 1 ,
-.Xr talkd 8
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.2 .
-.Pp
-In
-.Fx 5.3 ,
-the default behaviour of
-.Nm
-was changed to treat local-to-local talk requests as originating
-and terminating at
-.Em localhost .
-Before this change, it was required that the hostname (as per
-.Xr gethostname 3 )
-resolved to a valid IPv4 address (via
-.Xr gethostbyname 3 ) ,
-making
-.Nm
-unsuitable for use in configurations where
-.Xr talkd 8
-was bound to the loopback interface (normally for security reasons).
-.Sh BUGS
-The version of
-.Nm
-released with
-.Bx 4.3
-uses a protocol that
-is incompatible with the protocol used in the version released with
-.Bx 4.2 .
-.Pp
-Multibyte characters are not recognized.
diff --git a/usr.bin/talk/talk.c b/usr.bin/talk/talk.c
deleted file mode 100644
index 5fc8337..0000000
--- a/usr.bin/talk/talk.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)talk.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1983, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#include <locale.h>
-
-#include "talk.h"
-
-/*
- * talk: A visual form of write. Using sockets, a two way
- * connection is set up between the two people talking.
- * With the aid of curses, the screen is split into two
- * windows, and each users text is added to the window,
- * one character at a time...
- *
- * Written by Kipp Hickman
- *
- * Modified to run under 4.1a by Clem Cole and Peter Moore
- * Modified to run between hosts by Peter Moore, 8/19/82
- * Modified to run under 4.1c by Peter Moore 3/17/83
- * Fixed to not run with unwriteable terminals MRVM 28/12/94
- */
-
-int
-main(int argc, char **argv)
-{
- (void) setlocale(LC_CTYPE, "");
-
- get_names(argc, argv);
- setproctitle(" ");
- check_writeable();
- init_display();
- open_ctl();
- open_sockt();
- start_msgs();
- if (!check_local())
- invite_remote();
- end_msgs();
- set_edit_chars();
- talk();
- return 0;
-}
diff --git a/usr.bin/talk/talk.h b/usr.bin/talk/talk.h
deleted file mode 100644
index e20c8ec..0000000
--- a/usr.bin/talk/talk.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)talk.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <protocols/talkd.h>
-#include <curses.h>
-#include <unistd.h>
-
-extern int sockt;
-extern int curses_initialized;
-extern int invitation_waiting;
-
-extern const char *current_state;
-extern int current_line;
-
-typedef struct xwin {
- WINDOW *x_win;
- int x_nlines;
- int x_ncols;
- int x_line;
- int x_col;
- char kill;
- char cerase;
- char werase;
-} xwin_t;
-
-extern xwin_t my_win;
-extern xwin_t his_win;
-extern WINDOW *line_win;
-
-extern void announce_invite(void);
-extern int check_local(void);
-extern void check_writeable(void);
-extern void ctl_transact(struct in_addr,CTL_MSG,int,CTL_RESPONSE *);
-extern void disp_msg(int);
-extern void display(xwin_t *, char *, int);
-extern void end_msgs(void);
-extern void get_addrs(const char *, const char *);
-extern int get_iface(struct in_addr *, struct in_addr *);
-extern void get_names(int, char **);
-extern void init_display(void);
-extern void invite_remote(void);
-extern int look_for_invite(CTL_RESPONSE *);
-extern int max(int, int);
-extern void message(const char *);
-extern void open_ctl(void);
-extern void open_sockt(void);
-extern void p_error(const char *);
-extern void print_addr(struct sockaddr_in);
-extern void quit(void);
-extern int readwin(WINDOW *, int, int);
-extern void re_invite(int);
-extern void send_delete(void);
-extern void set_edit_chars(void);
-extern void sig_sent(int);
-extern void sig_winch(int);
-extern void start_msgs(void);
-extern void talk(void);
-extern void resize_display(void);
diff --git a/usr.bin/talk/talk_ctl.h b/usr.bin/talk/talk_ctl.h
deleted file mode 100644
index 91c75d0..0000000
--- a/usr.bin/talk/talk_ctl.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)talk_ctl.h 8.1 (Berkeley) 6/6/93
- */
-
-extern struct sockaddr_in daemon_addr;
-extern struct sockaddr_in ctl_addr;
-extern struct sockaddr_in my_addr;
-extern struct in_addr my_machine_addr;
-extern struct in_addr his_machine_addr;
-extern u_short daemon_port;
-extern int ctl_sockt;
-extern CTL_MSG msg;
diff --git a/usr.bin/tar/COPYING b/usr.bin/tar/COPYING
deleted file mode 100644
index 9a88a80..0000000
--- a/usr.bin/tar/COPYING
+++ /dev/null
@@ -1,62 +0,0 @@
-$FreeBSD$
-
-All of the C source code and documentation in this package is subject
-to the following:
-
-Copyright (c) 2003-2007 Tim Kientzle
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-Some of the filename pattern matching code is based on code subject
-to the following license:
-
-/*
- * Copyright (c) 1989, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Guido van Rossum.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
diff --git a/usr.bin/tar/Makefile b/usr.bin/tar/Makefile
deleted file mode 100644
index 1dc4388..0000000
--- a/usr.bin/tar/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
-# $FreeBSD$
-
-PROG= bsdtar
-BSDTAR_VERSION_STRING=2.5.5
-SRCS= bsdtar.c getdate.y matching.c read.c siginfo.c subst.c tree.c util.c write.c
-WARNS?= 5
-DPADD= ${LIBARCHIVE} ${LIBBZ2} ${LIBZ}
-LDADD= -larchive -lbz2 -lz
-CFLAGS+= -DBSDTAR_VERSION_STRING=\"${BSDTAR_VERSION_STRING}\"
-CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\"
-CFLAGS+= -I${.CURDIR}
-SYMLINKS= bsdtar ${BINDIR}/tar
-MLINKS= bsdtar.1 tar.1
-
-.PHONY: check test
-check test: $(PROG) bsdtar.1.gz
- cd ${.CURDIR}/test && make test
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/tar/bsdtar.1 b/usr.bin/tar/bsdtar.1
deleted file mode 100644
index 02b301d..0000000
--- a/usr.bin/tar/bsdtar.1
+++ /dev/null
@@ -1,829 +0,0 @@
-.\" Copyright (c) 2003-2007 Tim Kientzle
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd May 15, 2008
-.Dt BSDTAR 1
-.Os
-.Sh NAME
-.Nm tar
-.Nd manipulate tape archives
-.Sh SYNOPSIS
-.Nm
-.Op Ar bundled-flags Ao args Ac
-.Op Ao Ar file Ac | Ao Ar pattern Ac ...
-.Nm
-.Brq Fl c
-.Op Ar options
-.Op Ar files | directories
-.Nm
-.Brq Fl r | Fl u
-.Fl f Ar archive-file
-.Op Ar options
-.Op Ar files | directories
-.Nm
-.Brq Fl t | Fl x
-.Op Ar options
-.Op Ar patterns
-.Sh DESCRIPTION
-.Nm
-creates and manipulates streaming archive files.
-This implementation can extract from tar, pax, cpio, zip, jar, ar,
-and ISO 9660 cdrom images and can create tar, pax, cpio, ar,
-and shar archives.
-.Pp
-The first synopsis form shows a
-.Dq bundled
-option word.
-This usage is provided for compatibility with historical implementations.
-See COMPATIBILITY below for details.
-.Pp
-The other synopsis forms show the preferred usage.
-The first option to
-.Nm
-is a mode indicator from the following list:
-.Bl -tag -compact -width indent
-.It Fl c
-Create a new archive containing the specified items.
-.It Fl r
-Like
-.Fl c ,
-but new entries are appended to the archive.
-Note that this only works on uncompressed archives stored in regular files.
-The
-.Fl f
-option is required.
-.It Fl t
-List archive contents to stdout.
-.It Fl u
-Like
-.Fl r ,
-but new entries are added only if they have a modification date
-newer than the corresponding entry in the archive.
-Note that this only works on uncompressed archives stored in regular files.
-The
-.Fl f
-option is required.
-.It Fl x
-Extract to disk from the archive.
-If a file with the same name appears more than once in the archive,
-each copy will be extracted, with later copies overwriting (replacing)
-earlier copies.
-.El
-.Pp
-In
-.Fl c ,
-.Fl r ,
-or
-.Fl u
-mode, each specified file or directory is added to the
-archive in the order specified on the command line.
-By default, the contents of each directory are also archived.
-.Pp
-In extract or list mode, the entire command line
-is read and parsed before the archive is opened.
-The pathnames or patterns on the command line indicate
-which items in the archive should be processed.
-Patterns are shell-style globbing patterns as
-documented in
-.Xr tcsh 1 .
-.Sh OPTIONS
-Unless specifically stated otherwise, options are applicable in
-all operating modes.
-.Bl -tag -width indent
-.It Cm @ Ns Pa archive
-(c and r mode only)
-The specified archive is opened and the entries
-in it will be appended to the current archive.
-As a simple example,
-.Dl Nm Fl c Fl f Pa - Pa newfile Cm @ Ns Pa original.tar
-writes a new archive to standard output containing a file
-.Pa newfile
-and all of the entries from
-.Pa original.tar .
-In contrast,
-.Dl Nm Fl c Fl f Pa - Pa newfile Pa original.tar
-creates a new archive with only two entries.
-Similarly,
-.Dl Nm Fl czf Pa - Fl -format Cm pax Cm @ Ns Pa -
-reads an archive from standard input (whose format will be determined
-automatically) and converts it into a gzip-compressed
-pax-format archive on stdout.
-In this way,
-.Nm
-can be used to convert archives from one format to another.
-.It Fl b Ar blocksize
-Specify the block size, in 512-byte records, for tape drive I/O.
-As a rule, this argument is only needed when reading from or writing
-to tape drives, and usually not even then as the default block size of
-20 records (10240 bytes) is very common.
-.It Fl C Ar directory
-In c and r mode, this changes the directory before adding
-the following files.
-In x mode, change directories after opening the archive
-but before extracting entries from the archive.
-.It Fl -check-links ( Fl W Cm check-links )
-(c and r modes only)
-Issue a warning message unless all links to each file are archived.
-.It Fl -chroot ( Fl W Cm chroot )
-(x mode only)
-.Fn chroot
-to the current directory after processing any
-.Fl C
-options and before extracting any files.
-.It Fl -exclude Ar pattern ( Fl W Cm exclude Ns = Ns Ar pattern )
-Do not process files or directories that match the
-specified pattern.
-Note that exclusions take precedence over patterns or filenames
-specified on the command line.
-.It Fl -format Ar format ( Fl W Cm format Ns = Ns Ar format )
-(c, r, u mode only)
-Use the specified format for the created archive.
-Supported formats include
-.Dq cpio ,
-.Dq pax ,
-.Dq shar ,
-and
-.Dq ustar .
-Other formats may also be supported; see
-.Xr libarchive-formats 5
-for more information about currently-supported formats.
-In r and u modes, when extending an existing archive, the format specified
-here must be compatible with the format of the existing archive on disk.
-.It Fl f Ar file
-Read the archive from or write the archive to the specified file.
-The filename can be
-.Pa -
-for standard input or standard output.
-If not specified, the default tape device will be used.
-(On
-.Fx ,
-the default tape device is
-.Pa /dev/sa0 . )
-.It Fl H
-(c and r mode only)
-Symbolic links named on the command line will be followed; the
-target of the link will be archived, not the link itself.
-.It Fl h
-(c and r mode only)
-Synonym for
-.Fl L .
-.It Fl I
-Synonym for
-.Fl T .
-.It Fl -include Ar pattern ( Fl W Cm include Ns = Ns Ar pattern )
-Process only files or directories that match the specified pattern.
-Note that exclusions specified with
-.Fl -exclude
-take precedence over inclusions.
-If no inclusions are explicitly specified, all entries are processed by
-default.
-The
-.Fl -include
-option is especially useful when filtering archives.
-For example, the command
-.Dl Nm Fl c Fl f Pa new.tar Fl -include='*foo*' Cm @ Ns Pa old.tgz
-creates a new archive
-.Pa new.tar
-containing only the entries from
-.Pa old.tgz
-containing the string
-.Sq foo .
-.It Fl j
-(c mode only)
-Compress the resulting archive with
-.Xr bzip2 1 .
-In extract or list modes, this option is ignored.
-Note that, unlike other
-.Nm tar
-implementations, this implementation recognizes bzip2 compression
-automatically when reading archives.
-.It Fl k
-(x mode only)
-Do not overwrite existing files.
-In particular, if a file appears more than once in an archive,
-later copies will not overwrite earlier copies.
-.It Fl -keep-newer-files ( Fl W Cm keep-newer-files )
-(x mode only)
-Do not overwrite existing files that are newer than the
-versions appearing in the archive being extracted.
-.It Fl L
-(c and r mode only)
-All symbolic links will be followed.
-Normally, symbolic links are archived as such.
-With this option, the target of the link will be archived instead.
-.It Fl l
-This is a synonym for the
-.Fl -check-links
-option.
-.It Fl m
-(x mode only)
-Do not extract modification time.
-By default, the modification time is set to the time stored in the archive.
-.It Fl n
-(c, r, u modes only)
-Do not recursively archive the contents of directories.
-.It Fl -newer Ar date ( Fl W Cm newer Ns = Ns Ar date )
-(c, r, u modes only)
-Only include files and directories newer than the specified date.
-This compares ctime entries.
-.It Fl -newer-mtime Ar date ( Fl W Cm newer-mtime Ns = Ns Ar date )
-(c, r, u modes only)
-Like
-.Fl -newer ,
-except it compares mtime entries instead of ctime entries.
-.It Fl -newer-than Pa file ( Fl W Cm newer-than Ns = Ns Pa file )
-(c, r, u modes only)
-Only include files and directories newer than the specified file.
-This compares ctime entries.
-.It Fl -newer-mtime-than Pa file ( Fl W Cm newer-mtime-than Ns = Ns Pa file )
-(c, r, u modes only)
-Like
-.Fl -newer-than ,
-except it compares mtime entries instead of ctime entries.
-.It Fl -nodump ( Fl W Cm nodump )
-(c and r modes only)
-Honor the nodump file flag by skipping this file.
-.It Fl -null ( Fl W Cm null )
-(use with
-.Fl I ,
-.Fl T ,
-or
-.Fl X )
-Filenames or patterns are separated by null characters,
-not by newlines.
-This is often used to read filenames output by the
-.Fl print0
-option to
-.Xr find 1 .
-.It Fl -numeric-owner
-(x mode only)
-Ignore symbolic user and group names when restoring archives to disk,
-only numeric uid and gid values will be obeyed.
-.It Fl O
-(x, t modes only)
-In extract (-x) mode, files will be written to standard out rather than
-being extracted to disk.
-In list (-t) mode, the file listing will be written to stderr rather than
-the usual stdout.
-.It Fl o
-(x mode)
-Use the user and group of the user running the program rather
-than those specified in the archive.
-Note that this has no significance unless
-.Fl p
-is specified, and the program is being run by the root user.
-In this case, the file modes and flags from
-the archive will be restored, but ACLs or owner information in
-the archive will be discarded.
-.It Fl o
-(c, r, u mode)
-A synonym for
-.Fl -format Ar ustar
-.It Fl -one-file-system ( Fl W Cm one-file-system )
-(c, r, and u modes)
-Do not cross mount points.
-.It Fl P
-Preserve pathnames.
-By default, absolute pathnames (those that begin with a /
-character) have the leading slash removed both when creating archives
-and extracting from them.
-Also,
-.Nm
-will refuse to extract archive entries whose pathnames contain
-.Pa ..
-or whose target directory would be altered by a symlink.
-This option suppresses these behaviors.
-.It Fl p
-(x mode only)
-Preserve file permissions.
-Attempt to restore the full permissions, including owner, file modes, file
-flags and ACLs, if available, for each item extracted from the archive.
-By default, newly-created files are owned by the user running
-.Nm ,
-the file mode is restored for newly-created regular files, and
-all other types of entries receive default permissions.
-If
-.Nm
-is being run by root, the default is to restore the owner unless the
-.Fl o
-option is also specified.
-.It Fl q ( Fl -fast-read )
-(x and t mode only)
-Extract or list only the first archive entry that matches each pattern
-or filename operand.
-Exit as soon as each specified pattern or filename has been matched.
-By default, the archive is always read to the very end, since
-there can be multiple entries with the same name and, by convention,
-later entries overwrite earlier entries.
-This option is provided as a performance optimization.
-.It Fl S
-(x mode only)
-Extract files as sparse files.
-For every block on disk, check first if it contains only NULL bytes and seek
-over it otherwise.
-This works similiar to the conv=sparse option of dd.
-.It Fl -strip-components Ar count ( Fl W Cm strip-components Ns = Ns Ar count )
-(x and t mode only)
-Remove the specified number of leading path elements.
-Pathnames with fewer elements will be silently skipped.
-Note that the pathname is edited after checking inclusion/exclusion patterns
-but before security checks.
-.It Fl s Ar pattern
-Modify file or archive member names according to
-.Pa pattern .
-The pattern has the format /old/new/[gps].
-old is a basic regular expression.
-If it doesn't apply, the pattern is skipped.
-new is the replacement string of the matched part.
-~ is substituted with the match, \1 to \9 with the content of
-the corresponding captured group.
-The optional trailing g specifies that matching should continue
-after the matched part and stopped on the first unmatched pattern.
-The optional trailing s specifies that the pattern applies to the value
-of symbolic links.
-The optional trailing p specifies that after a successful substitution
-the original path name and the new path name should be printed to
-standard error.
-.It Fl T Ar filename
-In x or t mode,
-.Nm
-will read the list of names to be extracted from
-.Pa filename .
-In c mode,
-.Nm
-will read names to be archived from
-.Pa filename .
-The special name
-.Dq -C
-on a line by itself will cause the current directory to be changed to
-the directory specified on the following line.
-Names are terminated by newlines unless
-.Fl -null
-is specified.
-Note that
-.Fl -null
-also disables the special handling of lines containing
-.Dq -C .
-.It Fl U
-(x mode only)
-Unlink files before creating them.
-Without this option,
-.Nm
-overwrites existing files, which preserves existing hardlinks.
-With this option, existing hardlinks will be broken, as will any
-symlink that would affect the location of an extracted file.
-.It Fl -use-compress-program Ar program
-Pipe the input (in x or t mode) or the output (in c mode) through
-.Pa program
-instead of using the builtin compression support.
-.It Fl v
-Produce verbose output.
-In create and extract modes,
-.Nm
-will list each file name as it is read from or written to
-the archive.
-In list mode,
-.Nm
-will produce output similar to that of
-.Xr ls 1 .
-Additional
-.Fl v
-options will provide additional detail.
-.It Fl -version
-Print version of
-.Nm
-and
-.Nm libarchive ,
-and exit.
-.It Fl W Ar longopt=value
-Long options (preceded by
-.Fl - )
-are only supported directly on systems that have the
-.Xr getopt_long 3
-function.
-The
-.Fl W
-option can be used to access long options on systems that
-do not support this function.
-.It Fl w
-Ask for confirmation for every action.
-.It Fl X Ar filename
-Read a list of exclusion patterns from the specified file.
-See
-.Fl -exclude
-for more information about the handling of exclusions.
-.It Fl y
-(c mode only)
-Compress the resulting archive with
-.Xr bzip2 1 .
-In extract or list modes, this option is ignored.
-Note that, unlike other
-.Nm tar
-implementations, this implementation recognizes bzip2 compression
-automatically when reading archives.
-.It Fl z
-(c mode only)
-Compress the resulting archive with
-.Xr gzip 1 .
-In extract or list modes, this option is ignored.
-Note that, unlike other
-.Nm tar
-implementations, this implementation recognizes gzip compression
-automatically when reading archives.
-.It Fl Z
-(c mode only)
-Compress the resulting archive with
-.Xr compress 1 .
-In extract or list modes, this option is ignored.
-Note that, unlike other
-.Nm tar
-implementations, this implementation recognizes compress compression
-automatically when reading archives.
-.El
-.Sh ENVIRONMENT
-The following environment variables affect the execution of
-.Nm :
-.Bl -tag -width ".Ev BLOCKSIZE"
-.It Ev LANG
-The locale to use.
-See
-.Xr environ 7
-for more information.
-.It Ev TAPE
-The default tape device.
-The
-.Fl f
-option overrides this.
-.It Ev TZ
-The timezone to use when displaying dates.
-See
-.Xr environ 7
-for more information.
-.El
-.Sh FILES
-.Bl -tag -width ".Ev BLOCKSIZE"
-.It Pa /dev/sa0
-The default tape device, if not overridden by the
-.Ev TAPE
-environment variable or the
-.Fl f
-option.
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh EXAMPLES
-The following creates a new archive
-called
-.Ar file.tar.gz
-that contains two files
-.Ar source.c
-and
-.Ar source.h :
-.Dl Nm Fl czf Pa file.tar.gz Pa source.c Pa source.h
-.Pp
-To view a detailed table of contents for this
-archive:
-.Dl Nm Fl tvf Pa file.tar.gz
-.Pp
-To extract all entries from the archive on
-the default tape drive:
-.Dl Nm Fl x
-.Pp
-To examine the contents of an ISO 9660 cdrom image:
-.Dl Nm Fl tf Pa image.iso
-.Pp
-To move file hierarchies, invoke
-.Nm
-as
-.Dl Nm Fl cf Pa - Fl C Pa srcdir\ . | Nm Fl xpf Pa - Fl C Pa destdir
-or more traditionally
-.Dl cd srcdir \&; Nm Fl cf Pa -\ . | ( cd destdir \&; Nm Fl xpf Pa - )
-.Pp
-In create mode, the list of files and directories to be archived
-can also include directory change instructions of the form
-.Cm -C Ns Pa foo/baz
-and archive inclusions of the form
-.Cm @ Ns Pa archive-file .
-For example, the command line
-.Dl Nm Fl c Fl f Pa new.tar Pa foo1 Cm @ Ns Pa old.tgz Cm -C Ns Pa /tmp Pa foo2
-will create a new archive
-.Pa new.tar .
-.Nm
-will read the file
-.Pa foo1
-from the current directory and add it to the output archive.
-It will then read each entry from
-.Pa old.tgz
-and add those entries to the output archive.
-Finally, it will switch to the
-.Pa /tmp
-directory and add
-.Pa foo2
-to the output archive.
-.Pp
-An input file in
-.Xr mtree 5
-format can be used to create an output archive with arbitrary ownership,
-permissions, or names that differ from existing data on disk:
-.Pp
-.Dl $ cat input.mtree
-.Dl #mtree
-.Dl usr/bin uid=0 gid=0 mode=0755 type=dir
-.Dl usr/bin/ls uid=0 gid=0 mode=0755 type=file content=myls
-.Dl $ tar -cvf output.tar @input.mtree
-.Pp
-The
-.Fl -newer
-and
-.Fl -newer-mtime
-switches accept a variety of common date and time specifications, including
-.Dq 12 Mar 2005 7:14:29pm ,
-.Dq 2005-03-12 19:14 ,
-.Dq 5 minutes ago ,
-and
-.Dq 19:14 PST May 1 .
-.Sh COMPATIBILITY
-The bundled-arguments format is supported for compatibility
-with historic implementations.
-It consists of an initial word (with no leading - character) in which
-each character indicates an option.
-Arguments follow as separate words.
-The order of the arguments must match the order
-of the corresponding characters in the bundled command word.
-For example,
-.Dl Nm Cm tbf 32 Pa file.tar
-specifies three flags
-.Cm t ,
-.Cm b ,
-and
-.Cm f .
-The
-.Cm b
-and
-.Cm f
-flags both require arguments,
-so there must be two additional items
-on the command line.
-The
-.Ar 32
-is the argument to the
-.Cm b
-flag, and
-.Ar file.tar
-is the argument to the
-.Cm f
-flag.
-.Pp
-The mode options c, r, t, u, and x and the options
-b, f, l, m, o, v, and w comply with SUSv2.
-.Pp
-For maximum portability, scripts that invoke
-.Nm tar
-should use the bundled-argument format above, should limit
-themselves to the
-.Cm c ,
-.Cm t ,
-and
-.Cm x
-modes, and the
-.Cm b ,
-.Cm f ,
-.Cm m ,
-.Cm v ,
-and
-.Cm w
-options.
-.Pp
-On systems that support getopt_long(), additional long options
-are available to improve compatibility with other tar implementations.
-.Sh SECURITY
-Certain security issues are common to many archiving programs, including
-.Nm .
-In particular, carefully-crafted archives can request that
-.Nm
-extract files to locations outside of the target directory.
-This can potentially be used to cause unwitting users to overwrite
-files they did not intend to overwrite.
-If the archive is being extracted by the superuser, any file
-on the system can potentially be overwritten.
-There are three ways this can happen.
-Although
-.Nm
-has mechanisms to protect against each one,
-savvy users should be aware of the implications:
-.Bl -bullet -width indent
-.It
-Archive entries can have absolute pathnames.
-By default,
-.Nm
-removes the leading
-.Pa /
-character from filenames before restoring them to guard against this problem.
-.It
-Archive entries can have pathnames that include
-.Pa ..
-components.
-By default,
-.Nm
-will not extract files containing
-.Pa ..
-components in their pathname.
-.It
-Archive entries can exploit symbolic links to restore
-files to other directories.
-An archive can restore a symbolic link to another directory,
-then use that link to restore a file into that directory.
-To guard against this,
-.Nm
-checks each extracted path for symlinks.
-If the final path element is a symlink, it will be removed
-and replaced with the archive entry.
-If
-.Fl U
-is specified, any intermediate symlink will also be unconditionally removed.
-If neither
-.Fl U
-nor
-.Fl P
-is specified,
-.Nm
-will refuse to extract the entry.
-.El
-To protect yourself, you should be wary of any archives that
-come from untrusted sources.
-You should examine the contents of an archive with
-.Dl Nm Fl tf Pa filename
-before extraction.
-You should use the
-.Fl k
-option to ensure that
-.Nm
-will not overwrite any existing files or the
-.Fl U
-option to remove any pre-existing files.
-You should generally not extract archives while running with super-user
-privileges.
-Note that the
-.Fl P
-option to
-.Nm
-disables the security checks above and allows you to extract
-an archive while preserving any absolute pathnames,
-.Pa ..
-components, or symlinks to other directories.
-.Sh SEE ALSO
-.Xr bzip2 1 ,
-.Xr compress 1 ,
-.Xr cpio 1 ,
-.Xr gzip 1 ,
-.Xr mt 1 ,
-.Xr pax 1 ,
-.Xr shar 1 ,
-.Xr libarchive 3 ,
-.Xr libarchive-formats 5 ,
-.Xr tar 5
-.Sh STANDARDS
-There is no current POSIX standard for the tar command; it appeared
-in
-.St -p1003.1-96
-but was dropped from
-.St -p1003.1-2001 .
-The options used by this implementation were developed by surveying a
-number of existing tar implementations as well as the old POSIX specification
-for tar and the current POSIX specification for pax.
-.Pp
-The ustar and pax interchange file formats are defined by
-.St -p1003.1-2001
-for the pax command.
-.Sh HISTORY
-A
-.Nm tar
-command appeared in Seventh Edition Unix, which was released in January, 1979.
-There have been numerous other implementations,
-many of which extended the file format.
-John Gilmore's
-.Nm pdtar
-public-domain implementation (circa November, 1987)
-was quite influential, and formed the basis of GNU tar.
-GNU tar was included as the standard system tar
-in
-.Fx
-beginning with
-.Fx 1.0 .
-.Pp
-This is a complete re-implementation based on the
-.Xr libarchive 3
-library.
-.Sh BUGS
-This program follows
-.St -p1003.1-96
-for the definition of the
-.Fl l
-option.
-Note that GNU tar prior to version 1.15 treated
-.Fl l
-as a synonym for the
-.Fl -one-file-system
-option.
-.Pp
-The
-.Fl C Pa dir
-option may differ from historic implementations.
-.Pp
-All archive output is written in correctly-sized blocks, even
-if the output is being compressed.
-Whether or not the last output block is padded to a full
-block size varies depending on the format and the
-output device.
-For tar and cpio formats, the last block of output is padded
-to a full block size if the output is being
-written to standard output or to a character or block device such as
-a tape drive.
-If the output is being written to a regular file, the last block
-will not be padded.
-Many compressors, including
-.Xr gzip 1
-and
-.Xr bzip2 1 ,
-complain about the null padding when decompressing an archive created by
-.Nm ,
-although they still extract it correctly.
-.Pp
-The compression and decompression is implemented internally, so
-there may be insignificant differences between the compressed output
-generated by
-.Dl Nm Fl czf Pa - file
-and that generated by
-.Dl Nm Fl cf Pa - file | Nm gzip
-.Pp
-The default should be to read and write archives to the standard I/O paths,
-but tradition (and POSIX) dictates otherwise.
-.Pp
-The
-.Cm r
-and
-.Cm u
-modes require that the archive be uncompressed
-and located in a regular file on disk.
-Other archives can be modified using
-.Cm c
-mode with the
-.Pa @archive-file
-extension.
-.Pp
-To archive a file called
-.Pa @foo
-or
-.Pa -foo
-you must specify it as
-.Pa ./@foo
-or
-.Pa ./-foo ,
-respectively.
-.Pp
-In create mode, a leading
-.Pa ./
-is always removed.
-A leading
-.Pa /
-is stripped unless the
-.Fl P
-option is specified.
-.Pp
-There needs to be better support for file selection on both create
-and extract.
-.Pp
-There is not yet any support for multi-volume archives or for archiving
-sparse files.
-.Pp
-Converting between dissimilar archive formats (such as tar and cpio) using the
-.Cm @ Ns Pa -
-convention can cause hard link information to be lost.
-(This is a consequence of the incompatible ways that different archive
-formats store hardlink information.)
-.Pp
-There are alternative long options for many of the short options that
-are deliberately not documented.
diff --git a/usr.bin/tar/bsdtar.c b/usr.bin/tar/bsdtar.c
deleted file mode 100644
index d935e3f..0000000
--- a/usr.bin/tar/bsdtar.c
+++ /dev/null
@@ -1,959 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "bsdtar_platform.h"
-__FBSDID("$FreeBSD$");
-
-#ifdef HAVE_SYS_PARAM_H
-#include <sys/param.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif
-#ifdef HAVE_GETOPT_LONG
-#include <getopt.h>
-#else
-struct option {
- const char *name;
- int has_arg;
- int *flag;
- int val;
-};
-#define no_argument 0
-#define required_argument 1
-#endif
-#ifdef HAVE_LANGINFO_H
-#include <langinfo.h>
-#endif
-#ifdef HAVE_LOCALE_H
-#include <locale.h>
-#endif
-#ifdef HAVE_PATHS_H
-#include <paths.h>
-#endif
-#include <stdio.h>
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-#ifdef HAVE_TIME_H
-#include <time.h>
-#endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#if HAVE_ZLIB_H
-#include <zlib.h>
-#endif
-
-#include "bsdtar.h"
-
-#if !HAVE_DECL_OPTARG
-extern int optarg;
-#endif
-
-#if !HAVE_DECL_OPTIND
-extern int optind;
-#endif
-
-/*
- * Per POSIX.1-1988, tar defaults to reading/writing archives to/from
- * the default tape device for the system. Pick something reasonable here.
- */
-#ifdef __linux
-#define _PATH_DEFTAPE "/dev/st0"
-#endif
-
-#ifndef _PATH_DEFTAPE
-#define _PATH_DEFTAPE "/dev/tape"
-#endif
-
-/* External function to parse a date/time string (from getdate.y) */
-time_t get_date(const char *);
-
-static int bsdtar_getopt(struct bsdtar *, const char *optstring,
- const struct option **poption);
-static void long_help(struct bsdtar *);
-static void only_mode(struct bsdtar *, const char *opt,
- const char *valid);
-static char ** rewrite_argv(struct bsdtar *,
- int *argc, char ** src_argv,
- const char *optstring);
-static void set_mode(struct bsdtar *, char opt);
-static void version(void);
-
-/*
- * The leading '+' here forces the GNU version of getopt() (as well as
- * both the GNU and BSD versions of getopt_long) to stop at the first
- * non-option. Otherwise, GNU getopt() permutes the arguments and
- * screws up -C processing.
- */
-static const char *tar_opts = "+Bb:C:cf:HhI:jkLlmnOoPpqrts:ST:UuvW:wX:xyZz";
-
-/*
- * Most of these long options are deliberately not documented. They
- * are provided only to make life easier for people who also use GNU tar.
- * The only long options documented in the manual page are the ones
- * with no corresponding short option, such as --exclude, --nodump,
- * and --fast-read.
- *
- * On systems that lack getopt_long, long options can be specified
- * using -W longopt and -W longopt=value, e.g. "-W nodump" is the same
- * as "--nodump" and "-W exclude=pattern" is the same as "--exclude
- * pattern". This does not rely the GNU getopt() "W;" extension, so
- * should work correctly on any system with a POSIX-compliant getopt().
- */
-
-/* Fake short equivalents for long options that otherwise lack them. */
-enum {
- OPTION_CHECK_LINKS = 1,
- OPTION_CHROOT,
- OPTION_EXCLUDE,
- OPTION_FORMAT,
- OPTION_HELP,
- OPTION_INCLUDE,
- OPTION_KEEP_NEWER_FILES,
- OPTION_NEWER_CTIME,
- OPTION_NEWER_CTIME_THAN,
- OPTION_NEWER_MTIME,
- OPTION_NEWER_MTIME_THAN,
- OPTION_NODUMP,
- OPTION_NO_SAME_OWNER,
- OPTION_NO_SAME_PERMISSIONS,
- OPTION_NULL,
- OPTION_NUMERIC_OWNER,
- OPTION_ONE_FILE_SYSTEM,
- OPTION_POSIX,
- OPTION_STRIP_COMPONENTS,
- OPTION_TOTALS,
- OPTION_USE_COMPRESS_PROGRAM,
- OPTION_VERSION
-};
-
-/*
- * If you add anything, be very careful to keep this list properly
- * sorted, as the -W logic relies on it.
- */
-static const struct option tar_longopts[] = {
- { "absolute-paths", no_argument, NULL, 'P' },
- { "append", no_argument, NULL, 'r' },
- { "block-size", required_argument, NULL, 'b' },
- { "bunzip2", no_argument, NULL, 'j' },
- { "bzip", no_argument, NULL, 'j' },
- { "bzip2", no_argument, NULL, 'j' },
- { "cd", required_argument, NULL, 'C' },
- { "check-links", no_argument, NULL, OPTION_CHECK_LINKS },
- { "chroot", no_argument, NULL, OPTION_CHROOT },
- { "compress", no_argument, NULL, 'Z' },
- { "confirmation", no_argument, NULL, 'w' },
- { "create", no_argument, NULL, 'c' },
- { "dereference", no_argument, NULL, 'L' },
- { "directory", required_argument, NULL, 'C' },
- { "exclude", required_argument, NULL, OPTION_EXCLUDE },
- { "exclude-from", required_argument, NULL, 'X' },
- { "extract", no_argument, NULL, 'x' },
- { "fast-read", no_argument, NULL, 'q' },
- { "file", required_argument, NULL, 'f' },
- { "files-from", required_argument, NULL, 'T' },
- { "format", required_argument, NULL, OPTION_FORMAT },
- { "gunzip", no_argument, NULL, 'z' },
- { "gzip", no_argument, NULL, 'z' },
- { "help", no_argument, NULL, OPTION_HELP },
- { "include", required_argument, NULL, OPTION_INCLUDE },
- { "interactive", no_argument, NULL, 'w' },
- { "insecure", no_argument, NULL, 'P' },
- { "keep-newer-files", no_argument, NULL, OPTION_KEEP_NEWER_FILES },
- { "keep-old-files", no_argument, NULL, 'k' },
- { "list", no_argument, NULL, 't' },
- { "modification-time", no_argument, NULL, 'm' },
- { "newer", required_argument, NULL, OPTION_NEWER_CTIME },
- { "newer-ctime", required_argument, NULL, OPTION_NEWER_CTIME },
- { "newer-ctime-than", required_argument, NULL, OPTION_NEWER_CTIME_THAN },
- { "newer-mtime", required_argument, NULL, OPTION_NEWER_MTIME },
- { "newer-mtime-than", required_argument, NULL, OPTION_NEWER_MTIME_THAN },
- { "newer-than", required_argument, NULL, OPTION_NEWER_CTIME_THAN },
- { "nodump", no_argument, NULL, OPTION_NODUMP },
- { "norecurse", no_argument, NULL, 'n' },
- { "no-recursion", no_argument, NULL, 'n' },
- { "no-same-owner", no_argument, NULL, OPTION_NO_SAME_OWNER },
- { "no-same-permissions",no_argument, NULL, OPTION_NO_SAME_PERMISSIONS },
- { "null", no_argument, NULL, OPTION_NULL },
- { "numeric-owner", no_argument, NULL, OPTION_NUMERIC_OWNER },
- { "one-file-system", no_argument, NULL, OPTION_ONE_FILE_SYSTEM },
- { "posix", no_argument, NULL, OPTION_POSIX },
- { "preserve-permissions", no_argument, NULL, 'p' },
- { "read-full-blocks", no_argument, NULL, 'B' },
- { "same-permissions", no_argument, NULL, 'p' },
- { "strip-components", required_argument, NULL, OPTION_STRIP_COMPONENTS },
- { "to-stdout", no_argument, NULL, 'O' },
- { "totals", no_argument, NULL, OPTION_TOTALS },
- { "uncompress", no_argument, NULL, 'Z' },
- { "unlink", no_argument, NULL, 'U' },
- { "unlink-first", no_argument, NULL, 'U' },
- { "update", no_argument, NULL, 'u' },
- { "use-compress-program",
- required_argument, NULL, OPTION_USE_COMPRESS_PROGRAM },
- { "verbose", no_argument, NULL, 'v' },
- { "version", no_argument, NULL, OPTION_VERSION },
- { NULL, 0, NULL, 0 }
-};
-
-/* A basic set of security flags to request from libarchive. */
-#define SECURITY \
- (ARCHIVE_EXTRACT_SECURE_SYMLINKS \
- | ARCHIVE_EXTRACT_SECURE_NODOTDOT)
-
-int
-main(int argc, char **argv)
-{
- struct bsdtar *bsdtar, bsdtar_storage;
- const struct option *option;
- int opt, t;
- char option_o;
- char possible_help_request;
- char buff[16];
-
- /*
- * Use a pointer for consistency, but stack-allocated storage
- * for ease of cleanup.
- */
- bsdtar = &bsdtar_storage;
- memset(bsdtar, 0, sizeof(*bsdtar));
- bsdtar->fd = -1; /* Mark as "unused" */
- option_o = 0;
-
- /* Need bsdtar->progname before calling bsdtar_warnc. */
- if (*argv == NULL)
- bsdtar->progname = "bsdtar";
- else {
- bsdtar->progname = strrchr(*argv, '/');
- if (bsdtar->progname != NULL)
- bsdtar->progname++;
- else
- bsdtar->progname = *argv;
- }
-
- if (setlocale(LC_ALL, "") == NULL)
- bsdtar_warnc(bsdtar, 0, "Failed to set default locale");
-#if defined(HAVE_NL_LANGINFO) && defined(HAVE_D_MD_ORDER)
- bsdtar->day_first = (*nl_langinfo(D_MD_ORDER) == 'd');
-#endif
- possible_help_request = 0;
-
- /* Look up uid of current user for future reference */
- bsdtar->user_uid = geteuid();
-
- /* Default: open tape drive. */
- bsdtar->filename = getenv("TAPE");
- if (bsdtar->filename == NULL)
- bsdtar->filename = _PATH_DEFTAPE;
-
- /* Default: preserve mod time on extract */
- bsdtar->extract_flags = ARCHIVE_EXTRACT_TIME;
-
- /* Default: Perform basic security checks. */
- bsdtar->extract_flags |= SECURITY;
-
- /* Defaults for root user: */
- if (bsdtar->user_uid == 0) {
- /* --same-owner */
- bsdtar->extract_flags |= ARCHIVE_EXTRACT_OWNER;
- /* -p */
- bsdtar->extract_flags |= ARCHIVE_EXTRACT_PERM;
- bsdtar->extract_flags |= ARCHIVE_EXTRACT_ACL;
- bsdtar->extract_flags |= ARCHIVE_EXTRACT_XATTR;
- bsdtar->extract_flags |= ARCHIVE_EXTRACT_FFLAGS;
- }
-
- /* Rewrite traditional-style tar arguments, if used. */
- argv = rewrite_argv(bsdtar, &argc, argv, tar_opts);
-
- bsdtar->argv = argv;
- bsdtar->argc = argc;
-
- /* Process all remaining arguments now. */
- /*
- * Comments following each option indicate where that option
- * originated: SUSv2, POSIX, GNU tar, star, etc. If there's
- * no such comment, then I don't know of anyone else who
- * implements that option.
- */
- while ((opt = bsdtar_getopt(bsdtar, tar_opts, &option)) != -1) {
- switch (opt) {
- case 'B': /* GNU tar */
- /* libarchive doesn't need this; just ignore it. */
- break;
- case 'b': /* SUSv2 */
- t = atoi(optarg);
- if (t <= 0 || t > 1024)
- bsdtar_errc(bsdtar, 1, 0,
- "Argument to -b is out of range (1..1024)");
- bsdtar->bytes_per_block = 512 * t;
- break;
- case 'C': /* GNU tar */
- set_chdir(bsdtar, optarg);
- break;
- case 'c': /* SUSv2 */
- set_mode(bsdtar, opt);
- break;
- case OPTION_CHECK_LINKS: /* GNU tar */
- bsdtar->option_warn_links = 1;
- break;
- case OPTION_CHROOT: /* NetBSD */
- bsdtar->option_chroot = 1;
- break;
- case OPTION_EXCLUDE: /* GNU tar */
- if (exclude(bsdtar, optarg))
- bsdtar_errc(bsdtar, 1, 0,
- "Couldn't exclude %s\n", optarg);
- break;
- case OPTION_FORMAT: /* GNU tar, others */
- bsdtar->create_format = optarg;
- break;
- case 'f': /* SUSv2 */
- bsdtar->filename = optarg;
- if (strcmp(bsdtar->filename, "-") == 0)
- bsdtar->filename = NULL;
- break;
- case 'H': /* BSD convention */
- bsdtar->symlink_mode = 'H';
- break;
- case 'h': /* Linux Standards Base, gtar; synonym for -L */
- bsdtar->symlink_mode = 'L';
- /* Hack: -h by itself is the "help" command. */
- possible_help_request = 1;
- break;
- case OPTION_HELP: /* GNU tar, others */
- long_help(bsdtar);
- exit(0);
- break;
- case 'I': /* GNU tar */
- /*
- * TODO: Allow 'names' to come from an archive,
- * not just a text file. Design a good UI for
- * allowing names and mode/owner to be read
- * from an archive, with contents coming from
- * disk. This can be used to "refresh" an
- * archive or to design archives with special
- * permissions without having to create those
- * permissions on disk.
- */
- bsdtar->names_from_file = optarg;
- break;
- case OPTION_INCLUDE:
- /*
- * Noone else has the @archive extension, so
- * noone else needs this to filter entries
- * when transforming archives.
- */
- if (include(bsdtar, optarg))
- bsdtar_errc(bsdtar, 1, 0,
- "Failed to add %s to inclusion list",
- optarg);
- break;
- case 'j': /* GNU tar */
-#if HAVE_LIBBZ2
- if (bsdtar->create_compression != '\0')
- bsdtar_errc(bsdtar, 1, 0,
- "Can't specify both -%c and -%c", opt,
- bsdtar->create_compression);
- bsdtar->create_compression = opt;
-#else
- bsdtar_warnc(bsdtar, 0, "-j compression not supported by this version of bsdtar");
- usage(bsdtar);
-#endif
- break;
- case 'k': /* GNU tar */
- bsdtar->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE;
- break;
- case OPTION_KEEP_NEWER_FILES: /* GNU tar */
- bsdtar->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER;
- break;
- case 'L': /* BSD convention */
- bsdtar->symlink_mode = 'L';
- break;
- case 'l': /* SUSv2 and GNU tar beginning with 1.16 */
- /* GNU tar 1.13 used -l for --one-file-system */
- bsdtar->option_warn_links = 1;
- break;
- case 'm': /* SUSv2 */
- bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_TIME;
- break;
- case 'n': /* GNU tar */
- bsdtar->option_no_subdirs = 1;
- break;
- /*
- * Selecting files by time:
- * --newer-?time='date' Only files newer than 'date'
- * --newer-?time-than='file' Only files newer than time
- * on specified file (useful for incremental backups)
- * TODO: Add corresponding "older" options to reverse these.
- */
- case OPTION_NEWER_CTIME: /* GNU tar */
- bsdtar->newer_ctime_sec = get_date(optarg);
- break;
- case OPTION_NEWER_CTIME_THAN:
- {
- struct stat st;
- if (stat(optarg, &st) != 0)
- bsdtar_errc(bsdtar, 1, 0,
- "Can't open file %s", optarg);
- bsdtar->newer_ctime_sec = st.st_ctime;
- bsdtar->newer_ctime_nsec =
- ARCHIVE_STAT_CTIME_NANOS(&st);
- }
- break;
- case OPTION_NEWER_MTIME: /* GNU tar */
- bsdtar->newer_mtime_sec = get_date(optarg);
- break;
- case OPTION_NEWER_MTIME_THAN:
- {
- struct stat st;
- if (stat(optarg, &st) != 0)
- bsdtar_errc(bsdtar, 1, 0,
- "Can't open file %s", optarg);
- bsdtar->newer_mtime_sec = st.st_mtime;
- bsdtar->newer_mtime_nsec =
- ARCHIVE_STAT_MTIME_NANOS(&st);
- }
- break;
- case OPTION_NODUMP: /* star */
- bsdtar->option_honor_nodump = 1;
- break;
- case OPTION_NO_SAME_OWNER: /* GNU tar */
- bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_OWNER;
- break;
- case OPTION_NO_SAME_PERMISSIONS: /* GNU tar */
- bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_PERM;
- bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_ACL;
- bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_XATTR;
- bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_FFLAGS;
- break;
- case OPTION_NULL: /* GNU tar */
- bsdtar->option_null++;
- break;
- case OPTION_NUMERIC_OWNER: /* GNU tar */
- bsdtar->option_numeric_owner++;
- break;
- case 'O': /* GNU tar */
- bsdtar->option_stdout = 1;
- break;
- case 'o': /* SUSv2 and GNU conflict here, but not fatally */
- option_o = 1; /* Record it and resolve it later. */
- break;
- case OPTION_ONE_FILE_SYSTEM: /* GNU tar */
- bsdtar->option_dont_traverse_mounts = 1;
- break;
-#if 0
- /*
- * The common BSD -P option is not necessary, since
- * our default is to archive symlinks, not follow
- * them. This is convenient, as -P conflicts with GNU
- * tar anyway.
- */
- case 'P': /* BSD convention */
- /* Default behavior, no option necessary. */
- break;
-#endif
- case 'P': /* GNU tar */
- bsdtar->extract_flags &= ~SECURITY;
- bsdtar->option_absolute_paths = 1;
- break;
- case 'p': /* GNU tar, star */
- bsdtar->extract_flags |= ARCHIVE_EXTRACT_PERM;
- bsdtar->extract_flags |= ARCHIVE_EXTRACT_ACL;
- bsdtar->extract_flags |= ARCHIVE_EXTRACT_XATTR;
- bsdtar->extract_flags |= ARCHIVE_EXTRACT_FFLAGS;
- break;
- case OPTION_POSIX: /* GNU tar */
- bsdtar->create_format = "pax";
- break;
- case 'q': /* FreeBSD GNU tar --fast-read, NetBSD -q */
- bsdtar->option_fast_read = 1;
- break;
- case 'r': /* SUSv2 */
- set_mode(bsdtar, opt);
- break;
- case 'S': /* NetBSD pax-as-tar */
- bsdtar->extract_flags |= ARCHIVE_EXTRACT_SPARSE;
- break;
- case 's': /* NetBSD pax-as-tar */
-#if HAVE_REGEX_H
- add_substitution(bsdtar, optarg);
-#else
- bsdtar_warnc(bsdtar, 0, "-s is not supported by this version of bsdtar");
- usage(bsdtar);
-#endif
- break;
- case OPTION_STRIP_COMPONENTS: /* GNU tar 1.15 */
- bsdtar->strip_components = atoi(optarg);
- break;
- case 'T': /* GNU tar */
- bsdtar->names_from_file = optarg;
- break;
- case 't': /* SUSv2 */
- set_mode(bsdtar, opt);
- bsdtar->verbose++;
- break;
- case OPTION_TOTALS: /* GNU tar */
- bsdtar->option_totals++;
- break;
- case 'U': /* GNU tar */
- bsdtar->extract_flags |= ARCHIVE_EXTRACT_UNLINK;
- bsdtar->option_unlink_first = 1;
- break;
- case 'u': /* SUSv2 */
- set_mode(bsdtar, opt);
- break;
- case 'v': /* SUSv2 */
- bsdtar->verbose++;
- break;
- case OPTION_VERSION: /* GNU convention */
- version();
- break;
-#if 0
- /*
- * The -W longopt feature is handled inside of
- * bsdtar_getop(), so -W is not available here.
- */
- case 'W': /* Obscure, but useful GNU convention. */
- break;
-#endif
- case 'w': /* SUSv2 */
- bsdtar->option_interactive = 1;
- break;
- case 'X': /* GNU tar */
- if (exclude_from_file(bsdtar, optarg))
- bsdtar_errc(bsdtar, 1, 0,
- "failed to process exclusions from file %s",
- optarg);
- break;
- case 'x': /* SUSv2 */
- set_mode(bsdtar, opt);
- break;
- case 'y': /* FreeBSD version of GNU tar */
-#if HAVE_LIBBZ2
- if (bsdtar->create_compression != '\0')
- bsdtar_errc(bsdtar, 1, 0,
- "Can't specify both -%c and -%c", opt,
- bsdtar->create_compression);
- bsdtar->create_compression = opt;
-#else
- bsdtar_warnc(bsdtar, 0, "-y compression not supported by this version of bsdtar");
- usage(bsdtar);
-#endif
- break;
- case 'Z': /* GNU tar */
- if (bsdtar->create_compression != '\0')
- bsdtar_errc(bsdtar, 1, 0,
- "Can't specify both -%c and -%c", opt,
- bsdtar->create_compression);
- bsdtar->create_compression = opt;
- break;
- case 'z': /* GNU tar, star, many others */
-#if HAVE_LIBZ
- if (bsdtar->create_compression != '\0')
- bsdtar_errc(bsdtar, 1, 0,
- "Can't specify both -%c and -%c", opt,
- bsdtar->create_compression);
- bsdtar->create_compression = opt;
-#else
- bsdtar_warnc(bsdtar, 0, "-z compression not supported by this version of bsdtar");
- usage(bsdtar);
-#endif
- break;
- case OPTION_USE_COMPRESS_PROGRAM:
- bsdtar->compress_program = optarg;
- break;
- default:
- usage(bsdtar);
- }
- }
-
- /*
- * Sanity-check options.
- */
-
- /* If no "real" mode was specified, treat -h as --help. */
- if ((bsdtar->mode == '\0') && possible_help_request) {
- long_help(bsdtar);
- exit(0);
- }
-
- /* Otherwise, a mode is required. */
- if (bsdtar->mode == '\0')
- bsdtar_errc(bsdtar, 1, 0,
- "Must specify one of -c, -r, -t, -u, -x");
-
- /* Check boolean options only permitted in certain modes. */
- if (bsdtar->option_dont_traverse_mounts)
- only_mode(bsdtar, "--one-file-system", "cru");
- if (bsdtar->option_fast_read)
- only_mode(bsdtar, "--fast-read", "xt");
- if (bsdtar->option_honor_nodump)
- only_mode(bsdtar, "--nodump", "cru");
- if (option_o > 0) {
- switch (bsdtar->mode) {
- case 'c':
- /*
- * In GNU tar, -o means "old format." The
- * "ustar" format is the closest thing
- * supported by libarchive.
- */
- bsdtar->create_format = "ustar";
- /* TODO: bsdtar->create_format = "v7"; */
- break;
- case 'x':
- /* POSIX-compatible behavior. */
- bsdtar->option_no_owner = 1;
- bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_OWNER;
- break;
- default:
- only_mode(bsdtar, "-o", "xc");
- break;
- }
- }
- if (bsdtar->option_no_subdirs)
- only_mode(bsdtar, "-n", "cru");
- if (bsdtar->option_stdout)
- only_mode(bsdtar, "-O", "xt");
- if (bsdtar->option_unlink_first)
- only_mode(bsdtar, "-U", "x");
- if (bsdtar->option_warn_links)
- only_mode(bsdtar, "--check-links", "cr");
-
- /* Check other parameters only permitted in certain modes. */
- if (bsdtar->create_compression != '\0') {
- strcpy(buff, "-?");
- buff[1] = bsdtar->create_compression;
- only_mode(bsdtar, buff, "cxt");
- }
- if (bsdtar->create_format != NULL)
- only_mode(bsdtar, "--format", "cru");
- if (bsdtar->symlink_mode != '\0') {
- strcpy(buff, "-?");
- buff[1] = bsdtar->symlink_mode;
- only_mode(bsdtar, buff, "cru");
- }
- if (bsdtar->strip_components != 0)
- only_mode(bsdtar, "--strip-components", "xt");
-
- bsdtar->argc -= optind;
- bsdtar->argv += optind;
-
- switch(bsdtar->mode) {
- case 'c':
- tar_mode_c(bsdtar);
- break;
- case 'r':
- tar_mode_r(bsdtar);
- break;
- case 't':
- tar_mode_t(bsdtar);
- break;
- case 'u':
- tar_mode_u(bsdtar);
- break;
- case 'x':
- tar_mode_x(bsdtar);
- break;
- }
-
- cleanup_exclusions(bsdtar);
-#if HAVE_REGEX_H
- cleanup_substitution(bsdtar);
-#endif
-
- if (bsdtar->return_value != 0)
- bsdtar_warnc(bsdtar, 0,
- "Error exit delayed from previous errors.");
- return (bsdtar->return_value);
-}
-
-static void
-set_mode(struct bsdtar *bsdtar, char opt)
-{
- if (bsdtar->mode != '\0' && bsdtar->mode != opt)
- bsdtar_errc(bsdtar, 1, 0,
- "Can't specify both -%c and -%c", opt, bsdtar->mode);
- bsdtar->mode = opt;
-}
-
-/*
- * Verify that the mode is correct.
- */
-static void
-only_mode(struct bsdtar *bsdtar, const char *opt, const char *valid_modes)
-{
- if (strchr(valid_modes, bsdtar->mode) == NULL)
- bsdtar_errc(bsdtar, 1, 0,
- "Option %s is not permitted in mode -%c",
- opt, bsdtar->mode);
-}
-
-
-/*-
- * Convert traditional tar arguments into new-style.
- * For example,
- * tar tvfb file.tar 32 --exclude FOO
- * will be converted to
- * tar -t -v -f file.tar -b 32 --exclude FOO
- *
- * This requires building a new argv array. The initial bundled word
- * gets expanded into a new string that looks like "-t\0-v\0-f\0-b\0".
- * The new argv array has pointers into this string intermingled with
- * pointers to the existing arguments. Arguments are moved to
- * immediately follow their options.
- *
- * The optstring argument here is the same one passed to getopt(3).
- * It is used to determine which option letters have trailing arguments.
- */
-char **
-rewrite_argv(struct bsdtar *bsdtar, int *argc, char **src_argv,
- const char *optstring)
-{
- char **new_argv, **dest_argv;
- const char *p;
- char *src, *dest;
-
- if (src_argv[0] == NULL || src_argv[1] == NULL ||
- src_argv[1][0] == '-' || src_argv[1][0] == '\0')
- return (src_argv);
-
- *argc += strlen(src_argv[1]) - 1;
- new_argv = malloc((*argc + 1) * sizeof(new_argv[0]));
- if (new_argv == NULL)
- bsdtar_errc(bsdtar, 1, errno, "No Memory");
-
- dest_argv = new_argv;
- *dest_argv++ = *src_argv++;
-
- dest = malloc(strlen(*src_argv) * 3);
- if (dest == NULL)
- bsdtar_errc(bsdtar, 1, errno, "No memory");
- for (src = *src_argv++; *src != '\0'; src++) {
- *dest_argv++ = dest;
- *dest++ = '-';
- *dest++ = *src;
- *dest++ = '\0';
- /* If option takes an argument, insert that into the list. */
- for (p = optstring; p != NULL && *p != '\0'; p++) {
- if (*p != *src)
- continue;
- if (p[1] != ':') /* No arg required, done. */
- break;
- if (*src_argv == NULL) /* No arg available? Error. */
- bsdtar_errc(bsdtar, 1, 0,
- "Option %c requires an argument",
- *src);
- *dest_argv++ = *src_argv++;
- break;
- }
- }
-
- /* Copy remaining arguments, including trailing NULL. */
- while ((*dest_argv++ = *src_argv++) != NULL)
- ;
-
- return (new_argv);
-}
-
-void
-usage(struct bsdtar *bsdtar)
-{
- const char *p;
-
- p = bsdtar->progname;
-
- fprintf(stderr, "Usage:\n");
- fprintf(stderr, " List: %s -tf <archive-filename>\n", p);
- fprintf(stderr, " Extract: %s -xf <archive-filename>\n", p);
- fprintf(stderr, " Create: %s -cf <archive-filename> [filenames...]\n", p);
-#ifdef HAVE_GETOPT_LONG
- fprintf(stderr, " Help: %s --help\n", p);
-#else
- fprintf(stderr, " Help: %s -h\n", p);
-#endif
- exit(1);
-}
-
-static void
-version(void)
-{
- printf("bsdtar %s - %s\n",
- BSDTAR_VERSION_STRING,
- archive_version());
- exit(0);
-}
-
-static const char *long_help_msg =
- "First option must be a mode specifier:\n"
- " -c Create -r Add/Replace -t List -u Update -x Extract\n"
- "Common Options:\n"
- " -b # Use # 512-byte records per I/O block\n"
- " -f <filename> Location of archive (default " _PATH_DEFTAPE ")\n"
- " -v Verbose\n"
- " -w Interactive\n"
- "Create: %p -c [options] [<file> | <dir> | @<archive> | -C <dir> ]\n"
- " <file>, <dir> add these items to archive\n"
- " -z, -j Compress archive with gzip/bzip2\n"
- " --format {ustar|pax|cpio|shar} Select archive format\n"
-#ifdef HAVE_GETOPT_LONG
- " --exclude <pattern> Skip files that match pattern\n"
-#else
- " -W exclude=<pattern> Skip files that match pattern\n"
-#endif
- " -C <dir> Change to <dir> before processing remaining files\n"
- " @<archive> Add entries from <archive> to output\n"
- "List: %p -t [options] [<patterns>]\n"
- " <patterns> If specified, list only entries that match\n"
- "Extract: %p -x [options] [<patterns>]\n"
- " <patterns> If specified, extract only entries that match\n"
- " -k Keep (don't overwrite) existing files\n"
- " -m Don't restore modification times\n"
- " -O Write entries to stdout, don't restore to disk\n"
- " -p Restore permissions (including ACLs, owner, file flags)\n";
-
-
-/*
- * Note that the word 'bsdtar' will always appear in the first line
- * of output.
- *
- * In particular, /bin/sh scripts that need to test for the presence
- * of bsdtar can use the following template:
- *
- * if (tar --help 2>&1 | grep bsdtar >/dev/null 2>&1 ) then \
- * echo bsdtar; else echo not bsdtar; fi
- */
-static void
-long_help(struct bsdtar *bsdtar)
-{
- const char *prog;
- const char *p;
-
- prog = bsdtar->progname;
-
- fflush(stderr);
-
- p = (strcmp(prog,"bsdtar") != 0) ? "(bsdtar)" : "";
- printf("%s%s: manipulate archive files\n", prog, p);
-
- for (p = long_help_msg; *p != '\0'; p++) {
- if (*p == '%') {
- if (p[1] == 'p') {
- fputs(prog, stdout);
- p++;
- } else
- putchar('%');
- } else
- putchar(*p);
- }
- version();
-}
-
-static int
-bsdtar_getopt(struct bsdtar *bsdtar, const char *optstring,
- const struct option **poption)
-{
- char *p, *q;
- const struct option *option;
- int opt;
- int option_index;
- size_t option_length;
-
- option_index = -1;
- *poption = NULL;
-
-#ifdef HAVE_GETOPT_LONG
- opt = getopt_long(bsdtar->argc, bsdtar->argv, optstring,
- tar_longopts, &option_index);
- if (option_index > -1)
- *poption = tar_longopts + option_index;
-#else
- opt = getopt(bsdtar->argc, bsdtar->argv, optstring);
-#endif
-
- /* Support long options through -W longopt=value */
- if (opt == 'W') {
- p = optarg;
- q = strchr(optarg, '=');
- if (q != NULL) {
- option_length = (size_t)(q - p);
- optarg = q + 1;
- } else {
- option_length = strlen(p);
- optarg = NULL;
- }
- option = tar_longopts;
- while (option->name != NULL &&
- (strlen(option->name) < option_length ||
- strncmp(p, option->name, option_length) != 0 )) {
- option++;
- }
-
- if (option->name != NULL) {
- *poption = option;
- opt = option->val;
-
- /* If the first match was exact, we're done. */
- if (strncmp(p, option->name, strlen(option->name)) == 0) {
- while (option->name != NULL)
- option++;
- } else {
- /* Check if there's another match. */
- option++;
- while (option->name != NULL &&
- (strlen(option->name) < option_length ||
- strncmp(p, option->name, option_length) != 0)) {
- option++;
- }
- }
- if (option->name != NULL)
- bsdtar_errc(bsdtar, 1, 0,
- "Ambiguous option %s "
- "(matches both %s and %s)",
- p, (*poption)->name, option->name);
-
- if ((*poption)->has_arg == required_argument
- && optarg == NULL)
- bsdtar_errc(bsdtar, 1, 0,
- "Option \"%s\" requires argument", p);
- } else {
- opt = '?';
- /* TODO: Set up a fake 'struct option' for
- * error reporting... ? ? ? */
- }
- }
-
- return (opt);
-}
diff --git a/usr.bin/tar/bsdtar.h b/usr.bin/tar/bsdtar.h
deleted file mode 100644
index eee53a9..0000000
--- a/usr.bin/tar/bsdtar.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include "bsdtar_platform.h"
-#include <stdio.h>
-
-#define DEFAULT_BYTES_PER_BLOCK (20*512)
-
-/*
- * The internal state for the "bsdtar" program.
- *
- * Keeping all of the state in a structure like this simplifies memory
- * leak testing (at exit, anything left on the heap is suspect). A
- * pointer to this structure is passed to most bsdtar internal
- * functions.
- */
-struct bsdtar {
- /* Options */
- const char *filename; /* -f filename */
- const char *create_format; /* -F format */
- char *pending_chdir; /* -C dir */
- const char *names_from_file; /* -T file */
- time_t newer_ctime_sec; /* --newer/--newer-than */
- long newer_ctime_nsec; /* --newer/--newer-than */
- time_t newer_mtime_sec; /* --newer-mtime */
- long newer_mtime_nsec; /* --newer-mtime-than */
- int bytes_per_block; /* -b block_size */
- int verbose; /* -v */
- int extract_flags; /* Flags for extract operation */
- int strip_components; /* Remove this many leading dirs */
- char mode; /* Program mode: 'c', 't', 'r', 'u', 'x' */
- char symlink_mode; /* H or L, per BSD conventions */
- char create_compression; /* j, y, or z */
- const char *compress_program;
- char option_absolute_paths; /* -P */
- char option_chroot; /* --chroot */
- char option_dont_traverse_mounts; /* --one-file-system */
- char option_fast_read; /* --fast-read */
- char option_honor_nodump; /* --nodump */
- char option_interactive; /* -w */
- char option_no_owner; /* -o */
- char option_no_subdirs; /* -n */
- char option_null; /* --null */
- char option_numeric_owner; /* --numeric-owner */
- char option_stdout; /* -O */
- char option_totals; /* --totals */
- char option_unlink_first; /* -U */
- char option_warn_links; /* --check-links */
- char day_first; /* show day before month in -tv output */
-
- /* If >= 0, then close this when done. */
- int fd;
-
- /* Miscellaneous state information */
- struct archive *archive;
- const char *progname;
- int argc;
- char **argv;
- size_t gs_width; /* For 'list_item' in read.c */
- size_t u_width; /* for 'list_item' in read.c */
- uid_t user_uid; /* UID running this program */
- int return_value; /* Value returned by main() */
- char warned_lead_slash; /* Already displayed warning */
- char next_line_is_dir; /* Used for -C parsing in -cT */
-
- /*
- * Data for various subsystems. Full definitions are located in
- * the file where they are used.
- */
- struct archive_entry_linkresolver *resolver;
- struct archive_dir *archive_dir; /* for write.c */
- struct name_cache *gname_cache; /* for write.c */
- char *buff; /* for write.c */
- struct matching *matching; /* for matching.c */
- struct security *security; /* for read.c */
- struct name_cache *uname_cache; /* for write.c */
- struct siginfo_data *siginfo; /* for siginfo.c */
- struct substitution *substitution; /* for subst.c */
-};
-
-void bsdtar_errc(struct bsdtar *, int _eval, int _code,
- const char *fmt, ...) __dead2;
-void bsdtar_warnc(struct bsdtar *, int _code, const char *fmt, ...);
-void cleanup_exclusions(struct bsdtar *);
-void do_chdir(struct bsdtar *);
-int edit_pathname(struct bsdtar *, struct archive_entry *);
-int exclude(struct bsdtar *, const char *pattern);
-int exclude_from_file(struct bsdtar *, const char *pathname);
-int excluded(struct bsdtar *, const char *pathname);
-int include(struct bsdtar *, const char *pattern);
-int include_from_file(struct bsdtar *, const char *pathname);
-int pathcmp(const char *a, const char *b);
-int process_lines(struct bsdtar *bsdtar, const char *pathname,
- int (*process)(struct bsdtar *, const char *));
-void safe_fprintf(FILE *, const char *fmt, ...);
-void set_chdir(struct bsdtar *, const char *newdir);
-void siginfo_init(struct bsdtar *);
-void siginfo_setinfo(struct bsdtar *, const char * oper,
- const char * path, int64_t size);
-void siginfo_printinfo(struct bsdtar *, off_t progress);
-void siginfo_done(struct bsdtar *);
-void tar_mode_c(struct bsdtar *bsdtar);
-void tar_mode_r(struct bsdtar *bsdtar);
-void tar_mode_t(struct bsdtar *bsdtar);
-void tar_mode_u(struct bsdtar *bsdtar);
-void tar_mode_x(struct bsdtar *bsdtar);
-int unmatched_inclusions(struct bsdtar *bsdtar);
-int unmatched_inclusions_warn(struct bsdtar *bsdtar, const char *msg);
-void usage(struct bsdtar *);
-int yes(const char *fmt, ...);
-
-#if HAVE_REGEX_H
-void add_substitution(struct bsdtar *, const char *);
-int apply_substitution(struct bsdtar *, const char *, char **, int);
-void cleanup_substitution(struct bsdtar *);
-#endif
diff --git a/usr.bin/tar/bsdtar_platform.h b/usr.bin/tar/bsdtar_platform.h
deleted file mode 100644
index 52d160e..0000000
--- a/usr.bin/tar/bsdtar_platform.h
+++ /dev/null
@@ -1,150 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/*
- * This header is the first thing included in any of the bsdtar
- * source files. As far as possible, platform-specific issues should
- * be dealt with here and not within individual source files.
- */
-
-#ifndef BSDTAR_PLATFORM_H_INCLUDED
-#define BSDTAR_PLATFORM_H_INCLUDED
-
-#if defined(PLATFORM_CONFIG_H)
-/* Use hand-built config.h in environments that need it. */
-#include PLATFORM_CONFIG_H
-#elif defined(HAVE_CONFIG_H)
-/* Most POSIX platforms use the 'configure' script to build config.h */
-#include "../config.h"
-#else
-/* Warn if bsdtar hasn't been (automatically or manually) configured. */
-#error Oops: No config.h and no built-in configuration in bsdtar_platform.h.
-#endif /* !HAVE_CONFIG_H */
-
-/* No non-FreeBSD platform will have __FBSDID, so just define it here. */
-#ifdef __FreeBSD__
-#include <sys/cdefs.h> /* For __FBSDID */
-#else
-/* Just leaving this macro replacement empty leads to a dangling semicolon. */
-#define __FBSDID(a) struct _undefined_hack
-#endif
-
-#ifdef HAVE_LIBARCHIVE
-/* If we're using the platform libarchive, include system headers. */
-#include <archive.h>
-#include <archive_entry.h>
-#else
-/* Otherwise, include user headers. */
-#include "archive.h"
-#include "archive_entry.h"
-#endif
-
-/*
- * Does this platform have complete-looking POSIX-style ACL support,
- * including some variant of the acl_get_perm() function (which was
- * omitted from the POSIX.1e draft)?
- */
-#if HAVE_SYS_ACL_H && HAVE_ACL_PERMSET_T && HAVE_ACL_USER
-#if HAVE_ACL_GET_PERM || HAVE_ACL_GET_PERM_NP
-#define HAVE_POSIX_ACL 1
-#endif
-#endif
-
-#ifdef HAVE_LIBACL
-#include <acl/libacl.h>
-#endif
-
-#if HAVE_ACL_GET_PERM
-#define ACL_GET_PERM acl_get_perm
-#else
-#if HAVE_ACL_GET_PERM_NP
-#define ACL_GET_PERM acl_get_perm_np
-#endif
-#endif
-
-/*
- * Include "dirent.h" (or it's equivalent on several different platforms).
- *
- * This is slightly modified from the GNU autoconf recipe.
- * In particular, FreeBSD includes d_namlen in it's dirent structure,
- * so my configure script includes an explicit test for the d_namlen
- * field.
- */
-#if HAVE_DIRENT_H
-# include <dirent.h>
-# if HAVE_DIRENT_D_NAMLEN
-# define DIRENT_NAMLEN(dirent) (dirent)->d_namlen
-# else
-# define DIRENT_NAMLEN(dirent) strlen((dirent)->d_name)
-# endif
-#else
-# define dirent direct
-# define DIRENT_NAMLEN(dirent) (dirent)->d_namlen
-# if HAVE_SYS_NDIR_H
-# include <sys/ndir.h>
-# endif
-# if HAVE_SYS_DIR_H
-# include <sys/dir.h>
-# endif
-# if HAVE_NDIR_H
-# include <ndir.h>
-# endif
-#endif
-
-
-/*
- * We need to be able to display a filesize using printf(). The type
- * and format string here must be compatible with one another and
- * large enough for any file.
- */
-#if HAVE_UINTMAX_T
-#define BSDTAR_FILESIZE_TYPE uintmax_t
-#define BSDTAR_FILESIZE_PRINTF "%ju"
-#else
-#if HAVE_UNSIGNED_LONG_LONG
-#define BSDTAR_FILESIZE_TYPE unsigned long long
-#define BSDTAR_FILESIZE_PRINTF "%llu"
-#else
-#define BSDTAR_FILESIZE_TYPE unsigned long
-#define BSDTAR_FILESIZE_PRINTF "%lu"
-#endif
-#endif
-
-#if HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC
-#define ARCHIVE_STAT_CTIME_NANOS(st) (st)->st_ctimespec.tv_nsec
-#define ARCHIVE_STAT_MTIME_NANOS(st) (st)->st_mtimespec.tv_nsec
-#else
-#if HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC
-#define ARCHIVE_STAT_CTIME_NANOS(st) (st)->st_ctim.tv_nsec
-#define ARCHIVE_STAT_MTIME_NANOS(st) (st)->st_mtim.tv_nsec
-#else
-#define ARCHIVE_STAT_CTIME_NANOS(st) (0)
-#define ARCHIVE_STAT_MTIME_NANOS(st) (0)
-#endif
-#endif
-
-#endif /* !BSDTAR_PLATFORM_H_INCLUDED */
diff --git a/usr.bin/tar/config_freebsd.h b/usr.bin/tar/config_freebsd.h
deleted file mode 100644
index a3dabc5..0000000
--- a/usr.bin/tar/config_freebsd.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/* A default configuration for FreeBSD, used if there is no config.h. */
-
-#include <sys/param.h> /* __FreeBSD_version */
-
-#if __FreeBSD__ > 4
-#define HAVE_ACL_GET_PERM 0
-#define HAVE_ACL_GET_PERM_NP 1
-#define HAVE_ACL_PERMSET_T 1
-#define HAVE_ACL_USER 1
-#endif
-#undef HAVE_ATTR_XATTR_H
-#define HAVE_BZLIB_H 1
-#define HAVE_CHFLAGS 1
-#define HAVE_CHROOT 1
-#define HAVE_DECL_OPTARG 1
-#define HAVE_DECL_OPTIND 1
-#define HAVE_DIRENT_D_NAMLEN 1
-#define HAVE_DIRENT_H 1
-#define HAVE_D_MD_ORDER 1
-#define HAVE_ERRNO_H 1
-#undef HAVE_EXT2FS_EXT2_FS_H
-#define HAVE_FCHDIR 1
-#define HAVE_FCNTL_H 1
-#define HAVE_FNMATCH 1
-#define HAVE_FNMATCH_H 1
-#define HAVE_FNM_LEADING_DIR 1
-#define HAVE_FTRUNCATE 1
-#define HAVE_GETOPT_LONG 1
-#undef HAVE_GETXATTR
-#define HAVE_GRP_H 1
-#define HAVE_INTTYPES_H 1
-#define HAVE_LANGINFO_H 1
-#undef HAVE_LGETXATTR
-#undef HAVE_LIBACL
-#define HAVE_LIBARCHIVE 1
-#define HAVE_LIBBZ2 1
-#define HAVE_LIBZ 1
-#define HAVE_LIMITS_H 1
-#undef HAVE_LINUX_EXT2_FS_H
-#undef HAVE_LINUX_FS_H
-#undef HAVE_LISTXATTR
-#undef HAVE_LLISTXATTR
-#define HAVE_LOCALE_H 1
-#define HAVE_MALLOC 1
-#define HAVE_MEMMOVE 1
-#define HAVE_MEMORY_H 1
-#define HAVE_MEMSET 1
-#if __FreeBSD_version >= 450002 /* nl_langinfo introduced */
-#define HAVE_NL_LANGINFO 1
-#endif
-#define HAVE_PATHS_H 1
-#define HAVE_PWD_H 1
-#define HAVE_REGEX_H 1
-#define HAVE_SETLOCALE 1
-#define HAVE_STDARG_H 1
-#define HAVE_STDINT_H 1
-#define HAVE_STDLIB_H 1
-#define HAVE_STRCHR 1
-#define HAVE_STRDUP 1
-#define HAVE_STRERROR 1
-#define HAVE_STRFTIME 1
-#define HAVE_STRINGS_H 1
-#define HAVE_STRING_H 1
-#define HAVE_STRRCHR 1
-#define HAVE_STRUCT_STAT_ST_FLAGS 1
-#undef HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC
-#define HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC 1
-#define HAVE_SYS_ACL_H 1
-#define HAVE_SYS_IOCTL_H 1
-#define HAVE_SYS_PARAM_H 1
-#define HAVE_SYS_STAT_H 1
-#define HAVE_TIME_H 1
-#define HAVE_SYS_TYPES_H 1
-#define HAVE_UINTMAX_T 1
-#define HAVE_UNISTD_H 1
-#define HAVE_UNSIGNED_LONG_LONG
-#define HAVE_VPRINTF 1
-#define HAVE_ZLIB_H 1
-#undef MAJOR_IN_MKDEV
-#define STDC_HEADERS 1
-
diff --git a/usr.bin/tar/getdate.y b/usr.bin/tar/getdate.y
deleted file mode 100644
index 16162c3..0000000
--- a/usr.bin/tar/getdate.y
+++ /dev/null
@@ -1,811 +0,0 @@
-%{
-/*
- * March 2005: Further modified and simplified by Tim Kientzle:
- * Eliminate minutes-based calculations (just do everything in
- * seconds), have lexer only recognize unsigned integers (handle '+'
- * and '-' characters in grammar), combine tables into one table with
- * explicit abbreviation notes, do am/pm adjustments in the grammar
- * (eliminate some state variables and post-processing). Among other
- * things, these changes eliminated two shift/reduce conflicts. (Went
- * from 10 to 8.)
- * All of Tim Kientzle's changes to this file are public domain.
- */
-
-/*
-** Originally written by Steven M. Bellovin <smb@research.att.com> while
-** at the University of North Carolina at Chapel Hill. Later tweaked by
-** a couple of people on Usenet. Completely overhauled by Rich $alz
-** <rsalz@bbn.com> and Jim Berets <jberets@bbn.com> in August, 1990;
-**
-** This grammar has 10 shift/reduce conflicts.
-**
-** This code is in the public domain and has no copyright.
-*/
-/* SUPPRESS 287 on yaccpar_sccsid *//* Unused static variable */
-/* SUPPRESS 288 on yyerrlab *//* Label unused */
-
-#ifdef __FreeBSD__
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-#endif
-
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#define yyparse getdate_yyparse
-#define yylex getdate_yylex
-#define yyerror getdate_yyerror
-
-static int yyparse(void);
-static int yylex(void);
-static int yyerror(const char *);
-
-time_t get_date(char *);
-
-#define EPOCH 1970
-#define HOUR(x) ((time_t)(x) * 60)
-#define SECSPERDAY (24L * 60L * 60L)
-
-/*
-** Daylight-savings mode: on, off, or not yet known.
-*/
-typedef enum _DSTMODE {
- DSTon, DSToff, DSTmaybe
-} DSTMODE;
-
-/*
-** Meridian: am or pm.
-*/
-enum { tAM, tPM };
-
-/*
-** Global variables. We could get rid of most of these by using a good
-** union as the yacc stack. (This routine was originally written before
-** yacc had the %union construct.) Maybe someday; right now we only use
-** the %union very rarely.
-*/
-static char *yyInput;
-
-static DSTMODE yyDSTmode;
-static time_t yyDayOrdinal;
-static time_t yyDayNumber;
-static int yyHaveDate;
-static int yyHaveDay;
-static int yyHaveRel;
-static int yyHaveTime;
-static int yyHaveZone;
-static time_t yyTimezone;
-static time_t yyDay;
-static time_t yyHour;
-static time_t yyMinutes;
-static time_t yyMonth;
-static time_t yySeconds;
-static time_t yyYear;
-static time_t yyRelMonth;
-static time_t yyRelSeconds;
-
-%}
-
-%union {
- time_t Number;
-}
-
-%token tAGO tDAY tDAYZONE tAMPM tMONTH tMONTH_UNIT tSEC_UNIT tUNUMBER
-%token tZONE tDST
-
-%type <Number> tDAY tDAYZONE tMONTH tMONTH_UNIT
-%type <Number> tSEC_UNIT tUNUMBER tZONE tAMPM
-
-%%
-
-spec : /* NULL */
- | spec item
- ;
-
-item : time { yyHaveTime++; }
- | zone { yyHaveZone++; }
- | date { yyHaveDate++; }
- | day { yyHaveDay++; }
- | rel { yyHaveRel++; }
- | number
- ;
-
-time : tUNUMBER tAMPM {
- /* "7am" */
- yyHour = $1;
- if (yyHour == 12)
- yyHour = 0;
- yyMinutes = 0;
- yySeconds = 0;
- if ($2 == tPM)
- yyHour += 12;
- }
- | bare_time {
- /* "7:12:18" "19:17" */
- }
- | bare_time tAMPM {
- /* "7:12pm", "12:20:13am" */
- if (yyHour == 12)
- yyHour = 0;
- if ($2 == tPM)
- yyHour += 12;
- }
- | bare_time '+' tUNUMBER {
- /* "7:14+0700" */
- yyDSTmode = DSToff;
- yyTimezone = - ($3 % 100 + ($3 / 100) * 60);
- }
- | bare_time '-' tUNUMBER {
- /* "19:14:12-0530" */
- yyDSTmode = DSToff;
- yyTimezone = + ($3 % 100 + ($3 / 100) * 60);
- }
- ;
-
-bare_time : tUNUMBER ':' tUNUMBER {
- yyHour = $1;
- yyMinutes = $3;
- yySeconds = 0;
- }
- | tUNUMBER ':' tUNUMBER ':' tUNUMBER {
- yyHour = $1;
- yyMinutes = $3;
- yySeconds = $5;
- }
- ;
-
-zone : tZONE {
- yyTimezone = $1;
- yyDSTmode = DSToff;
- }
- | tDAYZONE {
- yyTimezone = $1;
- yyDSTmode = DSTon;
- }
- | tZONE tDST {
- yyTimezone = $1;
- yyDSTmode = DSTon;
- }
- ;
-
-day : tDAY {
- yyDayOrdinal = 1;
- yyDayNumber = $1;
- }
- | tDAY ',' {
- /* "tue," "wednesday," */
- yyDayOrdinal = 1;
- yyDayNumber = $1;
- }
- | tUNUMBER tDAY {
- /* "second tues" "3 wed" */
- yyDayOrdinal = $1;
- yyDayNumber = $2;
- }
- ;
-
-date : tUNUMBER '/' tUNUMBER {
- /* "1/15" */
- yyMonth = $1;
- yyDay = $3;
- }
- | tUNUMBER '/' tUNUMBER '/' tUNUMBER {
- if ($1 >= 13) {
- /* First number is big: 2004/01/29, 99/02/17 */
- yyYear = $1;
- yyMonth = $3;
- yyDay = $5;
- } else if (($5 >= 13) || ($3 >= 13)) {
- /* Last number is big: 01/07/98 */
- /* Middle number is big: 01/29/04 */
- yyMonth = $1;
- yyDay = $3;
- yyYear = $5;
- } else {
- /* No significant clues: 02/03/04 */
- yyMonth = $1;
- yyDay = $3;
- yyYear = $5;
- }
- }
- | tUNUMBER '-' tUNUMBER '-' tUNUMBER {
- /* ISO 8601 format. yyyy-mm-dd. */
- yyYear = $1;
- yyMonth = $3;
- yyDay = $5;
- }
- | tUNUMBER '-' tMONTH '-' tUNUMBER {
- if ($1 > 31) {
- /* e.g. 1992-Jun-17 */
- yyYear = $1;
- yyMonth = $3;
- yyDay = $5;
- } else {
- /* e.g. 17-JUN-1992. */
- yyDay = $1;
- yyMonth = $3;
- yyYear = $5;
- }
- }
- | tMONTH tUNUMBER {
- /* "May 3" */
- yyMonth = $1;
- yyDay = $2;
- }
- | tMONTH tUNUMBER ',' tUNUMBER {
- /* "June 17, 2001" */
- yyMonth = $1;
- yyDay = $2;
- yyYear = $4;
- }
- | tUNUMBER tMONTH {
- /* "12 Sept" */
- yyDay = $1;
- yyMonth = $2;
- }
- | tUNUMBER tMONTH tUNUMBER {
- /* "12 Sept 1997" */
- yyDay = $1;
- yyMonth = $2;
- yyYear = $3;
- }
- ;
-
-rel : relunit tAGO {
- yyRelSeconds = -yyRelSeconds;
- yyRelMonth = -yyRelMonth;
- }
- | relunit
- ;
-
-relunit : '-' tUNUMBER tSEC_UNIT {
- /* "-3 hours" */
- yyRelSeconds -= $2 * $3;
- }
- | '+' tUNUMBER tSEC_UNIT {
- /* "+1 minute" */
- yyRelSeconds += $2 * $3;
- }
- | tUNUMBER tSEC_UNIT {
- /* "1 day" */
- yyRelSeconds += $1 * $2;
- }
- | tSEC_UNIT {
- /* "hour" */
- yyRelSeconds += $1;
- }
- | '-' tUNUMBER tMONTH_UNIT {
- /* "-3 months" */
- yyRelMonth -= $2 * $3;
- }
- | '+' tUNUMBER tMONTH_UNIT {
- /* "+5 years" */
- yyRelMonth += $2 * $3;
- }
- | tUNUMBER tMONTH_UNIT {
- /* "2 years" */
- yyRelMonth += $1 * $2;
- }
- | tMONTH_UNIT {
- /* "6 months" */
- yyRelMonth += $1;
- }
- ;
-
-number : tUNUMBER {
- if (yyHaveTime && yyHaveDate && !yyHaveRel)
- yyYear = $1;
- else {
- if($1>10000) {
- /* "20040301" */
- yyHaveDate++;
- yyDay= ($1)%100;
- yyMonth= ($1/100)%100;
- yyYear = $1/10000;
- }
- else {
- /* "513" is same as "5:13" */
- yyHaveTime++;
- if ($1 < 100) {
- yyHour = $1;
- yyMinutes = 0;
- }
- else {
- yyHour = $1 / 100;
- yyMinutes = $1 % 100;
- }
- yySeconds = 0;
- }
- }
- }
- ;
-
-
-%%
-
-static struct TABLE {
- size_t abbrev;
- const char *name;
- int type;
- time_t value;
-} const TimeWords[] = {
- /* am/pm */
- { 0, "am", tAMPM, tAM },
- { 0, "pm", tAMPM, tPM },
-
- /* Month names. */
- { 3, "january", tMONTH, 1 },
- { 3, "february", tMONTH, 2 },
- { 3, "march", tMONTH, 3 },
- { 3, "april", tMONTH, 4 },
- { 3, "may", tMONTH, 5 },
- { 3, "june", tMONTH, 6 },
- { 3, "july", tMONTH, 7 },
- { 3, "august", tMONTH, 8 },
- { 3, "september", tMONTH, 9 },
- { 3, "october", tMONTH, 10 },
- { 3, "november", tMONTH, 11 },
- { 3, "december", tMONTH, 12 },
-
- /* Days of the week. */
- { 2, "sunday", tDAY, 0 },
- { 3, "monday", tDAY, 1 },
- { 2, "tuesday", tDAY, 2 },
- { 3, "wednesday", tDAY, 3 },
- { 2, "thursday", tDAY, 4 },
- { 2, "friday", tDAY, 5 },
- { 2, "saturday", tDAY, 6 },
-
- /* Timezones: Offsets are in minutes. */
- { 0, "gmt", tZONE, HOUR( 0) }, /* Greenwich Mean */
- { 0, "ut", tZONE, HOUR( 0) }, /* Universal (Coordinated) */
- { 0, "utc", tZONE, HOUR( 0) },
- { 0, "wet", tZONE, HOUR( 0) }, /* Western European */
- { 0, "bst", tDAYZONE, HOUR( 0) }, /* British Summer */
- { 0, "wat", tZONE, HOUR( 1) }, /* West Africa */
- { 0, "at", tZONE, HOUR( 2) }, /* Azores */
- /* { 0, "bst", tZONE, HOUR( 3) }, */ /* Brazil Standard: Conflict */
- /* { 0, "gst", tZONE, HOUR( 3) }, */ /* Greenland Standard: Conflict*/
- { 0, "nft", tZONE, HOUR(3)+30 }, /* Newfoundland */
- { 0, "nst", tZONE, HOUR(3)+30 }, /* Newfoundland Standard */
- { 0, "ndt", tDAYZONE, HOUR(3)+30 }, /* Newfoundland Daylight */
- { 0, "ast", tZONE, HOUR( 4) }, /* Atlantic Standard */
- { 0, "adt", tDAYZONE, HOUR( 4) }, /* Atlantic Daylight */
- { 0, "est", tZONE, HOUR( 5) }, /* Eastern Standard */
- { 0, "edt", tDAYZONE, HOUR( 5) }, /* Eastern Daylight */
- { 0, "cst", tZONE, HOUR( 6) }, /* Central Standard */
- { 0, "cdt", tDAYZONE, HOUR( 6) }, /* Central Daylight */
- { 0, "mst", tZONE, HOUR( 7) }, /* Mountain Standard */
- { 0, "mdt", tDAYZONE, HOUR( 7) }, /* Mountain Daylight */
- { 0, "pst", tZONE, HOUR( 8) }, /* Pacific Standard */
- { 0, "pdt", tDAYZONE, HOUR( 8) }, /* Pacific Daylight */
- { 0, "yst", tZONE, HOUR( 9) }, /* Yukon Standard */
- { 0, "ydt", tDAYZONE, HOUR( 9) }, /* Yukon Daylight */
- { 0, "hst", tZONE, HOUR(10) }, /* Hawaii Standard */
- { 0, "hdt", tDAYZONE, HOUR(10) }, /* Hawaii Daylight */
- { 0, "cat", tZONE, HOUR(10) }, /* Central Alaska */
- { 0, "ahst", tZONE, HOUR(10) }, /* Alaska-Hawaii Standard */
- { 0, "nt", tZONE, HOUR(11) }, /* Nome */
- { 0, "idlw", tZONE, HOUR(12) }, /* Intl Date Line West */
- { 0, "cet", tZONE, -HOUR(1) }, /* Central European */
- { 0, "met", tZONE, -HOUR(1) }, /* Middle European */
- { 0, "mewt", tZONE, -HOUR(1) }, /* Middle European Winter */
- { 0, "mest", tDAYZONE, -HOUR(1) }, /* Middle European Summer */
- { 0, "swt", tZONE, -HOUR(1) }, /* Swedish Winter */
- { 0, "sst", tDAYZONE, -HOUR(1) }, /* Swedish Summer */
- { 0, "fwt", tZONE, -HOUR(1) }, /* French Winter */
- { 0, "fst", tDAYZONE, -HOUR(1) }, /* French Summer */
- { 0, "eet", tZONE, -HOUR(2) }, /* Eastern Eur, USSR Zone 1 */
- { 0, "bt", tZONE, -HOUR(3) }, /* Baghdad, USSR Zone 2 */
- { 0, "it", tZONE, -HOUR(3)-30 },/* Iran */
- { 0, "zp4", tZONE, -HOUR(4) }, /* USSR Zone 3 */
- { 0, "zp5", tZONE, -HOUR(5) }, /* USSR Zone 4 */
- { 0, "ist", tZONE, -HOUR(5)-30 },/* Indian Standard */
- { 0, "zp6", tZONE, -HOUR(6) }, /* USSR Zone 5 */
- /* { 0, "nst", tZONE, -HOUR(6.5) }, */ /* North Sumatra: Conflict */
- /* { 0, "sst", tZONE, -HOUR(7) }, */ /* So Sumatra, USSR 6: Conflict */
- { 0, "wast", tZONE, -HOUR(7) }, /* West Australian Standard */
- { 0, "wadt", tDAYZONE, -HOUR(7) }, /* West Australian Daylight */
- { 0, "jt", tZONE, -HOUR(7)-30 },/* Java (3pm in Cronusland!)*/
- { 0, "cct", tZONE, -HOUR(8) }, /* China Coast, USSR Zone 7 */
- { 0, "jst", tZONE, -HOUR(9) }, /* Japan Std, USSR Zone 8 */
- { 0, "cast", tZONE, -HOUR(9)-30 },/* Central Australian Std */
- { 0, "cadt", tDAYZONE, -HOUR(9)-30 },/* Central Australian Daylt */
- { 0, "east", tZONE, -HOUR(10) }, /* Eastern Australian Std */
- { 0, "eadt", tDAYZONE, -HOUR(10) }, /* Eastern Australian Daylt */
- { 0, "gst", tZONE, -HOUR(10) }, /* Guam Std, USSR Zone 9 */
- { 0, "nzt", tZONE, -HOUR(12) }, /* New Zealand */
- { 0, "nzst", tZONE, -HOUR(12) }, /* New Zealand Standard */
- { 0, "nzdt", tDAYZONE, -HOUR(12) }, /* New Zealand Daylight */
- { 0, "idle", tZONE, -HOUR(12) }, /* Intl Date Line East */
-
- { 0, "dst", tDST, 0 },
-
- /* Time units. */
- { 4, "years", tMONTH_UNIT, 12 },
- { 5, "months", tMONTH_UNIT, 1 },
- { 9, "fortnights", tSEC_UNIT, 14 * 24 * 60 * 60 },
- { 4, "weeks", tSEC_UNIT, 7 * 24 * 60 * 60 },
- { 3, "days", tSEC_UNIT, 1 * 24 * 60 * 60 },
- { 4, "hours", tSEC_UNIT, 60 * 60 },
- { 3, "minutes", tSEC_UNIT, 60 },
- { 3, "seconds", tSEC_UNIT, 1 },
-
- /* Relative-time words. */
- { 0, "tomorrow", tSEC_UNIT, 1 * 24 * 60 * 60 },
- { 0, "yesterday", tSEC_UNIT, -1 * 24 * 60 * 60 },
- { 0, "today", tSEC_UNIT, 0 },
- { 0, "now", tSEC_UNIT, 0 },
- { 0, "last", tUNUMBER, -1 },
- { 0, "this", tSEC_UNIT, 0 },
- { 0, "next", tUNUMBER, 2 },
- { 0, "first", tUNUMBER, 1 },
- { 0, "1st", tUNUMBER, 1 },
-/* { 0, "second", tUNUMBER, 2 }, */
- { 0, "2nd", tUNUMBER, 2 },
- { 0, "third", tUNUMBER, 3 },
- { 0, "3rd", tUNUMBER, 3 },
- { 0, "fourth", tUNUMBER, 4 },
- { 0, "4th", tUNUMBER, 4 },
- { 0, "fifth", tUNUMBER, 5 },
- { 0, "5th", tUNUMBER, 5 },
- { 0, "sixth", tUNUMBER, 6 },
- { 0, "seventh", tUNUMBER, 7 },
- { 0, "eighth", tUNUMBER, 8 },
- { 0, "ninth", tUNUMBER, 9 },
- { 0, "tenth", tUNUMBER, 10 },
- { 0, "eleventh", tUNUMBER, 11 },
- { 0, "twelfth", tUNUMBER, 12 },
- { 0, "ago", tAGO, 1 },
-
- /* Military timezones. */
- { 0, "a", tZONE, HOUR( 1) },
- { 0, "b", tZONE, HOUR( 2) },
- { 0, "c", tZONE, HOUR( 3) },
- { 0, "d", tZONE, HOUR( 4) },
- { 0, "e", tZONE, HOUR( 5) },
- { 0, "f", tZONE, HOUR( 6) },
- { 0, "g", tZONE, HOUR( 7) },
- { 0, "h", tZONE, HOUR( 8) },
- { 0, "i", tZONE, HOUR( 9) },
- { 0, "k", tZONE, HOUR( 10) },
- { 0, "l", tZONE, HOUR( 11) },
- { 0, "m", tZONE, HOUR( 12) },
- { 0, "n", tZONE, HOUR(- 1) },
- { 0, "o", tZONE, HOUR(- 2) },
- { 0, "p", tZONE, HOUR(- 3) },
- { 0, "q", tZONE, HOUR(- 4) },
- { 0, "r", tZONE, HOUR(- 5) },
- { 0, "s", tZONE, HOUR(- 6) },
- { 0, "t", tZONE, HOUR(- 7) },
- { 0, "u", tZONE, HOUR(- 8) },
- { 0, "v", tZONE, HOUR(- 9) },
- { 0, "w", tZONE, HOUR(-10) },
- { 0, "x", tZONE, HOUR(-11) },
- { 0, "y", tZONE, HOUR(-12) },
- { 0, "z", tZONE, HOUR( 0) },
-
- /* End of table. */
- { 0, NULL, 0, 0 }
-};
-
-
-
-
-/* ARGSUSED */
-static int
-yyerror(const char *s)
-{
- (void)s;
- return 0;
-}
-
-static time_t
-ToSeconds(time_t Hours, time_t Minutes, time_t Seconds)
-{
- if (Minutes < 0 || Minutes > 59 || Seconds < 0 || Seconds > 59)
- return -1;
- if (Hours < 0 || Hours > 23)
- return -1;
- return (Hours * 60L + Minutes) * 60L + Seconds;
-}
-
-
-/* Year is either
- * A number from 0 to 99, which means a year from 1970 to 2069, or
- * The actual year (>=100). */
-static time_t
-Convert(time_t Month, time_t Day, time_t Year,
- time_t Hours, time_t Minutes, time_t Seconds, DSTMODE DSTmode)
-{
- static int DaysInMonth[12] = {
- 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
- };
- time_t tod;
- time_t Julian;
- int i;
-
- if (Year < 69)
- Year += 2000;
- else if (Year < 100)
- Year += 1900;
- DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0)
- ? 29 : 28;
- /* Checking for 2038 bogusly assumes that time_t is 32 bits. But
- I'm too lazy to try to check for time_t overflow in another way. */
- if (Year < EPOCH || Year > 2038
- || Month < 1 || Month > 12
- /* Lint fluff: "conversion from long may lose accuracy" */
- || Day < 1 || Day > DaysInMonth[(int)--Month])
- return -1;
-
- Julian = Day - 1;
- for (i = 0; i < Month; i++)
- Julian += DaysInMonth[i];
- for (i = EPOCH; i < Year; i++)
- Julian += 365 + (i % 4 == 0);
- Julian *= SECSPERDAY;
- Julian += yyTimezone * 60L;
- if ((tod = ToSeconds(Hours, Minutes, Seconds)) < 0)
- return -1;
- Julian += tod;
- if (DSTmode == DSTon
- || (DSTmode == DSTmaybe && localtime(&Julian)->tm_isdst))
- Julian -= 60 * 60;
- return Julian;
-}
-
-
-static time_t
-DSTcorrect(time_t Start, time_t Future)
-{
- time_t StartDay;
- time_t FutureDay;
-
- StartDay = (localtime(&Start)->tm_hour + 1) % 24;
- FutureDay = (localtime(&Future)->tm_hour + 1) % 24;
- return (Future - Start) + (StartDay - FutureDay) * 60L * 60L;
-}
-
-
-static time_t
-RelativeDate(time_t Start, time_t DayOrdinal, time_t DayNumber)
-{
- struct tm *tm;
- time_t now;
-
- now = Start;
- tm = localtime(&now);
- now += SECSPERDAY * ((DayNumber - tm->tm_wday + 7) % 7);
- now += 7 * SECSPERDAY * (DayOrdinal <= 0 ? DayOrdinal : DayOrdinal - 1);
- return DSTcorrect(Start, now);
-}
-
-
-static time_t
-RelativeMonth(time_t Start, time_t RelMonth)
-{
- struct tm *tm;
- time_t Month;
- time_t Year;
-
- if (RelMonth == 0)
- return 0;
- tm = localtime(&Start);
- Month = 12 * (tm->tm_year + 1900) + tm->tm_mon + RelMonth;
- Year = Month / 12;
- Month = Month % 12 + 1;
- return DSTcorrect(Start,
- Convert(Month, (time_t)tm->tm_mday, Year,
- (time_t)tm->tm_hour, (time_t)tm->tm_min, (time_t)tm->tm_sec,
- DSTmaybe));
-}
-
-static int
-yylex(void)
-{
- char c;
- char buff[64];
-
- for ( ; ; ) {
- while (isspace((unsigned char)*yyInput))
- yyInput++;
-
- /* Skip parenthesized comments. */
- if (*yyInput == '(') {
- int Count = 0;
- do {
- c = *yyInput++;
- if (c == '\0')
- return c;
- if (c == '(')
- Count++;
- else if (c == ')')
- Count--;
- } while (Count > 0);
- continue;
- }
-
- /* Try the next token in the word table first. */
- /* This allows us to match "2nd", for example. */
- {
- char *src = yyInput;
- const struct TABLE *tp;
- unsigned i = 0;
-
- /* Force to lowercase and strip '.' characters. */
- while (*src != '\0'
- && (isalnum((unsigned char)*src) || *src == '.')
- && i < sizeof(buff)-1) {
- if (*src != '.') {
- if (isupper((unsigned char)*src))
- buff[i++] = tolower((unsigned char)*src);
- else
- buff[i++] = *src;
- }
- src++;
- }
- buff[i++] = '\0';
-
- /*
- * Find the first match. If the word can be
- * abbreviated, make sure we match at least
- * the minimum abbreviation.
- */
- for (tp = TimeWords; tp->name; tp++) {
- size_t abbrev = tp->abbrev;
- if (abbrev == 0)
- abbrev = strlen(tp->name);
- if (strlen(buff) >= abbrev
- && strncmp(tp->name, buff, strlen(buff))
- == 0) {
- /* Skip over token. */
- yyInput = src;
- /* Return the match. */
- yylval.Number = tp->value;
- return tp->type;
- }
- }
- }
-
- /*
- * Not in the word table, maybe it's a number. Note:
- * Because '-' and '+' have other special meanings, I
- * don't deal with signed numbers here.
- */
- if (isdigit((unsigned char)(c = *yyInput))) {
- for (yylval.Number = 0; isdigit((unsigned char)(c = *yyInput++)); )
- yylval.Number = 10 * yylval.Number + c - '0';
- yyInput--;
- return (tUNUMBER);
- }
-
- return (*yyInput++);
- }
-}
-
-#define TM_YEAR_ORIGIN 1900
-
-/* Yield A - B, measured in seconds. */
-static long
-difftm (struct tm *a, struct tm *b)
-{
- int ay = a->tm_year + (TM_YEAR_ORIGIN - 1);
- int by = b->tm_year + (TM_YEAR_ORIGIN - 1);
- int days = (
- /* difference in day of year */
- a->tm_yday - b->tm_yday
- /* + intervening leap days */
- + ((ay >> 2) - (by >> 2))
- - (ay/100 - by/100)
- + ((ay/100 >> 2) - (by/100 >> 2))
- /* + difference in years * 365 */
- + (long)(ay-by) * 365
- );
- return (60*(60*(24*days + (a->tm_hour - b->tm_hour))
- + (a->tm_min - b->tm_min))
- + (a->tm_sec - b->tm_sec));
-}
-
-time_t
-get_date(char *p)
-{
- struct tm *tm;
- struct tm gmt, *gmt_ptr;
- time_t Start;
- time_t tod;
- time_t nowtime;
- long tzone;
-
- memset(&gmt, 0, sizeof(gmt));
- yyInput = p;
-
- (void)time (&nowtime);
-
- gmt_ptr = gmtime (&nowtime);
- if (gmt_ptr != NULL) {
- /* Copy, in case localtime and gmtime use the same buffer. */
- gmt = *gmt_ptr;
- }
-
- if (! (tm = localtime (&nowtime)))
- return -1;
-
- if (gmt_ptr != NULL)
- tzone = difftm (&gmt, tm) / 60;
- else
- /* This system doesn't understand timezones; fake it. */
- tzone = 0;
- if(tm->tm_isdst)
- tzone += 60;
-
- yyYear = tm->tm_year + 1900;
- yyMonth = tm->tm_mon + 1;
- yyDay = tm->tm_mday;
- yyTimezone = tzone;
- yyDSTmode = DSTmaybe;
- yyHour = 0;
- yyMinutes = 0;
- yySeconds = 0;
- yyRelSeconds = 0;
- yyRelMonth = 0;
- yyHaveDate = 0;
- yyHaveDay = 0;
- yyHaveRel = 0;
- yyHaveTime = 0;
- yyHaveZone = 0;
-
- if (yyparse()
- || yyHaveTime > 1 || yyHaveZone > 1
- || yyHaveDate > 1 || yyHaveDay > 1)
- return -1;
-
- if (yyHaveDate || yyHaveTime || yyHaveDay) {
- Start = Convert(yyMonth, yyDay, yyYear,
- yyHour, yyMinutes, yySeconds, yyDSTmode);
- if (Start < 0)
- return -1;
- } else {
- Start = nowtime;
- if (!yyHaveRel)
- Start -= ((tm->tm_hour * 60L + tm->tm_min) * 60L) + tm->tm_sec;
- }
-
- Start += yyRelSeconds;
- Start += RelativeMonth(Start, yyRelMonth);
-
- if (yyHaveDay && !yyHaveDate) {
- tod = RelativeDate(Start, yyDayOrdinal, yyDayNumber);
- Start += tod;
- }
-
- /* Have to do *something* with a legitimate -1 so it's
- * distinguishable from the error return value. (Alternately
- * could set errno on error.) */
- return Start == -1 ? 0 : Start;
-}
-
-
-#if defined(TEST)
-
-/* ARGSUSED */
-int
-main(int argc, char **argv)
-{
- time_t d;
-
- while (*++argv != NULL) {
- (void)printf("Input: %s\n", *argv);
- d = get_date(*argv);
- if (d == -1)
- (void)printf("Bad format - couldn't convert.\n");
- else
- (void)printf("Output: %s\n", ctime(&d));
- }
- exit(0);
- /* NOTREACHED */
-}
-#endif /* defined(TEST) */
diff --git a/usr.bin/tar/matching.c b/usr.bin/tar/matching.c
deleted file mode 100644
index 2e146fe..0000000
--- a/usr.bin/tar/matching.c
+++ /dev/null
@@ -1,478 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "bsdtar_platform.h"
-__FBSDID("$FreeBSD$");
-
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include "bsdtar.h"
-
-struct match {
- struct match *next;
- int matches;
- char pattern[1];
-};
-
-struct matching {
- struct match *exclusions;
- int exclusions_count;
- struct match *inclusions;
- int inclusions_count;
- int inclusions_unmatched_count;
-};
-
-
-static void add_pattern(struct bsdtar *, struct match **list,
- const char *pattern);
-static int bsdtar_fnmatch(const char *p, const char *s);
-static void initialize_matching(struct bsdtar *);
-static int match_exclusion(struct match *, const char *pathname);
-static int match_inclusion(struct match *, const char *pathname);
-static int pathmatch(const char *p, const char *s);
-
-/*
- * The matching logic here needs to be re-thought. I started out to
- * try to mimic gtar's matching logic, but it's not entirely
- * consistent. In particular 'tar -t' and 'tar -x' interpret patterns
- * on the command line as anchored, but --exclude doesn't.
- */
-
-/*
- * Utility functions to manage exclusion/inclusion patterns
- */
-
-int
-exclude(struct bsdtar *bsdtar, const char *pattern)
-{
- struct matching *matching;
-
- if (bsdtar->matching == NULL)
- initialize_matching(bsdtar);
- matching = bsdtar->matching;
- add_pattern(bsdtar, &(matching->exclusions), pattern);
- matching->exclusions_count++;
- return (0);
-}
-
-int
-exclude_from_file(struct bsdtar *bsdtar, const char *pathname)
-{
- return (process_lines(bsdtar, pathname, &exclude));
-}
-
-int
-include(struct bsdtar *bsdtar, const char *pattern)
-{
- struct matching *matching;
-
- if (bsdtar->matching == NULL)
- initialize_matching(bsdtar);
- matching = bsdtar->matching;
- add_pattern(bsdtar, &(matching->inclusions), pattern);
- matching->inclusions_count++;
- matching->inclusions_unmatched_count++;
- return (0);
-}
-
-int
-include_from_file(struct bsdtar *bsdtar, const char *pathname)
-{
- return (process_lines(bsdtar, pathname, &include));
-}
-
-static void
-add_pattern(struct bsdtar *bsdtar, struct match **list, const char *pattern)
-{
- struct match *match;
-
- match = malloc(sizeof(*match) + strlen(pattern) + 1);
- if (match == NULL)
- bsdtar_errc(bsdtar, 1, errno, "Out of memory");
- strcpy(match->pattern, pattern);
- /* Both "foo/" and "foo" should match "foo/bar". */
- if (match->pattern[strlen(match->pattern)-1] == '/')
- match->pattern[strlen(match->pattern)-1] = '\0';
- match->next = *list;
- *list = match;
- match->matches = 0;
-}
-
-
-int
-excluded(struct bsdtar *bsdtar, const char *pathname)
-{
- struct matching *matching;
- struct match *match;
- struct match *matched;
-
- matching = bsdtar->matching;
- if (matching == NULL)
- return (0);
-
- /* Exclusions take priority */
- for (match = matching->exclusions; match != NULL; match = match->next){
- if (match_exclusion(match, pathname))
- return (1);
- }
-
- /* Then check for inclusions */
- matched = NULL;
- for (match = matching->inclusions; match != NULL; match = match->next){
- if (match_inclusion(match, pathname)) {
- /*
- * If this pattern has never been matched,
- * then we're done.
- */
- if (match->matches == 0) {
- match->matches++;
- matching->inclusions_unmatched_count--;
- return (0);
- }
- /*
- * Otherwise, remember the match but keep checking
- * in case we can tick off an unmatched pattern.
- */
- matched = match;
- }
- }
- /*
- * We didn't find a pattern that had never been matched, but
- * we did find a match, so count it and exit.
- */
- if (matched != NULL) {
- matched->matches++;
- return (0);
- }
-
- /* If there were inclusions, default is to exclude. */
- if (matching->inclusions != NULL)
- return (1);
-
- /* No explicit inclusions, default is to match. */
- return (0);
-}
-
-/*
- * This is a little odd, but it matches the default behavior of
- * gtar. In particular, 'a*b' will match 'foo/a1111/222b/bar'
- *
- */
-int
-match_exclusion(struct match *match, const char *pathname)
-{
- const char *p;
-
- if (*match->pattern == '*' || *match->pattern == '/')
- return (pathmatch(match->pattern, pathname) == 0);
-
- for (p = pathname; p != NULL; p = strchr(p, '/')) {
- if (*p == '/')
- p++;
- if (pathmatch(match->pattern, p) == 0)
- return (1);
- }
- return (0);
-}
-
-/*
- * Again, mimic gtar: inclusions are always anchored (have to match
- * the beginning of the path) even though exclusions are not anchored.
- */
-int
-match_inclusion(struct match *match, const char *pathname)
-{
- return (pathmatch(match->pattern, pathname) == 0);
-}
-
-void
-cleanup_exclusions(struct bsdtar *bsdtar)
-{
- struct match *p, *q;
-
- if (bsdtar->matching) {
- p = bsdtar->matching->inclusions;
- while (p != NULL) {
- q = p;
- p = p->next;
- free(q);
- }
- p = bsdtar->matching->exclusions;
- while (p != NULL) {
- q = p;
- p = p->next;
- free(q);
- }
- free(bsdtar->matching);
- }
-}
-
-static void
-initialize_matching(struct bsdtar *bsdtar)
-{
- bsdtar->matching = malloc(sizeof(*bsdtar->matching));
- if (bsdtar->matching == NULL)
- bsdtar_errc(bsdtar, 1, errno, "No memory");
- memset(bsdtar->matching, 0, sizeof(*bsdtar->matching));
-}
-
-int
-unmatched_inclusions(struct bsdtar *bsdtar)
-{
- struct matching *matching;
-
- matching = bsdtar->matching;
- if (matching == NULL)
- return (0);
- return (matching->inclusions_unmatched_count);
-}
-
-
-int
-unmatched_inclusions_warn(struct bsdtar *bsdtar, const char *msg)
-{
- struct matching *matching;
- struct match *p;
-
- matching = bsdtar->matching;
- if (matching == NULL)
- return (0);
-
- p = matching->inclusions;
- while (p != NULL) {
- if (p->matches == 0) {
- bsdtar->return_value = 1;
- bsdtar_warnc(bsdtar, 0, "%s: %s",
- p->pattern, msg);
- }
- p = p->next;
- }
- return (matching->inclusions_unmatched_count);
-}
-
-/*
- * TODO: Extend this so that the following matches work:
- * "foo//bar" == "foo/bar"
- * "foo/./bar" == "foo/bar"
- * "./foo" == "foo"
- *
- * The POSIX fnmatch() function doesn't handle any of these, but
- * all are common situations that arise when paths are generated within
- * large scripts. E.g., the following is quite common:
- * MYPATH=foo/ TARGET=$MYPATH/bar
- * It may be worthwhile to edit such paths at write time as well,
- * especially when such editing may avoid the need for long pathname
- * extensions.
- */
-static int
-pathmatch(const char *pattern, const char *string)
-{
- /*
- * Strip leading "./" or ".//" so that, e.g.,
- * "foo" matches "./foo". In particular, this
- * opens up an optimization for the writer to
- * elide leading "./".
- */
- if (pattern[0] == '.' && pattern[1] == '/') {
- pattern += 2;
- while (pattern[0] == '/')
- ++pattern;
- }
- if (string[0] == '.' && string[1] == '/') {
- string += 2;
- while (string[0] == '/')
- ++string;
- }
- return (bsdtar_fnmatch(pattern, string));
-}
-
-
-#if defined(HAVE_FNMATCH) && defined(HAVE_FNM_LEADING_DIR)
-
-/* Use system fnmatch() if it suits our needs. */
-/* On Linux, _GNU_SOURCE must be defined to get FNM_LEADING_DIR. */
-#define _GNU_SOURCE
-#include <fnmatch.h>
-static int
-bsdtar_fnmatch(const char *pattern, const char *string)
-{
- return (fnmatch(pattern, string, FNM_LEADING_DIR));
-}
-
-#else
-/*
- * The following was hacked from BSD C library
- * code: src/lib/libc/gen/fnmatch.c,v 1.15 2002/02/01
- *
- * In particular, most of the flags were ripped out: this always
- * behaves like FNM_LEADING_DIR is set and other flags specified
- * by POSIX are unset.
- *
- * Normally, I would not conditionally compile something like this: If
- * I have to support it anyway, everyone may as well use it. ;-)
- * However, the full POSIX spec for fnmatch() includes a lot of
- * advanced character handling that I'm not ready to put in here, so
- * it's probably best if people use a local version when it's available.
- */
-
-/*
- * Copyright (c) 1989, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Guido van Rossum.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-static int
-bsdtar_fnmatch(const char *pattern, const char *string)
-{
- const char *saved_pattern;
- int negate, matched;
- char c;
-
- for (;;) {
- switch (c = *pattern++) {
- case '\0':
- if (*string == '/' || *string == '\0')
- return (0);
- return (1);
- case '?':
- if (*string == '\0')
- return (1);
- ++string;
- break;
- case '*':
- c = *pattern;
- /* Collapse multiple stars. */
- while (c == '*')
- c = *++pattern;
-
- /* Optimize for pattern with * at end. */
- if (c == '\0')
- return (0);
-
- /* General case, use recursion. */
- while (*string != '\0') {
- if (!bsdtar_fnmatch(pattern, string))
- return (0);
- ++string;
- }
- return (1);
- case '[':
- if (*string == '\0')
- return (1);
- saved_pattern = pattern;
- if (*pattern == '!' || *pattern == '^') {
- negate = 1;
- ++pattern;
- } else
- negate = 0;
- matched = 0;
- c = *pattern++;
- do {
- if (c == '\\')
- c = *pattern++;
- if (c == '\0') {
- pattern = saved_pattern;
- c = '[';
- goto norm;
- }
- if (*pattern == '-') {
- char c2 = *(pattern + 1);
- if (c2 == '\0') {
- pattern = saved_pattern;
- c = '[';
- goto norm;
- }
- if (c2 == ']') {
- /* [a-] is not a range. */
- if (c == *string
- || '-' == *string)
- matched = 1;
- pattern ++;
- } else {
- if (c <= *string
- && *string <= c2)
- matched = 1;
- pattern += 2;
- }
- } else if (c == *string)
- matched = 1;
- c = *pattern++;
- } while (c != ']');
- if (matched == negate)
- return (1);
- ++string;
- break;
- case '\\':
- if ((c = *pattern++) == '\0') {
- c = '\\';
- --pattern;
- }
- /* FALLTHROUGH */
- default:
- norm:
- if (c != *string)
- return (1);
- string++;
- break;
- }
- }
- /* NOTREACHED */
-}
-
-#endif
diff --git a/usr.bin/tar/read.c b/usr.bin/tar/read.c
deleted file mode 100644
index 35cea89..0000000
--- a/usr.bin/tar/read.c
+++ /dev/null
@@ -1,401 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "bsdtar_platform.h"
-__FBSDID("$FreeBSD$");
-
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-#ifdef MAJOR_IN_MKDEV
-#include <sys/mkdev.h>
-#elif defined(MAJOR_IN_SYSMACROS)
-#include <sys/sysmacros.h>
-#endif
-#ifdef HAVE_SYS_PARAM_H
-#include <sys/param.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#ifdef HAVE_GRP_H
-#include <grp.h>
-#endif
-#ifdef HAVE_LIMITS_H
-#include <limits.h>
-#endif
-#ifdef HAVE_PWD_H
-#include <pwd.h>
-#endif
-#include <stdio.h>
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-#ifdef HAVE_TIME_H
-#include <time.h>
-#endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include "bsdtar.h"
-
-static void list_item_verbose(struct bsdtar *, FILE *,
- struct archive_entry *);
-static void read_archive(struct bsdtar *bsdtar, char mode);
-
-void
-tar_mode_t(struct bsdtar *bsdtar)
-{
- read_archive(bsdtar, 't');
- unmatched_inclusions_warn(bsdtar, "Not found in archive");
-}
-
-void
-tar_mode_x(struct bsdtar *bsdtar)
-{
- /* We want to catch SIGINFO and SIGUSR1. */
- siginfo_init(bsdtar);
-
- read_archive(bsdtar, 'x');
-
- unmatched_inclusions_warn(bsdtar, "Not found in archive");
- /* Restore old SIGINFO + SIGUSR1 handlers. */
- siginfo_done(bsdtar);
-}
-
-static void
-progress_func(void * cookie)
-{
- struct bsdtar * bsdtar = cookie;
-
- siginfo_printinfo(bsdtar, 0);
-}
-
-/*
- * Handle 'x' and 't' modes.
- */
-static void
-read_archive(struct bsdtar *bsdtar, char mode)
-{
- FILE *out;
- struct archive *a;
- struct archive_entry *entry;
- const struct stat *st;
- int r;
-
- while (*bsdtar->argv) {
- include(bsdtar, *bsdtar->argv);
- bsdtar->argv++;
- }
-
- if (bsdtar->names_from_file != NULL)
- include_from_file(bsdtar, bsdtar->names_from_file);
-
- a = archive_read_new();
- if (bsdtar->compress_program != NULL)
- archive_read_support_compression_program(a, bsdtar->compress_program);
- else
- archive_read_support_compression_all(a);
- archive_read_support_format_all(a);
- if (archive_read_open_file(a, bsdtar->filename,
- bsdtar->bytes_per_block != 0 ? bsdtar->bytes_per_block :
- DEFAULT_BYTES_PER_BLOCK))
- bsdtar_errc(bsdtar, 1, 0, "Error opening archive: %s",
- archive_error_string(a));
-
- do_chdir(bsdtar);
-
- if (mode == 'x') {
- /* Set an extract callback so that we can handle SIGINFO. */
- archive_read_extract_set_progress_callback(a, progress_func,
- bsdtar);
- }
-
- if (mode == 'x' && bsdtar->option_chroot) {
-#if HAVE_CHROOT
- if (chroot(".") != 0)
- bsdtar_errc(bsdtar, 1, errno, "Can't chroot to \".\"");
-#else
- bsdtar_errc(bsdtar, 1, 0,
- "chroot isn't supported on this platform");
-#endif
- }
-
- for (;;) {
- /* Support --fast-read option */
- if (bsdtar->option_fast_read &&
- unmatched_inclusions(bsdtar) == 0)
- break;
-
- r = archive_read_next_header(a, &entry);
- if (r == ARCHIVE_EOF)
- break;
- if (r < ARCHIVE_OK)
- bsdtar_warnc(bsdtar, 0, "%s", archive_error_string(a));
- if (r <= ARCHIVE_WARN)
- bsdtar->return_value = 1;
- if (r == ARCHIVE_RETRY) {
- /* Retryable error: try again */
- bsdtar_warnc(bsdtar, 0, "Retrying...");
- continue;
- }
- if (r == ARCHIVE_FATAL)
- break;
-
- if (bsdtar->option_numeric_owner) {
- archive_entry_set_uname(entry, NULL);
- archive_entry_set_gname(entry, NULL);
- }
-
- /*
- * Exclude entries that are too old.
- */
- st = archive_entry_stat(entry);
- if (bsdtar->newer_ctime_sec > 0) {
- if (st->st_ctime < bsdtar->newer_ctime_sec)
- continue; /* Too old, skip it. */
- if (st->st_ctime == bsdtar->newer_ctime_sec
- && ARCHIVE_STAT_CTIME_NANOS(st)
- <= bsdtar->newer_ctime_nsec)
- continue; /* Too old, skip it. */
- }
- if (bsdtar->newer_mtime_sec > 0) {
- if (st->st_mtime < bsdtar->newer_mtime_sec)
- continue; /* Too old, skip it. */
- if (st->st_mtime == bsdtar->newer_mtime_sec
- && ARCHIVE_STAT_MTIME_NANOS(st)
- <= bsdtar->newer_mtime_nsec)
- continue; /* Too old, skip it. */
- }
-
- /*
- * Note that pattern exclusions are checked before
- * pathname rewrites are handled. This gives more
- * control over exclusions, since rewrites always lose
- * information. (For example, consider a rewrite
- * s/foo[0-9]/foo/. If we check exclusions after the
- * rewrite, there would be no way to exclude foo1/bar
- * while allowing foo2/bar.)
- */
- if (excluded(bsdtar, archive_entry_pathname(entry)))
- continue; /* Excluded by a pattern test. */
-
- if (mode == 't') {
- /* Perversely, gtar uses -O to mean "send to stderr"
- * when used with -t. */
- out = bsdtar->option_stdout ? stderr : stdout;
-
- /*
- * TODO: Provide some reasonable way to
- * preview rewrites. gtar always displays
- * the unedited path in -t output, which means
- * you cannot easily preview rewrites.
- */
- if (bsdtar->verbose < 2)
- safe_fprintf(out, "%s",
- archive_entry_pathname(entry));
- else
- list_item_verbose(bsdtar, out, entry);
- fflush(out);
- r = archive_read_data_skip(a);
- if (r == ARCHIVE_WARN) {
- fprintf(out, "\n");
- bsdtar_warnc(bsdtar, 0, "%s",
- archive_error_string(a));
- }
- if (r == ARCHIVE_RETRY) {
- fprintf(out, "\n");
- bsdtar_warnc(bsdtar, 0, "%s",
- archive_error_string(a));
- }
- if (r == ARCHIVE_FATAL) {
- fprintf(out, "\n");
- bsdtar_warnc(bsdtar, 0, "%s",
- archive_error_string(a));
- bsdtar->return_value = 1;
- break;
- }
- fprintf(out, "\n");
- } else {
- /* Note: some rewrite failures prevent extraction. */
- if (edit_pathname(bsdtar, entry))
- continue; /* Excluded by a rewrite failure. */
-
- if (bsdtar->option_interactive &&
- !yes("extract '%s'", archive_entry_pathname(entry)))
- continue;
-
- /*
- * Format here is from SUSv2, including the
- * deferred '\n'.
- */
- if (bsdtar->verbose) {
- safe_fprintf(stderr, "x %s",
- archive_entry_pathname(entry));
- fflush(stderr);
- }
-
- /* Tell the SIGINFO-handler code what we're doing. */
- siginfo_setinfo(bsdtar, "extracting",
- archive_entry_pathname(entry), 0);
- siginfo_printinfo(bsdtar, 0);
-
- if (bsdtar->option_stdout)
- r = archive_read_data_into_fd(a, 1);
- else
- r = archive_read_extract(a, entry,
- bsdtar->extract_flags);
- if (r != ARCHIVE_OK) {
- if (!bsdtar->verbose)
- safe_fprintf(stderr, "%s",
- archive_entry_pathname(entry));
- safe_fprintf(stderr, ": %s",
- archive_error_string(a));
- if (!bsdtar->verbose)
- fprintf(stderr, "\n");
- bsdtar->return_value = 1;
- }
- if (bsdtar->verbose)
- fprintf(stderr, "\n");
- if (r == ARCHIVE_FATAL)
- break;
- }
- }
-
- if (bsdtar->verbose > 2)
- fprintf(stdout, "Archive Format: %s, Compression: %s\n",
- archive_format_name(a), archive_compression_name(a));
-
- archive_read_finish(a);
-}
-
-
-/*
- * Display information about the current file.
- *
- * The format here roughly duplicates the output of 'ls -l'.
- * This is based on SUSv2, where 'tar tv' is documented as
- * listing additional information in an "unspecified format,"
- * and 'pax -l' is documented as using the same format as 'ls -l'.
- */
-static void
-list_item_verbose(struct bsdtar *bsdtar, FILE *out, struct archive_entry *entry)
-{
- const struct stat *st;
- char tmp[100];
- size_t w;
- const char *p;
- const char *fmt;
- time_t tim;
- static time_t now;
-
- st = archive_entry_stat(entry);
-
- /*
- * We avoid collecting the entire list in memory at once by
- * listing things as we see them. However, that also means we can't
- * just pre-compute the field widths. Instead, we start with guesses
- * and just widen them as necessary. These numbers are completely
- * arbitrary.
- */
- if (!bsdtar->u_width) {
- bsdtar->u_width = 6;
- bsdtar->gs_width = 13;
- }
- if (!now)
- time(&now);
- fprintf(out, "%s %d ",
- archive_entry_strmode(entry),
- (int)(st->st_nlink));
-
- /* Use uname if it's present, else uid. */
- p = archive_entry_uname(entry);
- if ((p == NULL) || (*p == '\0')) {
- sprintf(tmp, "%lu ", (unsigned long)st->st_uid);
- p = tmp;
- }
- w = strlen(p);
- if (w > bsdtar->u_width)
- bsdtar->u_width = w;
- fprintf(out, "%-*s ", (int)bsdtar->u_width, p);
-
- /* Use gname if it's present, else gid. */
- p = archive_entry_gname(entry);
- if (p != NULL && p[0] != '\0') {
- fprintf(out, "%s", p);
- w = strlen(p);
- } else {
- sprintf(tmp, "%lu", (unsigned long)st->st_gid);
- w = strlen(tmp);
- fprintf(out, "%s", tmp);
- }
-
- /*
- * Print device number or file size, right-aligned so as to make
- * total width of group and devnum/filesize fields be gs_width.
- * If gs_width is too small, grow it.
- */
- if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode)) {
- sprintf(tmp, "%lu,%lu",
- (unsigned long)major(st->st_rdev),
- (unsigned long)minor(st->st_rdev)); /* ls(1) also casts here. */
- } else {
- /*
- * Note the use of platform-dependent macros to format
- * the filesize here. We need the format string and the
- * corresponding type for the cast.
- */
- sprintf(tmp, BSDTAR_FILESIZE_PRINTF,
- (BSDTAR_FILESIZE_TYPE)st->st_size);
- }
- if (w + strlen(tmp) >= bsdtar->gs_width)
- bsdtar->gs_width = w+strlen(tmp)+1;
- fprintf(out, "%*s", (int)(bsdtar->gs_width - w), tmp);
-
- /* Format the time using 'ls -l' conventions. */
- tim = (time_t)st->st_mtime;
- if (abs(tim - now) > (365/2)*86400)
- fmt = bsdtar->day_first ? "%e %b %Y" : "%b %e %Y";
- else
- fmt = bsdtar->day_first ? "%e %b %H:%M" : "%b %e %H:%M";
- strftime(tmp, sizeof(tmp), fmt, localtime(&tim));
- fprintf(out, " %s ", tmp);
- safe_fprintf(out, "%s", archive_entry_pathname(entry));
-
- /* Extra information for links. */
- if (archive_entry_hardlink(entry)) /* Hard link */
- safe_fprintf(out, " link to %s",
- archive_entry_hardlink(entry));
- else if (S_ISLNK(st->st_mode)) /* Symbolic link */
- safe_fprintf(out, " -> %s", archive_entry_symlink(entry));
-}
diff --git a/usr.bin/tar/siginfo.c b/usr.bin/tar/siginfo.c
deleted file mode 100644
index f0269a1..0000000
--- a/usr.bin/tar/siginfo.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/*-
- * Copyright 2008 Colin Percival
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "bsdtar_platform.h"
-__FBSDID("$FreeBSD$");
-
-#include <errno.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "bsdtar.h"
-
-/* Is there a pending SIGINFO or SIGUSR1? */
-static volatile sig_atomic_t siginfo_received = 0;
-
-struct siginfo_data {
- /* What sort of operation are we doing? */
- char * oper;
-
- /* What path are we handling? */
- char * path;
-
- /* How large is the archive entry? */
- int64_t size;
-
- /* Old signal handlers. */
-#ifdef SIGINFO
- void (*siginfo_old)(int);
-#endif
- void (*sigusr1_old)(int);
-};
-
-static void siginfo_handler(int sig);
-
-/* Handler for SIGINFO / SIGUSR1. */
-static void
-siginfo_handler(int sig)
-{
-
- (void)sig; /* UNUSED */
-
- /* Record that SIGINFO or SIGUSR1 has been received. */
- siginfo_received = 1;
-}
-
-void
-siginfo_init(struct bsdtar *bsdtar)
-{
-
- /* Allocate space for internal structure. */
- if ((bsdtar->siginfo = malloc(sizeof(struct siginfo_data))) == NULL)
- bsdtar_errc(bsdtar, 1, errno, "malloc failed");
-
- /* Set the strings to NULL so that free() is safe. */
- bsdtar->siginfo->path = bsdtar->siginfo->oper = NULL;
-
-#ifdef SIGINFO
- /* We want to catch SIGINFO, if it exists. */
- bsdtar->siginfo->siginfo_old = signal(SIGINFO, siginfo_handler);
-#endif
- /* ... and treat SIGUSR1 the same way as SIGINFO. */
- bsdtar->siginfo->sigusr1_old = signal(SIGUSR1, siginfo_handler);
-}
-
-void
-siginfo_setinfo(struct bsdtar *bsdtar, const char * oper, const char * path,
- int64_t size)
-{
-
- /* Free old operation and path strings. */
- free(bsdtar->siginfo->oper);
- free(bsdtar->siginfo->path);
-
- /* Duplicate strings and store entry size. */
- if ((bsdtar->siginfo->oper = strdup(oper)) == NULL)
- bsdtar_errc(bsdtar, 1, errno, "Cannot strdup");
- if ((bsdtar->siginfo->path = strdup(path)) == NULL)
- bsdtar_errc(bsdtar, 1, errno, "Cannot strdup");
- bsdtar->siginfo->size = size;
-}
-
-void
-siginfo_printinfo(struct bsdtar *bsdtar, off_t progress)
-{
-
- /* If there's a signal to handle and we know what we're doing... */
- if ((siginfo_received == 1) &&
- (bsdtar->siginfo->path != NULL) &&
- (bsdtar->siginfo->oper != NULL)) {
- if (bsdtar->verbose)
- fprintf(stderr, "\n");
- if (bsdtar->siginfo->size > 0) {
- safe_fprintf(stderr, "%s %s (%ju / %" PRId64 ")",
- bsdtar->siginfo->oper, bsdtar->siginfo->path,
- (uintmax_t)progress, bsdtar->siginfo->size);
- } else {
- safe_fprintf(stderr, "%s %s",
- bsdtar->siginfo->oper, bsdtar->siginfo->path);
- }
- if (!bsdtar->verbose)
- fprintf(stderr, "\n");
- siginfo_received = 0;
- }
-}
-
-void
-siginfo_done(struct bsdtar *bsdtar)
-{
-
-#ifdef SIGINFO
- /* Restore old SIGINFO handler. */
- signal(SIGINFO, bsdtar->siginfo->siginfo_old);
-#endif
- /* And the old SIGUSR1 handler, too. */
- signal(SIGUSR1, bsdtar->siginfo->sigusr1_old);
-
- /* Free strings. */
- free(bsdtar->siginfo->path);
- free(bsdtar->siginfo->oper);
-
- /* Free internal data structure. */
- free(bsdtar->siginfo);
-}
diff --git a/usr.bin/tar/subst.c b/usr.bin/tar/subst.c
deleted file mode 100644
index b6571df..0000000
--- a/usr.bin/tar/subst.c
+++ /dev/null
@@ -1,287 +0,0 @@
-/*-
- * Copyright (c) 2008 Joerg Sonnenberger
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "bsdtar_platform.h"
-__FBSDID("$FreeBSD$");
-
-#if HAVE_REGEX_H
-#include "bsdtar.h"
-
-#include <errno.h>
-#include <regex.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifndef REG_BASIC
-#define REG_BASIC 0
-#endif
-
-struct subst_rule {
- struct subst_rule *next;
- regex_t re;
- char *result;
- unsigned int global:1, print:1, symlink:1;
-};
-
-struct substitution {
- struct subst_rule *first_rule, *last_rule;
-};
-
-static void
-init_substitution(struct bsdtar *bsdtar)
-{
- struct substitution *subst;
-
- bsdtar->substitution = subst = malloc(sizeof(*subst));
- if (subst == NULL)
- bsdtar_errc(bsdtar, 1, errno, "Out of memory");
- subst->first_rule = subst->last_rule = NULL;
-}
-
-void
-add_substitution(struct bsdtar *bsdtar, const char *rule_text)
-{
- struct subst_rule *rule;
- struct substitution *subst;
- const char *end_pattern, *start_subst;
- char *pattern;
- int r;
-
- if ((subst = bsdtar->substitution) == NULL) {
- init_substitution(bsdtar);
- subst = bsdtar->substitution;
- }
-
- rule = malloc(sizeof(*rule));
- if (rule == NULL)
- bsdtar_errc(bsdtar, 1, errno, "Out of memory");
- rule->next = NULL;
-
- if (subst->last_rule == NULL)
- subst->first_rule = rule;
- else
- subst->last_rule->next = rule;
- subst->last_rule = rule;
-
- if (*rule_text == '\0')
- bsdtar_errc(bsdtar, 1, 0, "Empty replacement string");
- end_pattern = strchr(rule_text + 1, *rule_text);
- if (end_pattern == NULL)
- bsdtar_errc(bsdtar, 1, 0, "Invalid replacement string");
-
- pattern = malloc(end_pattern - rule_text);
- if (pattern == NULL)
- bsdtar_errc(bsdtar, 1, errno, "Out of memory");
- memcpy(pattern, rule_text + 1, end_pattern - rule_text - 1);
- pattern[end_pattern - rule_text - 1] = '\0';
-
- if ((r = regcomp(&rule->re, pattern, REG_BASIC)) != 0) {
- char buf[80];
- regerror(r, &rule->re, buf, sizeof(buf));
- bsdtar_errc(bsdtar, 1, 0, "Invalid regular expression: %s", buf);
- }
- free(pattern);
-
- start_subst = end_pattern + 1;
- end_pattern = strchr(start_subst, *rule_text);
- if (end_pattern == NULL)
- bsdtar_errc(bsdtar, 1, 0, "Invalid replacement string");
-
- rule->result = malloc(end_pattern - start_subst + 1);
- if (rule->result == NULL)
- bsdtar_errc(bsdtar, 1, errno, "Out of memory");
- memcpy(rule->result, start_subst, end_pattern - start_subst);
- rule->result[end_pattern - start_subst] = '\0';
-
- rule->global = 0;
- rule->print = 0;
- rule->symlink = 0;
-
- while (*++end_pattern) {
- switch (*end_pattern) {
- case 'g':
- case 'G':
- rule->global = 1;
- break;
- case 'p':
- case 'P':
- rule->print = 1;
- break;
- case 's':
- case 'S':
- rule->symlink = 1;
- break;
- default:
- bsdtar_errc(bsdtar, 1, 0, "Invalid replacement flag %c", *end_pattern);
- }
- }
-}
-
-static void
-realloc_strncat(struct bsdtar *bsdtar, char **str, const char *append, size_t len)
-{
- char *new_str;
- size_t old_len;
-
- if (*str == NULL)
- old_len = 0;
- else
- old_len = strlen(*str);
-
- new_str = malloc(old_len + len + 1);
- if (new_str == NULL)
- bsdtar_errc(bsdtar, 1, errno, "Out of memory");
- memcpy(new_str, *str, old_len);
- memcpy(new_str + old_len, append, len);
- new_str[old_len + len] = '\0';
- free(*str);
- *str = new_str;
-}
-
-static void
-realloc_strcat(struct bsdtar *bsdtar, char **str, const char *append)
-{
- char *new_str;
- size_t old_len;
-
- if (*str == NULL)
- old_len = 0;
- else
- old_len = strlen(*str);
-
- new_str = malloc(old_len + strlen(append) + 1);
- if (new_str == NULL)
- bsdtar_errc(bsdtar, 1, errno, "Out of memory");
- memcpy(new_str, *str, old_len);
- strcpy(new_str + old_len, append);
- free(*str);
- *str = new_str;
-}
-
-int
-apply_substitution(struct bsdtar *bsdtar, const char *name, char **result, int symlink_only)
-{
- const char *path = name;
- regmatch_t matches[10];
- size_t i, j;
- struct subst_rule *rule;
- struct substitution *subst;
- int c, got_match, print_match;
-
- *result = NULL;
-
- if ((subst = bsdtar->substitution) == NULL)
- return 0;
-
- got_match = 0;
- print_match = 0;
-
- for (rule = subst->first_rule; rule != NULL; rule = rule->next) {
- if (symlink_only && !rule->symlink)
- continue;
- if (regexec(&rule->re, name, 10, matches, 0))
- break;
-
- got_match = 1;
- print_match |= rule->print;
- realloc_strncat(bsdtar, result, name, matches[0].rm_so);
-
- for (i = 0, j = 0; rule->result[i] != '\0'; ++i) {
- if (rule->result[i] == '~') {
- realloc_strncat(bsdtar, result, rule->result + j, i - j);
- realloc_strncat(bsdtar, result, name, matches[0].rm_eo);
- j = i + 1;
- continue;
- }
- if (rule->result[i] != '\\')
- continue;
-
- ++i;
- c = rule->result[i];
- switch (c) {
- case '~':
- case '\\':
- realloc_strncat(bsdtar, result, rule->result + j, i - j - 1);
- j = i;
- break;
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- realloc_strncat(bsdtar, result, rule->result + j, i - j - 1);
- if ((size_t)(c - '0') > (size_t)(rule->re.re_nsub)) {
- free(*result);
- *result = NULL;
- return -1;
- }
- realloc_strncat(bsdtar, result, name + matches[c - '0'].rm_so, matches[c - '0'].rm_eo - matches[c - '0'].rm_so);
- j = i + 1;
- break;
- default:
- /* Just continue; */
- break;
- }
-
- }
-
- realloc_strcat(bsdtar, result, rule->result + j);
-
- name += matches[0].rm_eo;
-
- if (!rule->global)
- break;
- }
-
- if (got_match)
- realloc_strcat(bsdtar, result, name);
-
- if (print_match)
- fprintf(stderr, "%s >> %s\n", path, *result);
-
- return got_match;
-}
-
-void
-cleanup_substitution(struct bsdtar *bsdtar)
-{
- struct subst_rule *rule;
- struct substitution *subst;
-
- if ((subst = bsdtar->substitution) == NULL)
- return;
-
- while ((rule = subst->first_rule) != NULL) {
- subst->first_rule = rule->next;
- free(rule->result);
- free(rule);
- }
- free(subst);
-}
-#endif /* HAVE_REGEX_H */
diff --git a/usr.bin/tar/test/Makefile b/usr.bin/tar/test/Makefile
deleted file mode 100644
index fce819c..0000000
--- a/usr.bin/tar/test/Makefile
+++ /dev/null
@@ -1,64 +0,0 @@
-# $FreeBSD$
-
-# Where to find the tar sources (for the internal unit tests)
-TAR_SRCDIR=${.CURDIR}/..
-.PATH: ${TAR_SRCDIR}
-
-# Some tar sources are pulled in for white-box tests
-TAR_SRCS= \
- ../getdate.y
-
-TESTS= \
- test_0.c \
- test_basic.c \
- test_copy.c \
- test_getdate.c \
- test_help.c \
- test_option_T.c \
- test_option_q.c \
- test_patterns.c \
- test_stdio.c \
- test_symlink_dir.c \
- test_version.c
-
-# Build the test program
-SRCS= ${TAR_SRCS} \
- ${TESTS} \
- list.h \
- main.c
-
-CLEANFILES+= list.h
-
-NO_MAN=yes
-
-PROG=bsdtar_test
-DPADD=${LIBARCHIVE} ${LIBBZ2} ${LIBZ}
-CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\"
-CFLAGS+= -I..
-LDADD= -larchive -lz -lbz2
-CFLAGS+= -static -g -O2 -Wall
-CFLAGS+= -I${.OBJDIR}
-CFLAGS+= -I${TAR_SRCDIR}
-
-# Uncomment to link against dmalloc
-#LDADD+= -L/usr/local/lib -ldmalloc
-#CFLAGS+= -I/usr/local/include -DUSE_DMALLOC
-WARNS=6
-
-check test: bsdtar_test
- ./bsdtar_test -p ${.OBJDIR}/../bsdtar -r ${.CURDIR}
-
-list.h: ${TESTS} Makefile
- (cd ${.CURDIR}; cat ${TESTS}) | grep DEFINE_TEST > list.h
-
-clean:
- rm -f *.out
- rm -f *.o
- rm -f *.core
- rm -f *~
- rm -f list.h
- rm -f archive.h ../archive.h
- -chmod -R +w /tmp/bsdtar_test.*
- rm -rf /tmp/bsdtar_test.*
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/tar/test/main.c b/usr.bin/tar/test/main.c
deleted file mode 100644
index c9284c1..0000000
--- a/usr.bin/tar/test/main.c
+++ /dev/null
@@ -1,1046 +0,0 @@
-/*
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Various utility routines useful for test programs.
- * Each test program is linked against this file.
- */
-#include "test.h"
-
-#include <errno.h>
-#include <locale.h>
-#include <stdarg.h>
-#include <time.h>
-
-/*
- * This same file is used pretty much verbatim for all test harnesses.
- *
- * The next few lines are the only differences.
- */
-#define PROGRAM "bsdtar" /* Name of program being tested. */
-#define ENVBASE "BSDTAR" /* Prefix for environment variables. */
-#undef EXTRA_DUMP /* How to dump extra data */
-/* How to generate extra version info. */
-#define EXTRA_VERSION (systemf("%s --version", testprog) ? "" : "")
-__FBSDID("$FreeBSD$");
-
-/*
- * "list.h" is simply created by "grep DEFINE_TEST"; it has
- * a line like
- * DEFINE_TEST(test_function)
- * for each test.
- * Include it here with a suitable DEFINE_TEST to declare all of the
- * test functions.
- */
-#undef DEFINE_TEST
-#define DEFINE_TEST(name) void name(void);
-#include "list.h"
-
-/* Interix doesn't define these in a standard header. */
-#if __INTERIX__
-extern char *optarg;
-extern int optind;
-#endif
-
-/* Enable core dump on failure. */
-static int dump_on_failure = 0;
-/* Default is to remove temp dirs for successful tests. */
-static int keep_temp_files = 0;
-/* Default is to print some basic information about each test. */
-static int quiet_flag = 0;
-/* Default is to summarize repeated failures. */
-static int verbose = 0;
-/* Cumulative count of component failures. */
-static int failures = 0;
-/* Cumulative count of skipped component tests. */
-static int skips = 0;
-/* Cumulative count of assertions. */
-static int assertions = 0;
-
-/* Directory where uuencoded reference files can be found. */
-static char *refdir;
-
-/*
- * My own implementation of the standard assert() macro emits the
- * message in the same format as GCC (file:line: message).
- * It also includes some additional useful information.
- * This makes it a lot easier to skim through test failures in
- * Emacs. ;-)
- *
- * It also supports a few special features specifically to simplify
- * test harnesses:
- * failure(fmt, args) -- Stores a text string that gets
- * printed if the following assertion fails, good for
- * explaining subtle tests.
- */
-static char msg[4096];
-
-/*
- * For each test source file, we remember how many times each
- * failure was reported.
- */
-static const char *failed_filename = NULL;
-static struct line {
- int line;
- int count;
-} failed_lines[1000];
-
-/*
- * Count this failure; return the number of previous failures.
- */
-static int
-previous_failures(const char *filename, int line)
-{
- unsigned int i;
- int count;
-
- if (failed_filename == NULL || strcmp(failed_filename, filename) != 0)
- memset(failed_lines, 0, sizeof(failed_lines));
- failed_filename = filename;
-
- for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) {
- if (failed_lines[i].line == line) {
- count = failed_lines[i].count;
- failed_lines[i].count++;
- return (count);
- }
- if (failed_lines[i].line == 0) {
- failed_lines[i].line = line;
- failed_lines[i].count = 1;
- return (0);
- }
- }
- return (0);
-}
-
-/*
- * Copy arguments into file-local variables.
- */
-static const char *test_filename;
-static int test_line;
-static void *test_extra;
-void test_setup(const char *filename, int line)
-{
- test_filename = filename;
- test_line = line;
-}
-
-/*
- * Inform user that we're skipping a test.
- */
-void
-test_skipping(const char *fmt, ...)
-{
- va_list ap;
-
- if (previous_failures(test_filename, test_line))
- return;
-
- va_start(ap, fmt);
- fprintf(stderr, " *** SKIPPING: ");
- vfprintf(stderr, fmt, ap);
- fprintf(stderr, "\n");
- va_end(ap);
- ++skips;
-}
-
-/* Common handling of failed tests. */
-static void
-report_failure(void *extra)
-{
- if (msg[0] != '\0') {
- fprintf(stderr, " Description: %s\n", msg);
- msg[0] = '\0';
- }
-
-#ifdef EXTRA_DUMP
- if (extra != NULL)
- fprintf(stderr, " detail: %s\n", EXTRA_DUMP(extra));
-#else
- (void)extra; /* UNUSED */
-#endif
-
- if (dump_on_failure) {
- fprintf(stderr,
- " *** forcing core dump so failure can be debugged ***\n");
- *(char *)(NULL) = 0;
- exit(1);
- }
-}
-
-/*
- * Summarize repeated failures in the just-completed test file.
- * The reports above suppress multiple failures from the same source
- * line; this reports on any tests that did fail multiple times.
- */
-static int
-summarize_comparator(const void *a0, const void *b0)
-{
- const struct line *a = a0, *b = b0;
- if (a->line == 0 && b->line == 0)
- return (0);
- if (a->line == 0)
- return (1);
- if (b->line == 0)
- return (-1);
- return (a->line - b->line);
-}
-
-static void
-summarize(void)
-{
- unsigned int i;
-
- qsort(failed_lines, sizeof(failed_lines)/sizeof(failed_lines[0]),
- sizeof(failed_lines[0]), summarize_comparator);
- for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) {
- if (failed_lines[i].line == 0)
- break;
- if (failed_lines[i].count > 1)
- fprintf(stderr, "%s:%d: Failed %d times\n",
- failed_filename, failed_lines[i].line,
- failed_lines[i].count);
- }
- /* Clear the failure history for the next file. */
- memset(failed_lines, 0, sizeof(failed_lines));
-}
-
-/* Set up a message to display only after a test fails. */
-void
-failure(const char *fmt, ...)
-{
- va_list ap;
- va_start(ap, fmt);
- vsprintf(msg, fmt, ap);
- va_end(ap);
-}
-
-/* Generic assert() just displays the failed condition. */
-int
-test_assert(const char *file, int line, int value, const char *condition, void *extra)
-{
- ++assertions;
- if (value) {
- msg[0] = '\0';
- return (value);
- }
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (value);
- fprintf(stderr, "%s:%d: Assertion failed\n", file, line);
- fprintf(stderr, " Condition: %s\n", condition);
- report_failure(extra);
- return (value);
-}
-
-/* assertEqualInt() displays the values of the two integers. */
-int
-test_assert_equal_int(const char *file, int line,
- int v1, const char *e1, int v2, const char *e2, void *extra)
-{
- ++assertions;
- if (v1 == v2) {
- msg[0] = '\0';
- return (1);
- }
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (0);
- fprintf(stderr, "%s:%d: Assertion failed: Ints not equal\n",
- file, line);
- fprintf(stderr, " %s=%d\n", e1, v1);
- fprintf(stderr, " %s=%d\n", e2, v2);
- report_failure(extra);
- return (0);
-}
-
-static void strdump(const char *p)
-{
- if (p == NULL) {
- fprintf(stderr, "(null)");
- return;
- }
- fprintf(stderr, "\"");
- while (*p != '\0') {
- unsigned int c = 0xff & *p++;
- switch (c) {
- case '\a': fprintf(stderr, "\a"); break;
- case '\b': fprintf(stderr, "\b"); break;
- case '\n': fprintf(stderr, "\n"); break;
- case '\r': fprintf(stderr, "\r"); break;
- default:
- if (c >= 32 && c < 127)
- fprintf(stderr, "%c", c);
- else
- fprintf(stderr, "\\x%02X", c);
- }
- }
- fprintf(stderr, "\"");
-}
-
-/* assertEqualString() displays the values of the two strings. */
-int
-test_assert_equal_string(const char *file, int line,
- const char *v1, const char *e1,
- const char *v2, const char *e2,
- void *extra)
-{
- ++assertions;
- if (v1 == NULL || v2 == NULL) {
- if (v1 == v2) {
- msg[0] = '\0';
- return (1);
- }
- } else if (strcmp(v1, v2) == 0) {
- msg[0] = '\0';
- return (1);
- }
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (0);
- fprintf(stderr, "%s:%d: Assertion failed: Strings not equal\n",
- file, line);
- fprintf(stderr, " %s = ", e1);
- strdump(v1);
- fprintf(stderr, " (length %d)\n", v1 == NULL ? 0 : strlen(v1));
- fprintf(stderr, " %s = ", e2);
- strdump(v2);
- fprintf(stderr, " (length %d)\n", v2 == NULL ? 0 : strlen(v2));
- report_failure(extra);
- return (0);
-}
-
-static void wcsdump(const wchar_t *w)
-{
- if (w == NULL) {
- fprintf(stderr, "(null)");
- return;
- }
- fprintf(stderr, "\"");
- while (*w != L'\0') {
- unsigned int c = *w++;
- if (c >= 32 && c < 127)
- fprintf(stderr, "%c", c);
- else if (c < 256)
- fprintf(stderr, "\\x%02X", c);
- else if (c < 0x10000)
- fprintf(stderr, "\\u%04X", c);
- else
- fprintf(stderr, "\\U%08X", c);
- }
- fprintf(stderr, "\"");
-}
-
-/* assertEqualWString() displays the values of the two strings. */
-int
-test_assert_equal_wstring(const char *file, int line,
- const wchar_t *v1, const char *e1,
- const wchar_t *v2, const char *e2,
- void *extra)
-{
- ++assertions;
- if (v1 == NULL) {
- if (v2 == NULL) {
- msg[0] = '\0';
- return (1);
- }
- } else if (v2 == NULL) {
- if (v1 == NULL) {
- msg[0] = '\0';
- return (1);
- }
- } else if (wcscmp(v1, v2) == 0) {
- msg[0] = '\0';
- return (1);
- }
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (0);
- fprintf(stderr, "%s:%d: Assertion failed: Unicode strings not equal\n",
- file, line);
- fprintf(stderr, " %s = ", e1);
- wcsdump(v1);
- fprintf(stderr, "\n");
- fprintf(stderr, " %s = ", e2);
- wcsdump(v2);
- fprintf(stderr, "\n");
- report_failure(extra);
- return (0);
-}
-
-/*
- * Pretty standard hexdump routine. As a bonus, if ref != NULL, then
- * any bytes in p that differ from ref will be highlighted with '_'
- * before and after the hex value.
- */
-static void
-hexdump(const char *p, const char *ref, size_t l, size_t offset)
-{
- size_t i, j;
- char sep;
-
- for(i=0; i < l; i+=16) {
- fprintf(stderr, "%04x", i + offset);
- sep = ' ';
- for (j = 0; j < 16 && i + j < l; j++) {
- if (ref != NULL && p[i + j] != ref[i + j])
- sep = '_';
- fprintf(stderr, "%c%02x", sep, 0xff & (int)p[i+j]);
- if (ref != NULL && p[i + j] == ref[i + j])
- sep = ' ';
- }
- for (; j < 16; j++) {
- fprintf(stderr, "%c ", sep);
- sep = ' ';
- }
- fprintf(stderr, "%c", sep);
- for (j=0; j < 16 && i + j < l; j++) {
- int c = p[i + j];
- if (c >= ' ' && c <= 126)
- fprintf(stderr, "%c", c);
- else
- fprintf(stderr, ".");
- }
- fprintf(stderr, "\n");
- }
-}
-
-/* assertEqualMem() displays the values of the two memory blocks. */
-/* TODO: For long blocks, hexdump the first bytes that actually differ. */
-int
-test_assert_equal_mem(const char *file, int line,
- const char *v1, const char *e1,
- const char *v2, const char *e2,
- size_t l, const char *ld, void *extra)
-{
- ++assertions;
- if (v1 == NULL || v2 == NULL) {
- if (v1 == v2) {
- msg[0] = '\0';
- return (1);
- }
- } else if (memcmp(v1, v2, l) == 0) {
- msg[0] = '\0';
- return (1);
- }
- failures ++;
- if (!verbose && previous_failures(file, line))
- return (0);
- fprintf(stderr, "%s:%d: Assertion failed: memory not equal\n",
- file, line);
- fprintf(stderr, " size %s = %d\n", ld, (int)l);
- fprintf(stderr, " Dump of %s\n", e1);
- hexdump(v1, v2, l < 32 ? l : 32, 0);
- fprintf(stderr, " Dump of %s\n", e2);
- hexdump(v2, v1, l < 32 ? l : 32, 0);
- fprintf(stderr, "\n");
- report_failure(extra);
- return (0);
-}
-
-int
-test_assert_empty_file(const char *f1fmt, ...)
-{
- char buff[1024];
- char f1[1024];
- struct stat st;
- va_list ap;
- ssize_t s;
- int fd;
-
-
- va_start(ap, f1fmt);
- vsprintf(f1, f1fmt, ap);
- va_end(ap);
-
- if (stat(f1, &st) != 0) {
- fprintf(stderr, "%s:%d: Could not stat: %s\n", test_filename, test_line, f1);
- report_failure(NULL);
- return (0);
- }
- if (st.st_size == 0)
- return (1);
-
- failures ++;
- if (!verbose && previous_failures(test_filename, test_line))
- return (0);
-
- fprintf(stderr, "%s:%d: File not empty: %s\n", test_filename, test_line, f1);
- fprintf(stderr, " File size: %d\n", (int)st.st_size);
- fprintf(stderr, " Contents:\n");
- fd = open(f1, O_RDONLY);
- if (fd < 0) {
- fprintf(stderr, " Unable to open %s\n", f1);
- } else {
- s = sizeof(buff) < st.st_size ? sizeof(buff) : st.st_size;
- s = read(fd, buff, s);
- hexdump(buff, NULL, s, 0);
- }
- report_failure(NULL);
- return (0);
-}
-
-int
-test_assert_non_empty_file(const char *f1fmt, ...)
-{
- char f1[1024];
- struct stat st;
- va_list ap;
-
-
- va_start(ap, f1fmt);
- vsprintf(f1, f1fmt, ap);
- va_end(ap);
-
- if (stat(f1, &st) != 0) {
- fprintf(stderr, "%s:%d: Could not stat: %s\n",
- test_filename, test_line, f1);
- report_failure(NULL);
- return (0);
- }
- if (st.st_size != 0)
- return (1);
-
- failures ++;
- if (!verbose && previous_failures(test_filename, test_line))
- return (0);
-
- fprintf(stderr, "%s:%d: File empty: %s\n",
- test_filename, test_line, f1);
- report_failure(NULL);
- return (0);
-}
-
-/* assertEqualFile() asserts that two files have the same contents. */
-/* TODO: hexdump the first bytes that actually differ. */
-int
-test_assert_equal_file(const char *f1, const char *f2pattern, ...)
-{
- char f2[1024];
- va_list ap;
- char buff1[1024];
- char buff2[1024];
- int fd1, fd2;
- int n1, n2;
-
- va_start(ap, f2pattern);
- vsprintf(f2, f2pattern, ap);
- va_end(ap);
-
- fd1 = open(f1, O_RDONLY);
- fd2 = open(f2, O_RDONLY);
- for (;;) {
- n1 = read(fd1, buff1, sizeof(buff1));
- n2 = read(fd2, buff2, sizeof(buff2));
- if (n1 != n2)
- break;
- if (n1 == 0 && n2 == 0)
- return (1);
- if (memcmp(buff1, buff2, n1) != 0)
- break;
- }
- failures ++;
- if (!verbose && previous_failures(test_filename, test_line))
- return (0);
- fprintf(stderr, "%s:%d: Files are not identical\n",
- test_filename, test_line);
- fprintf(stderr, " file1=\"%s\"\n", f1);
- fprintf(stderr, " file2=\"%s\"\n", f2);
- report_failure(test_extra);
- return (0);
-}
-
-int
-test_assert_file_exists(const char *fpattern, ...)
-{
- char f[1024];
- va_list ap;
-
- va_start(ap, fpattern);
- vsprintf(f, fpattern, ap);
- va_end(ap);
-
- if (!access(f, F_OK))
- return (1);
- if (!previous_failures(test_filename, test_line)) {
- fprintf(stderr, "%s:%d: File doesn't exist\n",
- test_filename, test_line);
- fprintf(stderr, " file=\"%s\"\n", f);
- report_failure(test_extra);
- }
- return (0);
-}
-
-int
-test_assert_file_not_exists(const char *fpattern, ...)
-{
- char f[1024];
- va_list ap;
-
- va_start(ap, fpattern);
- vsprintf(f, fpattern, ap);
- va_end(ap);
-
- if (access(f, F_OK))
- return (1);
- if (!previous_failures(test_filename, test_line)) {
- fprintf(stderr, "%s:%d: File exists and shouldn't\n",
- test_filename, test_line);
- fprintf(stderr, " file=\"%s\"\n", f);
- report_failure(test_extra);
- }
- return (0);
-}
-
-/* assertFileContents() asserts the contents of a file. */
-int
-test_assert_file_contents(const void *buff, int s, const char *fpattern, ...)
-{
- char f[1024];
- va_list ap;
- char *contents;
- int fd;
- int n;
-
- va_start(ap, fpattern);
- vsprintf(f, fpattern, ap);
- va_end(ap);
-
- fd = open(f, O_RDONLY);
- contents = malloc(s * 2);
- n = read(fd, contents, s * 2);
- if (n == s && memcmp(buff, contents, s) == 0) {
- free(contents);
- return (1);
- }
- failures ++;
- if (!previous_failures(test_filename, test_line)) {
- fprintf(stderr, "%s:%d: File contents don't match\n",
- test_filename, test_line);
- fprintf(stderr, " file=\"%s\"\n", f);
- if (n > 0)
- hexdump(contents, buff, n, 0);
- else {
- fprintf(stderr, " File empty, contents should be:\n");
- hexdump(buff, NULL, s, 0);
- }
- report_failure(test_extra);
- }
- free(contents);
- return (0);
-}
-
-/*
- * Call standard system() call, but build up the command line using
- * sprintf() conventions.
- */
-int
-systemf(const char *fmt, ...)
-{
- char buff[8192];
- va_list ap;
- int r;
-
- va_start(ap, fmt);
- vsprintf(buff, fmt, ap);
- r = system(buff);
- va_end(ap);
- return (r);
-}
-
-/*
- * Slurp a file into memory for ease of comparison and testing.
- * Returns size of file in 'sizep' if non-NULL, null-terminates
- * data in memory for ease of use.
- */
-char *
-slurpfile(size_t * sizep, const char *fmt, ...)
-{
- char filename[8192];
- struct stat st;
- va_list ap;
- char *p;
- ssize_t bytes_read;
- int fd;
- int r;
-
- va_start(ap, fmt);
- vsprintf(filename, fmt, ap);
- va_end(ap);
-
- fd = open(filename, O_RDONLY);
- if (fd < 0) {
- /* Note: No error; non-existent file is okay here. */
- return (NULL);
- }
- r = fstat(fd, &st);
- if (r != 0) {
- fprintf(stderr, "Can't stat file %s\n", filename);
- close(fd);
- return (NULL);
- }
- p = malloc(st.st_size + 1);
- if (p == NULL) {
- fprintf(stderr, "Can't allocate %ld bytes of memory to read file %s\n", (long int)st.st_size, filename);
- close(fd);
- return (NULL);
- }
- bytes_read = read(fd, p, st.st_size);
- if (bytes_read < st.st_size) {
- fprintf(stderr, "Can't read file %s\n", filename);
- close(fd);
- free(p);
- return (NULL);
- }
- p[st.st_size] = '\0';
- if (sizep != NULL)
- *sizep = (size_t)st.st_size;
- close(fd);
- return (p);
-}
-
-/*
- * "list.h" is automatically generated; it just has a lot of lines like:
- * DEFINE_TEST(function_name)
- * It's used above to declare all of the test functions.
- * We reuse it here to define a list of all tests (functions and names).
- */
-#undef DEFINE_TEST
-#define DEFINE_TEST(n) { n, #n },
-struct { void (*func)(void); const char *name; } tests[] = {
- #include "list.h"
-};
-
-/*
- * Each test is run in a private work dir. Those work dirs
- * do have consistent and predictable names, in case a group
- * of tests need to collaborate. However, there is no provision
- * for requiring that tests run in a certain order.
- */
-static int test_run(int i, const char *tmpdir)
-{
- int failures_before = failures;
-
- if (!quiet_flag) {
- printf("%d: %s\n", i, tests[i].name);
- fflush(stdout);
- }
-
- /*
- * Always explicitly chdir() in case the last test moved us to
- * a strange place.
- */
- if (chdir(tmpdir)) {
- fprintf(stderr,
- "ERROR: Couldn't chdir to temp dir %s\n",
- tmpdir);
- exit(1);
- }
- /* Create a temp directory for this specific test. */
- if (mkdir(tests[i].name, 0755)) {
- fprintf(stderr,
- "ERROR: Couldn't create temp dir ``%s''\n",
- tests[i].name);
- exit(1);
- }
- /* Chdir() to that work directory. */
- if (chdir(tests[i].name)) {
- fprintf(stderr,
- "ERROR: Couldn't chdir to temp dir ``%s''\n",
- tests[i].name);
- exit(1);
- }
- /* Explicitly reset the locale before each test. */
- setlocale(LC_ALL, "C");
- /* Run the actual test. */
- (*tests[i].func)();
- /* Summarize the results of this test. */
- summarize();
- /* If there were no failures, we can remove the work dir. */
- if (failures == failures_before) {
- if (!keep_temp_files && chdir(tmpdir) == 0) {
- systemf("rm -rf %s", tests[i].name);
- }
- }
- /* Return appropriate status. */
- return (failures == failures_before ? 0 : 1);
-}
-
-static void usage(const char *program)
-{
- static const int limit = sizeof(tests) / sizeof(tests[0]);
- int i;
-
- printf("Usage: %s [options] <test> <test> ...\n", program);
- printf("Default is to run all tests.\n");
- printf("Otherwise, specify the numbers of the tests you wish to run.\n");
- printf("Options:\n");
- printf(" -d Dump core after any failure, for debugging.\n");
- printf(" -k Keep all temp files.\n");
- printf(" Default: temp files for successful tests deleted.\n");
-#ifdef PROGRAM
- printf(" -p <path> Path to executable to be tested.\n");
- printf(" Default: path taken from " ENVBASE " environment variable.\n");
-#endif
- printf(" -q Quiet.\n");
- printf(" -r <dir> Path to dir containing reference files.\n");
- printf(" Default: Current directory.\n");
- printf(" -v Verbose.\n");
- printf("Available tests:\n");
- for (i = 0; i < limit; i++)
- printf(" %d: %s\n", i, tests[i].name);
- exit(1);
-}
-
-#define UUDECODE(c) (((c) - 0x20) & 0x3f)
-
-void
-extract_reference_file(const char *name)
-{
- char buff[1024];
- FILE *in, *out;
-
- sprintf(buff, "%s/%s.uu", refdir, name);
- in = fopen(buff, "r");
- failure("Couldn't open reference file %s", buff);
- assert(in != NULL);
- if (in == NULL)
- return;
- /* Read up to and including the 'begin' line. */
- for (;;) {
- if (fgets(buff, sizeof(buff), in) == NULL) {
- /* TODO: This is a failure. */
- return;
- }
- if (memcmp(buff, "begin ", 6) == 0)
- break;
- }
- /* Now, decode the rest and write it. */
- /* Not a lot of error checking here; the input better be right. */
- out = fopen(name, "w");
- while (fgets(buff, sizeof(buff), in) != NULL) {
- char *p = buff;
- int bytes;
-
- if (memcmp(buff, "end", 3) == 0)
- break;
-
- bytes = UUDECODE(*p++);
- while (bytes > 0) {
- int n = 0;
- /* Write out 1-3 bytes from that. */
- if (bytes > 0) {
- n = UUDECODE(*p++) << 18;
- n |= UUDECODE(*p++) << 12;
- fputc(n >> 16, out);
- --bytes;
- }
- if (bytes > 0) {
- n |= UUDECODE(*p++) << 6;
- fputc((n >> 8) & 0xFF, out);
- --bytes;
- }
- if (bytes > 0) {
- n |= UUDECODE(*p++);
- fputc(n & 0xFF, out);
- --bytes;
- }
- }
- }
- fclose(out);
- fclose(in);
-}
-
-
-int main(int argc, char **argv)
-{
- static const int limit = sizeof(tests) / sizeof(tests[0]);
- int i, tests_run = 0, tests_failed = 0, opt;
- time_t now;
- char *refdir_alloc = NULL;
- char *progname, *p;
- char tmpdir[256];
- char tmpdir_timestamp[256];
-
- /*
- * Name of this program, used to build root of our temp directory
- * tree.
- */
- progname = p = argv[0];
- while (*p != '\0') {
- if (*p == '/')
- progname = p + 1;
- ++p;
- }
-
-#ifdef PROGRAM
- /* Get the target program from environment, if available. */
- testprog = getenv(ENVBASE);
-#endif
-
- /* Allow -d to be controlled through the environment. */
- if (getenv(ENVBASE "_DEBUG") != NULL)
- dump_on_failure = 1;
-
- /* Get the directory holding test files from environment. */
- refdir = getenv(ENVBASE "_TEST_FILES");
-
- /*
- * Parse options.
- */
- while ((opt = getopt(argc, argv, "dkp:qr:v")) != -1) {
- switch (opt) {
- case 'd':
- dump_on_failure = 1;
- break;
- case 'k':
- keep_temp_files = 1;
- break;
- case 'p':
-#ifdef PROGRAM
- testprog = optarg;
-#else
- usage(progname);
-#endif
- break;
- case 'q':
- quiet_flag++;
- break;
- case 'r':
- refdir = optarg;
- break;
- case 'v':
- verbose = 1;
- break;
- case '?':
- default:
- usage(progname);
- }
- }
- argc -= optind;
- argv += optind;
-
- /*
- * Sanity-check that our options make sense.
- */
-#ifdef PROGRAM
- if (testprog == NULL)
- usage(progname);
-#endif
-
- /*
- * Create a temp directory for the following tests.
- * Include the time the tests started as part of the name,
- * to make it easier to track the results of multiple tests.
- */
- now = time(NULL);
- for (i = 0; i < 1000; i++) {
- strftime(tmpdir_timestamp, sizeof(tmpdir_timestamp),
- "%Y-%m-%dT%H.%M.%S",
- localtime(&now));
- sprintf(tmpdir, "/tmp/%s.%s-%03d", progname, tmpdir_timestamp, i);
- if (mkdir(tmpdir,0755) == 0)
- break;
- if (errno == EEXIST)
- continue;
- fprintf(stderr, "ERROR: Unable to create temp directory %s\n",
- tmpdir);
- exit(1);
- }
-
- /*
- * If the user didn't specify a directory for locating
- * reference files, use the current directory for that.
- */
- if (refdir == NULL) {
- systemf("/bin/pwd > %s/refdir", tmpdir);
- refdir = refdir_alloc = slurpfile(NULL, "%s/refdir", tmpdir);
- p = refdir + strlen(refdir);
- while (p[-1] == '\n') {
- --p;
- *p = '\0';
- }
- systemf("rm %s/refdir", tmpdir);
- }
-
- /*
- * Banner with basic information.
- */
- if (!quiet_flag) {
- printf("Running tests in: %s\n", tmpdir);
- printf("Reference files will be read from: %s\n", refdir);
-#ifdef PROGRAM
- printf("Running tests on: %s\n", testprog);
-#endif
- printf("Exercising: ");
- fflush(stdout);
- printf("%s\n", EXTRA_VERSION);
- }
-
- /*
- * Run some or all of the individual tests.
- */
- if (argc == 0) {
- /* Default: Run all tests. */
- for (i = 0; i < limit; i++) {
- if (test_run(i, tmpdir))
- tests_failed++;
- tests_run++;
- }
- } else {
- while (*(argv) != NULL) {
- i = atoi(*argv);
- if (**argv < '0' || **argv > '9' || i < 0 || i >= limit) {
- printf("*** INVALID Test %s\n", *argv);
- usage(progname);
- } else {
- if (test_run(i, tmpdir))
- tests_failed++;
- tests_run++;
- }
- argv++;
- }
- }
-
- /*
- * Report summary statistics.
- */
- if (!quiet_flag) {
- printf("\n");
- printf("%d of %d tests reported failures\n",
- tests_failed, tests_run);
- printf(" Total of %d assertions checked.\n", assertions);
- printf(" Total of %d assertions failed.\n", failures);
- printf(" Total of %d assertions skipped.\n", skips);
- }
-
- free(refdir_alloc);
-
- /* If the final tmpdir is empty, we can remove it. */
- /* This should be the usual case when all tests succeed. */
- rmdir(tmpdir);
-
- return (tests_failed);
-}
diff --git a/usr.bin/tar/test/test.h b/usr.bin/tar/test/test.h
deleted file mode 100644
index bb7003e..0000000
--- a/usr.bin/tar/test/test.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (c) 2003-2006 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/* Every test program should #include "test.h" as the first thing. */
-
-/*
- * The goal of this file (and the matching test.c) is to
- * simplify the very repetitive test-*.c test programs.
- */
-#if defined(HAVE_CONFIG_H)
-/* Most POSIX platforms use the 'configure' script to build config.h */
-#include "../../config.h"
-#elif defined(__FreeBSD__)
-/* Building as part of FreeBSD system requires a pre-built config.h. */
-#include "../config_freebsd.h"
-#elif defined(_WIN32)
-/* Win32 can't run the 'configure' script. */
-#include "../config_windows.h"
-#else
-/* Warn if the library hasn't been (automatically or manually) configured. */
-#error Oops: No config.h and no pre-built configuration in test.h.
-#endif
-
-#include <dirent.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-#ifndef _WIN32
-#include <unistd.h>
-#endif
-#include <wchar.h>
-
-#ifdef USE_DMALLOC
-#include <dmalloc.h>
-#endif
-
-/* No non-FreeBSD platform will have __FBSDID, so just define it here. */
-#ifdef __FreeBSD__
-#include <sys/cdefs.h> /* For __FBSDID */
-#else
-#define __FBSDID(a) /* null */
-#endif
-
-/*
- * Redefine DEFINE_TEST for use in defining the test functions.
- */
-#undef DEFINE_TEST
-#define DEFINE_TEST(name) void name(void); void name(void)
-
-/* An implementation of the standard assert() macro */
-#define assert(e) test_assert(__FILE__, __LINE__, (e), #e, NULL)
-
-/* Assert two integers are the same. Reports value of each one if not. */
-#define assertEqualInt(v1,v2) \
- test_assert_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
-
-/* Assert two strings are the same. Reports value of each one if not. */
-#define assertEqualString(v1,v2) \
- test_assert_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
-/* As above, but v1 and v2 are wchar_t * */
-#define assertEqualWString(v1,v2) \
- test_assert_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
-/* As above, but raw blocks of bytes. */
-#define assertEqualMem(v1, v2, l) \
- test_assert_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL)
-/* Assert two files are the same; allow printf-style expansion of second name.
- * See below for comments about variable arguments here...
- */
-#define assertEqualFile \
- test_setup(__FILE__, __LINE__);test_assert_equal_file
-/* Assert that a file is empty; supports printf-style arguments. */
-#define assertEmptyFile \
- test_setup(__FILE__, __LINE__);test_assert_empty_file
-/* Assert that a file is not empty; supports printf-style arguments. */
-#define assertNonEmptyFile \
- test_setup(__FILE__, __LINE__);test_assert_non_empty_file
-/* Assert that a file exists; supports printf-style arguments. */
-#define assertFileExists \
- test_setup(__FILE__, __LINE__);test_assert_file_exists
-/* Assert that a file exists; supports printf-style arguments. */
-#define assertFileNotExists \
- test_setup(__FILE__, __LINE__);test_assert_file_not_exists
-/* Assert that file contents match a string; supports printf-style arguments. */
-#define assertFileContents \
- test_setup(__FILE__, __LINE__);test_assert_file_contents
-
-/*
- * This would be simple with C99 variadic macros, but I don't want to
- * require that. Instead, I insert a function call before each
- * skipping() call to pass the file and line information down. Crude,
- * but effective.
- */
-#define skipping \
- test_setup(__FILE__, __LINE__);test_skipping
-
-/* Function declarations. These are defined in test_utility.c. */
-void failure(const char *fmt, ...);
-void test_setup(const char *, int);
-void test_skipping(const char *fmt, ...);
-int test_assert(const char *, int, int, const char *, void *);
-int test_assert_empty_file(const char *, ...);
-int test_assert_non_empty_file(const char *, ...);
-int test_assert_equal_file(const char *, const char *, ...);
-int test_assert_equal_int(const char *, int, int, const char *, int, const char *, void *);
-int test_assert_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *);
-int test_assert_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *);
-int test_assert_equal_mem(const char *, int, const char *, const char *, const char *, const char *, size_t, const char *, void *);
-int test_assert_file_contents(const void *, int, const char *, ...);
-int test_assert_file_exists(const char *, ...);
-int test_assert_file_not_exists(const char *, ...);
-
-/* Like sprintf, then system() */
-int systemf(const char * fmt, ...);
-
-/* Suck file into string allocated via malloc(). Call free() when done. */
-/* Supports printf-style args: slurpfile(NULL, "%s/myfile", refdir); */
-char *slurpfile(size_t *, const char *fmt, ...);
-
-/* Extracts named reference file to the current directory. */
-void extract_reference_file(const char *);
-
-/*
- * Special interfaces for program test harness.
- */
-
-/* Pathname of exe to be tested. */
-char *testprog;
diff --git a/usr.bin/tar/test/test_0.c b/usr.bin/tar/test/test_0.c
deleted file mode 100644
index 7a72af1..0000000
--- a/usr.bin/tar/test/test_0.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/*
- * This first test does basic sanity checks on the environment. For
- * most of these, we just exit on failure.
- */
-
-DEFINE_TEST(test_0)
-{
- struct stat st;
-
- failure("File %s does not exist?!", testprog);
- if (!assertEqualInt(0, stat(testprog, &st)))
- exit(1);
-
- failure("%s is not executable?!", testprog);
- if (!assert((st.st_mode & 0111) != 0))
- exit(1);
-
- /*
- * Try to succesfully run the program; this requires that
- * we know some option that will succeed.
- */
- if (0 == systemf("%s --version >/dev/null", testprog)) {
- /* This worked. */
- } else if (0 == systemf("%s -W version >/dev/null", testprog)) {
- /* This worked. */
- } else {
- failure("Unable to successfully run any of the following:\n"
- " * %s --version\n"
- " * %s -W version\n",
- testprog, testprog);
- assert(0);
- }
-
- /* TODO: Ensure that our reference files are available. */
-}
diff --git a/usr.bin/tar/test/test_basic.c b/usr.bin/tar/test/test_basic.c
deleted file mode 100644
index 50be289..0000000
--- a/usr.bin/tar/test/test_basic.c
+++ /dev/null
@@ -1,158 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-
-static void
-basic_tar(const char *target, const char *pack_options, const char *unpack_options)
-{
- struct stat st, st2;
- char buff[128];
- int r;
-
- assertEqualInt(0, mkdir(target, 0775));
-
- /* Use the tar program to create an archive. */
- r = systemf("%s cf - %s `cat filelist` >%s/archive 2>%s/pack.err", testprog, pack_options, target, target);
- failure("Error invoking %s cf -", testprog, pack_options);
- assertEqualInt(r, 0);
-
- chdir(target);
-
- /* Verify that nothing went to stderr. */
- assertEmptyFile("pack.err");
-
- /*
- * Use tar to unpack the archive into another directory.
- */
- r = systemf("%s xf archive %s >unpack.out 2>unpack.err", testprog, unpack_options);
- failure("Error invoking %s xf archive %s", testprog, unpack_options);
- assertEqualInt(r, 0);
-
- /* Verify that nothing went to stderr. */
- assertEmptyFile("unpack.err");
-
- /*
- * Verify unpacked files.
- */
-
- /* Regular file with 2 links. */
- r = lstat("file", &st);
- failure("Failed to stat file %s/file, errno=%d", target, errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- assert(S_ISREG(st.st_mode));
- assertEqualInt(0644, st.st_mode & 0777);
- assertEqualInt(10, st.st_size);
- failure("file %s/file", target);
- assertEqualInt(2, st.st_nlink);
- }
-
- /* Another name for the same file. */
- r = lstat("linkfile", &st2);
- failure("Failed to stat file %s/linkfile, errno=%d", target, errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- assert(S_ISREG(st2.st_mode));
- assertEqualInt(0644, st2.st_mode & 0777);
- assertEqualInt(10, st2.st_size);
- failure("file %s/linkfile", target);
- assertEqualInt(2, st2.st_nlink);
- /* Verify that the two are really hardlinked. */
- assertEqualInt(st.st_dev, st2.st_dev);
- failure("%s/linkfile and %s/file aren't really hardlinks", target, target);
- assertEqualInt(st.st_ino, st2.st_ino);
- }
-
- /* Symlink */
- r = lstat("symlink", &st);
- failure("Failed to stat file %s/symlink, errno=%d", target, errno);
- assertEqualInt(r, 0);
- if (r == 0) {
- failure("symlink should be a symlink; actual mode is %o",
- st.st_mode);
- assert(S_ISLNK(st.st_mode));
- if (S_ISLNK(st.st_mode)) {
- r = readlink("symlink", buff, sizeof(buff));
- assertEqualInt(r, 4);
- buff[r] = '\0';
- assertEqualString(buff, "file");
- }
- }
-
- /* dir */
- r = lstat("dir", &st);
- if (r == 0) {
- assertEqualInt(r, 0);
- assert(S_ISDIR(st.st_mode));
- assertEqualInt(0775, st.st_mode & 0777);
- }
-
- chdir("..");
-}
-
-DEFINE_TEST(test_basic)
-{
- int fd;
- int filelist;
- int oldumask;
-
- oldumask = umask(0);
-
- /*
- * Create an assortment of files on disk.
- */
- filelist = open("filelist", O_CREAT | O_WRONLY, 0644);
-
- /* File with 10 bytes content. */
- fd = open("file", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(10, write(fd, "123456789", 10));
- close(fd);
- write(filelist, "file\n", 5);
-
- /* hardlink to above file. */
- assertEqualInt(0, link("file", "linkfile"));
- write(filelist, "linkfile\n", 9);
-
- /* Symlink to above file. */
- assertEqualInt(0, symlink("file", "symlink"));
- write(filelist, "symlink\n", 8);
-
- /* Directory. */
- assertEqualInt(0, mkdir("dir", 0775));
- write(filelist, "dir\n", 4);
- /* All done. */
- close(filelist);
-
- /* Archive/dearchive with a variety of options. */
- basic_tar("copy", "", "");
- /* tar doesn't handle cpio symlinks correctly */
- /* basic_tar("copy_odc", "--format=odc", ""); */
- basic_tar("copy_ustar", "--format=ustar", "");
-
- umask(oldumask);
-}
diff --git a/usr.bin/tar/test/test_copy.c b/usr.bin/tar/test/test_copy.c
deleted file mode 100644
index 6618a0e..0000000
--- a/usr.bin/tar/test/test_copy.c
+++ /dev/null
@@ -1,329 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-static void
-create_tree(void)
-{
- char buff[260];
- char buff2[260];
- int i;
- int fd;
-
- assertEqualInt(0, mkdir("original", 0775));
- chdir("original");
- assertEqualInt(0, mkdir("f", 0775));
- assertEqualInt(0, mkdir("l", 0775));
- assertEqualInt(0, mkdir("m", 0775));
- assertEqualInt(0, mkdir("s", 0775));
- assertEqualInt(0, mkdir("d", 0775));
-
- for (i = 0; i < 200; i++) {
- buff[0] = 'f';
- buff[1] = '/';
- /* Create a file named "f/abcdef..." */
- buff[i + 2] = 'a' + (i % 26);
- buff[i + 3] = '\0';
- fd = open(buff, O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(i + 3, write(fd, buff, strlen(buff)));
- close(fd);
-
- /* Create a link named "l/abcdef..." to the above. */
- strcpy(buff2, buff);
- buff2[0] = 'l';
- assertEqualInt(0, link(buff, buff2));
-
- /* Create a link named "m/abcdef..." to the above. */
- strcpy(buff2, buff);
- buff2[0] = 'm';
- assertEqualInt(0, link(buff, buff2));
-
- /* Create a symlink named "s/abcdef..." to the above. */
- strcpy(buff2 + 3, buff);
- buff[0] = 's';
- buff2[0] = '.';
- buff2[1] = '.';
- buff2[2] = '/';
- assertEqualInt(0, symlink(buff2, buff));
-
- /* Create a dir named "d/abcdef...". */
- buff[0] = 'd';
- assertEqualInt(0, mkdir(buff, 0775));
- }
-
- chdir("..");
-}
-
-#define LIMIT_NONE 0
-#define LIMIT_USTAR 1
-
-static void
-verify_tree(int limit)
-{
- struct stat st, st2;
- char filename[260];
- char name1[260];
- char name2[260];
- char contents[260];
- int i, j, r;
- int fd;
- int len;
- const char *p, *dp;
- DIR *d;
- struct dirent *de;
-
- /* Generate the names we know should be there and verify them. */
- for (i = 1; i < 200; i++) {
- /* Generate a base name of the correct length. */
- for (j = 0; j < i; ++j)
- filename[j] = 'a' + (j % 26);
-#if 0
- for (n = i; n > 0; n /= 10)
- filename[--j] = '0' + (n % 10);
-#endif
- filename[i] = '\0';
-
- /* Verify a file named "f/abcdef..." */
- strcpy(name1, "f/");
- strcat(name1, filename);
- if (limit != LIMIT_USTAR || strlen(filename) <= 100) {
- fd = open(name1, O_RDONLY);
- failure("Couldn't open \"%s\": %s",
- name1, strerror(errno));
- if (assert(fd >= 0)) {
- len = read(fd, contents, i + 10);
- close(fd);
- assertEqualInt(len, i + 2);
- /* Verify contents of 'contents' */
- contents[len] = '\0';
- failure("Each test file contains its own name");
- assertEqualString(name1, contents);
- /* stat() for dev/ino for next check */
- assertEqualInt(0, lstat(name1, &st));
- }
- }
-
- /*
- * ustar allows 100 chars for links, and we have
- * "original/" as part of the name, so the link
- * names here can't exceed 91 chars.
- */
- strcpy(name2, "l/");
- strcat(name2, filename);
- if (limit != LIMIT_USTAR || strlen(name2) <= 100) {
- /* Verify hardlink "l/abcdef..." */
- assertEqualInt(0, (r = lstat(name2, &st2)));
- if (r == 0) {
- assertEqualInt(st2.st_dev, st.st_dev);
- assertEqualInt(st2.st_ino, st.st_ino);
- }
-
- /* Verify hardlink "m_abcdef..." */
- name2[0] = 'm';
- assertEqualInt(0, (r = lstat(name2, &st2)));
- if (r == 0) {
- assertEqualInt(st2.st_dev, st.st_dev);
- assertEqualInt(st2.st_ino, st.st_ino);
- }
- }
-
- /*
- * Symlink text doesn't include the 'original/' prefix,
- * so the limit here is 100 characters.
- */
- /* Verify symlink "s/abcdef..." */
- strcpy(name2, "../s/");
- strcat(name2, filename);
- if (limit != LIMIT_USTAR || strlen(name2) <= 100) {
- /* This is a symlink. */
- failure("Couldn't stat %s (length %d)",
- filename, strlen(filename));
- if (assertEqualInt(0, lstat(name2 + 3, &st2))) {
- assert(S_ISLNK(st2.st_mode));
- /* This is a symlink to the file above. */
- failure("Couldn't stat %s", name2 + 3);
- if (assertEqualInt(0, stat(name2 + 3, &st2))) {
- assertEqualInt(st2.st_dev, st.st_dev);
- assertEqualInt(st2.st_ino, st.st_ino);
- }
- }
- }
-
- /* Verify dir "d/abcdef...". */
- strcpy(name1, "d/");
- strcat(name1, filename);
- if (limit != LIMIT_USTAR || strlen(filename) < 100) {
- /* This is a dir. */
- failure("Couldn't stat %s (length %d)",
- name1, strlen(filename));
- if (assertEqualInt(0, lstat(name1, &st2))) {
- if (assert(S_ISDIR(st2.st_mode))) {
- /* TODO: opendir/readdir this
- * directory and make sure
- * it's empty.
- */
- }
- }
- }
- }
-
- /* Now make sure nothing is there that shouldn't be. */
- for (dp = "dflms"; *dp != '\0'; ++dp) {
- char dir[2];
- dir[0] = *dp; dir[1] = '\0';
- d = opendir(dir);
- failure("Unable to open dir '%s'", dir);
- if (!assert(d != NULL))
- continue;
- while ((de = readdir(d)) != NULL) {
- p = de->d_name;
- switch(dp[0]) {
- case 'l': case 'm':
- if (limit == LIMIT_USTAR) {
- failure("strlen(p) = %d", strlen(p));
- assert(strlen(p) <= 100);
- }
- case 'd':
- if (limit == LIMIT_USTAR) {
- failure("strlen(p)=%d", strlen(p));
- assert(strlen(p) < 100);
- }
- case 'f': case 's':
- if (limit == LIMIT_USTAR) {
- failure("strlen(p)=%d", strlen(p));
- assert(strlen(p) < 101);
- }
- /* Our files have very particular filename patterns. */
- if (p[0] != '.' || (p[1] != '.' && p[1] != '\0')) {
- for (i = 0; p[i] != '\0' && i < 200; i++) {
- failure("i=%d, p[i]='%c' 'a'+(i%%26)='%c'", i, p[i], 'a' + (i % 26));
- assertEqualInt(p[i], 'a' + (i % 26));
- }
- assert(p[i] == '\0');
- }
- break;
- case '.':
- assert(p[1] == '\0' || (p[1] == '.' && p[2] == '\0'));
- break;
- default:
- failure("File %s shouldn't be here", p);
- assert(0);
- }
- }
- closedir(d);
- }
-}
-
-static void
-copy_basic(void)
-{
- int r;
-
- assertEqualInt(0, mkdir("plain", 0775));
- assertEqualInt(0, chdir("plain"));
-
- /*
- * Use the tar program to create an archive.
- */
- r = systemf("%s cf archive -C ../original f d l m s >pack.out 2>pack.err",
- testprog);
- failure("Error invoking \"%s cf\"", testprog);
- assertEqualInt(r, 0);
-
- /* Verify that nothing went to stdout or stderr. */
- assertEmptyFile("pack.err");
- assertEmptyFile("pack.out");
-
- /*
- * Use tar to unpack the archive into another directory.
- */
- r = systemf("%s xf archive >unpack.out 2>unpack.err", testprog);
- failure("Error invoking %s xf archive", testprog);
- assertEqualInt(r, 0);
-
- /* Verify that nothing went to stdout or stderr. */
- assertEmptyFile("unpack.err");
- assertEmptyFile("unpack.out");
-
- verify_tree(LIMIT_NONE);
- assertEqualInt(0, chdir(".."));
-}
-
-static void
-copy_ustar(void)
-{
- const char *target = "ustar";
- int r;
-
- assertEqualInt(0, mkdir(target, 0775));
- assertEqualInt(0, chdir(target));
-
- /*
- * Use the tar program to create an archive.
- */
- r = systemf("%s cf archive --format=ustar -C ../original f d l m s >pack.out 2>pack.err",
- testprog);
- failure("Error invoking \"%s cf archive --format=ustar\"", testprog);
- assertEqualInt(r, 0);
-
- /* Verify that nothing went to stdout. */
- assertEmptyFile("pack.out");
- /* Stderr is non-empty, since there are a bunch of files
- * with filenames too long to archive. */
-
- /*
- * Use tar to unpack the archive into another directory.
- */
- r = systemf("%s xf archive >unpack.out 2>unpack.err", testprog);
- failure("Error invoking %s xf archive", testprog);
- assertEqualInt(r, 0);
-
- /* Verify that nothing went to stdout or stderr. */
- assertEmptyFile("unpack.err");
- assertEmptyFile("unpack.out");
-
- chdir("original");
- verify_tree(LIMIT_USTAR);
- chdir("../..");
-}
-
-DEFINE_TEST(test_copy)
-{
- int oldumask;
-
- oldumask = umask(0);
-
- create_tree(); /* Create sample files in "original" dir. */
-
- /* Test simple "tar -c | tar -x" pipeline copy. */
- copy_basic();
-
- /* Same, but constrain to ustar format. */
- copy_ustar();
-
- umask(oldumask);
-}
diff --git a/usr.bin/tar/test/test_getdate.c b/usr.bin/tar/test/test_getdate.c
deleted file mode 100644
index 7ed447b..0000000
--- a/usr.bin/tar/test/test_getdate.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/*
- * Verify that the getdate() function works.
- */
-
-time_t get_date(const char *);
-
-DEFINE_TEST(test_getdate)
-{
- assertEqualInt(0, get_date("Jan 1, 1970 UTC"));
- /* TODO: Lots more tests here. */
-}
diff --git a/usr.bin/tar/test/test_help.c b/usr.bin/tar/test/test_help.c
deleted file mode 100644
index c547dbc..0000000
--- a/usr.bin/tar/test/test_help.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/*
- * Test that "--help", "-h", and "-W help" options all work and
- * generate reasonable output.
- */
-
-static int
-in_first_line(const char *p, const char *substring)
-{
- size_t l = strlen(substring);
-
- while (*p != '\0' && *p != '\n') {
- if (memcmp(p, substring, l) == 0)
- return (1);
- ++p;
- }
- return (0);
-}
-
-DEFINE_TEST(test_help)
-{
- int r;
- char *p;
- size_t plen;
-
- /* Exercise --help option. */
- r = systemf("%s --help >help.stdout 2>help.stderr", testprog);
- failure("--help should generate nothing to stderr.");
- assertEmptyFile("help.stderr");
- /* Help message should start with name of program. */
- p = slurpfile(&plen, "help.stdout");
- failure("Help output should be long enough.");
- assert(plen >= 6);
- failure("First line of help output should contain 'bsdtar': %s", p);
- assert(in_first_line(p, "bsdtar"));
- /*
- * TODO: Extend this check to further verify that --help output
- * looks approximately right.
- */
- free(p);
-
- /* -h option should generate the same output. */
- r = systemf("%s -h >h.stdout 2>h.stderr", testprog);
- failure("-h should generate nothing to stderr.");
- assertEmptyFile("h.stderr");
- failure("stdout should be same for -h and --help");
- assertEqualFile("h.stdout", "help.stdout");
-
- /* -W help should be another synonym. */
- r = systemf("%s -W help >Whelp.stdout 2>Whelp.stderr", testprog);
- failure("-W help should generate nothing to stderr.");
- assertEmptyFile("Whelp.stderr");
- failure("stdout should be same for -W help and --help");
- assertEqualFile("Whelp.stdout", "help.stdout");
-}
diff --git a/usr.bin/tar/test/test_option_T.c b/usr.bin/tar/test/test_option_T.c
deleted file mode 100644
index 943182b..0000000
--- a/usr.bin/tar/test/test_option_T.c
+++ /dev/null
@@ -1,145 +0,0 @@
-/*-
- * Copyright (c) 2003-2008 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-static int
-touch(const char *fn)
-{
- int fd = open(fn, O_RDWR | O_CREAT);
- failure("Couldn't create file '%s', fd=%d, errno=%d (%s)\n",
- fn, fd, errno, strerror(errno));
- if (!assert(fd > 0))
- return (0); /* Failure. */
- close(fd);
- return (1); /* Success */
-}
-
-DEFINE_TEST(test_option_T)
-{
- FILE *f;
- int r;
-
- /* Create a simple dir heirarchy; bail if anything fails. */
- if (!assertEqualInt(0, mkdir("d1", 0755))) return;
- if (!assertEqualInt(0, mkdir("d1/d2", 0755))) return;
- if (!touch("d1/f1")) return;
- if (!touch("d1/f2")) return;
- if (!touch("d1/d2/f3")) return;
- if (!touch("d1/d2/f4")) return;
- if (!touch("d1/d2/f5")) return;
-
- /* Populate a file list */
- f = fopen("filelist", "w+");
- if (!assert(f != NULL))
- return;
- fprintf(f, "d1/f1\n");
- fprintf(f, "d1/d2/f4\n");
- fclose(f);
-
- /* Populate a second file list */
- f = fopen("filelist2", "w+");
- if (!assert(f != NULL))
- return;
- fprintf(f, "d1/d2/f3\n");
- fprintf(f, "d1/d2/f5\n");
- fclose(f);
-
- /* Use -c -T to archive up the files. */
- r = systemf("%s -c -f test1.tar -T filelist > test1.out 2> test1.err",
- testprog);
- failure("Failure here probably means that tar can't archive zero-length files without reading them");
- assert(r == 0);
- assertEmptyFile("test1.out");
- assertEmptyFile("test1.err");
-
- /* Use -x -T to dearchive the files */
- if (!assertEqualInt(0, mkdir("test1", 0755))) return;
- systemf("%s -x -f test1.tar -T filelist -C test1"
- " > test1b.out 2> test1b.err", testprog);
- assertEmptyFile("test1b.out");
- assertEmptyFile("test1b.err");
-
- /* Verify the files were extracted. */
- assertFileExists("test1/d1/f1");
- assertFileNotExists("test1/d1/f2");
- assertFileNotExists("test1/d1/d2/f3");
- assertFileExists("test1/d1/d2/f4");
- assertFileNotExists("test1/d1/d2/f5");
-
- /* Use -r -T to add more files to the archive. */
- systemf("%s -r -f test1.tar -T filelist2 > test2.out 2> test2.err",
- testprog);
- assertEmptyFile("test2.out");
- assertEmptyFile("test2.err");
-
- /* Use -x without -T to dearchive the files (ensure -r worked) */
- if (!assertEqualInt(0, mkdir("test3", 0755))) return;
- systemf("%s -x -f test1.tar -C test3"
- " > test3.out 2> test3.err", testprog);
- assertEmptyFile("test3.out");
- assertEmptyFile("test3.err");
- /* Verify the files were extracted.*/
- assertFileExists("test3/d1/f1");
- assertFileNotExists("test3/d1/f2");
- assertFileExists("test3/d1/d2/f3");
- assertFileExists("test3/d1/d2/f4");
- assertFileExists("test3/d1/d2/f5");
-
- /* Use -x -T to dearchive the files (verify -x -T together) */
- if (!assertEqualInt(0, mkdir("test2", 0755))) return;
- systemf("%s -x -f test1.tar -T filelist -C test2"
- " > test2b.out 2> test2b.err", testprog);
- assertEmptyFile("test2b.out");
- assertEmptyFile("test2b.err");
- /* Verify the files were extracted.*/
- assertFileExists("test2/d1/f1");
- assertFileNotExists("test2/d1/f2");
- assertFileNotExists("test2/d1/d2/f3");
- assertFileExists("test2/d1/d2/f4");
- assertFileNotExists("test2/d1/d2/f5");
-
- assertEqualInt(0, mkdir("test4", 0755));
- assertEqualInt(0, mkdir("test4_out", 0755));
- assertEqualInt(0, mkdir("test4_out2", 0755));
- assertEqualInt(0, mkdir("test4/d1", 0755));
- assertEqualInt(1, touch("test4/d1/foo"));
-
- systemf("%s -cf - -s /foo/bar/ test4/d1/foo | %s -xf - -C test4_out",
- testprog, testprog);
- assertEmptyFile("test4_out/test4/d1/bar");
- systemf("%s -cf - -s /d1/d2/ test4/d1/foo | %s -xf - -C test4_out",
- testprog, testprog);
- assertEmptyFile("test4_out/test4/d2/foo");
- systemf("%s -cf - -s ,test4/d1/foo,, test4/d1/foo | %s -tvf - > test4.lst",
- testprog, testprog);
- assertEmptyFile("test4.lst");
- systemf("%s -cf - test4/d1/foo | %s -xf - -s /foo/bar/ -C test4_out2",
- testprog, testprog);
- assertEmptyFile("test4_out2/test4/d1/bar");
-
- /* TODO: Include some use of -C directory-changing within the filelist. */
- /* I'm pretty sure -C within the filelist is broken on extract. */
-}
diff --git a/usr.bin/tar/test/test_option_q.c b/usr.bin/tar/test/test_option_q.c
deleted file mode 100644
index 1d92dd5..0000000
--- a/usr.bin/tar/test/test_option_q.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-DEFINE_TEST(test_option_q)
-{
- int fd;
-
- /*
- * Create an archive with several different versions of the
- * same files. By default, the last version will overwrite
- * any earlier versions. The -q/--fast-read option will
- * stop early, so we can verify -q/--fast-read by seeing
- * which version of each file actually ended up being
- * extracted. This also exercises -r mode, since that's
- * what we use to build up the test archive.
- */
-
- fd = open("foo", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(4, write(fd, "foo1", 4));
- close(fd);
-
- assertEqualInt(0, systemf("%s -cf archive.tar foo", testprog));
-
- fd = open("foo", O_TRUNC | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(4, write(fd, "foo2", 4));
- close(fd);
-
- assertEqualInt(0, systemf("%s -rf archive.tar foo", testprog));
-
- fd = open("bar", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(4, write(fd, "bar1", 4));
- close(fd);
-
- assertEqualInt(0, systemf("%s -rf archive.tar bar", testprog));
-
- fd = open("foo", O_TRUNC | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(4, write(fd, "foo3", 4));
- close(fd);
-
- assertEqualInt(0, systemf("%s -rf archive.tar foo", testprog));
-
- fd = open("bar", O_TRUNC | O_WRONLY, 0644);
- assert(fd >= 0);
- assertEqualInt(4, write(fd, "bar2", 4));
- close(fd);
-
- assertEqualInt(0, systemf("%s -rf archive.tar bar", testprog));
-
- /*
- * Now, try extracting from the test archive with various
- * combinations of -q.
- */
-
- /* Test 1: -q foo should only extract the first foo. */
- assertEqualInt(0, mkdir("test1", 0755));
- assertEqualInt(0, chdir("test1"));
- assertEqualInt(0,
- systemf("%s -xf ../archive.tar -q foo >test.out 2>test.err",
- testprog));
- assertFileContents("foo1", 4, "foo");
- assertEmptyFile("test.out");
- assertEmptyFile("test.err");
- assertEqualInt(0, chdir(".."));
-
- /* Test 2: -q foo bar should extract up to the first bar. */
- assertEqualInt(0, mkdir("test2", 0755));
- assertEqualInt(0, chdir("test2"));
- assertEqualInt(0,
- systemf("%s -xf ../archive.tar -q foo bar >test.out 2>test.err", testprog));
- assertFileContents("foo2", 4, "foo");
- assertFileContents("bar1", 4, "bar");
- assertEmptyFile("test.out");
- assertEmptyFile("test.err");
- assertEqualInt(0, chdir(".."));
-
- /* Test 3: Same as test 2, but use --fast-read spelling. */
- assertEqualInt(0, mkdir("test3", 0755));
- assertEqualInt(0, chdir("test3"));
- assertEqualInt(0,
- systemf("%s -xf ../archive.tar --fast-read foo bar >test.out 2>test.err", testprog));
- assertFileContents("foo2", 4, "foo");
- assertFileContents("bar1", 4, "bar");
- assertEmptyFile("test.out");
- assertEmptyFile("test.err");
- assertEqualInt(0, chdir(".."));
-
- /* Test 4: Without -q, should extract everything. */
- assertEqualInt(0, mkdir("test4", 0755));
- assertEqualInt(0, chdir("test4"));
- assertEqualInt(0,
- systemf("%s -xf ../archive.tar foo bar >test.out 2>test.err", testprog));
- assertFileContents("foo3", 4, "foo");
- assertFileContents("bar2", 4, "bar");
- assertEmptyFile("test.out");
- assertEmptyFile("test.err");
- assertEqualInt(0, chdir(".."));
-}
diff --git a/usr.bin/tar/test/test_patterns.c b/usr.bin/tar/test/test_patterns.c
deleted file mode 100644
index 281133a..0000000
--- a/usr.bin/tar/test/test_patterns.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-DEFINE_TEST(test_patterns)
-{
- int fd, r;
- const char *reffile2 = "test_patterns_2.tgz";
- const char *reffile3 = "test_patterns_3.tgz";
- const char *p;
-
- /*
- * Test basic command-line pattern handling.
- */
-
- /*
- * Test 1: Files on the command line that don't get matched
- * didn't produce an error.
- *
- * John Baldwin reported this problem in PR bin/121598
- */
- fd = open("foo", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- close(fd);
- r = systemf("%s zcfv tar1.tgz foo > tar1a.out 2> tar1a.err", testprog);
- assertEqualInt(r, 0);
- r = systemf("%s zxfv tar1.tgz foo bar > tar1b.out 2> tar1b.err", testprog);
- failure("tar should return non-zero because a file was given on the command line that's not in the archive");
- assert(r != 0);
-
- /*
- * Test 2: Check basic matching of full paths that start with /
- */
- extract_reference_file(reffile2);
-
- r = systemf("%s tf %s /tmp/foo/bar > tar2a.out 2> tar2a.err",
- testprog, reffile2);
- assertEqualInt(r, 0);
- p = "/tmp/foo/bar/\n/tmp/foo/bar/baz\n";
- assertFileContents(p, strlen(p), "tar2a.out");
- assertEmptyFile("tar2a.err");
-
- /*
- * Test 3 archive has some entries starting with '/' and some not.
- */
- extract_reference_file(reffile3);
-
- /* Test 3a: Pattern tmp/foo/bar should not match /tmp/foo/bar */
- r = systemf("%s xf %s tmp/foo/bar > tar3a.out 2> tar3a.err",
- testprog, reffile3);
- assert(r != 0);
- assertEmptyFile("tar3a.out");
-
- /* Test 3b: Pattern /tmp/foo/baz should not match tmp/foo/baz */
- assertNonEmptyFile("tar3a.err");
- /* Again, with the '/' */
- r = systemf("%s xf %s /tmp/foo/baz > tar3b.out 2> tar3b.err",
- testprog, reffile3);
- assert(r != 0);
- assertEmptyFile("tar3b.out");
- assertNonEmptyFile("tar3b.err");
-
- /* Test 3c: ./tmp/foo/bar should not match /tmp/foo/bar */
- r = systemf("%s xf %s ./tmp/foo/bar > tar3c.out 2> tar3c.err",
- testprog, reffile3);
- assert(r != 0);
- assertEmptyFile("tar3c.out");
- assertNonEmptyFile("tar3c.err");
-
- /* Test 3d: ./tmp/foo/baz should match tmp/foo/baz */
- r = systemf("%s xf %s ./tmp/foo/baz > tar3d.out 2> tar3d.err",
- testprog, reffile3);
- assertEqualInt(r, 0);
- assertEmptyFile("tar3d.out");
- assertEmptyFile("tar3d.err");
- assertEqualInt(0, access("tmp/foo/baz/bar", F_OK));
-}
diff --git a/usr.bin/tar/test/test_patterns_2.tgz.uu b/usr.bin/tar/test/test_patterns_2.tgz.uu
deleted file mode 100644
index 0f9c715..0000000
--- a/usr.bin/tar/test/test_patterns_2.tgz.uu
+++ /dev/null
@@ -1,9 +0,0 @@
-$FreeBSD$
-begin 644 test_patterns_2.tgz
-M'XL(`,P5I4@``^W3T0J",!3&<1]E;[!SYC:?Q\`H2`PS@IZ^F5AV(PFMJ__O
-MYB@;>.:W8X?V;/==9XM\1*0*P:2J59"QCN8ZO:A*4*<NAFA$G?=:F)"QIY?K
-M9:C[U,IP;%?WW0Y-<UI9_SR4^6F/&=DY_UW=Y[H#V_(O4_ZE$T?^_[#(_Y[K
-M&^E_1.^WS'^9'@HCN1I:(O_W_&>Z`]OR?\Y_C!7Y`P``````````````?.,!
-(*>E$>P`H````
-`
-end
diff --git a/usr.bin/tar/test/test_patterns_3.tgz.uu b/usr.bin/tar/test/test_patterns_3.tgz.uu
deleted file mode 100644
index f85afc0..0000000
--- a/usr.bin/tar/test/test_patterns_3.tgz.uu
+++ /dev/null
@@ -1,8 +0,0 @@
-$FreeBSD$
-begin 644 test_patterns_3.tgz
-M'XL(`)P/K4@``^W5T0K"(!3&\3V*;^#1H3Z/@T5!8[&,H*=O%J/M9M3(7?U_
-M-T?1BR.?HD[=11_Z7C=QT%49(A*<4V,UP4FNV53?$V/$U3;OLTK,./*5<H7Z
-M6;A=4QS&5M*I6]UW/[;M>65]>2CUUQX+TO/\F_@H<0<VY!^\)?\]?.(O$OW+
-K3_E[R?F;FO>_BWG^I;Z`#?D'X?T#``````````````!\Y0FE&!YR`"@`````
-`
-end
diff --git a/usr.bin/tar/test/test_stdio.c b/usr.bin/tar/test/test_stdio.c
deleted file mode 100644
index 2d24ae3..0000000
--- a/usr.bin/tar/test/test_stdio.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-DEFINE_TEST(test_stdio)
-{
- int fd;
- int filelist;
- int oldumask;
- int r;
-
- oldumask = umask(0);
-
- /*
- * Create a couple of files on disk.
- */
- filelist = open("filelist", O_CREAT | O_WRONLY, 0644);
- /* File */
- fd = open("f", O_CREAT | O_WRONLY, 0644);
- assert(fd >= 0);
- write(fd, "f\n", 2);
- close(fd);
- write(filelist, "f\n", 2);
- /* Link to above file. */
- assertEqualInt(0, link("f", "l"));
- write(filelist, "l\n", 2);
- close(filelist);
-
- /*
- * Archive/dearchive with a variety of options, verifying
- * stdio paths.
- */
-
- /* 'cf' should generate no output unless there's an error. */
- r = systemf("%s cf archive f l >cf.out 2>cf.err", testprog);
- assertEqualInt(r, 0);
- assertEmptyFile("cf.out");
- assertEmptyFile("cf.err");
-
- /* 'cvf' should generate file list on stderr, empty stdout. */
- r = systemf("%s cvf archive f l >cvf.out 2>cvf.err", testprog);
- assertEqualInt(r, 0);
- failure("'cv' writes filenames to stderr, nothing to stdout (SUSv2)\n"
- "Note that GNU tar writes the file list to stdout by default.");
- assertEmptyFile("cvf.out");
- /* TODO: Verify cvf.err has file list in SUSv2-prescribed format. */
-
- /* 'cvf -' should generate file list on stderr, archive on stdout. */
- r = systemf("%s cvf - f l >cvf-.out 2>cvf-.err", testprog);
- assertEqualInt(r, 0);
- failure("cvf - should write archive to stdout");
- /* TODO: Verify cvf-.out has archive. */
- failure("cvf - should write file list to stderr (SUSv2)");
- /* TODO: Verify cvf-.err has verbose file list. */
-
- /* 'tf' should generate file list on stdout, empty stderr. */
- r = systemf("%s tf archive >tf.out 2>tf.err", testprog);
- assertEqualInt(r, 0);
- assertEmptyFile("tf.err");
- failure("'t' mode should write results to stdout");
- /* TODO: Verify tf.out has file list. */
-
- /* 'tvf' should generate file list on stdout, empty stderr. */
- r = systemf("%s tvf archive >tvf.out 2>tvf.err", testprog);
- assertEqualInt(r, 0);
- assertEmptyFile("tvf.err");
- failure("'tv' mode should write results to stdout");
- /* TODO: Verify tvf.out has file list. */
-
- /* 'tvf -' uses stdin, file list on stdout, empty stderr. */
- r = systemf("%s tvf - < archive >tvf-.out 2>tvf-.err", testprog);
- assertEqualInt(r, 0);
- assertEmptyFile("tvf-.err");
- /* TODO: Verify tvf-.out has file list. */
-
- /* Basic 'xf' should generate no output on stdout or stderr. */
- r = systemf("%s xf archive >xf.out 2>xf.err", testprog);
- assertEqualInt(r, 0);
- assertEmptyFile("xf.err");
- assertEmptyFile("xf.out");
-
- /* 'xvf' should generate list on stderr, empty stdout. */
- r = systemf("%s xvf archive >xvf.out 2>xvf.err", testprog);
- assertEqualInt(r, 0);
- assertEmptyFile("xvf.out");
- /* TODO: Verify xvf.err */
-
- /* 'xvOf' should generate list on stderr, file contents on stdout. */
- r = systemf("%s xvOf archive >xvOf.out 2>xvOf.err", testprog);
- assertEqualInt(r, 0);
- /* TODO: Verify xvOf.out */
- /* TODO: Verify xvf.err */
-
- /* 'xvf -' should generate list on stderr, empty stdout. */
- r = systemf("%s xvf - < archive >xvf-.out 2>xvf-.err", testprog);
- assertEqualInt(r, 0);
- assertEmptyFile("xvf-.out");
- /* TODO: Verify xvf-.err */
-
- umask(oldumask);
-}
diff --git a/usr.bin/tar/test/test_symlink_dir.c b/usr.bin/tar/test/test_symlink_dir.c
deleted file mode 100644
index e256c94..0000000
--- a/usr.bin/tar/test/test_symlink_dir.c
+++ /dev/null
@@ -1,172 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/*
- * tar -x -P should follow existing symlinks for dirs, but not other
- * content. Plain tar -x should remove symlinks when they're in the
- * way of a dir extraction.
- */
-
-static int
-mkfile(const char *name, int mode, const char *contents, ssize_t size)
-{
- int fd = open(name, O_CREAT | O_WRONLY, mode);
- if (fd < 0)
- return (-1);
- if (size != write(fd, contents, size)) {
- close(fd);
- return (-1);
- }
- close(fd);
- return (0);
-}
-
-DEFINE_TEST(test_symlink_dir)
-{
- struct stat st, st2;
- int oldumask;
-
- oldumask = umask(0);
-
- assertEqualInt(0, mkdir("source", 0755));
- assertEqualInt(0, mkfile("source/file", 0755, "a", 1));
- assertEqualInt(0, mkfile("source/file2", 0755, "ab", 2));
- assertEqualInt(0, mkdir("source/dir", 0755));
- assertEqualInt(0, mkdir("source/dir/d", 0755));
- assertEqualInt(0, mkfile("source/dir/f", 0755, "abc", 3));
- assertEqualInt(0, mkdir("source/dir2", 0755));
- assertEqualInt(0, mkdir("source/dir2/d2", 0755));
- assertEqualInt(0, mkfile("source/dir2/f2", 0755, "abcd", 4));
- assertEqualInt(0, mkdir("source/dir3", 0755));
- assertEqualInt(0, mkdir("source/dir3/d3", 0755));
- assertEqualInt(0, mkfile("source/dir3/f3", 0755, "abcde", 5));
-
- assertEqualInt(0,
- systemf("%s -cf test.tar -C source dir dir2 dir3 file file2",
- testprog));
-
- /*
- * Extract with -x and without -P.
- */
- assertEqualInt(0, mkdir("dest1", 0755));
- /* "dir" is a symlink to an existing "real_dir" */
- assertEqualInt(0, mkdir("dest1/real_dir", 0755));
- assertEqualInt(0, symlink("real_dir", "dest1/dir"));
- /* "dir2" is a symlink to a non-existing "real_dir2" */
- assertEqualInt(0, symlink("real_dir2", "dest1/dir2"));
- /* "dir3" is a symlink to an existing "non_dir3" */
- assertEqualInt(0, mkfile("dest1/non_dir3", 0755, "abcdef", 6));
- assertEqualInt(0, symlink("non_dir3", "dest1/dir3"));
- /* "file" is a symlink to existing "real_file" */
- assertEqualInt(0, mkfile("dest1/real_file", 0755, "abcdefg", 7));
- assertEqualInt(0, symlink("real_file", "dest1/file"));
- /* "file2" is a symlink to non-existing "real_file2" */
- assertEqualInt(0, symlink("real_file2", "dest1/file2"));
-
- assertEqualInt(0, systemf("%s -xf test.tar -C dest1", testprog));
-
- /* dest1/dir symlink should be removed */
- assertEqualInt(0, lstat("dest1/dir", &st));
- failure("symlink to dir was followed when it shouldn't be");
- assert(S_ISDIR(st.st_mode));
- /* dest1/dir2 symlink should be removed */
- assertEqualInt(0, lstat("dest1/dir2", &st));
- failure("Broken symlink wasn't replaced with dir");
- assert(S_ISDIR(st.st_mode));
- /* dest1/dir3 symlink should be removed */
- assertEqualInt(0, lstat("dest1/dir3", &st));
- failure("Symlink to non-dir wasn't replaced with dir");
- assert(S_ISDIR(st.st_mode));
- /* dest1/file symlink should be removed */
- assertEqualInt(0, lstat("dest1/file", &st));
- failure("Symlink to existing file should be removed");
- assert(S_ISREG(st.st_mode));
- /* dest1/file2 symlink should be removed */
- assertEqualInt(0, lstat("dest1/file2", &st));
- failure("Symlink to non-existing file should be removed");
- assert(S_ISREG(st.st_mode));
-
- /*
- * Extract with both -x and -P
- */
- assertEqualInt(0, mkdir("dest2", 0755));
- /* "dir" is a symlink to existing "real_dir" */
- assertEqualInt(0, mkdir("dest2/real_dir", 0755));
- assertEqualInt(0, symlink("real_dir", "dest2/dir"));
- /* "dir2" is a symlink to a non-existing "real_dir2" */
- assertEqualInt(0, symlink("real_dir2", "dest2/dir2"));
- /* "dir3" is a symlink to an existing "non_dir3" */
- assertEqualInt(0, mkfile("dest2/non_dir3", 0755, "abcdefgh", 8));
- assertEqualInt(0, symlink("non_dir3", "dest2/dir3"));
- /* "file" is a symlink to existing "real_file" */
- assertEqualInt(0, mkfile("dest2/real_file", 0755, "abcdefghi", 9));
- assertEqualInt(0, symlink("real_file", "dest2/file"));
- /* "file2" is a symlink to non-existing "real_file2" */
- assertEqualInt(0, symlink("real_file2", "dest2/file2"));
-
- assertEqualInt(0, systemf("%s -xPf test.tar -C dest2", testprog));
-
- /* dest2/dir symlink should be followed */
- assertEqualInt(0, lstat("dest2/dir", &st));
- failure("tar -xP removed symlink instead of following it");
- if (assert(S_ISLNK(st.st_mode))) {
- /* Only verify what the symlink points to if it
- * really is a symlink. */
- failure("The symlink should point to a directory");
- assertEqualInt(0, stat("dest2/dir", &st));
- assert(S_ISDIR(st.st_mode));
- failure("The pre-existing directory should still be there");
- assertEqualInt(0, lstat("dest2/real_dir", &st2));
- assert(S_ISDIR(st2.st_mode));
- assertEqualInt(st.st_dev, st2.st_dev);
- failure("symlink should still point to the existing directory");
- assertEqualInt(st.st_ino, st2.st_ino);
- }
- /* Contents of 'dir' should be restored */
- assertEqualInt(0, lstat("dest2/dir/d", &st));
- assert(S_ISDIR(st.st_mode));
- assertEqualInt(0, lstat("dest2/dir/f", &st));
- assert(S_ISREG(st.st_mode));
- assertEqualInt(3, st.st_size);
- /* dest2/dir2 symlink should be removed */
- assertEqualInt(0, lstat("dest2/dir2", &st));
- failure("Broken symlink wasn't replaced with dir");
- assert(S_ISDIR(st.st_mode));
- /* dest2/dir3 symlink should be removed */
- assertEqualInt(0, lstat("dest2/dir3", &st));
- failure("Symlink to non-dir wasn't replaced with dir");
- assert(S_ISDIR(st.st_mode));
- /* dest2/file symlink should be removed;
- * even -P shouldn't follow symlinks for files */
- assertEqualInt(0, lstat("dest2/file", &st));
- failure("Symlink to existing file should be removed");
- assert(S_ISREG(st.st_mode));
- /* dest2/file2 symlink should be removed */
- assertEqualInt(0, lstat("dest2/file2", &st));
- failure("Symlink to non-existing file should be removed");
- assert(S_ISREG(st.st_mode));
-}
diff --git a/usr.bin/tar/test/test_version.c b/usr.bin/tar/test/test_version.c
deleted file mode 100644
index 6f2f6a0..0000000
--- a/usr.bin/tar/test/test_version.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "test.h"
-__FBSDID("$FreeBSD$");
-
-/*
- * Test that --version option works and generates reasonable output.
- */
-
-DEFINE_TEST(test_version)
-{
- int r;
- char *p, *q;
- size_t s;
-
-
- r = systemf("%s --version >version.stdout 2>version.stderr", testprog);
- if (r != 0)
- r = systemf("%s -W version >version.stdout 2>version.stderr",
- testprog);
- failure("Unable to run either %s --version or %s -W version",
- testprog, testprog);
- if (!assert(r == 0))
- return;
-
- /* --version should generate nothing to stdout. */
- assertEmptyFile("version.stderr");
- /* Verify format of version message. */
- q = p = slurpfile(&s, "version.stdout");
- /* Version message should start with name of program, then space. */
- assert(s > 6);
- failure("Version: %s", p);
- assertEqualMem(q, "bsdtar ", 7);
- q += 7; s -= 7;
- /* Version number is a series of digits and periods. */
- while (s > 0 && (*q == '.' || (*q >= '0' && *q <= '9'))) {
- ++q;
- --s;
- }
- /* Version number terminated by space. */
- failure("Version: %s", p);
- assert(s > 1);
- /* Skip a single trailing a,b,c, or d. */
- if (*q == 'a' || *q == 'b' || *q == 'c' || *q == 'd')
- ++q;
- failure("Version: %s", p);
- assert(*q == ' ');
- ++q; --s;
- /* Separator. */
- failure("Version: %s", p);
- assertEqualMem(q, "- ", 2);
- q += 2; s -= 2;
- /* libarchive name and version number */
- failure("Version: %s", p);
- assert(s > 11);
- failure("Version: %s", p);
- assertEqualMem(q, "libarchive ", 11);
- q += 11; s -= 11;
- /* Version number is a series of digits and periods. */
- while (s > 0 && (*q == '.' || (*q >= '0' && *q <= '9'))) {
- ++q;
- --s;
- }
- /* Skip a single trailing a,b,c, or d. */
- if (*q == 'a' || *q == 'b' || *q == 'c' || *q == 'd')
- ++q;
- /* All terminated by a newline. */
- assert(s >= 1);
- assertEqualMem(q, "\n", 1);
- free(p);
-}
diff --git a/usr.bin/tar/tree.c b/usr.bin/tar/tree.c
deleted file mode 100644
index 4c9a4bd..0000000
--- a/usr.bin/tar/tree.c
+++ /dev/null
@@ -1,542 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*-
- * This is a new directory-walking system that addresses a number
- * of problems I've had with fts(3). In particular, it has no
- * pathname-length limits (other than the size of 'int'), handles
- * deep logical traversals, uses considerably less memory, and has
- * an opaque interface (easier to modify in the future).
- *
- * Internally, it keeps a single list of "tree_entry" items that
- * represent filesystem objects that require further attention.
- * Non-directories are not kept in memory: they are pulled from
- * readdir(), returned to the client, then freed as soon as possible.
- * Any directory entry to be traversed gets pushed onto the stack.
- *
- * There is surprisingly little information that needs to be kept for
- * each item on the stack. Just the name, depth (represented here as the
- * string length of the parent directory's pathname), and some markers
- * indicating how to get back to the parent (via chdir("..") for a
- * regular dir or via fchdir(2) for a symlink).
- */
-#include "bsdtar_platform.h"
-__FBSDID("$FreeBSD$");
-
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-#ifdef HAVE_DIRENT_H
-#include <dirent.h>
-#endif
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include "tree.h"
-
-/*
- * TODO:
- * 1) Loop checking.
- * 3) Arbitrary logical traversals by closing/reopening intermediate fds.
- */
-
-struct tree_entry {
- struct tree_entry *next;
- struct tree_entry *parent;
- char *name;
- size_t dirname_length;
- dev_t dev;
- ino_t ino;
- int fd;
- int flags;
-};
-
-/* Definitions for tree_entry.flags bitmap. */
-#define isDir 1 /* This entry is a regular directory. */
-#define isDirLink 2 /* This entry is a symbolic link to a directory. */
-#define needsPreVisit 4 /* This entry needs to be previsited. */
-#define needsPostVisit 8 /* This entry needs to be postvisited. */
-
-/*
- * Local data for this package.
- */
-struct tree {
- struct tree_entry *stack;
- struct tree_entry *current;
- DIR *d;
- int initialDirFd;
- int flags;
- int visit_type;
- int tree_errno; /* Error code from last failed operation. */
-
- char *buff;
- const char *basename;
- size_t buff_length;
- size_t path_length;
- size_t dirname_length;
-
- int depth;
- int openCount;
- int maxOpenCount;
-
- struct stat lst;
- struct stat st;
-};
-
-/* Definitions for tree.flags bitmap. */
-#define needsReturn 8 /* Marks first entry as not having been returned yet. */
-#define hasStat 16 /* The st entry is set. */
-#define hasLstat 32 /* The lst entry is set. */
-
-
-#ifdef HAVE_DIRENT_D_NAMLEN
-/* BSD extension; avoids need for a strlen() call. */
-#define D_NAMELEN(dp) (dp)->d_namlen
-#else
-#define D_NAMELEN(dp) (strlen((dp)->d_name))
-#endif
-
-#if 0
-#include <stdio.h>
-void
-tree_dump(struct tree *t, FILE *out)
-{
- struct tree_entry *te;
-
- fprintf(out, "\tdepth: %d\n", t->depth);
- fprintf(out, "\tbuff: %s\n", t->buff);
- fprintf(out, "\tpwd: "); fflush(stdout); system("pwd");
- fprintf(out, "\taccess: %s\n", t->basename);
- fprintf(out, "\tstack:\n");
- for (te = t->stack; te != NULL; te = te->next) {
- fprintf(out, "\t\tte->name: %s%s%s\n", te->name,
- te->flags & needsPreVisit ? "" : " *",
- t->current == te ? " (current)" : "");
- }
-}
-#endif
-
-/*
- * Add a directory path to the current stack.
- */
-static void
-tree_push(struct tree *t, const char *path)
-{
- struct tree_entry *te;
-
- te = malloc(sizeof(*te));
- memset(te, 0, sizeof(*te));
- te->next = t->stack;
- t->stack = te;
- te->fd = -1;
- te->name = strdup(path);
- te->flags = needsPreVisit | needsPostVisit;
- te->dirname_length = t->dirname_length;
-}
-
-/*
- * Append a name to the current path.
- */
-static void
-tree_append(struct tree *t, const char *name, size_t name_length)
-{
- char *p;
-
- if (t->buff != NULL)
- t->buff[t->dirname_length] = '\0';
- /* Strip trailing '/' from name, unless entire name is "/". */
- while (name_length > 1 && name[name_length - 1] == '/')
- name_length--;
-
- /* Resize pathname buffer as needed. */
- while (name_length + 1 + t->dirname_length >= t->buff_length) {
- t->buff_length *= 2;
- if (t->buff_length < 1024)
- t->buff_length = 1024;
- t->buff = realloc(t->buff, t->buff_length);
- }
- p = t->buff + t->dirname_length;
- t->path_length = t->dirname_length + name_length;
- /* Add a separating '/' if it's needed. */
- if (t->dirname_length > 0 && p[-1] != '/') {
- *p++ = '/';
- t->path_length ++;
- }
- strncpy(p, name, name_length);
- p[name_length] = '\0';
- t->basename = p;
-}
-
-/*
- * Open a directory tree for traversal.
- */
-struct tree *
-tree_open(const char *path)
-{
- struct tree *t;
-
- t = malloc(sizeof(*t));
- memset(t, 0, sizeof(*t));
- tree_append(t, path, strlen(path));
- t->initialDirFd = open(".", O_RDONLY);
- /*
- * During most of the traversal, items are set up and then
- * returned immediately from tree_next(). That doesn't work
- * for the very first entry, so we set a flag for this special
- * case.
- */
- t->flags = needsReturn;
- return (t);
-}
-
-/*
- * We've finished a directory; ascend back to the parent.
- */
-static void
-tree_ascend(struct tree *t)
-{
- struct tree_entry *te;
-
- te = t->stack;
- t->depth--;
- if (te->flags & isDirLink) {
- fchdir(te->fd);
- close(te->fd);
- t->openCount--;
- } else {
- chdir("..");
- }
-}
-
-/*
- * Pop the working stack.
- */
-static void
-tree_pop(struct tree *t)
-{
- struct tree_entry *te;
-
- t->buff[t->dirname_length] = '\0';
- if (t->stack == t->current && t->current != NULL)
- t->current = t->current->parent;
- te = t->stack;
- t->stack = te->next;
- t->dirname_length = te->dirname_length;
- t->basename = t->buff + t->dirname_length;
- /* Special case: starting dir doesn't skip leading '/'. */
- if (t->dirname_length > 0)
- t->basename++;
- free(te->name);
- free(te);
-}
-
-/*
- * Get the next item in the tree traversal.
- */
-int
-tree_next(struct tree *t)
-{
- struct dirent *de = NULL;
-
- /* Handle the startup case by returning the initial entry. */
- if (t->flags & needsReturn) {
- t->flags &= ~needsReturn;
- return (t->visit_type = TREE_REGULAR);
- }
-
- while (t->stack != NULL) {
- /* If there's an open dir, get the next entry from there. */
- while (t->d != NULL) {
- de = readdir(t->d);
- if (de == NULL) {
- closedir(t->d);
- t->d = NULL;
- } else if (de->d_name[0] == '.'
- && de->d_name[1] == '\0') {
- /* Skip '.' */
- } else if (de->d_name[0] == '.'
- && de->d_name[1] == '.'
- && de->d_name[2] == '\0') {
- /* Skip '..' */
- } else {
- /*
- * Append the path to the current path
- * and return it.
- */
- tree_append(t, de->d_name, D_NAMELEN(de));
- t->flags &= ~hasLstat;
- t->flags &= ~hasStat;
- return (t->visit_type = TREE_REGULAR);
- }
- }
-
- /* If the current dir needs to be visited, set it up. */
- if (t->stack->flags & needsPreVisit) {
- t->current = t->stack;
- tree_append(t, t->stack->name, strlen(t->stack->name));
- t->stack->flags &= ~needsPreVisit;
- /* If it is a link, set up fd for the ascent. */
- if (t->stack->flags & isDirLink) {
- t->stack->fd = open(".", O_RDONLY);
- t->openCount++;
- if (t->openCount > t->maxOpenCount)
- t->maxOpenCount = t->openCount;
- }
- t->dirname_length = t->path_length;
- if (chdir(t->stack->name) != 0) {
- /* chdir() failed; return error */
- tree_pop(t);
- t->tree_errno = errno;
- return (t->visit_type = TREE_ERROR_DIR);
- }
- t->depth++;
- t->d = opendir(".");
- if (t->d == NULL) {
- tree_ascend(t); /* Undo "chdir" */
- tree_pop(t);
- t->tree_errno = errno;
- return (t->visit_type = TREE_ERROR_DIR);
- }
- t->flags &= ~hasLstat;
- t->flags &= ~hasStat;
- t->basename = ".";
- return (t->visit_type = TREE_POSTDESCENT);
- }
-
- /* We've done everything necessary for the top stack entry. */
- if (t->stack->flags & needsPostVisit) {
- tree_ascend(t);
- tree_pop(t);
- t->flags &= ~hasLstat;
- t->flags &= ~hasStat;
- return (t->visit_type = TREE_POSTASCENT);
- }
- }
- return (t->visit_type = 0);
-}
-
-/*
- * Return error code.
- */
-int
-tree_errno(struct tree *t)
-{
- return (t->tree_errno);
-}
-
-/*
- * Called by the client to mark the directory just returned from
- * tree_next() as needing to be visited.
- */
-void
-tree_descend(struct tree *t)
-{
- if (t->visit_type != TREE_REGULAR)
- return;
-
- if (tree_current_is_physical_dir(t)) {
- tree_push(t, t->basename);
- t->stack->flags |= isDir;
- } else if (tree_current_is_dir(t)) {
- tree_push(t, t->basename);
- t->stack->flags |= isDirLink;
- }
-}
-
-/*
- * Get the stat() data for the entry just returned from tree_next().
- */
-const struct stat *
-tree_current_stat(struct tree *t)
-{
- if (!(t->flags & hasStat)) {
- if (stat(t->basename, &t->st) != 0)
- return NULL;
- t->flags |= hasStat;
- }
- return (&t->st);
-}
-
-/*
- * Get the lstat() data for the entry just returned from tree_next().
- */
-const struct stat *
-tree_current_lstat(struct tree *t)
-{
- if (!(t->flags & hasLstat)) {
- if (lstat(t->basename, &t->lst) != 0)
- return NULL;
- t->flags |= hasLstat;
- }
- return (&t->lst);
-}
-
-/*
- * Test whether current entry is a dir or link to a dir.
- */
-int
-tree_current_is_dir(struct tree *t)
-{
- const struct stat *st;
-
- /*
- * If we already have lstat() info, then try some
- * cheap tests to determine if this is a dir.
- */
- if (t->flags & hasLstat) {
- /* If lstat() says it's a dir, it must be a dir. */
- if (S_ISDIR(tree_current_lstat(t)->st_mode))
- return 1;
- /* Not a dir; might be a link to a dir. */
- /* If it's not a link, then it's not a link to a dir. */
- if (!S_ISLNK(tree_current_lstat(t)->st_mode))
- return 0;
- /*
- * It's a link, but we don't know what it's a link to,
- * so we'll have to use stat().
- */
- }
-
- st = tree_current_stat(t);
- /* If we can't stat it, it's not a dir. */
- if (st == NULL)
- return 0;
- /* Use the definitive test. Hopefully this is cached. */
- return (S_ISDIR(st->st_mode));
-}
-
-/*
- * Test whether current entry is a physical directory. Usually, we
- * already have at least one of stat() or lstat() in memory, so we
- * use tricks to try to avoid an extra trip to the disk.
- */
-int
-tree_current_is_physical_dir(struct tree *t)
-{
- const struct stat *st;
-
- /*
- * If stat() says it isn't a dir, then it's not a dir.
- * If stat() data is cached, this check is free, so do it first.
- */
- if ((t->flags & hasStat)
- && (!S_ISDIR(tree_current_stat(t)->st_mode)))
- return 0;
-
- /*
- * Either stat() said it was a dir (in which case, we have
- * to determine whether it's really a link to a dir) or
- * stat() info wasn't available. So we use lstat(), which
- * hopefully is already cached.
- */
-
- st = tree_current_lstat(t);
- /* If we can't stat it, it's not a dir. */
- if (st == NULL)
- return 0;
- /* Use the definitive test. Hopefully this is cached. */
- return (S_ISDIR(st->st_mode));
-}
-
-/*
- * Test whether current entry is a symbolic link.
- */
-int
-tree_current_is_physical_link(struct tree *t)
-{
- const struct stat *st = tree_current_lstat(t);
- if (st == NULL)
- return 0;
- return (S_ISLNK(st->st_mode));
-}
-
-/*
- * Return the access path for the entry just returned from tree_next().
- */
-const char *
-tree_current_access_path(struct tree *t)
-{
- return (t->basename);
-}
-
-/*
- * Return the full path for the entry just returned from tree_next().
- */
-const char *
-tree_current_path(struct tree *t)
-{
- return (t->buff);
-}
-
-/*
- * Return the length of the path for the entry just returned from tree_next().
- */
-size_t
-tree_current_pathlen(struct tree *t)
-{
- return (t->path_length);
-}
-
-/*
- * Return the nesting depth of the entry just returned from tree_next().
- */
-int
-tree_current_depth(struct tree *t)
-{
- return (t->depth);
-}
-
-/*
- * Terminate the traversal and release any resources.
- */
-void
-tree_close(struct tree *t)
-{
- /* Release anything remaining in the stack. */
- while (t->stack != NULL)
- tree_pop(t);
- if (t->buff)
- free(t->buff);
- /* chdir() back to where we started. */
- if (t->initialDirFd >= 0) {
- fchdir(t->initialDirFd);
- close(t->initialDirFd);
- t->initialDirFd = -1;
- }
- free(t);
-}
diff --git a/usr.bin/tar/tree.h b/usr.bin/tar/tree.h
deleted file mode 100644
index ff38f53..0000000
--- a/usr.bin/tar/tree.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/*-
- * A set of routines for traversing directory trees.
- * Similar in concept to the fts library, but with a few
- * important differences:
- * * Uses less memory. In particular, fts stores an entire directory
- * in memory at a time. This package only keeps enough subdirectory
- * information in memory to track the traversal. Information
- * about non-directories is discarded as soon as possible.
- * * Supports very deep logical traversals. The fts package
- * uses "non-chdir" approach for logical traversals. This
- * package does use a chdir approach for logical traversals
- * and can therefore handle pathnames much longer than
- * PATH_MAX.
- * * Supports deep physical traversals "out of the box."
- * Due to the memory optimizations above, there's no need to
- * limit dir names to 32k.
- */
-
-#include <sys/stat.h>
-#include <stdio.h>
-
-struct tree;
-
-/* Initiate/terminate a tree traversal. */
-struct tree *tree_open(const char * /* pathname */);
-void tree_close(struct tree *);
-
-/*
- * tree_next() returns Zero if there is no next entry, non-zero if there is.
- * Note that directories are potentially visited three times. The first
- * time as "regular" file. If tree_descend() is invoked at that time,
- * the directory is added to a work list and will be visited two more
- * times: once just after descending into the directory and again
- * just after ascending back to the parent.
- *
- * TREE_ERROR is returned if the descent failed (because the
- * directory couldn't be opened, for instance). This is returned
- * instead of TREE_PREVISIT/TREE_POSTVISIT.
- */
-#define TREE_REGULAR 1
-#define TREE_POSTDESCENT 2
-#define TREE_POSTASCENT 3
-#define TREE_ERROR_DIR -1
-int tree_next(struct tree *);
-
-int tree_errno(struct tree *);
-
-/*
- * Request that current entry be visited. If you invoke it on every
- * directory, you'll get a physical traversal. This is ignored if the
- * current entry isn't a directory or a link to a directory. So, if
- * you invoke this on every returned path, you'll get a full logical
- * traversal.
- */
-void tree_descend(struct tree *);
-
-/*
- * Return information about the current entry.
- */
-
-int tree_current_depth(struct tree *);
-/*
- * The current full pathname, length of the full pathname,
- * and a name that can be used to access the file.
- * Because tree does use chdir extensively, the access path is
- * almost never the same as the full current path.
- */
-const char *tree_current_path(struct tree *);
-size_t tree_current_pathlen(struct tree *);
-const char *tree_current_access_path(struct tree *);
-/*
- * Request the lstat() or stat() data for the current path. Since the
- * tree package needs to do some of this anyway, and caches the
- * results, you should take advantage of it here if you need it rather
- * than make a redundant stat() or lstat() call of your own.
- */
-const struct stat *tree_current_stat(struct tree *);
-const struct stat *tree_current_lstat(struct tree *);
-/* The following tests may use mechanisms much faster than stat()/lstat(). */
-/* "is_physical_dir" is equivalent to S_ISDIR(tree_current_lstat()->st_mode) */
-int tree_current_is_physical_dir(struct tree *);
-/* "is_physical_link" is equivalent to S_ISLNK(tree_current_lstat()->st_mode) */
-int tree_current_is_physical_link(struct tree *);
-/* "is_dir" is equivalent to S_ISDIR(tree_current_stat()->st_mode) */
-int tree_current_is_dir(struct tree *);
-
-/* For testing/debugging: Dump the internal status to the given filehandle. */
-void tree_dump(struct tree *, FILE *);
diff --git a/usr.bin/tar/util.c b/usr.bin/tar/util.c
deleted file mode 100644
index 33281aa..0000000
--- a/usr.bin/tar/util.c
+++ /dev/null
@@ -1,489 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "bsdtar_platform.h"
-__FBSDID("$FreeBSD$");
-
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h> /* Linux doesn't define mode_t, etc. in sys/stat.h. */
-#endif
-#include <ctype.h>
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#ifdef HAVE_STDARG_H
-#include <stdarg.h>
-#endif
-#include <stdio.h>
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include "bsdtar.h"
-
-static void bsdtar_vwarnc(struct bsdtar *, int code,
- const char *fmt, va_list ap);
-
-/*
- * Print a string, taking care with any non-printable characters.
- */
-
-void
-safe_fprintf(FILE *f, const char *fmt, ...)
-{
- char *buff;
- char *buff_heap;
- int buff_length;
- int length;
- va_list ap;
- char *p;
- unsigned i;
- char buff_stack[256];
- char copy_buff[256];
-
- /* Use a stack-allocated buffer if we can, for speed and safety. */
- buff_heap = NULL;
- buff_length = sizeof(buff_stack);
- buff = buff_stack;
-
- va_start(ap, fmt);
- length = vsnprintf(buff, buff_length, fmt, ap);
- va_end(ap);
- /* If the result is too large, allocate a buffer on the heap. */
- if (length >= buff_length) {
- buff_length = length+1;
- buff_heap = malloc(buff_length);
- /* Failsafe: use the truncated string if malloc fails. */
- if (buff_heap != NULL) {
- buff = buff_heap;
- va_start(ap, fmt);
- length = vsnprintf(buff, buff_length, fmt, ap);
- va_end(ap);
- }
- }
-
- /* Write data, expanding unprintable characters. */
- p = buff;
- i = 0;
- while (*p != '\0') {
- unsigned char c = *p++;
-
- if (isprint(c) && c != '\\')
- copy_buff[i++] = c;
- else {
- copy_buff[i++] = '\\';
- switch (c) {
- case '\a': copy_buff[i++] = 'a'; break;
- case '\b': copy_buff[i++] = 'b'; break;
- case '\f': copy_buff[i++] = 'f'; break;
- case '\n': copy_buff[i++] = 'n'; break;
-#if '\r' != '\n'
- /* On some platforms, \n and \r are the same. */
- case '\r': copy_buff[i++] = 'r'; break;
-#endif
- case '\t': copy_buff[i++] = 't'; break;
- case '\v': copy_buff[i++] = 'v'; break;
- case '\\': copy_buff[i++] = '\\'; break;
- default:
- sprintf(copy_buff + i, "%03o", c);
- i += 3;
- }
- }
-
- /* If our temp buffer is full, dump it and keep going. */
- if (i > (sizeof(copy_buff) - 8)) {
- copy_buff[i++] = '\0';
- fprintf(f, "%s", copy_buff);
- i = 0;
- }
- }
- copy_buff[i++] = '\0';
- fprintf(f, "%s", copy_buff);
-
- /* If we allocated a heap-based buffer, free it now. */
- if (buff_heap != NULL)
- free(buff_heap);
-}
-
-static void
-bsdtar_vwarnc(struct bsdtar *bsdtar, int code, const char *fmt, va_list ap)
-{
- fprintf(stderr, "%s: ", bsdtar->progname);
- vfprintf(stderr, fmt, ap);
- if (code != 0)
- fprintf(stderr, ": %s", strerror(code));
- fprintf(stderr, "\n");
-}
-
-void
-bsdtar_warnc(struct bsdtar *bsdtar, int code, const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- bsdtar_vwarnc(bsdtar, code, fmt, ap);
- va_end(ap);
-}
-
-void
-bsdtar_errc(struct bsdtar *bsdtar, int eval, int code, const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- bsdtar_vwarnc(bsdtar, code, fmt, ap);
- va_end(ap);
- exit(eval);
-}
-
-int
-yes(const char *fmt, ...)
-{
- char buff[32];
- char *p;
- ssize_t l;
-
- va_list ap;
- va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- va_end(ap);
- fprintf(stderr, " (y/N)? ");
- fflush(stderr);
-
- l = read(2, buff, sizeof(buff) - 1);
- if (l <= 0)
- return (0);
- buff[l] = 0;
-
- for (p = buff; *p != '\0'; p++) {
- if (isspace(0xff & (int)*p))
- continue;
- switch(*p) {
- case 'y': case 'Y':
- return (1);
- case 'n': case 'N':
- return (0);
- default:
- return (0);
- }
- }
-
- return (0);
-}
-
-/*
- * Read lines from file and do something with each one. If option_null
- * is set, lines are terminated with zero bytes; otherwise, they're
- * terminated with newlines.
- *
- * This uses a self-sizing buffer to handle arbitrarily-long lines.
- * If the "process" function returns non-zero for any line, this
- * function will return non-zero after attempting to process all
- * remaining lines.
- */
-int
-process_lines(struct bsdtar *bsdtar, const char *pathname,
- int (*process)(struct bsdtar *, const char *))
-{
- FILE *f;
- char *buff, *buff_end, *line_start, *line_end, *p;
- size_t buff_length, new_buff_length, bytes_read, bytes_wanted;
- int separator;
- int ret;
-
- separator = bsdtar->option_null ? '\0' : '\n';
- ret = 0;
-
- if (strcmp(pathname, "-") == 0)
- f = stdin;
- else
- f = fopen(pathname, "r");
- if (f == NULL)
- bsdtar_errc(bsdtar, 1, errno, "Couldn't open %s", pathname);
- buff_length = 8192;
- buff = malloc(buff_length);
- if (buff == NULL)
- bsdtar_errc(bsdtar, 1, ENOMEM, "Can't read %s", pathname);
- line_start = line_end = buff_end = buff;
- for (;;) {
- /* Get some more data into the buffer. */
- bytes_wanted = buff + buff_length - buff_end;
- bytes_read = fread(buff_end, 1, bytes_wanted, f);
- buff_end += bytes_read;
- /* Process all complete lines in the buffer. */
- while (line_end < buff_end) {
- if (*line_end == separator) {
- *line_end = '\0';
- if ((*process)(bsdtar, line_start) != 0)
- ret = -1;
- line_start = line_end + 1;
- line_end = line_start;
- } else
- line_end++;
- }
- if (feof(f))
- break;
- if (ferror(f))
- bsdtar_errc(bsdtar, 1, errno,
- "Can't read %s", pathname);
- if (line_start > buff) {
- /* Move a leftover fractional line to the beginning. */
- memmove(buff, line_start, buff_end - line_start);
- buff_end -= line_start - buff;
- line_end -= line_start - buff;
- line_start = buff;
- } else {
- /* Line is too big; enlarge the buffer. */
- new_buff_length = buff_length * 2;
- if (new_buff_length <= buff_length)
- bsdtar_errc(bsdtar, 1, ENOMEM,
- "Line too long in %s", pathname);
- buff_length = new_buff_length;
- p = realloc(buff, buff_length);
- if (p == NULL)
- bsdtar_errc(bsdtar, 1, ENOMEM,
- "Line too long in %s", pathname);
- buff_end = p + (buff_end - buff);
- line_end = p + (line_end - buff);
- line_start = buff = p;
- }
- }
- /* At end-of-file, handle the final line. */
- if (line_end > line_start) {
- *line_end = '\0';
- if ((*process)(bsdtar, line_start) != 0)
- ret = -1;
- }
- free(buff);
- if (f != stdin)
- fclose(f);
- return (ret);
-}
-
-/*-
- * The logic here for -C <dir> attempts to avoid
- * chdir() as long as possible. For example:
- * "-C /foo -C /bar file" needs chdir("/bar") but not chdir("/foo")
- * "-C /foo -C bar file" needs chdir("/foo/bar")
- * "-C /foo -C bar /file1" does not need chdir()
- * "-C /foo -C bar /file1 file2" needs chdir("/foo/bar") before file2
- *
- * The only correct way to handle this is to record a "pending" chdir
- * request and combine multiple requests intelligently until we
- * need to process a non-absolute file. set_chdir() adds the new dir
- * to the pending list; do_chdir() actually executes any pending chdir.
- *
- * This way, programs that build tar command lines don't have to worry
- * about -C with non-existent directories; such requests will only
- * fail if the directory must be accessed.
- */
-void
-set_chdir(struct bsdtar *bsdtar, const char *newdir)
-{
- if (newdir[0] == '/') {
- /* The -C /foo -C /bar case; dump first one. */
- free(bsdtar->pending_chdir);
- bsdtar->pending_chdir = NULL;
- }
- if (bsdtar->pending_chdir == NULL)
- /* Easy case: no previously-saved dir. */
- bsdtar->pending_chdir = strdup(newdir);
- else {
- /* The -C /foo -C bar case; concatenate */
- char *old_pending = bsdtar->pending_chdir;
- size_t old_len = strlen(old_pending);
- bsdtar->pending_chdir = malloc(old_len + strlen(newdir) + 2);
- if (old_pending[old_len - 1] == '/')
- old_pending[old_len - 1] = '\0';
- if (bsdtar->pending_chdir != NULL)
- sprintf(bsdtar->pending_chdir, "%s/%s",
- old_pending, newdir);
- free(old_pending);
- }
- if (bsdtar->pending_chdir == NULL)
- bsdtar_errc(bsdtar, 1, errno, "No memory");
-}
-
-void
-do_chdir(struct bsdtar *bsdtar)
-{
- if (bsdtar->pending_chdir == NULL)
- return;
-
- if (chdir(bsdtar->pending_chdir) != 0) {
- bsdtar_errc(bsdtar, 1, 0, "could not chdir to '%s'\n",
- bsdtar->pending_chdir);
- }
- free(bsdtar->pending_chdir);
- bsdtar->pending_chdir = NULL;
-}
-
-/*
- * Handle --strip-components and any future path-rewriting options.
- * Returns non-zero if the pathname should not be extracted.
- *
- * TODO: Support pax-style regex path rewrites.
- */
-int
-edit_pathname(struct bsdtar *bsdtar, struct archive_entry *entry)
-{
- const char *name = archive_entry_pathname(entry);
-#if HAVE_REGEX_H
- char *subst_name;
-#endif
- int r;
-
-#if HAVE_REGEX_H
- r = apply_substitution(bsdtar, name, &subst_name, 0);
- if (r == -1) {
- bsdtar_warnc(bsdtar, 0, "Invalid substituion, skipping entry");
- return 1;
- }
- if (r == 1) {
- archive_entry_copy_pathname(entry, subst_name);
- if (*subst_name == '\0') {
- free(subst_name);
- return -1;
- } else
- free(subst_name);
- name = archive_entry_pathname(entry);
- }
-
- if (archive_entry_hardlink(entry)) {
- r = apply_substitution(bsdtar, archive_entry_hardlink(entry), &subst_name, 1);
- if (r == -1) {
- bsdtar_warnc(bsdtar, 0, "Invalid substituion, skipping entry");
- return 1;
- }
- if (r == 1) {
- archive_entry_copy_hardlink(entry, subst_name);
- free(subst_name);
- }
- }
- if (archive_entry_symlink(entry) != NULL) {
- r = apply_substitution(bsdtar, archive_entry_symlink(entry), &subst_name, 1);
- if (r == -1) {
- bsdtar_warnc(bsdtar, 0, "Invalid substituion, skipping entry");
- return 1;
- }
- if (r == 1) {
- archive_entry_copy_symlink(entry, subst_name);
- free(subst_name);
- }
- }
-#endif
-
- /* Strip leading dir names as per --strip-components option. */
- if ((r = bsdtar->strip_components) > 0) {
- const char *p = name;
-
- while (r > 0) {
- switch (*p++) {
- case '/':
- r--;
- name = p;
- break;
- case '\0':
- /* Path is too short, skip it. */
- return (1);
- }
- }
- while (*name == '/')
- ++name;
- if (*name == '\0')
- return (1);
- }
-
- /* Strip redundant leading '/' characters. */
- while (name[0] == '/' && name[1] == '/')
- name++;
-
- /* Strip leading '/' unless user has asked us not to. */
- if (name[0] == '/' && !bsdtar->option_absolute_paths) {
- /* Generate a warning the first time this happens. */
- if (!bsdtar->warned_lead_slash) {
- bsdtar_warnc(bsdtar, 0,
- "Removing leading '/' from member names");
- bsdtar->warned_lead_slash = 1;
- }
- name++;
- /* Special case: Stripping leading '/' from "/" yields ".". */
- if (*name == '\0')
- name = ".";
- }
-
- /* Safely replace name in archive_entry. */
- if (name != archive_entry_pathname(entry)) {
- char *q = strdup(name);
- archive_entry_copy_pathname(entry, q);
- free(q);
- }
- return (0);
-}
-
-/*
- * Like strcmp(), but try to be a little more aware of the fact that
- * we're comparing two paths. Right now, it just handles leading
- * "./" and trailing '/' specially, so that "a/b/" == "./a/b"
- *
- * TODO: Make this better, so that "./a//b/./c/" == "a/b/c"
- * TODO: After this works, push it down into libarchive.
- * TODO: Publish the path normalization routines in libarchive so
- * that bsdtar can normalize paths and use fast strcmp() instead
- * of this.
- */
-
-int
-pathcmp(const char *a, const char *b)
-{
- /* Skip leading './' */
- if (a[0] == '.' && a[1] == '/' && a[2] != '\0')
- a += 2;
- if (b[0] == '.' && b[1] == '/' && b[2] != '\0')
- b += 2;
- /* Find the first difference, or return (0) if none. */
- while (*a == *b) {
- if (*a == '\0')
- return (0);
- a++;
- b++;
- }
- /*
- * If one ends in '/' and the other one doesn't,
- * they're the same.
- */
- if (a[0] == '/' && a[1] == '\0' && b[0] == '\0')
- return (0);
- if (a[0] == '\0' && b[0] == '/' && b[1] == '\0')
- return (0);
- /* They're really different, return the correct sign. */
- return (*(const unsigned char *)a - *(const unsigned char *)b);
-}
diff --git a/usr.bin/tar/write.c b/usr.bin/tar/write.c
deleted file mode 100644
index 20e9316..0000000
--- a/usr.bin/tar/write.c
+++ /dev/null
@@ -1,1434 +0,0 @@
-/*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "bsdtar_platform.h"
-__FBSDID("$FreeBSD$");
-
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_ACL_H
-#include <sys/acl.h>
-#endif
-#ifdef HAVE_SYS_IOCTL_H
-#include <sys/ioctl.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-#ifdef HAVE_ATTR_XATTR_H
-#include <attr/xattr.h>
-#endif
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#ifdef HAVE_EXT2FS_EXT2_FS_H
-#include <ext2fs/ext2_fs.h>
-#endif
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif
-#ifdef HAVE_FNMATCH_H
-#include <fnmatch.h>
-#endif
-#ifdef HAVE_GRP_H
-#include <grp.h>
-#endif
-#ifdef HAVE_LIMITS_H
-#include <limits.h>
-#endif
-#ifdef HAVE_LINUX_FS_H
-#include <linux/fs.h> /* for Linux file flags */
-#endif
-#ifdef HAVE_PWD_H
-#include <pwd.h>
-#endif
-#include <stdio.h>
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include "bsdtar.h"
-#include "tree.h"
-
-/* Size of buffer for holding file data prior to writing. */
-#define FILEDATABUFLEN 65536
-
-/* Fixed size of uname/gname caches. */
-#define name_cache_size 101
-
-static const char * const NO_NAME = "(noname)";
-
-struct archive_dir_entry {
- struct archive_dir_entry *next;
- time_t mtime_sec;
- int mtime_nsec;
- char *name;
-};
-
-struct archive_dir {
- struct archive_dir_entry *head, *tail;
-};
-
-struct name_cache {
- int probes;
- int hits;
- size_t size;
- struct {
- id_t id;
- const char *name;
- } cache[name_cache_size];
-};
-
-static void add_dir_list(struct bsdtar *bsdtar, const char *path,
- time_t mtime_sec, int mtime_nsec);
-static int append_archive(struct bsdtar *, struct archive *,
- struct archive *ina);
-static int append_archive_filename(struct bsdtar *,
- struct archive *, const char *fname);
-static void archive_names_from_file(struct bsdtar *bsdtar,
- struct archive *a);
-static int archive_names_from_file_helper(struct bsdtar *bsdtar,
- const char *line);
-static int copy_file_data(struct bsdtar *bsdtar,
- struct archive *a, struct archive *ina);
-static void create_cleanup(struct bsdtar *);
-static void free_cache(struct name_cache *cache);
-static const char * lookup_gname(struct bsdtar *bsdtar, gid_t gid);
-static int lookup_gname_helper(struct bsdtar *bsdtar,
- const char **name, id_t gid);
-static const char * lookup_uname(struct bsdtar *bsdtar, uid_t uid);
-static int lookup_uname_helper(struct bsdtar *bsdtar,
- const char **name, id_t uid);
-static int new_enough(struct bsdtar *, const char *path,
- const struct stat *);
-static void setup_acls(struct bsdtar *, struct archive_entry *,
- const char *path);
-static void setup_xattrs(struct bsdtar *, struct archive_entry *,
- const char *path);
-static void test_for_append(struct bsdtar *);
-static void write_archive(struct archive *, struct bsdtar *);
-static void write_entry(struct bsdtar *, struct archive *,
- const struct stat *, const char *pathname,
- const char *accpath);
-static void write_entry_backend(struct bsdtar *, struct archive *,
- struct archive_entry *);
-static int write_file_data(struct bsdtar *, struct archive *,
- struct archive_entry *, int fd);
-static void write_hierarchy(struct bsdtar *, struct archive *,
- const char *);
-
-void
-tar_mode_c(struct bsdtar *bsdtar)
-{
- struct archive *a;
- int r;
-
- if (*bsdtar->argv == NULL && bsdtar->names_from_file == NULL)
- bsdtar_errc(bsdtar, 1, 0, "no files or directories specified");
-
- a = archive_write_new();
-
- /* Support any format that the library supports. */
- if (bsdtar->create_format == NULL) {
- r = archive_write_set_format_pax_restricted(a);
- bsdtar->create_format = "pax restricted";
- } else {
- r = archive_write_set_format_by_name(a, bsdtar->create_format);
- }
- if (r != ARCHIVE_OK) {
- fprintf(stderr, "Can't use format %s: %s\n",
- bsdtar->create_format,
- archive_error_string(a));
- usage(bsdtar);
- }
-
- /*
- * If user explicitly set the block size, then assume they
- * want the last block padded as well. Otherwise, use the
- * default block size and accept archive_write_open_file()'s
- * default padding decisions.
- */
- if (bsdtar->bytes_per_block != 0) {
- archive_write_set_bytes_per_block(a, bsdtar->bytes_per_block);
- archive_write_set_bytes_in_last_block(a,
- bsdtar->bytes_per_block);
- } else
- archive_write_set_bytes_per_block(a, DEFAULT_BYTES_PER_BLOCK);
-
- if (bsdtar->compress_program) {
- archive_write_set_compression_program(a, bsdtar->compress_program);
- } else {
- switch (bsdtar->create_compression) {
- case 0:
- archive_write_set_compression_none(a);
- break;
-#ifdef HAVE_LIBBZ2
- case 'j': case 'y':
- archive_write_set_compression_bzip2(a);
- break;
-#endif
-#ifdef HAVE_LIBZ
- case 'z':
- archive_write_set_compression_gzip(a);
- break;
-#endif
- case 'Z':
- archive_write_set_compression_compress(a);
- break;
- default:
- bsdtar_errc(bsdtar, 1, 0,
- "Unrecognized compression option -%c",
- bsdtar->create_compression);
- }
- }
-
- r = archive_write_open_file(a, bsdtar->filename);
- if (r != ARCHIVE_OK)
- bsdtar_errc(bsdtar, 1, 0, archive_error_string(a));
-
- write_archive(a, bsdtar);
-}
-
-/*
- * Same as 'c', except we only support tar or empty formats in
- * uncompressed files on disk.
- */
-void
-tar_mode_r(struct bsdtar *bsdtar)
-{
- off_t end_offset;
- int format;
- struct archive *a;
- struct archive_entry *entry;
- int r;
-
- /* Sanity-test some arguments and the file. */
- test_for_append(bsdtar);
-
- format = ARCHIVE_FORMAT_TAR_PAX_RESTRICTED;
-
- bsdtar->fd = open(bsdtar->filename, O_RDWR | O_CREAT, 0666);
- if (bsdtar->fd < 0)
- bsdtar_errc(bsdtar, 1, errno,
- "Cannot open %s", bsdtar->filename);
-
- a = archive_read_new();
- archive_read_support_compression_all(a);
- archive_read_support_format_tar(a);
- archive_read_support_format_gnutar(a);
- r = archive_read_open_fd(a, bsdtar->fd, 10240);
- if (r != ARCHIVE_OK)
- bsdtar_errc(bsdtar, 1, archive_errno(a),
- "Can't read archive %s: %s", bsdtar->filename,
- archive_error_string(a));
- while (0 == archive_read_next_header(a, &entry)) {
- if (archive_compression(a) != ARCHIVE_COMPRESSION_NONE) {
- archive_read_finish(a);
- close(bsdtar->fd);
- bsdtar_errc(bsdtar, 1, 0,
- "Cannot append to compressed archive.");
- }
- /* Keep going until we hit end-of-archive */
- format = archive_format(a);
- }
-
- end_offset = archive_read_header_position(a);
- archive_read_finish(a);
-
- /* Re-open archive for writing */
- a = archive_write_new();
- archive_write_set_compression_none(a);
- /*
- * Set the format to be used for writing. To allow people to
- * extend empty files, we need to allow them to specify the format,
- * which opens the possibility that they will specify a format that
- * doesn't match the existing format. Hence, the following bit
- * of arcane ugliness.
- */
-
- if (bsdtar->create_format != NULL) {
- /* If the user requested a format, use that, but ... */
- archive_write_set_format_by_name(a,
- bsdtar->create_format);
- /* ... complain if it's not compatible. */
- format &= ARCHIVE_FORMAT_BASE_MASK;
- if (format != (int)(archive_format(a) & ARCHIVE_FORMAT_BASE_MASK)
- && format != ARCHIVE_FORMAT_EMPTY) {
- bsdtar_errc(bsdtar, 1, 0,
- "Format %s is incompatible with the archive %s.",
- bsdtar->create_format, bsdtar->filename);
- }
- } else {
- /*
- * Just preserve the current format, with a little care
- * for formats that libarchive can't write.
- */
- if (format == ARCHIVE_FORMAT_TAR_GNUTAR)
- /* TODO: When gtar supports pax, use pax restricted. */
- format = ARCHIVE_FORMAT_TAR_USTAR;
- if (format == ARCHIVE_FORMAT_EMPTY)
- format = ARCHIVE_FORMAT_TAR_PAX_RESTRICTED;
- archive_write_set_format(a, format);
- }
- lseek(bsdtar->fd, end_offset, SEEK_SET); /* XXX check return val XXX */
- archive_write_open_fd(a, bsdtar->fd); /* XXX check return val XXX */
-
- write_archive(a, bsdtar); /* XXX check return val XXX */
-
- close(bsdtar->fd);
- bsdtar->fd = -1;
-}
-
-void
-tar_mode_u(struct bsdtar *bsdtar)
-{
- off_t end_offset;
- struct archive *a;
- struct archive_entry *entry;
- int format;
- struct archive_dir_entry *p;
- struct archive_dir archive_dir;
-
- bsdtar->archive_dir = &archive_dir;
- memset(&archive_dir, 0, sizeof(archive_dir));
-
- format = ARCHIVE_FORMAT_TAR_PAX_RESTRICTED;
-
- /* Sanity-test some arguments and the file. */
- test_for_append(bsdtar);
-
- bsdtar->fd = open(bsdtar->filename, O_RDWR);
- if (bsdtar->fd < 0)
- bsdtar_errc(bsdtar, 1, errno,
- "Cannot open %s", bsdtar->filename);
-
- a = archive_read_new();
- archive_read_support_compression_all(a);
- archive_read_support_format_tar(a);
- archive_read_support_format_gnutar(a);
- if (archive_read_open_fd(a, bsdtar->fd,
- bsdtar->bytes_per_block != 0 ? bsdtar->bytes_per_block :
- DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) {
- bsdtar_errc(bsdtar, 1, 0,
- "Can't open %s: %s", bsdtar->filename,
- archive_error_string(a));
- }
-
- /* Build a list of all entries and their recorded mod times. */
- while (0 == archive_read_next_header(a, &entry)) {
- if (archive_compression(a) != ARCHIVE_COMPRESSION_NONE) {
- archive_read_finish(a);
- close(bsdtar->fd);
- bsdtar_errc(bsdtar, 1, 0,
- "Cannot append to compressed archive.");
- }
- add_dir_list(bsdtar, archive_entry_pathname(entry),
- archive_entry_mtime(entry),
- archive_entry_mtime_nsec(entry));
- /* Record the last format determination we see */
- format = archive_format(a);
- /* Keep going until we hit end-of-archive */
- }
-
- end_offset = archive_read_header_position(a);
- archive_read_finish(a);
-
- /* Re-open archive for writing. */
- a = archive_write_new();
- archive_write_set_compression_none(a);
- /*
- * Set format to same one auto-detected above, except that
- * we don't write GNU tar format, so use ustar instead.
- */
- if (format == ARCHIVE_FORMAT_TAR_GNUTAR)
- format = ARCHIVE_FORMAT_TAR_USTAR;
- archive_write_set_format(a, format);
- if (bsdtar->bytes_per_block != 0) {
- archive_write_set_bytes_per_block(a, bsdtar->bytes_per_block);
- archive_write_set_bytes_in_last_block(a,
- bsdtar->bytes_per_block);
- } else
- archive_write_set_bytes_per_block(a, DEFAULT_BYTES_PER_BLOCK);
- lseek(bsdtar->fd, end_offset, SEEK_SET);
- ftruncate(bsdtar->fd, end_offset);
- archive_write_open_fd(a, bsdtar->fd);
-
- write_archive(a, bsdtar);
-
- close(bsdtar->fd);
- bsdtar->fd = -1;
-
- while (bsdtar->archive_dir->head != NULL) {
- p = bsdtar->archive_dir->head->next;
- free(bsdtar->archive_dir->head->name);
- free(bsdtar->archive_dir->head);
- bsdtar->archive_dir->head = p;
- }
- bsdtar->archive_dir->tail = NULL;
-}
-
-
-/*
- * Write user-specified files/dirs to opened archive.
- */
-static void
-write_archive(struct archive *a, struct bsdtar *bsdtar)
-{
- const char *arg;
- struct archive_entry *entry, *sparse_entry;
-
- /* We want to catch SIGINFO and SIGUSR1. */
- siginfo_init(bsdtar);
-
- /* Allocate a buffer for file data. */
- if ((bsdtar->buff = malloc(FILEDATABUFLEN)) == NULL)
- bsdtar_errc(bsdtar, 1, 0, "cannot allocate memory");
-
- if ((bsdtar->resolver = archive_entry_linkresolver_new()) == NULL)
- bsdtar_errc(bsdtar, 1, 0, "cannot create link resolver");
- archive_entry_linkresolver_set_strategy(bsdtar->resolver,
- archive_format(a));
-
- if (bsdtar->names_from_file != NULL)
- archive_names_from_file(bsdtar, a);
-
- while (*bsdtar->argv) {
- arg = *bsdtar->argv;
- if (arg[0] == '-' && arg[1] == 'C') {
- arg += 2;
- if (*arg == '\0') {
- bsdtar->argv++;
- arg = *bsdtar->argv;
- if (arg == NULL) {
- bsdtar_warnc(bsdtar, 1, 0,
- "Missing argument for -C");
- bsdtar->return_value = 1;
- goto cleanup;
- }
- }
- set_chdir(bsdtar, arg);
- } else {
- if (*arg != '/' && (arg[0] != '@' || arg[1] != '/'))
- do_chdir(bsdtar); /* Handle a deferred -C */
- if (*arg == '@') {
- if (append_archive_filename(bsdtar, a,
- arg + 1) != 0)
- break;
- } else
- write_hierarchy(bsdtar, a, arg);
- }
- bsdtar->argv++;
- }
-
- entry = NULL;
- archive_entry_linkify(bsdtar->resolver, &entry, &sparse_entry);
- while (entry != NULL) {
- write_entry_backend(bsdtar, a, entry);
- archive_entry_free(entry);
- entry = NULL;
- archive_entry_linkify(bsdtar->resolver, &entry, &sparse_entry);
- }
-
- create_cleanup(bsdtar);
- if (archive_write_close(a)) {
- bsdtar_warnc(bsdtar, 0, "%s", archive_error_string(a));
- bsdtar->return_value = 1;
- }
-
-cleanup:
- /* Free file data buffer. */
- free(bsdtar->buff);
-
- if (bsdtar->option_totals) {
- fprintf(stderr, "Total bytes written: " BSDTAR_FILESIZE_PRINTF "\n",
- (BSDTAR_FILESIZE_TYPE)archive_position_compressed(a));
- }
-
- archive_write_finish(a);
-
- /* Restore old SIGINFO + SIGUSR1 handlers. */
- siginfo_done(bsdtar);
-}
-
-/*
- * Archive names specified in file.
- *
- * Unless --null was specified, a line containing exactly "-C" will
- * cause the next line to be a directory to pass to chdir(). If
- * --null is specified, then a line "-C" is just another filename.
- */
-void
-archive_names_from_file(struct bsdtar *bsdtar, struct archive *a)
-{
- bsdtar->archive = a;
-
- bsdtar->next_line_is_dir = 0;
- process_lines(bsdtar, bsdtar->names_from_file,
- archive_names_from_file_helper);
- if (bsdtar->next_line_is_dir)
- bsdtar_errc(bsdtar, 1, errno,
- "Unexpected end of filename list; "
- "directory expected after -C");
-}
-
-static int
-archive_names_from_file_helper(struct bsdtar *bsdtar, const char *line)
-{
- if (bsdtar->next_line_is_dir) {
- set_chdir(bsdtar, line);
- bsdtar->next_line_is_dir = 0;
- } else if (!bsdtar->option_null && strcmp(line, "-C") == 0)
- bsdtar->next_line_is_dir = 1;
- else {
- if (*line != '/')
- do_chdir(bsdtar); /* Handle a deferred -C */
- write_hierarchy(bsdtar, bsdtar->archive, line);
- }
- return (0);
-}
-
-/*
- * Copy from specified archive to current archive. Returns non-zero
- * for write errors (which force us to terminate the entire archiving
- * operation). If there are errors reading the input archive, we set
- * bsdtar->return_value but return zero, so the overall archiving
- * operation will complete and return non-zero.
- */
-static int
-append_archive_filename(struct bsdtar *bsdtar, struct archive *a,
- const char *filename)
-{
- struct archive *ina;
- int rc;
-
- if (strcmp(filename, "-") == 0)
- filename = NULL; /* Library uses NULL for stdio. */
-
- ina = archive_read_new();
- archive_read_support_format_all(ina);
- archive_read_support_compression_all(ina);
- if (archive_read_open_file(ina, filename, 10240)) {
- bsdtar_warnc(bsdtar, 0, "%s", archive_error_string(ina));
- bsdtar->return_value = 1;
- return (0);
- }
-
- rc = append_archive(bsdtar, a, ina);
-
- if (archive_errno(ina)) {
- bsdtar_warnc(bsdtar, 0, "Error reading archive %s: %s",
- filename, archive_error_string(ina));
- bsdtar->return_value = 1;
- }
- archive_read_finish(ina);
-
- return (rc);
-}
-
-static int
-append_archive(struct bsdtar *bsdtar, struct archive *a, struct archive *ina)
-{
- struct archive_entry *in_entry;
- int e;
-
- while (0 == archive_read_next_header(ina, &in_entry)) {
- if (!new_enough(bsdtar, archive_entry_pathname(in_entry),
- archive_entry_stat(in_entry)))
- continue;
- if (excluded(bsdtar, archive_entry_pathname(in_entry)))
- continue;
- if (bsdtar->option_interactive &&
- !yes("copy '%s'", archive_entry_pathname(in_entry)))
- continue;
- if (bsdtar->verbose)
- safe_fprintf(stderr, "a %s",
- archive_entry_pathname(in_entry));
- siginfo_setinfo(bsdtar, "copying",
- archive_entry_pathname(in_entry),
- archive_entry_size(in_entry));
- siginfo_printinfo(bsdtar, 0);
-
- e = archive_write_header(a, in_entry);
- if (e != ARCHIVE_OK) {
- if (!bsdtar->verbose)
- bsdtar_warnc(bsdtar, 0, "%s: %s",
- archive_entry_pathname(in_entry),
- archive_error_string(a));
- else
- fprintf(stderr, ": %s", archive_error_string(a));
- }
- if (e == ARCHIVE_FATAL)
- exit(1);
-
- if (e >= ARCHIVE_WARN) {
- if (archive_entry_size(in_entry) == 0)
- archive_read_data_skip(ina);
- else if (copy_file_data(bsdtar, a, ina))
- exit(1);
- }
-
- if (bsdtar->verbose)
- fprintf(stderr, "\n");
- }
-
- /* Note: If we got here, we saw no write errors, so return success. */
- return (0);
-}
-
-/* Helper function to copy data between archives. */
-static int
-copy_file_data(struct bsdtar *bsdtar, struct archive *a, struct archive *ina)
-{
- ssize_t bytes_read;
- ssize_t bytes_written;
- off_t progress = 0;
-
- bytes_read = archive_read_data(ina, bsdtar->buff, FILEDATABUFLEN);
- while (bytes_read > 0) {
- siginfo_printinfo(bsdtar, progress);
-
- bytes_written = archive_write_data(a, bsdtar->buff,
- bytes_read);
- if (bytes_written < bytes_read) {
- bsdtar_warnc(bsdtar, 0, "%s", archive_error_string(a));
- return (-1);
- }
- progress += bytes_written;
- bytes_read = archive_read_data(ina, bsdtar->buff,
- FILEDATABUFLEN);
- }
-
- return (0);
-}
-
-/*
- * Add the file or dir hierarchy named by 'path' to the archive
- */
-static void
-write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path)
-{
- struct tree *tree;
- char symlink_mode = bsdtar->symlink_mode;
- dev_t first_dev = 0;
- int dev_recorded = 0;
- int tree_ret;
-
- tree = tree_open(path);
-
- if (!tree) {
- bsdtar_warnc(bsdtar, errno, "%s: Cannot open", path);
- bsdtar->return_value = 1;
- return;
- }
-
- while ((tree_ret = tree_next(tree))) {
- const char *name = tree_current_path(tree);
- const struct stat *st = NULL, *lst = NULL;
- int descend;
-
- if (tree_ret == TREE_ERROR_DIR)
- bsdtar_warnc(bsdtar, errno, "%s: Couldn't visit directory", name);
- if (tree_ret != TREE_REGULAR)
- continue;
- lst = tree_current_lstat(tree);
- if (lst == NULL) {
- /* Couldn't lstat(); must not exist. */
- bsdtar_warnc(bsdtar, errno, "%s: Cannot stat", name);
-
- /*
- * Report an error via the exit code if the failed
- * path is a prefix of what the user provided via
- * the command line. (Testing for string equality
- * here won't work due to trailing '/' characters.)
- */
- if (memcmp(name, path, strlen(name)) == 0)
- bsdtar->return_value = 1;
-
- continue;
- }
- if (S_ISLNK(lst->st_mode))
- st = tree_current_stat(tree);
- /* Default: descend into any dir or symlink to dir. */
- /* We'll adjust this later on. */
- descend = 0;
- if ((st != NULL) && S_ISDIR(st->st_mode))
- descend = 1;
- if ((lst != NULL) && S_ISDIR(lst->st_mode))
- descend = 1;
-
- /*
- * If user has asked us not to cross mount points,
- * then don't descend into into a dir on a different
- * device.
- */
- if (!dev_recorded) {
- first_dev = lst->st_dev;
- dev_recorded = 1;
- }
- if (bsdtar->option_dont_traverse_mounts) {
- if (lst != NULL && lst->st_dev != first_dev)
- descend = 0;
- }
-
- /*
- * If this file/dir is flagged "nodump" and we're
- * honoring such flags, skip this file/dir.
- */
-#ifdef HAVE_STRUCT_STAT_ST_FLAGS
- /* BSD systems store flags in struct stat */
- if (bsdtar->option_honor_nodump &&
- (lst->st_flags & UF_NODUMP))
- continue;
-#endif
-
-#if defined(EXT2_IOC_GETFLAGS) && defined(EXT2_NODUMP_FL)
- /* Linux uses ioctl to read flags. */
- if (bsdtar->option_honor_nodump) {
- int fd = open(name, O_RDONLY | O_NONBLOCK);
- if (fd >= 0) {
- unsigned long fflags;
- int r = ioctl(fd, EXT2_IOC_GETFLAGS, &fflags);
- close(fd);
- if (r >= 0 && (fflags & EXT2_NODUMP_FL))
- continue;
- }
- }
-#endif
-
- /*
- * If this file/dir is excluded by a filename
- * pattern, skip it.
- */
- if (excluded(bsdtar, name))
- continue;
-
- /*
- * If the user vetoes this file/directory, skip it.
- */
- if (bsdtar->option_interactive &&
- !yes("add '%s'", name))
- continue;
-
- /*
- * If this is a dir, decide whether or not to recurse.
- */
- if (bsdtar->option_no_subdirs)
- descend = 0;
-
- /*
- * Distinguish 'L'/'P'/'H' symlink following.
- */
- switch(symlink_mode) {
- case 'H':
- /* 'H': After the first item, rest like 'P'. */
- symlink_mode = 'P';
- /* 'H': First item (from command line) like 'L'. */
- /* FALLTHROUGH */
- case 'L':
- /* 'L': Do descend through a symlink to dir. */
- /* 'L': Archive symlink to file as file. */
- lst = tree_current_stat(tree);
- /* If stat fails, we have a broken symlink;
- * in that case, archive the link as such. */
- if (lst == NULL)
- lst = tree_current_lstat(tree);
- break;
- default:
- /* 'P': Don't descend through a symlink to dir. */
- if (!S_ISDIR(lst->st_mode))
- descend = 0;
- /* 'P': Archive symlink to file as symlink. */
- /* lst = tree_current_lstat(tree); */
- break;
- }
-
- if (descend)
- tree_descend(tree);
-
- /*
- * Write the entry. Note that write_entry() handles
- * pathname editing and newness testing.
- */
- write_entry(bsdtar, a, lst, name,
- tree_current_access_path(tree));
- }
- tree_close(tree);
-}
-
-/*
- * Backend for write_entry.
- */
-static void
-write_entry_backend(struct bsdtar *bsdtar, struct archive *a,
- struct archive_entry *entry)
-{
- int fd = -1;
- int e;
-
- if (archive_entry_size(entry) > 0) {
- const char *pathname = archive_entry_sourcepath(entry);
- fd = open(pathname, O_RDONLY);
- if (fd == -1) {
- if (!bsdtar->verbose)
- bsdtar_warnc(bsdtar, errno,
- "%s: could not open file", pathname);
- else
- fprintf(stderr, ": %s", strerror(errno));
- return;
- }
- }
-
- e = archive_write_header(a, entry);
- if (e != ARCHIVE_OK) {
- if (!bsdtar->verbose)
- bsdtar_warnc(bsdtar, 0, "%s: %s",
- archive_entry_pathname(entry),
- archive_error_string(a));
- else
- fprintf(stderr, ": %s", archive_error_string(a));
- }
-
- if (e == ARCHIVE_FATAL)
- exit(1);
-
- /*
- * If we opened a file earlier, write it out now. Note that
- * the format handler might have reset the size field to zero
- * to inform us that the archive body won't get stored. In
- * that case, just skip the write.
- */
- if (e >= ARCHIVE_WARN && fd >= 0 && archive_entry_size(entry) > 0) {
- if (write_file_data(bsdtar, a, entry, fd))
- exit(1);
- }
-
- /*
- * If we opened a file, close it now even if there was an error
- * which made us decide not to write the archive body.
- */
- if (fd >= 0)
- close(fd);
-}
-
-/*
- * Add a single filesystem object to the archive.
- */
-static void
-write_entry(struct bsdtar *bsdtar, struct archive *a, const struct stat *st,
- const char *pathname, const char *accpath)
-{
- struct archive_entry *entry, *sparse_entry;
- static char linkbuffer[PATH_MAX+1];
-
- entry = archive_entry_new();
-
- archive_entry_set_pathname(entry, pathname);
- archive_entry_copy_sourcepath(entry, accpath);
-
- /*
- * Rewrite the pathname to be archived. If rewrite
- * fails, skip the entry.
- */
- if (edit_pathname(bsdtar, entry))
- goto abort;
-
- /*
- * In -u mode, check that the file is newer than what's
- * already in the archive; in all modes, obey --newerXXX flags.
- */
- if (!new_enough(bsdtar, archive_entry_pathname(entry), st))
- goto abort;
-
- /* Display entry as we process it. This format is required by SUSv2. */
- if (bsdtar->verbose)
- safe_fprintf(stderr, "a %s", archive_entry_pathname(entry));
-
- /* Read symbolic link information. */
- if ((st->st_mode & S_IFMT) == S_IFLNK) {
- int lnklen;
-
- lnklen = readlink(accpath, linkbuffer, PATH_MAX);
- if (lnklen < 0) {
- if (!bsdtar->verbose)
- bsdtar_warnc(bsdtar, errno,
- "%s: Couldn't read symbolic link",
- pathname);
- else
- safe_fprintf(stderr,
- ": Couldn't read symbolic link: %s",
- strerror(errno));
- goto cleanup;
- }
- linkbuffer[lnklen] = 0;
- archive_entry_set_symlink(entry, linkbuffer);
- }
-
- /* Look up username and group name. */
- archive_entry_set_uname(entry, lookup_uname(bsdtar, st->st_uid));
- archive_entry_set_gname(entry, lookup_gname(bsdtar, st->st_gid));
-
-#ifdef HAVE_STRUCT_STAT_ST_FLAGS
- /* XXX TODO: archive_entry_copy_stat() should copy st_flags
- * on platforms that support it. This should go away then. */
- if (st->st_flags != 0)
- archive_entry_set_fflags(entry, st->st_flags, 0);
-#endif
-
-#ifdef EXT2_IOC_GETFLAGS
- /* XXX TODO: Find a way to merge this with the
- * flags fetch for nodump support earlier. */
- if ((S_ISREG(st->st_mode) || S_ISDIR(st->st_mode))) {
- int fd = open(accpath, O_RDONLY | O_NONBLOCK);
- if (fd >= 0) {
- unsigned long stflags;
- int r = ioctl(fd, EXT2_IOC_GETFLAGS, &stflags);
- close(fd);
- if (r == 0 && stflags != 0)
- archive_entry_set_fflags(entry, stflags, 0);
- }
- }
-#endif
-
- archive_entry_copy_stat(entry, st);
- setup_acls(bsdtar, entry, accpath);
- setup_xattrs(bsdtar, entry, accpath);
-
- /* Non-regular files get archived with zero size. */
- if (!S_ISREG(st->st_mode))
- archive_entry_set_size(entry, 0);
-
- /* Record what we're doing, for the benefit of SIGINFO / SIGUSR1. */
- siginfo_setinfo(bsdtar, "adding", archive_entry_pathname(entry),
- archive_entry_size(entry));
- archive_entry_linkify(bsdtar->resolver, &entry, &sparse_entry);
-
- /* Handle SIGINFO / SIGUSR1 request if one was made. */
- siginfo_printinfo(bsdtar, 0);
-
- while (entry != NULL) {
- write_entry_backend(bsdtar, a, entry);
- archive_entry_free(entry);
- entry = sparse_entry;
- sparse_entry = NULL;
- }
-
-cleanup:
- if (bsdtar->verbose)
- fprintf(stderr, "\n");
-
-abort:
- if (entry != NULL)
- archive_entry_free(entry);
-}
-
-
-/* Helper function to copy file to archive. */
-static int
-write_file_data(struct bsdtar *bsdtar, struct archive *a,
- struct archive_entry *entry, int fd)
-{
- ssize_t bytes_read;
- ssize_t bytes_written;
- off_t progress = 0;
-
- bytes_read = read(fd, bsdtar->buff, FILEDATABUFLEN);
- while (bytes_read > 0) {
- siginfo_printinfo(bsdtar, progress);
-
- bytes_written = archive_write_data(a, bsdtar->buff,
- FILEDATABUFLEN);
- if (bytes_written < 0) {
- /* Write failed; this is bad */
- bsdtar_warnc(bsdtar, 0, "%s", archive_error_string(a));
- return (-1);
- }
- if (bytes_written < bytes_read) {
- /* Write was truncated; warn but continue. */
- bsdtar_warnc(bsdtar, 0,
- "%s: Truncated write; file may have grown while being archived.",
- archive_entry_pathname(entry));
- return (0);
- }
- progress += bytes_written;
- bytes_read = read(fd, bsdtar->buff, FILEDATABUFLEN);
- }
- return 0;
-}
-
-
-static void
-create_cleanup(struct bsdtar *bsdtar)
-{
- free_cache(bsdtar->uname_cache);
- bsdtar->uname_cache = NULL;
- free_cache(bsdtar->gname_cache);
- bsdtar->gname_cache = NULL;
-}
-
-#ifdef HAVE_POSIX_ACL
-static void setup_acl(struct bsdtar *bsdtar,
- struct archive_entry *entry, const char *accpath,
- int acl_type, int archive_entry_acl_type);
-
-static void
-setup_acls(struct bsdtar *bsdtar, struct archive_entry *entry,
- const char *accpath)
-{
- archive_entry_acl_clear(entry);
-
- setup_acl(bsdtar, entry, accpath,
- ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_TYPE_ACCESS);
- /* Only directories can have default ACLs. */
- if (S_ISDIR(archive_entry_mode(entry)))
- setup_acl(bsdtar, entry, accpath,
- ACL_TYPE_DEFAULT, ARCHIVE_ENTRY_ACL_TYPE_DEFAULT);
-}
-
-static void
-setup_acl(struct bsdtar *bsdtar, struct archive_entry *entry,
- const char *accpath, int acl_type, int archive_entry_acl_type)
-{
- acl_t acl;
- acl_tag_t acl_tag;
- acl_entry_t acl_entry;
- acl_permset_t acl_permset;
- int s, ae_id, ae_tag, ae_perm;
- const char *ae_name;
-
- /* Retrieve access ACL from file. */
- acl = acl_get_file(accpath, acl_type);
- if (acl != NULL) {
- s = acl_get_entry(acl, ACL_FIRST_ENTRY, &acl_entry);
- while (s == 1) {
- ae_id = -1;
- ae_name = NULL;
-
- acl_get_tag_type(acl_entry, &acl_tag);
- if (acl_tag == ACL_USER) {
- ae_id = (int)*(uid_t *)acl_get_qualifier(acl_entry);
- ae_name = lookup_uname(bsdtar, ae_id);
- ae_tag = ARCHIVE_ENTRY_ACL_USER;
- } else if (acl_tag == ACL_GROUP) {
- ae_id = (int)*(gid_t *)acl_get_qualifier(acl_entry);
- ae_name = lookup_gname(bsdtar, ae_id);
- ae_tag = ARCHIVE_ENTRY_ACL_GROUP;
- } else if (acl_tag == ACL_MASK) {
- ae_tag = ARCHIVE_ENTRY_ACL_MASK;
- } else if (acl_tag == ACL_USER_OBJ) {
- ae_tag = ARCHIVE_ENTRY_ACL_USER_OBJ;
- } else if (acl_tag == ACL_GROUP_OBJ) {
- ae_tag = ARCHIVE_ENTRY_ACL_GROUP_OBJ;
- } else if (acl_tag == ACL_OTHER) {
- ae_tag = ARCHIVE_ENTRY_ACL_OTHER;
- } else {
- /* Skip types that libarchive can't support. */
- continue;
- }
-
- acl_get_permset(acl_entry, &acl_permset);
- ae_perm = 0;
- /*
- * acl_get_perm() is spelled differently on different
- * platforms; see bsdtar_platform.h for details.
- */
- if (ACL_GET_PERM(acl_permset, ACL_EXECUTE))
- ae_perm |= ARCHIVE_ENTRY_ACL_EXECUTE;
- if (ACL_GET_PERM(acl_permset, ACL_READ))
- ae_perm |= ARCHIVE_ENTRY_ACL_READ;
- if (ACL_GET_PERM(acl_permset, ACL_WRITE))
- ae_perm |= ARCHIVE_ENTRY_ACL_WRITE;
-
- archive_entry_acl_add_entry(entry,
- archive_entry_acl_type, ae_perm, ae_tag,
- ae_id, ae_name);
-
- s = acl_get_entry(acl, ACL_NEXT_ENTRY, &acl_entry);
- }
- acl_free(acl);
- }
-}
-#else
-static void
-setup_acls(struct bsdtar *bsdtar, struct archive_entry *entry,
- const char *accpath)
-{
- (void)bsdtar;
- (void)entry;
- (void)accpath;
-}
-#endif
-
-#if HAVE_LISTXATTR && HAVE_LLISTXATTR && HAVE_GETXATTR && HAVE_LGETXATTR
-
-static void
-setup_xattr(struct bsdtar *bsdtar, struct archive_entry *entry,
- const char *accpath, const char *name)
-{
- size_t size;
- void *value = NULL;
- char symlink_mode = bsdtar->symlink_mode;
-
- if (symlink_mode == 'H')
- size = getxattr(accpath, name, NULL, 0);
- else
- size = lgetxattr(accpath, name, NULL, 0);
-
- if (size == -1) {
- bsdtar_warnc(bsdtar, errno, "Couldn't get extended attribute");
- return;
- }
-
- if (size > 0 && (value = malloc(size)) == NULL) {
- bsdtar_errc(bsdtar, 1, errno, "Out of memory");
- return;
- }
-
- if (symlink_mode == 'H')
- size = getxattr(accpath, name, value, size);
- else
- size = lgetxattr(accpath, name, value, size);
-
- if (size == -1) {
- bsdtar_warnc(bsdtar, errno, "Couldn't get extended attribute");
- return;
- }
-
- archive_entry_xattr_add_entry(entry, name, value, size);
-
- free(value);
-}
-
-/*
- * Linux extended attribute support
- */
-static void
-setup_xattrs(struct bsdtar *bsdtar, struct archive_entry *entry,
- const char *accpath)
-{
- char *list, *p;
- size_t list_size;
- char symlink_mode = bsdtar->symlink_mode;
-
- if (symlink_mode == 'H')
- list_size = listxattr(accpath, NULL, 0);
- else
- list_size = llistxattr(accpath, NULL, 0);
-
- if (list_size == -1) {
- bsdtar_warnc(bsdtar, errno,
- "Couldn't list extended attributes");
- return;
- } else if (list_size == 0)
- return;
-
- if ((list = malloc(list_size)) == NULL) {
- bsdtar_errc(bsdtar, 1, errno, "Out of memory");
- return;
- }
-
- if (symlink_mode == 'H')
- list_size = listxattr(accpath, list, list_size);
- else
- list_size = llistxattr(accpath, list, list_size);
-
- if (list_size == -1) {
- bsdtar_warnc(bsdtar, errno,
- "Couldn't list extended attributes");
- free(list);
- return;
- }
-
- for (p = list; (p - list) < list_size; p += strlen(p) + 1) {
- if (strncmp(p, "system.", 7) == 0 ||
- strncmp(p, "xfsroot.", 8) == 0)
- continue;
-
- setup_xattr(bsdtar, entry, accpath, p);
- }
-
- free(list);
-}
-
-#else
-
-/*
- * Generic (stub) extended attribute support.
- */
-static void
-setup_xattrs(struct bsdtar *bsdtar, struct archive_entry *entry,
- const char *accpath)
-{
- (void)bsdtar; /* UNUSED */
- (void)entry; /* UNUSED */
- (void)accpath; /* UNUSED */
-}
-
-#endif
-
-static void
-free_cache(struct name_cache *cache)
-{
- size_t i;
-
- if (cache != NULL) {
- for (i = 0; i < cache->size; i++) {
- if (cache->cache[i].name != NULL &&
- cache->cache[i].name != NO_NAME)
- free((void *)(uintptr_t)cache->cache[i].name);
- }
- free(cache);
- }
-}
-
-/*
- * Lookup uid/gid from uname/gname, return NULL if no match.
- */
-static const char *
-lookup_name(struct bsdtar *bsdtar, struct name_cache **name_cache_variable,
- int (*lookup_fn)(struct bsdtar *, const char **, id_t), id_t id)
-{
- struct name_cache *cache;
- const char *name;
- int slot;
-
-
- if (*name_cache_variable == NULL) {
- *name_cache_variable = malloc(sizeof(struct name_cache));
- if (*name_cache_variable == NULL)
- bsdtar_errc(bsdtar, 1, ENOMEM, "No more memory");
- memset(*name_cache_variable, 0, sizeof(struct name_cache));
- (*name_cache_variable)->size = name_cache_size;
- }
-
- cache = *name_cache_variable;
- cache->probes++;
-
- slot = id % cache->size;
- if (cache->cache[slot].name != NULL) {
- if (cache->cache[slot].id == id) {
- cache->hits++;
- if (cache->cache[slot].name == NO_NAME)
- return (NULL);
- return (cache->cache[slot].name);
- }
- if (cache->cache[slot].name != NO_NAME)
- free((void *)(uintptr_t)cache->cache[slot].name);
- cache->cache[slot].name = NULL;
- }
-
- if (lookup_fn(bsdtar, &name, id) == 0) {
- if (name == NULL || name[0] == '\0') {
- /* Cache the negative response. */
- cache->cache[slot].name = NO_NAME;
- cache->cache[slot].id = id;
- } else {
- cache->cache[slot].name = strdup(name);
- if (cache->cache[slot].name != NULL) {
- cache->cache[slot].id = id;
- return (cache->cache[slot].name);
- }
- /*
- * Conveniently, NULL marks an empty slot, so
- * if the strdup() fails, we've just failed to
- * cache it. No recovery necessary.
- */
- }
- }
- return (NULL);
-}
-
-static const char *
-lookup_uname(struct bsdtar *bsdtar, uid_t uid)
-{
- return (lookup_name(bsdtar, &bsdtar->uname_cache,
- &lookup_uname_helper, (id_t)uid));
-}
-
-static int
-lookup_uname_helper(struct bsdtar *bsdtar, const char **name, id_t id)
-{
- struct passwd *pwent;
-
- (void)bsdtar; /* UNUSED */
-
- errno = 0;
- pwent = getpwuid((uid_t)id);
- if (pwent == NULL) {
- *name = NULL;
- if (errno != 0)
- bsdtar_warnc(bsdtar, errno, "getpwuid(%d) failed", id);
- return (errno);
- }
-
- *name = pwent->pw_name;
- return (0);
-}
-
-static const char *
-lookup_gname(struct bsdtar *bsdtar, gid_t gid)
-{
- return (lookup_name(bsdtar, &bsdtar->gname_cache,
- &lookup_gname_helper, (id_t)gid));
-}
-
-static int
-lookup_gname_helper(struct bsdtar *bsdtar, const char **name, id_t id)
-{
- struct group *grent;
-
- (void)bsdtar; /* UNUSED */
-
- errno = 0;
- grent = getgrgid((gid_t)id);
- if (grent == NULL) {
- *name = NULL;
- if (errno != 0)
- bsdtar_warnc(bsdtar, errno, "getgrgid(%d) failed", id);
- return (errno);
- }
-
- *name = grent->gr_name;
- return (0);
-}
-
-/*
- * Test if the specified file is new enough to include in the archive.
- */
-int
-new_enough(struct bsdtar *bsdtar, const char *path, const struct stat *st)
-{
- struct archive_dir_entry *p;
-
- /*
- * If this file/dir is excluded by a time comparison, skip it.
- */
- if (bsdtar->newer_ctime_sec > 0) {
- if (st->st_ctime < bsdtar->newer_ctime_sec)
- return (0); /* Too old, skip it. */
- if (st->st_ctime == bsdtar->newer_ctime_sec
- && ARCHIVE_STAT_CTIME_NANOS(st)
- <= bsdtar->newer_ctime_nsec)
- return (0); /* Too old, skip it. */
- }
- if (bsdtar->newer_mtime_sec > 0) {
- if (st->st_mtime < bsdtar->newer_mtime_sec)
- return (0); /* Too old, skip it. */
- if (st->st_mtime == bsdtar->newer_mtime_sec
- && ARCHIVE_STAT_MTIME_NANOS(st)
- <= bsdtar->newer_mtime_nsec)
- return (0); /* Too old, skip it. */
- }
-
- /*
- * In -u mode, we only write an entry if it's newer than
- * what was already in the archive.
- */
- if (bsdtar->archive_dir != NULL &&
- bsdtar->archive_dir->head != NULL) {
- for (p = bsdtar->archive_dir->head; p != NULL; p = p->next) {
- if (pathcmp(path, p->name)==0)
- return (p->mtime_sec < st->st_mtime ||
- (p->mtime_sec == st->st_mtime &&
- p->mtime_nsec
- < ARCHIVE_STAT_MTIME_NANOS(st)));
- }
- }
-
- /* If the file wasn't rejected, include it. */
- return (1);
-}
-
-/*
- * Add an entry to the dir list for 'u' mode.
- *
- * XXX TODO: Make this fast.
- */
-static void
-add_dir_list(struct bsdtar *bsdtar, const char *path,
- time_t mtime_sec, int mtime_nsec)
-{
- struct archive_dir_entry *p;
-
- /*
- * Search entire list to see if this file has appeared before.
- * If it has, override the timestamp data.
- */
- p = bsdtar->archive_dir->head;
- while (p != NULL) {
- if (strcmp(path, p->name)==0) {
- p->mtime_sec = mtime_sec;
- p->mtime_nsec = mtime_nsec;
- return;
- }
- p = p->next;
- }
-
- p = malloc(sizeof(*p));
- if (p == NULL)
- bsdtar_errc(bsdtar, 1, ENOMEM, "Can't read archive directory");
-
- p->name = strdup(path);
- if (p->name == NULL)
- bsdtar_errc(bsdtar, 1, ENOMEM, "Can't read archive directory");
- p->mtime_sec = mtime_sec;
- p->mtime_nsec = mtime_nsec;
- p->next = NULL;
- if (bsdtar->archive_dir->tail == NULL) {
- bsdtar->archive_dir->head = bsdtar->archive_dir->tail = p;
- } else {
- bsdtar->archive_dir->tail->next = p;
- bsdtar->archive_dir->tail = p;
- }
-}
-
-void
-test_for_append(struct bsdtar *bsdtar)
-{
- struct stat s;
-
- if (*bsdtar->argv == NULL && bsdtar->names_from_file == NULL)
- bsdtar_errc(bsdtar, 1, 0, "no files or directories specified");
- if (bsdtar->filename == NULL)
- bsdtar_errc(bsdtar, 1, 0, "Cannot append to stdout.");
-
- if (bsdtar->create_compression != 0)
- bsdtar_errc(bsdtar, 1, 0,
- "Cannot append to %s with compression", bsdtar->filename);
-
- if (stat(bsdtar->filename, &s) != 0)
- return;
-
- if (!S_ISREG(s.st_mode) && !S_ISBLK(s.st_mode))
- bsdtar_errc(bsdtar, 1, 0,
- "Cannot append to %s: not a regular file.",
- bsdtar->filename);
-}
diff --git a/usr.bin/tcopy/Makefile b/usr.bin/tcopy/Makefile
deleted file mode 100644
index 1bae0b2..0000000
--- a/usr.bin/tcopy/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= tcopy
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/tcopy/tcopy.1 b/usr.bin/tcopy/tcopy.1
deleted file mode 100644
index 5d926b8..0000000
--- a/usr.bin/tcopy/tcopy.1
+++ /dev/null
@@ -1,129 +0,0 @@
-.\" Copyright (c) 1985, 1990, 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)tcopy.1 8.2 (Berkeley) 4/17/94
-.\" $FreeBSD$
-.\"
-.Dd December 20, 2006
-.Dt TCOPY 1
-.Os
-.Sh NAME
-.Nm tcopy
-.Nd copy and/or verify mag tapes
-.Sh SYNOPSIS
-.Nm
-.Op Fl cvx
-.Op Fl s Ar maxblk
-.Oo Ar src Op Ar dest
-.Oc
-.Sh DESCRIPTION
-The
-.Nm
-utility is designed to copy magnetic tapes.
-The only assumption made
-about the tape layout is that there are two sequential EOF marks
-at the end.
-By default, the
-.Nm
-utility will print
-information about the sizes of records and files found
-on the
-.Pa /dev/sa0
-tape, or on the tape specified by the
-.Ar src
-argument.
-If a destination tape is also specified by the
-.Ar dest
-argument, a copy of the source tape will be made.
-The blocking on the
-destination tape will be identical to that used on the source tape.
-Copying
-a tape will yield the same program output as if just printing the sizes.
-.Pp
-The following options are available:
-.Bl -tag -width ".Fl s Ar maxblk"
-.It Fl c
-Copy
-.Ar src
-to
-.Ar dest
-and then verify that the two tapes are identical.
-.It Fl s Ar maxblk
-Specify a maximum block size,
-.Ar maxblk .
-.It Fl v
-Given the two tapes
-.Ar src
-and
-.Ar dest ,
-verify that they are identical.
-.It Fl x
-Output all informational messages to the standard error
-instead of the standard output.
-This option is useful when
-.Ar dest
-is given as
-.Pa /dev/stdout .
-.El
-.Sh SEE ALSO
-.Xr mt 1 ,
-.Xr mtio 4
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.3 .
-.Sh BUGS
-.Bl -item
-.It
-Writing an image of a tape to a file does not preserve much more than
-the raw data.
-Block size(s) and tape EOF marks are lost which would
-otherwise be preserved in a tape-to-tape copy.
-.It
-End of data (EOD) is determined by two sequential EOF marks
-with no data between them.
-There used to be old systems which typically wrote three EOF's between tape
-files.
-The
-.Nm
-utility will erroneously stop copying early in this case.
-.It
-When using the copy/verify option
-.Fl c ,
-.Nm
-does not rewind the tapes prior to start.
-A rewind is performed
-after writing, prior to the verification stage.
-If one does not start
-at the beginning-of-tape (BOT) then the comparison
-may not be of the intended data.
-.El
diff --git a/usr.bin/tcopy/tcopy.c b/usr.bin/tcopy/tcopy.c
deleted file mode 100644
index 540ac06..0000000
--- a/usr.bin/tcopy/tcopy.c
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- * Copyright (c) 1985, 1987, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1985, 1987, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "@(#)tcopy.c 8.2 (Berkeley) 4/17/94";
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <sys/mtio.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <paths.h>
-#include <signal.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#define MAXREC (64 * 1024)
-#define NOCOUNT (-2)
-
-int filen, guesslen, maxblk = MAXREC;
-u_int64_t lastrec, record, size, tsize;
-FILE *msg;
-
-void *getspace(int);
-void intr(int);
-static void usage(void);
-void verify(int, int, char *);
-void writeop(int, int);
-void rewind_tape(int);
-
-int
-main(argc, argv)
- int argc;
- char *argv[];
-{
- register int lastnread, nread, nw, inp, outp;
- enum {READ, VERIFY, COPY, COPYVERIFY} op = READ;
- sig_t oldsig;
- int ch, needeof;
- char *buff;
- const char *inf;
-
- msg = stdout;
- guesslen = 1;
- while ((ch = getopt(argc, argv, "cs:vx")) != -1)
- switch((char)ch) {
- case 'c':
- op = COPYVERIFY;
- break;
- case 's':
- maxblk = atoi(optarg);
- if (maxblk <= 0) {
- warnx("illegal block size");
- usage();
- }
- guesslen = 0;
- break;
- case 'v':
- op = VERIFY;
- break;
- case 'x':
- msg = stderr;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- switch(argc) {
- case 0:
- if (op != READ)
- usage();
- inf = _PATH_DEFTAPE;
- break;
- case 1:
- if (op != READ)
- usage();
- inf = argv[0];
- break;
- case 2:
- if (op == READ)
- op = COPY;
- inf = argv[0];
- if ((outp = open(argv[1], op == VERIFY ? O_RDONLY :
- op == COPY ? O_WRONLY : O_RDWR, DEFFILEMODE)) < 0)
- err(3, "%s", argv[1]);
- break;
- default:
- usage();
- }
-
- if ((inp = open(inf, O_RDONLY, 0)) < 0)
- err(1, "%s", inf);
-
- buff = getspace(maxblk);
-
- if (op == VERIFY) {
- verify(inp, outp, buff);
- exit(0);
- }
-
- if ((oldsig = signal(SIGINT, SIG_IGN)) != SIG_IGN)
- (void) signal(SIGINT, intr);
-
- needeof = 0;
- for (lastnread = NOCOUNT;;) {
- if ((nread = read(inp, buff, maxblk)) == -1) {
- while (errno == EINVAL && (maxblk -= 1024)) {
- nread = read(inp, buff, maxblk);
- if (nread >= 0)
- goto r1;
- }
- err(1, "read error, file %d, record %qu", filen, record);
- } else if (nread != lastnread) {
- if (lastnread != 0 && lastnread != NOCOUNT) {
- if (lastrec == 0 && nread == 0)
- fprintf(msg, "%qu records\n", record);
- else if (record - lastrec > 1)
- fprintf(msg, "records %qu to %qu\n",
- lastrec, record);
- else
- fprintf(msg, "record %qu\n", lastrec);
- }
- if (nread != 0)
- fprintf(msg, "file %d: block size %d: ",
- filen, nread);
- (void) fflush(stdout);
- lastrec = record;
- }
-r1: guesslen = 0;
- if (nread > 0) {
- if (op == COPY || op == COPYVERIFY) {
- if (needeof) {
- writeop(outp, MTWEOF);
- needeof = 0;
- }
- nw = write(outp, buff, nread);
- if (nw != nread) {
- if (nw == -1) {
- warn("write error, file %d, record %qu", filen, record);
- } else {
- warnx("write error, file %d, record %qu", filen, record);
- warnx("write (%d) != read (%d)", nw, nread);
- }
- errx(5, "copy aborted");
- }
- }
- size += nread;
- record++;
- } else {
- if (lastnread <= 0 && lastnread != NOCOUNT) {
- fprintf(msg, "eot\n");
- break;
- }
- fprintf(msg,
- "file %d: eof after %qu records: %qu bytes\n",
- filen, record, size);
- needeof = 1;
- filen++;
- tsize += size;
- size = record = lastrec = 0;
- lastnread = 0;
- }
- lastnread = nread;
- }
- fprintf(msg, "total length: %qu bytes\n", tsize);
- (void)signal(SIGINT, oldsig);
- if (op == COPY || op == COPYVERIFY) {
- writeop(outp, MTWEOF);
- writeop(outp, MTWEOF);
- if (op == COPYVERIFY) {
- rewind_tape(outp);
- rewind_tape(inp);
- verify(inp, outp, buff);
- }
- }
- exit(0);
-}
-
-void
-verify(inp, outp, outb)
- register int inp, outp;
- register char *outb;
-{
- register int eot, inmaxblk, inn, outmaxblk, outn;
- register char *inb;
-
- inb = getspace(maxblk);
- inmaxblk = outmaxblk = maxblk;
- for (eot = 0;; guesslen = 0) {
- if ((inn = read(inp, inb, inmaxblk)) == -1) {
- if (guesslen)
- while (errno == EINVAL && (inmaxblk -= 1024)) {
- inn = read(inp, inb, inmaxblk);
- if (inn >= 0)
- goto r1;
- }
- warn("read error");
- break;
- }
-r1: if ((outn = read(outp, outb, outmaxblk)) == -1) {
- if (guesslen)
- while (errno == EINVAL && (outmaxblk -= 1024)) {
- outn = read(outp, outb, outmaxblk);
- if (outn >= 0)
- goto r2;
- }
- warn("read error");
- break;
- }
-r2: if (inn != outn) {
- fprintf(msg,
- "%s: tapes have different block sizes; %d != %d.\n",
- "tcopy", inn, outn);
- break;
- }
- if (!inn) {
- if (eot++) {
- fprintf(msg, "tcopy: tapes are identical.\n");
- return;
- }
- } else {
- if (bcmp(inb, outb, inn)) {
- fprintf(msg,
- "tcopy: tapes have different data.\n");
- break;
- }
- eot = 0;
- }
- }
- exit(1);
-}
-
-void
-intr(signo)
- int signo __unused;
-{
- if (record) {
- if (record - lastrec > 1)
- fprintf(msg, "records %qu to %qu\n", lastrec, record);
- else
- fprintf(msg, "record %qu\n", lastrec);
- }
- fprintf(msg, "interrupt at file %d: record %qu\n", filen, record);
- fprintf(msg, "total length: %ju bytes\n", (uintmax_t)(tsize + size));
- exit(1);
-}
-
-void *
-getspace(blk)
- int blk;
-{
- void *bp;
-
- if ((bp = malloc((size_t)blk)) == NULL)
- errx(11, "no memory");
- return (bp);
-}
-
-void
-writeop(fd, type)
- int fd, type;
-{
- struct mtop op;
-
- op.mt_op = type;
- op.mt_count = (daddr_t)1;
- if (ioctl(fd, MTIOCTOP, (char *)&op) < 0)
- err(6, "tape op");
-}
-
-static void
-usage()
-{
- fprintf(stderr, "usage: tcopy [-cvx] [-s maxblk] [src [dest]]\n");
- exit(1);
-}
-
-void
-rewind_tape(int fd)
-{
- struct stat sp;
-
- if(fstat(fd, &sp))
- errx(12, "fstat in rewind");
-
- /*
- * don't want to do tape ioctl on regular files:
- */
- if( S_ISREG(sp.st_mode) ) {
- if( lseek(fd, 0, SEEK_SET) == -1 )
- errx(13, "lseek");
- } else
- /* assume its a tape */
- writeop(fd, MTREW);
-}
diff --git a/usr.bin/tee/Makefile b/usr.bin/tee/Makefile
deleted file mode 100644
index 920dd66..0000000
--- a/usr.bin/tee/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= tee
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/tee/tee.1 b/usr.bin/tee/tee.1
deleted file mode 100644
index fec2cd2..0000000
--- a/usr.bin/tee/tee.1
+++ /dev/null
@@ -1,86 +0,0 @@
-.\" Copyright (c) 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)tee.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd November 13, 2007
-.Dt TEE 1
-.Os
-.Sh NAME
-.Nm tee
-.Nd duplicate standard input
-.Sh SYNOPSIS
-.Nm
-.Op Fl ai
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility copies standard input to standard output,
-making a copy in zero or more files.
-The output is unbuffered.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl a
-Append the output to the files rather than
-overwriting them.
-.It Fl i
-Ignore the
-.Dv SIGINT
-signal.
-.El
-.Pp
-The following operands are available:
-.Bl -tag -width indent
-.It Ar file
-A pathname of an output
-.Ar file .
-.El
-.Pp
-The
-.Nm
-utility takes the default action for all signals,
-except in the event of the
-.Fl i
-option.
-.Sh EXIT STATUS
-.Ex -std
-.Sh STANDARDS
-The
-.Nm
-utility is expected to be
-.St -p1003.2
-compatible.
diff --git a/usr.bin/tee/tee.c b/usr.bin/tee/tee.c
deleted file mode 100644
index 123a2de..0000000
--- a/usr.bin/tee/tee.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1988, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)tee.c 8.1 (Berkeley) 6/6/93";
-#endif
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <err.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-typedef struct _list {
- struct _list *next;
- int fd;
- const char *name;
-} LIST;
-LIST *head;
-
-void add(int, const char *);
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- LIST *p;
- int n, fd, rval, wval;
- char *bp;
- int append, ch, exitval;
- char *buf;
-#define BSIZE (8 * 1024)
-
- append = 0;
- while ((ch = getopt(argc, argv, "ai")) != -1)
- switch((char)ch) {
- case 'a':
- append = 1;
- break;
- case 'i':
- (void)signal(SIGINT, SIG_IGN);
- break;
- case '?':
- default:
- usage();
- }
- argv += optind;
- argc -= optind;
-
- if ((buf = malloc(BSIZE)) == NULL)
- err(1, "malloc");
-
- add(STDOUT_FILENO, "stdout");
-
- for (exitval = 0; *argv; ++argv)
- if ((fd = open(*argv, append ? O_WRONLY|O_CREAT|O_APPEND :
- O_WRONLY|O_CREAT|O_TRUNC, DEFFILEMODE)) < 0) {
- warn("%s", *argv);
- exitval = 1;
- } else
- add(fd, *argv);
-
- while ((rval = read(STDIN_FILENO, buf, BSIZE)) > 0)
- for (p = head; p; p = p->next) {
- n = rval;
- bp = buf;
- do {
- if ((wval = write(p->fd, bp, n)) == -1) {
- warn("%s", p->name);
- exitval = 1;
- break;
- }
- bp += wval;
- } while (n -= wval);
- }
- if (rval < 0)
- err(1, "read");
- exit(exitval);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "usage: tee [-ai] [file ...]\n");
- exit(1);
-}
-
-void
-add(int fd, const char *name)
-{
- LIST *p;
-
- if ((p = malloc(sizeof(LIST))) == NULL)
- err(1, "malloc");
- p->fd = fd;
- p->name = name;
- p->next = head;
- head = p;
-}
diff --git a/usr.bin/telnet/Makefile b/usr.bin/telnet/Makefile
deleted file mode 100644
index ee112ff..0000000
--- a/usr.bin/telnet/Makefile
+++ /dev/null
@@ -1,50 +0,0 @@
-# $FreeBSD$
-
-.include <bsd.own.mk>
-
-TELNETDIR= ${.CURDIR}/../../contrib/telnet
-.PATH: ${TELNETDIR}/telnet
-
-PROG= telnet
-
-SRCS= commands.c main.c network.c ring.c sys_bsd.c \
- telnet.c terminal.c utilities.c
-
-CFLAGS+= -DKLUDGELINEMODE -DUSE_TERMIO -DENV_HACK -DOPIE \
- -I${TELNETDIR} -I${TELNETDIR}/libtelnet/
-
-.if ${MK_INET6_SUPPORT} != "no"
-CFLAGS+= -DINET6
-.endif
-
-LIBTELNET= ${.OBJDIR}/../../lib/libtelnet/libtelnet.a
-
-DPADD= ${LIBTERMCAP} ${LIBTELNET}
-LDADD= -ltermcap ${LIBTELNET}
-
-.if !defined(RELEASE_CRUNCH)
-CFLAGS+= -DIPSEC
-DPADD+= ${LIBIPSEC}
-LDADD+= -lipsec
-.else
-.PATH: ${TELNETDIR}/libtelnet
-SRCS+= genget.c getent.c misc.c
-CFLAGS+= -DHAS_CGETENT
-.endif
-
-.if !defined(RELEASE_CRUNCH)
-.if ${MK_OPENSSL} != "no"
-SRCS+= authenc.c
-CFLAGS+= -DENCRYPTION -DAUTHENTICATION -DIPSEC
-DPADD+= ${LIBMP} ${LIBCRYPTO} ${LIBCRYPT} ${LIBIPSEC} ${LIBPAM}
-LDADD+= -lmp -lcrypto -lcrypt -lipsec ${MINUSLPAM}
-.endif
-
-.if ${MK_KERBEROS_SUPPORT} != "no"
-CFLAGS+= -DKRB5 -DFORWARD -Dnet_write=telnet_net_write
-DPADD+= ${LIBKRB5} ${LIBHX509} ${LIBASN1} ${LIBCOM_ERR} ${LIBROKEN}
-LDADD+= -lkrb5 -lhx509 -lasn1 -lcom_err -lroken
-.endif
-.endif
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/tftp/Makefile b/usr.bin/tftp/Makefile
deleted file mode 100644
index a51afed..0000000
--- a/usr.bin/tftp/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= tftp
-SRCS= main.c tftp.c tftpsubs.c
-DPADD= ${LIBEDIT} ${LIBTERMCAP}
-LDADD= -ledit -ltermcap
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/tftp/extern.h b/usr.bin/tftp/extern.h
deleted file mode 100644
index a9ba154..0000000
--- a/usr.bin/tftp/extern.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-void recvfile(int, const char *, const char *);
-void xmitfile(int, const char *, const char *);
diff --git a/usr.bin/tftp/main.c b/usr.bin/tftp/main.c
deleted file mode 100644
index f01d3d8..0000000
--- a/usr.bin/tftp/main.c
+++ /dev/null
@@ -1,755 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1983, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/* Many bug fixes are from Jim Guyton <guyton@rand-unix> */
-
-/*
- * TFTP User Program -- Command Interface.
- */
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/file.h>
-#include <sys/param.h>
-
-#include <netinet/in.h>
-
-#include <arpa/inet.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <histedit.h>
-#include <netdb.h>
-#include <setjmp.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-#define MAXLINE 200
-#define TIMEOUT 5 /* secs between rexmt's */
-
-struct sockaddr_storage peeraddr;
-int f;
-int trace;
-int verbose;
-int connected;
-char mode[32];
-char line[MAXLINE];
-int margc;
-#define MAX_MARGV 20
-char *margv[MAX_MARGV];
-jmp_buf toplevel;
-volatile int txrx_error;
-
-void get(int, char **);
-void help(int, char **);
-void intr(int);
-void modecmd(int, char **);
-void put(int, char **);
-void quit(int, char **);
-void setascii(int, char **);
-void setbinary(int, char **);
-void setpeer0(char *, const char *);
-void setpeer(int, char **);
-void setrexmt(int, char **);
-void settimeout(int, char **);
-void settrace(int, char **);
-void setverbose(int, char **);
-void status(int, char **);
-
-static void command(void) __dead2;
-static const char *command_prompt(void);
-
-static void getusage(const char *);
-static void makeargv(void);
-static void putusage(const char *);
-static void settftpmode(const char *);
-
-char *tail(char *);
-struct cmd *getcmd(char *);
-
-#define HELPINDENT (sizeof("connect"))
-
-struct cmd {
- const char *name;
- char *help;
- void (*handler)(int, char **);
-};
-
-char vhelp[] = "toggle verbose mode";
-char thelp[] = "toggle packet tracing";
-char chelp[] = "connect to remote tftp";
-char qhelp[] = "exit tftp";
-char hhelp[] = "print help information";
-char shelp[] = "send file";
-char rhelp[] = "receive file";
-char mhelp[] = "set file transfer mode";
-char sthelp[] = "show current status";
-char xhelp[] = "set per-packet retransmission timeout";
-char ihelp[] = "set total retransmission timeout";
-char ashelp[] = "set mode to netascii";
-char bnhelp[] = "set mode to octet";
-
-struct cmd cmdtab[] = {
- { "connect", chelp, setpeer },
- { "mode", mhelp, modecmd },
- { "put", shelp, put },
- { "get", rhelp, get },
- { "quit", qhelp, quit },
- { "verbose", vhelp, setverbose },
- { "trace", thelp, settrace },
- { "status", sthelp, status },
- { "binary", bnhelp, setbinary },
- { "ascii", ashelp, setascii },
- { "rexmt", xhelp, setrexmt },
- { "timeout", ihelp, settimeout },
- { "?", hhelp, help },
- { NULL, NULL, NULL }
-};
-
-int
-main(int argc, char *argv[])
-{
- f = -1;
- strcpy(mode, "netascii");
- signal(SIGINT, intr);
- if (argc > 1) {
- if (setjmp(toplevel) != 0)
- exit(txrx_error);
- setpeer(argc, argv);
- }
- if (setjmp(toplevel) != 0)
- (void)putchar('\n');
- command();
-}
-
-char hostname[MAXHOSTNAMELEN];
-
-void
-setpeer0(char *host, const char *port)
-{
- struct addrinfo hints, *res0, *res;
- int error;
- struct sockaddr_storage ss;
- const char *cause = "unknown";
-
- if (connected) {
- close(f);
- f = -1;
- }
- connected = 0;
-
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = PF_UNSPEC;
- hints.ai_socktype = SOCK_DGRAM;
- hints.ai_protocol = IPPROTO_UDP;
- hints.ai_flags = AI_CANONNAME;
- if (!port)
- port = "tftp";
- error = getaddrinfo(host, port, &hints, &res0);
- if (error) {
- warnx("%s", gai_strerror(error));
- return;
- }
-
- for (res = res0; res; res = res->ai_next) {
- if (res->ai_addrlen > sizeof(peeraddr))
- continue;
- f = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
- if (f < 0) {
- cause = "socket";
- continue;
- }
-
- memset(&ss, 0, sizeof(ss));
- ss.ss_family = res->ai_family;
- ss.ss_len = res->ai_addrlen;
- if (bind(f, (struct sockaddr *)&ss, ss.ss_len) < 0) {
- cause = "bind";
- close(f);
- f = -1;
- continue;
- }
-
- break;
- }
-
- if (f < 0)
- warn("%s", cause);
- else {
- /* res->ai_addr <= sizeof(peeraddr) is guaranteed */
- memcpy(&peeraddr, res->ai_addr, res->ai_addrlen);
- if (res->ai_canonname) {
- (void) strlcpy(hostname, res->ai_canonname,
- sizeof(hostname));
- } else
- (void) strlcpy(hostname, host, sizeof(hostname));
- connected = 1;
- }
-
- freeaddrinfo(res0);
-}
-
-void
-setpeer(int argc, char *argv[])
-{
-
- if (argc < 2) {
- strcpy(line, "Connect ");
- printf("(to) ");
- fgets(&line[strlen(line)], sizeof line - strlen(line), stdin);
- makeargv();
- argc = margc;
- argv = margv;
- }
- if ((argc < 2) || (argc > 3)) {
- printf("usage: %s [host [port]]\n", argv[0]);
- return;
- }
- if (argc == 3)
- setpeer0(argv[1], argv[2]);
- else
- setpeer0(argv[1], NULL);
-}
-
-struct modes {
- const char *m_name;
- const char *m_mode;
-} modes[] = {
- { "ascii", "netascii" },
- { "netascii", "netascii" },
- { "binary", "octet" },
- { "image", "octet" },
- { "octet", "octet" },
-/* { "mail", "mail" }, */
- { 0, 0 }
-};
-
-void
-modecmd(int argc, char *argv[])
-{
- struct modes *p;
- const char *sep;
-
- if (argc < 2) {
- printf("Using %s mode to transfer files.\n", mode);
- return;
- }
- if (argc == 2) {
- for (p = modes; p->m_name; p++)
- if (strcmp(argv[1], p->m_name) == 0)
- break;
- if (p->m_name) {
- settftpmode(p->m_mode);
- return;
- }
- printf("%s: unknown mode\n", argv[1]);
- /* drop through and print usage message */
- }
-
- printf("usage: %s [", argv[0]);
- sep = " ";
- for (p = modes; p->m_name; p++) {
- printf("%s%s", sep, p->m_name);
- if (*sep == ' ')
- sep = " | ";
- }
- printf(" ]\n");
- return;
-}
-
-void
-setbinary(int argc __unused, char *argv[] __unused)
-{
-
- settftpmode("octet");
-}
-
-void
-setascii(int argc __unused, char *argv[] __unused)
-{
-
- settftpmode("netascii");
-}
-
-static void
-settftpmode(const char *newmode)
-{
- strcpy(mode, newmode);
- if (verbose)
- printf("mode set to %s\n", mode);
-}
-
-
-/*
- * Send file(s).
- */
-void
-put(int argc, char *argv[])
-{
- int fd;
- int n;
- char *cp, *targ;
-
- if (argc < 2) {
- strcpy(line, "send ");
- printf("(file) ");
- fgets(&line[strlen(line)], sizeof line - strlen(line), stdin);
- makeargv();
- argc = margc;
- argv = margv;
- }
- if (argc < 2) {
- putusage(argv[0]);
- return;
- }
- targ = argv[argc - 1];
- if (rindex(argv[argc - 1], ':')) {
- char *lcp;
-
- for (n = 1; n < argc - 1; n++)
- if (index(argv[n], ':')) {
- putusage(argv[0]);
- return;
- }
- lcp = argv[argc - 1];
- targ = rindex(lcp, ':');
- *targ++ = 0;
- if (lcp[0] == '[' && lcp[strlen(lcp) - 1] == ']') {
- lcp[strlen(lcp) - 1] = '\0';
- lcp++;
- }
- setpeer0(lcp, NULL);
- }
- if (!connected) {
- printf("No target machine specified.\n");
- return;
- }
- if (argc < 4) {
- cp = argc == 2 ? tail(targ) : argv[1];
- fd = open(cp, O_RDONLY);
- if (fd < 0) {
- warn("%s", cp);
- return;
- }
- if (verbose)
- printf("putting %s to %s:%s [%s]\n",
- cp, hostname, targ, mode);
- xmitfile(fd, targ, mode);
- return;
- }
- /* this assumes the target is a directory */
- /* on a remote unix system. hmmmm. */
- cp = index(targ, '\0');
- *cp++ = '/';
- for (n = 1; n < argc - 1; n++) {
- strcpy(cp, tail(argv[n]));
- fd = open(argv[n], O_RDONLY);
- if (fd < 0) {
- warn("%s", argv[n]);
- continue;
- }
- if (verbose)
- printf("putting %s to %s:%s [%s]\n",
- argv[n], hostname, targ, mode);
- xmitfile(fd, targ, mode);
- }
-}
-
-static void
-putusage(const char *s)
-{
- printf("usage: %s file [[host:]remotename]\n", s);
- printf(" %s file1 file2 ... fileN [[host:]remote-directory]\n", s);
-}
-
-/*
- * Receive file(s).
- */
-void
-get(int argc, char *argv[])
-{
- int fd;
- int n;
- char *cp;
- char *src;
-
- if (argc < 2) {
- strcpy(line, "get ");
- printf("(files) ");
- fgets(&line[strlen(line)], sizeof line - strlen(line), stdin);
- makeargv();
- argc = margc;
- argv = margv;
- }
- if (argc < 2) {
- getusage(argv[0]);
- return;
- }
- if (!connected) {
- for (n = 1; n < argc ; n++)
- if (rindex(argv[n], ':') == 0) {
- getusage(argv[0]);
- return;
- }
- }
- for (n = 1; n < argc ; n++) {
- src = rindex(argv[n], ':');
- if (src == NULL)
- src = argv[n];
- else {
- char *lcp;
-
- *src++ = 0;
- lcp = argv[n];
- if (lcp[0] == '[' && lcp[strlen(lcp) - 1] == ']') {
- lcp[strlen(lcp) - 1] = '\0';
- lcp++;
- }
- setpeer0(lcp, NULL);
- if (!connected)
- continue;
- }
- if (argc < 4) {
- cp = argc == 3 ? argv[2] : tail(src);
- fd = creat(cp, 0644);
- if (fd < 0) {
- warn("%s", cp);
- return;
- }
- if (verbose)
- printf("getting from %s:%s to %s [%s]\n",
- hostname, src, cp, mode);
- recvfile(fd, src, mode);
- break;
- }
- cp = tail(src); /* new .. jdg */
- fd = creat(cp, 0644);
- if (fd < 0) {
- warn("%s", cp);
- continue;
- }
- if (verbose)
- printf("getting from %s:%s to %s [%s]\n",
- hostname, src, cp, mode);
- recvfile(fd, src, mode);
- }
-}
-
-static void
-getusage(const char *s)
-{
- printf("usage: %s [host:]file [localname]\n", s);
- printf(" %s [host1:]file1 [host2:]file2 ... [hostN:]fileN\n", s);
-}
-
-int rexmtval = TIMEOUT;
-
-void
-setrexmt(int argc, char *argv[])
-{
- int t;
-
- if (argc < 2) {
- strcpy(line, "Rexmt-timeout ");
- printf("(value) ");
- fgets(&line[strlen(line)], sizeof line - strlen(line), stdin);
- makeargv();
- argc = margc;
- argv = margv;
- }
- if (argc != 2) {
- printf("usage: %s value\n", argv[0]);
- return;
- }
- t = atoi(argv[1]);
- if (t < 0)
- printf("%s: bad value\n", argv[1]);
- else
- rexmtval = t;
-}
-
-int maxtimeout = 5 * TIMEOUT;
-
-void
-settimeout(int argc, char *argv[])
-{
- int t;
-
- if (argc < 2) {
- strcpy(line, "Maximum-timeout ");
- printf("(value) ");
- fgets(&line[strlen(line)], sizeof line - strlen(line), stdin);
- makeargv();
- argc = margc;
- argv = margv;
- }
- if (argc != 2) {
- printf("usage: %s value\n", argv[0]);
- return;
- }
- t = atoi(argv[1]);
- if (t < 0)
- printf("%s: bad value\n", argv[1]);
- else
- maxtimeout = t;
-}
-
-void
-status(int argc __unused, char *argv[] __unused)
-{
- if (connected)
- printf("Connected to %s.\n", hostname);
- else
- printf("Not connected.\n");
- printf("Mode: %s Verbose: %s Tracing: %s\n", mode,
- verbose ? "on" : "off", trace ? "on" : "off");
- printf("Rexmt-interval: %d seconds, Max-timeout: %d seconds\n",
- rexmtval, maxtimeout);
-}
-
-void
-intr(int dummy __unused)
-{
-
- signal(SIGALRM, SIG_IGN);
- alarm(0);
- longjmp(toplevel, -1);
-}
-
-char *
-tail(char *filename)
-{
- char *s;
-
- while (*filename) {
- s = rindex(filename, '/');
- if (s == NULL)
- break;
- if (s[1])
- return (s + 1);
- *s = '\0';
- }
- return (filename);
-}
-
-static const char *
-command_prompt(void)
-{
-
- return ("tftp> ");
-}
-
-/*
- * Command parser.
- */
-static void
-command(void)
-{
- HistEvent he;
- struct cmd *c;
- static EditLine *el;
- static History *hist;
- const char *bp;
- char *cp;
- int len, num, vrbose;
-
- vrbose = isatty(0);
- if (vrbose) {
- el = el_init("tftp", stdin, stdout, stderr);
- hist = history_init();
- history(hist, &he, H_SETSIZE, 100);
- el_set(el, EL_HIST, history, hist);
- el_set(el, EL_EDITOR, "emacs");
- el_set(el, EL_PROMPT, command_prompt);
- el_set(el, EL_SIGNAL, 1);
- el_source(el, NULL);
- }
- for (;;) {
- if (vrbose) {
- if ((bp = el_gets(el, &num)) == NULL || num == 0)
- exit(0);
- len = (num > MAXLINE) ? MAXLINE : num;
- memcpy(line, bp, len);
- line[len] = '\0';
- history(hist, &he, H_ENTER, bp);
- } else {
- if (fgets(line, sizeof line , stdin) == 0) {
- if (feof(stdin)) {
- exit(txrx_error);
- } else {
- continue;
- }
- }
- }
- if ((cp = strchr(line, '\n')))
- *cp = '\0';
- if (line[0] == 0)
- continue;
- makeargv();
- if (margc == 0)
- continue;
- c = getcmd(margv[0]);
- if (c == (struct cmd *)-1) {
- printf("?Ambiguous command\n");
- continue;
- }
- if (c == 0) {
- printf("?Invalid command\n");
- continue;
- }
- (*c->handler)(margc, margv);
- }
-}
-
-struct cmd *
-getcmd(char *name)
-{
- const char *p, *q;
- struct cmd *c, *found;
- int nmatches, longest;
-
- longest = 0;
- nmatches = 0;
- found = 0;
- for (c = cmdtab; (p = c->name) != NULL; c++) {
- for (q = name; *q == *p++; q++)
- if (*q == 0) /* exact match? */
- return (c);
- if (!*q) { /* the name was a prefix */
- if (q - name > longest) {
- longest = q - name;
- nmatches = 1;
- found = c;
- } else if (q - name == longest)
- nmatches++;
- }
- }
- if (nmatches > 1)
- return ((struct cmd *)-1);
- return (found);
-}
-
-/*
- * Slice a string up into argc/argv.
- */
-static void
-makeargv(void)
-{
- char *cp;
- char **argp = margv;
-
- margc = 0;
- if ((cp = strchr(line, '\n')))
- *cp = '\0';
- for (cp = line; margc < MAX_MARGV - 1 && *cp;) {
- while (isspace(*cp))
- cp++;
- if (*cp == '\0')
- break;
- *argp++ = cp;
- margc += 1;
- while (*cp != '\0' && !isspace(*cp))
- cp++;
- if (*cp == '\0')
- break;
- *cp++ = '\0';
- }
- *argp++ = 0;
-}
-
-void
-quit(int argc __unused, char *argv[] __unused)
-{
- exit(txrx_error);
-}
-
-/*
- * Help command.
- */
-void
-help(int argc, char *argv[])
-{
- struct cmd *c;
-
- if (argc == 1) {
- printf("Commands may be abbreviated. Commands are:\n\n");
- for (c = cmdtab; c->name; c++)
- printf("%-*s\t%s\n", (int)HELPINDENT, c->name, c->help);
- return;
- }
- while (--argc > 0) {
- char *arg;
- arg = *++argv;
- c = getcmd(arg);
- if (c == (struct cmd *)-1)
- printf("?Ambiguous help command %s\n", arg);
- else if (c == (struct cmd *)0)
- printf("?Invalid help command %s\n", arg);
- else
- printf("%s\n", c->help);
- }
-}
-
-void
-settrace(int argc __unused, char **argv __unused)
-{
- trace = !trace;
- printf("Packet tracing %s.\n", trace ? "on" : "off");
-}
-
-void
-setverbose(int argc __unused, char **argv __unused)
-{
- verbose = !verbose;
- printf("Verbose mode %s.\n", verbose ? "on" : "off");
-}
diff --git a/usr.bin/tftp/tftp.1 b/usr.bin/tftp/tftp.1
deleted file mode 100644
index 8924eb5..0000000
--- a/usr.bin/tftp/tftp.1
+++ /dev/null
@@ -1,194 +0,0 @@
-.\" Copyright (c) 1990, 1993, 1994
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)tftp.1 8.2 (Berkeley) 4/18/94
-.\" $FreeBSD$
-.\"
-.Dd October 1, 2003
-.Dt TFTP 1
-.Os
-.Sh NAME
-.Nm tftp
-.Nd "trivial file transfer program"
-.Sh SYNOPSIS
-.Nm
-.Op Ar host Op Ar port
-.Sh DESCRIPTION
-The
-.Nm
-utility is the user interface to the Internet
-.Tn TFTP
-(Trivial File Transfer Protocol),
-which allows users to transfer files to and from a remote machine.
-The remote
-.Ar host
-may be specified on the command line, in which case
-.Nm
-uses
-.Ar host
-as the default host for future transfers (see the
-.Ic connect
-command below).
-.Sh COMMANDS
-Once
-.Nm
-is running, it issues the prompt
-.Dq Li "tftp> "
-and recognizes the following commands:
-.Pp
-.Bl -tag -width ".Ic verbose" -compact
-.It Ic \&? Ar command-name ...
-Print help information.
-.Pp
-.It Ic ascii
-Shorthand for
-.Ic mode Cm ascii .
-.Pp
-.It Ic binary
-Shorthand for
-.Ic mode Cm binary .
-.Pp
-.It Ic connect Ar host Op Ar port
-Set the
-.Ar host
-(and optionally
-.Ar port )
-for transfers.
-Note that the
-.Tn TFTP
-protocol, unlike the
-.Tn FTP
-protocol,
-does not maintain connections between transfers; thus, the
-.Ic connect
-command does not actually create a connection,
-but merely remembers what host is to be used for transfers.
-You do not have to use the
-.Ic connect
-command; the remote host can be specified as part of the
-.Ic get
-or
-.Ic put
-commands.
-.Pp
-.It Ic get Oo Ar host : Oc Ns Ar file Op Ar localname
-.It Ic get Xo
-.Oo Ar host1 : Oc Ns Ar file1
-.Oo Ar host2 : Oc Ns Ar file2 ...
-.Oo Ar hostN : Oc Ns Ar fileN
-.Xc
-Get one or more files from the remote host.
-When using the
-.Ar host
-argument, the
-.Ar host
-will be used as default host for future transfers.
-If
-.Ar localname
-is specified, the file is stored locally as
-.Ar localname ,
-otherwise the original filename is used.
-Note that it is not possible to download two files at a time, only
-one, three, or more than three files, at a time.
-.Pp
-To specify an IPv6 numeric address for a host, wrap it using square
-brackets like
-.Dq Li [3ffe:2900:e00c:ffee::1234] : Ns Ar file
-to disambiguate the
-colons used in the IPv6 address from the colon separating the host and
-the filename.
-.Pp
-.It Ic mode Ar transfer-mode
-Set the mode for transfers;
-.Ar transfer-mode
-may be one of
-.Cm ascii
-or
-.Cm binary .
-The default is
-.Cm ascii .
-.Pp
-.It Ic put Ar file Op Oo Ar host : Oc Ns Ar remotename
-.It Ic put Ar file1 file2 ... fileN Op Oo Ar host : Oc Ns Ar remote-directory
-Put a file or set of files to the remote host.
-When
-.Ar remotename
-is specified, the file is stored remotely as
-.Ar remotename ,
-otherwise the original filename is used.
-If the
-.Ar remote-directory
-argument is used, the remote host is assumed to be a
-.Ux
-machine.
-To specify an IPv6 numeric address for a
-.Ar host ,
-see the example under the
-.Ic get
-command.
-.Pp
-.It Ic quit
-Exit
-.Nm .
-An end of file also exits.
-.Pp
-.It Ic rexmt Ar retransmission-timeout
-Set the per-packet retransmission timeout, in seconds.
-.Pp
-.It Ic status
-Show current status.
-.Pp
-.It Ic timeout Ar total-transmission-timeout
-Set the total transmission timeout, in seconds.
-.Pp
-.It Ic trace
-Toggle packet tracing.
-.Pp
-.It Ic verbose
-Toggle verbose mode.
-.El
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.3 .
-.Sh BUGS
-Because there is no user-login or validation within
-the
-.Tn TFTP
-protocol, the remote site will probably have some
-sort of file-access restrictions in place.
-The
-exact methods are specific to each site and therefore
-difficult to document here.
-.Pp
-Files larger than 33488896 octets (65535 blocks) cannot be transferred
-without client and server supporting blocksize negotiation (RFC1783).
diff --git a/usr.bin/tftp/tftp.c b/usr.bin/tftp/tftp.c
deleted file mode 100644
index 2f032df..0000000
--- a/usr.bin/tftp/tftp.c
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)tftp.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/* Many bug fixes are from Jim Guyton <guyton@rand-unix> */
-
-/*
- * TFTP User Program -- Protocol Machines
- */
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-
-#include <netinet/in.h>
-
-#include <arpa/inet.h>
-#include <arpa/tftp.h>
-
-#include <err.h>
-#include <errno.h>
-#include <setjmp.h>
-#include <signal.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <netdb.h>
-
-#include "extern.h"
-#include "tftpsubs.h"
-
-extern struct sockaddr_storage peeraddr; /* filled in by main */
-extern int f; /* the opened socket */
-extern int trace;
-extern int verbose;
-extern int rexmtval;
-extern int maxtimeout;
-extern volatile int txrx_error;
-
-#define PKTSIZE SEGSIZE+4
-char ackbuf[PKTSIZE];
-int timeout;
-jmp_buf toplevel;
-jmp_buf timeoutbuf;
-
-static void nak(int, const struct sockaddr *);
-static int makerequest(int, const char *, struct tftphdr *, const char *);
-static void printstats(const char *, unsigned long);
-static void startclock(void);
-static void stopclock(void);
-static void timer(int);
-static void tpacket(const char *, struct tftphdr *, int);
-static int cmpport(const struct sockaddr *, const struct sockaddr *);
-
-/*
- * Send the requested file.
- */
-void
-xmitfile(int fd, const char *name, const char *mode)
-{
- struct tftphdr *ap; /* data and ack packets */
- struct tftphdr *dp;
- int n;
- volatile unsigned short block;
- volatile int size, convert;
- volatile unsigned long amount;
- struct sockaddr_storage from;
- socklen_t fromlen;
- FILE *file;
- struct sockaddr_storage peer;
- struct sockaddr_storage serv; /* valid server port number */
-
- startclock(); /* start stat's clock */
- dp = r_init(); /* reset fillbuf/read-ahead code */
- ap = (struct tftphdr *)ackbuf;
- file = fdopen(fd, "r");
- convert = !strcmp(mode, "netascii");
- block = 0;
- amount = 0;
- memcpy(&peer, &peeraddr, peeraddr.ss_len);
- memset(&serv, 0, sizeof(serv));
-
- signal(SIGALRM, timer);
- do {
- if (block == 0)
- size = makerequest(WRQ, name, dp, mode) - 4;
- else {
- /* size = read(fd, dp->th_data, SEGSIZE); */
- size = readit(file, &dp, convert);
- if (size < 0) {
- nak(errno + 100, (struct sockaddr *)&peer);
- break;
- }
- dp->th_opcode = htons((u_short)DATA);
- dp->th_block = htons((u_short)block);
- }
- timeout = 0;
- (void) setjmp(timeoutbuf);
-send_data:
- if (trace)
- tpacket("sent", dp, size + 4);
- n = sendto(f, dp, size + 4, 0,
- (struct sockaddr *)&peer, peer.ss_len);
- if (n != size + 4) {
- warn("sendto");
- goto abort;
- }
- read_ahead(file, convert);
- for ( ; ; ) {
- alarm(rexmtval);
- do {
- fromlen = sizeof(from);
- n = recvfrom(f, ackbuf, sizeof(ackbuf), 0,
- (struct sockaddr *)&from, &fromlen);
- } while (n <= 0);
- alarm(0);
- if (n < 0) {
- warn("recvfrom");
- goto abort;
- }
- if (!serv.ss_family)
- serv = from;
- else if (!cmpport((struct sockaddr *)&serv,
- (struct sockaddr *)&from)) {
- warn("server port mismatch");
- goto abort;
- }
- peer = from;
- if (trace)
- tpacket("received", ap, n);
- /* should verify packet came from server */
- ap->th_opcode = ntohs(ap->th_opcode);
- ap->th_block = ntohs(ap->th_block);
- if (ap->th_opcode == ERROR) {
- printf("Error code %d: %s\n", ap->th_code,
- ap->th_msg);
- txrx_error = 1;
- goto abort;
- }
- if (ap->th_opcode == ACK) {
- int j;
-
- if (ap->th_block == block) {
- break;
- }
- /* On an error, try to synchronize
- * both sides.
- */
- j = synchnet(f);
- if (j && trace) {
- printf("discarded %d packets\n",
- j);
- }
- if (ap->th_block == (block-1)) {
- goto send_data;
- }
- }
- }
- if (block > 0)
- amount += size;
- block++;
- } while (size == SEGSIZE || block == 1);
-abort:
- fclose(file);
- stopclock();
- if (amount > 0)
- printstats("Sent", amount);
- txrx_error = 1;
-}
-
-/*
- * Receive a file.
- */
-void
-recvfile(int fd, const char *name, const char *mode)
-{
- struct tftphdr *ap;
- struct tftphdr *dp;
- int n;
- volatile unsigned short block;
- volatile int size, firsttrip;
- volatile unsigned long amount;
- struct sockaddr_storage from;
- socklen_t fromlen;
- FILE *file;
- volatile int convert; /* true if converting crlf -> lf */
- struct sockaddr_storage peer;
- struct sockaddr_storage serv; /* valid server port number */
-
- startclock();
- dp = w_init();
- ap = (struct tftphdr *)ackbuf;
- file = fdopen(fd, "w");
- convert = !strcmp(mode, "netascii");
- block = 1;
- firsttrip = 1;
- amount = 0;
- memcpy(&peer, &peeraddr, peeraddr.ss_len);
- memset(&serv, 0, sizeof(serv));
-
- signal(SIGALRM, timer);
- do {
- if (firsttrip) {
- size = makerequest(RRQ, name, ap, mode);
- firsttrip = 0;
- } else {
- ap->th_opcode = htons((u_short)ACK);
- ap->th_block = htons((u_short)(block));
- size = 4;
- block++;
- }
- timeout = 0;
- (void) setjmp(timeoutbuf);
-send_ack:
- if (trace)
- tpacket("sent", ap, size);
- if (sendto(f, ackbuf, size, 0, (struct sockaddr *)&peer,
- peer.ss_len) != size) {
- alarm(0);
- warn("sendto");
- goto abort;
- }
- write_behind(file, convert);
- for ( ; ; ) {
- alarm(rexmtval);
- do {
- fromlen = sizeof(from);
- n = recvfrom(f, dp, PKTSIZE, 0,
- (struct sockaddr *)&from, &fromlen);
- } while (n <= 0);
- alarm(0);
- if (n < 0) {
- warn("recvfrom");
- goto abort;
- }
- if (!serv.ss_family)
- serv = from;
- else if (!cmpport((struct sockaddr *)&serv,
- (struct sockaddr *)&from)) {
- warn("server port mismatch");
- goto abort;
- }
- peer = from;
- if (trace)
- tpacket("received", dp, n);
- /* should verify client address */
- dp->th_opcode = ntohs(dp->th_opcode);
- dp->th_block = ntohs(dp->th_block);
- if (dp->th_opcode == ERROR) {
- printf("Error code %d: %s\n", dp->th_code,
- dp->th_msg);
- txrx_error = 1;
- goto abort;
- }
- if (dp->th_opcode == DATA) {
- int j;
-
- if (dp->th_block == block) {
- break; /* have next packet */
- }
- /* On an error, try to synchronize
- * both sides.
- */
- j = synchnet(f);
- if (j && trace) {
- printf("discarded %d packets\n", j);
- }
- if (dp->th_block == (block-1)) {
- goto send_ack; /* resend ack */
- }
- }
- }
- /* size = write(fd, dp->th_data, n - 4); */
- size = writeit(file, &dp, n - 4, convert);
- if (size < 0) {
- nak(errno + 100, (struct sockaddr *)&peer);
- break;
- }
- amount += size;
- } while (size == SEGSIZE);
-abort: /* ok to ack, since user */
- ap->th_opcode = htons((u_short)ACK); /* has seen err msg */
- ap->th_block = htons((u_short)block);
- (void) sendto(f, ackbuf, 4, 0, (struct sockaddr *)&peer,
- peer.ss_len);
- write_behind(file, convert); /* flush last buffer */
- fclose(file);
- stopclock();
- if (amount > 0)
- printstats("Received", amount);
- txrx_error = 1;
-}
-
-static int
-makerequest(int request, const char *name, struct tftphdr *tp, const char *mode)
-{
- char *cp;
-
- tp->th_opcode = htons((u_short)request);
- cp = tp->th_stuff;
- strcpy(cp, name);
- cp += strlen(name);
- *cp++ = '\0';
- strcpy(cp, mode);
- cp += strlen(mode);
- *cp++ = '\0';
- return (cp - (char *)tp);
-}
-
-struct errmsg {
- int e_code;
- const char *e_msg;
-} errmsgs[] = {
- { EUNDEF, "Undefined error code" },
- { ENOTFOUND, "File not found" },
- { EACCESS, "Access violation" },
- { ENOSPACE, "Disk full or allocation exceeded" },
- { EBADOP, "Illegal TFTP operation" },
- { EBADID, "Unknown transfer ID" },
- { EEXISTS, "File already exists" },
- { ENOUSER, "No such user" },
- { -1, 0 }
-};
-
-/*
- * Send a nak packet (error message).
- * Error code passed in is one of the
- * standard TFTP codes, or a UNIX errno
- * offset by 100.
- */
-static void
-nak(int error, const struct sockaddr *peer)
-{
- struct errmsg *pe;
- struct tftphdr *tp;
- int length;
-
- tp = (struct tftphdr *)ackbuf;
- tp->th_opcode = htons((u_short)ERROR);
- tp->th_code = htons((u_short)error);
- for (pe = errmsgs; pe->e_code >= 0; pe++)
- if (pe->e_code == error)
- break;
- if (pe->e_code < 0) {
- pe->e_msg = strerror(error - 100);
- tp->th_code = EUNDEF;
- }
- strcpy(tp->th_msg, pe->e_msg);
- length = strlen(pe->e_msg) + 4;
- if (trace)
- tpacket("sent", tp, length);
- if (sendto(f, ackbuf, length, 0, peer, peer->sa_len) != length)
- warn("nak");
-}
-
-static void
-tpacket(const char *s, struct tftphdr *tp, int n)
-{
- static const char *opcodes[] =
- { "#0", "RRQ", "WRQ", "DATA", "ACK", "ERROR" };
- char *cp, *file;
- u_short op = ntohs(tp->th_opcode);
-
- if (op < RRQ || op > ERROR)
- printf("%s opcode=%x ", s, op);
- else
- printf("%s %s ", s, opcodes[op]);
- switch (op) {
-
- case RRQ:
- case WRQ:
- n -= 2;
- file = cp = tp->th_stuff;
- cp = index(cp, '\0');
- printf("<file=%s, mode=%s>\n", file, cp + 1);
- break;
-
- case DATA:
- printf("<block=%d, %d bytes>\n", ntohs(tp->th_block), n - 4);
- break;
-
- case ACK:
- printf("<block=%d>\n", ntohs(tp->th_block));
- break;
-
- case ERROR:
- printf("<code=%d, msg=%s>\n", ntohs(tp->th_code), tp->th_msg);
- break;
- }
-}
-
-struct timeval tstart;
-struct timeval tstop;
-
-static void
-startclock(void)
-{
-
- (void)gettimeofday(&tstart, NULL);
-}
-
-static void
-stopclock(void)
-{
-
- (void)gettimeofday(&tstop, NULL);
-}
-
-static void
-printstats(const char *direction, unsigned long amount)
-{
- double delta;
- /* compute delta in 1/10's second units */
- delta = ((tstop.tv_sec*10.)+(tstop.tv_usec/100000)) -
- ((tstart.tv_sec*10.)+(tstart.tv_usec/100000));
- delta = delta/10.; /* back to seconds */
- printf("%s %ld bytes in %.1f seconds", direction, amount, delta);
- if (verbose)
- printf(" [%.0f bits/sec]", (amount*8.)/delta);
- putchar('\n');
-}
-
-static void
-timer(int sig __unused)
-{
-
- timeout += rexmtval;
- if (timeout >= maxtimeout) {
- printf("Transfer timed out.\n");
- longjmp(toplevel, -1);
- }
- txrx_error = 1;
- longjmp(timeoutbuf, 1);
-}
-
-static int
-cmpport(const struct sockaddr *sa, const struct sockaddr *sb)
-{
- char a[NI_MAXSERV], b[NI_MAXSERV];
-
- if (getnameinfo(sa, sa->sa_len, NULL, 0, a, sizeof(a), NI_NUMERICSERV))
- return 0;
- if (getnameinfo(sb, sb->sa_len, NULL, 0, b, sizeof(b), NI_NUMERICSERV))
- return 0;
- if (strcmp(a, b) != 0)
- return 0;
-
- return 1;
-}
diff --git a/usr.bin/tftp/tftpsubs.c b/usr.bin/tftp/tftpsubs.c
deleted file mode 100644
index 123b9d9..0000000
--- a/usr.bin/tftp/tftpsubs.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)tftpsubs.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-/* Simple minded read-ahead/write-behind subroutines for tftp user and
- server. Written originally with multiple buffers in mind, but current
- implementation has two buffer logic wired in.
-
- Todo: add some sort of final error check so when the write-buffer
- is finally flushed, the caller can detect if the disk filled up
- (or had an i/o error) and return a nak to the other side.
-
- Jim Guyton 10/85
- */
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/ioctl.h>
-#include <netinet/in.h>
-#include <arpa/tftp.h>
-
-#include <stdio.h>
-#include <unistd.h>
-
-#include "tftpsubs.h"
-
-#define PKTSIZE SEGSIZE+4 /* should be moved to tftp.h */
-
-struct bf {
- int counter; /* size of data in buffer, or flag */
- char buf[PKTSIZE]; /* room for data packet */
-} bfs[2];
-
- /* Values for bf.counter */
-#define BF_ALLOC -3 /* alloc'd but not yet filled */
-#define BF_FREE -2 /* free */
-/* [-1 .. SEGSIZE] = size of data in the data buffer */
-
-static int nextone; /* index of next buffer to use */
-static int current; /* index of buffer in use */
-
- /* control flags for crlf conversions */
-int newline = 0; /* fillbuf: in middle of newline expansion */
-int prevchar = -1; /* putbuf: previous char (cr check) */
-
-static struct tftphdr *rw_init(int);
-
-struct tftphdr *w_init(void) { return rw_init(0); } /* write-behind */
-struct tftphdr *r_init(void) { return rw_init(1); } /* read-ahead */
-
-static struct tftphdr * /* init for either read-ahead or write-behind */
-rw_init(int x) /* zero for write-behind, one for read-head */
-{
- newline = 0; /* init crlf flag */
- prevchar = -1;
- bfs[0].counter = BF_ALLOC; /* pass out the first buffer */
- current = 0;
- bfs[1].counter = BF_FREE;
- nextone = x; /* ahead or behind? */
- return (struct tftphdr *)bfs[0].buf;
-}
-
-
-/* Have emptied current buffer by sending to net and getting ack.
- Free it and return next buffer filled with data.
- */
-int
-readit(FILE *file, /* file opened for read */
- struct tftphdr **dpp,
- int convert) /* if true, convert to ascii */
-{
- struct bf *b;
-
- bfs[current].counter = BF_FREE; /* free old one */
- current = !current; /* "incr" current */
-
- b = &bfs[current]; /* look at new buffer */
- if (b->counter == BF_FREE) /* if it's empty */
- read_ahead(file, convert); /* fill it */
-/* assert(b->counter != BF_FREE);*//* check */
- *dpp = (struct tftphdr *)b->buf; /* set caller's ptr */
- return b->counter;
-}
-
-/*
- * fill the input buffer, doing ascii conversions if requested
- * conversions are lf -> cr,lf and cr -> cr, nul
- */
-void
-read_ahead(FILE *file, /* file opened for read */
- int convert) /* if true, convert to ascii */
-{
- register int i;
- register char *p;
- register int c;
- struct bf *b;
- struct tftphdr *dp;
-
- b = &bfs[nextone]; /* look at "next" buffer */
- if (b->counter != BF_FREE) /* nop if not free */
- return;
- nextone = !nextone; /* "incr" next buffer ptr */
-
- dp = (struct tftphdr *)b->buf;
-
- if (convert == 0) {
- b->counter = read(fileno(file), dp->th_data, SEGSIZE);
- return;
- }
-
- p = dp->th_data;
- for (i = 0 ; i < SEGSIZE; i++) {
- if (newline) {
- if (prevchar == '\n')
- c = '\n'; /* lf to cr,lf */
- else c = '\0'; /* cr to cr,nul */
- newline = 0;
- }
- else {
- c = getc(file);
- if (c == EOF) break;
- if (c == '\n' || c == '\r') {
- prevchar = c;
- c = '\r';
- newline = 1;
- }
- }
- *p++ = c;
- }
- b->counter = (int)(p - dp->th_data);
-}
-
-/* Update count associated with the buffer, get new buffer
- from the queue. Calls write_behind only if next buffer not
- available.
- */
-int
-writeit(FILE *file, struct tftphdr **dpp, int ct, int convert)
-{
- bfs[current].counter = ct; /* set size of data to write */
- current = !current; /* switch to other buffer */
- if (bfs[current].counter != BF_FREE) /* if not free */
- (void)write_behind(file, convert); /* flush it */
- bfs[current].counter = BF_ALLOC; /* mark as alloc'd */
- *dpp = (struct tftphdr *)bfs[current].buf;
- return ct; /* this is a lie of course */
-}
-
-/*
- * Output a buffer to a file, converting from netascii if requested.
- * CR,NUL -> CR and CR,LF => LF.
- * Note spec is undefined if we get CR as last byte of file or a
- * CR followed by anything else. In this case we leave it alone.
- */
-int
-write_behind(FILE *file, int convert)
-{
- char *buf;
- int count;
- register int ct;
- register char *p;
- register int c; /* current character */
- struct bf *b;
- struct tftphdr *dp;
-
- b = &bfs[nextone];
- if (b->counter < -1) /* anything to flush? */
- return 0; /* just nop if nothing to do */
-
- count = b->counter; /* remember byte count */
- b->counter = BF_FREE; /* reset flag */
- dp = (struct tftphdr *)b->buf;
- nextone = !nextone; /* incr for next time */
- buf = dp->th_data;
-
- if (count <= 0) return -1; /* nak logic? */
-
- if (convert == 0)
- return write(fileno(file), buf, count);
-
- p = buf;
- ct = count;
- while (ct--) { /* loop over the buffer */
- c = *p++; /* pick up a character */
- if (prevchar == '\r') { /* if prev char was cr */
- if (c == '\n') /* if have cr,lf then just */
- fseek(file, -1, 1); /* smash lf on top of the cr */
- else
- if (c == '\0') /* if have cr,nul then */
- goto skipit; /* just skip over the putc */
- /* else just fall through and allow it */
- }
- putc(c, file);
-skipit:
- prevchar = c;
- }
- return count;
-}
-
-
-/* When an error has occurred, it is possible that the two sides
- * are out of synch. Ie: that what I think is the other side's
- * response to packet N is really their response to packet N-1.
- *
- * So, to try to prevent that, we flush all the input queued up
- * for us on the network connection on our host.
- *
- * We return the number of packets we flushed (mostly for reporting
- * when trace is active).
- */
-
-int
-synchnet(int f) /* socket to flush */
-{
- int i, j = 0;
- char rbuf[PKTSIZE];
- struct sockaddr_storage from;
- socklen_t fromlen;
-
- while (1) {
- (void) ioctl(f, FIONREAD, &i);
- if (i) {
- j++;
- fromlen = sizeof from;
- (void) recvfrom(f, rbuf, sizeof (rbuf), 0,
- (struct sockaddr *)&from, &fromlen);
- } else {
- return(j);
- }
- }
-}
diff --git a/usr.bin/tftp/tftpsubs.h b/usr.bin/tftp/tftpsubs.h
deleted file mode 100644
index 0c3b42e..0000000
--- a/usr.bin/tftp/tftpsubs.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)tftpsubs.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-/*
- * Prototypes for read-ahead/write-behind subroutines for tftp user and
- * server.
- */
-struct tftphdr *r_init(void);
-void read_ahead(FILE *, int);
-int readit(FILE *, struct tftphdr **, int);
-
-int synchnet(int);
-
-struct tftphdr *w_init(void);
-int write_behind(FILE *, int);
-int writeit(FILE *, struct tftphdr **, int, int);
diff --git a/usr.bin/time/Makefile b/usr.bin/time/Makefile
deleted file mode 100644
index 5a580d2..0000000
--- a/usr.bin/time/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= time
-WARNS?=6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/time/time.1 b/usr.bin/time/time.1
deleted file mode 100644
index 79419bf..0000000
--- a/usr.bin/time/time.1
+++ /dev/null
@@ -1,149 +0,0 @@
-.\" Copyright (c) 1980, 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)time.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd May 14, 2006
-.Dt TIME 1
-.Os
-.Sh NAME
-.Nm time
-.Nd time command execution
-.Sh SYNOPSIS
-.Nm
-.Op Fl al
-.Op Fl h | Fl p
-.Op Fl o Ar file
-.Ar utility Op Ar argument ...
-.Sh DESCRIPTION
-The
-.Nm
-utility
-executes and
-times the specified
-.Ar utility .
-After the
-.Ar utility
-finishes,
-.Nm
-writes to the standard error stream,
-(in seconds):
-the total time elapsed,
-the time used to execute the
-.Ar utility
-process and the time consumed by system overhead.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl a
-If the
-.Fl o
-flag is used, append to the specified file rather than overwriting
-it.
-Otherwise, this option has no effect.
-.It Fl h
-Print times in a human friendly format.
-Times are printed in minutes, hours,
-etc.\& as appropriate.
-.It Fl l
-The contents of the
-.Em rusage
-structure are printed as well.
-.It Fl o Ar file
-Write the output to
-.Ar file
-instead of stderr.
-If
-.Ar file
-exists and the
-.Fl a
-flag is not specified, the file will be overwritten.
-.It Fl p
-Makes
-.Nm
-output POSIX.2 compliant (each time is printed on its own line).
-.El
-.Pp
-Some shells may provide a builtin
-.Nm
-command which is similar or identical to this utility.
-Consult the
-.Xr builtin 1
-manual page.
-.Pp
-If
-.Nm
-receives a
-.Dv SIGINFO
-(see the status argument for
-.Xr stty 1 )
-signal, the current time the given command is running will be written to the
-standard output.
-.Sh ENVIRONMENT
-The
-.Ev PATH
-environment variable is used to locate the requested
-.Ar utility
-if the name contains no
-.Ql /
-characters.
-.Sh EXIT STATUS
-If
-.Ar utility
-could be timed successfully, its exit status is returned.
-If
-.Ar utility
-terminated abnormally, a warning message is output to stderr.
-If the
-.Ar utility
-was found but could not be run, the exit status is 126.
-If no
-.Ar utility
-could be found at all, the exit status is 127.
-If
-.Nm
-encounters any other error, the exit status is between 1 and 125
-included.
-.Sh SEE ALSO
-.Xr builtin 1 ,
-.Xr csh 1 ,
-.Xr getrusage 2 ,
-.Xr wait 2
-.Sh STANDARDS
-The
-.Nm
-utility is expected to conform to ISO/IEC 9945-2:1993 (``POSIX'').
-.Sh HISTORY
-A
-.Nm
-utility appeared in
-.At v3 .
diff --git a/usr.bin/time/time.c b/usr.bin/time/time.c
deleted file mode 100644
index a97ffec..0000000
--- a/usr.bin/time/time.c
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * Copyright (c) 1987, 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1987, 1988, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)time.c 8.1 (Berkeley) 6/6/93";
-#endif
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <sys/types.h>
-#include <sys/resource.h>
-#include <sys/signal.h>
-#include <sys/sysctl.h>
-#include <sys/time.h>
-#include <sys/wait.h>
-
-#include <err.h>
-#include <errno.h>
-#include <locale.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <unistd.h>
-
-static int getstathz(void);
-static void humantime(FILE *, long, long);
-static void showtime(FILE *, struct timeval *, struct timeval *,
- struct rusage *);
-static void siginfo(int);
-static void usage(void);
-
-static char decimal_point;
-static struct timeval before_tv;
-static int hflag, pflag;
-
-int
-main(int argc, char **argv)
-{
- int aflag, ch, lflag, status;
- int exitonsig;
- pid_t pid;
- struct rlimit rl;
- struct rusage ru;
- struct timeval after;
- char *ofn = NULL;
- FILE *out = stderr;
-
- (void) setlocale(LC_NUMERIC, "");
- decimal_point = localeconv()->decimal_point[0];
-
- aflag = hflag = lflag = pflag = 0;
- while ((ch = getopt(argc, argv, "ahlo:p")) != -1)
- switch((char)ch) {
- case 'a':
- aflag = 1;
- break;
- case 'h':
- hflag = 1;
- break;
- case 'l':
- lflag = 1;
- break;
- case 'o':
- ofn = optarg;
- break;
- case 'p':
- pflag = 1;
- break;
- case '?':
- default:
- usage();
- }
-
- if (!(argc -= optind))
- exit(0);
- argv += optind;
-
- if (ofn) {
- if ((out = fopen(ofn, aflag ? "a" : "w")) == NULL)
- err(1, "%s", ofn);
- setvbuf(out, (char *)NULL, _IONBF, (size_t)0);
- }
-
- gettimeofday(&before_tv, (struct timezone *)NULL);
- switch(pid = fork()) {
- case -1: /* error */
- err(1, "time");
- /* NOTREACHED */
- case 0: /* child */
- if (ofn)
- fclose(out);
- execvp(*argv, argv);
- err(errno == ENOENT ? 127 : 126, "%s", *argv);
- /* NOTREACHED */
- }
- /* parent */
- (void)signal(SIGINT, SIG_IGN);
- (void)signal(SIGQUIT, SIG_IGN);
- (void)signal(SIGINFO, siginfo);
- while (wait4(pid, &status, 0, &ru) != pid);
- gettimeofday(&after, (struct timezone *)NULL);
- if ( ! WIFEXITED(status))
- warnx("command terminated abnormally");
- exitonsig = WIFSIGNALED(status) ? WTERMSIG(status) : 0;
- showtime(out, &before_tv, &after, &ru);
- if (lflag) {
- int hz = getstathz();
- u_long ticks;
-
- ticks = hz * (ru.ru_utime.tv_sec + ru.ru_stime.tv_sec) +
- hz * (ru.ru_utime.tv_usec + ru.ru_stime.tv_usec) / 1000000;
-
- /*
- * If our round-off on the tick calculation still puts us at 0,
- * then always assume at least one tick.
- */
- if (ticks == 0)
- ticks = 1;
-
- fprintf(out, "%10ld %s\n",
- ru.ru_maxrss, "maximum resident set size");
- fprintf(out, "%10ld %s\n",
- ru.ru_ixrss / ticks, "average shared memory size");
- fprintf(out, "%10ld %s\n",
- ru.ru_idrss / ticks, "average unshared data size");
- fprintf(out, "%10ld %s\n",
- ru.ru_isrss / ticks, "average unshared stack size");
- fprintf(out, "%10ld %s\n",
- ru.ru_minflt, "page reclaims");
- fprintf(out, "%10ld %s\n",
- ru.ru_majflt, "page faults");
- fprintf(out, "%10ld %s\n",
- ru.ru_nswap, "swaps");
- fprintf(out, "%10ld %s\n",
- ru.ru_inblock, "block input operations");
- fprintf(out, "%10ld %s\n",
- ru.ru_oublock, "block output operations");
- fprintf(out, "%10ld %s\n",
- ru.ru_msgsnd, "messages sent");
- fprintf(out, "%10ld %s\n",
- ru.ru_msgrcv, "messages received");
- fprintf(out, "%10ld %s\n",
- ru.ru_nsignals, "signals received");
- fprintf(out, "%10ld %s\n",
- ru.ru_nvcsw, "voluntary context switches");
- fprintf(out, "%10ld %s\n",
- ru.ru_nivcsw, "involuntary context switches");
- }
- /*
- * If the child has exited on a signal, exit on the same
- * signal, too, in order to reproduce the child's exit status.
- * However, avoid actually dumping core from the current process.
- */
- if (exitonsig) {
- if (signal(exitonsig, SIG_DFL) == SIG_ERR)
- warn("signal");
- else {
- rl.rlim_max = rl.rlim_cur = 0;
- if (setrlimit(RLIMIT_CORE, &rl) == -1)
- warn("setrlimit");
- kill(getpid(), exitonsig);
- }
- }
- exit (WIFEXITED(status) ? WEXITSTATUS(status) : EXIT_FAILURE);
-}
-
-static void
-usage(void)
-{
- fprintf(stderr,
- "usage: time [-al] [-h | -p] [-o file] utility [argument ...]\n");
- exit(1);
-}
-
-/*
- * Return the frequency of the kernel's statistics clock.
- */
-static int
-getstathz(void)
-{
- int mib[2];
- size_t size;
- struct clockinfo clockrate;
-
- mib[0] = CTL_KERN;
- mib[1] = KERN_CLOCKRATE;
- size = sizeof clockrate;
- if (sysctl(mib, 2, &clockrate, &size, NULL, 0) == -1)
- err(1, "sysctl kern.clockrate");
- return clockrate.stathz;
-}
-
-static void
-humantime(FILE *out, long sec, long usec)
-{
- long days, hrs, mins;
-
- days = sec / (60L * 60 * 24);
- sec %= (60L * 60 * 24);
- hrs = sec / (60L * 60);
- sec %= (60L * 60);
- mins = sec / 60;
- sec %= 60;
-
- fprintf(out, "\t");
- if (days)
- fprintf(out, "%ldd", days);
- if (hrs)
- fprintf(out, "%ldh", hrs);
- if (mins)
- fprintf(out, "%ldm", mins);
- fprintf(out, "%ld%c%02lds", sec, decimal_point, usec);
-}
-
-static void
-showtime(FILE *out, struct timeval *before, struct timeval *after,
- struct rusage *ru)
-{
-
- after->tv_sec -= before->tv_sec;
- after->tv_usec -= before->tv_usec;
- if (after->tv_usec < 0)
- after->tv_sec--, after->tv_usec += 1000000;
-
- if (pflag) {
- /* POSIX wants output that must look like
- "real %f\nuser %f\nsys %f\n" and requires
- at least two digits after the radix. */
- fprintf(out, "real %jd%c%02ld\n",
- (intmax_t)after->tv_sec, decimal_point,
- after->tv_usec/10000);
- fprintf(out, "user %jd%c%02ld\n",
- (intmax_t)ru->ru_utime.tv_sec, decimal_point,
- ru->ru_utime.tv_usec/10000);
- fprintf(out, "sys %jd%c%02ld\n",
- (intmax_t)ru->ru_stime.tv_sec, decimal_point,
- ru->ru_stime.tv_usec/10000);
- } else if (hflag) {
- humantime(out, after->tv_sec, after->tv_usec/10000);
- fprintf(out, " real\t");
- humantime(out, ru->ru_utime.tv_sec, ru->ru_utime.tv_usec/10000);
- fprintf(out, " user\t");
- humantime(out, ru->ru_stime.tv_sec, ru->ru_stime.tv_usec/10000);
- fprintf(out, " sys\n");
- } else {
- fprintf(out, "%9jd%c%02ld real ",
- (intmax_t)after->tv_sec, decimal_point,
- after->tv_usec/10000);
- fprintf(out, "%9jd%c%02ld user ",
- (intmax_t)ru->ru_utime.tv_sec, decimal_point,
- ru->ru_utime.tv_usec/10000);
- fprintf(out, "%9jd%c%02ld sys\n",
- (intmax_t)ru->ru_stime.tv_sec, decimal_point,
- ru->ru_stime.tv_usec/10000);
- }
-}
-
-static void
-siginfo(int sig __unused)
-{
- struct timeval after;
- struct rusage ru;
-
- gettimeofday(&after, (struct timezone *)NULL);
- getrusage(RUSAGE_CHILDREN, &ru);
- showtime(stdout, &before_tv, &after, &ru);
-}
diff --git a/usr.bin/tip/Makefile b/usr.bin/tip/Makefile
deleted file mode 100644
index 532431d..0000000
--- a/usr.bin/tip/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-SUBDIR=tip
-
-.include <bsd.subdir.mk>
diff --git a/usr.bin/tip/Makefile.inc b/usr.bin/tip/Makefile.inc
deleted file mode 100644
index 265f86d..0000000
--- a/usr.bin/tip/Makefile.inc
+++ /dev/null
@@ -1,3 +0,0 @@
-# $FreeBSD$
-
-.include "../Makefile.inc"
diff --git a/usr.bin/tip/README b/usr.bin/tip/README
deleted file mode 100644
index fb9af15..0000000
--- a/usr.bin/tip/README
+++ /dev/null
@@ -1,63 +0,0 @@
-# $FreeBSD$
-
-Tip can be configured in a number of ways:
-
-ACU's:
------
-
-ACU Define in makefile
--------------------- ---------------
-BIZCOMP 1022, 1031 BIZ1022, BIZ1031
-DEC DF02-AC, DF03-AC DF02, DF03
-DEC DN-11/Able Quadracall DN11
-Ventel VENTEL
-Vadic 831 V831
-
-New ACU's may be added by editing the ACU description table
-in acutab.c and writing a ``driver''.
-
-ACU usage can be monitored by defining ACULOG in the makefile.
-If this is done and no phone numbers should appear in the
-log file, define PRISTINE in the makefile.
-
-Variables:
----------
-
-Tip's internal workings revolve around a set of (possibly)
-user defined variables. These are statically initialized
-in vars.c, and from the remote file.
-
-Note that adding or deleting variables requires tip to be completedly
-recompiled, as indexes into the variable table are used to avoid
-expensive lookups. These defines are set in tip.h.
-
-Commands:
---------
-
-The command dispatch table is defined in cmdtab.c. Commands
-may have attributes such as EXPerimental and PRIVileged (only
-root may execute).
-
-
-
---------------------------------------------------------------------------
-
-Recent changes about Jan 82
-
-A new, improved version of tip is now available. The most important
-addition is the capacility to specify a phone number with tip. The
-default baud rate is 1200. To use it do:
-
- tip phone-number
-or
- tip -300 phone-number
-
-for 300 baud.
-
-A ~^Z command has been added to tip as well.
-
-A new cu program is available that interfaces to the tip program.
-It attempts to give the same user interface as cu but it is really
-the tip program so you have all the advantages of tip. This allows
-cu (actually tip) to search for a free ACU instead of having the
-user specify which one he wants.
diff --git a/usr.bin/tip/TODO b/usr.bin/tip/TODO
deleted file mode 100644
index 6aace38..0000000
--- a/usr.bin/tip/TODO
+++ /dev/null
@@ -1,20 +0,0 @@
-# $FreeBSD$
-
-1. Rethink protection glitches on REMOTE & PHONES
- files (setuid/setgid??).
-
-2. Make clean fix for scripting being set in .tiprc
-
-3. change EOFREAD to recognize more general strings.
-
-4. add an option that returns an exit status based on
- whether resources for the requested operation are available.
-
-5. write a program to list known systems (a quick shell script
- should do it); people keep forgetting the names.
-
-6. change remote file descriptions so that acu attributes are
- are attached to a device so that several different devices
- can be used to get to the same system (perhaps hardwired
- and phone line). got any ideas here? I'm looking at something
- like dv=cua1,cul1,dn11;cua2,,df03.
diff --git a/usr.bin/tip/libacu/biz22.c b/usr.bin/tip/libacu/biz22.c
deleted file mode 100644
index 99b6fb0..0000000
--- a/usr.bin/tip/libacu/biz22.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/* $OpenBSD: biz22.c,v 1.13 2006/03/17 19:17:13 moritz Exp $ */
-/* $NetBSD: biz22.c,v 1.6 1997/02/11 09:24:11 mrg Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)biz22.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: biz22.c,v 1.13 2006/03/17 19:17:13 moritz Exp $";
-#endif
-#endif /* not lint */
-
-#include "tip.h"
-
-#define DISCONNECT_CMD "\20\04" /* disconnection string */
-
-static int dialtimeout = 0;
-static jmp_buf timeoutbuf;
-
-static int biz_dialer(char *, char *);
-static void sigALRM(int);
-static int cmd(char *);
-static int detect(char *);
-
-/*
- * Dial up on a BIZCOMP Model 1022 with either
- * tone dialing (mod = "V")
- * pulse dialing (mod = "W")
- */
-static int
-biz_dialer(char *num, char *mod)
-{
- int connected = 0;
- char cbuf[40];
-
- if (boolean(value(VERBOSE)))
- printf("\nstarting call...");
- /*
- * Disable auto-answer and configure for tone/pulse
- * dialing
- */
- if (cmd("\02K\r")) {
- printf("can't initialize bizcomp...");
- return (0);
- }
- (void)strlcpy(cbuf, "\02.\r", sizeof cbuf);
- cbuf[1] = *mod;
- if (cmd(cbuf)) {
- printf("can't set dialing mode...");
- return (0);
- }
- (void)snprintf(cbuf, sizeof(cbuf), "\02D%s\r", num);
- write(FD, cbuf, strlen(cbuf));
- if (!detect("7\r")) {
- printf("can't get dial tone...");
- return (0);
- }
- if (boolean(value(VERBOSE)))
- printf("ringing...");
- /*
- * The reply from the BIZCOMP should be:
- * 2 \r or 7 \r failure
- * 1 \r success
- */
- connected = detect("1\r");
-#ifdef ACULOG
- if (dialtimeout) {
- char line[80];
-
- (void)snprintf(line, sizeof line, "%ld second dial timeout",
- number(value(DIALTIMEOUT)));
- logent(value(HOST), num, "biz1022", line);
- }
-#endif
- if (dialtimeout)
- biz22_disconnect(); /* insurance */
- return (connected);
-}
-
-int
-biz22w_dialer(char *num, char *acu)
-{
- return (biz_dialer(num, "W"));
-}
-
-int
-biz22f_dialer(char *num, char *acu)
-{
- return (biz_dialer(num, "V"));
-}
-
-void
-biz22_disconnect(void)
-{
- write(FD, DISCONNECT_CMD, sizeof(DISCONNECT_CMD)-1);
- sleep(2);
- tcflush(FD, TCIOFLUSH);
-}
-
-void
-biz22_abort(void)
-{
- write(FD, "\02", 1);
-}
-
-/*ARGSUSED*/
-static void
-sigALRM(int signo)
-{
- dialtimeout = 1;
- longjmp(timeoutbuf, 1);
-}
-
-static int
-cmd(char *s)
-{
- sig_t f;
- char c;
-
- write(FD, s, strlen(s));
- f = signal(SIGALRM, sigALRM);
- if (setjmp(timeoutbuf)) {
- biz22_abort();
- signal(SIGALRM, f);
- return (1);
- }
- alarm(number(value(DIALTIMEOUT)));
- read(FD, &c, 1);
- alarm(0);
- signal(SIGALRM, f);
- c &= 0177;
- return (c != '\r');
-}
-
-static int
-detect(char *s)
-{
- sig_t f;
- char c;
-
- f = signal(SIGALRM, sigALRM);
- dialtimeout = 0;
- while (*s) {
- if (setjmp(timeoutbuf)) {
- biz22_abort();
- break;
- }
- alarm(number(value(DIALTIMEOUT)));
- read(FD, &c, 1);
- alarm(0);
- c &= 0177;
- if (c != *s++)
- return (0);
- }
- signal(SIGALRM, f);
- return (dialtimeout == 0);
-}
diff --git a/usr.bin/tip/libacu/biz31.c b/usr.bin/tip/libacu/biz31.c
deleted file mode 100644
index 5bc00ae..0000000
--- a/usr.bin/tip/libacu/biz31.c
+++ /dev/null
@@ -1,254 +0,0 @@
-/* $OpenBSD: biz31.c,v 1.10 2006/03/17 19:17:13 moritz Exp $ */
-/* $NetBSD: biz31.c,v 1.5 1997/02/11 09:24:14 mrg Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)biz31.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] = "$OpenBSD: biz31.c,v 1.10 2006/03/17 19:17:13 moritz Exp $";
-#endif
-#endif /* not lint */
-
-#include "tip.h"
-
-#define MAXRETRY 3 /* sync up retry count */
-#define DISCONNECT_CMD "\21\25\11\24" /* disconnection string */
-
-static int biz_dialer(char *, char *);
-static int bizsync(int);
-static int echo(char *);
-static void sigALRM(int);
-static int detect(char *);
-static int flush(char *);
-static int bizsync(int);
-
-static int timeout = 0;
-static jmp_buf timeoutbuf;
-
-/*
- * Dial up on a BIZCOMP Model 1031 with either
- * tone dialing (mod = "f")
- * pulse dialing (mod = "w")
- */
-static int
-biz_dialer(char *num, char *mod)
-{
- int connected = 0;
-
- if (!bizsync(FD)) {
- logent(value(HOST), "", "biz", "out of sync");
- printf("bizcomp out of sync\n");
- delock(uucplock);
- exit(0);
- }
- if (boolean(value(VERBOSE)))
- printf("\nstarting call...");
- echo("#\rk$\r$\n"); /* disable auto-answer */
- echo("$>$.$ #\r"); /* tone/pulse dialing */
- echo(mod);
- echo("$\r$\n");
- echo("$>$.$ #\re$ "); /* disconnection sequence */
- echo(DISCONNECT_CMD);
- echo("\r$\n$\r$\n");
- echo("$>$.$ #\rr$ "); /* repeat dial */
- echo(num);
- echo("\r$\n");
- if (boolean(value(VERBOSE)))
- printf("ringing...");
- /*
- * The reply from the BIZCOMP should be:
- * `^G NO CONNECTION\r\n^G\r\n' failure
- * ` CONNECTION\r\n^G' success
- */
- connected = detect(" ");
-#ifdef ACULOG
- if (timeout) {
- char line[80];
-
- (void)snprintf(line, sizeof line, "%ld second dial timeout",
- number(value(DIALTIMEOUT)));
- logent(value(HOST), num, "biz", line);
- }
-#endif
- if (!connected)
- flush(" NO CONNECTION\r\n\07\r\n");
- else
- flush("CONNECTION\r\n\07");
- if (timeout)
- biz31_disconnect(); /* insurance */
- return (connected);
-}
-
-int
-biz31w_dialer(char *num, char *acu)
-{
- return (biz_dialer(num, "w"));
-}
-
-int
-biz31f_dialer(char *num, char *acu)
-{
- return (biz_dialer(num, "f"));
-}
-
-void
-biz31_disconnect(void)
-{
- write(FD, DISCONNECT_CMD, sizeof(DISCONNECT_CMD)-1);
- sleep(2);
- tcflush(FD, TCIOFLUSH);
-}
-
-void
-biz31_abort(void)
-{
- write(FD, "\33", 1);
-}
-
-static int
-echo(char *s)
-{
- char c;
-
- while (c = *s++) switch (c) {
-
- case '$':
- read(FD, &c, 1);
- s++;
- break;
-
- case '#':
- c = *s++;
- write(FD, &c, 1);
- break;
-
- default:
- write(FD, &c, 1);
- read(FD, &c, 1);
- }
-}
-
-/*ARGSUSED*/
-static void
-sigALRM(int signo)
-{
- timeout = 1;
- longjmp(timeoutbuf, 1);
-}
-
-static int
-detect(char *s)
-{
- sig_t f;
- char c;
-
- f = signal(SIGALRM, sigALRM);
- timeout = 0;
- while (*s) {
- if (setjmp(timeoutbuf)) {
- printf("\07timeout waiting for reply\n");
- biz31_abort();
- break;
- }
- alarm(number(value(DIALTIMEOUT)));
- read(FD, &c, 1);
- alarm(0);
- if (c != *s++)
- break;
- }
- signal(SIGALRM, f);
- return (timeout == 0);
-}
-
-static int
-flush(char *s)
-{
- sig_t f;
- char c;
-
- f = signal(SIGALRM, sigALRM);
- while (*s++) {
- if (setjmp(timeoutbuf))
- break;
- alarm(10);
- read(FD, &c, 1);
- alarm(0);
- }
- signal(SIGALRM, f);
- timeout = 0; /* guard against disconnection */
-}
-
-/*
- * This convoluted piece of code attempts to get
- * the bizcomp in sync. If you don't have the capacity or nread
- * call there are gory ways to simulate this.
- */
-static int
-bizsync(int fd)
-{
-#ifdef FIOCAPACITY
- struct capacity b;
-# define chars(b) ((b).cp_nbytes)
-# define IOCTL FIOCAPACITY
-#endif
-#ifdef FIONREAD
- long b;
-# define chars(b) (b)
-# define IOCTL FIONREAD
-#endif
- int already = 0;
- char buf[10];
-
-retry:
- if (ioctl(fd, IOCTL, (caddr_t)&b) >= 0 && chars(b) > 0)
- tcflush(FD, TCIOFLUSH);
- write(fd, "\rp>\r", 4);
- sleep(1);
- if (ioctl(fd, IOCTL, (caddr_t)&b) >= 0) {
- if (chars(b) != 10) {
- nono:
- if (already > MAXRETRY)
- return (0);
- write(fd, DISCONNECT_CMD, 4);
- sleep(2);
- already++;
- goto retry;
- } else {
- read(fd, buf, 10);
- if (strncmp(buf, "p >\r\n\r\n>", 8))
- goto nono;
- }
- }
- return (1);
-}
diff --git a/usr.bin/tip/libacu/courier.c b/usr.bin/tip/libacu/courier.c
deleted file mode 100644
index b23c28c..0000000
--- a/usr.bin/tip/libacu/courier.c
+++ /dev/null
@@ -1,354 +0,0 @@
-/* $OpenBSD: courier.c,v 1.15 2006/03/17 19:17:13 moritz Exp $ */
-/* $NetBSD: courier.c,v 1.7 1997/02/11 09:24:16 mrg Exp $ */
-
-/*
- * Copyright (c) 1986, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)courier.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: courier.c,v 1.15 2006/03/17 19:17:13 moritz Exp $";
-#endif
-#endif /* not lint */
-
-/*
- * Routines for calling up on a Courier modem.
- * Derived from Hayes driver.
- */
-#include "tip.h"
-#include <sys/ioctl.h>
-#include <stdio.h>
-
-#define MAXRETRY 5
-
-static int dialtimeout = 0;
-static int connected = 0;
-static jmp_buf timeoutbuf;
-
-static void sigALRM(int);
-static int cour_swallow(char *);
-static int cour_connect(void);
-static int coursync(void);
-static void cour_write(int, char *, int);
-static void cour_nap(void);
-#ifdef DEBUG
-static void cour_verbose_read(void);
-#endif
-
-int
-cour_dialer(char *num, char *acu)
-{
- char *cp;
-#ifdef ACULOG
- char line[80];
-#endif
- struct termios cntrl;
-
- if (boolean(value(VERBOSE)))
- printf("Using \"%s\"\n", acu);
-
- tcgetattr(FD, &cntrl);
- cntrl.c_cflag |= HUPCL;
- tcsetattr(FD, TCSAFLUSH, &cntrl);
- /*
- * Get in synch.
- */
- if (!coursync()) {
-badsynch:
- printf("can't synchronize with courier\n");
-#ifdef ACULOG
- logent(value(HOST), num, "courier", "can't synch up");
-#endif
- return (0);
- }
- cour_write(FD, "AT E0\r", 6); /* turn off echoing */
- sleep(1);
-#ifdef DEBUG
- if (boolean(value(VERBOSE)))
- cour_verbose_read();
-#endif
- tcflush(FD, TCIOFLUSH);
- cour_write(FD, "AT C1 E0 H0 Q0 X6 V1\r", 21);
- if (!cour_swallow("\r\nOK\r\n"))
- goto badsynch;
- fflush(stdout);
- cour_write(FD, "AT D", 4);
- for (cp = num; *cp; cp++)
- if (*cp == '=')
- *cp = ',';
- cour_write(FD, num, strlen(num));
- cour_write(FD, "\r", 1);
- connected = cour_connect();
-#ifdef ACULOG
- if (dialtimeout) {
- (void)snprintf(line, sizeof line, "%ld second dial timeout",
- number(value(DIALTIMEOUT)));
- logent(value(HOST), num, "cour", line);
- }
-#endif
- if (dialtimeout)
- cour_disconnect();
- return (connected);
-}
-
-void
-cour_disconnect(void)
-{
- /* first hang up the modem*/
- ioctl(FD, TIOCCDTR, 0);
- sleep(1);
- ioctl(FD, TIOCSDTR, 0);
- coursync(); /* reset */
- close(FD);
-}
-
-void
-cour_abort(void)
-{
- cour_write(FD, "\r", 1); /* send anything to abort the call */
- cour_disconnect();
-}
-
-/*ARGSUSED*/
-static void
-sigALRM(int signo)
-{
- printf("\07timeout waiting for reply\n");
- dialtimeout = 1;
- longjmp(timeoutbuf, 1);
-}
-
-static int
-cour_swallow(char *match)
-{
- sig_t f;
- char c;
-
- f = signal(SIGALRM, sigALRM);
- dialtimeout = 0;
- do {
- if (*match =='\0') {
- signal(SIGALRM, f);
- return (1);
- }
- if (setjmp(timeoutbuf)) {
- signal(SIGALRM, f);
- return (0);
- }
- alarm(number(value(DIALTIMEOUT)));
- read(FD, &c, 1);
- alarm(0);
- c &= 0177;
-#ifdef DEBUG
- if (boolean(value(VERBOSE)))
- putchar(c);
-#endif
- } while (c == *match++);
-#ifdef DEBUG
- if (boolean(value(VERBOSE)))
- fflush(stdout);
-#endif
- signal(SIGALRM, SIG_DFL);
- return (0);
-}
-
-struct baud_msg {
- char *msg;
- int baud;
-} baud_msg[] = {
- { "", B300 },
- { " 1200", B1200 },
- { " 2400", B2400 },
- { " 9600", B9600 },
- { " 9600/ARQ", B9600 },
- { 0, 0 },
-};
-
-static int
-cour_connect(void)
-{
- char c;
- int nc, nl, n;
- char dialer_buf[64];
- struct baud_msg *bm;
- sig_t f;
-
- if (cour_swallow("\r\n") == 0)
- return (0);
- f = signal(SIGALRM, sigALRM);
-again:
- nc = 0; nl = sizeof(dialer_buf)-1;
- bzero(dialer_buf, sizeof(dialer_buf));
- dialtimeout = 0;
- for (nc = 0, nl = sizeof(dialer_buf)-1 ; nl > 0 ; nc++, nl--) {
- if (setjmp(timeoutbuf))
- break;
- alarm(number(value(DIALTIMEOUT)));
- n = read(FD, &c, 1);
- alarm(0);
- if (n <= 0)
- break;
- c &= 0x7f;
- if (c == '\r') {
- if (cour_swallow("\n") == 0)
- break;
- if (!dialer_buf[0])
- goto again;
- if (strcmp(dialer_buf, "RINGING") == 0 &&
- boolean(value(VERBOSE))) {
-#ifdef DEBUG
- printf("%s\r\n", dialer_buf);
-#endif
- goto again;
- }
- if (strncmp(dialer_buf, "CONNECT",
- sizeof("CONNECT")-1) != 0)
- break;
- for (bm = baud_msg ; bm->msg ; bm++)
- if (strcmp(bm->msg,
- dialer_buf+sizeof("CONNECT")-1) == 0) {
- struct termios cntrl;
-
- tcgetattr(FD, &cntrl);
- cfsetospeed(&cntrl, bm->baud);
- cfsetispeed(&cntrl, bm->baud);
- tcsetattr(FD, TCSAFLUSH, &cntrl);
- signal(SIGALRM, f);
-#ifdef DEBUG
- if (boolean(value(VERBOSE)))
- printf("%s\r\n", dialer_buf);
-#endif
- return (1);
- }
- break;
- }
- dialer_buf[nc] = c;
-#ifdef notdef
- if (boolean(value(VERBOSE)))
- putchar(c);
-#endif
- }
- printf("%s\r\n", dialer_buf);
- signal(SIGALRM, f);
- return (0);
-}
-
-/*
- * This convoluted piece of code attempts to get
- * the courier in sync.
- */
-static int
-coursync(void)
-{
- int already = 0;
- int len;
- char buf[40];
-
- while (already++ < MAXRETRY) {
- tcflush(FD, TCIOFLUSH);
- cour_write(FD, "\rAT Z\r", 6); /* reset modem */
- bzero(buf, sizeof(buf));
- sleep(1);
- ioctl(FD, FIONREAD, &len);
- if (len) {
- len = read(FD, buf, sizeof(buf));
-#ifdef DEBUG
- buf[len] = '\0';
- printf("coursync: (\"%s\")\n\r", buf);
-#endif
- if (strchr(buf, '0') ||
- (strchr(buf, 'O') && strchr(buf, 'K')))
- return(1);
- }
- /*
- * If not strapped for DTR control,
- * try to get command mode.
- */
- sleep(1);
- cour_write(FD, "+++", 3);
- sleep(1);
- /*
- * Toggle DTR to force anyone off that might have left
- * the modem connected.
- */
- ioctl(FD, TIOCCDTR, 0);
- sleep(1);
- ioctl(FD, TIOCSDTR, 0);
- }
- cour_write(FD, "\rAT Z\r", 6);
- return (0);
-}
-
-static void
-cour_write(int fd, char *cp, int n)
-{
-#ifdef notdef
- if (boolean(value(VERBOSE)))
- write(1, cp, n);
-#endif
- tcdrain(fd);
- cour_nap();
- for ( ; n-- ; cp++) {
- write(fd, cp, 1);
- tcdrain(fd);
- cour_nap();
- }
-}
-
-#ifdef DEBUG
-static void
-cour_verbose_read(void)
-{
- int n = 0;
- char buf[BUFSIZ];
-
- if (ioctl(FD, FIONREAD, &n) < 0)
- return;
- if (n <= 0)
- return;
- if (read(FD, buf, n) != n)
- return;
- write(1, buf, n);
-}
-#endif
-
-/* Give the courier 50 milliseconds between characters */
-static void
-cour_nap(void)
-{
- struct timespec ts;
-
- ts.tv_sec = 0;
- ts.tv_nsec = 50 * 1000000;
-
- nanosleep(&ts, NULL);
-}
diff --git a/usr.bin/tip/libacu/df.c b/usr.bin/tip/libacu/df.c
deleted file mode 100644
index 03374e1..0000000
--- a/usr.bin/tip/libacu/df.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/* $OpenBSD: df.c,v 1.9 2006/03/17 19:17:13 moritz Exp $ */
-/* $NetBSD: df.c,v 1.4 1995/10/29 00:49:51 pk Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)df.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: df.c,v 1.9 2006/03/17 19:17:13 moritz Exp $";
-#endif
-#endif /* not lint */
-
-/*
- * Dial the DF02-AC or DF03-AC
- */
-
-#include "tip.h"
-
-static jmp_buf Sjbuf;
-
-static int df_dialer(char *, char *, int);
-static void alrm_timeout(int);
-
-int
-df02_dialer(char *num, char *acu)
-{
- return (df_dialer(num, acu, 0));
-}
-
-int
-df03_dialer(char *num, char *acu)
-{
- return (df_dialer(num, acu, 1));
-}
-
-static int
-df_dialer(char *num, char *acu, int df03)
-{
- int f = FD;
- struct termios cntrl;
- int speed = 0;
- char c = '\0';
-
- tcgetattr(f, &cntrl);
- cntrl.c_cflag |= HUPCL;
- tcsetattr(f, TCSANOW, &cntrl);
- if (setjmp(Sjbuf)) {
- printf("connection timed out\r\n");
- df_disconnect();
- return (0);
- }
- if (boolean(value(VERBOSE)))
- printf("\ndialing...");
- fflush(stdout);
-#ifdef TIOCMSET
- if (df03) {
- int st = TIOCM_ST; /* secondary Transmit flag */
-
- tcgetattr(f, &cntrl);
- speed = cfgetospeed(&cntrl);
- if (speed != B1200) { /* must dial at 1200 baud */
- cfsetospeed(&cntrl, B1200);
- cfsetispeed(&cntrl, B1200);
- tcsetattr(f, TCSAFLUSH, &cntrl);
- ioctl(f, TIOCMBIC, &st); /* clear ST for 300 baud */
- } else
- ioctl(f, TIOCMBIS, &st); /* set ST for 1200 baud */
- }
-#endif
- signal(SIGALRM, alrm_timeout);
- alarm(5 * strlen(num) + 10);
- tcflush(f, TCIOFLUSH);
- write(f, "\001", 1);
- sleep(1);
- write(f, "\002", 1);
- write(f, num, strlen(num));
- read(f, &c, 1);
-#ifdef TIOCMSET
- if (df03 && speed != B1200) {
- cfsetospeed(&cntrl, speed);
- cfsetispeed(&cntrl, speed);
- tcsetattr(f, TCSAFLUSH, &cntrl);
- }
-#endif
- return (c == 'A');
-}
-
-void
-df_disconnect(void)
-{
- write(FD, "\001", 1);
- sleep(1);
- tcflush(FD, TCIOFLUSH);
-}
-
-void
-df_abort(void)
-{
- df_disconnect();
-}
-
-/*ARGSUSED*/
-static void
-alrm_timeout(int signo)
-{
- longjmp(Sjbuf, 1);
-}
diff --git a/usr.bin/tip/libacu/dn11.c b/usr.bin/tip/libacu/dn11.c
deleted file mode 100644
index a0b18ba..0000000
--- a/usr.bin/tip/libacu/dn11.c
+++ /dev/null
@@ -1,149 +0,0 @@
-/* $OpenBSD: dn11.c,v 1.9 2006/03/17 19:17:13 moritz Exp $ */
-/* $NetBSD: dn11.c,v 1.4 1995/10/29 00:49:53 pk Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)dn11.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: dn11.c,v 1.9 2006/03/17 19:17:13 moritz Exp $";
-#endif
-#endif /* not lint */
-
-/*
- * Routines for dialing up on DN-11
- */
-#include "tip.h"
-
-static jmp_buf jmpbuf;
-static pid_t child = -1, dn;
-
-static void alarmtr(int);
-
-int
-dn_dialer(char *num, char *acu)
-{
- int lt, nw;
- int timelim;
- struct termios cntrl;
-
- if (boolean(value(VERBOSE)))
- printf("\nstarting call...");
- if ((dn = open(acu, 1)) < 0) {
- if (errno == EBUSY)
- printf("line busy...");
- else
- printf("acu open error...");
- return (0);
- }
- if (setjmp(jmpbuf)) {
- kill(child, SIGKILL);
- close(dn);
- return (0);
- }
- signal(SIGALRM, alarmtr);
- timelim = 5 * strlen(num);
- alarm(timelim < 30 ? 30 : timelim);
- if ((child = fork()) == 0) {
- /*
- * ignore this stuff for aborts
- */
- signal(SIGALRM, SIG_IGN);
- signal(SIGINT, SIG_IGN);
- signal(SIGQUIT, SIG_IGN);
- sleep(2);
- nw = write(dn, num, lt = strlen(num));
- exit(nw != lt);
- }
- /*
- * open line - will return on carrier
- */
- if ((FD = open(DV, 2)) < 0) {
- if (errno == EIO)
- printf("lost carrier...");
- else
- printf("dialup line open failed...");
- alarm(0);
- kill(child, SIGKILL);
- close(dn);
- return (0);
- }
- alarm(0);
- tcgetattr(dn, &cntrl);
- cntrl.c_cflag |= HUPCL;
- tcsetattr(dn, TCSANOW, &cntrl);
- signal(SIGALRM, SIG_DFL);
- while ((nw = wait(&lt)) != child && nw != -1)
- ;
- fflush(stdout);
- close(dn);
- if (lt != 0) {
- close(FD);
- return (0);
- }
- return (1);
-}
-
-/*ARGSUSED*/
-static void
-alarmtr(int signo)
-{
- alarm(0);
- longjmp(jmpbuf, 1);
-}
-
-/*
- * Insurance, for some reason we don't seem to be
- * hanging up...
- */
-void
-dn_disconnect(void)
-{
- sleep(2);
- if (FD > 0)
- ioctl(FD, TIOCCDTR, 0);
- close(FD);
-}
-
-void
-dn_abort(void)
-{
- sleep(2);
- if (child > 0)
- kill(child, SIGKILL);
- if (dn > 0)
- close(dn);
- if (FD > 0)
- ioctl(FD, TIOCCDTR, 0);
- close(FD);
-}
diff --git a/usr.bin/tip/libacu/hayes.c b/usr.bin/tip/libacu/hayes.c
deleted file mode 100644
index fe52274..0000000
--- a/usr.bin/tip/libacu/hayes.c
+++ /dev/null
@@ -1,320 +0,0 @@
-/* $OpenBSD: hayes.c,v 1.13 2006/03/17 19:17:13 moritz Exp $ */
-/* $NetBSD: hayes.c,v 1.6 1997/02/11 09:24:17 mrg Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)hayes.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: hayes.c,v 1.13 2006/03/17 19:17:13 moritz Exp $";
-#endif
-#endif /* not lint */
-
-/*
- * Routines for calling up on a Hayes Modem
- * (based on the old VenTel driver).
- * The modem is expected to be strapped for "echo".
- * Also, the switches enabling the DTR and CD lines
- * must be set correctly.
- * NOTICE:
- * The easy way to hang up a modem is always simply to
- * clear the DTR signal. However, if the +++ sequence
- * (which switches the modem back to local mode) is sent
- * before modem is hung up, removal of the DTR signal
- * has no effect (except that it prevents the modem from
- * recognizing commands).
- * (by Helge Skrivervik, Calma Company, Sunnyvale, CA. 1984)
- */
-/*
- * TODO:
- * It is probably not a good idea to switch the modem
- * state between 'verbose' and terse (status messages).
- * This should be kicked out and we should use verbose
- * mode only. This would make it consistent with normal
- * interactive use thru the command 'tip dialer'.
- */
-#include "tip.h"
-
-#include <termios.h>
-#include <sys/ioctl.h>
-
-#define min(a,b) ((a < b) ? a : b)
-
-static int dialtimeout = 0;
-static jmp_buf timeoutbuf;
-
-#define DUMBUFLEN 40
-static char dumbuf[DUMBUFLEN];
-
-#define DIALING 1
-#define IDLE 2
-#define CONNECTED 3
-#define FAILED 4
-static int state = IDLE;
-
-static void sigALRM(int);
-static char gobble(char *);
-static void error_rep(char);
-static void goodbye(void);
-static int hay_sync(void);
-
-int
-hay_dialer(char *num, char *acu)
-{
- char *cp;
- int connected = 0;
- char dummy;
- struct termios cntrl;
-#ifdef ACULOG
- char line[80];
-#endif
- if (hay_sync() == 0) /* make sure we can talk to the modem */
- return(0);
- if (boolean(value(VERBOSE)))
- printf("\ndialing...");
- fflush(stdout);
- tcgetattr(FD, &cntrl);
- cntrl.c_cflag |= HUPCL;
- tcsetattr(FD, TCSANOW, &cntrl);
- tcflush(FD, TCIOFLUSH);
- write(FD, "ATv0\r", 5); /* tell modem to use short status codes */
- gobble("\r");
- gobble("\r");
- write(FD, "ATTD", 4); /* send dial command */
- for (cp = num; *cp; cp++)
- if (*cp == '=')
- *cp = ',';
- write(FD, num, strlen(num));
- state = DIALING;
- write(FD, "\r", 1);
- connected = 0;
- if (gobble("\r")) {
- if ((dummy = gobble("01234")) != '1')
- error_rep(dummy);
- else
- connected = 1;
- }
- if (connected)
- state = CONNECTED;
- else {
- state = FAILED;
- return (connected); /* lets get out of here.. */
- }
- tcflush(FD, TCIOFLUSH);
-#ifdef ACULOG
- if (dialtimeout) {
- (void)snprintf(line, sizeof line, "%ld second dial timeout",
- number(value(DIALTIMEOUT)));
- logent(value(HOST), num, "hayes", line);
- }
-#endif
- if (dialtimeout)
- hay_disconnect(); /* insurance */
- return (connected);
-}
-
-void
-hay_disconnect(void)
-{
- /* first hang up the modem*/
-#ifdef DEBUG
- printf("\rdisconnecting modem....\n\r");
-#endif
- ioctl(FD, TIOCCDTR, 0);
- sleep(1);
- ioctl(FD, TIOCSDTR, 0);
- goodbye();
-}
-
-void
-hay_abort(void)
-{
- write(FD, "\r", 1); /* send anything to abort the call */
- hay_disconnect();
-}
-
-/*ARGSUSED*/
-static void
-sigALRM(int signo)
-{
- printf("\07timeout waiting for reply\n\r");
- dialtimeout = 1;
- longjmp(timeoutbuf, 1);
-}
-
-static char
-gobble(char *match)
-{
- char c;
- sig_t f;
- size_t i;
- int status = 0;
-
- f = signal(SIGALRM, sigALRM);
- dialtimeout = 0;
-#ifdef DEBUG
- printf("\ngobble: waiting for %s\n", match);
-#endif
- do {
- if (setjmp(timeoutbuf)) {
- signal(SIGALRM, f);
- return (0);
- }
- alarm(number(value(DIALTIMEOUT)));
- read(FD, &c, 1);
- alarm(0);
- c &= 0177;
-#ifdef DEBUG
- printf("%c 0x%x ", c, c);
-#endif
- for (i = 0; i < strlen(match); i++)
- if (c == match[i])
- status = c;
- } while (status == 0);
- signal(SIGALRM, SIG_DFL);
-#ifdef DEBUG
- printf("\n");
-#endif
- return (status);
-}
-
-static void
-error_rep(char c)
-{
- printf("\n\r");
- switch (c) {
-
- case '0':
- printf("OK");
- break;
-
- case '1':
- printf("CONNECT");
- break;
-
- case '2':
- printf("RING");
- break;
-
- case '3':
- printf("NO CARRIER");
- break;
-
- case '4':
- printf("ERROR in input");
- break;
-
- case '5':
- printf("CONNECT 1200");
- break;
-
- default:
- printf("Unknown Modem error: %c (0x%x)", c, c);
- }
- printf("\n\r");
- return;
-}
-
-/*
- * set modem back to normal verbose status codes.
- */
-static void
-goodbye(void)
-{
- int len;
- char c;
-
- tcflush(FD, TCIOFLUSH);
- if (hay_sync()) {
- sleep(1);
-#ifndef DEBUG
- tcflush(FD, TCIOFLUSH);
-#endif
- write(FD, "ATH0\r", 5); /* insurance */
-#ifndef DEBUG
- c = gobble("03");
- if (c != '0' && c != '3') {
- printf("cannot hang up modem\n\r");
- printf("please use 'tip dialer' to make sure the line is hung up\n\r");
- }
-#endif
- sleep(1);
- ioctl(FD, FIONREAD, &len);
-#ifdef DEBUG
- printf("goodbye1: len=%d -- ", len);
- rlen = read(FD, dumbuf, min(len, DUMBUFLEN));
- dumbuf[rlen] = '\0';
- printf("read (%d): %s\r\n", rlen, dumbuf);
-#endif
- write(FD, "ATv1\r", 5);
- sleep(1);
-#ifdef DEBUG
- ioctl(FD, FIONREAD, &len);
- printf("goodbye2: len=%d -- ", len);
- rlen = read(FD, dumbuf, min(len, DUMBUFLEN));
- dumbuf[rlen] = '\0';
- printf("read (%d): %s\r\n", rlen, dumbuf);
-#endif
- }
- tcflush(FD, TCIOFLUSH);
- ioctl(FD, TIOCCDTR, 0); /* clear DTR (insurance) */
- close(FD);
-}
-
-#define MAXRETRY 5
-
-static int
-hay_sync(void)
-{
- int len, retry = 0;
-
- while (retry++ <= MAXRETRY) {
- write(FD, "AT\r", 3);
- sleep(1);
- ioctl(FD, FIONREAD, &len);
- if (len) {
- len = read(FD, dumbuf, min(len, DUMBUFLEN));
- if (strchr(dumbuf, '0') ||
- (strchr(dumbuf, 'O') && strchr(dumbuf, 'K')))
- return(1);
-#ifdef DEBUG
- dumbuf[len] = '\0';
- printf("hay_sync: (\"%s\") %d\n\r", dumbuf, retry);
-#endif
- }
- ioctl(FD, TIOCCDTR, 0);
- ioctl(FD, TIOCSDTR, 0);
- }
- printf("Cannot synchronize with hayes...\n\r");
- return(0);
-}
diff --git a/usr.bin/tip/libacu/t3000.c b/usr.bin/tip/libacu/t3000.c
deleted file mode 100644
index a640ff3..0000000
--- a/usr.bin/tip/libacu/t3000.c
+++ /dev/null
@@ -1,372 +0,0 @@
-/* $OpenBSD: t3000.c,v 1.14 2006/03/17 19:17:13 moritz Exp $ */
-/* $NetBSD: t3000.c,v 1.5 1997/02/11 09:24:18 mrg Exp $ */
-
-/*
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)t3000.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: t3000.c,v 1.14 2006/03/17 19:17:13 moritz Exp $";
-#endif
-#endif /* not lint */
-
-/*
- * Routines for calling up on a Telebit T3000 modem.
- * Derived from Courier driver.
- */
-#include "tip.h"
-
-#include <sys/ioctl.h>
-#include <stdio.h>
-
-#define MAXRETRY 5
-
-static int dialtimeout = 0;
-static int connected = 0;
-static jmp_buf timeoutbuf;
-
-static void sigALRM(int);
-static int t3000_swallow(char *);
-static int t3000_connect(void);
-static int t3000_sync(void);
-static void t3000_write(int, char *, int);
-static void t3000_nap(void);
-#ifdef DEBUG
-static void t3000_verbose_read(void);
-#endif
-
-int
-t3000_dialer(char *num, char *acu)
-{
- char *cp;
- struct termios cntrl;
-#ifdef ACULOG
- char line[80];
-#endif
-
- if (boolean(value(VERBOSE)))
- printf("Using \"%s\"\n", acu);
-
- tcgetattr(FD, &cntrl);
- cntrl.c_cflag |= HUPCL;
- tcsetattr(FD, TCSANOW, &cntrl);
- /*
- * Get in synch.
- */
- if (!t3000_sync()) {
-badsynch:
- printf("can't synchronize with t3000\n");
-#ifdef ACULOG
- logent(value(HOST), num, "t3000", "can't synch up");
-#endif
- return (0);
- }
- t3000_write(FD, "AT E0\r", 6); /* turn off echoing */
- sleep(1);
-#ifdef DEBUG
- if (boolean(value(VERBOSE)))
- t3000_verbose_read();
-#endif
- tcflush(FD, TCIOFLUSH);
- t3000_write(FD, "AT E0 H0 Q0 X4 V1\r", 18);
- if (!t3000_swallow("\r\nOK\r\n"))
- goto badsynch;
- fflush(stdout);
- t3000_write(FD, "AT D", 4);
- for (cp = num; *cp; cp++)
- if (*cp == '=')
- *cp = ',';
- t3000_write(FD, num, strlen(num));
- t3000_write(FD, "\r", 1);
- connected = t3000_connect();
-#ifdef ACULOG
- if (dialtimeout) {
- (void)snprintf(line, sizeof line, "%ld second dial timeout",
- number(value(DIALTIMEOUT)));
- logent(value(HOST), num, "t3000", line);
- }
-#endif
- if (dialtimeout)
- t3000_disconnect();
- return (connected);
-}
-
-void
-t3000_disconnect(void)
-{
- /* first hang up the modem*/
- ioctl(FD, TIOCCDTR, 0);
- sleep(1);
- ioctl(FD, TIOCSDTR, 0);
- t3000_sync(); /* reset */
- close(FD);
-}
-
-void
-t3000_abort(void)
-{
- t3000_write(FD, "\r", 1); /* send anything to abort the call */
- t3000_disconnect();
-}
-
-/*ARGSUSED*/
-static void
-sigALRM(int signo)
-{
- printf("\07timeout waiting for reply\n");
- dialtimeout = 1;
- longjmp(timeoutbuf, 1);
-}
-
-static int
-t3000_swallow(char *match)
-{
- sig_t f;
- char c;
-
- f = signal(SIGALRM, sigALRM);
- dialtimeout = 0;
- do {
- if (*match =='\0') {
- signal(SIGALRM, f);
- return (1);
- }
- if (setjmp(timeoutbuf)) {
- signal(SIGALRM, f);
- return (0);
- }
- alarm(number(value(DIALTIMEOUT)));
- read(FD, &c, 1);
- alarm(0);
- c &= 0177;
-#ifdef DEBUG
- if (boolean(value(VERBOSE)))
- putchar(c);
-#endif
- } while (c == *match++);
-#ifdef DEBUG
- if (boolean(value(VERBOSE)))
- fflush(stdout);
-#endif
- signal(SIGALRM, SIG_DFL);
- return (0);
-}
-
-#ifndef B19200 /* XXX */
-#define B19200 EXTA
-#define B38400 EXTB
-#endif
-
-struct tbaud_msg {
- char *msg;
- int baud;
- int baud2;
-} tbaud_msg[] = {
- { "", B300, 0 },
- { " 1200", B1200, 0 },
- { " 2400", B2400, 0 },
- { " 4800", B4800, 0 },
- { " 9600", B9600, 0 },
- { " 14400", B19200, B9600 },
- { " 19200", B19200, B9600 },
- { " 38400", B38400, B9600 },
- { " 57600", B38400, B9600 },
- { " 7512", B9600, 0 },
- { " 1275", B2400, 0 },
- { " 7200", B9600, 0 },
- { " 12000", B19200, B9600 },
- { 0, 0, 0 },
-};
-
-static int
-t3000_connect(void)
-{
- char c;
- int nc, nl, n;
- char dialer_buf[64];
- struct tbaud_msg *bm;
- sig_t f;
-
- if (t3000_swallow("\r\n") == 0)
- return (0);
- f = signal(SIGALRM, sigALRM);
-again:
- nc = 0; nl = sizeof(dialer_buf)-1;
- bzero(dialer_buf, sizeof(dialer_buf));
- dialtimeout = 0;
- for (nc = 0, nl = sizeof(dialer_buf)-1 ; nl > 0 ; nc++, nl--) {
- if (setjmp(timeoutbuf))
- break;
- alarm(number(value(DIALTIMEOUT)));
- n = read(FD, &c, 1);
- alarm(0);
- if (n <= 0)
- break;
- c &= 0x7f;
- if (c == '\r') {
- if (t3000_swallow("\n") == 0)
- break;
- if (!dialer_buf[0])
- goto again;
- if (strcmp(dialer_buf, "RINGING") == 0 &&
- boolean(value(VERBOSE))) {
-#ifdef DEBUG
- printf("%s\r\n", dialer_buf);
-#endif
- goto again;
- }
- if (strncmp(dialer_buf, "CONNECT",
- sizeof("CONNECT")-1) != 0)
- break;
- for (bm = tbaud_msg ; bm->msg ; bm++)
- if (strcmp(bm->msg,
- dialer_buf+sizeof("CONNECT")-1) == 0) {
- struct termios cntrl;
-
- tcgetattr(FD, &cntrl);
- cfsetospeed(&cntrl, bm->baud);
- cfsetispeed(&cntrl, bm->baud);
- tcsetattr(FD, TCSAFLUSH, &cntrl);
- signal(SIGALRM, f);
-#ifdef DEBUG
- if (boolean(value(VERBOSE)))
- printf("%s\r\n", dialer_buf);
-#endif
- return (1);
- }
- break;
- }
- dialer_buf[nc] = c;
-#ifdef notdef
- if (boolean(value(VERBOSE)))
- putchar(c);
-#endif
- }
- printf("%s\r\n", dialer_buf);
- signal(SIGALRM, f);
- return (0);
-}
-
-/*
- * This convoluted piece of code attempts to get
- * the t3000 in sync.
- */
-static int
-t3000_sync(void)
-{
- int already = 0;
- int len;
- char buf[40];
-
- while (already++ < MAXRETRY) {
- tcflush(FD, TCIOFLUSH);
- t3000_write(FD, "\rAT Z\r", 6); /* reset modem */
- bzero(buf, sizeof(buf));
- sleep(2);
- ioctl(FD, FIONREAD, &len);
-#if 1
-if (len == 0) len = 1;
-#endif
- if (len) {
- len = read(FD, buf, sizeof(buf));
-#ifdef DEBUG
- buf[len] = '\0';
- printf("t3000_sync: (\"%s\")\n\r", buf);
-#endif
- if (strchr(buf, '0') ||
- (strchr(buf, 'O') && strchr(buf, 'K')))
- return(1);
- }
- /*
- * If not strapped for DTR control,
- * try to get command mode.
- */
- sleep(1);
- t3000_write(FD, "+++", 3);
- sleep(1);
- /*
- * Toggle DTR to force anyone off that might have left
- * the modem connected.
- */
- ioctl(FD, TIOCCDTR, 0);
- sleep(1);
- ioctl(FD, TIOCSDTR, 0);
- }
- t3000_write(FD, "\rAT Z\r", 6);
- return (0);
-}
-
-static void
-t3000_write(int fd, char *cp, int n)
-{
-#ifdef notdef
- if (boolean(value(VERBOSE)))
- write(1, cp, n);
-#endif
- tcdrain(fd);
- t3000_nap();
- for ( ; n-- ; cp++) {
- write(fd, cp, 1);
- tcdrain(fd);
- t3000_nap();
- }
-}
-
-#ifdef DEBUG
-static void
-t3000_verbose_read(void)
-{
- int n = 0;
- char buf[BUFSIZ];
-
- if (ioctl(FD, FIONREAD, &n) < 0)
- return;
- if (n <= 0)
- return;
- if (read(FD, buf, n) != n)
- return;
- write(1, buf, n);
-}
-#endif
-
-/* Give the t3000 50 milliseconds between characters */
-static void
-t3000_nap(void)
-{
- struct timespec ts;
-
- ts.tv_sec = 0;
- ts.tv_nsec = 50 * 1000000;
-
- nanosleep(&ts, NULL);
-}
diff --git a/usr.bin/tip/libacu/v3451.c b/usr.bin/tip/libacu/v3451.c
deleted file mode 100644
index 0de679e..0000000
--- a/usr.bin/tip/libacu/v3451.c
+++ /dev/null
@@ -1,212 +0,0 @@
-/* $OpenBSD: v3451.c,v 1.9 2006/03/17 19:17:13 moritz Exp $ */
-/* $NetBSD: v3451.c,v 1.6 1997/02/11 09:24:20 mrg Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)v3451.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: v3451.c,v 1.9 2006/03/17 19:17:13 moritz Exp $";
-#endif
-#endif /* not lint */
-
-/*
- * Routines for calling up on a Vadic 3451 Modem
- */
-#include "tip.h"
-
-static jmp_buf Sjbuf;
-
-static void vawrite(char *, int);
-static int expect(char *);
-static void alarmtr(int);
-static int notin(char *, char *);
-static int prefix(char *, char *);
-
-int
-v3451_dialer(char *num, char *acu)
-{
- sig_t func;
- int ok;
- int slow = number(value(BAUDRATE)) < 1200;
- char phone[50];
- struct termios cntrl;
-
- /*
- * Get in synch
- */
- vawrite("I\r", 1 + slow);
- vawrite("I\r", 1 + slow);
- vawrite("I\r", 1 + slow);
- vawrite("\005\r", 2 + slow);
- if (!expect("READY")) {
- printf("can't synchronize with vadic 3451\n");
-#ifdef ACULOG
- logent(value(HOST), num, "vadic", "can't synch up");
-#endif
- return (0);
- }
- tcgetattr(FD, &cntrl);
- term.c_cflag |= HUPCL;
- tcsetattr(FD, TCSANOW, &cntrl);
- sleep(1);
- vawrite("D\r", 2 + slow);
- if (!expect("NUMBER?")) {
- printf("Vadic will not accept dial command\n");
-#ifdef ACULOG
- logent(value(HOST), num, "vadic", "will not accept dial");
-#endif
- return (0);
- }
- (void)snprintf(phone, sizeof phone, "%s\r", num);
- vawrite(phone, 1 + slow);
- if (!expect(phone)) {
- printf("Vadic will not accept phone number\n");
-#ifdef ACULOG
- logent(value(HOST), num, "vadic", "will not accept number");
-#endif
- return (0);
- }
- func = signal(SIGINT,SIG_IGN);
- /*
- * You cannot interrupt the Vadic when its dialing;
- * even dropping DTR does not work (definitely a
- * brain damaged design).
- */
- vawrite("\r", 1 + slow);
- vawrite("\r", 1 + slow);
- if (!expect("DIALING:")) {
- printf("Vadic failed to dial\n");
-#ifdef ACULOG
- logent(value(HOST), num, "vadic", "failed to dial");
-#endif
- return (0);
- }
- if (boolean(value(VERBOSE)))
- printf("\ndialing...");
- ok = expect("ON LINE");
- signal(SIGINT, func);
- if (!ok) {
- printf("call failed\n");
-#ifdef ACULOG
- logent(value(HOST), num, "vadic", "call failed");
-#endif
- return (0);
- }
- tcflush(FD, TCIOFLUSH);
- return (1);
-}
-
-void
-v3451_disconnect(void)
-{
- close(FD);
-}
-
-void
-v3451_abort(void)
-{
- close(FD);
-}
-
-static void
-vawrite(char *cp, int delay)
-{
- for (; *cp; sleep(delay), cp++)
- write(FD, cp, 1);
-}
-
-static int
-expect(char *cp)
-{
- char buf[300];
- char *rp = buf;
- int timeout = 30, online = 0;
-
- if (strcmp(cp, "\"\"") == 0)
- return (1);
- *rp = 0;
- /*
- * If we are waiting for the Vadic to complete
- * dialing and get a connection, allow more time
- * Unfortunately, the Vadic times out 24 seconds after
- * the last digit is dialed
- */
- online = strcmp(cp, "ON LINE") == 0;
- if (online)
- timeout = number(value(DIALTIMEOUT));
- signal(SIGALRM, alarmtr);
- if (setjmp(Sjbuf))
- return (0);
- alarm(timeout);
- while (notin(cp, buf) && rp < buf + sizeof (buf) - 1) {
- if (online && notin("FAILED CALL", buf) == 0)
- return (0);
- if (read(FD, rp, 1) < 0) {
- alarm(0);
- return (0);
- }
- if (*rp &= 0177)
- rp++;
- *rp = '\0';
- }
- alarm(0);
- return (1);
-}
-
-/*ARGSUSED*/
-static void
-alarmtr(int signo)
-{
- longjmp(Sjbuf, 1);
-}
-
-static int
-notin(char *sh, char *lg)
-{
- for (; *lg; lg++)
- if (prefix(sh, lg))
- return (0);
- return (1);
-}
-
-static int
-prefix(char *s1, char *s2)
-{
- char c;
-
- while ((c = *s1++) == *s2++)
- if (c == '\0')
- return (1);
- return (c == '\0');
-}
diff --git a/usr.bin/tip/libacu/v831.c b/usr.bin/tip/libacu/v831.c
deleted file mode 100644
index 7adc3c6..0000000
--- a/usr.bin/tip/libacu/v831.c
+++ /dev/null
@@ -1,263 +0,0 @@
-/* $OpenBSD: v831.c,v 1.11 2006/03/17 19:17:13 moritz Exp $ */
-/* $NetBSD: v831.c,v 1.5 1996/12/29 10:42:01 cgd Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)v831.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: v831.c,v 1.11 2006/03/17 19:17:13 moritz Exp $";
-#endif
-#endif /* not lint */
-
-/*
- * Routines for dialing up on Vadic 831
- */
-#include "tip.h"
-#include <termios.h>
-
-static jmp_buf jmpbuf;
-static pid_t child = -1;
-
-static void alarmtr(int);
-static int dialit(char *, char *);
-static char * sanitize(char *);
-
-int
-v831_dialer(char *num, char *acu)
-{
- int status;
- int timelim;
- pid_t pid;
-
- if (boolean(value(VERBOSE)))
- printf("\nstarting call...");
-#ifdef DEBUG
- printf ("(acu=%s)\n", acu);
-#endif
- if ((AC = open(acu, O_RDWR)) < 0) {
- if (errno == EBUSY)
- printf("line busy...");
- else
- printf("acu open error...");
- return (0);
- }
- if (setjmp(jmpbuf)) {
- kill(child, SIGKILL);
- close(AC);
- return (0);
- }
- signal(SIGALRM, alarmtr);
- timelim = 5 * strlen(num);
- alarm(timelim < 30 ? 30 : timelim);
- if ((child = fork()) == 0) {
- /*
- * ignore this stuff for aborts
- */
- signal(SIGALRM, SIG_IGN);
- signal(SIGINT, SIG_IGN);
- signal(SIGQUIT, SIG_IGN);
- sleep(2);
- exit(dialit(num, acu) != 'A');
- }
- /*
- * open line - will return on carrier
- */
- if ((FD = open(DV, O_RDWR)) < 0) {
-#ifdef DEBUG
- printf("(after open, errno=%d)\n", errno);
-#endif
- if (errno == EIO)
- printf("lost carrier...");
- else
- printf("dialup line open failed...");
- alarm(0);
- kill(child, SIGKILL);
- close(AC);
- return (0);
- }
- alarm(0);
- signal(SIGALRM, SIG_DFL);
- while ((pid = wait(&status)) != child && pid != -1)
- ;
- if (status) {
- close(AC);
- return (0);
- }
- return (1);
-}
-
-/*ARGSUSED*/
-static void
-alarmtr(int signo)
-{
- alarm(0);
- longjmp(jmpbuf, 1);
-}
-
-/*
- * Insurance, for some reason we don't seem to be
- * hanging up...
- */
-void
-v831_disconnect(void)
-{
- struct termios cntrl;
-
- sleep(2);
-#ifdef DEBUG
- printf("[disconnect: FD=%d]\n", FD);
-#endif
- if (FD > 0) {
- ioctl(FD, TIOCCDTR, 0);
- tcgetattr(FD, &cntrl);
- cfsetospeed(&cntrl, 0);
- cfsetispeed(&cntrl, 0);
- tcsetattr(FD, TCSAFLUSH, &cntrl);
- ioctl(FD, TIOCNXCL, NULL);
- }
- close(FD);
-}
-
-void
-v831_abort(void)
-{
-#ifdef DEBUG
- printf("[abort: AC=%d]\n", AC);
-#endif
- sleep(2);
- if (child > 0)
- kill(child, SIGKILL);
- if (FD > 0)
- ioctl(FD, TIOCNXCL, NULL);
- close(AC);
- if (FD > 0)
- ioctl(FD, TIOCCDTR, 0);
- close(FD);
-}
-
-/*
- * Sigh, this probably must be changed at each site.
- */
-struct vaconfig {
- char *vc_name;
- char vc_rack;
- char vc_modem;
-} vaconfig[] = {
- { "/dev/cua0",'4','0' },
- { "/dev/cua1",'4','1' },
- { NULL, '\0', '\0' }
-};
-
-#define pc(x) (c = x, write(AC,&c,1))
-#define ABORT 01
-#define SI 017
-#define STX 02
-#define ETX 03
-
-static int
-dialit(char *phonenum, char *acu)
-{
- struct vaconfig *vp;
- struct termios cntrl;
- char c;
- int i;
-
- phonenum = sanitize(phonenum);
-#ifdef DEBUG
- printf ("(dial phonenum=%s)\n", phonenum);
-#endif
- if (*phonenum == '<' && phonenum[1] == 0)
- return ('Z');
- for (vp = vaconfig; vp->vc_name; vp++)
- if (strcmp(vp->vc_name, acu) == 0)
- break;
- if (vp->vc_name == 0) {
- printf("Unable to locate dialer (%s)\n", acu);
- return ('K');
- }
- tcgetattr(AC, &cntrl);
- cfsetospeed(&cntrl, B2400);
- cfsetispeed(&cntrl, B2400);
- cntrl.c_cflag |= PARODD | PARENB;
- cntrl.c_lflag &= ~(ISIG | ICANON);
- tcsetattr(AC, TCSANOW, &cntrl);
- tcflush(AC, TCIOFLUSH);
- pc(STX);
- pc(vp->vc_rack);
- pc(vp->vc_modem);
- while (*phonenum && *phonenum != '<')
- pc(*phonenum++);
- pc(SI);
- pc(ETX);
- sleep(1);
- i = read(AC, &c, 1);
-#ifdef DEBUG
- printf("read %d chars, char=%c, errno %d\n", i, c, errno);
-#endif
- if (i != 1)
- c = 'M';
- if (c == 'B' || c == 'G') {
- char cc, oc = c;
-
- pc(ABORT);
- read(AC, &cc, 1);
-#ifdef DEBUG
- printf("abort response=%c\n", cc);
-#endif
- c = oc;
- v831_disconnect();
- }
- close(AC);
-#ifdef DEBUG
- printf("dialit: returns %c\n", c);
-#endif
- return (c);
-}
-
-static char *
-sanitize(char *s)
-{
- static char buf[128];
- char *cp;
-
- for (cp = buf; *s; s++) {
- if (!isdigit(*s) && *s == '<' && *s != '_')
- continue;
- if (*s == '_')
- *s = '=';
- *cp++ = *s;
- }
- *cp++ = 0;
- return (buf);
-}
diff --git a/usr.bin/tip/libacu/ventel.c b/usr.bin/tip/libacu/ventel.c
deleted file mode 100644
index 399b5d8..0000000
--- a/usr.bin/tip/libacu/ventel.c
+++ /dev/null
@@ -1,259 +0,0 @@
-/* $OpenBSD: ventel.c,v 1.12 2006/03/17 19:17:13 moritz Exp $ */
-/* $NetBSD: ventel.c,v 1.6 1997/02/11 09:24:21 mrg Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)ventel.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: ventel.c,v 1.12 2006/03/17 19:17:13 moritz Exp $";
-#endif
-#endif /* not lint */
-
-/*
- * Routines for calling up on a Ventel Modem
- * The Ventel is expected to be strapped for local echo (just like uucp)
- */
-#include "tip.h"
-#include <termios.h>
-#include <sys/ioctl.h>
-
-#define MAXRETRY 5
-
-static int dialtimeout = 0;
-static jmp_buf timeoutbuf;
-
-static void echo(char *);
-static void sigALRM(int);
-static int gobble(char, char *);
-static int vensync(int);
-
-/*
- * some sleep calls have been replaced by this macro
- * because some ventel modems require two <cr>s in less than
- * a second in order to 'wake up'... yes, it is dirty...
- */
-#define delay(num,denom) busyloop(CPUSPEED*num/denom)
-#define CPUSPEED 1000000 /* VAX 780 is 1MIPS */
-#define DELAY(n) do { long N = (n); while (--N > 0); } while (0)
-#define busyloop(n) do { DELAY(n); } while (0)
-
-int
-ven_dialer(char *num, char *acu)
-{
- char *cp;
- int connected = 0;
- char *msg, line[80];
- struct termios cntrl;
-
- /*
- * Get in synch with a couple of carriage returns
- */
- if (!vensync(FD)) {
- printf("can't synchronize with ventel\n");
-#ifdef ACULOG
- logent(value(HOST), num, "ventel", "can't synch up");
-#endif
- return (0);
- }
- if (boolean(value(VERBOSE)))
- printf("\ndialing...");
- fflush(stdout);
- tcgetattr(FD, &cntrl);
- cntrl.c_cflag |= HUPCL;
- tcsetattr(FD, TCSANOW, &cntrl);
- echo("#k$\r$\n$D$I$A$L$:$ ");
- for (cp = num; *cp; cp++) {
- delay(1, 10);
- write(FD, cp, 1);
- }
- delay(1, 10);
- write(FD, "\r", 1);
- gobble('\n', line);
- if (gobble('\n', line))
- connected = gobble('!', line);
- tcflush(FD, TCIOFLUSH);
-#ifdef ACULOG
- if (dialtimeout) {
- (void)snprintf(line, sizeof line, "%ld second dial timeout",
- number(value(DIALTIMEOUT)));
- logent(value(HOST), num, "ventel", line);
- }
-#endif
- if (dialtimeout)
- ven_disconnect(); /* insurance */
- if (connected || dialtimeout || !boolean(value(VERBOSE)))
- return (connected);
- /* call failed, parse response for user */
- cp = strchr(line, '\r');
- if (cp)
- *cp = '\0';
- for (cp = line; (cp = strchr(cp, ' ')) != NULL; cp++)
- if (cp[1] == ' ')
- break;
- if (cp) {
- while (*cp == ' ')
- cp++;
- msg = cp;
- while (*cp) {
- if (isupper(*cp))
- *cp = tolower(*cp);
- cp++;
- }
- printf("%s...", msg);
- }
- return (connected);
-}
-
-void
-ven_disconnect(void)
-{
- close(FD);
-}
-
-void
-ven_abort(void)
-{
- write(FD, "\03", 1);
- close(FD);
-}
-
-static void
-echo(char *s)
-{
- char c;
-
- while ((c = *s++) != '\0')
- switch (c) {
- case '$':
- read(FD, &c, 1);
- s++;
- break;
-
- case '#':
- c = *s++;
- write(FD, &c, 1);
- break;
-
- default:
- write(FD, &c, 1);
- read(FD, &c, 1);
- }
-}
-
-/*ARGSUSED*/
-static void
-sigALRM(int signo)
-{
- printf("\07timeout waiting for reply\n");
- dialtimeout = 1;
- longjmp(timeoutbuf, 1);
-}
-
-static int
-gobble(char match, char response[])
-{
- char *cp = response;
- sig_t f;
- char c;
-
- f = signal(SIGALRM, sigALRM);
- dialtimeout = 0;
- do {
- if (setjmp(timeoutbuf)) {
- signal(SIGALRM, f);
- *cp = '\0';
- return (0);
- }
- alarm(number(value(DIALTIMEOUT)));
- read(FD, cp, 1);
- alarm(0);
- c = (*cp++ &= 0177);
-#ifdef notdef
- if (boolean(value(VERBOSE)))
- putchar(c);
-#endif
- } while (c != '\n' && c != match);
- signal(SIGALRM, SIG_DFL);
- *cp = '\0';
- return (c == match);
-}
-
-#define min(a,b) ((a)>(b)?(b):(a))
-/*
- * This convoluted piece of code attempts to get
- * the ventel in sync. If you don't have FIONREAD
- * there are gory ways to simulate this.
- */
-static int
-vensync(int fd)
-{
- int already = 0, nread;
- char buf[60];
-
- /*
- * Toggle DTR to force anyone off that might have left
- * the modem connected, and insure a consistent state
- * to start from.
- *
- * If you don't have the ioctl calls to diddle directly
- * with DTR, you can always try setting the baud rate to 0.
- */
- ioctl(FD, TIOCCDTR, 0);
- sleep(1);
- ioctl(FD, TIOCSDTR, 0);
- while (already < MAXRETRY) {
- /*
- * After reseting the modem, send it two \r's to
- * autobaud on. Make sure to delay between them
- * so the modem can frame the incoming characters.
- */
- write(fd, "\r", 1);
- delay(1,10);
- write(fd, "\r", 1);
- sleep(2);
- if (ioctl(fd, FIONREAD, (caddr_t)&nread) < 0) {
- perror("tip: ioctl");
- continue;
- }
- while (nread > 0) {
- read(fd, buf, min(nread, 60));
- if ((buf[nread - 1] & 0177) == '$')
- return (1);
- nread -= min(nread, 60);
- }
- sleep(1);
- already++;
- }
- return (0);
-}
diff --git a/usr.bin/tip/tip/Makefile b/usr.bin/tip/tip/Makefile
deleted file mode 100644
index b0fd1f8..0000000
--- a/usr.bin/tip/tip/Makefile
+++ /dev/null
@@ -1,57 +0,0 @@
-# $OpenBSD: Makefile,v 1.11 2006/05/25 08:41:52 jmc Exp $
-# $FreeBSD$
-#
-# Files are:
-# /etc/remote remote host description file
-# /etc/phones phone number file, owned by ${OWNER} and
-# mode 6??
-# /var/log/aculog ACU accounting file, owned by ${OWNER} and
-# mode 6?? {if ACULOG defined}
-# Presently supports:
-# BIZCOMP
-# DEC DF02-AC, DF03-AC
-# DEC DN-11/Able Quadracall
-# HAYES and Hayes emulators
-# USR COURIER (2400 baud)
-# VENTEL 212+
-# VADIC 831 RS232 adaptor
-# VADIC 3451
-# TELEBIT T3000
-#
-# Configuration defines:
-# DF02, DF03, DN11 ACU's supported
-# BIZ1031, BIZ1022, VENTEL, V831, V3451, HAYES, COURIER, T3000
-# ACULOG turn on tip logging of ACU use
-# PRISTINE no phone #'s put in ACU log file
-# CONNECT worthless command
-# DEFBR default baud rate to make connection at
-# DEFFS default frame size for FTP buffering of
-# writes on local side
-# BUFSIZ buffer sizing from stdio, must be fed
-# explicitly to remcap.c if not 1024
-# CONNECT enable ~C command (connect pgm to remote)
-
-PROG= tip
-LINKS= ${BINDIR}/tip ${BINDIR}/cu
-MAN= tip.1 cu.1
-CFLAGS+=-I${.CURDIR} -DDEFBR=9600 -DDEFFS=BUFSIZ -DACULOG -DPRISTINE \
- -DCONNECT -DV831 -DVENTEL -DHAYES -DCOURIER -DT3000
-WARNS?= 2
-.PATH: ${.CURDIR}/../libacu
-SRCS= acu.c acutab.c cmds.c cmdtab.c cu.c hunt.c log.c partab.c \
- remote.c tip.c tipout.c uucplock.c value.c vars.c \
- biz22.c courier.c df.c dn11.c hayes.c t3000.c v3451.c v831.c ventel.c
-
-# -- acutab is configuration dependent, and so depends on the Makefile
-# -- remote.o depends on the Makefile because of DEFBR and DEFFS
-# -- log.o depends on the Makefile because of ACULOG
-acutab.o log.o remote.o: Makefile
-
-.include <bsd.prog.mk>
-
-# Dirty, rotten hack. This can be removed when we are confident that there
-# is no cu(1) with the schg-bit set.
-beforeinstall:
-.if exists(${DESTDIR}${BINDIR}/cu)
- -@chflags noschg ${DESTDIR}${BINDIR}/cu
-.endif
diff --git a/usr.bin/tip/tip/acu.c b/usr.bin/tip/tip/acu.c
deleted file mode 100644
index 5d2cda6..0000000
--- a/usr.bin/tip/tip/acu.c
+++ /dev/null
@@ -1,195 +0,0 @@
-/* $OpenBSD: acu.c,v 1.12 2006/03/17 14:43:06 moritz Exp $ */
-/* $NetBSD: acu.c,v 1.4 1996/12/29 10:34:03 cgd Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)acu.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: acu.c,v 1.12 2006/03/17 14:43:06 moritz Exp $";
-#endif
-#endif /* not lint */
-
-#include "tip.h"
-
-static acu_t *acu = NOACU;
-static int conflag;
-static void acuabort(int);
-static acu_t *acutype(char *);
-static jmp_buf jmpbuf;
-/*
- * Establish connection for tip
- *
- * If DU is true, we should dial an ACU whose type is AT.
- * The phone numbers are in PN, and the call unit is in CU.
- *
- * If the PN is an '@', then we consult the PHONES file for
- * the phone numbers. This file is /etc/phones, unless overriden
- * by an exported shell variable.
- *
- * The data base files must be in the format:
- * host-name[ \t]*phone-number
- * with the possibility of multiple phone numbers
- * for a single host acting as a rotary (in the order
- * found in the file).
- */
-char *
-con(void)
-{
- char *cp = PN;
- char *phnum, string[256];
- FILE *fd;
- volatile int tried = 0;
-
- if (!DU) { /* regular connect message */
- if (CM != NOSTR)
- parwrite(FD, CM, size(CM));
- logent(value(HOST), "", DV, "call completed");
- return (NOSTR);
- }
- /*
- * @ =>'s use data base in PHONES environment variable
- * otherwise, use /etc/phones
- */
- signal(SIGINT, acuabort);
- signal(SIGQUIT, acuabort);
- if (setjmp(jmpbuf)) {
- signal(SIGINT, SIG_IGN);
- signal(SIGQUIT, SIG_IGN);
- printf("\ncall aborted\n");
- logent(value(HOST), "", "", "call aborted");
- if (acu != NOACU) {
- setboolean(value(VERBOSE), FALSE);
- if (conflag)
- disconnect(NOSTR);
- else
- (*acu->acu_abort)();
- }
- return ("interrupt");
- }
- if ((acu = acutype(AT)) == NOACU)
- return ("unknown ACU type");
- if (*cp != '@') {
- while (*cp) {
- phnum = cp;
- cp += strcspn(cp, ",");
- if (*cp != '\0')
- *cp++ = '\0';
-
- if (strlen(phnum) == 0)
- continue;
-
- conflag = (*acu->acu_dialer)(phnum, CU);
- if (conflag)
- break;
-
- logent(value(HOST), phnum, acu->acu_name, "call failed");
- tried++;
- }
- } else {
- if ((fd = fopen(PH, "r")) == NOFILE) {
- printf("%s: ", PH);
- return ("can't open phone number file");
- }
- while (fgets(string, sizeof(string), fd) != NOSTR) {
- cp = &string[strcspn(string, " \t\n")];
- if (*cp != '\0')
- *cp++ = '\0';
-
- if (strcmp(string, value(HOST)) != 0)
- continue;
-
- cp += strspn(cp, " \t\n");
- phnum = cp;
- *(cp + strcspn(cp, ",\n")) = '\0';
-
- if (strlen(phnum) == 0)
- continue;
-
- conflag = (*acu->acu_dialer)(phnum, CU);
- if (conflag)
- break;
-
- logent(value(HOST), phnum, acu->acu_name, "call failed");
- tried++;
- }
- fclose(fd);
- }
- if (conflag) {
- if (CM != NOSTR)
- parwrite(FD, CM, size(CM));
- logent(value(HOST), phnum, acu->acu_name, "call completed");
- return (NOSTR);
- } else if (!tried) {
- logent(value(HOST), "", acu->acu_name, "missing phone number");
- return ("missing phone number");
- } else {
- (*acu->acu_abort)();
- return ("call failed");
- }
-}
-
-void
-disconnect(char *reason)
-{
- if (!conflag) {
- logent(value(HOST), "", DV, "call terminated");
- return;
- }
- if (reason == NOSTR) {
- logent(value(HOST), "", acu->acu_name, "call terminated");
- if (boolean(value(VERBOSE)))
- printf("\r\ndisconnecting...");
- } else
- logent(value(HOST), "", acu->acu_name, reason);
- (*acu->acu_disconnect)();
-}
-
-static void
-acuabort(int s)
-{
- signal(s, SIG_IGN);
- longjmp(jmpbuf, 1);
-}
-
-static acu_t *
-acutype(char *s)
-{
- acu_t *p;
- extern acu_t acutable[];
-
- for (p = acutable; p->acu_name != '\0'; p++)
- if (!strcmp(s, p->acu_name))
- return (p);
- return (NOACU);
-}
diff --git a/usr.bin/tip/tip/acutab.c b/usr.bin/tip/tip/acutab.c
deleted file mode 100644
index 5f64968..0000000
--- a/usr.bin/tip/tip/acutab.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* $OpenBSD: acutab.c,v 1.5 2006/03/17 19:17:13 moritz Exp $ */
-/* $NetBSD: acutab.c,v 1.3 1994/12/08 09:30:41 jtc Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)acutab.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: acutab.c,v 1.5 2006/03/17 19:17:13 moritz Exp $";
-#endif
-#endif /* not lint */
-
-#include "tip.h"
-
-acu_t acutable[] = {
-#if BIZ1031
- { "biz31f", biz31f_dialer, biz31_disconnect, biz31_abort },
- { "biz31w", biz31w_dialer, biz31_disconnect, biz31_abort },
-#endif
-#if BIZ1022
- { "biz22f", biz22f_dialer, biz22_disconnect, biz22_abort },
- { "biz22w", biz22w_dialer, biz22_disconnect, biz22_abort },
-#endif
-#if DF02
- { "df02", df02_dialer, df_disconnect, df_abort },
-#endif
-#if DF03
- { "df03", df03_dialer, df_disconnect, df_abort },
-#endif
-#if DN11
- { "dn11", dn_dialer, dn_disconnect, dn_abort },
-#endif
-#ifdef VENTEL
- { "ventel", ven_dialer, ven_disconnect, ven_abort },
-#endif
-#ifdef HAYES
- { "hayes", hay_dialer, hay_disconnect, hay_abort },
-#endif
-#ifdef COURIER
- { "courier", cour_dialer, cour_disconnect, cour_abort },
-#endif
-#ifdef T3000
- { "t3000", t3000_dialer, t3000_disconnect, t3000_abort },
-#endif
-#ifdef V3451
-#ifndef V831
- { "vadic", v3451_dialer, v3451_disconnect, v3451_abort },
-#endif
- { "v3451", v3451_dialer, v3451_disconnect, v3451_abort },
-#endif
-#ifdef V831
-#ifndef V3451
- { "vadic", v831_dialer, v831_disconnect, v831_abort },
-#endif
- { "v831", v831_dialer, v831_disconnect, v831_abort },
-#endif
- { 0, 0, 0, 0 }
-};
-
diff --git a/usr.bin/tip/tip/cmds.c b/usr.bin/tip/tip/cmds.c
deleted file mode 100644
index 50cedc4..0000000
--- a/usr.bin/tip/tip/cmds.c
+++ /dev/null
@@ -1,999 +0,0 @@
-/* $OpenBSD: cmds.c,v 1.26 2006/06/06 23:24:52 deraadt Exp $ */
-/* $NetBSD: cmds.c,v 1.7 1997/02/11 09:24:03 mrg Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)cmds.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: cmds.c,v 1.26 2006/06/06 23:24:52 deraadt Exp $";
-#endif
-#endif /* not lint */
-
-#include "tip.h"
-#include "pathnames.h"
-
-#include <vis.h>
-
-/*
- * tip
- *
- * miscellaneous commands
- */
-
-int quant[] = { 60, 60, 24 };
-
-char null = '\0';
-char *sep[] = { "second", "minute", "hour" };
-static char *argv[10]; /* argument vector for take and put */
-
-static void transfer(char *, int, char *);
-static void stopsnd(int); /* SIGINT handler during file transfers */
-static void intcopy(int); /* interrupt routine for file transfers */
-static void transmit(FILE *, char *, char *);
-static void send(int);
-static void execute(char *);
-static int args(char *, char **, int);
-static void prtime(char *, time_t);
-static void tandem(char *);
-static void hardwareflow(char *);
-void linedisc(char *);
-static int anyof(char *, char *);
-
-/*
- * FTP - remote ==> local
- * get a file from the remote host
- */
-void
-getfl(int c)
-{
- char buf[256], *cp;
-
- putchar(c);
- /*
- * get the UNIX receiving file's name
- */
- if (prompt("Local file name? ", copyname, sizeof(copyname)))
- return;
- cp = expand(copyname);
- if ((sfd = creat(cp, 0666)) < 0) {
- printf("\r\n%s: cannot creat\r\n", copyname);
- return;
- }
-
- /*
- * collect parameters
- */
- if (prompt("List command for remote system? ", buf, sizeof(buf))) {
- unlink(copyname);
- return;
- }
- transfer(buf, sfd, value(EOFREAD));
-}
-
-/*
- * Cu-like take command
- */
-void
-cu_take(int c)
-{
- int fd, argc;
- char line[BUFSIZ], *cp;
-
- if (prompt("[take] ", copyname, sizeof(copyname)))
- return;
- if ((argc = args(copyname, argv, sizeof(argv)/sizeof(argv[0]))) < 1 ||
- argc > 2) {
- printf("usage: <take> from [to]\r\n");
- return;
- }
- if (argc == 1)
- argv[1] = argv[0];
- cp = expand(argv[1]);
- if ((fd = creat(cp, 0666)) < 0) {
- printf("\r\n%s: cannot create\r\n", argv[1]);
- return;
- }
- (void)snprintf(line, sizeof(line), "cat %s;echo ''|tr '\\012' '\\01'", argv[0]);
- transfer(line, fd, "\01");
-}
-
-static jmp_buf intbuf;
-
-/*
- * Bulk transfer routine --
- * used by getfl(), cu_take(), and pipefile()
- */
-static void
-transfer(char *buf, int fd, char *eofchars)
-{
- int ct, eof;
- char c, buffer[BUFSIZ];
- char *p = buffer;
- size_t cnt;
- time_t start;
- sig_t f;
- char r;
-
- if (number(value(FRAMESIZE)) > BUFSIZ || number(value(FRAMESIZE)) < 1) {
- printf("framesize must be >= 1 and <= %d\r\n", BUFSIZ);
- close(fd);
- return;
- }
-
- parwrite(FD, buf, size(buf));
- quit = 0;
- kill(tipout_pid, SIGIOT);
- read(repdes[0], (char *)&ccc, 1); /* Wait until read process stops */
-
- /*
- * finish command
- */
- r = '\r';
- parwrite(FD, &r, 1);
- do
- read(FD, &c, 1);
- while ((c&STRIP_PAR) != '\n');
- tcsetattr(0, TCSAFLUSH, &defchars);
-
- (void) setjmp(intbuf);
- f = signal(SIGINT, intcopy);
- start = time(0);
- for (ct = 0; !quit;) {
- eof = read(FD, &c, 1) <= 0;
- c &= STRIP_PAR;
- if (quit)
- continue;
- if (eof || any(c, eofchars))
- break;
- if (c == 0)
- continue; /* ignore nulls */
- if (c == '\r')
- continue;
- *p++ = c;
-
- if (c == '\n' && boolean(value(VERBOSE)))
- printf("\r%d", ++ct);
- if ((cnt = (p-buffer)) == (size_t)number(value(FRAMESIZE))) {
- if ((size_t)write(fd, buffer, cnt) != cnt) {
- printf("\r\nwrite error\r\n");
- quit = 1;
- }
- p = buffer;
- }
- }
- if ((cnt = (p-buffer)))
- if ((size_t)write(fd, buffer, cnt) != cnt)
- printf("\r\nwrite error\r\n");
-
- if (boolean(value(VERBOSE)))
- prtime(" lines transferred in ", time(0)-start);
- tcsetattr(0, TCSAFLUSH, &term);
- write(fildes[1], (char *)&ccc, 1);
- signal(SIGINT, f);
- close(fd);
-}
-
-/*
- * FTP - remote ==> local process
- * send remote input to local process via pipe
- */
-/*ARGSUSED*/
-void
-pipefile(int c)
-{
- int pdes[2];
- char buf[256];
- int status, p;
- pid_t cpid;
-
- if (prompt("Local command? ", buf, sizeof(buf)))
- return;
-
- if (pipe(pdes)) {
- printf("can't establish pipe\r\n");
- return;
- }
-
- if ((cpid = fork()) < 0) {
- printf("can't fork!\r\n");
- return;
- } else if (cpid) {
- if (prompt("List command for remote system? ", buf, sizeof(buf))) {
- close(pdes[0]), close(pdes[1]);
- kill (cpid, SIGKILL);
- } else {
- close(pdes[0]);
- signal(SIGPIPE, intcopy);
- transfer(buf, pdes[1], value(EOFREAD));
- signal(SIGPIPE, SIG_DFL);
- while ((p = wait(&status)) > 0 && p != cpid)
- ;
- }
- } else {
- int f;
-
- dup2(pdes[0], 0);
- close(pdes[0]);
- for (f = 3; f < 20; f++)
- close(f);
- execute(buf);
- printf("can't execl!\r\n");
- exit(0);
- }
-}
-
-/*
- * Interrupt service routine for FTP
- */
-/*ARGSUSED*/
-static void
-stopsnd(int signo)
-{
- stop = 1;
- signal(SIGINT, SIG_IGN);
-}
-
-/*
- * FTP - local ==> remote
- * send local file to remote host
- * terminate transmission with pseudo EOF sequence
- */
-void
-sendfile(int c)
-{
- FILE *fp;
- char *fnamex;
-
- putchar(c);
- /*
- * get file name
- */
- if (prompt("Local file name? ", fname, sizeof(fname)))
- return;
-
- /*
- * look up file
- */
- fnamex = expand(fname);
- if ((fp = fopen(fnamex, "r")) == NULL) {
- printf("%s: cannot open\r\n", fname);
- return;
- }
- transmit(fp, value(EOFWRITE), NULL);
- if (!boolean(value(ECHOCHECK)))
- tcdrain(FD);
-}
-
-/*
- * Bulk transfer routine to remote host --
- * used by sendfile() and cu_put()
- */
-static void
-transmit(FILE *fp, char *eofchars, char *command)
-{
- char *pc, lastc;
- int c, ccount, lcount;
- time_t start_t, stop_t;
- sig_t f;
-
- kill(tipout_pid, SIGIOT); /* put TIPOUT into a wait state */
- stop = 0;
- f = signal(SIGINT, stopsnd);
- tcsetattr(0, TCSAFLUSH, &defchars);
- read(repdes[0], (char *)&ccc, 1);
- if (command != NULL) {
- for (pc = command; *pc; pc++)
- send(*pc);
- if (boolean(value(ECHOCHECK)))
- read(FD, (char *)&c, 1); /* trailing \n */
- else {
- tcdrain(FD);
- sleep(5); /* wait for remote stty to take effect */
- }
- }
- lcount = 0;
- lastc = '\0';
- start_t = time(0);
- while (1) {
- ccount = 0;
- do {
- c = getc(fp);
- if (stop)
- goto out;
- if (c == EOF)
- goto out;
- if (c == 0177 && !boolean(value(RAWFTP)))
- continue;
- lastc = c;
- if (c < 040) {
- if (c == '\n') {
- if (!boolean(value(RAWFTP)))
- c = '\r';
- } else if (c == '\t') {
- if (!boolean(value(RAWFTP))) {
- if (boolean(value(TABEXPAND))) {
- send(' ');
- while ((++ccount % 8) != 0)
- send(' ');
- continue;
- }
- }
- } else
- if (!boolean(value(RAWFTP)))
- continue;
- }
- send(c);
- } while (c != '\r' && !boolean(value(RAWFTP)));
- if (boolean(value(VERBOSE)))
- printf("\r%d", ++lcount);
- if (boolean(value(ECHOCHECK))) {
- timedout = 0;
- alarm((unsigned int)lvalue(ETIMEOUT));
- do { /* wait for prompt */
- read(FD, (char *)&c, 1);
- if (timedout || stop) {
- if (timedout)
- printf("\r\ntimed out at eol\r\n");
- alarm(0);
- goto out;
- }
- } while ((c&STRIP_PAR) != character(value(PROMPT)));
- alarm(0);
- }
- }
-out:
- if (lastc != '\n' && !boolean(value(RAWFTP)))
- send('\r');
- if (eofchars) {
- for (pc = eofchars; *pc; pc++)
- send(*pc);
- }
- stop_t = time(0);
- fclose(fp);
- signal(SIGINT, f);
- if (boolean(value(VERBOSE))) {
- if (boolean(value(RAWFTP)))
- prtime(" chars transferred in ", stop_t-start_t);
- else
- prtime(" lines transferred in ", stop_t-start_t);
- }
- write(fildes[1], (char *)&ccc, 1);
- tcsetattr(0, TCSAFLUSH, &term);
-}
-
-/*
- * Cu-like put command
- */
-/*ARGSUSED*/
-void
-cu_put(int c)
-{
- FILE *fp;
- char line[BUFSIZ];
- int argc;
- char *copynamex;
-
- if (prompt("[put] ", copyname, sizeof(copyname)))
- return;
- if ((argc = args(copyname, argv, sizeof(argv)/sizeof(argv[0]))) < 1 ||
- argc > 2) {
- printf("usage: <put> from [to]\r\n");
- return;
- }
- if (argc == 1)
- argv[1] = argv[0];
- copynamex = expand(argv[0]);
- if ((fp = fopen(copynamex, "r")) == NULL) {
- printf("%s: cannot open\r\n", copynamex);
- return;
- }
- if (boolean(value(ECHOCHECK)))
- (void)snprintf(line, sizeof(line), "cat>%s\r", argv[1]);
- else
- (void)snprintf(line, sizeof(line),
- "stty -echo;cat>%s;stty echo\r", argv[1]);
- transmit(fp, "\04", line);
-}
-
-/*
- * FTP - send single character
- * wait for echo & handle timeout
- */
-static void
-send(int c)
-{
- char cc;
- int retry = 0;
-
- cc = c;
- parwrite(FD, &cc, 1);
- if (number(value(CDELAY)) > 0 && c != '\r')
- usleep(number(value(CDELAY)));
- if (!boolean(value(ECHOCHECK))) {
- if (number(value(LDELAY)) > 0 && c == '\r')
- usleep(number(value(LDELAY)));
- return;
- }
-tryagain:
- timedout = 0;
- alarm((unsigned int)lvalue(ETIMEOUT));
- read(FD, &cc, 1);
- alarm(0);
- if (timedout) {
- printf("\r\ntimeout error (%s)\r\n", ctrl(c));
- if (retry++ > 3)
- return;
- parwrite(FD, &null, 1); /* poke it */
- goto tryagain;
- }
-}
-
-/*ARGSUSED*/
-void
-timeout(int signo)
-{
- signal(SIGALRM, timeout);
- timedout = 1;
-}
-
-/*
- * Stolen from consh() -- puts a remote file on the output of a local command.
- * Identical to consh() except for where stdout goes.
- */
-void
-pipeout(int c)
-{
- char buf[256];
- int status, p;
- pid_t cpid;
- time_t start = time(NULL);
-
- putchar(c);
- if (prompt("Local command? ", buf, sizeof(buf)))
- return;
- kill(tipout_pid, SIGIOT); /* put TIPOUT into a wait state */
- signal(SIGINT, SIG_IGN);
- signal(SIGQUIT, SIG_IGN);
- tcsetattr(0, TCSAFLUSH, &defchars);
- read(repdes[0], (char *)&ccc, 1);
- /*
- * Set up file descriptors in the child and
- * let it go...
- */
- if ((cpid = fork()) < 0)
- printf("can't fork!\r\n");
- else if (cpid) {
- start = time(NULL);
- while ((p = wait(&status)) > 0 && p != cpid)
- ;
- } else {
- int i;
-
- dup2(FD, 1);
- for (i = 3; i < 20; i++)
- close(i);
- signal(SIGINT, SIG_DFL);
- signal(SIGQUIT, SIG_DFL);
- execute(buf);
- printf("can't find `%s'\r\n", buf);
- exit(0);
- }
- if (boolean(value(VERBOSE)))
- prtime("away for ", time(0)-start);
- write(fildes[1], (char *)&ccc, 1);
- tcsetattr(0, TCSAFLUSH, &term);
- signal(SIGINT, SIG_DFL);
- signal(SIGQUIT, SIG_DFL);
-}
-
-#ifdef CONNECT
-/*
- * Fork a program with:
- * 0 <-> remote tty in
- * 1 <-> remote tty out
- * 2 <-> local tty stderr
- */
-void
-consh(int c)
-{
- char buf[256];
- int status, p;
- pid_t cpid;
- time_t start = time(NULL);
-
- putchar(c);
- if (prompt("Local command? ", buf, sizeof(buf)))
- return;
- kill(tipout_pid, SIGIOT); /* put TIPOUT into a wait state */
- signal(SIGINT, SIG_IGN);
- signal(SIGQUIT, SIG_IGN);
- tcsetattr(0, TCSAFLUSH, &defchars);
- read(repdes[0], (char *)&ccc, 1);
- /*
- * Set up file descriptors in the child and
- * let it go...
- */
- if ((cpid = fork()) < 0)
- printf("can't fork!\r\n");
- else if (cpid) {
- start = time(0);
- while ((p = wait(&status)) > 0 && p != cpid)
- ;
- } else {
- int i;
-
- dup2(FD, 0);
- dup2(3, 1);
- for (i = 3; i < 20; i++)
- close(i);
- signal(SIGINT, SIG_DFL);
- signal(SIGQUIT, SIG_DFL);
- execute(buf);
- printf("can't find `%s'\r\n", buf);
- exit(0);
- }
- if (boolean(value(VERBOSE)))
- prtime("away for ", time(0)-start);
- write(fildes[1], (char *)&ccc, 1);
- tcsetattr(0, TCSAFLUSH, &term);
- signal(SIGINT, SIG_DFL);
- signal(SIGQUIT, SIG_DFL);
-}
-#endif
-
-/*
- * Escape to local shell
- */
-/*ARGSUSED*/
-void
-shell(int c)
-{
- int status;
- char *cp;
- pid_t shpid;
-
- printf("[sh]\r\n");
- signal(SIGINT, SIG_IGN);
- signal(SIGQUIT, SIG_IGN);
- unraw();
- if ((shpid = fork())) {
- while (shpid != wait(&status));
- raw();
- printf("\r\n!\r\n");
- signal(SIGINT, SIG_DFL);
- signal(SIGQUIT, SIG_DFL);
- return;
- } else {
- signal(SIGQUIT, SIG_DFL);
- signal(SIGINT, SIG_DFL);
- if ((cp = strrchr(value(SHELL), '/')) == NULL)
- cp = value(SHELL);
- else
- cp++;
- shell_uid();
- execl(value(SHELL), cp, (char *)NULL);
- printf("\r\ncan't execl!\r\n");
- exit(1);
- }
-}
-
-/*
- * TIPIN portion of scripting
- * initiate the conversation with TIPOUT
- */
-void
-setscript(void)
-{
- char c;
-
- /*
- * enable TIPOUT side for dialogue
- */
- kill(tipout_pid, SIGEMT);
- if (boolean(value(SCRIPT)))
- write(fildes[1], value(RECORD), size(value(RECORD)));
- write(fildes[1], "\n", 1);
- /*
- * wait for TIPOUT to finish
- */
- read(repdes[0], &c, 1);
- if (c == 'n')
- printf("can't create %s\r\n", value(RECORD));
-}
-
-/*
- * Change current working directory of
- * local portion of tip
- */
-/*ARGSUSED*/
-void
-chdirectory(int c)
-{
- char dirname[PATH_MAX];
- char *cp = dirname;
-
- if (prompt("[cd] ", dirname, sizeof(dirname))) {
- if (stoprompt)
- return;
- cp = value(HOME);
- }
- if (chdir(cp) < 0)
- printf("%s: bad directory\r\n", cp);
- printf("!\r\n");
-}
-
-void
-tipabort(char *msg)
-{
-
- signal(SIGTERM, SIG_IGN);
- kill(tipout_pid, SIGTERM);
- disconnect(msg);
- if (msg != NOSTR)
- printf("\r\n%s", msg);
- printf("\r\n[EOT]\r\n");
- daemon_uid();
- (void)uu_unlock(uucplock);
- unraw();
- unexcl();
- exit(0);
-}
-
-/*ARGSUSED*/
-void
-finish(int c)
-{
- char *dismsg;
-
- if ((dismsg = value(DISCONNECT)) != NOSTR) {
- write(FD, dismsg, strlen(dismsg));
- sleep(5);
- }
- tipabort(NOSTR);
-}
-
-/*ARGSUSED*/
-static void
-intcopy(int signo)
-{
- raw();
- quit = 1;
- longjmp(intbuf, 1);
-}
-
-static void
-execute(char *s)
-{
- char *cp;
-
- if ((cp = strrchr(value(SHELL), '/')) == NULL)
- cp = value(SHELL);
- else
- cp++;
- shell_uid();
- execl(value(SHELL), cp, "-c", s, (char *)NULL);
-}
-
-static int
-args(char *buf, char *a[], int num)
-{
- char *p = buf, *start;
- char **parg = a;
- int n = 0;
-
- do {
- while (*p && (*p == ' ' || *p == '\t'))
- p++;
- start = p;
- if (*p)
- *parg = p;
- while (*p && (*p != ' ' && *p != '\t'))
- p++;
- if (p != start)
- parg++, n++;
- if (*p)
- *p++ = '\0';
- } while (*p && n < num);
-
- return(n);
-}
-
-static void
-prtime(char *s, time_t a)
-{
- int i;
- int nums[3];
-
- for (i = 0; i < 3; i++) {
- nums[i] = (int)(a % quant[i]);
- a /= quant[i];
- }
- printf("%s", s);
- while (--i >= 0)
- if (nums[i] || (i == 0 && nums[1] == 0 && nums[2] == 0))
- printf("%d %s%c ", nums[i], sep[i],
- nums[i] == 1 ? '\0' : 's');
- printf("\r\n!\r\n");
-}
-
-/*ARGSUSED*/
-void
-variable(int c)
-{
- char buf[256];
-
- if (prompt("[set] ", buf, sizeof(buf)))
- return;
- vlex(buf);
- if (vtable[BEAUTIFY].v_access&CHANGED) {
- vtable[BEAUTIFY].v_access &= ~CHANGED;
- kill(tipout_pid, SIGSYS);
- }
- if (vtable[SCRIPT].v_access&CHANGED) {
- vtable[SCRIPT].v_access &= ~CHANGED;
- setscript();
- /*
- * So that "set record=blah script" doesn't
- * cause two transactions to occur.
- */
- if (vtable[RECORD].v_access&CHANGED)
- vtable[RECORD].v_access &= ~CHANGED;
- }
- if (vtable[RECORD].v_access&CHANGED) {
- vtable[RECORD].v_access &= ~CHANGED;
- if (boolean(value(SCRIPT)))
- setscript();
- }
- if (vtable[TAND].v_access&CHANGED) {
- vtable[TAND].v_access &= ~CHANGED;
- if (boolean(value(TAND)))
- tandem("on");
- else
- tandem("off");
- }
- if (vtable[LECHO].v_access&CHANGED) {
- vtable[LECHO].v_access &= ~CHANGED;
- HD = boolean(value(LECHO));
- }
- if (vtable[PARITY].v_access&CHANGED) {
- vtable[PARITY].v_access &= ~CHANGED;
- setparity(NOSTR);
- }
- if (vtable[HARDWAREFLOW].v_access&CHANGED) {
- vtable[HARDWAREFLOW].v_access &= ~CHANGED;
- if (boolean(value(HARDWAREFLOW)))
- hardwareflow("on");
- else
- hardwareflow("off");
- }
- if (vtable[LINEDISC].v_access&CHANGED) {
- vtable[LINEDISC].v_access &= ~CHANGED;
- linedisc(NOSTR);
- }
-}
-
-/*ARGSUSED*/
-void
-listvariables(int c)
-{
- value_t *p;
- char *buf;
- char charbuf[5]; /* for vis(3), 4 chars for encoding, plus nul */
-
- puts("v\r");
- for (p = vtable; p->v_name; p++) {
- fputs(p->v_name, stdout);
- switch (p->v_type&TMASK) {
- case STRING:
- if (p->v_value) {
- buf = malloc(4*strlen(p->v_value) + 1);
- if (buf == NULL) {
- fprintf(stderr, "Unable to malloc()\n");
- abort();
- }
- strvis(buf, p->v_value, VIS_WHITE);
- printf(" %s", buf);
- free(buf);
- }
- putchar('\r');
- putchar('\n');
- break;
- case NUMBER:
- printf(" %ld\r\n", number(p->v_value));
- break;
- case BOOL:
- printf(" %s\r\n",
- !boolean(p->v_value) ? "false" : "true");
- break;
- case CHAR:
- vis(charbuf, character(p->v_value), VIS_WHITE, 0);
- printf(" %s\r\n", charbuf);
- break;
- }
- }
-}
-
-/*
- * Turn tandem mode on or off for remote tty.
- */
-static void
-tandem(char *option)
-{
- struct termios rmtty;
-
- tcgetattr(FD, &rmtty);
- if (strcmp(option, "on") == 0) {
- rmtty.c_iflag |= IXOFF;
- term.c_iflag |= IXOFF;
- } else {
- rmtty.c_iflag &= ~IXOFF;
- term.c_iflag &= ~IXOFF;
- }
- tcsetattr(FD, TCSADRAIN, &rmtty);
- tcsetattr(0, TCSADRAIN, &term);
-}
-
-/*
- * Turn hardware flow control on or off for remote tty.
- */
-static void
-hardwareflow(char *option)
-{
- struct termios rmtty;
-
- tcgetattr(FD, &rmtty);
- if (strcmp(option, "on") == 0)
- rmtty.c_iflag |= CRTSCTS;
- else
- rmtty.c_iflag &= ~CRTSCTS;
- tcsetattr(FD, TCSADRAIN, &rmtty);
-}
-
-/*
- * Change line discipline to the specified one.
- */
-void
-linedisc(char *option)
-{
- int ld = (int)(intptr_t)value(LINEDISC);
-
- ioctl(FD, TIOCSETD, &ld);
-}
-
-/*
- * Send a break.
- */
-/*ARGSUSED*/
-void
-genbrk(int c)
-{
- ioctl(FD, TIOCSBRK, NULL);
- sleep(1);
- ioctl(FD, TIOCCBRK, NULL);
-}
-
-/*
- * Suspend tip
- */
-void
-suspend(int c)
-{
- unraw();
- kill(c == CTRL('y') ? getpid() : 0, SIGTSTP);
- raw();
-}
-
-/*
- * expand a file name if it includes shell meta characters
- */
-char *
-expand(char name[])
-{
- static char xname[BUFSIZ];
- char cmdbuf[BUFSIZ];
- int l;
- char *cp, *Shell;
- int s, pivec[2];
- pid_t pid;
-
- if (!anyof(name, "~{[*?$`'\"\\"))
- return(name);
- /* sigint = signal(SIGINT, SIG_IGN); */
- if (pipe(pivec) < 0) {
- perror("pipe");
- /* signal(SIGINT, sigint) */
- return(name);
- }
- (void)snprintf(cmdbuf, sizeof(cmdbuf), "echo %s", name);
- if ((pid = vfork()) == 0) {
- Shell = value(SHELL);
- if (Shell == NOSTR)
- Shell = _PATH_BSHELL;
- close(pivec[0]);
- close(1);
- dup(pivec[1]);
- close(pivec[1]);
- close(2);
- shell_uid();
- execl(Shell, Shell, "-c", cmdbuf, (char *)NULL);
- _exit(1);
- }
- if (pid == -1) {
- perror("fork");
- close(pivec[0]);
- close(pivec[1]);
- return(NOSTR);
- }
- close(pivec[1]);
- l = read(pivec[0], xname, BUFSIZ);
- close(pivec[0]);
- while (wait(&s) != pid);
- ;
- s &= 0377;
- if (s != 0 && s != SIGPIPE) {
- fprintf(stderr, "\"Echo\" failed\n");
- return(NOSTR);
- }
- if (l < 0) {
- perror("read");
- return(NOSTR);
- }
- if (l == 0) {
- fprintf(stderr, "\"%s\": No match\n", name);
- return(NOSTR);
- }
- if (l == BUFSIZ) {
- fprintf(stderr, "Buffer overflow expanding \"%s\"\n", name);
- return(NOSTR);
- }
- xname[l] = 0;
- for (cp = &xname[l-1]; *cp == '\n' && cp > xname; cp--)
- ;
- *++cp = '\0';
- return(xname);
-}
-
-/*
- * Are any of the characters in the two strings the same?
- */
-static int
-anyof(char *s1, char *s2)
-{
- int c;
-
- while ((c = *s1++))
- if (any(c, s2))
- return(1);
- return(0);
-}
diff --git a/usr.bin/tip/tip/cmdtab.c b/usr.bin/tip/tip/cmdtab.c
deleted file mode 100644
index 3666c12..0000000
--- a/usr.bin/tip/tip/cmdtab.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* $OpenBSD: cmdtab.c,v 1.7 2006/03/17 14:43:06 moritz Exp $ */
-/* $NetBSD: cmdtab.c,v 1.3 1994/12/08 09:30:46 jtc Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)cmdtab.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: cmdtab.c,v 1.7 2006/03/17 14:43:06 moritz Exp $";
-#endif
-#endif /* not lint */
-
-#include "tip.h"
-
-esctable_t etable[] = {
- { '!', NORM, "shell", shell },
- { '<', NORM, "receive file from remote host", getfl },
- { '>', NORM, "send file to remote host", sendfile },
- { 't', NORM, "take file from remote UNIX", cu_take },
- { 'p', NORM, "put file to remote UNIX", cu_put },
- { '|', NORM, "pipe remote file", pipefile },
- { '$', NORM, "pipe local command to remote host", pipeout },
-#ifdef CONNECT
- { 'C', NORM, "connect program to remote host",consh },
-#endif
- { 'c', NORM, "change directory", chdirectory },
- { '.', NORM, "exit from tip", finish },
- {CTRL('d'),NORM,"exit from tip", finish },
- {CTRL('y'),NORM,"suspend tip (local+remote)", suspend },
- {CTRL('z'),NORM,"suspend tip (local only)", suspend },
- { 's', NORM, "set variable", variable },
- { 'v', NORM, "list variables", listvariables },
- { '?', NORM, "get this summary", help },
- { '#', NORM, "send break", genbrk },
- { '\0', 0, NULL, NULL }
-};
diff --git a/usr.bin/tip/tip/cu.1 b/usr.bin/tip/tip/cu.1
deleted file mode 100644
index b67b19d..0000000
--- a/usr.bin/tip/tip/cu.1
+++ /dev/null
@@ -1,506 +0,0 @@
-.\" $OpenBSD: cu.1,v 1.3 2006/06/07 06:35:59 mbalmer Exp $
-.\"
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)tip.1 8.4 (Berkeley) 4/18/94
-.\" $FreeBSD$
-.\"
-.Dd September 1, 2006
-.Dt CU 1
-.Os
-.Sh NAME
-.Nm cu
-.Nd call UNIX
-.Sh SYNOPSIS
-.Nm
-.Op Fl ehot
-.Op Fl a Ar acu
-.Op Fl l Ar line
-.Op Fl s Ar speed | Fl Ar speed
-.Op Ar phone-number
-.Sh DESCRIPTION
-The
-.Nm
-utility
-establishes a full-duplex connection to another machine, giving the
-appearance of being logged in directly on the remote CPU.
-It goes without saying that you must have a login on the machine (or
-equivalent) to which you wish to connect.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl a Ar acu
-Set the acu.
-.It Fl e
-Use even parity.
-If both
-.Fl e
-and
-.Fl o
-are given, then no parity is used
-(the default).
-.It Fl h
-Echo characters locally (half-duplex mode).
-.It Fl l Ar line
-Specify the line to use.
-Either of the forms like
-.Pa cuad0
-or
-.Pa /dev/cuad0
-are permitted.
-.It Fl o
-Use odd parity.
-If both
-.Fl e
-and
-.Fl o
-are given, then no parity is used
-(the default).
-.It Fl s Ar speed | Fl Ar speed
-Set the speed of the connection.
-The default is 9600.
-.It Fl t
-Connect via a hard-wired connection to a host on a dial-up line.
-.El
-.Pp
-Typed characters are normally transmitted directly to the remote
-machine (which does the echoing as well).
-A tilde
-.Pq Ql ~
-appearing as the first character of a line is an escape signal; the
-following are recognized:
-.Bl -tag -width indent
-.It Ic ~^D No or Ic ~.
-Drop the connection and exit.
-Only the connection is dropped \(en the login session is not terminated.
-.It Ic ~c Op Ar name
-Change directory to
-.Ar name
-(no argument implies change to home directory).
-.It Ic ~!
-Escape to a shell (exiting the shell will return to
-.Nm ) .
-.It Ic ~>
-Copy file from local to remote.
-The
-.Nm
-utility
-prompts for the name of a local file to transmit.
-.It Ic ~<
-Copy file from remote to local.
-The
-.Nm
-utility
-prompts first for the name of the file to be sent, then for a command
-to be executed on the remote machine.
-.It Ic ~p Ar from Op Ar to
-Send a file to a remote
-.Ux
-host.
-This command causes the remote
-.Ux
-system to run the following command string,
-sending it the
-.Ar from
-file:
-.Pp
-.Dl "stty -echo; cat > 'to'; stty echo"
-.Pp
-If the
-.Ar to
-file is not specified, the
-.Ar from
-file name is used.
-This command is actually a
-.Ux
-specific version of the
-.Ic ~>
-command.
-.It Ic ~t Ar from Op Ar to
-Take a file from a remote
-.Ux
-host.
-As in the
-.Ic ~p
-command, the
-.Ar to
-file defaults to the
-.Ar from
-file name if it is not specified.
-The remote host executes the following command string
-to send the file to
-.Nm :
-.Pp
-.Dl "cat 'from'; echo '' | tr '\e012' '\e01'"
-.It Ic ~|
-Pipe the output from a remote command to a local
-.Ux
-process.
-The command string sent to the local
-.Ux
-system is processed by the shell.
-.It Ic ~$
-Pipe the output from a local
-.Ux
-process to the remote host.
-The command string sent to the local
-.Ux
-system is processed by the shell.
-.It Ic ~C
-Fork a child process on the local system to perform special protocols
-such as
-.Tn XMODEM .
-The child program will be run with the following arrangement of
-file descriptors:
-.Bd -literal -offset indent
-0 <-> remote tty in
-1 <-> remote tty out
-2 <-> local tty stderr
-.Ed
-.It Ic ~#
-Send a
-.Dv BREAK
-to the remote system.
-For systems which do not support the necessary
-.Fn ioctl
-call, the break is simulated by a sequence of line speed changes and
-.Dv DEL
-characters.
-.It Ic ~s
-Set a variable (see the discussion below).
-.It Ic ~v
-List all variables and their values (if set).
-.It Ic ~^Z
-Stop
-.Nm
-(only available with job control).
-.It Ic ~^Y
-Stop only the
-.Dq "local side"
-of
-.Nm
-(only available with job control); the
-.Dq "remote side"
-of
-.Nm ,
-the side that displays output from the remote host, is left running.
-.It Ic ~?
-Get a summary of the tilde escapes.
-.El
-.Pp
-When
-.Nm
-prompts for an argument, for example during setup of a file transfer, the
-line typed may be edited with the standard erase and kill characters.
-A null line in response to a prompt, or an interrupt, will abort the
-dialogue and return the user to the remote machine.
-.Pp
-The
-.Nm
-utility
-guards against multiple users connecting to a remote system by opening
-modems and terminal lines with exclusive access, and by honoring the
-locking protocol used by
-.Xr uucico 8 Pq Pa ports/net/freebsd-uucp .
-.Pp
-During file transfers
-.Nm
-provides a running count of the number of lines transferred.
-When using the
-.Ic ~>
-and
-.Ic ~<
-commands, the
-.Va eofread
-and
-.Va eofwrite
-variables are used to recognize end-of-file when reading, and specify
-end-of-file when writing (see below).
-File transfers normally depend on hardwareflow or tandem mode for flow control.
-If the remote system does not support hardwareflow or tandem mode,
-.Va echocheck
-may be set to indicate that
-.Nm
-should synchronize with the remote system on the echo of each
-transmitted character.
-.Pp
-When
-.Nm
-must dial a phone number to connect to a system, it will print various
-messages indicating its actions.
-The
-.Nm
-utility
-supports a variety of auto-call units and modems with the
-.Va at
-capability in system descriptions.
-.Pp
-Support for Ventel 212+ (ventel), Hayes AT-style (hayes),
-USRobotics Courier (courier), Telebit T3000 (t3000) and
-Racal-Vadic 831 (vadic) units is enabled by default.
-.Pp
-Support for Bizcomp 1031[fw] (biz31[fw]), Bizcomp 1022[fw]
-(biz22[fw]), DEC DF0[23]-AC (df0[23]), DEC DN-11 (dn11) and
-Racal-Vadic 3451 (v3451) units can be added by recompiling
-.Nm
-with the appropriate defines.
-.Pp
-Note that if support for both the Racal-Vadic 831 and 3451 is enabled,
-they are referred to as the v831 and v3451, respectively.
-If only one of the two is supported, it is referred to as vadic.
-.Ss Variables
-The
-.Nm
-utility
-maintains a set of variables which control its operation.
-Some of these variables are read-only to normal users (root is allowed
-to change anything of interest).
-Variables may be displayed and set through the
-.Ic ~s
-escape.
-The syntax for variables is patterned after
-.Xr vi 1
-and
-.Xr Mail 1 .
-Supplying
-.Dq Li all
-as an argument to the set command displays all variables readable by
-the user.
-Alternatively, the user may request display of a particular variable
-by attaching a
-.Ql \&?
-to the end.
-For example,
-.Dq Li escape?
-displays the current escape character.
-.Pp
-Variables are numeric, string, character, or boolean values.
-Boolean variables are set merely by specifying their name; they may be
-reset by prepending a
-.Ql \&!
-to the name.
-Other variable types are set by concatenating an
-.Ql =
-and the value.
-The entire assignment must not have any blanks in it.
-A single set command may be used to interrogate as well as set a
-number of variables.
-Certain common variables have abbreviations.
-The following is a list of common variables, their abbreviations, and
-their default values:
-.Bl -tag -width indent
-.It Va baudrate
-.Pq Vt num
-The baud rate at which the connection was established;
-abbreviated
-.Va ba .
-.It Va beautify
-.Pq Vt bool
-Discard unprintable characters when a session is being
-scripted; abbreviated
-.Va be .
-.It Va dialtimeout
-.Pq Vt num
-When dialing a phone number, the time (in seconds) to wait for a
-connection to be established; abbreviated
-.Va dial .
-.It Va echocheck
-.Pq Vt bool
-Synchronize with the remote host during file transfer by
-waiting for the echo of the last character transmitted; default is
-.Cm off .
-.It Va eofread
-.Pq Vt str
-The set of characters which signify an end-of-transmission
-during a
-.Ic ~<
-file transfer command; abbreviated
-.Va eofr .
-.It Va eofwrite
-.Pq Vt str
-The string sent to indicate end-of-transmission during a
-.Ic ~>
-file transfer command; abbreviated
-.Va eofw .
-.It Va eol
-.Pq Vt str
-The set of characters which indicate an end-of-line.
-The
-.Nm
-utility
-will recognize escape characters only after an end-of-line.
-.It Va escape
-.Pq Vt char
-The command prefix (escape) character; abbreviated
-.Va es ;
-default value is
-.Ql ~ .
-.It Va exceptions
-.Pq Vt str
-The set of characters which should not be discarded due to the
-beautification switch; abbreviated
-.Va ex ;
-default value is
-.Dq Li \et\en\ef\eb .
-.It Va force
-.Pq Vt char
-The character used to force literal data transmission;
-abbreviated
-.Va fo ;
-default value is
-.Ql ^P .
-.It Va framesize
-.Pq Vt num
-The amount of data (in bytes) to buffer between file system
-writes when receiving files; abbreviated
-.Va fr .
-.It Va hardwareflow
-.Pq Vt bool
-Whether hardware flow control (CRTSCTS) is enabled for the
-connection; abbreviated
-.Va hf ;
-default value is
-.Cm off .
-.It Va host
-.Pq Vt str
-The name of the host to which you are connected; abbreviated
-.Va ho .
-.It Va linedisc
-.Pq Vt num
-The line discipline to use; abbreviated
-.Va ld .
-.It Va prompt
-.Pq Vt char
-The character which indicates an end-of-line on the remote
-host; abbreviated
-.Va pr ;
-default value is
-.Ql \en .
-This value is used to synchronize during data transfers.
-The count of lines transferred during a file transfer command is based
-on receipt of this character.
-.It Va raise
-.Pq Vt bool
-Upper case mapping mode; abbreviated
-.Va ra ;
-default value is
-.Cm off .
-When this mode is enabled, all lowercase letters will be mapped to
-uppercase by
-.Nm
-for transmission to the remote machine.
-.It Va raisechar
-.Pq Vt char
-The input character used to toggle uppercase mapping mode;
-abbreviated
-.Va rc ;
-not set by default.
-.It Va record
-.Pq Vt str
-The name of the file in which a session script is recorded;
-abbreviated
-.Va rec .
-.It Va script
-.Pq Vt bool
-Session scripting mode; abbreviated
-.Va sc ;
-default is
-.Cm off .
-When
-.Va script
-is
-.Cm true ,
-.Nm
-will record everything transmitted by the remote machine in the script
-record file specified in
-.Va record .
-If the
-.Va beautify
-switch is on, only printable
-.Tn ASCII
-characters will be included in the script file (those characters
-between 040 and 0177).
-The variable
-.Va exceptions
-is used to indicate characters which are an exception to the normal
-beautification rules.
-.It Va tabexpand
-.Pq Vt bool
-Expand tabs to spaces during file transfers; abbreviated
-.Va tab ;
-default value is
-.Cm false .
-Each tab is expanded to 8 spaces.
-.It Va tandem
-.Pq Vt bool
-Use XON/XOFF flow control to throttle data from the remote host;
-abbreviated
-.Va ta .
-The default value is
-.Cm true .
-.It Va verbose
-.Pq Vt bool
-Verbose mode; abbreviated
-.Va verb ;
-default is
-.Cm true .
-When verbose mode is enabled,
-.Nm
-prints messages while dialing, shows the current number of lines
-transferred during a file transfer operations, and more.
-.El
-.Sh ENVIRONMENT
-.Bl -tag -width indent
-.It Ev HOME
-The home directory to use for the
-.Ic ~c
-command.
-.It Ev SHELL
-The name of the shell to use for the
-.Ic ~!
-command; default value is
-.Dq Li /bin/sh .
-.El
-.Sh FILES
-.Bl -tag -width ".Pa /var/spool/lock/LCK..*" -compact
-.It Pa /var/log/aculog
-line access log
-.It Pa /var/spool/lock/LCK..*
-lock file to avoid conflicts with
-.Xr uucp 1 Pq Pa ports/net/freebsd-uucp
-.El
-.Sh SEE ALSO
-.Xr tip 1
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.2 .
-.Sh BUGS
-The full set of variables is undocumented and should, probably, be
-pared down.
diff --git a/usr.bin/tip/tip/cu.c b/usr.bin/tip/tip/cu.c
deleted file mode 100644
index d8d104d..0000000
--- a/usr.bin/tip/tip/cu.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/* $OpenBSD: cu.c,v 1.19 2006/05/25 08:41:52 jmc Exp $ */
-/* $NetBSD: cu.c,v 1.5 1997/02/11 09:24:05 mrg Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)cu.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: cu.c,v 1.19 2006/05/25 08:41:52 jmc Exp $";
-#endif
-#endif /* not lint */
-
-#include "tip.h"
-
-static void cuusage(void);
-
-/*
- * Botch the interface to look like cu's
- */
-void
-cumain(int argc, char *argv[])
-{
- int ch, i, parity;
- long l;
- char *cp;
- static char sbuf[12];
-
- if (argc < 2)
- cuusage();
- CU = DV = NOSTR;
- BR = DEFBR;
- parity = 0; /* none */
-
- /*
- * We want to accept -# as a speed. It's easiest to look through
- * the arguments, replace -# with -s#, and let getopt() handle it.
- */
- for (i = 1; i < argc; i++) {
- if (argv[i][0] == '-' &&
- argv[i][1] >= '0' && argv[i][1] <= '9') {
- asprintf(&cp, "-s%s", argv[i] + 1);
- if (cp == NULL) {
- fprintf(stderr,
- "%s: cannot convert -# to -s#\n",
- __progname);
- exit(3);
- }
- argv[i] = cp;
- }
- }
-
- while ((ch = getopt(argc, argv, "a:l:s:htoe")) != -1) {
- switch (ch) {
- case 'a':
- CU = optarg;
- break;
- case 'l':
- if (DV != NULL) {
- fprintf(stderr,
- "%s: cannot specificy multiple -l options\n",
- __progname);
- exit(3);
- }
- if (strchr(optarg, '/'))
- DV = optarg;
- else
- asprintf(&DV, "/dev/%s", optarg);
- break;
- case 's':
- l = strtol(optarg, &cp, 10);
- if (*cp != '\0' || l < 0 || l >= INT_MAX) {
- fprintf(stderr, "%s: unsupported speed %s\n",
- __progname, optarg);
- exit(3);
- }
- BR = (int)l;
- break;
- case 'h':
- setboolean(value(LECHO), TRUE);
- HD = TRUE;
- break;
- case 't':
- HW = 1, DU = -1;
- break;
- case 'o':
- if (parity != 0)
- parity = 0; /* -e -o */
- else
- parity = 1; /* odd */
- break;
- case 'e':
- if (parity != 0)
- parity = 0; /* -o -e */
- else
- parity = -1; /* even */
- break;
- default:
- cuusage();
- break;
- }
- }
- argc -= optind;
- argv += optind;
-
- switch (argc) {
- case 1:
- PN = argv[0];
- break;
- case 0:
- break;
- default:
- cuusage();
- break;
- }
-
- signal(SIGINT, cleanup);
- signal(SIGQUIT, cleanup);
- signal(SIGHUP, cleanup);
- signal(SIGTERM, cleanup);
- signal(SIGCHLD, SIG_DFL);
-
- /*
- * The "cu" host name is used to define the
- * attributes of the generic dialer.
- */
- (void)snprintf(sbuf, sizeof(sbuf), "cu%ld", BR);
- if ((i = hunt(sbuf)) == 0) {
- printf("all ports busy\n");
- exit(3);
- }
- if (i == -1) {
- printf("link down\n");
- (void)uu_unlock(uucplock);
- exit(3);
- }
- setbuf(stdout, NULL);
- loginit();
- user_uid();
- vinit();
- switch (parity) {
- case -1:
- setparity("even");
- break;
- case 1:
- setparity("odd");
- break;
- default:
- setparity("none");
- break;
- }
- setboolean(value(VERBOSE), FALSE);
- if (HW && ttysetup(BR)) {
- fprintf(stderr, "%s: unsupported speed %ld\n",
- __progname, BR);
- daemon_uid();
- (void)uu_unlock(uucplock);
- exit(3);
- }
- if (con()) {
- printf("Connect failed\n");
- daemon_uid();
- (void)uu_unlock(uucplock);
- exit(1);
- }
- if (!HW && ttysetup(BR)) {
- fprintf(stderr, "%s: unsupported speed %ld\n",
- __progname, BR);
- daemon_uid();
- (void)uu_unlock(uucplock);
- exit(3);
- }
-}
-
-static void
-cuusage(void)
-{
- fprintf(stderr, "usage: cu [-ehot] [-a acu] [-l line] "
- "[-s speed | -speed] [phone-number]\n");
- exit(8);
-}
diff --git a/usr.bin/tip/tip/hunt.c b/usr.bin/tip/tip/hunt.c
deleted file mode 100644
index 0c104f1..0000000
--- a/usr.bin/tip/tip/hunt.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/* $OpenBSD: hunt.c,v 1.13 2006/03/17 19:39:46 deraadt Exp $ */
-/* $NetBSD: hunt.c,v 1.6 1997/04/20 00:02:10 mellon Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)hunt.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: hunt.c,v 1.13 2006/03/17 19:39:46 deraadt Exp $";
-#endif
-#endif /* not lint */
-
-#include "tip.h"
-
-static jmp_buf deadline;
-static int deadfl;
-
-static void dead(int);
-
-/*ARGSUSED*/
-static void
-dead(int signo)
-{
- deadfl = 1;
- longjmp(deadline, 1);
-}
-
-long
-hunt(char *name)
-{
- char *cp;
- sig_t f;
-
- f = signal(SIGALRM, dead);
- while ((cp = getremote(name))) {
- deadfl = 0;
- uucplock = strrchr(cp, '/');
- if (uucplock == NULL)
- uucplock = cp;
- else
- uucplock++;
-
- if (uu_lock(uucplock) < 0)
- continue;
- /*
- * Straight through call units, such as the BIZCOMP,
- * VADIC and the DF, must indicate they're hardwired in
- * order to get an open file descriptor placed in FD.
- * Otherwise, as for a DN-11, the open will have to
- * be done in the "open" routine.
- */
- if (!HW)
- break;
- if (setjmp(deadline) == 0) {
- alarm(10);
- FD = open(cp, (O_RDWR |
- (boolean(value(DC)) ? O_NONBLOCK : 0)));
- }
- alarm(0);
- if (FD < 0) {
- perror(cp);
- deadfl = 1;
- }
- if (!deadfl) {
- struct termios cntrl;
-
- tcgetattr(FD, &cntrl);
- if (!boolean(value(DC)))
- cntrl.c_cflag |= HUPCL;
- tcsetattr(FD, TCSAFLUSH, &cntrl);
- ioctl(FD, TIOCEXCL, 0);
- signal(SIGALRM, SIG_DFL);
- return ((long)cp);
- }
- (void)uu_unlock(uucplock);
- }
- signal(SIGALRM, f);
- return (deadfl ? -1 : (long)cp);
-}
diff --git a/usr.bin/tip/tip/log.c b/usr.bin/tip/tip/log.c
deleted file mode 100644
index 8123795..0000000
--- a/usr.bin/tip/tip/log.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/* $OpenBSD: log.c,v 1.8 2006/03/16 19:32:46 deraadt Exp $ */
-/* $NetBSD: log.c,v 1.4 1994/12/24 17:56:28 cgd Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)log.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: log.c,v 1.8 2006/03/16 19:32:46 deraadt Exp $";
-#endif
-#endif /* not lint */
-
-#include "tip.h"
-
-#ifdef ACULOG
-static FILE *flog = NULL;
-
-/*
- * Log file maintenance routines
- */
-void
-logent(char *group, char *num, char *acu, char *message)
-{
- char *user, *timestamp;
- struct passwd *pwd;
- time_t t;
-
- if (flog == NULL)
- return;
- if (flock(fileno(flog), LOCK_EX) < 0) {
- perror("flock");
- return;
- }
- if ((user = getlogin()) == NOSTR) {
- if ((pwd = getpwuid(getuid())) == NOPWD)
- user = "???";
- else
- user = pwd->pw_name;
- }
- t = time(0);
- timestamp = ctime(&t);
- timestamp[24] = '\0';
- fprintf(flog, "%s (%s) <%s, %s, %s> %s\n",
- user, timestamp, group,
-#ifdef PRISTINE
- "",
-#else
- num,
-#endif
- acu, message);
- (void) fflush(flog);
- (void) flock(fileno(flog), LOCK_UN);
-}
-
-void
-loginit(void)
-{
- flog = fopen(value(LOG), "a");
- if (flog == NULL)
- fprintf(stderr, "can't open log file %s.\r\n", value(LOG));
-}
-#endif
diff --git a/usr.bin/tip/tip/partab.c b/usr.bin/tip/tip/partab.c
deleted file mode 100644
index 05bb329..0000000
--- a/usr.bin/tip/tip/partab.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/* $OpenBSD: partab.c,v 1.5 2003/06/03 02:56:18 millert Exp $ */
-/* $NetBSD: partab.c,v 1.4 1996/12/29 10:38:21 cgd Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)partab.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: partab.c,v 1.5 2003/06/03 02:56:18 millert Exp $";
-#endif
-#endif /* not lint */
-
-/*
- * Even parity table for 0-0177
- */
-const unsigned char evenpartab[] = {
- 0000,0201,0202,0003,0204,0005,0006,0207,
- 0210,0011,0012,0213,0014,0215,0216,0017,
- 0220,0021,0022,0223,0024,0225,0226,0027,
- 0030,0231,0232,0033,0234,0035,0036,0237,
- 0240,0041,0042,0243,0044,0245,0246,0047,
- 0050,0251,0252,0053,0254,0055,0056,0257,
- 0060,0261,0262,0063,0264,0065,0066,0267,
- 0270,0071,0072,0273,0074,0275,0276,0077,
- 0300,0101,0102,0303,0104,0305,0306,0107,
- 0110,0311,0312,0113,0314,0115,0116,0317,
- 0120,0321,0322,0123,0324,0125,0126,0327,
- 0330,0131,0132,0333,0134,0335,0336,0137,
- 0140,0341,0342,0143,0344,0145,0146,0347,
- 0350,0151,0152,0353,0154,0355,0356,0157,
- 0360,0161,0162,0363,0164,0365,0366,0167,
- 0170,0371,0372,0173,0374,0175,0176,0377,
-};
diff --git a/usr.bin/tip/tip/pathnames.h b/usr.bin/tip/tip/pathnames.h
deleted file mode 100644
index 66a453d..0000000
--- a/usr.bin/tip/tip/pathnames.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $OpenBSD: pathnames.h,v 1.3 2003/06/03 02:56:18 millert Exp $ */
-/* $NetBSD: pathnames.h,v 1.3 1994/12/08 09:30:59 jtc Exp $ */
-/* $FreeBSD$ */
-
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)pathnames.h 8.1 (Berkeley) 6/6/93
- */
-
-#include <paths.h>
-
-#define _PATH_ACULOG "/var/log/aculog"
-#define _PATH_LOCKDIRNAME "/var/spool/lock/LCK..%s"
-#define _PATH_PHONES "/etc/phones"
-#define _PATH_REMOTE "/etc/remote"
diff --git a/usr.bin/tip/tip/remote.c b/usr.bin/tip/tip/remote.c
deleted file mode 100644
index d9993ae..0000000
--- a/usr.bin/tip/tip/remote.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/* $OpenBSD: remote.c,v 1.16 2006/06/06 23:24:52 deraadt Exp $ */
-/* $NetBSD: remote.c,v 1.5 1997/04/20 00:02:45 mellon Exp $ */
-
-/*
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1992, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)remote.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: remote.c,v 1.16 2006/06/06 23:24:52 deraadt Exp $";
-#endif
-#endif /* not lint */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "pathnames.h"
-#include "tip.h"
-
-/*
- * Attributes to be gleened from remote host description
- * data base.
- */
-static char **caps[] = {
- &AT, &DV, &CM, &CU, &EL, &IE, &OE, &PN, &PR, &DI,
- &ES, &EX, &FO, &RC, &RE, &PA
-};
-
-static char *capstrings[] = {
- "at", "dv", "cm", "cu", "el", "ie", "oe", "pn", "pr",
- "di", "es", "ex", "fo", "rc", "re", "pa", 0
-};
-
-static char *db_array[3] = { _PATH_REMOTE, 0, 0 };
-
-#define cgetflag(f) (cgetcap(bp, f, ':') != NULL)
-
-static void getremcap(char *);
-
-static void
-getremcap(char *host)
-{
- char **p, ***q, *bp, *rempath;
- int stat;
-
- rempath = getenv("REMOTE");
- if (rempath != NULL) {
- if (*rempath != '/')
- /* we have an entry */
- cgetset(rempath);
- else { /* we have a path */
- db_array[1] = rempath;
- db_array[2] = _PATH_REMOTE;
- }
- }
-
- if ((stat = cgetent(&bp, db_array, host)) < 0) {
- if ((DV != NULL) ||
- (host[0] == '/' && access(DV = host, R_OK | W_OK) == 0)) {
- CU = DV;
- HO = host;
- HW = 1;
- DU = 0;
- if (!BR)
- BR = DEFBR;
- FS = DEFFS;
- return;
- }
- switch (stat) {
- case -1:
- fprintf(stderr, "%s: unknown host %s\n", __progname,
- host);
- break;
- case -2:
- fprintf(stderr,
- "%s: can't open host description file\n",
- __progname);
- break;
- case -3:
- fprintf(stderr,
- "%s: possible reference loop in host description file\n", __progname);
- break;
- }
- exit(3);
- }
-
- for (p = capstrings, q = caps; *p != NULL; p++, q++)
- if (**q == NULL)
- cgetstr(bp, *p, *q);
- if (!BR && (cgetnum(bp, "br", &BR) == -1))
- BR = DEFBR;
- if (!LD && (cgetnum(bp, "ld", &LD) == -1))
- LD = TTYDISC;
- if (cgetnum(bp, "fs", &FS) == -1)
- FS = DEFFS;
- if (DU < 0)
- DU = 0;
- else
- DU = cgetflag("du");
- if (DV == NOSTR) {
- fprintf(stderr, "%s: missing device spec\n", host);
- exit(3);
- }
- if (DU && CU == NOSTR)
- CU = DV;
- if (DU && PN == NOSTR) {
- fprintf(stderr, "%s: missing phone number\n", host);
- exit(3);
- }
- if (DU && AT == NOSTR) {
- fprintf(stderr, "%s: missing acu type\n", host);
- exit(3);
- }
-
- HD = cgetflag("hd");
-
- /*
- * This effectively eliminates the "hw" attribute
- * from the description file
- */
- if (!HW)
- HW = (CU == NOSTR) || (DU && equal(DV, CU));
- HO = host;
- /*
- * see if uppercase mode should be turned on initially
- */
- if (cgetflag("ra"))
- setboolean(value(RAISE), 1);
- if (cgetflag("ec"))
- setboolean(value(ECHOCHECK), 1);
- if (cgetflag("be"))
- setboolean(value(BEAUTIFY), 1);
- if (cgetflag("nb"))
- setboolean(value(BEAUTIFY), 0);
- if (cgetflag("sc"))
- setboolean(value(SCRIPT), 1);
- if (cgetflag("tb"))
- setboolean(value(TABEXPAND), 1);
- if (cgetflag("vb"))
- setboolean(value(VERBOSE), 1);
- if (cgetflag("nv"))
- setboolean(value(VERBOSE), 0);
- if (cgetflag("ta"))
- setboolean(value(TAND), 1);
- if (cgetflag("nt"))
- setboolean(value(TAND), 0);
- if (cgetflag("rw"))
- setboolean(value(RAWFTP), 1);
- if (cgetflag("hd"))
- setboolean(value(HALFDUPLEX), 1);
- if (cgetflag("dc"))
- setboolean(value(DC), 1);
- if (cgetflag("hf"))
- setboolean(value(HARDWAREFLOW), 1);
- if (RE == NOSTR)
- RE = (char *)"tip.record";
- if (EX == NOSTR)
- EX = (char *)"\t\n\b\f";
- if (ES != NOSTR)
- vstring("es", ES);
- if (FO != NOSTR)
- vstring("fo", FO);
- if (PR != NOSTR)
- vstring("pr", PR);
- if (RC != NOSTR)
- vstring("rc", RC);
- if (cgetnum(bp, "dl", &DL) == -1)
- DL = 0;
- if (cgetnum(bp, "cl", &CL) == -1)
- CL = 0;
- if (cgetnum(bp, "et", &ET) == -1)
- ET = 10;
-}
-
-char *
-getremote(char *host)
-{
- char *cp;
- static char *next;
- static int lookedup = 0;
-
- if (!lookedup) {
- if (host == NOSTR && (host = getenv("HOST")) == NOSTR) {
- fprintf(stderr, "%s: no host specified\n", __progname);
- exit(3);
- }
- getremcap(host);
- next = DV;
- lookedup++;
- }
- /*
- * We return a new device each time we're called (to allow
- * a rotary action to be simulated)
- */
- if (next == NOSTR)
- return (NOSTR);
- if ((cp = strchr(next, ',')) == NULL) {
- DV = next;
- next = NOSTR;
- } else {
- *cp++ = '\0';
- DV = next;
- next = cp;
- }
- return (DV);
-}
diff --git a/usr.bin/tip/tip/tip.1 b/usr.bin/tip/tip/tip.1
deleted file mode 100644
index ee085da..0000000
--- a/usr.bin/tip/tip/tip.1
+++ /dev/null
@@ -1,603 +0,0 @@
-.\" $OpenBSD: tip.1,v 1.37 2006/06/07 06:35:59 mbalmer Exp $
-.\" $NetBSD: tip.1,v 1.7 1994/12/08 09:31:05 jtc Exp $
-.\"
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)tip.1 8.4 (Berkeley) 4/18/94
-.\" $FreeBSD$
-.\"
-.Dd August 31, 2006
-.Dt TIP 1
-.Os
-.Sh NAME
-.Nm tip
-.Nd connect to a remote system
-.Sh SYNOPSIS
-.Nm
-.Op Fl nv
-.Op Fl Ar speed
-.Op Ar system-name
-.Sh DESCRIPTION
-The
-.Nm
-utility
-establishes a full-duplex connection to another machine, giving the
-appearance of being logged in directly on the remote CPU.
-It goes without saying that you must have a login on the machine (or
-equivalent) to which you wish to connect.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl n
-No escape (disable tilde).
-.It Fl v
-Set verbose mode.
-.El
-.Pp
-If
-.Ar speed
-is specified, it will override any baudrate specified in the system
-description being used.
-.Pp
-If neither
-.Ar speed
-nor
-.Ar system-name
-are specified,
-.Ar system-name
-will be set to the value of the
-.Ev HOST
-environment variable.
-.Pp
-If
-.Ar speed
-is specified but
-.Ar system-name
-is not,
-.Ar system-name
-will be set to a value of
-.Dq Li tip
-with
-.Ar speed
-appended.
-For example,
-.Nm Fl 1200
-will set
-.Ar system-name
-to
-.Dq Li tip1200 .
-.Pp
-Typed characters are normally transmitted directly to the remote
-machine (which does the echoing as well).
-A tilde
-.Pq Ql ~
-appearing as the first character of a line is an escape signal; the
-following are recognized:
-.Bl -tag -width indent
-.It Ic ~^D No or Ic ~.
-Drop the connection and exit.
-Only the connection is dropped \(en the login session is not terminated.
-.It Ic ~c Op Ar name
-Change directory to
-.Ar name
-(no argument implies change to home directory).
-.It Ic ~!
-Escape to a shell (exiting the shell will return to
-.Nm ) .
-.It Ic ~>
-Copy file from local to remote.
-The
-.Nm
-utility
-prompts for the name of a local file to transmit.
-.It Ic ~<
-Copy file from remote to local.
-The
-.Nm
-utility
-prompts first for the name of the file to be sent, then for a command
-to be executed on the remote machine.
-.It Ic ~p Ar from Op Ar to
-Send a file to a remote
-.Ux
-host.
-This command causes the remote
-.Ux
-system to run the following command string,
-sending it the
-.Ar from
-file:
-.Pp
-.Dl "stty -echo; cat > 'to'; stty echo"
-.Pp
-If the
-.Ar to
-file is not specified, the
-.Ar from
-file name is used.
-This command is actually a
-.Ux
-specific version of the
-.Ic ~>
-command.
-.It Ic ~t Ar from Op Ar to
-Take a file from a remote
-.Ux
-host.
-As in the
-.Ic ~p
-command, the
-.Ar to
-file defaults to the
-.Ar from
-file name if it is not specified.
-The remote host executes the following command string
-to send the file to
-.Nm :
-.Pp
-.Dl "cat 'from'; echo '' | tr '\e012' '\e01'"
-.It Ic ~|
-Pipe the output from a remote command to a local
-.Ux
-process.
-The command string sent to the local
-.Ux
-system is processed by the shell.
-.It Ic ~$
-Pipe the output from a local
-.Ux
-process to the remote host.
-The command string sent to the local
-.Ux
-system is processed by the shell.
-.It Ic ~C
-Fork a child process on the local system to perform special protocols
-such as
-.Tn XMODEM .
-The child program will be run with the following arrangement of
-file descriptors:
-.Bd -literal -offset indent
-0 <-> remote tty in
-1 <-> remote tty out
-2 <-> local tty stderr
-.Ed
-.It Ic ~#
-Send a
-.Dv BREAK
-to the remote system.
-For systems which do not support the necessary
-.Fn ioctl
-call, the break is simulated by a sequence of line speed changes and
-.Dv DEL
-characters.
-.It Ic ~s
-Set a variable (see the discussion below).
-.It Ic ~v
-List all variables and their values (if set).
-.It Ic ~^Z
-Stop
-.Nm
-(only available with job control).
-.It Ic ~^Y
-Stop only the
-.Dq "local side"
-of
-.Nm
-(only available with job control); the
-.Dq "remote side"
-of
-.Nm ,
-the side that displays output from the remote host, is left running.
-.It Ic ~?
-Get a summary of the tilde escapes.
-.El
-.Pp
-To find the system description, and thus the operating characteristics
-of
-.Ar system-name ,
-.Nm
-searches for a system description with a name identical to
-.Ar system-name .
-The search order is as follows:
-.Bl -enum -offset indent
-.It
-If the environment variable
-.Ev REMOTE
-does not start with a
-.Ql /
-it is assumed to be a system description, and is considered first.
-.It
-If the environment variable
-.Ev REMOTE
-begins with a
-.Ql /
-it is assumed to be a path to a
-.Xr remote 5
-database, and the specified database is searched.
-.It
-The default
-.Xr remote 5
-database,
-.Pa /etc/remote ,
-is searched.
-.El
-.Pp
-See
-.Xr remote 5
-for full documentation on system descriptions.
-.Pp
-The
-.Va br
-capability is used in system descriptions to specify the baud rate
-with which to establish a connection.
-If the value specified is not suitable, the baud rate to be used may
-be given on the command line, e.g.\&
-.Dq Li "tip -300 mds" .
-.Pp
-When
-.Nm
-establishes a connection, it sends out the connection message
-specified in the
-.Va cm
-capability of the system description being used.
-.Pp
-When
-.Nm
-prompts for an argument, for example during setup of a file transfer, the
-line typed may be edited with the standard erase and kill characters.
-A null line in response to a prompt, or an interrupt, will abort the
-dialogue and return the user to the remote machine.
-.Pp
-The
-.Nm
-utility
-guards against multiple users connecting to a remote system by opening
-modems and terminal lines with exclusive access, and by honoring the
-locking protocol used by
-.Xr uucico 8 Pq Pa ports/net/freebsd-uucp .
-.Pp
-During file transfers
-.Nm
-provides a running count of the number of lines transferred.
-When using the
-.Ic ~>
-and
-.Ic ~<
-commands, the
-.Va eofread
-and
-.Va eofwrite
-variables are used to recognize end-of-file when reading, and specify
-end-of-file when writing (see below).
-File transfers normally depend on hardwareflow or tandem mode for flow control.
-If the remote system does not support hardwareflow or tandem mode,
-.Va echocheck
-may be set to indicate that
-.Nm
-should synchronize with the remote system on the echo of each
-transmitted character.
-.Pp
-When
-.Nm
-must dial a phone number to connect to a system, it will print various
-messages indicating its actions.
-The
-.Nm
-utility
-supports a variety of auto-call units and modems with the
-.Va at
-capability in system descriptions.
-.Pp
-Support for Ventel 212+ (ventel), Hayes AT-style (hayes),
-USRobotics Courier (courier), Telebit T3000 (t3000) and
-Racal-Vadic 831 (vadic) units is enabled by default.
-.Pp
-Support for Bizcomp 1031[fw] (biz31[fw]), Bizcomp 1022[fw]
-(biz22[fw]), DEC DF0[23]-AC (df0[23]), DEC DN-11 (dn11) and
-Racal-Vadic 3451 (v3451) units can be added by recompiling
-.Nm
-with the appropriate defines.
-.Pp
-Note that if support for both the Racal-Vadic 831 and 3451 is enabled,
-they are referred to as the v831 and v3451, respectively.
-If only one of the two is supported, it is referred to as vadic.
-.Ss Variables
-The
-.Nm
-utility
-maintains a set of variables which control its operation.
-Some of these variables are read-only to normal users (root is allowed
-to change anything of interest).
-Variables may be displayed and set through the
-.Ic ~s
-escape.
-The syntax for variables is patterned after
-.Xr vi 1
-and
-.Xr Mail 1 .
-Supplying
-.Dq Li all
-as an argument to the set command displays all variables readable by
-the user.
-Alternatively, the user may request display of a particular variable
-by attaching a
-.Ql \&?
-to the end.
-For example,
-.Dq Li escape?
-displays the current escape character.
-.Pp
-Variables are numeric, string, character, or boolean values.
-Boolean variables are set merely by specifying their name; they may be
-reset by prepending a
-.Ql \&!
-to the name.
-Other variable types are set by concatenating an
-.Ql =
-and the value.
-The entire assignment must not have any blanks in it.
-A single set command may be used to interrogate as well as set a
-number of variables.
-Variables may be initialized at run time by placing set commands
-(without the
-.Ic ~s
-prefix) in the initialization file
-.Pa ~/.tiprc ;
-the
-.Fl v
-option additionally causes
-.Nm
-to display the sets as they are made.
-Certain common variables have abbreviations.
-The following is a list of common variables, their abbreviations, and
-their default values:
-.Bl -tag -width indent
-.It Va baudrate
-.Pq Vt num
-The baud rate at which the connection was established;
-abbreviated
-.Va ba .
-.It Va beautify
-.Pq Vt bool
-Discard unprintable characters when a session is being
-scripted; abbreviated
-.Va be .
-.It Va dialtimeout
-.Pq Vt num
-When dialing a phone number, the time (in seconds) to wait for a
-connection to be established; abbreviated
-.Va dial .
-.It Va echocheck
-.Pq Vt bool
-Synchronize with the remote host during file transfer by
-waiting for the echo of the last character transmitted; default is
-.Cm off .
-.It Va eofread
-.Pq Vt str
-The set of characters which signify an end-of-transmission
-during a
-.Ic ~<
-file transfer command; abbreviated
-.Va eofr .
-.It Va eofwrite
-.Pq Vt str
-The string sent to indicate end-of-transmission during a
-.Ic ~>
-file transfer command; abbreviated
-.Va eofw .
-.It Va eol
-.Pq Vt str
-The set of characters which indicate an end-of-line.
-The
-.Nm
-utility
-will recognize escape characters only after an end-of-line.
-.It Va escape
-.Pq Vt char
-The command prefix (escape) character; abbreviated
-.Va es ;
-default value is
-.Ql ~ .
-.It Va exceptions
-.Pq Vt str
-The set of characters which should not be discarded due to the
-beautification switch; abbreviated
-.Va ex ;
-default value is
-.Dq Li \et\en\ef\eb .
-.It Va force
-.Pq Vt char
-The character used to force literal data transmission;
-abbreviated
-.Va fo ;
-default value is
-.Ql ^P .
-.It Va framesize
-.Pq Vt num
-The amount of data (in bytes) to buffer between file system
-writes when receiving files; abbreviated
-.Va fr .
-.It Va hardwareflow
-.Pq Vt bool
-Whether hardware flow control (CRTSCTS) is enabled for the
-connection; abbreviated
-.Va hf ;
-default value is
-.Cm off .
-.It Va host
-.Pq Vt str
-The name of the host to which you are connected; abbreviated
-.Va ho .
-.It Va linedisc
-.Pq Vt num
-The line discipline to use; abbreviated
-.Va ld .
-.It Va prompt
-.Pq Vt char
-The character which indicates an end-of-line on the remote
-host; abbreviated
-.Va pr ;
-default value is
-.Ql \en .
-This value is used to synchronize during data transfers.
-The count of lines transferred during a file transfer command is based
-on receipt of this character.
-.It Va raise
-.Pq Vt bool
-Upper case mapping mode; abbreviated
-.Va ra ;
-default value is
-.Cm off .
-When this mode is enabled, all lowercase letters will be mapped to
-uppercase by
-.Nm
-for transmission to the remote machine.
-.It Va raisechar
-.Pq Vt char
-The input character used to toggle uppercase mapping mode;
-abbreviated
-.Va rc ;
-not set by default.
-.It Va record
-.Pq Vt str
-The name of the file in which a session script is recorded;
-abbreviated
-.Va rec ;
-default value is
-.Pa tip.record .
-.It Va script
-.Pq Vt bool
-Session scripting mode; abbreviated
-.Va sc ;
-default is
-.Cm off .
-When
-.Va script
-is
-.Cm true ,
-.Nm
-will record everything transmitted by the remote machine in the script
-record file specified in
-.Va record .
-If the
-.Va beautify
-switch is on, only printable
-.Tn ASCII
-characters will be included in the script file (those characters
-between 040 and 0177).
-The variable
-.Va exceptions
-is used to indicate characters which are an exception to the normal
-beautification rules.
-.It Va tabexpand
-.Pq Vt bool
-Expand tabs to spaces during file transfers; abbreviated
-.Va tab ;
-default value is
-.Cm false .
-Each tab is expanded to 8 spaces.
-.It Va tandem
-.Pq Vt bool
-Use XON/XOFF flow control to throttle data from the remote host;
-abbreviated
-.Va ta .
-The default value is
-.Cm true
-unless the
-.Va nt
-capability has been specified in
-.Pa /etc/remote ,
-in which case the default value is
-.Cm false .
-.It Va verbose
-.Pq Vt bool
-Verbose mode; abbreviated
-.Va verb ;
-default is
-.Cm true .
-When verbose mode is enabled,
-.Nm
-prints messages while dialing, shows the current number of lines
-transferred during a file transfer operations, and more.
-.El
-.Sh ENVIRONMENT
-.Bl -tag -width indent
-.It Ev HOME
-The home directory to use for the
-.Ic ~c
-command.
-.It Ev HOST
-The default value for
-.Ar system-name
-if none is specified via the command line.
-.It Ev PHONES
-A path to a
-.Xr phones 5
-database.
-.It Ev REMOTE
-A system description, or an absolute path to a
-.Xr remote 5
-system description database.
-.It Ev SHELL
-The name of the shell to use for the
-.Ic ~!
-command; default value is
-.Dq Li /bin/sh .
-.El
-.Sh FILES
-.Bl -tag -width ".Pa /var/spool/lock/LCK..*" -compact
-.It Pa ~/.tiprc
-initialization file
-.It Pa tip.record
-record file
-.It Pa /etc/phones
-default
-.Xr phones 5
-file
-.It Pa /etc/remote
-global
-.Xr remote 5
-database
-.It Pa /var/log/aculog
-line access log
-.It Pa /var/spool/lock/LCK..*
-lock file to avoid conflicts with
-.Xr uucp 1 Pq Pa ports/net/freebsd-uucp
-.El
-.Sh SEE ALSO
-.Xr cu 1 ,
-.Xr phones 5 ,
-.Xr remote 5
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.2 .
-.Sh BUGS
-The full set of variables is undocumented and should, probably, be
-pared down.
diff --git a/usr.bin/tip/tip/tip.c b/usr.bin/tip/tip/tip.c
deleted file mode 100644
index 058a99b..0000000
--- a/usr.bin/tip/tip/tip.c
+++ /dev/null
@@ -1,627 +0,0 @@
-/* $OpenBSD: tip.c,v 1.30 2006/08/18 03:06:18 jason Exp $ */
-/* $NetBSD: tip.c,v 1.13 1997/04/20 00:03:05 mellon Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1983, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)tip.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: tip.c,v 1.30 2006/08/18 03:06:18 jason Exp $";
-#endif
-#endif /* not lint */
-
-/*
- * tip - UNIX link to other systems
- * tip [-v] [-speed] system-name
- * or
- * cu phone-number [-s speed] [-l line] [-a acu]
- */
-#include "tip.h"
-#include "pathnames.h"
-
-int disc = TTYDISC; /* tip normally runs this way */
-char PNbuf[256]; /* This limits the size of a number */
-
-static void intprompt(int);
-static void tipin(void);
-static int escape(void);
-
-int
-main(int argc, char *argv[])
-{
- char *sys = NOSTR, sbuf[12], *p;
- int i;
-
- /* XXX preserve previous braindamaged behavior */
- setboolean(value(DC), TRUE);
-
- gid = getgid();
- egid = getegid();
- uid = getuid();
- euid = geteuid();
- if (equal(__progname, "cu")) {
- cumode = 1;
- cumain(argc, argv);
- goto cucommon;
- }
-
- if (argc > 4) {
- fprintf(stderr, "usage: tip [-v] [-speed] [system-name]\n");
- exit(1);
- }
- if (!isatty(0)) {
- fprintf(stderr, "%s: must be interactive\n", __progname);
- exit(1);
- }
-
- for (; argc > 1; argv++, argc--) {
- if (argv[1][0] != '-')
- sys = argv[1];
- else switch (argv[1][1]) {
-
- case 'v':
- vflag++;
- break;
-
- case 'n':
- noesc++;
- break;
-
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- BR = atoi(&argv[1][1]);
- break;
-
- default:
- fprintf(stderr, "%s: %s, unknown option\n", __progname,
- argv[1]);
- break;
- }
- }
-
- if (sys == NOSTR)
- goto notnumber;
- if (isalpha(*sys))
- goto notnumber;
- /*
- * System name is really a phone number...
- * Copy the number then stomp on the original (in case the number
- * is private, we don't want 'ps' or 'w' to find it).
- */
- if (strlen(sys) > sizeof PNbuf - 1) {
- fprintf(stderr, "%s: phone number too long (max = %d bytes)\n",
- __progname, (int)sizeof(PNbuf) - 1);
- exit(1);
- }
- strlcpy(PNbuf, sys, sizeof PNbuf - 1);
- for (p = sys; *p; p++)
- *p = '\0';
- PN = PNbuf;
- (void)snprintf(sbuf, sizeof(sbuf), "tip%ld", BR);
- sys = sbuf;
-
-notnumber:
- (void)signal(SIGINT, cleanup);
- (void)signal(SIGQUIT, cleanup);
- (void)signal(SIGHUP, cleanup);
- (void)signal(SIGTERM, cleanup);
- (void)signal(SIGCHLD, SIG_DFL);
-
- if ((i = hunt(sys)) == 0) {
- printf("all ports busy\n");
- exit(3);
- }
- if (i == -1) {
- printf("link down\n");
- (void)uu_unlock(uucplock);
- exit(3);
- }
- setbuf(stdout, NULL);
- loginit();
-
- /*
- * Now that we have the logfile and the ACU open
- * return to the real uid and gid. These things will
- * be closed on exit. Swap real and effective uid's
- * so we can get the original permissions back
- * for removing the uucp lock.
- */
- user_uid();
-
- /*
- * Kludge, their's no easy way to get the initialization
- * in the right order, so force it here
- */
- if ((PH = getenv("PHONES")) == NOSTR)
- PH = _PATH_PHONES;
- vinit(); /* init variables */
- setparity("none"); /* set the parity table */
-
- /*
- * Hardwired connections require the
- * line speed set before they make any transmissions
- * (this is particularly true of things like a DF03-AC)
- */
- if (HW && ttysetup(number(value(BAUDRATE)))) {
- fprintf(stderr, "%s: bad baud rate %ld\n", __progname,
- number(value(BAUDRATE)));
- daemon_uid();
- (void)uu_unlock(uucplock);
- exit(3);
- }
- if ((p = con())) {
- printf("\07%s\n[EOT]\n", p);
- daemon_uid();
- (void)uu_unlock(uucplock);
- exit(1);
- }
- if (!HW && ttysetup(number(value(BAUDRATE)))) {
- fprintf(stderr, "%s: bad baud rate %ld\n", __progname,
- number(value(BAUDRATE)));
- daemon_uid();
- (void)uu_unlock(uucplock);
- exit(3);
- }
-cucommon:
- /*
- * From here down the code is shared with
- * the "cu" version of tip.
- */
-
- i = fcntl(FD, F_GETFL);
- if (i == -1) {
- perror("fcntl");
- cleanup(0);
- }
- i = fcntl(FD, F_SETFL, i & ~O_NONBLOCK);
- if (i == -1) {
- perror("fcntl");
- cleanup(0);
- }
-
- tcgetattr(0, &defterm);
- gotdefterm = 1;
- term = defterm;
- term.c_lflag &= ~(ICANON|IEXTEN|ECHO);
- term.c_iflag &= ~(INPCK|ICRNL);
- term.c_oflag &= ~OPOST;
- term.c_cc[VMIN] = 1;
- term.c_cc[VTIME] = 0;
- defchars = term;
- term.c_cc[VINTR] = term.c_cc[VQUIT] = term.c_cc[VSUSP] =
- term.c_cc[VDSUSP] = term.c_cc[VDISCARD] =
- term.c_cc[VLNEXT] = _POSIX_VDISABLE;
- raw();
-
- pipe(fildes); pipe(repdes);
- (void)signal(SIGALRM, timeout);
-
- if (value(LINEDISC) != TTYDISC) {
- int ld = (int)(intptr_t)value(LINEDISC);
- ioctl(FD, TIOCSETD, &ld);
- }
-
- /*
- * Everything's set up now:
- * connection established (hardwired or dialup)
- * line conditioned (baud rate, mode, etc.)
- * internal data structures (variables)
- * so, fork one process for local side and one for remote.
- */
- printf(cumode ? "Connected\r\n" : "\07connected\r\n");
- tipin_pid = getpid();
- if ((tipout_pid = fork()))
- tipin();
- else
- tipout();
- /*NOTREACHED*/
- exit(0);
-}
-
-void
-cleanup(int signo)
-{
- daemon_uid();
- (void)uu_unlock(uucplock);
- if (odisc)
- ioctl(0, TIOCSETD, &odisc);
- unraw();
- if (signo && tipout_pid) {
- kill(tipout_pid, signo);
- wait(NULL);
- }
- exit(0);
-}
-
-/*
- * Muck with user ID's. We are setuid to the owner of the lock
- * directory when we start. user_uid() reverses real and effective
- * ID's after startup, to run with the user's permissions.
- * daemon_uid() switches back to the privileged uid for unlocking.
- * Finally, to avoid running a shell with the wrong real uid,
- * shell_uid() sets real and effective uid's to the user's real ID.
- */
-static int uidswapped;
-
-void
-user_uid(void)
-{
- if (uidswapped == 0) {
- seteuid(uid);
- uidswapped = 1;
- }
-}
-
-void
-daemon_uid(void)
-{
-
- if (uidswapped) {
- seteuid(euid);
- uidswapped = 0;
- }
-}
-
-void
-shell_uid(void)
-{
- setegid(gid);
- seteuid(uid);
-}
-
-/*
- * put the controlling keyboard into raw mode
- */
-void
-raw(void)
-{
- tcsetattr(0, TCSADRAIN, &term);
-}
-
-
-/*
- * return keyboard to normal mode
- */
-void
-unraw(void)
-{
- if (gotdefterm)
- tcsetattr(0, TCSADRAIN, &defterm);
-}
-
-/*
- * give up exclusive tty access
- */
-void
-unexcl()
-{
- ioctl(FD, TIOCNXCL, 0);
-}
-
-static jmp_buf promptbuf;
-
-/*
- * Print string ``s'', then read a string
- * in from the terminal. Handles signals & allows use of
- * normal erase and kill characters.
- */
-int
-prompt(char *s, char *p, size_t sz)
-{
- int c;
- char *b = p;
- sig_t oint, oquit;
-
- stoprompt = 0;
- oint = signal(SIGINT, intprompt);
- oquit = signal(SIGQUIT, SIG_IGN);
- unraw();
- printf("%s", s);
- if (setjmp(promptbuf) == 0)
- while ((c = getchar()) != EOF && (*p = c) != '\n' && --sz > 0)
- p++;
- *p = '\0';
-
- raw();
- (void)signal(SIGINT, oint);
- (void)signal(SIGQUIT, oquit);
- return (stoprompt || p == b);
-}
-
-/*
- * Interrupt service routine during prompting
- */
-/*ARGSUSED*/
-static void
-intprompt(int signo)
-{
- (void)signal(SIGINT, SIG_IGN);
- stoprompt = 1;
- printf("\r\n");
- longjmp(promptbuf, 1);
-}
-
-/*
- * ****TIPIN TIPIN****
- */
-static void
-tipin(void)
-{
- int bol = 1;
- int gch;
- char ch;
-
- /*
- * Kinda klugey here...
- * check for scripting being turned on from the .tiprc file,
- * but be careful about just using setscript(), as we may
- * send a SIGEMT before tipout has a chance to set up catching
- * it; so wait a second, then setscript()
- */
- if (boolean(value(SCRIPT))) {
- sleep(1);
- setscript();
- }
-
- while (1) {
- gch = getchar()&STRIP_PAR;
- /* XXX does not check for EOF */
- if ((gch == character(value(ESCAPE))) && bol) {
- if (!noesc) {
- if (!(gch = escape()))
- continue;
- }
- } else if (!cumode && gch == character(value(RAISECHAR))) {
- setboolean(value(RAISE), !boolean(value(RAISE)));
- continue;
- } else if (gch == '\r') {
- bol = 1;
- ch = gch;
- parwrite(FD, &ch, 1);
- if (boolean(value(HALFDUPLEX)))
- printf("\r\n");
- continue;
- } else if (!cumode && gch == character(value(FORCE)))
- gch = getchar()&STRIP_PAR;
- bol = any(gch, value(EOL));
- if (boolean(value(RAISE)) && islower(gch))
- gch = toupper(gch);
- ch = gch;
- parwrite(FD, &ch, 1);
- if (boolean(value(HALFDUPLEX)))
- printf("%c", ch);
- }
-}
-
-extern esctable_t etable[];
-
-/*
- * Escape handler --
- * called on recognition of ``escapec'' at the beginning of a line
- */
-static int
-escape(void)
-{
- int gch;
- esctable_t *p;
- char c = character(value(ESCAPE));
-
- gch = (getchar()&STRIP_PAR);
- /* XXX does not check for EOF */
- for (p = etable; p->e_char; p++)
- if (p->e_char == gch) {
- if ((p->e_flags&PRIV) && uid)
- continue;
- printf("%s", ctrl(c));
- (*p->e_func)(gch);
- return (0);
- }
- /* ESCAPE ESCAPE forces ESCAPE */
- if (c != gch)
- parwrite(FD, &c, 1);
- return (gch);
-}
-
-int
-any(int cc, char *p)
-{
- char c = cc;
- while (p && *p)
- if (*p++ == c)
- return (1);
- return (0);
-}
-
-size_t
-size(char *s)
-{
- size_t i = 0;
-
- while (s && *s++)
- i++;
- return (i);
-}
-
-char *
-interp(char *s)
-{
- static char buf[256];
- char *p = buf, c, *q;
-
- while ((c = *s++)) {
- for (q = "\nn\rr\tt\ff\033E\bb"; *q; q++)
- if (*q++ == c) {
- *p++ = '\\'; *p++ = *q;
- goto next;
- }
- if (c < 040) {
- *p++ = '^'; *p++ = c + 'A'-1;
- } else if (c == 0177) {
- *p++ = '^'; *p++ = '?';
- } else
- *p++ = c;
- next:
- ;
- }
- *p = '\0';
- return (buf);
-}
-
-char *
-ctrl(char c)
-{
- static char s[3];
-
- if (c < 040 || c == 0177) {
- s[0] = '^';
- s[1] = c == 0177 ? '?' : c+'A'-1;
- s[2] = '\0';
- } else {
- s[0] = c;
- s[1] = '\0';
- }
- return (s);
-}
-
-/*
- * Help command
- */
-void
-help(int c)
-{
- esctable_t *p;
-
- printf("%c\r\n", c);
- for (p = etable; p->e_char; p++) {
- if ((p->e_flags&PRIV) && uid)
- continue;
- printf("%2s", ctrl(character(value(ESCAPE))));
- printf("%-2s %c %s\r\n", ctrl(p->e_char),
- p->e_flags&EXP ? '*': ' ', p->e_help);
- }
-}
-
-/*
- * Set up the "remote" tty's state
- */
-int
-ttysetup(int speed)
-{
- struct termios cntrl;
-
- if (tcgetattr(FD, &cntrl))
- return (-1);
- cfsetspeed(&cntrl, speed);
- cntrl.c_cflag &= ~(CSIZE|PARENB);
- cntrl.c_cflag |= CS8;
- if (boolean(value(DC)))
- cntrl.c_cflag |= CLOCAL;
- if (boolean(value(HARDWAREFLOW)))
- cntrl.c_cflag |= CRTSCTS;
- cntrl.c_iflag &= ~(ISTRIP|ICRNL);
- cntrl.c_oflag &= ~OPOST;
- cntrl.c_lflag &= ~(ICANON|ISIG|IEXTEN|ECHO);
- cntrl.c_cc[VMIN] = 1;
- cntrl.c_cc[VTIME] = 0;
- if (boolean(value(TAND)))
- cntrl.c_iflag |= IXOFF;
- return (tcsetattr(FD, TCSAFLUSH, &cntrl));
-}
-
-static char partab[0200];
-
-/*
- * Do a write to the remote machine with the correct parity.
- * We are doing 8 bit wide output, so we just generate a character
- * with the right parity and output it.
- */
-void
-parwrite(int fd, char *buf, size_t n)
-{
- size_t i;
- char *bp;
-
- bp = buf;
- if (bits8 == 0)
- for (i = 0; i < n; i++) {
- *bp = partab[(*bp) & 0177];
- bp++;
- }
- if (write(fd, buf, n) < 0) {
- if (errno == EIO)
- tipabort("Lost carrier.");
- /* this is questionable */
- perror("write");
- }
-}
-
-/*
- * Build a parity table with appropriate high-order bit.
- */
-void
-setparity(char *defparity)
-{
- int i, flip, clr, set;
- char *parity;
- extern const unsigned char evenpartab[];
-
- if (value(PARITY) == NOSTR)
- value(PARITY) = defparity;
- parity = value(PARITY);
- if (equal(parity, "none")) {
- bits8 = 1;
- return;
- }
- bits8 = 0;
- flip = 0;
- clr = 0377;
- set = 0;
- if (equal(parity, "odd"))
- flip = 0200; /* reverse bit 7 */
- else if (equal(parity, "zero"))
- clr = 0177; /* turn off bit 7 */
- else if (equal(parity, "one"))
- set = 0200; /* turn on bit 7 */
- else if (!equal(parity, "even")) {
- (void) fprintf(stderr, "%s: unknown parity value\r\n", parity);
- (void) fflush(stderr);
- }
- for (i = 0; i < 0200; i++)
- partab[i] = ((evenpartab[i] ^ flip) | set) & clr;
-}
diff --git a/usr.bin/tip/tip/tip.h b/usr.bin/tip/tip/tip.h
deleted file mode 100644
index cd679ed..0000000
--- a/usr.bin/tip/tip/tip.h
+++ /dev/null
@@ -1,354 +0,0 @@
-/* $OpenBSD: tip.h,v 1.27 2006/08/18 03:06:18 jason Exp $ */
-/* $NetBSD: tip.h,v 1.7 1997/04/20 00:02:46 mellon Exp $ */
-/* $FreeBSD$ */
-
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)tip.h 8.1 (Berkeley) 6/6/93
- */
-
-/*
- * tip - terminal interface program
- */
-
-#include <sys/types.h>
-#include <sys/file.h>
-#include <sys/time.h>
-#include <sys/wait.h>
-#include <sys/ioctl.h>
-
-#include <termios.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <pwd.h>
-#include <ctype.h>
-#include <setjmp.h>
-#include <unistd.h>
-#include <errno.h>
-#include <limits.h>
-
-/*
- * Remote host attributes
- */
-char *DV; /* UNIX device(s) to open */
-char *EL; /* chars marking an EOL */
-char *CM; /* initial connection message */
-char *IE; /* EOT to expect on input */
-char *OE; /* EOT to send to complete FT */
-char *CU; /* call unit if making a phone call */
-char *AT; /* acu type */
-char *PN; /* phone number(s) */
-char *DI; /* disconnect string */
-char *PA; /* parity to be generated */
-
-char *PH; /* phone number file */
-char *RM; /* remote file name */
-char *HO; /* host name */
-
-long BR; /* line speed for conversation */
-long FS; /* frame size for transfers */
-
-short DU; /* this host is dialed up */
-short HW; /* this device is hardwired, see hunt.c */
-char *ES; /* escape character */
-char *EX; /* exceptions */
-char *FO; /* force (literal next) char*/
-char *RC; /* raise character */
-char *RE; /* script record file */
-char *PR; /* remote prompt */
-long DL; /* line delay for file transfers to remote */
-long CL; /* char delay for file transfers to remote */
-long ET; /* echocheck timeout */
-long LD; /* line disc */
-short HD; /* this host is half duplex - do local echo */
-
-/*
- * String value table
- */
-typedef
- struct {
- char *v_name; /* whose name is it */
- char v_type; /* for interpreting set's */
- char v_access; /* protection of touchy ones */
- char *v_abrev; /* possible abreviation */
- char *v_value; /* casted to a union later */
- }
- value_t;
-
-#define STRING 01 /* string valued */
-#define BOOL 02 /* true-false value */
-#define NUMBER 04 /* numeric value */
-#define CHAR 010 /* character value */
-
-#define WRITE 01 /* write access to variable */
-#define READ 02 /* read access */
-
-#define CHANGED 01 /* low bit is used to show modification */
-#define PUBLIC 1 /* public access rights */
-#define PRIVATE 03 /* private to definer */
-#define ROOT 05 /* root defined */
-
-#define TRUE 1
-#define FALSE 0
-
-#define ENVIRON 020 /* initialize out of the environment */
-#define IREMOTE 040 /* initialize out of remote structure */
-#define INIT 0100 /* static data space used for initialization */
-#define TMASK 017
-
-/*
- * Definition of ACU line description
- */
-typedef
- struct {
- char *acu_name;
- int (*acu_dialer)(char *, char *);
- void (*acu_disconnect)(void);
- void (*acu_abort)(void);
- }
- acu_t;
-
-#define equal(a, b) (strcmp(a,b)==0)/* A nice function to string compare */
-
-/*
- * variable manipulation stuff --
- * if we defined the value entry in value_t, then we couldn't
- * initialize it in vars.c, so we cast it as needed to keep lint
- * happy.
- */
-
-#define value(v) vtable[v].v_value
-#define lvalue(v) (long)vtable[v].v_value
-
-#define number(v) ((long)(v))
-#define boolean(v) ((short)(long)(v))
-#define character(v) ((char)(long)(v))
-#define address(v) ((long *)(v))
-
-#define setnumber(v,n) do { (v) = (char *)(long)(n); } while (0)
-#define setboolean(v,n) do { (v) = (char *)(long)(n); } while (0)
-#define setcharacter(v,n) do { (v) = (char *)(long)(n); } while (0)
-#define setaddress(v,n) do { (v) = (char *)(n); } while (0)
-
-/*
- * Escape command table definitions --
- * lookup in this table is performed when ``escapec'' is recognized
- * at the begining of a line (as defined by the eolmarks variable).
-*/
-
-typedef
- struct {
- char e_char; /* char to match on */
- char e_flags; /* experimental, privileged */
- char *e_help; /* help string */
- void (*e_func)(int); /* command */
- }
- esctable_t;
-
-#define NORM 00 /* normal protection, execute anyone */
-#define EXP 01 /* experimental, mark it with a `*' on help */
-#define PRIV 02 /* privileged, root execute only */
-
-extern int vflag; /* verbose during reading of .tiprc file */
-extern int noesc; /* no escape `~' char */
-extern value_t vtable[]; /* variable table */
-
-#ifndef ACULOG
-#define logent(a, b, c, d)
-#define loginit()
-#endif
-
-/*
- * Definition of indices into variable table so
- * value(DEFINE) turns into a static address.
- */
-
-#define BEAUTIFY 0
-#define BAUDRATE 1
-#define DIALTIMEOUT 2
-#define EOFREAD 3
-#define EOFWRITE 4
-#define EOL 5
-#define ESCAPE 6
-#define EXCEPTIONS 7
-#define FORCE 8
-#define FRAMESIZE 9
-#define HOST 10
-#define LOG 11
-#define PHONES 12
-#define PROMPT 13
-#define RAISE 14
-#define RAISECHAR 15
-#define RECORD 16
-#define REMOTE 17
-#define SCRIPT 18
-#define TABEXPAND 19
-#define VERBOSE 20
-#define SHELL 21
-#define HOME 22
-#define ECHOCHECK 23
-#define DISCONNECT 24
-#define TAND 25
-#define LDELAY 26
-#define CDELAY 27
-#define ETIMEOUT 28
-#define RAWFTP 29
-#define HALFDUPLEX 30
-#define LECHO 31
-#define PARITY 32
-#define HARDWAREFLOW 33
-#define LINEDISC 34
-#define DC 35
-
-#define NOVAL ((value_t *)NULL)
-#define NOACU ((acu_t *)NULL)
-#define NOSTR ((char *)NULL)
-#define NOFILE ((FILE *)NULL)
-#define NOPWD ((struct passwd *)0)
-
-struct termios term; /* current mode of terminal */
-struct termios defterm; /* initial mode of terminal */
-struct termios defchars; /* current mode with initial chars */
-int gotdefterm;
-
-FILE *fscript; /* FILE for scripting */
-
-int fildes[2]; /* file transfer synchronization channel */
-int repdes[2]; /* read process sychronization channel */
-int FD; /* open file descriptor to remote host */
-int AC; /* open file descriptor to dialer (v831 only) */
-int vflag; /* print .tiprc initialization sequence */
-int noesc; /* no `~' escape char */
-int sfd; /* for ~< operation */
-pid_t tipin_pid; /* pid of tipin */
-pid_t tipout_pid; /* pid of tipout */
-uid_t uid, euid; /* real and effective user id's */
-gid_t gid, egid; /* real and effective group id's */
-int stop; /* stop transfer session flag */
-int quit; /* same; but on other end */
-int intflag; /* recognized interrupt */
-int stoprompt; /* for interrupting a prompt session */
-int timedout; /* ~> transfer timedout */
-int cumode; /* simulating the "cu" program */
-int bits8; /* terminal is is 8-bit mode */
-#define STRIP_PAR (bits8 ? 0377 : 0177)
-
-char fname[PATH_MAX]; /* file name buffer for ~< */
-char copyname[PATH_MAX]; /* file name buffer for ~> */
-char ccc; /* synchronization character */
-char *uucplock; /* name of lock file for uucp's */
-
-int odisc; /* initial tty line discipline */
-extern int disc; /* current tty discpline */
-
-extern char *__progname; /* program name */
-
-char *con(void);
-char *ctrl(char);
-char *expand(char *);
-char *getremote(char *);
-char *interp(char *);
-int any(int, char *);
-int biz22w_dialer(char *, char *);
-int biz22f_dialer(char *, char *);
-int biz31w_dialer(char *, char *);
-int biz31f_dialer(char *, char *);
-int cour_dialer(char *, char *);
-int df02_dialer(char *, char *);
-int df03_dialer(char *, char *);
-int dn_dialer(char *, char *);
-int hay_dialer(char *, char *);
-int prompt(char *, char *, size_t);
-size_t size(char *);
-int t3000_dialer(char *, char *);
-int ttysetup(int);
-int uu_lock(char *);
-int uu_unlock(char *);
-int v3451_dialer(char *, char *);
-int v831_dialer(char *, char *);
-int ven_dialer(char *, char *);
-int vstring(char *, char *);
-long hunt(char *);
-void biz22_disconnect(void);
-void biz22_abort(void);
-void biz31_disconnect(void);
-void biz31_abort(void);
-void chdirectory(int);
-void cleanup(int);
-void consh(int);
-void cour_abort(void);
-void cour_disconnect(void);
-void cu_put(int);
-void cu_take(int);
-void cumain(int, char **);
-void daemon_uid(void);
-void df_abort(void);
-void df_disconnect(void);
-void disconnect(char *);
-void dn_abort(void);
-void dn_disconnect(void);
-void finish(int);
-void genbrk(int);
-void getfl(int);
-void hay_abort(void);
-void hay_disconnect(void);
-void help(int);
-void listvariables(int);
-void logent(char *, char *, char *, char *);
-void loginit(void);
-void parwrite(int, char *, size_t);
-void pipefile(int);
-void pipeout(int);
-void raw(void);
-void sendfile(int);
-void setparity(char *);
-void setscript(void);
-void shell(int);
-void shell_uid(void);
-void suspend(int);
-void t3000_disconnect(void);
-void t3000_abort(void);
-void timeout(int);
-void tipabort(char *);
-void tipout(void);
-void user_uid(void);
-void unexcl(void);
-void unraw(void);
-void v3451_abort(void);
-void v3451_disconnect(void);
-void v831_disconnect(void);
-void v831_abort(void);
-void variable(int);
-void ven_disconnect(void);
-void ven_abort(void);
-void vinit(void);
-void vlex(char *);
diff --git a/usr.bin/tip/tip/tipout.c b/usr.bin/tip/tip/tipout.c
deleted file mode 100644
index 42fc4a2..0000000
--- a/usr.bin/tip/tip/tipout.c
+++ /dev/null
@@ -1,181 +0,0 @@
-/* $OpenBSD: tipout.c,v 1.18 2006/05/31 07:03:08 jason Exp $ */
-/* $NetBSD: tipout.c,v 1.5 1996/12/29 10:34:12 cgd Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)tipout.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: tipout.c,v 1.18 2006/05/31 07:03:08 jason Exp $";
-#endif
-#endif /* not lint */
-
-#include "tip.h"
-
-/*
- * tip
- *
- * lower fork of tip -- handles passive side
- * reading from the remote host
- */
-
-static jmp_buf sigbuf;
-
-static void intIOT(int);
-static void intEMT(int);
-static void intTERM(int);
-static void intSYS(int);
-
-/*
- * TIPOUT wait state routine --
- * sent by TIPIN when it wants to posses the remote host
- */
-/*ARGSUSED*/
-static void
-intIOT(int signo)
-{
- write(repdes[1],&ccc,1);
- read(fildes[0], &ccc,1);
- longjmp(sigbuf, 1);
-}
-
-/*
- * Scripting command interpreter --
- * accepts script file name over the pipe and acts accordingly
- */
-/*ARGSUSED*/
-static void
-intEMT(int signo)
-{
- char c, line[256];
- char *pline = line;
- char reply;
-
- read(fildes[0], &c, 1);
- while (c != '\n' && (size_t)(pline - line) < sizeof(line)) {
- *pline++ = c;
- read(fildes[0], &c, 1);
- }
- *pline = '\0';
- if (boolean(value(SCRIPT)) && fscript != NULL)
- fclose(fscript);
- if (pline == line) {
- setboolean(value(SCRIPT), FALSE);
- reply = 'y';
- } else {
- if ((fscript = fopen(line, "a")) == NULL)
- reply = 'n';
- else {
- reply = 'y';
- setboolean(value(SCRIPT), TRUE);
- }
- }
- write(repdes[1], &reply, 1);
- longjmp(sigbuf, 1);
-}
-
-static void
-intTERM(int signo)
-{
- if (boolean(value(SCRIPT)) && fscript != NULL)
- fclose(fscript);
- if (signo && tipin_pid)
- kill(tipin_pid, signo);
- exit(0);
-}
-
-/*ARGSUSED*/
-static void
-intSYS(int signo)
-{
- setboolean(value(BEAUTIFY), !boolean(value(BEAUTIFY)));
- longjmp(sigbuf, 1);
-}
-
-/*
- * ****TIPOUT TIPOUT****
- */
-void
-tipout(void)
-{
- char buf[BUFSIZ];
- char *cp;
- ssize_t scnt;
- size_t cnt;
- sigset_t mask, omask;
-
- signal(SIGINT, SIG_IGN);
- signal(SIGQUIT, SIG_IGN);
- signal(SIGEMT, intEMT); /* attention from TIPIN */
- signal(SIGTERM, intTERM); /* time to go signal */
- signal(SIGIOT, intIOT); /* scripting going on signal */
- signal(SIGHUP, intTERM); /* for dial-ups */
- signal(SIGSYS, intSYS); /* beautify toggle */
- (void) setjmp(sigbuf);
- sigprocmask(SIG_BLOCK, NULL, &omask);
- for (;;) {
- sigprocmask(SIG_SETMASK, &omask, NULL);
- scnt = read(FD, buf, BUFSIZ);
- if (scnt <= 0) {
- /* lost carrier */
- if (scnt == 0 || (scnt < 0 && errno == EIO)) {
- sigemptyset(&mask);
- sigaddset(&mask, SIGTERM);
- sigprocmask(SIG_BLOCK, &mask, NULL);
- intTERM(0);
- /*NOTREACHED*/
- }
- continue;
- }
- cnt = scnt;
- sigemptyset(&mask);
- sigaddset(&mask, SIGEMT);
- sigaddset(&mask, SIGTERM);
- sigaddset(&mask, SIGIOT);
- sigaddset(&mask, SIGSYS);
- sigprocmask(SIG_BLOCK, &mask, NULL);
- for (cp = buf; cp < buf + cnt; cp++)
- *cp &= STRIP_PAR;
- write(STDOUT_FILENO, buf, cnt);
- if (boolean(value(SCRIPT)) && fscript != NULL) {
- if (!boolean(value(BEAUTIFY))) {
- fwrite(buf, 1, cnt, fscript);
- continue;
- }
- for (cp = buf; cp < buf + cnt; cp++)
- if ((*cp >= ' ' && *cp <= '~') ||
- any(*cp, value(EXCEPTIONS)))
- putc(*cp, fscript);
- }
- }
-}
diff --git a/usr.bin/tip/tip/uucplock.c b/usr.bin/tip/tip/uucplock.c
deleted file mode 100644
index c82ea78..0000000
--- a/usr.bin/tip/tip/uucplock.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/* $OpenBSD: uucplock.c,v 1.11 2006/03/16 19:32:46 deraadt Exp $ */
-/* $NetBSD: uucplock.c,v 1.7 1997/02/11 09:24:08 mrg Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)uucplock.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: uucplock.c,v 1.11 2006/03/16 19:32:46 deraadt Exp $";
-#endif
-#endif /* not lint */
-
-#include <sys/types.h>
-#include <sys/file.h>
-#include <sys/dirent.h>
-#include <stdio.h>
-#include <string.h>
-#include <signal.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <errno.h>
-#include "tip.h"
-#include "pathnames.h"
-
-/*
- * uucp style locking routines
- * return: 0 - success
- * -1 - failure
- */
-
-int
-uu_lock(char *ttyname)
-{
- int fd, len;
- char tbuf[sizeof(_PATH_LOCKDIRNAME) + MAXNAMLEN];
- char text_pid[81];
- pid_t pid;
-
- (void)snprintf(tbuf, sizeof tbuf, _PATH_LOCKDIRNAME, ttyname);
- fd = open(tbuf, O_RDWR|O_CREAT|O_EXCL, 0660);
- if (fd < 0) {
- /*
- * file is already locked
- * check to see if the process holding the lock still exists
- */
- fd = open(tbuf, O_RDWR, 0);
- if (fd < 0) {
- perror(tbuf);
- fprintf(stderr, "Can't open lock file.\n");
- return(-1);
- }
- len = read(fd, text_pid, sizeof(text_pid)-1);
- if (len<=0) {
- perror(tbuf);
- (void)close(fd);
- fprintf(stderr, "Can't read lock file.\n");
- return(-1);
- }
- text_pid[len] = 0;
- pid = atol(text_pid);
-
- if (kill(pid, 0) == 0 || errno != ESRCH) {
- (void)close(fd); /* process is still running */
- return(-1);
- }
- /*
- * The process that locked the file isn't running, so
- * we'll lock it ourselves
- */
- fprintf(stderr, "Stale lock on %s PID=%ld... overriding.\n",
- ttyname, (long)pid);
- if (lseek(fd, (off_t)0, SEEK_SET) < 0) {
- perror(tbuf);
- (void)close(fd);
- fprintf(stderr, "Can't seek lock file.\n");
- return(-1);
- }
- /* fall out and finish the locking process */
- }
- pid = getpid();
- (void)snprintf(text_pid, sizeof text_pid, "%10ld\n", (long)pid);
- len = strlen(text_pid);
- if (write(fd, text_pid, len) != len) {
- (void)close(fd);
- (void)unlink(tbuf);
- perror("lock write");
- return(-1);
- }
- (void)close(fd);
- return(0);
-}
-
-int
-uu_unlock(char *ttyname)
-{
- char tbuf[sizeof(_PATH_LOCKDIRNAME) + MAXNAMLEN];
-
- (void)snprintf(tbuf, sizeof tbuf, _PATH_LOCKDIRNAME, ttyname);
- unexcl();
- return(unlink(tbuf));
-}
diff --git a/usr.bin/tip/tip/value.c b/usr.bin/tip/tip/value.c
deleted file mode 100644
index b6cf5c2..0000000
--- a/usr.bin/tip/tip/value.c
+++ /dev/null
@@ -1,349 +0,0 @@
-/* $OpenBSD: value.c,v 1.14 2006/03/17 22:02:58 moritz Exp $ */
-/* $NetBSD: value.c,v 1.6 1997/02/11 09:24:09 mrg Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)value.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: value.c,v 1.14 2006/03/17 22:02:58 moritz Exp $";
-#endif
-#endif /* not lint */
-
-#include "tip.h"
-
-#define MIDDLE 35
-
-static value_t *vlookup(char *);
-static void vassign(value_t *, char *);
-static void vtoken(char *);
-static void vprint(value_t *);
-static int vaccess(unsigned int, unsigned int);
-static char *vinterp(char *, int);
-
-static size_t col = 0;
-
-/*
- * Variable manipulation
- */
-void
-vinit(void)
-{
- char file[FILENAME_MAX], *cp;
- value_t *p;
- FILE *fp;
-
- for (p = vtable; p->v_name != NULL; p++) {
- if (p->v_type&ENVIRON)
- if ((cp = getenv(p->v_name)))
- p->v_value = cp;
- if (p->v_type&IREMOTE)
- setnumber(p->v_value, *address(p->v_value));
- }
- /*
- * Read the .tiprc file in the HOME directory
- * for sets
- */
- cp = value(HOME);
- if (cp == NULL) {
- (void)fprintf(stderr,
- "$HOME not set. Skipping check for ~/.tiprc\n");
- } else if (strlen(cp) + sizeof("/.tiprc") > sizeof(file)) {
- (void)fprintf(stderr, "Home directory path too long: %s\n",
- value(HOME));
- } else {
- snprintf(file, sizeof file, "%s/.tiprc", value(HOME));
- if ((fp = fopen(file, "r")) != NULL) {
- char *tp;
-
- while (fgets(file, sizeof(file)-1, fp) != NULL) {
- if (vflag)
- printf("set %s", file);
- if ((tp = strrchr(file, '\n')))
- *tp = '\0';
- vlex(file);
- }
- fclose(fp);
- }
- }
- /*
- * To allow definition of exception prior to fork
- */
- vtable[EXCEPTIONS].v_access &= ~(WRITE<<PUBLIC);
-}
-
-/*VARARGS1*/
-static void
-vassign(value_t *p, char *v)
-{
- if (!vaccess(p->v_access, WRITE)) {
- printf("access denied\r\n");
- return;
- }
-
- switch (p->v_type&TMASK) {
- case STRING:
- if (p->v_value && equal(p->v_value, v))
- return;
- if (!(p->v_type&(ENVIRON|INIT)))
- free(p->v_value);
- if ((p->v_value = strdup(v)) == NOSTR) {
- printf("out of core\r\n");
- return;
- }
- p->v_type &= ~(ENVIRON|INIT);
- break;
- case NUMBER:
- if (number(p->v_value) == number(v))
- return;
- setnumber(p->v_value, number(v));
- break;
- case BOOL:
- if (boolean(p->v_value) == (*v != '!'))
- return;
- setboolean(p->v_value, (*v != '!'));
- break;
- case CHAR:
- if (character(p->v_value) == *v)
- return;
- setcharacter(p->v_value, *v);
- }
- p->v_access |= CHANGED;
-}
-
-void
-vlex(char *s)
-{
- value_t *p;
- char *cp;
-
- if (equal(s, "all")) {
- for (p = vtable; p->v_name; p++)
- if (vaccess(p->v_access, READ))
- vprint(p);
- } else {
- do {
- if ((cp = vinterp(s, ' ')))
- cp++;
- vtoken(s);
- s = cp;
- } while (s);
- }
- if (col > 0) {
- printf("\r\n");
- col = 0;
- }
-}
-
-static void
-vtoken(char *s)
-{
- value_t *p;
- char *cp;
-
- if ((cp = strchr(s, '='))) {
- *cp = '\0';
- if ((p = vlookup(s))) {
- cp++;
- if (p->v_type&NUMBER)
- vassign(p, (char *)(intptr_t)atoi(cp));
- else {
- if (strcmp(s, "record") == 0)
- cp = expand(cp);
- vassign(p, cp);
- }
- return;
- }
- } else if ((cp = strchr(s, '?'))) {
- *cp = '\0';
- if ((p = vlookup(s)) && vaccess(p->v_access, READ)) {
- vprint(p);
- return;
- }
- } else {
- if (*s != '!')
- p = vlookup(s);
- else
- p = vlookup(s+1);
- if (p != NOVAL) {
- vassign(p, s);
- return;
- }
- }
- printf("%s: unknown variable\r\n", s);
-}
-
-static void
-vprint(value_t *p)
-{
- char *cp;
-
- if (col > 0 && col < MIDDLE)
- while (col++ < MIDDLE)
- putchar(' ');
- col += size(p->v_name);
- switch (p->v_type&TMASK) {
-
- case BOOL:
- if (boolean(p->v_value) == FALSE) {
- col++;
- putchar('!');
- }
- printf("%s", p->v_name);
- break;
-
- case STRING:
- printf("%s=", p->v_name);
- col++;
- if (p->v_value) {
- cp = interp(p->v_value);
- col += size(cp);
- printf("%s", cp);
- }
- break;
-
- case NUMBER:
- col += 6;
- printf("%s=%-5ld", p->v_name, number(p->v_value));
- break;
-
- case CHAR:
- printf("%s=", p->v_name);
- col++;
- if (p->v_value) {
- cp = ctrl(character(p->v_value));
- col += size(cp);
- printf("%s", cp);
- }
- break;
- }
- if (col >= MIDDLE) {
- col = 0;
- printf("\r\n");
- return;
- }
-}
-
-static int
-vaccess(unsigned int mode, unsigned int rw)
-{
- if (mode & (rw<<PUBLIC))
- return (1);
- if (mode & (rw<<PRIVATE))
- return (1);
- return ((mode & (rw<<ROOT)) && getuid() == 0);
-}
-
-static value_t *
-vlookup(char *s)
-{
- value_t *p;
-
- for (p = vtable; p->v_name; p++)
- if (equal(p->v_name, s) || (p->v_abrev && equal(p->v_abrev, s)))
- return (p);
- return (NULL);
-}
-
-static char *
-vinterp(char *s, int stop)
-{
- char *p = s, c;
- int num;
-
- while ((c = *s++) && c != stop) {
- switch (c) {
-
- case '^':
- if (*s)
- *p++ = *s++ - 0100;
- else
- *p++ = c;
- break;
-
- case '\\':
- num = 0;
- c = *s++;
- if (c >= '0' && c <= '7')
- num = (num<<3)+(c-'0');
- else {
- char *q = "n\nr\rt\tb\bf\f";
-
- for (; *q; q++)
- if (c == *q++) {
- *p++ = *q;
- goto cont;
- }
- *p++ = c;
- cont:
- break;
- }
- if ((c = *s++) >= '0' && c <= '7') {
- num = (num<<3)+(c-'0');
- if ((c = *s++) >= '0' && c <= '7')
- num = (num<<3)+(c-'0');
- else
- s--;
- } else
- s--;
- *p++ = num;
- break;
-
- default:
- *p++ = c;
- }
- }
- *p = '\0';
- return (c == stop ? s-1 : NULL);
-}
-
-/*
- * assign variable s with value v (for NUMBER or STRING or CHAR types)
- */
-int
-vstring(char *s, char *v)
-{
- value_t *p;
-
- p = vlookup(s);
- if (p == 0)
- return (1);
- if (p->v_type&NUMBER)
- vassign(p, (char *)(intptr_t)atoi(v));
- else {
- if (strcmp(s, "record") == 0)
- v = expand(v);
- vassign(p, v);
- }
- return (0);
-}
diff --git a/usr.bin/tip/tip/vars.c b/usr.bin/tip/tip/vars.c
deleted file mode 100644
index a991bcc..0000000
--- a/usr.bin/tip/tip/vars.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/* $OpenBSD: vars.c,v 1.8 2006/08/18 03:06:18 jason Exp $ */
-/* $NetBSD: vars.c,v 1.3 1994/12/08 09:31:19 jtc Exp $ */
-
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)vars.c 8.1 (Berkeley) 6/6/93";
-static const char rcsid[] = "$OpenBSD: vars.c,v 1.8 2006/08/18 03:06:18 jason Exp $";
-#endif
-#endif /* not lint */
-
-#include "tip.h"
-#include "pathnames.h"
-
-/*
- * Definition of variables
- */
-value_t vtable[] = {
- { "beautify", BOOL, (READ|WRITE)<<PUBLIC,
- "be", (char *)TRUE },
- { "baudrate", NUMBER|IREMOTE|INIT, (READ<<PUBLIC)|(WRITE<<ROOT),
- "ba", (char *)&BR },
- { "dialtimeout",NUMBER, (READ<<PUBLIC)|(WRITE<<ROOT),
- "dial", (char *)60 },
- { "eofread", STRING|IREMOTE|INIT, (READ|WRITE)<<PUBLIC,
- "eofr", (char *)&IE },
- { "eofwrite", STRING|IREMOTE|INIT, (READ|WRITE)<<PUBLIC,
- "eofw", (char *)&OE },
- { "eol", STRING|IREMOTE|INIT, (READ|WRITE)<<PUBLIC,
- NOSTR, (char *)&EL },
- { "escape", CHAR, (READ|WRITE)<<PUBLIC,
- "es", (char *)'~' },
- { "exceptions", STRING|INIT|IREMOTE, (READ|WRITE)<<PUBLIC,
- "ex", (char *)&EX },
- { "force", CHAR, (READ|WRITE)<<PUBLIC,
- "fo", (char *)CTRL('p') },
- { "framesize", NUMBER|IREMOTE|INIT, (READ|WRITE)<<PUBLIC,
- "fr", (char *)&FS },
- { "host", STRING|IREMOTE|INIT, READ<<PUBLIC,
- "ho", (char *)&HO },
- { "log", STRING|INIT, (READ|WRITE)<<ROOT,
- NOSTR, _PATH_ACULOG },
- { "phones", STRING|INIT|IREMOTE, READ<<PUBLIC,
- NOSTR, (char *)&PH },
- { "prompt", CHAR, (READ|WRITE)<<PUBLIC,
- "pr", (char *)'\n' },
- { "raise", BOOL, (READ|WRITE)<<PUBLIC,
- "ra", (char *)FALSE },
- { "raisechar", CHAR, (READ|WRITE)<<PUBLIC,
- "rc", NOSTR },
- { "record", STRING|INIT|IREMOTE, (READ|WRITE)<<PUBLIC,
- "rec", (char *)&RE },
- { "remote", STRING|INIT|IREMOTE, READ<<PUBLIC,
- NOSTR, (char *)&RM },
- { "script", BOOL, (READ|WRITE)<<PUBLIC,
- "sc", (char *)FALSE },
- { "tabexpand", BOOL, (READ|WRITE)<<PUBLIC,
- "tab", (char *)FALSE },
- { "verbose", BOOL, (READ|WRITE)<<PUBLIC,
- "verb", (char *)TRUE },
- { "SHELL", STRING|ENVIRON|INIT, (READ|WRITE)<<PUBLIC,
- NULL, _PATH_BSHELL },
- { "HOME", STRING|ENVIRON, (READ|WRITE)<<PUBLIC,
- NOSTR, NOSTR },
- { "echocheck", BOOL, (READ|WRITE)<<PUBLIC,
- "ec", (char *)FALSE },
- { "disconnect", STRING|IREMOTE|INIT, (READ|WRITE)<<PUBLIC,
- "di", (char *)&DI },
- { "tandem", BOOL, (READ|WRITE)<<PUBLIC,
- "ta", (char *)TRUE },
- { "linedelay", NUMBER|IREMOTE|INIT, (READ|WRITE)<<PUBLIC,
- "ldelay", (char *)&DL },
- { "chardelay", NUMBER|IREMOTE|INIT, (READ|WRITE)<<PUBLIC,
- "cdelay", (char *)&CL },
- { "etimeout", NUMBER|IREMOTE|INIT, (READ|WRITE)<<PUBLIC,
- "et", (char *)&ET },
- { "rawftp", BOOL, (READ|WRITE)<<PUBLIC,
- "raw", (char *)FALSE },
- { "halfduplex", BOOL, (READ|WRITE)<<PUBLIC,
- "hdx", (char *)FALSE },
- { "localecho", BOOL, (READ|WRITE)<<PUBLIC,
- "le", (char *)FALSE },
- { "parity", STRING|INIT|IREMOTE, (READ|WRITE)<<PUBLIC,
- "par", (char *)&PA },
- { "hardwareflow", BOOL, (READ|WRITE)<<PUBLIC,
- "hf", (char *)FALSE },
- { "linedisc", NUMBER|IREMOTE|INIT, (READ|WRITE)<<PUBLIC,
- "ld", (char *)&LD },
- { "direct", BOOL, (READ<<PUBLIC)|(WRITE<<ROOT),
- "dc", (char *)FALSE },
- { NOSTR, 0, 0,
- NOSTR, NOSTR }
-};
diff --git a/usr.bin/top/Makefile b/usr.bin/top/Makefile
deleted file mode 100644
index 182714a..0000000
--- a/usr.bin/top/Makefile
+++ /dev/null
@@ -1,47 +0,0 @@
-# $FreeBSD$
-
-TOPDIR= ${.CURDIR}/../../contrib/top
-.PATH: ${TOPDIR}
-
-PROG= top
-SRCS= commands.c display.c machine.c screen.c top.c \
- username.c utils.c version.c
-SRCS+= sigdesc.h top.local.h
-CFLAGS+= -DHAVE_GETOPT -DHAVE_STRERROR -DORDER
-CFLAGS+= -I${.CURDIR} -I${TOPDIR} -I.
-
-#
-# The table size should be a prime number approximately twice as
-# large as the number of lines in /etc/passwd. The default number
-# is 20011; use /etc/make.conf to override this.
-#
-.if defined(TOP_TABLE_SIZE)
-CFLAGS+= -D"Table_size=${TOP_TABLE_SIZE}"
-.endif
-
-DPADD= ${LIBTERMCAP} ${LIBM} ${LIBKVM}
-LDADD= -ltermcap -lm -lkvm
-
-CLEANFILES= sigdesc.h
-SIGCONV_AWK= ${.CURDIR}/../../contrib/top/sigconv.awk
-SIGNAL_H= ${DESTDIR}/usr/include/sys/signal.h
-sigdesc.h: ${SIGCONV_AWK} ${SIGNAL_H}
- awk -f ${SIGCONV_AWK} < ${SIGNAL_H} > ${.TARGET}
-
-CLEANFILES+= top.local.h top.x
-.SUFFIXES: .X .x .H .h
-.X.x .H.h:
- @${ECHO} Making ${.TARGET} from ${.IMPSRC}
- @sed -e's,%LoadMax%,5.0,g' \
- -e's,%TableSize%,20011,g' \
- -e's,%NominalTopn%,18,g' \
- -e's,%topn%,-1,g' \
- -e's,%delay%,2,g' \
- -e's,%random%,1,g' \
- ${.IMPSRC} > ${.TARGET}
-
-CLEANFILES+= top.1
-top.1: top.x top.local.1
- cat ${.ALLSRC} > ${.TARGET}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/top/machine.c b/usr.bin/top/machine.c
deleted file mode 100644
index 9754c6d..0000000
--- a/usr.bin/top/machine.c
+++ /dev/null
@@ -1,1427 +0,0 @@
-/*
- * top - a top users display for Unix
- *
- * SYNOPSIS: For FreeBSD-2.x and later
- *
- * DESCRIPTION:
- * Originally written for BSD4.4 system by Christos Zoulas.
- * Ported to FreeBSD 2.x by Steven Wallace && Wolfram Schneider
- * Order support hacked in from top-3.5beta6/machine/m_aix41.c
- * by Monte Mitzelfelt (for latest top see http://www.groupsys.com/topinfo/)
- *
- * This is the machine-dependent module for FreeBSD 2.2
- * Works for:
- * FreeBSD 2.2.x, 3.x, 4.x, and probably FreeBSD 2.1.x
- *
- * LIBS: -lkvm
- *
- * AUTHOR: Christos Zoulas <christos@ee.cornell.edu>
- * Steven Wallace <swallace@freebsd.org>
- * Wolfram Schneider <wosch@FreeBSD.org>
- * Thomas Moestl <tmoestl@gmx.net>
- *
- * $FreeBSD$
- */
-
-#include <sys/param.h>
-#include <sys/errno.h>
-#include <sys/file.h>
-#include <sys/proc.h>
-#include <sys/resource.h>
-#include <sys/rtprio.h>
-#include <sys/signal.h>
-#include <sys/sysctl.h>
-#include <sys/time.h>
-#include <sys/user.h>
-#include <sys/vmmeter.h>
-
-#include <kvm.h>
-#include <math.h>
-#include <nlist.h>
-#include <paths.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include <unistd.h>
-#include <vis.h>
-
-#include "top.h"
-#include "machine.h"
-#include "screen.h"
-#include "utils.h"
-#include "layout.h"
-
-#define GETSYSCTL(name, var) getsysctl(name, &(var), sizeof(var))
-#define SMPUNAMELEN 13
-#define UPUNAMELEN 15
-
-extern struct process_select ps;
-extern char* printable(char *);
-static int smpmode;
-enum displaymodes displaymode;
-#ifdef TOP_USERNAME_LEN
-static int namelength = TOP_USERNAME_LEN;
-#else
-static int namelength = 8;
-#endif
-static int cmdlengthdelta;
-
-/* Prototypes for top internals */
-void quit(int);
-
-/* get_process_info passes back a handle. This is what it looks like: */
-
-struct handle {
- struct kinfo_proc **next_proc; /* points to next valid proc pointer */
- int remaining; /* number of pointers remaining */
-};
-
-/* declarations for load_avg */
-#include "loadavg.h"
-
-/* define what weighted cpu is. */
-#define weighted_cpu(pct, pp) ((pp)->ki_swtime == 0 ? 0.0 : \
- ((pct) / (1.0 - exp((pp)->ki_swtime * logcpu))))
-
-/* what we consider to be process size: */
-#define PROCSIZE(pp) ((pp)->ki_size / 1024)
-
-#define RU(pp) (&(pp)->ki_rusage)
-#define RUTOT(pp) \
- (RU(pp)->ru_inblock + RU(pp)->ru_oublock + RU(pp)->ru_majflt)
-
-
-/* definitions for indices in the nlist array */
-
-/*
- * These definitions control the format of the per-process area
- */
-
-static char io_header[] =
- " PID%s %-*.*s VCSW IVCSW READ WRITE FAULT TOTAL PERCENT COMMAND";
-
-#define io_Proc_format \
- "%5d%s %-*.*s %6ld %6ld %6ld %6ld %6ld %6ld %6.2f%% %.*s"
-
-static char smp_header_thr[] =
- " PID%s %-*.*s THR PRI NICE SIZE RES STATE C TIME %6s COMMAND";
-static char smp_header[] =
- " PID%s %-*.*s " "PRI NICE SIZE RES STATE C TIME %6s COMMAND";
-
-#define smp_Proc_format \
- "%5d%s %-*.*s %s%3d %4s%7s %6s %-6.6s %2d%7s %5.2f%% %.*s"
-
-static char up_header_thr[] =
- " PID%s %-*.*s THR PRI NICE SIZE RES STATE TIME %6s COMMAND";
-static char up_header[] =
- " PID%s %-*.*s " "PRI NICE SIZE RES STATE TIME %6s COMMAND";
-
-#define up_Proc_format \
- "%5d%s %-*.*s %s%3d %4s%7s %6s %-6.6s%.0d%7s %5.2f%% %.*s"
-
-
-/* process state names for the "STATE" column of the display */
-/* the extra nulls in the string "run" are for adding a slash and
- the processor number when needed */
-
-char *state_abbrev[] = {
- "", "START", "RUN\0\0\0", "SLEEP", "STOP", "ZOMB", "WAIT", "LOCK"
-};
-
-
-static kvm_t *kd;
-
-/* values that we stash away in _init and use in later routines */
-
-static double logcpu;
-
-/* these are retrieved from the kernel in _init */
-
-static load_avg ccpu;
-
-/* these are used in the get_ functions */
-
-static int lastpid;
-
-/* these are for calculating cpu state percentages */
-
-static long cp_time[CPUSTATES];
-static long cp_old[CPUSTATES];
-static long cp_diff[CPUSTATES];
-
-/* these are for detailing the process states */
-
-int process_states[8];
-char *procstatenames[] = {
- "", " starting, ", " running, ", " sleeping, ", " stopped, ",
- " zombie, ", " waiting, ", " lock, ",
- NULL
-};
-
-/* these are for detailing the cpu states */
-
-int cpu_states[CPUSTATES];
-char *cpustatenames[] = {
- "user", "nice", "system", "interrupt", "idle", NULL
-};
-
-/* these are for detailing the memory statistics */
-
-int memory_stats[7];
-char *memorynames[] = {
- "K Active, ", "K Inact, ", "K Wired, ", "K Cache, ", "K Buf, ",
- "K Free", NULL
-};
-
-int swap_stats[7];
-char *swapnames[] = {
- "K Total, ", "K Used, ", "K Free, ", "% Inuse, ", "K In, ", "K Out",
- NULL
-};
-
-
-/* these are for keeping track of the proc array */
-
-static int nproc;
-static int onproc = -1;
-static int pref_len;
-static struct kinfo_proc *pbase;
-static struct kinfo_proc **pref;
-static struct kinfo_proc *previous_procs;
-static struct kinfo_proc **previous_pref;
-static int previous_proc_count = 0;
-static int previous_proc_count_max = 0;
-
-/* total number of io operations */
-static long total_inblock;
-static long total_oublock;
-static long total_majflt;
-
-/* these are for getting the memory statistics */
-
-static int pageshift; /* log base 2 of the pagesize */
-
-/* define pagetok in terms of pageshift */
-
-#define pagetok(size) ((size) << pageshift)
-
-/* useful externals */
-long percentages();
-
-#ifdef ORDER
-/*
- * Sorting orders. The first element is the default.
- */
-char *ordernames[] = {
- "cpu", "size", "res", "time", "pri", "threads",
- "total", "read", "write", "fault", "vcsw", "ivcsw",
- "jid", NULL
-};
-#endif
-
-/* Per-cpu time states */
-static int maxcpu;
-static int maxid;
-static int ncpus;
-static u_long cpumask;
-static long *times;
-static long *pcpu_cp_time;
-static long *pcpu_cp_old;
-static long *pcpu_cp_diff;
-static int *pcpu_cpu_states;
-
-static int compare_jid(const void *a, const void *b);
-static int compare_pid(const void *a, const void *b);
-static const char *format_nice(const struct kinfo_proc *pp);
-static void getsysctl(const char *name, void *ptr, size_t len);
-static int swapmode(int *retavail, int *retfree);
-
-int
-machine_init(struct statics *statics, char do_unames)
-{
- int pagesize;
- size_t modelen;
- struct passwd *pw;
-
- modelen = sizeof(smpmode);
- if ((sysctlbyname("machdep.smp_active", &smpmode, &modelen,
- NULL, 0) != 0 &&
- sysctlbyname("kern.smp.active", &smpmode, &modelen,
- NULL, 0) != 0) ||
- modelen != sizeof(smpmode))
- smpmode = 0;
-
- if (do_unames) {
- while ((pw = getpwent()) != NULL) {
- if (strlen(pw->pw_name) > namelength)
- namelength = strlen(pw->pw_name);
- }
- }
- if (smpmode && namelength > SMPUNAMELEN)
- namelength = SMPUNAMELEN;
- else if (namelength > UPUNAMELEN)
- namelength = UPUNAMELEN;
-
- kd = kvm_open(NULL, _PATH_DEVNULL, NULL, O_RDONLY, "kvm_open");
- if (kd == NULL)
- return (-1);
-
- GETSYSCTL("kern.ccpu", ccpu);
-
- /* this is used in calculating WCPU -- calculate it ahead of time */
- logcpu = log(loaddouble(ccpu));
-
- pbase = NULL;
- pref = NULL;
- nproc = 0;
- onproc = -1;
-
- /* get the page size and calculate pageshift from it */
- pagesize = getpagesize();
- pageshift = 0;
- while (pagesize > 1) {
- pageshift++;
- pagesize >>= 1;
- }
-
- /* we only need the amount of log(2)1024 for our conversion */
- pageshift -= LOG1024;
-
- /* fill in the statics information */
- statics->procstate_names = procstatenames;
- statics->cpustate_names = cpustatenames;
- statics->memory_names = memorynames;
- statics->swap_names = swapnames;
-#ifdef ORDER
- statics->order_names = ordernames;
-#endif
-
- /* Adjust display based on ncpus */
- if (pcpu_stats) {
- int i, j, empty;
- size_t size;
-
- cpumask = 0;
- ncpus = 0;
- GETSYSCTL("kern.smp.maxcpus", maxcpu);
- size = sizeof(long) * maxcpu * CPUSTATES;
- times = malloc(size);
- if (times == NULL)
- err(1, "malloc %zd bytes", size);
- if (sysctlbyname("kern.cp_times", times, &size, NULL, 0) == -1)
- err(1, "sysctlbyname kern.cp_times");
- pcpu_cp_time = calloc(1, size);
- maxid = (size / CPUSTATES / sizeof(long)) - 1;
- for (i = 0; i <= maxid; i++) {
- empty = 1;
- for (j = 0; empty && j < CPUSTATES; j++) {
- if (times[i * CPUSTATES + j] != 0)
- empty = 0;
- }
- if (!empty) {
- cpumask |= (1ul << i);
- ncpus++;
- }
- }
-
- if (ncpus > 1) {
- y_mem += ncpus - 1; /* 3 */
- y_swap += ncpus - 1; /* 4 */
- y_idlecursor += ncpus - 1; /* 5 */
- y_message += ncpus - 1; /* 5 */
- y_header += ncpus - 1; /* 6 */
- y_procs += ncpus - 1; /* 7 */
- Header_lines += ncpus - 1; /* 7 */
- }
- size = sizeof(long) * ncpus * CPUSTATES;
- pcpu_cp_old = calloc(1, size);
- pcpu_cp_diff = calloc(1, size);
- pcpu_cpu_states = calloc(1, size);
- statics->ncpus = ncpus;
- } else {
- statics->ncpus = 1;
- }
-
- /* all done! */
- return (0);
-}
-
-char *
-format_header(char *uname_field)
-{
- static char Header[128];
- const char *prehead;
-
- switch (displaymode) {
- case DISP_CPU:
- /*
- * The logic of picking the right header format seems reverse
- * here because we only want to display a THR column when
- * "thread mode" is off (and threads are not listed as
- * separate lines).
- */
- prehead = smpmode ?
- (ps.thread ? smp_header : smp_header_thr) :
- (ps.thread ? up_header : up_header_thr);
- snprintf(Header, sizeof(Header), prehead,
- ps.jail ? " JID" : "",
- namelength, namelength, uname_field,
- ps.wcpu ? "WCPU" : "CPU");
- break;
- case DISP_IO:
- prehead = io_header;
- snprintf(Header, sizeof(Header), prehead,
- ps.jail ? " JID" : "",
- namelength, namelength, uname_field);
- break;
- }
- cmdlengthdelta = strlen(Header) - 7;
- return (Header);
-}
-
-static int swappgsin = -1;
-static int swappgsout = -1;
-extern struct timeval timeout;
-
-
-void
-get_system_info(struct system_info *si)
-{
- long total;
- struct loadavg sysload;
- int mib[2];
- struct timeval boottime;
- size_t bt_size;
- int i, j;
- size_t size;
-
- /* get the cp_time array */
- if (pcpu_stats) {
- size = (maxid + 1) * CPUSTATES * sizeof(long);
- if (sysctlbyname("kern.cp_times", pcpu_cp_time, &size, NULL, 0) == -1)
- err(1, "sysctlbyname kern.cp_times");
- } else {
- GETSYSCTL("kern.cp_time", cp_time);
- }
- GETSYSCTL("vm.loadavg", sysload);
- GETSYSCTL("kern.lastpid", lastpid);
-
- /* convert load averages to doubles */
- for (i = 0; i < 3; i++)
- si->load_avg[i] = (double)sysload.ldavg[i] / sysload.fscale;
-
- if (pcpu_stats) {
- for (i = j = 0; i <= maxid; i++) {
- if ((cpumask & (1ul << i)) == 0)
- continue;
- /* convert cp_time counts to percentages */
- percentages(CPUSTATES, &pcpu_cpu_states[j * CPUSTATES],
- &pcpu_cp_time[j * CPUSTATES],
- &pcpu_cp_old[j * CPUSTATES],
- &pcpu_cp_diff[j * CPUSTATES]);
- j++;
- }
- } else {
- /* convert cp_time counts to percentages */
- percentages(CPUSTATES, cpu_states, cp_time, cp_old, cp_diff);
- }
-
- /* sum memory & swap statistics */
- {
- static unsigned int swap_delay = 0;
- static int swapavail = 0;
- static int swapfree = 0;
- static int bufspace = 0;
- static int nspgsin, nspgsout;
-
- GETSYSCTL("vfs.bufspace", bufspace);
- GETSYSCTL("vm.stats.vm.v_active_count", memory_stats[0]);
- GETSYSCTL("vm.stats.vm.v_inactive_count", memory_stats[1]);
- GETSYSCTL("vm.stats.vm.v_wire_count", memory_stats[2]);
- GETSYSCTL("vm.stats.vm.v_cache_count", memory_stats[3]);
- GETSYSCTL("vm.stats.vm.v_free_count", memory_stats[5]);
- GETSYSCTL("vm.stats.vm.v_swappgsin", nspgsin);
- GETSYSCTL("vm.stats.vm.v_swappgsout", nspgsout);
- /* convert memory stats to Kbytes */
- memory_stats[0] = pagetok(memory_stats[0]);
- memory_stats[1] = pagetok(memory_stats[1]);
- memory_stats[2] = pagetok(memory_stats[2]);
- memory_stats[3] = pagetok(memory_stats[3]);
- memory_stats[4] = bufspace / 1024;
- memory_stats[5] = pagetok(memory_stats[5]);
- memory_stats[6] = -1;
-
- /* first interval */
- if (swappgsin < 0) {
- swap_stats[4] = 0;
- swap_stats[5] = 0;
- }
-
- /* compute differences between old and new swap statistic */
- else {
- swap_stats[4] = pagetok(((nspgsin - swappgsin)));
- swap_stats[5] = pagetok(((nspgsout - swappgsout)));
- }
-
- swappgsin = nspgsin;
- swappgsout = nspgsout;
-
- /* call CPU heavy swapmode() only for changes */
- if (swap_stats[4] > 0 || swap_stats[5] > 0 || swap_delay == 0) {
- swap_stats[3] = swapmode(&swapavail, &swapfree);
- swap_stats[0] = swapavail;
- swap_stats[1] = swapavail - swapfree;
- swap_stats[2] = swapfree;
- }
- swap_delay = 1;
- swap_stats[6] = -1;
- }
-
- /* set arrays and strings */
- if (pcpu_stats) {
- si->cpustates = pcpu_cpu_states;
- si->ncpus = ncpus;
- } else {
- si->cpustates = cpu_states;
- si->ncpus = 1;
- }
- si->memory = memory_stats;
- si->swap = swap_stats;
-
-
- if (lastpid > 0) {
- si->last_pid = lastpid;
- } else {
- si->last_pid = -1;
- }
-
- /*
- * Print how long system has been up.
- * (Found by looking getting "boottime" from the kernel)
- */
- mib[0] = CTL_KERN;
- mib[1] = KERN_BOOTTIME;
- bt_size = sizeof(boottime);
- if (sysctl(mib, 2, &boottime, &bt_size, NULL, 0) != -1 &&
- boottime.tv_sec != 0) {
- si->boottime = boottime;
- } else {
- si->boottime.tv_sec = -1;
- }
-}
-
-#define NOPROC ((void *)-1)
-
-/*
- * We need to compare data from the old process entry with the new
- * process entry.
- * To facilitate doing this quickly we stash a pointer in the kinfo_proc
- * structure to cache the mapping. We also use a negative cache pointer
- * of NOPROC to avoid duplicate lookups.
- * XXX: this could be done when the actual processes are fetched, we do
- * it here out of laziness.
- */
-const struct kinfo_proc *
-get_old_proc(struct kinfo_proc *pp)
-{
- struct kinfo_proc **oldpp, *oldp;
-
- /*
- * If this is the first fetch of the kinfo_procs then we don't have
- * any previous entries.
- */
- if (previous_proc_count == 0)
- return (NULL);
- /* negative cache? */
- if (pp->ki_udata == NOPROC)
- return (NULL);
- /* cached? */
- if (pp->ki_udata != NULL)
- return (pp->ki_udata);
- /*
- * Not cached,
- * 1) look up based on pid.
- * 2) compare process start.
- * If we fail here, then setup a negative cache entry, otherwise
- * cache it.
- */
- oldpp = bsearch(&pp, previous_pref, previous_proc_count,
- sizeof(*previous_pref), compare_pid);
- if (oldpp == NULL) {
- pp->ki_udata = NOPROC;
- return (NULL);
- }
- oldp = *oldpp;
- if (bcmp(&oldp->ki_start, &pp->ki_start, sizeof(pp->ki_start)) != 0) {
- pp->ki_udata = NOPROC;
- return (NULL);
- }
- pp->ki_udata = oldp;
- return (oldp);
-}
-
-/*
- * Return the total amount of IO done in blocks in/out and faults.
- * store the values individually in the pointers passed in.
- */
-long
-get_io_stats(struct kinfo_proc *pp, long *inp, long *oup, long *flp,
- long *vcsw, long *ivcsw)
-{
- const struct kinfo_proc *oldp;
- static struct kinfo_proc dummy;
- long ret;
-
- oldp = get_old_proc(pp);
- if (oldp == NULL) {
- bzero(&dummy, sizeof(dummy));
- oldp = &dummy;
- }
- *inp = RU(pp)->ru_inblock - RU(oldp)->ru_inblock;
- *oup = RU(pp)->ru_oublock - RU(oldp)->ru_oublock;
- *flp = RU(pp)->ru_majflt - RU(oldp)->ru_majflt;
- *vcsw = RU(pp)->ru_nvcsw - RU(oldp)->ru_nvcsw;
- *ivcsw = RU(pp)->ru_nivcsw - RU(oldp)->ru_nivcsw;
- ret =
- (RU(pp)->ru_inblock - RU(oldp)->ru_inblock) +
- (RU(pp)->ru_oublock - RU(oldp)->ru_oublock) +
- (RU(pp)->ru_majflt - RU(oldp)->ru_majflt);
- return (ret);
-}
-
-/*
- * Return the total number of block in/out and faults by a process.
- */
-long
-get_io_total(struct kinfo_proc *pp)
-{
- long dummy;
-
- return (get_io_stats(pp, &dummy, &dummy, &dummy, &dummy, &dummy));
-}
-
-static struct handle handle;
-
-caddr_t
-get_process_info(struct system_info *si, struct process_select *sel,
- int (*compare)(const void *, const void *))
-{
- int i;
- int total_procs;
- long p_io;
- long p_inblock, p_oublock, p_majflt, p_vcsw, p_ivcsw;
- int active_procs;
- struct kinfo_proc **prefp;
- struct kinfo_proc *pp;
- struct kinfo_proc *prev_pp = NULL;
-
- /* these are copied out of sel for speed */
- int show_idle;
- int show_self;
- int show_system;
- int show_uid;
- int show_command;
-
- /*
- * Save the previous process info.
- */
- if (previous_proc_count_max < nproc) {
- free(previous_procs);
- previous_procs = malloc(nproc * sizeof(*previous_procs));
- free(previous_pref);
- previous_pref = malloc(nproc * sizeof(*previous_pref));
- if (previous_procs == NULL || previous_pref == NULL) {
- (void) fprintf(stderr, "top: Out of memory.\n");
- quit(23);
- }
- previous_proc_count_max = nproc;
- }
- if (nproc) {
- for (i = 0; i < nproc; i++)
- previous_pref[i] = &previous_procs[i];
- bcopy(pbase, previous_procs, nproc * sizeof(*previous_procs));
- qsort(previous_pref, nproc, sizeof(*previous_pref),
- compare_pid);
- }
- previous_proc_count = nproc;
-
- pbase = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nproc);
- if (nproc > onproc)
- pref = realloc(pref, sizeof(*pref) * (onproc = nproc));
- if (pref == NULL || pbase == NULL) {
- (void) fprintf(stderr, "top: Out of memory.\n");
- quit(23);
- }
- /* get a pointer to the states summary array */
- si->procstates = process_states;
-
- /* set up flags which define what we are going to select */
- show_idle = sel->idle;
- show_self = sel->self == -1;
- show_system = sel->system;
- show_uid = sel->uid != -1;
- show_command = sel->command != NULL;
-
- /* count up process states and get pointers to interesting procs */
- total_procs = 0;
- active_procs = 0;
- total_inblock = 0;
- total_oublock = 0;
- total_majflt = 0;
- memset((char *)process_states, 0, sizeof(process_states));
- prefp = pref;
- for (pp = pbase, i = 0; i < nproc; pp++, i++) {
-
- if (pp->ki_stat == 0)
- /* not in use */
- continue;
-
- if (!show_self && pp->ki_pid == sel->self)
- /* skip self */
- continue;
-
- if (!show_system && (pp->ki_flag & P_SYSTEM))
- /* skip system process */
- continue;
-
- p_io = get_io_stats(pp, &p_inblock, &p_oublock, &p_majflt,
- &p_vcsw, &p_ivcsw);
- total_inblock += p_inblock;
- total_oublock += p_oublock;
- total_majflt += p_majflt;
- total_procs++;
- process_states[pp->ki_stat]++;
-
- if (pp->ki_stat == SZOMB)
- /* skip zombies */
- continue;
-
- if (displaymode == DISP_CPU && !show_idle &&
- (pp->ki_pctcpu == 0 ||
- pp->ki_stat == SSTOP || pp->ki_stat == SIDL))
- /* skip idle or non-running processes */
- continue;
-
- if (displaymode == DISP_IO && !show_idle && p_io == 0)
- /* skip processes that aren't doing I/O */
- continue;
-
- if (show_uid && pp->ki_ruid != (uid_t)sel->uid)
- /* skip proc. that don't belong to the selected UID */
- continue;
-
- /*
- * When not showing threads, take the first thread
- * for output and add the fields that we can from
- * the rest of the process's threads rather than
- * using the system's mostly-broken KERN_PROC_PROC.
- */
- if (sel->thread || prev_pp == NULL ||
- prev_pp->ki_pid != pp->ki_pid) {
- *prefp++ = pp;
- active_procs++;
- prev_pp = pp;
- } else {
- prev_pp->ki_pctcpu += pp->ki_pctcpu;
- prev_pp->ki_runtime += pp->ki_runtime;
- }
- }
-
- /* if requested, sort the "interesting" processes */
- if (compare != NULL)
- qsort(pref, active_procs, sizeof(*pref), compare);
-
- /* remember active and total counts */
- si->p_total = total_procs;
- si->p_active = pref_len = active_procs;
-
- /* pass back a handle */
- handle.next_proc = pref;
- handle.remaining = active_procs;
- return ((caddr_t)&handle);
-}
-
-static char fmt[128]; /* static area where result is built */
-
-char *
-format_next_process(caddr_t handle, char *(*get_userid)(int), int flags)
-{
- struct kinfo_proc *pp;
- const struct kinfo_proc *oldp;
- long cputime;
- double pct;
- struct handle *hp;
- char status[16];
- int state;
- struct rusage ru, *rup;
- long p_tot, s_tot;
- char *proc_fmt, thr_buf[6], jid_buf[6];
- char *cmdbuf = NULL;
- char **args;
-
- /* find and remember the next proc structure */
- hp = (struct handle *)handle;
- pp = *(hp->next_proc++);
- hp->remaining--;
-
- /* get the process's command name */
- if ((pp->ki_flag & P_INMEM) == 0) {
- /*
- * Print swapped processes as <pname>
- */
- size_t len;
-
- len = strlen(pp->ki_comm);
- if (len > sizeof(pp->ki_comm) - 3)
- len = sizeof(pp->ki_comm) - 3;
- memmove(pp->ki_comm + 1, pp->ki_comm, len);
- pp->ki_comm[0] = '<';
- pp->ki_comm[len + 1] = '>';
- pp->ki_comm[len + 2] = '\0';
- }
-
- /*
- * Convert the process's runtime from microseconds to seconds. This
- * time includes the interrupt time although that is not wanted here.
- * ps(1) is similarly sloppy.
- */
- cputime = (pp->ki_runtime + 500000) / 1000000;
-
- /* calculate the base for cpu percentages */
- pct = pctdouble(pp->ki_pctcpu);
-
- /* generate "STATE" field */
- switch (state = pp->ki_stat) {
- case SRUN:
- if (smpmode && pp->ki_oncpu != 0xff)
- sprintf(status, "CPU%d", pp->ki_oncpu);
- else
- strcpy(status, "RUN");
- break;
- case SLOCK:
- if (pp->ki_kiflag & KI_LOCKBLOCK) {
- sprintf(status, "*%.6s", pp->ki_lockname);
- break;
- }
- /* fall through */
- case SSLEEP:
- if (pp->ki_wmesg != NULL) {
- sprintf(status, "%.6s", pp->ki_wmesg);
- break;
- }
- /* FALLTHROUGH */
- default:
-
- if (state >= 0 &&
- state < sizeof(state_abbrev) / sizeof(*state_abbrev))
- sprintf(status, "%.6s", state_abbrev[state]);
- else
- sprintf(status, "?%5d", state);
- break;
- }
-
- cmdbuf = (char *)malloc(cmdlengthdelta + 1);
- if (cmdbuf == NULL) {
- warn("malloc(%d)", cmdlengthdelta + 1);
- return NULL;
- }
-
- if (!(flags & FMT_SHOWARGS)) {
- if (ps.thread && pp->ki_flag & P_HADTHREADS &&
- pp->ki_ocomm[0]) {
- snprintf(cmdbuf, cmdlengthdelta, "{%s}", pp->ki_ocomm);
- } else {
- snprintf(cmdbuf, cmdlengthdelta, "%s", pp->ki_comm);
- }
- } else {
- if (pp->ki_flag & P_SYSTEM ||
- pp->ki_args == NULL ||
- (args = kvm_getargv(kd, pp, cmdlengthdelta)) == NULL ||
- !(*args)) {
- if (ps.thread && pp->ki_flag & P_HADTHREADS &&
- pp->ki_ocomm[0]) {
- snprintf(cmdbuf, cmdlengthdelta,
- "{%s}", pp->ki_ocomm);
- } else {
- snprintf(cmdbuf, cmdlengthdelta,
- "[%s]", pp->ki_comm);
- }
- } else {
- char *src, *dst, *argbuf;
- char *cmd;
- size_t argbuflen;
- size_t len;
-
- argbuflen = cmdlengthdelta * 4;
- argbuf = (char *)malloc(argbuflen + 1);
- if (argbuf == NULL) {
- warn("malloc(%d)", argbuflen + 1);
- free(cmdbuf);
- return NULL;
- }
-
- dst = argbuf;
-
- /* Extract cmd name from argv */
- cmd = strrchr(*args, '/');
- if (cmd == NULL)
- cmd = *args;
- else
- cmd++;
-
- for (; (src = *args++) != NULL; ) {
- if (*src == '\0')
- continue;
- len = (argbuflen - (dst - argbuf) - 1) / 4;
- strvisx(dst, src,
- strlen(src) < len ? strlen(src) : len,
- VIS_NL | VIS_CSTYLE);
- while (*dst != '\0')
- dst++;
- if ((argbuflen - (dst - argbuf) - 1) / 4 > 0)
- *dst++ = ' '; /* add delimiting space */
- }
- if (dst != argbuf && dst[-1] == ' ')
- dst--;
- *dst = '\0';
-
- if (strcmp(cmd, pp->ki_comm) != 0 )
- snprintf(cmdbuf, cmdlengthdelta,
- "%s (%s)",argbuf, pp->ki_comm);
- else
- strlcpy(cmdbuf, argbuf, cmdlengthdelta);
-
- free(argbuf);
- }
- }
-
- if (ps.jail == 0)
- jid_buf[0] = '\0';
- else
- snprintf(jid_buf, sizeof(jid_buf), " %*d",
- sizeof(jid_buf) - 3, pp->ki_jid);
-
- if (displaymode == DISP_IO) {
- oldp = get_old_proc(pp);
- if (oldp != NULL) {
- ru.ru_inblock = RU(pp)->ru_inblock -
- RU(oldp)->ru_inblock;
- ru.ru_oublock = RU(pp)->ru_oublock -
- RU(oldp)->ru_oublock;
- ru.ru_majflt = RU(pp)->ru_majflt - RU(oldp)->ru_majflt;
- ru.ru_nvcsw = RU(pp)->ru_nvcsw - RU(oldp)->ru_nvcsw;
- ru.ru_nivcsw = RU(pp)->ru_nivcsw - RU(oldp)->ru_nivcsw;
- rup = &ru;
- } else {
- rup = RU(pp);
- }
- p_tot = rup->ru_inblock + rup->ru_oublock + rup->ru_majflt;
- s_tot = total_inblock + total_oublock + total_majflt;
-
- sprintf(fmt, io_Proc_format,
- pp->ki_pid,
- jid_buf,
- namelength, namelength, (*get_userid)(pp->ki_ruid),
- rup->ru_nvcsw,
- rup->ru_nivcsw,
- rup->ru_inblock,
- rup->ru_oublock,
- rup->ru_majflt,
- p_tot,
- s_tot == 0 ? 0.0 : (p_tot * 100.0 / s_tot),
- screen_width > cmdlengthdelta ?
- screen_width - cmdlengthdelta : 0,
- printable(cmdbuf));
-
- free(cmdbuf);
-
- return (fmt);
- }
-
- /* format this entry */
- proc_fmt = smpmode ? smp_Proc_format : up_Proc_format;
- if (ps.thread != 0)
- thr_buf[0] = '\0';
- else
- snprintf(thr_buf, sizeof(thr_buf), "%*d ",
- sizeof(thr_buf) - 2, pp->ki_numthreads);
-
- sprintf(fmt, proc_fmt,
- pp->ki_pid,
- jid_buf,
- namelength, namelength, (*get_userid)(pp->ki_ruid),
- thr_buf,
- pp->ki_pri.pri_level - PZERO,
- format_nice(pp),
- format_k2(PROCSIZE(pp)),
- format_k2(pagetok(pp->ki_rssize)),
- status,
- smpmode ? pp->ki_lastcpu : 0,
- format_time(cputime),
- ps.wcpu ? 100.0 * weighted_cpu(pct, pp) : 100.0 * pct,
- screen_width > cmdlengthdelta ? screen_width - cmdlengthdelta : 0,
- printable(cmdbuf));
-
- free(cmdbuf);
-
- /* return the result */
- return (fmt);
-}
-
-static void
-getsysctl(const char *name, void *ptr, size_t len)
-{
- size_t nlen = len;
-
- if (sysctlbyname(name, ptr, &nlen, NULL, 0) == -1) {
- fprintf(stderr, "top: sysctl(%s...) failed: %s\n", name,
- strerror(errno));
- quit(23);
- }
- if (nlen != len) {
- fprintf(stderr, "top: sysctl(%s...) expected %lu, got %lu\n",
- name, (unsigned long)len, (unsigned long)nlen);
- quit(23);
- }
-}
-
-static const char *
-format_nice(const struct kinfo_proc *pp)
-{
- const char *fifo, *kthread;
- int rtpri;
- static char nicebuf[4 + 1];
-
- fifo = PRI_NEED_RR(pp->ki_pri.pri_class) ? "" : "F";
- kthread = (pp->ki_flag & P_KTHREAD) ? "k" : "";
- switch (PRI_BASE(pp->ki_pri.pri_class)) {
- case PRI_ITHD:
- return ("-");
- case PRI_REALTIME:
- /*
- * XXX: the kernel doesn't tell us the original rtprio and
- * doesn't really know what it was, so to recover it we
- * must be more chummy with the implementation than the
- * implementation is with itself. pri_user gives a
- * constant "base" priority, but is only initialized
- * properly for user threads. pri_native gives what the
- * kernel calls the "base" priority, but it isn't constant
- * since it is changed by priority propagation. pri_native
- * also isn't properly initialized for all threads, but it
- * is properly initialized for kernel realtime and idletime
- * threads. Thus we use pri_user for the base priority of
- * user threads (it is always correct) and pri_native for
- * the base priority of kernel realtime and idletime threads
- * (there is nothing better, and it is usually correct).
- *
- * The field width and thus the buffer are too small for
- * values like "kr31F", but such values shouldn't occur,
- * and if they do then the tailing "F" is not displayed.
- */
- rtpri = ((pp->ki_flag & P_KTHREAD) ? pp->ki_pri.pri_native :
- pp->ki_pri.pri_user) - PRI_MIN_REALTIME;
- snprintf(nicebuf, sizeof(nicebuf), "%sr%d%s",
- kthread, rtpri, fifo);
- break;
- case PRI_TIMESHARE:
- if (pp->ki_flag & P_KTHREAD)
- return ("-");
- snprintf(nicebuf, sizeof(nicebuf), "%d", pp->ki_nice - NZERO);
- break;
- case PRI_IDLE:
- /* XXX: as above. */
- rtpri = ((pp->ki_flag & P_KTHREAD) ? pp->ki_pri.pri_native :
- pp->ki_pri.pri_user) - PRI_MIN_IDLE;
- snprintf(nicebuf, sizeof(nicebuf), "%si%d%s",
- kthread, rtpri, fifo);
- break;
- default:
- return ("?");
- }
- return (nicebuf);
-}
-
-/* comparison routines for qsort */
-
-static int
-compare_pid(const void *p1, const void *p2)
-{
- const struct kinfo_proc * const *pp1 = p1;
- const struct kinfo_proc * const *pp2 = p2;
-
- if ((*pp2)->ki_pid < 0 || (*pp1)->ki_pid < 0)
- abort();
-
- return ((*pp1)->ki_pid - (*pp2)->ki_pid);
-}
-
-/*
- * proc_compare - comparison function for "qsort"
- * Compares the resource consumption of two processes using five
- * distinct keys. The keys (in descending order of importance) are:
- * percent cpu, cpu ticks, state, resident set size, total virtual
- * memory usage. The process states are ordered as follows (from least
- * to most important): WAIT, zombie, sleep, stop, start, run. The
- * array declaration below maps a process state index into a number
- * that reflects this ordering.
- */
-
-static int sorted_state[] = {
- 0, /* not used */
- 3, /* sleep */
- 1, /* ABANDONED (WAIT) */
- 6, /* run */
- 5, /* start */
- 2, /* zombie */
- 4 /* stop */
-};
-
-
-#define ORDERKEY_PCTCPU(a, b) do { \
- long diff; \
- if (ps.wcpu) \
- diff = floor(1.0E6 * weighted_cpu(pctdouble((b)->ki_pctcpu), \
- (b))) - \
- floor(1.0E6 * weighted_cpu(pctdouble((a)->ki_pctcpu), \
- (a))); \
- else \
- diff = (long)(b)->ki_pctcpu - (long)(a)->ki_pctcpu; \
- if (diff != 0) \
- return (diff > 0 ? 1 : -1); \
-} while (0)
-
-#define ORDERKEY_CPTICKS(a, b) do { \
- int64_t diff = (int64_t)(b)->ki_runtime - (int64_t)(a)->ki_runtime; \
- if (diff != 0) \
- return (diff > 0 ? 1 : -1); \
-} while (0)
-
-#define ORDERKEY_STATE(a, b) do { \
- int diff = sorted_state[(b)->ki_stat] - sorted_state[(a)->ki_stat]; \
- if (diff != 0) \
- return (diff > 0 ? 1 : -1); \
-} while (0)
-
-#define ORDERKEY_PRIO(a, b) do { \
- int diff = (int)(b)->ki_pri.pri_level - (int)(a)->ki_pri.pri_level; \
- if (diff != 0) \
- return (diff > 0 ? 1 : -1); \
-} while (0)
-
-#define ORDERKEY_THREADS(a, b) do { \
- int diff = (int)(b)->ki_numthreads - (int)(a)->ki_numthreads; \
- if (diff != 0) \
- return (diff > 0 ? 1 : -1); \
-} while (0)
-
-#define ORDERKEY_RSSIZE(a, b) do { \
- long diff = (long)(b)->ki_rssize - (long)(a)->ki_rssize; \
- if (diff != 0) \
- return (diff > 0 ? 1 : -1); \
-} while (0)
-
-#define ORDERKEY_MEM(a, b) do { \
- long diff = (long)PROCSIZE((b)) - (long)PROCSIZE((a)); \
- if (diff != 0) \
- return (diff > 0 ? 1 : -1); \
-} while (0)
-
-#define ORDERKEY_JID(a, b) do { \
- int diff = (int)(b)->ki_jid - (int)(a)->ki_jid; \
- if (diff != 0) \
- return (diff > 0 ? 1 : -1); \
-} while (0)
-
-/* compare_cpu - the comparison function for sorting by cpu percentage */
-
-int
-#ifdef ORDER
-compare_cpu(void *arg1, void *arg2)
-#else
-proc_compare(void *arg1, void *arg2)
-#endif
-{
- struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
- struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
-
- ORDERKEY_PCTCPU(p1, p2);
- ORDERKEY_CPTICKS(p1, p2);
- ORDERKEY_STATE(p1, p2);
- ORDERKEY_PRIO(p1, p2);
- ORDERKEY_RSSIZE(p1, p2);
- ORDERKEY_MEM(p1, p2);
-
- return (0);
-}
-
-#ifdef ORDER
-/* "cpu" compare routines */
-int compare_size(), compare_res(), compare_time(), compare_prio(),
- compare_threads();
-
-/*
- * "io" compare routines. Context switches aren't i/o, but are displayed
- * on the "io" display.
- */
-int compare_iototal(), compare_ioread(), compare_iowrite(), compare_iofault(),
- compare_vcsw(), compare_ivcsw();
-
-int (*compares[])() = {
- compare_cpu,
- compare_size,
- compare_res,
- compare_time,
- compare_prio,
- compare_threads,
- compare_iototal,
- compare_ioread,
- compare_iowrite,
- compare_iofault,
- compare_vcsw,
- compare_ivcsw,
- compare_jid,
- NULL
-};
-
-/* compare_size - the comparison function for sorting by total memory usage */
-
-int
-compare_size(void *arg1, void *arg2)
-{
- struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
- struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
-
- ORDERKEY_MEM(p1, p2);
- ORDERKEY_RSSIZE(p1, p2);
- ORDERKEY_PCTCPU(p1, p2);
- ORDERKEY_CPTICKS(p1, p2);
- ORDERKEY_STATE(p1, p2);
- ORDERKEY_PRIO(p1, p2);
-
- return (0);
-}
-
-/* compare_res - the comparison function for sorting by resident set size */
-
-int
-compare_res(void *arg1, void *arg2)
-{
- struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
- struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
-
- ORDERKEY_RSSIZE(p1, p2);
- ORDERKEY_MEM(p1, p2);
- ORDERKEY_PCTCPU(p1, p2);
- ORDERKEY_CPTICKS(p1, p2);
- ORDERKEY_STATE(p1, p2);
- ORDERKEY_PRIO(p1, p2);
-
- return (0);
-}
-
-/* compare_time - the comparison function for sorting by total cpu time */
-
-int
-compare_time(void *arg1, void *arg2)
-{
- struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
- struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
-
- ORDERKEY_CPTICKS(p1, p2);
- ORDERKEY_PCTCPU(p1, p2);
- ORDERKEY_STATE(p1, p2);
- ORDERKEY_PRIO(p1, p2);
- ORDERKEY_RSSIZE(p1, p2);
- ORDERKEY_MEM(p1, p2);
-
- return (0);
-}
-
-/* compare_prio - the comparison function for sorting by priority */
-
-int
-compare_prio(void *arg1, void *arg2)
-{
- struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
- struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
-
- ORDERKEY_PRIO(p1, p2);
- ORDERKEY_CPTICKS(p1, p2);
- ORDERKEY_PCTCPU(p1, p2);
- ORDERKEY_STATE(p1, p2);
- ORDERKEY_RSSIZE(p1, p2);
- ORDERKEY_MEM(p1, p2);
-
- return (0);
-}
-
-/* compare_threads - the comparison function for sorting by threads */
-int
-compare_threads(void *arg1, void *arg2)
-{
- struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
- struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
-
- ORDERKEY_THREADS(p1, p2);
- ORDERKEY_PCTCPU(p1, p2);
- ORDERKEY_CPTICKS(p1, p2);
- ORDERKEY_STATE(p1, p2);
- ORDERKEY_PRIO(p1, p2);
- ORDERKEY_RSSIZE(p1, p2);
- ORDERKEY_MEM(p1, p2);
-
- return (0);
-}
-
-/* compare_jid - the comparison function for sorting by jid */
-static int
-compare_jid(const void *arg1, const void *arg2)
-{
- struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
- struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
-
- ORDERKEY_JID(p1, p2);
- ORDERKEY_PCTCPU(p1, p2);
- ORDERKEY_CPTICKS(p1, p2);
- ORDERKEY_STATE(p1, p2);
- ORDERKEY_PRIO(p1, p2);
- ORDERKEY_RSSIZE(p1, p2);
- ORDERKEY_MEM(p1, p2);
-
- return (0);
-}
-#endif /* ORDER */
-
-/* assorted comparison functions for sorting by i/o */
-
-int
-#ifdef ORDER
-compare_iototal(void *arg1, void *arg2)
-#else
-io_compare(void *arg1, void *arg2)
-#endif
-{
- struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
- struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
-
- return (get_io_total(p2) - get_io_total(p1));
-}
-
-#ifdef ORDER
-int
-compare_ioread(void *arg1, void *arg2)
-{
- struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
- struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
- long dummy, inp1, inp2;
-
- (void) get_io_stats(p1, &inp1, &dummy, &dummy, &dummy, &dummy);
- (void) get_io_stats(p2, &inp2, &dummy, &dummy, &dummy, &dummy);
-
- return (inp2 - inp1);
-}
-
-int
-compare_iowrite(void *arg1, void *arg2)
-{
- struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
- struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
- long dummy, oup1, oup2;
-
- (void) get_io_stats(p1, &dummy, &oup1, &dummy, &dummy, &dummy);
- (void) get_io_stats(p2, &dummy, &oup2, &dummy, &dummy, &dummy);
-
- return (oup2 - oup1);
-}
-
-int
-compare_iofault(void *arg1, void *arg2)
-{
- struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
- struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
- long dummy, flp1, flp2;
-
- (void) get_io_stats(p1, &dummy, &dummy, &flp1, &dummy, &dummy);
- (void) get_io_stats(p2, &dummy, &dummy, &flp2, &dummy, &dummy);
-
- return (flp2 - flp1);
-}
-
-int
-compare_vcsw(void *arg1, void *arg2)
-{
- struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
- struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
- long dummy, flp1, flp2;
-
- (void) get_io_stats(p1, &dummy, &dummy, &dummy, &flp1, &dummy);
- (void) get_io_stats(p2, &dummy, &dummy, &dummy, &flp2, &dummy);
-
- return (flp2 - flp1);
-}
-
-int
-compare_ivcsw(void *arg1, void *arg2)
-{
- struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
- struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
- long dummy, flp1, flp2;
-
- (void) get_io_stats(p1, &dummy, &dummy, &dummy, &dummy, &flp1);
- (void) get_io_stats(p2, &dummy, &dummy, &dummy, &dummy, &flp2);
-
- return (flp2 - flp1);
-}
-#endif /* ORDER */
-
-/*
- * proc_owner(pid) - returns the uid that owns process "pid", or -1 if
- * the process does not exist.
- * It is EXTREMLY IMPORTANT that this function work correctly.
- * If top runs setuid root (as in SVR4), then this function
- * is the only thing that stands in the way of a serious
- * security problem. It validates requests for the "kill"
- * and "renice" commands.
- */
-
-int
-proc_owner(int pid)
-{
- int cnt;
- struct kinfo_proc **prefp;
- struct kinfo_proc *pp;
-
- prefp = pref;
- cnt = pref_len;
- while (--cnt >= 0) {
- pp = *prefp++;
- if (pp->ki_pid == (pid_t)pid)
- return ((int)pp->ki_ruid);
- }
- return (-1);
-}
-
-static int
-swapmode(int *retavail, int *retfree)
-{
- int n;
- int pagesize = getpagesize();
- struct kvm_swap swapary[1];
-
- *retavail = 0;
- *retfree = 0;
-
-#define CONVERT(v) ((quad_t)(v) * pagesize / 1024)
-
- n = kvm_getswapinfo(kd, swapary, 1, 0);
- if (n < 0 || swapary[0].ksw_total == 0)
- return (0);
-
- *retavail = CONVERT(swapary[0].ksw_total);
- *retfree = CONVERT(swapary[0].ksw_total - swapary[0].ksw_used);
-
- n = (int)(swapary[0].ksw_used * 100.0 / swapary[0].ksw_total);
- return (n);
-}
diff --git a/usr.bin/top/top.local.1 b/usr.bin/top/top.local.1
deleted file mode 100644
index a3f3540..0000000
--- a/usr.bin/top/top.local.1
+++ /dev/null
@@ -1,53 +0,0 @@
-.\" $FreeBSD$
-.SH "FreeBSD NOTES"
-
-.SH DISPLAY OF THREADS
-The '-H' option will toggle the display of kernel visible thread contexts.
-At runtime the 'H' key will toggle this mode. The default is OFF.
-
-.SH DESCRIPTION OF MEMORY
-Mem: 9220K Active, 1032K Inact, 3284K Wired, 1MB Cache, 2M Buf, 1320K Free
-Swap: 91M Total, 79M Free, 13% Inuse, 80K In, 104 K Out
-
-.B K:
-Kilobyte
-.TP
-.B M:
-Megabyte
-.TP
-.B %:
-1/100
-.TP
-.B Active:
-number of pages active
-.TP
-.B Inact:
-number of pages inactive
-.TP
-.B Wired:
-number of pages wired down, including cached file data pages
-.TP
-.B Cache:
-number of clean pages caching data that are available for
-immediate reallocation
-.TP
-.B Buf:
-number of pages used for BIO-level disk caching
-.TP
-.B Free:
-number of pages free
-.TP
-.B Total:
-total available swap usage
-.TP
-.B Free:
-total free swap usage
-.TP
-.B Inuse:
-swap usage
-.TP
-.B In:
-pages paged in from swap devices (last interval)
-.TP
-.B Out:
-pages paged out to swap devices (last interval)
diff --git a/usr.bin/touch/Makefile b/usr.bin/touch/Makefile
deleted file mode 100644
index e44f4f2..0000000
--- a/usr.bin/touch/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= touch
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/touch/touch.1 b/usr.bin/touch/touch.1
deleted file mode 100644
index 8eb7f40..0000000
--- a/usr.bin/touch/touch.1
+++ /dev/null
@@ -1,221 +0,0 @@
-.\" Copyright (c) 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)touch.1 8.3 (Berkeley) 4/28/95
-.\" $FreeBSD$
-.\"
-.Dd April 28, 1995
-.Dt TOUCH 1
-.Os
-.Sh NAME
-.Nm touch
-.Nd change file access and modification times
-.Sh SYNOPSIS
-.Nm
-.Op Fl A Ar [-][[hh]mm]SS
-.Op Fl acfhm
-.Op Fl r Ar file
-.Op Fl t Ar [[CC]YY]MMDDhhmm[.SS]
-.Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility sets the modification and access times of files.
-If any file does not exist, it is created with default permissions.
-.Pp
-By default,
-.Nm
-changes both modification and access times. The
-.Fl a
-and
-.Fl m
-flags may be used to select the access time or the modification time
-individually.
-Selecting both is equivalent to the default.
-By default, the timestamps are set to the current time.
-The
-.Fl t
-flag explicitly specifies a different time, and the
-.Fl r
-flag specifies to set the times those of the specified file.
-The
-.Fl A
-flag adjusts the values by a specified amount.
-.Pp
-The following options are available:
-.Bl -tag -width Ds
-.It Fl A
-Adjust the access and modification time stamps for the file by the
-specified value.
-This flag is intended for use in modifying files with incorrectly set
-time stamps.
-.Pp
-The argument is of the form
-.Dq [-][[hh]mm]SS
-where each pair of letters represents the following:
-.Pp
-.Bl -tag -width Ds -compact -offset indent
-.It Ar -
-Make the adjustment negative: the new time stamp is set to be before
-the old one.
-.It Ar hh
-The number of hours, from 00 to 99.
-.It Ar mm
-The number of minutes, from 00 to 59.
-.It Ar SS
-The number of seconds, from 00 to 59.
-.El
-.Pp
-The
-.Fl A
-flag implies the
-.Fl c
-flag: if any file specified does not exist, it will be silently ignored.
-.It Fl a
-Change the access time of the file.
-The modification time of the file is not changed unless the
-.Fl m
-flag is also specified.
-.It Fl c
-Do not create the file if it does not exist.
-The
-.Nm
-utility does not treat this as an error.
-No error messages are displayed and the exit value is not affected.
-.It Fl f
-Attempt to force the update, even if the file permissions do not
-currently permit it.
-.It Fl h
-If the file is a symbolic link, change the times of the link
-itself rather than the file that the link points to.
-Note that
-.Fl h
-implies
-.Fl c
-and thus will not create any new files.
-.It Fl m
-Change the modification time of the file.
-The access time of the file is not changed unless the
-.Fl a
-flag is also specified.
-.It Fl r
-Use the access and modifications times from the specified file
-instead of the current time of day.
-.It Fl t
-Change the access and modification times to the specified time instead
-of the current time of day.
-The argument is of the form
-.Dq [[CC]YY]MMDDhhmm[.SS]
-where each pair of letters represents the following:
-.Pp
-.Bl -tag -width Ds -compact -offset indent
-.It Ar CC
-The first two digits of the year (the century).
-.It Ar YY
-The second two digits of the year.
-If
-.Dq YY
-is specified, but
-.Dq CC
-is not, a value for
-.Dq YY
-between 69 and 99 results in a
-.Dq CC
-value of 19.
-Otherwise, a
-.Dq CC
-value of 20 is used.
-.It Ar MM
-The month of the year, from 01 to 12.
-.It Ar DD
-the day of the month, from 01 to 31.
-.It Ar hh
-The hour of the day, from 00 to 23.
-.It Ar mm
-The minute of the hour, from 00 to 59.
-.It Ar SS
-The second of the minute, from 00 to 61.
-.El
-.Pp
-If the
-.Dq CC
-and
-.Dq YY
-letter pairs are not specified, the values default to the current
-year.
-If the
-.Dq SS
-letter pair is not specified, the value defaults to 0.
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh COMPATIBILITY
-The obsolescent form of
-.Nm ,
-where a time format is specified as the first argument, is supported.
-When no
-.Fl r
-or
-.Fl t
-option is specified, there are at least two arguments, and the first
-argument is a string of digits either eight or ten characters in length,
-the first argument is interpreted as a time specification of the form
-.Dq MMDDhhmm[YY] .
-.Pp
-The
-.Dq MM ,
-.Dq DD ,
-.Dq hh
-and
-.Dq mm
-letter pairs are treated as their counterparts specified to the
-.Fl t
-option.
-If the
-.Dq YY
-letter pair is in the range 39 to 99, the year is set to 1939 to 1999,
-otherwise, the year is set in the 21st century.
-.Sh SEE ALSO
-.Xr utimes 2
-.Sh STANDARDS
-The
-.Nm
-utility is expected to be a superset of the
-.St -p1003.2
-specification.
-.Sh HISTORY
-A
-.Nm
-utility appeared in
-.At v7 .
diff --git a/usr.bin/touch/touch.c b/usr.bin/touch/touch.c
deleted file mode 100644
index 624ce05..0000000
--- a/usr.bin/touch/touch.c
+++ /dev/null
@@ -1,423 +0,0 @@
-/*
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "@(#)touch.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <libgen.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-int rw(char *, struct stat *, int);
-void stime_arg1(char *, struct timeval *);
-void stime_arg2(char *, int, struct timeval *);
-void stime_file(char *, struct timeval *);
-int timeoffset(char *);
-void usage(char *);
-
-int
-main(int argc, char *argv[])
-{
- struct stat sb;
- struct timeval tv[2];
- int (*stat_f)(const char *, struct stat *);
- int (*utimes_f)(const char *, const struct timeval *);
- int Aflag, aflag, cflag, fflag, mflag, ch, fd, len, rval, timeset;
- char *p;
- char *myname;
-
- myname = basename(argv[0]);
- Aflag = aflag = cflag = fflag = mflag = timeset = 0;
- stat_f = stat;
- utimes_f = utimes;
- if (gettimeofday(&tv[0], NULL))
- err(1, "gettimeofday");
-
- while ((ch = getopt(argc, argv, "A:acfhmr:t:")) != -1)
- switch(ch) {
- case 'A':
- Aflag = timeoffset(optarg);
- break;
- case 'a':
- aflag = 1;
- break;
- case 'c':
- cflag = 1;
- break;
- case 'f':
- fflag = 1;
- break;
- case 'h':
- cflag = 1;
- stat_f = lstat;
- utimes_f = lutimes;
- break;
- case 'm':
- mflag = 1;
- break;
- case 'r':
- timeset = 1;
- stime_file(optarg, tv);
- break;
- case 't':
- timeset = 1;
- stime_arg1(optarg, tv);
- break;
- case '?':
- default:
- usage(myname);
- }
- argc -= optind;
- argv += optind;
-
- if (aflag == 0 && mflag == 0)
- aflag = mflag = 1;
-
- if (timeset) {
- if (Aflag) {
- /*
- * We're setting the time to an offset from a specified
- * time. God knows why, but it means that we can set
- * that time once and for all here.
- */
- if (aflag)
- tv[0].tv_sec += Aflag;
- if (mflag)
- tv[1].tv_sec += Aflag;
- Aflag = 0; /* done our job */
- }
- } else {
- /*
- * If no -r or -t flag, at least two operands, the first of
- * which is an 8 or 10 digit number, use the obsolete time
- * specification, otherwise use the current time.
- */
- if (argc > 1) {
- strtol(argv[0], &p, 10);
- len = p - argv[0];
- if (*p == '\0' && (len == 8 || len == 10)) {
- timeset = 1;
- stime_arg2(*argv++, len == 10, tv);
- }
- }
- /* Both times default to the same. */
- tv[1] = tv[0];
- }
-
- if (*argv == NULL)
- usage(myname);
-
- if (Aflag)
- cflag = 1;
-
- for (rval = 0; *argv; ++argv) {
- /* See if the file exists. */
- if (stat_f(*argv, &sb) != 0) {
- if (!cflag) {
- /* Create the file. */
- fd = open(*argv,
- O_WRONLY | O_CREAT, DEFFILEMODE);
- if (fd == -1 || fstat(fd, &sb) || close(fd)) {
- rval = 1;
- warn("%s", *argv);
- continue;
- }
-
- /* If using the current time, we're done. */
- if (!timeset)
- continue;
- } else
- continue;
- }
-
- if (!aflag)
- TIMESPEC_TO_TIMEVAL(&tv[0], &sb.st_atimespec);
- if (!mflag)
- TIMESPEC_TO_TIMEVAL(&tv[1], &sb.st_mtimespec);
-
- /*
- * We're adjusting the times based on the file times, not a
- * specified time (that gets handled above).
- */
- if (Aflag) {
- if (aflag) {
- TIMESPEC_TO_TIMEVAL(&tv[0], &sb.st_atimespec);
- tv[0].tv_sec += Aflag;
- }
- if (mflag) {
- TIMESPEC_TO_TIMEVAL(&tv[1], &sb.st_mtimespec);
- tv[1].tv_sec += Aflag;
- }
- }
-
- /* Try utimes(2). */
- if (!utimes_f(*argv, tv))
- continue;
-
- /* If the user specified a time, nothing else we can do. */
- if (timeset) {
- rval = 1;
- warn("%s", *argv);
- continue;
- }
-
- /*
- * System V and POSIX 1003.1 require that a NULL argument
- * set the access/modification times to the current time.
- * The permission checks are different, too, in that the
- * ability to write the file is sufficient. Take a shot.
- */
- if (!utimes_f(*argv, NULL))
- continue;
-
- /* Try reading/writing. */
- if (!S_ISLNK(sb.st_mode) && !S_ISDIR(sb.st_mode) &&
- rw(*argv, &sb, fflag))
- rval = 1;
- else
- warn("%s", *argv);
- }
- exit(rval);
-}
-
-#define ATOI2(ar) ((ar)[0] - '0') * 10 + ((ar)[1] - '0'); (ar) += 2;
-
-void
-stime_arg1(char *arg, struct timeval *tvp)
-{
- time_t now;
- struct tm *t;
- int yearset;
- char *p;
- /* Start with the current time. */
- now = tvp[0].tv_sec;
- if ((t = localtime(&now)) == NULL)
- err(1, "localtime");
- /* [[CC]YY]MMDDhhmm[.SS] */
- if ((p = strchr(arg, '.')) == NULL)
- t->tm_sec = 0; /* Seconds defaults to 0. */
- else {
- if (strlen(p + 1) != 2)
- goto terr;
- *p++ = '\0';
- t->tm_sec = ATOI2(p);
- }
-
- yearset = 0;
- switch(strlen(arg)) {
- case 12: /* CCYYMMDDhhmm */
- t->tm_year = ATOI2(arg);
- t->tm_year *= 100;
- yearset = 1;
- /* FALLTHROUGH */
- case 10: /* YYMMDDhhmm */
- if (yearset) {
- yearset = ATOI2(arg);
- t->tm_year += yearset;
- } else {
- yearset = ATOI2(arg);
- if (yearset < 69)
- t->tm_year = yearset + 2000;
- else
- t->tm_year = yearset + 1900;
- }
- t->tm_year -= 1900; /* Convert to UNIX time. */
- /* FALLTHROUGH */
- case 8: /* MMDDhhmm */
- t->tm_mon = ATOI2(arg);
- --t->tm_mon; /* Convert from 01-12 to 00-11 */
- t->tm_mday = ATOI2(arg);
- t->tm_hour = ATOI2(arg);
- t->tm_min = ATOI2(arg);
- break;
- default:
- goto terr;
- }
-
- t->tm_isdst = -1; /* Figure out DST. */
- tvp[0].tv_sec = tvp[1].tv_sec = mktime(t);
- if (tvp[0].tv_sec == -1)
-terr: errx(1,
- "out of range or illegal time specification: [[CC]YY]MMDDhhmm[.SS]");
-
- tvp[0].tv_usec = tvp[1].tv_usec = 0;
-}
-
-void
-stime_arg2(char *arg, int year, struct timeval *tvp)
-{
- time_t now;
- struct tm *t;
- /* Start with the current time. */
- now = tvp[0].tv_sec;
- if ((t = localtime(&now)) == NULL)
- err(1, "localtime");
-
- t->tm_mon = ATOI2(arg); /* MMDDhhmm[yy] */
- --t->tm_mon; /* Convert from 01-12 to 00-11 */
- t->tm_mday = ATOI2(arg);
- t->tm_hour = ATOI2(arg);
- t->tm_min = ATOI2(arg);
- if (year) {
- t->tm_year = ATOI2(arg);
- if (t->tm_year < 39) /* support 2000-2038 not 1902-1969 */
- t->tm_year += 100;
- }
-
- t->tm_isdst = -1; /* Figure out DST. */
- tvp[0].tv_sec = tvp[1].tv_sec = mktime(t);
- if (tvp[0].tv_sec == -1)
- errx(1,
- "out of range or illegal time specification: MMDDhhmm[yy]");
-
- tvp[0].tv_usec = tvp[1].tv_usec = 0;
-}
-
-/* Calculate a time offset in seconds, given an arg of the format [-]HHMMSS. */
-int
-timeoffset(char *arg)
-{
- int offset;
- int isneg;
-
- offset = 0;
- isneg = *arg == '-';
- if (isneg)
- arg++;
- switch (strlen(arg)) {
- default: /* invalid */
- errx(1, "Invalid offset spec, must be [-][[HH]MM]SS");
-
- case 6: /* HHMMSS */
- offset = ATOI2(arg);
- /* FALLTHROUGH */
- case 4: /* MMSS */
- offset = offset * 60 + ATOI2(arg);
- /* FALLTHROUGH */
- case 2: /* SS */
- offset = offset * 60 + ATOI2(arg);
- }
- if (isneg)
- return (-offset);
- else
- return (offset);
-}
-
-void
-stime_file(char *fname, struct timeval *tvp)
-{
- struct stat sb;
-
- if (stat(fname, &sb))
- err(1, "%s", fname);
- TIMESPEC_TO_TIMEVAL(tvp, &sb.st_atimespec);
- TIMESPEC_TO_TIMEVAL(tvp + 1, &sb.st_mtimespec);
-}
-
-int
-rw(char *fname, struct stat *sbp, int force)
-{
- int fd, needed_chmod, rval;
- u_char byte;
-
- /* Try regular files. */
- if (!S_ISREG(sbp->st_mode)) {
- warnx("%s: %s", fname, strerror(EFTYPE));
- return (1);
- }
-
- needed_chmod = rval = 0;
- if ((fd = open(fname, O_RDWR, 0)) == -1) {
- if (!force || chmod(fname, DEFFILEMODE))
- goto err;
- if ((fd = open(fname, O_RDWR, 0)) == -1)
- goto err;
- needed_chmod = 1;
- }
-
- if (sbp->st_size != 0) {
- if (read(fd, &byte, sizeof(byte)) != sizeof(byte))
- goto err;
- if (lseek(fd, (off_t)0, SEEK_SET) == -1)
- goto err;
- if (write(fd, &byte, sizeof(byte)) != sizeof(byte))
- goto err;
- } else {
- if (write(fd, &byte, sizeof(byte)) != sizeof(byte)) {
-err: rval = 1;
- warn("%s", fname);
- } else if (ftruncate(fd, (off_t)0)) {
- rval = 1;
- warn("%s: file modified", fname);
- }
- }
-
- if (close(fd) && rval != 1) {
- rval = 1;
- warn("%s", fname);
- }
- if (needed_chmod && chmod(fname, sbp->st_mode) && rval != 1) {
- rval = 1;
- warn("%s: permissions modified", fname);
- }
- return (rval);
-}
-
-void
-usage(char *myname)
-{
- fprintf(stderr, "usage:\n" "%s [-A [-][[hh]mm]SS] [-acfhm] [-r file] "
- "[-t [[CC]YY]MMDDhhmm[.SS]] file ...\n", myname);
- exit(1);
-}
diff --git a/usr.bin/tput/Makefile b/usr.bin/tput/Makefile
deleted file mode 100644
index 143dc65..0000000
--- a/usr.bin/tput/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= tput
-DPADD= ${LIBTERMCAP}
-LDADD= -ltermcap
-SCRIPTS=clear.sh
-MLINKS= tput.1 clear.1
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/tput/clear.sh b/usr.bin/tput/clear.sh
deleted file mode 100644
index add589b..0000000
--- a/usr.bin/tput/clear.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/sh -
-#
-# Copyright (c) 1989, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 4. Neither the name of the University nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# @(#)clear.sh 8.1 (Berkeley) 6/6/93
-#
-
-exec tput clear
diff --git a/usr.bin/tput/tput.1 b/usr.bin/tput/tput.1
deleted file mode 100644
index 33950a7..0000000
--- a/usr.bin/tput/tput.1
+++ /dev/null
@@ -1,158 +0,0 @@
-.\" Copyright (c) 1989, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)tput.1 8.2 (Berkeley) 3/19/94
-.\" $FreeBSD$
-.\"
-.Dd June 15, 2002
-.Dt TPUT 1
-.Os
-.Sh NAME
-.Nm tput ,
-.Nm clear
-.Nd terminal capability interface
-.Sh SYNOPSIS
-.Nm
-.Op Fl T Ar term
-.Ar attribute ...
-.Nm clear
-.Sh DESCRIPTION
-The
-.Nm
-utility makes terminal-dependent information available to users or shell
-applications.
-When invoked as the
-.Nm clear
-utility, the screen will be cleared as if
-.Dl tput clear
-had been executed.
-The options to
-.Nm
-are as follows:
-.Bl -tag -width Ds
-.It Fl T
-The terminal name as specified in the
-.Xr termcap 5
-database, for example,
-.Dq vt100
-or
-.Dq xterm .
-If not specified,
-.Nm
-retrieves the
-.Dq Ev TERM
-variable from the environment.
-.El
-.Pp
-The
-.Nm
-utility outputs a string for each
-.Ar attribute
-that is of type string; a number for each of type integer.
-Otherwise,
-.Nm
-exits 0 if the terminal has the capability and 1 if it does not,
-without further action.
-.Pp
-If an
-.Ar attribute
-is of type string, and takes arguments (e.g.\& cursor movement,
-the termcap
-.Dq cm
-sequence) the arguments are taken from the command line immediately
-following the attribute.
-.Pp
-The following special attributes are available:
-.Bl -tag -width Ar
-.It Cm clear
-Clear the screen (the
-.Xr termcap 5
-.Dq cl
-sequence).
-.It Cm init
-Initialize the terminal (the
-.Xr termcap 5
-.Dq is
-sequence).
-.It Cm longname
-Print the descriptive name of the user's terminal type.
-.It Cm reset
-Reset the terminal (the
-.Xr termcap 5
-.Dq rs
-sequence).
-.El
-.Sh EXIT STATUS
-The exit status of
-.Nm
-is as follows:
-.Bl -tag -width indent
-.It 0
-If the last attribute
-.Ar attribute
-argument is of type string or integer, its value was successfully written
-to standard output.
-If the argument is of type boolean, the terminal has this attribute.
-.It 1
-This terminal does not have the specified boolean
-.Ar attribute .
-.It 2
-Usage error.
-.It 3
-No information is available about the specified terminal type.
-.El
-.Sh SEE ALSO
-.Xr termcap 5 ,
-.Xr terminfo 5
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-.Sh HISTORY
-The
-.Nm
-utility appeared in
-.Bx 4.4 .
-.Sh BUGS
-The
-.Nm
-utility cannot really distinguish between different types of attributes.
-.Pp
-Some termcap entries depend upon having a
-.Sq %
-in them that is just a
-.Sq %
-and nothing more.
-Right now we just warn about them if they do not
-have a valid type declaration.
-These warnings are sent to
-stderr.
diff --git a/usr.bin/tput/tput.c b/usr.bin/tput/tput.c
deleted file mode 100644
index a478d5d..0000000
--- a/usr.bin/tput/tput.c
+++ /dev/null
@@ -1,216 +0,0 @@
-/*-
- * Copyright (c) 1980, 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1988, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "@(#)tput.c 8.2 (Berkeley) 3/19/94";
-#endif
-
-#include <termios.h>
-
-#include <err.h>
-#include <termcap.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#undef putchar
-#define outc putchar
-
-static void prlongname(char *);
-static void usage(void);
-static char **process(const char *, char *, char **);
-
-int
-main(int argc, char **argv)
-{
- int ch, exitval, n;
- char *cptr, *term, buf[1024], tbuf[1024];
- const char *p;
-
- term = NULL;
- while ((ch = getopt(argc, argv, "T:")) != -1)
- switch(ch) {
- case 'T':
- term = optarg;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (argc < 1)
- usage();
-
- if (!term && !(term = getenv("TERM")))
-errx(2, "no terminal type specified and no TERM environmental variable.");
- if (tgetent(tbuf, term) != 1)
- err(3, "tgetent failure");
- for (exitval = 0; (p = *argv) != NULL; ++argv) {
- switch (*p) {
- case 'c':
- if (!strcmp(p, "clear"))
- p = "cl";
- break;
- case 'i':
- if (!strcmp(p, "init"))
- p = "is";
- break;
- case 'l':
- if (!strcmp(p, "longname")) {
- prlongname(tbuf);
- continue;
- }
- break;
- case 'r':
- if (!strcmp(p, "reset"))
- p = "rs";
- break;
- }
- cptr = buf;
- if (tgetstr(p, &cptr))
- argv = process(p, buf, argv);
- else if ((n = tgetnum(p)) != -1)
- (void)printf("%d\n", n);
- else
- exitval = !tgetflag(p);
- }
- exit(exitval);
-}
-
-static void
-prlongname(char *buf)
-{
- int savech;
- char *p, *savep;
-
- for (p = buf; *p && *p != ':'; ++p);
- savech = *(savep = p);
- for (*p = '\0'; p >= buf && *p != '|'; --p);
- (void)printf("%s\n", p + 1);
- *savep = savech;
-}
-
-static char **
-process(const char *cap, char *str, char **argv)
-{
- static const char errfew[] =
- "not enough arguments (%d) for capability `%s'";
- static const char errmany[] =
- "too many arguments (%d) for capability `%s'";
- static const char erresc[] =
- "unknown %% escape `%c' for capability `%s'";
- char *cp;
- int arg_need, arg_rows, arg_cols;
-
- /* Count how many values we need for this capability. */
- for (cp = str, arg_need = 0; *cp != '\0'; cp++)
- if (*cp == '%')
- switch (*++cp) {
- case 'd':
- case '2':
- case '3':
- case '.':
- case '+':
- arg_need++;
- break;
- case '%':
- case '>':
- case 'i':
- case 'r':
- case 'n':
- case 'B':
- case 'D':
- break;
- case 'p':
- if (cp[1]) {
- cp++;
- break;
- }
- default:
- /*
- * hpux has lot's of them, but we complain
- */
- warnx(erresc, *cp, cap);
- }
-
- /* And print them. */
- switch (arg_need) {
- case 0:
- (void)tputs(str, 1, outc);
- break;
- case 1:
- arg_cols = 0;
-
- if (*++argv == NULL || *argv[0] == '\0')
- errx(2, errfew, 1, cap);
- arg_rows = atoi(*argv);
-
- (void)tputs(tgoto(str, arg_cols, arg_rows), 1, outc);
- break;
- case 2:
- if (*++argv == NULL || *argv[0] == '\0')
- errx(2, errfew, 2, cap);
- arg_cols = atoi(*argv);
-
- if (*++argv == NULL || *argv[0] == '\0')
- errx(2, errfew, 2, cap);
- arg_rows = atoi(*argv);
-
- (void) tputs(tgoto(str, arg_cols, arg_rows), arg_rows, outc);
- break;
-
- default:
- errx(2, errmany, arg_need, cap);
- }
- return (argv);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "usage: tput [-T term] attribute ...\n");
- exit(2);
-}
diff --git a/usr.bin/tr/Makefile b/usr.bin/tr/Makefile
deleted file mode 100644
index 00bdd8d..0000000
--- a/usr.bin/tr/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= tr
-SRCS= cmap.c cset.c str.c tr.c
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/tr/cmap.c b/usr.bin/tr/cmap.c
deleted file mode 100644
index 811040c..0000000
--- a/usr.bin/tr/cmap.c
+++ /dev/null
@@ -1,212 +0,0 @@
-/*-
- * Copyright (c) 2004 Tim J. Robbins.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*
- * "Character map" ADT. Stores mappings between pairs of characters in a
- * splay tree, with a lookup table cache to simplify looking up the first
- * bunch of characters (which are presumably more common than others).
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <assert.h>
-#include <limits.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <wchar.h>
-#include "cmap.h"
-
-static struct cmapnode *cmap_splay(struct cmapnode *, wint_t);
-
-/*
- * cmap_alloc --
- * Allocate a character map.
- */
-struct cmap *
-cmap_alloc(void)
-{
- struct cmap *cm;
-
- cm = malloc(sizeof(*cm));
- if (cm == NULL)
- return (NULL);
- cm->cm_root = NULL;
- cm->cm_def = CM_DEF_SELF;
- cm->cm_havecache = false;
- cm->cm_min = cm->cm_max = 0;
- return (cm);
-}
-
-/*
- * cmap_add --
- * Add a mapping from "from" to "to" to the map.
- */
-bool
-cmap_add(struct cmap *cm, wint_t from, wint_t to)
-{
- struct cmapnode *cmn, *ncmn;
-
- cm->cm_havecache = false;
-
- if (cm->cm_root == NULL) {
- cmn = malloc(sizeof(*cmn));
- if (cmn == NULL)
- return (false);
- cmn->cmn_from = from;
- cmn->cmn_to = to;
- cmn->cmn_left = cmn->cmn_right = NULL;
- cm->cm_root = cmn;
- cm->cm_min = cm->cm_max = from;
- return (true);
- }
-
- cmn = cm->cm_root = cmap_splay(cm->cm_root, from);
-
- if (cmn->cmn_from == from) {
- cmn->cmn_to = to;
- return (true);
- }
-
- ncmn = malloc(sizeof(*ncmn));
- if (ncmn == NULL)
- return (false);
- ncmn->cmn_from = from;
- ncmn->cmn_to = to;
- if (from < cmn->cmn_from) {
- ncmn->cmn_left = cmn->cmn_left;
- ncmn->cmn_right = cmn;
- cmn->cmn_left = NULL;
- } else {
- ncmn->cmn_right = cmn->cmn_right;
- ncmn->cmn_left = cmn;
- cmn->cmn_right = NULL;
- }
- if (from < cm->cm_min)
- cm->cm_min = from;
- if (from > cm->cm_max)
- cm->cm_max = from;
- cm->cm_root = ncmn;
-
- return (true);
-}
-
-/*
- * cmap_lookup_hard --
- * Look up the mapping for a character without using the cache.
- */
-wint_t
-cmap_lookup_hard(struct cmap *cm, wint_t ch)
-{
-
- if (cm->cm_root != NULL) {
- cm->cm_root = cmap_splay(cm->cm_root, ch);
- if (cm->cm_root->cmn_from == ch)
- return (cm->cm_root->cmn_to);
- }
- return (cm->cm_def == CM_DEF_SELF ? ch : cm->cm_def);
-}
-
-/*
- * cmap_cache --
- * Update the cache.
- */
-void
-cmap_cache(struct cmap *cm)
-{
- wint_t ch;
-
- for (ch = 0; ch < CM_CACHE_SIZE; ch++)
- cm->cm_cache[ch] = cmap_lookup_hard(cm, ch);
-
- cm->cm_havecache = true;
-}
-
-/*
- * cmap_default --
- * Change the value that characters without mappings map to, and
- * return the old value. The special character value CM_MAP_SELF
- * means characters map to themselves.
- */
-wint_t
-cmap_default(struct cmap *cm, wint_t def)
-{
- wint_t old;
-
- old = cm->cm_def;
- cm->cm_def = def;
- cm->cm_havecache = false;
- return (old);
-}
-
-static struct cmapnode *
-cmap_splay(struct cmapnode *t, wint_t ch)
-{
- struct cmapnode N, *l, *r, *y;
-
- /*
- * Based on public domain code from Sleator.
- */
-
- assert(t != NULL);
-
- N.cmn_left = N.cmn_right = NULL;
- l = r = &N;
- for (;;) {
- if (ch < t->cmn_from) {
- if (t->cmn_left != NULL &&
- ch < t->cmn_left->cmn_from) {
- y = t->cmn_left;
- t->cmn_left = y->cmn_right;
- y->cmn_right = t;
- t = y;
- }
- if (t->cmn_left == NULL)
- break;
- r->cmn_left = t;
- r = t;
- t = t->cmn_left;
- } else if (ch > t->cmn_from) {
- if (t->cmn_right != NULL &&
- ch > t->cmn_right->cmn_from) {
- y = t->cmn_right;
- t->cmn_right = y->cmn_left;
- y->cmn_left = t;
- t = y;
- }
- if (t->cmn_right == NULL)
- break;
- l->cmn_right = t;
- l = t;
- t = t->cmn_right;
- } else
- break;
- }
- l->cmn_right = t->cmn_left;
- r->cmn_left = t->cmn_right;
- t->cmn_left = N.cmn_right;
- t->cmn_right = N.cmn_left;
- return (t);
-}
diff --git a/usr.bin/tr/cmap.h b/usr.bin/tr/cmap.h
deleted file mode 100644
index 9a81e13..0000000
--- a/usr.bin/tr/cmap.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*-
- * Copyright (c) 2004 Tim J. Robbins.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef CMAP_H
-#define CMAP_H
-
-#include <limits.h>
-#include <stdbool.h>
-#include <wchar.h>
-
-struct cmapnode {
- wint_t cmn_from;
- wint_t cmn_to;
- struct cmapnode *cmn_left;
- struct cmapnode *cmn_right;
-};
-
-struct cmap {
-#define CM_CACHE_SIZE 128
- wint_t cm_cache[CM_CACHE_SIZE];
- bool cm_havecache;
- struct cmapnode *cm_root;
-#define CM_DEF_SELF -2
- wint_t cm_def;
- wint_t cm_min;
- wint_t cm_max;
-};
-
-struct cmap * cmap_alloc(void);
-bool cmap_add(struct cmap *, wint_t, wint_t);
-wint_t cmap_lookup_hard(struct cmap *, wint_t);
-void cmap_cache(struct cmap *);
-wint_t cmap_default(struct cmap *, wint_t);
-
-static __inline wint_t
-cmap_lookup(struct cmap *cm, wint_t from)
-{
-
- if (from < CM_CACHE_SIZE && cm->cm_havecache)
- return (cm->cm_cache[from]);
- return (cmap_lookup_hard(cm, from));
-}
-
-static __inline wint_t
-cmap_min(struct cmap *cm)
-{
-
- return (cm->cm_min);
-}
-
-static __inline wint_t
-cmap_max(struct cmap *cm)
-{
-
- return (cm->cm_max);
-}
-
-#endif
diff --git a/usr.bin/tr/cset.c b/usr.bin/tr/cset.c
deleted file mode 100644
index 1b42129..0000000
--- a/usr.bin/tr/cset.c
+++ /dev/null
@@ -1,290 +0,0 @@
-/*-
- * Copyright (c) 2004 Tim J. Robbins.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*
- * "Set of characters" ADT implemented as a splay tree of extents, with
- * a lookup table cache to simplify looking up the first bunch of
- * characters (which are presumably more common than others).
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <assert.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <wchar.h>
-#include <wctype.h>
-#include "cset.h"
-
-static struct csnode * cset_delete(struct csnode *, wchar_t);
-static __inline int cset_rangecmp(struct csnode *, wchar_t);
-static struct csnode * cset_splay(struct csnode *, wchar_t);
-
-/*
- * cset_alloc --
- * Allocate a set of characters.
- */
-struct cset *
-cset_alloc(void)
-{
- struct cset *cs;
-
- if ((cs = malloc(sizeof(*cs))) == NULL)
- return (NULL);
- cs->cs_root = NULL;
- cs->cs_classes = NULL;
- cs->cs_havecache = false;
- cs->cs_invert = false;
- return (cs);
-}
-
-/*
- * cset_add --
- * Add a character to the set.
- */
-bool
-cset_add(struct cset *cs, wchar_t ch)
-{
- struct csnode *csn, *ncsn;
- wchar_t oval;
-
- cs->cs_havecache = false;
-
- /*
- * Inserting into empty tree; new item becomes the root.
- */
- if (cs->cs_root == NULL) {
- csn = malloc(sizeof(*cs->cs_root));
- if (csn == NULL)
- return (false);
- csn->csn_left = csn->csn_right = NULL;
- csn->csn_min = csn->csn_max = ch;
- cs->cs_root = csn;
- return (true);
- }
-
- /*
- * Splay to check whether the item already exists, and otherwise,
- * where we should put it.
- */
- csn = cs->cs_root = cset_splay(cs->cs_root, ch);
-
- /*
- * Avoid adding duplicate nodes.
- */
- if (cset_rangecmp(csn, ch) == 0)
- return (true);
-
- /*
- * Allocate a new node and make it the new root.
- */
- ncsn = malloc(sizeof(*ncsn));
- if (ncsn == NULL)
- return (false);
- ncsn->csn_min = ncsn->csn_max = ch;
- if (cset_rangecmp(csn, ch) < 0) {
- ncsn->csn_left = csn->csn_left;
- ncsn->csn_right = csn;
- csn->csn_left = NULL;
- } else {
- ncsn->csn_right = csn->csn_right;
- ncsn->csn_left = csn;
- csn->csn_right = NULL;
- }
- cs->cs_root = ncsn;
-
- /*
- * Coalesce with left and right neighbours if possible.
- */
- if (ncsn->csn_left != NULL) {
- ncsn->csn_left = cset_splay(ncsn->csn_left, ncsn->csn_min - 1);
- if (ncsn->csn_left->csn_max == ncsn->csn_min - 1) {
- oval = ncsn->csn_left->csn_min;
- ncsn->csn_left = cset_delete(ncsn->csn_left,
- ncsn->csn_left->csn_min);
- ncsn->csn_min = oval;
- }
- }
- if (ncsn->csn_right != NULL) {
- ncsn->csn_right = cset_splay(ncsn->csn_right,
- ncsn->csn_max + 1);
- if (ncsn->csn_right->csn_min == ncsn->csn_max + 1) {
- oval = ncsn->csn_right->csn_max;
- ncsn->csn_right = cset_delete(ncsn->csn_right,
- ncsn->csn_right->csn_min);
- ncsn->csn_max = oval;
- }
- }
-
- return (true);
-}
-
-/*
- * cset_in_hard --
- * Determine whether a character is in the set without using
- * the cache.
- */
-bool
-cset_in_hard(struct cset *cs, wchar_t ch)
-{
- struct csclass *csc;
-
- for (csc = cs->cs_classes; csc != NULL; csc = csc->csc_next)
- if (csc->csc_invert ^ iswctype(ch, csc->csc_type) != 0)
- return (cs->cs_invert ^ true);
- if (cs->cs_root != NULL) {
- cs->cs_root = cset_splay(cs->cs_root, ch);
- return (cs->cs_invert ^ cset_rangecmp(cs->cs_root, ch) == 0);
- }
- return (cs->cs_invert ^ false);
-}
-
-/*
- * cset_cache --
- * Update the cache.
- */
-void
-cset_cache(struct cset *cs)
-{
- wchar_t i;
-
- for (i = 0; i < CS_CACHE_SIZE; i++)
- cs->cs_cache[i] = cset_in_hard(cs, i);
-
- cs->cs_havecache = true;
-}
-
-/*
- * cset_invert --
- * Invert the character set.
- */
-void
-cset_invert(struct cset *cs)
-{
-
- cs->cs_invert ^= true;
- cs->cs_havecache = false;
-}
-
-/*
- * cset_addclass --
- * Add a wctype()-style character class to the set, optionally
- * inverting it.
- */
-bool
-cset_addclass(struct cset *cs, wctype_t type, bool invert)
-{
- struct csclass *csc;
-
- csc = malloc(sizeof(*csc));
- if (csc == NULL)
- return (false);
- csc->csc_type = type;
- csc->csc_invert = invert;
- csc->csc_next = cs->cs_classes;
- cs->cs_classes = csc;
- cs->cs_havecache = false;
- return (true);
-}
-
-static __inline int
-cset_rangecmp(struct csnode *t, wchar_t ch)
-{
-
- if (ch < t->csn_min)
- return (-1);
- if (ch > t->csn_max)
- return (1);
- return (0);
-}
-
-static struct csnode *
-cset_splay(struct csnode *t, wchar_t ch)
-{
- struct csnode N, *l, *r, *y;
-
- /*
- * Based on public domain code from Sleator.
- */
-
- assert(t != NULL);
-
- N.csn_left = N.csn_right = NULL;
- l = r = &N;
- for (;;) {
- if (cset_rangecmp(t, ch) < 0) {
- if (t->csn_left != NULL &&
- cset_rangecmp(t->csn_left, ch) < 0) {
- y = t->csn_left;
- t->csn_left = y->csn_right;
- y->csn_right = t;
- t = y;
- }
- if (t->csn_left == NULL)
- break;
- r->csn_left = t;
- r = t;
- t = t->csn_left;
- } else if (cset_rangecmp(t, ch) > 0) {
- if (t->csn_right != NULL &&
- cset_rangecmp(t->csn_right, ch) > 0) {
- y = t->csn_right;
- t->csn_right = y->csn_left;
- y->csn_left = t;
- t = y;
- }
- if (t->csn_right == NULL)
- break;
- l->csn_right = t;
- l = t;
- t = t->csn_right;
- } else
- break;
- }
- l->csn_right = t->csn_left;
- r->csn_left = t->csn_right;
- t->csn_left = N.csn_right;
- t->csn_right = N.csn_left;
- return (t);
-}
-
-static struct csnode *
-cset_delete(struct csnode *t, wchar_t ch)
-{
- struct csnode *x;
-
- assert(t != NULL);
- t = cset_splay(t, ch);
- assert(cset_rangecmp(t, ch) == 0);
- if (t->csn_left == NULL)
- x = t->csn_right;
- else {
- x = cset_splay(t->csn_left, ch);
- x->csn_right = t->csn_right;
- }
- free(t);
- return x;
-}
diff --git a/usr.bin/tr/cset.h b/usr.bin/tr/cset.h
deleted file mode 100644
index ab3eabd..0000000
--- a/usr.bin/tr/cset.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*-
- * Copyright (c) 2004 Tim J. Robbins.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef CSET_H
-#define CSET_H
-
-#include <stdbool.h>
-#include <wchar.h>
-#include <wctype.h>
-
-struct csnode {
- wchar_t csn_min;
- wchar_t csn_max;
- struct csnode *csn_left;
- struct csnode *csn_right;
-};
-
-struct csclass {
- wctype_t csc_type;
- bool csc_invert;
- struct csclass *csc_next;
-};
-
-struct cset {
-#define CS_CACHE_SIZE 256
- bool cs_cache[CS_CACHE_SIZE];
- bool cs_havecache;
- struct csclass *cs_classes;
- struct csnode *cs_root;
- bool cs_invert;
-};
-
-bool cset_addclass(struct cset *, wctype_t, bool);
-struct cset * cset_alloc(void);
-bool cset_add(struct cset *, wchar_t);
-void cset_invert(struct cset *);
-bool cset_in_hard(struct cset *, wchar_t);
-void cset_cache(struct cset *);
-
-static __inline bool
-cset_in(struct cset *cs, wchar_t ch)
-{
-
- if (ch < CS_CACHE_SIZE && cs->cs_havecache)
- return (cs->cs_cache[ch]);
- return (cset_in_hard(cs, ch));
-}
-
-#endif /* CSET_H */
diff --git a/usr.bin/tr/extern.h b/usr.bin/tr/extern.h
deleted file mode 100644
index 2fdbdf3..0000000
--- a/usr.bin/tr/extern.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#include <limits.h>
-
-#define NCHARS_SB (UCHAR_MAX + 1) /* Number of single-byte characters. */
-#define OOBCH -1 /* Out of band character value. */
-
-typedef struct {
- enum { STRING1, STRING2 } which;
- enum { EOS, INFINITE, NORMAL, RANGE, SEQUENCE,
- CCLASS, CCLASS_UPPER, CCLASS_LOWER, SET } state;
- int cnt; /* character count */
- wint_t lastch; /* last character */
- wctype_t cclass; /* character class from wctype() */
- wint_t equiv[NCHARS_SB]; /* equivalence set */
- wint_t *set; /* set of characters */
- char *str; /* user's string */
-} STR;
-
-wint_t next(STR *);
-int charcoll(const void *, const void *);
diff --git a/usr.bin/tr/str.c b/usr.bin/tr/str.c
deleted file mode 100644
index 86ae173..0000000
--- a/usr.bin/tr/str.c
+++ /dev/null
@@ -1,396 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)str.c 8.2 (Berkeley) 4/28/95";
-#endif
-
-#include <sys/types.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <wchar.h>
-#include <wctype.h>
-
-#include "extern.h"
-
-static int backslash(STR *, int *);
-static int bracket(STR *);
-static void genclass(STR *);
-static void genequiv(STR *);
-static int genrange(STR *, int);
-static void genseq(STR *);
-
-wint_t
-next(s)
- STR *s;
-{
- int is_octal;
- wint_t ch;
- wchar_t wch;
- size_t clen;
-
- switch (s->state) {
- case EOS:
- return (0);
- case INFINITE:
- return (1);
- case NORMAL:
- switch (*s->str) {
- case '\0':
- s->state = EOS;
- return (0);
- case '\\':
- s->lastch = backslash(s, &is_octal);
- break;
- case '[':
- if (bracket(s))
- return (next(s));
- /* FALLTHROUGH */
- default:
- clen = mbrtowc(&wch, s->str, MB_LEN_MAX, NULL);
- if (clen == (size_t)-1 || clen == (size_t)-2 ||
- clen == 0)
- errc(1, EILSEQ, NULL);
- is_octal = 0;
- s->lastch = wch;
- s->str += clen;
- break;
- }
-
- /* We can start a range at any time. */
- if (s->str[0] == '-' && genrange(s, is_octal))
- return (next(s));
- return (1);
- case RANGE:
- if (s->cnt-- == 0) {
- s->state = NORMAL;
- return (next(s));
- }
- ++s->lastch;
- return (1);
- case SEQUENCE:
- if (s->cnt-- == 0) {
- s->state = NORMAL;
- return (next(s));
- }
- return (1);
- case CCLASS:
- case CCLASS_UPPER:
- case CCLASS_LOWER:
- s->cnt++;
- ch = nextwctype(s->lastch, s->cclass);
- if (ch == -1) {
- s->state = NORMAL;
- return (next(s));
- }
- s->lastch = ch;
- return (1);
- case SET:
- if ((ch = s->set[s->cnt++]) == OOBCH) {
- s->state = NORMAL;
- return (next(s));
- }
- s->lastch = ch;
- return (1);
- default:
- return (0);
- }
- /* NOTREACHED */
-}
-
-static int
-bracket(s)
- STR *s;
-{
- char *p;
-
- switch (s->str[1]) {
- case ':': /* "[:class:]" */
- if ((p = strchr(s->str + 2, ']')) == NULL)
- return (0);
- if (*(p - 1) != ':' || p - s->str < 4)
- goto repeat;
- *(p - 1) = '\0';
- s->str += 2;
- genclass(s);
- s->str = p + 1;
- return (1);
- case '=': /* "[=equiv=]" */
- if ((p = strchr(s->str + 2, ']')) == NULL)
- return (0);
- if (*(p - 1) != '=' || p - s->str < 4)
- goto repeat;
- s->str += 2;
- genequiv(s);
- return (1);
- default: /* "[\###*n]" or "[#*n]" */
- repeat:
- if ((p = strpbrk(s->str + 2, "*]")) == NULL)
- return (0);
- if (p[0] != '*' || index(p, ']') == NULL)
- return (0);
- s->str += 1;
- genseq(s);
- return (1);
- }
- /* NOTREACHED */
-}
-
-static void
-genclass(s)
- STR *s;
-{
-
- if ((s->cclass = wctype(s->str)) == 0)
- errx(1, "unknown class %s", s->str);
- s->cnt = 0;
- s->lastch = -1; /* incremented before check in next() */
- if (strcmp(s->str, "upper") == 0)
- s->state = CCLASS_UPPER;
- else if (strcmp(s->str, "lower") == 0)
- s->state = CCLASS_LOWER;
- else
- s->state = CCLASS;
-}
-
-static void
-genequiv(s)
- STR *s;
-{
- int i, p, pri;
- char src[2], dst[3];
- size_t clen;
- wchar_t wc;
-
- if (*s->str == '\\') {
- s->equiv[0] = backslash(s, NULL);
- if (*s->str != '=')
- errx(1, "misplaced equivalence equals sign");
- s->str += 2;
- } else {
- clen = mbrtowc(&wc, s->str, MB_LEN_MAX, NULL);
- if (clen == (size_t)-1 || clen == (size_t)-2 || clen == 0)
- errc(1, EILSEQ, NULL);
- s->equiv[0] = wc;
- if (s->str[clen] != '=')
- errx(1, "misplaced equivalence equals sign");
- s->str += clen + 2;
- }
-
- /*
- * Calculate the set of all characters in the same equivalence class
- * as the specified character (they will have the same primary
- * collation weights).
- * XXX Knows too much about how strxfrm() is implemented. Assumes
- * it fills the string with primary collation weight bytes. Only one-
- * to-one mappings are supported.
- * XXX Equivalence classes not supported in multibyte locales.
- */
- src[0] = (char)s->equiv[0];
- src[1] = '\0';
- if (MB_CUR_MAX == 1 && strxfrm(dst, src, sizeof(dst)) == 1) {
- pri = (unsigned char)*dst;
- for (p = 1, i = 1; i < NCHARS_SB; i++) {
- *src = i;
- if (strxfrm(dst, src, sizeof(dst)) == 1 && pri &&
- pri == (unsigned char)*dst)
- s->equiv[p++] = i;
- }
- s->equiv[p] = OOBCH;
- }
-
- s->cnt = 0;
- s->state = SET;
- s->set = s->equiv;
-}
-
-static int
-genrange(STR *s, int was_octal)
-{
- int stopval, octal;
- char *savestart;
- int n, cnt, *p;
- size_t clen;
- wchar_t wc;
-
- octal = 0;
- savestart = s->str;
- if (*++s->str == '\\')
- stopval = backslash(s, &octal);
- else {
- clen = mbrtowc(&wc, s->str, MB_LEN_MAX, NULL);
- if (clen == (size_t)-1 || clen == (size_t)-2)
- errc(1, EILSEQ, NULL);
- stopval = wc;
- s->str += clen;
- }
- /*
- * XXX Characters are not ordered according to collating sequence in
- * multibyte locales.
- */
- if (octal || was_octal || MB_CUR_MAX > 1) {
- if (stopval < s->lastch) {
- s->str = savestart;
- return (0);
- }
- s->cnt = stopval - s->lastch + 1;
- s->state = RANGE;
- --s->lastch;
- return (1);
- }
- if (charcoll((const void *)&stopval, (const void *)&(s->lastch)) < 0) {
- s->str = savestart;
- return (0);
- }
- if ((s->set = p = malloc((NCHARS_SB + 1) * sizeof(int))) == NULL)
- err(1, "genrange() malloc");
- for (cnt = 0; cnt < NCHARS_SB; cnt++)
- if (charcoll((const void *)&cnt, (const void *)&(s->lastch)) >= 0 &&
- charcoll((const void *)&cnt, (const void *)&stopval) <= 0)
- *p++ = cnt;
- *p = OOBCH;
- n = p - s->set;
-
- s->cnt = 0;
- s->state = SET;
- if (n > 1)
- mergesort(s->set, n, sizeof(*(s->set)), charcoll);
- return (1);
-}
-
-static void
-genseq(s)
- STR *s;
-{
- char *ep;
- wchar_t wc;
- size_t clen;
-
- if (s->which == STRING1)
- errx(1, "sequences only valid in string2");
-
- if (*s->str == '\\')
- s->lastch = backslash(s, NULL);
- else {
- clen = mbrtowc(&wc, s->str, MB_LEN_MAX, NULL);
- if (clen == (size_t)-1 || clen == (size_t)-2)
- errc(1, EILSEQ, NULL);
- s->lastch = wc;
- s->str += clen;
- }
- if (*s->str != '*')
- errx(1, "misplaced sequence asterisk");
-
- switch (*++s->str) {
- case '\\':
- s->cnt = backslash(s, NULL);
- break;
- case ']':
- s->cnt = 0;
- ++s->str;
- break;
- default:
- if (isdigit((u_char)*s->str)) {
- s->cnt = strtol(s->str, &ep, 0);
- if (*ep == ']') {
- s->str = ep + 1;
- break;
- }
- }
- errx(1, "illegal sequence count");
- /* NOTREACHED */
- }
-
- s->state = s->cnt ? SEQUENCE : INFINITE;
-}
-
-/*
- * Translate \??? into a character. Up to 3 octal digits, if no digits either
- * an escape code or a literal character.
- */
-static int
-backslash(STR *s, int *is_octal)
-{
- int ch, cnt, val;
-
- if (is_octal != NULL)
- *is_octal = 0;
- for (cnt = val = 0;;) {
- ch = (u_char)*++s->str;
- if (!isdigit(ch) || ch > '7')
- break;
- val = val * 8 + ch - '0';
- if (++cnt == 3) {
- ++s->str;
- break;
- }
- }
- if (cnt) {
- if (is_octal != NULL)
- *is_octal = 1;
- return (val);
- }
- if (ch != '\0')
- ++s->str;
- switch (ch) {
- case 'a': /* escape characters */
- return ('\7');
- case 'b':
- return ('\b');
- case 'f':
- return ('\f');
- case 'n':
- return ('\n');
- case 'r':
- return ('\r');
- case 't':
- return ('\t');
- case 'v':
- return ('\13');
- case '\0': /* \" -> \ */
- s->state = EOS;
- return ('\\');
- default: /* \x" -> x */
- return (ch);
- }
-}
diff --git a/usr.bin/tr/tr.1 b/usr.bin/tr/tr.1
deleted file mode 100644
index e30c877..0000000
--- a/usr.bin/tr/tr.1
+++ /dev/null
@@ -1,427 +0,0 @@
-.\" Copyright (c) 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)tr.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd October 13, 2006
-.Dt TR 1
-.Os
-.Sh NAME
-.Nm tr
-.Nd translate characters
-.Sh SYNOPSIS
-.Nm
-.Op Fl Ccsu
-.Ar string1 string2
-.Nm
-.Op Fl Ccu
-.Fl d
-.Ar string1
-.Nm
-.Op Fl Ccu
-.Fl s
-.Ar string1
-.Nm
-.Op Fl Ccu
-.Fl ds
-.Ar string1 string2
-.Sh DESCRIPTION
-The
-.Nm
-utility copies the standard input to the standard output with substitution
-or deletion of selected characters.
-.Pp
-The following options are available:
-.Bl -tag -width Ds
-.It Fl C
-Complement the set of characters in
-.Ar string1 ,
-that is
-.Dq Fl C Li ab
-includes every character except for
-.Ql a
-and
-.Ql b .
-.It Fl c
-Same as
-.Fl C
-but complement the set of values in
-.Ar string1 .
-.It Fl d
-Delete characters in
-.Ar string1
-from the input.
-.It Fl s
-Squeeze multiple occurrences of the characters listed in the last
-operand (either
-.Ar string1
-or
-.Ar string2 )
-in the input into a single instance of the character.
-This occurs after all deletion and translation is completed.
-.It Fl u
-Guarantee that any output is unbuffered.
-.El
-.Pp
-In the first synopsis form, the characters in
-.Ar string1
-are translated into the characters in
-.Ar string2
-where the first character in
-.Ar string1
-is translated into the first character in
-.Ar string2
-and so on.
-If
-.Ar string1
-is longer than
-.Ar string2 ,
-the last character found in
-.Ar string2
-is duplicated until
-.Ar string1
-is exhausted.
-.Pp
-In the second synopsis form, the characters in
-.Ar string1
-are deleted from the input.
-.Pp
-In the third synopsis form, the characters in
-.Ar string1
-are compressed as described for the
-.Fl s
-option.
-.Pp
-In the fourth synopsis form, the characters in
-.Ar string1
-are deleted from the input, and the characters in
-.Ar string2
-are compressed as described for the
-.Fl s
-option.
-.Pp
-The following conventions can be used in
-.Ar string1
-and
-.Ar string2
-to specify sets of characters:
-.Bl -tag -width [:equiv:]
-.It character
-Any character not described by one of the following conventions
-represents itself.
-.It \eoctal
-A backslash followed by 1, 2 or 3 octal digits represents a character
-with that encoded value.
-To follow an octal sequence with a digit as a character, left zero-pad
-the octal sequence to the full 3 octal digits.
-.It \echaracter
-A backslash followed by certain special characters maps to special
-values.
-.Pp
-.Bl -column "\ea"
-.It "\ea <alert character>
-.It "\eb <backspace>
-.It "\ef <form-feed>
-.It "\en <newline>
-.It "\er <carriage return>
-.It "\et <tab>
-.It "\ev <vertical tab>
-.El
-.Pp
-A backslash followed by any other character maps to that character.
-.It c-c
-For non-octal range endpoints
-represents the range of characters between the range endpoints, inclusive,
-in ascending order,
-as defined by the collation sequence.
-If either or both of the range endpoints are octal sequences, it
-represents the range of specific coded values between the
-range endpoints, inclusive.
-.Pp
-.Bf Em
-See the
-.Sx COMPATIBILITY
-section below for an important note regarding
-differences in the way the current
-implementation interprets range expressions differently from
-previous implementations.
-.Ef
-.It [:class:]
-Represents all characters belonging to the defined character class.
-Class names are:
-.Pp
-.Bl -column "phonogram"
-.It "alnum <alphanumeric characters>
-.It "alpha <alphabetic characters>
-.It "blank <whitespace characters>
-.It "cntrl <control characters>
-.It "digit <numeric characters>
-.It "graph <graphic characters>
-.It "ideogram <ideographic characters>
-.It "lower <lower-case alphabetic characters>
-.It "phonogram <phonographic characters>
-.It "print <printable characters>
-.It "punct <punctuation characters>
-.It "rune <valid characters>
-.It "space <space characters>
-.It "special <special characters>
-.It "upper <upper-case characters>
-.It "xdigit <hexadecimal characters>
-.El
-.Pp
-.\" All classes may be used in
-.\" .Ar string1 ,
-.\" and in
-.\" .Ar string2
-.\" when both the
-.\" .Fl d
-.\" and
-.\" .Fl s
-.\" options are specified.
-.\" Otherwise, only the classes ``upper'' and ``lower'' may be used in
-.\" .Ar string2
-.\" and then only when the corresponding class (``upper'' for ``lower''
-.\" and vice-versa) is specified in the same relative position in
-.\" .Ar string1 .
-.\" .Pp
-When
-.Dq Li [:lower:]
-appears in
-.Ar string1
-and
-.Dq Li [:upper:]
-appears in the same relative position in
-.Ar string2 ,
-it represents the characters pairs from the
-.Dv toupper
-mapping in the
-.Ev LC_CTYPE
-category of the current locale.
-When
-.Dq Li [:upper:]
-appears in
-.Ar string1
-and
-.Dq Li [:lower:]
-appears in the same relative position in
-.Ar string2 ,
-it represents the characters pairs from the
-.Dv tolower
-mapping in the
-.Ev LC_CTYPE
-category of the current locale.
-.Pp
-With the exception of case conversion,
-characters in the classes are in unspecified order.
-.Pp
-For specific information as to which
-.Tn ASCII
-characters are included
-in these classes, see
-.Xr ctype 3
-and related manual pages.
-.It [=equiv=]
-Represents all characters belonging to the same equivalence class as
-.Ar equiv ,
-ordered by their encoded values.
-.It [#*n]
-Represents
-.Ar n
-repeated occurrences of the character represented by
-.Ar # .
-This
-expression is only valid when it occurs in
-.Ar string2 .
-If
-.Ar n
-is omitted or is zero, it is be interpreted as large enough to extend
-.Ar string2
-sequence to the length of
-.Ar string1 .
-If
-.Ar n
-has a leading zero, it is interpreted as an octal value, otherwise,
-it is interpreted as a decimal value.
-.El
-.Sh ENVIRONMENT
-The
-.Ev LANG , LC_ALL , LC_CTYPE
-and
-.Ev LC_COLLATE
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Sh EXIT STATUS
-.Ex -std
-.Sh EXAMPLES
-The following examples are shown as given to the shell:
-.Pp
-Create a list of the words in file1, one per line, where a word is taken to
-be a maximal string of letters.
-.Pp
-.D1 Li "tr -cs \*q[:alpha:]\*q \*q\en\*q < file1"
-.Pp
-Translate the contents of file1 to upper-case.
-.Pp
-.D1 Li "tr \*q[:lower:]\*q \*q[:upper:]\*q < file1"
-.Pp
-(This should be preferred over the traditional
-.Ux
-idiom of
-.Dq Li "tr a-z A-Z" ,
-since it works correctly in all locales.)
-.Pp
-Strip out non-printable characters from file1.
-.Pp
-.D1 Li "tr -cd \*q[:print:]\*q < file1"
-.Pp
-Remove diacritical marks from all accented variants of the letter
-.Ql e :
-.Pp
-.Dl "tr \*q[=e=]\*q \*qe\*q"
-.Sh COMPATIBILITY
-Previous
-.Fx
-implementations of
-.Nm
-did not order characters in range expressions according to the current
-locale's collation order, making it possible to convert unaccented Latin
-characters (esp.\& as found in English text) from upper to lower case using
-the traditional
-.Ux
-idiom of
-.Dq Li "tr A-Z a-z" .
-Since
-.Nm
-now obeys the locale's collation order, this idiom may not produce
-correct results when there is not a 1:1 mapping between lower and
-upper case, or when the order of characters within the two cases differs.
-As noted in the
-.Sx EXAMPLES
-section above, the character class expressions
-.Dq Li [:lower:]
-and
-.Dq Li [:upper:]
-should be used instead of explicit character ranges like
-.Dq Li a-z
-and
-.Dq Li A-Z .
-.Pp
-System V has historically implemented character ranges using the syntax
-.Dq Li [c-c]
-instead of the
-.Dq Li c-c
-used by historic
-.Bx
-implementations and
-standardized by POSIX.
-System V shell scripts should work under this implementation as long as
-the range is intended to map in another range, i.e., the command
-.Dq Li "tr [a-z] [A-Z]"
-will work as it will map the
-.Ql \&[
-character in
-.Ar string1
-to the
-.Ql \&[
-character in
-.Ar string2 .
-However, if the shell script is deleting or squeezing characters as in
-the command
-.Dq Li "tr -d [a-z]" ,
-the characters
-.Ql \&[
-and
-.Ql \&]
-will be
-included in the deletion or compression list which would not have happened
-under a historic System V implementation.
-Additionally, any scripts that depended on the sequence
-.Dq Li a-z
-to
-represent the three characters
-.Ql a ,
-.Ql \-
-and
-.Ql z
-will have to be
-rewritten as
-.Dq Li a\e-z .
-.Pp
-The
-.Nm
-utility has historically not permitted the manipulation of NUL bytes in
-its input and, additionally, stripped NUL's from its input stream.
-This implementation has removed this behavior as a bug.
-.Pp
-The
-.Nm
-utility has historically been extremely forgiving of syntax errors,
-for example, the
-.Fl c
-and
-.Fl s
-options were ignored unless two strings were specified.
-This implementation will not permit illegal syntax.
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-The
-.Dq ideogram ,
-.Dq phonogram ,
-.Dq rune ,
-and
-.Dq special
-character classes are extensions.
-.Pp
-It should be noted that the feature wherein the last character of
-.Ar string2
-is duplicated if
-.Ar string2
-has less characters than
-.Ar string1
-is permitted by POSIX but is not required.
-Shell scripts attempting to be portable to other POSIX systems should use
-the
-.Dq Li [#*]
-convention instead of relying on this behavior.
-The
-.Fl u
-option is an extension to the
-.St -p1003.1-2001
-standard.
diff --git a/usr.bin/tr/tr.c b/usr.bin/tr/tr.c
deleted file mode 100644
index 61195ff..0000000
--- a/usr.bin/tr/tr.c
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1988, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "@(#)tr.c 8.2 (Berkeley) 5/4/95";
-#endif
-
-#include <sys/types.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <limits.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-#include <wctype.h>
-
-#include "cmap.h"
-#include "cset.h"
-#include "extern.h"
-
-STR s1 = { STRING1, NORMAL, 0, OOBCH, 0, { 0, OOBCH }, NULL, NULL };
-STR s2 = { STRING2, NORMAL, 0, OOBCH, 0, { 0, OOBCH }, NULL, NULL };
-
-static struct cset *setup(char *, STR *, int, int);
-static void usage(void);
-
-int
-main(int argc, char **argv)
-{
- static int carray[NCHARS_SB];
- struct cmap *map;
- struct cset *delete, *squeeze;
- int n, *p;
- int Cflag, cflag, dflag, sflag, isstring2;
- wint_t ch, cnt, lastch;
-
- (void)setlocale(LC_ALL, "");
-
- Cflag = cflag = dflag = sflag = 0;
- while ((ch = getopt(argc, argv, "Ccdsu")) != -1)
- switch((char)ch) {
- case 'C':
- Cflag = 1;
- cflag = 0;
- break;
- case 'c':
- cflag = 1;
- Cflag = 0;
- break;
- case 'd':
- dflag = 1;
- break;
- case 's':
- sflag = 1;
- break;
- case 'u':
- setbuf(stdout, (char *)NULL);
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- switch(argc) {
- case 0:
- default:
- usage();
- /* NOTREACHED */
- case 1:
- isstring2 = 0;
- break;
- case 2:
- isstring2 = 1;
- break;
- }
-
- /*
- * tr -ds [-Cc] string1 string2
- * Delete all characters (or complemented characters) in string1.
- * Squeeze all characters in string2.
- */
- if (dflag && sflag) {
- if (!isstring2)
- usage();
-
- delete = setup(argv[0], &s1, cflag, Cflag);
- squeeze = setup(argv[1], &s2, 0, 0);
-
- for (lastch = OOBCH; (ch = getwchar()) != WEOF;)
- if (!cset_in(delete, ch) &&
- (lastch != ch || !cset_in(squeeze, ch))) {
- lastch = ch;
- (void)putwchar(ch);
- }
- if (ferror(stdin))
- err(1, NULL);
- exit(0);
- }
-
- /*
- * tr -d [-Cc] string1
- * Delete all characters (or complemented characters) in string1.
- */
- if (dflag) {
- if (isstring2)
- usage();
-
- delete = setup(argv[0], &s1, cflag, Cflag);
-
- while ((ch = getwchar()) != WEOF)
- if (!cset_in(delete, ch))
- (void)putwchar(ch);
- if (ferror(stdin))
- err(1, NULL);
- exit(0);
- }
-
- /*
- * tr -s [-Cc] string1
- * Squeeze all characters (or complemented characters) in string1.
- */
- if (sflag && !isstring2) {
- squeeze = setup(argv[0], &s1, cflag, Cflag);
-
- for (lastch = OOBCH; (ch = getwchar()) != WEOF;)
- if (lastch != ch || !cset_in(squeeze, ch)) {
- lastch = ch;
- (void)putwchar(ch);
- }
- if (ferror(stdin))
- err(1, NULL);
- exit(0);
- }
-
- /*
- * tr [-Ccs] string1 string2
- * Replace all characters (or complemented characters) in string1 with
- * the character in the same position in string2. If the -s option is
- * specified, squeeze all the characters in string2.
- */
- if (!isstring2)
- usage();
-
- map = cmap_alloc();
- if (map == NULL)
- err(1, NULL);
- squeeze = cset_alloc();
- if (squeeze == NULL)
- err(1, NULL);
-
- s1.str = argv[0];
-
- if (Cflag || cflag) {
- cmap_default(map, OOBCH);
- if ((s2.str = strdup(argv[1])) == NULL)
- errx(1, "strdup(argv[1])");
- } else
- s2.str = argv[1];
-
- if (!next(&s2))
- errx(1, "empty string2");
-
- /*
- * For -s result will contain only those characters defined
- * as the second characters in each of the toupper or tolower
- * pairs.
- */
-
- /* If string2 runs out of characters, use the last one specified. */
- while (next(&s1)) {
- again:
- if (s1.state == CCLASS_LOWER &&
- s2.state == CCLASS_UPPER &&
- s1.cnt == 1 && s2.cnt == 1) {
- do {
- ch = towupper(s1.lastch);
- cmap_add(map, s1.lastch, ch);
- if (sflag && iswupper(ch))
- cset_add(squeeze, ch);
- if (!next(&s1))
- goto endloop;
- } while (s1.state == CCLASS_LOWER && s1.cnt > 1);
- /* skip upper set */
- do {
- if (!next(&s2))
- break;
- } while (s2.state == CCLASS_UPPER && s2.cnt > 1);
- goto again;
- } else if (s1.state == CCLASS_UPPER &&
- s2.state == CCLASS_LOWER &&
- s1.cnt == 1 && s2.cnt == 1) {
- do {
- ch = towlower(s1.lastch);
- cmap_add(map, s1.lastch, ch);
- if (sflag && iswlower(ch))
- cset_add(squeeze, ch);
- if (!next(&s1))
- goto endloop;
- } while (s1.state == CCLASS_UPPER && s1.cnt > 1);
- /* skip lower set */
- do {
- if (!next(&s2))
- break;
- } while (s2.state == CCLASS_LOWER && s2.cnt > 1);
- goto again;
- } else {
- cmap_add(map, s1.lastch, s2.lastch);
- if (sflag)
- cset_add(squeeze, s2.lastch);
- }
- (void)next(&s2);
- }
-endloop:
- if (cflag || (Cflag && MB_CUR_MAX > 1)) {
- /*
- * This is somewhat tricky: since the character set is
- * potentially huge, we need to avoid allocating a map
- * entry for every character. Our strategy is to set the
- * default mapping to the last character of string #2
- * (= the one that gets automatically repeated), then to
- * add back identity mappings for characters that should
- * remain unchanged. We don't waste space on identity mappings
- * for non-characters with the -C option; those are simulated
- * in the I/O loop.
- */
- s2.str = argv[1];
- s2.state = NORMAL;
- for (cnt = 0; cnt < WCHAR_MAX; cnt++) {
- if (Cflag && !iswrune(cnt))
- continue;
- if (cmap_lookup(map, cnt) == OOBCH) {
- if (next(&s2))
- cmap_add(map, cnt, s2.lastch);
- if (sflag)
- cset_add(squeeze, s2.lastch);
- } else
- cmap_add(map, cnt, cnt);
- if ((s2.state == EOS || s2.state == INFINITE) &&
- cnt >= cmap_max(map))
- break;
- }
- cmap_default(map, s2.lastch);
- } else if (Cflag) {
- for (p = carray, cnt = 0; cnt < NCHARS_SB; cnt++) {
- if (cmap_lookup(map, cnt) == OOBCH && iswrune(cnt))
- *p++ = cnt;
- else
- cmap_add(map, cnt, cnt);
- }
- n = p - carray;
- if (Cflag && n > 1)
- (void)mergesort(carray, n, sizeof(*carray), charcoll);
-
- s2.str = argv[1];
- s2.state = NORMAL;
- for (cnt = 0; cnt < n; cnt++) {
- (void)next(&s2);
- cmap_add(map, carray[cnt], s2.lastch);
- /*
- * Chars taken from s2 can be different this time
- * due to lack of complex upper/lower processing,
- * so fill string2 again to not miss some.
- */
- if (sflag)
- cset_add(squeeze, s2.lastch);
- }
- }
-
- cset_cache(squeeze);
- cmap_cache(map);
-
- if (sflag)
- for (lastch = OOBCH; (ch = getwchar()) != WEOF;) {
- if (!Cflag || iswrune(ch))
- ch = cmap_lookup(map, ch);
- if (lastch != ch || !cset_in(squeeze, ch)) {
- lastch = ch;
- (void)putwchar(ch);
- }
- }
- else
- while ((ch = getwchar()) != WEOF) {
- if (!Cflag || iswrune(ch))
- ch = cmap_lookup(map, ch);
- (void)putwchar(ch);
- }
- if (ferror(stdin))
- err(1, NULL);
- exit (0);
-}
-
-static struct cset *
-setup(char *arg, STR *str, int cflag, int Cflag)
-{
- struct cset *cs;
-
- cs = cset_alloc();
- if (cs == NULL)
- err(1, NULL);
- str->str = arg;
- while (next(str))
- cset_add(cs, str->lastch);
- if (Cflag)
- cset_addclass(cs, wctype("rune"), true);
- if (cflag || Cflag)
- cset_invert(cs);
- cset_cache(cs);
- return (cs);
-}
-
-int
-charcoll(const void *a, const void *b)
-{
- static char sa[2], sb[2];
-
- sa[0] = *(const int *)a;
- sb[0] = *(const int *)b;
- return (strcoll(sa, sb));
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "%s\n%s\n%s\n%s\n",
- "usage: tr [-Ccsu] string1 string2",
- " tr [-Ccu] -d string1",
- " tr [-Ccu] -s string1",
- " tr [-Ccu] -ds string1 string2");
- exit(1);
-}
diff --git a/usr.bin/true/Makefile b/usr.bin/true/Makefile
deleted file mode 100644
index 028a6ca..0000000
--- a/usr.bin/true/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/9/93
-# $FreeBSD$
-
-PROG= true
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/true/true.1 b/usr.bin/true/true.1
deleted file mode 100644
index 58d3a02..0000000
--- a/usr.bin/true/true.1
+++ /dev/null
@@ -1,67 +0,0 @@
-.\" Copyright (c) 1983, 1985, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)true.1 8.1 (Berkeley) 6/9/93
-.\" $FreeBSD$
-.\"
-.Dd June 9, 1993
-.Dt TRUE 1
-.Os
-.Sh NAME
-.Nm true
-.Nd return true value
-.Sh SYNOPSIS
-.Nm
-.Sh DESCRIPTION
-The
-.Nm
-utility always returns with an exit code of zero.
-.Pp
-Some shells may provide a builtin
-.Nm
-command which is identical to this utility.
-Consult the
-.Xr builtin 1
-manual page.
-.Sh SEE ALSO
-.Xr builtin 1 ,
-.Xr csh 1 ,
-.Xr false 1 ,
-.Xr sh 1
-.Sh STANDARDS
-The
-.Nm
-utility is expected to be
-.St -p1003.2
-compatible.
diff --git a/usr.bin/true/true.c b/usr.bin/true/true.c
deleted file mode 100644
index 8e2f255..0000000
--- a/usr.bin/true/true.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1988, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static const char sccsid[] = "@(#)true.c 8.1 (Berkeley) 6/9/93";
-#endif /* not lint */
-
-int
-main(void)
-{
- return 0;
-}
diff --git a/usr.bin/truncate/Makefile b/usr.bin/truncate/Makefile
deleted file mode 100644
index 4752c5c..0000000
--- a/usr.bin/truncate/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-PROG= truncate
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/truncate/truncate.1 b/usr.bin/truncate/truncate.1
deleted file mode 100644
index 827097c..0000000
--- a/usr.bin/truncate/truncate.1
+++ /dev/null
@@ -1,153 +0,0 @@
-.\"
-.\" Copyright (c) 2000 Sheldon Hearn <sheldonh@FreeBSD.org>.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd December 19, 2006
-.Dt TRUNCATE 1
-.Os
-.Sh NAME
-.Nm truncate
-.Nd truncate or extend the length of files
-.Sh SYNOPSIS
-.Nm
-.Op Fl c
-.Bk -words
-.Fl s Xo
-.Sm off
-.Op Cm + | -
-.Ar size
-.Op Cm K | k | M | m | G | g | T | t
-.Sm on
-.Xc
-.Ek
-.Ar
-.Nm
-.Op Fl c
-.Bk -words
-.Fl r Ar rfile
-.Ek
-.Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility adjusts the length of each regular file given on the command-line.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl c
-Do not create files if they do not exist.
-The
-.Nm
-utility does not treat this as an error.
-No error messages are displayed
-and the exit value is not affected.
-.It Fl r Ar rfile
-Truncate or extend files to the length of the file
-.Ar rfile .
-.It Fl s Xo
-.Sm off
-.Op Cm + | -
-.Ar size
-.Op Cm K | k | M | m | G | g | T | t
-.Sm on
-.Xc
-If the
-.Ar size
-argument is preceded by a plus sign
-.Pq Cm + ,
-files will be extended by this number of bytes.
-If the
-.Ar size
-argument is preceded by a dash
-.Pq Cm - ,
-file lengths will be reduced by no more than this number of bytes,
-to a minimum length of zero bytes.
-Otherwise, the
-.Ar size
-argument specifies an absolute length to which all files
-should be extended or reduced as appropriate.
-.Pp
-The
-.Ar size
-argument may be suffixed with one of
-.Cm K ,
-.Cm M ,
-.Cm G
-or
-.Cm T
-(either upper or lower case) to indicate a multiple of
-Kilobytes, Megabytes, Gigabytes or Terabytes
-respectively.
-.El
-.Pp
-Exactly one of the
-.Fl r
-and
-.Fl s
-options must be specified.
-.Pp
-If a file is made smaller, its extra data is lost.
-If a file is made larger,
-it will be extended as if by writing bytes with the value zero.
-If the file does not exist,
-it is created unless the
-.Fl c
-option is specified.
-.Pp
-Note that,
-while truncating a file causes space on disk to be freed,
-extending a file does not cause space to be allocated.
-To extend a file and actually allocate the space,
-it is necessary to explicitly write data to it,
-using (for example) the shell's
-.Ql >>
-redirection syntax, or
-.Xr dd 1 .
-.Sh EXIT STATUS
-.Ex -std
-If the operation fails for an argument,
-.Nm
-will issue a diagnostic
-and continue processing the remaining arguments.
-.Sh SEE ALSO
-.Xr dd 1 ,
-.Xr touch 1 ,
-.Xr truncate 2
-.Sh STANDARDS
-The
-.Nm
-utility conforms to no known standards.
-.Sh HISTORY
-The
-.Nm
-utility first appeared in
-.Fx 4.2 .
-.Sh AUTHORS
-The
-.Nm
-utility was written by
-.An Sheldon Hearn
-.Aq sheldonh@starjuice.net .
diff --git a/usr.bin/truncate/truncate.c b/usr.bin/truncate/truncate.c
deleted file mode 100644
index ed5b6bf..0000000
--- a/usr.bin/truncate/truncate.c
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright (c) 2000 Sheldon Hearn <sheldonh@FreeBSD.org>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- */
-
-#ifndef lint
-static const char rcsid[] =
- "$FreeBSD$";
-#endif
-
-#include <sys/stat.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-static int parselength(char *, off_t *);
-static void usage(void);
-
-static int no_create;
-static int do_relative;
-static int do_refer;
-static int got_size;
-
-int
-main(int argc, char **argv)
-{
- struct stat sb;
- mode_t omode;
- off_t oflow, rsize, sz, tsize;
- int ch, error, fd, oflags;
- char *fname, *rname;
-
- fd = -1;
- rsize = tsize = 0;
- error = 0;
- rname = NULL;
- while ((ch = getopt(argc, argv, "cr:s:")) != -1)
- switch (ch) {
- case 'c':
- no_create = 1;
- break;
- case 'r':
- do_refer = 1;
- rname = optarg;
- break;
- case 's':
- if (parselength(optarg, &sz) == -1)
- errx(EXIT_FAILURE,
- "invalid size argument `%s'", optarg);
- if (*optarg == '+' || *optarg == '-')
- do_relative = 1;
- got_size = 1;
- break;
- default:
- usage();
- /* NOTREACHED */
- }
-
- argv += optind;
- argc -= optind;
-
- /*
- * Exactly one of do_refer or got_size must be specified. Since
- * do_relative implies got_size, do_relative and do_refer are
- * also mutually exclusive. See usage() for allowed invocations.
- */
- if (do_refer + got_size != 1 || argc < 1)
- usage();
- if (do_refer) {
- if (stat(rname, &sb) == -1)
- err(EXIT_FAILURE, "%s", rname);
- tsize = sb.st_size;
- } else if (do_relative)
- rsize = sz;
- else
- tsize = sz;
-
- if (no_create)
- oflags = O_WRONLY;
- else
- oflags = O_WRONLY | O_CREAT;
- omode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
-
- while ((fname = *argv++) != NULL) {
- if (fd != -1)
- close(fd);
- if ((fd = open(fname, oflags, omode)) == -1) {
- if (errno != ENOENT) {
- warn("%s", fname);
- error++;
- }
- continue;
- }
- if (do_relative) {
- if (fstat(fd, &sb) == -1) {
- warn("%s", fname);
- error++;
- continue;
- }
- oflow = sb.st_size + rsize;
- if (oflow < (sb.st_size + rsize)) {
- errno = EFBIG;
- warn("%s", fname);
- error++;
- continue;
- }
- tsize = oflow;
- }
- if (tsize < 0)
- tsize = 0;
-
- if (ftruncate(fd, tsize) == -1) {
- warn("%s", fname);
- error++;
- continue;
- }
- }
- if (fd != -1)
- close(fd);
-
- return error ? EXIT_FAILURE : EXIT_SUCCESS;
-}
-
-/*
- * Return the numeric value of a string given in the form [+-][0-9]+[GMKT]
- * or -1 on format error or overflow.
- */
-static int
-parselength(char *ls, off_t *sz)
-{
- off_t length, oflow;
- int lsign;
-
- length = 0;
- lsign = 1;
-
- switch (*ls) {
- case '-':
- lsign = -1;
- case '+':
- ls++;
- }
-
-#define ASSIGN_CHK_OFLOW(x, y) if (x < y) return -1; y = x
- /*
- * Calculate the value of the decimal digit string, failing
- * on overflow.
- */
- while (isdigit(*ls)) {
- oflow = length * 10 + *ls++ - '0';
- ASSIGN_CHK_OFLOW(oflow, length);
- }
-
- switch (*ls) {
- case 'T':
- case 't':
- oflow = length * 1024;
- ASSIGN_CHK_OFLOW(oflow, length);
- case 'G':
- case 'g':
- oflow = length * 1024;
- ASSIGN_CHK_OFLOW(oflow, length);
- case 'M':
- case 'm':
- oflow = length * 1024;
- ASSIGN_CHK_OFLOW(oflow, length);
- case 'K':
- case 'k':
- if (ls[1] != '\0')
- return -1;
- oflow = length * 1024;
- ASSIGN_CHK_OFLOW(oflow, length);
- case '\0':
- break;
- default:
- return -1;
- }
-
- *sz = length * lsign;
- return 0;
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "%s\n%s\n",
- "usage: truncate [-c] -s [+|-]size[K|k|M|m|G|g|T|t] file ...",
- " truncate [-c] -r rfile file ...");
- exit(EXIT_FAILURE);
-}
diff --git a/usr.bin/truss/Makefile b/usr.bin/truss/Makefile
deleted file mode 100644
index 104cd96..0000000
--- a/usr.bin/truss/Makefile
+++ /dev/null
@@ -1,57 +0,0 @@
-# $FreeBSD$
-
-WARNS?= 6
-NO_WERROR=
-PROG= truss
-SRCS= main.c setup.c syscalls.c syscalls.h ioctl.c ${MACHINE_ARCH}-fbsd.c
-
-CFLAGS+= -I${.CURDIR} -I.
-CLEANFILES= syscalls.master syscalls.h ioctl.c
-
-.SUFFIXES: .master
-
-syscalls.master: ${.CURDIR}/../../sys/kern/syscalls.master
- cat ${.ALLSRC} > syscalls.master
-
-syscalls.h: syscalls.master
- /bin/sh ${.CURDIR}/../../sys/kern/makesyscalls.sh syscalls.master \
- ${.CURDIR}/i386.conf
-
-ioctl.c: ${.CURDIR}/../kdump/mkioctls
- sh ${.CURDIR}/../kdump/mkioctls ${DESTDIR}/usr/include > ${.TARGET}
-
-.if ${MACHINE_ARCH} == "i386"
-SRCS+= i386-linux.c linux_syscalls.h
-CLEANFILES+=i386l-syscalls.master linux_syscalls.h
-
-i386l-syscalls.master: ${.CURDIR}/../../sys/i386/linux/syscalls.master
- cat ${.ALLSRC} > ${.TARGET}
-
-linux_syscalls.h: i386l-syscalls.master
- /bin/sh ${.CURDIR}/../../sys/kern/makesyscalls.sh ${.ALLSRC} \
- ${.CURDIR}/i386linux.conf
-.endif
-
-.if ${MACHINE_ARCH} == "amd64"
-SRCS+= amd64-linux32.c linux32_syscalls.h
-CLEANFILES+=amd64l32-syscalls.master linux32_syscalls.h
-
-amd64l32-syscalls.master: ${.CURDIR}/../../sys/amd64/linux32/syscalls.master
- cat ${.ALLSRC} > ${.TARGET}
-
-linux32_syscalls.h: amd64l32-syscalls.master
- /bin/sh ${.CURDIR}/../../sys/kern/makesyscalls.sh ${.ALLSRC} \
- ${.CURDIR}/amd64linux32.conf
-
-SRCS+= amd64-fbsd32.c freebsd32_syscalls.h
-CLEANFILES+=fbsd32-syscalls.master freebsd32_syscalls.h
-
-fbsd32-syscalls.master: ${.CURDIR}/../../sys/compat/freebsd32/syscalls.master
- cat ${.ALLSRC} > ${.TARGET}
-
-freebsd32_syscalls.h: fbsd32-syscalls.master
- /bin/sh ${.CURDIR}/../../sys/kern/makesyscalls.sh ${.ALLSRC} \
- ${.CURDIR}/fbsd32.conf
-.endif
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/truss/amd64-fbsd.c b/usr.bin/truss/amd64-fbsd.c
deleted file mode 100644
index 3a632d6..0000000
--- a/usr.bin/truss/amd64-fbsd.c
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * Copryight 1997 Sean Eric Fagan
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Sean Eric Fagan
- * 4. Neither the name of the author may be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-/*
- * FreeBSD/amd64-specific system call handling. This is probably the most
- * complex part of the entire truss program, although I've got lots of
- * it handled relatively cleanly now. The system call names are generated
- * automatically, thanks to /usr/src/sys/kern/syscalls.master. The
- * names used for the various structures are confusing, I sadly admit.
- */
-
-#include <sys/types.h>
-#include <sys/ptrace.h>
-#include <sys/syscall.h>
-
-#include <machine/reg.h>
-#include <machine/psl.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "truss.h"
-#include "syscall.h"
-#include "extern.h"
-
-static int cpid = -1;
-
-#include "syscalls.h"
-
-static int nsyscalls = sizeof(syscallnames) / sizeof(syscallnames[0]);
-
-/*
- * This is what this particular file uses to keep track of a system call.
- * It is probably not quite sufficient -- I can probably use the same
- * structure for the various syscall personalities, and I also probably
- * need to nest system calls (for signal handlers).
- *
- * 'struct syscall' describes the system call; it may be NULL, however,
- * if we don't know about this particular system call yet.
- */
-static struct freebsd_syscall {
- struct syscall *sc;
- const char *name;
- int number;
- unsigned long *args;
- int nargs; /* number of arguments -- *not* number of words! */
- char **s_args; /* the printable arguments */
-} fsc;
-
-/* Clear up and free parts of the fsc structure. */
-static __inline void
-clear_fsc(void) {
- if (fsc.args) {
- free(fsc.args);
- }
- if (fsc.s_args) {
- int i;
- for (i = 0; i < fsc.nargs; i++)
- if (fsc.s_args[i])
- free(fsc.s_args[i]);
- free(fsc.s_args);
- }
- memset(&fsc, 0, sizeof(fsc));
-}
-
-/*
- * Called when a process has entered a system call. nargs is the
- * number of words, not number of arguments (a necessary distinction
- * in some cases). Note that if the STOPEVENT() code in amd64/amd64/trap.c
- * is ever changed these functions need to keep up.
- */
-
-void
-amd64_syscall_entry(struct trussinfo *trussinfo, int nargs) {
- struct reg regs;
- int syscall_num;
- int i, reg;
- struct syscall *sc;
-
- cpid = trussinfo->curthread->tid;
-
- clear_fsc();
- if (ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0) < 0)
- {
- fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
- return;
- }
-
- /*
- * FreeBSD has two special kinds of system call redirctions --
- * SYS_syscall, and SYS___syscall. The former is the old syscall()
- * routine, basicly; the latter is for quad-aligned arguments.
- */
- reg = 0;
- syscall_num = regs.r_rax;
- switch (syscall_num) {
- case SYS_syscall:
- case SYS___syscall:
- syscall_num = regs.r_rdi;
- reg++;
- break;
- }
-
- fsc.number = syscall_num;
- fsc.name =
- (syscall_num < 0 || syscall_num > nsyscalls) ? NULL : syscallnames[syscall_num];
- if (!fsc.name) {
- fprintf(trussinfo->outfile, "-- UNKNOWN SYSCALL %d --\n", syscall_num);
- }
-
- if (fsc.name && (trussinfo->flags & FOLLOWFORKS)
- && ((!strcmp(fsc.name, "fork")
- || !strcmp(fsc.name, "rfork")
- || !strcmp(fsc.name, "vfork"))))
- {
- trussinfo->curthread->in_fork = 1;
- }
-
- if (nargs == 0)
- return;
-
- fsc.args = malloc((1+nargs) * sizeof(unsigned long));
- for (i = 0; i < nargs && reg < 6; i++, reg++) {
- switch (reg) {
- case 0: fsc.args[i] = regs.r_rdi; break;
- case 1: fsc.args[i] = regs.r_rsi; break;
- case 2: fsc.args[i] = regs.r_rdx; break;
- case 3: fsc.args[i] = regs.r_rcx; break;
- case 4: fsc.args[i] = regs.r_r8; break;
- case 5: fsc.args[i] = regs.r_r9; break;
- }
- }
- if (nargs > i) {
- struct ptrace_io_desc iorequest;
- iorequest.piod_op = PIOD_READ_D;
- iorequest.piod_offs = (void *)(regs.r_rsp + sizeof(register_t));
- iorequest.piod_addr = &fsc.args[i];
- iorequest.piod_len = (nargs - i) * sizeof(register_t);
- ptrace(PT_IO, cpid, (caddr_t)&iorequest, 0);
- if (iorequest.piod_len == 0)
- return;
- }
-
- sc = get_syscall(fsc.name);
- if (sc) {
- fsc.nargs = sc->nargs;
- } else {
-#if DEBUG
- fprintf(trussinfo->outfile, "unknown syscall %s -- setting args to %d\n",
- fsc.name, nargs);
-#endif
- fsc.nargs = nargs;
- }
-
- fsc.s_args = malloc((1+fsc.nargs) * sizeof(char*));
- memset(fsc.s_args, 0, fsc.nargs * sizeof(char*));
- fsc.sc = sc;
-
- /*
- * At this point, we set up the system call arguments.
- * We ignore any OUT ones, however -- those are arguments that
- * are set by the system call, and so are probably meaningless
- * now. This doesn't currently support arguments that are
- * passed in *and* out, however.
- */
-
- if (fsc.name) {
-
-#if DEBUG
- fprintf(stderr, "syscall %s(", fsc.name);
-#endif
- for (i = 0; i < fsc.nargs; i++) {
-#if DEBUG
- fprintf(stderr, "0x%lx%s",
- sc
- ? fsc.args[sc->args[i].offset]
- : fsc.args[i],
- i < (fsc.nargs - 1) ? "," : "");
-#endif
- if (sc && !(sc->args[i].type & OUT)) {
- fsc.s_args[i] = print_arg(&sc->args[i], fsc.args, 0, trussinfo);
- }
- }
-#if DEBUG
- fprintf(stderr, ")\n");
-#endif
- }
-
-#if DEBUG
- fprintf(trussinfo->outfile, "\n");
-#endif
-
- if (fsc.name != NULL &&
- (!strcmp(fsc.name, "execve") || !strcmp(fsc.name, "exit"))) {
-
- /* XXX
- * This could be done in a more general
- * manner but it still wouldn't be very pretty.
- */
- if (!strcmp(fsc.name, "execve")) {
- if ((trussinfo->flags & EXECVEARGS) == 0)
- if (fsc.s_args[1]) {
- free(fsc.s_args[1]);
- fsc.s_args[1] = NULL;
- }
- if ((trussinfo->flags & EXECVEENVS) == 0)
- if (fsc.s_args[2]) {
- free(fsc.s_args[2]);
- fsc.s_args[2] = NULL;
- }
- }
-
- }
-
- return;
-}
-
-/*
- * And when the system call is done, we handle it here.
- * Currently, no attempt is made to ensure that the system calls
- * match -- this needs to be fixed (and is, in fact, why S_SCX includes
- * the sytem call number instead of, say, an error status).
- */
-
-long
-amd64_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
-{
- struct reg regs;
- long retval;
- int i;
- int errorp;
- struct syscall *sc;
-
- if (fsc.name == NULL)
- return (-1);
-
- cpid = trussinfo->curthread->tid;
-
- if (ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0) < 0)
- {
- fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
- return (-1);
- }
- retval = regs.r_rax;
- errorp = !!(regs.r_rflags & PSL_C);
-
- /*
- * This code, while simpler than the initial versions I used, could
- * stand some significant cleaning.
- */
-
- sc = fsc.sc;
- if (!sc) {
- for (i = 0; i < fsc.nargs; i++)
- asprintf(&fsc.s_args[i], "0x%lx", fsc.args[i]);
- } else {
- /*
- * Here, we only look for arguments that have OUT masked in --
- * otherwise, they were handled in the syscall_entry function.
- */
- for (i = 0; i < sc->nargs; i++) {
- char *temp;
- if (sc->args[i].type & OUT) {
- /*
- * If an error occurred, than don't bothe getting the data;
- * it may not be valid.
- */
- if (errorp)
- asprintf(&temp, "0x%lx", fsc.args[sc->args[i].offset]);
- else
- temp = print_arg(&sc->args[i], fsc.args, retval, trussinfo);
- fsc.s_args[i] = temp;
- }
- }
- }
-
- if (fsc.name != NULL &&
- (!strcmp(fsc.name, "execve") || !strcmp(fsc.name, "exit"))) {
- trussinfo->curthread->in_syscall = 1;
- }
-
- /*
- * It would probably be a good idea to merge the error handling,
- * but that complicates things considerably.
- */
-
- print_syscall_ret(trussinfo, fsc.name, fsc.nargs, fsc.s_args, errorp, retval);
- clear_fsc();
-
- return (retval);
-}
diff --git a/usr.bin/truss/amd64-fbsd32.c b/usr.bin/truss/amd64-fbsd32.c
deleted file mode 100644
index 64157e3..0000000
--- a/usr.bin/truss/amd64-fbsd32.c
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- * Copryight 1997 Sean Eric Fagan
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Sean Eric Fagan
- * 4. Neither the name of the author may be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-/*
- * FreeBSD/i386-specific system call handling. This is probably the most
- * complex part of the entire truss program, although I've got lots of
- * it handled relatively cleanly now. The system call names are generated
- * automatically, thanks to /usr/src/sys/kern/syscalls.master. The
- * names used for the various structures are confusing, I sadly admit.
- */
-
-#include <sys/types.h>
-#include <sys/syscall.h>
-#include <sys/ptrace.h>
-
-#include <machine/reg.h>
-#include <machine/psl.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "truss.h"
-#include "syscall.h"
-#include "extern.h"
-
-static int cpid = -1;
-
-#include "freebsd32_syscalls.h"
-
-static int nsyscalls = sizeof(freebsd32_syscallnames) /
- sizeof(freebsd32_syscallnames[0]);
-
-/*
- * This is what this particular file uses to keep track of a system call.
- * It is probably not quite sufficient -- I can probably use the same
- * structure for the various syscall personalities, and I also probably
- * need to nest system calls (for signal handlers).
- *
- * 'struct syscall' describes the system call; it may be NULL, however,
- * if we don't know about this particular system call yet.
- */
-static struct freebsd32_syscall {
- struct syscall *sc;
- const char *name;
- int number;
- unsigned long *args;
- unsigned int *args32;
- int nargs; /* number of arguments -- *not* number of words! */
- char **s_args; /* the printable arguments */
-} fsc;
-
-/* Clear up and free parts of the fsc structure. */
-static __inline void
-clear_fsc(void) {
- if (fsc.args) {
- free(fsc.args);
- }
- if (fsc.args32) {
- free(fsc.args32);
- }
- if (fsc.s_args) {
- int i;
- for (i = 0; i < fsc.nargs; i++)
- if (fsc.s_args[i])
- free(fsc.s_args[i]);
- free(fsc.s_args);
- }
- memset(&fsc, 0, sizeof(fsc));
-}
-
-/*
- * Called when a process has entered a system call. nargs is the
- * number of words, not number of arguments (a necessary distinction
- * in some cases). Note that if the STOPEVENT() code in i386/i386/trap.c
- * is ever changed these functions need to keep up.
- */
-
-void
-amd64_fbsd32_syscall_entry(struct trussinfo *trussinfo, int nargs) {
- struct reg regs;
- int syscall_num;
- int i;
- unsigned long parm_offset;
- struct syscall *sc = NULL;
- struct ptrace_io_desc iorequest;
- cpid = trussinfo->curthread->tid;
-
- clear_fsc();
-
- if (ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0) < 0)
- {
- fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
- return;
- }
- parm_offset = regs.r_rsp + sizeof(int);
-
- /*
- * FreeBSD has two special kinds of system call redirctions --
- * SYS_syscall, and SYS___syscall. The former is the old syscall()
- * routine, basicly; the latter is for quad-aligned arguments.
- */
- syscall_num = regs.r_rax;
- switch (syscall_num) {
- case SYS_syscall:
- syscall_num = ptrace(PT_READ_D, cpid, (caddr_t)parm_offset, 0);
- parm_offset += sizeof(int);
- break;
- case SYS___syscall:
- syscall_num = ptrace(PT_READ_D, cpid, (caddr_t)parm_offset, 0);
- parm_offset += sizeof(quad_t);
- break;
- }
-
- fsc.number = syscall_num;
- fsc.name =
- (syscall_num < 0 || syscall_num > nsyscalls) ? NULL :
- freebsd32_syscallnames[syscall_num];
- if (!fsc.name) {
- fprintf(trussinfo->outfile, "-- UNKNOWN SYSCALL %d --\n", syscall_num);
- }
-
- if (fsc.name && (trussinfo->flags & FOLLOWFORKS)
- && ((!strcmp(fsc.name, "fork")
- || !strcmp(fsc.name, "rfork")
- || !strcmp(fsc.name, "vfork"))))
- {
- trussinfo->curthread->in_fork = 1;
- }
-
- if (nargs == 0)
- return;
-
- fsc.args32 = malloc((1+nargs) * sizeof(unsigned int));
- iorequest.piod_op = PIOD_READ_D;
- iorequest.piod_offs = (void *)parm_offset;
- iorequest.piod_addr = fsc.args32;
- iorequest.piod_len = (1+nargs) * sizeof(unsigned int);
- ptrace(PT_IO, cpid, (caddr_t)&iorequest, 0);
- if (iorequest.piod_len == 0)
- return;
-
- fsc.args = malloc((1+nargs) * sizeof(unsigned long));
- for (i = 0; i < nargs + 1; i++)
- fsc.args[i] = fsc.args32[i];
-
- if (fsc.name)
- sc = get_syscall(fsc.name);
- if (sc) {
- fsc.nargs = sc->nargs;
- } else {
-#if DEBUG
- fprintf(trussinfo->outfile, "unknown syscall %s -- setting args to %d\n",
- fsc.name, nargs);
-#endif
- fsc.nargs = nargs;
- }
-
- fsc.s_args = malloc((1+fsc.nargs) * sizeof(char*));
- memset(fsc.s_args, 0, fsc.nargs * sizeof(char*));
- fsc.sc = sc;
-
- /*
- * At this point, we set up the system call arguments.
- * We ignore any OUT ones, however -- those are arguments that
- * are set by the system call, and so are probably meaningless
- * now. This doesn't currently support arguments that are
- * passed in *and* out, however.
- */
-
- if (fsc.name) {
-
-#if DEBUG
- fprintf(stderr, "syscall %s(", fsc.name);
-#endif
- for (i = 0; i < fsc.nargs; i++) {
-#if DEBUG
- fprintf(stderr, "0x%x%s",
- sc
- ? fsc.args[sc->args[i].offset]
- : fsc.args[i],
- i < (fsc.nargs - 1) ? "," : "");
-#endif
- if (sc && !(sc->args[i].type & OUT)) {
- fsc.s_args[i] = print_arg(&sc->args[i], fsc.args, 0, trussinfo);
- }
- }
-#if DEBUG
- fprintf(stderr, ")\n");
-#endif
- }
-
-#if DEBUG
- fprintf(trussinfo->outfile, "\n");
-#endif
-
- if (fsc.name != NULL &&
- (!strcmp(fsc.name, "freebsd32_execve") || !strcmp(fsc.name, "exit"))) {
-
- /* XXX
- * This could be done in a more general
- * manner but it still wouldn't be very pretty.
- */
- if (!strcmp(fsc.name, "freebsd32_execve")) {
- if ((trussinfo->flags & EXECVEARGS) == 0)
- if (fsc.s_args[1]) {
- free(fsc.s_args[1]);
- fsc.s_args[1] = NULL;
- }
- if ((trussinfo->flags & EXECVEENVS) == 0)
- if (fsc.s_args[2]) {
- free(fsc.s_args[2]);
- fsc.s_args[2] = NULL;
- }
- }
-
- }
-
- return;
-}
-
-/*
- * And when the system call is done, we handle it here.
- * Currently, no attempt is made to ensure that the system calls
- * match -- this needs to be fixed (and is, in fact, why S_SCX includes
- * the sytem call number instead of, say, an error status).
- */
-
-long
-amd64_fbsd32_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
-{
- struct reg regs;
- long retval;
- int i;
- int errorp;
- struct syscall *sc;
-
- if (fsc.name == NULL)
- return (-1);
- cpid = trussinfo->curthread->tid;
-
- if (ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0) < 0)
- {
- fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
- return (-1);
- }
-
- retval = regs.r_rax;
- errorp = !!(regs.r_rflags & PSL_C);
-
- /*
- * This code, while simpler than the initial versions I used, could
- * stand some significant cleaning.
- */
-
- sc = fsc.sc;
- if (!sc) {
- for (i = 0; i < fsc.nargs; i++)
- asprintf(&fsc.s_args[i], "0x%lx", fsc.args[i]);
- } else {
- /*
- * Here, we only look for arguments that have OUT masked in --
- * otherwise, they were handled in the syscall_entry function.
- */
- for (i = 0; i < sc->nargs; i++) {
- char *temp;
- if (sc->args[i].type & OUT) {
- /*
- * If an error occurred, then don't bother getting the data;
- * it may not be valid.
- */
- if (errorp)
- asprintf(&temp, "0x%lx", fsc.args[sc->args[i].offset]);
- else
- temp = print_arg(&sc->args[i], fsc.args, retval, trussinfo);
- fsc.s_args[i] = temp;
- }
- }
- }
-
- /*
- * The pipe syscall returns its fds in two registers and has assembly glue
- * to provide the libc API, so it cannot be handled like regular syscalls.
- * The nargs check is so we don't have to do yet another strcmp on every
- * syscall.
- */
- if (!errorp && fsc.nargs == 0 && fsc.name && strcmp(fsc.name, "pipe") == 0) {
- fsc.nargs = 1;
- fsc.s_args = malloc((1+fsc.nargs) * sizeof(char*));
- asprintf(&fsc.s_args[0], "[%d,%d]", (int)retval, (int)regs.r_rdx);
- retval = 0;
- }
-
- if (fsc.name != NULL &&
- (!strcmp(fsc.name, "freebsd32_execve") || !strcmp(fsc.name, "exit"))) {
- trussinfo->curthread->in_syscall = 1;
- }
-
- /*
- * It would probably be a good idea to merge the error handling,
- * but that complicates things considerably.
- */
-
- print_syscall_ret(trussinfo, fsc.name, fsc.nargs, fsc.s_args, errorp, retval);
- clear_fsc();
-
- return (retval);
-}
diff --git a/usr.bin/truss/amd64-linux32.c b/usr.bin/truss/amd64-linux32.c
deleted file mode 100644
index 163b141..0000000
--- a/usr.bin/truss/amd64-linux32.c
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * Copryight 1997 Sean Eric Fagan
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Sean Eric Fagan
- * 4. Neither the name of the author may be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-/*
- * Linux/i386-specific system call handling. Given how much of this code
- * is taken from the freebsd equivalent, I can probably put even more of
- * it in support routines that can be used by any personality support.
- */
-
-#include <sys/types.h>
-#include <sys/ptrace.h>
-
-#include <machine/reg.h>
-#include <machine/psl.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "truss.h"
-#include "syscall.h"
-#include "extern.h"
-
-static int cpid = -1;
-
-#include "linux32_syscalls.h"
-
-static int nsyscalls =
- sizeof(linux32_syscallnames) / sizeof(linux32_syscallnames[0]);
-
-/*
- * This is what this particular file uses to keep track of a system call.
- * It is probably not quite sufficient -- I can probably use the same
- * structure for the various syscall personalities, and I also probably
- * need to nest system calls (for signal handlers).
- *
- * 'struct syscall' describes the system call; it may be NULL, however,
- * if we don't know about this particular system call yet.
- */
-static struct linux_syscall {
- struct syscall *sc;
- const char *name;
- int number;
- unsigned long args[5];
- int nargs; /* number of arguments -- *not* number of words! */
- char **s_args; /* the printable arguments */
-} fsc;
-
-/* Clear up and free parts of the fsc structure. */
-static __inline void
-clear_fsc(void) {
- if (fsc.s_args) {
- int i;
- for (i = 0; i < fsc.nargs; i++)
- if (fsc.s_args[i])
- free(fsc.s_args[i]);
- free(fsc.s_args);
- }
- memset(&fsc, 0, sizeof(fsc));
-}
-
-/*
- * Called when a process has entered a system call. nargs is the
- * number of words, not number of arguments (a necessary distinction
- * in some cases). Note that if the STOPEVENT() code in i386/i386/trap.c
- * is ever changed these functions need to keep up.
- */
-
-void
-amd64_linux32_syscall_entry(struct trussinfo *trussinfo, int nargs) {
- struct reg regs;
- int syscall_num;
- int i;
- struct syscall *sc;
-
- cpid = trussinfo->curthread->tid;
-
- clear_fsc();
-
- if (ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0) < 0)
- {
- fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
- return;
- }
- syscall_num = regs.r_rax;
-
- fsc.number = syscall_num;
- fsc.name =
- (syscall_num < 0 || syscall_num > nsyscalls) ? NULL : linux32_syscallnames[syscall_num];
- if (!fsc.name) {
- fprintf(trussinfo->outfile, "-- UNKNOWN SYSCALL %d --\n", syscall_num);
- }
-
- if (fsc.name && (trussinfo->flags & FOLLOWFORKS)
- && ((!strcmp(fsc.name, "linux_fork")
- || !strcmp(fsc.name, "linux_vfork"))))
- {
- trussinfo->curthread->in_fork = 1;
- }
-
- if (nargs == 0)
- return;
-
- /*
- * Linux passes syscall arguments in registers, not
- * on the stack. Fortunately, we've got access to the
- * register set. Note that we don't bother checking the
- * number of arguments. And what does linux do for syscalls
- * that have more than five arguments?
- */
-
- fsc.args[0] = regs.r_rbx;
- fsc.args[1] = regs.r_rcx;
- fsc.args[2] = regs.r_rdx;
- fsc.args[3] = regs.r_rsi;
- fsc.args[4] = regs.r_rdi;
-
- sc = get_syscall(fsc.name);
- if (sc) {
- fsc.nargs = sc->nargs;
- } else {
-#if DEBUG
- fprintf(trussinfo->outfile, "unknown syscall %s -- setting args to %d\n",
- fsc.name, nargs);
-#endif
- fsc.nargs = nargs;
- }
-
- fsc.s_args = malloc((1+fsc.nargs) * sizeof(char*));
- memset(fsc.s_args, 0, fsc.nargs * sizeof(char*));
- fsc.sc = sc;
-
- /*
- * At this point, we set up the system call arguments.
- * We ignore any OUT ones, however -- those are arguments that
- * are set by the system call, and so are probably meaningless
- * now. This doesn't currently support arguments that are
- * passed in *and* out, however.
- */
-
- if (fsc.name) {
-
-#if DEBUG
- fprintf(stderr, "syscall %s(", fsc.name);
-#endif
- for (i = 0; i < fsc.nargs; i++) {
-#if DEBUG
- fprintf(stderr, "0x%x%s",
- sc
- ? fsc.args[sc->args[i].offset]
- : fsc.args[i],
- i < (fsc.nargs - 1) ? "," : "");
-#endif
- if (sc && !(sc->args[i].type & OUT)) {
- fsc.s_args[i] = print_arg(&sc->args[i], fsc.args, 0, trussinfo);
- }
- }
-#if DEBUG
- fprintf(stderr, ")\n");
-#endif
- }
-
-#if DEBUG
- fprintf(trussinfo->outfile, "\n");
-#endif
-
- if (fsc.name != NULL &&
- (!strcmp(fsc.name, "linux_execve") || !strcmp(fsc.name, "exit"))) {
-
- /* XXX
- * This could be done in a more general
- * manner but it still wouldn't be very pretty.
- */
- if (!strcmp(fsc.name, "linux_execve")) {
- if ((trussinfo->flags & EXECVEARGS) == 0)
- if (fsc.s_args[1]) {
- free(fsc.s_args[1]);
- fsc.s_args[1] = NULL;
- }
- if ((trussinfo->flags & EXECVEENVS) == 0)
- if (fsc.s_args[2]) {
- free(fsc.s_args[2]);
- fsc.s_args[2] = NULL;
- }
- }
- }
-
- return;
-}
-
-/*
- * Linux syscalls return negative errno's, we do positive and map them
- */
-const int bsd_to_linux_errno[] = {
- -0, -1, -2, -3, -4, -5, -6, -7, -8, -9,
- -10, -35, -12, -13, -14, -15, -16, -17, -18, -19,
- -20, -21, -22, -23, -24, -25, -26, -27, -28, -29,
- -30, -31, -32, -33, -34, -11,-115,-114, -88, -89,
- -90, -91, -92, -93, -94, -95, -96, -97, -98, -99,
- -100,-101,-102,-103,-104,-105,-106,-107,-108,-109,
- -110,-111, -40, -36,-112,-113, -39, -11, -87,-122,
- -116, -66, -6, -6, -6, -6, -6, -37, -38, -9,
- -6,
-};
-
-long
-amd64_linux32_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
-{
- struct reg regs;
- long retval;
- int i;
- int errorp;
- struct syscall *sc;
-
- if (fsc.name == NULL)
- return (-1);
-
- cpid = trussinfo->curthread->tid;
- if (ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0) < 0)
- {
- fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
- return (-1);
- }
-
- retval = regs.r_rax;
- errorp = !!(regs.r_rflags & PSL_C);
-
- /*
- * This code, while simpler than the initial versions I used, could
- * stand some significant cleaning.
- */
-
- sc = fsc.sc;
- if (!sc) {
- for (i = 0; i < fsc.nargs; i++)
- asprintf(&fsc.s_args[i], "0x%lx", fsc.args[i]);
- } else {
- /*
- * Here, we only look for arguments that have OUT masked in --
- * otherwise, they were handled in the syscall_entry function.
- */
- for (i = 0; i < sc->nargs; i++) {
- char *temp;
- if (sc->args[i].type & OUT) {
- /*
- * If an error occurred, than don't bothe getting the data;
- * it may not be valid.
- */
- if (errorp)
- asprintf(&temp, "0x%lx", fsc.args[sc->args[i].offset]);
- else
- temp = print_arg(&sc->args[i], fsc.args, retval, trussinfo);
- fsc.s_args[i] = temp;
- }
- }
- }
-
- /*
- * It would probably be a good idea to merge the error handling,
- * but that complicates things considerably.
- */
- if (errorp) {
- for (i = 0; (size_t)i < sizeof(bsd_to_linux_errno) / sizeof(int); i++)
- if (retval == bsd_to_linux_errno[i])
- break;
- }
-
- if (fsc.name != NULL &&
- (!strcmp(fsc.name, "linux_execve") || !strcmp(fsc.name, "exit"))) {
- trussinfo->curthread->in_syscall = 1;
- }
-
- print_syscall_ret(trussinfo, fsc.name, fsc.nargs, fsc.s_args, errorp,
- errorp ? i : retval);
- clear_fsc();
-
- return (retval);
-}
diff --git a/usr.bin/truss/amd64linux32.conf b/usr.bin/truss/amd64linux32.conf
deleted file mode 100644
index 7f5e8bd..0000000
--- a/usr.bin/truss/amd64linux32.conf
+++ /dev/null
@@ -1,13 +0,0 @@
-# $FreeBSD$
-
-sysnames="linux32_syscalls.h"
-sysproto="/dev/null"
-sysproto_h="/dev/null"
-syshdr="/dev/null"
-sysmk="/dev/null"
-syssw="/dev/null"
-syshide="/dev/null"
-syscallprefix="SYS_"
-switchname="sysent"
-namesname="linux32_syscallnames"
-systrace="/dev/null"
diff --git a/usr.bin/truss/extern.h b/usr.bin/truss/extern.h
deleted file mode 100644
index 69f2319..0000000
--- a/usr.bin/truss/extern.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copryight 1997 Sean Eric Fagan
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Sean Eric Fagan
- * 4. Neither the name of the author may be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-extern int setup_and_wait(char **);
-extern int start_tracing(int);
-extern void restore_proc(int);
-extern void waitevent(struct trussinfo *);
-extern const char *ioctlname(register_t val);
-extern char *strsig(int sig);
-#ifdef __amd64__
-extern void amd64_syscall_entry(struct trussinfo *, int);
-extern long amd64_syscall_exit(struct trussinfo *, int);
-extern void amd64_linux32_syscall_entry(struct trussinfo *, int);
-extern long amd64_linux32_syscall_exit(struct trussinfo *, int);
-extern void amd64_fbsd32_syscall_entry(struct trussinfo *, int);
-extern long amd64_fbsd32_syscall_exit(struct trussinfo *, int);
-#endif
-#ifdef __i386__
-extern void i386_syscall_entry(struct trussinfo *, int);
-extern long i386_syscall_exit(struct trussinfo *, int);
-extern void i386_linux_syscall_entry(struct trussinfo *, int);
-extern long i386_linux_syscall_exit(struct trussinfo *, int);
-#endif
-#ifdef __ia64__
-extern void ia64_syscall_entry(struct trussinfo *, int);
-extern long ia64_syscall_exit(struct trussinfo *, int);
-#endif
-#ifdef __powerpc__
-extern void powerpc_syscall_entry(struct trussinfo *, int);
-extern long powerpc_syscall_exit(struct trussinfo *, int);
-#endif
-#ifdef __sparc64__
-extern void sparc64_syscall_entry(struct trussinfo *, int);
-extern long sparc64_syscall_exit(struct trussinfo *, int);
-#endif
-
diff --git a/usr.bin/truss/fbsd32.conf b/usr.bin/truss/fbsd32.conf
deleted file mode 100644
index 3323f11..0000000
--- a/usr.bin/truss/fbsd32.conf
+++ /dev/null
@@ -1,13 +0,0 @@
-# $FreeBSD$
-
-sysnames="freebsd32_syscalls.h"
-sysproto="/dev/null"
-sysproto_h="/dev/null"
-syshdr="/dev/null"
-sysmk="/dev/null"
-syssw="/dev/null"
-syshide="/dev/null"
-syscallprefix="SYS_"
-switchname="sysent"
-namesname="freebsd32_syscallnames"
-systrace="/dev/null"
diff --git a/usr.bin/truss/i386-fbsd.c b/usr.bin/truss/i386-fbsd.c
deleted file mode 100644
index 4f0eabb..0000000
--- a/usr.bin/truss/i386-fbsd.c
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- * Copryight 1997 Sean Eric Fagan
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Sean Eric Fagan
- * 4. Neither the name of the author may be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-/*
- * FreeBSD/i386-specific system call handling. This is probably the most
- * complex part of the entire truss program, although I've got lots of
- * it handled relatively cleanly now. The system call names are generated
- * automatically, thanks to /usr/src/sys/kern/syscalls.master. The
- * names used for the various structures are confusing, I sadly admit.
- */
-
-#include <sys/types.h>
-#include <sys/syscall.h>
-#include <sys/ptrace.h>
-
-#include <machine/reg.h>
-#include <machine/psl.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "truss.h"
-#include "syscall.h"
-#include "extern.h"
-
-static int cpid = -1;
-
-#include "syscalls.h"
-
-static int nsyscalls = sizeof(syscallnames) / sizeof(syscallnames[0]);
-
-/*
- * This is what this particular file uses to keep track of a system call.
- * It is probably not quite sufficient -- I can probably use the same
- * structure for the various syscall personalities, and I also probably
- * need to nest system calls (for signal handlers).
- *
- * 'struct syscall' describes the system call; it may be NULL, however,
- * if we don't know about this particular system call yet.
- */
-static struct freebsd_syscall {
- struct syscall *sc;
- const char *name;
- int number;
- unsigned long *args;
- int nargs; /* number of arguments -- *not* number of words! */
- char **s_args; /* the printable arguments */
-} fsc;
-
-/* Clear up and free parts of the fsc structure. */
-static __inline void
-clear_fsc(void) {
- if (fsc.args) {
- free(fsc.args);
- }
- if (fsc.s_args) {
- int i;
- for (i = 0; i < fsc.nargs; i++)
- if (fsc.s_args[i])
- free(fsc.s_args[i]);
- free(fsc.s_args);
- }
- memset(&fsc, 0, sizeof(fsc));
-}
-
-/*
- * Called when a process has entered a system call. nargs is the
- * number of words, not number of arguments (a necessary distinction
- * in some cases). Note that if the STOPEVENT() code in i386/i386/trap.c
- * is ever changed these functions need to keep up.
- */
-
-void
-i386_syscall_entry(struct trussinfo *trussinfo, int nargs) {
- struct reg regs;
- int syscall_num;
- int i;
- unsigned int parm_offset;
- struct syscall *sc = NULL;
- struct ptrace_io_desc iorequest;
- cpid = trussinfo->curthread->tid;
-
- clear_fsc();
-
- if (ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0) < 0)
- {
- fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
- return;
- }
- parm_offset = regs.r_esp + sizeof(int);
-
- /*
- * FreeBSD has two special kinds of system call redirctions --
- * SYS_syscall, and SYS___syscall. The former is the old syscall()
- * routine, basicly; the latter is for quad-aligned arguments.
- */
- syscall_num = regs.r_eax;
- switch (syscall_num) {
- case SYS_syscall:
- syscall_num = ptrace(PT_READ_D, cpid, (caddr_t)parm_offset, 0);
- parm_offset += sizeof(int);
- break;
- case SYS___syscall:
- syscall_num = ptrace(PT_READ_D, cpid, (caddr_t)parm_offset, 0);
- parm_offset += sizeof(quad_t);
- break;
- }
-
- fsc.number = syscall_num;
- fsc.name =
- (syscall_num < 0 || syscall_num > nsyscalls) ? NULL : syscallnames[syscall_num];
- if (!fsc.name) {
- fprintf(trussinfo->outfile, "-- UNKNOWN SYSCALL %d --\n", syscall_num);
- }
-
- if (fsc.name && (trussinfo->flags & FOLLOWFORKS)
- && ((!strcmp(fsc.name, "fork")
- || !strcmp(fsc.name, "rfork")
- || !strcmp(fsc.name, "vfork"))))
- {
- trussinfo->curthread->in_fork = 1;
- }
-
- if (nargs == 0)
- return;
-
- fsc.args = malloc((1+nargs) * sizeof(unsigned long));
- iorequest.piod_op = PIOD_READ_D;
- iorequest.piod_offs = (void *)parm_offset;
- iorequest.piod_addr = fsc.args;
- iorequest.piod_len = (1+nargs) * sizeof(unsigned long);
- ptrace(PT_IO, cpid, (caddr_t)&iorequest, 0);
- if (iorequest.piod_len == 0)
- return;
-
- if (fsc.name)
- sc = get_syscall(fsc.name);
- if (sc) {
- fsc.nargs = sc->nargs;
- } else {
-#if DEBUG
- fprintf(trussinfo->outfile, "unknown syscall %s -- setting args to %d\n",
- fsc.name, nargs);
-#endif
- fsc.nargs = nargs;
- }
-
- fsc.s_args = malloc((1+fsc.nargs) * sizeof(char*));
- memset(fsc.s_args, 0, fsc.nargs * sizeof(char*));
- fsc.sc = sc;
-
- /*
- * At this point, we set up the system call arguments.
- * We ignore any OUT ones, however -- those are arguments that
- * are set by the system call, and so are probably meaningless
- * now. This doesn't currently support arguments that are
- * passed in *and* out, however.
- */
-
- if (fsc.name) {
-
-#if DEBUG
- fprintf(stderr, "syscall %s(", fsc.name);
-#endif
- for (i = 0; i < fsc.nargs; i++) {
-#if DEBUG
- fprintf(stderr, "0x%x%s",
- sc
- ? fsc.args[sc->args[i].offset]
- : fsc.args[i],
- i < (fsc.nargs - 1) ? "," : "");
-#endif
- if (sc && !(sc->args[i].type & OUT)) {
- fsc.s_args[i] = print_arg(&sc->args[i], fsc.args, 0, trussinfo);
- }
- }
-#if DEBUG
- fprintf(stderr, ")\n");
-#endif
- }
-
-#if DEBUG
- fprintf(trussinfo->outfile, "\n");
-#endif
-
- if (fsc.name != NULL &&
- (!strcmp(fsc.name, "execve") || !strcmp(fsc.name, "exit"))) {
-
- /* XXX
- * This could be done in a more general
- * manner but it still wouldn't be very pretty.
- */
- if (!strcmp(fsc.name, "execve")) {
- if ((trussinfo->flags & EXECVEARGS) == 0)
- if (fsc.s_args[1]) {
- free(fsc.s_args[1]);
- fsc.s_args[1] = NULL;
- }
- if ((trussinfo->flags & EXECVEENVS) == 0)
- if (fsc.s_args[2]) {
- free(fsc.s_args[2]);
- fsc.s_args[2] = NULL;
- }
- }
-
- }
-
- return;
-}
-
-/*
- * And when the system call is done, we handle it here.
- * Currently, no attempt is made to ensure that the system calls
- * match -- this needs to be fixed (and is, in fact, why S_SCX includes
- * the sytem call number instead of, say, an error status).
- */
-
-long
-i386_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
-{
- struct reg regs;
- long retval;
- int i;
- int errorp;
- struct syscall *sc;
-
- if (fsc.name == NULL)
- return (-1);
- cpid = trussinfo->curthread->tid;
-
- if (ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0) < 0)
- {
- fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
- return (-1);
- }
-
- retval = regs.r_eax;
- errorp = !!(regs.r_eflags & PSL_C);
-
- /*
- * This code, while simpler than the initial versions I used, could
- * stand some significant cleaning.
- */
-
- sc = fsc.sc;
- if (!sc) {
- for (i = 0; i < fsc.nargs; i++)
- asprintf(&fsc.s_args[i], "0x%lx", fsc.args[i]);
- } else {
- /*
- * Here, we only look for arguments that have OUT masked in --
- * otherwise, they were handled in the syscall_entry function.
- */
- for (i = 0; i < sc->nargs; i++) {
- char *temp;
- if (sc->args[i].type & OUT) {
- /*
- * If an error occurred, then don't bother getting the data;
- * it may not be valid.
- */
- if (errorp)
- asprintf(&temp, "0x%lx", fsc.args[sc->args[i].offset]);
- else
- temp = print_arg(&sc->args[i], fsc.args, retval, trussinfo);
- fsc.s_args[i] = temp;
- }
- }
- }
-
- /*
- * The pipe syscall returns its fds in two registers and has assembly glue
- * to provide the libc API, so it cannot be handled like regular syscalls.
- * The nargs check is so we don't have to do yet another strcmp on every
- * syscall.
- */
- if (!errorp && fsc.nargs == 0 && fsc.name && strcmp(fsc.name, "pipe") == 0) {
- fsc.nargs = 1;
- fsc.s_args = malloc((1+fsc.nargs) * sizeof(char*));
- asprintf(&fsc.s_args[0], "[%d,%d]", (int)retval, regs.r_edx);
- retval = 0;
- }
-
- if (fsc.name != NULL &&
- (!strcmp(fsc.name, "execve") || !strcmp(fsc.name, "exit"))) {
- trussinfo->curthread->in_syscall = 1;
- }
-
- /*
- * It would probably be a good idea to merge the error handling,
- * but that complicates things considerably.
- */
-
- print_syscall_ret(trussinfo, fsc.name, fsc.nargs, fsc.s_args, errorp, retval);
- clear_fsc();
-
- return (retval);
-}
diff --git a/usr.bin/truss/i386-linux.c b/usr.bin/truss/i386-linux.c
deleted file mode 100644
index 1264439..0000000
--- a/usr.bin/truss/i386-linux.c
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * Copryight 1997 Sean Eric Fagan
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Sean Eric Fagan
- * 4. Neither the name of the author may be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-/*
- * Linux/i386-specific system call handling. Given how much of this code
- * is taken from the freebsd equivalent, I can probably put even more of
- * it in support routines that can be used by any personality support.
- */
-
-#include <sys/types.h>
-#include <sys/ptrace.h>
-
-#include <machine/reg.h>
-#include <machine/psl.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "truss.h"
-#include "syscall.h"
-#include "extern.h"
-
-static int cpid = -1;
-
-#include "linux_syscalls.h"
-
-static int nsyscalls =
- sizeof(linux_syscallnames) / sizeof(linux_syscallnames[0]);
-
-/*
- * This is what this particular file uses to keep track of a system call.
- * It is probably not quite sufficient -- I can probably use the same
- * structure for the various syscall personalities, and I also probably
- * need to nest system calls (for signal handlers).
- *
- * 'struct syscall' describes the system call; it may be NULL, however,
- * if we don't know about this particular system call yet.
- */
-static struct linux_syscall {
- struct syscall *sc;
- const char *name;
- int number;
- unsigned long args[5];
- int nargs; /* number of arguments -- *not* number of words! */
- char **s_args; /* the printable arguments */
-} fsc;
-
-/* Clear up and free parts of the fsc structure. */
-static __inline void
-clear_fsc(void) {
- if (fsc.s_args) {
- int i;
- for (i = 0; i < fsc.nargs; i++)
- if (fsc.s_args[i])
- free(fsc.s_args[i]);
- free(fsc.s_args);
- }
- memset(&fsc, 0, sizeof(fsc));
-}
-
-/*
- * Called when a process has entered a system call. nargs is the
- * number of words, not number of arguments (a necessary distinction
- * in some cases). Note that if the STOPEVENT() code in i386/i386/trap.c
- * is ever changed these functions need to keep up.
- */
-
-void
-i386_linux_syscall_entry(struct trussinfo *trussinfo, int nargs) {
- struct reg regs;
- int syscall_num;
- int i;
- struct syscall *sc;
-
- cpid = trussinfo->curthread->tid;
-
- clear_fsc();
-
- if (ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0) < 0)
- {
- fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
- return;
- }
- syscall_num = regs.r_eax;
-
- fsc.number = syscall_num;
- fsc.name =
- (syscall_num < 0 || syscall_num > nsyscalls) ? NULL : linux_syscallnames[syscall_num];
- if (!fsc.name) {
- fprintf(trussinfo->outfile, "-- UNKNOWN SYSCALL %d --\n", syscall_num);
- }
-
- if (fsc.name && (trussinfo->flags & FOLLOWFORKS)
- && ((!strcmp(fsc.name, "linux_fork")
- || !strcmp(fsc.name, "linux_vfork"))))
- {
- trussinfo->curthread->in_fork = 1;
- }
-
- if (nargs == 0)
- return;
-
- /*
- * Linux passes syscall arguments in registers, not
- * on the stack. Fortunately, we've got access to the
- * register set. Note that we don't bother checking the
- * number of arguments. And what does linux do for syscalls
- * that have more than five arguments?
- */
-
- fsc.args[0] = regs.r_ebx;
- fsc.args[1] = regs.r_ecx;
- fsc.args[2] = regs.r_edx;
- fsc.args[3] = regs.r_esi;
- fsc.args[4] = regs.r_edi;
-
- sc = get_syscall(fsc.name);
- if (sc) {
- fsc.nargs = sc->nargs;
- } else {
-#if DEBUG
- fprintf(trussinfo->outfile, "unknown syscall %s -- setting args to %d\n",
- fsc.name, nargs);
-#endif
- fsc.nargs = nargs;
- }
-
- fsc.s_args = malloc((1+fsc.nargs) * sizeof(char*));
- memset(fsc.s_args, 0, fsc.nargs * sizeof(char*));
- fsc.sc = sc;
-
- /*
- * At this point, we set up the system call arguments.
- * We ignore any OUT ones, however -- those are arguments that
- * are set by the system call, and so are probably meaningless
- * now. This doesn't currently support arguments that are
- * passed in *and* out, however.
- */
-
- if (fsc.name) {
-
-#if DEBUG
- fprintf(stderr, "syscall %s(", fsc.name);
-#endif
- for (i = 0; i < fsc.nargs; i++) {
-#if DEBUG
- fprintf(stderr, "0x%x%s",
- sc
- ? fsc.args[sc->args[i].offset]
- : fsc.args[i],
- i < (fsc.nargs - 1) ? "," : "");
-#endif
- if (sc && !(sc->args[i].type & OUT)) {
- fsc.s_args[i] = print_arg(&sc->args[i], fsc.args, 0, trussinfo);
- }
- }
-#if DEBUG
- fprintf(stderr, ")\n");
-#endif
- }
-
-#if DEBUG
- fprintf(trussinfo->outfile, "\n");
-#endif
-
- if (fsc.name != NULL &&
- (!strcmp(fsc.name, "linux_execve") || !strcmp(fsc.name, "exit"))) {
-
- /* XXX
- * This could be done in a more general
- * manner but it still wouldn't be very pretty.
- */
- if (!strcmp(fsc.name, "linux_execve")) {
- if ((trussinfo->flags & EXECVEARGS) == 0)
- if (fsc.s_args[1]) {
- free(fsc.s_args[1]);
- fsc.s_args[1] = NULL;
- }
- if ((trussinfo->flags & EXECVEENVS) == 0)
- if (fsc.s_args[2]) {
- free(fsc.s_args[2]);
- fsc.s_args[2] = NULL;
- }
- }
- }
-
- return;
-}
-
-/*
- * Linux syscalls return negative errno's, we do positive and map them
- */
-const int bsd_to_linux_errno[] = {
- -0, -1, -2, -3, -4, -5, -6, -7, -8, -9,
- -10, -35, -12, -13, -14, -15, -16, -17, -18, -19,
- -20, -21, -22, -23, -24, -25, -26, -27, -28, -29,
- -30, -31, -32, -33, -34, -11,-115,-114, -88, -89,
- -90, -91, -92, -93, -94, -95, -96, -97, -98, -99,
- -100,-101,-102,-103,-104,-105,-106,-107,-108,-109,
- -110,-111, -40, -36,-112,-113, -39, -11, -87,-122,
- -116, -66, -6, -6, -6, -6, -6, -37, -38, -9,
- -6,
-};
-
-long
-i386_linux_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
-{
- struct reg regs;
- long retval;
- int i;
- int errorp;
- struct syscall *sc;
-
- if (fsc.name == NULL)
- return (-1);
-
- cpid = trussinfo->curthread->tid;
- if (ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0) < 0)
- {
- fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
- return (-1);
- }
-
- retval = regs.r_eax;
- errorp = !!(regs.r_eflags & PSL_C);
-
- /*
- * This code, while simpler than the initial versions I used, could
- * stand some significant cleaning.
- */
-
- sc = fsc.sc;
- if (!sc) {
- for (i = 0; i < fsc.nargs; i++)
- asprintf(&fsc.s_args[i], "0x%lx", fsc.args[i]);
- } else {
- /*
- * Here, we only look for arguments that have OUT masked in --
- * otherwise, they were handled in the syscall_entry function.
- */
- for (i = 0; i < sc->nargs; i++) {
- char *temp;
- if (sc->args[i].type & OUT) {
- /*
- * If an error occurred, than don't bothe getting the data;
- * it may not be valid.
- */
- if (errorp)
- asprintf(&temp, "0x%lx", fsc.args[sc->args[i].offset]);
- else
- temp = print_arg(&sc->args[i], fsc.args, retval, trussinfo);
- fsc.s_args[i] = temp;
- }
- }
- }
-
- /*
- * It would probably be a good idea to merge the error handling,
- * but that complicates things considerably.
- */
- if (errorp) {
- for (i = 0; (size_t)i < sizeof(bsd_to_linux_errno) / sizeof(int); i++)
- if (retval == bsd_to_linux_errno[i])
- break;
- }
-
- if (fsc.name != NULL &&
- (!strcmp(fsc.name, "linux_execve") || !strcmp(fsc.name, "exit"))) {
- trussinfo->curthread->in_syscall = 1;
- }
-
- print_syscall_ret(trussinfo, fsc.name, fsc.nargs, fsc.s_args, errorp,
- errorp ? i : retval);
- clear_fsc();
-
- return (retval);
-}
diff --git a/usr.bin/truss/i386.conf b/usr.bin/truss/i386.conf
deleted file mode 100644
index cfe2f46..0000000
--- a/usr.bin/truss/i386.conf
+++ /dev/null
@@ -1,13 +0,0 @@
-# $FreeBSD$
-
-sysnames="syscalls.h"
-sysproto="/dev/null"
-sysproto_h="/dev/null"
-syshdr="/dev/null"
-sysmk="/dev/null"
-syssw="/dev/null"
-syshide="/dev/null"
-syscallprefix="SYS_"
-switchname="sysent"
-namesname="syscallnames"
-systrace="/dev/null"
diff --git a/usr.bin/truss/i386linux.conf b/usr.bin/truss/i386linux.conf
deleted file mode 100644
index 7669bce..0000000
--- a/usr.bin/truss/i386linux.conf
+++ /dev/null
@@ -1,13 +0,0 @@
-# $FreeBSD$
-
-sysnames="linux_syscalls.h"
-sysproto="/dev/null"
-sysproto_h="/dev/null"
-syshdr="/dev/null"
-sysmk="/dev/null"
-syssw="/dev/null"
-syshide="/dev/null"
-syscallprefix="SYS_"
-switchname="sysent"
-namesname="linux_syscallnames"
-systrace="/dev/null"
diff --git a/usr.bin/truss/ia64-fbsd.c b/usr.bin/truss/ia64-fbsd.c
deleted file mode 100644
index 70140b6..0000000
--- a/usr.bin/truss/ia64-fbsd.c
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copryight 1997 Sean Eric Fagan
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Sean Eric Fagan
- * 4. Neither the name of the author may be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-/*
- * FreeBSD/ia64-specific system call handling. This is probably the most
- * complex part of the entire truss program, although I've got lots of
- * it handled relatively cleanly now. The system call names are generated
- * automatically, thanks to /usr/src/sys/kern/syscalls.master. The
- * names used for the various structures are confusing, I sadly admit.
- */
-
-#include <sys/types.h>
-#include <sys/ptrace.h>
-#include <sys/syscall.h>
-
-#include <machine/reg.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "truss.h"
-#include "syscall.h"
-#include "extern.h"
-
-static int cpid = -1;
-
-#include "syscalls.h"
-
-static int nsyscalls = sizeof(syscallnames) / sizeof(syscallnames[0]);
-
-/*
- * This is what this particular file uses to keep track of a system call.
- * It is probably not quite sufficient -- I can probably use the same
- * structure for the various syscall personalities, and I also probably
- * need to nest system calls (for signal handlers).
- *
- * 'struct syscall' describes the system call; it may be NULL, however,
- * if we don't know about this particular system call yet.
- */
-static struct freebsd_syscall {
- struct syscall *sc;
- const char *name;
- int number;
- unsigned long *args;
- int nargs; /* number of arguments -- *not* number of words! */
- char **s_args; /* the printable arguments */
-} fsc;
-
-/* Clear up and free parts of the fsc structure. */
-static __inline void
-clear_fsc(void) {
- if (fsc.args) {
- free(fsc.args);
- }
- if (fsc.s_args) {
- int i;
- for (i = 0; i < fsc.nargs; i++)
- if (fsc.s_args[i])
- free(fsc.s_args[i]);
- free(fsc.s_args);
- }
- memset(&fsc, 0, sizeof(fsc));
-}
-
-/*
- * Called when a process has entered a system call. nargs is the
- * number of words, not number of arguments (a necessary distinction
- * in some cases). Note that if the STOPEVENT() code in ia64/ia64/trap.c
- * is ever changed these functions need to keep up.
- */
-
-void
-ia64_syscall_entry(struct trussinfo *trussinfo, int nargs) {
- struct reg regs;
- int syscall_num;
- int i;
- unsigned long *parm_offset;
- struct syscall *sc;
-
- cpid = trussinfo->curthread->tid;
-
- clear_fsc();
- if (ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0) < 0) {
- fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
- return;
- }
- parm_offset = &regs.r_scratch.gr16;
-
- /*
- * FreeBSD has two special kinds of system call redirctions --
- * SYS_syscall, and SYS___syscall. The former is the old syscall()
- * routine, basicly; the latter is for quad-aligned arguments.
- */
- syscall_num = regs.r_scratch.gr15; /* XXX double-check. */
- if (syscall_num == SYS_syscall || syscall_num == SYS___syscall)
- syscall_num = (int)*parm_offset++;
-
- fsc.number = syscall_num;
- fsc.name = (syscall_num < 0 || syscall_num > nsyscalls)
- ? NULL : syscallnames[syscall_num];
- if (!fsc.name) {
- fprintf(trussinfo->outfile, "-- UNKNOWN SYSCALL %d --\n", syscall_num);
- }
-
- if (fsc.name && (trussinfo->flags & FOLLOWFORKS)
- && ((!strcmp(fsc.name, "fork")
- || !strcmp(fsc.name, "rfork")
- || !strcmp(fsc.name, "vfork"))))
- {
- trussinfo->curthread->in_fork = 1;
- }
-
- if (nargs == 0)
- return;
-
- fsc.args = malloc((1+nargs) * sizeof(unsigned long));
- memcpy(fsc.args, parm_offset, nargs * sizeof(long));
-
- sc = get_syscall(fsc.name);
- if (sc) {
- fsc.nargs = sc->nargs;
- } else {
-#if DEBUG
- fprintf(trussinfo->outfile, "unknown syscall %s -- setting args to %d\n",
- fsc.name, nargs);
-#endif
- fsc.nargs = nargs;
- }
-
- fsc.s_args = malloc((1+fsc.nargs) * sizeof(char*));
- memset(fsc.s_args, 0, fsc.nargs * sizeof(char*));
- fsc.sc = sc;
-
- /*
- * At this point, we set up the system call arguments.
- * We ignore any OUT ones, however -- those are arguments that
- * are set by the system call, and so are probably meaningless
- * now. This doesn't currently support arguments that are
- * passed in *and* out, however.
- */
-
- if (fsc.name) {
-
-#if DEBUG
- fprintf(stderr, "syscall %s(", fsc.name);
-#endif
- for (i = 0; i < fsc.nargs; i++) {
-#if DEBUG
- fprintf(stderr, "0x%x%s",
- sc
- ? fsc.args[sc->args[i].offset]
- : fsc.args[i],
- i < (fsc.nargs - 1) ? "," : "");
-#endif
- if (sc && !(sc->args[i].type & OUT)) {
- fsc.s_args[i] = print_arg(&sc->args[i], fsc.args, 0, trussinfo);
- }
- }
-#if DEBUG
- fprintf(stderr, ")\n");
-#endif
- }
-
-#if DEBUG
- fprintf(trussinfo->outfile, "\n");
-#endif
-
- if (fsc.name != NULL &&
- (!strcmp(fsc.name, "execve") || !strcmp(fsc.name, "exit"))) {
-
- /* XXX
- * This could be done in a more general
- * manner but it still wouldn't be very pretty.
- */
- if (!strcmp(fsc.name, "execve")) {
- if ((trussinfo->flags & EXECVEARGS) == 0)
- if (fsc.s_args[1]) {
- free(fsc.s_args[1]);
- fsc.s_args[1] = NULL;
- }
- if ((trussinfo->flags & EXECVEENVS) == 0)
- if (fsc.s_args[2]) {
- free(fsc.s_args[2]);
- fsc.s_args[2] = NULL;
- }
- }
- }
-
- return;
-}
-
-/*
- * And when the system call is done, we handle it here.
- * Currently, no attempt is made to ensure that the system calls
- * match -- this needs to be fixed (and is, in fact, why S_SCX includes
- * the sytem call number instead of, say, an error status).
- */
-
-long
-ia64_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
-{
- struct reg regs;
- long retval;
- int i;
- int errorp;
- struct syscall *sc;
-
- if (fsc.name == NULL)
- return (-1);
- cpid = trussinfo->curthread->tid;
-
- if (ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0) < 0) {
- fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
- return (-1);
- }
- retval = regs.r_scratch.gr8;
- errorp = (regs.r_scratch.gr10 != 0) ? 1 : 0;
-
- /*
- * This code, while simpler than the initial versions I used, could
- * stand some significant cleaning.
- */
-
- sc = fsc.sc;
- if (!sc) {
- for (i = 0; i < fsc.nargs; i++)
- asprintf(&fsc.s_args[i], "0x%lx", fsc.args[i]);
- } else {
- /*
- * Here, we only look for arguments that have OUT masked in --
- * otherwise, they were handled in the syscall_entry function.
- */
- for (i = 0; i < sc->nargs; i++) {
- char *temp;
- if (sc->args[i].type & OUT) {
- /*
- * If an error occurred, than don't bothe getting the data;
- * it may not be valid.
- */
- if (errorp)
- asprintf(&temp, "0x%lx", fsc.args[sc->args[i].offset]);
- else
- temp = print_arg(&sc->args[i], fsc.args, retval, trussinfo);
- fsc.s_args[i] = temp;
- }
- }
- }
-
- if (fsc.name != NULL &&
- (!strcmp(fsc.name, "execve") || !strcmp(fsc.name, "exit"))) {
- trussinfo->curthread->in_syscall = 1;
- }
- /*
- * It would probably be a good idea to merge the error handling,
- * but that complicates things considerably.
- */
-
- print_syscall_ret(trussinfo, fsc.name, fsc.nargs, fsc.s_args, errorp, retval);
- clear_fsc();
-
- return (retval);
-}
diff --git a/usr.bin/truss/main.c b/usr.bin/truss/main.c
deleted file mode 100644
index a735f34..0000000
--- a/usr.bin/truss/main.c
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- * Copryight 1997 Sean Eric Fagan
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Sean Eric Fagan
- * 4. Neither the name of the author may be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * The main module for truss. Suprisingly simple, but, then, the other
- * files handle the bulk of the work. And, of course, the kernel has to
- * do a lot of the work :).
- */
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/sysctl.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "truss.h"
-#include "extern.h"
-
-#define MAXARGS 6
-
-static void
-usage(void)
-{
- fprintf(stderr, "%s\n%s\n",
- "usage: truss [-faedDS] [-o file] [-s strsize] -p pid",
- " truss [-faedDS] [-o file] [-s strsize] command [args]");
- exit(1);
-}
-
-/*
- * WARNING! "FreeBSD a.out" must be first, or set_etype will not
- * work correctly.
- */
-struct ex_types {
- const char *type;
- void (*enter_syscall)(struct trussinfo *, int);
- long (*exit_syscall)(struct trussinfo *, int);
-} ex_types[] = {
-#ifdef __amd64__
- { "FreeBSD ELF64", amd64_syscall_entry, amd64_syscall_exit },
- { "FreeBSD ELF32", amd64_fbsd32_syscall_entry, amd64_fbsd32_syscall_exit },
- { "Linux ELF32", amd64_linux32_syscall_entry, amd64_linux32_syscall_exit },
-#endif
-#ifdef __i386__
- { "FreeBSD a.out", i386_syscall_entry, i386_syscall_exit },
- { "FreeBSD ELF", i386_syscall_entry, i386_syscall_exit },
- { "FreeBSD ELF32", i386_syscall_entry, i386_syscall_exit },
- { "Linux ELF", i386_linux_syscall_entry, i386_linux_syscall_exit },
-#endif
-#ifdef __ia64__
- { "FreeBSD ELF64", ia64_syscall_entry, ia64_syscall_exit },
-#endif
-#ifdef __powerpc__
- { "FreeBSD ELF", powerpc_syscall_entry, powerpc_syscall_exit },
- { "FreeBSD ELF32", powerpc_syscall_entry, powerpc_syscall_exit },
-#endif
-#ifdef __sparc64__
- { "FreeBSD ELF64", sparc64_syscall_entry, sparc64_syscall_exit },
-#endif
- { 0, 0, 0 },
-};
-
-/*
- * Set the execution type. This is called after every exec, and when
- * a process is first monitored.
- */
-
-static struct ex_types *
-set_etype(struct trussinfo *trussinfo)
-{
- struct ex_types *funcs;
- char progt[32];
-
- size_t len = sizeof(progt);
- int mib[4];
- int error;
-
- mib[0] = CTL_KERN;
- mib[1] = KERN_PROC;
- mib[2] = KERN_PROC_SV_NAME;
- mib[3] = trussinfo->pid;
- error = sysctl(mib, 4, progt, &len, NULL, 0);
- if (error != 0)
- err(2, "can not get etype");
-
- for (funcs = ex_types; funcs->type; funcs++)
- if (!strcmp(funcs->type, progt))
- break;
-
- if (funcs->type == NULL) {
- funcs = &ex_types[0];
- warn("execution type %s is not supported -- using %s",
- progt, funcs->type);
- }
- return (funcs);
-}
-
-char *
-strsig(int sig)
-{
- char *ret;
-
- ret = NULL;
- if (sig > 0 && sig < NSIG) {
- int i;
- asprintf(&ret, "sig%s", sys_signame[sig]);
- if (ret == NULL)
- return (NULL);
- for (i = 0; ret[i] != '\0'; ++i)
- ret[i] = toupper(ret[i]);
- }
- return (ret);
-}
-
-int
-main(int ac, char **av)
-{
- int c;
- int i;
- char **command;
- struct ex_types *funcs;
- int initial_open;
- char *fname;
- struct trussinfo *trussinfo;
- char *signame;
-
- fname = NULL;
- initial_open = 1;
-
- /* Initialize the trussinfo struct */
- trussinfo = (struct trussinfo *)malloc(sizeof(struct trussinfo));
- if (trussinfo == NULL)
- errx(1, "malloc() failed");
- bzero(trussinfo, sizeof(struct trussinfo));
-
- trussinfo->outfile = stderr;
- trussinfo->strsize = 32;
- trussinfo->pr_why = S_NONE;
- trussinfo->curthread = NULL;
- SLIST_INIT(&trussinfo->threadlist);
- while ((c = getopt(ac, av, "p:o:faedDs:S")) != -1) {
- switch (c) {
- case 'p': /* specified pid */
- trussinfo->pid = atoi(optarg);
- /* make sure i don't trace me */
- if(trussinfo->pid == getpid()) {
- fprintf(stderr, "attempt to grab self.\n");
- exit(2);
- }
- break;
- case 'f': /* Follow fork()'s */
- trussinfo->flags |= FOLLOWFORKS;
- break;
- case 'a': /* Print execve() argument strings. */
- trussinfo->flags |= EXECVEARGS;
- break;
- case 'e': /* Print execve() environment strings. */
- trussinfo->flags |= EXECVEENVS;
- break;
- case 'd': /* Absolute timestamps */
- trussinfo->flags |= ABSOLUTETIMESTAMPS;
- break;
- case 'D': /* Relative timestamps */
- trussinfo->flags |= RELATIVETIMESTAMPS;
- break;
- case 'o': /* Specified output file */
- fname = optarg;
- break;
- case 's': /* Specified string size */
- trussinfo->strsize = atoi(optarg);
- break;
- case 'S': /* Don't trace signals */
- trussinfo->flags |= NOSIGS;
- break;
- default:
- usage();
- }
- }
-
- ac -= optind; av += optind;
- if ((trussinfo->pid == 0 && ac == 0) ||
- (trussinfo->pid != 0 && ac != 0))
- usage();
-
- if (fname != NULL) { /* Use output file */
- if ((trussinfo->outfile = fopen(fname, "w")) == NULL)
- errx(1, "cannot open %s", fname);
- }
-
- /*
- * If truss starts the process itself, it will ignore some signals --
- * they should be passed off to the process, which may or may not
- * exit. If, however, we are examining an already-running process,
- * then we restore the event mask on these same signals.
- */
-
- if (trussinfo->pid == 0) { /* Start a command ourselves */
- command = av;
- trussinfo->pid = setup_and_wait(command);
- signal(SIGINT, SIG_IGN);
- signal(SIGTERM, SIG_IGN);
- signal(SIGQUIT, SIG_IGN);
- } else {
- start_tracing(trussinfo->pid);
- signal(SIGINT, restore_proc);
- signal(SIGTERM, restore_proc);
- signal(SIGQUIT, restore_proc);
- }
-
-
- /*
- * At this point, if we started the process, it is stopped waiting to
- * be woken up, either in exit() or in execve().
- */
-
-START_TRACE:
- funcs = set_etype(trussinfo);
-
- initial_open = 0;
- /*
- * At this point, it's a simple loop, waiting for the process to
- * stop, finding out why, printing out why, and then continuing it.
- * All of the grunt work is done in the support routines.
- */
-
- clock_gettime(CLOCK_REALTIME, &trussinfo->start_time);
-
- do {
- struct timespec timediff;
- waitevent(trussinfo);
-
- switch(i = trussinfo->pr_why) {
- case S_SCE:
- funcs->enter_syscall(trussinfo, MAXARGS);
- clock_gettime(CLOCK_REALTIME,
- &trussinfo->before);
- break;
- case S_SCX:
- clock_gettime(CLOCK_REALTIME,
- &trussinfo->after);
-
- if (trussinfo->curthread->in_fork &&
- (trussinfo->flags & FOLLOWFORKS)) {
- int childpid;
-
- trussinfo->curthread->in_fork = 0;
- childpid =
- funcs->exit_syscall(trussinfo,
- trussinfo->pr_data);
-
- /*
- * Fork a new copy of ourself to trace
- * the child of the original traced
- * process.
- */
- if (fork() == 0) {
- trussinfo->pid = childpid;
- start_tracing(trussinfo->pid);
- goto START_TRACE;
- }
- break;
- }
- funcs->exit_syscall(trussinfo, MAXARGS);
- break;
- case S_SIG:
- if (trussinfo->flags & NOSIGS)
- break;
- if (trussinfo->flags & FOLLOWFORKS)
- fprintf(trussinfo->outfile, "%5d: ",
- trussinfo->pid);
- if (trussinfo->flags & ABSOLUTETIMESTAMPS) {
- timespecsubt(&trussinfo->after,
- &trussinfo->start_time, &timediff);
- fprintf(trussinfo->outfile, "%ld.%09ld ",
- (long)timediff.tv_sec,
- timediff.tv_nsec);
- }
- if (trussinfo->flags & RELATIVETIMESTAMPS) {
- timespecsubt(&trussinfo->after,
- &trussinfo->before, &timediff);
- fprintf(trussinfo->outfile, "%ld.%09ld ",
- (long)timediff.tv_sec,
- timediff.tv_nsec);
- }
- signame = strsig(trussinfo->pr_data);
- fprintf(trussinfo->outfile,
- "SIGNAL %u (%s)\n", trussinfo->pr_data,
- signame == NULL ? "?" : signame);
- free(signame);
- break;
- case S_EXIT:
- if (trussinfo->flags & FOLLOWFORKS)
- fprintf(trussinfo->outfile, "%5d: ",
- trussinfo->pid);
- if (trussinfo->flags & ABSOLUTETIMESTAMPS) {
- timespecsubt(&trussinfo->after,
- &trussinfo->start_time, &timediff);
- fprintf(trussinfo->outfile, "%ld.%09ld ",
- (long)timediff.tv_sec,
- timediff.tv_nsec);
- }
- if (trussinfo->flags & RELATIVETIMESTAMPS) {
- timespecsubt(&trussinfo->after,
- &trussinfo->before, &timediff);
- fprintf(trussinfo->outfile, "%ld.%09ld ",
- (long)timediff.tv_sec, timediff.tv_nsec);
- }
- fprintf(trussinfo->outfile,
- "process exit, rval = %u\n", trussinfo->pr_data);
- break;
- default:
- break;
- }
- } while (trussinfo->pr_why != S_EXIT);
- fflush(trussinfo->outfile);
-
- return (0);
-}
diff --git a/usr.bin/truss/powerpc-fbsd.c b/usr.bin/truss/powerpc-fbsd.c
deleted file mode 100644
index 7b4cfb5..0000000
--- a/usr.bin/truss/powerpc-fbsd.c
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * Copyright 2006 Peter Grehan <grehan@freebsd.org>
- * Copryight 2005 Orlando Bassotto <orlando@break.net>
- * Copryight 1998 Sean Eric Fagan
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-/*
- * FreeBSD/powerpc-specific system call handling. This is probably the most
- * complex part of the entire truss program, although I've got lots of
- * it handled relatively cleanly now. The system call names are generated
- * automatically, thanks to /usr/src/sys/kern/syscalls.master. The
- * names used for the various structures are confusing, I sadly admit.
- *
- * This file is almost nothing more than a slightly-edited i386-fbsd.c.
- */
-
-#include <sys/types.h>
-#include <sys/ptrace.h>
-#include <sys/syscall.h>
-
-#include <machine/reg.h>
-#include <machine/frame.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "truss.h"
-#include "syscall.h"
-#include "extern.h"
-
-static int cpid = -1;
-
-#include "syscalls.h"
-
-static int nsyscalls = sizeof(syscallnames) / sizeof(syscallnames[0]);
-
-/*
- * This is what this particular file uses to keep track of a system call.
- * It is probably not quite sufficient -- I can probably use the same
- * structure for the various syscall personalities, and I also probably
- * need to nest system calls (for signal handlers).
- *
- * 'struct syscall' describes the system call; it may be NULL, however,
- * if we don't know about this particular system call yet.
- */
-static struct freebsd_syscall {
- struct syscall *sc;
- const char *name;
- int number;
- unsigned long *args;
- int nargs; /* number of arguments -- *not* number of words! */
- char **s_args; /* the printable arguments */
-} fsc;
-
-/* Clear up and free parts of the fsc structure. */
-static __inline void
-clear_fsc(void) {
- if (fsc.args) {
- free(fsc.args);
- }
- if (fsc.s_args) {
- int i;
- for (i = 0; i < fsc.nargs; i++)
- if (fsc.s_args[i])
- free(fsc.s_args[i]);
- free(fsc.s_args);
- }
- memset(&fsc, 0, sizeof(fsc));
-}
-
-/*
- * Called when a process has entered a system call. nargs is the
- * number of words, not number of arguments (a necessary distinction
- * in some cases). Note that if the STOPEVENT() code in powerpc/powerpc/trap.c
- * is ever changed these functions need to keep up.
- */
-
-void
-powerpc_syscall_entry(struct trussinfo *trussinfo, int nargs) {
- char buf[32];
- struct reg regs;
- void *args;
- int syscall_num;
- int i;
- unsigned int regargs;
- struct syscall *sc;
-
- /* Account for a 64-bit argument with corresponding alignment. */
- nargs += 2;
-
- cpid = trussinfo->curthread->tid;
-
- clear_fsc();
- if (ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0) < 0) {
- fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
- return;
- }
-
- /*
- * FreeBSD has two special kinds of system call redirctions --
- * SYS_syscall, and SYS___syscall. The former is the old syscall()
- * routine, basicly; the latter is for quad-aligned arguments.
- */
- regargs = NARGREG;
- syscall_num = regs.fixreg[0];
- args = &regs.fixreg[3];
- if (syscall_num == SYS_syscall) {
- args = &regs.fixreg[4];
- regargs -= 1;
- syscall_num = regs.fixreg[3];
- } else if (syscall_num == SYS___syscall) {
- args = &regs.fixreg[5];
- regargs -= 2;
- syscall_num = regs.fixreg[4];
- }
-
- fsc.number = syscall_num;
- fsc.name =
- (syscall_num < 0 || syscall_num > nsyscalls) ? NULL : syscallnames[syscall_num];
- if (!fsc.name) {
- fprintf(trussinfo->outfile, "-- UNKNOWN SYSCALL %d --\n", syscall_num);
- }
-
- if (fsc.name && (trussinfo->flags & FOLLOWFORKS)
- && ((!strcmp(fsc.name, "fork")
- || !strcmp(fsc.name, "rfork")
- || !strcmp(fsc.name, "vfork"))))
- {
- trussinfo->curthread->in_fork = 1;
- }
-
- if (nargs == 0)
- return;
-
- fsc.args = malloc((1+nargs) * sizeof(unsigned long));
-
- if (nargs > regargs) {
- struct ptrace_io_desc iorequest;
- memmove(&fsc.args[0], args, regargs * sizeof(fsc.args[0]));
-
- iorequest.piod_op = PIOD_READ_D;
- iorequest.piod_offs = (void *)(regs.fixreg[1] + 8);
- iorequest.piod_addr = &fsc.args[regargs];
- iorequest.piod_len = (nargs - regargs) * sizeof(fsc.args[0]);
- ptrace(PT_IO, cpid, (caddr_t)&iorequest, 0);
- if (iorequest.piod_len == 0)
- return;
- } else {
- memmove(&fsc.args[0], args, nargs * sizeof(fsc.args[0]));
- }
-
- sc = get_syscall(fsc.name);
- if (sc) {
- fsc.nargs = sc->nargs;
- } else {
-#if DEBUG
- fprintf(trussinfo->outfile, "unknown syscall %s -- setting args to %d\n",
- fsc.name, nargs);
-#endif
- fsc.nargs = nargs;
- }
-
- fsc.s_args = malloc((1+fsc.nargs) * sizeof(char*));
- memset(fsc.s_args, 0, fsc.nargs * sizeof(char*));
- fsc.sc = sc;
-
- /*
- * At this point, we set up the system call arguments.
- * We ignore any OUT ones, however -- those are arguments that
- * are set by the system call, and so are probably meaningless
- * now. This doesn't currently support arguments that are
- * passed in *and* out, however.
- */
-
- if (fsc.name) {
-
-#if DEBUG
- fprintf(stderr, "syscall %s(", fsc.name);
-#endif
- for (i = 0; i < fsc.nargs; i++) {
-#if DEBUG
- fprintf(stderr, "0x%x%s",
- sc
- ? fsc.args[sc->args[i].offset]
- : fsc.args[i],
- i < (fsc.nargs - 1) ? "," : "");
-#endif
- if (sc && !(sc->args[i].type & OUT)) {
- fsc.s_args[i] = print_arg(&sc->args[i], fsc.args, 0, trussinfo);
- }
- }
-#if DEBUG
- fprintf(stderr, ")\n");
-#endif
- }
-
-#if DEBUG
- fprintf(trussinfo->outfile, "\n");
-#endif
-
- if (fsc.name && (!strcmp(fsc.name, "execve") || !strcmp(fsc.name, "exit"))) {
-
- /* XXX
- * This could be done in a more general
- * manner but it still wouldn't be very pretty.
- */
- if (!strcmp(fsc.name, "execve")) {
- if ((trussinfo->flags & EXECVEARGS) == 0)
- if (fsc.s_args[1]) {
- free(fsc.s_args[1]);
- fsc.s_args[1] = NULL;
- }
- if ((trussinfo->flags & EXECVEENVS) == 0)
- if (fsc.s_args[2]) {
- free(fsc.s_args[2]);
- fsc.s_args[2] = NULL;
- }
- }
- }
-
- return;
-}
-
-/*
- * And when the system call is done, we handle it here.
- * Currently, no attempt is made to ensure that the system calls
- * match -- this needs to be fixed (and is, in fact, why S_SCX includes
- * the sytem call number instead of, say, an error status).
- */
-
-long
-powerpc_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused)
-{
- struct reg regs;
- long retval;
- int i;
- int errorp;
- struct syscall *sc;
-
- if (fsc.name == NULL)
- return (-1);
-
- cpid = trussinfo->curthread->tid;
-
- if (ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0) < 0) {
- fprintf(trussinfo->outfile, "\n");
- return (-1);
- }
- retval = regs.fixreg[3];
- errorp = !!(regs.cr & 0x10000000);
-
- /*
- * This code, while simpler than the initial versions I used, could
- * stand some significant cleaning.
- */
-
- sc = fsc.sc;
- if (!sc) {
- for (i = 0; i < fsc.nargs; i++)
- asprintf(&fsc.s_args[i], "0x%lx", fsc.args[i]);
- } else {
- /*
- * On 32-bit big-endian, the low word of a 64-bit return is
- * in the greater address. Switch to this. XXX note that
- * print_syscall_ret can't handle 64-bit return values (llseek)
- */
- if (sc->ret_type == 2)
- retval = regs.fixreg[4];
-
- /*
- * Here, we only look for arguments that have OUT masked in --
- * otherwise, they were handled in the syscall_entry function.
- */
- for (i = 0; i < sc->nargs; i++) {
- char *temp;
- if (sc->args[i].type & OUT) {
- /*
- * If an error occurred, than don't bothe getting the data;
- * it may not be valid.
- */
- if (errorp)
- asprintf(&temp, "0x%lx", fsc.args[sc->args[i].offset]);
- else
- temp = print_arg(&sc->args[i], fsc.args, retval, trussinfo);
- fsc.s_args[i] = temp;
- }
- }
- }
-
- if (fsc.name != NULL &&
- (!strcmp(fsc.name, "execve") || !strcmp(fsc.name, "exit"))) {
- trussinfo->curthread->in_syscall = 1;
- }
-
-
- /*
- * It would probably be a good idea to merge the error handling,
- * but that complicates things considerably.
- */
-
- print_syscall_ret(trussinfo, fsc.name, fsc.nargs, fsc.s_args, errorp, retval);
- clear_fsc();
-
- return (retval);
-}
diff --git a/usr.bin/truss/setup.c b/usr.bin/truss/setup.c
deleted file mode 100644
index aa1c770..0000000
--- a/usr.bin/truss/setup.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Copryight 1997 Sean Eric Fagan
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Sean Eric Fagan
- * 4. Neither the name of the author may be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Various setup functions for truss. Not the cleanest-written code,
- * I'm afraid.
- */
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/ptrace.h>
-#include <sys/wait.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#include <machine/reg.h>
-
-#include "truss.h"
-#include "extern.h"
-
-static int child_pid;
-
-/*
- * setup_and_wait() is called to start a process. All it really does
- * is fork(), set itself up to stop on exec or exit, and then exec
- * the given command. At that point, the child process stops, and
- * the parent can wake up and deal with it.
- */
-
-int
-setup_and_wait(char *command[])
-{
- int pid;
- int waitval;
-
- pid = vfork();
- if (pid == -1) {
- err(1, "fork failed");
- }
- if (pid == 0) { /* Child */
- ptrace(PT_TRACE_ME, 0, 0, 0);
- setpgid (0, 0);
- execvp(command[0], command);
- err(1, "execvp %s", command[0]);
- }
-
- /* Only in the parent here */
- if (waitpid(pid, &waitval, 0) < -1) {
- err(1, "unexpect stop in waitpid");
- return 0;
- }
-
- child_pid = pid;
-
- return (pid);
-}
-
-/*
- * start_tracing picks up where setup_and_wait() dropped off -- namely,
- * it sets the event mask for the given process id. Called for both
- * monitoring an existing process and when we create our own.
- */
-
-int
-start_tracing(int pid)
-{
- int waitval;
- int ret;
- int retry = 10;
-
- do {
- ret = ptrace(PT_ATTACH, pid, NULL, 0);
- usleep(200);
- } while(ret && retry-- > 0);
- if (ret)
- err(1, "can not attach to target process");
-
- child_pid = pid;
- if (waitpid(pid, &waitval, 0) < -1)
- err(1, "Unexpect stop in waitpid");
-
- return (0);
-}
-
-/*
- * Restore a process back to it's pre-truss state.
- * Called for SIGINT, SIGTERM, SIGQUIT. This only
- * applies if truss was told to monitor an already-existing
- * process.
- */
-void
-restore_proc(int signo __unused)
-{
- int waitval;
-
- /* stop the child so that we can detach */
- kill(child_pid, SIGSTOP);
- if (waitpid(child_pid, &waitval, 0) < -1)
- err(1, "Unexpected stop in waitpid");
-
- if (ptrace(PT_DETACH, child_pid, (caddr_t)1, 0) < 0)
- err(1, "Can not detach the process");
-
- kill(child_pid, SIGCONT);
- exit(0);
-}
-
-/*
- * Change curthread member based on lwpid.
- * If it is a new thread, create a threadinfo structure
- */
-static void
-find_thread(struct trussinfo *info, lwpid_t lwpid)
-{
- info->curthread = NULL;
- struct threadinfo *np;
- SLIST_FOREACH(np, &info->threadlist, entries) {
- if (np->tid == lwpid) {
- info->curthread = np;
- return;
- }
- }
-
- np = (struct threadinfo *)malloc(sizeof(struct threadinfo));
- if (np == NULL)
- errx(1, "malloc() failed");
- np->tid = lwpid;
- np->in_fork = 0;
- np->in_syscall = 0;
- SLIST_INSERT_HEAD(&info->threadlist, np, entries);
- info->curthread = np;
-}
-
-/*
- * Start the traced process and wait until it stoped.
- * Fill trussinfo structure.
- * When this even returns, the traced process is in stop state.
- */
-void
-waitevent(struct trussinfo *info)
-{
- int waitval;
- static int pending_signal = 0;
-
- ptrace(PT_SYSCALL, info->pid, (caddr_t)1, pending_signal);
- pending_signal = 0;
-
- if (waitpid(info->pid, &waitval, 0) < -1) {
- err(1, "Unexpected stop in waitpid");
- }
-
- if (WIFCONTINUED(waitval)) {
- info->pr_why = S_NONE;
- return;
- }
- if (WIFEXITED(waitval)) {
- info->pr_why = S_EXIT;
- info->pr_data = WEXITSTATUS(waitval);
- return;
- }
- if (WIFSTOPPED(waitval)) {
- struct ptrace_lwpinfo lwpinfo;
- ptrace(PT_LWPINFO, info->pid, (caddr_t)&lwpinfo, sizeof(lwpinfo));
- find_thread(info, lwpinfo.pl_lwpid);
- switch(WSTOPSIG(waitval)) {
- case SIGTRAP:
- info->pr_why = info->curthread->in_syscall?S_SCX:S_SCE;
- info->curthread->in_syscall = 1 - info->curthread->in_syscall;
- break;
- default:
- info->pr_why = S_SIG;
- info->pr_data = WSTOPSIG(waitval);
- pending_signal = info->pr_data;
- break;
- }
- }
- if (WIFSIGNALED(waitval)) {
- info->pr_why = S_EXIT;
- info->pr_why = 0;
- return;
- }
-}
diff --git a/usr.bin/truss/sparc64-fbsd.c b/usr.bin/truss/sparc64-fbsd.c
deleted file mode 100644
index 896bac7..0000000
--- a/usr.bin/truss/sparc64-fbsd.c
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * Copryight 1998 Sean Eric Fagan
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Sean Eric Fagan
- * 4. Neither the name of the author may be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-/*
- * FreeBSD/sparc64-specific system call handling. This is probably the most
- * complex part of the entire truss program, although I've got lots of
- * it handled relatively cleanly now. The system call names are generated
- * automatically, thanks to /usr/src/sys/kern/syscalls.master. The
- * names used for the various structures are confusing, I sadly admit.
- *
- * This file is almost nothing more than a slightly-edited i386-fbsd.c.
- */
-
-#include <sys/types.h>
-#include <sys/ptrace.h>
-#include <sys/syscall.h>
-
-#include <machine/frame.h>
-#include <machine/reg.h>
-#include <machine/tstate.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "truss.h"
-#include "syscall.h"
-#include "extern.h"
-
-static int cpid = -1;
-
-#include "syscalls.h"
-
-static int nsyscalls = sizeof(syscallnames) / sizeof(syscallnames[0]);
-
-/*
- * This is what this particular file uses to keep track of a system call.
- * It is probably not quite sufficient -- I can probably use the same
- * structure for the various syscall personalities, and I also probably
- * need to nest system calls (for signal handlers).
- *
- * 'struct syscall' describes the system call; it may be NULL, however,
- * if we don't know about this particular system call yet.
- */
-static struct freebsd_syscall {
- struct syscall *sc;
- const char *name;
- int number;
- unsigned long *args;
- int nargs; /* number of arguments -- *not* number of words! */
- char **s_args; /* the printable arguments */
-} fsc;
-
-/* Clear up and free parts of the fsc structure. */
-static __inline void
-clear_fsc(void) {
- if (fsc.args) {
- free(fsc.args);
- }
- if (fsc.s_args) {
- int i;
- for (i = 0; i < fsc.nargs; i++)
- if (fsc.s_args[i])
- free(fsc.s_args[i]);
- free(fsc.s_args);
- }
- memset(&fsc, 0, sizeof(fsc));
-}
-
-/*
- * Called when a process has entered a system call. nargs is the
- * number of words, not number of arguments (a necessary distinction
- * in some cases). Note that if the STOPEVENT() code in sparc64/sparc64/trap.c
- * is ever changed these functions need to keep up.
- */
-
-void
-sparc64_syscall_entry(struct trussinfo *trussinfo, int nargs) {
- struct reg regs;
- int syscall_num;
- int i;
- struct syscall *sc;
- int indir = 0; /* indirect system call */
- struct ptrace_io_desc iorequest;
-
- cpid = trussinfo->curthread->tid;
-
- clear_fsc();
-
- if (ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0) < 0) {
- fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
- return;
- }
-
- /*
- * FreeBSD has two special kinds of system call redirctions --
- * SYS_syscall, and SYS___syscall. The former is the old syscall()
- * routine, basicly; the latter is for quad-aligned arguments.
- */
- syscall_num = regs.r_global[1];
- if (syscall_num == SYS_syscall || syscall_num == SYS___syscall) {
- indir = 1;
- syscall_num = regs.r_out[0];
- }
-
- fsc.number = syscall_num;
- fsc.name =
- (syscall_num < 0 || syscall_num > nsyscalls) ? NULL : syscallnames[syscall_num];
- if (!fsc.name) {
- fprintf(trussinfo->outfile, "-- UNKNOWN SYSCALL %d --\n", syscall_num);
- }
-
- if (fsc.name && (trussinfo->flags & FOLLOWFORKS)
- && ((!strcmp(fsc.name, "fork")
- || !strcmp(fsc.name, "rfork")
- || !strcmp(fsc.name, "vfork"))))
- {
- trussinfo->curthread->in_fork = 1;
- }
-
- if (nargs == 0)
- return;
-
- fsc.args = malloc((1+nargs) * sizeof(unsigned long));
- switch (nargs) {
- default:
- /*
- * The OS doesn't seem to allow more than 10 words of
- * parameters (yay!). So we shouldn't be here.
- */
- warn("More than 10 words (%d) of arguments!\n", nargs);
- break;
- case 10: case 9: case 8: case 7:
- /*
- * If there are 7-10 words of arguments, they are placed
- * on the stack, as is normal for other processors.
- * The fall-through for all of these is deliberate!!!
- */
- iorequest.piod_op = PIOD_READ_D;
- iorequest.piod_offs = (void *)(regs.r_out[6] + SPOFF +
- offsetof(struct frame, fr_pad[6]));
- iorequest.piod_addr = &fsc.args[6];
- iorequest.piod_len = (nargs - 6) * sizeof(fsc.args[0]);
- ptrace(PT_IO, cpid, (caddr_t)&iorequest, 0);
- if (iorequest.piod_len == 0) return;
-
- case 6: fsc.args[5] = regs.r_out[5];
- case 5: fsc.args[4] = regs.r_out[4];
- case 4: fsc.args[3] = regs.r_out[3];
- case 3: fsc.args[2] = regs.r_out[2];
- case 2: fsc.args[1] = regs.r_out[1];
- case 1: fsc.args[0] = regs.r_out[0];
- case 0:
- break;
- }
-
- if (indir) {
- memmove(&fsc.args[0], &fsc.args[1], (nargs-1) * sizeof(fsc.args[0]));
- }
-
- sc = get_syscall(fsc.name);
- if (sc) {
- fsc.nargs = sc->nargs;
- } else {
-#if DEBUG
- fprintf(trussinfo->outfile, "unknown syscall %s -- setting args to %d\n",
- fsc.name, nargs);
-#endif
- fsc.nargs = nargs;
- }
-
- fsc.s_args = malloc((1+fsc.nargs) * sizeof(char*));
- memset(fsc.s_args, 0, fsc.nargs * sizeof(char*));
- fsc.sc = sc;
-
- /*
- * At this point, we set up the system call arguments.
- * We ignore any OUT ones, however -- those are arguments that
- * are set by the system call, and so are probably meaningless
- * now. This doesn't currently support arguments that are
- * passed in *and* out, however.
- */
-
- if (fsc.name) {
-
-#if DEBUG
- fprintf(stderr, "syscall %s(", fsc.name);
-#endif
- for (i = 0; i < fsc.nargs; i++) {
-#if DEBUG
- fprintf(stderr, "0x%x%s",
- sc
- ? fsc.args[sc->args[i].offset]
- : fsc.args[i],
- i < (fsc.nargs - 1) ? "," : "");
-#endif
- if (sc && !(sc->args[i].type & OUT)) {
- fsc.s_args[i] = print_arg(&sc->args[i], fsc.args, 0, trussinfo);
- }
- }
-#if DEBUG
- fprintf(stderr, ")\n");
-#endif
- }
-
-#if DEBUG
- fprintf(trussinfo->outfile, "\n");
-#endif
-
- if (fsc.name != NULL &&
- (!strcmp(fsc.name, "execve") || !strcmp(fsc.name, "exit"))) {
-
- /* XXX
- * This could be done in a more general
- * manner but it still wouldn't be very pretty.
- */
- if (!strcmp(fsc.name, "execve")) {
- if ((trussinfo->flags & EXECVEARGS) == 0)
- if (fsc.s_args[1]) {
- free(fsc.s_args[1]);
- fsc.s_args[1] = NULL;
- }
- if ((trussinfo->flags & EXECVEENVS) == 0)
- if (fsc.s_args[2]) {
- free(fsc.s_args[2]);
- fsc.s_args[2] = NULL;
- }
- }
- }
-
- return;
-}
-
-/*
- * And when the system call is done, we handle it here.
- * Currently, no attempt is made to ensure that the system calls
- * match -- this needs to be fixed (and is, in fact, why S_SCX includes
- * the sytem call number instead of, say, an error status).
- */
-
-long
-sparc64_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused) {
- struct reg regs;
- long retval;
- int i;
- int errorp;
- struct syscall *sc;
-
- if (fsc.name == NULL)
- return (-1);
- cpid = trussinfo->curthread->tid;
-
- if (ptrace(PT_GETREGS, cpid, (caddr_t)&regs, 0) < 0) {
- fprintf(trussinfo->outfile, "\n");
- return (-1);
- }
- retval = regs.r_out[0];
- errorp = !!(regs.r_tstate & TSTATE_XCC_C);
-
- /*
- * This code, while simpler than the initial versions I used, could
- * stand some significant cleaning.
- */
-
- sc = fsc.sc;
- if (!sc) {
- for (i = 0; i < fsc.nargs; i++)
- asprintf(&fsc.s_args[i], "0x%lx", fsc.args[i]);
- } else {
- /*
- * Here, we only look for arguments that have OUT masked in --
- * otherwise, they were handled in the syscall_entry function.
- */
- for (i = 0; i < sc->nargs; i++) {
- char *temp;
- if (sc->args[i].type & OUT) {
- /*
- * If an error occurred, than don't bothe getting the data;
- * it may not be valid.
- */
- if (errorp)
- asprintf(&temp, "0x%lx", fsc.args[sc->args[i].offset]);
- else
- temp = print_arg(&sc->args[i], fsc.args, retval, trussinfo);
- fsc.s_args[i] = temp;
- }
- }
- }
-
- if (fsc.name != NULL &&
- (!strcmp(fsc.name, "execve") || !strcmp(fsc.name, "exit"))) {
- trussinfo->curthread->in_syscall = 1;
- }
- /*
- * It would probably be a good idea to merge the error handling,
- * but that complicates things considerably.
- */
-
- print_syscall_ret(trussinfo, fsc.name, fsc.nargs, fsc.s_args, errorp, retval);
- clear_fsc();
-
- return (retval);
-}
diff --git a/usr.bin/truss/syscall.h b/usr.bin/truss/syscall.h
deleted file mode 100644
index 39a796a..0000000
--- a/usr.bin/truss/syscall.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * See i386-fbsd.c for copyright and license terms.
- *
- * System call arguments come in several flavours:
- * Hex -- values that should be printed in hex (addresses)
- * Octal -- Same as above, but octal
- * Int -- normal integer values (file descriptors, for example)
- * Name -- pointer to a NULL-terminated string.
- * BinString -- pointer to an array of chars, printed via strvisx().
- * Ptr -- pointer to some unspecified structure. Just print as hex for now.
- * Stat -- a pointer to a stat buffer. Prints a couple fields.
- * Ioctl -- an ioctl command. Woefully limited.
- * Quad -- a double-word value. e.g., lseek(int, offset_t, int)
- * Signal -- a signal number. Prints the signal name (SIGxxx)
- * Sockaddr -- a pointer to a struct sockaddr. Prints symbolic AF, and IP:Port
- * StringArray -- a pointer to an array of string pointers.
- * Timespec -- a pointer to a struct timespec. Prints both elements.
- * Timeval -- a pointer to a struct timeval. Prints both elements.
- * Timeval2 -- a pointer to two struct timevals. Prints both elements of both.
- * Itimerval -- a pointer to a struct itimerval. Prints all elements.
- * Pollfd -- a pointer to an array of struct pollfd. Prints .fd and .events.
- * Fd_set -- a pointer to an array of fd_set. Prints the fds that are set.
- * Sigaction -- a pointer to a struct sigaction. Prints all elements.
- * Umtx -- a pointer to a struct umtx. Prints the value of owner.
- * Sigset -- a pointer to a sigset_t. Prints the signals that are set.
- * Sigprocmask -- the first argument to sigprocmask(). Prints the name.
- * Kevent -- a pointer to an array of struct kevents. Prints all elements.
- * Pathconf -- the 2nd argument of pathconf().
- *
- * In addition, the pointer types (String, Ptr) may have OUT masked in --
- * this means that the data is set on *return* from the system call -- or
- * IN (meaning that the data is passed *into* the system call).
- */
-/*
- * $FreeBSD$
- */
-
-enum Argtype { None = 1, Hex, Octal, Int, Name, Ptr, Stat, Ioctl, Quad,
- Signal, Sockaddr, StringArray, Timespec, Timeval, Itimerval, Pollfd,
- Fd_set, Sigaction, Fcntl, Mprot, Mmapflags, Whence, Readlinkres,
- Umtx, Sigset, Sigprocmask, Kevent, Sockdomain, Socktype, Open,
- Fcntlflag, Rusage, BinString, Shutdown, Resource, Rlimit, Timeval2,
- Pathconf };
-
-#define ARG_MASK 0xff
-#define OUT 0x100
-#define IN /*0x20*/0
-
-struct syscall_args {
- enum Argtype type;
- int offset;
-};
-
-struct syscall {
- const char *name;
- int ret_type; /* 0, 1, or 2 return values */
- int nargs; /* actual number of meaningful arguments */
- /* Hopefully, no syscalls with > 10 args */
- struct syscall_args args[10];
-};
-
-struct syscall *get_syscall(const char*);
-char *print_arg(struct syscall_args *, unsigned long*, long, struct trussinfo *);
-void print_syscall(struct trussinfo *, const char *, int, char **);
-void print_syscall_ret(struct trussinfo *, const char *, int, char **, int,
- long);
diff --git a/usr.bin/truss/syscalls.c b/usr.bin/truss/syscalls.c
deleted file mode 100644
index d1b390b..0000000
--- a/usr.bin/truss/syscalls.c
+++ /dev/null
@@ -1,1090 +0,0 @@
-/*
- * Copryight 1997 Sean Eric Fagan
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Sean Eric Fagan
- * 4. Neither the name of the author may be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-/*
- * This file has routines used to print out system calls and their
- * arguments.
- */
-
-#include <sys/mman.h>
-#include <sys/types.h>
-#include <sys/ptrace.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <sys/un.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sys/ioccom.h>
-#include <machine/atomic.h>
-#include <errno.h>
-#include <sys/umtx.h>
-#include <sys/event.h>
-#include <sys/stat.h>
-#include <sys/resource.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <fcntl.h>
-#include <poll.h>
-#include <signal.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-#include <vis.h>
-
-#include "truss.h"
-#include "extern.h"
-#include "syscall.h"
-
-/* 64-bit alignment on 32-bit platforms. */
-#ifdef __powerpc__
-#define QUAD_ALIGN 1
-#else
-#define QUAD_ALIGN 0
-#endif
-
-/* Number of slots needed for a 64-bit argument. */
-#ifdef __LP64__
-#define QUAD_SLOTS 1
-#else
-#define QUAD_SLOTS 2
-#endif
-
-/*
- * This should probably be in its own file, sorted alphabetically.
- */
-
-struct syscall syscalls[] = {
- { "fcntl", 1, 3,
- { { Int, 0 } , { Fcntl, 1 }, { Fcntlflag | OUT, 2 } } },
- { "readlink", 1, 3,
- { { Name, 0 } , { Readlinkres | OUT, 1 }, { Int, 2 } } },
- { "lseek", 2, 3,
- { { Int, 0 }, { Quad, 1 + QUAD_ALIGN }, { Whence, 1 + QUAD_SLOTS + QUAD_ALIGN } } },
- { "linux_lseek", 2, 3,
- { { Int, 0 }, { Int, 1 }, { Whence, 2 } } },
- { "mmap", 2, 6,
- { { Ptr, 0 }, { Int, 1 }, { Mprot, 2 }, { Mmapflags, 3 }, { Int, 4 }, { Quad, 5 + QUAD_ALIGN } } },
- { "mprotect", 1, 3,
- { { Ptr, 0 }, { Int, 1 }, { Mprot, 2 } } },
- { "open", 1, 3,
- { { Name | IN, 0 } , { Open, 1 }, { Octal, 2 } } },
- { "mkdir", 1, 2,
- { { Name, 0 } , { Octal, 1 } } },
- { "linux_open", 1, 3,
- { { Name, 0 }, { Hex, 1 }, { Octal, 2 } } },
- { "close", 1, 1,
- { { Int, 0 } } },
- { "link", 0, 2,
- { { Name, 0 }, { Name, 1 } } },
- { "unlink", 0, 1,
- { { Name, 0 } } },
- { "chdir", 0, 1,
- { { Name, 0 } } },
- { "chroot", 0, 1,
- { { Name, 0 } } },
- { "mknod", 0, 3,
- { { Name, 0 }, { Octal, 1 }, { Int, 3 } } },
- { "chmod", 0, 2,
- { { Name, 0 }, { Octal, 1 } } },
- { "chown", 0, 3,
- { { Name, 0 }, { Int, 1 }, { Int, 2 } } },
- { "mount", 0, 4,
- { { Name, 0 }, { Name, 1 }, { Int, 2 }, { Ptr, 3 } } },
- { "umount", 0, 2,
- { { Name, 0 }, { Int, 2 } } },
- { "fstat", 1, 2,
- { { Int, 0 }, { Stat | OUT , 1 } } },
- { "stat", 1, 2,
- { { Name | IN, 0 }, { Stat | OUT, 1 } } },
- { "lstat", 1, 2,
- { { Name | IN, 0 }, { Stat | OUT, 1 } } },
- { "linux_newstat", 1, 2,
- { { Name | IN, 0 }, { Ptr | OUT, 1 } } },
- { "linux_newfstat", 1, 2,
- { { Int, 0 }, { Ptr | OUT, 1 } } },
- { "write", 1, 3,
- { { Int, 0 }, { BinString | IN, 1 }, { Int, 2 } } },
- { "ioctl", 1, 3,
- { { Int, 0 }, { Ioctl, 1 }, { Hex, 2 } } },
- { "break", 1, 1, { { Ptr, 0 } } },
- { "exit", 0, 1, { { Hex, 0 } } },
- { "access", 1, 2, { { Name | IN, 0 }, { Int, 1 } } },
- { "sigaction", 1, 3,
- { { Signal, 0 }, { Sigaction | IN, 1 }, { Sigaction | OUT, 2 } } },
- { "accept", 1, 3,
- { { Int, 0 }, { Sockaddr | OUT, 1 }, { Ptr | OUT, 2 } } },
- { "bind", 1, 3,
- { { Int, 0 }, { Sockaddr | IN, 1 }, { Int, 2 } } },
- { "connect", 1, 3,
- { { Int, 0 }, { Sockaddr | IN, 1 }, { Int, 2 } } },
- { "getpeername", 1, 3,
- { { Int, 0 }, { Sockaddr | OUT, 1 }, { Ptr | OUT, 2 } } },
- { "getsockname", 1, 3,
- { { Int, 0 }, { Sockaddr | OUT, 1 }, { Ptr | OUT, 2 } } },
- { "recvfrom", 1, 6,
- { { Int, 0 }, { BinString | OUT, 1 }, { Int, 2 }, { Hex, 3 }, { Sockaddr | OUT, 4 }, { Ptr | OUT, 5 } } },
- { "sendto", 1, 6,
- { { Int, 0 }, { BinString | IN, 1 }, { Int, 2 }, { Hex, 3 }, { Sockaddr | IN, 4 }, { Ptr | IN, 5 } } },
- { "execve", 1, 3,
- { { Name | IN, 0 }, { StringArray | IN, 1 }, { StringArray | IN, 2 } } },
- { "linux_execve", 1, 3,
- { { Name | IN, 0 }, { StringArray | IN, 1 }, { StringArray | IN, 2 } } },
- { "kldload", 0, 1, { { Name | IN, 0 } } },
- { "kldunload", 0, 1, { { Int, 0 } } },
- { "kldfind", 0, 1, { { Name | IN, 0 } } },
- { "kldnext", 0, 1, { { Int, 0 } } },
- { "kldstat", 0, 2, { { Int, 0 }, { Ptr, 1 } } },
- { "kldfirstmod", 0, 1, { { Int, 0 } } },
- { "nanosleep", 0, 1, { { Timespec, 0 } } },
- { "select", 1, 5, { { Int, 0 }, { Fd_set, 1 }, { Fd_set, 2 }, { Fd_set, 3 }, { Timeval, 4 } } },
- { "poll", 1, 3, { { Pollfd, 0 }, { Int, 1 }, { Int, 2 } } },
- { "gettimeofday", 1, 2, { { Timeval | OUT, 0 }, { Ptr, 1 } } },
- { "clock_gettime", 1, 2, { { Int, 0 }, { Timespec | OUT, 1 } } },
- { "getitimer", 1, 2, { { Int, 0 }, { Itimerval | OUT, 2 } } },
- { "setitimer", 1, 3, { { Int, 0 }, { Itimerval, 1 } , { Itimerval | OUT, 2 } } },
- { "kse_release", 0, 1, { { Timespec, 0 } } },
- { "kevent", 0, 6, { { Int, 0 }, { Kevent, 1 }, { Int, 2 }, { Kevent | OUT, 3 }, { Int, 4 }, { Timespec, 5 } } },
- { "_umtx_lock", 0, 1, { { Umtx, 0 } } },
- { "_umtx_unlock", 0, 1, { { Umtx, 0 } } },
- { "sigprocmask", 0, 3, { { Sigprocmask, 0 }, { Sigset, 1 }, { Sigset | OUT, 2 } } },
- { "unmount", 1, 2, { { Name, 0 }, { Int, 1 } } },
- { "socket", 1, 3, { { Sockdomain, 0 }, { Socktype, 1 }, { Int, 2 } } },
- { "getrusage", 1, 2, { { Int, 0 }, { Rusage | OUT, 1 } } },
- { "__getcwd", 1, 2, { { Name | OUT, 0 }, { Int, 1 } } },
- { "shutdown", 1, 2, { { Int, 0 }, { Shutdown, 1 } } },
- { "getrlimit", 1, 2, { { Resource, 0 }, { Rlimit | OUT, 1 } } },
- { "setrlimit", 1, 2, { { Resource, 0 }, { Rlimit | IN, 1 } } },
- { "utimes", 1, 2,
- { { Name | IN, 0 }, { Timeval2 | IN, 1 } } },
- { "lutimes", 1, 2,
- { { Name | IN, 0 }, { Timeval2 | IN, 1 } } },
- { "futimes", 1, 2,
- { { Int, 0 }, { Timeval | IN, 1 } } },
- { "chflags", 1, 2,
- { { Name | IN, 0 }, { Hex, 1 } } },
- { "lchflags", 1, 2,
- { { Name | IN, 0 }, { Hex, 1 } } },
- { "pathconf", 1, 2,
- { { Name | IN, 0 }, { Pathconf, 1 } } },
- { "truncate", 1, 3,
- { { Name | IN, 0 }, { Int | IN, 1 }, { Quad | IN, 2 } } },
- { "ftruncate", 1, 3,
- { { Int | IN, 0 }, { Int | IN, 1 }, { Quad | IN, 2 } } },
- { "kill", 1, 2,
- { { Int | IN, 0 }, { Signal | IN, 1 } } },
- { "munmap", 1, 2,
- { { Ptr, 0 }, { Int, 1 } } },
- { "read", 1, 3,
- { { Int, 0 }, { BinString | OUT, 1 }, { Int, 2 } } },
- { "rename", 1, 2,
- { { Name , 0 } , { Name, 1 } } },
- { "symlink", 1, 2,
- { { Name , 0 } , { Name, 1 } } },
- { 0, 0, 0, { { 0, 0 } } },
-};
-
-/* Xlat idea taken from strace */
-struct xlat {
- int val;
- const char *str;
-};
-
-#define X(a) { a, #a },
-#define XEND { 0, NULL }
-
-static struct xlat kevent_filters[] = {
- X(EVFILT_READ) X(EVFILT_WRITE) X(EVFILT_AIO) X(EVFILT_VNODE)
- X(EVFILT_PROC) X(EVFILT_SIGNAL) X(EVFILT_TIMER)
- X(EVFILT_NETDEV) X(EVFILT_FS) X(EVFILT_READ) XEND
-};
-
-static struct xlat kevent_flags[] = {
- X(EV_ADD) X(EV_DELETE) X(EV_ENABLE) X(EV_DISABLE) X(EV_ONESHOT)
- X(EV_CLEAR) X(EV_FLAG1) X(EV_ERROR) X(EV_EOF) XEND
-};
-
-struct xlat poll_flags[] = {
- X(POLLSTANDARD) X(POLLIN) X(POLLPRI) X(POLLOUT) X(POLLERR)
- X(POLLHUP) X(POLLNVAL) X(POLLRDNORM) X(POLLRDBAND)
- X(POLLWRBAND) X(POLLINIGNEOF) XEND
-};
-
-static struct xlat mmap_flags[] = {
- X(MAP_SHARED) X(MAP_PRIVATE) X(MAP_FIXED) X(MAP_RENAME)
- X(MAP_NORESERVE) X(MAP_RESERVED0080) X(MAP_RESERVED0100)
- X(MAP_HASSEMAPHORE) X(MAP_STACK) X(MAP_NOSYNC) X(MAP_ANON)
- X(MAP_NOCORE) XEND
-};
-
-static struct xlat mprot_flags[] = {
- X(PROT_NONE) X(PROT_READ) X(PROT_WRITE) X(PROT_EXEC) XEND
-};
-
-static struct xlat whence_arg[] = {
- X(SEEK_SET) X(SEEK_CUR) X(SEEK_END) XEND
-};
-
-static struct xlat sigaction_flags[] = {
- X(SA_ONSTACK) X(SA_RESTART) X(SA_RESETHAND) X(SA_NOCLDSTOP)
- X(SA_NODEFER) X(SA_NOCLDWAIT) X(SA_SIGINFO) XEND
-};
-
-static struct xlat fcntl_arg[] = {
- X(F_DUPFD) X(F_GETFD) X(F_SETFD) X(F_GETFL) X(F_SETFL)
- X(F_GETOWN) X(F_SETOWN) X(F_GETLK) X(F_SETLK) X(F_SETLKW) XEND
-};
-
-static struct xlat fcntlfd_arg[] = {
- X(FD_CLOEXEC) XEND
-};
-
-static struct xlat fcntlfl_arg[] = {
- X(O_APPEND) X(O_ASYNC) X(O_FSYNC) X(O_NONBLOCK) X(O_NOFOLLOW)
- X(O_DIRECT) XEND
-};
-
-static struct xlat sockdomain_arg[] = {
- X(PF_UNSPEC) X(PF_LOCAL) X(PF_UNIX) X(PF_INET) X(PF_IMPLINK)
- X(PF_PUP) X(PF_CHAOS) X(PF_NETBIOS) X(PF_ISO) X(PF_OSI)
- X(PF_ECMA) X(PF_DATAKIT) X(PF_CCITT) X(PF_SNA) X(PF_DECnet)
- X(PF_DLI) X(PF_LAT) X(PF_HYLINK) X(PF_APPLETALK) X(PF_ROUTE)
- X(PF_LINK) X(PF_XTP) X(PF_COIP) X(PF_CNT) X(PF_SIP) X(PF_IPX)
- X(PF_RTIP) X(PF_PIP) X(PF_ISDN) X(PF_KEY) X(PF_INET6)
- X(PF_NATM) X(PF_ATM) X(PF_NETGRAPH) X(PF_SLOW) X(PF_SCLUSTER)
- X(PF_ARP) X(PF_BLUETOOTH) XEND
-};
-
-static struct xlat socktype_arg[] = {
- X(SOCK_STREAM) X(SOCK_DGRAM) X(SOCK_RAW) X(SOCK_RDM)
- X(SOCK_SEQPACKET) XEND
-};
-
-static struct xlat open_flags[] = {
- X(O_RDONLY) X(O_WRONLY) X(O_RDWR) X(O_ACCMODE) X(O_NONBLOCK)
- X(O_APPEND) X(O_SHLOCK) X(O_EXLOCK) X(O_ASYNC) X(O_FSYNC)
- X(O_NOFOLLOW) X(O_CREAT) X(O_TRUNC) X(O_EXCL) X(O_NOCTTY)
- X(O_DIRECT) XEND
-};
-
-static struct xlat shutdown_arg[] = {
- X(SHUT_RD) X(SHUT_WR) X(SHUT_RDWR) XEND
-};
-
-static struct xlat resource_arg[] = {
- X(RLIMIT_CPU) X(RLIMIT_FSIZE) X(RLIMIT_DATA) X(RLIMIT_STACK)
- X(RLIMIT_CORE) X(RLIMIT_RSS) X(RLIMIT_MEMLOCK) X(RLIMIT_NPROC)
- X(RLIMIT_NOFILE) X(RLIMIT_SBSIZE) X(RLIMIT_VMEM) XEND
-};
-
-static struct xlat pathconf_arg[] = {
- X(_PC_LINK_MAX) X(_PC_MAX_CANON) X(_PC_MAX_INPUT)
- X(_PC_NAME_MAX) X(_PC_PATH_MAX) X(_PC_PIPE_BUF)
- X(_PC_CHOWN_RESTRICTED) X(_PC_NO_TRUNC) X(_PC_VDISABLE)
- X(_PC_ASYNC_IO) X(_PC_PRIO_IO) X(_PC_SYNC_IO)
- X(_PC_ALLOC_SIZE_MIN) X(_PC_FILESIZEBITS)
- X(_PC_REC_INCR_XFER_SIZE) X(_PC_REC_MAX_XFER_SIZE)
- X(_PC_REC_MIN_XFER_SIZE) X(_PC_REC_XFER_ALIGN)
- X(_PC_SYMLINK_MAX) X(_PC_ACL_EXTENDED) X(_PC_ACL_PATH_MAX)
- X(_PC_CAP_PRESENT) X(_PC_INF_PRESENT) X(_PC_MAC_PRESENT)
- XEND
-};
-
-#undef X
-#undef XEND
-
-/*
- * Searches an xlat array for a value, and returns it if found. Otherwise
- * return a string representation.
- */
-static const char *
-lookup(struct xlat *xlat, int val, int base)
-{
- static char tmp[16];
-
- for (; xlat->str != NULL; xlat++)
- if (xlat->val == val)
- return (xlat->str);
- switch (base) {
- case 8:
- sprintf(tmp, "0%o", val);
- break;
- case 16:
- sprintf(tmp, "0x%x", val);
- break;
- case 10:
- sprintf(tmp, "%u", val);
- break;
- default:
- errx(1,"Unknown lookup base");
- break;
- }
- return (tmp);
-}
-
-static const char *
-xlookup(struct xlat *xlat, int val)
-{
-
- return (lookup(xlat, val, 16));
-}
-
-/* Searches an xlat array containing bitfield values. Remaining bits
- set after removing the known ones are printed at the end:
- IN|0x400 */
-static char *
-xlookup_bits(struct xlat *xlat, int val)
-{
- static char str[512];
- int len = 0;
- int rem = val;
-
- for (; xlat->str != NULL; xlat++) {
- if ((xlat->val & rem) == xlat->val) {
- /* don't print the "all-bits-zero" string unless all
- bits are really zero */
- if (xlat->val == 0 && val != 0)
- continue;
- len += sprintf(str + len, "%s|", xlat->str);
- rem &= ~(xlat->val);
- }
- }
- /* if we have leftover bits or didn't match anything */
- if (rem || len == 0)
- len += sprintf(str + len, "0x%x", rem);
- if (len && str[len - 1] == '|')
- len--;
- str[len] = 0;
- return (str);
-}
-
-/*
- * If/when the list gets big, it might be desirable to do it
- * as a hash table or binary search.
- */
-
-struct syscall *
-get_syscall(const char *name)
-{
- struct syscall *sc = syscalls;
-
- if (name == NULL)
- return (NULL);
- while (sc->name) {
- if (!strcmp(name, sc->name))
- return (sc);
- sc++;
- }
- return (NULL);
-}
-
-/*
- * get_struct
- *
- * Copy a fixed amount of bytes from the process.
- */
-
-static int
-get_struct(int pid, void *offset, void *buf, int len)
-{
- struct ptrace_io_desc iorequest;
-
- iorequest.piod_op = PIOD_READ_D;
- iorequest.piod_offs = offset;
- iorequest.piod_addr = buf;
- iorequest.piod_len = len;
- if (ptrace(PT_IO, pid, (caddr_t)&iorequest, 0) < 0)
- return (-1);
- return (0);
-}
-
-#define MAXSIZE 4096
-#define BLOCKSIZE 1024
-/*
- * get_string
- * Copy a string from the process. Note that it is
- * expected to be a C string, but if max is set, it will
- * only get that much.
- */
-
-static char *
-get_string(pid_t pid, void *offset, int max)
-{
- char *buf;
- struct ptrace_io_desc iorequest;
- int totalsize, size;
- int diff = 0;
- int i;
-
- totalsize = size = max ? (max + 1) : BLOCKSIZE;
- buf = malloc(totalsize);
- if (buf == NULL)
- return (NULL);
- for (;;) {
- diff = totalsize - size;
- iorequest.piod_op = PIOD_READ_D;
- iorequest.piod_offs = (char *)offset + diff;
- iorequest.piod_addr = buf + diff;
- iorequest.piod_len = size;
- if (ptrace(PT_IO, pid, (caddr_t)&iorequest, 0) < 0) {
- free(buf);
- return (NULL);
- }
- for (i = 0 ; i < size; i++) {
- if (buf[diff + i] == '\0')
- return (buf);
- }
- if (totalsize < MAXSIZE - BLOCKSIZE && max == 0) {
- totalsize += BLOCKSIZE;
- buf = realloc(buf, totalsize);
- size = BLOCKSIZE;
- } else {
- buf[totalsize] = '\0';
- return (buf);
- }
- }
-}
-
-
-/*
- * print_arg
- * Converts a syscall argument into a string. Said string is
- * allocated via malloc(), so needs to be free()'d. The file
- * descriptor is for the process' memory (via /proc), and is used
- * to get any data (where the argument is a pointer). sc is
- * a pointer to the syscall description (see above); args is
- * an array of all of the system call arguments.
- */
-
-char *
-print_arg(struct syscall_args *sc, unsigned long *args, long retval, struct trussinfo *trussinfo)
-{
- char *tmp = NULL;
- int pid = trussinfo->pid;
-
- switch (sc->type & ARG_MASK) {
- case Hex:
- asprintf(&tmp, "0x%x", (int)args[sc->offset]);
- break;
- case Octal:
- asprintf(&tmp, "0%o", (int)args[sc->offset]);
- break;
- case Int:
- asprintf(&tmp, "%d", (int)args[sc->offset]);
- break;
- case Name: {
- /* NULL-terminated string. */
- char *tmp2;
- tmp2 = get_string(pid, (void*)args[sc->offset], 0);
- asprintf(&tmp, "\"%s\"", tmp2);
- free(tmp2);
- break;
- }
- case BinString: {
- /* Binary block of data that might have printable characters.
- XXX If type|OUT, assume that the length is the syscall's
- return value. Otherwise, assume that the length of the block
- is in the next syscall argument. */
- int max_string = trussinfo->strsize;
- char tmp2[max_string+1], *tmp3;
- int len;
- int truncated = 0;
-
- if (sc->type & OUT)
- len = retval;
- else
- len = args[sc->offset + 1];
-
- /* Don't print more than max_string characters, to avoid word
- wrap. If we have to truncate put some ... after the string.
- */
- if (len > max_string) {
- len = max_string;
- truncated = 1;
- }
- if (len && get_struct(pid, (void*)args[sc->offset], &tmp2, len) != -1) {
- tmp3 = malloc(len * 4 + 1);
- while (len) {
- if (strvisx(tmp3, tmp2, len, VIS_CSTYLE|VIS_TAB|VIS_NL) <= max_string)
- break;
- len--;
- truncated = 1;
- };
- asprintf(&tmp, "\"%s\"%s", tmp3, truncated?"...":"");
- free(tmp3);
- } else {
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- }
- break;
- }
- case StringArray: {
- int num, size, i;
- char *tmp2;
- char *string;
- char *strarray[100]; /* XXX This is ugly. */
-
- if (get_struct(pid, (void *)args[sc->offset], (void *)&strarray,
- sizeof(strarray)) == -1) {
- err(1, "get_struct %p", (void *)args[sc->offset]);
- }
- num = 0;
- size = 0;
-
- /* Find out how large of a buffer we'll need. */
- while (strarray[num] != NULL) {
- string = get_string(pid, (void*)strarray[num], 0);
- size += strlen(string);
- free(string);
- num++;
- }
- size += 4 + (num * 4);
- tmp = (char *)malloc(size);
- tmp2 = tmp;
-
- tmp2 += sprintf(tmp2, " [");
- for (i = 0; i < num; i++) {
- string = get_string(pid, (void*)strarray[i], 0);
- tmp2 += sprintf(tmp2, " \"%s\"%c", string, (i+1 == num) ? ' ' : ',');
- free(string);
- }
- tmp2 += sprintf(tmp2, "]");
- break;
- }
-#ifdef __LP64__
- case Quad:
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- break;
-#else
- case Quad: {
- unsigned long long ll;
- ll = *(unsigned long long *)(args + sc->offset);
- asprintf(&tmp, "0x%llx", ll);
- break;
- }
-#endif
- case Ptr:
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- break;
- case Readlinkres: {
- char *tmp2;
- if (retval == -1) {
- tmp = strdup("");
- break;
- }
- tmp2 = get_string(pid, (void*)args[sc->offset], retval);
- asprintf(&tmp, "\"%s\"", tmp2);
- free(tmp2);
- break;
- }
- case Ioctl: {
- const char *temp = ioctlname(args[sc->offset]);
- if (temp) {
- tmp = strdup(temp);
- } else {
- unsigned long arg = args[sc->offset];
- asprintf(&tmp, "0x%lx { IO%s%s 0x%lx('%c'), %lu, %lu }", arg,
- arg&IOC_OUT?"R":"", arg&IOC_IN?"W":"",
- IOCGROUP(arg), isprint(IOCGROUP(arg))?(char)IOCGROUP(arg):'?',
- arg & 0xFF, IOCPARM_LEN(arg));
- }
- break;
- }
- case Umtx: {
- struct umtx umtx;
- if (get_struct(pid, (void *)args[sc->offset], &umtx, sizeof(umtx)) != -1)
- asprintf(&tmp, "{ 0x%lx }", (long)umtx.u_owner);
- else
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- break;
- }
- case Timespec: {
- struct timespec ts;
- if (get_struct(pid, (void *)args[sc->offset], &ts, sizeof(ts)) != -1)
- asprintf(&tmp, "{%ld.%09ld }", (long)ts.tv_sec, ts.tv_nsec);
- else
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- break;
- }
- case Timeval: {
- struct timeval tv;
- if (get_struct(pid, (void *)args[sc->offset], &tv, sizeof(tv)) != -1)
- asprintf(&tmp, "{%ld.%06ld }", (long)tv.tv_sec, tv.tv_usec);
- else
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- break;
- }
- case Timeval2: {
- struct timeval tv[2];
- if (get_struct(pid, (void *)args[sc->offset], &tv, sizeof(tv)) != -1)
- asprintf(&tmp, "{%ld.%06ld, %ld.%06ld }",
- (long)tv[0].tv_sec, tv[0].tv_usec,
- (long)tv[1].tv_sec, tv[1].tv_usec);
- else
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- break;
- }
- case Itimerval: {
- struct itimerval itv;
- if (get_struct(pid, (void *)args[sc->offset], &itv, sizeof(itv)) != -1)
- asprintf(&tmp, "{%ld.%06ld, %ld.%06ld }",
- (long)itv.it_interval.tv_sec,
- itv.it_interval.tv_usec,
- (long)itv.it_value.tv_sec,
- itv.it_value.tv_usec);
- else
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- break;
- }
- case Pollfd: {
- /*
- * XXX: A Pollfd argument expects the /next/ syscall argument to be
- * the number of fds in the array. This matches the poll syscall.
- */
- struct pollfd *pfd;
- int numfds = args[sc->offset+1];
- int bytes = sizeof(struct pollfd) * numfds;
- int i, tmpsize, u, used;
- const int per_fd = 100;
-
- if ((pfd = malloc(bytes)) == NULL)
- err(1, "Cannot malloc %d bytes for pollfd array", bytes);
- if (get_struct(pid, (void *)args[sc->offset], pfd, bytes) != -1) {
-
- used = 0;
- tmpsize = 1 + per_fd * numfds + 2;
- if ((tmp = malloc(tmpsize)) == NULL)
- err(1, "Cannot alloc %d bytes for poll output", tmpsize);
-
- tmp[used++] = '{';
- for (i = 0; i < numfds; i++) {
-
- u = snprintf(tmp + used, per_fd,
- "%s%d/%s",
- i > 0 ? " " : "",
- pfd[i].fd,
- xlookup_bits(poll_flags, pfd[i].events) );
- if (u > 0)
- used += u < per_fd ? u : per_fd;
- }
- tmp[used++] = '}';
- tmp[used++] = '\0';
- } else {
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- }
- free(pfd);
- break;
- }
- case Fd_set: {
- /*
- * XXX: A Fd_set argument expects the /first/ syscall argument to be
- * the number of fds in the array. This matches the select syscall.
- */
- fd_set *fds;
- int numfds = args[0];
- int bytes = _howmany(numfds, _NFDBITS) * _NFDBITS;
- int i, tmpsize, u, used;
- const int per_fd = 20;
-
- if ((fds = malloc(bytes)) == NULL)
- err(1, "Cannot malloc %d bytes for fd_set array", bytes);
- if (get_struct(pid, (void *)args[sc->offset], fds, bytes) != -1) {
- used = 0;
- tmpsize = 1 + numfds * per_fd + 2;
- if ((tmp = malloc(tmpsize)) == NULL)
- err(1, "Cannot alloc %d bytes for fd_set output", tmpsize);
-
- tmp[used++] = '{';
- for (i = 0; i < numfds; i++) {
- if (FD_ISSET(i, fds)) {
- u = snprintf(tmp + used, per_fd, "%d ", i);
- if (u > 0)
- used += u < per_fd ? u : per_fd;
- }
- }
- if (tmp[used-1] == ' ')
- used--;
- tmp[used++] = '}';
- tmp[used++] = '\0';
- } else {
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- }
- free(fds);
- break;
- }
- case Signal: {
- long sig;
-
- sig = args[sc->offset];
- tmp = strsig(sig);
- if (tmp == NULL)
- asprintf(&tmp, "%ld", sig);
- break;
- }
- case Sigset: {
- long sig;
- sigset_t ss;
- int i, used;
-
- sig = args[sc->offset];
- if (get_struct(pid, (void *)args[sc->offset], (void *)&ss, sizeof(ss)) == -1) {
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- break;
- }
- tmp = malloc(sys_nsig * 8); /* 7 bytes avg per signal name */
- used = 0;
- for (i = 1; i < sys_nsig; i++) {
- if (sigismember(&ss, i)) {
- used += sprintf(tmp + used, "%s|", strsig(i));
- }
- }
- if (used)
- tmp[used-1] = 0;
- else
- strcpy(tmp, "0x0");
- break;
- }
- case Sigprocmask: {
- switch (args[sc->offset]) {
-#define S(a) case a: tmp = strdup(#a); break;
- S(SIG_BLOCK);
- S(SIG_UNBLOCK);
- S(SIG_SETMASK);
-#undef S
- }
- if (tmp == NULL)
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- break;
- }
- case Fcntlflag: {
- /* XXX output depends on the value of the previous argument */
- switch (args[sc->offset-1]) {
- case F_SETFD:
- tmp = strdup(xlookup_bits(fcntlfd_arg, args[sc->offset]));
- break;
- case F_SETFL:
- tmp = strdup(xlookup_bits(fcntlfl_arg, args[sc->offset]));
- break;
- case F_GETFD:
- case F_GETFL:
- case F_GETOWN:
- tmp = strdup("");
- break;
- default:
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- break;
- }
- break;
- }
- case Open:
- tmp = strdup(xlookup_bits(open_flags, args[sc->offset]));
- break;
- case Fcntl:
- tmp = strdup(xlookup(fcntl_arg, args[sc->offset]));
- break;
- case Mprot:
- tmp = strdup(xlookup_bits(mprot_flags, args[sc->offset]));
- break;
- case Mmapflags:
- tmp = strdup(xlookup_bits(mmap_flags, args[sc->offset]));
- break;
- case Whence:
- tmp = strdup(xlookup(whence_arg, args[sc->offset]));
- break;
- case Sockdomain:
- tmp = strdup(xlookup(sockdomain_arg, args[sc->offset]));
- break;
- case Socktype:
- tmp = strdup(xlookup(socktype_arg, args[sc->offset]));
- break;
- case Shutdown:
- tmp = strdup(xlookup(shutdown_arg, args[sc->offset]));
- break;
- case Resource:
- tmp = strdup(xlookup(resource_arg, args[sc->offset]));
- break;
- case Pathconf:
- tmp = strdup(xlookup(pathconf_arg, args[sc->offset]));
- break;
- case Sockaddr: {
- struct sockaddr_storage ss;
- char addr[64];
- struct sockaddr_in *lsin;
- struct sockaddr_in6 *lsin6;
- struct sockaddr_un *sun;
- struct sockaddr *sa;
- char *p;
- u_char *q;
- int i;
-
- if (args[sc->offset] == 0) {
- asprintf(&tmp, "NULL");
- break;
- }
-
- /* yuck: get ss_len */
- if (get_struct(pid, (void *)args[sc->offset], (void *)&ss,
- sizeof(ss.ss_len) + sizeof(ss.ss_family)) == -1)
- err(1, "get_struct %p", (void *)args[sc->offset]);
- /*
- * If ss_len is 0, then try to guess from the sockaddr type.
- * AF_UNIX may be initialized incorrectly, so always frob
- * it by using the "right" size.
- */
- if (ss.ss_len == 0 || ss.ss_family == AF_UNIX) {
- switch (ss.ss_family) {
- case AF_INET:
- ss.ss_len = sizeof(*lsin);
- break;
- case AF_UNIX:
- ss.ss_len = sizeof(*sun);
- break;
- default:
- /* hurrrr */
- break;
- }
- }
- if (get_struct(pid, (void *)args[sc->offset], (void *)&ss, ss.ss_len)
- == -1) {
- err(2, "get_struct %p", (void *)args[sc->offset]);
- }
-
- switch (ss.ss_family) {
- case AF_INET:
- lsin = (struct sockaddr_in *)&ss;
- inet_ntop(AF_INET, &lsin->sin_addr, addr, sizeof addr);
- asprintf(&tmp, "{ AF_INET %s:%d }", addr, htons(lsin->sin_port));
- break;
- case AF_INET6:
- lsin6 = (struct sockaddr_in6 *)&ss;
- inet_ntop(AF_INET6, &lsin6->sin6_addr, addr, sizeof addr);
- asprintf(&tmp, "{ AF_INET6 [%s]:%d }", addr, htons(lsin6->sin6_port));
- break;
- case AF_UNIX:
- sun = (struct sockaddr_un *)&ss;
- asprintf(&tmp, "{ AF_UNIX \"%s\" }", sun->sun_path);
- break;
- default:
- sa = (struct sockaddr *)&ss;
- asprintf(&tmp, "{ sa_len = %d, sa_family = %d, sa_data = {%n%*s } }",
- (int)sa->sa_len, (int)sa->sa_family, &i,
- 6 * (int)(sa->sa_len - ((char *)&sa->sa_data - (char *)sa)), "");
- if (tmp != NULL) {
- p = tmp + i;
- for (q = (u_char *)&sa->sa_data; q < (u_char *)sa + sa->sa_len; q++)
- p += sprintf(p, " %#02x,", *q);
- }
- }
- break;
- }
- case Sigaction: {
- struct sigaction sa;
- char *hand;
- const char *h;
-
- if (get_struct(pid, (void *)args[sc->offset], &sa, sizeof(sa)) != -1) {
-
- asprintf(&hand, "%p", sa.sa_handler);
- if (sa.sa_handler == SIG_DFL)
- h = "SIG_DFL";
- else if (sa.sa_handler == SIG_IGN)
- h = "SIG_IGN";
- else
- h = hand;
-
- asprintf(&tmp, "{ %s %s ss_t }",
- h,
- xlookup_bits(sigaction_flags, sa.sa_flags));
- free(hand);
- } else {
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- }
- break;
- }
- case Kevent: {
- /*
- * XXX XXX: the size of the array is determined by either the
- * next syscall argument, or by the syscall returnvalue,
- * depending on which argument number we are. This matches the
- * kevent syscall, but luckily that's the only syscall that uses
- * them.
- */
- struct kevent *ke;
- int numevents = -1;
- int bytes = 0;
- int i, tmpsize, u, used;
- const int per_ke = 100;
-
- if (sc->offset == 1)
- numevents = args[sc->offset+1];
- else if (sc->offset == 3 && retval != -1)
- numevents = retval;
-
- if (numevents >= 0)
- bytes = sizeof(struct kevent) * numevents;
- if ((ke = malloc(bytes)) == NULL)
- err(1, "Cannot malloc %d bytes for kevent array", bytes);
- if (numevents >= 0 && get_struct(pid, (void *)args[sc->offset], ke, bytes) != -1) {
- used = 0;
- tmpsize = 1 + per_ke * numevents + 2;
- if ((tmp = malloc(tmpsize)) == NULL)
- err(1, "Cannot alloc %d bytes for kevent output", tmpsize);
-
- tmp[used++] = '{';
- for (i = 0; i < numevents; i++) {
- u = snprintf(tmp + used, per_ke,
- "%s%p,%s,%s,%d,%p,%p",
- i > 0 ? " " : "",
- (void *)ke[i].ident,
- xlookup(kevent_filters, ke[i].filter),
- xlookup_bits(kevent_flags, ke[i].flags),
- ke[i].fflags,
- (void *)ke[i].data,
- (void *)ke[i].udata);
- if (u > 0)
- used += u < per_ke ? u : per_ke;
- }
- tmp[used++] = '}';
- tmp[used++] = '\0';
- } else {
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- }
- free(ke);
- break;
- }
- case Stat: {
- struct stat st;
- if (get_struct(pid, (void *)args[sc->offset], &st, sizeof(st)) != -1) {
- char mode[12];
- strmode(st.st_mode, mode);
- asprintf(&tmp, "{ mode=%s,inode=%jd,size=%jd,blksize=%ld }",
- mode,
- (intmax_t)st.st_ino,(intmax_t)st.st_size,(long)st.st_blksize);
- } else {
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- }
- break;
- }
- case Rusage: {
- struct rusage ru;
- if (get_struct(pid, (void *)args[sc->offset], &ru, sizeof(ru)) != -1) {
- asprintf(&tmp, "{ u=%ld.%06ld,s=%ld.%06ld,in=%ld,out=%ld }",
- (long)ru.ru_utime.tv_sec, ru.ru_utime.tv_usec,
- (long)ru.ru_stime.tv_sec, ru.ru_stime.tv_usec,
- ru.ru_inblock, ru.ru_oublock);
- } else {
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- }
- break;
- }
- case Rlimit: {
- struct rlimit rl;
- if (get_struct(pid, (void *)args[sc->offset], &rl, sizeof(rl)) != -1) {
- asprintf(&tmp, "{ cur=%ju,max=%ju }",
- rl.rlim_cur, rl.rlim_max);
- } else {
- asprintf(&tmp, "0x%lx", args[sc->offset]);
- }
- break;
- }
- default:
- errx(1, "Invalid argument type %d\n", sc->type & ARG_MASK);
- }
- return (tmp);
-}
-
-/*
- * print_syscall
- * Print (to outfile) the system call and its arguments. Note that
- * nargs is the number of arguments (not the number of words; this is
- * potentially confusing, I know).
- */
-
-void
-print_syscall(struct trussinfo *trussinfo, const char *name, int nargs, char **s_args)
-{
- int i;
- int len = 0;
- struct timespec timediff;
-
- if (trussinfo->flags & FOLLOWFORKS)
- len += fprintf(trussinfo->outfile, "%5d: ", trussinfo->pid);
-
- if (name != NULL && (!strcmp(name, "execve") || !strcmp(name, "exit"))) {
- clock_gettime(CLOCK_REALTIME, &trussinfo->after);
- }
-
- if (trussinfo->flags & ABSOLUTETIMESTAMPS) {
- timespecsubt(&trussinfo->after, &trussinfo->start_time, &timediff);
- len += fprintf(trussinfo->outfile, "%ld.%09ld ",
- (long)timediff.tv_sec, timediff.tv_nsec);
- }
-
- if (trussinfo->flags & RELATIVETIMESTAMPS) {
- timespecsubt(&trussinfo->after, &trussinfo->before, &timediff);
- len += fprintf(trussinfo->outfile, "%ld.%09ld ",
- (long)timediff.tv_sec, timediff.tv_nsec);
- }
-
- len += fprintf(trussinfo->outfile, "%s(", name);
-
- for (i = 0; i < nargs; i++) {
- if (s_args[i])
- len += fprintf(trussinfo->outfile, "%s", s_args[i]);
- else
- len += fprintf(trussinfo->outfile, "<missing argument>");
- len += fprintf(trussinfo->outfile, "%s", i < (nargs - 1) ? "," : "");
- }
- len += fprintf(trussinfo->outfile, ")");
- for (i = 0; i < 6 - (len / 8); i++)
- fprintf(trussinfo->outfile, "\t");
-}
-
-void
-print_syscall_ret(struct trussinfo *trussinfo, const char *name, int nargs,
- char **s_args, int errorp, long retval)
-{
-
- print_syscall(trussinfo, name, nargs, s_args);
- fflush(trussinfo->outfile);
- if (errorp) {
- fprintf(trussinfo->outfile, " ERR#%ld '%s'\n", retval, strerror(retval));
- } else {
- fprintf(trussinfo->outfile, " = %ld (0x%lx)\n", retval, retval);
- }
-}
diff --git a/usr.bin/truss/truss.1 b/usr.bin/truss/truss.1
deleted file mode 100644
index ddff08b..0000000
--- a/usr.bin/truss/truss.1
+++ /dev/null
@@ -1,101 +0,0 @@
-.\" $FreeBSD$
-.\"
-.Dd January 2, 2004
-.Dt TRUSS 1
-.Os
-.Sh NAME
-.Nm truss
-.Nd trace system calls
-.Sh SYNOPSIS
-.Nm
-.Op Fl faedDS
-.Op Fl o Ar file
-.Op Fl s Ar strsize
-.Fl p Ar pid
-.Nm
-.Op Fl faedDS
-.Op Fl o Ar file
-.Op Fl s Ar strsize
-.Ar command Op Ar args
-.Sh DESCRIPTION
-The
-.Nm
-utility traces the system calls called by the specified process or program.
-Output is to the specified output file, or standard error by default.
-It does this by stopping and restarting the process being monitored via
-.Xr ptrace 2 .
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl f
-Trace descendants of the original traced process created by
-.Xr fork 2 ,
-.Xr vfork 2 ,
-etc.
-.It Fl a
-Show the argument strings that are passed in each
-.Xr execve 2
-system call.
-.It Fl e
-Show the environment strings that are passed in each
-.Xr execve 2
-system call.
-.It Fl d
-Include timestamps in the output showing the time elapsed
-since the trace was started.
-.It Fl D
-Include timestamps in the output showing the time elapsed
-since the last recorded event.
-.It Fl S
-Do not display information about signals received by the process.
-(Normally,
-.Nm
-displays signal as well as system call events.)
-.It Fl o Ar file
-Print the output to the specified
-.Ar file
-instead of standard error.
-.It Fl s Ar strsize
-Display strings using at most
-.Ar strsize
-characters.
-If the buffer is larger,
-.Dq Li ...
-will be displayed at the end of the string.
-The default
-.Ar strsize
-is 32.
-.It Fl p Ar pid
-Follow the process specified by
-.Ar pid
-instead of a new command.
-.It Ar command Op Ar args
-Execute
-.Ar command
-and trace the system calls of it.
-(The
-.Fl p
-and
-.Ar command
-options are mutually exclusive.)
-.El
-.Sh EXAMPLES
-# Follow the system calls used in echoing "hello"
-.Dl $ truss /bin/echo hello
-# Do the same, but put the output into a file
-.Dl $ truss -o /tmp/truss.out /bin/echo hello
-# Follow an already-running process
-.Dl $ truss -p 1
-.Sh SEE ALSO
-.Xr kdump 1 ,
-.Xr ktrace 1 ,
-.Xr ptrace 2
-.Sh HISTORY
-The
-.Nm
-command was written by
-.An Sean Eric Fagan
-for
-.Fx .
-It was modeled after
-similar commands available for System V Release 4 and SunOS.
diff --git a/usr.bin/truss/truss.h b/usr.bin/truss/truss.h
deleted file mode 100644
index 8533fae..0000000
--- a/usr.bin/truss/truss.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copryight 2001 Jamey Wood
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/queue.h>
-
-#define FOLLOWFORKS 0x00000001
-#define RELATIVETIMESTAMPS 0x00000002
-#define ABSOLUTETIMESTAMPS 0x00000004
-#define NOSIGS 0x00000008
-#define EXECVEARGS 0x00000010
-#define EXECVEENVS 0x00000020
-
-struct threadinfo
-{
- SLIST_ENTRY(threadinfo) entries;
- lwpid_t tid;
- int in_syscall;
- int in_fork;
-};
-
-struct trussinfo
-{
- int pid;
- int flags;
- int pr_why;
- int pr_data;
- int strsize;
- FILE *outfile;
-
- struct timespec start_time;
- struct timespec before;
- struct timespec after;
-
- struct threadinfo *curthread;
-
- SLIST_HEAD(, threadinfo) threadlist;
-};
-
-#define timespecsubt(tvp, uvp, vvp) \
- do { \
- (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \
- (vvp)->tv_nsec = (tvp)->tv_nsec - (uvp)->tv_nsec; \
- if ((vvp)->tv_nsec < 0) { \
- (vvp)->tv_sec--; \
- (vvp)->tv_nsec += 1000000000; \
- } \
- } while (0)
-
-#define S_NONE 0
-#define S_SCE 1
-#define S_SCX 2
-#define S_EXIT 3
-#define S_SIG 4
-#define S_EXEC 5
diff --git a/usr.bin/tset/Makefile b/usr.bin/tset/Makefile
deleted file mode 100644
index 126cf321..0000000
--- a/usr.bin/tset/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/9/93
-
-PROG= tset
-SRCS= map.c misc.c set.c term.c tset.c wrterm.c
-
-DPADD= ${LIBTERMCAP}
-LDADD= -ltermcap
-LINKS= ${BINDIR}/tset ${BINDIR}/reset
-MLINKS= tset.1 reset.1
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/tset/extern.h b/usr.bin/tset/extern.h
deleted file mode 100644
index f02d0c5..0000000
--- a/usr.bin/tset/extern.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.1 (Berkeley) 6/9/93
- * $FreeBSD$
- */
-
-#include <termcap.h>
-
-extern struct termios mode, oldmode;
-extern int Columns, isreset, Lines;
-extern int erasech, intrchar, killch;
-
-void add_mapping(const char *, char *);
-void cat(char *);
-const char *get_termcap_entry(char *, char **);
-const char *mapped(const char *);
-int outc(int);
-void reset_mode(void);
-void set_control_chars(void);
-void set_conversions(int);
-void set_init(void);
-void wrtermcap(char *);
diff --git a/usr.bin/tset/map.c b/usr.bin/tset/map.c
deleted file mode 100644
index d3db6b6..0000000
--- a/usr.bin/tset/map.c
+++ /dev/null
@@ -1,260 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)map.c 8.1 (Berkeley) 6/9/93";
-#endif
-
-#include <sys/types.h>
-
-#include <err.h>
-#include <stdlib.h>
-#include <string.h>
-#include <termios.h>
-
-#include "extern.h"
-
-extern speed_t Ospeed;
-speed_t tset_baudrate(char *);
-
-/* Baud rate conditionals for mapping. */
-#define GT 0x01
-#define EQ 0x02
-#define LT 0x04
-#define NOT 0x08
-#define GE (GT | EQ)
-#define LE (LT | EQ)
-
-typedef struct map {
- struct map *next; /* Linked list of maps. */
- char *porttype; /* Port type, or "" for any. */
- char *type; /* Terminal type to select. */
- int conditional; /* Baud rate conditionals bitmask. */
- speed_t speed; /* Baud rate to compare against. */
-} MAP;
-
-MAP *cur, *maplist;
-
-/*
- * Syntax for -m:
- * [port-type][test baudrate]:terminal-type
- * The baud rate tests are: >, <, @, =, !
- */
-void
-add_mapping(port, arg)
- const char *port;
- char *arg;
-{
- MAP *mapp;
- char *copy, *p, *termp;
-
- copy = strdup(arg);
- mapp = malloc(sizeof(MAP));
- if (copy == NULL || mapp == NULL)
- errx(1, "malloc");
- mapp->next = NULL;
- if (maplist == NULL)
- cur = maplist = mapp;
- else {
- cur->next = mapp;
- cur = mapp;
- }
-
- mapp->porttype = arg;
- mapp->conditional = 0;
-
- arg = strpbrk(arg, "><@=!:");
-
- if (arg == NULL) { /* [?]term */
- mapp->type = mapp->porttype;
- mapp->porttype = NULL;
- goto done;
- }
-
- if (arg == mapp->porttype) /* [><@=! baud]:term */
- termp = mapp->porttype = NULL;
- else
- termp = arg;
-
- for (;; ++arg) /* Optional conditionals. */
- switch(*arg) {
- case '<':
- if (mapp->conditional & GT)
- goto badmopt;
- mapp->conditional |= LT;
- break;
- case '>':
- if (mapp->conditional & LT)
- goto badmopt;
- mapp->conditional |= GT;
- break;
- case '@':
- case '=': /* Not documented. */
- mapp->conditional |= EQ;
- break;
- case '!':
- mapp->conditional |= NOT;
- break;
- default:
- goto next;
- }
-
-next: if (*arg == ':') {
- if (mapp->conditional)
- goto badmopt;
- ++arg;
- } else { /* Optional baudrate. */
- arg = index(p = arg, ':');
- if (arg == NULL)
- goto badmopt;
- *arg++ = '\0';
- mapp->speed = tset_baudrate(p);
- }
-
- if (*arg == '\0') /* Non-optional type. */
- goto badmopt;
-
- mapp->type = arg;
-
- /* Terminate porttype, if specified. */
- if (termp != NULL)
- *termp = '\0';
-
- /* If a NOT conditional, reverse the test. */
- if (mapp->conditional & NOT)
- mapp->conditional = ~mapp->conditional & (EQ | GT | LT);
-
- /* If user specified a port with an option flag, set it. */
-done: if (port) {
- if (mapp->porttype)
-badmopt: errx(1, "illegal -m option format: %s", copy);
- mapp->porttype = strdup(port);
- }
-
-#ifdef MAPDEBUG
- (void)printf("port: %s\n", mapp->porttype ? mapp->porttype : "ANY");
- (void)printf("type: %s\n", mapp->type);
- (void)printf("conditional: ");
- p = "";
- if (mapp->conditional & GT) {
- (void)printf("GT");
- p = "/";
- }
- if (mapp->conditional & EQ) {
- (void)printf("%sEQ", p);
- p = "/";
- }
- if (mapp->conditional & LT)
- (void)printf("%sLT", p);
- (void)printf("\nspeed: %d\n", mapp->speed);
-#endif
-}
-
-/*
- * Return the type of terminal to use for a port of type 'type', as specified
- * by the first applicable mapping in 'map'. If no mappings apply, return
- * 'type'.
- */
-const char *
-mapped(type)
- const char *type;
-{
- MAP *mapp;
- int match;
-
- match = 0;
- for (mapp = maplist; mapp; mapp = mapp->next)
- if (mapp->porttype == NULL || !strcmp(mapp->porttype, type)) {
- switch (mapp->conditional) {
- case 0: /* No test specified. */
- match = 1;
- break;
- case EQ:
- match = (Ospeed == mapp->speed);
- break;
- case GE:
- match = (Ospeed >= mapp->speed);
- break;
- case GT:
- match = (Ospeed > mapp->speed);
- break;
- case LE:
- match = (Ospeed <= mapp->speed);
- break;
- case LT:
- match = (Ospeed < mapp->speed);
- break;
- }
- if (match)
- return (mapp->type);
- }
- /* No match found; return given type. */
- return (type);
-}
-
-typedef struct speeds {
- const char *string;
- speed_t speed;
-} SPEEDS;
-
-SPEEDS speeds[] = {
- { "0", B0 },
- { "134.5", B134 },
- { "exta", B19200 },
- { "extb", B38400 },
- { NULL, 0 }
-};
-
-speed_t
-tset_baudrate(rate)
- char *rate;
-{
- SPEEDS *sp;
- speed_t speed;
-
- /* The baudrate number can be preceded by a 'B', which is ignored. */
- if (*rate == 'B')
- ++rate;
-
- for (sp = speeds; sp->string; ++sp)
- if (!strcasecmp(rate, sp->string))
- return (sp->speed);
- speed = atol(rate);
- if (speed == 0)
- errx(1, "unknown baud rate %s", rate);
- return speed;
-}
diff --git a/usr.bin/tset/misc.c b/usr.bin/tset/misc.c
deleted file mode 100644
index 52358e7..0000000
--- a/usr.bin/tset/misc.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 6/9/93";
-#endif
-
-#include <err.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-void
-cat(file)
- char *file;
-{
- register int fd, nr, nw;
- char buf[1024];
-
- if ((fd = open(file, O_RDONLY, 0)) < 0)
- err(1, "%s", file);
-
- while ((nr = read(fd, buf, sizeof(buf))) > 0)
- if ((nw = write(STDERR_FILENO, buf, nr)) == -1)
- err(1, "write to stderr");
- if (nr != 0)
- err(1, "%s", file);
- (void)close(fd);
-}
-
-int
-outc(c)
- int c;
-{
- return putc(c, stderr);
-}
diff --git a/usr.bin/tset/set.c b/usr.bin/tset/set.c
deleted file mode 100644
index 85965b3..0000000
--- a/usr.bin/tset/set.c
+++ /dev/null
@@ -1,326 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)set.c 8.2 (Berkeley) 2/28/94";
-#endif
-
-#include <stdio.h>
-#include <termios.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-#define CHK(val, dft) (val <= 0 ? dft : val)
-
-int set_tabs(void);
-
-/*
- * Reset the terminal mode bits to a sensible state. Very useful after
- * a child program dies in raw mode.
- */
-void
-reset_mode()
-{
- tcgetattr(STDERR_FILENO, &mode);
-
-#if defined(VDISCARD) && defined(CDISCARD)
- mode.c_cc[VDISCARD] = CHK(mode.c_cc[VDISCARD], CDISCARD);
-#endif
- mode.c_cc[VEOF] = CHK(mode.c_cc[VEOF], CEOF);
- mode.c_cc[VERASE] = CHK(mode.c_cc[VERASE], CERASE);
-#if defined(VFLUSH) && defined(CFLUSH)
- mode.c_cc[VFLUSH] = CHK(mode.c_cc[VFLUSH], CFLUSH);
-#endif
- mode.c_cc[VINTR] = CHK(mode.c_cc[VINTR], CINTR);
- mode.c_cc[VKILL] = CHK(mode.c_cc[VKILL], CKILL);
-#if defined(VLNEXT) && defined(CLNEXT)
- mode.c_cc[VLNEXT] = CHK(mode.c_cc[VLNEXT], CLNEXT);
-#endif
- mode.c_cc[VQUIT] = CHK(mode.c_cc[VQUIT], CQUIT);
-#if defined(VREPRINT) && defined(CRPRNT)
- mode.c_cc[VREPRINT] = CHK(mode.c_cc[VREPRINT], CRPRNT);
-#endif
- mode.c_cc[VSTART] = CHK(mode.c_cc[VSTART], CSTART);
- mode.c_cc[VSTOP] = CHK(mode.c_cc[VSTOP], CSTOP);
- mode.c_cc[VSUSP] = CHK(mode.c_cc[VSUSP], CSUSP);
-#if defined(VWERASE) && defined(CWERASE)
- mode.c_cc[VWERASE] = CHK(mode.c_cc[VWERASE], CWERASE);
-#endif
-
- mode.c_iflag &= ~(IGNBRK | PARMRK | INPCK | ISTRIP | INLCR | IGNCR
-#ifdef IUCLC
- | IUCLC
-#endif
-#ifdef IXANY
- | IXANY
-#endif
- | IXOFF);
-
- mode.c_iflag |= (BRKINT | IGNPAR | ICRNL | IXON
-#ifdef IMAXBEL
- | IMAXBEL
-#endif
- );
-
- mode.c_oflag &= ~(0
-#ifdef OLCUC
- | OLCUC
-#endif
-#ifdef OCRNL
- | OCRNL
-#endif
-#ifdef ONOCR
- | ONOCR
-#endif
-#ifdef ONLRET
- | ONLRET
-#endif
-#ifdef OFILL
- | OFILL
-#endif
-#ifdef OFDEL
- | OFDEL
-#endif
-#ifdef NLDLY
- | NLDLY | CRDLY | TABDLY | BSDLY | VTDLY | FFDLY
-#endif
- );
-
- mode.c_oflag |= (OPOST
-#ifdef ONLCR
- | ONLCR
-#endif
- );
-
- mode.c_cflag &= ~(CSIZE | CSTOPB | PARENB | PARODD | CLOCAL);
- mode.c_cflag |= (CS8 | CREAD);
- mode.c_lflag &= ~(ECHONL | NOFLSH | TOSTOP
-#ifdef ECHOPTR
- | ECHOPRT
-#endif
-#ifdef XCASE
- | XCASE
-#endif
- );
-
- mode.c_lflag |= (ISIG | ICANON | ECHO | ECHOE | ECHOK
-#ifdef ECHOCTL
- | ECHOCTL
-#endif
-#ifdef ECHOKE
- | ECHOKE
-#endif
- );
-
- tcsetattr(STDERR_FILENO, TCSADRAIN, &mode);
-}
-
-/*
- * Determine the erase, interrupt, and kill characters from the termcap
- * entry and command line and update their values in 'mode'.
- */
-void
-set_control_chars()
-{
- char *bp, *p, bs_char, buf[1024];
-
- bp = buf;
- p = tgetstr("kb", &bp);
- if (p == NULL || p[1] != '\0')
- p = tgetstr("bc", &bp);
- if (p != NULL && p[1] == '\0')
- bs_char = p[0];
- else if (tgetflag("bs"))
- bs_char = CTRL('h');
- else
- bs_char = 0;
-
- if (erasech == 0 && bs_char != 0 && !tgetflag("os"))
- erasech = -1;
- if (erasech < 0)
- erasech = (bs_char != 0) ? bs_char : CTRL('h');
-
- if (mode.c_cc[VERASE] == 0 || erasech != 0)
- mode.c_cc[VERASE] = erasech ? erasech : CERASE;
-
- if (mode.c_cc[VINTR] == 0 || intrchar != 0)
- mode.c_cc[VINTR] = intrchar ? intrchar : CINTR;
-
- if (mode.c_cc[VKILL] == 0 || killch != 0)
- mode.c_cc[VKILL] = killch ? killch : CKILL;
-}
-
-/*
- * Set up various conversions in 'mode', including parity, tabs, returns,
- * echo, and case, according to the termcap entry. If the program we're
- * running was named with a leading upper-case character, map external
- * uppercase to internal lowercase.
- */
-void
-set_conversions(usingupper)
- int usingupper;
-{
- if (tgetflag("UC") || usingupper) {
-#ifdef IUCLC
- mode.c_iflag |= IUCLC;
- mode.c_oflag |= OLCUC;
-#endif
- } else if (tgetflag("LC")) {
-#ifdef IUCLC
- mode.c_iflag &= ~IUCLC;
- mode.c_oflag &= ~OLCUC;
-#endif
- }
- mode.c_iflag &= ~(PARMRK | INPCK);
- mode.c_lflag |= ICANON;
- if (tgetflag("EP")) {
- mode.c_cflag |= PARENB;
- mode.c_cflag &= ~PARODD;
- }
- if (tgetflag("OP")) {
- mode.c_cflag |= PARENB;
- mode.c_cflag |= PARODD;
- }
-
-#ifdef ONLCR
- mode.c_oflag |= ONLCR;
-#endif
- mode.c_iflag |= ICRNL;
- mode.c_lflag |= ECHO;
- mode.c_oflag |= OXTABS;
- if (tgetflag("NL")) { /* Newline, not linefeed. */
-#ifdef ONLCR
- mode.c_oflag &= ~ONLCR;
-#endif
- mode.c_iflag &= ~ICRNL;
- }
- if (tgetflag("HD")) /* Half duplex. */
- mode.c_lflag &= ~ECHO;
- if (tgetflag("pt")) /* Print tabs. */
- mode.c_oflag &= ~OXTABS;
- mode.c_lflag |= (ECHOE | ECHOK);
-}
-
-/* Output startup string. */
-void
-set_init()
-{
- char *bp, buf[1024];
- int settle;
-
- bp = buf;
- if (tgetstr("pc", &bp) != 0) /* Get/set pad character. */
- PC = buf[0];
-
-#ifdef TAB3
- if (oldmode.c_oflag & (TAB3 | ONLCR | OCRNL | ONLRET)) {
- oldmode.c_oflag &= (TAB3 | ONLCR | OCRNL | ONLRET);
- tcsetattr(STDERR_FILENO, TCSADRAIN, &oldmode);
- }
-#endif
- settle = set_tabs();
-
- if (isreset) {
- bp = buf;
- if (tgetstr("rs", &bp) != 0 || tgetstr("is", &bp) != 0) {
- tputs(buf, 0, outc);
- settle = 1;
- }
- bp = buf;
- if (tgetstr("rf", &bp) != 0 || tgetstr("if", &bp) != 0) {
- cat(buf);
- settle = 1;
- }
- }
-
- if (settle) {
- (void)putc('\r', stderr);
- (void)fflush(stderr);
- (void)sleep(1); /* Settle the terminal. */
- }
-}
-
-/*
- * Set the hardware tabs on the terminal, using the ct (clear all tabs),
- * st (set one tab) and ch (horizontal cursor addressing) capabilities.
- * This is done before if and is, so they can patch in case we blow this.
- * Return nonzero if we set any tab stops, zero if not.
- */
-int
-set_tabs()
-{
- int c;
- char *capsp, *clear_tabs;
- char *set_column, *set_pos, *Set_tab;
- char caps[1024];
- const char *tg_out;
-
- capsp = caps;
- Set_tab = tgetstr("st", &capsp);
-
- if (Set_tab && (clear_tabs = tgetstr("ct", &capsp))) {
- (void)putc('\r', stderr); /* Force to left margin. */
- tputs(clear_tabs, 0, outc);
- }
-
- set_column = tgetstr("ch", &capsp);
- set_pos = set_column ? NULL : tgetstr("cm", &capsp);
-
- if (Set_tab) {
- for (c = 8; c < Columns; c += 8) {
- /*
- * Get to the right column. "OOPS" is returned by
- * tgoto() if it can't do the job. (*snarl*)
- */
- tg_out = "OOPS";
- if (set_column)
- tg_out = tgoto(set_column, 0, c);
- if (*tg_out == 'O' && set_pos)
- tg_out = tgoto(set_pos, c, Lines - 1);
- if (*tg_out != 'O')
- tputs(tg_out, 1, outc);
- else
- (void)fprintf(stderr, "%s", " ");
- /* Set the tab. */
- tputs(Set_tab, 0, outc);
- }
- putc('\r', stderr);
- return (1);
- }
- return (0);
-}
diff --git a/usr.bin/tset/term.c b/usr.bin/tset/term.c
deleted file mode 100644
index 54a349e..0000000
--- a/usr.bin/tset/term.c
+++ /dev/null
@@ -1,161 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)term.c 8.1 (Berkeley) 6/9/93";
-#endif
-
-#include <sys/types.h>
-#include <err.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <ttyent.h>
-#include "extern.h"
-
-char tbuf[1024]; /* Termcap entry. */
-
-const char *askuser(const char *);
-char *ttys(char *);
-
-/*
- * Figure out what kind of terminal we're dealing with, and then read in
- * its termcap entry.
- */
-const char *
-get_termcap_entry(userarg, tcapbufp)
- char *userarg, **tcapbufp;
-{
- struct ttyent *t;
- int rval;
- char *p, *ttypath;
- const char *ttype;
-
- if (userarg) {
- ttype = userarg;
- goto found;
- }
-
- /* Try the environment. */
- if ((ttype = getenv("TERM")))
- goto map;
-
- /* Try ttyname(3); check for dialup or other mapping. */
- if ((ttypath = ttyname(STDERR_FILENO))) {
- if ((p = rindex(ttypath, '/')))
- ++p;
- else
- p = ttypath;
- if ((t = getttynam(p))) {
- ttype = t->ty_type;
- goto map;
- }
- }
-
- /* If still undefined, use "unknown". */
- ttype = "unknown";
-
-map: ttype = mapped(ttype);
-
- /*
- * If not a path, remove TERMCAP from the environment so we get a
- * real entry from /etc/termcap. This prevents us from being fooled
- * by out of date stuff in the environment.
- */
-found: if ((p = getenv("TERMCAP")) != NULL && *p != '/')
- unsetenv("TERMCAP");
-
- /*
- * ttype now contains a pointer to the type of the terminal.
- * If the first character is '?', ask the user.
- */
- if (ttype[0] == '?') {
- if (ttype[1] != '\0')
- ttype = askuser(ttype + 1);
- else
- ttype = askuser(NULL);
- }
-
- /* Find the termcap entry. If it doesn't exist, ask the user. */
- while ((rval = tgetent(tbuf, ttype)) == 0) {
- warnx("terminal type %s is unknown", ttype);
- ttype = askuser(NULL);
- }
- if (rval == -1)
- errx(1, "termcap: %s", strerror(errno ? errno : ENOENT));
- *tcapbufp = tbuf;
- return (ttype);
-}
-
-/* Prompt the user for a terminal type. */
-const char *
-askuser(dflt)
- const char *dflt;
-{
- static char answer[256];
- char *p;
-
- /* We can get recalled; if so, don't continue uselessly. */
- if (feof(stdin) || ferror(stdin)) {
- (void)fprintf(stderr, "\n");
- exit(1);
- }
- for (;;) {
- if (dflt)
- (void)fprintf(stderr, "Terminal type? [%s] ", dflt);
- else
- (void)fprintf(stderr, "Terminal type? ");
- (void)fflush(stderr);
-
- if (fgets(answer, sizeof(answer), stdin) == NULL) {
- if (dflt == NULL) {
- (void)fprintf(stderr, "\n");
- exit(1);
- }
- return (dflt);
- }
-
- if ((p = index(answer, '\n')))
- *p = '\0';
- if (answer[0])
- return (answer);
- if (dflt != NULL)
- return (dflt);
- }
-}
diff --git a/usr.bin/tset/tset.1 b/usr.bin/tset/tset.1
deleted file mode 100644
index fd62aab..0000000
--- a/usr.bin/tset/tset.1
+++ /dev/null
@@ -1,408 +0,0 @@
-.\" Copyright (c) 1985, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)tset.1 8.1 (Berkeley) 6/9/93
-.\" $FreeBSD$
-.\"
-.Dd June 9, 1993
-.Dt TSET 1
-.Os
-.Sh NAME
-.Nm tset ,
-.Nm reset
-.Nd terminal initialization
-.Sh SYNOPSIS
-.Nm
-.Op Fl IQrSs
-.Op Fl
-.Op Fl e Ar ch
-.Op Fl i Ar ch
-.Op Fl k Ar ch
-.Op Fl m Ar mapping
-.Op Ar terminal
-.Nm reset
-.Op Fl IQrSs
-.Op Fl
-.Op Fl e Ar ch
-.Op Fl i Ar ch
-.Op Fl k Ar ch
-.Op Fl m Ar mapping
-.Op Ar terminal
-.Sh DESCRIPTION
-The
-.Nm
-utility initializes terminals.
-It first determines the type of terminal that you are using.
-This determination is done as follows, using the first terminal type found.
-.Pp
-.Bl -bullet -compact -offset indent
-.It
-The
-.Ar terminal
-argument specified on the command line.
-.It
-The value of the
-.Ev TERM
-environment variable.
-.It
-The terminal type associated with the standard error output device in the
-.Pa /etc/ttys
-file.
-.It
-The default terminal type, ``unknown''.
-.El
-.Pp
-If the terminal type was not specified on the command-line, the
-.Fl m
-option mappings are then applied (see below for more information).
-Then, if the terminal type begins with a question mark (``?''), the user is
-prompted for confirmation of the terminal type.
-An empty response confirms the type, or, another type can be entered to
-specify a new type.
-Once the terminal type has been determined, the termcap entry for the terminal
-is retrieved.
-If no termcap entry is found for the type, the user is prompted for another
-terminal type.
-.Pp
-Once the termcap entry is retrieved, the window size, backspace, interrupt
-and line kill characters (among many other things) are set and the terminal
-and tab initialization strings are sent to the standard error output.
-Finally, if the erase, interrupt and line kill characters have changed,
-or are not set to their default values, their values are displayed to the
-standard error output.
-.Pp
-When invoked as
-.Nm reset ,
-.Nm
-sets cooked and echo modes, turns off cbreak and raw modes, turns on
-newline translation and resets any unset special characters to their
-default values before doing the terminal initialization described above.
-This is useful after a program dies leaving a terminal in an abnormal state.
-Note, you may have to type
-.Dq Li <LF>reset<LF>
-(the line-feed character is normally control-J) to get the terminal
-to work, as carriage-return may no longer work in the abnormal state.
-Also, the terminal will often not echo the command.
-.Pp
-The options are as follows:
-.Bl -tag -width flag
-.It Fl
-The terminal type is displayed to the standard output, and the terminal is
-not initialized in any way.
-.It Fl e
-Set the erase character to
-.Ar ch .
-.It Fl I
-Do not send the terminal or tab initialization strings to the terminal.
-.It Fl i
-Set the interrupt character to
-.Ar ch .
-.It Fl k
-Set the line kill character to
-.Ar ch .
-.It Fl m
-Specify a mapping from a port type to a terminal.
-See below for more information.
-.It Fl Q
-Do not display any values for the erase, interrupt and line kill characters.
-.It Fl r
-Print the terminal type to the standard error output.
-.It Fl S
-Print the terminal type and the termcap entry to the standard output.
-See the section below on setting the environment for details.
-.It Fl s
-Print the sequence of shell commands to initialize the environment variables
-.Ev TERM
-and
-.Ev TERMCAP
-to the standard output.
-See the section below on setting the environment for details.
-.El
-.Pp
-The arguments for the
-.Fl e ,
-.Fl i
-and
-.Fl k
-options may either be entered as actual characters or by using the
-.Dq hat
-notation, i.e., control-h may be specified as
-.Dq Li ^H
-or
-.Dq Li ^h .
-.Sh SETTING THE ENVIRONMENT
-It is often desirable to enter the terminal type and information about
-the terminal's capabilities into the shell's environment.
-This is done using the
-.Fl S
-and
-.Fl s
-options.
-.Pp
-When the
-.Fl S
-option is specified, the terminal type and the termcap entry are written
-to the standard output, separated by a space and without a terminating
-newline.
-This can be assigned to an array by
-.Nm csh
-and
-.Nm ksh
-users and then used like any other shell array.
-.Pp
-When the
-.Fl s
-option is specified, the commands to enter the information into the
-shell's environment are written to the standard output.
-If the
-.Ev SHELL
-environment variable ends in ``csh'', the commands are for the
-.Nm csh ,
-otherwise, they are for
-.Xr sh 1 .
-Note, the
-.Nm csh
-commands set and unset the shell variable
-.Dq noglob ,
-leaving it unset.
-The following line in the
-.Pa .login
-or
-.Pa .profile
-files will initialize the environment correctly:
-.Bd -literal -offset indent
-eval \`tset -s options ... \`
-.Ed
-.Pp
-To demonstrate a simple use of the
-.Fl S
-option, the following lines in the
-.Pa .login
-file have an equivalent effect:
-.Bd -literal -offset indent
-set noglob
-set term=(`tset -S options ...`)
-setenv TERM $term[1]
-setenv TERMCAP "$term[2]"
-unset term
-unset noglob
-.Ed
-.Sh TERMINAL TYPE MAPPING
-When the terminal is not hardwired into the system (or the current system
-information is incorrect) the terminal type derived from the
-.Pa /etc/ttys
-file or the
-.Ev TERM
-environment variable is often something generic like
-.Dq network ,
-.Dq dialup ,
-or
-.Dq unknown .
-When
-.Nm
-is used in a startup script
-.Pf ( Pa .profile
-for
-.Xr sh 1
-users or
-.Pa .login
-for
-.Xr csh 1
-users) it is often desirable to provide information about the type of
-terminal used on such ports.
-The purpose of the
-.Fl m
-option is to
-.Dq map
-from some set of conditions to a terminal type, that is, to
-tell
-.Nm
-``If I'm on this port at a particular speed, guess that I'm on that
-kind of terminal''.
-.Pp
-The argument to the
-.Fl m
-option consists of an optional port type, an optional operator, an optional
-baud rate specification, an optional colon (``:'') character and a terminal
-type.
-The port type is a string (delimited by either the operator or the colon
-character).
-The operator may be any combination of:
-.Dq Li \&> ,
-.Dq Li \&< ,
-.Dq Li \&@ ,
-and
-.Dq Li \&! ;
-.Dq Li \&>
-means greater than,
-.Dq Li \&<
-means less than,
-.Dq Li \&@
-means equal to
-and
-.Dq Li !\&
-inverts the sense of the test.
-The baud rate is specified as a number and is compared with the speed
-of the standard error output (which should be the control terminal).
-The terminal type is a string.
-.Pp
-If the terminal type is not specified on the command line, the
-.Fl m
-mappings are applied to the terminal type.
-If the port type and baud rate match the mapping, the terminal type specified
-in the mapping replaces the current type.
-If more than one mapping is specified, the first applicable mapping is used.
-.Pp
-For example, consider the following mapping:
-.Dq Li dialup>9600:vt100 .
-The port type is
-.Dq Li dialup ,
-the operator is
-.Dq Li > ,
-the baud rate specification is
-.Dq Li 9600 ,
-and the terminal type is
-.Dq Li vt100 .
-The result of this mapping is to specify that if the terminal type is
-.Dq Li dialup ,
-and the baud rate is greater than 9600 baud, a terminal type of
-.Dq Li vt100
-will be used.
-.Pp
-If no port type is specified, the terminal type will match any port type,
-for example,
-.Dq Li -m dialup:vt100 -m :?xterm
-will cause any dialup port, regardless of baud rate, to match the terminal
-type
-.Dq Li vt100 ,
-and any non-dialup port type to match the terminal type
-.Dq Li ?xterm .
-Note, because of the leading question mark, the user will be
-queried on a default port as to whether they are actually using an
-.Ar xterm
-terminal.
-.Pp
-No whitespace characters are permitted in the
-.Fl m
-option argument.
-Also, to avoid problems with metacharacters, it is suggested that the entire
-.Fl m
-option argument be placed within single quote characters, and that
-.Nm csh
-users insert a backslash character (``\e'') before any exclamation
-marks (``!'').
-.Sh ENVIRONMENT
-The
-.Nm
-command utilizes the
-.Ev SHELL
-and
-.Ev TERM
-environment variables.
-.Sh FILES
-.Bl -tag -width /usr/share/misc/termcap -compact
-.It Pa /etc/ttys
-system port name to terminal type mapping database
-.It Pa /usr/share/misc/termcap
-terminal capability database
-.El
-.Sh COMPATIBILITY
-The
-.Fl A ,
-.Fl E ,
-.Fl h ,
-.Fl u
-and
-.Fl v
-options have been deleted from the
-.Nm
-utility.
-None of them were documented in
-.Bx 4.3
-and all are of limited utility at
-best.
-The
-.Fl a ,
-.Fl d
-and
-.Fl p
-options are similarly not documented or useful, but were retained as they
-appear to be in widespread use.
-It is strongly recommended that any usage of these three options be
-changed to use the
-.Fl m
-option instead.
-The
-.Fl n
-option remains, but has no effect.
-It is still permissible to specify the
-.Fl e ,
-.Fl i
-and
-.Fl k
-options without arguments, although it is strongly recommended that such
-usage be fixed to explicitly specify the character.
-.Pp
-Executing
-.Nm
-as
-.Nm reset
-no longer implies the
-.Fl Q
-option.
-Also, the interaction between the
-.Fl
-option and the
-.Ar terminal
-argument in some historic implementations of
-.Nm
-has been removed.
-.Pp
-Finally, the
-.Nm
-implementation has been completely redone (as part of the addition to the
-system of a
-.St -p1003.1-88
-compliant terminal interface) and will no longer compile on systems with
-older terminal interfaces.
-.Sh SEE ALSO
-.Xr csh 1 ,
-.Xr sh 1 ,
-.Xr stty 1 ,
-.Xr tty 4 ,
-.Xr termcap 5 ,
-.Xr ttys 5 ,
-.Xr environ 7
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3.0 .
diff --git a/usr.bin/tset/tset.c b/usr.bin/tset/tset.c
deleted file mode 100644
index dc4c333..0000000
--- a/usr.bin/tset/tset.c
+++ /dev/null
@@ -1,300 +0,0 @@
-/*-
- * Copyright (c) 1980, 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1991, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "@(#)tset.c 8.1 (Berkeley) 6/9/93";
-#endif
-
-#include <sys/types.h>
-#include <sys/ioctl.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <termios.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-void obsolete(char *[]);
-void report(const char *, int, u_int);
-void usage(void);
-
-struct termios mode, oldmode;
-
-int erasech; /* new erase character */
-int intrchar; /* new interrupt character */
-int isreset; /* invoked as reset */
-int killch; /* new kill character */
-int Lines, Columns; /* window size */
-speed_t Ospeed;
-
-int
-main(int argc, char *argv[])
-{
-#ifdef TIOCGWINSZ
- struct winsize win;
-#endif
- int ch, noinit, noset, quiet, Sflag, sflag, showterm, usingupper;
- char *p, *tcapbuf;
- const char *ttype;
-
- if (tcgetattr(STDERR_FILENO, &mode) < 0)
- err(1, "standard error");
-
- oldmode = mode;
- Ospeed = cfgetospeed(&mode);
-
- if ((p = strrchr(*argv, '/')))
- ++p;
- else
- p = *argv;
- usingupper = isupper(*p);
- if (!strcasecmp(p, "reset")) {
- isreset = 1;
- reset_mode();
- }
-
- obsolete(argv);
- noinit = noset = quiet = Sflag = sflag = showterm = 0;
- while ((ch = getopt(argc, argv, "-a:d:e:Ii:k:m:np:QSrs")) != -1) {
- switch (ch) {
- case '-': /* display term only */
- noset = 1;
- break;
- case 'a': /* OBSOLETE: map identifier to type */
- add_mapping("arpanet", optarg);
- break;
- case 'd': /* OBSOLETE: map identifier to type */
- add_mapping("dialup", optarg);
- break;
- case 'e': /* erase character */
- erasech = optarg[0] == '^' && optarg[1] != '\0' ?
- optarg[1] == '?' ? '\177' : CTRL(optarg[1]) :
- optarg[0];
- break;
- case 'I': /* no initialization strings */
- noinit = 1;
- break;
- case 'i': /* interrupt character */
- intrchar = optarg[0] == '^' && optarg[1] != '\0' ?
- optarg[1] == '?' ? '\177' : CTRL(optarg[1]) :
- optarg[0];
- break;
- case 'k': /* kill character */
- killch = optarg[0] == '^' && optarg[1] != '\0' ?
- optarg[1] == '?' ? '\177' : CTRL(optarg[1]) :
- optarg[0];
- break;
- case 'm': /* map identifier to type */
- add_mapping(NULL, optarg);
- break;
- case 'n': /* OBSOLETE: set new tty driver */
- break;
- case 'p': /* OBSOLETE: map identifier to type */
- add_mapping("plugboard", optarg);
- break;
- case 'Q': /* don't output control key settings */
- quiet = 1;
- break;
- case 'S': /* output TERM/TERMCAP strings */
- Sflag = 1;
- break;
- case 'r': /* display term on stderr */
- showterm = 1;
- break;
- case 's': /* output TERM/TERMCAP strings */
- sflag = 1;
- break;
- case '?':
- default:
- usage();
- }
- }
- argc -= optind;
- argv += optind;
-
- if (argc > 1)
- usage();
-
- ttype = get_termcap_entry(*argv, &tcapbuf);
-
- if (!noset) {
- Columns = tgetnum("co");
- Lines = tgetnum("li");
-
-#ifdef TIOCGWINSZ
- /* Set window size */
- (void)ioctl(STDERR_FILENO, TIOCGWINSZ, &win);
- if (win.ws_row == 0 && win.ws_col == 0 &&
- Lines > 0 && Columns > 0) {
- win.ws_row = Lines;
- win.ws_col = Columns;
- (void)ioctl(STDERR_FILENO, TIOCSWINSZ, &win);
- }
-#endif
- set_control_chars();
- set_conversions(usingupper);
-
- if (!noinit)
- set_init();
-
- /* Set the modes if they've changed. */
- if (memcmp(&mode, &oldmode, sizeof(mode)))
- tcsetattr(STDERR_FILENO, TCSADRAIN, &mode);
- }
-
- if (noset)
- (void)printf("%s\n", ttype);
- else {
- if (showterm)
- (void)fprintf(stderr, "Terminal type is %s.\n", ttype);
- /*
- * If erase, kill and interrupt characters could have been
- * modified and not -Q, display the changes.
- */
- if (!quiet) {
- report("Erase", VERASE, CERASE);
- report("Kill", VKILL, CKILL);
- report("Interrupt", VINTR, CINTR);
- }
- }
-
- if (Sflag) {
- (void)printf("%s ", ttype);
- if (strlen(tcapbuf) > 0)
- wrtermcap(tcapbuf);
- }
-
- if (sflag) {
- /*
- * Figure out what shell we're using. A hack, we look for an
- * environmental variable SHELL ending in "csh".
- */
- if ((p = getenv("SHELL")) &&
- !strcmp(p + strlen(p) - 3, "csh")) {
- printf("set noglob;\nsetenv TERM %s;\n", ttype);
- if (strlen(tcapbuf) > 0) {
- printf("setenv TERMCAP '");
- wrtermcap(tcapbuf);
- printf("';\n");
- }
- printf("unset noglob;\n");
- } else {
- printf("TERM=%s;\n", ttype);
- if (strlen(tcapbuf) > 0) {
- printf("TERMCAP='");
- wrtermcap(tcapbuf);
- printf("';\nexport TERMCAP;\n");
- }
- printf("export TERM;\n");
- }
- }
-
- exit(0);
-}
-
-/*
- * Tell the user if a control key has been changed from the default value.
- */
-void
-report(const char *name, int which, u_int def)
-{
- u_int old, new;
-
- new = mode.c_cc[which];
- old = oldmode.c_cc[which];
-
- if (old == new && old == def)
- return;
-
- (void)fprintf(stderr, "%s %s ", name, old == new ? "is" : "set to");
-
- if (new == 010)
- (void)fprintf(stderr, "backspace.\n");
- else if (new == 0177)
- (void)fprintf(stderr, "delete.\n");
- else if (new < 040) {
- new ^= 0100;
- (void)fprintf(stderr, "control-%c (^%c).\n", new, new);
- } else
- (void)fprintf(stderr, "%c.\n", new);
-}
-
-/*
- * Convert the obsolete argument form into something that getopt can handle.
- * This means that -e, -i and -k get default arguments supplied for them.
- */
-void
-obsolete(char *argv[])
-{
- for (; *argv; ++argv) {
- if (argv[0][0] != '-' || (argv[1] && argv[1][0] != '-') ||
- (argv[0][1] != 'e' && argv[0][1] != 'i' && argv[0][1] != 'k') ||
- argv[0][2] != '\0')
- continue;
- switch(argv[0][1]) {
- case 'e':
- argv[0] = strdup("-e^H");
- break;
- case 'i':
- argv[0] = strdup("-i^C");
- break;
- case 'k':
- argv[0] = strdup("-k^U");
- break;
- }
- }
-}
-
-void
-usage(void)
-{
- (void)fprintf(stderr, "%s\n%s\n",
-"usage: tset [-IQrSs] [-] [-e ch] [-i ch] [-k ch] [-m mapping] [terminal]",
-" reset [-IQrSs] [-] [-e ch] [-i ch] [-k ch] [-m mapping] [terminal]");
- exit(1);
-}
-
diff --git a/usr.bin/tset/wrterm.c b/usr.bin/tset/wrterm.c
deleted file mode 100644
index 9d14918..0000000
--- a/usr.bin/tset/wrterm.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)wrterm.c 8.1 (Berkeley) 6/9/93";
-#endif
-
-#include <sys/types.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "extern.h"
-
-/*
- * Output termcap entry to stdout, quoting characters that would give the
- * shell problems and omitting empty fields.
- */
-void
-wrtermcap(bp)
- char *bp;
-{
- register int ch;
- register char *p;
- char *t, *sep;
-
- /* Find the end of the terminal names. */
- if ((t = index(bp, ':')) == NULL)
- errx(1, "termcap names not colon terminated");
- *t++ = '\0';
-
- /* Output terminal names that don't have whitespace. */
- sep = strdup("");
- while ((p = strsep(&bp, "|")) != NULL)
- if (*p != '\0' && strpbrk(p, " \t") == NULL) {
- (void)printf("%s%s", sep, p);
- sep = strdup("|");
- }
- (void)putchar(':');
-
- /*
- * Output fields, transforming any dangerous characters. Skip
- * empty fields or fields containing only whitespace.
- */
- while ((p = strsep(&t, ":")) != NULL) {
- while ((ch = *p) != '\0' && isspace(ch))
- ++p;
- if (ch == '\0')
- continue;
- while ((ch = *p++) != '\0')
- switch(ch) {
- case '\033':
- (void)printf("\\E");
- case ' ': /* No spaces. */
- (void)printf("\\040");
- break;
- case '!': /* No csh history chars. */
- (void)printf("\\041");
- break;
- case ',': /* No csh history chars. */
- (void)printf("\\054");
- break;
- case '"': /* No quotes. */
- (void)printf("\\042");
- break;
- case '\'': /* No quotes. */
- (void)printf("\\047");
- break;
- case '`': /* No quotes. */
- (void)printf("\\140");
- break;
- case '\\': /* Anything following is OK. */
- case '^':
- (void)putchar(ch);
- if ((ch = *p++) == '\0')
- break;
- /* FALLTHROUGH */
- default:
- (void)putchar(ch);
- }
- (void)putchar(':');
- }
-}
diff --git a/usr.bin/tsort/Makefile b/usr.bin/tsort/Makefile
deleted file mode 100644
index b0d353e..0000000
--- a/usr.bin/tsort/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/9/93
-# $FreeBSD$
-
-PROG= tsort
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/tsort/tsort.1 b/usr.bin/tsort/tsort.1
deleted file mode 100644
index 71f7372..0000000
--- a/usr.bin/tsort/tsort.1
+++ /dev/null
@@ -1,97 +0,0 @@
-.\" Copyright (c) 1990, 1993, 1994
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This manual is derived from one contributed to Berkeley by
-.\" Michael Rendell of Memorial University of Newfoundland.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)tsort.1 8.3 (Berkeley) 4/1/94
-.\" $FreeBSD$
-.\"
-.Dd December 27, 2006
-.Dt TSORT 1
-.Os
-.Sh NAME
-.Nm tsort
-.Nd topological sort of a directed graph
-.Sh SYNOPSIS
-.Nm
-.Op Fl dlq
-.Op Ar file
-.Sh DESCRIPTION
-The
-.Nm
-utility takes a list of pairs of node names representing directed arcs in
-a graph and prints the nodes in topological order on standard output.
-Input is taken from the named
-.Ar file ,
-or from standard input if no file
-is given.
-.Pp
-There must be an even number of nodes in the input.
-Node names specified on the same line should be white space separated.
-.Pp
-Presence of a node in a graph can be represented by an arc from the node
-to itself.
-This is useful when a node is not connected to any other nodes.
-.Pp
-If the graph contains a cycle (and therefore cannot be properly sorted),
-one of the arcs in the cycle is ignored and the sort continues.
-Cycles are reported on standard error.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl d
-Turn on debugging.
-.It Fl l
-Search for and display the longest cycle.
-Can take a very long time.
-.It Fl q
-Do not display informational messages about cycles.
-This is primarily
-intended for building libraries, where optimal ordering is not critical,
-and cycles occur often.
-.El
-.Sh SEE ALSO
-.Xr ar 1
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.At v7 .
-This
-.Nm
-command and manual page are derived from sources contributed to Berkeley by
-.An Michael Rendell
-of Memorial University of Newfoundland.
-.Sh BUGS
-The
-.Nm
-utility does not recognize multibyte characters.
diff --git a/usr.bin/tsort/tsort.c b/usr.bin/tsort/tsort.c
deleted file mode 100644
index a01a86c..0000000
--- a/usr.bin/tsort/tsort.c
+++ /dev/null
@@ -1,432 +0,0 @@
-/*
- * Copyright (c) 1989, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Michael Rendell of Memorial University of Newfoundland.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1989, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static const char sccsid[] = "@(#)tsort.c 8.3 (Berkeley) 5/4/95";
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-
-#include <ctype.h>
-#include <db.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-/*
- * Topological sort. Input is a list of pairs of strings separated by
- * white space (spaces, tabs, and/or newlines); strings are written to
- * standard output in sorted order, one per line.
- *
- * usage:
- * tsort [-dlq] [inputfile]
- * If no input file is specified, standard input is read.
- *
- * Should be compatible with AT&T tsort HOWEVER the output is not identical
- * (i.e. for most graphs there is more than one sorted order, and this tsort
- * usually generates a different one then the AT&T tsort). Also, cycle
- * reporting seems to be more accurate in this version (the AT&T tsort
- * sometimes says a node is in a cycle when it isn't).
- *
- * Michael Rendell, michael@stretch.cs.mun.ca - Feb 26, '90
- */
-
-#define NF_MARK 0x1 /* marker for cycle detection */
-#define NF_ACYCLIC 0x2 /* this node is cycle free */
-#define NF_NODEST 0x4 /* Unreachable */
-
-
-typedef struct node_str NODE;
-
-struct node_str {
- NODE **n_prevp; /* pointer to previous node's n_next */
- NODE *n_next; /* next node in graph */
- NODE **n_arcs; /* array of arcs to other nodes */
- int n_narcs; /* number of arcs in n_arcs[] */
- int n_arcsize; /* size of n_arcs[] array */
- int n_refcnt; /* # of arcs pointing to this node */
- int n_flags; /* NF_* */
- char n_name[1]; /* name of this node */
-};
-
-typedef struct _buf {
- char *b_buf;
- int b_bsize;
-} BUF;
-
-DB *db;
-NODE *graph, **cycle_buf, **longest_cycle;
-int debug, longest, quiet;
-
-void add_arc(char *, char *);
-int find_cycle(NODE *, NODE *, int, int);
-NODE *get_node(char *);
-void *grow_buf(void *, size_t);
-void remove_node(NODE *);
-void clear_cycle(void);
-void tsort(void);
-void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- BUF *b;
- int c, n;
- FILE *fp;
- int bsize, ch, nused;
- BUF bufs[2];
-
- fp = NULL;
- while ((ch = getopt(argc, argv, "dlq")) != -1)
- switch (ch) {
- case 'd':
- debug = 1;
- break;
- case 'l':
- longest = 1;
- break;
- case 'q':
- quiet = 1;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- switch (argc) {
- case 0:
- fp = stdin;
- break;
- case 1:
- if ((fp = fopen(*argv, "r")) == NULL)
- err(1, "%s", *argv);
- break;
- default:
- usage();
- }
-
- for (b = bufs, n = 2; --n >= 0; b++)
- b->b_buf = grow_buf(NULL, b->b_bsize = 1024);
-
- /* parse input and build the graph */
- for (n = 0, c = getc(fp);;) {
- while (c != EOF && isspace(c))
- c = getc(fp);
- if (c == EOF)
- break;
-
- nused = 0;
- b = &bufs[n];
- bsize = b->b_bsize;
- do {
- b->b_buf[nused++] = c;
- if (nused == bsize)
- b->b_buf = grow_buf(b->b_buf, bsize *= 2);
- c = getc(fp);
- } while (c != EOF && !isspace(c));
-
- b->b_buf[nused] = '\0';
- b->b_bsize = bsize;
- if (n)
- add_arc(bufs[0].b_buf, bufs[1].b_buf);
- n = !n;
- }
- (void)fclose(fp);
- if (n)
- errx(1, "odd data count");
-
- /* do the sort */
- tsort();
- exit(0);
-}
-
-/* double the size of oldbuf and return a pointer to the new buffer. */
-void *
-grow_buf(void *bp, size_t size)
-{
- if ((bp = realloc(bp, size)) == NULL)
- err(1, NULL);
- return (bp);
-}
-
-/*
- * add an arc from node s1 to node s2 in the graph. If s1 or s2 are not in
- * the graph, then add them.
- */
-void
-add_arc(char *s1, char *s2)
-{
- NODE *n1;
- NODE *n2;
- int bsize, i;
-
- n1 = get_node(s1);
-
- if (!strcmp(s1, s2))
- return;
-
- n2 = get_node(s2);
-
- /*
- * Check if this arc is already here.
- */
- for (i = 0; i < n1->n_narcs; i++)
- if (n1->n_arcs[i] == n2)
- return;
- /*
- * Add it.
- */
- if (n1->n_narcs == n1->n_arcsize) {
- if (!n1->n_arcsize)
- n1->n_arcsize = 10;
- bsize = n1->n_arcsize * sizeof(*n1->n_arcs) * 2;
- n1->n_arcs = grow_buf(n1->n_arcs, bsize);
- n1->n_arcsize = bsize / sizeof(*n1->n_arcs);
- }
- n1->n_arcs[n1->n_narcs++] = n2;
- ++n2->n_refcnt;
-}
-
-/* Find a node in the graph (insert if not found) and return a pointer to it. */
-NODE *
-get_node(char *name)
-{
- DBT data, key;
- NODE *n;
-
- if (db == NULL &&
- (db = dbopen(NULL, O_RDWR, 0, DB_HASH, NULL)) == NULL)
- err(1, "db: %s", name);
-
- key.data = name;
- key.size = strlen(name) + 1;
-
- switch ((*db->get)(db, &key, &data, 0)) {
- case 0:
- bcopy(data.data, &n, sizeof(n));
- return (n);
- case 1:
- break;
- default:
- case -1:
- err(1, "db: %s", name);
- }
-
- if ((n = malloc(sizeof(NODE) + key.size)) == NULL)
- err(1, NULL);
-
- n->n_narcs = 0;
- n->n_arcsize = 0;
- n->n_arcs = NULL;
- n->n_refcnt = 0;
- n->n_flags = 0;
- bcopy(name, n->n_name, key.size);
-
- /* Add to linked list. */
- if ((n->n_next = graph) != NULL)
- graph->n_prevp = &n->n_next;
- n->n_prevp = &graph;
- graph = n;
-
- /* Add to hash table. */
- data.data = &n;
- data.size = sizeof(n);
- if ((*db->put)(db, &key, &data, 0))
- err(1, "db: %s", name);
- return (n);
-}
-
-
-/*
- * Clear the NODEST flag from all nodes.
- */
-void
-clear_cycle(void)
-{
- NODE *n;
-
- for (n = graph; n != NULL; n = n->n_next)
- n->n_flags &= ~NF_NODEST;
-}
-
-/* do topological sort on graph */
-void
-tsort(void)
-{
- NODE *n, *next;
- int cnt, i;
-
- while (graph != NULL) {
- /*
- * Keep getting rid of simple cases until there are none left,
- * if there are any nodes still in the graph, then there is
- * a cycle in it.
- */
- do {
- for (cnt = 0, n = graph; n != NULL; n = next) {
- next = n->n_next;
- if (n->n_refcnt == 0) {
- remove_node(n);
- ++cnt;
- }
- }
- } while (graph != NULL && cnt);
-
- if (graph == NULL)
- break;
-
- if (!cycle_buf) {
- /*
- * Allocate space for two cycle logs - one to be used
- * as scratch space, the other to save the longest
- * cycle.
- */
- for (cnt = 0, n = graph; n != NULL; n = n->n_next)
- ++cnt;
- cycle_buf = malloc(sizeof(NODE *) * cnt);
- longest_cycle = malloc(sizeof(NODE *) * cnt);
- if (cycle_buf == NULL || longest_cycle == NULL)
- err(1, NULL);
- }
- for (n = graph; n != NULL; n = n->n_next)
- if (!(n->n_flags & NF_ACYCLIC)) {
- if ((cnt = find_cycle(n, n, 0, 0))) {
- if (!quiet) {
- warnx("cycle in data");
- for (i = 0; i < cnt; i++)
- warnx("%s",
- longest_cycle[i]->n_name);
- }
- remove_node(n);
- clear_cycle();
- break;
- } else {
- /* to avoid further checks */
- n->n_flags |= NF_ACYCLIC;
- clear_cycle();
- }
- }
-
- if (n == NULL)
- errx(1, "internal error -- could not find cycle");
- }
-}
-
-/* print node and remove from graph (does not actually free node) */
-void
-remove_node(NODE *n)
-{
- NODE **np;
- int i;
-
- (void)printf("%s\n", n->n_name);
- for (np = n->n_arcs, i = n->n_narcs; --i >= 0; np++)
- --(*np)->n_refcnt;
- n->n_narcs = 0;
- *n->n_prevp = n->n_next;
- if (n->n_next)
- n->n_next->n_prevp = n->n_prevp;
-}
-
-
-/* look for the longest? cycle from node from to node to. */
-int
-find_cycle(NODE *from, NODE *to, int longest_len, int depth)
-{
- NODE **np;
- int i, len;
-
- /*
- * avoid infinite loops and ignore portions of the graph known
- * to be acyclic
- */
- if (from->n_flags & (NF_NODEST|NF_MARK|NF_ACYCLIC))
- return (0);
- from->n_flags |= NF_MARK;
-
- for (np = from->n_arcs, i = from->n_narcs; --i >= 0; np++) {
- cycle_buf[depth] = *np;
- if (*np == to) {
- if (depth + 1 > longest_len) {
- longest_len = depth + 1;
- (void)memcpy((char *)longest_cycle,
- (char *)cycle_buf,
- longest_len * sizeof(NODE *));
- }
- } else {
- if ((*np)->n_flags & (NF_MARK|NF_ACYCLIC|NF_NODEST))
- continue;
- len = find_cycle(*np, to, longest_len, depth + 1);
-
- if (debug)
- (void)printf("%*s %s->%s %d\n", depth, "",
- from->n_name, to->n_name, len);
-
- if (len == 0)
- (*np)->n_flags |= NF_NODEST;
-
- if (len > longest_len)
- longest_len = len;
-
- if (len > 0 && !longest)
- break;
- }
- }
- from->n_flags &= ~NF_MARK;
- return (longest_len);
-}
-
-void
-usage(void)
-{
- (void)fprintf(stderr, "usage: tsort [-dlq] [file]\n");
- exit(1);
-}
diff --git a/usr.bin/tty/Makefile b/usr.bin/tty/Makefile
deleted file mode 100644
index 4dcab33..0000000
--- a/usr.bin/tty/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= tty
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/tty/tty.1 b/usr.bin/tty/tty.1
deleted file mode 100644
index 8e55ccb..0000000
--- a/usr.bin/tty/tty.1
+++ /dev/null
@@ -1,87 +0,0 @@
-.\" Copyright (c) 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)tty.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 6, 1993
-.Dt TTY 1
-.Os
-.Sh NAME
-.Nm tty
-.Nd return user's terminal name
-.Sh SYNOPSIS
-.Nm
-.Op Fl s
-.Sh DESCRIPTION
-The
-.Nm
-utility writes the name of the terminal attached to standard input
-to standard output.
-The name that is written is the string returned by
-.Xr ttyname 3 .
-If the standard input is not a terminal, the message
-.Dq Li "not a tty"
-is written.
-The options are as follows:
-.Bl -tag -width indent
-.It Fl s
-Do not write the terminal name; only the exit status is affected
-when this option is specified.
-The
-.Fl s
-option is deprecated in favor of the
-.Dq Li "test -t 0"
-command.
-.El
-.Sh EXIT STATUS
-The
-.Nm
-utility
-exits 0 if the standard input is a terminal, 1 if the standard input is
-not a terminal, and >1 if an error occurs.
-.Sh SEE ALSO
-.Xr test 1 ,
-.Xr ttyname 3
-.Sh STANDARDS
-The
-.Nm
-utility is expected to be
-.St -p1003.2
-compatible.
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v1 .
diff --git a/usr.bin/tty/tty.c b/usr.bin/tty/tty.c
deleted file mode 100644
index 4710e16..0000000
--- a/usr.bin/tty/tty.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1988, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)tty.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif /* not lint */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- int ch, sflag;
- char *t;
-
- sflag = 0;
- while ((ch = getopt(argc, argv, "s")) != -1)
- switch (ch) {
- case 's':
- sflag = 1;
- break;
- case '?':
- default:
- usage();
- }
-
- t = ttyname(0);
- if (!sflag)
- puts(t ? t : "not a tty");
- exit(t ? 0 : 1);
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: tty [-s]\n");
- exit(2);
-}
diff --git a/usr.bin/ul/Makefile b/usr.bin/ul/Makefile
deleted file mode 100644
index 9aaf775..0000000
--- a/usr.bin/ul/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= ul
-
-DPADD= ${LIBTERMCAP}
-LDADD= -ltermcap
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ul/ul.1 b/usr.bin/ul/ul.1
deleted file mode 100644
index 0a04170..0000000
--- a/usr.bin/ul/ul.1
+++ /dev/null
@@ -1,106 +0,0 @@
-.\" Copyright (c) 1980, 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)ul.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd August 4, 2004
-.Dt UL 1
-.Os
-.Sh NAME
-.Nm ul
-.Nd do underlining
-.Sh SYNOPSIS
-.Nm
-.Op Fl i
-.Op Fl t Ar terminal
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility reads the named files (or standard input if none are given)
-and translates occurrences of underscores to the sequence
-which indicates underlining for the terminal in use, as specified
-by the environment variable
-.Ev TERM .
-The file
-.Pa /etc/termcap
-is read to determine the appropriate sequences for underlining.
-If the terminal is incapable of underlining, but is capable of
-a standout mode then that is used instead.
-If the terminal can overstrike,
-or handles underlining automatically,
-.Nm
-degenerates to
-.Xr cat 1 .
-If the terminal cannot underline, underlining is ignored.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl i
-Underlining is indicated by a separate line containing appropriate
-dashes
-.Ql \- ;
-this is useful when you want to look at the underlining
-which is present in an
-.Xr nroff 1
-output stream on a CRT-terminal.
-.It Fl t Ar terminal
-Overrides the terminal type specified in the environment with
-.Ar terminal .
-.El
-.Sh ENVIRONMENT
-The
-.Ev LANG , LC_ALL , LC_CTYPE
-and
-.Ev TERM
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr colcrt 1 ,
-.Xr man 1 ,
-.Xr nroff 1
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3.0 .
-.Sh BUGS
-The
-.Xr nroff 1
-command usually outputs a series of backspaces and underlines intermixed
-with the text to indicate underlining.
-No attempt is made to optimize
-the backward motion.
diff --git a/usr.bin/ul/ul.c b/usr.bin/ul/ul.c
deleted file mode 100644
index 77559cf..0000000
--- a/usr.bin/ul/ul.c
+++ /dev/null
@@ -1,569 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)ul.c 8.1 (Berkeley) 6/6/93";
-#endif
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <err.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <termcap.h>
-#include <unistd.h>
-#include <wchar.h>
-#include <wctype.h>
-
-#define IESC '\033'
-#define SO '\016'
-#define SI '\017'
-#define HFWD '9'
-#define HREV '8'
-#define FREV '7'
-#define MAXBUF 512
-
-#define NORMAL 000
-#define ALTSET 001 /* Reverse */
-#define SUPERSC 002 /* Dim */
-#define SUBSC 004 /* Dim | Ul */
-#define UNDERL 010 /* Ul */
-#define BOLD 020 /* Bold */
-
-int must_use_uc, must_overstrike;
-const char
- *CURS_UP, *CURS_RIGHT, *CURS_LEFT,
- *ENTER_STANDOUT, *EXIT_STANDOUT, *ENTER_UNDERLINE, *EXIT_UNDERLINE,
- *ENTER_DIM, *ENTER_BOLD, *ENTER_REVERSE, *UNDER_CHAR, *EXIT_ATTRIBUTES;
-
-struct CHAR {
- char c_mode;
- wchar_t c_char;
- int c_width; /* width or -1 if multi-column char. filler */
-} ;
-
-struct CHAR obuf[MAXBUF];
-int col, maxcol;
-int mode;
-int halfpos;
-int upln;
-int iflag;
-
-static void usage(void);
-void setnewmode(int);
-void initcap(void);
-void reverse(void);
-int outchar(int);
-void fwd(void);
-void initbuf(void);
-void iattr(void);
-void overstrike(void);
-void flushln(void);
-void filter(FILE *);
-void outc(wint_t, int);
-
-#define PRINT(s) if (s == NULL) /* void */; else tputs(s, 1, outchar)
-
-int
-main(int argc, char **argv)
-{
- int c;
- const char *termtype;
- FILE *f;
- char termcap[1024];
-
- setlocale(LC_ALL, "");
-
- termtype = getenv("TERM");
- if (termtype == NULL || (argv[0][0] == 'c' && !isatty(1)))
- termtype = "lpr";
- while ((c=getopt(argc, argv, "it:T:")) != -1)
- switch(c) {
-
- case 't':
- case 'T': /* for nroff compatibility */
- termtype = optarg;
- break;
- case 'i':
- iflag = 1;
- break;
- default:
- usage();
- }
-
- switch(tgetent(termcap, termtype)) {
-
- case 1:
- break;
-
- default:
- warnx("trouble reading termcap");
- /* FALLTHROUGH */
-
- case 0:
- /* No such terminal type - assume dumb */
- (void)strcpy(termcap, "dumb:os:col#80:cr=^M:sf=^J:am:");
- break;
- }
- initcap();
- if ( (tgetflag("os") && ENTER_BOLD==NULL ) ||
- (tgetflag("ul") && ENTER_UNDERLINE==NULL && UNDER_CHAR==NULL))
- must_overstrike = 1;
- initbuf();
- if (optind == argc)
- filter(stdin);
- else for (; optind<argc; optind++) {
- f = fopen(argv[optind],"r");
- if (f == NULL)
- err(1, "%s", argv[optind]);
- else
- filter(f);
- }
- exit(0);
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: ul [-i] [-t terminal] [file ...]\n");
- exit(1);
-}
-
-void
-filter(FILE *f)
-{
- wint_t c;
- int i, w;
-
- while ((c = getwc(f)) != WEOF && col < MAXBUF) switch(c) {
-
- case '\b':
- if (col > 0)
- col--;
- continue;
-
- case '\t':
- col = (col+8) & ~07;
- if (col > maxcol)
- maxcol = col;
- continue;
-
- case '\r':
- col = 0;
- continue;
-
- case SO:
- mode |= ALTSET;
- continue;
-
- case SI:
- mode &= ~ALTSET;
- continue;
-
- case IESC:
- switch (c = getwc(f)) {
-
- case HREV:
- if (halfpos == 0) {
- mode |= SUPERSC;
- halfpos--;
- } else if (halfpos > 0) {
- mode &= ~SUBSC;
- halfpos--;
- } else {
- halfpos = 0;
- reverse();
- }
- continue;
-
- case HFWD:
- if (halfpos == 0) {
- mode |= SUBSC;
- halfpos++;
- } else if (halfpos < 0) {
- mode &= ~SUPERSC;
- halfpos++;
- } else {
- halfpos = 0;
- fwd();
- }
- continue;
-
- case FREV:
- reverse();
- continue;
-
- default:
- errx(1, "unknown escape sequence in input: %o, %o", IESC, c);
- }
- continue;
-
- case '_':
- if (obuf[col].c_char || obuf[col].c_width < 0) {
- while (col > 0 && obuf[col].c_width < 0)
- col--;
- w = obuf[col].c_width;
- for (i = 0; i < w; i++)
- obuf[col++].c_mode |= UNDERL | mode;
- if (col > maxcol)
- maxcol = col;
- continue;
- }
- obuf[col].c_char = '_';
- obuf[col].c_width = 1;
- /* FALLTHROUGH */
- case ' ':
- col++;
- if (col > maxcol)
- maxcol = col;
- continue;
-
- case '\n':
- flushln();
- continue;
-
- case '\f':
- flushln();
- putwchar('\f');
- continue;
-
- default:
- if ((w = wcwidth(c)) <= 0) /* non printing */
- continue;
- if (obuf[col].c_char == '\0') {
- obuf[col].c_char = c;
- for (i = 0; i < w; i++)
- obuf[col + i].c_mode = mode;
- obuf[col].c_width = w;
- for (i = 1; i < w; i++)
- obuf[col + i].c_width = -1;
- } else if (obuf[col].c_char == '_') {
- obuf[col].c_char = c;
- for (i = 0; i < w; i++)
- obuf[col + i].c_mode |= UNDERL|mode;
- obuf[col].c_width = w;
- for (i = 1; i < w; i++)
- obuf[col + i].c_width = -1;
- } else if (obuf[col].c_char == c) {
- for (i = 0; i < w; i++)
- obuf[col + i].c_mode |= BOLD|mode;
- } else {
- w = obuf[col].c_width;
- for (i = 0; i < w; i++)
- obuf[col + i].c_mode = mode;
- }
- col += w;
- if (col > maxcol)
- maxcol = col;
- continue;
- }
- if (ferror(f))
- err(1, NULL);
- if (maxcol)
- flushln();
-}
-
-void
-flushln(void)
-{
- int lastmode;
- int i;
- int hadmodes = 0;
-
- lastmode = NORMAL;
- for (i=0; i<maxcol; i++) {
- if (obuf[i].c_mode != lastmode) {
- hadmodes++;
- setnewmode(obuf[i].c_mode);
- lastmode = obuf[i].c_mode;
- }
- if (obuf[i].c_char == '\0') {
- if (upln)
- PRINT(CURS_RIGHT);
- else
- outc(' ', 1);
- } else
- outc(obuf[i].c_char, obuf[i].c_width);
- if (obuf[i].c_width > 1)
- i += obuf[i].c_width - 1;
- }
- if (lastmode != NORMAL) {
- setnewmode(0);
- }
- if (must_overstrike && hadmodes)
- overstrike();
- putwchar('\n');
- if (iflag && hadmodes)
- iattr();
- (void)fflush(stdout);
- if (upln)
- upln--;
- initbuf();
-}
-
-/*
- * For terminals that can overstrike, overstrike underlines and bolds.
- * We don't do anything with halfline ups and downs, or Greek.
- */
-void
-overstrike(void)
-{
- int i;
- wchar_t lbuf[256];
- wchar_t *cp = lbuf;
- int hadbold=0;
-
- /* Set up overstrike buffer */
- for (i=0; i<maxcol; i++)
- switch (obuf[i].c_mode) {
- case NORMAL:
- default:
- *cp++ = ' ';
- break;
- case UNDERL:
- *cp++ = '_';
- break;
- case BOLD:
- *cp++ = obuf[i].c_char;
- if (obuf[i].c_width > 1)
- i += obuf[i].c_width - 1;
- hadbold=1;
- break;
- }
- putwchar('\r');
- for (*cp=' '; *cp==' '; cp--)
- *cp = 0;
- for (cp=lbuf; *cp; cp++)
- putwchar(*cp);
- if (hadbold) {
- putwchar('\r');
- for (cp=lbuf; *cp; cp++)
- putwchar(*cp=='_' ? ' ' : *cp);
- putwchar('\r');
- for (cp=lbuf; *cp; cp++)
- putwchar(*cp=='_' ? ' ' : *cp);
- }
-}
-
-void
-iattr(void)
-{
- int i;
- wchar_t lbuf[256];
- wchar_t *cp = lbuf;
-
- for (i=0; i<maxcol; i++)
- switch (obuf[i].c_mode) {
- case NORMAL: *cp++ = ' '; break;
- case ALTSET: *cp++ = 'g'; break;
- case SUPERSC: *cp++ = '^'; break;
- case SUBSC: *cp++ = 'v'; break;
- case UNDERL: *cp++ = '_'; break;
- case BOLD: *cp++ = '!'; break;
- default: *cp++ = 'X'; break;
- }
- for (*cp=' '; *cp==' '; cp--)
- *cp = 0;
- for (cp=lbuf; *cp; cp++)
- putwchar(*cp);
- putwchar('\n');
-}
-
-void
-initbuf(void)
-{
-
- bzero((char *)obuf, sizeof (obuf)); /* depends on NORMAL == 0 */
- col = 0;
- maxcol = 0;
- mode &= ALTSET;
-}
-
-void
-fwd(void)
-{
- int oldcol, oldmax;
-
- oldcol = col;
- oldmax = maxcol;
- flushln();
- col = oldcol;
- maxcol = oldmax;
-}
-
-void
-reverse(void)
-{
- upln++;
- fwd();
- PRINT(CURS_UP);
- PRINT(CURS_UP);
- upln++;
-}
-
-void
-initcap(void)
-{
- static char tcapbuf[512];
- char *bp = tcapbuf;
-
- /* This nonsense attempts to work with both old and new termcap */
- CURS_UP = tgetstr("up", &bp);
- CURS_RIGHT = tgetstr("ri", &bp);
- if (CURS_RIGHT == NULL)
- CURS_RIGHT = tgetstr("nd", &bp);
- CURS_LEFT = tgetstr("le", &bp);
- if (CURS_LEFT == NULL)
- CURS_LEFT = tgetstr("bc", &bp);
- if (CURS_LEFT == NULL && tgetflag("bs"))
- CURS_LEFT = "\b";
-
- ENTER_STANDOUT = tgetstr("so", &bp);
- EXIT_STANDOUT = tgetstr("se", &bp);
- ENTER_UNDERLINE = tgetstr("us", &bp);
- EXIT_UNDERLINE = tgetstr("ue", &bp);
- ENTER_DIM = tgetstr("mh", &bp);
- ENTER_BOLD = tgetstr("md", &bp);
- ENTER_REVERSE = tgetstr("mr", &bp);
- EXIT_ATTRIBUTES = tgetstr("me", &bp);
-
- if (!ENTER_BOLD && ENTER_REVERSE)
- ENTER_BOLD = ENTER_REVERSE;
- if (!ENTER_BOLD && ENTER_STANDOUT)
- ENTER_BOLD = ENTER_STANDOUT;
- if (!ENTER_UNDERLINE && ENTER_STANDOUT) {
- ENTER_UNDERLINE = ENTER_STANDOUT;
- EXIT_UNDERLINE = EXIT_STANDOUT;
- }
- if (!ENTER_DIM && ENTER_STANDOUT)
- ENTER_DIM = ENTER_STANDOUT;
- if (!ENTER_REVERSE && ENTER_STANDOUT)
- ENTER_REVERSE = ENTER_STANDOUT;
- if (!EXIT_ATTRIBUTES && EXIT_STANDOUT)
- EXIT_ATTRIBUTES = EXIT_STANDOUT;
-
- /*
- * Note that we use REVERSE for the alternate character set,
- * not the as/ae capabilities. This is because we are modelling
- * the model 37 teletype (since that's what nroff outputs) and
- * the typical as/ae is more of a graphics set, not the greek
- * letters the 37 has.
- */
-
- UNDER_CHAR = tgetstr("uc", &bp);
- must_use_uc = (UNDER_CHAR && !ENTER_UNDERLINE);
-}
-
-int
-outchar(int c)
-{
- return (putwchar(c) != WEOF ? c : EOF);
-}
-
-static int curmode = 0;
-
-void
-outc(wint_t c, int width)
-{
- int i;
-
- putwchar(c);
- if (must_use_uc && (curmode&UNDERL)) {
- for (i = 0; i < width; i++)
- PRINT(CURS_LEFT);
- for (i = 0; i < width; i++)
- PRINT(UNDER_CHAR);
- }
-}
-
-void
-setnewmode(int newmode)
-{
- if (!iflag) {
- if (curmode != NORMAL && newmode != NORMAL)
- setnewmode(NORMAL);
- switch (newmode) {
- case NORMAL:
- switch(curmode) {
- case NORMAL:
- break;
- case UNDERL:
- PRINT(EXIT_UNDERLINE);
- break;
- default:
- /* This includes standout */
- PRINT(EXIT_ATTRIBUTES);
- break;
- }
- break;
- case ALTSET:
- PRINT(ENTER_REVERSE);
- break;
- case SUPERSC:
- /*
- * This only works on a few terminals.
- * It should be fixed.
- */
- PRINT(ENTER_UNDERLINE);
- PRINT(ENTER_DIM);
- break;
- case SUBSC:
- PRINT(ENTER_DIM);
- break;
- case UNDERL:
- PRINT(ENTER_UNDERLINE);
- break;
- case BOLD:
- PRINT(ENTER_BOLD);
- break;
- default:
- /*
- * We should have some provision here for multiple modes
- * on at once. This will have to come later.
- */
- PRINT(ENTER_STANDOUT);
- break;
- }
- }
- curmode = newmode;
-}
diff --git a/usr.bin/uname/Makefile b/usr.bin/uname/Makefile
deleted file mode 100644
index ae634ca..0000000
--- a/usr.bin/uname/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-
-PROG= uname
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/uname/uname.1 b/usr.bin/uname/uname.1
deleted file mode 100644
index 2a28464..0000000
--- a/usr.bin/uname/uname.1
+++ /dev/null
@@ -1,106 +0,0 @@
-.\" Copyright (c) 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)uname.1 8.3 (Berkeley) 4/8/94
-.\" $FreeBSD$
-.\"
-.Dd April 2, 2003
-.Dt UNAME 1
-.Os
-.Sh NAME
-.Nm uname
-.Nd display information about the system
-.Sh SYNOPSIS
-.Nm
-.Op Fl aimnprsv
-.Sh DESCRIPTION
-The
-.Nm
-command writes the name of the operating system implementation to
-standard output.
-When options are specified, strings representing one or more system
-characteristics are written to standard output.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl a
-Behave as though the options
-.Fl m , n , r , s ,
-and
-.Fl v
-were specified.
-.It Fl i
-Write the kernel ident to standard output.
-.It Fl m
-Write the type of the current hardware platform to standard output.
-.It Fl n
-Write the name of the system to standard output.
-.It Fl p
-Write the type of the machine processor architecture to standard output.
-.It Fl r
-Write the current release level of the operating system
-to standard output.
-.It Fl s
-Write the name of the operating system implementation to standard output.
-.It Fl v
-Write the version level of this release of the operating system
-to standard output.
-.El
-.Pp
-If the
-.Fl a
-flag is specified, or multiple flags are specified, all
-output is written on a single line, separated by spaces.
-.Sh ENVIRONMENT
-An environment variable composed of the string
-.Ev UNAME_
-followed by any flag to the
-.Nm
-utility (except for
-.Fl a )
-will allow the corresponding data to be set to the contents
-of the environment variable.
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr sysctl 3 ,
-.Xr uname 3 ,
-.Xr sysctl 8
-.Sh STANDARDS
-The
-.Nm
-command is expected to conform to the
-.St -p1003.2
-specification.
-.Sh HISTORY
-The
-.Nm
-command appeared in PWB UNIX.
diff --git a/usr.bin/uname/uname.c b/usr.bin/uname/uname.c
deleted file mode 100644
index 81aef45..0000000
--- a/usr.bin/uname/uname.c
+++ /dev/null
@@ -1,249 +0,0 @@
-/*-
- * Copyright (c) 2002 Juli Mallett.
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "@(#)uname.c 8.2 (Berkeley) 5/4/95";
-#endif
-
-#include <sys/param.h>
-#include <sys/sysctl.h>
-
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#define MFLAG 0x01
-#define NFLAG 0x02
-#define PFLAG 0x04
-#define RFLAG 0x08
-#define SFLAG 0x10
-#define VFLAG 0x20
-#define IFLAG 0x40
-
-typedef void (*get_t)(void);
-get_t get_ident, get_platform, get_hostname, get_arch, get_release, get_sysname, get_version;
-
-void native_ident(void);
-void native_platform(void);
-void native_hostname(void);
-void native_arch(void);
-void native_release(void);
-void native_sysname(void);
-void native_version(void);
-void print_uname(u_int);
-void setup_get(void);
-void usage(void);
-
-char *ident, *platform, *hostname, *arch, *release, *sysname, *version;
-int space;
-
-int
-main(int argc, char *argv[])
-{
- u_int flags;
- int ch;
-
- setup_get();
- flags = 0;
-
- while ((ch = getopt(argc, argv, "aimnprsv")) != -1)
- switch(ch) {
- case 'a':
- flags |= (MFLAG | NFLAG | RFLAG | SFLAG | VFLAG);
- break;
- case 'i':
- flags |= IFLAG;
- break;
- case 'm':
- flags |= MFLAG;
- break;
- case 'n':
- flags |= NFLAG;
- break;
- case 'p':
- flags |= PFLAG;
- break;
- case 'r':
- flags |= RFLAG;
- break;
- case 's':
- flags |= SFLAG;
- break;
- case 'v':
- flags |= VFLAG;
- break;
- case '?':
- default:
- usage();
- }
-
- argc -= optind;
- argv += optind;
-
- if (argc)
- usage();
-
- if (!flags)
- flags |= SFLAG;
-
- print_uname(flags);
- exit(0);
-}
-
-#define CHECK_ENV(opt,var) \
-do { \
- if ((var = getenv("UNAME_" opt)) == NULL) { \
- get_##var = native_##var; \
- } else { \
- get_##var = (get_t)NULL; \
- } \
-} while (0)
-
-void
-setup_get(void)
-{
- CHECK_ENV("s", sysname);
- CHECK_ENV("n", hostname);
- CHECK_ENV("r", release);
- CHECK_ENV("v", version);
- CHECK_ENV("m", platform);
- CHECK_ENV("p", arch);
- CHECK_ENV("i", ident);
-}
-
-#define PRINT_FLAG(flags,flag,var) \
- if ((flags & flag) == flag) { \
- if (space) \
- printf(" "); \
- else \
- space++; \
- if (get_##var != NULL) \
- (*get_##var)(); \
- printf("%s", var); \
- }
-
-void
-print_uname(u_int flags)
-{
- PRINT_FLAG(flags, SFLAG, sysname);
- PRINT_FLAG(flags, NFLAG, hostname);
- PRINT_FLAG(flags, RFLAG, release);
- PRINT_FLAG(flags, VFLAG, version);
- PRINT_FLAG(flags, MFLAG, platform);
- PRINT_FLAG(flags, PFLAG, arch);
- PRINT_FLAG(flags, IFLAG, ident);
- printf("\n");
-}
-
-#define NATIVE_SYSCTL2_GET(var,mib0,mib1) \
-void \
-native_##var(void) \
-{ \
- int mib[] = { (mib0), (mib1) }; \
- size_t len; \
- static char buf[1024]; \
- char **varp = &(var); \
- \
- len = sizeof buf; \
- if (sysctl(mib, sizeof mib / sizeof mib[0], \
- &buf, &len, NULL, 0) == -1) \
- err(1, "sysctl");
-
-#define NATIVE_SYSCTLNAME_GET(var,name) \
-void \
-native_##var(void) \
-{ \
- size_t len; \
- static char buf[1024]; \
- char **varp = &(var); \
- \
- len = sizeof buf; \
- if (sysctlbyname(name, &buf, &len, NULL,\
- 0) == -1) \
- err(1, "sysctlbyname");
-
-#define NATIVE_SET \
- *varp = buf; \
- return; \
-} struct __hack
-
-#define NATIVE_BUFFER (buf)
-#define NATIVE_LENGTH (len)
-
-NATIVE_SYSCTL2_GET(sysname, CTL_KERN, KERN_OSTYPE) {
-} NATIVE_SET;
-
-NATIVE_SYSCTL2_GET(hostname, CTL_KERN, KERN_HOSTNAME) {
-} NATIVE_SET;
-
-NATIVE_SYSCTL2_GET(release, CTL_KERN, KERN_OSRELEASE) {
-} NATIVE_SET;
-
-NATIVE_SYSCTL2_GET(version, CTL_KERN, KERN_VERSION) {
- size_t n;
- char *p;
-
- p = NATIVE_BUFFER;
- n = NATIVE_LENGTH;
- for (; n--; ++p)
- if (*p == '\n' || *p == '\t')
- *p = ' ';
-} NATIVE_SET;
-
-NATIVE_SYSCTL2_GET(platform, CTL_HW, HW_MACHINE) {
-} NATIVE_SET;
-
-NATIVE_SYSCTL2_GET(arch, CTL_HW, HW_MACHINE_ARCH) {
-} NATIVE_SET;
-
-NATIVE_SYSCTLNAME_GET(ident, "kern.ident") {
-} NATIVE_SET;
-
-void
-usage(void)
-{
- fprintf(stderr, "usage: uname [-aimnprsv]\n");
- exit(1);
-}
diff --git a/usr.bin/unexpand/Makefile b/usr.bin/unexpand/Makefile
deleted file mode 100644
index 14014fa..0000000
--- a/usr.bin/unexpand/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= unexpand
-NO_MAN=
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/unexpand/unexpand.c b/usr.bin/unexpand/unexpand.c
deleted file mode 100644
index d59cd4e..0000000
--- a/usr.bin/unexpand/unexpand.c
+++ /dev/null
@@ -1,231 +0,0 @@
-/*-
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "@(#)unexpand.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-/*
- * unexpand - put tabs into a file replacing blanks
- */
-#include <ctype.h>
-#include <err.h>
-#include <limits.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-#include <wctype.h>
-
-int all;
-int nstops;
-int tabstops[100];
-
-static void getstops(const char *);
-static void usage(void);
-static int tabify(const char *);
-
-int
-main(int argc, char *argv[])
-{
- int ch, failed;
- char *filename;
-
- setlocale(LC_CTYPE, "");
-
- nstops = 1;
- tabstops[0] = 8;
- while ((ch = getopt(argc, argv, "at:")) != -1) {
- switch (ch) {
- case 'a': /* Un-expand all spaces, not just leading. */
- all = 1;
- break;
- case 't': /* Specify tab list, implies -a. */
- getstops(optarg);
- all = 1;
- break;
- default:
- usage();
- /*NOTREACHED*/
- }
- }
- argc -= optind;
- argv += optind;
-
- failed = 0;
- if (argc == 0)
- failed |= tabify("stdin");
- else {
- while ((filename = *argv++) != NULL) {
- if (freopen(filename, "r", stdin) == NULL) {
- warn("%s", filename);
- failed = 1;
- } else
- failed |= tabify(filename);
- }
- }
- exit(failed != 0);
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: unexpand [-a | -t tablist] [file ...]\n");
- exit(1);
-}
-
-static int
-tabify(const char *curfile)
-{
- int dcol, doneline, limit, n, ocol, width;
- wint_t ch;
-
- limit = nstops == 1 ? INT_MAX : tabstops[nstops - 1] - 1;
-
- doneline = ocol = dcol = 0;
- while ((ch = getwchar()) != WEOF) {
- if (ch == ' ' && !doneline) {
- if (++dcol >= limit)
- doneline = 1;
- continue;
- } else if (ch == '\t') {
- if (nstops == 1) {
- dcol = (1 + dcol / tabstops[0]) *
- tabstops[0];
- continue;
- } else {
- for (n = 0; tabstops[n] - 1 < dcol &&
- n < nstops; n++)
- ;
- if (n < nstops - 1 && tabstops[n] - 1 < limit) {
- dcol = tabstops[n];
- continue;
- }
- doneline = 1;
- }
- }
-
- /* Output maximal number of tabs. */
- if (nstops == 1) {
- while (((ocol + tabstops[0]) / tabstops[0])
- <= (dcol / tabstops[0])) {
- if (dcol - ocol < 2)
- break;
- putwchar('\t');
- ocol = (1 + ocol / tabstops[0]) *
- tabstops[0];
- }
- } else {
- for (n = 0; tabstops[n] - 1 < ocol && n < nstops; n++)
- ;
- while (ocol < dcol && n < nstops && ocol < limit) {
- putwchar('\t');
- ocol = tabstops[n++];
- }
- }
-
- /* Then spaces. */
- while (ocol < dcol && ocol < limit) {
- putwchar(' ');
- ocol++;
- }
-
- if (ch == '\b') {
- putwchar('\b');
- if (ocol > 0)
- ocol--, dcol--;
- } else if (ch == '\n') {
- putwchar('\n');
- doneline = ocol = dcol = 0;
- continue;
- } else if (ch != ' ' || dcol > limit) {
- putwchar(ch);
- if ((width = wcwidth(ch)) > 0)
- ocol += width, dcol += width;
- }
-
- /*
- * Only processing leading blanks or we've gone past the
- * last tab stop. Emit remainder of this line unchanged.
- */
- if (!all || dcol >= limit) {
- while ((ch = getwchar()) != '\n' && ch != WEOF)
- putwchar(ch);
- if (ch == '\n')
- putwchar('\n');
- doneline = ocol = dcol = 0;
- }
- }
- if (ferror(stdin)) {
- warn("%s", curfile);
- return (1);
- }
- return (0);
-}
-
-static void
-getstops(const char *cp)
-{
- int i;
-
- nstops = 0;
- for (;;) {
- i = 0;
- while (*cp >= '0' && *cp <= '9')
- i = i * 10 + *cp++ - '0';
- if (i <= 0)
- errx(1, "bad tab stop spec");
- if (nstops > 0 && i <= tabstops[nstops-1])
- errx(1, "bad tab stop spec");
- if (nstops == sizeof(tabstops) / sizeof(*tabstops))
- errx(1, "too many tab stops");
- tabstops[nstops++] = i;
- if (*cp == 0)
- break;
- if (*cp != ',' && !isblank((unsigned char)*cp))
- errx(1, "bad tab stop spec");
- cp++;
- }
-}
diff --git a/usr.bin/unifdef/Makefile b/usr.bin/unifdef/Makefile
deleted file mode 100644
index b31709a..0000000
--- a/usr.bin/unifdef/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= unifdef
-SCRIPTS=unifdefall.sh
-MLINKS= unifdef.1 unifdefall.1
-WARNS?= 5
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/unifdef/unifdef.1 b/usr.bin/unifdef/unifdef.1
deleted file mode 100644
index 12a5438..0000000
--- a/usr.bin/unifdef/unifdef.1
+++ /dev/null
@@ -1,335 +0,0 @@
-.\" Copyright (c) 1985, 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\" Copyright (c) 2002 - 2005 Tony Finch <dot@dotat.at>. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Dave Yost. It was rewritten to support ANSI C by Tony Finch.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)unifdef.1 8.2 (Berkeley) 4/1/94
-.\" $dotat: things/unifdef.1,v 1.51 2005/03/08 12:39:01 fanf2 Exp $
-.\" $FreeBSD$
-.\"
-.Dd September 24, 2002
-.Dt UNIFDEF 1
-.Os
-.Sh NAME
-.Nm unifdef , unifdefall
-.Nd remove preprocessor conditionals from code
-.Sh SYNOPSIS
-.Nm
-.Op Fl cdeklnst
-.Op Fl I Ns Ar path
-.Op Fl D Ns Ar sym Ns Op = Ns Ar val
-.Op Fl U Ns Ar sym
-.Op Fl iD Ns Ar sym Ns Op = Ns Ar val
-.Op Fl iU Ns Ar sym
-.Ar ...
-.Op Ar file
-.Nm unifdefall
-.Op Fl I Ns Ar path
-.Ar ...
-.Ar file
-.Sh DESCRIPTION
-The
-.Nm
-utility selectively processes conditional
-.Xr cpp 1
-directives.
-It removes from a file
-both the directives
-and any additional text that they specify should be removed,
-while otherwise leaving the file alone.
-.Pp
-The
-.Nm
-utility acts on
-.Ic #if , #ifdef , #ifndef , #elif , #else ,
-and
-.Ic #endif
-lines,
-and it understands only the commonly-used subset
-of the expression syntax for
-.Ic #if
-and
-.Ic #elif
-lines.
-It handles
-integer values of symbols defined on the command line,
-the
-.Fn defined
-operator applied to symbols defined or undefined on the command line,
-the operators
-.Ic \&! , < , > , <= , >= , == , != , && , || ,
-and parenthesized expressions.
-Anything that it does not understand is passed through unharmed.
-It only processes
-.Ic #ifdef
-and
-.Ic #ifndef
-directives if the symbol is specified on the command line,
-otherwise they are also passed through unchanged.
-By default, it ignores
-.Ic #if
-and
-.Ic #elif
-lines with constant expressions,
-or they may be processed by specifying the
-.Fl k
-flag on the command line.
-.Pp
-The
-.Nm
-utility also understands just enough about C
-to know when one of the directives is inactive
-because it is inside
-a comment,
-or affected by a backslash-continued line.
-It spots unusually-formatted preprocessor directives
-and knows when the layout is too odd to handle.
-.Pp
-A script called
-.Nm unifdefall
-can be used to remove all conditional
-.Xr cpp 1
-directives from a file.
-It uses
-.Nm Fl s
-and
-.Nm cpp Fl dM
-to get lists of all the controlling symbols
-and their definitions (or lack thereof),
-then invokes
-.Nm
-with appropriate arguments to process the file.
-.Pp
-Available options:
-.Pp
-.Bl -tag -width indent -compact
-.It Fl D Ns Ar sym Ns Op = Ns Ar val
-Specify that a symbol is defined,
-and optionally specify what value to give it
-for the purpose of handling
-.Ic #if
-and
-.Ic #elif
-directives.
-.Pp
-.It Fl U Ns Ar sym
-Specify that a symbol is undefined.
-If the same symbol appears in more than one argument,
-the last occurrence dominates.
-.Pp
-.It Fl c
-If the
-.Fl c
-flag is specified,
-then the operation of
-.Nm
-is complemented,
-i.e., the lines that would have been removed or blanked
-are retained and vice versa.
-.Pp
-.It Fl d
-Turn on printing of degugging messages.
-.Pp
-.It Fl e
-Because
-.Nm
-processes its input one line at a time,
-it cannot remove preprocessor directives that span more than one line.
-The most common example of this is a directive with a multi-line
-comment hanging off its right hand end.
-By default,
-if
-.Nm
-has to process such a directive,
-it will complain that the line is too obfuscated.
-The
-.Fl e
-option changes the behaviour so that,
-where possible,
-such lines are left unprocessed instead of reporting an error.
-.Pp
-.It Fl k
-Process
-.Ic #if
-and
-.Ic #elif
-lines with constant expressions.
-By default, sections controlled by such lines are passed through unchanged
-because they typically start
-.Dq Li "#if 0"
-and are used as a kind of comment to sketch out future or past development.
-It would be rude to strip them out, just as it would be for normal comments.
-.Pp
-.It Fl l
-Replace removed lines with blank lines
-instead of deleting them.
-.Pp
-.It Fl n
-Add
-.Li #line
-directives to the output following any deleted lines,
-so that errors produced when compiling the output file correspond to
-line numbers in the input file.
-.Pp
-.It Fl s
-Instead of processing the input file as usual,
-this option causes
-.Nm
-to produce a list of symbols that appear in expressions
-that
-.Nm
-understands.
-It is useful in conjunction with the
-.Fl dM
-option of
-.Xr cpp 1
-for creating
-.Nm
-command lines.
-.Pp
-.It Fl t
-Disables parsing for C comments
-and line continuations,
-which is useful
-for plain text.
-.Pp
-.It Fl iD Ns Ar sym Ns Op = Ns Ar val
-.It Fl iU Ns Ar sym
-Ignore
-.Ic #ifdef Ns s .
-If your C code uses
-.Ic #ifdef Ns s
-to delimit non-C lines,
-such as comments
-or code which is under construction,
-then you must tell
-.Nm
-which symbols are used for that purpose so that it will not try to parse
-comments
-and line continuations
-inside those
-.Ic #ifdef Ns s .
-One specifies ignored symbols with
-.Fl iD Ns Ar sym Ns Oo = Ns Ar val Oc
-and
-.Fl iU Ns Ar sym
-similar to
-.Fl D Ns Ar sym Ns Op = Ns Ar val
-and
-.Fl U Ns Ar sym
-above.
-.Pp
-.It Fl I Ns Ar path
-Specifies to
-.Nm unifdefall
-an additional place to look for
-.Ic #include
-files.
-This option is ignored by
-.Nm
-for compatibility with
-.Xr cpp 1
-and to simplify the implementation of
-.Nm unifdefall .
-.El
-.Pp
-The
-.Nm
-utility copies its output to
-.Em stdout
-and will take its input from
-.Em stdin
-if no
-.Ar file
-argument is given.
-.Pp
-The
-.Nm
-utility works nicely with the
-.Fl D Ns Ar sym
-option of
-.Xr diff 1 .
-.Sh EXIT STATUS
-The
-.Nm
-utility exits 0 if the output is an exact copy of the input,
-1 if not, and 2 if in trouble.
-.Sh DIAGNOSTICS
-.Bl -item
-.It
-Too many levels of nesting.
-.It
-Inappropriate
-.Ic #elif ,
-.Ic #else
-or
-.Ic #endif .
-.It
-Obfuscated preprocessor control line.
-.It
-Premature
-.Tn EOF
-(with the line number of the most recent unterminated
-.Ic #if ) .
-.It
-.Tn EOF
-in comment.
-.El
-.Sh SEE ALSO
-.Xr cpp 1 ,
-.Xr diff 1
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 2.9 .
-.Tn ANSI\~C
-support was added in
-.Fx 4.7 .
-.Sh AUTHORS
-This implementation was originally written by
-.An Dave Yost Aq Dave@Yost.com .
-.An Tony Finch Aq dot@dotat.at
-rewrote it to support
-.Tn ANSI\~C .
-.Sh BUGS
-Expression evaluation is very limited.
-.Pp
-Preprocessor control lines split across more than one physical line
-(because of comments or backslash-newline)
-cannot be handled in every situation.
-.Pp
-Trigraphs are not recognized.
-.Pp
-There is no support for symbols with different definitions at
-different points in the source file.
-.Pp
-The text-mode and ignore functionality does not correspond to modern
-.Xr cpp 1
-behaviour.
diff --git a/usr.bin/unifdef/unifdef.c b/usr.bin/unifdef/unifdef.c
deleted file mode 100644
index a8427d1..0000000
--- a/usr.bin/unifdef/unifdef.c
+++ /dev/null
@@ -1,1012 +0,0 @@
-/*
- * Copyright (c) 2002 - 2008 Tony Finch <dot@dotat.at>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * This code is derived from software contributed to Berkeley by Dave Yost.
- * It was rewritten to support ANSI C by Tony Finch. The original version
- * of unifdef carried the 4-clause BSD copyright licence. None of its code
- * remains in this version (though some of the names remain) so it now
- * carries a more liberal licence.
- */
-
-#include <sys/cdefs.h>
-
-#ifndef lint
-#if 0
-static const char copyright[] =
-"@(#) Copyright (c) 1985, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-#ifdef __IDSTRING
-__IDSTRING(Berkeley, "@(#)unifdef.c 8.1 (Berkeley) 6/6/93");
-__IDSTRING(NetBSD, "$NetBSD: unifdef.c,v 1.8 2000/07/03 02:51:36 matt Exp $");
-__IDSTRING(dotat, "$dotat: things/unifdef.c,v 1.178 2008/03/02 22:23:32 fanf2 Exp $");
-#endif
-#endif /* not lint */
-#ifdef __FBSDID
-__FBSDID("$FreeBSD$");
-#endif
-
-/*
- * unifdef - remove ifdef'ed lines
- *
- * Wishlist:
- * provide an option which will append the name of the
- * appropriate symbol after #else's and #endif's
- * provide an option which will check symbols after
- * #else's and #endif's to see that they match their
- * corresponding #ifdef or #ifndef
- *
- * The first two items above require better buffer handling, which would
- * also make it possible to handle all "dodgy" directives correctly.
- */
-
-#include <ctype.h>
-#include <err.h>
-#include <stdarg.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-/* types of input lines: */
-typedef enum {
- LT_TRUEI, /* a true #if with ignore flag */
- LT_FALSEI, /* a false #if with ignore flag */
- LT_IF, /* an unknown #if */
- LT_TRUE, /* a true #if */
- LT_FALSE, /* a false #if */
- LT_ELIF, /* an unknown #elif */
- LT_ELTRUE, /* a true #elif */
- LT_ELFALSE, /* a false #elif */
- LT_ELSE, /* #else */
- LT_ENDIF, /* #endif */
- LT_DODGY, /* flag: directive is not on one line */
- LT_DODGY_LAST = LT_DODGY + LT_ENDIF,
- LT_PLAIN, /* ordinary line */
- LT_EOF, /* end of file */
- LT_COUNT
-} Linetype;
-
-static char const * const linetype_name[] = {
- "TRUEI", "FALSEI", "IF", "TRUE", "FALSE",
- "ELIF", "ELTRUE", "ELFALSE", "ELSE", "ENDIF",
- "DODGY TRUEI", "DODGY FALSEI",
- "DODGY IF", "DODGY TRUE", "DODGY FALSE",
- "DODGY ELIF", "DODGY ELTRUE", "DODGY ELFALSE",
- "DODGY ELSE", "DODGY ENDIF",
- "PLAIN", "EOF"
-};
-
-/* state of #if processing */
-typedef enum {
- IS_OUTSIDE,
- IS_FALSE_PREFIX, /* false #if followed by false #elifs */
- IS_TRUE_PREFIX, /* first non-false #(el)if is true */
- IS_PASS_MIDDLE, /* first non-false #(el)if is unknown */
- IS_FALSE_MIDDLE, /* a false #elif after a pass state */
- IS_TRUE_MIDDLE, /* a true #elif after a pass state */
- IS_PASS_ELSE, /* an else after a pass state */
- IS_FALSE_ELSE, /* an else after a true state */
- IS_TRUE_ELSE, /* an else after only false states */
- IS_FALSE_TRAILER, /* #elifs after a true are false */
- IS_COUNT
-} Ifstate;
-
-static char const * const ifstate_name[] = {
- "OUTSIDE", "FALSE_PREFIX", "TRUE_PREFIX",
- "PASS_MIDDLE", "FALSE_MIDDLE", "TRUE_MIDDLE",
- "PASS_ELSE", "FALSE_ELSE", "TRUE_ELSE",
- "FALSE_TRAILER"
-};
-
-/* state of comment parser */
-typedef enum {
- NO_COMMENT = false, /* outside a comment */
- C_COMMENT, /* in a comment like this one */
- CXX_COMMENT, /* between // and end of line */
- STARTING_COMMENT, /* just after slash-backslash-newline */
- FINISHING_COMMENT, /* star-backslash-newline in a C comment */
- CHAR_LITERAL, /* inside '' */
- STRING_LITERAL /* inside "" */
-} Comment_state;
-
-static char const * const comment_name[] = {
- "NO", "C", "CXX", "STARTING", "FINISHING", "CHAR", "STRING"
-};
-
-/* state of preprocessor line parser */
-typedef enum {
- LS_START, /* only space and comments on this line */
- LS_HASH, /* only space, comments, and a hash */
- LS_DIRTY /* this line can't be a preprocessor line */
-} Line_state;
-
-static char const * const linestate_name[] = {
- "START", "HASH", "DIRTY"
-};
-
-/*
- * Minimum translation limits from ISO/IEC 9899:1999 5.2.4.1
- */
-#define MAXDEPTH 64 /* maximum #if nesting */
-#define MAXLINE 4096 /* maximum length of line */
-#define MAXSYMS 4096 /* maximum number of symbols */
-
-/*
- * Sometimes when editing a keyword the replacement text is longer, so
- * we leave some space at the end of the tline buffer to accommodate this.
- */
-#define EDITSLOP 10
-
-/*
- * Globals.
- */
-
-static bool complement; /* -c: do the complement */
-static bool debugging; /* -d: debugging reports */
-static bool iocccok; /* -e: fewer IOCCC errors */
-static bool killconsts; /* -k: eval constant #ifs */
-static bool lnblank; /* -l: blank deleted lines */
-static bool lnnum; /* -n: add #line directives */
-static bool symlist; /* -s: output symbol list */
-static bool text; /* -t: this is a text file */
-
-static const char *symname[MAXSYMS]; /* symbol name */
-static const char *value[MAXSYMS]; /* -Dsym=value */
-static bool ignore[MAXSYMS]; /* -iDsym or -iUsym */
-static int nsyms; /* number of symbols */
-
-static FILE *input; /* input file pointer */
-static const char *filename; /* input file name */
-static int linenum; /* current line number */
-
-static char tline[MAXLINE+EDITSLOP];/* input buffer plus space */
-static char *keyword; /* used for editing #elif's */
-
-static Comment_state incomment; /* comment parser state */
-static Line_state linestate; /* #if line parser state */
-static Ifstate ifstate[MAXDEPTH]; /* #if processor state */
-static bool ignoring[MAXDEPTH]; /* ignore comments state */
-static int stifline[MAXDEPTH]; /* start of current #if */
-static int depth; /* current #if nesting */
-static int delcount; /* count of deleted lines */
-static bool keepthis; /* don't delete constant #if */
-
-static int exitstat; /* program exit status */
-
-static void addsym(bool, bool, char *);
-static void debug(const char *, ...);
-static void done(void);
-static void error(const char *);
-static int findsym(const char *);
-static void flushline(bool);
-static Linetype getline(void);
-static Linetype ifeval(const char **);
-static void ignoreoff(void);
-static void ignoreon(void);
-static void keywordedit(const char *);
-static void nest(void);
-static void process(void);
-static const char *skipcomment(const char *);
-static const char *skipsym(const char *);
-static void state(Ifstate);
-static int strlcmp(const char *, const char *, size_t);
-static void unnest(void);
-static void usage(void);
-
-#define endsym(c) (!isalpha((unsigned char)c) && !isdigit((unsigned char)c) && c != '_')
-
-/*
- * The main program.
- */
-int
-main(int argc, char *argv[])
-{
- int opt;
-
- while ((opt = getopt(argc, argv, "i:D:U:I:cdeklnst")) != -1)
- switch (opt) {
- case 'i': /* treat stuff controlled by these symbols as text */
- /*
- * For strict backwards-compatibility the U or D
- * should be immediately after the -i but it doesn't
- * matter much if we relax that requirement.
- */
- opt = *optarg++;
- if (opt == 'D')
- addsym(true, true, optarg);
- else if (opt == 'U')
- addsym(true, false, optarg);
- else
- usage();
- break;
- case 'D': /* define a symbol */
- addsym(false, true, optarg);
- break;
- case 'U': /* undef a symbol */
- addsym(false, false, optarg);
- break;
- case 'I':
- /* no-op for compatibility with cpp */
- break;
- case 'c': /* treat -D as -U and vice versa */
- complement = true;
- break;
- case 'd':
- debugging = true;
- break;
- case 'e': /* fewer errors from dodgy lines */
- iocccok = true;
- break;
- case 'k': /* process constant #ifs */
- killconsts = true;
- break;
- case 'l': /* blank deleted lines instead of omitting them */
- lnblank = true;
- break;
- case 'n': /* add #line directive after deleted lines */
- lnnum = true;
- break;
- case 's': /* only output list of symbols that control #ifs */
- symlist = true;
- break;
- case 't': /* don't parse C comments */
- text = true;
- break;
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
- if (argc > 1) {
- errx(2, "can only do one file");
- } else if (argc == 1 && strcmp(*argv, "-") != 0) {
- filename = *argv;
- input = fopen(filename, "r");
- if (input == NULL)
- err(2, "can't open %s", filename);
- } else {
- filename = "[stdin]";
- input = stdin;
- }
- process();
- abort(); /* bug */
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: unifdef [-cdeklnst] [-Ipath]"
- " [-Dsym[=val]] [-Usym] [-iDsym[=val]] [-iUsym] ... [file]\n");
- exit(2);
-}
-
-/*
- * A state transition function alters the global #if processing state
- * in a particular way. The table below is indexed by the current
- * processing state and the type of the current line.
- *
- * Nesting is handled by keeping a stack of states; some transition
- * functions increase or decrease the depth. They also maintain the
- * ignore state on a stack. In some complicated cases they have to
- * alter the preprocessor directive, as follows.
- *
- * When we have processed a group that starts off with a known-false
- * #if/#elif sequence (which has therefore been deleted) followed by a
- * #elif that we don't understand and therefore must keep, we edit the
- * latter into a #if to keep the nesting correct.
- *
- * When we find a true #elif in a group, the following block will
- * always be kept and the rest of the sequence after the next #elif or
- * #else will be discarded. We edit the #elif into a #else and the
- * following directive to #endif since this has the desired behaviour.
- *
- * "Dodgy" directives are split across multiple lines, the most common
- * example being a multi-line comment hanging off the right of the
- * directive. We can handle them correctly only if there is no change
- * from printing to dropping (or vice versa) caused by that directive.
- * If the directive is the first of a group we have a choice between
- * failing with an error, or passing it through unchanged instead of
- * evaluating it. The latter is not the default to avoid questions from
- * users about unifdef unexpectedly leaving behind preprocessor directives.
- */
-typedef void state_fn(void);
-
-/* report an error */
-static void Eelif (void) { error("Inappropriate #elif"); }
-static void Eelse (void) { error("Inappropriate #else"); }
-static void Eendif(void) { error("Inappropriate #endif"); }
-static void Eeof (void) { error("Premature EOF"); }
-static void Eioccc(void) { error("Obfuscated preprocessor control line"); }
-/* plain line handling */
-static void print (void) { flushline(true); }
-static void drop (void) { flushline(false); }
-/* output lacks group's start line */
-static void Strue (void) { drop(); ignoreoff(); state(IS_TRUE_PREFIX); }
-static void Sfalse(void) { drop(); ignoreoff(); state(IS_FALSE_PREFIX); }
-static void Selse (void) { drop(); state(IS_TRUE_ELSE); }
-/* print/pass this block */
-static void Pelif (void) { print(); ignoreoff(); state(IS_PASS_MIDDLE); }
-static void Pelse (void) { print(); state(IS_PASS_ELSE); }
-static void Pendif(void) { print(); unnest(); }
-/* discard this block */
-static void Dfalse(void) { drop(); ignoreoff(); state(IS_FALSE_TRAILER); }
-static void Delif (void) { drop(); ignoreoff(); state(IS_FALSE_MIDDLE); }
-static void Delse (void) { drop(); state(IS_FALSE_ELSE); }
-static void Dendif(void) { drop(); unnest(); }
-/* first line of group */
-static void Fdrop (void) { nest(); Dfalse(); }
-static void Fpass (void) { nest(); Pelif(); }
-static void Ftrue (void) { nest(); Strue(); }
-static void Ffalse(void) { nest(); Sfalse(); }
-/* variable pedantry for obfuscated lines */
-static void Oiffy (void) { if (!iocccok) Eioccc(); Fpass(); ignoreon(); }
-static void Oif (void) { if (!iocccok) Eioccc(); Fpass(); }
-static void Oelif (void) { if (!iocccok) Eioccc(); Pelif(); }
-/* ignore comments in this block */
-static void Idrop (void) { Fdrop(); ignoreon(); }
-static void Itrue (void) { Ftrue(); ignoreon(); }
-static void Ifalse(void) { Ffalse(); ignoreon(); }
-/* edit this line */
-static void Mpass (void) { strncpy(keyword, "if ", 4); Pelif(); }
-static void Mtrue (void) { keywordedit("else\n"); state(IS_TRUE_MIDDLE); }
-static void Melif (void) { keywordedit("endif\n"); state(IS_FALSE_TRAILER); }
-static void Melse (void) { keywordedit("endif\n"); state(IS_FALSE_ELSE); }
-
-static state_fn * const trans_table[IS_COUNT][LT_COUNT] = {
-/* IS_OUTSIDE */
-{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Eendif,
- Oiffy, Oiffy, Fpass, Oif, Oif, Eelif, Eelif, Eelif, Eelse, Eendif,
- print, done },
-/* IS_FALSE_PREFIX */
-{ Idrop, Idrop, Fdrop, Fdrop, Fdrop, Mpass, Strue, Sfalse,Selse, Dendif,
- Idrop, Idrop, Fdrop, Fdrop, Fdrop, Mpass, Eioccc,Eioccc,Eioccc,Eioccc,
- drop, Eeof },
-/* IS_TRUE_PREFIX */
-{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Dfalse,Dfalse,Dfalse,Delse, Dendif,
- Oiffy, Oiffy, Fpass, Oif, Oif, Eioccc,Eioccc,Eioccc,Eioccc,Eioccc,
- print, Eeof },
-/* IS_PASS_MIDDLE */
-{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Pelif, Mtrue, Delif, Pelse, Pendif,
- Oiffy, Oiffy, Fpass, Oif, Oif, Pelif, Oelif, Oelif, Pelse, Pendif,
- print, Eeof },
-/* IS_FALSE_MIDDLE */
-{ Idrop, Idrop, Fdrop, Fdrop, Fdrop, Pelif, Mtrue, Delif, Pelse, Pendif,
- Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eioccc,Eioccc,Eioccc,Eioccc,Eioccc,
- drop, Eeof },
-/* IS_TRUE_MIDDLE */
-{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Melif, Melif, Melif, Melse, Pendif,
- Oiffy, Oiffy, Fpass, Oif, Oif, Eioccc,Eioccc,Eioccc,Eioccc,Pendif,
- print, Eeof },
-/* IS_PASS_ELSE */
-{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Pendif,
- Oiffy, Oiffy, Fpass, Oif, Oif, Eelif, Eelif, Eelif, Eelse, Pendif,
- print, Eeof },
-/* IS_FALSE_ELSE */
-{ Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eelif, Eelif, Eelif, Eelse, Dendif,
- Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eelif, Eelif, Eelif, Eelse, Eioccc,
- drop, Eeof },
-/* IS_TRUE_ELSE */
-{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Dendif,
- Oiffy, Oiffy, Fpass, Oif, Oif, Eelif, Eelif, Eelif, Eelse, Eioccc,
- print, Eeof },
-/* IS_FALSE_TRAILER */
-{ Idrop, Idrop, Fdrop, Fdrop, Fdrop, Dfalse,Dfalse,Dfalse,Delse, Dendif,
- Idrop, Idrop, Fdrop, Fdrop, Fdrop, Dfalse,Dfalse,Dfalse,Delse, Eioccc,
- drop, Eeof }
-/*TRUEI FALSEI IF TRUE FALSE ELIF ELTRUE ELFALSE ELSE ENDIF
- TRUEI FALSEI IF TRUE FALSE ELIF ELTRUE ELFALSE ELSE ENDIF (DODGY)
- PLAIN EOF */
-};
-
-/*
- * State machine utility functions
- */
-static void
-done(void)
-{
- if (incomment)
- error("EOF in comment");
- exit(exitstat);
-}
-static void
-ignoreoff(void)
-{
- if (depth == 0)
- abort(); /* bug */
- ignoring[depth] = ignoring[depth-1];
-}
-static void
-ignoreon(void)
-{
- ignoring[depth] = true;
-}
-static void
-keywordedit(const char *replacement)
-{
- strlcpy(keyword, replacement, tline + sizeof(tline) - keyword);
- print();
-}
-static void
-nest(void)
-{
- depth += 1;
- if (depth >= MAXDEPTH)
- error("Too many levels of nesting");
- stifline[depth] = linenum;
-}
-static void
-unnest(void)
-{
- if (depth == 0)
- abort(); /* bug */
- depth -= 1;
-}
-static void
-state(Ifstate is)
-{
- ifstate[depth] = is;
-}
-
-/*
- * Write a line to the output or not, according to command line options.
- */
-static void
-flushline(bool keep)
-{
- if (symlist)
- return;
- if (keep ^ complement) {
- if (lnnum && delcount > 0)
- printf("#line %d\n", linenum);
- fputs(tline, stdout);
- delcount = 0;
- } else {
- if (lnblank)
- putc('\n', stdout);
- exitstat = 1;
- delcount += 1;
- }
-}
-
-/*
- * The driver for the state machine.
- */
-static void
-process(void)
-{
- Linetype lineval;
-
- for (;;) {
- linenum++;
- lineval = getline();
- trans_table[ifstate[depth]][lineval]();
- debug("process %s -> %s depth %d",
- linetype_name[lineval],
- ifstate_name[ifstate[depth]], depth);
- }
-}
-
-/*
- * Parse a line and determine its type. We keep the preprocessor line
- * parser state between calls in the global variable linestate, with
- * help from skipcomment().
- */
-static Linetype
-getline(void)
-{
- const char *cp;
- int cursym;
- int kwlen;
- Linetype retval;
- Comment_state wascomment;
-
- if (fgets(tline, MAXLINE, input) == NULL)
- return (LT_EOF);
- retval = LT_PLAIN;
- wascomment = incomment;
- cp = skipcomment(tline);
- if (linestate == LS_START) {
- if (*cp == '#') {
- linestate = LS_HASH;
- cp = skipcomment(cp + 1);
- } else if (*cp != '\0')
- linestate = LS_DIRTY;
- }
- if (!incomment && linestate == LS_HASH) {
- keyword = tline + (cp - tline);
- cp = skipsym(cp);
- kwlen = cp - keyword;
- /* no way can we deal with a continuation inside a keyword */
- if (strncmp(cp, "\\\n", 2) == 0)
- Eioccc();
- if (strlcmp("ifdef", keyword, kwlen) == 0 ||
- strlcmp("ifndef", keyword, kwlen) == 0) {
- cp = skipcomment(cp);
- if ((cursym = findsym(cp)) < 0)
- retval = LT_IF;
- else {
- retval = (keyword[2] == 'n')
- ? LT_FALSE : LT_TRUE;
- if (value[cursym] == NULL)
- retval = (retval == LT_TRUE)
- ? LT_FALSE : LT_TRUE;
- if (ignore[cursym])
- retval = (retval == LT_TRUE)
- ? LT_TRUEI : LT_FALSEI;
- }
- cp = skipsym(cp);
- } else if (strlcmp("if", keyword, kwlen) == 0)
- retval = ifeval(&cp);
- else if (strlcmp("elif", keyword, kwlen) == 0)
- retval = ifeval(&cp) - LT_IF + LT_ELIF;
- else if (strlcmp("else", keyword, kwlen) == 0)
- retval = LT_ELSE;
- else if (strlcmp("endif", keyword, kwlen) == 0)
- retval = LT_ENDIF;
- else {
- linestate = LS_DIRTY;
- retval = LT_PLAIN;
- }
- cp = skipcomment(cp);
- if (*cp != '\0') {
- linestate = LS_DIRTY;
- if (retval == LT_TRUE || retval == LT_FALSE ||
- retval == LT_TRUEI || retval == LT_FALSEI)
- retval = LT_IF;
- if (retval == LT_ELTRUE || retval == LT_ELFALSE)
- retval = LT_ELIF;
- }
- if (retval != LT_PLAIN && (wascomment || incomment)) {
- retval += LT_DODGY;
- if (incomment)
- linestate = LS_DIRTY;
- }
- /* skipcomment normally changes the state, except
- if the last line of the file lacks a newline, or
- if there is too much whitespace in a directive */
- if (linestate == LS_HASH) {
- size_t len = cp - tline;
- if (fgets(tline + len, MAXLINE - len, input) == NULL) {
- /* append the missing newline */
- tline[len+0] = '\n';
- tline[len+1] = '\0';
- cp++;
- linestate = LS_START;
- } else {
- linestate = LS_DIRTY;
- }
- }
- }
- if (linestate == LS_DIRTY) {
- while (*cp != '\0')
- cp = skipcomment(cp + 1);
- }
- debug("parser %s comment %s line",
- comment_name[incomment], linestate_name[linestate]);
- return (retval);
-}
-
-/*
- * These are the binary operators that are supported by the expression
- * evaluator. Note that if support for division is added then we also
- * need short-circuiting booleans because of divide-by-zero.
- */
-static int op_lt(int a, int b) { return (a < b); }
-static int op_gt(int a, int b) { return (a > b); }
-static int op_le(int a, int b) { return (a <= b); }
-static int op_ge(int a, int b) { return (a >= b); }
-static int op_eq(int a, int b) { return (a == b); }
-static int op_ne(int a, int b) { return (a != b); }
-static int op_or(int a, int b) { return (a || b); }
-static int op_and(int a, int b) { return (a && b); }
-
-/*
- * An evaluation function takes three arguments, as follows: (1) a pointer to
- * an element of the precedence table which lists the operators at the current
- * level of precedence; (2) a pointer to an integer which will receive the
- * value of the expression; and (3) a pointer to a char* that points to the
- * expression to be evaluated and that is updated to the end of the expression
- * when evaluation is complete. The function returns LT_FALSE if the value of
- * the expression is zero, LT_TRUE if it is non-zero, or LT_IF if the
- * expression could not be evaluated.
- */
-struct ops;
-
-typedef Linetype eval_fn(const struct ops *, int *, const char **);
-
-static eval_fn eval_table, eval_unary;
-
-/*
- * The precedence table. Expressions involving binary operators are evaluated
- * in a table-driven way by eval_table. When it evaluates a subexpression it
- * calls the inner function with its first argument pointing to the next
- * element of the table. Innermost expressions have special non-table-driven
- * handling.
- */
-static const struct ops {
- eval_fn *inner;
- struct op {
- const char *str;
- int (*fn)(int, int);
- } op[5];
-} eval_ops[] = {
- { eval_table, { { "||", op_or } } },
- { eval_table, { { "&&", op_and } } },
- { eval_table, { { "==", op_eq },
- { "!=", op_ne } } },
- { eval_unary, { { "<=", op_le },
- { ">=", op_ge },
- { "<", op_lt },
- { ">", op_gt } } }
-};
-
-/*
- * Function for evaluating the innermost parts of expressions,
- * viz. !expr (expr) defined(symbol) symbol number
- * We reset the keepthis flag when we find a non-constant subexpression.
- */
-static Linetype
-eval_unary(const struct ops *ops, int *valp, const char **cpp)
-{
- const char *cp;
- char *ep;
- int sym;
- bool defparen;
-
- cp = skipcomment(*cpp);
- if (*cp == '!') {
- debug("eval%d !", ops - eval_ops);
- cp++;
- if (eval_unary(ops, valp, &cp) == LT_IF)
- return (LT_IF);
- *valp = !*valp;
- } else if (*cp == '(') {
- cp++;
- debug("eval%d (", ops - eval_ops);
- if (eval_table(eval_ops, valp, &cp) == LT_IF)
- return (LT_IF);
- cp = skipcomment(cp);
- if (*cp++ != ')')
- return (LT_IF);
- } else if (isdigit((unsigned char)*cp)) {
- debug("eval%d number", ops - eval_ops);
- *valp = strtol(cp, &ep, 0);
- cp = skipsym(cp);
- } else if (strncmp(cp, "defined", 7) == 0 && endsym(cp[7])) {
- cp = skipcomment(cp+7);
- debug("eval%d defined", ops - eval_ops);
- if (*cp == '(') {
- cp = skipcomment(cp+1);
- defparen = true;
- } else {
- defparen = false;
- }
- sym = findsym(cp);
- if (sym < 0)
- return (LT_IF);
- *valp = (value[sym] != NULL);
- cp = skipsym(cp);
- cp = skipcomment(cp);
- if (defparen && *cp++ != ')')
- return (LT_IF);
- keepthis = false;
- } else if (!endsym(*cp)) {
- debug("eval%d symbol", ops - eval_ops);
- sym = findsym(cp);
- if (sym < 0)
- return (LT_IF);
- if (value[sym] == NULL)
- *valp = 0;
- else {
- *valp = strtol(value[sym], &ep, 0);
- if (*ep != '\0' || ep == value[sym])
- return (LT_IF);
- }
- cp = skipsym(cp);
- keepthis = false;
- } else {
- debug("eval%d bad expr", ops - eval_ops);
- return (LT_IF);
- }
-
- *cpp = cp;
- debug("eval%d = %d", ops - eval_ops, *valp);
- return (*valp ? LT_TRUE : LT_FALSE);
-}
-
-/*
- * Table-driven evaluation of binary operators.
- */
-static Linetype
-eval_table(const struct ops *ops, int *valp, const char **cpp)
-{
- const struct op *op;
- const char *cp;
- int val;
-
- debug("eval%d", ops - eval_ops);
- cp = *cpp;
- if (ops->inner(ops+1, valp, &cp) == LT_IF)
- return (LT_IF);
- for (;;) {
- cp = skipcomment(cp);
- for (op = ops->op; op->str != NULL; op++)
- if (strncmp(cp, op->str, strlen(op->str)) == 0)
- break;
- if (op->str == NULL)
- break;
- cp += strlen(op->str);
- debug("eval%d %s", ops - eval_ops, op->str);
- if (ops->inner(ops+1, &val, &cp) == LT_IF)
- return (LT_IF);
- *valp = op->fn(*valp, val);
- }
-
- *cpp = cp;
- debug("eval%d = %d", ops - eval_ops, *valp);
- return (*valp ? LT_TRUE : LT_FALSE);
-}
-
-/*
- * Evaluate the expression on a #if or #elif line. If we can work out
- * the result we return LT_TRUE or LT_FALSE accordingly, otherwise we
- * return just a generic LT_IF.
- */
-static Linetype
-ifeval(const char **cpp)
-{
- int ret;
- int val = 0;
-
- debug("eval %s", *cpp);
- keepthis = killconsts ? false : true;
- ret = eval_table(eval_ops, &val, cpp);
- debug("eval = %d", val);
- return (keepthis ? LT_IF : ret);
-}
-
-/*
- * Skip over comments, strings, and character literals and stop at the
- * next character position that is not whitespace. Between calls we keep
- * the comment state in the global variable incomment, and we also adjust
- * the global variable linestate when we see a newline.
- * XXX: doesn't cope with the buffer splitting inside a state transition.
- */
-static const char *
-skipcomment(const char *cp)
-{
- if (text || ignoring[depth]) {
- for (; isspace((unsigned char)*cp); cp++)
- if (*cp == '\n')
- linestate = LS_START;
- return (cp);
- }
- while (*cp != '\0')
- /* don't reset to LS_START after a line continuation */
- if (strncmp(cp, "\\\n", 2) == 0)
- cp += 2;
- else switch (incomment) {
- case NO_COMMENT:
- if (strncmp(cp, "/\\\n", 3) == 0) {
- incomment = STARTING_COMMENT;
- cp += 3;
- } else if (strncmp(cp, "/*", 2) == 0) {
- incomment = C_COMMENT;
- cp += 2;
- } else if (strncmp(cp, "//", 2) == 0) {
- incomment = CXX_COMMENT;
- cp += 2;
- } else if (strncmp(cp, "\'", 1) == 0) {
- incomment = CHAR_LITERAL;
- linestate = LS_DIRTY;
- cp += 1;
- } else if (strncmp(cp, "\"", 1) == 0) {
- incomment = STRING_LITERAL;
- linestate = LS_DIRTY;
- cp += 1;
- } else if (strncmp(cp, "\n", 1) == 0) {
- linestate = LS_START;
- cp += 1;
- } else if (strchr(" \t", *cp) != NULL) {
- cp += 1;
- } else
- return (cp);
- continue;
- case CXX_COMMENT:
- if (strncmp(cp, "\n", 1) == 0) {
- incomment = NO_COMMENT;
- linestate = LS_START;
- }
- cp += 1;
- continue;
- case CHAR_LITERAL:
- case STRING_LITERAL:
- if ((incomment == CHAR_LITERAL && cp[0] == '\'') ||
- (incomment == STRING_LITERAL && cp[0] == '\"')) {
- incomment = NO_COMMENT;
- cp += 1;
- } else if (cp[0] == '\\') {
- if (cp[1] == '\0')
- cp += 1;
- else
- cp += 2;
- } else if (strncmp(cp, "\n", 1) == 0) {
- if (incomment == CHAR_LITERAL)
- error("unterminated char literal");
- else
- error("unterminated string literal");
- } else
- cp += 1;
- continue;
- case C_COMMENT:
- if (strncmp(cp, "*\\\n", 3) == 0) {
- incomment = FINISHING_COMMENT;
- cp += 3;
- } else if (strncmp(cp, "*/", 2) == 0) {
- incomment = NO_COMMENT;
- cp += 2;
- } else
- cp += 1;
- continue;
- case STARTING_COMMENT:
- if (*cp == '*') {
- incomment = C_COMMENT;
- cp += 1;
- } else if (*cp == '/') {
- incomment = CXX_COMMENT;
- cp += 1;
- } else {
- incomment = NO_COMMENT;
- linestate = LS_DIRTY;
- }
- continue;
- case FINISHING_COMMENT:
- if (*cp == '/') {
- incomment = NO_COMMENT;
- cp += 1;
- } else
- incomment = C_COMMENT;
- continue;
- default:
- abort(); /* bug */
- }
- return (cp);
-}
-
-/*
- * Skip over an identifier.
- */
-static const char *
-skipsym(const char *cp)
-{
- while (!endsym(*cp))
- ++cp;
- return (cp);
-}
-
-/*
- * Look for the symbol in the symbol table. If it is found, we return
- * the symbol table index, else we return -1.
- */
-static int
-findsym(const char *str)
-{
- const char *cp;
- int symind;
-
- cp = skipsym(str);
- if (cp == str)
- return (-1);
- if (symlist) {
- printf("%.*s\n", (int)(cp-str), str);
- /* we don't care about the value of the symbol */
- return (0);
- }
- for (symind = 0; symind < nsyms; ++symind) {
- if (strlcmp(symname[symind], str, cp-str) == 0) {
- debug("findsym %s %s", symname[symind],
- value[symind] ? value[symind] : "");
- return (symind);
- }
- }
- return (-1);
-}
-
-/*
- * Add a symbol to the symbol table.
- */
-static void
-addsym(bool ignorethis, bool definethis, char *sym)
-{
- int symind;
- char *val;
-
- symind = findsym(sym);
- if (symind < 0) {
- if (nsyms >= MAXSYMS)
- errx(2, "too many symbols");
- symind = nsyms++;
- }
- symname[symind] = sym;
- ignore[symind] = ignorethis;
- val = sym + (skipsym(sym) - sym);
- if (definethis) {
- if (*val == '=') {
- value[symind] = val+1;
- *val = '\0';
- } else if (*val == '\0')
- value[symind] = "";
- else
- usage();
- } else {
- if (*val != '\0')
- usage();
- value[symind] = NULL;
- }
-}
-
-/*
- * Compare s with n characters of t.
- * The same as strncmp() except that it checks that s[n] == '\0'.
- */
-static int
-strlcmp(const char *s, const char *t, size_t n)
-{
- while (n-- && *t != '\0')
- if (*s != *t)
- return ((unsigned char)*s - (unsigned char)*t);
- else
- ++s, ++t;
- return ((unsigned char)*s);
-}
-
-/*
- * Diagnostics.
- */
-static void
-debug(const char *msg, ...)
-{
- va_list ap;
-
- if (debugging) {
- va_start(ap, msg);
- vwarnx(msg, ap);
- va_end(ap);
- }
-}
-
-static void
-error(const char *msg)
-{
- if (depth == 0)
- warnx("%s: %d: %s", filename, linenum, msg);
- else
- warnx("%s: %d: %s (#if line %d depth %d)",
- filename, linenum, msg, stifline[depth], depth);
- errx(2, "output may be truncated");
-}
diff --git a/usr.bin/unifdef/unifdefall.sh b/usr.bin/unifdef/unifdefall.sh
deleted file mode 100644
index bcba08c..0000000
--- a/usr.bin/unifdef/unifdefall.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/sh
-#
-# remove all the #if's from a source file
-#
-# $dotat: things/unifdefall.sh,v 1.9 2002/09/24 19:43:57 fanf2 Exp $
-# $FreeBSD$
-
-set -e
-
-basename=`basename $0`
-tmp=`mktemp -d -t $basename` || exit 2
-
-unifdef -s "$@" | sort | uniq > $tmp/ctrl
-cpp -dM "$@" | sort |
- sed -Ee 's/^#define[ ]+(.*[^ ])[ ]*$/\1/' > $tmp/hashdefs
-sed -Ee 's/^([A-Za-z0-9_]+).*$/\1/' $tmp/hashdefs > $tmp/alldef
-comm -23 $tmp/ctrl $tmp/alldef > $tmp/undef
-comm -12 $tmp/ctrl $tmp/alldef > $tmp/def
-
-echo unifdef -k \\ > $tmp/cmd
-sed -Ee 's/^(.*)$/-U\1 \\/' $tmp/undef >> $tmp/cmd
-while read sym
-do sed -Ee '/^('"$sym"')([(][^)]*[)])?([ ]+(.*))?$/!d;s//-D\1=\4/' $tmp/hashdefs
-done < $tmp/def |
- sed -Ee 's/\\/\\\\/g;s/"/\\"/g;s/^/"/;s/$/" \\/' >> $tmp/cmd
-echo '"$@"' >> $tmp/cmd
-sh $tmp/cmd "$@"
-
-rm -r $tmp
diff --git a/usr.bin/uniq/Makefile b/usr.bin/uniq/Makefile
deleted file mode 100644
index 2bcf18e..0000000
--- a/usr.bin/uniq/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= uniq
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/uniq/uniq.1 b/usr.bin/uniq/uniq.1
deleted file mode 100644
index a12ad3a..0000000
--- a/usr.bin/uniq/uniq.1
+++ /dev/null
@@ -1,159 +0,0 @@
-.\" Copyright (c) 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" From: @(#)uniq.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd July 3, 2004
-.Dt UNIQ 1
-.Os
-.Sh NAME
-.Nm uniq
-.Nd report or filter out repeated lines in a file
-.Sh SYNOPSIS
-.Nm
-.Op Fl c | Fl d | Fl u
-.Op Fl i
-.Op Fl f Ar num
-.Op Fl s Ar chars
-.Oo
-.Ar input_file
-.Op Ar output_file
-.Oc
-.Sh DESCRIPTION
-The
-.Nm
-utility reads the specified
-.Ar input_file
-comparing adjacent lines, and writes a copy of each unique input line to
-the
-.Ar output_file .
-If
-.Ar input_file
-is a single dash
-.Pq Sq Fl
-or absent, the standard input is read.
-If
-.Ar output_file
-is absent, standard output is used for output.
-The second and succeeding copies of identical adjacent input lines are
-not written.
-Repeated lines in the input will not be detected if they are not adjacent,
-so it may be necessary to sort the files first.
-.Pp
-The following options are available:
-.Bl -tag -width Ds
-.It Fl c
-Precede each output line with the count of the number of times the line
-occurred in the input, followed by a single space.
-.It Fl d
-Only output lines that are repeated in the input.
-.It Fl f Ar num
-Ignore the first
-.Ar num
-fields in each input line when doing comparisons.
-A field is a string of non-blank characters separated from adjacent fields
-by blanks.
-Field numbers are one based, i.e., the first field is field one.
-.It Fl s Ar chars
-Ignore the first
-.Ar chars
-characters in each input line when doing comparisons.
-If specified in conjunction with the
-.Fl f
-option, the first
-.Ar chars
-characters after the first
-.Ar num
-fields will be ignored.
-Character numbers are one based, i.e., the first character is character one.
-.It Fl u
-Only output lines that are not repeated in the input.
-.It Fl i
-Case insensitive comparison of lines.
-.\".It Fl Ns Ar n
-.\"(Deprecated; replaced by
-.\".Fl f ) .
-.\"Ignore the first n
-.\"fields on each input line when doing comparisons,
-.\"where n is a number.
-.\"A field is a string of non-blank
-.\"characters separated from adjacent fields
-.\"by blanks.
-.\".It Cm \&\(pl Ns Ar n
-.\"(Deprecated; replaced by
-.\".Fl s ) .
-.\"Ignore the first
-.\".Ar m
-.\"characters when doing comparisons, where
-.\".Ar m
-.\"is a
-.\"number.
-.El
-.Sh ENVIRONMENT
-The
-.Ev LANG ,
-.Ev LC_ALL ,
-.Ev LC_COLLATE
-and
-.Ev LC_CTYPE
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Sh EXIT STATUS
-.Ex -std
-.Sh COMPATIBILITY
-The historic
-.Cm \&\(pl Ns Ar number
-and
-.Fl Ns Ar number
-options have been deprecated but are still supported in this implementation.
-.Sh SEE ALSO
-.Xr sort 1
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001
-as amended by Cor.\& 1-2002.
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v3 .
-.Sh BUGS
-Input lines are limited to
-.Dv LINE_MAX
-(2048) bytes in length.
diff --git a/usr.bin/uniq/uniq.c b/usr.bin/uniq/uniq.c
deleted file mode 100644
index bc04db7..0000000
--- a/usr.bin/uniq/uniq.c
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Case Larsen.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1989, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)uniq.c 8.3 (Berkeley) 5/4/95";
-#endif
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <ctype.h>
-#include <err.h>
-#include <limits.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-#include <wctype.h>
-
-#define MAXLINELEN (LINE_MAX + 1)
-
-int cflag, dflag, uflag;
-int numchars, numfields, repeats;
-
-FILE *file(const char *, const char *);
-wchar_t *getline(wchar_t *, size_t *, FILE *);
-void show(FILE *, wchar_t *);
-wchar_t *skip(wchar_t *);
-void obsolete(char *[]);
-static void usage(void);
-int wcsicoll(wchar_t *, wchar_t *);
-
-int
-main (int argc, char *argv[])
-{
- wchar_t *t1, *t2;
- FILE *ifp, *ofp;
- int ch, b1;
- size_t prevbuflen, thisbuflen;
- wchar_t *prevline, *thisline;
- char *p;
- const char *ifn;
- int iflag = 0, comp;
-
- (void) setlocale(LC_ALL, "");
-
- obsolete(argv);
- while ((ch = getopt(argc, argv, "cdif:s:u")) != -1)
- switch (ch) {
- case 'c':
- cflag = 1;
- break;
- case 'd':
- dflag = 1;
- break;
- case 'i':
- iflag = 1;
- break;
- case 'f':
- numfields = strtol(optarg, &p, 10);
- if (numfields < 0 || *p)
- errx(1, "illegal field skip value: %s", optarg);
- break;
- case 's':
- numchars = strtol(optarg, &p, 10);
- if (numchars < 0 || *p)
- errx(1, "illegal character skip value: %s", optarg);
- break;
- case 'u':
- uflag = 1;
- break;
- case '?':
- default:
- usage();
- }
-
- argc -= optind;
- argv += optind;
-
- /* If no flags are set, default is -d -u. */
- if (cflag) {
- if (dflag || uflag)
- usage();
- } else if (!dflag && !uflag)
- dflag = uflag = 1;
-
- if (argc > 2)
- usage();
-
- ifp = stdin;
- ifn = "stdin";
- ofp = stdout;
- if (argc > 0 && strcmp(argv[0], "-") != 0)
- ifp = file(ifn = argv[0], "r");
- if (argc > 1)
- ofp = file(argv[1], "w");
-
- prevbuflen = MAXLINELEN;
- thisbuflen = MAXLINELEN;
- prevline = malloc(prevbuflen * sizeof(*prevline));
- thisline = malloc(thisbuflen * sizeof(*thisline));
- if (prevline == NULL || thisline == NULL)
- err(1, "malloc");
-
- if ((prevline = getline(prevline, &prevbuflen, ifp)) == NULL) {
- if (ferror(ifp))
- err(1, "%s", ifn);
- exit(0);
- }
- if (!cflag && uflag && dflag)
- show(ofp, prevline);
-
- while ((thisline = getline(thisline, &thisbuflen, ifp)) != NULL) {
- /* If requested get the chosen fields + character offsets. */
- if (numfields || numchars) {
- t1 = skip(thisline);
- t2 = skip(prevline);
- } else {
- t1 = thisline;
- t2 = prevline;
- }
-
- /* If different, print; set previous to new value. */
- if (iflag)
- comp = wcsicoll(t1, t2);
- else
- comp = wcscoll(t1, t2);
-
- if (comp) {
- if (cflag || !dflag || !uflag)
- show(ofp, prevline);
- t1 = prevline;
- b1 = prevbuflen;
- prevline = thisline;
- prevbuflen = thisbuflen;
- if (!cflag && uflag && dflag)
- show(ofp, prevline);
- thisline = t1;
- thisbuflen = b1;
- repeats = 0;
- } else
- ++repeats;
- }
- if (ferror(ifp))
- err(1, "%s", ifn);
- if (cflag || !dflag || !uflag)
- show(ofp, prevline);
- exit(0);
-}
-
-wchar_t *
-getline(wchar_t *buf, size_t *buflen, FILE *fp)
-{
- size_t bufpos;
- wint_t ch;
-
- bufpos = 0;
- while ((ch = getwc(fp)) != WEOF && ch != '\n') {
- if (bufpos + 2 >= *buflen) {
- *buflen = *buflen * 2;
- buf = reallocf(buf, *buflen * sizeof(*buf));
- if (buf == NULL)
- return (NULL);
- }
- buf[bufpos++] = ch;
- }
- if (bufpos + 1 != *buflen)
- buf[bufpos] = '\0';
-
- return (bufpos != 0 || ch == '\n' ? buf : NULL);
-}
-
-/*
- * show --
- * Output a line depending on the flags and number of repetitions
- * of the line.
- */
-void
-show(FILE *ofp, wchar_t *str)
-{
-
- if (cflag)
- (void)fprintf(ofp, "%4d %ls\n", repeats + 1, str);
- if ((dflag && repeats) || (uflag && !repeats))
- (void)fprintf(ofp, "%ls\n", str);
-}
-
-wchar_t *
-skip(wchar_t *str)
-{
- int nchars, nfields;
-
- for (nfields = 0; *str != '\0' && nfields++ != numfields; ) {
- while (iswblank(*str))
- str++;
- while (*str != '\0' && !iswblank(*str))
- str++;
- }
- for (nchars = numchars; nchars-- && *str; ++str);
- return(str);
-}
-
-FILE *
-file(const char *name, const char *mode)
-{
- FILE *fp;
-
- if ((fp = fopen(name, mode)) == NULL)
- err(1, "%s", name);
- return(fp);
-}
-
-void
-obsolete(char *argv[])
-{
- int len;
- char *ap, *p, *start;
-
- while ((ap = *++argv)) {
- /* Return if "--" or not an option of any form. */
- if (ap[0] != '-') {
- if (ap[0] != '+')
- return;
- } else if (ap[1] == '-')
- return;
- if (!isdigit((unsigned char)ap[1]))
- continue;
- /*
- * Digit signifies an old-style option. Malloc space for dash,
- * new option and argument.
- */
- len = strlen(ap);
- if ((start = p = malloc(len + 3)) == NULL)
- err(1, "malloc");
- *p++ = '-';
- *p++ = ap[0] == '+' ? 's' : 'f';
- (void)strcpy(p, ap + 1);
- *argv = start;
- }
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr,
-"usage: uniq [-c | -d | -u] [-i] [-f fields] [-s chars] [input [output]]\n");
- exit(1);
-}
-
-static size_t wcsicoll_l1_buflen = 0, wcsicoll_l2_buflen = 0;
-static wchar_t *wcsicoll_l1_buf = NULL, *wcsicoll_l2_buf = NULL;
-
-int
-wcsicoll(wchar_t *s1, wchar_t *s2)
-{
- wchar_t *p;
- size_t l1, l2;
- size_t new_l1_buflen, new_l2_buflen;
-
- l1 = wcslen(s1) + 1;
- l2 = wcslen(s2) + 1;
- new_l1_buflen = wcsicoll_l1_buflen;
- new_l2_buflen = wcsicoll_l2_buflen;
- while (new_l1_buflen < l1) {
- if (new_l1_buflen == 0)
- new_l1_buflen = MAXLINELEN;
- else
- new_l1_buflen *= 2;
- }
- while (new_l2_buflen < l2) {
- if (new_l2_buflen == 0)
- new_l2_buflen = MAXLINELEN;
- else
- new_l2_buflen *= 2;
- }
- if (new_l1_buflen > wcsicoll_l1_buflen) {
- wcsicoll_l1_buf = reallocf(wcsicoll_l1_buf, new_l1_buflen * sizeof(*wcsicoll_l1_buf));
- if (wcsicoll_l1_buf == NULL)
- err(1, "reallocf");
- wcsicoll_l1_buflen = new_l1_buflen;
- }
- if (new_l2_buflen > wcsicoll_l2_buflen) {
- wcsicoll_l2_buf = reallocf(wcsicoll_l2_buf, new_l2_buflen * sizeof(*wcsicoll_l2_buf));
- if (wcsicoll_l2_buf == NULL)
- err(1, "reallocf");
- wcsicoll_l2_buflen = new_l2_buflen;
- }
-
- for (p = wcsicoll_l1_buf; *s1; s1++)
- *p++ = towlower(*s1);
- *p = '\0';
- for (p = wcsicoll_l2_buf; *s2; s2++)
- *p++ = towlower(*s2);
- *p = '\0';
-
- return (wcscoll(wcsicoll_l1_buf, wcsicoll_l2_buf));
-}
diff --git a/usr.bin/units/Makefile b/usr.bin/units/Makefile
deleted file mode 100644
index cb783ab..0000000
--- a/usr.bin/units/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# $FreeBSD$
-
-PROG= units
-FILES= units.lib
-FILESDIR= ${SHAREDIR}/misc
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/units/README b/usr.bin/units/README
deleted file mode 100644
index 974cbe9..0000000
--- a/usr.bin/units/README
+++ /dev/null
@@ -1,18 +0,0 @@
-# $FreeBSD$
-
-This is a program which I wrote as a clone of the UNIX 'units'
-command. I threw it together in a couple days, but it seems to work,
-with some restrictions. I have tested it under DOS with Borland C and
-Ultrix 4.2, and SunOS 4.1.
-
-This program differs from the unix units program in the following
-ways:
- it can gracefully handle exponents larger than 9 in output
- it uses 'e' to denote exponentiation in numbers
- prefixes are listed in the units file
- it tries both -s and -es plurals
- it allows use of * for multiply and ^ for exponentiation in the input
- the output format is somewhat different
-
-Adrian Mariano (adrian@cam.cornell.edu or mariano@geom.umn.edu)
-
diff --git a/usr.bin/units/pathnames.h b/usr.bin/units/pathnames.h
deleted file mode 100644
index 227dd00..0000000
--- a/usr.bin/units/pathnames.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* $FreeBSD$ */
-
-/*
- * Copyright (c) 1993 Christopher G. Demetriou
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Christopher G. Demetriou.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#define _PATH_UNITSLIB "/usr/share/misc/units.lib"
diff --git a/usr.bin/units/units.1 b/usr.bin/units/units.1
deleted file mode 100644
index 96b84d6..0000000
--- a/usr.bin/units/units.1
+++ /dev/null
@@ -1,181 +0,0 @@
-.\" $FreeBSD$
-.Dd July 14, 1993
-.Dt UNITS 1
-.Os
-.Sh NAME
-.Nm units
-.Nd conversion program
-.Sh SYNOPSIS
-.Nm
-.Op Fl f Ar filename
-.Op Fl qv
-.Op Ar from-unit to-unit
-.Sh OPTIONS
-The following options are available:
-.Bl -tag -width indent
-.It Fl f Ar filename
-Specify the name of the units data file to load.
-.It Fl q
-Suppress prompting of the user for units and the display of statistics
-about the number of units loaded.
-.It Fl v
-Print the version number.
-.It Ar from-unit to-unit
-Allow a single unit conversion to be done directly from the command
-line.
-The program will not print prompts.
-It will print out the
-result of the single specified conversion.
-.El
-.Sh DESCRIPTION
-The
-.Nm
-program converts quantities expressed in various scales to
-their equivalents in other scales.
-The
-.Nm
-program can only
-handle multiplicative scale changes.
-It cannot convert Celsius
-to Fahrenheit, for example.
-It works interactively by prompting
-the user for input:
-.Bd -literal
- You have: meters
- You want: feet
- * 3.2808399
- / 0.3048
-
- You have: cm^3
- You want: gallons
- * 0.00026417205
- / 3785.4118
-
- You have: meters/s
- You want: furlongs/fortnight
- * 6012.8848
- / 0.00016630952
-
- You have: 1|2 inch
- You want: cm
- * 1.27
- / 0.78740157
-.Ed
-.Pp
-Powers of units can be specified using the '^' character as shown in
-the example, or by simple concatenation: 'cm3' is equivalent to 'cm^3'.
-Multiplication of units can be specified by using spaces, a dash or
-an asterisk.
-Division of units is indicated by the slash ('/').
-Note that multiplication has a higher precedence than division,
-so 'm/s/s' is the same as 'm/s^2' or 'm/s s'.
-Division of numbers
-must be indicated using the vertical bar ('|').
-To convert half a
-meter, you would write '1|2 meter'.
-If you write '1/2 meter' then the
-units program would interpret that as equivalent to '0.5/meter'.
-If you enter incompatible unit types, the units program will
-print a message indicating that the units are not conformable and
-it will display the reduced form for each unit:
-.Bd -literal
- You have: ergs/hour
- You want: fathoms kg^2 / day
- conformability error
- 2.7777778e-11 kg m^2 / sec^3
- 2.1166667e-05 kg^2 m / sec
-.Ed
-.Pp
-The conversion information is read from a units data file.
-The default
-file includes definitions for most familiar units, abbreviations and
-metric prefixes.
-Some constants of nature included are:
-.Pp
-.Bl -column -offset indent -compact "mercury"
-.It "pi ratio of circumference to diameter
-.It "c speed of light
-.It "e charge on an electron
-.It "g acceleration of gravity
-.It "force same as g
-.It "mole Avogadro's number
-.It "water pressure per unit height of water
-.It "mercury pressure per unit height of mercury
-.It "au astronomical unit
-.El
-.Pp
-The unit 'pound' is a unit of mass.
-Compound names are run together
-so 'pound force' is a unit of force.
-The unit 'ounce' is also a unit
-of mass.
-The fluid ounce is 'floz'.
-British units that differ from
-their US counterparts are prefixed with 'br', and currency is prefixed
-with its country name: 'belgiumfranc', 'britainpound'.
-When searching
-for a unit, if the specified string does not appear exactly as a unit
-name, then
-.Nm
-will try to remove a trailing 's' or a
-trailing 'es' and check again for a match.
-.Pp
-To find out what units are available read the standard units file.
-If you want to add your own units you can supply your own file.
-A unit is specified on a single line by
-giving its name and an equivalence.
-Be careful to define
-new units in terms of old ones so that a reduction leads to the
-primitive units which are marked with '!' characters.
-The
-.Nm
-program will not detect infinite loops that could be caused
-by careless unit definitions.
-Comments in the unit definition file
-begin with a '/' character at the beginning of a line.
-.Pp
-Prefixes are defined in the same was as standard units, but with
-a trailing dash at the end of the prefix name.
-If a unit is not found
-even after removing trailing 's' or 'es', then it will be checked
-against the list of prefixes.
-Prefixes will be removed until a legal
-base unit is identified.
-.Pp
-Here is an example of a short units file that defines some basic
-units.
-.Pp
-.Bl -column -offset indent -compact "minute"
-.It "m !a!
-.It "sec !b!
-.It "micro- 1e-6
-.It "minute 60 sec
-.It "hour 60 min
-.It "inch 0.0254 m
-.It "ft 12 inches
-.It "mile 5280 ft
-.El
-.Sh FILES
-.Bl -tag -width /usr/share/misc/units.lib -compact
-.It Pa /usr/share/misc/units.lib
-the standard units library
-.El
-.Sh AUTHORS
-.An Adrian Mariano Aq adrian@cam.cornell.edu
-.Sh BUGS
-The effect of including a '/' in a prefix is surprising.
-.Pp
-Exponents entered by the user can be only one digit.
-You can work around this by multiplying several terms.
-.Pp
-The user must use | to indicate division of numbers and / to
-indicate division of symbols.
-This distinction should not
-be necessary.
-.Pp
-The program contains various arbitrary limits on the length
-of the units converted and on the length of the data file.
-.Pp
-The program should use a hash table to store units so that
-it does not take so long to load the units list and check
-for duplication.
diff --git a/usr.bin/units/units.c b/usr.bin/units/units.c
deleted file mode 100644
index e700c94..0000000
--- a/usr.bin/units/units.c
+++ /dev/null
@@ -1,749 +0,0 @@
-/*
- * units.c Copyright (c) 1993 by Adrian Mariano (adrian@cam.cornell.edu)
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- * Disclaimer: This software is provided by the author "as is". The author
- * shall not be liable for any damages caused in any way by this software.
- *
- * I would appreciate (though I do not require) receiving a copy of any
- * improvements you might make to this program.
- */
-
-#ifndef lint
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <ctype.h>
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "pathnames.h"
-
-#define VERSION "1.0"
-
-#ifndef UNITSFILE
-#define UNITSFILE _PATH_UNITSLIB
-#endif
-
-#define MAXUNITS 1000
-#define MAXPREFIXES 100
-
-#define MAXSUBUNITS 500
-
-#define PRIMITIVECHAR '!'
-
-const char *powerstring = "^";
-
-struct {
- char *uname;
- char *uval;
-} unittable[MAXUNITS];
-
-struct unittype {
- char *numerator[MAXSUBUNITS];
- char *denominator[MAXSUBUNITS];
- double factor;
- double offset;
- int quantity;
-};
-
-struct {
- char *prefixname;
- char *prefixval;
-} prefixtable[MAXPREFIXES];
-
-
-char NULLUNIT[] = "";
-
-#ifdef MSDOS
-#define SEPARATOR ";"
-#else
-#define SEPARATOR ":"
-#endif
-
-int unitcount;
-int prefixcount;
-
-char *dupstr(const char *str);
-void readunits(const char *userfile);
-void initializeunit(struct unittype * theunit);
-int addsubunit(char *product[], char *toadd);
-void showunit(struct unittype * theunit);
-void zeroerror(void);
-int addunit(struct unittype *theunit, char *toadd, int flip, int quantity);
-int compare(const void *item1, const void *item2);
-void sortunit(struct unittype * theunit);
-void cancelunit(struct unittype * theunit);
-char *lookupunit(const char *unit);
-int reduceproduct(struct unittype * theunit, int flip);
-int reduceunit(struct unittype * theunit);
-int compareproducts(char **one, char **two);
-int compareunits(struct unittype * first, struct unittype * second);
-int completereduce(struct unittype * unit);
-void showanswer(struct unittype * have, struct unittype * want);
-void usage(void);
-
-char *
-dupstr(const char *str)
-{
- char *ret;
-
- ret = malloc(strlen(str) + 1);
- if (!ret)
- errx(3, "memory allocation error");
- strcpy(ret, str);
- return (ret);
-}
-
-
-void
-readunits(const char *userfile)
-{
- FILE *unitfile;
- char line[512], *lineptr;
- int len, linenum, i;
-
- unitcount = 0;
- linenum = 0;
-
- if (userfile) {
- unitfile = fopen(userfile, "rt");
- if (!unitfile)
- errx(1, "unable to open units file '%s'", userfile);
- }
- else {
- unitfile = fopen(UNITSFILE, "rt");
- if (!unitfile) {
- char *direc, *env;
- char filename[1000];
-
- env = getenv("PATH");
- if (env) {
- direc = strtok(env, SEPARATOR);
- while (direc) {
- snprintf(filename, sizeof(filename),
- "%s/%s", direc, UNITSFILE);
- unitfile = fopen(filename, "rt");
- if (unitfile)
- break;
- direc = strtok(NULL, SEPARATOR);
- }
- }
- if (!unitfile)
- errx(1, "can't find units file '%s'", UNITSFILE);
- }
- }
- while (!feof(unitfile)) {
- if (!fgets(line, sizeof(line), unitfile))
- break;
- linenum++;
- lineptr = line;
- if (*lineptr == '/')
- continue;
- lineptr += strspn(lineptr, " \n\t");
- len = strcspn(lineptr, " \n\t");
- lineptr[len] = 0;
- if (!strlen(lineptr))
- continue;
- if (lineptr[strlen(lineptr) - 1] == '-') { /* it's a prefix */
- if (prefixcount == MAXPREFIXES) {
- warnx("memory for prefixes exceeded in line %d", linenum);
- continue;
- }
- lineptr[strlen(lineptr) - 1] = 0;
- prefixtable[prefixcount].prefixname = dupstr(lineptr);
- for (i = 0; i < prefixcount; i++)
- if (!strcmp(prefixtable[i].prefixname, lineptr)) {
- warnx("redefinition of prefix '%s' on line %d ignored",
- lineptr, linenum);
- continue;
- }
- lineptr += len + 1;
- lineptr += strspn(lineptr, " \n\t");
- len = strcspn(lineptr, "\n\t");
- if (len == 0) {
- warnx("unexpected end of prefix on line %d",
- linenum);
- continue;
- }
- lineptr[len] = 0;
- prefixtable[prefixcount++].prefixval = dupstr(lineptr);
- }
- else { /* it's not a prefix */
- if (unitcount == MAXUNITS) {
- warnx("memory for units exceeded in line %d", linenum);
- continue;
- }
- unittable[unitcount].uname = dupstr(lineptr);
- for (i = 0; i < unitcount; i++)
- if (!strcmp(unittable[i].uname, lineptr)) {
- warnx("redefinition of unit '%s' on line %d ignored",
- lineptr, linenum);
- continue;
- }
- lineptr += len + 1;
- lineptr += strspn(lineptr, " \n\t");
- if (!strlen(lineptr)) {
- warnx("unexpected end of unit on line %d",
- linenum);
- continue;
- }
- len = strcspn(lineptr, "\n\t");
- lineptr[len] = 0;
- unittable[unitcount++].uval = dupstr(lineptr);
- }
- }
- fclose(unitfile);
-}
-
-void
-initializeunit(struct unittype * theunit)
-{
- theunit->numerator[0] = theunit->denominator[0] = NULL;
- theunit->factor = 1.0;
- theunit->offset = 0.0;
- theunit->quantity = 0;
-}
-
-
-int
-addsubunit(char *product[], char *toadd)
-{
- char **ptr;
-
- for (ptr = product; *ptr && *ptr != NULLUNIT; ptr++);
- if (ptr >= product + MAXSUBUNITS) {
- warnx("memory overflow in unit reduction");
- return 1;
- }
- if (!*ptr)
- *(ptr + 1) = 0;
- *ptr = dupstr(toadd);
- return 0;
-}
-
-
-void
-showunit(struct unittype * theunit)
-{
- char **ptr;
- int printedslash;
- int counter = 1;
-
- printf("\t%.8g", theunit->factor);
- if (theunit->offset)
- printf("&%.8g", theunit->offset);
- for (ptr = theunit->numerator; *ptr; ptr++) {
- if (ptr > theunit->numerator && **ptr &&
- !strcmp(*ptr, *(ptr - 1)))
- counter++;
- else {
- if (counter > 1)
- printf("%s%d", powerstring, counter);
- if (**ptr)
- printf(" %s", *ptr);
- counter = 1;
- }
- }
- if (counter > 1)
- printf("%s%d", powerstring, counter);
- counter = 1;
- printedslash = 0;
- for (ptr = theunit->denominator; *ptr; ptr++) {
- if (ptr > theunit->denominator && **ptr &&
- !strcmp(*ptr, *(ptr - 1)))
- counter++;
- else {
- if (counter > 1)
- printf("%s%d", powerstring, counter);
- if (**ptr) {
- if (!printedslash)
- printf(" /");
- printedslash = 1;
- printf(" %s", *ptr);
- }
- counter = 1;
- }
- }
- if (counter > 1)
- printf("%s%d", powerstring, counter);
- printf("\n");
-}
-
-
-void
-zeroerror(void)
-{
- warnx("unit reduces to zero");
-}
-
-/*
- Adds the specified string to the unit.
- Flip is 0 for adding normally, 1 for adding reciprocal.
- Quantity is 1 if this is a quantity to be converted rather than a pure unit.
-
- Returns 0 for successful addition, nonzero on error.
-*/
-
-int
-addunit(struct unittype * theunit, char *toadd, int flip, int quantity)
-{
- char *scratch, *savescr;
- char *item;
- char *divider, *slash, *offset;
- int doingtop;
-
- if (!strlen(toadd))
- return 1;
-
- savescr = scratch = dupstr(toadd);
- for (slash = scratch + 1; *slash; slash++)
- if (*slash == '-' &&
- (tolower(*(slash - 1)) != 'e' ||
- !strchr(".0123456789", *(slash + 1))))
- *slash = ' ';
- slash = strchr(scratch, '/');
- if (slash)
- *slash = 0;
- doingtop = 1;
- do {
- item = strtok(scratch, " *\t\n/");
- while (item) {
- if (strchr("0123456789.", *item)) { /* item is a number */
- double num, offsetnum;
-
- if (quantity)
- theunit->quantity = 1;
-
- offset = strchr(item, '&');
- if (offset) {
- *offset = 0;
- offsetnum = atof(offset+1);
- } else
- offsetnum = 0.0;
-
- divider = strchr(item, '|');
- if (divider) {
- *divider = 0;
- num = atof(item);
- if (!num) {
- zeroerror();
- return 1;
- }
- if (doingtop ^ flip) {
- theunit->factor *= num;
- theunit->offset *= num;
- } else {
- theunit->factor /= num;
- theunit->offset /= num;
- }
- num = atof(divider + 1);
- if (!num) {
- zeroerror();
- return 1;
- }
- if (doingtop ^ flip) {
- theunit->factor /= num;
- theunit->offset /= num;
- } else {
- theunit->factor *= num;
- theunit->offset *= num;
- }
- }
- else {
- num = atof(item);
- if (!num) {
- zeroerror();
- return 1;
- }
- if (doingtop ^ flip) {
- theunit->factor *= num;
- theunit->offset *= num;
- } else {
- theunit->factor /= num;
- theunit->offset /= num;
- }
- }
- if (doingtop ^ flip)
- theunit->offset += offsetnum;
- }
- else { /* item is not a number */
- int repeat = 1;
-
- if (strchr("23456789",
- item[strlen(item) - 1])) {
- repeat = item[strlen(item) - 1] - '0';
- item[strlen(item) - 1] = 0;
- }
- for (; repeat; repeat--)
- if (addsubunit(doingtop ^ flip ? theunit->numerator : theunit->denominator, item))
- return 1;
- }
- item = strtok(NULL, " *\t/\n");
- }
- doingtop--;
- if (slash) {
- scratch = slash + 1;
- }
- else
- doingtop--;
- } while (doingtop >= 0);
- free(savescr);
- return 0;
-}
-
-
-int
-compare(const void *item1, const void *item2)
-{
- return strcmp(*(const char * const *)item1, *(const char * const *)item2);
-}
-
-
-void
-sortunit(struct unittype * theunit)
-{
- char **ptr;
- unsigned int count;
-
- for (count = 0, ptr = theunit->numerator; *ptr; ptr++, count++);
- qsort(theunit->numerator, count, sizeof(char *), compare);
- for (count = 0, ptr = theunit->denominator; *ptr; ptr++, count++);
- qsort(theunit->denominator, count, sizeof(char *), compare);
-}
-
-
-void
-cancelunit(struct unittype * theunit)
-{
- char **den, **num;
- int comp;
-
- den = theunit->denominator;
- num = theunit->numerator;
-
- while (*num && *den) {
- comp = strcmp(*den, *num);
- if (!comp) {
-/* if (*den!=NULLUNIT) free(*den);
- if (*num!=NULLUNIT) free(*num);*/
- *den++ = NULLUNIT;
- *num++ = NULLUNIT;
- }
- else if (comp < 0)
- den++;
- else
- num++;
- }
-}
-
-
-
-
-/*
- Looks up the definition for the specified unit.
- Returns a pointer to the definition or a null pointer
- if the specified unit does not appear in the units table.
-*/
-
-static char buffer[100]; /* buffer for lookupunit answers with
- prefixes */
-
-char *
-lookupunit(const char *unit)
-{
- int i;
- char *copy;
-
- for (i = 0; i < unitcount; i++) {
- if (!strcmp(unittable[i].uname, unit))
- return unittable[i].uval;
- }
-
- if (unit[strlen(unit) - 1] == '^') {
- copy = dupstr(unit);
- copy[strlen(copy) - 1] = 0;
- for (i = 0; i < unitcount; i++) {
- if (!strcmp(unittable[i].uname, copy)) {
- strlcpy(buffer, copy, sizeof(buffer));
- free(copy);
- return buffer;
- }
- }
- free(copy);
- }
- if (unit[strlen(unit) - 1] == 's') {
- copy = dupstr(unit);
- copy[strlen(copy) - 1] = 0;
- for (i = 0; i < unitcount; i++) {
- if (!strcmp(unittable[i].uname, copy)) {
- strlcpy(buffer, copy, sizeof(buffer));
- free(copy);
- return buffer;
- }
- }
- if (copy[strlen(copy) - 1] == 'e') {
- copy[strlen(copy) - 1] = 0;
- for (i = 0; i < unitcount; i++) {
- if (!strcmp(unittable[i].uname, copy)) {
- strlcpy(buffer, copy, sizeof(buffer));
- free(copy);
- return buffer;
- }
- }
- }
- free(copy);
- }
- for (i = 0; i < prefixcount; i++) {
- size_t len = strlen(prefixtable[i].prefixname);
- if (!strncmp(prefixtable[i].prefixname, unit, len)) {
- if (!strlen(unit + len) || lookupunit(unit + len)) {
- snprintf(buffer, sizeof(buffer), "%s %s",
- prefixtable[i].prefixval, unit + len);
- return buffer;
- }
- }
- }
- return 0;
-}
-
-
-
-/*
- reduces a product of symbolic units to primitive units.
- The three low bits are used to return flags:
-
- bit 0 (1) set on if reductions were performed without error.
- bit 1 (2) set on if no reductions are performed.
- bit 2 (4) set on if an unknown unit is discovered.
-*/
-
-
-#define ERROR 4
-
-int
-reduceproduct(struct unittype * theunit, int flip)
-{
-
- char *toadd;
- char **product;
- int didsomething = 2;
-
- if (flip)
- product = theunit->denominator;
- else
- product = theunit->numerator;
-
- for (; *product; product++) {
-
- for (;;) {
- if (!strlen(*product))
- break;
- toadd = lookupunit(*product);
- if (!toadd) {
- printf("unknown unit '%s'\n", *product);
- return ERROR;
- }
- if (strchr(toadd, PRIMITIVECHAR))
- break;
- didsomething = 1;
- if (*product != NULLUNIT) {
- free(*product);
- *product = NULLUNIT;
- }
- if (addunit(theunit, toadd, flip, 0))
- return ERROR;
- }
- }
- return didsomething;
-}
-
-
-/*
- Reduces numerator and denominator of the specified unit.
- Returns 0 on success, or 1 on unknown unit error.
-*/
-
-int
-reduceunit(struct unittype * theunit)
-{
- int ret;
-
- ret = 1;
- while (ret & 1) {
- ret = reduceproduct(theunit, 0) | reduceproduct(theunit, 1);
- if (ret & 4)
- return 1;
- }
- return 0;
-}
-
-
-int
-compareproducts(char **one, char **two)
-{
- while (*one || *two) {
- if (!*one && *two != NULLUNIT)
- return 1;
- if (!*two && *one != NULLUNIT)
- return 1;
- if (*one == NULLUNIT)
- one++;
- else if (*two == NULLUNIT)
- two++;
- else if (strcmp(*one, *two))
- return 1;
- else
- one++, two++;
- }
- return 0;
-}
-
-
-/* Return zero if units are compatible, nonzero otherwise */
-
-int
-compareunits(struct unittype * first, struct unittype * second)
-{
- return
- compareproducts(first->numerator, second->numerator) ||
- compareproducts(first->denominator, second->denominator);
-}
-
-
-int
-completereduce(struct unittype * unit)
-{
- if (reduceunit(unit))
- return 1;
- sortunit(unit);
- cancelunit(unit);
- return 0;
-}
-
-
-void
-showanswer(struct unittype * have, struct unittype * want)
-{
- if (compareunits(have, want)) {
- printf("conformability error\n");
- showunit(have);
- showunit(want);
- }
- else if (have->offset != want->offset) {
- if (want->quantity)
- printf("WARNING: conversion of non-proportional quantities.\n");
- printf("\t");
- if (have->quantity)
- printf("%.8g\n",
- (have->factor + have->offset-want->offset)/want->factor);
- else
- printf(" (-> x*%.8g %+.8g)\n\t (<- y*%.8g %+.8g)\n",
- have->factor / want->factor,
- (have->offset-want->offset)/want->factor,
- want->factor / have->factor,
- (want->offset - have->offset)/have->factor);
- }
- else
- printf("\t* %.8g\n\t/ %.8g\n", have->factor / want->factor,
- want->factor / have->factor);
-}
-
-
-void
-usage(void)
-{
- fprintf(stderr,
- "usage: units [-f unitsfile] [-q] [-v] [from-unit to-unit]\n");
- exit(3);
-}
-
-
-int
-main(int argc, char **argv)
-{
-
- struct unittype have, want;
- char havestr[81], wantstr[81];
- int optchar;
- char *userfile = 0;
- int quiet = 0;
-
- while ((optchar = getopt(argc, argv, "vqf:")) != -1) {
- switch (optchar) {
- case 'f':
- userfile = optarg;
- break;
- case 'q':
- quiet = 1;
- break;
- case 'v':
- fprintf(stderr, "\n units version %s Copyright (c) 1993 by Adrian Mariano\n",
- VERSION);
- fprintf(stderr, " This program may be freely distributed\n");
- usage();
- default:
- usage();
- break;
- }
- }
-
- if (optind != argc - 2 && optind != argc)
- usage();
-
- readunits(userfile);
-
- if (optind == argc - 2) {
- strlcpy(havestr, argv[optind], sizeof(havestr));
- strlcpy(wantstr, argv[optind + 1], sizeof(wantstr));
- initializeunit(&have);
- addunit(&have, havestr, 0, 1);
- completereduce(&have);
- initializeunit(&want);
- addunit(&want, wantstr, 0, 1);
- completereduce(&want);
- showanswer(&have, &want);
- }
- else {
- if (!quiet)
- printf("%d units, %d prefixes\n", unitcount,
- prefixcount);
- for (;;) {
- do {
- initializeunit(&have);
- if (!quiet)
- printf("You have: ");
- if (!fgets(havestr, sizeof(havestr), stdin)) {
- if (!quiet)
- putchar('\n');
- exit(0);
- }
- } while (addunit(&have, havestr, 0, 1) ||
- completereduce(&have));
- do {
- initializeunit(&want);
- if (!quiet)
- printf("You want: ");
- if (!fgets(wantstr, sizeof(wantstr), stdin)) {
- if (!quiet)
- putchar('\n');
- exit(0);
- }
- } while (addunit(&want, wantstr, 0, 1) ||
- completereduce(&want));
- showanswer(&have, &want);
- }
- }
-
- return(0);
-}
diff --git a/usr.bin/units/units.lib b/usr.bin/units/units.lib
deleted file mode 100644
index 67127bc..0000000
--- a/usr.bin/units/units.lib
+++ /dev/null
@@ -1,732 +0,0 @@
-/ $FreeBSD$
-
-/ primitive units
-
-m !a!
-kg !b!
-sec !c!
-coul !d!
-candela !e!
-usdollar !f!
-euro !g!
-bit !h!
-erlang !i!
-K !j!
-
-/ prefixes
-
-yotta- 1e24
-zetta- 1e21
-exa- 1e18
-peta- 1e15
-tera- 1e12
-giga- 1e9
-mega- 1e6
-myria- 1e4
-kilo- 1e3
-hecto- 1e2
-deka- 1e1
-deca- deka
-deci- 1e-1
-centi- 1e-2
-milli- 1e-3
-micro- 1e-6
-nano- 1e-9
-pico- 1e-12
-femto- 1e-15
-atto- 1e-18
-zopto- 1e-21
-zepto- zopto
-yocto- 1e-24
-
-semi- .5
-demi- .5
-
-Y- yotta
-Z- zetta
-E- exa
-P- peta
-T- tera
-G- giga
-M- mega
-k- kilo
-h- hecto
-da- deka
-d- deci
-c- centi
-m- milli
-n- nano
-p- pico
-f- femto
-a- atto
-z- zopto
-y- yocto
-
-/ binary prefixes introduced in 1999
-exbi- 1152921504606846976
-pebi- 1125899906842624
-tebi- 1099511627776
-gibi- 1073741824
-mebi- 1048576
-kibi- 1024
-
-Ei- exbi
-Pi- pebi
-Ti- tebi
-Gi- gibi
-Mi- mebi
-Ki- kibi
-
-/ constants
-
-fuzz 1
-pi 3.14159265358979323846
-c 2.99792458e+8 m/sec
-g0 9.80665 m/sec2
-g g0
-bigG 6.67428e-11 m3/kg/s2
-AU 1.49597870691e+11 m fuzz
-au AU
-mole 6.0221417930e+23 fuzz
-e 1.6021917e-19 coul fuzz
-energy c2
-force g
-mercury 1.3332239e+5 kg/m2-sec2
-hg mercury
-mmHg 0.001 m hg
-#mu 4.e-7 pi-N/A2
-epsilon 1.0 /mu/c2
-alpha 0.5 mu-c-e2/planck
-planck 6.6260755e-34 joule-sec
-hbar 0.5 planck/pi
-electronmass 9.1093821545-31 kg
-protonmass 1.6726217129-27 kg
-neutronmass 1.6749272928-27 kg
-
-/ dimensionless
-
-radian .5 / pi
-degree 1|180 pi-radian
-circle 2 pi-radian
-turn 2 pi-radian
-revolution turn
-rev turn
-grade .9 degree
-arcdeg 1 degree
-arcmin 1|60 arcdeg
-ccs 1|36 erlang
-arcsec 1|60 arcmin
-
-steradian radian2
-sphere 4 pi-steradian
-sr steradian
-
-/ Time
-
-second sec
-s sec
-minute 60 sec
-min minute
-hour 60 min
-hr hour
-day 24 hr
-da day
-week 7 day
-year 365.24219879 day fuzz
-yr year
-month 1|12 year
-us microsec
-
-/ Mass
-
-gram millikg
-gm gram
-metricton kilokg
-
-/ Avoirdupois
-
-lb .45359237 kg
-pound lb
-lbf lb g
-ounce 1|16 lb
-oz ounce
-dram 1|16 oz
-dr dram
-grain 1|7000 lb
-gr grain
-shortton 2000 lb
-ton shortton
-longton 2240 lb
-
-/ Apothecary
-
-scruple 20 grain
-apdram 60 grain
-apounce 480 grain
-appound 5760 grain
-troypound appound
-
-/ Mining
-
-troyounce apounce
-troz apounce
-pennyweight 1|20 troz
-pwt pennyweight
-dwt pennyweight
-
-/ Length
-
-meter m
-micron micrometer
-angstrom decinanometer
-ao 0.25 alpha/pi/rydbergconst
-
-inch 2.54 cm
-in inch
-foot 12 in
-feet foot
-ft foot
-yard 3 ft
-yd yard
-rod 5.5 yd
-rd rod
-mile 5280 ft
-mi mile
-
-british 1200|3937 m/ft
-nmile 1852 m
-
-acre 4840 yd2
-
-cc cm3
-liter kilocc
-ml milliliter
-
-/ US Liquid
-
-gallon 231 in3
-imperial 1.20095
-gal gallon
-quart 1|4 gal
-qt quart
-pint 1|2 qt
-pt pint
-
-floz 1|16 pt
-fldr 1|8 floz
-shot 3|2 floz
-
-/ US Dry
-
-dry 268.8025 in3/gallon fuzz
-peck 8 dry-quart
-pk peck
-bushel 4 peck
-bu bushel
-chaldron 36 bushel
-
-/ British
-
-brgallon 277.420 in3 fuzz
-brquart 1|4 brgallon
-brpint 1|2 brquart
-brfloz 1|20 brpint
-brpeck 554.84 in3 fuzz
-brbushel 4 brpeck
-brhundredweight 112 lb
-
-/ Bottles
-
-bottle 750 milliliter
-/bottle fifth
-
-miniature 100 milliliter
-split 1|4 bottle
-half 1|2 bottle
-magnum 2 bottle
-jeroboam 4 bottle
-rehoboam 6 bottle
-methuselah 8 bottle
-salmanazar 12 bottle
-balthazar 16 bottle
-nebuchadnezzar 20 bottle
-sovereign 34 bottle
-
-/ Bottles - alternate names and spellings
-
-pony split
-fillette half
-tappit-hen 3 imperial
-rheoboam rehoboam
-shalmaneser salmanazar
-
-/ Russian
-berkovets 10 pood
-pood 40 funt
-funt 0.40951 kg
-lot 1|32 funt
-zolotnik 1|3 lot
-dolya 1|96 zolotnik
-rumile 7 verst
-mezhevayaverst 2 verst
-verst 1066.8 m
-sazhen 1|500 verst
-kosayasazhen 1|430.2 verst
-arshin 1|1500 verst
-/ is not exactly defined
-ruell 16.54 in
-liniya 1|10 in
-vershok 1.75 in
-pyad 7 in
-vedro 12.3 liter
-shtoff 1|10 vedro
-vinebottle 1|16 vedro
-vodkabottle 1|20 vedro
-charka 1|100 vedro
-shkalik 1|200 vedro
-desyatina_state 109.3 are
-desyatina_farmery 0.75 desyatina_state
-sqverst 104.2 desyatina_state
-sqarshin 1|21600 desyatina_state
-sqfoot 1|117600 desyatina_state
-
-/ Energy Work
-
-newton kg-m/sec2
-nt newton
-N newton
-joule nt-m
-J joule
-cal 4.1868 joule
-
-/ Electrical
-
-coulomb coul
-C coul
-ampere coul/sec
-A ampere
-amp ampere
-watt joule/sec
-W watt
-volt watt/amp
-ohm volt/amp
-mho /ohm
-farad coul/volt
-F farad
-henry sec2/farad
-H henry
-weber volt-sec
-Wb weber
-
-/ Light
-
-cd candela
-lumen cd sr
-lux cd sr/m2
-
-/ EMU currencies have constant exchange rate against Euro since 1.1.1999.
-/ See http://en.wikipedia.org/wiki/Euro for details.
-austriaschilling 1|13.7603 euro
-belgiumfranc 1|40.3399 euro
-finlandmarkka 1|5.94573 euro
-francefranc 1|6.55957 euro
-germanymark 1|1.95583 euro
-greecedrachma 1|340.750 euro
-irelandpunt 1|0.787564 euro
-italylira 1|1936.27 euro
-luxembourgfranc 1|40.3399 euro
-netherlandsguilder 1|2.20371 euro
-portugalescudo 1|200.482 euro
-spainpeseta 1|166.386 euro
-sloveniantolar 1|239.640 euro
-cypriotpound 1|0.585274 euro
-malteselira 1|0.429300 euro
-slovakkoruna 1|30.1260 euro
-
-/ These ones are pegged to the Euro
-/ See http://en.wikipedia.org/wiki/Euro for details.
-bosniaherzegovinamark 1|1.95583 euro
-bulgarianlev 1|1.95583 euro
-capeverdeanescudo 1|110.265 euro
-centralafricancfafranc 1|655.957 euro
-comorosfranc 1|491.96775 euro
-danishkrone 1|7.46038 euro
-estoniakroon 1|15.6466 euro
-lithuanianlitas 1|3.45280 euro
-pacificfrancexchange 1|0.00838 euro
-westafricancfafranc 1|655.957 euro
-
-/ These ones are pegged on the US Dollar
-/ See http://en.wikipedia.org/wiki/USD for details.
-dollar usdollar
-arubanflorin 1|1.75 usdollar
-bahamiandollar 1|1 usdollar
-bahrainidinar 1|0.376 usdollar
-barbadiandollar 1|2 usdollar
-belizedollar 1|2 usdollar
-belarusianruble 1|2135 usdollar
-bermudiandollar 1|1 usdollar
-caymanislandsdollar 1.2 usdollar
-cubanconvertiblepeso 1.08 usdollar
-djiboutianfranc 1|177.721 usdollar
-eastcaribbeandollar 1|2.7 usdollar
-eritreannakfa 1|15 usdollar
-hongkongdollar 1|7.80 usdollar
-macanesepatacas 1|1.03 hongkongdollar
-jordaniandinar 1|0.709 usdollar
-lebanesepound 1|1507.5 usdollar
-maldivianrufiyaa 1|12.8 usdollar
-netherlandsantilleanguilder 1|1.79 usdollar
-omanirial 2.6008 usdollar
-qataririyal 1|3.64 usdollar
-saudiriyal 1|3.75 usdollar
-unitedarabemiratesdirham 1|3.6725 usdollar
-
-bosniamark bosniaherzegovinamark
-cfafranc centralafricancfafranc
-cfpfranc pacificfrancexchange
-drachma greecedrachma
-escudo portugalescudo
-franc francefranc
-guilder netherlandsguilder
-herzegovinamark bosniaherzegovinamark
-hollandguilder netherlandsguilder
-lira italylira
-mark germanymark
-markka finlandmarkka
-peseta spainpeseta
-rand southafricarand
-
-/ computer
-
-baud bit/sec
-nibble 4 bit
-nybble nibble
-byte 8 bit
-word 2 byte
-block 512 byte
-kbyte 1024 byte
-megabyte 1024 kbyte
-gigabyte 1024 megabyte
-terabyte 1024 gigabyte
-petabyte 1024 terabyte
-exabyte 1024 petabyte
-zettabyte 1024 exabyte
-yottabyte 1024 zettabyte
-kilobyte kbyte
-meg megabyte
-
-
-/ Trivia
-
-% 1|100
-abampere 10 ampere
-admiraltyknot 6080 ft/hr
-apostilb cd/pi-m2
-are 1e+2 m2
-asb apostilb
-arpentcan 27.52 mi
-arpentlin 191.835 ft
-astronomicalunit au
-atmosphere 1.01325e+5 nt/m2
-atm atmosphere
-atomicmassunit 1.66053878283e-27 kg fuzz
-# year 3.15569259747e7 sec fuzz
-amu atomicmassunit
-bag 94 lb
-bakersdozen 13
-bar 1e+5 nt/m2
-barie 1e-1 nt/m2
-barleycorn 1|3 in
-barn 1e-28 m2
-oilbarrel 42 gal
-barrel oilbarrel
-barye 1e-1 nt/m2
-baryl microbar
-bev 1e+9 e-volt
-biot 10 amp
-blondel cd/pi-m2
-boardfoot 144 in3
-bolt 40 yd
-bottommeasure 1|40 in
-britishthermalunit 1.05506e+3 joule fuzz
-btu britishthermalunit
-refrigeration 12000 btu/ton-hour
-buck usdollar
-cable 720 ft
-caliber 1e-2 in
-calorie cal
-carat 205 milligram
-caratgold 1|24
-cent centidollar
-cental 100 lb
-centesimalminute 1e-2 grade
-centesimalsecond 1e-4 grade
-century 100 year
-cfs ft3/sec
-chain 66 ft
-circularinch 1|4 pi-in2
-circularmil 1e-6|4 pi-in2
-clusec 1e-8 mm-hg m3/s
-coomb 4 bu
-cord 128 ft3
-cordfoot cord
-crith 9.06e-2 gm
-cubit 18 in
-cup 1|2 pt
-curie 3.7e+10 /sec
-dalton amu
-decade 10 yr
-dioptre /m
-displacementton 35 ft3
-doppelzentner 100 kg
-dozen 12
-drop .03 cm3
-dyne cm-gm/sec2
-electronvolt e-volt
-ell 45 in
-engineerschain 100 ft
-engineerslink 100|100 ft
-equivalentfootcandle lumen/pi-ft2
-equivalentlux lumen/pi-m2
-equivalentphot cd/pi-cm2
-erg cm2-gm/sec2
-ev e-volt
-faraday 9.6485309e+4 coul
-fathom 6 ft
-fermi 1e-15 m
-fifth 4|5 qt
-fin 5 usdollar
-finger 7|8 in
-firkin 9 gal
-footcandle lumen/ft2
-footlambert cd/pi-ft2
-fortnight 14 da
-franklin 3.33564e-10 coul
-frigorie kilocal
-furlong 220 yd
-galileo 1e-2 m/sec2
-gamma 1e-9 weber/m2
-gauss 1e-4 weber/m2
-G gauss
-geodeticfoot british-ft
-geographicalmile 1852 m
-gilbert 2.5 amp/pi
-gill 1|4 pt
-gross 144
-gunterschain 22 yd
-hand 4 in
-hartree 2 rydberg
-head water
-hectare 1e+4 m2
-hefnercandle .92 cd
-hertz /sec
-Hz hertz
-hogshead 63 gallon
-hd hogshead
-homestead 1|4 mi2
-horsepower 735.50 watt
-hp horsepower
-hubble 1e9 ly
-hyl gm force sec2/m
-hz /sec
-imaginarycubicfoot 1.4 ft3
-jansky 1e-26 W/m2-Hz
-Jy jansky
-karat 1|24
-kayser /cm
-key kg
-kilderkin 18 gal
-knot nmile/hr
-kn knot
-lambert cd/pi-cm2
-Lb lambert
-langley cal/cm2
-last 80 bu
-league 3 mi
-lightyear c-yr
-ly lightyear
-line 1|12 in
-link 66|100 ft
-longhundredweight 112 lb
-longquarter 28 lb
-lusec 1e-6 mm-hg m3/s
-m_earth 5.97223e24 kg
-m_moon 7.34e22 kg
-m_sun 1.98843e30 kg
-mach 331.46 m/sec
-marineleague 3 nmile
-maxwell 1e-8 weber
-Mx maxwell
-metriccarat 200 milligram
-mgd megagal/day
-mh millihenry
-mil 1e-3 in
-millennium 1000 year
-minersinch 1.5 ft3/min
-minim 1|60 fldr
-mo month
-mpg mile/gal
-mph mile/hr
-nail 1|16 yd
-nauticalmile nmile
-nit cd/m2
-noggin 1|8 qt
-nox 1e-3 lux
-oersted 2.5e+2 amp/m/pi
-Oe oersted
-pace 36 in
-pair 2
-palm 3 in
-parasang 3.5 mi
-parsec AU-radian/arcsec
-pascal nt/m2
-Pa pascal
-pc parsec
-percent %
-perch rd
-phot lumen/cm2
-pica 1|6 in
-pieze 1e+3 nt/m2
-pipe 4 barrel
-point 1|72 in
-poise gm/cm-sec
-P poise
-pole rd
-pond 9.80665e-3 nt
-poundal ft-lb/sec2
-pdl poundal
-proof 1|200
-psi lb-g/in2
-quarter 9 in
-quartersection 1|4 mi2
-quintal 100 kg
-quire 25
-r_earth 6.378e8 cm
-r_moon 1.738e7 cm
-r_sun 6.9599e10 cm
-rackunit 1.75 in
-rad 100 erg/gm
-ream 500
-registerton 100 ft3
-rem 0.01 J/kg
-rhe 10 m2/nt-sec
-rontgen 2.58e-4 curie/kg
-roentgen rontgen
-rood 1.21e+3 yd
-rope 20 ft
-RU rackunit
-rutherford 1e+6 /sec
-rydbergconst 0.5 elctronmass-c-alpha2/planck
-rydberg rydbergconst-planck-c
-sabin 1 ft2
-sack 3 bu
-score 20
-seam 8 bu
-section mi2
-shed 1e-24 barn
-shippington 40 ft3
-shorthundredweight 100 lb
-shortquarter 25 lb
-siemens /ohm
-sigma microsec
-skein 120 yd
-skot 1e-3 apostilb
-slug lb-g-sec2/ft
-smoot 67 in
-span 9 in
-spat 4 pi sr
-spindle 14400 yd
-square 100 ft2
-stere m3
-sthene 1e+3 nt
-stilb cd/cm2
-sb stilb
-stoke 1e-4 m2/sec
-stone 14 lb
-strike 2 bu
-surveyfoot british-ft
-surveyyard 3 surveyfoot
-surveyorschain 66 ft
-surveyorslink 66|100 ft
-tablespoon 4 fldr
-tbl tablespoon
-tbsp tablespoon
-teaspoon 4|3 fldr
-tesla weber/m2
-T tesla
-therm 1e+5 btu
-thermie 1e+6 cal
-timberfoot ft3
-tnt 4.6e+6 m2/sec2
-tonne 1e+6 gm
-torr mm hg
-township 36 mi2
-tsp teaspoon
-tun 8 barrel
-water gram g / cc
-wey 40 bu
-weymass 252 lb
-Xunit 1.00206e-13 m
-k 1.38047e-16 erg/degC
-
-
-degC 1&+273.15 K
-kelvin K
-brewster 1e-12 m2/newton
-degF 5|9&255.37222222222222222222 K
-degreesrankine 5|9 K
-degrankine degreesrankine
-degreerankine degreesrankine
-degreaumur 10|8&+273.15 K
-drachm 60 grain
-poncelet 100 kg m g / sec
-denier .05|450 gram / m
-tex .001 gram / m
-englishell 45 inch
-scottishell 37.2 inch
-flemishell 27 inch
-V volt
-eV e V
-bohrradius hbar2-C2/8.988e9 N m2-e2-electronmass
-becquerel 1|3.7e10 curie
-fresnel 1e12 hertz
-statcoul 1|2.99792458e9 coul
-statamp 1|2.99792458e9 amp
-statvolt 2.99792458e2 volt
-statcoulomb statcoul
-statampere statamp
-debye 3.33564e-30 coul-m
-pulsatance 2 pi/sec
-rpm rev/minute
-rps rev/sec
-kilohm kiloohm
-megohm megaohm
-siderealyear 365.256360417 day
-siderealday 23.934469444 hour
-siderealhour 1|24 sidereal day
-lunarmonth 29.5305555 day
-synodicmonth lunarmonth
-siderealmonth 27.32152777 day
-tropicalyear year
-solaryear year
-lunaryear 12 lunarmonth
-cran 37.5 brgallon
-kip 1000 lbf
-frenchfoot 16|15 ft
-frenchfeet frenchfoot
-toise 6 frenchfeet
-sievert 8.4 rontgen
-candle 1.02 candela
-militarypace 2.5 feet
-metre meter
-litre liter
-gramme gram
-iudiptheria 62.8 microgram
-iupenicillin .6 microgram
-iuinsulin 41.67 microgram
-cottonyarncount 2520 ft/pound
-linenyarncount 900 ft/pound
-worstedyarncount 1680 ft/pound
-metricyarncount meter/gram
-jewlerspoint 2 milligram
diff --git a/usr.bin/unvis/Makefile b/usr.bin/unvis/Makefile
deleted file mode 100644
index 27fea4b..0000000
--- a/usr.bin/unvis/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= unvis
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/unvis/unvis.1 b/usr.bin/unvis/unvis.1
deleted file mode 100644
index 658bfa3..0000000
--- a/usr.bin/unvis/unvis.1
+++ /dev/null
@@ -1,59 +0,0 @@
-.\" Copyright (c) 1989, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)unvis.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 6, 1993
-.Dt UNVIS 1
-.Os
-.Sh NAME
-.Nm unvis
-.Nd "revert a visual representation of data back to original form"
-.Sh SYNOPSIS
-.Nm
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility is the inverse function of
-.Xr vis 1 .
-It reverts
-a visual representation of data back to its original form on standard output.
-.Sh SEE ALSO
-.Xr vis 1 ,
-.Xr unvis 3 ,
-.Xr vis 3
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.4 .
diff --git a/usr.bin/unvis/unvis.c b/usr.bin/unvis/unvis.c
deleted file mode 100644
index 395c9ad..0000000
--- a/usr.bin/unvis/unvis.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/*-
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1989, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)unvis.c 8.1 (Berkeley) 6/6/93";
-#endif
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <vis.h>
-
-void process(FILE *, const char *);
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- FILE *fp;
- int ch;
-
- while ((ch = getopt(argc, argv, "")) != -1)
- switch((char)ch) {
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (*argv)
- while (*argv) {
- if ((fp=fopen(*argv, "r")) != NULL)
- process(fp, *argv);
- else
- warn("%s", *argv);
- argv++;
- }
- else
- process(stdin, "<stdin>");
- exit(0);
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: unvis [file ...]\n");
- exit(1);
-}
-
-void
-process(FILE *fp, const char *filename)
-{
- int offset = 0, c, ret;
- int state = 0;
- char outc;
-
- while ((c = getc(fp)) != EOF) {
- offset++;
- again:
- switch(ret = unvis(&outc, (char)c, &state, 0)) {
- case UNVIS_VALID:
- putchar(outc);
- break;
- case UNVIS_VALIDPUSH:
- putchar(outc);
- goto again;
- case UNVIS_SYNBAD:
- warnx("%s: offset: %d: can't decode", filename, offset);
- state = 0;
- break;
- case 0:
- case UNVIS_NOCHAR:
- break;
- default:
- errx(1, "bad return value (%d), can't happen", ret);
- }
- }
- if (unvis(&outc, (char)0, &state, UNVIS_END) == UNVIS_VALID)
- putchar(outc);
-}
diff --git a/usr.bin/unzip/Makefile b/usr.bin/unzip/Makefile
deleted file mode 100644
index cc31dea..0000000
--- a/usr.bin/unzip/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# $FreeBSD$
-
-PROG = unzip
-WARNS ?= 6
-CSTD = c99
-DPADD = ${LIBARCHIVE}
-LDADD = -larchive
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/unzip/unzip.1 b/usr.bin/unzip/unzip.1
deleted file mode 100644
index 031cf3d..0000000
--- a/usr.bin/unzip/unzip.1
+++ /dev/null
@@ -1,158 +0,0 @@
-.\"-
-.\" Copyright (c) 2007-2008 Dag-Erling Coïdan Smørgrav
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd June 30, 2008
-.Dt UNZIP 1
-.Os
-.Sh NAME
-.Nm unzip
-.Nd extract files from a ZIP archive
-.Sh SYNOPSIS
-.Nm
-.Op Fl ajLlnoqtu
-.Op Fl d Ar dir
-.Ar zipfile
-.Sh DESCRIPTION
-.\" ...
-.Pp
-The following options are available:
-.Bl -tag -width Fl
-.It Fl a
-When extracting a text file, convert DOS-style line endings to
-Unix-style line endings.
-.It Fl d Ar dir
-Extract files into the specified directory rather than the current
-directory.
-.It Fl j
-Ignore directories stored in the zipfile; instead, extract all files
-directly into the extraction directory.
-.It Fl L
-Convert the names of the extracted files and directories to lowercase.
-.It Fl l
-List, rather than extract, the contents of the zipfile.
-.It Fl n
-No overwrite.
-When extacting a file from the zipfile, if a file with the same name
-already exists on disk, the file is silently skipped.
-.It Fl o
-Overwrite.
-When extacting a file from the zipfile, if a file with the same name
-already exists on disk, the existing file is replaced with the file
-from the zipfile.
-.It Fl q
-Quiet: print less information while extracting.
-.It Fl t
-Test: do not extract anything, but verify the checksum of every file
-in the archive.
-.It Fl u
-Update.
-When extacting a file from the zipfile, if a file with the same name
-already exists on disk, the existing file is replaced with the file
-from the zipfile if and only if the latter is newer than the former.
-Otherwise, the file is silently skipped.
-.El
-.Pp
-Note that only one of
-.Fl n ,
-.Fl o
-and
-.Fl u
-may be specified.
-.Sh ENVIRONMENT
-If the
-.Ev UNZIP_DEBUG
-environment variable is defined, the
-.Fl q
-command-line option has no effect, and additional debugging
-information will be printed to
-.Va stderr .
-.Sh COMPATIBILITY
-The
-.Nm
-utility aims to be sufficiently compatible with other implementations
-to serve as a drop-in replacement in the context of the
-.Xr ports 7
-system.
-No attempt has been made to replicate functionality which is not
-required for that purpose.
-.Pp
-For compatibility reasons, command-line options will be recognized if
-they are listed not only before but also after the name of the
-zipfile.
-.Pp
-Normally, the
-.Fl a
-option should only affect files which are marked as text files in the
-zipfile's central directory.
-Since the
-.Xr archive 3
-library reads zipfiles sequentially, and does not use the central
-directory, that information is not available to the
-.Nm
-utility.
-Instead, the
-.Nm
-utility will assume that a file is a text file if no non-ASCII
-characters are present within the first block of data decompressed for
-that file.
-If non-ASCII characters appear in subsequent blocks of data, a warning
-will be issued.
-.Pp
-The
-.Nm
-utility is only able to process ZIP archives handled by
-.Xr libarchive 3 .
-Depending on the installed version of
-.Xr libarchive ,
-this may or may not include self-extracting archives.
-.Sh BUGS
-The
-.Nm
-utility currently does not support asking the user whether to
-overwrite or skip a file that already exists on disk.
-To be on the safe side, it will fail if it encounters a file that
-already exists and neither the
-.Fl n
-nor the
-.Fl o
-command line option was specified.
-.Sh SEE ALSO
-.Xr libarchive 3
-.Sh HISTORY
-The
-.Nm
-utility appeared in
-.Fx 8.0 .
-.Sh AUTHORS
-The
-.Nm
-utility and this manual page were written by
-.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org .
-It uses the
-.Xr archive 3
-library developed by
-.An Tim Kientzle Aq kientzle@FreeBSD.org .
diff --git a/usr.bin/unzip/unzip.c b/usr.bin/unzip/unzip.c
deleted file mode 100644
index 16373f5..0000000
--- a/usr.bin/unzip/unzip.c
+++ /dev/null
@@ -1,794 +0,0 @@
-/*-
- * Copyright (c) 2007-2008 Dag-Erling Coïdan Smørgrav
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer
- * in this position and unchanged.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- *
- * This file would be much shorter if we didn't care about command-line
- * compatibility with Info-ZIP's UnZip, which requires us to duplicate
- * parts of libarchive in order to gain more detailed control of its
- * behaviour for the purpose of implementing the -n, -o, -L and -a
- * options.
- */
-
-#include <sys/queue.h>
-#include <sys/stat.h>
-
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <fnmatch.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <archive.h>
-#include <archive_entry.h>
-
-/* command-line options */
-static int a_opt; /* convert EOL */
-static const char *d_arg; /* directory */
-static int j_opt; /* junk directories */
-static int L_opt; /* lowercase names */
-static int l_opt; /* list */
-static int n_opt; /* never overwrite */
-static int o_opt; /* always overwrite */
-static int q_opt; /* quiet */
-static int t_opt; /* test */
-static int u_opt; /* update */
-
-/* time when unzip started */
-static time_t now;
-
-/* debug flag */
-static int unzip_debug;
-
-/* running on tty? */
-static int tty;
-
-/* error flag for -t */
-static int test_failed;
-
-/* convenience macro */
-/* XXX should differentiate between ARCHIVE_{WARN,FAIL,RETRY} */
-#define ac(call) \
- do { \
- int acret = (call); \
- if (acret != ARCHIVE_OK) \
- errorx("%s", archive_error_string(a)); \
- } while (0)
-
-/*
- * Indicates that last info() did not end with EOL. This helps error() et
- * al. avoid printing an error message on the same line as an incomplete
- * informational message.
- */
-static int noeol;
-
-/* fatal error message + errno */
-static void
-error(const char *fmt, ...)
-{
- va_list ap;
-
- if (noeol)
- fprintf(stdout, "\n");
- fflush(stdout);
- fprintf(stderr, "unzip: ");
- va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- va_end(ap);
- fprintf(stderr, ": %s\n", strerror(errno));
- exit(1);
-}
-
-/* fatal error message, no errno */
-static void
-errorx(const char *fmt, ...)
-{
- va_list ap;
-
- if (noeol)
- fprintf(stdout, "\n");
- fflush(stdout);
- fprintf(stderr, "unzip: ");
- va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- va_end(ap);
- fprintf(stderr, "\n");
- exit(1);
-}
-
-#if 0
-/* non-fatal error message + errno */
-static void
-warning(const char *fmt, ...)
-{
- va_list ap;
-
- if (noeol)
- fprintf(stdout, "\n");
- fflush(stdout);
- fprintf(stderr, "unzip: ");
- va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- va_end(ap);
- fprintf(stderr, ": %s\n", strerror(errno));
-}
-#endif
-
-/* non-fatal error message, no errno */
-static void
-warningx(const char *fmt, ...)
-{
- va_list ap;
-
- if (noeol)
- fprintf(stdout, "\n");
- fflush(stdout);
- fprintf(stderr, "unzip: ");
- va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- va_end(ap);
- fprintf(stderr, "\n");
-}
-
-/* informational message (if not -q) */
-static void
-info(const char *fmt, ...)
-{
- va_list ap;
- int i;
-
- if (q_opt && !unzip_debug)
- return;
- va_start(ap, fmt);
- vfprintf(stdout, fmt, ap);
- va_end(ap);
- fflush(stdout);
-
- for (i = 0; fmt[i] != '\0'; ++i)
- /* nothing */ ;
- noeol = !(i && fmt[i - 1] == '\n');
-}
-
-/* debug message (if unzip_debug) */
-static void
-debug(const char *fmt, ...)
-{
- va_list ap;
- int i;
-
- if (!unzip_debug)
- return;
- va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- va_end(ap);
- fflush(stderr);
-
- for (i = 0; fmt[i] != '\0'; ++i)
- /* nothing */ ;
- noeol = !(i && fmt[i - 1] == '\n');
-}
-
-/* duplicate a path name, possibly converting to lower case */
-static char *
-pathdup(const char *path)
-{
- char *str;
- int len;
-
- len = strlen(path);
- while (len && path[len - 1] == '/')
- len--;
- if ((str = malloc(len + 1)) == NULL) {
- errno = ENOMEM;
- error("malloc()");
- }
- for (int i = 0; i < len; ++i)
- str[i] = L_opt ? tolower(path[i]) : path[i];
- str[len] = '\0';
-
- return (str);
-}
-
-/* concatenate two path names */
-static char *
-pathcat(const char *prefix, const char *path)
-{
- char *str;
- int prelen, len;
-
- prelen = prefix ? strlen(prefix) + 1 : 0;
- len = strlen(path) + 1;
- if ((str = malloc(prelen + len)) == NULL) {
- errno = ENOMEM;
- error("malloc()");
- }
- if (prefix) {
- memcpy(str, prefix, prelen); /* includes zero */
- str[prelen - 1] = '/'; /* splat zero */
- }
- memcpy(str + prelen, path, len); /* includes zero */
-
- return (str);
-}
-
-/*
- * Pattern lists for include / exclude processing
- */
-struct pattern {
- STAILQ_ENTRY(pattern) link;
- char pattern[];
-};
-
-STAILQ_HEAD(pattern_list, pattern);
-static struct pattern_list include = STAILQ_HEAD_INITIALIZER(include);
-static struct pattern_list exclude = STAILQ_HEAD_INITIALIZER(exclude);
-
-/*
- * Add an entry to a pattern list
- */
-static void
-add_pattern(struct pattern_list *list, const char *pattern)
-{
- struct pattern *entry;
- int len;
-
- debug("adding pattern '%s'\n", pattern);
- len = strlen(pattern);
- if ((entry = malloc(sizeof *entry + len + 1)) == NULL) {
- errno = ENOMEM;
- error("malloc()");
- }
- memset(&entry->link, 0, sizeof entry->link);
- memcpy(entry->pattern, pattern, len + 1);
- STAILQ_INSERT_TAIL(list, entry, link);
-}
-
-/*
- * Match a string against a list of patterns
- */
-static int
-match_pattern(struct pattern_list *list, const char *str)
-{
- struct pattern *entry;
-
- STAILQ_FOREACH(entry, list, link) {
- if (fnmatch(entry->pattern, str, 0) == 0)
- return (1);
- }
- return (0);
-}
-
-/*
- * Verify that a given pathname is in the include list and not in the
- * exclude list.
- */
-static int
-accept_pathname(const char *pathname)
-{
-
- if (!STAILQ_EMPTY(&include) && !match_pattern(&include, pathname))
- return (0);
- if (!STAILQ_EMPTY(&exclude) && match_pattern(&exclude, pathname))
- return (0);
- return (1);
-}
-
-/*
- * Create the specified directory with the specified mode, taking certain
- * precautions on they way.
- */
-static void
-make_dir(const char *path, int mode)
-{
- struct stat sb;
-
- if (lstat(path, &sb) == 0) {
- if (S_ISDIR(sb.st_mode))
- return;
- /*
- * Normally, we should either ask the user about removing
- * the non-directory of the same name as a directory we
- * wish to create, or respect the -n or -o command-line
- * options. However, this may lead to a later failure or
- * even compromise (if this non-directory happens to be a
- * symlink to somewhere unsafe), so we don't.
- */
-
- /*
- * Don't check unlink() result; failure will cause mkdir()
- * to fail later, which we will catch.
- */
- (void)unlink(path);
- }
- if (mkdir(path, mode) != 0 && errno != EEXIST)
- error("mkdir('%s')", path);
-}
-
-/*
- * Ensure that all directories leading up to (but not including) the
- * specified path exist.
- *
- * XXX inefficient + modifies the file in-place
- */
-static void
-make_parent(char *path)
-{
- struct stat sb;
- char *sep;
-
- sep = strrchr(path, '/');
- if (sep == NULL || sep == path)
- return;
- *sep = '\0';
- if (lstat(path, &sb) == 0) {
- if (S_ISDIR(sb.st_mode)) {
- *sep = '/';
- return;
- }
- unlink(path);
- }
- make_parent(path);
- mkdir(path, 0755);
- *sep = '/';
-
-#if 0
- for (sep = path; (sep = strchr(sep, '/')) != NULL; sep++) {
- /* root in case of absolute d_arg */
- if (sep == path)
- continue;
- *sep = '\0';
- make_dir(path, 0755);
- *sep = '/';
- }
-#endif
-}
-
-/*
- * Extract a directory.
- */
-static void
-extract_dir(struct archive *a, struct archive_entry *e, const char *path)
-{
- int mode;
-
- mode = archive_entry_filetype(e) & 0777;
- if (mode == 0)
- mode = 0755;
-
- /*
- * Some zipfiles contain directories with weird permissions such
- * as 0644 or 0444. This can cause strange issues such as being
- * unable to extract files into the directory we just created, or
- * the user being unable to remove the directory later without
- * first manually changing its permissions. Therefore, we whack
- * the permissions into shape, assuming that the user wants full
- * access and that anyone who gets read access also gets execute
- * access.
- */
- mode |= 0700;
- if (mode & 0040)
- mode |= 0010;
- if (mode & 0004)
- mode |= 0001;
-
- info("d %s\n", path);
- make_dir(path, mode);
- ac(archive_read_data_skip(a));
-}
-
-static unsigned char buffer[8192];
-static char spinner[] = { '|', '/', '-', '\\' };
-
-/*
- * Extract a regular file.
- */
-static void
-extract_file(struct archive *a, struct archive_entry *e, const char *path)
-{
- int mode;
- time_t mtime;
- struct stat sb;
- struct timeval tv[2];
- int cr, fd, text, warn;
- ssize_t len;
- unsigned char *p, *q, *end;
-
- mode = archive_entry_filetype(e) & 0777;
- if (mode == 0)
- mode = 0644;
- mtime = archive_entry_mtime(e);
-
- /* look for existing file of same name */
- if (lstat(path, &sb) == 0) {
- if (u_opt) {
- /* check if up-to-date */
- if (S_ISREG(sb.st_mode) && sb.st_mtime > mtime)
- return;
- (void)unlink(path);
- } else if (o_opt) {
- /* overwrite */
- (void)unlink(path);
- } else if (n_opt) {
- /* do not overwrite */
- return;
- } else {
- /* XXX ask user */
- errorx("not implemented");
- }
- }
-
- if ((fd = open(path, O_RDWR|O_CREAT|O_TRUNC, mode)) < 0)
- error("open('%s')", path);
-
- /* loop over file contents and write to disk */
- info("x %s", path);
- text = a_opt;
- warn = 0;
- cr = 0;
- for (int n = 0; ; n++) {
- if (tty && (n % 4) == 0)
- info(" %c\b\b", spinner[(n / 4) % sizeof spinner]);
-
- len = archive_read_data(a, buffer, sizeof buffer);
-
- if (len < 0)
- ac(len);
-
- /* left over CR from previous buffer */
- if (a_opt && cr) {
- if (len == 0 || buffer[0] != '\n')
- if (write(fd, "\r", 1) != 1)
- error("write('%s')", path);
- cr = 0;
- }
-
- /* EOF */
- if (len == 0)
- break;
- end = buffer + len;
-
- /*
- * Detect whether this is a text file. The correct way to
- * do this is to check the least significant bit of the
- * "internal file attributes" field of the corresponding
- * file header in the central directory, but libarchive
- * does not read the central directory, so we have to
- * guess by looking for non-ASCII characters in the
- * buffer. Hopefully we won't guess wrong. If we do
- * guess wrong, we print a warning message later.
- */
- if (a_opt && n == 0) {
- for (p = buffer; p < end; ++p) {
- if (!isascii((unsigned char)*p)) {
- text = 0;
- break;
- }
- }
- }
-
- /* simple case */
- if (!a_opt || !text) {
- if (write(fd, buffer, len) != len)
- error("write('%s')", path);
- continue;
- }
-
- /* hard case: convert \r\n to \n (sigh...) */
- for (p = buffer; p < end; p = q + 1) {
- for (q = p; q < end; q++) {
- if (!warn && !isascii(*q)) {
- warningx("%s may be corrupted due"
- " to weak text file detection"
- " heuristic", path);
- warn = 1;
- }
- if (q[0] != '\r')
- continue;
- if (&q[1] == end) {
- cr = 1;
- break;
- }
- if (q[1] == '\n')
- break;
- }
- if (write(fd, p, q - p) != q - p)
- error("write('%s')", path);
- }
- }
- if (tty)
- info(" \b\b");
- if (text)
- info(" (text)");
- info("\n");
-
- /* set access and modification time */
- tv[0].tv_sec = now;
- tv[0].tv_usec = 0;
- tv[1].tv_sec = mtime;
- tv[1].tv_usec = 0;
- if (futimes(fd, tv) != 0)
- error("utimes('%s')", path);
- if (close(fd) != 0)
- error("close('%s')", path);
-}
-
-/*
- * Extract a zipfile entry: first perform some sanity checks to ensure
- * that it is either a directory or a regular file and that the path is
- * not absolute and does not try to break out of the current directory;
- * then call either extract_dir() or extract_file() as appropriate.
- *
- * This is complicated a bit by the various ways in which we need to
- * manipulate the path name. Case conversion (if requested by the -L
- * option) happens first, but the include / exclude patterns are applied
- * to the full converted path name, before the directory part of the path
- * is removed in accordance with the -j option. Sanity checks are
- * intentionally done earlier than they need to be, so the user will get a
- * warning about insecure paths even for files or directories which
- * wouldn't be extracted anyway.
- */
-static void
-extract(struct archive *a, struct archive_entry *e)
-{
- char *pathname, *realpathname;
- mode_t filetype;
- char *p, *q;
-
- pathname = pathdup(archive_entry_pathname(e));
- filetype = archive_entry_filetype(e);
-
- /* sanity checks */
- if (pathname[0] == '/' ||
- strncmp(pathname, "../", 3) == 0 ||
- strstr(pathname, "/../") != NULL) {
- warningx("skipping insecure entry '%s'", pathname);
- ac(archive_read_data_skip(a));
- free(pathname);
- return;
- }
-
- /* I don't think this can happen in a zipfile.. */
- if (!S_ISDIR(filetype) && !S_ISREG(filetype)) {
- warningx("skipping non-regular entry '%s'", pathname);
- ac(archive_read_data_skip(a));
- free(pathname);
- return;
- }
-
- /* skip directories in -j case */
- if (S_ISDIR(filetype) && j_opt) {
- ac(archive_read_data_skip(a));
- free(pathname);
- return;
- }
-
- /* apply include / exclude patterns */
- if (!accept_pathname(pathname)) {
- ac(archive_read_data_skip(a));
- free(pathname);
- return;
- }
-
- /* apply -j and -d */
- if (j_opt) {
- for (p = q = pathname; *p; ++p)
- if (*p == '/')
- q = p + 1;
- realpathname = pathcat(d_arg, q);
- } else {
- realpathname = pathcat(d_arg, pathname);
- }
-
- /* ensure that parent directory exists */
- make_parent(realpathname);
-
- if (S_ISDIR(filetype))
- extract_dir(a, e, realpathname);
- else
- extract_file(a, e, realpathname);
-
- free(realpathname);
- free(pathname);
-}
-
-/*
- * Print the name of an entry to stdout.
- */
-static void
-list(struct archive *a, struct archive_entry *e)
-{
-
- printf("%s\n", archive_entry_pathname(e));
- ac(archive_read_data_skip(a));
-}
-
-/*
- * Extract to memory to check CRC
- */
-static void
-test(struct archive *a, struct archive_entry *e)
-{
- ssize_t len;
-
- if (S_ISDIR(archive_entry_filetype(e)))
- return;
-
- info("%s ", archive_entry_pathname(e));
- while ((len = archive_read_data(a, buffer, sizeof buffer)) > 0)
- /* nothing */;
- if (len < 0) {
- info("%s\n", archive_error_string(a));
- ++test_failed;
- } else {
- info("OK\n");
- }
-
- /* shouldn't be necessary, but it doesn't hurt */
- ac(archive_read_data_skip(a));
-}
-
-
-/*
- * Main loop: open the zipfile, iterate over its contents and decide what
- * to do with each entry.
- */
-static void
-unzip(const char *fn)
-{
- struct archive *a;
- struct archive_entry *e;
- int fd, ret;
-
- if ((fd = open(fn, O_RDONLY)) < 0)
- error("%s", fn);
-
- a = archive_read_new();
- ac(archive_read_support_format_zip(a));
- ac(archive_read_open_fd(a, fd, 8192));
-
- for (;;) {
- ret = archive_read_next_header(a, &e);
- if (ret == ARCHIVE_EOF)
- break;
- ac(ret);
- if (t_opt)
- test(a, e);
- else if (l_opt)
- list(a, e);
- else
- extract(a, e);
- }
-
- ac(archive_read_close(a));
- (void)archive_read_finish(a);
- if (close(fd) != 0)
- error("%s", fn);
-
- if (t_opt && test_failed)
- errorx("%d checksum error(s) found.", test_failed);
-}
-
-static void
-usage(void)
-{
-
- fprintf(stderr, "usage: unzip [-ajLlnoqtu] [-d dir] zipfile\n");
- exit(1);
-}
-
-static int
-getopts(int argc, char *argv[])
-{
- int opt;
-
- optreset = optind = 1;
- while ((opt = getopt(argc, argv, "ad:jLlnoqtux:")) != -1)
- switch (opt) {
- case 'a':
- a_opt = 1;
- break;
- case 'd':
- d_arg = optarg;
- break;
- case 'j':
- j_opt = 1;
- break;
- case 'L':
- L_opt = 1;
- break;
- case 'l':
- l_opt = 1;
- break;
- case 'n':
- n_opt = 1;
- break;
- case 'o':
- o_opt = 1;
- break;
- case 'q':
- q_opt = 1;
- break;
- case 't':
- t_opt = 1;
- break;
- case 'u':
- u_opt = 1;
- break;
- case 'x':
- add_pattern(&exclude, optarg);
- break;
- default:
- usage();
- }
-
- return (optind);
-}
-
-int
-main(int argc, char *argv[])
-{
- const char *zipfile;
- int nopts;
-
- if (isatty(STDOUT_FILENO))
- tty = 1;
-
- if (getenv("UNZIP_DEBUG") != NULL)
- unzip_debug = 1;
- for (int i = 0; i < argc; ++i)
- debug("%s%c", argv[i], (i < argc - 1) ? ' ' : '\n');
-
- /*
- * Info-ZIP's unzip(1) expects certain options to come before the
- * zipfile name, and others to come after - though it does not
- * enforce this. For simplicity, we accept *all* options both
- * before and after the zipfile name.
- */
- nopts = getopts(argc, argv);
-
- if (argc <= nopts)
- usage();
- zipfile = argv[nopts++];
-
- while (nopts < argc && *argv[nopts] != '-')
- add_pattern(&include, argv[nopts++]);
-
- nopts--; /* fake argv[0] */
- nopts += getopts(argc - nopts, argv + nopts);
-
- if (n_opt + o_opt + u_opt > 1)
- errorx("-n, -o and -u are contradictory");
-
- time(&now);
-
- unzip(zipfile);
-
- exit(0);
-}
diff --git a/usr.bin/usbhidaction/Makefile b/usr.bin/usbhidaction/Makefile
deleted file mode 100644
index 6c2f7a6..0000000
--- a/usr.bin/usbhidaction/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# $FreeBSD$
-# $NetBSD: Makefile,v 1.4 2002/02/02 16:54:26 veego Exp $
-
-PROG= usbhidaction
-
-LDADD= -lusbhid
-DPADD= ${LIBUSBHID}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/usbhidaction/usbhidaction.1 b/usr.bin/usbhidaction/usbhidaction.1
deleted file mode 100644
index 95420c8f..0000000
--- a/usr.bin/usbhidaction/usbhidaction.1
+++ /dev/null
@@ -1,182 +0,0 @@
-.\" $FreeBSD$
-.\" $NetBSD: usbhidaction.1,v 1.8 2003/02/25 10:35:59 wiz Exp $
-.\"
-.\" Copyright (c) 2000 The NetBSD Foundation, Inc.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to The NetBSD Foundation
-.\" by Lennart Augustsson (lennart@augustsson.net).
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the NetBSD
-.\" Foundation, Inc. and its contributors.
-.\" 4. Neither the name of The NetBSD Foundation nor the names of its
-.\" contributors may be used to endorse or promote products derived
-.\" from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-.\" POSSIBILITY OF SUCH DAMAGE.
-.\"
-.Dd April 9, 2003
-.Dt USBHIDACTION 1
-.Os
-.Sh NAME
-.Nm usbhidaction
-.Nd perform actions according to USB HID controls
-.Sh SYNOPSIS
-.Nm
-.Op Fl diev
-.Fl c Ar config-file
-.Fl f Ar device
-.Op Fl p Ar pidfile
-.Op Fl t Ar tablefile
-.Ar arg ...
-.Sh DESCRIPTION
-The
-.Nm
-utility
-can be used to execute commands when certain values appear on HID controls.
-The normal operation for this program is to read the configuration file
-and then become a daemon and execute commands as the HID items specify.
-If a read from the HID device fails, the program dies; this will make it
-die when the USB device is unplugged.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl d
-Toggle the daemon flag.
-.It Fl e
-Instruct
-.Nm
-to die early.
-Useful when specified with multiple verbose options to see how files are parsed.
-.It Fl i
-Ignore HID items in the configuration file that do not exist in the device.
-.It Fl v
-Be verbose, and do not become a daemon.
-.It Fl c Ar config-file
-Specify a path name for the configuration file.
-.It Fl t Ar tablefile
-Specify a path name for the HID usage table file.
-.It Fl f Ar device
-Specify a path name for the device to operate on.
-If
-.Ar device
-is numeric, it is taken to be the USB HID device number.
-If it is a relative
-path, it is taken to be the name of the device under
-.Pa /dev .
-An absolute path is taken to be the literal device pathname.
-.It Fl p Ar pidfile
-Specify an alternate file in which to store the process ID.
-.El
-.Pp
-The configuration file will be re-read if the process gets a
-.Dv SIGHUP
-signal.
-.Sh CONFIGURATION
-The configuration file has a very simple format.
-Each line describes an
-action; if a line begins with a whitespace, it is considered a continuation
-of the previous line.
-Lines beginning with
-.Ql #
-are considered as comments.
-.Pp
-Each line has four parts: a name of a USB HID item, a value for that item,
-a debounce value, and an action.
-There must be whitespace between the parts.
-.Pp
-The item names are similar to those used by
-.Xr usbhidctl 1 ,
-but each part must be prefixed by its page name.
-.Pp
-The value is simply a numeric value.
-When the item reports this value,
-the action will be performed.
-If the value is
-.Ql * ,
-it will match any value.
-.Pp
-The debounce value is an integer not less than 0.
-The value of 0 indicates that no debouncing should occur.
-A value of 1 will only execute the action when the state changes.
-Values greater than one specify that an action should be performed
-only when the value changes by that amount.
-.Pp
-The action is a normal command that is executed with
-.Xr system 3 .
-Before it is executed some substitution will occur:
-.Ql $n
-will be replaced by the
-.Ar n Ns th
-argument on the command line,
-.Ql $V
-will be replaced by the numeric value of the HID item,
-.Ql $N
-will be replaced by the name of the control, and
-.Ql $H
-will be replaced by the name of the HID device.
-.Sh FILES
-.Bl -tag -width ".Pa /usr/share/misc/usb_hid_usages"
-.It Pa /usr/share/misc/usb_hid_usages
-The HID usage table.
-.It Pa /var/run/usbaction.pid
-The default location of the PID file.
-.El
-.Sh EXAMPLES
-The following configuration file can be used to control a pair
-of Philips USB speakers with the HID controls on the speakers.
-.Bd -literal -offset indent
-# Configuration for various Philips USB speakers
-Consumer:Volume_Up 1 0 mixer -f $1 vol +1
-Consumer:Volume_Down 1 0 mixer -f $1 vol -1
-# mute not supported
-#Consumer:Mute 1 0 mixer -f $1 mute
-Consumer:Channel_Top.Microsoft:Base_Up 1 0 mixer -f $1 bass +1
-Consumer:Channel_Top.Microsoft:Base_Down 1 0 mixer -f $1 bass -1
-.Ed
-.Pp
-A sample invocation using this configuration would be
-.Pp
-.Dl "usbhidaction -f /dev/uhid1 -c conf /dev/mixer1"
-.Pp
-The following example controls the mixer volume using a Logitech Wingman.
-Notice the debounce of 1 for buttons and 5 for the slider.
-.Bd -literal -offset indent
-Button:Button_1 1 1 mixer vol +10
-Button:Button_2 1 1 mixer vol -10
-Generic_Desktop:Z * 5 mixer vol `echo $V | awk '{print int($$1/255*100)}'`
-.Ed
-.Sh SEE ALSO
-.Xr usbhidctl 1 ,
-.Xr usbhid 3 ,
-.Xr uhid 4 ,
-.Xr usb 4
-.Sh HISTORY
-The
-.Nm
-command first appeared in
-.Nx 1.6 .
-The
-.Nm
-command appeared in
-.Fx 5.1 .
diff --git a/usr.bin/usbhidaction/usbhidaction.c b/usr.bin/usbhidaction/usbhidaction.c
deleted file mode 100644
index e0d459d..0000000
--- a/usr.bin/usbhidaction/usbhidaction.c
+++ /dev/null
@@ -1,500 +0,0 @@
-/* $NetBSD: usbhidaction.c,v 1.8 2002/06/11 06:06:21 itojun Exp $ */
-/* $FreeBSD$ */
-
-/*
- * Copyright (c) 2000, 2002 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Lennart Augustsson <lennart@augustsson.net>.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <err.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <dev/usb/usb.h>
-#include <dev/usb/usbhid.h>
-#include <usbhid.h>
-#include <syslog.h>
-#include <signal.h>
-#include <errno.h>
-#include <sys/stat.h>
-
-static int verbose = 0;
-static int isdemon = 0;
-static int reparse = 1;
-static const char * pidfile = "/var/run/usbaction.pid";
-
-struct command {
- struct command *next;
- int line;
-
- struct hid_item item;
- int value;
- int lastseen;
- int lastused;
- int debounce;
- char anyvalue;
- char *name;
- char *action;
-};
-struct command *commands;
-
-#define SIZE 4000
-
-void usage(void);
-struct command *parse_conf(const char *, report_desc_t, int, int);
-void docmd(struct command *, int, const char *, int, char **);
-void freecommands(struct command *);
-
-static void
-sighup(int sig __unused)
-{
- reparse = 1;
-}
-
-int
-main(int argc, char **argv)
-{
- const char *conf = NULL;
- const char *dev = NULL;
- const char *table = NULL;
- int fd, fp, ch, n, val, i;
- size_t sz, sz1;
- int demon, ignore, dieearly;
- report_desc_t repd;
- char buf[100];
- char devnamebuf[PATH_MAX];
- struct command *cmd;
- int reportid;
-
- demon = 1;
- ignore = 0;
- dieearly = 0;
- while ((ch = getopt(argc, argv, "c:def:ip:t:v")) != -1) {
- switch(ch) {
- case 'c':
- conf = optarg;
- break;
- case 'd':
- demon ^= 1;
- break;
- case 'e':
- dieearly = 1;
- break;
- case 'i':
- ignore++;
- break;
- case 'f':
- dev = optarg;
- break;
- case 'p':
- pidfile = optarg;
- break;
- case 't':
- table = optarg;
- break;
- case 'v':
- demon = 0;
- verbose++;
- break;
- case '?':
- default:
- usage();
- }
- }
- argc -= optind;
- argv += optind;
-
- if (conf == NULL || dev == NULL)
- usage();
-
- hid_init(table);
-
- if (dev[0] != '/') {
- snprintf(devnamebuf, sizeof(devnamebuf), "/dev/%s%s",
- isdigit(dev[0]) ? "uhid" : "", dev);
- dev = devnamebuf;
- }
-
- fd = open(dev, O_RDWR);
- if (fd < 0)
- err(1, "%s", dev);
- if (ioctl(fd, USB_GET_REPORT_ID, &reportid) < 0)
- reportid = -1;
- repd = hid_get_report_desc(fd);
- if (repd == NULL)
- err(1, "hid_get_report_desc() failed");
-
- commands = parse_conf(conf, repd, reportid, ignore);
-
- sz = (size_t)hid_report_size(repd, hid_input, reportid);
-
- if (verbose)
- printf("report size %zu\n", sz);
- if (sz > sizeof buf)
- errx(1, "report too large");
-
- (void)signal(SIGHUP, sighup);
-
- if (demon) {
- fp = open(pidfile, O_WRONLY|O_CREAT, S_IRUSR|S_IRGRP|S_IROTH);
- if (fp >= 0) {
- sz1 = snprintf(buf, sizeof buf, "%d\n", getpid());
- if (sz1 > sizeof buf)
- sz1 = sizeof buf;
- write(fp, buf, sz1);
- close(fp);
- } else
- err(1, "%s", pidfile);
- if (daemon(0, 0) < 0)
- err(1, "daemon()");
- isdemon = 1;
- }
-
- for(;;) {
- n = read(fd, buf, sz);
- if (verbose > 2) {
- printf("read %d bytes:", n);
- for (i = 0; i < n; i++)
- printf(" %02x", buf[i]);
- printf("\n");
- }
- if (n < 0) {
- if (verbose)
- err(1, "read");
- else
- exit(1);
- }
-#if 0
- if (n != sz) {
- err(2, "read size");
- }
-#endif
- for (cmd = commands; cmd; cmd = cmd->next) {
- val = hid_get_data(buf, &cmd->item);
- if (cmd->value != val && cmd->anyvalue == 0)
- goto next;
- if ((cmd->debounce == 0) ||
- ((cmd->debounce == 1) && ((cmd->lastseen == -1) ||
- (cmd->lastseen != val)))) {
- docmd(cmd, val, dev, argc, argv);
- goto next;
- }
- if ((cmd->debounce > 1) &&
- ((cmd->lastused == -1) ||
- (abs(cmd->lastused - val) >= cmd->debounce))) {
- docmd(cmd, val, dev, argc, argv);
- cmd->lastused = val;
- goto next;
- }
-next:
- cmd->lastseen = val;
- }
-
- if (dieearly)
- exit(0);
-
- if (reparse) {
- struct command *cmds =
- parse_conf(conf, repd, reportid, ignore);
- if (cmds) {
- freecommands(commands);
- commands = cmds;
- }
- reparse = 0;
- }
- }
-
- exit(0);
-}
-
-void
-usage(void)
-{
-
- fprintf(stderr, "Usage: %s [-deiv] -c config_file -f hid_dev "
- "[-p pidfile] [-t tablefile]\n", getprogname());
- exit(1);
-}
-
-static int
-peek(FILE *f)
-{
- int c;
-
- c = getc(f);
- if (c != EOF)
- ungetc(c, f);
- return c;
-}
-
-struct command *
-parse_conf(const char *conf, report_desc_t repd, int reportid, int ignore)
-{
- FILE *f;
- char *p;
- int line;
- char buf[SIZE], name[SIZE], value[SIZE], debounce[SIZE], action[SIZE];
- char usbuf[SIZE], coll[SIZE];
- struct command *cmd, *cmds;
- struct hid_data *d;
- struct hid_item h;
- int u, lo, hi, range;
-
-
- f = fopen(conf, "r");
- if (f == NULL)
- err(1, "%s", conf);
-
- cmds = NULL;
- for (line = 1; ; line++) {
- if (fgets(buf, sizeof buf, f) == NULL)
- break;
- if (buf[0] == '#' || buf[0] == '\n')
- continue;
- p = strchr(buf, '\n');
- while (p && isspace(peek(f))) {
- if (fgets(p, sizeof buf - strlen(buf), f) == NULL)
- break;
- p = strchr(buf, '\n');
- }
- if (p)
- *p = 0;
- if (sscanf(buf, "%s %s %s %[^\n]",
- name, value, debounce, action) != 4) {
- if (isdemon) {
- syslog(LOG_WARNING, "config file `%s', line %d"
- ", syntax error: %s", conf, line, buf);
- freecommands(cmds);
- return (NULL);
- } else {
- errx(1, "config file `%s', line %d,"
- ", syntax error: %s", conf, line, buf);
- }
- }
-
- cmd = malloc(sizeof *cmd);
- if (cmd == NULL)
- err(1, "malloc failed");
- cmd->next = cmds;
- cmds = cmd;
- cmd->line = line;
-
- if (strcmp(value, "*") == 0) {
- cmd->anyvalue = 1;
- } else {
- cmd->anyvalue = 0;
- if (sscanf(value, "%d", &cmd->value) != 1) {
- if (isdemon) {
- syslog(LOG_WARNING,
- "config file `%s', line %d, "
- "bad value: %s (should be * or a number)\n",
- conf, line, value);
- freecommands(cmds);
- return (NULL);
- } else {
- errx(1, "config file `%s', line %d, "
- "bad value: %s (should be * or a number)\n",
- conf, line, value);
- }
- }
- }
-
- if (sscanf(debounce, "%d", &cmd->debounce) != 1) {
- if (isdemon) {
- syslog(LOG_WARNING,
- "config file `%s', line %d, "
- "bad value: %s (should be a number >= 0)\n",
- conf, line, debounce);
- freecommands(cmds);
- return (NULL);
- } else {
- errx(1, "config file `%s', line %d, "
- "bad value: %s (should be a number >= 0)\n",
- conf, line, debounce);
- }
- }
-
- coll[0] = 0;
- for (d = hid_start_parse(repd, 1 << hid_input, reportid);
- hid_get_item(d, &h); ) {
- if (verbose > 2)
- printf("kind=%d usage=%x\n", h.kind, h.usage);
- if (h.flags & HIO_CONST)
- continue;
- switch (h.kind) {
- case hid_input:
- if (h.usage_minimum != 0 ||
- h.usage_maximum != 0) {
- lo = h.usage_minimum;
- hi = h.usage_maximum;
- range = 1;
- } else {
- lo = h.usage;
- hi = h.usage;
- range = 0;
- }
- for (u = lo; u <= hi; u++) {
- snprintf(usbuf, sizeof usbuf, "%s:%s",
- hid_usage_page(HID_PAGE(u)),
- hid_usage_in_page(u));
- if (verbose > 2)
- printf("usage %s\n", usbuf);
- if (!strcasecmp(usbuf, name))
- goto foundhid;
- if (coll[0]) {
- snprintf(usbuf, sizeof usbuf,
- "%s.%s:%s", coll+1,
- hid_usage_page(HID_PAGE(u)),
- hid_usage_in_page(u));
- if (verbose > 2)
- printf("usage %s\n",
- usbuf);
- if (!strcasecmp(usbuf, name))
- goto foundhid;
- }
- }
- break;
- case hid_collection:
- snprintf(coll + strlen(coll),
- sizeof coll - strlen(coll), ".%s:%s",
- hid_usage_page(HID_PAGE(h.usage)),
- hid_usage_in_page(h.usage));
- break;
- case hid_endcollection:
- if (coll[0])
- *strrchr(coll, '.') = 0;
- break;
- default:
- break;
- }
- }
- if (ignore) {
- if (verbose)
- warnx("ignore item '%s'", name);
- continue;
- }
- if (isdemon) {
- syslog(LOG_WARNING, "config file `%s', line %d, HID "
- "item not found: `%s'\n", conf, line, name);
- freecommands(cmds);
- return (NULL);
- } else {
- errx(1, "config file `%s', line %d, HID item "
- "not found: `%s'\n", conf, line, name);
- }
-
- foundhid:
- hid_end_parse(d);
- cmd->lastseen = -1;
- cmd->lastused = -1;
- cmd->item = h;
- cmd->name = strdup(name);
- cmd->action = strdup(action);
- if (range) {
- if (cmd->value == 1)
- cmd->value = u - lo;
- else
- cmd->value = -1;
- }
-
- if (verbose)
- printf("PARSE:%d %s, %d, '%s'\n", cmd->line, name,
- cmd->value, cmd->action);
- }
- fclose(f);
- return (cmds);
-}
-
-void
-docmd(struct command *cmd, int value, const char *hid, int argc, char **argv)
-{
- char cmdbuf[SIZE], *p, *q;
- size_t len;
- int n, r;
-
- for (p = cmd->action, q = cmdbuf; *p && q < &cmdbuf[SIZE-1]; ) {
- if (*p == '$') {
- p++;
- len = &cmdbuf[SIZE-1] - q;
- if (isdigit(*p)) {
- n = strtol(p, &p, 10) - 1;
- if (n >= 0 && n < argc) {
- strncpy(q, argv[n], len);
- q += strlen(q);
- }
- } else if (*p == 'V') {
- p++;
- snprintf(q, len, "%d", value);
- q += strlen(q);
- } else if (*p == 'N') {
- p++;
- strncpy(q, cmd->name, len);
- q += strlen(q);
- } else if (*p == 'H') {
- p++;
- strncpy(q, hid, len);
- q += strlen(q);
- } else if (*p) {
- *q++ = *p++;
- }
- } else {
- *q++ = *p++;
- }
- }
- *q = 0;
-
- if (verbose)
- printf("system '%s'\n", cmdbuf);
- r = system(cmdbuf);
- if (verbose > 1 && r)
- printf("return code = 0x%x\n", r);
-}
-
-void
-freecommands(struct command *cmd)
-{
- struct command *next;
-
- while (cmd) {
- next = cmd->next;
- free(cmd);
- cmd = next;
- }
-}
diff --git a/usr.bin/usbhidctl/Makefile b/usr.bin/usbhidctl/Makefile
deleted file mode 100644
index 3738b50..0000000
--- a/usr.bin/usbhidctl/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# $NetBSD: Makefile,v 1.4 1999/05/11 21:02:25 augustss Exp $
-# $FreeBSD$
-
-PROG= usbhidctl
-SRCS= usbhid.c
-DPADD= ${LIBUSBHID}
-LDADD= -lusbhid
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/usbhidctl/usbhid.c b/usr.bin/usbhidctl/usbhid.c
deleted file mode 100644
index ff7c544..0000000
--- a/usr.bin/usbhidctl/usbhid.c
+++ /dev/null
@@ -1,345 +0,0 @@
-/* $NetBSD: usbhid.c,v 1.14 2000/07/03 02:51:37 matt Exp $ */
-/* $FreeBSD$ */
-
-/*
- * Copyright (c) 1998 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Lennart Augustsson (augustss@netbsd.org).
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <err.h>
-#include <ctype.h>
-#include <errno.h>
-#include <usbhid.h>
-#include <dev/usb/usb.h>
-#include <dev/usb/usbhid.h>
-
-int verbose = 0;
-int all = 0;
-int noname = 0;
-int hexdump = 0;
-static int reportid;
-
-char **names;
-int nnames;
-
-void prbits(int bits, char **strs, int n);
-void usage(void);
-void dumpitem(const char *label, struct hid_item *h);
-void dumpitems(report_desc_t r);
-void rev(struct hid_item **p);
-void prdata(u_char *buf, struct hid_item *h);
-void dumpdata(int f, report_desc_t r, int loop);
-int gotname(char *n);
-
-int
-gotname(char *n)
-{
- int i;
-
- for (i = 0; i < nnames; i++)
- if (strcmp(names[i], n) == 0)
- return 1;
- return 0;
-}
-
-void
-prbits(int bits, char **strs, int n)
-{
- int i;
-
- for(i = 0; i < n; i++, bits >>= 1)
- if (strs[i*2])
- printf("%s%s", i == 0 ? "" : ", ", strs[i*2 + (bits&1)]);
-}
-
-void
-usage(void)
-{
- extern char *__progname;
-
- fprintf(stderr,
- "usage: %s -f device "
- "[-l] [-n] [-r] [-t tablefile] [-v] [-x] name ...\n",
- __progname);
- fprintf(stderr,
- " %s -f device "
- "[-l] [-n] [-r] [-t tablefile] [-v] [-x] -a\n",
- __progname);
- exit(1);
-}
-
-void
-dumpitem(const char *label, struct hid_item *h)
-{
- if ((h->flags & HIO_CONST) && !verbose)
- return;
- printf("%s size=%d count=%d page=%s usage=%s%s", label,
- h->report_size, h->report_count,
- hid_usage_page(HID_PAGE(h->usage)),
- hid_usage_in_page(h->usage),
- h->flags & HIO_CONST ? " Const" : "");
- printf(", logical range %d..%d",
- h->logical_minimum, h->logical_maximum);
- if (h->physical_minimum != h->physical_maximum)
- printf(", physical range %d..%d",
- h->physical_minimum, h->physical_maximum);
- if (h->unit)
- printf(", unit=0x%02x exp=%d", h->unit, h->unit_exponent);
- printf("\n");
-}
-
-void
-dumpitems(report_desc_t r)
-{
- struct hid_data *d;
- struct hid_item h;
- int size;
-
- for (d = hid_start_parse(r, ~0, reportid); hid_get_item(d, &h); ) {
- switch (h.kind) {
- case hid_collection:
- printf("Collection page=%s usage=%s\n",
- hid_usage_page(HID_PAGE(h.usage)),
- hid_usage_in_page(h.usage));
- break;
- case hid_endcollection:
- printf("End collection\n");
- break;
- case hid_input:
- dumpitem("Input ", &h);
- break;
- case hid_output:
- dumpitem("Output ", &h);
- break;
- case hid_feature:
- dumpitem("Feature", &h);
- break;
- }
- }
- hid_end_parse(d);
- size = hid_report_size(r, hid_input, 0);
- printf("Total input size %d bytes\n", size);
-
- size = hid_report_size(r, hid_output, 0);
- printf("Total output size %d bytes\n", size);
-
- size = hid_report_size(r, hid_feature, 0);
- printf("Total feature size %d bytes\n", size);
-}
-
-void
-rev(struct hid_item **p)
-{
- struct hid_item *cur, *prev, *next;
-
- prev = 0;
- cur = *p;
- while(cur != 0) {
- next = cur->next;
- cur->next = prev;
- prev = cur;
- cur = next;
- }
- *p = prev;
-}
-
-void
-prdata(u_char *buf, struct hid_item *h)
-{
- u_int data;
- int i, pos;
-
- pos = h->pos;
- for (i = 0; i < h->report_count; i++) {
- data = hid_get_data(buf, h);
- if (h->logical_minimum < 0)
- printf("%d", (int)data);
- else
- printf("%u", data);
- if (hexdump)
- printf(" [0x%x]", data);
- pos += h->report_size;
- }
-}
-
-void
-dumpdata(int f, report_desc_t rd, int loop)
-{
- struct hid_data *d;
- struct hid_item h, *hids, *n;
- int r, dlen;
- u_char *dbuf;
- static int one = 1;
- u_int32_t colls[100];
- int sp = 0;
- char namebuf[10000], *namep;
-
- hids = 0;
- for (d = hid_start_parse(rd, 1<<hid_input, reportid);
- hid_get_item(d, &h); ) {
- if (h.kind == hid_collection)
- colls[++sp] = h.usage;
- else if (h.kind == hid_endcollection)
- --sp;
- if (h.kind != hid_input || (h.flags & HIO_CONST))
- continue;
- h.next = hids;
- h.collection = colls[sp];
- hids = malloc(sizeof *hids);
- *hids = h;
- }
- hid_end_parse(d);
- rev(&hids);
- dlen = hid_report_size(rd, hid_input, 0);
- dbuf = malloc(dlen);
- if (!loop)
- if (ioctl(f, USB_SET_IMMED, &one) < 0) {
- if (errno == EOPNOTSUPP)
- warnx("device does not support immediate mode, only changes reported.");
- else
- err(1, "USB_SET_IMMED");
- }
- do {
- r = read(f, dbuf, dlen);
- if (r != dlen) {
- err(1, "bad read %d != %d", r, dlen);
- }
- for (n = hids; n; n = n->next) {
- namep = namebuf;
- namep += sprintf(namep, "%s:%s.",
- hid_usage_page(HID_PAGE(n->collection)),
- hid_usage_in_page(n->collection));
- namep += sprintf(namep, "%s:%s",
- hid_usage_page(HID_PAGE(n->usage)),
- hid_usage_in_page(n->usage));
- if (all || gotname(namebuf)) {
- if (!noname)
- printf("%s=", namebuf);
- prdata(dbuf + (reportid != 0), n);
- printf("\n");
- }
- }
- if (loop)
- printf("\n");
- } while (loop);
- free(dbuf);
-}
-
-int
-main(int argc, char **argv)
-{
- int f;
- report_desc_t r;
- char devnam[100], *dev = 0;
- int ch;
- int repdump = 0;
- int loop = 0;
- char *table = 0;
-
- while ((ch = getopt(argc, argv, "af:lnrt:vx")) != -1) {
- switch(ch) {
- case 'a':
- all++;
- break;
- case 'f':
- dev = optarg;
- break;
- case 'l':
- loop ^= 1;
- break;
- case 'n':
- noname++;
- break;
- case 'r':
- repdump++;
- break;
- case 't':
- table = optarg;
- break;
- case 'v':
- verbose++;
- break;
- case 'x':
- hexdump = 1;
- break;
- case '?':
- default:
- usage();
- }
- }
- argc -= optind;
- argv += optind;
- if (dev == 0)
- usage();
- names = argv;
- nnames = argc;
-
- if (nnames == 0 && !all && !repdump)
- usage();
-
- if (dev[0] != '/') {
- if (isdigit(dev[0]))
- snprintf(devnam, sizeof(devnam), "/dev/uhid%s", dev);
- else
- snprintf(devnam, sizeof(devnam), "/dev/%s", dev);
- dev = devnam;
- }
-
- hid_init(table);
-
- f = open(dev, O_RDWR);
- if (f < 0)
- err(1, "%s", dev);
-
- r = hid_get_report_desc(f);
- if (r == 0)
- errx(1, "USB_GET_REPORT_DESC");
-
- if (repdump) {
- printf("Report descriptor:\n");
- dumpitems(r);
- }
- if (nnames != 0 || all)
- dumpdata(f, r, loop);
-
- hid_dispose_report_desc(r);
- exit(0);
-}
diff --git a/usr.bin/usbhidctl/usbhidctl.1 b/usr.bin/usbhidctl/usbhidctl.1
deleted file mode 100644
index 8ba5ec1..0000000
--- a/usr.bin/usbhidctl/usbhidctl.1
+++ /dev/null
@@ -1,97 +0,0 @@
-.\" $NetBSD: usbhidctl.1,v 1.8 1999/05/11 21:03:58 augustss Exp $
-.\" $FreeBSD$
-.\"
-.\" Copyright (c) 1998 The NetBSD Foundation, Inc.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to The NetBSD Foundation
-.\" by Lennart Augustsson.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the NetBSD
-.\" Foundation, Inc. and its contributors.
-.\" 4. Neither the name of The NetBSD Foundation nor the names of its
-.\" contributors may be used to endorse or promote products derived
-.\" from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-.\" POSSIBILITY OF SUCH DAMAGE.
-.\"
-.Dd November 23, 2006
-.Dt USBHIDCTL 1
-.Os
-.Sh NAME
-.Nm usbhidctl
-.Nd manipulate USB HID devices
-.Sh SYNOPSIS
-.Nm
-.Op Fl a
-.Fl f Ar device
-.Op Fl l
-.Op Fl n
-.Op Fl r
-.Op Fl t Ar table
-.Op Fl v
-.Op Fl x
-.Op Ar item ...
-.Sh DESCRIPTION
-The
-.Nm
-utility can be used to dump the state of a USB HID (Human Interface Device).
-Each named
-.Ar item
-is printed.
-.Pp
-The options are as follows:
-.Bl -tag -width Ds
-.It Fl a
-Show all items.
-.It Fl f Ar device
-Specify a path name for the device to operate on.
-.It Fl l
-Loop and dump the device data every time it changes.
-.It Fl n
-Suppress printing of the item name.
-.It Fl r
-Dump the report descriptor.
-.It Fl t Ar table
-Specify a path name for the HID usage table file.
-.It Fl v
-Be verbose.
-.It Fl x
-Dump data in hexadecimal as well as decimal.
-.El
-.Sh FILES
-.Pa /usr/share/misc/usb_hid_usages
-The default HID usage table.
-.Sh SEE ALSO
-.Xr usbhid 3 ,
-.Xr uhid 4 ,
-.Xr usb 4
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Nx 1.4 .
-.Sh BUGS
-The
-.Nm
-utility cannot show nor set output and feature items.
diff --git a/usr.bin/users/Makefile b/usr.bin/users/Makefile
deleted file mode 100644
index 3d6524b..0000000
--- a/usr.bin/users/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= users
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/users/users.1 b/usr.bin/users/users.1
deleted file mode 100644
index c3454c6..0000000
--- a/usr.bin/users/users.1
+++ /dev/null
@@ -1,61 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)users.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 6, 1993
-.Dt USERS 1
-.Os
-.Sh NAME
-.Nm users
-.Nd list current users
-.Sh SYNOPSIS
-.Nm
-.Sh DESCRIPTION
-The
-.Nm
-utility lists the login names of the users currently on the system,
-in sorted order, space separated, on a single line.
-.Sh FILES
-.Bl -tag -width /var/run/utmp
-.It Pa /var/run/utmp
-.El
-.Sh SEE ALSO
-.Xr finger 1 ,
-.Xr last 1 ,
-.Xr who 1 ,
-.Xr utmp 5
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3.0 .
diff --git a/usr.bin/users/users.c b/usr.bin/users/users.c
deleted file mode 100644
index c90bfbd..0000000
--- a/usr.bin/users/users.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (c) 1980, 1987, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1987, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)users.c 8.1 (Berkeley) 6/6/93";
-#endif
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <sys/types.h>
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <utmp.h>
-
-typedef char namebuf[UT_NAMESIZE];
-
-int scmp(const void *, const void *);
-static void usage(void);
-
-int
-main(int argc, char **argv)
-{
- namebuf *names = NULL;
- int ncnt = 0;
- int nmax = 0;
- int cnt;
- struct utmp utmp;
- int ch;
-
- while ((ch = getopt(argc, argv, "")) != -1)
- switch(ch) {
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (!freopen(_PATH_UTMP, "r", stdin))
- errx(1, "can't open %s", _PATH_UTMP);
- while (fread((char *)&utmp, sizeof(utmp), 1, stdin) == 1) {
- if (*utmp.ut_name) {
- if (ncnt >= nmax) {
- nmax += 32;
- names = realloc(names, sizeof (*names) * nmax);
- if (!names) {
- errx(1, "realloc");
- /* NOTREACHED */
- }
- }
- (void)strncpy(names[ncnt], utmp.ut_name, UT_NAMESIZE);
- ++ncnt;
- }
- }
- if (ncnt) {
- qsort(names, ncnt, UT_NAMESIZE, scmp);
- (void)printf("%.*s", UT_NAMESIZE, names[0]);
- for (cnt = 1; cnt < ncnt; ++cnt)
- if (strncmp(names[cnt], names[cnt - 1], UT_NAMESIZE))
- (void)printf(" %.*s", UT_NAMESIZE, names[cnt]);
- (void)printf("\n");
- }
- exit(0);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "usage: users\n");
- exit(1);
-}
-
-int
-scmp(const void *p, const void *q)
-{
- return(strncmp(p, q, UT_NAMESIZE));
-}
diff --git a/usr.bin/uudecode/Makefile b/usr.bin/uudecode/Makefile
deleted file mode 100644
index 37005f3..0000000
--- a/usr.bin/uudecode/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= uudecode
-WARNS?= 4
-LINKS= ${BINDIR}/uudecode ${BINDIR}/b64decode
-NO_MAN=
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/uudecode/uudecode.c b/usr.bin/uudecode/uudecode.c
deleted file mode 100644
index 093af7d..0000000
--- a/usr.bin/uudecode/uudecode.c
+++ /dev/null
@@ -1,438 +0,0 @@
-/*-
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1983, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static char sccsid[] = "@(#)uudecode.c 8.2 (Berkeley) 4/2/94";
-#endif /* not lint */
-#endif
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * uudecode [file ...]
- *
- * create the specified file, decoding as you go.
- * used with uuencode.
- */
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-
-#include <netinet/in.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <libgen.h>
-#include <pwd.h>
-#include <resolv.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-static const char *infile, *outfile;
-static FILE *infp, *outfp;
-static int base64, cflag, iflag, oflag, pflag, rflag, sflag;
-
-static void usage(void);
-static int decode(void);
-static int decode2(void);
-static int uu_decode(void);
-static int base64_decode(void);
-
-int
-main(int argc, char *argv[])
-{
- int rval, ch;
-
- if (strcmp(basename(argv[0]), "b64decode") == 0)
- base64 = 1;
-
- while ((ch = getopt(argc, argv, "cimo:prs")) != -1) {
- switch(ch) {
- case 'c':
- if (oflag || rflag)
- usage();
- cflag = 1; /* multiple uudecode'd files */
- break;
- case 'i':
- iflag = 1; /* ask before override files */
- break;
- case 'm':
- base64 = 1;
- break;
- case 'o':
- if (cflag || pflag || rflag || sflag)
- usage();
- oflag = 1; /* output to the specified file */
- sflag = 1; /* do not strip pathnames for output */
- outfile = optarg; /* set the output filename */
- break;
- case 'p':
- if (oflag)
- usage();
- pflag = 1; /* print output to stdout */
- break;
- case 'r':
- if (cflag || oflag)
- usage();
- rflag = 1; /* decode raw data */
- break;
- case 's':
- if (oflag)
- usage();
- sflag = 1; /* do not strip pathnames for output */
- break;
- default:
- usage();
- }
- }
- argc -= optind;
- argv += optind;
-
- if (*argv) {
- rval = 0;
- do {
- infp = fopen(infile = *argv, "r");
- if (infp == NULL) {
- warn("%s", *argv);
- rval = 1;
- continue;
- }
- rval |= decode();
- fclose(infp);
- } while (*++argv);
- } else {
- infile = "stdin";
- infp = stdin;
- rval = decode();
- }
- exit(rval);
-}
-
-static int
-decode(void)
-{
- int r, v;
-
- if (rflag) {
- /* relaxed alternative to decode2() */
- outfile = "/dev/stdout";
- outfp = stdout;
- if (base64)
- return (base64_decode());
- else
- return (uu_decode());
- }
- v = decode2();
- if (v == EOF) {
- warnx("%s: missing or bad \"begin\" line", infile);
- return (1);
- }
- for (r = v; cflag; r |= v) {
- v = decode2();
- if (v == EOF)
- break;
- }
- return (r);
-}
-
-static int
-decode2(void)
-{
- int flags, fd, mode;
- size_t n, m;
- char *p, *q;
- void *handle;
- struct passwd *pw;
- struct stat st;
- char buf[MAXPATHLEN+1];
-
- base64 = 0;
- /* search for header line */
- for (;;) {
- if (fgets(buf, sizeof(buf), infp) == NULL)
- return (EOF);
- p = buf;
- if (strncmp(p, "begin-base64 ", 13) == 0) {
- base64 = 1;
- p += 13;
- } else if (strncmp(p, "begin ", 6) == 0)
- p += 6;
- else
- continue;
- /* p points to mode */
- q = strchr(p, ' ');
- if (q == NULL)
- continue;
- *q++ = '\0';
- /* q points to filename */
- n = strlen(q);
- while (n > 0 && (q[n-1] == '\n' || q[n-1] == '\r'))
- q[--n] = '\0';
- /* found valid header? */
- if (n > 0)
- break;
- }
-
- handle = setmode(p);
- if (handle == NULL) {
- warnx("%s: unable to parse file mode", infile);
- return (1);
- }
- mode = getmode(handle, 0) & 0666;
- free(handle);
-
- if (sflag) {
- /* don't strip, so try ~user/file expansion */
- p = NULL;
- pw = NULL;
- if (*q == '~')
- p = strchr(q, '/');
- if (p != NULL) {
- *p = '\0';
- pw = getpwnam(q + 1);
- *p = '/';
- }
- if (pw != NULL) {
- n = strlen(pw->pw_dir);
- if (buf + n > p) {
- /* make room */
- m = strlen(p);
- if (sizeof(buf) < n + m) {
- warnx("%s: bad output filename",
- infile);
- return (1);
- }
- p = memmove(buf + n, p, m);
- }
- q = memcpy(p - n, pw->pw_dir, n);
- }
- } else {
- /* strip down to leaf name */
- p = strrchr(q, '/');
- if (p != NULL)
- q = p + 1;
- }
- if (!oflag)
- outfile = q;
-
- /* POSIX says "/dev/stdout" is a 'magic cookie' not a special file. */
- if (pflag || strcmp(outfile, "/dev/stdout") == 0)
- outfp = stdout;
- else {
- flags = O_WRONLY|O_CREAT|O_EXCL;
- if (lstat(outfile, &st) == 0) {
- if (iflag) {
- warnc(EEXIST, "%s: %s", infile, outfile);
- return (0);
- }
- switch (st.st_mode & S_IFMT) {
- case S_IFREG:
- case S_IFLNK:
- /* avoid symlink attacks */
- if (unlink(outfile) == 0 || errno == ENOENT)
- break;
- warn("%s: unlink %s", infile, outfile);
- return (1);
- case S_IFDIR:
- warnc(EISDIR, "%s: %s", infile, outfile);
- return (1);
- default:
- if (oflag) {
- /* trust command-line names */
- flags &= ~O_EXCL;
- break;
- }
- warnc(EEXIST, "%s: %s", infile, outfile);
- return (1);
- }
- } else if (errno != ENOENT) {
- warn("%s: %s", infile, outfile);
- return (1);
- }
- if ((fd = open(outfile, flags, mode)) < 0 ||
- (outfp = fdopen(fd, "w")) == NULL) {
- warn("%s: %s", infile, outfile);
- return (1);
- }
- }
-
- if (base64)
- return (base64_decode());
- else
- return (uu_decode());
-}
-
-static int
-getline(char *buf, size_t size)
-{
- if (fgets(buf, size, infp) != NULL)
- return (2);
- if (rflag)
- return (0);
- warnx("%s: %s: short file", infile, outfile);
- return (1);
-}
-
-static int
-checkend(const char *ptr, const char *end, const char *msg)
-{
- size_t n;
-
- n = strlen(end);
- if (strncmp(ptr, end, n) != 0 ||
- strspn(ptr + n, " \t\r\n") != strlen(ptr + n)) {
- warnx("%s: %s: %s", infile, outfile, msg);
- return (1);
- }
- if (fclose(outfp) != 0) {
- warn("%s: %s", infile, outfile);
- return (1);
- }
- return (0);
-}
-
-static int
-uu_decode(void)
-{
- int i, ch;
- char *p;
- char buf[MAXPATHLEN+1];
-
- /* for each input line */
- for (;;) {
- switch (getline(buf, sizeof(buf))) {
- case 0: return (0);
- case 1: return (1);
- }
-
-#define DEC(c) (((c) - ' ') & 077) /* single character decode */
-#define IS_DEC(c) ( (((c) - ' ') >= 0) && (((c) - ' ') <= 077 + 1) )
-
-#define OUT_OF_RANGE do { \
- warnx("%s: %s: character out of range: [%d-%d]", \
- infile, outfile, 1 + ' ', 077 + ' ' + 1); \
- return (1); \
-} while (0)
-
- /*
- * `i' is used to avoid writing out all the characters
- * at the end of the file.
- */
- p = buf;
- if ((i = DEC(*p)) <= 0)
- break;
- for (++p; i > 0; p += 4, i -= 3)
- if (i >= 3) {
- if (!(IS_DEC(*p) && IS_DEC(*(p + 1)) &&
- IS_DEC(*(p + 2)) && IS_DEC(*(p + 3))))
- OUT_OF_RANGE;
-
- ch = DEC(p[0]) << 2 | DEC(p[1]) >> 4;
- putc(ch, outfp);
- ch = DEC(p[1]) << 4 | DEC(p[2]) >> 2;
- putc(ch, outfp);
- ch = DEC(p[2]) << 6 | DEC(p[3]);
- putc(ch, outfp);
- }
- else {
- if (i >= 1) {
- if (!(IS_DEC(*p) && IS_DEC(*(p + 1))))
- OUT_OF_RANGE;
- ch = DEC(p[0]) << 2 | DEC(p[1]) >> 4;
- putc(ch, outfp);
- }
- if (i >= 2) {
- if (!(IS_DEC(*(p + 1)) &&
- IS_DEC(*(p + 2))))
- OUT_OF_RANGE;
-
- ch = DEC(p[1]) << 4 | DEC(p[2]) >> 2;
- putc(ch, outfp);
- }
- if (i >= 3) {
- if (!(IS_DEC(*(p + 2)) &&
- IS_DEC(*(p + 3))))
- OUT_OF_RANGE;
- ch = DEC(p[2]) << 6 | DEC(p[3]);
- putc(ch, outfp);
- }
- }
- }
- switch (getline(buf, sizeof(buf))) {
- case 0: return (0);
- case 1: return (1);
- default: return (checkend(buf, "end", "no \"end\" line"));
- }
-}
-
-static int
-base64_decode(void)
-{
- int n;
- char inbuf[MAXPATHLEN+1];
- unsigned char outbuf[MAXPATHLEN * 4];
-
- for (;;) {
- switch (getline(inbuf, sizeof(inbuf))) {
- case 0: return (0);
- case 1: return (1);
- }
- n = b64_pton(inbuf, outbuf, sizeof(outbuf));
- if (n < 0)
- break;
- fwrite(outbuf, 1, n, outfp);
- }
- return (checkend(inbuf, "====",
- "error decoding base64 input stream"));
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr,
-"usage: uudecode [-cimprs] [file ...]\n"
-" uudecode [-i] -o output_file [file]\n"
-" b64decode [-cimprs] [file ...]\n"
-" b64decode [-i] -o output_file [file]\n");
- exit(1);
-}
diff --git a/usr.bin/uuencode/Makefile b/usr.bin/uuencode/Makefile
deleted file mode 100644
index c795753..0000000
--- a/usr.bin/uuencode/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= uuencode
-WARNS?= 4
-MAN= uuencode.1 uuencode.format.5
-LINKS= ${BINDIR}/uuencode ${BINDIR}/b64encode
-MLINKS= uuencode.1 uudecode.1 \
- uuencode.format.5 uuencode.5 \
- uuencode.1 b64encode.1 \
- b64encode.1 b64decode.1
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/uuencode/uuencode.1 b/usr.bin/uuencode/uuencode.1
deleted file mode 100644
index 7d61188..0000000
--- a/usr.bin/uuencode/uuencode.1
+++ /dev/null
@@ -1,221 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)uuencode.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd January 27, 2002
-.Dt UUENCODE 1
-.Os
-.Sh NAME
-.Nm uuencode ,
-.Nm uudecode ,
-.Nm b64encode ,
-.Nm b64decode
-.Nd encode/decode a binary file
-.Sh SYNOPSIS
-.Nm
-.Op Fl m
-.Op Fl o Ar output_file
-.Op Ar file
-.Ar name
-.Nm uudecode
-.Op Fl cimprs
-.Op Ar
-.Nm uudecode
-.Op Fl i
-.Fl o Ar output_file
-.Nm b64encode
-.Op Fl o Ar output_file
-.Op Ar file
-.Ar name
-.Nm b64decode
-.Op Fl cimprs
-.Op Ar
-.Nm b64decode
-.Op Fl i
-.Fl o Ar output_file
-.Op Ar file
-.Sh DESCRIPTION
-The
-.Nm
-and
-.Nm uudecode
-utilities are used to transmit binary files over transmission mediums
-that do not support other than simple
-.Tn ASCII
-data.
-The
-.Nm b64encode
-utility is synonymous with
-.Nm
-with the
-.Fl m
-flag specified.
-The
-.Nm b64decode
-utility is synonymous with
-.Nm uudecode
-with the
-.Fl m
-flag specified.
-.Pp
-The
-.Nm
-utility reads
-.Ar file
-(or by default the standard input) and writes an encoded version
-to the standard output, or
-.Ar output_file
-if one has been specified.
-The encoding uses only printing
-.Tn ASCII
-characters and includes the
-mode of the file and the operand
-.Ar name
-for use by
-.Nm uudecode .
-.Pp
-The
-.Nm uudecode
-utility transforms
-.Em uuencoded
-files (or by default, the standard input) into the original form.
-The resulting file is named either
-.Ar name
-or (depending on options passed to
-.Nm uudecode )
-.Ar output_file
-and will have the mode of the original file except that setuid
-and execute bits are not retained.
-The
-.Nm uudecode
-utility ignores any leading and trailing lines.
-.Pp
-The following options are available for
-.Nm :
-.Bl -tag -width ident
-.It Fl m
-Use the Base64 method of encoding, rather than the traditional
-.Nm
-algorithm.
-.It Fl o Ar output_file
-Output to
-.Ar output_file
-instead of standard output.
-.El
-.Pp
-The following options are available for
-.Nm uudecode :
-.Bl -tag -width ident
-.It Fl c
-Decode more than one uuencoded file from
-.Ar file
-if possible.
-.It Fl i
-Do not overwrite files.
-.It Fl m
-When used with the
-.Fl r
-flag, decode Base64 input instead of traditional
-.Nm
-input.
-Without
-.Fl r
-it has no effect.
-.It Fl o Ar output_file
-Output to
-.Ar output_file
-instead of any pathname contained in the input data.
-.It Fl p
-Decode
-.Ar file
-and write output to standard output.
-.It Fl r
-Decode raw (or broken) input, which is missing the initial and
-possibly the final framing lines.
-The input is assumed to be in the traditional
-.Nm
-encoding, but if the
-.Fl m
-flag is used, or if the utility is invoked as
-.Nm b64decode ,
-then the input is assumed to be in Base64 format.
-.It Fl s
-Do not strip output pathname to base filename.
-By default
-.Nm uudecode
-deletes any prefix ending with the last slash '/' for security
-reasons.
-.El
-.Sh EXAMPLES
-The following example packages up a source tree, compresses it,
-uuencodes it and mails it to a user on another system.
-When
-.Nm uudecode
-is run on the target system, the file ``src_tree.tar.Z'' will be
-created which may then be uncompressed and extracted into the original
-tree.
-.Pp
-.Bd -literal -offset indent -compact
-tar cf \- src_tree \&| compress \&|
-uuencode src_tree.tar.Z \&| mail sys1!sys2!user
-.Ed
-.Pp
-The following example unpacks all uuencoded
-files from your mailbox into your current working directory.
-.Pp
-.Bd -literal -offset indent -compact
-uudecode -c < $MAIL
-.Ed
-.Pp
-The following example extracts a compressed tar
-archive from your mailbox
-.Pp
-.Bd -literal -offset indent -compact
-uudecode -o /dev/stdout < $MAIL | zcat | tar xfv -
-.Ed
-.Sh SEE ALSO
-.Xr basename 1 ,
-.Xr compress 1 ,
-.Xr mail 1 ,
-.Xr uucp 1 Pq Pa ports/net/freebsd-uucp ,
-.Xr uuencode 5
-.Sh HISTORY
-The
-.Nm uudecode
-and
-.Nm
-utilities appeared in
-.Bx 4.0 .
-.Sh BUGS
-Files encoded using the traditional algorithm are expanded by 35% (3
-bytes become 4 plus control information).
diff --git a/usr.bin/uuencode/uuencode.c b/usr.bin/uuencode/uuencode.c
deleted file mode 100644
index e4d83b4..0000000
--- a/usr.bin/uuencode/uuencode.c
+++ /dev/null
@@ -1,226 +0,0 @@
-/*-
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1983, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static char sccsid[] = "@(#)uuencode.c 8.2 (Berkeley) 4/2/94";
-#endif /* not lint */
-#endif
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * uuencode [input] output
- *
- * Encode a file so it can be mailed to a remote system.
- */
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-
-#include <netinet/in.h>
-
-#include <err.h>
-#include <libgen.h>
-#include <resolv.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-void encode(void);
-void base64_encode(void);
-static void usage(void);
-
-FILE *output;
-int mode;
-char **av;
-
-int
-main(int argc, char *argv[])
-{
- struct stat sb;
- int base64;
- int ch;
- char *outfile;
-
- base64 = 0;
- outfile = NULL;
-
- if (strcmp(basename(argv[0]), "b64encode") == 0)
- base64 = 1;
-
- while ((ch = getopt(argc, argv, "mo:")) != -1) {
- switch (ch) {
- case 'm':
- base64 = 1;
- break;
- case 'o':
- outfile = optarg;
- break;
- case '?':
- default:
- usage();
- }
- }
- argv += optind;
- argc -= optind;
-
- switch(argc) {
- case 2: /* optional first argument is input file */
- if (!freopen(*argv, "r", stdin) || fstat(fileno(stdin), &sb))
- err(1, "%s", *argv);
-#define RWX (S_IRWXU|S_IRWXG|S_IRWXO)
- mode = sb.st_mode & RWX;
- ++argv;
- break;
- case 1:
-#define RW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
- mode = RW & ~umask(RW);
- break;
- case 0:
- default:
- usage();
- }
-
- av = argv;
-
- if (outfile != NULL) {
- output = fopen(outfile, "w+");
- if (output == NULL)
- err(1, "unable to open %s for output", outfile);
- } else
- output = stdout;
- if (base64)
- base64_encode();
- else
- encode();
- if (ferror(output))
- errx(1, "write error");
- exit(0);
-}
-
-/* ENC is the basic 1 character encoding function to make a char printing */
-#define ENC(c) ((c) ? ((c) & 077) + ' ': '`')
-
-/*
- * Copy from in to out, encoding in base64 as you go along.
- */
-void
-base64_encode(void)
-{
- /*
- * Output must fit into 80 columns, chunks come in 4, leave 1.
- */
-#define GROUPS ((80 / 4) - 1)
- unsigned char buf[3];
- char buf2[sizeof(buf) * 2 + 1];
- size_t n;
- int rv, sequence;
-
- sequence = 0;
-
- fprintf(output, "begin-base64 %o %s\n", mode, *av);
- while ((n = fread(buf, 1, sizeof(buf), stdin))) {
- ++sequence;
- rv = b64_ntop(buf, n, buf2, (sizeof(buf2) / sizeof(buf2[0])));
- if (rv == -1)
- errx(1, "b64_ntop: error encoding base64");
- fprintf(output, "%s%s", buf2, (sequence % GROUPS) ? "" : "\n");
- }
- if (sequence % GROUPS)
- fprintf(output, "\n");
- fprintf(output, "====\n");
-}
-
-/*
- * Copy from in to out, encoding as you go along.
- */
-void
-encode(void)
-{
- register int ch, n;
- register char *p;
- char buf[80];
-
- (void)fprintf(output, "begin %o %s\n", mode, *av);
- while ((n = fread(buf, 1, 45, stdin))) {
- ch = ENC(n);
- if (fputc(ch, output) == EOF)
- break;
- for (p = buf; n > 0; n -= 3, p += 3) {
- /* Pad with nulls if not a multiple of 3. */
- if (n < 3) {
- p[2] = '\0';
- if (n < 2)
- p[1] = '\0';
- }
- ch = *p >> 2;
- ch = ENC(ch);
- if (fputc(ch, output) == EOF)
- break;
- ch = ((*p << 4) & 060) | ((p[1] >> 4) & 017);
- ch = ENC(ch);
- if (fputc(ch, output) == EOF)
- break;
- ch = ((p[1] << 2) & 074) | ((p[2] >> 6) & 03);
- ch = ENC(ch);
- if (fputc(ch, output) == EOF)
- break;
- ch = p[2] & 077;
- ch = ENC(ch);
- if (fputc(ch, output) == EOF)
- break;
- }
- if (fputc('\n', output) == EOF)
- break;
- }
- if (ferror(stdin))
- errx(1, "read error");
- (void)fprintf(output, "%c\nend\n", ENC('\0'));
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr,
-"usage: uuencode [-m] [-o outfile] [infile] remotefile\n"
-" b64encode [-o outfile] [infile] remotefile\n");
- exit(1);
-}
diff --git a/usr.bin/uuencode/uuencode.format.5 b/usr.bin/uuencode/uuencode.format.5
deleted file mode 100644
index 34879d1..0000000
--- a/usr.bin/uuencode/uuencode.format.5
+++ /dev/null
@@ -1,106 +0,0 @@
-.\" Copyright (c) 1989, 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)uuencode.format.5 8.2 (Berkeley) 1/12/94
-.\" $FreeBSD$
-.\"
-.Dd January 12, 1994
-.Dt UUENCODE 5
-.Os
-.Sh NAME
-.Nm uuencode
-.Nd format of an encoded uuencode file
-.Sh DESCRIPTION
-Files output by
-.Xr uuencode 1
-consist of a header line,
-followed by a number of body lines,
-and a trailer line.
-The
-.Xr uudecode 1
-command
-will ignore any lines preceding the header or
-following the trailer.
-Lines preceding a header must not, of course,
-look like a header.
-.Pp
-The header line is distinguished by having the first
-6 characters
-.Dq begin\ \&
-(note the trailing space).
-The word
-.Em begin
-is followed by a mode (in octal),
-and a string which names the remote file.
-A space separates the three items in the header line.
-.Pp
-The body consists of a number of lines, each at most 62 characters
-long (including the trailing newline).
-These consist of a character count,
-followed by encoded characters,
-followed by a newline.
-The character count is a single printing character,
-and represents an integer, the number of bytes
-the rest of the line represents.
-Such integers are always in the range from 1 to 45 or 64 and can
-be determined by subtracting the character space (octal 40)
-from the character.
-Character 64 represents a count of zero.
-.Pp
-Groups of 3 bytes are stored in 4 characters, 6 bits per character.
-All characters are always in range from 1 to 64 and are offset by a
-space (octal 40) to make the characters printing.
-Character
-64 represents a count of zero.
-The last line may be shorter than the normal 45 bytes.
-If the size is not a multiple of 3, this fact can be determined
-by the value of the count on the last line.
-Extra null characters will be included to make the character count a multiple
-of 4.
-The body is terminated by a line with a count of zero.
-This line consists of one
-.Tn ASCII
-backquote (octal 140) character.
-.Pp
-The trailer line consists of
-.Dq end
-on a line by itself.
-.Sh SEE ALSO
-.Xr mail 1 ,
-.Xr uucp 1 ,
-.Xr uudecode 1 ,
-.Xr uuencode 1
-.Sh HISTORY
-The
-.Nm
-file format appeared in
-.Bx 4.0 .
-.\" It was named uuencode.5 prior to 4.3
diff --git a/usr.bin/vacation/Makefile b/usr.bin/vacation/Makefile
deleted file mode 100644
index 63ba3ab..0000000
--- a/usr.bin/vacation/Makefile
+++ /dev/null
@@ -1,36 +0,0 @@
-# $FreeBSD$
-
-SENDMAIL_DIR=${.CURDIR}/../../contrib/sendmail
-.PATH: ${SENDMAIL_DIR}/vacation
-
-PROG= vacation
-SRCS= vacation.c
-CFLAGS+=-I${SENDMAIL_DIR}/src -I${SENDMAIL_DIR}/include -I.
-CFLAGS+=-DNEWDB -DNOT_SENDMAIL
-CFLAGS+=-D_FFR_LISTDB -D_FFR_DEBUG
-
-LIBSMDIR= ${.OBJDIR}/../../lib/libsm
-LIBSM= ${LIBSMDIR}/libsm.a
-
-LIBSMDBDIR= ${.OBJDIR}/../../lib/libsmdb
-LIBSMDB= ${LIBSMDBDIR}/libsmdb.a
-
-LIBSMUTILDIR= ${.OBJDIR}/../../lib/libsmutil
-LIBSMUTIL= ${LIBSMUTILDIR}/libsmutil.a
-
-DPADD= ${LIBSMDB} ${LIBSMUTIL} ${LIBSM}
-LDADD= ${LIBSMDB} ${LIBSMUTIL} ${LIBSM}
-
-SRCS+= sm_os.h
-CLEANFILES+=sm_os.h
-
-# User customizations to the sendmail build environment
-CFLAGS+=${SENDMAIL_CFLAGS}
-DPADD+=${SENDMAIL_DPADD}
-LDADD+=${SENDMAIL_LDADD}
-LDFLAGS+=${SENDMAIL_LDFLAGS}
-
-sm_os.h:
- ln -sf ${SENDMAIL_DIR}/include/sm/os/sm_os_freebsd.h sm_os.h
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/vgrind/Makefile b/usr.bin/vgrind/Makefile
deleted file mode 100644
index 1a64c1c..0000000
--- a/usr.bin/vgrind/Makefile
+++ /dev/null
@@ -1,31 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/9/93
-# $FreeBSD$
-
-PROG= vfontedpr
-SRCS= regexp.c vfontedpr.c
-SCRIPTS=vgrind.sh
-FILES= vgrindefs.src vgrindefs.src.db tmac.vgrind
-FILESNAME_vgrindefs.src= vgrindefs
-FILESNAME_vgrindefs.src.db= vgrindefs.db
-FILESDIR= ${SHAREDIR}/misc
-FILESDIR_tmac.vgrind= ${SHAREDIR}/tmac
-MAN= vgrind.1 vgrindefs.5
-
-BINDIR= /usr/libexec
-SCRIPTSDIR=/usr/bin
-
-CLEANFILES= vgrindefs.src.db
-
-.include <bsd.endian.mk>
-.if ${TARGET_ENDIANNESS} == "1234"
-CAP_MKDB_ENDIAN= -l
-.elif ${TARGET_ENDIANNESS} == "4321"
-CAP_MKDB_ENDIAN= -b
-.else
-CAP_MKDB_ENDIAN=
-.endif
-
-vgrindefs.src.db: vgrindefs.src
- cap_mkdb ${CAP_MKDB_ENDIAN} -f vgrindefs.src ${.ALLSRC}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/vgrind/RETEST/Makefile b/usr.bin/vgrind/RETEST/Makefile
deleted file mode 100644
index 8712ebb..0000000
--- a/usr.bin/vgrind/RETEST/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= retest
-SRCS= regexp.c retest.c
-.PATH: ${.CURDIR}/..
-NO_MAN=
-
-install:
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/vgrind/RETEST/retest.c b/usr.bin/vgrind/RETEST/retest.c
deleted file mode 100644
index ce953cb..0000000
--- a/usr.bin/vgrind/RETEST/retest.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static char sccsid[] = "@(#)retest.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-
-#include <ctype.h>
-
-int l_onecase = 0;
-char * _start;
-char * _escaped;
-char * convexp();
-char * expmatch();
-main()
-{
- char reg[132];
- char *ireg;
- char str[132];
- char *match;
- char matstr[132];
- char c;
-
- while (1) {
- printf ("\nexpr: ");
- scanf ("%s", reg);
- ireg = convexp(reg);
- match = ireg;
- while(*match) {
- switch (*match) {
-
- case '\\':
- case '(':
- case ')':
- case '|':
- printf ("%c", *match);
- break;
-
- default:
- if (isalnum(*match))
- printf("%c", *match);
- else
- printf ("<%03o>", *match);
- break;
- }
- match++;
- }
- printf("\n");
- getchar();
- while(1) {
- printf ("string: ");
- match = str;
- while ((c = getchar()) != '\n')
- *match++ = c;
- *match = 0;
- if (str[0] == '#')
- break;
- matstr[0] = 0;
- _start = str;
- _escaped = 0;
- match = expmatch (str, ireg, matstr);
- if (match == 0)
- printf ("FAILED\n");
- else
- printf ("match\nmatstr = %s\n", matstr);
- }
-
- }
-}
diff --git a/usr.bin/vgrind/extern.h b/usr.bin/vgrind/extern.h
deleted file mode 100644
index e1c1c50..0000000
--- a/usr.bin/vgrind/extern.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-typedef int boolean;
-
-extern boolean _escaped; /* if last character was an escape */
-extern char *s_start; /* start of the current string */
-extern char *l_acmbeg; /* string introducing a comment */
-extern char *l_acmend; /* string ending a comment */
-extern char *l_blkbeg; /* string begining of a block */
-extern char *l_blkend; /* string ending a block */
-extern char *l_chrbeg; /* delimiter for character constant */
-extern char *l_chrend; /* delimiter for character constant */
-extern char *l_combeg; /* string introducing a comment */
-extern char *l_comend; /* string ending a comment */
-extern char l_escape; /* character used to escape characters */
-extern char *l_keywds[]; /* keyword table address */
-extern boolean l_onecase; /* upper and lower case are equivalent */
-extern char *l_prcbeg; /* regular expr for procedure begin */
-extern char *l_strbeg; /* delimiter for string constant */
-extern char *l_strend; /* delimiter for string constant */
-extern boolean l_toplex; /* procedures only defined at top lex level */
-extern const char *language; /* the language indicator */
-
-#include <sys/cdefs.h>
-
-__BEGIN_DECLS
-extern int STRNCMP(char *, char *, int);
-extern char *convexp(char *);
-extern char *expmatch(char *, char *, char *);
-__END_DECLS
-
diff --git a/usr.bin/vgrind/pathnames.h b/usr.bin/vgrind/pathnames.h
deleted file mode 100644
index 157f91f..0000000
--- a/usr.bin/vgrind/pathnames.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)pathnames.h 8.1 (Berkeley) 6/6/93
- */
-
-#define _PATH_VGRINDEFS "/usr/share/misc/vgrindefs"
diff --git a/usr.bin/vgrind/regexp.c b/usr.bin/vgrind/regexp.c
deleted file mode 100644
index 199f3c6..0000000
--- a/usr.bin/vgrind/regexp.c
+++ /dev/null
@@ -1,603 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "@(#)regexp.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "extern.h"
-
-#define FALSE 0
-#define TRUE !(FALSE)
-#define NIL 0
-
-static void expconv(void);
-
-boolean _escaped; /* true if we are currently _escaped */
-char *s_start; /* start of string */
-boolean l_onecase; /* true if upper and lower equivalent */
-
-#define makelower(c) (isupper((c)) ? tolower((c)) : (c))
-
-/* STRNCMP - like strncmp except that we convert the
- * first string to lower case before comparing
- * if l_onecase is set.
- */
-
-int
-STRNCMP(s1, s2, len)
- register char *s1,*s2;
- register int len;
-{
- if (l_onecase) {
- do
- if (*s2 - makelower(*s1))
- return (*s2 - makelower(*s1));
- else {
- s2++;
- s1++;
- }
- while (--len);
- } else {
- do
- if (*s2 - *s1)
- return (*s2 - *s1);
- else {
- s2++;
- s1++;
- }
- while (--len);
- }
- return(0);
-}
-
-/* The following routine converts an irregular expression to
- * internal format.
- *
- * Either meta symbols (\a \d or \p) or character strings or
- * operations ( alternation or perenthesizing ) can be
- * specified. Each starts with a descriptor byte. The descriptor
- * byte has STR set for strings, META set for meta symbols
- * and OPER set for operations.
- * The descriptor byte can also have the OPT bit set if the object
- * defined is optional. Also ALT can be set to indicate an alternation.
- *
- * For metasymbols the byte following the descriptor byte identities
- * the meta symbol (containing an ascii 'a', 'd', 'p', '|', or '('). For
- * strings the byte after the descriptor is a character count for
- * the string:
- *
- * meta symbols := descriptor
- * symbol
- *
- * strings := descriptor
- * character count
- * the string
- *
- * operatins := descriptor
- * symbol
- * character count
- */
-
-/*
- * handy macros for accessing parts of match blocks
- */
-#define MSYM(A) (*(A+1)) /* symbol in a meta symbol block */
-#define MNEXT(A) (A+2) /* character following a metasymbol block */
-
-#define OSYM(A) (*(A+1)) /* symbol in an operation block */
-#define OCNT(A) (*(A+2)) /* character count */
-#define ONEXT(A) (A+3) /* next character after the operation */
-#define OPTR(A) (A+*(A+2)) /* place pointed to by the operator */
-
-#define SCNT(A) (*(A+1)) /* byte count of a string */
-#define SSTR(A) (A+2) /* address of the string */
-#define SNEXT(A) (A+2+*(A+1)) /* character following the string */
-
-/*
- * bit flags in the descriptor
- */
-#define OPT 1
-#define STR 2
-#define META 4
-#define ALT 8
-#define OPER 16
-
-static char *ccre; /* pointer to current position in converted exp*/
-static char *ure; /* pointer current position in unconverted exp */
-
-char *
-convexp(re)
- char *re; /* unconverted irregular expression */
-{
- register char *cre; /* pointer to converted regular expression */
-
- /* allocate room for the converted expression */
- if (re == NIL)
- return (NIL);
- if (*re == '\0')
- return (NIL);
- cre = malloc (4 * strlen(re) + 3);
- ccre = cre;
- ure = re;
-
- /* start the conversion with a \a */
- *cre = META | OPT;
- MSYM(cre) = 'a';
- ccre = MNEXT(cre);
-
- /* start the conversion (its recursive) */
- expconv ();
- *ccre = 0;
- return (cre);
-}
-
-static void
-expconv()
-{
- register char *cs; /* pointer to current symbol in converted exp */
- register char c; /* character being processed */
- register char *acs; /* pinter to last alternate */
- register int temp;
-
- /* let the conversion begin */
- acs = NIL;
- cs = NIL;
- while (*ure != NIL) {
- switch (c = *ure++) {
-
- case '\\':
- switch (c = *ure++) {
-
- /* escaped characters are just characters */
- default:
- if (cs == NIL || (*cs & STR) == 0) {
- cs = ccre;
- *cs = STR;
- SCNT(cs) = 1;
- ccre += 2;
- } else
- SCNT(cs)++;
- *ccre++ = c;
- break;
-
- /* normal(?) metacharacters */
- case 'a':
- case 'd':
- case 'e':
- case 'p':
- if (acs != NIL && acs != cs) {
- do {
- temp = OCNT(acs);
- OCNT(acs) = ccre - acs;
- acs -= temp;
- } while (temp != 0);
- acs = NIL;
- }
- cs = ccre;
- *cs = META;
- MSYM(cs) = c;
- ccre = MNEXT(cs);
- break;
- }
- break;
-
- /* just put the symbol in */
- case '^':
- case '$':
- if (acs != NIL && acs != cs) {
- do {
- temp = OCNT(acs);
- OCNT(acs) = ccre - acs;
- acs -= temp;
- } while (temp != 0);
- acs = NIL;
- }
- cs = ccre;
- *cs = META;
- MSYM(cs) = c;
- ccre = MNEXT(cs);
- break;
-
- /* mark the last match sequence as optional */
- case '?':
- if (cs)
- *cs = *cs | OPT;
- break;
-
- /* recurse and define a subexpression */
- case '(':
- if (acs != NIL && acs != cs) {
- do {
- temp = OCNT(acs);
- OCNT(acs) = ccre - acs;
- acs -= temp;
- } while (temp != 0);
- acs = NIL;
- }
- cs = ccre;
- *cs = OPER;
- OSYM(cs) = '(';
- ccre = ONEXT(cs);
- expconv ();
- OCNT(cs) = ccre - cs; /* offset to next symbol */
- break;
-
- /* return from a recursion */
- case ')':
- if (acs != NIL) {
- do {
- temp = OCNT(acs);
- OCNT(acs) = ccre - acs;
- acs -= temp;
- } while (temp != 0);
- acs = NIL;
- }
- cs = ccre;
- *cs = META;
- MSYM(cs) = c;
- ccre = MNEXT(cs);
- return;
-
- /* mark the last match sequence as having an alternate */
- /* the third byte will contain an offset to jump over the */
- /* alternate match in case the first did not fail */
- case '|':
- if (acs != NIL && acs != cs)
- OCNT(ccre) = ccre - acs; /* make a back pointer */
- else
- OCNT(ccre) = 0;
- *cs |= ALT;
- cs = ccre;
- *cs = OPER;
- OSYM(cs) = '|';
- ccre = ONEXT(cs);
- acs = cs; /* remember that the pointer is to be filles */
- break;
-
- /* if its not a metasymbol just build a scharacter string */
- default:
- if (cs == NIL || (*cs & STR) == 0) {
- cs = ccre;
- *cs = STR;
- SCNT(cs) = 1;
- ccre = SSTR(cs);
- } else
- SCNT(cs)++;
- *ccre++ = c;
- break;
- }
- }
- if (acs != NIL) {
- do {
- temp = OCNT(acs);
- OCNT(acs) = ccre - acs;
- acs -= temp;
- } while (temp != 0);
- acs = NIL;
- }
- return;
-}
-/* end of convertre */
-
-
-/*
- * The following routine recognises an irregular expresion
- * with the following special characters:
- *
- * \? - means last match was optional
- * \a - matches any number of characters
- * \d - matches any number of spaces and tabs
- * \p - matches any number of alphanumeric
- * characters. The
- * characters matched will be copied into
- * the area pointed to by 'name'.
- * \| - alternation
- * \( \) - grouping used mostly for alternation and
- * optionality
- *
- * The irregular expression must be translated to internal form
- * prior to calling this routine
- *
- * The value returned is the pointer to the first non \a
- * character matched.
- */
-
-char *
-expmatch (s, re, mstring)
- register char *s; /* string to check for a match in */
- register char *re; /* a converted irregular expression */
- register char *mstring; /* where to put whatever matches a \p */
-{
- register char *cs; /* the current symbol */
- register char *ptr,*s1; /* temporary pointer */
- boolean matched; /* a temporary boolean */
-
- /* initial conditions */
- if (re == NIL)
- return (NIL);
- cs = re;
- matched = FALSE;
-
- /* loop till expression string is exhausted (or at least pretty tired) */
- while (*cs) {
- switch (*cs & (OPER | STR | META)) {
-
- /* try to match a string */
- case STR:
- matched = !STRNCMP (s, SSTR(cs), SCNT(cs));
- if (matched) {
-
- /* hoorah it matches */
- s += SCNT(cs);
- cs = SNEXT(cs);
- } else if (*cs & ALT) {
-
- /* alternation, skip to next expression */
- cs = SNEXT(cs);
- } else if (*cs & OPT) {
-
- /* the match is optional */
- cs = SNEXT(cs);
- matched = 1; /* indicate a successful match */
- } else {
-
- /* no match, error return */
- return (NIL);
- }
- break;
-
- /* an operator, do something fancy */
- case OPER:
- switch (OSYM(cs)) {
-
- /* this is an alternation */
- case '|':
- if (matched)
-
- /* last thing in the alternation was a match, skip ahead */
- cs = OPTR(cs);
- else
-
- /* no match, keep trying */
- cs = ONEXT(cs);
- break;
-
- /* this is a grouping, recurse */
- case '(':
- ptr = expmatch (s, ONEXT(cs), mstring);
- if (ptr != NIL) {
-
- /* the subexpression matched */
- matched = 1;
- s = ptr;
- } else if (*cs & ALT) {
-
- /* alternation, skip to next expression */
- matched = 0;
- } else if (*cs & OPT) {
-
- /* the match is optional */
- matched = 1; /* indicate a successful match */
- } else {
-
- /* no match, error return */
- return (NIL);
- }
- cs = OPTR(cs);
- break;
- }
- break;
-
- /* try to match a metasymbol */
- case META:
- switch (MSYM(cs)) {
-
- /* try to match anything and remember what was matched */
- case 'p':
- /*
- * This is really the same as trying the match the
- * remaining parts of the expression to any subset
- * of the string.
- */
- s1 = s;
- do {
- ptr = expmatch (s1, MNEXT(cs), mstring);
- if (ptr != NIL && s1 != s) {
-
- /* we have a match, remember the match */
- strncpy (mstring, s, s1 - s);
- mstring[s1 - s] = '\0';
- return (ptr);
- } else if (ptr != NIL && (*cs & OPT)) {
-
- /* it was aoptional so no match is ok */
- return (ptr);
- } else if (ptr != NIL) {
-
- /* not optional and we still matched */
- return (NIL);
- }
- if (!(isalnum(*s1) || *s1 == '_' ||
- /* C++ destructor */
- *s1 == '~' ||
- /* C++ scope operator */
- (strlen(s1) > 1 && *s1 == ':' && s1[1] == ':' &&
- (s1++, TRUE))))
- return (NIL);
- if (*s1 == '\\')
- _escaped = _escaped ? FALSE : TRUE;
- else
- _escaped = FALSE;
- } while (*s1++);
- return (NIL);
-
- /* try to match anything */
- case 'a':
- /*
- * This is really the same as trying the match the
- * remaining parts of the expression to any subset
- * of the string.
- */
- s1 = s;
- do {
- ptr = expmatch (s1, MNEXT(cs), mstring);
- if (ptr != NIL && s1 != s) {
-
- /* we have a match */
- return (ptr);
- } else if (ptr != NIL && (*cs & OPT)) {
-
- /* it was aoptional so no match is ok */
- return (ptr);
- } else if (ptr != NIL) {
-
- /* not optional and we still matched */
- return (NIL);
- }
- if (*s1 == '\\')
- _escaped = _escaped ? FALSE : TRUE;
- else
- _escaped = FALSE;
- } while (*s1++);
- return (NIL);
-
- /* fail if we are currently _escaped */
- case 'e':
- if (_escaped)
- return(NIL);
- cs = MNEXT(cs);
- break;
-
- /* match any number of tabs and spaces */
- case 'd':
- ptr = s;
- while (*s == ' ' || *s == '\t')
- s++;
- if (s != ptr || s == s_start) {
-
- /* match, be happy */
- matched = 1;
- cs = MNEXT(cs);
- } else if (*s == '\n' || *s == '\0') {
-
- /* match, be happy */
- matched = 1;
- cs = MNEXT(cs);
- } else if (*cs & ALT) {
-
- /* try the next part */
- matched = 0;
- cs = MNEXT(cs);
- } else if (*cs & OPT) {
-
- /* doesn't matter */
- matched = 1;
- cs = MNEXT(cs);
- } else
-
- /* no match, error return */
- return (NIL);
- break;
-
- /* check for end of line */
- case '$':
- if (*s == '\0' || *s == '\n') {
-
- /* match, be happy */
- s++;
- matched = 1;
- cs = MNEXT(cs);
- } else if (*cs & ALT) {
-
- /* try the next part */
- matched = 0;
- cs = MNEXT(cs);
- } else if (*cs & OPT) {
-
- /* doesn't matter */
- matched = 1;
- cs = MNEXT(cs);
- } else
-
- /* no match, error return */
- return (NIL);
- break;
-
- /* check for start of line */
- case '^':
- if (s == s_start) {
-
- /* match, be happy */
- matched = 1;
- cs = MNEXT(cs);
- } else if (*cs & ALT) {
-
- /* try the next part */
- matched = 0;
- cs = MNEXT(cs);
- } else if (*cs & OPT) {
-
- /* doesn't matter */
- matched = 1;
- cs = MNEXT(cs);
- } else
-
- /* no match, error return */
- return (NIL);
- break;
-
- /* end of a subexpression, return success */
- case ')':
- return (s);
- }
- break;
- }
- }
- return (s);
-}
diff --git a/usr.bin/vgrind/tmac.vgrind b/usr.bin/vgrind/tmac.vgrind
deleted file mode 100644
index 4b906ea..0000000
--- a/usr.bin/vgrind/tmac.vgrind
+++ /dev/null
@@ -1,72 +0,0 @@
-.\" $FreeBSD$
-.am vS
-..
-.am vE
-..
-'ss 23
-'ds _ \d\(mi\u
-'ps 9z
-'vs 10p
-'ds - \(mi
-'ds / \\h'\\w' 'u-\\w'/'u'/
-'ds /* \\h'\\w' 'u-\\w'/'u'/*
-'bd B 3
-'bd S B 3
-'nr cm 0
-'nf
-'de vH
-'ev 2
-'ft 1
-'sp .35i
-'tl '\s14\f3\\*(=F\fP\s0'\\*(=H'\f3\s14\\*(=F\fP\s0'
-'sp .25i
-'ft 1
-\f2\s12\h'\\n(.lu-\w'\\*(=f'u'\\*(=f\fP\s0\h'|0u'
-.sp .05i
-'ev
-'ds =G \\*(=F
-..
-'de vF
-'ev 2
-'sp .35i
-'ie o 'tl '\f2\\*(=M''Page % of \\*(=G\fP'
-'el 'tl '\f2Page % of \\*(=G''\\*(=M\fP'
-'bp
-'ev
-'ft 1
-'if \\n(cm=1 'ft 2
-..
-'de ()
-'pn 1
-..
-'de +C
-'nr cm 1
-'ft 2
-'ds +K
-'ds -K
-..
-'de -C
-'nr cm 0
-'ft 1
-'ds +K \f3
-'ds -K \fP
-..
-'+C
-'-C
-'am +C
-'ne 3
-..
-'de FN
-\f2\s14\h'\\n(.lu-\w'\\$1'u'\\$1\fP\s0\h'|0u'\c
-.if r x .if \\nx .if d =F .tm \\$1 \\*(=F \\n%
-'ds =f \&...\\$1
-..
-'de FC
-.if r x .if \\nx .if d =F .tm \\$1 \\*(=F \\n%
-'ds =f \&...\\$1
-..
-'de -F
-'rm =f
-..
-'ft 1
-'lg 0
diff --git a/usr.bin/vgrind/vfontedpr.c b/usr.bin/vgrind/vfontedpr.c
deleted file mode 100644
index d1bb4d9..0000000
--- a/usr.bin/vgrind/vfontedpr.c
+++ /dev/null
@@ -1,727 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "@(#)vfontedpr.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <ctype.h>
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include "pathnames.h"
-#include "extern.h"
-
-#define FALSE 0
-#define TRUE !(FALSE)
-#define NIL 0
-#define STANDARD 0
-#define ALTERNATE 1
-
-/*
- * Vfontedpr.
- *
- * Dave Presotto 1/12/81 (adapted from an earlier version by Bill Joy)
- *
- */
-
-#define STRLEN 10 /* length of strings introducing things */
-#define PNAMELEN 40 /* length of a function/procedure name */
-#define PSMAX 20 /* size of procedure name stacking */
-
-static int iskw(char *);
-static boolean isproc(char *);
-static void putKcp(char *, char *, boolean);
-static void putScp(char *);
-static void putcp(int);
-static int tabs(char *, char *);
-static int width(char *, char *);
-
-/*
- * The state variables
- */
-
-static boolean filter = FALSE; /* act as a filter (like eqn) */
-static boolean inchr; /* in a string constant */
-static boolean incomm; /* in a comment of the primary type */
-static boolean idx = FALSE; /* form an index */
-static boolean instr; /* in a string constant */
-static boolean nokeyw = FALSE; /* no keywords being flagged */
-static boolean pass = FALSE; /*
- * when acting as a filter, pass indicates
- * whether we are currently processing
- * input.
- */
-
-static int blklevel; /* current nesting level */
-static int comtype; /* type of comment */
-static char * defsfile[2] = { _PATH_VGRINDEFS, 0 };
- /* name of language definitions file */
-static int margin;
-static int plstack[PSMAX]; /* the procedure nesting level stack */
-static char pname[BUFSIZ+1];
-static boolean prccont; /* continue last procedure */
-static int psptr; /* the stack index of the current procedure */
-static char pstack[PSMAX][PNAMELEN+1]; /* the procedure name stack */
-
-/*
- * The language specific globals
- */
-
-char *l_acmbeg; /* string introducing a comment */
-char *l_acmend; /* string ending a comment */
-char *l_blkbeg; /* string begining of a block */
-char *l_blkend; /* string ending a block */
-char *l_chrbeg; /* delimiter for character constant */
-char *l_chrend; /* delimiter for character constant */
-char *l_combeg; /* string introducing a comment */
-char *l_comend; /* string ending a comment */
-char l_escape; /* character used to escape characters */
-char *l_keywds[BUFSIZ/2]; /* keyword table address */
-char *l_nocom; /* regexp for non-comments */
-char *l_prcbeg; /* regular expr for procedure begin */
-char *l_strbeg; /* delimiter for string constant */
-char *l_strend; /* delimiter for string constant */
-boolean l_toplex; /* procedures only defined at top lex level */
-const char *language = "c"; /* the language indicator */
-
-#define ps(x) printf("%s", x)
-
-int
-main(argc, argv)
- int argc;
- char *argv[];
-{
- const char *fname = "";
- struct stat stbuf;
- char buf[BUFSIZ];
- char *defs;
- int needbp = 0;
-
- argc--, argv++;
- do {
- char *cp;
- int i;
-
- if (argc > 0) {
- if (!strcmp(argv[0], "-h")) {
- if (argc == 1) {
- printf("'ds =H\n");
- argc = 0;
- goto rest;
- }
- printf("'ds =H %s\n", argv[1]);
- argc--, argv++;
- argc--, argv++;
- if (argc > 0)
- continue;
- goto rest;
- }
-
- /* act as a filter like eqn */
- if (!strcmp(argv[0], "-f")) {
- filter++;
- argv[0] = argv[argc-1];
- argv[argc-1] = strdup("-");
- continue;
- }
-
- /* take input from the standard place */
- if (!strcmp(argv[0], "-")) {
- argc = 0;
- goto rest;
- }
-
- /* build an index */
- if (!strcmp(argv[0], "-x")) {
- idx++;
- argv[0] = strdup("-n");
- }
-
- /* indicate no keywords */
- if (!strcmp(argv[0], "-n")) {
- nokeyw++;
- argc--, argv++;
- continue;
- }
-
- /* specify the font size */
- if (!strncmp(argv[0], "-s", 2)) {
- i = 0;
- cp = argv[0] + 2;
- while (*cp)
- i = i * 10 + (*cp++ - '0');
- printf("'ps %d\n'vs %d\n", i, i+1);
- argc--, argv++;
- continue;
- }
-
- /* specify the language */
- if (!strncmp(argv[0], "-l", 2)) {
- language = argv[0]+2;
- argc--, argv++;
- continue;
- }
-
- /* specify the language description file */
- if (!strncmp(argv[0], "-d", 2)) {
- defsfile[0] = argv[1];
- argc--, argv++;
- argc--, argv++;
- continue;
- }
-
- /* open the file for input */
- if (freopen(argv[0], "r", stdin) == NULL)
- err(1, "%s", argv[0]);
- if (idx)
- printf("'ta 4i 4.25i 5.5iR\n'in .5i\n");
- fname = argv[0];
- argc--, argv++;
- }
- rest:
-
- /*
- * get the language definition from the defs file
- */
- i = cgetent(&defs, defsfile, language);
- if (i == -1) {
- fprintf (stderr, "no entry for language %s\n", language);
- exit (0);
- } else if (i == -2) { fprintf(stderr,
- "cannot find vgrindefs file %s\n", defsfile[0]);
- exit (0);
- } else if (i == -3) { fprintf(stderr,
- "potential reference loop detected in vgrindefs file %s\n",
- defsfile[0]);
- exit(0);
- }
- if (cgetustr(defs, "kw", &cp) == -1)
- nokeyw = TRUE;
- else {
- char **cpp;
-
- cpp = l_keywds;
- while (*cp) {
- while (*cp == ' ' || *cp =='\t')
- *cp++ = '\0';
- if (*cp)
- *cpp++ = cp;
- while (*cp != ' ' && *cp != '\t' && *cp)
- cp++;
- }
- *cpp = NIL;
- }
- cgetustr(defs, "pb", &cp);
- l_prcbeg = convexp(cp);
- cgetustr(defs, "cb", &cp);
- l_combeg = convexp(cp);
- cgetustr(defs, "ce", &cp);
- l_comend = convexp(cp);
- cgetustr(defs, "ab", &cp);
- l_acmbeg = convexp(cp);
- cgetustr(defs, "ae", &cp);
- l_acmend = convexp(cp);
- cgetustr(defs, "sb", &cp);
- l_strbeg = convexp(cp);
- cgetustr(defs, "se", &cp);
- l_strend = convexp(cp);
- cgetustr(defs, "bb", &cp);
- l_blkbeg = convexp(cp);
- cgetustr(defs, "be", &cp);
- l_blkend = convexp(cp);
- cgetustr(defs, "lb", &cp);
- l_chrbeg = convexp(cp);
- cgetustr(defs, "le", &cp);
- l_chrend = convexp(cp);
- if (cgetustr(defs, "nc", &cp) >= 0)
- l_nocom = convexp(cp);
- l_escape = '\\';
- l_onecase = (cgetcap(defs, "oc", ':') != NULL);
- l_toplex = (cgetcap(defs, "tl", ':') != NULL);
-
- /* initialize the program */
-
- incomm = FALSE;
- instr = FALSE;
- inchr = FALSE;
- _escaped = FALSE;
- blklevel = 0;
- for (psptr=0; psptr<PSMAX; psptr++) {
- pstack[psptr][0] = '\0';
- plstack[psptr] = 0;
- }
- psptr = -1;
- ps("'-F\n");
- if (!filter) {
- printf(".ds =F %s\n", fname);
- ps("'wh 0 vH\n");
- ps("'wh -1i vF\n");
- }
- if (needbp) {
- needbp = 0;
- printf(".()\n");
- printf(".bp\n");
- }
- if (!filter) {
- fstat(fileno(stdin), &stbuf);
- cp = ctime(&stbuf.st_mtime);
- cp[16] = '\0';
- cp[24] = '\0';
- printf(".ds =M %s %s\n", cp+4, cp+20);
- }
-
- /*
- * MAIN LOOP!!!
- */
- while (fgets(buf, sizeof buf, stdin) != NULL) {
- if (buf[0] == '\f') {
- printf(".bp\n");
- }
- if (buf[0] == '.') {
- printf("%s", buf);
- if (!strncmp (buf+1, "vS", 2))
- pass = TRUE;
- if (!strncmp (buf+1, "vE", 2))
- pass = FALSE;
- continue;
- }
- prccont = FALSE;
- if (!filter || pass)
- putScp(buf);
- else
- printf("%s", buf);
- if (prccont && (psptr >= 0)) {
- ps("'FC ");
- ps(pstack[psptr]);
- ps("\n");
- }
-#ifdef DEBUG
- printf ("com %o str %o chr %o ptr %d\n", incomm, instr, inchr, psptr);
-#endif
- margin = 0;
- }
- needbp = 1;
- } while (argc > 0);
- exit(0);
-}
-
-#define isidchr(c) (isalnum(c) || (c) == '_')
-
-static void
-putScp(os)
- char *os;
-{
- register char *s = os; /* pointer to unmatched string */
- char dummy[BUFSIZ]; /* dummy to be used by expmatch */
- char *comptr; /* end of a comment delimiter */
- char *acmptr; /* end of a comment delimiter */
- char *strptr; /* end of a string delimiter */
- char *chrptr; /* end of a character const delimiter */
- char *blksptr; /* end of a lexical block start */
- char *blkeptr; /* end of a lexical block end */
- char *nocomptr; /* end of a non-comment delimiter */
-
- s_start = os; /* remember the start for expmatch */
- _escaped = FALSE;
- if (nokeyw || incomm || instr)
- goto skip;
- if (isproc(s)) {
- ps("'FN ");
- ps(pname);
- ps("\n");
- if (psptr < PSMAX) {
- ++psptr;
- strncpy (pstack[psptr], pname, PNAMELEN);
- pstack[psptr][PNAMELEN] = '\0';
- plstack[psptr] = blklevel;
- }
- }
-skip:
- do {
- /* check for string, comment, blockstart, etc */
- if (!incomm && !instr && !inchr) {
-
- blkeptr = expmatch (s, l_blkend, dummy);
- blksptr = expmatch (s, l_blkbeg, dummy);
- comptr = expmatch (s, l_combeg, dummy);
- acmptr = expmatch (s, l_acmbeg, dummy);
- strptr = expmatch (s, l_strbeg, dummy);
- chrptr = expmatch (s, l_chrbeg, dummy);
- nocomptr = expmatch (s, l_nocom, dummy);
-
- /* start of non-comment? */
- if (nocomptr != NIL)
- if ((nocomptr <= comptr || comptr == NIL)
- && (nocomptr <= acmptr || acmptr == NIL)) {
- /* continue after non-comment */
- putKcp (s, nocomptr-1, FALSE);
- s = nocomptr;
- continue;
- }
-
- /* start of a comment? */
- if (comptr != NIL)
- if ((comptr < strptr || strptr == NIL)
- && (comptr < acmptr || acmptr == NIL)
- && (comptr < chrptr || chrptr == NIL)
- && (comptr < blksptr || blksptr == NIL)
- && (comptr < blkeptr || blkeptr == NIL)) {
- putKcp (s, comptr-1, FALSE);
- s = comptr;
- incomm = TRUE;
- comtype = STANDARD;
- if (s != os)
- ps ("\\c");
- ps ("\\c\n'+C\n");
- continue;
- }
-
- /* start of a comment? */
- if (acmptr != NIL)
- if ((acmptr < strptr || strptr == NIL)
- && (acmptr < chrptr || chrptr == NIL)
- && (acmptr < blksptr || blksptr == NIL)
- && (acmptr < blkeptr || blkeptr == NIL)) {
- putKcp (s, acmptr-1, FALSE);
- s = acmptr;
- incomm = TRUE;
- comtype = ALTERNATE;
- if (s != os)
- ps ("\\c");
- ps ("\\c\n'+C\n");
- continue;
- }
-
- /* start of a string? */
- if (strptr != NIL)
- if ((strptr < chrptr || chrptr == NIL)
- && (strptr < blksptr || blksptr == NIL)
- && (strptr < blkeptr || blkeptr == NIL)) {
- putKcp (s, strptr-1, FALSE);
- s = strptr;
- instr = TRUE;
- continue;
- }
-
- /* start of a character string? */
- if (chrptr != NIL)
- if ((chrptr < blksptr || blksptr == NIL)
- && (chrptr < blkeptr || blkeptr == NIL)) {
- putKcp (s, chrptr-1, FALSE);
- s = chrptr;
- inchr = TRUE;
- continue;
- }
-
- /* end of a lexical block */
- if (blkeptr != NIL) {
- if (blkeptr < blksptr || blksptr == NIL) {
- putKcp (s, blkeptr - 1, FALSE);
- s = blkeptr;
- if (blklevel > 0 /* sanity */)
- blklevel--;
- if (psptr >= 0 && plstack[psptr] >= blklevel) {
-
- /* end of current procedure */
- if (s != os)
- ps ("\\c");
- ps ("\\c\n'-F\n");
- blklevel = plstack[psptr];
-
- /* see if we should print the last proc name */
- if (--psptr >= 0)
- prccont = TRUE;
- else
- psptr = -1;
- }
- continue;
- }
- }
-
- /* start of a lexical block */
- if (blksptr != NIL) {
- putKcp (s, blksptr - 1, FALSE);
- s = blksptr;
- blklevel++;
- continue;
- }
-
- /* check for end of comment */
- } else if (incomm) {
- comptr = expmatch (s, l_comend, dummy);
- acmptr = expmatch (s, l_acmend, dummy);
- if (((comtype == STANDARD) && (comptr != NIL)) ||
- ((comtype == ALTERNATE) && (acmptr != NIL))) {
- if (comtype == STANDARD) {
- putKcp (s, comptr-1, TRUE);
- s = comptr;
- } else {
- putKcp (s, acmptr-1, TRUE);
- s = acmptr;
- }
- incomm = FALSE;
- ps("\\c\n'-C\n");
- continue;
- } else {
- putKcp (s, s + strlen(s) -1, TRUE);
- s = s + strlen(s);
- continue;
- }
-
- /* check for end of string */
- } else if (instr) {
- if ((strptr = expmatch (s, l_strend, dummy)) != NIL) {
- putKcp (s, strptr-1, TRUE);
- s = strptr;
- instr = FALSE;
- continue;
- } else {
- putKcp (s, s+strlen(s)-1, TRUE);
- s = s + strlen(s);
- continue;
- }
-
- /* check for end of character string */
- } else if (inchr) {
- if ((chrptr = expmatch (s, l_chrend, dummy)) != NIL) {
- putKcp (s, chrptr-1, TRUE);
- s = chrptr;
- inchr = FALSE;
- continue;
- } else {
- putKcp (s, s+strlen(s)-1, TRUE);
- s = s + strlen(s);
- continue;
- }
- }
-
- /* print out the line */
- putKcp (s, s + strlen(s) -1, FALSE);
- s = s + strlen(s);
- } while (*s);
-}
-
-static void
-putKcp (start, end, force)
- char *start; /* start of string to write */
- char *end; /* end of string to write */
- boolean force; /* true if we should force nokeyw */
-{
- int i;
- int xfld = 0;
-
- while (start <= end) {
- if (idx) {
- if (*start == ' ' || *start == '\t') {
- if (xfld == 0)
- printf("\001");
- printf("\t");
- xfld = 1;
- while (*start == ' ' || *start == '\t')
- start++;
- continue;
- }
- }
-
- /* take care of nice tab stops */
- if (*start == '\t') {
- while (*start == '\t')
- start++;
- i = tabs(s_start, start) - margin / 8;
- printf("\\h'|%dn'", i * 10 + 1 - margin % 8);
- continue;
- }
-
- if (!nokeyw && !force)
- if ((*start == '#' || isidchr(*start))
- && (start == s_start || !isidchr(start[-1]))) {
- i = iskw(start);
- if (i > 0) {
- ps("\\*(+K");
- do
- putcp((unsigned char)*start++);
- while (--i > 0);
- ps("\\*(-K");
- continue;
- }
- }
-
- putcp ((unsigned char)*start++);
- }
-}
-
-
-static int
-tabs(s, os)
- char *s, *os;
-{
-
- return (width(s, os) / 8);
-}
-
-static int
-width(s, os)
- register char *s, *os;
-{
- register int i = 0;
-
- while (s < os) {
- if (*s == '\t') {
- i = (i + 8) &~ 7;
- s++;
- continue;
- }
- if (*s < ' ')
- i += 2;
- else
- i++;
- s++;
- }
- return (i);
-}
-
-static void
-putcp(c)
- register int c;
-{
-
- switch(c) {
-
- case 0:
- break;
-
- case '\f':
- break;
-
- case '\r':
- break;
-
- case '{':
- ps("\\*(+K{\\*(-K");
- break;
-
- case '}':
- ps("\\*(+K}\\*(-K");
- break;
-
- case '\\':
- ps("\\e");
- break;
-
- case '_':
- ps("\\*_");
- break;
-
- case '-':
- ps("\\*-");
- break;
-
- case '`':
- ps("\\`");
- break;
-
- case '\'':
- ps("\\'");
- break;
-
- case '.':
- ps("\\&.");
- break;
-
- case '*':
- ps("\\fI*\\fP");
- break;
-
- case '/':
- ps("\\fI\\h'\\w' 'u-\\w'/'u'/\\fP");
- break;
-
- default:
- if (c < 040)
- putchar('^'), c |= '@';
- case '\t':
- case '\n':
- putchar(c);
- }
-}
-
-/*
- * look for a process beginning on this line
- */
-static boolean
-isproc(s)
- char *s;
-{
- pname[0] = '\0';
- if (!l_toplex || blklevel == 0)
- if (expmatch (s, l_prcbeg, pname) != NIL) {
- return (TRUE);
- }
- return (FALSE);
-}
-
-
-/* iskw - check to see if the next word is a keyword
- */
-
-static int
-iskw(s)
- register char *s;
-{
- register char **ss = l_keywds;
- register int i = 1;
- register char *cp = s;
-
- while (++cp, isidchr(*cp))
- i++;
- while ((cp = *ss++))
- if (!STRNCMP(s,cp,i) && !isidchr(cp[i]))
- return (i);
- return (0);
-}
-
diff --git a/usr.bin/vgrind/vgrind.1 b/usr.bin/vgrind/vgrind.1
deleted file mode 100644
index b5d5a89..0000000
--- a/usr.bin/vgrind/vgrind.1
+++ /dev/null
@@ -1,246 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)vgrind.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd August 29, 2006
-.Dt VGRIND 1
-.Os
-.Sh NAME
-.Nm vgrind
-.Nd grind nice listings of programs
-.Sh SYNOPSIS
-.Nm
-.Op Fl
-.Op Fl W
-.Op Fl d Ar file
-.Op Fl f
-.Op Fl h Ar header
-.Op Fl l Ns Ar language
-.Op Fl n
-.Op Fl p Ar postproc
-.Op Fl s Ar pointsize
-.Op Fl t
-.Op Fl x
-.Ar name Ar ...
-.Sh DESCRIPTION
-The
-.Nm
-utility formats the program sources specified as arguments
-on the command line in a nice style using
-.Xr troff 1 .
-Comments are placed in italics, keywords in bold face,
-and the name of the current function is listed down the margin of each
-page as it is encountered.
-.Pp
-The
-.Nm
-utility runs in two basic modes, filter mode (see the
-.Fl f
-option) or regular mode.
-In filter mode
-.Nm
-acts as a filter in a manner similar to
-.Xr tbl 1 .
-The standard input is passed directly to the standard output except
-for lines bracketed by the
-.Em troff-like
-macros:
-.Bl -tag -width Ds
-.It \&.vS
-starts processing
-.It \&.vE
-ends processing
-.El
-.Pp
-These lines are formatted as described above.
-The output from this
-filter can be passed to
-.Xr troff 1
-for output.
-There need be no particular ordering with
-.Xr eqn 1
-or
-.Xr tbl 1 .
-.Pp
-In regular mode
-.Nm
-accepts input files, processes them, and passes them to the postprocessor
-for output,
-.Xr psroff 1
-by default.
-.Pp
-In both modes
-.Nm
-passes any lines beginning with a decimal point without conversion.
-.Pp
-The options are:
-.Bl -tag -width Ar
-.It Fl
-forces input to be taken from standard input (default if
-.Fl f
-is specified)
-.It Fl W
-forces output to the (wide) Versatec printer rather than the (narrow)
-Varian
-.It Fl d Ar file
-specifies an alternate language definitions
-file (default is
-.Pa /usr/share/misc/vgrindefs )
-.It Fl f
-forces filter mode
-.It Fl h Ar header
-specifies a particular header to put on every output page (default is
-the file name)
-.It Fl l
-specifies the language to use.
-Currently known are
-.Tn PASCAL
-.Pq Fl l Ns Ar p ,
-.Tn MODEL
-.Pq Fl l Ns Ar m ,
-C
-.Pf ( Fl l Ns Ar c
-or the default),
-.Tn C++
-.Pq Fl l Ns Ar c++ ,
-.Tn CSH
-.Pq Fl l Ns Ar csh ,
-.Tn SHELL
-.Pq Fl l Ns Ar sh ,
-.Tn RATFOR
-.Pq Fl l Ns Ar r ,
-.Tn MODULA2
-.Pq Fl l Ns Ar mod2 ,
-.Tn YACC
-.Pq Fl l Ns Ar yacc ,
-.Tn LISP
-.Pq Fl l Ns Ar isp ,
-.Tn ICON
-.Pq Fl l Ns Ar I ,
-and
-.Tn PERL
-.Pq Fl l Ns Ar perl .
-.It Fl n
-forces no keyword bolding
-.It Fl p Ar postproc
-use
-.Ar postproc
-to post-process the output,
-.Xr psroff 1
-by default.
-.It Fl s Ar pointsize
-specifies a point size to use on output (exactly the same as the argument
-of a .ps)
-.It Fl t
-similar to the same option in
-.Xr troff 1
-causing formatted text to go to the standard output
-.It Fl x
-outputs the index file in a ``pretty'' format.
-The index file itself is produced whenever
-.Nm
-is run with a file called
-.Pa index
-in the current directory.
-The index of function
-definitions can then be run off by giving
-.Nm
-the
-.Fl x
-option and the file
-.Pa index
-as argument.
-.El
-.Sh FILES
-.Bl -tag -width /usr/share/misc/vgrindefsxx -compact
-.It Pa index
-file where source for index is created
-.It Pa /usr/share/tmac/tmac.vgrind
-macro package
-.It Pa /usr/libexec/vfontedpr
-preprocessor
-.It Pa /usr/share/misc/vgrindefs
-language descriptions
-.El
-.Sh SEE ALSO
-.Xr getcap 3 ,
-.Xr vgrindefs 5
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3.0 .
-.Sh BUGS
-The vfontedpr preprocessor assumes that a certain programming style is
-followed:
-.Pp
-For
-.Tn C
-\- function names can be preceded on a line only by spaces, tabs, or an
-asterisk.
-The parenthesized arguments must also be on the same line.
-.Pp
-For
-.Tn PASCAL
-\- function names need to appear on the same line as the keywords
-.Em function
-or
-.Em procedure .
-.Pp
-For
-.Tn MODEL
-\- function names need to appear on the same line as the keywords
-.Em is beginproc .
-.Pp
-If these conventions are not followed, the indexing and marginal function
-name comment mechanisms will fail.
-.Pp
-More generally, arbitrary formatting styles for programs mostly look bad.
-The use of spaces to align source code fails miserably; if you plan to
-.Nm
-your program you should use tabs.
-This is somewhat inevitable since the
-font used by
-.Nm
-is variable width.
-.Pp
-The mechanism of
-.Xr ctags 1
-in recognizing functions should be used here.
-.Pp
-Filter mode does not work in documents using the
-.Fl me
-or
-.Fl ms
-macros.
-(So what use is it anyway?)
diff --git a/usr.bin/vgrind/vgrind.sh b/usr.bin/vgrind/vgrind.sh
deleted file mode 100644
index bfc2f1b..0000000
--- a/usr.bin/vgrind/vgrind.sh
+++ /dev/null
@@ -1,135 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 1980, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 4. Neither the name of the University nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# @(#)vgrind.sh 8.1 (Berkeley) 6/6/93
-#
-# $FreeBSD$
-#
-
-voptions=""
-options=""
-files=""
-f=""
-head=""
-vf="/usr/libexec/vfontedpr"
-tm="/usr/share/tmac"
-postproc="psroff"
-
-# Parse args
-while test $# -gt 0; do
- case $1 in
- -f)
- f="filter"
- options="$options -f"
- ;;
- -t)
- voptions="$voptions -t"
- ;;
- -o*)
- voptions="$voptions $1"
- ;;
- -W)
- voptions="$voptions -W"
- ;;
- -d)
- if test $# -lt 2; then
- echo "$0: option $1 must have argument" >&2
- exit 1
- fi
- options="$options $1 $2"
- shift
- ;;
- -h)
- if test $# -lt 2; then
- echo "$0: option $1 must have argument" >&2
- exit 1
- fi
- head="$2"
- shift
- ;;
- -p)
- if test $# -lt 2; then
- echo "$0: option $1 must have argument" >&2
- exit 1
- fi
- postproc="$2"
- shift
- ;;
- -*)
- options="$options $1"
- ;;
- *)
- files="$files $1"
- ;;
- esac
- shift
-done
-
-if test -r index; then
- echo > nindex
- for i in $files; do
- # make up a sed delete command for filenames
- # being careful about slashes.
- echo "? $i ?d" | sed -e "s:/:\\/:g" -e "s:?:/:g" >> nindex
- done
- sed -f nindex index > xindex
- if test "x$f" = xfilter; then
- if test "x$head" != x; then
- $vf $options -h "$head" $files
- else
- $vf $options $files
- fi | cat $tm/tmac.vgrind -
- else
- if test "x$head" != x; then
- $vf $options -h "$head" $files
- else
- $vf $options $files
- fi | sh -c "$postproc -rx1 $voptions -i -mvgrind 2>> xindex"
- fi
- sort -df -k 1,2 xindex > index
- rm nindex xindex
-else
- if test "x$f" = xfilter; then
- if test "x$head" != x; then
- $vf $options -h "$head" $files
- else
- $vf $options $files
- fi | cat $tm/tmac.vgrind -
- else
- if test "x$head" != x; then
- $vf $options -h "$head" $files
- else
- $vf $options $files
- fi | $postproc -i $voptions -mvgrind
- fi
-fi
diff --git a/usr.bin/vgrind/vgrindefs.5 b/usr.bin/vgrind/vgrindefs.5
deleted file mode 100644
index 8818940..0000000
--- a/usr.bin/vgrind/vgrindefs.5
+++ /dev/null
@@ -1,175 +0,0 @@
-.\" Copyright (c) 1989, 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)vgrindefs.5 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 6, 1993
-.Dt VGRINDEFS 5
-.Os
-.Sh NAME
-.Nm vgrindefs
-.Nd language definition data base for
-.Xr vgrind 1
-.Sh SYNOPSIS
-.Nm
-.Sh DESCRIPTION
-The
-.Nm
-file
-contains all language definitions for
-.Xr vgrind 1 .
-The data base is
-very similar to
-.Xr termcap 5 .
-.Sh FIELDS
-The following table names and describes each field.
-.Pp
-.Bl -column Namexxx Tpexxx
-.It Sy "Name Type Description
-.It "ab str regular expression for the start of an alternate comment"
-.It "ae str regular expression for the end of an alternate comment"
-.It "pb str regular expression for start of a procedure"
-.It "bb str regular expression for start of a lexical block"
-.It "be str regular expression for the end of a lexical block"
-.It "cb str regular expression for the start of a comment"
-.It "ce str regular expression for the end of a comment"
-.It "sb str regular expression for the start of a string"
-.It "se str regular expression for the end of a string"
-.It "lb str regular expression for the start of a character constant"
-.It "le str regular expression for the end of a character constant"
-.It "nc str regular expression for a non-comment (see below)"
-.It "tl bool present means procedures are only defined at the top lexical level"
-.It "oc bool present means upper and lower case are equivalent"
-.It "kw str a list of keywords separated by spaces"
-.El
-.Pp
-Non-comments are required to describe a certain context where a
-sequence that would normally start a comment loses its special
-meaning.
-A typical example for this can be found in Perl, where
-comments are normally starting with
-.Ql # ,
-while the string
-.Ql $#
-is an operator on an array.
-.Sh REGULAR EXPRESSIONS
-.Nm Vgrindefs
-uses regular expression which are very similar to those of
-.Xr ex 1
-and
-.Xr lex 1 .
-The characters `^', `$', `:' and `\e'
-are reserved characters and must be
-"quoted" with a preceding
-.Ql \e
-if they
-are to be included as normal characters.
-The metasymbols and their meanings are:
-.Bl -tag -width indent
-.It $
-the end of a line
-.It \&^
-the beginning of a line
-.It \ed
-a delimiter (space, tab, newline, start of line)
-.It \ea
-matches any string of symbols (like .* in lex)
-.It \ep
-matches any alphanumeric name.
-In a procedure definition (pb) the string
-that matches this symbol is used as the procedure name.
-.It ()
-grouping
-.It \&|
-alternation
-.It ?
-last item is optional
-.It \ee
-preceding any string means that the string will not match an
-input string if the input string is preceded by an escape character (\e).
-This is typically used for languages (like C) which can include the
-string delimiter in a string by escaping it.
-.El
-.Pp
-Unlike other regular expressions in the system, these match words
-and not characters.
-Hence something like "(tramp|steamer)flies?"
-would match "tramp", "steamer", "trampflies", or "steamerflies".
-.Sh KEYWORD LIST
-The keyword list is just a list of keywords in the language separated
-by spaces.
-If the "oc" boolean is specified, indicating that upper
-and lower case are equivalent, then all the keywords should be
-specified in lower case.
-.Sh FILES
-.Bl -tag -width /usr/share/misc/vgrindefs -compact
-.It Pa /usr/share/misc/vgrindefs
-File containing terminal descriptions.
-.El
-.Sh EXAMPLES
-The following entry, which describes the C language, is
-typical of a language entry.
-.Bd -literal
-C|c:\
-:pb=^\ed?*?\ed?\ep\ed?\e(\ea?\e):bb={:be=}:cb=/*:ce=*/:sb=":se=\ee":\e
-:lb=':le=\ee':tl:\e
-:kw=asm auto break case char continue default do double else enum\e
-extern float for fortran goto if int long register return short\e
-sizeof static struct switch typedef union unsigned while #define\e
-#else #endif #if #ifdef #ifndef #include #undef # define else endif\e
-if ifdef ifndef include undef:
-.Ed
-.Pp
-Note that the first field is just the language name (and any variants
-of it).
-Thus the C language could be specified to
-.Xr vgrind 1
-as "c" or "C".
-.Pp
-Entries may continue onto multiple lines by giving a \e as the last
-character of a line.
-Capabilities in
-.Nm
-are of two types:
-Boolean capabilities which indicate that the language has
-some particular feature
-and string
-capabilities which give a regular expression or
-keyword list.
-.Sh SEE ALSO
-.Xr troff 1 ,
-.Xr vgrind 1
-.Sh HISTORY
-The
-.Nm
-file format appeared in
-.Bx 4.2 .
diff --git a/usr.bin/vgrind/vgrindefs.c b/usr.bin/vgrind/vgrindefs.c
deleted file mode 100644
index c3d7711..0000000
--- a/usr.bin/vgrind/vgrindefs.c
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#define BUFSIZ 1024
-#define MAXHOP 32 /* max number of tc= indirections */
-
-#include <ctype.h>
-#include <unistd.h>
-
-/*
- * grindcap - routines for dealing with the language definitions data base
- * (code stolen almost totally from termcap)
- *
- * BUG: Should use a "last" pointer in tbuf, so that searching
- * for capabilities alphabetically would not be a n**2/2
- * process when large numbers of capabilities are given.
- * Note: If we add a last pointer now we will screw up the
- * tc capability. We really should compile termcap.
- *
- * Essentially all the work here is scanning and decoding escapes
- * in string capabilities. We don't use stdio because the editor
- * doesn't, and because living w/o it is not hard.
- */
-
-static char *tbuf;
-static char *filename;
-static int hopcount; /* detect infinite loops in termcap, init 0 */
-char *tskip();
-char *tgetstr();
-char *tdecode();
-char *getenv();
-
-/*
- * Get an entry for terminal name in buffer bp,
- * from the termcap file. Parse is very rudimentary;
- * we just notice escaped newlines.
- */
-tgetent(bp, name, file)
- char *bp, *name, *file;
-{
- register char *cp;
- register int c;
- register int i = 0, cnt = 0;
- char ibuf[BUFSIZ];
- char *cp2;
- int tf;
-
- tbuf = bp;
- tf = 0;
- filename = file;
- tf = open(filename, 0);
- if (tf < 0)
- return (-1);
- for (;;) {
- cp = bp;
- for (;;) {
- if (i == cnt) {
- cnt = read(tf, ibuf, BUFSIZ);
- if (cnt <= 0) {
- close(tf);
- return (0);
- }
- i = 0;
- }
- c = ibuf[i++];
- if (c == '\n') {
- if (cp > bp && cp[-1] == '\\'){
- cp--;
- continue;
- }
- break;
- }
- if (cp >= bp+BUFSIZ) {
- write(STDERR_FILENO, "Vgrind entry too long\n", 23);
- break;
- } else
- *cp++ = c;
- }
- *cp = 0;
-
- /*
- * The real work for the match.
- */
- if (tnamatch(name)) {
- close(tf);
- return(tnchktc());
- }
- }
-}
-
-/*
- * tnchktc: check the last entry, see if it's tc=xxx. If so,
- * recursively find xxx and append that entry (minus the names)
- * to take the place of the tc=xxx entry. This allows termcap
- * entries to say "like an HP2621 but doesn't turn on the labels".
- * Note that this works because of the left to right scan.
- */
-tnchktc()
-{
- register char *p, *q;
- char tcname[16]; /* name of similar terminal */
- char tcbuf[BUFSIZ];
- char *holdtbuf = tbuf;
- int l;
-
- p = tbuf + strlen(tbuf) - 2; /* before the last colon */
- while (*--p != ':')
- if (p<tbuf) {
- write(STDERR_FILENO, "Bad vgrind entry\n", 18);
- return (0);
- }
- p++;
- /* p now points to beginning of last field */
- if (p[0] != 't' || p[1] != 'c')
- return(1);
- strcpy(tcname,p+3);
- q = tcname;
- while (q && *q != ':')
- q++;
- *q = 0;
- if (++hopcount > MAXHOP) {
- write(STDERR_FILENO, "Infinite tc= loop\n", 18);
- return (0);
- }
- if (tgetent(tcbuf, tcname, filename) != 1)
- return(0);
- for (q=tcbuf; *q != ':'; q++)
- ;
- l = p - holdtbuf + strlen(q);
- if (l > BUFSIZ) {
- write(STDERR_FILENO, "Vgrind entry too long\n", 23);
- q[BUFSIZ - (p-tbuf)] = 0;
- }
- strcpy(p, q+1);
- tbuf = holdtbuf;
- return(1);
-}
-
-/*
- * Tnamatch deals with name matching. The first field of the termcap
- * entry is a sequence of names separated by |'s, so we compare
- * against each such name. The normal : terminator after the last
- * name (before the first field) stops us.
- */
-tnamatch(np)
- char *np;
-{
- register char *Np, *Bp;
-
- Bp = tbuf;
- if (*Bp == '#')
- return(0);
- for (;;) {
- for (Np = np; *Np && *Bp == *Np; Bp++, Np++)
- continue;
- if (*Np == 0 && (*Bp == '|' || *Bp == ':' || *Bp == 0))
- return (1);
- while (*Bp && *Bp != ':' && *Bp != '|')
- Bp++;
- if (*Bp == 0 || *Bp == ':')
- return (0);
- Bp++;
- }
-}
-
-/*
- * Skip to the next field. Notice that this is very dumb, not
- * knowing about \: escapes or any such. If necessary, :'s can be put
- * into the termcap file in octal.
- */
-static char *
-tskip(bp)
- register char *bp;
-{
-
- while (*bp && *bp != ':')
- bp++;
- if (*bp == ':')
- bp++;
- return (bp);
-}
-
-/*
- * Return the (numeric) option id.
- * Numeric options look like
- * li#80
- * i.e. the option string is separated from the numeric value by
- * a # character. If the option is not found we return -1.
- * Note that we handle octal numbers beginning with 0.
- */
-tgetnum(id)
- char *id;
-{
- register int i, base;
- register char *bp = tbuf;
-
- for (;;) {
- bp = tskip(bp);
- if (*bp == 0)
- return (-1);
- if (*bp++ != id[0] || *bp == 0 || *bp++ != id[1])
- continue;
- if (*bp == '@')
- return(-1);
- if (*bp != '#')
- continue;
- bp++;
- base = 10;
- if (*bp == '0')
- base = 8;
- i = 0;
- while (isdigit(*bp))
- i *= base, i += *bp++ - '0';
- return (i);
- }
-}
-
-/*
- * Handle a flag option.
- * Flag options are given "naked", i.e. followed by a : or the end
- * of the buffer. Return 1 if we find the option, or 0 if it is
- * not given.
- */
-tgetflag(id)
- char *id;
-{
- register char *bp = tbuf;
-
- for (;;) {
- bp = tskip(bp);
- if (!*bp)
- return (0);
- if (*bp++ == id[0] && *bp != 0 && *bp++ == id[1]) {
- if (!*bp || *bp == ':')
- return (1);
- else if (*bp == '@')
- return(0);
- }
- }
-}
-
-/*
- * Get a string valued option.
- * These are given as
- * cl=^Z
- * Much decoding is done on the strings, and the strings are
- * placed in area, which is a ref parameter which is updated.
- * No checking on area overflow.
- */
-char *
-tgetstr(id, area)
- char *id, **area;
-{
- register char *bp = tbuf;
-
- for (;;) {
- bp = tskip(bp);
- if (!*bp)
- return (0);
- if (*bp++ != id[0] || *bp == 0 || *bp++ != id[1])
- continue;
- if (*bp == '@')
- return(0);
- if (*bp != '=')
- continue;
- bp++;
- return (tdecode(bp, area));
- }
-}
-
-/*
- * Tdecode does the grung work to decode the
- * string capability escapes.
- */
-static char *
-tdecode(str, area)
- register char *str;
- char **area;
-{
- register char *cp;
- register int c;
- int i;
-
- cp = *area;
- while (c = *str++) {
- if (c == ':' && *(cp-1) != '\\')
- break;
- *cp++ = c;
- }
- *cp++ = 0;
- str = *area;
- *area = cp;
- return (str);
-}
diff --git a/usr.bin/vgrind/vgrindefs.src b/usr.bin/vgrind/vgrindefs.src
deleted file mode 100644
index c19e836..0000000
--- a/usr.bin/vgrind/vgrindefs.src
+++ /dev/null
@@ -1,159 +0,0 @@
-# Copyright (c) 1987, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 4. Neither the name of the University nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# @(#)vgrindefs.src 8.1 (Berkeley) 6/6/93
-#
-
-C|c:\
- :pb=^\a?\d?*?\d?\p\d?\(\a?\)(\d|{):\
- :bb={:be=}:cb=/*:ce=*/:sb=":se=\e":lb=':\
- :le=\e':tl:\
- :kw=asm auto break case char continue default do double else enum\
- extern float for fortran goto if int long register return short\
- sizeof static struct switch typedef union unsigned void while #define\
- #else #endif #if #ifdef #ifndef #include #undef # define else endif\
- if ifdef ifndef include undef:
-model|mod|m:\
- :pb=^\d(space\d\p\drep)|(\p\dis|inline|public\dbeginproc):\
- :bb=\dbeginproc|space|case\d:be=\dendproc|end\d|;:\
- :cb=\$:ce=\$|$:sb=":se=":lb=':le=\a|$:\
- :kw=abs and array beginproc boolean by case cdnl char copied dispose\
- div do dynamic else elsif end endproc entry external FALSE false\
- fi file for formal fortran global if iff ift\
- in integer include inline is lbnd\
- max min mod new NIL nil noresult not notin od of or procedure public\
- read readln readonly record recursive rem rep repeat res\
- result return set\
- space string subscript such then TRUE true type ubnd union until\
- varies while width:
-pascal|pasc|p:\
- :pb=(^\d?procedure|function|program\d\p\d|\(|;|\:)|(=\d?record\d):\
- :bb=\dcase|begin\d:be=\dend|forward\d|;:\
- :cb={:ce=}:\
- :ab=\(*:ae=*\):\
- :sb=':se=':\
- :kw=and array assert begin case const div do downto else end file for\
- forward function goto if in label mod nil not of or packed procedure\
- program record repeat set then to type until var while with oct hex\
- external:
-ISP|isp|i:\
- :cb=!:ce=!|$:oc:\
- :kw=and begin decode define end eql eqv geq gtr if leave leq lss mod\
- neq next not or otherwise repeat restart resume sr0 sr1 srd srr sl0 sl1\
- sld slr tst xor:
-SH|sh:\
- :bb={:be=}:cb=#:ce=$:sb=":se=\e":lb=':\
- :le=\e':tl:\
- :kw=break case cd continue do done \
- elif else esac eval exec exit export \
- fi for if in then while until \
- read readonly set shift test trap umask wait:
-CSH|csh:\
- :bb={:be=}:cb=#:ce=$:sb=":se=\e":lb=':\
- :le=\e':tl:\
- :kw=alias alloc break breaksw case cd chdir continue default\
- echo else end endif endsw exec exit foreach \
- glob goto history if logout nice nohup onintr repeat set\
- setenv shift source switch then time \
- while umask unalias unset wait while @ env \
- argv child home ignoreeof noclobber noglob \
- nomatch path prompt shell status verbose :
-ldl|LDL:\
- :pb=^\p\::bb=\::be=;:cb=/*:ce=*/:sb=":se=\e":\
- :kw=constant functions grammar reswords tokens add1 addste\
- car cdr check colno cond cons copy defun divide empty enter\
- eq equal findattr firstchild ge getattr getfield gt hash label\
- lambda lastchild le leftsibling lookone lookup lt minus name ne\
- newnode nextcom nil null parent plus precnl prevcom prog progn\
- quote reglob return rightsibling self set setattr setfield setq\
- stjoin sub1 t times tnull tokno ttype:
-Icon|icon|I:\
- :pb=^\d?procedure\d\p\d?\(\a?\):\
- :bb=(^\d?procedure\d\p\d?\(\a?\))|{:be=}|(^\d?end\d?$):\
- :cb=#:ce=$:\
- :sb=":se=\e":lb=':le=\e':tl:\
- :kw=break by case create default do dynamic else end every external\
- fail global if initial local next not of procedure record\
- repeat return static suspend then to until using while\
- &ascii &clock &cset &date &dateline &errout &fail &host &input\
- &lcase &level &main &null &output &pos &random &source &subject\
- &time &trace &ucase &version:
-ratfor|rat|r:\
- :pb=(subroutine|function)\d\p\d?\(\a?\):\
- :bb=(subroutine|function)\d\p\d?\(\a?\):be=^\d?end:\
- :cb=#:ce=$:\
- :sb=":se=\e":lb=':le=\e':oc:\
- :kw=DRETURN DRIVER arith break case character default define do\
- else elsedef enddef filedes for function goto if ifdef ifelse\
- ifnotdef include incr integer linepointer next opeq pointer\
- real repeat return select string subroutine substr until:
-modula2|mod2|m2:\
- :pb=(^\d?(procedure|function|module)\d\p\d|\(|;|\:):\
- :bb=\d(begin|case|for|if|loop|record|repeat|while|with)\d:\
- :be=\dend|;:\
- :cb={:ce=}:\
- :ab=\(*:ae=*\):\
- :sb=":se=":\
- :oc:\
- :kw=and array begin by case const\
- definition div do else elsif end exit export\
- for from if implementation import in\
- loop mod module not of or pointer procedure qualified\
- record repeat return set then to type\
- until var while with:
-yacc|Yacc|y:\
- :cb=/*:ce=*/:sb=":se=\e":lb=':le=\e':tl:\
- :kw=%{ %} %% %union %token %type\
- #else #endif #if #ifdef #ifndef #include #undef # define else endif\
- if ifdef ifndef include undef:
-C++|c++:\
- :pb=^\a?\d?*?\d?\p\d?\(\a?\)(\d|{):\
- :bb={:be=}:cb=/*:ce=*/:ab=//:\
- :ae=$:sb=":se=\e":lb=':\
- :le=\e':tl:\
- :kw=asm auto break case char continue default do double else enum\
- extern float for fortran goto if int long register return short\
- sizeof static struct switch typedef union unsigned while void #define\
- #else #endif #if #ifdef #ifndef #include #undef # define endif\
- ifdef ifndef include undef defined\
- class const delete friend inline new operator overload private\
- protected public virtual:
-#
-# Hack alert: defining function calls as `alternate comments' (ab/ae) seems
-# to be the only way to avoid major confusion inside vfontedpr for calls like:
-# &packagename'function;
-#
-Perl|perl|pl:\
- :pb=sub\d\p\d:bb={:be=}:cb=#:ce=$:nc=\$#:tl:\
- :ab=&:ae=(;|\d|,):\
- :sb=":se=(\e"|$):lb=':le=(\e'|$):\
- :kw=do if unless while until else elsif for foreach continue\
- next redo sub last goto return die exit require:
diff --git a/usr.bin/vi/Makefile b/usr.bin/vi/Makefile
deleted file mode 100644
index 7276b7b..0000000
--- a/usr.bin/vi/Makefile
+++ /dev/null
@@ -1,110 +0,0 @@
-#
-# $FreeBSD$
-#
-
-SRCDIR= ${.CURDIR}/../../contrib/nvi
-
-CFLAGS+= -DGTAGS
-
-#if using ncurses:
-CFLAGS+= -DSYSV_CURSES
-
-VI= nvi
-EX= nex
-VIEW= nview
-
-PROG= nvi
-
-LINKS= ${BINDIR}/${VI} ${BINDIR}/${EX} ${BINDIR}/${VI} ${BINDIR}/${VIEW}
-LINKS+= ${BINDIR}/${VI} ${BINDIR}/vi ${BINDIR}/${EX} ${BINDIR}/ex
-LINKS+= ${BINDIR}/${VI} ${BINDIR}/view
-
-MAN= ${SRCDIR}/docs/USD.doc/vi.man/vi.1
-MLINKS+=vi.1 ex.1 vi.1 view.1
-MLINKS+=vi.1 nex.1 vi.1 nview.1 vi.1 nvi.1
-
-CATALOGS= dutch english french german polish ru_RU.KOI8-R spanish swedish \
- uk_UA.KOI8-U
-NLLINKS= nl_NL
-ENLINKS= en_AU en_CA en_GB en_NZ en_US
-FRLINKS= fr_BE fr_CA fr_CH fr_FR
-DELINKS= de_AT de_CH de_DE
-ESLINKS= es_ES
-SVLINKS= sv_SE
-PLLINKS= pl_PL
-
-.PATH: ${SRCDIR}/common
-.PATH: ${SRCDIR}/ex
-.PATH: ${SRCDIR}/cl
-.PATH: ${SRCDIR}/vi
-
-CFLAGS+=-I${.CURDIR} -I${SRCDIR} -I${SRCDIR}/include
-
-DPADD= ${LIBNCURSES}
-LDADD= -lncurses
-
-CLEANFILES+=${EX}
-
-# Vi curses sources
-SRCS+= cl_bsd.c cl_funcs.c cl_main.c cl_read.c cl_screen.c cl_term.c
-
-# General sources.
-SRCS+= cut.c delete.c exf.c key.c line.c log.c main.c mark.c msg.c options.c \
- options_f.c put.c screen.c search.c seq.c recover.c util.c
-
-# Ex source.
-SRCS+= ex.c ex_abbrev.c ex_append.c ex_args.c ex_argv.c ex_at.c ex_bang.c \
- ex_cd.c ex_cmd.c ex_cscope.c ex_delete.c ex_display.c \
- ex_edit.c ex_equal.c ex_file.c ex_filter.c ex_global.c \
- ex_init.c ex_join.c ex_map.c ex_mark.c ex_mkexrc.c ex_move.c \
- ex_open.c ex_preserve.c ex_print.c ex_put.c ex_quit.c \
- ex_read.c ex_screen.c ex_script.c ex_set.c ex_shell.c \
- ex_shift.c ex_source.c ex_stop.c ex_subst.c ex_tag.c \
- ex_txt.c ex_undo.c ex_usage.c ex_util.c ex_version.c ex_visual.c \
- ex_write.c ex_yank.c ex_z.c ex_tcl.c ex_perl.c
-
-# Vi source.
-SRCS+= getc.c v_at.c v_ch.c v_cmd.c v_delete.c v_ex.c v_increment.c v_init.c \
- v_itxt.c v_left.c v_mark.c v_match.c v_paragraph.c v_put.c v_redraw.c \
- v_replace.c v_right.c v_screen.c v_scroll.c v_search.c v_section.c \
- v_sentence.c v_status.c v_txt.c v_ulcase.c v_undo.c \
- v_util.c v_word.c v_xchar.c v_yank.c v_z.c v_zexit.c vi.c
-
-# Vi screen source.
-SRCS+= vs_line.c vs_msg.c vs_refresh.c vs_relative.c vs_smap.c vs_split.c
-
-FILES= ${CATALOGS:S;^;${SRCDIR}/catalog/;}
-FILESDIR= /usr/share/vi/catalog
-SYMLINKS=
-.for l in ${NLLINKS}
-SYMLINKS+= dutch ${FILESDIR}/$l.ISO8859-1
-SYMLINKS+= dutch ${FILESDIR}/$l.ISO8859-15
-.endfor
-.for l in ${ENLINKS}
-SYMLINKS+= english ${FILESDIR}/$l.ISO8859-1
-SYMLINKS+= english ${FILESDIR}/$l.ISO8859-15
-SYMLINKS+= english ${FILESDIR}/$l.US-ASCII
-.endfor
-SYMLINKS+= english ${FILESDIR}/POSIX
-SYMLINKS+= english ${FILESDIR}/C
-.for l in ${FRLINKS}
-SYMLINKS+= french ${FILESDIR}/$l.ISO8859-1
-SYMLINKS+= french ${FILESDIR}/$l.ISO8859-15
-.endfor
-.for l in ${DELINKS}
-SYMLINKS+= german ${FILESDIR}/$l.ISO8859-1
-SYMLINKS+= german ${FILESDIR}/$l.ISO8859-15
-.endfor
-.for l in ${ESLINKS}
-SYMLINKS+= spanish ${FILESDIR}/$l.ISO8859-1
-SYMLINKS+= spanish ${FILESDIR}/$l.ISO8859-15
-.endfor
-.for l in ${SVLINKS}
-SYMLINKS+= swedish ${FILESDIR}/$l.ISO8859-1
-SYMLINKS+= swedish ${FILESDIR}/$l.ISO8859-15
-.endfor
-.for l in ${PLLINKS}
-SYMLINKS+= polish ${FILESDIR}/$l.ISO8859-2
-.endfor
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/vi/config.h b/usr.bin/vi/config.h
deleted file mode 100644
index a8bee67..0000000
--- a/usr.bin/vi/config.h
+++ /dev/null
@@ -1,195 +0,0 @@
-/* config.h. Generated automatically by configure. */
-/* config.h.in. Generated automatically from configure.in by autoheader. */
-/* $FreeBSD$ */
-
-/* Define to empty if the keyword does not work. */
-/* #undef const */
-
-/* Define if you have a working `mmap' system call. */
-#define HAVE_MMAP 1
-
-/* Define if your struct stat has st_blksize. */
-#define HAVE_ST_BLKSIZE 1
-
-/* Define if you have <vfork.h>. */
-/* #undef HAVE_VFORK_H */
-
-/* Define to `int' if <sys/types.h> doesn't define. */
-/* #undef mode_t */
-
-/* Define to `long' if <sys/types.h> doesn't define. */
-/* #undef off_t */
-
-/* Define to `int' if <sys/types.h> doesn't define. */
-/* #undef pid_t */
-
-/* Define to `unsigned' if <sys/types.h> doesn't define. */
-/* #undef size_t */
-
-/* Define if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define if your <sys/time.h> declares struct tm. */
-/* #undef TM_IN_SYS_TIME */
-
-/* Define vfork as fork if vfork does not work. */
-/* #undef vfork */
-
-/* Define if your processor stores words with the most significant
- byte first (like Motorola and SPARC, unlike Intel and VAX). */
-/* #undef WORDS_BIGENDIAN */
-
-/* Define to `int' if <sys/types.h> doesn't define. */
-/* #undef ssize_t */
-
-/* Define if you want a debugging version. */
-/* #undef DEBUG */
-
-/* Define if you have a System V-style (broken) gettimeofday. */
-/* #undef HAVE_BROKEN_GETTIMEOFDAY */
-
-/* Define if you have a Ultrix-style (broken) vdisable. */
-/* #undef HAVE_BROKEN_VDISABLE */
-
-/* Define if you have a BSD version of curses. */
-#ifndef SYSV_CURSES
-#define HAVE_BSD_CURSES 1
-#endif
-
-/* Define if you have the curses(3) addnstr function. */
-#define HAVE_CURSES_ADDNSTR 1
-
-/* Define if you have the curses(3) beep function. */
-#ifdef SYSV_CURSES
-#define HAVE_CURSES_BEEP 1
-#endif
-
-/* Define if you have the curses(3) flash function. */
-#ifdef SYSV_CURSES
-#define HAVE_CURSES_FLASH 1
-#endif
-
-/* Define if you have the curses(3) idlok function. */
-#define HAVE_CURSES_IDLOK 1
-
-/* Define if you have the curses(3) keypad function. */
-#ifdef SYSV_CURSES
-#define HAVE_CURSES_KEYPAD 1
-#endif
-
-/* Define if you have the curses(3) newterm function. */
-#ifdef SYSV_CURSES
-#define HAVE_CURSES_NEWTERM 1
-#endif
-
-/* Define if you have the curses(3) setupterm function. */
-#ifdef SYSV_CURSES
-#define HAVE_CURSES_SETUPTERM 1
-#endif
-
-/* Define if you have the curses(3) tigetstr/tigetnum functions. */
-#ifdef SYSV_CURSES
-#define HAVE_CURSES_TIGETSTR 1
-#endif
-
-/* Define if you have the chsize(2) system call. */
-/* #undef HAVE_FTRUNCATE_CHSIZE */
-
-/* Define if you have the ftruncate(2) system call. */
-#define HAVE_FTRUNCATE_FTRUNCATE 1
-
-/* Define if you have fcntl(2) style locking. */
-/* #undef HAVE_LOCK_FCNTL */
-
-/* Define if you have flock(2) style locking. */
-#define HAVE_LOCK_FLOCK 1
-
-/* Define if you want to compile in the Perl interpreter. */
-/* #undef HAVE_PERL_INTERP */ /* XXX: SET IN Makefile CFLAGS */
-
-/* Define if your Perl is at least 5.003_01. */
-/* #undef HAVE_PERL_5_003_01 */ /* XXX: SET IN Makefile CFLAGS */
-
-/* Define if you have the Berkeley style revoke(2) system call. */
-#define HAVE_REVOKE 1
-
-/* Define if you have <sys/mman.h> */
-#define HAVE_SYS_MMAN_H 1
-
-/* Define if you have <sys/select.h> */
-/* #undef HAVE_SYS_SELECT_H 1 */
-
-/* Define if you have the System V style pty calls. */
-/* #undef HAVE_SYS5_PTY */
-
-/* Define if you want to compile in the Tcl interpreter. */
-/* #define HAVE_TCL_INTERP */ /* XXX: SET IN Makefile CFLAGS */
-
-/* Define if your sprintf returns a pointer, not a length. */
-/* #undef SPRINTF_RET_CHARPNT */
-
-/* Define if you have the bsearch function. */
-#define HAVE_BSEARCH 1
-
-/* Define if you have the gethostname function. */
-#define HAVE_GETHOSTNAME 1
-
-/* Define if you have the getopt function. */
-#define HAVE_GETOPT 1
-
-/* Define if you have the getpagesize function. */
-#define HAVE_GETPAGESIZE 1
-
-/* Define if you have the memchr function. */
-#define HAVE_MEMCHR 1
-
-/* Define if you have the memcpy function. */
-#define HAVE_MEMCPY 1
-
-/* Define if you have the memmove function. */
-#define HAVE_MEMMOVE 1
-
-/* Define if you have the memset function. */
-#define HAVE_MEMSET 1
-
-/* Define if you have the mkstemp function. */
-#define HAVE_MKSTEMP 1
-
-/* Define if you have the mmap function. */
-#define HAVE_MMAP 1
-
-/* Define if you have the select function. */
-#define HAVE_SELECT 1
-
-/* Define if you have the setenv function. */
-#define HAVE_SETENV 1
-
-/* Define if you have the snprintf function. */
-#define HAVE_SNPRINTF 1
-
-/* Define if you have the strdup function. */
-#define HAVE_STRDUP 1
-
-/* Define if you have the strerror function. */
-#define HAVE_STRERROR 1
-
-/* Define if you have the strpbrk function. */
-#define HAVE_STRPBRK 1
-
-/* Define if you have the strsep function. */
-#define HAVE_STRSEP 1
-
-/* Define if you have the strtol function. */
-#define HAVE_STRTOL 1
-
-/* Define if you have the strtoul function. */
-#define HAVE_STRTOUL 1
-
-/* Define if you have the unsetenv function. */
-#define HAVE_UNSETENV 1
-
-/* Define if you have the valloc function. */
-#define HAVE_VALLOC 1
-
-/* Define if you have the vsnprintf function. */
-#define HAVE_VSNPRINTF 1
diff --git a/usr.bin/vi/pathnames.h b/usr.bin/vi/pathnames.h
deleted file mode 100644
index 72c8bb3..0000000
--- a/usr.bin/vi/pathnames.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* @(#)pathnames.h.in 8.4 (Berkeley) 6/26/96 */
-/* $FreeBSD$ */
-
-/* Read standard system paths first. */
-#include <paths.h>
-
-#ifndef _PATH_BSHELL
-#define _PATH_BSHELL "/bin/sh"
-#endif
-
-#ifndef _PATH_EXRC
-#define _PATH_EXRC ".exrc"
-#endif
-
-#ifndef _PATH_MSGCAT
-#define _PATH_MSGCAT "/usr/share/vi/catalog/"
-#endif
-
-#ifndef _PATH_NEXRC
-#define _PATH_NEXRC ".nexrc"
-#endif
-
-#ifndef _PATH_PRESERVE
-#define _PATH_PRESERVE "/var/tmp/vi.recover"
-#endif
-
-#ifndef _PATH_SYSV_PTY
-#define _PATH_SYSV_PTY "/dev/ptmx"
-#endif
-
-#ifndef _PATH_SENDMAIL
-#define _PATH_SENDMAIL "/usr/sbin/sendmail"
-#endif
-
-#ifndef _PATH_SYSEXRC
-#define _PATH_SYSEXRC "/etc/vi.exrc"
-#endif
-
-#ifndef _PATH_TAGS
-#define _PATH_TAGS "tags"
-#endif
-
-#ifndef _PATH_TMP
-#define _PATH_TMP "/tmp"
-#endif
-
-#ifndef _PATH_TTY
-#define _PATH_TTY "/dev/tty"
-#endif
diff --git a/usr.bin/vi/port.h b/usr.bin/vi/port.h
deleted file mode 100644
index bdd5faf..0000000
--- a/usr.bin/vi/port.h
+++ /dev/null
@@ -1,170 +0,0 @@
-/* @(#)port.h.in 8.13 (Berkeley) 6/12/96 */
-
-/* $FreeBSD$ */
-
-/*
- * Declare the basic types, if they aren't already declared. Named and
- * some system's db.h files protect them with __BIT_TYPES_DEFINED__.
- */
-#ifndef __BIT_TYPES_DEFINED__
-#define __BIT_TYPES_DEFINED__
-
-
-
-
-
-#endif
-
-/*
- * XXX
- * Some versions of System V changed the number of arguments to gettimeofday
- * without changing the name.
- */
-#ifdef HAVE_BROKEN_GETTIMEOFDAY
-#define gettimeofday(tv, tz) gettimeofday(tv)
-#endif
-
-/*
- * XXX
- * If we don't have mmap, we fake it with read and write, but we'll
- * still need the header information.
- */
-#ifndef HAVE_SYS_MMAN_H
-#define MAP_SHARED 1 /* share changes */
-#define MAP_PRIVATE 2 /* changes are private */
-#define PROT_READ 0x1 /* pages can be read */
-#define PROT_WRITE 0x2 /* pages can be written */
-#define PROT_EXEC 0x4 /* pages can be executed */
-#endif
-
-/*
- * XXX
- * POSIX 1003.1 names for file descriptors.
- */
-#ifndef STDERR_FILENO
-#define STDIN_FILENO 0 /* ANSI C #defines */
-#define STDOUT_FILENO 1
-#define STDERR_FILENO 2
-#endif
-
-/*
- * XXX
- * POSIX 1003.1 names for seek settings.
- */
-#ifndef SEEK_END
-#define SEEK_SET 0 /* POSIX 1003.1 seek values */
-#define SEEK_CUR 1
-#define SEEK_END 2
-#endif
-
-/*
- * Hack _POSIX_VDISABLE to \377 since Ultrix doesn't honor _POSIX_VDISABLE
- * (treats it as ^@). The symptom is that the ^@ keystroke immediately
- * drops core.
- */
-#ifdef HAVE_BROKEN_VDISABLE
-#undef _POSIX_VDISABLE
-#define _POSIX_VDISABLE ((unsigned char)'\377')
-#endif
-
-/*
- * XXX
- * POSIX 1003.1 tty disabling character.
- */
-#ifndef _POSIX_VDISABLE
-#define _POSIX_VDISABLE 0 /* Some systems used 0. */
-#endif
-
-/*
- * XXX
- * 4.4BSD extension to only set the software termios bits.
- */
-#ifndef TCSASOFT /* 4.4BSD extension. */
-#define TCSASOFT 0
-#endif
-
-/*
- * XXX
- * POSIX 1003.1 maximum path length.
- */
-#ifndef MAXPATHLEN
-#ifdef PATH_MAX
-#define MAXPATHLEN PATH_MAX
-#else
-#define MAXPATHLEN 1024
-#endif
-#endif
-
-/*
- * XXX
- * MIN, MAX, historically in <sys/param.h>
- */
-#ifndef MAX
-#define MAX(_a,_b) ((_a)<(_b)?(_b):(_a))
-#endif
-#ifndef MIN
-#define MIN(_a,_b) ((_a)<(_b)?(_a):(_b))
-#endif
-
-/*
- * XXX
- * "DB" isn't always portable, and we want the private information.
- */
-#define DB L__DB
-#undef pgno_t /* IRIX has its own version. */
-#define pgno_t L__db_pgno_t
-
-/*
- * XXX
- * 4.4BSD extension to provide lock values in the open(2) call.
- */
-#ifndef O_EXLOCK
-#define O_EXLOCK 0
-#endif
-
-#ifndef O_SHLOCK
-#define O_SHLOCK 0
-#endif
-
-/*
- * XXX
- * POSIX 1003.1 bad file format errno.
- */
-#ifndef EFTYPE
-#define EFTYPE EINVAL
-#endif
-
-/*
- * XXX
- * POSIX 1003.2 RE length limit.
- */
-#ifndef _POSIX2_RE_DUP_MAX
-#define _POSIX2_RE_DUP_MAX 255
-#endif
-
-/*
- * XXX
- * 4.4BSD extension to determine if a program dropped core from the exit
- * status.
- */
-#ifndef WCOREDUMP
-#define WCOREDUMP(a) 0
-#endif
-
-/*
- * XXX
- * Endian-ness of the machine.
- */
-#if !defined(LITTLE_ENDIAN)
-#define LITTLE_ENDIAN 1234
-#endif
-#if !defined(BIG_ENDIAN)
-#define BIG_ENDIAN 4321
-#endif
-#if !defined(BYTE_ORDER)
-#if WORDS_BIGENDIAN == 1
-#define BYTE_ORDER BIG_ENDIAN
-#else
-#define BYTE_ORDER LITTLE_ENDIAN
-#endif
-#endif
diff --git a/usr.bin/vis/Makefile b/usr.bin/vis/Makefile
deleted file mode 100644
index 8f83a14..0000000
--- a/usr.bin/vis/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-
-PROG= vis
-SRCS= vis.c foldit.c
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/vis/extern.h b/usr.bin/vis/extern.h
deleted file mode 100644
index 5ae1d1a..0000000
--- a/usr.bin/vis/extern.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*-
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-extern int foldit(char *, int, int);
diff --git a/usr.bin/vis/foldit.c b/usr.bin/vis/foldit.c
deleted file mode 100644
index 6ad82c2..0000000
--- a/usr.bin/vis/foldit.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)foldit.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <stdio.h>
-
-#include "extern.h"
-
-int
-foldit(chunk, col, max)
- char *chunk;
- int col, max;
-{
- char *cp;
-
- /*
- * Keep track of column position. Insert hidden newline
- * if this chunk puts us over the limit.
- */
-again:
- cp = chunk;
- while (*cp) {
- switch(*cp) {
- case '\n':
- case '\r':
- col = 0;
- break;
- case '\t':
- col = (col + 8) &~ 07;
- break;
- case '\b':
- col = col ? col - 1 : 0;
- break;
- default:
- col++;
- }
- if (col > (max - 2)) {
- printf("\\\n");
- col = 0;
- goto again;
- }
- cp++;
- }
- return (col);
-}
diff --git a/usr.bin/vis/vis.1 b/usr.bin/vis/vis.1
deleted file mode 100644
index 4d568c4..0000000
--- a/usr.bin/vis/vis.1
+++ /dev/null
@@ -1,142 +0,0 @@
-.\" Copyright (c) 1989, 1991, 1993, 1994
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)vis.1 8.4 (Berkeley) 4/19/94
-.\" $FreeBSD$
-.\"
-.Dd June 25, 2004
-.Dt VIS 1
-.Os
-.Sh NAME
-.Nm vis
-.Nd display non-printable characters in a visual format
-.Sh SYNOPSIS
-.Nm
-.Op Fl cbflnostw
-.Op Fl F Ar foldwidth
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility is a filter for converting non-printable characters
-into a visual representation.
-It differs from
-.Ql cat -v
-in that
-the form is unique and invertible.
-By default, all non-graphic
-characters except space, tab, and newline are encoded.
-A detailed description of the
-various visual formats is given in
-.Xr vis 3 .
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl b
-Turns off prepending of backslash before up-arrow control sequences
-and meta characters, and disables the doubling of backslashes.
-This
-produces output which is neither invertible or precise, but does
-represent a minimum of change to the input.
-It is similar to
-.Dq Li cat -v .
-.It Fl c
-Request a format which displays a small subset of the
-non-printable characters using C-style backslash sequences.
-.It Fl F
-Causes
-.Nm
-to fold output lines to
-.Ar foldwidth
-columns (default 80), like
-.Xr fold 1 ,
-except
-that a hidden newline sequence is used (which is removed
-when inverting the file back to its original form with
-.Xr unvis 1 ) .
-If the last character in the encoded file does not end in a newline,
-a hidden newline sequence is appended to the output.
-This makes
-the output usable with various editors and other utilities which
-typically do not work with partial lines.
-.It Fl f
-Same as
-.Fl F .
-.It Fl l
-Mark newlines with the visible sequence
-.Ql \e$ ,
-followed by the newline.
-.It Fl n
-Turns off any encoding, except for the fact that backslashes are
-still doubled and hidden newline sequences inserted if
-.Fl f
-or
-.Fl F
-is selected.
-When combined with the
-.Fl f
-flag,
-.Nm
-becomes like
-an invertible version of the
-.Xr fold 1
-utility.
-That is, the output
-can be unfolded by running the output through
-.Xr unvis 1 .
-.It Fl o
-Request a format which displays non-printable characters as
-an octal number, \eddd.
-.It Fl s
-Only characters considered unsafe to send to a terminal are encoded.
-This flag allows backspace, bell, and carriage return in addition
-to the default space, tab and newline.
-.It Fl t
-Tabs are also encoded.
-.It Fl w
-White space (space-tab-newline) is also encoded.
-.El
-.Sh SEE ALSO
-.Xr unvis 1 ,
-.Xr vis 3
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.4 .
-.Sh BUGS
-Due to limitations in the underlying
-.Xr vis 3
-function, the
-.Nm
-utility
-does not recognize multibyte characters, and thus may consider them to be
-non-printable when they are in fact printable (and vice versa).
diff --git a/usr.bin/vis/vis.c b/usr.bin/vis/vis.c
deleted file mode 100644
index 8a76d24..0000000
--- a/usr.bin/vis/vis.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/*-
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1989, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "@(#)vis.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <err.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <vis.h>
-
-#include "extern.h"
-
-int eflags, fold, foldwidth=80, none, markeol, debug;
-
-void process(FILE *);
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- FILE *fp;
- int ch;
-
- (void) setlocale(LC_CTYPE, "");
-
- while ((ch = getopt(argc, argv, "nwctsobfF:ld")) != -1)
- switch((char)ch) {
- case 'n':
- none++;
- break;
- case 'w':
- eflags |= VIS_WHITE;
- break;
- case 'c':
- eflags |= VIS_CSTYLE;
- break;
- case 't':
- eflags |= VIS_TAB;
- break;
- case 's':
- eflags |= VIS_SAFE;
- break;
- case 'o':
- eflags |= VIS_OCTAL;
- break;
- case 'b':
- eflags |= VIS_NOSLASH;
- break;
- case 'F':
- if ((foldwidth = atoi(optarg))<5)
- errx(1, "can't fold lines to less than 5 cols");
- /*FALLTHROUGH*/
- case 'f':
- fold++; /* fold output lines to 80 cols */
- break; /* using hidden newline */
- case 'l':
- markeol++; /* mark end of line with \$ */
- break;
-#ifdef DEBUG
- case 'd':
- debug++;
- break;
-#endif
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (*argv)
- while (*argv) {
- if ((fp=fopen(*argv, "r")) != NULL)
- process(fp);
- else
- warn("%s", *argv);
- argv++;
- }
- else
- process(stdin);
- exit(0);
-}
-
-
-static void
-usage(void)
-{
-#ifdef DEBUG
- fprintf(stderr, "usage: vis [-cbflnostwd] [-F foldwidth] [file ...]\n");
-#else
- fprintf(stderr, "usage: vis [-cbflnostw] [-F foldwidth] [file ...]\n");
-#endif
- exit(1);
-}
-
-void
-process(FILE *fp)
-{
- static int col = 0;
- static char dummy[] = "\0";
- char *cp = dummy+1; /* so *(cp-1) starts out != '\n' */
- int c, rachar;
- char buff[5];
-
- c = getc(fp);
- while (c != EOF) {
- rachar = getc(fp);
- if (none) {
- cp = buff;
- *cp++ = c;
- if (c == '\\')
- *cp++ = '\\';
- *cp = '\0';
- } else if (markeol && c == '\n') {
- cp = buff;
- if ((eflags & VIS_NOSLASH) == 0)
- *cp++ = '\\';
- *cp++ = '$';
- *cp++ = '\n';
- *cp = '\0';
- } else
- (void) vis(buff, (char)c, eflags, (char)rachar);
-
- cp = buff;
- if (fold) {
-#ifdef DEBUG
- if (debug)
- printf("<%02d,", col);
-#endif
- col = foldit(cp, col, foldwidth);
-#ifdef DEBUG
- if (debug)
- printf("%02d>", col);
-#endif
- }
- do {
- putchar(*cp);
- } while (*++cp);
- c = rachar;
- }
- /*
- * terminate partial line with a hidden newline
- */
- if (fold && *(cp-1) != '\n')
- printf("\\\n");
-}
diff --git a/usr.bin/vmstat/Makefile b/usr.bin/vmstat/Makefile
deleted file mode 100644
index 6e87a6a..0000000
--- a/usr.bin/vmstat/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= vmstat
-MAN= vmstat.8
-DPADD= ${LIBDEVSTAT} ${LIBKVM} ${LIBMEMSTAT} ${LIBUTIL}
-LDADD= -ldevstat -lkvm -lmemstat -lutil
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/vmstat/vmstat.8 b/usr.bin/vmstat/vmstat.8
deleted file mode 100644
index d810978..0000000
--- a/usr.bin/vmstat/vmstat.8
+++ /dev/null
@@ -1,359 +0,0 @@
-.\" Copyright (c) 1986, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)vmstat.8 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd October 21, 2006
-.Dt VMSTAT 8
-.Os
-.Sh NAME
-.Nm vmstat
-.Nd report virtual memory statistics
-.Sh SYNOPSIS
-.Nm
-.\" .Op Fl fimst
-.Op Fl afHhimPsz
-.Op Fl c Ar count
-.Op Fl M Ar core Op Fl N Ar system
-.Op Fl w Ar wait
-.Op Fl n Ar devs
-.Oo
-.Fl p
-.Sm off
-.Ar type , if , pass
-.Sm on
-.Oc
-.Op Ar disks
-.Sh DESCRIPTION
-The
-.Nm
-utility reports certain kernel statistics kept about process, virtual memory,
-disk, trap and cpu activity.
-.Pp
-If the
-.Fl M
-option is not specified, information is obtained from
-the currently running kernel via the
-.Xr sysctl 3
-interface.
-Otherwise, information is read from the specified core file,
-using the name list from the specified kernel image (or from
-the default image).
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl a
-When used with
-.Fl i ,
-include statistics about interrupts that have never been generated.
-.It Fl c
-Repeat the display
-.Ar count
-times.
-The first display is for the time since a reboot and each subsequent
-report is for the time period since the last display.
-If no repeat
-.Ar count
-is specified, and
-.Fl w
-is specified, the default is infinity, otherwise the default is one.
-.It Fl f
-Report on the number
-.Xr fork 2 ,
-.Xr vfork 2
-and
-.Xr rfork 2
-system calls since system startup, and the number of pages of virtual memory
-involved in each.
-.It Fl h
-Changes memory columns into more easily human readable form. Default if
-standard output is a terminal device.
-.It Fl H
-Changes memory columns into straight numbers. Default if standard output
-is not a terminal device (such as a script).
-.It Fl i
-Report on the number of interrupts taken by each device since system
-startup.
-.It Fl M
-Extract values associated with the name list from the specified
-.Ar core .
-.It Fl N
-If
-.Fl M
-is also specified,
-extract the name list from the specified
-.Ar system
-instead of the default,
-which is the kernel image the system has booted from.
-.It Fl m
-Report on the usage of kernel dynamic memory allocated using
-.Xr malloc 9
-by type.
-.It Fl n
-Change the maximum number of disks to display from the default of 2.
-.It Fl P
-Report per-cpu system/user/idle cpu statistics.
-.It Fl p
-Specify which types of devices to display.
-There are three different
-categories of devices:
-.Pp
-.Bl -tag -width indent -compact
-.It device type:
-.Bl -tag -width 9n -compact
-.It da
-Direct Access devices
-.It sa
-Sequential Access devices
-.It printer
-Printers
-.It proc
-Processor devices
-.It worm
-Write Once Read Multiple devices
-.It cd
-CD devices
-.It scanner
-Scanner devices
-.It optical
-Optical Memory devices
-.It changer
-Medium Changer devices
-.It comm
-Communication devices
-.It array
-Storage Array devices
-.It enclosure
-Enclosure Services devices
-.It floppy
-Floppy devices
-.El
-.Pp
-.It interface:
-.Bl -tag -width 9n -compact
-.It IDE
-Integrated Drive Electronics devices
-.It SCSI
-Small Computer System Interface devices
-.It other
-Any other device interface
-.El
-.Pp
-.It passthrough:
-.Bl -tag -width 9n -compact
-.It pass
-Passthrough devices
-.El
-.El
-.Pp
-The user must specify at least one device type, and may specify at most
-one device type from each category.
-Multiple device types in a single
-device type statement must be separated by commas.
-.Pp
-Any number of
-.Fl p
-arguments may be specified on the command line.
-All
-.Fl p
-arguments are ORed together to form a matching expression against which
-all devices in the system are compared.
-Any device that fully matches
-any
-.Fl p
-argument will be included in the
-.Nm
-output, up to two devices, or the maximum number of devices specified
-by the user.
-.It Fl s
-Display the contents of the
-.Em sum
-structure, giving the total number of several kinds of paging related
-events which have occurred since system startup.
-.\" .It Fl t
-.\" Report on the number of page in and page reclaims since system startup,
-.\" and the amount of time required by each.
-.It Fl w
-Pause
-.Ar wait
-seconds between each display.
-If no repeat
-.Ar wait
-interval is specified, the default is 1 second.
-.It Fl z
-Report on memory used by the kernel zone allocator,
-.Xr uma 9 ,
-by zone.
-.El
-.Pp
-By default,
-.Nm
-displays the following information:
-.Pp
-.Bl -tag -width indent
-.It procs
-Information about the numbers of processes in various states.
-.Pp
-.Bl -tag -width indent -compact
-.It r
-in run queue
-.It b
-blocked for resources (i/o, paging, etc.)
-.It w
-runnable or short sleeper (< 20 secs) but swapped
-.El
-.It memory
-Information about the usage of virtual and real memory.
-Virtual pages (reported in units of 1024 bytes) are considered active if
-they belong to processes which are running or have run in the last 20
-seconds.
-.Pp
-.Bl -tag -width indent -compact
-.It avm
-active virtual pages
-.It fre
-size of the free list
-.El
-.It page
-Information about page faults and paging activity.
-These are averaged each five seconds, and given in units per second.
-.Pp
-.Bl -tag -width indent -compact
-.It flt
-total number of page faults
-.It re
-page reclaims (simulating reference bits)
-.\" .It at
-.\" pages attached (found in free list)
-.It pi
-pages paged in
-.It po
-pages paged out
-.It fr
-pages freed per second
-.\" .It de
-.\" anticipated short term memory shortfall
-.It sr
-pages scanned by clock algorithm, per-second
-.El
-.It disks
-Disk operations per second (this field is system dependent).
-Typically paging will be split across the available drives.
-The header of the field is the first two characters of the disk name and
-the unit number.
-If more than two disk drives are configured in the system,
-.Nm
-displays only the first two drives, unless the user specifies the
-.Fl n
-argument to increase the number of drives displayed.
-This will probably
-cause the display to exceed 80 columns, however.
-To force
-.Nm
-to display specific drives, their names may be supplied on the command line.
-The
-.Nm
-utility
-defaults to show disks first, and then various other random devices in the
-system to add up to two devices, if there are that many devices in the
-system.
-If devices are specified on the command line, or if a device type
-matching pattern is specified (see above),
-.Nm
-will only display the given devices or the devices matching the pattern,
-and will not randomly select other devices in the system.
-.It faults
-Trap/interrupt rate averages per second over last 5 seconds.
-.Pp
-.Bl -tag -width indent -compact
-.It in
-device interrupts per interval (including clock interrupts)
-.It sy
-system calls per interval
-.It cs
-cpu context switch rate (switches/interval)
-.El
-.It cpu
-Breakdown of percentage usage of CPU time.
-.Pp
-.Bl -tag -width indent -compact
-.It us
-user time for normal and low priority processes
-.It sy
-system time
-.It id
-cpu idle
-.El
-.El
-.Sh FILES
-.Bl -tag -width /boot/kernel/kernel -compact
-.It Pa /boot/kernel/kernel
-default kernel namelist
-.It Pa /dev/kmem
-default memory file
-.El
-.Sh EXAMPLES
-The command:
-.Dl vmstat -w 5
-will print what the system is doing every five
-seconds; this is a good choice of printing interval since this is how often
-some of the statistics are sampled in the system.
-Others vary every second and running the output for a while will make it
-apparent which are recomputed every second.
-.Pp
-The command:
-.Dl vmstat -p da -p cd -w 1
-will tell vmstat to select the first two direct access or CDROM devices
-and display statistics on those devices, as well as other systems
-statistics every second.
-.Sh SEE ALSO
-.Xr fstat 1 ,
-.Xr netstat 1 ,
-.Xr nfsstat 1 ,
-.Xr ps 1 ,
-.Xr systat 1 ,
-.Xr libmemstat 3 ,
-.Xr gstat 8 ,
-.Xr iostat 8 ,
-.Xr pstat 8 ,
-.Xr sysctl 8 ,
-.Xr malloc 9 ,
-.Xr uma 9
-.Pp
-The sections starting with ``Interpreting system activity'' in
-.%T "Installing and Operating 4.3BSD" .
-.Sh BUGS
-The
-.Fl c
-and
-.Fl w
-options are only available with the default output.
diff --git a/usr.bin/vmstat/vmstat.c b/usr.bin/vmstat/vmstat.c
deleted file mode 100644
index 44b199ab..0000000
--- a/usr.bin/vmstat/vmstat.c
+++ /dev/null
@@ -1,1222 +0,0 @@
-/*
- * Copyright (c) 1980, 1986, 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1986, 1991, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)vmstat.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/proc.h>
-#include <sys/uio.h>
-#include <sys/namei.h>
-#include <sys/malloc.h>
-#include <sys/signal.h>
-#include <sys/fcntl.h>
-#include <sys/ioctl.h>
-#include <sys/resource.h>
-#include <sys/sysctl.h>
-#include <sys/vmmeter.h>
-
-#include <vm/vm_param.h>
-
-#include <ctype.h>
-#include <devstat.h>
-#include <err.h>
-#include <errno.h>
-#include <kvm.h>
-#include <limits.h>
-#include <memstat.h>
-#include <nlist.h>
-#include <paths.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysexits.h>
-#include <time.h>
-#include <unistd.h>
-#include <libutil.h>
-
-static char da[] = "da";
-
-static struct nlist namelist[] = {
-#define X_SUM 0
- { "_cnt" },
-#define X_BOOTTIME 1
- { "_boottime" },
-#define X_HZ 2
- { "_hz" },
-#define X_STATHZ 3
- { "_stathz" },
-#define X_NCHSTATS 4
- { "_nchstats" },
-#define X_INTRNAMES 5
- { "_intrnames" },
-#define X_EINTRNAMES 6
- { "_eintrnames" },
-#define X_INTRCNT 7
- { "_intrcnt" },
-#define X_EINTRCNT 8
- { "_eintrcnt" },
-#define X_KMEMSTATS 9
- { "_kmemstatistics" },
-#define X_KMEMZONES 10
- { "_kmemzones" },
-#ifdef notyet
-#define X_DEFICIT XXX
- { "_deficit" },
-#define X_REC XXX
- { "_rectime" },
-#define X_PGIN XXX
- { "_pgintime" },
-#define X_XSTATS XXX
- { "_xstats" },
-#define X_END XXX
-#else
-#define X_END 11
-#endif
- { "" },
-};
-
-static struct statinfo cur, last;
-static int num_devices, maxshowdevs;
-static long generation;
-static struct device_selection *dev_select;
-static int num_selected;
-static struct devstat_match *matches;
-static int num_matches = 0;
-static int num_devices_specified, num_selections;
-static long select_generation;
-static char **specified_devices;
-static devstat_select_mode select_mode;
-
-static struct vmmeter sum, osum;
-
-static int winlines = 20;
-static int aflag;
-static int nflag;
-static int Pflag;
-static int hflag;
-
-static kvm_t *kd;
-
-#define FORKSTAT 0x01
-#define INTRSTAT 0x02
-#define MEMSTAT 0x04
-#define SUMSTAT 0x08
-#define TIMESTAT 0x10
-#define VMSTAT 0x20
-#define ZMEMSTAT 0x40
-
-static void cpustats(void);
-static void pcpustats(int, u_long, int);
-static void devstats(void);
-static void doforkst(void);
-static void dointr(void);
-static void dosum(void);
-static void dovmstat(unsigned int, int);
-static void domemstat_malloc(void);
-static void domemstat_zone(void);
-static void kread(int, void *, size_t);
-static void kreado(int, void *, size_t, size_t);
-static char *kgetstr(const char *);
-static void needhdr(int);
-static void printhdr(int, u_long);
-static void usage(void);
-
-static long pct(long, long);
-static long getuptime(void);
-
-static char **getdrivedata(char **);
-
-int
-main(int argc, char *argv[])
-{
- int c, todo;
- unsigned int interval;
- int reps;
- char *memf, *nlistf;
- char errbuf[_POSIX2_LINE_MAX];
-
- memf = nlistf = NULL;
- interval = reps = todo = 0;
- maxshowdevs = 2;
- hflag = isatty(1);
- while ((c = getopt(argc, argv, "ac:fhHiM:mN:n:Pp:stw:z")) != -1) {
- switch (c) {
- case 'a':
- aflag++;
- break;
- case 'c':
- reps = atoi(optarg);
- break;
- case 'P':
- Pflag++;
- break;
- case 'f':
- todo |= FORKSTAT;
- break;
- case 'h':
- hflag = 1;
- break;
- case 'H':
- hflag = 0;
- break;
- case 'i':
- todo |= INTRSTAT;
- break;
- case 'M':
- memf = optarg;
- break;
- case 'm':
- todo |= MEMSTAT;
- break;
- case 'N':
- nlistf = optarg;
- break;
- case 'n':
- nflag = 1;
- maxshowdevs = atoi(optarg);
- if (maxshowdevs < 0)
- errx(1, "number of devices %d is < 0",
- maxshowdevs);
- break;
- case 'p':
- if (devstat_buildmatch(optarg, &matches, &num_matches) != 0)
- errx(1, "%s", devstat_errbuf);
- break;
- case 's':
- todo |= SUMSTAT;
- break;
- case 't':
-#ifdef notyet
- todo |= TIMESTAT;
-#else
- errx(EX_USAGE, "sorry, -t is not (re)implemented yet");
-#endif
- break;
- case 'w':
- interval = atoi(optarg);
- break;
- case 'z':
- todo |= ZMEMSTAT;
- break;
- case '?':
- default:
- usage();
- }
- }
- argc -= optind;
- argv += optind;
-
- if (todo == 0)
- todo = VMSTAT;
-
- if (memf != NULL) {
- kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf);
- if (kd == NULL)
- errx(1, "kvm_openfiles: %s", errbuf);
- }
-
- if (kd != NULL && (c = kvm_nlist(kd, namelist)) != 0) {
- if (c > 0) {
- warnx("undefined symbols:");
- for (c = 0;
- c < (int)(sizeof(namelist)/sizeof(namelist[0]));
- c++)
- if (namelist[c].n_type == 0)
- (void)fprintf(stderr, " %s",
- namelist[c].n_name);
- (void)fputc('\n', stderr);
- } else
- warnx("kvm_nlist: %s", kvm_geterr(kd));
- exit(1);
- }
- if (kd && Pflag)
- errx(1, "Cannot use -P with crash dumps");
-
- if (todo & VMSTAT) {
- struct winsize winsize;
-
- /*
- * Make sure that the userland devstat version matches the
- * kernel devstat version. If not, exit and print a
- * message informing the user of his mistake.
- */
- if (devstat_checkversion(NULL) < 0)
- errx(1, "%s", devstat_errbuf);
-
-
- argv = getdrivedata(argv);
- winsize.ws_row = 0;
- (void) ioctl(STDOUT_FILENO, TIOCGWINSZ, (char *)&winsize);
- if (winsize.ws_row > 0)
- winlines = winsize.ws_row;
-
- }
-
-#define BACKWARD_COMPATIBILITY
-#ifdef BACKWARD_COMPATIBILITY
- if (*argv) {
- interval = atoi(*argv);
- if (*++argv)
- reps = atoi(*argv);
- }
-#endif
-
- if (interval) {
- if (!reps)
- reps = -1;
- } else if (reps)
- interval = 1;
-
- if (todo & FORKSTAT)
- doforkst();
- if (todo & MEMSTAT)
- domemstat_malloc();
- if (todo & ZMEMSTAT)
- domemstat_zone();
- if (todo & SUMSTAT)
- dosum();
-#ifdef notyet
- if (todo & TIMESTAT)
- dotimes();
-#endif
- if (todo & INTRSTAT)
- dointr();
- if (todo & VMSTAT)
- dovmstat(interval, reps);
- exit(0);
-}
-
-static int
-mysysctl(const char *name, void *oldp, size_t *oldlenp,
- void *newp, size_t newlen)
-{
- int error;
-
- error = sysctlbyname(name, oldp, oldlenp, newp, newlen);
- if (error != 0 && errno != ENOMEM)
- err(1, "sysctl(%s)", name);
- return (error);
-}
-
-static char **
-getdrivedata(char **argv)
-{
- if ((num_devices = devstat_getnumdevs(NULL)) < 0)
- errx(1, "%s", devstat_errbuf);
-
- cur.dinfo = (struct devinfo *)malloc(sizeof(struct devinfo));
- last.dinfo = (struct devinfo *)malloc(sizeof(struct devinfo));
- bzero(cur.dinfo, sizeof(struct devinfo));
- bzero(last.dinfo, sizeof(struct devinfo));
-
- if (devstat_getdevs(NULL, &cur) == -1)
- errx(1, "%s", devstat_errbuf);
-
- num_devices = cur.dinfo->numdevs;
- generation = cur.dinfo->generation;
-
- specified_devices = (char **)malloc(sizeof(char *));
- for (num_devices_specified = 0; *argv; ++argv) {
- if (isdigit(**argv))
- break;
- num_devices_specified++;
- specified_devices = (char **)realloc(specified_devices,
- sizeof(char *) *
- num_devices_specified);
- specified_devices[num_devices_specified - 1] = *argv;
- }
- dev_select = NULL;
-
- if (nflag == 0 && maxshowdevs < num_devices_specified)
- maxshowdevs = num_devices_specified;
-
- /*
- * People are generally only interested in disk statistics when
- * they're running vmstat. So, that's what we're going to give
- * them if they don't specify anything by default. We'll also give
- * them any other random devices in the system so that we get to
- * maxshowdevs devices, if that many devices exist. If the user
- * specifies devices on the command line, either through a pattern
- * match or by naming them explicitly, we will give the user only
- * those devices.
- */
- if ((num_devices_specified == 0) && (num_matches == 0)) {
- if (devstat_buildmatch(da, &matches, &num_matches) != 0)
- errx(1, "%s", devstat_errbuf);
-
- select_mode = DS_SELECT_ADD;
- } else
- select_mode = DS_SELECT_ONLY;
-
- /*
- * At this point, selectdevs will almost surely indicate that the
- * device list has changed, so we don't look for return values of 0
- * or 1. If we get back -1, though, there is an error.
- */
- if (devstat_selectdevs(&dev_select, &num_selected, &num_selections,
- &select_generation, generation, cur.dinfo->devices,
- num_devices, matches, num_matches, specified_devices,
- num_devices_specified, select_mode,
- maxshowdevs, 0) == -1)
- errx(1, "%s", devstat_errbuf);
-
- return(argv);
-}
-
-static long
-getuptime(void)
-{
- struct timespec sp;
- time_t uptime;
-
- (void)clock_gettime(CLOCK_MONOTONIC, &sp);
- uptime = sp.tv_sec;
- if (uptime <= 0 || uptime > 60*60*24*365*10)
- errx(1, "time makes no sense; namelist must be wrong");
-
- return(uptime);
-}
-
-static void
-fill_vmmeter(struct vmmeter *vmmp)
-{
- if (kd != NULL) {
- kread(X_SUM, vmmp, sizeof(*vmmp));
- } else {
- size_t size = sizeof(unsigned int);
-#define GET_VM_STATS(cat, name) \
- mysysctl("vm.stats." #cat "." #name, &vmmp->name, &size, NULL, 0)
- /* sys */
- GET_VM_STATS(sys, v_swtch);
- GET_VM_STATS(sys, v_trap);
- GET_VM_STATS(sys, v_syscall);
- GET_VM_STATS(sys, v_intr);
- GET_VM_STATS(sys, v_soft);
-
- /* vm */
- GET_VM_STATS(vm, v_vm_faults);
- GET_VM_STATS(vm, v_cow_faults);
- GET_VM_STATS(vm, v_cow_optim);
- GET_VM_STATS(vm, v_zfod);
- GET_VM_STATS(vm, v_ozfod);
- GET_VM_STATS(vm, v_swapin);
- GET_VM_STATS(vm, v_swapout);
- GET_VM_STATS(vm, v_swappgsin);
- GET_VM_STATS(vm, v_swappgsout);
- GET_VM_STATS(vm, v_vnodein);
- GET_VM_STATS(vm, v_vnodeout);
- GET_VM_STATS(vm, v_vnodepgsin);
- GET_VM_STATS(vm, v_vnodepgsout);
- GET_VM_STATS(vm, v_intrans);
- GET_VM_STATS(vm, v_reactivated);
- GET_VM_STATS(vm, v_pdwakeups);
- GET_VM_STATS(vm, v_pdpages);
- GET_VM_STATS(vm, v_tcached);
- GET_VM_STATS(vm, v_dfree);
- GET_VM_STATS(vm, v_pfree);
- GET_VM_STATS(vm, v_tfree);
- GET_VM_STATS(vm, v_page_size);
- GET_VM_STATS(vm, v_page_count);
- GET_VM_STATS(vm, v_free_reserved);
- GET_VM_STATS(vm, v_free_target);
- GET_VM_STATS(vm, v_free_min);
- GET_VM_STATS(vm, v_free_count);
- GET_VM_STATS(vm, v_wire_count);
- GET_VM_STATS(vm, v_active_count);
- GET_VM_STATS(vm, v_inactive_target);
- GET_VM_STATS(vm, v_inactive_count);
- GET_VM_STATS(vm, v_cache_count);
- GET_VM_STATS(vm, v_cache_min);
- GET_VM_STATS(vm, v_cache_max);
- GET_VM_STATS(vm, v_pageout_free_min);
- GET_VM_STATS(vm, v_interrupt_free_min);
- /*GET_VM_STATS(vm, v_free_severe);*/
- GET_VM_STATS(vm, v_forks);
- GET_VM_STATS(vm, v_vforks);
- GET_VM_STATS(vm, v_rforks);
- GET_VM_STATS(vm, v_kthreads);
- GET_VM_STATS(vm, v_forkpages);
- GET_VM_STATS(vm, v_vforkpages);
- GET_VM_STATS(vm, v_rforkpages);
- GET_VM_STATS(vm, v_kthreadpages);
-#undef GET_VM_STATS
- }
-}
-
-static void
-fill_vmtotal(struct vmtotal *vmtp)
-{
- if (kd != NULL) {
- /* XXX fill vmtp */
- errx(1, "not implemented");
- } else {
- size_t size = sizeof(*vmtp);
- mysysctl("vm.vmtotal", vmtp, &size, NULL, 0);
- if (size != sizeof(*vmtp))
- errx(1, "vm.total size mismatch");
- }
-}
-
-/* Determine how many cpu columns, and what index they are in kern.cp_times */
-static int
-getcpuinfo(u_long *maskp, int *maxidp)
-{
- int maxcpu;
- int maxid;
- int ncpus;
- int i, j;
- int empty;
- size_t size;
- long *times;
- u_long mask;
-
- if (kd != NULL)
- errx(1, "not implemented");
- mask = 0;
- ncpus = 0;
- size = sizeof(maxcpu);
- mysysctl("kern.smp.maxcpus", &maxcpu, &size, NULL, 0);
- if (size != sizeof(maxcpu))
- errx(1, "sysctl kern.smp.maxcpus");
- size = sizeof(long) * maxcpu * CPUSTATES;
- times = malloc(size);
- if (times == NULL)
- err(1, "malloc %zd bytes", size);
- mysysctl("kern.cp_times", times, &size, NULL, 0);
- maxid = (size / CPUSTATES / sizeof(long)) - 1;
- for (i = 0; i <= maxid; i++) {
- empty = 1;
- for (j = 0; empty && j < CPUSTATES; j++) {
- if (times[i * CPUSTATES + j] != 0)
- empty = 0;
- }
- if (!empty) {
- mask |= (1ul << i);
- ncpus++;
- }
- }
- if (maskp)
- *maskp = mask;
- if (maxidp)
- *maxidp = maxid;
- return (ncpus);
-}
-
-
-static void
-prthuman(u_int64_t val, int size)
-{
- char buf[10];
- int flags;
-
- if (size < 5 || size > 9)
- errx(1, "doofus");
- flags = HN_B | HN_NOSPACE | HN_DECIMAL;
- humanize_number(buf, size, val, "", HN_AUTOSCALE, flags);
- printf("%*s", size, buf);
-}
-
-static int hz, hdrcnt;
-
-static long *cur_cp_times;
-static long *last_cp_times;
-static size_t size_cp_times;
-
-static void
-dovmstat(unsigned int interval, int reps)
-{
- struct vmtotal total;
- time_t uptime, halfuptime;
- struct devinfo *tmp_dinfo;
- size_t size;
- int ncpus, maxid;
- u_long cpumask;
-
- uptime = getuptime();
- halfuptime = uptime / 2;
- (void)signal(SIGCONT, needhdr);
-
- if (kd != NULL) {
- if (namelist[X_STATHZ].n_type != 0 &&
- namelist[X_STATHZ].n_value != 0)
- kread(X_STATHZ, &hz, sizeof(hz));
- if (!hz)
- kread(X_HZ, &hz, sizeof(hz));
- } else {
- struct clockinfo clockrate;
-
- size = sizeof(clockrate);
- mysysctl("kern.clockrate", &clockrate, &size, NULL, 0);
- if (size != sizeof(clockrate))
- errx(1, "clockrate size mismatch");
- hz = clockrate.hz;
- }
-
- if (Pflag) {
- ncpus = getcpuinfo(&cpumask, &maxid);
- size_cp_times = sizeof(long) * (maxid + 1) * CPUSTATES;
- cur_cp_times = malloc(size_cp_times);
- last_cp_times = malloc(size_cp_times);
- bzero(cur_cp_times, size_cp_times);
- bzero(last_cp_times, size_cp_times);
- }
- for (hdrcnt = 1;;) {
- if (!--hdrcnt)
- printhdr(ncpus, cpumask);
- if (kd != NULL) {
- if (kvm_getcptime(kd, cur.cp_time) < 0)
- errx(1, "kvm_getcptime: %s", kvm_geterr(kd));
- } else {
- size = sizeof(cur.cp_time);
- mysysctl("kern.cp_time", &cur.cp_time, &size, NULL, 0);
- if (size != sizeof(cur.cp_time))
- errx(1, "cp_time size mismatch");
- }
- if (Pflag) {
- size = size_cp_times;
- mysysctl("kern.cp_times", cur_cp_times, &size, NULL, 0);
- if (size != size_cp_times)
- errx(1, "cp_times mismatch");
- }
-
- tmp_dinfo = last.dinfo;
- last.dinfo = cur.dinfo;
- cur.dinfo = tmp_dinfo;
- last.snap_time = cur.snap_time;
-
- /*
- * Here what we want to do is refresh our device stats.
- * getdevs() returns 1 when the device list has changed.
- * If the device list has changed, we want to go through
- * the selection process again, in case a device that we
- * were previously displaying has gone away.
- */
- switch (devstat_getdevs(NULL, &cur)) {
- case -1:
- errx(1, "%s", devstat_errbuf);
- break;
- case 1: {
- int retval;
-
- num_devices = cur.dinfo->numdevs;
- generation = cur.dinfo->generation;
-
- retval = devstat_selectdevs(&dev_select, &num_selected,
- &num_selections, &select_generation,
- generation, cur.dinfo->devices,
- num_devices, matches, num_matches,
- specified_devices,
- num_devices_specified, select_mode,
- maxshowdevs, 0);
- switch (retval) {
- case -1:
- errx(1, "%s", devstat_errbuf);
- break;
- case 1:
- printhdr(ncpus, cpumask);
- break;
- default:
- break;
- }
- }
- default:
- break;
- }
-
- fill_vmmeter(&sum);
- fill_vmtotal(&total);
- (void)printf("%2d %1d %1d",
- total.t_rq - 1, total.t_dw + total.t_pw, total.t_sw);
-#define vmstat_pgtok(a) ((a) * (sum.v_page_size >> 10))
-#define rate(x) (((x) + halfuptime) / uptime) /* round */
- if (hflag) {
- printf(" ");
- prthuman(total.t_avm * (u_int64_t)sum.v_page_size, 7);
- printf(" ");
- prthuman(total.t_free * (u_int64_t)sum.v_page_size, 6);
- printf(" ");
- } else {
- printf(" %7d ", vmstat_pgtok(total.t_avm));
- printf(" %6d ", vmstat_pgtok(total.t_free));
- }
- (void)printf("%5lu ",
- (unsigned long)rate(sum.v_vm_faults - osum.v_vm_faults));
- (void)printf("%3lu ",
- (unsigned long)rate(sum.v_reactivated - osum.v_reactivated));
- (void)printf("%3lu ",
- (unsigned long)rate(sum.v_swapin + sum.v_vnodein -
- (osum.v_swapin + osum.v_vnodein)));
- (void)printf("%3lu ",
- (unsigned long)rate(sum.v_swapout + sum.v_vnodeout -
- (osum.v_swapout + osum.v_vnodeout)));
- (void)printf("%5lu ",
- (unsigned long)rate(sum.v_tfree - osum.v_tfree));
- (void)printf("%3lu ",
- (unsigned long)rate(sum.v_pdpages - osum.v_pdpages));
- devstats();
- (void)printf("%4lu %4lu %4lu",
- (unsigned long)rate(sum.v_intr - osum.v_intr),
- (unsigned long)rate(sum.v_syscall - osum.v_syscall),
- (unsigned long)rate(sum.v_swtch - osum.v_swtch));
- if (Pflag)
- pcpustats(ncpus, cpumask, maxid);
- else
- cpustats();
- (void)printf("\n");
- (void)fflush(stdout);
- if (reps >= 0 && --reps <= 0)
- break;
- osum = sum;
- uptime = interval;
- /*
- * We round upward to avoid losing low-frequency events
- * (i.e., >= 1 per interval but < 1 per second).
- */
- if (interval != 1)
- halfuptime = (uptime + 1) / 2;
- else
- halfuptime = 0;
- (void)sleep(interval);
- }
-}
-
-static void
-printhdr(int ncpus, u_long cpumask)
-{
- int i, num_shown;
-
- num_shown = (num_selected < maxshowdevs) ? num_selected : maxshowdevs;
- (void)printf(" procs memory page%*s", 19, "");
- if (num_shown > 1)
- (void)printf(" disks %*s", num_shown * 4 - 7, "");
- else if (num_shown == 1)
- (void)printf("disk");
- (void)printf(" faults ");
- if (Pflag) {
- for (i = 0; i < ncpus; i++) {
- if (cpumask & (1ul << i))
- printf("cpu%-2d ", i);
- }
- printf("\n");
- } else
- printf("cpu\n");
- (void)printf(" r b w avm fre flt re pi po fr sr ");
- for (i = 0; i < num_devices; i++)
- if ((dev_select[i].selected)
- && (dev_select[i].selected <= maxshowdevs))
- (void)printf("%c%c%d ", dev_select[i].device_name[0],
- dev_select[i].device_name[1],
- dev_select[i].unit_number);
- (void)printf(" in sy cs");
- if (Pflag) {
- for (i = 0; i < ncpus; i++)
- printf(" us sy id");
- printf("\n");
- } else
- printf(" us sy id\n");
- hdrcnt = winlines - 2;
-}
-
-/*
- * Force a header to be prepended to the next output.
- */
-static void
-needhdr(int dummy __unused)
-{
-
- hdrcnt = 1;
-}
-
-#ifdef notyet
-static void
-dotimes(void)
-{
- unsigned int pgintime, rectime;
-
- kread(X_REC, &rectime, sizeof(rectime));
- kread(X_PGIN, &pgintime, sizeof(pgintime));
- kread(X_SUM, &sum, sizeof(sum));
- (void)printf("%u reclaims, %u total time (usec)\n",
- sum.v_pgrec, rectime);
- (void)printf("average: %u usec / reclaim\n", rectime / sum.v_pgrec);
- (void)printf("\n");
- (void)printf("%u page ins, %u total time (msec)\n",
- sum.v_pgin, pgintime / 10);
- (void)printf("average: %8.1f msec / page in\n",
- pgintime / (sum.v_pgin * 10.0));
-}
-#endif
-
-static long
-pct(long top, long bot)
-{
- long ans;
-
- if (bot == 0)
- return(0);
- ans = (quad_t)top * 100 / bot;
- return (ans);
-}
-
-#define PCT(top, bot) pct((long)(top), (long)(bot))
-
-static void
-dosum(void)
-{
- struct nchstats lnchstats;
- long nchtotal;
-
- fill_vmmeter(&sum);
- (void)printf("%9u cpu context switches\n", sum.v_swtch);
- (void)printf("%9u device interrupts\n", sum.v_intr);
- (void)printf("%9u software interrupts\n", sum.v_soft);
- (void)printf("%9u traps\n", sum.v_trap);
- (void)printf("%9u system calls\n", sum.v_syscall);
- (void)printf("%9u kernel threads created\n", sum.v_kthreads);
- (void)printf("%9u fork() calls\n", sum.v_forks);
- (void)printf("%9u vfork() calls\n", sum.v_vforks);
- (void)printf("%9u rfork() calls\n", sum.v_rforks);
- (void)printf("%9u swap pager pageins\n", sum.v_swapin);
- (void)printf("%9u swap pager pages paged in\n", sum.v_swappgsin);
- (void)printf("%9u swap pager pageouts\n", sum.v_swapout);
- (void)printf("%9u swap pager pages paged out\n", sum.v_swappgsout);
- (void)printf("%9u vnode pager pageins\n", sum.v_vnodein);
- (void)printf("%9u vnode pager pages paged in\n", sum.v_vnodepgsin);
- (void)printf("%9u vnode pager pageouts\n", sum.v_vnodeout);
- (void)printf("%9u vnode pager pages paged out\n", sum.v_vnodepgsout);
- (void)printf("%9u page daemon wakeups\n", sum.v_pdwakeups);
- (void)printf("%9u pages examined by the page daemon\n", sum.v_pdpages);
- (void)printf("%9u pages reactivated\n", sum.v_reactivated);
- (void)printf("%9u copy-on-write faults\n", sum.v_cow_faults);
- (void)printf("%9u copy-on-write optimized faults\n", sum.v_cow_optim);
- (void)printf("%9u zero fill pages zeroed\n", sum.v_zfod);
- (void)printf("%9u zero fill pages prezeroed\n", sum.v_ozfod);
- (void)printf("%9u intransit blocking page faults\n", sum.v_intrans);
- (void)printf("%9u total VM faults taken\n", sum.v_vm_faults);
- (void)printf("%9u pages affected by kernel thread creation\n", sum.v_kthreadpages);
- (void)printf("%9u pages affected by fork()\n", sum.v_forkpages);
- (void)printf("%9u pages affected by vfork()\n", sum.v_vforkpages);
- (void)printf("%9u pages affected by rfork()\n", sum.v_rforkpages);
- (void)printf("%9u pages cached\n", sum.v_tcached);
- (void)printf("%9u pages freed\n", sum.v_tfree);
- (void)printf("%9u pages freed by daemon\n", sum.v_dfree);
- (void)printf("%9u pages freed by exiting processes\n", sum.v_pfree);
- (void)printf("%9u pages active\n", sum.v_active_count);
- (void)printf("%9u pages inactive\n", sum.v_inactive_count);
- (void)printf("%9u pages in VM cache\n", sum.v_cache_count);
- (void)printf("%9u pages wired down\n", sum.v_wire_count);
- (void)printf("%9u pages free\n", sum.v_free_count);
- (void)printf("%9u bytes per page\n", sum.v_page_size);
- if (kd != NULL) {
- kread(X_NCHSTATS, &lnchstats, sizeof(lnchstats));
- } else {
- size_t size = sizeof(lnchstats);
- mysysctl("vfs.cache.nchstats", &lnchstats, &size, NULL, 0);
- if (size != sizeof(lnchstats))
- errx(1, "vfs.cache.nchstats size mismatch");
- }
- nchtotal = lnchstats.ncs_goodhits + lnchstats.ncs_neghits +
- lnchstats.ncs_badhits + lnchstats.ncs_falsehits +
- lnchstats.ncs_miss + lnchstats.ncs_long;
- (void)printf("%9ld total name lookups\n", nchtotal);
- (void)printf(
- "%9s cache hits (%ld%% pos + %ld%% neg) system %ld%% per-directory\n",
- "", PCT(lnchstats.ncs_goodhits, nchtotal),
- PCT(lnchstats.ncs_neghits, nchtotal),
- PCT(lnchstats.ncs_pass2, nchtotal));
- (void)printf("%9s deletions %ld%%, falsehits %ld%%, toolong %ld%%\n", "",
- PCT(lnchstats.ncs_badhits, nchtotal),
- PCT(lnchstats.ncs_falsehits, nchtotal),
- PCT(lnchstats.ncs_long, nchtotal));
-}
-
-static void
-doforkst(void)
-{
- fill_vmmeter(&sum);
- (void)printf("%u forks, %u pages, average %.2f\n",
- sum.v_forks, sum.v_forkpages,
- sum.v_forks == 0 ? 0.0 :
- (double)sum.v_forkpages / sum.v_forks);
- (void)printf("%u vforks, %u pages, average %.2f\n",
- sum.v_vforks, sum.v_vforkpages,
- sum.v_vforks == 0 ? 0.0 :
- (double)sum.v_vforkpages / sum.v_vforks);
- (void)printf("%u rforks, %u pages, average %.2f\n",
- sum.v_rforks, sum.v_rforkpages,
- sum.v_rforks == 0 ? 0.0 :
- (double)sum.v_rforkpages / sum.v_rforks);
-}
-
-static void
-devstats(void)
-{
- int dn, state;
- long double transfers_per_second;
- long double busy_seconds;
- long tmp;
-
- for (state = 0; state < CPUSTATES; ++state) {
- tmp = cur.cp_time[state];
- cur.cp_time[state] -= last.cp_time[state];
- last.cp_time[state] = tmp;
- }
-
- busy_seconds = cur.snap_time - last.snap_time;
-
- for (dn = 0; dn < num_devices; dn++) {
- int di;
-
- if ((dev_select[dn].selected == 0)
- || (dev_select[dn].selected > maxshowdevs))
- continue;
-
- di = dev_select[dn].position;
-
- if (devstat_compute_statistics(&cur.dinfo->devices[di],
- &last.dinfo->devices[di], busy_seconds,
- DSM_TRANSFERS_PER_SECOND, &transfers_per_second,
- DSM_NONE) != 0)
- errx(1, "%s", devstat_errbuf);
-
- (void)printf("%3.0Lf ", transfers_per_second);
- }
-}
-
-static void
-percent(double pct, int *over)
-{
- char buf[10];
- int l;
-
- l = snprintf(buf, sizeof(buf), "%.0f", pct);
- if (l == 1 && *over) {
- printf("%s", buf);
- (*over)--;
- } else
- printf("%2s", buf);
- if (l > 2)
- (*over)++;
-}
-
-static void
-cpustats(void)
-{
- int state, over;
- double lpct, total;
-
- total = 0;
- for (state = 0; state < CPUSTATES; ++state)
- total += cur.cp_time[state];
- if (total)
- lpct = 100.0 / total;
- else
- lpct = 0.0;
- over = 0;
- printf(" ");
- percent((cur.cp_time[CP_USER] + cur.cp_time[CP_NICE]) * lpct, &over);
- printf(" ");
- percent((cur.cp_time[CP_SYS] + cur.cp_time[CP_INTR]) * lpct, &over);
- printf(" ");
- percent(cur.cp_time[CP_IDLE] * lpct, &over);
-}
-
-static void
-pcpustats(int ncpus, u_long cpumask, int maxid)
-{
- int state, i;
- double lpct, total;
- long tmp;
- int over;
-
- /* devstats does this for cp_time */
- for (i = 0; i <= maxid; i++) {
- if ((cpumask & (1ul << i)) == 0)
- continue;
- for (state = 0; state < CPUSTATES; ++state) {
- tmp = cur_cp_times[i * CPUSTATES + state];
- cur_cp_times[i * CPUSTATES + state] -= last_cp_times[i * CPUSTATES + state];
- last_cp_times[i * CPUSTATES + state] = tmp;
- }
- }
-
- over = 0;
- for (i = 0; i <= maxid; i++) {
- if ((cpumask & (1ul << i)) == 0)
- continue;
- total = 0;
- for (state = 0; state < CPUSTATES; ++state)
- total += cur_cp_times[i * CPUSTATES + state];
- if (total)
- lpct = 100.0 / total;
- else
- lpct = 0.0;
- printf(" ");
- percent((cur_cp_times[i * CPUSTATES + CP_USER] +
- cur_cp_times[i * CPUSTATES + CP_NICE]) * lpct, &over);
- printf(" ");
- percent((cur_cp_times[i * CPUSTATES + CP_SYS] +
- cur_cp_times[i * CPUSTATES + CP_INTR]) * lpct, &over);
- printf(" ");
- percent(cur_cp_times[i * CPUSTATES + CP_IDLE] * lpct, &over);
- }
-}
-
-static void
-dointr(void)
-{
- unsigned long *intrcnt, uptime;
- uint64_t inttotal;
- size_t clen, inamlen, intrcntlen, istrnamlen;
- unsigned int i, nintr;
- char *intrname, *tintrname;
-
- uptime = getuptime();
- if (kd != NULL) {
- intrcntlen = namelist[X_EINTRCNT].n_value -
- namelist[X_INTRCNT].n_value;
- inamlen = namelist[X_EINTRNAMES].n_value -
- namelist[X_INTRNAMES].n_value;
- if ((intrcnt = malloc(intrcntlen)) == NULL ||
- (intrname = malloc(inamlen)) == NULL)
- err(1, "malloc()");
- kread(X_INTRCNT, intrcnt, intrcntlen);
- kread(X_INTRNAMES, intrname, inamlen);
- } else {
- for (intrcnt = NULL, intrcntlen = 1024; ; intrcntlen *= 2) {
- if ((intrcnt = reallocf(intrcnt, intrcntlen)) == NULL)
- err(1, "reallocf()");
- if (mysysctl("hw.intrcnt",
- intrcnt, &intrcntlen, NULL, 0) == 0)
- break;
- }
- for (intrname = NULL, inamlen = 1024; ; inamlen *= 2) {
- if ((intrname = reallocf(intrname, inamlen)) == NULL)
- err(1, "reallocf()");
- if (mysysctl("hw.intrnames",
- intrname, &inamlen, NULL, 0) == 0)
- break;
- }
- }
- nintr = intrcntlen / sizeof(unsigned long);
- tintrname = intrname;
- istrnamlen = strlen("interrupt");
- for (i = 0; i < nintr; i++) {
- clen = strlen(tintrname);
- if (clen > istrnamlen)
- istrnamlen = clen;
- tintrname += clen + 1;
- }
- (void)printf("%-*s %20s %10s\n", istrnamlen, "interrupt", "total",
- "rate");
- inttotal = 0;
- for (i = 0; i < nintr; i++) {
- if (intrname[0] != '\0' && (*intrcnt != 0 || aflag))
- (void)printf("%-*s %20lu %10lu\n", istrnamlen, intrname,
- *intrcnt, *intrcnt / uptime);
- intrname += strlen(intrname) + 1;
- inttotal += *intrcnt++;
- }
- (void)printf("%-*s %20llu %10llu\n", istrnamlen, "Total",
- (long long)inttotal, (long long)(inttotal / uptime));
-}
-
-static void
-domemstat_malloc(void)
-{
- struct memory_type_list *mtlp;
- struct memory_type *mtp;
- int error, first, i;
-
- mtlp = memstat_mtl_alloc();
- if (mtlp == NULL) {
- warn("memstat_mtl_alloc");
- return;
- }
- if (kd == NULL) {
- if (memstat_sysctl_malloc(mtlp, 0) < 0) {
- warnx("memstat_sysctl_malloc: %s",
- memstat_strerror(memstat_mtl_geterror(mtlp)));
- return;
- }
- } else {
- if (memstat_kvm_malloc(mtlp, kd) < 0) {
- error = memstat_mtl_geterror(mtlp);
- if (error == MEMSTAT_ERROR_KVM)
- warnx("memstat_kvm_malloc: %s",
- kvm_geterr(kd));
- else
- warnx("memstat_kvm_malloc: %s",
- memstat_strerror(error));
- }
- }
- printf("%13s %5s %6s %7s %8s Size(s)\n", "Type", "InUse", "MemUse",
- "HighUse", "Requests");
- for (mtp = memstat_mtl_first(mtlp); mtp != NULL;
- mtp = memstat_mtl_next(mtp)) {
- if (memstat_get_numallocs(mtp) == 0 &&
- memstat_get_count(mtp) == 0)
- continue;
- printf("%13s %5lld %5lldK %7s %8lld ",
- memstat_get_name(mtp), memstat_get_count(mtp),
- ((int64_t)memstat_get_bytes(mtp) + 1023) / 1024, "-",
- memstat_get_numallocs(mtp));
- first = 1;
- for (i = 0; i < 32; i++) {
- if (memstat_get_sizemask(mtp) & (1 << i)) {
- if (!first)
- printf(",");
- printf("%d", 1 << (i + 4));
- first = 0;
- }
- }
- printf("\n");
- }
- memstat_mtl_free(mtlp);
-}
-
-static void
-domemstat_zone(void)
-{
- struct memory_type_list *mtlp;
- struct memory_type *mtp;
- char name[MEMTYPE_MAXNAME + 1];
- int error;
-
- mtlp = memstat_mtl_alloc();
- if (mtlp == NULL) {
- warn("memstat_mtl_alloc");
- return;
- }
- if (kd == NULL) {
- if (memstat_sysctl_uma(mtlp, 0) < 0) {
- warnx("memstat_sysctl_uma: %s",
- memstat_strerror(memstat_mtl_geterror(mtlp)));
- return;
- }
- } else {
- if (memstat_kvm_uma(mtlp, kd) < 0) {
- error = memstat_mtl_geterror(mtlp);
- if (error == MEMSTAT_ERROR_KVM)
- warnx("memstat_kvm_uma: %s",
- kvm_geterr(kd));
- else
- warnx("memstat_kvm_uma: %s",
- memstat_strerror(error));
- }
- }
- printf("%-20s %8s %8s %8s %8s %8s %8s\n\n", "ITEM", "SIZE",
- "LIMIT", "USED", "FREE", "REQUESTS", "FAILURES");
- for (mtp = memstat_mtl_first(mtlp); mtp != NULL;
- mtp = memstat_mtl_next(mtp)) {
- strlcpy(name, memstat_get_name(mtp), MEMTYPE_MAXNAME);
- strcat(name, ":");
- printf("%-20s %8llu, %8llu, %8llu, %8llu, %8llu, %8llu\n", name,
- memstat_get_size(mtp), memstat_get_countlimit(mtp),
- memstat_get_count(mtp), memstat_get_free(mtp),
- memstat_get_numallocs(mtp), memstat_get_failures(mtp));
- }
- memstat_mtl_free(mtlp);
- printf("\n");
-}
-
-/*
- * kread reads something from the kernel, given its nlist index.
- */
-static void
-kreado(int nlx, void *addr, size_t size, size_t offset)
-{
- const char *sym;
-
- if (namelist[nlx].n_type == 0 || namelist[nlx].n_value == 0) {
- sym = namelist[nlx].n_name;
- if (*sym == '_')
- ++sym;
- errx(1, "symbol %s not defined", sym);
- }
- if ((size_t)kvm_read(kd, namelist[nlx].n_value + offset, addr,
- size) != size) {
- sym = namelist[nlx].n_name;
- if (*sym == '_')
- ++sym;
- errx(1, "%s: %s", sym, kvm_geterr(kd));
- }
-}
-
-static void
-kread(int nlx, void *addr, size_t size)
-{
- kreado(nlx, addr, size, 0);
-}
-
-static char *
-kgetstr(const char *strp)
-{
- int n = 0, size = 1;
- char *ret = NULL;
-
- do {
- if (size == n + 1) {
- ret = realloc(ret, size);
- if (ret == NULL)
- err(1, "%s: realloc", __func__);
- size *= 2;
- }
- if (kvm_read(kd, (u_long)strp + n, &ret[n], 1) != 1)
- errx(1, "%s: %s", __func__, kvm_geterr(kd));
- } while (ret[n++] != '\0');
- return (ret);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "%s%s",
- "usage: vmstat [-afHhimPsz] [-c count] [-M core [-N system]] [-w wait]\n",
- " [-n devs] [-p type,if,pass] [disks]\n");
- exit(1);
-}
diff --git a/usr.bin/w/Makefile b/usr.bin/w/Makefile
deleted file mode 100644
index 1515a87..0000000
--- a/usr.bin/w/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= w
-SRCS= fmt.c pr_time.c proc_compare.c w.c
-MAN= w.1 uptime.1
-DPADD= ${LIBKVM} ${LIBUTIL}
-LDADD= -lkvm -lutil
-#BINGRP= kmem
-#BINMODE=2555
-LINKS= ${BINDIR}/w ${BINDIR}/uptime
-
-.PATH: ${.CURDIR}/../../bin/ps
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/w/extern.h b/usr.bin/w/extern.h
deleted file mode 100644
index 070d055..0000000
--- a/usr.bin/w/extern.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*-
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-
-extern int use_ampm;
-
-struct kinfo_proc;
-void pr_attime(time_t *, time_t *);
-int pr_idle(time_t);
-int proc_compare(struct kinfo_proc *, struct kinfo_proc *);
diff --git a/usr.bin/w/pr_time.c b/usr.bin/w/pr_time.c
deleted file mode 100644
index 9fe0b11..0000000
--- a/usr.bin/w/pr_time.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)pr_time.c 8.2 (Berkeley) 4/4/94";
-#endif
-
-#include <sys/types.h>
-#include <sys/time.h>
-
-#include <stdio.h>
-#include <string.h>
-#include <wchar.h>
-
-#include "extern.h"
-
-/*
- * pr_attime --
- * Print the time since the user logged in.
- */
-void
-pr_attime(time_t *started, time_t *now)
-{
- static char buf[256];
- struct tm tp, tm;
- time_t diff;
- char fmt[20];
-
- tp = *localtime(started);
- tm = *localtime(now);
- diff = *now - *started;
-
- /* If more than a week, use day-month-year. */
- if (diff > 86400 * 7)
- (void)strcpy(fmt, "%d%b%y");
-
- /* If not today, use day-hour-am/pm. */
- else if (tm.tm_mday != tp.tm_mday ||
- tm.tm_mon != tp.tm_mon ||
- tm.tm_year != tp.tm_year) {
- /* The line below does not take DST into consideration */
- /* else if (*now / 86400 != *started / 86400) { */
- (void)strcpy(fmt, use_ampm ? "%a%I%p" : "%a%H");
- }
-
- /* Default is hh:mm{am,pm}. */
- else {
- (void)strcpy(fmt, use_ampm ? "%l:%M%p" : "%k:%M");
- }
-
- (void)strftime(buf, sizeof(buf), fmt, &tp);
- (void)wprintf(L"%-7.7s", buf);
-}
-
-/*
- * pr_idle --
- * Display the idle time.
- * Returns number of excess characters that were used for long idle time.
- */
-int
-pr_idle(time_t idle)
-{
- /* If idle more than 36 hours, print as a number of days. */
- if (idle >= 36 * 3600) {
- int days = idle / 86400;
- (void)printf(" %dday%s ", days, days > 1 ? "s" : " " );
- if (days >= 100)
- return (2);
- if (days >= 10)
- return (1);
- }
-
- /* If idle more than an hour, print as HH:MM. */
- else if (idle >= 3600)
- (void)printf(" %2d:%02d ",
- (int)(idle / 3600), (int)((idle % 3600) / 60));
-
- else if (idle / 60 == 0)
- (void)printf(" - ");
-
- /* Else print the minutes idle. */
- else
- (void)printf(" %2d ", (int)(idle / 60));
-
- return (0); /* not idle longer than 9 days */
-}
diff --git a/usr.bin/w/proc_compare.c b/usr.bin/w/proc_compare.c
deleted file mode 100644
index 8e807d1..0000000
--- a/usr.bin/w/proc_compare.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)proc_compare.c 8.2 (Berkeley) 9/23/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/proc.h>
-#include <sys/time.h>
-#include <sys/user.h>
-
-#include "extern.h"
-
-/*
- * Returns 1 if p2 is "better" than p1
- *
- * The algorithm for picking the "interesting" process is thus:
- *
- * 1) Only foreground processes are eligible - implied.
- * 2) Runnable processes are favored over anything else. The runner
- * with the highest cpu utilization is picked (p_estcpu). Ties are
- * broken by picking the highest pid.
- * 3) The sleeper with the shortest sleep time is next. With ties,
- * we pick out just "short-term" sleepers (TDF_SINTR == 0).
- * 4) Further ties are broken by picking the highest pid.
- *
- * If you change this, be sure to consider making the change in the kernel
- * too (^T in kern/tty.c).
- *
- * TODO - consider whether pctcpu should be used.
- */
-
-#define ISRUN(p) (((p)->ki_stat == SRUN) || ((p)->ki_stat == SIDL))
-#define TESTAB(a, b) ((a)<<1 | (b))
-#define ONLYA 2
-#define ONLYB 1
-#define BOTH 3
-
-int
-proc_compare(struct kinfo_proc *p1, struct kinfo_proc *p2)
-{
-
- if (p1 == NULL)
- return (1);
- /*
- * see if at least one of them is runnable
- */
- switch (TESTAB(ISRUN(p1), ISRUN(p2))) {
- case ONLYA:
- return (0);
- case ONLYB:
- return (1);
- case BOTH:
- /*
- * tie - favor one with highest recent cpu utilization
- */
- if (p2->ki_estcpu > p1->ki_estcpu)
- return (1);
- if (p1->ki_estcpu > p2->ki_estcpu)
- return (0);
- return (p2->ki_pid > p1->ki_pid); /* tie - return highest pid */
- }
- /*
- * weed out zombies
- */
- switch (TESTAB(p1->ki_stat == SZOMB, p2->ki_stat == SZOMB)) {
- case ONLYA:
- return (1);
- case ONLYB:
- return (0);
- case BOTH:
- return (p2->ki_pid > p1->ki_pid); /* tie - return highest pid */
- }
- /*
- * pick the one with the smallest sleep time
- */
- if (p2->ki_slptime > p1->ki_slptime)
- return (0);
- if (p1->ki_slptime > p2->ki_slptime)
- return (1);
- /*
- * favor one sleeping in a non-interruptible sleep
- */
- if (p1->ki_tdflags & TDF_SINTR && (p2->ki_tdflags & TDF_SINTR) == 0)
- return (1);
- if (p2->ki_tdflags & TDF_SINTR && (p1->ki_tdflags & TDF_SINTR) == 0)
- return (0);
- return (p2->ki_pid > p1->ki_pid); /* tie - return highest pid */
-}
diff --git a/usr.bin/w/uptime.1 b/usr.bin/w/uptime.1
deleted file mode 100644
index cc11c71..0000000
--- a/usr.bin/w/uptime.1
+++ /dev/null
@@ -1,61 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1993, 1994
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)uptime.1 8.2 (Berkeley) 4/18/94
-.\" $FreeBSD$
-.\"
-.Dd April 18, 1994
-.Dt UPTIME 1
-.Os
-.Sh NAME
-.Nm uptime
-.Nd show how long system has been running
-.Sh SYNOPSIS
-.Nm
-.Sh DESCRIPTION
-The
-.Nm
-utility displays the current time,
-the length of time the system has been up,
-the number of users, and the load average of the system over the last
-1, 5, and 15 minutes.
-.Sh FILES
-.Bl -tag -width /boot/kernel/kernel
-.It Pa /boot/kernel/kernel
-system name list
-.El
-.Sh SEE ALSO
-.Xr w 1
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3.0 .
diff --git a/usr.bin/w/w.1 b/usr.bin/w/w.1
deleted file mode 100644
index 0dfbd1b..0000000
--- a/usr.bin/w/w.1
+++ /dev/null
@@ -1,148 +0,0 @@
-.\" Copyright (c) 1980, 1990, 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)w.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 6, 1993
-.Dt W 1
-.Os
-.Sh NAME
-.Nm w
-.Nd "display who is logged in and what they are doing"
-.Sh SYNOPSIS
-.Nm
-.Op Fl dhin
-.Op Fl M Ar core
-.Op Fl N Ar system
-.Op Ar user ...
-.Sh DESCRIPTION
-The
-.Nm
-utility prints a summary of the current activity on the system,
-including what each user is doing.
-The first line displays the current time of day, how long the system has
-been running, the number of users logged into the system, and the load
-averages.
-The load average numbers give the number of jobs in the run queue averaged
-over 1, 5 and 15 minutes.
-.Pp
-The fields output are the user's login name, the name of the terminal the
-user is on, the host from which the user is logged in, the time the user
-logged on, the time since the user last typed anything,
-and the name and arguments of the current process.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl d
-dumps out the entire process list on a per controlling
-tty basis, instead of just the top level process.
-.It Fl h
-Suppress the heading.
-.It Fl i
-Output is sorted by idle time.
-.It Fl M
-Extract values associated with the name list from the specified
-core instead of the default
-.Pa /dev/kmem .
-.It Fl N
-Extract the name list from the specified system instead of the
-default
-.Pa /boot/kernel/kernel .
-.It Fl n
-Do not attempt to resolve network addresses (normally
-.Nm
-interprets addresses and attempts to display them as names).
-.El
-.Pp
-If one or more
-.Ar user
-names are specified, the output is restricted to those users.
-.Sh FILES
-.Bl -tag -width ".Pa /var/run/utmp" -compact
-.It Pa /var/run/utmp
-list of users on the system
-.El
-.Sh COMPATIBILITY
-The
-.Fl f ,
-.Fl l ,
-.Fl s ,
-and
-.Fl w
-flags are no longer supported.
-.Sh SEE ALSO
-.Xr finger 1 ,
-.Xr ps 1 ,
-.Xr uptime 1 ,
-.Xr who 1
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3.0 .
-.Sh BUGS
-The notion of the
-.Dq current process
-is muddy.
-The current algorithm is
-.Do
-the highest numbered process on the terminal
-that is not ignoring interrupts, or, if there is none, the highest numbered
-process on the terminal
-.Dc .
-This fails, for example, in critical sections of programs like the shell
-and editor, or when faulty programs running in the background fork and fail
-to ignore interrupts.
-(In cases where no process can be found,
-.Nm
-prints
-.Ql \- . )
-.Pp
-The
-.Tn CPU
-time is only an estimate, in particular, if someone leaves a background
-process running after logging out, the person currently on that terminal is
-.Dq charged
-with the time.
-.Pp
-Background processes are not shown, even though they account for
-much of the load on the system.
-.Pp
-Sometimes processes, typically those in the background, are printed with
-null or garbaged arguments.
-In these cases, the name of the command is printed in parentheses.
-.Pp
-The
-.Nm
-utility does not know about the new conventions for detection of background
-jobs.
-It will sometimes find a background job instead of the right one.
diff --git a/usr.bin/w/w.c b/usr.bin/w/w.c
deleted file mode 100644
index 379e6a4..0000000
--- a/usr.bin/w/w.c
+++ /dev/null
@@ -1,513 +0,0 @@
-/*-
- * Copyright (c) 1980, 1991, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1991, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "@(#)w.c 8.4 (Berkeley) 4/16/94";
-#endif
-
-/*
- * w - print system status (who and what)
- *
- * This program is similar to the systat command on Tenex/Tops 10/20
- *
- */
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <sys/sysctl.h>
-#include <sys/proc.h>
-#include <sys/user.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <sys/tty.h>
-
-#include <machine/cpu.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <arpa/nameser.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <kvm.h>
-#include <langinfo.h>
-#include <libutil.h>
-#include <limits.h>
-#include <locale.h>
-#include <netdb.h>
-#include <nlist.h>
-#include <paths.h>
-#include <resolv.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <timeconv.h>
-#include <unistd.h>
-#include <utmp.h>
-#include <vis.h>
-
-#include "extern.h"
-
-struct timeval boottime;
-struct utmp utmp;
-struct winsize ws;
-kvm_t *kd;
-time_t now; /* the current time of day */
-int ttywidth; /* width of tty */
-int argwidth; /* width of tty */
-int header = 1; /* true if -h flag: don't print heading */
-int nflag; /* true if -n flag: don't convert addrs */
-int dflag; /* true if -d flag: output debug info */
-int sortidle; /* sort by idle time */
-int use_ampm; /* use AM/PM time */
-int use_comma; /* use comma as floats separator */
-char **sel_users; /* login array of particular users selected */
-
-/*
- * One of these per active utmp entry.
- */
-struct entry {
- struct entry *next;
- struct utmp utmp;
- dev_t tdev; /* dev_t of terminal */
- time_t idle; /* idle time of terminal in seconds */
- struct kinfo_proc *kp; /* `most interesting' proc */
- char *args; /* arg list of interesting process */
- struct kinfo_proc *dkp; /* debug option proc list */
-} *ep, *ehead = NULL, **nextp = &ehead;
-
-#define debugproc(p) *((struct kinfo_proc **)&(p)->ki_udata)
-
-/* W_DISPHOSTSIZE should not be greater than UT_HOSTSIZE */
-#define W_DISPHOSTSIZE 16
-
-static void pr_header(time_t *, int);
-static struct stat *ttystat(char *, int);
-static void usage(int);
-static int this_is_uptime(const char *s);
-
-char *fmt_argv(char **, char *, int); /* ../../bin/ps/fmt.c */
-
-int
-main(int argc, char *argv[])
-{
- struct kinfo_proc *kp;
- struct kinfo_proc *dkp;
- struct stat *stp;
- FILE *ut;
- time_t touched;
- int ch, i, nentries, nusers, wcmd, longidle, dropgid;
- const char *memf, *nlistf, *p;
- char *x_suffix;
- char buf[MAXHOSTNAMELEN], errbuf[_POSIX2_LINE_MAX];
- char fn[MAXHOSTNAMELEN];
- char *dot;
-
- (void)setlocale(LC_ALL, "");
- use_ampm = (*nl_langinfo(T_FMT_AMPM) != '\0');
- use_comma = (*nl_langinfo(RADIXCHAR) != ',');
-
- /* Are we w(1) or uptime(1)? */
- if (this_is_uptime(argv[0]) == 0) {
- wcmd = 0;
- p = "";
- } else {
- wcmd = 1;
- p = "dhiflM:N:nsuw";
- }
-
- dropgid = 0;
- memf = nlistf = _PATH_DEVNULL;
- while ((ch = getopt(argc, argv, p)) != -1)
- switch (ch) {
- case 'd':
- dflag = 1;
- break;
- case 'h':
- header = 0;
- break;
- case 'i':
- sortidle = 1;
- break;
- case 'M':
- header = 0;
- memf = optarg;
- dropgid = 1;
- break;
- case 'N':
- nlistf = optarg;
- dropgid = 1;
- break;
- case 'n':
- nflag = 1;
- break;
- case 'f': case 'l': case 's': case 'u': case 'w':
- warnx("[-flsuw] no longer supported");
- /* FALLTHROUGH */
- case '?':
- default:
- usage(wcmd);
- }
- argc -= optind;
- argv += optind;
-
- if (!(_res.options & RES_INIT))
- res_init();
- _res.retrans = 2; /* resolver timeout to 2 seconds per try */
- _res.retry = 1; /* only try once.. */
-
- /*
- * Discard setgid privileges if not the running kernel so that bad
- * guys can't print interesting stuff from kernel memory.
- */
- if (dropgid)
- setgid(getgid());
-
- if ((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf)) == NULL)
- errx(1, "%s", errbuf);
-
- (void)time(&now);
- if ((ut = fopen(_PATH_UTMP, "r")) == NULL)
- err(1, "%s", _PATH_UTMP);
-
- if (*argv)
- sel_users = argv;
-
- for (nusers = 0; fread(&utmp, sizeof(utmp), 1, ut);) {
- if (utmp.ut_name[0] == '\0')
- continue;
- if (!(stp = ttystat(utmp.ut_line, UT_LINESIZE)))
- continue; /* corrupted record */
- ++nusers;
- if (wcmd == 0)
- continue;
- if (sel_users) {
- int usermatch;
- char **user;
-
- usermatch = 0;
- for (user = sel_users; !usermatch && *user; user++)
- if (!strncmp(utmp.ut_name, *user, UT_NAMESIZE))
- usermatch = 1;
- if (!usermatch)
- continue;
- }
- if ((ep = calloc(1, sizeof(struct entry))) == NULL)
- errx(1, "calloc");
- *nextp = ep;
- nextp = &ep->next;
- memmove(&ep->utmp, &utmp, sizeof(struct utmp));
- ep->tdev = stp->st_rdev;
- /*
- * If this is the console device, attempt to ascertain
- * the true console device dev_t.
- */
- if (ep->tdev == 0) {
- size_t size;
-
- size = sizeof(dev_t);
- (void)sysctlbyname("machdep.consdev", &ep->tdev, &size, NULL, 0);
- }
- touched = stp->st_atime;
- if (touched < ep->utmp.ut_time) {
- /* tty untouched since before login */
- touched = ep->utmp.ut_time;
- }
- if ((ep->idle = now - touched) < 0)
- ep->idle = 0;
- }
- (void)fclose(ut);
-
- if (header || wcmd == 0) {
- pr_header(&now, nusers);
- if (wcmd == 0) {
- (void)kvm_close(kd);
- exit(0);
- }
-
-#define HEADER_USER "USER"
-#define HEADER_TTY "TTY"
-#define HEADER_FROM "FROM"
-#define HEADER_LOGIN_IDLE "LOGIN@ IDLE "
-#define HEADER_WHAT "WHAT\n"
-#define WUSED (UT_NAMESIZE + UT_LINESIZE + W_DISPHOSTSIZE + \
- sizeof(HEADER_LOGIN_IDLE) + 3) /* header width incl. spaces */
- (void)printf("%-*.*s %-*.*s %-*.*s %s",
- UT_NAMESIZE, UT_NAMESIZE, HEADER_USER,
- UT_LINESIZE, UT_LINESIZE, HEADER_TTY,
- W_DISPHOSTSIZE, W_DISPHOSTSIZE, HEADER_FROM,
- HEADER_LOGIN_IDLE HEADER_WHAT);
- }
-
- if ((kp = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nentries)) == NULL)
- err(1, "%s", kvm_geterr(kd));
- for (i = 0; i < nentries; i++, kp++) {
- if (kp->ki_stat == SIDL || kp->ki_stat == SZOMB)
- continue;
- for (ep = ehead; ep != NULL; ep = ep->next) {
- if (ep->tdev == kp->ki_tdev) {
- /*
- * proc is associated with this terminal
- */
- if (ep->kp == NULL && kp->ki_pgid == kp->ki_tpgid) {
- /*
- * Proc is 'most interesting'
- */
- if (proc_compare(ep->kp, kp))
- ep->kp = kp;
- }
- /*
- * Proc debug option info; add to debug
- * list using kinfo_proc ki_spare[0]
- * as next pointer; ptr to ptr avoids the
- * ptr = long assumption.
- */
- dkp = ep->dkp;
- ep->dkp = kp;
- debugproc(kp) = dkp;
- }
- }
- }
- if ((ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) == -1 &&
- ioctl(STDERR_FILENO, TIOCGWINSZ, &ws) == -1 &&
- ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) == -1) || ws.ws_col == 0)
- ttywidth = 79;
- else
- ttywidth = ws.ws_col - 1;
- argwidth = ttywidth - WUSED;
- if (argwidth < 4)
- argwidth = 8;
- for (ep = ehead; ep != NULL; ep = ep->next) {
- if (ep->kp == NULL) {
- ep->args = strdup("-");
- continue;
- }
- ep->args = fmt_argv(kvm_getargv(kd, ep->kp, argwidth),
- ep->kp->ki_comm, MAXCOMLEN);
- if (ep->args == NULL)
- err(1, NULL);
- }
- /* sort by idle time */
- if (sortidle && ehead != NULL) {
- struct entry *from, *save;
-
- from = ehead;
- ehead = NULL;
- while (from != NULL) {
- for (nextp = &ehead;
- (*nextp) && from->idle >= (*nextp)->idle;
- nextp = &(*nextp)->next)
- continue;
- save = from;
- from = from->next;
- save->next = *nextp;
- *nextp = save;
- }
- }
-
- for (ep = ehead; ep != NULL; ep = ep->next) {
- char host_buf[UT_HOSTSIZE + 1];
- struct sockaddr_storage ss;
- struct sockaddr *sa = (struct sockaddr *)&ss;
- struct sockaddr_in *lsin = (struct sockaddr_in *)&ss;
- struct sockaddr_in6 *lsin6 = (struct sockaddr_in6 *)&ss;
- time_t t;
- int isaddr;
-
- host_buf[UT_HOSTSIZE] = '\0';
- strncpy(host_buf, ep->utmp.ut_host, UT_HOSTSIZE);
- p = *host_buf ? host_buf : "-";
- if ((x_suffix = strrchr(p, ':')) != NULL) {
- if ((dot = strchr(x_suffix, '.')) != NULL &&
- strchr(dot+1, '.') == NULL)
- *x_suffix++ = '\0';
- else
- x_suffix = NULL;
- }
- if (!nflag) {
- /* Attempt to change an IP address into a name */
- isaddr = 0;
- memset(&ss, '\0', sizeof(ss));
- if (inet_pton(AF_INET6, p, &lsin6->sin6_addr) == 1) {
- lsin6->sin6_len = sizeof(*lsin6);
- lsin6->sin6_family = AF_INET6;
- isaddr = 1;
- } else if (inet_pton(AF_INET, p, &lsin->sin_addr) == 1) {
- lsin->sin_len = sizeof(*lsin);
- lsin->sin_family = AF_INET;
- isaddr = 1;
- }
- if (isaddr && realhostname_sa(fn, sizeof(fn), sa,
- sa->sa_len) == HOSTNAME_FOUND)
- p = fn;
- }
- if (x_suffix) {
- (void)snprintf(buf, sizeof(buf), "%s:%s", p, x_suffix);
- p = buf;
- }
- if (dflag) {
- for (dkp = ep->dkp; dkp != NULL; dkp = debugproc(dkp)) {
- const char *ptr;
-
- ptr = fmt_argv(kvm_getargv(kd, dkp, argwidth),
- dkp->ki_comm, MAXCOMLEN);
- if (ptr == NULL)
- ptr = "-";
- (void)printf("\t\t%-9d %s\n",
- dkp->ki_pid, ptr);
- }
- }
- (void)printf("%-*.*s %-*.*s %-*.*s ",
- UT_NAMESIZE, UT_NAMESIZE, ep->utmp.ut_name,
- UT_LINESIZE, UT_LINESIZE,
- strncmp(ep->utmp.ut_line, "tty", 3) &&
- strncmp(ep->utmp.ut_line, "cua", 3) ?
- ep->utmp.ut_line : ep->utmp.ut_line + 3,
- W_DISPHOSTSIZE, W_DISPHOSTSIZE, *p ? p : "-");
- t = _time_to_time32(ep->utmp.ut_time);
- pr_attime(&t, &now);
- longidle = pr_idle(ep->idle);
- (void)printf("%.*s\n", argwidth - longidle, ep->args);
- }
- (void)kvm_close(kd);
- exit(0);
-}
-
-static void
-pr_header(time_t *nowp, int nusers)
-{
- double avenrun[3];
- time_t uptime;
- struct timespec tp;
- int days, hrs, i, mins, secs;
- char buf[256];
-
- /*
- * Print time of day.
- */
- if (strftime(buf, sizeof(buf),
- use_ampm ? "%l:%M%p" : "%k:%M", localtime(nowp)) != 0)
- (void)printf("%s ", buf);
- /*
- * Print how long system has been up.
- */
- if (clock_gettime(CLOCK_MONOTONIC, &tp) != -1) {
- uptime = tp.tv_sec;
- if (uptime > 60)
- uptime += 30;
- days = uptime / 86400;
- uptime %= 86400;
- hrs = uptime / 3600;
- uptime %= 3600;
- mins = uptime / 60;
- secs = uptime % 60;
- (void)printf(" up");
- if (days > 0)
- (void)printf(" %d day%s,", days, days > 1 ? "s" : "");
- if (hrs > 0 && mins > 0)
- (void)printf(" %2d:%02d,", hrs, mins);
- else if (hrs > 0)
- (void)printf(" %d hr%s,", hrs, hrs > 1 ? "s" : "");
- else if (mins > 0)
- (void)printf(" %d min%s,", mins, mins > 1 ? "s" : "");
- else
- (void)printf(" %d sec%s,", secs, secs > 1 ? "s" : "");
- }
-
- /* Print number of users logged in to system */
- (void)printf(" %d user%s", nusers, nusers == 1 ? "" : "s");
-
- /*
- * Print 1, 5, and 15 minute load averages.
- */
- if (getloadavg(avenrun, sizeof(avenrun) / sizeof(avenrun[0])) == -1)
- (void)printf(", no load average information available\n");
- else {
- (void)printf(", load averages:");
- for (i = 0; i < (int)(sizeof(avenrun) / sizeof(avenrun[0])); i++) {
- if (use_comma && i > 0)
- (void)printf(",");
- (void)printf(" %.2f", avenrun[i]);
- }
- (void)printf("\n");
- }
-}
-
-static struct stat *
-ttystat(char *line, int sz)
-{
- static struct stat sb;
- char ttybuf[MAXPATHLEN];
-
- (void)snprintf(ttybuf, sizeof(ttybuf), "%s%.*s", _PATH_DEV, sz, line);
- if (stat(ttybuf, &sb) == 0) {
- return (&sb);
- } else
- return (NULL);
-}
-
-static void
-usage(int wcmd)
-{
- if (wcmd)
- (void)fprintf(stderr,
- "usage: w [-dhin] [-M core] [-N system] [user ...]\n");
- else
- (void)fprintf(stderr, "usage: uptime\n");
- exit(1);
-}
-
-static int
-this_is_uptime(const char *s)
-{
- const char *u;
-
- if ((u = strrchr(s, '/')) != NULL)
- ++u;
- else
- u = s;
- if (strcmp(u, "uptime") == 0)
- return (0);
- return (-1);
-}
diff --git a/usr.bin/wall/Makefile b/usr.bin/wall/Makefile
deleted file mode 100644
index 65abb61..0000000
--- a/usr.bin/wall/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-
-PROG= wall
-SRCS= ttymsg.c wall.c
-BINGRP= tty
-BINMODE=2555
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/wall/ttymsg.c b/usr.bin/wall/ttymsg.c
deleted file mode 100644
index a977875..0000000
--- a/usr.bin/wall/ttymsg.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char sccsid[] = "@(#)ttymsg.c 8.2 (Berkeley) 11/16/93";
-#endif
-
-#include <sys/types.h>
-#include <sys/uio.h>
-#include <dirent.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <paths.h>
-#include <signal.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include "ttymsg.h"
-
-/*
- * Display the contents of a uio structure on a terminal. Used by wall(1),
- * syslogd(8), and talkd(8). Forks and finishes in child if write would block,
- * waiting up to tmout seconds. Returns pointer to error string on unexpected
- * error; string is not newline-terminated. Various "normal" errors are
- * ignored (exclusive-use, lack of permission, etc.).
- */
-const char *
-ttymsg(struct iovec *iov, int iovcnt, const char *line, int tmout)
-{
- struct iovec localiov[7];
- ssize_t left, wret;
- int cnt, fd;
- static char device[MAXNAMLEN] = _PATH_DEV;
- static char errbuf[1024];
- char *p;
- int forked;
-
- forked = 0;
- if (iovcnt > (int)(sizeof(localiov) / sizeof(localiov[0])))
- return ("too many iov's (change code in wall/ttymsg.c)");
-
- p = device + sizeof(_PATH_DEV) - 1;
- strlcpy(p, line, sizeof(device));
- if (strncmp(p, "pts/", 4) == 0)
- p += 4;
- if (strchr(p, '/') != NULL) {
- /* A slash is an attempt to break security... */
- (void) snprintf(errbuf, sizeof(errbuf),
- "Too many '/' in \"%s\"", device);
- return (errbuf);
- }
-
- /*
- * open will fail on slip lines or exclusive-use lines
- * if not running as root; not an error.
- */
- if ((fd = open(device, O_WRONLY|O_NONBLOCK, 0)) < 0) {
- if (errno == EBUSY || errno == EACCES)
- return (NULL);
- (void) snprintf(errbuf, sizeof(errbuf), "%s: %s", device,
- strerror(errno));
- return (errbuf);
- }
-
- for (cnt = 0, left = 0; cnt < iovcnt; ++cnt)
- left += iov[cnt].iov_len;
-
- for (;;) {
- wret = writev(fd, iov, iovcnt);
- if (wret >= left)
- break;
- if (wret >= 0) {
- left -= wret;
- if (iov != localiov) {
- bcopy(iov, localiov,
- iovcnt * sizeof(struct iovec));
- iov = localiov;
- }
- for (cnt = 0; (size_t)wret >= iov->iov_len; ++cnt) {
- wret -= iov->iov_len;
- ++iov;
- --iovcnt;
- }
- if (wret) {
- iov->iov_base = (char *)iov->iov_base + wret;
- iov->iov_len -= wret;
- }
- continue;
- }
- if (errno == EWOULDBLOCK) {
- int cpid;
-
- if (forked) {
- (void) close(fd);
- _exit(1);
- }
- cpid = fork();
- if (cpid < 0) {
- (void) snprintf(errbuf, sizeof(errbuf),
- "fork: %s", strerror(errno));
- (void) close(fd);
- return (errbuf);
- }
- if (cpid) { /* parent */
- (void) close(fd);
- return (NULL);
- }
- forked++;
- /* wait at most tmout seconds */
- (void) signal(SIGALRM, SIG_DFL);
- (void) signal(SIGTERM, SIG_DFL); /* XXX */
- (void) sigsetmask(0);
- (void) alarm((u_int)tmout);
- (void) fcntl(fd, F_SETFL, 0); /* clear O_NONBLOCK */
- continue;
- }
- /*
- * We get ENODEV on a slip line if we're running as root,
- * and EIO if the line just went away.
- */
- if (errno == ENODEV || errno == EIO)
- break;
- (void) close(fd);
- if (forked)
- _exit(1);
- (void) snprintf(errbuf, sizeof(errbuf),
- "%s: %s", device, strerror(errno));
- return (errbuf);
- }
-
- (void) close(fd);
- if (forked)
- _exit(0);
- return (NULL);
-}
diff --git a/usr.bin/wall/ttymsg.h b/usr.bin/wall/ttymsg.h
deleted file mode 100644
index 31312aa..0000000
--- a/usr.bin/wall/ttymsg.h
+++ /dev/null
@@ -1,3 +0,0 @@
-/* $FreeBSD$ */
-
-const char *ttymsg(struct iovec *, int, const char *, int);
diff --git a/usr.bin/wall/wall.1 b/usr.bin/wall/wall.1
deleted file mode 100644
index 3615125..0000000
--- a/usr.bin/wall/wall.1
+++ /dev/null
@@ -1,83 +0,0 @@
-.\" Copyright (c) 1989, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)wall.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd July 17, 2004
-.Dt WALL 1
-.Os
-.Sh NAME
-.Nm wall
-.Nd write a message to users
-.Sh SYNOPSIS
-.Nm
-.Op Fl g Ar group
-.Op Ar file
-.Sh DESCRIPTION
-The
-.Nm
-utility displays the contents of
-.Ar file
-or, by default, its standard input, on the terminals of all
-currently logged in users.
-.Pp
-Only the super-user can write on the
-terminals of users who have chosen
-to deny messages or are using a program which
-automatically denies messages.
-.Bl -tag -width indent
-.It Fl g
-Send messages to users in this group.
-This option may be specified
-multiple times, and any user in any of the specified groups will
-receive the message.
-.El
-.Sh SEE ALSO
-.Xr mesg 1 ,
-.Xr talk 1 ,
-.Xr write 1 ,
-.Xr shutdown 8
-.Sh HISTORY
-A
-.Nm
-command appeared in PWB UNIX.
-.Sh BUGS
-The sender's
-.Ev LC_CTYPE
-setting is used to determine which characters are safe to write to a
-terminal, not the receiver's (which
-.Nm
-has no way of knowing).
-.Pp
-The
-.Nm
-utility does not recognize multibyte characters.
diff --git a/usr.bin/wall/wall.c b/usr.bin/wall/wall.c
deleted file mode 100644
index be5329a..0000000
--- a/usr.bin/wall/wall.c
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * Copyright (c) 1988, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1988, 1990, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "@(#)wall.c 8.2 (Berkeley) 11/16/93";
-#endif
-
-/*
- * This program is not related to David Wall, whose Stanford Ph.D. thesis
- * is entitled "Mechanisms for Broadcast and Selective Broadcast".
- */
-
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/uio.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <grp.h>
-#include <locale.h>
-#include <paths.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-#include <utmp.h>
-
-#include "ttymsg.h"
-
-static void makemsg(char *);
-static void usage(void);
-
-struct wallgroup {
- struct wallgroup *next;
- char *name;
- gid_t gid;
-} *grouplist;
-int nobanner;
-int mbufsize;
-char *mbuf;
-
-static int
-ttystat(char *line, int sz)
-{
- struct stat sb;
- char ttybuf[MAXPATHLEN];
-
- (void)snprintf(ttybuf, sizeof(ttybuf), "%s%.*s", _PATH_DEV, sz, line);
- if (stat(ttybuf, &sb) == 0) {
- return (0);
- } else
- return (-1);
-}
-
-int
-main(int argc, char *argv[])
-{
- struct iovec iov;
- struct utmp utmp;
- int ch;
- int ingroup;
- FILE *fp;
- struct wallgroup *g;
- struct group *grp;
- char **np;
- const char *p;
- struct passwd *pw;
- char line[sizeof(utmp.ut_line) + 1];
- char username[sizeof(utmp.ut_name) + 1];
-
- (void)setlocale(LC_CTYPE, "");
-
- while ((ch = getopt(argc, argv, "g:n")) != -1)
- switch (ch) {
- case 'n':
- /* undoc option for shutdown: suppress banner */
- if (geteuid() == 0)
- nobanner = 1;
- break;
- case 'g':
- g = (struct wallgroup *)malloc(sizeof *g);
- g->next = grouplist;
- g->name = optarg;
- g->gid = -1;
- grouplist = g;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
- if (argc > 1)
- usage();
-
- for (g = grouplist; g; g = g->next) {
- grp = getgrnam(g->name);
- if (grp != NULL)
- g->gid = grp->gr_gid;
- else
- warnx("%s: no such group", g->name);
- }
-
- makemsg(*argv);
-
- if (!(fp = fopen(_PATH_UTMP, "r")))
- err(1, "cannot read %s", _PATH_UTMP);
- iov.iov_base = mbuf;
- iov.iov_len = mbufsize;
- /* NOSTRICT */
- while (fread((char *)&utmp, sizeof(utmp), 1, fp) == 1) {
- if (!utmp.ut_name[0])
- continue;
- if (ttystat(utmp.ut_line, UT_LINESIZE) != 0)
- continue;
- if (grouplist) {
- ingroup = 0;
- strlcpy(username, utmp.ut_name, sizeof(utmp.ut_name));
- pw = getpwnam(username);
- if (!pw)
- continue;
- for (g = grouplist; g && ingroup == 0; g = g->next) {
- if (g->gid == (gid_t)-1)
- continue;
- if (g->gid == pw->pw_gid)
- ingroup = 1;
- else if ((grp = getgrgid(g->gid)) != NULL) {
- for (np = grp->gr_mem; *np; np++) {
- if (strcmp(*np, username) == 0) {
- ingroup = 1;
- break;
- }
- }
- }
- }
- if (ingroup == 0)
- continue;
- }
- strncpy(line, utmp.ut_line, sizeof(utmp.ut_line));
- line[sizeof(utmp.ut_line)] = '\0';
- if ((p = ttymsg(&iov, 1, line, 60*5)) != NULL)
- warnx("%s", p);
- }
- exit(0);
-}
-
-static void
-usage()
-{
- (void)fprintf(stderr, "usage: wall [-g group] [file]\n");
- exit(1);
-}
-
-void
-makemsg(char *fname)
-{
- int cnt;
- unsigned char ch;
- struct tm *lt;
- struct passwd *pw;
- struct stat sbuf;
- time_t now;
- FILE *fp;
- int fd;
- char *p, hostname[MAXHOSTNAMELEN], lbuf[256], tmpname[64];
- const char *tty;
- const char *whom;
- gid_t egid;
-
- (void)snprintf(tmpname, sizeof(tmpname), "%s/wall.XXXXXX", _PATH_TMP);
- if ((fd = mkstemp(tmpname)) == -1 || !(fp = fdopen(fd, "r+")))
- err(1, "can't open temporary file");
- (void)unlink(tmpname);
-
- if (!nobanner) {
- tty = ttyname(STDERR_FILENO);
- if (tty == NULL)
- tty = "no tty";
-
- if (!(whom = getlogin()))
- whom = (pw = getpwuid(getuid())) ? pw->pw_name : "???";
- (void)gethostname(hostname, sizeof(hostname));
- (void)time(&now);
- lt = localtime(&now);
-
- /*
- * all this stuff is to blank out a square for the message;
- * we wrap message lines at column 79, not 80, because some
- * terminals wrap after 79, some do not, and we can't tell.
- * Which means that we may leave a non-blank character
- * in column 80, but that can't be helped.
- */
- (void)fprintf(fp, "\r%79s\r\n", " ");
- (void)snprintf(lbuf, sizeof(lbuf),
- "Broadcast Message from %s@%s",
- whom, hostname);
- (void)fprintf(fp, "%-79.79s\007\007\r\n", lbuf);
- (void)snprintf(lbuf, sizeof(lbuf),
- " (%s) at %d:%02d %s...", tty,
- lt->tm_hour, lt->tm_min, lt->tm_zone);
- (void)fprintf(fp, "%-79.79s\r\n", lbuf);
- }
- (void)fprintf(fp, "%79s\r\n", " ");
-
- if (fname) {
- egid = getegid();
- setegid(getgid());
- if (freopen(fname, "r", stdin) == NULL)
- err(1, "can't read %s", fname);
- setegid(egid);
- }
- while (fgets(lbuf, sizeof(lbuf), stdin)) {
- for (cnt = 0, p = lbuf; (ch = *p) != '\0'; ++p, ++cnt) {
- if (ch == '\r') {
- putc('\r', fp);
- cnt = 0;
- continue;
- } else if (ch == '\n') {
- for (; cnt < 79; ++cnt)
- putc(' ', fp);
- putc('\r', fp);
- putc('\n', fp);
- break;
- }
- if (cnt == 79) {
- putc('\r', fp);
- putc('\n', fp);
- cnt = 0;
- }
- if (((ch & 0x80) && ch < 0xA0) ||
- /* disable upper controls */
- (!isprint(ch) && !isspace(ch) &&
- ch != '\a' && ch != '\b')
- ) {
- if (ch & 0x80) {
- ch &= 0x7F;
- putc('M', fp);
- if (++cnt == 79) {
- putc('\r', fp);
- putc('\n', fp);
- cnt = 0;
- }
- putc('-', fp);
- if (++cnt == 79) {
- putc('\r', fp);
- putc('\n', fp);
- cnt = 0;
- }
- }
- if (iscntrl(ch)) {
- ch ^= 040;
- putc('^', fp);
- if (++cnt == 79) {
- putc('\r', fp);
- putc('\n', fp);
- cnt = 0;
- }
- }
- }
- putc(ch, fp);
- }
- }
- (void)fprintf(fp, "%79s\r\n", " ");
- rewind(fp);
-
- if (fstat(fd, &sbuf))
- err(1, "can't stat temporary file");
- mbufsize = sbuf.st_size;
- if (!(mbuf = malloc((u_int)mbufsize)))
- err(1, "out of memory");
- if ((int)fread(mbuf, sizeof(*mbuf), mbufsize, fp) != mbufsize)
- err(1, "can't read temporary file");
- (void)close(fd);
-}
diff --git a/usr.bin/wc/Makefile b/usr.bin/wc/Makefile
deleted file mode 100644
index edce9c1..0000000
--- a/usr.bin/wc/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= wc
-WARNS?= 6
-.include <bsd.prog.mk>
diff --git a/usr.bin/wc/wc.1 b/usr.bin/wc/wc.1
deleted file mode 100644
index eeaaa74..0000000
--- a/usr.bin/wc/wc.1
+++ /dev/null
@@ -1,168 +0,0 @@
-.\" Copyright (c) 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)wc.1 8.2 (Berkeley) 4/19/94
-.\" $FreeBSD$
-.\"
-.Dd February 23, 2005
-.Dt WC 1
-.Os
-.Sh NAME
-.Nm wc
-.Nd word, line, character, and byte count
-.Sh SYNOPSIS
-.Nm
-.Op Fl clmw
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility displays the number of lines, words, and bytes contained in each
-input
-.Ar file ,
-or standard input (if no file is specified) to the standard output.
-A line is defined as a string of characters delimited by a
-.Aq newline
-character.
-Characters beyond the final
-.Aq newline
-character will not be included
-in the line count.
-.Pp
-A word is defined as a string of characters delimited by white space
-characters.
-White space characters are the set of characters for which the
-.Xr iswspace 3
-function returns true.
-If more than one input file is specified, a line of cumulative counts
-for all the files is displayed on a separate line after the output for
-the last file.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl c
-The number of bytes in each input file
-is written to the standard output.
-This will cancel out any prior usage of the
-.Fl m
-option.
-.It Fl l
-The number of lines in each input file
-is written to the standard output.
-.It Fl m
-The number of characters in each input file is written to the standard output.
-If the current locale does not support multibyte characters, this
-is equivalent to the
-.Fl c
-option.
-This will cancel out any prior usage of the
-.Fl c
-option.
-.It Fl w
-The number of words in each input file
-is written to the standard output.
-.El
-.Pp
-When an option is specified,
-.Nm
-only reports the information requested by that option.
-The order of output always takes the form of line, word,
-byte, and file name.
-The default action is equivalent to specifying the
-.Fl c , l
-and
-.Fl w
-options.
-.Pp
-If no files are specified, the standard input is used and no
-file name is displayed.
-The prompt will accept input until receiving EOF, or
-.Bq ^D
-in most environments.
-.Sh ENVIRONMENT
-The
-.Ev LANG , LC_ALL
-and
-.Ev LC_CTYPE
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Sh EXIT STATUS
-.Ex -std
-.Sh EXAMPLES
-Count the number of characters, words and lines in each of the files
-.Pa report1
-and
-.Pa report2
-as well as the totals for both:
-.Pp
-.Dl "wc -mlw report1 report2"
-.Sh COMPATIBILITY
-Historically, the
-.Nm
-utility was documented to define a word as a
-.Do
-maximal string of
-characters delimited by <space>, <tab> or <newline> characters
-.Dc .
-The implementation, however, did not handle non-printing characters
-correctly so that
-.Dq Li "\ \ ^D^E\ \ "
-counted as 6 spaces, while
-.Dq Li foo^D^Ebar
-counted as 8 characters.
-.Bx 4
-systems after
-.Bx 4.3
-modified the implementation to be consistent
-with the documentation.
-This implementation defines a
-.Dq word
-in terms of the
-.Xr iswspace 3
-function, as required by
-.St -p1003.2 .
-.Sh SEE ALSO
-.Xr iswspace 3
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v1 .
diff --git a/usr.bin/wc/wc.c b/usr.bin/wc/wc.c
deleted file mode 100644
index 090ff77..0000000
--- a/usr.bin/wc/wc.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright (c) 1980, 1987, 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1987, 1991, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)wc.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/stat.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <locale.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-#include <wctype.h>
-
-uintmax_t tlinect, twordct, tcharct;
-int doline, doword, dochar, domulti;
-
-static int cnt(const char *);
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- int ch, errors, total;
-
- (void) setlocale(LC_CTYPE, "");
-
- while ((ch = getopt(argc, argv, "clmw")) != -1)
- switch((char)ch) {
- case 'l':
- doline = 1;
- break;
- case 'w':
- doword = 1;
- break;
- case 'c':
- dochar = 1;
- domulti = 0;
- break;
- case 'm':
- domulti = 1;
- dochar = 0;
- break;
- case '?':
- default:
- usage();
- }
- argv += optind;
- argc -= optind;
-
- /* Wc's flags are on by default. */
- if (doline + doword + dochar + domulti == 0)
- doline = doword = dochar = 1;
-
- errors = 0;
- total = 0;
- if (!*argv) {
- if (cnt((char *)NULL) != 0)
- ++errors;
- else
- (void)printf("\n");
- }
- else do {
- if (cnt(*argv) != 0)
- ++errors;
- else
- (void)printf(" %s\n", *argv);
- ++total;
- } while(*++argv);
-
- if (total > 1) {
- if (doline)
- (void)printf(" %7ju", tlinect);
- if (doword)
- (void)printf(" %7ju", twordct);
- if (dochar || domulti)
- (void)printf(" %7ju", tcharct);
- (void)printf(" total\n");
- }
- exit(errors == 0 ? 0 : 1);
-}
-
-static int
-cnt(const char *file)
-{
- struct stat sb;
- uintmax_t linect, wordct, charct;
- int fd, len, warned;
- size_t clen;
- short gotsp;
- u_char *p;
- u_char buf[MAXBSIZE];
- wchar_t wch;
- mbstate_t mbs;
-
- linect = wordct = charct = 0;
- if (file == NULL) {
- file = "stdin";
- fd = STDIN_FILENO;
- } else {
- if ((fd = open(file, O_RDONLY, 0)) < 0) {
- warn("%s: open", file);
- return (1);
- }
- if (doword || (domulti && MB_CUR_MAX != 1))
- goto word;
- /*
- * Line counting is split out because it's a lot faster to get
- * lines than to get words, since the word count requires some
- * logic.
- */
- if (doline) {
- while ((len = read(fd, buf, MAXBSIZE))) {
- if (len == -1) {
- warn("%s: read", file);
- (void)close(fd);
- return (1);
- }
- charct += len;
- for (p = buf; len--; ++p)
- if (*p == '\n')
- ++linect;
- }
- tlinect += linect;
- (void)printf(" %7ju", linect);
- if (dochar) {
- tcharct += charct;
- (void)printf(" %7ju", charct);
- }
- (void)close(fd);
- return (0);
- }
- /*
- * If all we need is the number of characters and it's a
- * regular file, just stat the puppy.
- */
- if (dochar || domulti) {
- if (fstat(fd, &sb)) {
- warn("%s: fstat", file);
- (void)close(fd);
- return (1);
- }
- if (S_ISREG(sb.st_mode)) {
- (void)printf(" %7lld", (long long)sb.st_size);
- tcharct += sb.st_size;
- (void)close(fd);
- return (0);
- }
- }
- }
-
- /* Do it the hard way... */
-word: gotsp = 1;
- warned = 0;
- memset(&mbs, 0, sizeof(mbs));
- while ((len = read(fd, buf, MAXBSIZE)) != 0) {
- if (len == -1) {
- warn("%s: read", file);
- (void)close(fd);
- return (1);
- }
- p = buf;
- while (len > 0) {
- if (!domulti || MB_CUR_MAX == 1) {
- clen = 1;
- wch = (unsigned char)*p;
- } else if ((clen = mbrtowc(&wch, p, len, &mbs)) ==
- (size_t)-1) {
- if (!warned) {
- errno = EILSEQ;
- warn("%s", file);
- warned = 1;
- }
- memset(&mbs, 0, sizeof(mbs));
- clen = 1;
- wch = (unsigned char)*p;
- } else if (clen == (size_t)-2)
- break;
- else if (clen == 0)
- clen = 1;
- charct++;
- len -= clen;
- p += clen;
- if (wch == L'\n')
- ++linect;
- if (iswspace(wch))
- gotsp = 1;
- else if (gotsp) {
- gotsp = 0;
- ++wordct;
- }
- }
- }
- if (domulti && MB_CUR_MAX > 1)
- if (mbrtowc(NULL, NULL, 0, &mbs) == (size_t)-1 && !warned)
- warn("%s", file);
- if (doline) {
- tlinect += linect;
- (void)printf(" %7ju", linect);
- }
- if (doword) {
- twordct += wordct;
- (void)printf(" %7ju", wordct);
- }
- if (dochar || domulti) {
- tcharct += charct;
- (void)printf(" %7ju", charct);
- }
- (void)close(fd);
- return (0);
-}
-
-static void
-usage()
-{
- (void)fprintf(stderr, "usage: wc [-clmw] [file ...]\n");
- exit(1);
-}
diff --git a/usr.bin/what/Makefile b/usr.bin/what/Makefile
deleted file mode 100644
index 8114290..0000000
--- a/usr.bin/what/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# From: @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= what
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/what/what.1 b/usr.bin/what/what.1
deleted file mode 100644
index 923c4f2..0000000
--- a/usr.bin/what/what.1
+++ /dev/null
@@ -1,93 +0,0 @@
-.\" Copyright (c) 1980, 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)what.1 8.1 (Berkeley) 6/6/93
-.\"
-.\" $FreeBSD$
-.\"
-.Dd December 14, 2006
-.Dt WHAT 1
-.Os
-.Sh NAME
-.Nm what
-.Nd "show what versions of object modules were used to construct a file"
-.Sh SYNOPSIS
-.Nm
-.Op Fl qs
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility searches each specified
-.Ar file
-for sequences of the form
-.Dq Li @(#)
-as inserted by the
-.Tn SCCS
-source code control system.
-It prints the remainder
-of the string following this marker, up to a NUL character, newline, double
-quote,
-.Ql \&>
-character, or backslash.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl q
-Only output the match text, rather than formatting it.
-.It Fl s
-Stop searching each file after the first match.
-.El
-.Sh EXIT STATUS
-Exit status is 0 if any matches were found, otherwise 1.
-.Sh SEE ALSO
-.Xr ident 1 ,
-.Xr strings 1
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-The
-.Fl q
-option is a non-standard
-.Fx
-extension which may not be available on other operating systems.
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.0 .
-.Sh BUGS
-This is a rewrite of the
-.Tn SCCS
-command of the same name,
-and behavior may not be identical.
diff --git a/usr.bin/what/what.c b/usr.bin/what/what.c
deleted file mode 100644
index 8e994e9..0000000
--- a/usr.bin/what/what.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (c) 1980, 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1988, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "@(#)what.c 8.1 (Berkeley) 6/6/93";
-#endif
-
-#include <err.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-static void usage(void);
-static bool search(bool, bool, FILE *);
-
-int
-main(int argc, char *argv[])
-{
- const char *file;
- FILE *in;
- bool found, qflag, sflag;
- int c;
-
- qflag = sflag = false;
-
- while ((c = getopt(argc, argv, "qs")) != -1) {
- switch (c) {
- case 'q':
- qflag = true;
- break;
- case 's':
- sflag = true;
- break;
- default:
- usage();
- }
- }
- argc -= optind;
- argv += optind;
-
- found = false;
-
- if (argc == 0) {
- if (search(sflag, qflag, stdin))
- found = true;
- } else {
- while (argc--) {
- file = *argv++;
- in = fopen(file, "r");
- if (in == NULL) {
- if (!qflag)
- warn("%s", file);
- continue;
- }
- if (!qflag)
- printf("%s:\n", file);
- if (search(sflag, qflag, in))
- found = true;
- fclose(in);
- }
- }
- exit(found ? 0 : 1);
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: what [-qs] [file ...]\n");
- exit(1);
-}
-
-bool
-search(bool one, bool quiet, FILE *in)
-{
- bool found;
- int c;
-
- found = false;
-
- while ((c = getc(in)) != EOF) {
-loop: if (c != '@')
- continue;
- if ((c = getc(in)) != '(')
- goto loop;
- if ((c = getc(in)) != '#')
- goto loop;
- if ((c = getc(in)) != ')')
- goto loop;
- if (!quiet)
- putchar('\t');
- while ((c = getc(in)) != EOF && c && c != '"' &&
- c != '>' && c != '\\' && c != '\n')
- putchar(c);
- putchar('\n');
- found = true;
- if (one)
- break;
- }
- return (found);
-}
diff --git a/usr.bin/whereis/Makefile b/usr.bin/whereis/Makefile
deleted file mode 100644
index d48b30d..0000000
--- a/usr.bin/whereis/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# $FreeBSD$
-
-PROG= whereis
-WARNS?= 5
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/whereis/pathnames.h b/usr.bin/whereis/pathnames.h
deleted file mode 100644
index 09084ae..0000000
--- a/usr.bin/whereis/pathnames.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright © 2002, Jörg Wunsch
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/* Where to look for libexec and games */
-#define PATH_LIBEXEC "/usr/libexec"
-#define PATH_GAMES "/usr/games"
-
-/* Where to look for sources. */
-#define PATH_SOURCES \
-"/usr/src/bin:/usr/src/usr.bin:/usr/src/sbin:" \
-"/usr/src/usr.sbin:/usr/src/libexec:" \
-"/usr/src/gnu/bin:/usr/src/gnu/usr.bin:" \
-"/usr/src/gnu/sbin:/usr/src/gnu/usr.sbin:" \
-"/usr/src/gnu/libexec:/usr/src/contrib:" \
-"/usr/src/secure/bin:/usr/src/secure/usr.bin:" \
-"/usr/src/secure/sbin:/usr/src/secure/usr.sbin:" \
-"/usr/src/secure/libexec:/usr/src/crypto:" \
-"/usr/src/games"
-
-/* Each subdirectory of PATH_PORTS will be appended to PATH_SOURCES. */
-#define PATH_PORTS "/usr/ports"
-
-/* How to query the current manpath. */
-#define MANPATHCMD "manpath -q"
-
-/* How to obtain the location of manpages, and how to match this result. */
-#define MANWHEREISCMD "man -S1:8:6 -w %s 2>/dev/null"
-#define MANWHEREISALLCMD "man -a -w %s 2>/dev/null"
-#define MANWHEREISMATCH "^.* [(]source: (.*)[)]$"
-
-/* Command used to locate sources that have not been found yet. */
-#define LOCATECMD "locate '*'/%s 2>/dev/null"
diff --git a/usr.bin/whereis/whereis.1 b/usr.bin/whereis/whereis.1
deleted file mode 100644
index c5378b9..0000000
--- a/usr.bin/whereis/whereis.1
+++ /dev/null
@@ -1,190 +0,0 @@
-.\" Copyright (c) 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Copyright 2002 Joerg Wunsch
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)whereis.1 8.2 (Berkeley) 12/30/93
-.\"
-.\" $FreeBSD$
-.\"
-.Dd August 22, 2002
-.Dt WHEREIS 1
-.Os
-.Sh NAME
-.Nm whereis
-.Nd locate programs
-.Sh SYNOPSIS
-.Nm
-.Op Fl abmqsux
-.Op Fl BMS Ar dir ... Fl f
-.Ar program ...
-.Sh DESCRIPTION
-The
-.Nm
-utility checks the standard binary, manual page, and source
-directories for the specified programs, printing out the paths of any
-it finds.
-The supplied program names are first stripped of leading
-path name components, any single trailing extension added by
-.Xr gzip 1 ,
-.Xr compress 1 ,
-or
-.Xr bzip2 1 ,
-and the leading
-.Ql s.\&
-or trailing
-.Ql ,v
-from a source code control system.
-.Pp
-The default path searched is the string returned by the
-.Xr sysctl 8
-utility for the
-.Dq user.cs_path
-string, with
-.Pa /usr/libexec ,
-.Pa /usr/games
-and the current user's
-.Ev $PATH
-appended.
-Manual pages are searched by default along the
-.Ev $MANPATH .
-Program sources are located in a list of known standard places,
-including all the subdirectories of
-.Pa /usr/src
-and
-.Pa /usr/ports .
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl B
-Specify directories to search for binaries.
-Requires the
-.Fl f
-option.
-.It Fl M
-Specify directories to search for manual pages.
-Requires the
-.Fl f
-option.
-.It Fl S
-Specify directories to search for program sources.
-Requires the
-.Fl f
-option.
-.It Fl a
-Report all matches instead of only the first of each requested type.
-.It Fl b
-Search for binaries.
-.It Fl f
-Delimits the list of directories after the
-.Fl B ,
-.Fl M ,
-or
-.Fl S
-options, and indicates the beginning of the
-.Ar program
-list.
-.It Fl m
-Search for manual pages.
-.It Fl q
-.Pq Dq quiet .
-Suppress the output of the utility name in front of the normal
-output line.
-This can become handy for use in a backquote substitution of a
-shell command line, see
-.Sx EXAMPLES .
-.It Fl s
-Search for source directories.
-.It Fl u
-Search for
-.Dq unusual
-entries.
-A file is said to be unusual if it does not have at least
-one entry of each requested type.
-Only the name of the unusual entry is printed.
-.It Fl x
-Do not use
-.Dq expensive
-tools when searching for source directories.
-Normally, after unsuccessfully searching all the first-level
-subdirectories of the source directory list,
-.Nm
-will ask
-.Xr locate 1
-to find the entry on its behalf.
-Since this can take much longer, it can be turned off with
-.Fl x .
-.El
-.Sh EXAMPLES
-The following finds all utilities under
-.Pa /usr/bin
-that do not have documentation:
-.Pp
-.Dl whereis -m -u /usr/bin/*
-.Pp
-Change to the source code directory of
-.Xr ls 1 :
-.Pp
-.Dl cd `whereis -sq ls`
-.Sh SEE ALSO
-.Xr find 1 ,
-.Xr locate 1 ,
-.Xr man 1 ,
-.Xr which 1 ,
-.Xr sysctl 8
-.Sh HISTORY
-The
-.Nm
-utility appeared in
-.Bx 3.0 .
-This version re-implements the historical
-functionality that was lost in
-.Bx 4.4 .
-.Sh AUTHORS
-This implementation of the
-.Nm
-command was written by
-.An J\(:org Wunsch .
-.Sh BUGS
-This re-implementation of the
-.Nm
-utility is not bug-for-bug compatible with historical versions.
-It is believed to be compatible with the version that was shipping with
-.Fx 2.2
-through
-.Fx 4.5
-though.
-.Pp
-The
-.Nm
-utility can report some unrelated source entries when the
-.Fl a
-option is specified.
diff --git a/usr.bin/whereis/whereis.c b/usr.bin/whereis/whereis.c
deleted file mode 100644
index 0829f77..0000000
--- a/usr.bin/whereis/whereis.c
+++ /dev/null
@@ -1,692 +0,0 @@
-/*
- * Copyright © 2002, Jörg Wunsch
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * 4.3BSD UI-compatible whereis(1) utility. Rewritten from scratch
- * since the original 4.3BSD version suffers legal problems that
- * prevent it from being redistributed, and since the 4.4BSD version
- * was pretty inferior in functionality.
- */
-
-#include <sys/types.h>
-
-__FBSDID("$FreeBSD$");
-
-#include <sys/stat.h>
-#include <sys/sysctl.h>
-
-#include <dirent.h>
-#include <err.h>
-#include <errno.h>
-#include <locale.h>
-#include <regex.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysexits.h>
-#include <unistd.h>
-
-#include "pathnames.h"
-
-#define NO_BIN_FOUND 1
-#define NO_MAN_FOUND 2
-#define NO_SRC_FOUND 4
-
-typedef const char *ccharp;
-
-int opt_a, opt_b, opt_m, opt_q, opt_s, opt_u, opt_x;
-ccharp *bindirs, *mandirs, *sourcedirs;
-char **query;
-
-const char *sourcepath = PATH_SOURCES;
-
-char *colonify(ccharp *);
-int contains(ccharp *, const char *);
-void decolonify(char *, ccharp **, int *);
-void defaults(void);
-void scanopts(int, char **);
-void usage(void);
-
-/*
- * Throughout this program, a number of strings are dynamically
- * allocated but never freed. Their memory is written to when
- * splitting the strings into string lists which will later be
- * processed. Since it's important that those string lists remain
- * valid even after the functions allocating the memory returned,
- * those functions cannot free them. They could be freed only at end
- * of main(), which is pretty pointless anyway.
- *
- * The overall amount of memory to be allocated for processing the
- * strings is not expected to exceed a few kilobytes. For that
- * reason, allocation can usually always be assumed to succeed (within
- * a virtual memory environment), thus we simply bail out using
- * abort(3) in case of an allocation failure.
- */
-
-void
-usage(void)
-{
- (void)fprintf(stderr,
- "usage: whereis [-abmqsux] [-BMS dir ... -f] program ...\n");
- exit(EX_USAGE);
-}
-
-/*
- * Scan options passed to program.
- *
- * Note that the -B/-M/-S options expect a list of directory
- * names that must be terminated with -f.
- */
-void
-scanopts(int argc, char **argv)
-{
- int c, i;
- ccharp **dirlist;
-
- while ((c = getopt(argc, argv, "BMSabfmqsux")) != -1)
- switch (c) {
- case 'B':
- dirlist = &bindirs;
- goto dolist;
-
- case 'M':
- dirlist = &mandirs;
- goto dolist;
-
- case 'S':
- dirlist = &sourcedirs;
- dolist:
- i = 0;
- *dirlist = realloc(*dirlist, (i + 1) * sizeof(char *));
- (*dirlist)[i] = NULL;
- while (optind < argc &&
- strcmp(argv[optind], "-f") != 0 &&
- strcmp(argv[optind], "-B") != 0 &&
- strcmp(argv[optind], "-M") != 0 &&
- strcmp(argv[optind], "-S") != 0) {
- decolonify(argv[optind], dirlist, &i);
- optind++;
- }
- break;
-
- case 'a':
- opt_a = 1;
- break;
-
- case 'b':
- opt_b = 1;
- break;
-
- case 'f':
- goto breakout;
-
- case 'm':
- opt_m = 1;
- break;
-
- case 'q':
- opt_q = 1;
- break;
-
- case 's':
- opt_s = 1;
- break;
-
- case 'u':
- opt_u = 1;
- break;
-
- case 'x':
- opt_x = 1;
- break;
-
- default:
- usage();
- }
- breakout:
- if (optind == argc)
- usage();
- query = argv + optind;
-}
-
-/*
- * Find out whether string `s' is contained in list `cpp'.
- */
-int
-contains(ccharp *cpp, const char *s)
-{
- ccharp cp;
-
- if (cpp == NULL)
- return (0);
-
- while ((cp = *cpp) != NULL) {
- if (strcmp(cp, s) == 0)
- return (1);
- cpp++;
- }
- return (0);
-}
-
-/*
- * Split string `s' at colons, and pass it to the string list pointed
- * to by `cppp' (which has `*ip' elements). Note that the original
- * string is modified by replacing the colon with a NUL byte. The
- * partial string is only added if it has a length greater than 0, and
- * if it's not already contained in the string list.
- */
-void
-decolonify(char *s, ccharp **cppp, int *ip)
-{
- char *cp;
-
- while ((cp = strchr(s, ':')), *s != '\0') {
- if (cp)
- *cp = '\0';
- if (strlen(s) && !contains(*cppp, s)) {
- *cppp = realloc(*cppp, (*ip + 2) * sizeof(char *));
- if (cppp == NULL)
- abort();
- (*cppp)[*ip] = s;
- (*cppp)[*ip + 1] = NULL;
- (*ip)++;
- }
- if (cp)
- s = cp + 1;
- else
- break;
- }
-}
-
-/*
- * Join string list `cpp' into a colon-separated string.
- */
-char *
-colonify(ccharp *cpp)
-{
- size_t s;
- char *cp;
- int i;
-
- if (cpp == NULL)
- return (0);
-
- for (s = 0, i = 0; cpp[i] != NULL; i++)
- s += strlen(cpp[i]) + 1;
- if ((cp = malloc(s + 1)) == NULL)
- abort();
- for (i = 0, *cp = '\0'; cpp[i] != NULL; i++) {
- strcat(cp, cpp[i]);
- strcat(cp, ":");
- }
- cp[s - 1] = '\0'; /* eliminate last colon */
-
- return (cp);
-}
-
-/*
- * Provide defaults for all options and directory lists.
- */
-void
-defaults(void)
-{
- size_t s;
- char *b, buf[BUFSIZ], *cp;
- int nele;
- FILE *p;
- DIR *dir;
- struct stat sb;
- struct dirent *dirp;
-
- /* default to -bms if none has been specified */
- if (!opt_b && !opt_m && !opt_s)
- opt_b = opt_m = opt_s = 1;
-
- /* -b defaults to default path + /usr/libexec +
- * /usr/games + user's path */
- if (!bindirs) {
- if (sysctlbyname("user.cs_path", (void *)NULL, &s,
- (void *)NULL, 0) == -1)
- err(EX_OSERR, "sysctlbyname(\"user.cs_path\")");
- if ((b = malloc(s + 1)) == NULL)
- abort();
- if (sysctlbyname("user.cs_path", b, &s, (void *)NULL, 0) == -1)
- err(EX_OSERR, "sysctlbyname(\"user.cs_path\")");
- nele = 0;
- decolonify(b, &bindirs, &nele);
- bindirs = realloc(bindirs, (nele + 3) * sizeof(char *));
- if (bindirs == NULL)
- abort();
- bindirs[nele++] = PATH_LIBEXEC;
- bindirs[nele++] = PATH_GAMES;
- bindirs[nele] = NULL;
- if ((cp = getenv("PATH")) != NULL) {
- /* don't destroy the original environment... */
- if ((b = malloc(strlen(cp) + 1)) == NULL)
- abort();
- strcpy(b, cp);
- decolonify(b, &bindirs, &nele);
- }
- }
-
- /* -m defaults to $(manpath) */
- if (!mandirs) {
- if ((p = popen(MANPATHCMD, "r")) == NULL)
- err(EX_OSERR, "cannot execute manpath command");
- if (fgets(buf, BUFSIZ - 1, p) == NULL ||
- pclose(p))
- err(EX_OSERR, "error processing manpath results");
- if ((b = strchr(buf, '\n')) != NULL)
- *b = '\0';
- if ((b = malloc(strlen(buf) + 1)) == NULL)
- abort();
- strcpy(b, buf);
- nele = 0;
- decolonify(b, &mandirs, &nele);
- }
-
- /* -s defaults to precompiled list, plus subdirs of /usr/ports */
- if (!sourcedirs) {
- if ((b = malloc(strlen(sourcepath) + 1)) == NULL)
- abort();
- strcpy(b, sourcepath);
- nele = 0;
- decolonify(b, &sourcedirs, &nele);
-
- if (stat(PATH_PORTS, &sb) == -1) {
- if (errno == ENOENT)
- /* no /usr/ports, we are done */
- return;
- err(EX_OSERR, "stat(" PATH_PORTS ")");
- }
- if ((sb.st_mode & S_IFMT) != S_IFDIR)
- /* /usr/ports is not a directory, ignore */
- return;
- if (access(PATH_PORTS, R_OK | X_OK) != 0)
- return;
- if ((dir = opendir(PATH_PORTS)) == NULL)
- err(EX_OSERR, "opendir" PATH_PORTS ")");
- while ((dirp = readdir(dir)) != NULL) {
- /*
- * Not everything below PATH_PORTS is of
- * interest. First, all dot files and
- * directories (e. g. .snap) can be ignored.
- * Also, all subdirectories starting with a
- * capital letter are not going to be
- * examined, as they are used for internal
- * purposes (Mk, Tools, ...). This also
- * matches a possible CVS subdirectory.
- * Finally, the distfiles subdirectory is also
- * special, and should not be considered to
- * avoid false matches.
- */
- if (dirp->d_name[0] == '.' ||
- /*
- * isupper() not used on purpose: the
- * check is supposed to default to the C
- * locale instead of the current user's
- * locale.
- */
- (dirp->d_name[0] >= 'A' && dirp->d_name[0] <= 'Z') ||
- strcmp(dirp->d_name, "distfiles") == 0)
- continue;
- if ((b = malloc(sizeof PATH_PORTS + 1 + dirp->d_namlen))
- == NULL)
- abort();
- strcpy(b, PATH_PORTS);
- strcat(b, "/");
- strcat(b, dirp->d_name);
- if (stat(b, &sb) == -1 ||
- (sb.st_mode & S_IFMT) != S_IFDIR ||
- access(b, R_OK | X_OK) != 0) {
- free(b);
- continue;
- }
- sourcedirs = realloc(sourcedirs,
- (nele + 2) * sizeof(char *));
- if (sourcedirs == NULL)
- abort();
- sourcedirs[nele++] = b;
- sourcedirs[nele] = NULL;
- }
- closedir(dir);
- }
-}
-
-int
-main(int argc, char **argv)
-{
- int unusual, i, printed;
- char *bin, buf[BUFSIZ], *cp, *cp2, *man, *name, *src;
- ccharp *dp;
- size_t nlen, olen, s;
- struct stat sb;
- regex_t re, re2;
- regmatch_t matches[2];
- regoff_t rlen;
- FILE *p;
-
- setlocale(LC_ALL, "");
-
- scanopts(argc, argv);
- defaults();
-
- if (mandirs == NULL)
- opt_m = 0;
- if (bindirs == NULL)
- opt_b = 0;
- if (sourcedirs == NULL)
- opt_s = 0;
- if (opt_m + opt_b + opt_s == 0)
- errx(EX_DATAERR, "no directories to search");
-
- if (opt_m) {
- setenv("MANPATH", colonify(mandirs), 1);
- if ((i = regcomp(&re, MANWHEREISMATCH, REG_EXTENDED)) != 0) {
- regerror(i, &re, buf, BUFSIZ - 1);
- errx(EX_UNAVAILABLE, "regcomp(%s) failed: %s",
- MANWHEREISMATCH, buf);
- }
- }
-
- for (; (name = *query) != NULL; query++) {
- /* strip leading path name component */
- if ((cp = strrchr(name, '/')) != NULL)
- name = cp + 1;
- /* strip SCCS or RCS suffix/prefix */
- if (strlen(name) > 2 && strncmp(name, "s.", 2) == 0)
- name += 2;
- if ((s = strlen(name)) > 2 && strcmp(name + s - 2, ",v") == 0)
- name[s - 2] = '\0';
- /* compression suffix */
- s = strlen(name);
- if (s > 2 &&
- (strcmp(name + s - 2, ".z") == 0 ||
- strcmp(name + s - 2, ".Z") == 0))
- name[s - 2] = '\0';
- else if (s > 3 &&
- strcmp(name + s - 3, ".gz") == 0)
- name[s - 3] = '\0';
- else if (s > 4 &&
- strcmp(name + s - 4, ".bz2") == 0)
- name[s - 4] = '\0';
-
- unusual = 0;
- bin = man = src = NULL;
- s = strlen(name);
-
- if (opt_b) {
- /*
- * Binaries have to match exactly, and must be regular
- * executable files.
- */
- unusual = unusual | NO_BIN_FOUND;
- for (dp = bindirs; *dp != NULL; dp++) {
- cp = malloc(strlen(*dp) + 1 + s + 1);
- if (cp == NULL)
- abort();
- strcpy(cp, *dp);
- strcat(cp, "/");
- strcat(cp, name);
- if (stat(cp, &sb) == 0 &&
- (sb.st_mode & S_IFMT) == S_IFREG &&
- (sb.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))
- != 0) {
- unusual = unusual & ~NO_BIN_FOUND;
- if (bin == NULL) {
- bin = strdup(cp);
- } else {
- olen = strlen(bin);
- nlen = strlen(cp);
- bin = realloc(bin,
- olen + nlen + 2);
- if (bin == 0)
- abort();
- strcat(bin, " ");
- strcat(bin, cp);
- }
- if (!opt_a) {
- free(cp);
- break;
- }
- }
- free(cp);
- }
- }
-
- if (opt_m) {
- /*
- * Ask the man command to perform the search for us.
- */
- unusual = unusual | NO_MAN_FOUND;
- if (opt_a)
- cp = malloc(sizeof MANWHEREISALLCMD - 2 + s);
- else
- cp = malloc(sizeof MANWHEREISCMD - 2 + s);
-
- if (cp == NULL)
- abort();
-
- if (opt_a)
- sprintf(cp, MANWHEREISALLCMD, name);
- else
- sprintf(cp, MANWHEREISCMD, name);
-
- if ((p = popen(cp, "r")) != NULL) {
-
- while (fgets(buf, BUFSIZ - 1, p) != NULL) {
- unusual = unusual & ~NO_MAN_FOUND;
-
- if ((cp2 = strchr(buf, '\n')) != NULL)
- *cp2 = '\0';
- if (regexec(&re, buf, 2,
- matches, 0) == 0 &&
- (rlen = matches[1].rm_eo -
- matches[1].rm_so) > 0) {
- /*
- * man -w found formated
- * page, need to pick up
- * source page name.
- */
- cp2 = malloc(rlen + 1);
- if (cp2 == NULL)
- abort();
- memcpy(cp2,
- buf + matches[1].rm_so,
- rlen);
- cp2[rlen] = '\0';
- } else {
- /*
- * man -w found plain source
- * page, use it.
- */
- s = strlen(buf);
- cp2 = malloc(s + 1);
- if (cp2 == NULL)
- abort();
- strcpy(cp2, buf);
- }
-
- if (man == NULL) {
- man = strdup(cp2);
- } else {
- olen = strlen(man);
- nlen = strlen(cp2);
- man = realloc(man,
- olen + nlen + 2);
- if (man == 0)
- abort();
- strcat(man, " ");
- strcat(man, cp2);
- }
-
- free(cp2);
-
- if (!opt_a)
- break;
- }
- pclose(p);
- free(cp);
- }
- }
-
- if (opt_s) {
- /*
- * Sources match if a subdir with the exact
- * name is found.
- */
- unusual = unusual | NO_SRC_FOUND;
- for (dp = sourcedirs; *dp != NULL; dp++) {
- cp = malloc(strlen(*dp) + 1 + s + 1);
- if (cp == NULL)
- abort();
- strcpy(cp, *dp);
- strcat(cp, "/");
- strcat(cp, name);
- if (stat(cp, &sb) == 0 &&
- (sb.st_mode & S_IFMT) == S_IFDIR) {
- unusual = unusual & ~NO_SRC_FOUND;
- if (src == NULL) {
- src = strdup(cp);
- } else {
- olen = strlen(src);
- nlen = strlen(cp);
- src = realloc(src,
- olen + nlen + 2);
- if (src == 0)
- abort();
- strcat(src, " ");
- strcat(src, cp);
- }
- if (!opt_a) {
- free(cp);
- break;
- }
- }
- free(cp);
- }
- /*
- * If still not found, ask locate to search it
- * for us. This will find sources for things
- * like lpr that are well hidden in the
- * /usr/src tree, but takes a lot longer.
- * Thus, option -x (`expensive') prevents this
- * search.
- *
- * Do only match locate output that starts
- * with one of our source directories, and at
- * least one further level of subdirectories.
- */
- if (opt_x || (src && !opt_a))
- goto done_sources;
-
- cp = malloc(sizeof LOCATECMD - 2 + s);
- if (cp == NULL)
- abort();
- sprintf(cp, LOCATECMD, name);
- if ((p = popen(cp, "r")) == NULL)
- goto done_sources;
- while ((src == NULL || opt_a) &&
- (fgets(buf, BUFSIZ - 1, p)) != NULL) {
- if ((cp2 = strchr(buf, '\n')) != NULL)
- *cp2 = '\0';
- for (dp = sourcedirs;
- (src == NULL || opt_a) && *dp != NULL;
- dp++) {
- cp2 = malloc(strlen(*dp) + 9);
- if (cp2 == NULL)
- abort();
- strcpy(cp2, "^");
- strcat(cp2, *dp);
- strcat(cp2, "/[^/]+/");
- if ((i = regcomp(&re2, cp2,
- REG_EXTENDED|REG_NOSUB))
- != 0) {
- regerror(i, &re, buf,
- BUFSIZ - 1);
- errx(EX_UNAVAILABLE,
- "regcomp(%s) failed: %s",
- cp2, buf);
- }
- free(cp2);
- if (regexec(&re2, buf, 0,
- (regmatch_t *)NULL, 0)
- == 0) {
- unusual = unusual &
- ~NO_SRC_FOUND;
- if (src == NULL) {
- src = strdup(buf);
- } else {
- olen = strlen(src);
- nlen = strlen(buf);
- src = realloc(src,
- olen +
- nlen + 2);
- if (src == 0)
- abort();
- strcat(src, " ");
- strcat(src, buf);
- }
- }
- regfree(&re2);
- }
- }
- pclose(p);
- free(cp);
- }
- done_sources:
-
- if (opt_u && !unusual)
- continue;
-
- printed = 0;
- if (!opt_q) {
- printf("%s:", name);
- printed++;
- }
- if (bin) {
- if (printed++)
- putchar(' ');
- fputs(bin, stdout);
- }
- if (man) {
- if (printed++)
- putchar(' ');
- fputs(man, stdout);
- }
- if (src) {
- if (printed++)
- putchar(' ');
- fputs(src, stdout);
- }
- if (printed)
- putchar('\n');
- }
-
- if (opt_m)
- regfree(&re);
-
- return (0);
-}
diff --git a/usr.bin/which/Makefile b/usr.bin/which/Makefile
deleted file mode 100644
index fdc121b..0000000
--- a/usr.bin/which/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= which
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/which/which.1 b/usr.bin/which/which.1
deleted file mode 100644
index 52e010a..0000000
--- a/usr.bin/which/which.1
+++ /dev/null
@@ -1,85 +0,0 @@
-.\" Manpage Copyright (c) 1995, Jordan Hubbard <jkh@FreeBSD.org>
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the FreeBSD Project
-.\" its contributors.
-.\" 4. Neither the name of the FreeBSD Project nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE CONTRIBUTOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-.\" OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd December 13, 2006
-.Dt WHICH 1
-.Os
-.Sh NAME
-.Nm which
-.Nd "locate a program file in the user's path"
-.Sh SYNOPSIS
-.Nm
-.Op Fl as
-.Ar program ...
-.Sh DESCRIPTION
-The
-.Nm
-utility
-takes a list of command names and searches the path for each executable
-file that would be run had these commands actually been invoked.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl a
-List all instances of executables found (instead of just the first one
-of each).
-.It Fl s
-No output, just return 0 if all of the executables are found, or 1 if
-some were not found.
-.El
-.Pp
-Some shells may provide a builtin
-.Nm
-command which is similar or identical to this utility.
-Consult the
-.Xr builtin 1
-manual page.
-.Sh SEE ALSO
-.Xr builtin 1 ,
-.Xr csh 1 ,
-.Xr find 1 ,
-.Xr locate 1 ,
-.Xr whereis 1
-.Sh HISTORY
-The
-.Nm
-command first appeared in
-.Fx 2.1 .
-.Sh AUTHORS
-.An -nosplit
-The
-.Nm
-utility was originally written in Perl and was contributed by
-.An Wolfram Schneider Aq wosch@FreeBSD.org .
-The current version of
-.Nm
-was rewritten in C by
-.An Daniel Papasian Aq dpapasia@andrew.cmu.edu .
diff --git a/usr.bin/which/which.c b/usr.bin/which/which.c
deleted file mode 100644
index 3b8224da..0000000
--- a/usr.bin/which/which.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/**
- * Copyright (c) 2000 Dan Papasian. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#include <sys/stat.h>
-#include <sys/param.h>
-
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-static void usage(void);
-static int print_matches(char *, char *);
-
-int silent;
-int allpaths;
-
-int
-main(int argc, char **argv)
-{
- char *p, *path;
- ssize_t pathlen;
- int opt, status;
-
- status = EXIT_SUCCESS;
-
- while ((opt = getopt(argc, argv, "as")) != -1) {
- switch (opt) {
- case 'a':
- allpaths = 1;
- break;
- case 's':
- silent = 1;
- break;
- default:
- usage();
- break;
- }
- }
-
- argv += optind;
- argc -= optind;
-
- if (argc == 0)
- usage();
-
- if ((p = getenv("PATH")) == NULL)
- exit(EXIT_FAILURE);
- pathlen = strlen(p) + 1;
- path = malloc(pathlen);
- if (path == NULL)
- err(EXIT_FAILURE, NULL);
-
- while (argc > 0) {
- memcpy(path, p, pathlen);
-
- if (strlen(*argv) >= FILENAME_MAX ||
- print_matches(path, *argv) == -1)
- status = EXIT_FAILURE;
-
- argv++;
- argc--;
- }
-
- exit(status);
-}
-
-static void
-usage(void)
-{
-
- (void)fprintf(stderr, "usage: which [-as] program ...\n");
- exit(EXIT_FAILURE);
-}
-
-static int
-is_there(char *candidate)
-{
- struct stat fin;
-
- /* XXX work around access(2) false positives for superuser */
- if (access(candidate, X_OK) == 0 &&
- stat(candidate, &fin) == 0 &&
- S_ISREG(fin.st_mode) &&
- (getuid() != 0 ||
- (fin.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) != 0)) {
- if (!silent)
- printf("%s\n", candidate);
- return (1);
- }
- return (0);
-}
-
-static int
-print_matches(char *path, char *filename)
-{
- char candidate[PATH_MAX];
- const char *d;
- int found;
-
- if (strchr(filename, '/') != NULL)
- return (is_there(filename) ? 0 : -1);
- found = 0;
- while ((d = strsep(&path, ":")) != NULL) {
- if (*d == '\0')
- d = ".";
- if (snprintf(candidate, sizeof(candidate), "%s/%s", d,
- filename) >= (int)sizeof(candidate))
- continue;
- if (is_there(candidate)) {
- found = 1;
- if (!allpaths)
- break;
- }
- }
- return (found ? 0 : -1);
-}
-
diff --git a/usr.bin/who/Makefile b/usr.bin/who/Makefile
deleted file mode 100644
index 8695ca2..0000000
--- a/usr.bin/who/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-
-PROG= who
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/who/who.1 b/usr.bin/who/who.1
deleted file mode 100644
index e36b07c..0000000
--- a/usr.bin/who/who.1
+++ /dev/null
@@ -1,154 +0,0 @@
-.\" Copyright (c) 1986, 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)who.1 8.2 (Berkeley) 12/30/93
-.\" $FreeBSD$
-.\"
-.Dd May 8, 2002
-.Dt WHO 1
-.Os
-.Sh NAME
-.Nm who
-.Nd display who is on the system
-.Sh SYNOPSIS
-.Nm
-.Op Fl HmqsTu
-.Op Cm am I
-.Op Ar file
-.Sh DESCRIPTION
-The
-.Nm
-utility displays information about currently logged in users.
-By default, this includes the login name, tty name, date and time of login and
-remote hostname if not local.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl H
-Write column headings above the output.
-.It Fl m
-Show information about the terminal attached to standard input only.
-.It Fl q
-.Dq "Quick mode" :
-List the names and number of logged in users in columns.
-All other command line options are ignored.
-.It Fl s
-Show the name, line and time fields only.
-This is the default.
-.It Fl T
-Indicate whether each user is accepting messages.
-One of the following characters is written:
-.Pp
-.Bl -tag -width 1n -compact
-.It Li +
-User is accepting messages.
-.It Li \&-
-User is not accepting messages.
-.It Li \&?
-An error occurred.
-.El
-.It Fl u
-Show idle time for each user in hours and minutes as
-.Ar hh Ns : Ns Ar mm ,
-.Ql \&.
-if the user has been idle less that a minute, and
-.Dq Li old
-if the user has been idle more than 24 hours.
-.It Cm am I
-Equivalent to
-.Fl m .
-.El
-.Pp
-By default,
-.Nm
-gathers information from the file
-.Pa /var/run/utmp .
-An alternate
-.Ar file
-may be specified which is usually
-.Pa /var/log/wtmp
-(or
-.Pa /var/log/wtmp.[0-6]
-depending on site policy as
-.Pa wtmp
-can grow quite large and daily versions may or may not
-be kept around after compression by
-.Xr ac 8 ) .
-The
-.Pa wtmp
-file contains a record of every login, logout,
-crash, shutdown and date change
-since
-.Pa wtmp
-was last truncated or
-created.
-.Pp
-If
-.Pa /var/log/wtmp
-is being used as the file, the user name may be empty
-or one of the special characters '|', '}' and '~'.
-Logouts produce
-an output line without any user name.
-For more information on the
-special characters, see
-.Xr utmp 5 .
-.Sh ENVIRONMENT
-The
-.Ev COLUMNS , LANG , LC_ALL
-and
-.Ev LC_TIME
-environment variables affect the execution of
-.Nm
-as described in
-.Xr environ 7 .
-.Sh FILES
-.Bl -tag -width /var/log/wtmp.[0-6] -compact
-.It Pa /var/run/utmp
-.It Pa /var/log/wtmp
-.It Pa /var/log/wtmp.[0-6]
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr last 1 ,
-.Xr users 1 ,
-.Xr w 1 ,
-.Xr utmp 5
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.1-2001 .
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v1 .
diff --git a/usr.bin/who/who.c b/usr.bin/who/who.c
deleted file mode 100644
index f94fcdb..0000000
--- a/usr.bin/who/who.c
+++ /dev/null
@@ -1,312 +0,0 @@
-/*-
- * Copyright (c) 2002 Tim J. Robbins.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <errno.h>
-#include <langinfo.h>
-#include <limits.h>
-#include <locale.h>
-#include <paths.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <timeconv.h>
-#include <unistd.h>
-#include <utmp.h>
-
-static void heading(void);
-static void process_utmp(FILE *);
-static void quick(FILE *);
-static void row(struct utmp *);
-static int ttywidth(void);
-static void usage(void);
-static void whoami(FILE *);
-
-static int Hflag; /* Write column headings */
-static int mflag; /* Show info about current terminal */
-static int qflag; /* "Quick" mode */
-static int sflag; /* Show name, line, time */
-static int Tflag; /* Show terminal state */
-static int uflag; /* Show idle time */
-
-int
-main(int argc, char *argv[])
-{
- int ch;
- const char *file;
- FILE *fp;
-
- setlocale(LC_TIME, "");
-
- while ((ch = getopt(argc, argv, "HTmqsu")) != -1) {
- switch (ch) {
- case 'H': /* Write column headings */
- Hflag = 1;
- break;
- case 'T': /* Show terminal state */
- Tflag = 1;
- break;
- case 'm': /* Show info about current terminal */
- mflag = 1;
- break;
- case 'q': /* "Quick" mode */
- qflag = 1;
- break;
- case 's': /* Show name, line, time */
- sflag = 1;
- break;
- case 'u': /* Show idle time */
- uflag = 1;
- break;
- default:
- usage();
- /*NOTREACHED*/
- }
- }
- argc -= optind;
- argv += optind;
-
- if (argc >= 2 && strcmp(argv[0], "am") == 0 &&
- (strcmp(argv[1], "i") == 0 || strcmp(argv[1], "I") == 0)) {
- /* "who am i" or "who am I", equivalent to -m */
- mflag = 1;
- argc -= 2;
- argv += 2;
- }
- if (argc > 1)
- usage();
-
- if (*argv != NULL)
- file = *argv;
- else
- file = _PATH_UTMP;
- if ((fp = fopen(file, "r")) == NULL)
- err(1, "%s", file);
-
- if (qflag)
- quick(fp);
- else {
- if (sflag)
- Tflag = uflag = 0;
- if (Hflag)
- heading();
- if (mflag)
- whoami(fp);
- else
- process_utmp(fp);
- }
-
- fclose(fp);
-
- exit(0);
-}
-
-static void
-usage(void)
-{
-
- fprintf(stderr, "usage: who [-HmqsTu] [am I] [file]\n");
- exit(1);
-}
-
-static void
-heading(void)
-{
-
- printf("%-*s ", UT_NAMESIZE, "NAME");
- if (Tflag)
- printf("S ");
- printf("%-*s ", UT_LINESIZE, "LINE");
- printf("%-*s ", 12, "TIME");
- if (uflag)
- printf("IDLE ");
- printf("%-*s", UT_HOSTSIZE, "FROM");
- putchar('\n');
-}
-
-static void
-row(struct utmp *ut)
-{
- char buf[80], tty[sizeof(_PATH_DEV) + UT_LINESIZE];
- struct stat sb;
- time_t idle, t;
- static int d_first = -1;
- struct tm *tm;
- char state;
-
- if (d_first < 0)
- d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
-
- state = '?';
- idle = 0;
- if (Tflag || uflag) {
- snprintf(tty, sizeof(tty), "%s%.*s", _PATH_DEV,
- UT_LINESIZE, ut->ut_line);
- if (stat(tty, &sb) == 0) {
- state = sb.st_mode & (S_IWOTH|S_IWGRP) ?
- '+' : '-';
- idle = time(NULL) - sb.st_mtime;
- }
- }
-
- printf("%-*.*s ", UT_NAMESIZE, UT_NAMESIZE, ut->ut_name);
- if (Tflag)
- printf("%c ", state);
- printf("%-*.*s ", UT_LINESIZE, UT_LINESIZE, ut->ut_line);
- t = _time32_to_time(ut->ut_time);
- tm = localtime(&t);
- strftime(buf, sizeof(buf), d_first ? "%e %b %R" : "%b %e %R", tm);
- printf("%-*s ", 12, buf);
- if (uflag) {
- if (idle < 60)
- printf(" . ");
- else if (idle < 24 * 60 * 60)
- printf("%02d:%02d ", (int)(idle / 60 / 60),
- (int)(idle / 60 % 60));
- else
- printf(" old ");
- }
- if (*ut->ut_host != '\0')
- printf("(%.*s)", UT_HOSTSIZE, ut->ut_host);
- putchar('\n');
-}
-
-static int
-ttystat(char *line, int sz)
-{
- struct stat sb;
- char ttybuf[MAXPATHLEN];
-
- (void)snprintf(ttybuf, sizeof(ttybuf), "%s%.*s", _PATH_DEV, sz, line);
- if (stat(ttybuf, &sb) == 0) {
- return (0);
- } else
- return (-1);
-}
-
-static void
-process_utmp(FILE *fp)
-{
- struct utmp ut;
-
- while (fread(&ut, sizeof(ut), 1, fp) == 1) {
- if (*ut.ut_name == '\0')
- continue;
- if (ttystat(ut.ut_line, UT_LINESIZE) != 0)
- continue;
- row(&ut);
- }
-}
-
-static void
-quick(FILE *fp)
-{
- struct utmp ut;
- int col, ncols, num;
-
- ncols = ttywidth();
- col = num = 0;
- while (fread(&ut, sizeof(ut), 1, fp) == 1) {
- if (*ut.ut_name == '\0')
- continue;
- printf("%-*.*s", UT_NAMESIZE, UT_NAMESIZE, ut.ut_name);
- if (++col < ncols / (UT_NAMESIZE + 1))
- putchar(' ');
- else {
- col = 0;
- putchar('\n');
- }
- num++;
- }
- if (col != 0)
- putchar('\n');
-
- printf("# users = %d\n", num);
-}
-
-static void
-whoami(FILE *fp)
-{
- struct utmp ut;
- struct passwd *pwd;
- const char *name, *p, *tty;
-
- if ((tty = ttyname(STDIN_FILENO)) == NULL)
- tty = "tty??";
- else if ((p = strrchr(tty, '/')) != NULL)
- tty = p + 1;
-
- /* Search utmp for our tty, dump first matching record. */
- while (fread(&ut, sizeof(ut), 1, fp) == 1)
- if (*ut.ut_name != '\0' && strncmp(ut.ut_line, tty,
- UT_LINESIZE) == 0) {
- row(&ut);
- return;
- }
-
- /* Not found; fill the utmp structure with the information we have. */
- memset(&ut, 0, sizeof(ut));
- if ((pwd = getpwuid(getuid())) != NULL)
- name = pwd->pw_name;
- else
- name = "?";
- strncpy(ut.ut_name, name, UT_NAMESIZE);
- strncpy(ut.ut_line, tty, UT_LINESIZE);
- ut.ut_time = _time_to_time32(time(NULL));
- row(&ut);
-}
-
-static int
-ttywidth(void)
-{
- struct winsize ws;
- long width;
- char *cols, *ep;
-
- if ((cols = getenv("COLUMNS")) != NULL && *cols != '\0') {
- errno = 0;
- width = strtol(cols, &ep, 10);
- if (errno || width <= 0 || width > INT_MAX || ep == cols ||
- *ep != '\0')
- warnx("invalid COLUMNS environment variable ignored");
- else
- return (width);
- }
- if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) != -1)
- return (ws.ws_col);
-
- return (80);
-}
diff --git a/usr.bin/whois/Makefile b/usr.bin/whois/Makefile
deleted file mode 100644
index e6f82fd..0000000
--- a/usr.bin/whois/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= whois
-
-.if defined(SOCKS)
-CFLAGS+=-DSOCKS
-CFLAGS+=-Dconnect=Rconnect -Dgetsockname=Rgetsockname -Dlisten=Rlisten \
- -Daccept=Raccept -Drcmd=Rrcmd -Dbind=Rbind -Dselect=Rselect
-LDADD+= -lsocks
-.endif
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/whois/whois.1 b/usr.bin/whois/whois.1
deleted file mode 100644
index 52da220..0000000
--- a/usr.bin/whois/whois.1
+++ /dev/null
@@ -1,289 +0,0 @@
-.\" Copyright (c) 1985, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" From: @(#)whois.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd January 23, 2006
-.Dt WHOIS 1
-.Os
-.Sh NAME
-.Nm whois
-.Nd "Internet domain name and network number directory service"
-.Sh SYNOPSIS
-.Nm
-.Op Fl aAbdfgiIklmQrR6
-.Op Fl c Ar country-code | Fl h Ar host
-.Op Fl p Ar port
-.Ar name ...
-.Sh DESCRIPTION
-The
-.Nm
-utility looks up records in the databases maintained by several
-Network Information Centers
-.Pq Tn NICs .
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl a
-Use the American Registry for Internet Numbers
-.Pq Tn ARIN
-database.
-It contains network numbers used in those parts of the world covered neither by
-.Tn APNIC , AfriNIC , LACNIC ,
-nor by
-.Tn RIPE .
-.Pp
-(Hint: All point of contact handles in the
-.Tn ARIN
-whois database end with
-.Qq Li -ARIN . )
-.Pp
-.It Fl A
-Use the Asia/Pacific Network Information Center
-.Pq Tn APNIC
-database.
-It contains network numbers used in East Asia, Australia,
-New Zealand, and the Pacific islands.
-.It Fl b
-Use the Network Abuse Clearinghouse database.
-It contains addresses to which network abuse should be reported,
-indexed by domain name.
-.It Fl c Ar country-code
-This is the equivalent of using the
-.Fl h
-option with an argument of
-.Qq Ar country-code Ns Li .whois-servers.net .
-.It Fl d
-Use the US Department of Defense
-database.
-It contains points of contact for subdomains of
-.Pa .MIL .
-.It Fl f
-Use the African Network Information Centre
-.Pq Tn AfriNIC
-database.
-It contains network numbers used in Africa and the islands of the
-western Indian Ocean.
-.It Fl g
-Use the US non-military federal government database, which contains points of
-contact for subdomains of
-.Pa .GOV .
-.It Fl h Ar host
-Use the specified host instead of the default variant.
-Either a host name or an IP address may be specified.
-.Pp
-By default
-.Nm
-constructs the name of a whois server to use from the top-level domain
-.Pq Tn TLD
-of the supplied (single) argument, and appending
-.Qq Li .whois-servers.net .
-This effectively allows a suitable whois server to be selected
-automatically for a large number of
-.Tn TLDs .
-.Pp
-In the event that an IP
-address is specified, the whois server will default to the American
-Registry for Internet Numbers
-.Pq Tn ARIN .
-If a query to
-.Tn ARIN
-references
-.Tn APNIC , AfriNIC , LACNIC ,
-or
-.Tn RIPE ,
-that server will be queried also, provided that the
-.Fl Q
-option is not specified.
-.Pp
-If the query is not a domain name or IP address,
-.Nm
-will fall back to
-.Pa whois.crsnic.net .
-.It Fl i
-Use the Network Solutions Registry for Internet Numbers
-.Pq Pa whois.networksolutions.com
-database.
-It contains network numbers and domain contact information for most of
-.Pa .COM , .NET , .ORG
-and
-.Pa .EDU
-domains.
-.Pp
-.Sy NOTE !
-The registration of these domains is now done by a number of
-independent and competing registrars and this database holds no information
-on the domains registered by organizations other than Network Solutions, Inc.
-Also, note that the
-.Tn InterNIC
-database
-.Pq Pa whois.internic.net
-is no longer handled by Network Solutions, Inc.
-For details, see
-.Pa http://www.internic.net/ .
-.Pp
-(Hint: Contact information, identified by the term
-.Em handle ,
-can be looked up by prefixing
-.Qq Li "handle "
-to the
-.Tn NIC
-handle in the query.)
-.It Fl I
-Use the Internet Assigned Numbers Authority
-.Pq Tn IANA
-database.
-It contains network information for top-level domains.
-.It Fl k
-Use the National Internet Development Agency of Korea's
-.Pq Tn KRNIC
-database.
-It contains network numbers and domain contact information
-for Korea.
-.It Fl l
-Use the Latin American and Caribbean IP address Regional Registry
-.Pq Tn LACNIC
-database.
-It contains network numbers used in much of Latin America and the
-Caribbean.
-.It Fl m
-Use the Route Arbiter Database
-.Pq Tn RADB
-database.
-It contains route policy specifications for a large
-number of operators' networks.
-.It Fl p Ar port
-Connect to the whois server on
-.Ar port .
-If this option is not specified,
-.Nm
-defaults to port 43.
-.It Fl Q
-Do a quick lookup.
-This means that
-.Nm
-will not attempt to lookup the name in the authoritative whois
-server (if one is listed).
-This option has no effect when combined with any other options.
-.It Fl r
-Use the R\(aaeseaux IP Europ\(aaeens
-.Pq Tn RIPE
-database.
-It contains network numbers and domain contact information
-for Europe.
-.It Fl R
-Use the Russia Network Information Center
-.Pq Tn RIPN
-database.
-It contains network numbers and domain contact information
-for subdomains of
-.Pa .RU .
-This option is deprecated; use the
-.Fl c
-option with an argument of
-.Qq Li RU
-instead.
-.It Fl 6
-Use the IPv6 Resource Center
-.Pq Tn 6bone
-database.
-It contains network names and addresses for the IPv6 network.
-.El
-.Pp
-The operands specified to
-.Nm
-are treated independently and may be used
-as queries on different whois servers.
-.Sh EXAMPLES
-Most types of data, such as domain names and
-.Tn IP
-addresses, can be used as arguments to
-.Nm
-without any options, and
-.Nm
-will choose the correct whois server to query.
-Some exceptions, where
-.Nm
-will not be able to handle data correctly, are detailed below.
-.Pp
-To obtain contact information about an
-administrator located in the Russian
-.Tn TLD
-domain
-.Qq Li RU ,
-use the
-.Fl c
-option as shown in the following example, where
-.Ar CONTACT-ID
-is substituted with the actual contact identifier.
-.Pp
-.Dl "whois -c RU CONTACT-ID"
-.Pp
-(Note: This example is specific to the
-.Tn TLD
-.Qq Li RU ,
-but other
-.Tn TLDs
-can be queried by using a similar syntax.)
-.Pp
-The following example demonstrates how to obtain information about an
-.Tn IPv6
-address or hostname using the
-.Fl 6
-option, which directs the query to
-.Tn 6bone .
-.Pp
-.Dl "whois -6 IPv6-IP-Address"
-.Pp
-The following example demonstrates how to query
-a whois server using a non-standard port, where
-.Dq Li query-data
-is the query to be sent to
-.Dq Li whois.example.com
-on port
-.Dq Li rwhois
-(written numerically as 4321).
-.Pp
-.Dl "whois -h whois.example.com -p rwhois query-data"
-.Sh SEE ALSO
-.Rs
-.%A Ken Harrenstien
-.%A Vic White
-.%T NICNAME/WHOIS
-.%D 1 March 1982
-.%O RFC 812
-.Re
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.3 .
diff --git a/usr.bin/whois/whois.c b/usr.bin/whois/whois.c
deleted file mode 100644
index c216556..0000000
--- a/usr.bin/whois/whois.c
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)whois.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <ctype.h>
-#include <err.h>
-#include <netdb.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysexits.h>
-#include <unistd.h>
-
-#define ABUSEHOST "whois.abuse.net"
-#define NICHOST "whois.crsnic.net"
-#define INICHOST "whois.networksolutions.com"
-#define DNICHOST "whois.nic.mil"
-#define GNICHOST "whois.nic.gov"
-#define ANICHOST "whois.arin.net"
-#define LNICHOST "whois.lacnic.net"
-#define KNICHOST "whois.krnic.net"
-#define RNICHOST "whois.ripe.net"
-#define PNICHOST "whois.apnic.net"
-#define MNICHOST "whois.ra.net"
-#define QNICHOST_TAIL ".whois-servers.net"
-#define SNICHOST "whois.6bone.net"
-#define BNICHOST "whois.registro.br"
-#define NORIDHOST "whois.norid.no"
-#define IANAHOST "whois.iana.org"
-#define GERMNICHOST "de.whois-servers.net"
-#define FNICHOST "whois.afrinic.net"
-#define DEFAULT_PORT "whois"
-#define WHOIS_SERVER_ID "Whois Server: "
-#define WHOIS_ORG_SERVER_ID "Registrant Street1:Whois Server:"
-
-#define WHOIS_RECURSE 0x01
-#define WHOIS_QUICK 0x02
-
-#define ishost(h) (isalnum((unsigned char)h) || h == '.' || h == '-')
-
-const char *ip_whois[] = { LNICHOST, RNICHOST, PNICHOST, BNICHOST,
- FNICHOST, NULL };
-const char *port = DEFAULT_PORT;
-
-static char *choose_server(char *);
-static struct addrinfo *gethostinfo(char const *host, int exit_on_error);
-static void s_asprintf(char **ret, const char *format, ...) __printflike(2, 3);
-static void usage(void);
-static void whois(const char *, const char *, int);
-
-int
-main(int argc, char *argv[])
-{
- const char *country, *host;
- char *qnichost;
- int ch, flags, use_qnichost;
-
-#ifdef SOCKS
- SOCKSinit(argv[0]);
-#endif
-
- country = host = qnichost = NULL;
- flags = use_qnichost = 0;
- while ((ch = getopt(argc, argv, "aAbc:dfgh:iIklmp:QrR6")) != -1) {
- switch (ch) {
- case 'a':
- host = ANICHOST;
- break;
- case 'A':
- host = PNICHOST;
- break;
- case 'b':
- host = ABUSEHOST;
- break;
- case 'c':
- country = optarg;
- break;
- case 'd':
- host = DNICHOST;
- break;
- case 'f':
- host = FNICHOST;
- break;
- case 'g':
- host = GNICHOST;
- break;
- case 'h':
- host = optarg;
- break;
- case 'i':
- host = INICHOST;
- break;
- case 'I':
- host = IANAHOST;
- break;
- case 'k':
- host = KNICHOST;
- break;
- case 'l':
- host = LNICHOST;
- break;
- case 'm':
- host = MNICHOST;
- break;
- case 'p':
- port = optarg;
- break;
- case 'Q':
- flags |= WHOIS_QUICK;
- break;
- case 'r':
- host = RNICHOST;
- break;
- case 'R':
- warnx("-R is deprecated; use '-c ru' instead");
- country = "ru";
- break;
- case '6':
- host = SNICHOST;
- break;
- case '?':
- default:
- usage();
- /* NOTREACHED */
- }
- }
- argc -= optind;
- argv += optind;
-
- if (!argc || (country != NULL && host != NULL))
- usage();
-
- /*
- * If no host or country is specified determine the top level domain
- * from the query. If the TLD is a number, query ARIN. Otherwise, use
- * TLD.whois-server.net. If the domain does not contain '.', fall
- * back to NICHOST.
- */
- if (host == NULL && country == NULL) {
- use_qnichost = 1;
- host = NICHOST;
- if (!(flags & WHOIS_QUICK))
- flags |= WHOIS_RECURSE;
- }
- while (argc-- > 0) {
- if (country != NULL) {
- s_asprintf(&qnichost, "%s%s", country, QNICHOST_TAIL);
- whois(*argv, qnichost, flags);
- } else if (use_qnichost)
- if ((qnichost = choose_server(*argv)) != NULL)
- whois(*argv, qnichost, flags);
- if (qnichost == NULL)
- whois(*argv, host, flags);
- free(qnichost);
- qnichost = NULL;
- argv++;
- }
- exit(0);
-}
-
-/*
- * This function will remove any trailing periods from domain, after which it
- * returns a pointer to newly allocated memory containing the whois server to
- * be queried, or a NULL if the correct server couldn't be determined. The
- * caller must remember to free(3) the allocated memory.
- */
-static char *
-choose_server(char *domain)
-{
- char *pos, *retval;
-
- for (pos = strchr(domain, '\0'); pos > domain && *--pos == '.';)
- *pos = '\0';
- if (*domain == '\0')
- errx(EX_USAGE, "can't search for a null string");
- if (strlen(domain) > sizeof("-NORID")-1 &&
- strcasecmp(domain + strlen(domain) - sizeof("-NORID") + 1,
- "-NORID") == 0) {
- s_asprintf(&retval, "%s", NORIDHOST);
- return (retval);
- }
- while (pos > domain && *pos != '.')
- --pos;
- if (pos <= domain)
- return (NULL);
- if (isdigit((unsigned char)*++pos))
- s_asprintf(&retval, "%s", ANICHOST);
- else
- s_asprintf(&retval, "%s%s", pos, QNICHOST_TAIL);
- return (retval);
-}
-
-static struct addrinfo *
-gethostinfo(char const *host, int exit_on_error)
-{
- struct addrinfo hints, *res;
- int error;
-
- memset(&hints, 0, sizeof(hints));
- hints.ai_flags = 0;
- hints.ai_family = AF_UNSPEC;
- hints.ai_socktype = SOCK_STREAM;
- error = getaddrinfo(host, port, &hints, &res);
- if (error) {
- warnx("%s: %s", host, gai_strerror(error));
- if (exit_on_error)
- exit(EX_NOHOST);
- return (NULL);
- }
- return (res);
-}
-
-/*
- * Wrapper for asprintf(3) that exits on error.
- */
-static void
-s_asprintf(char **ret, const char *format, ...)
-{
- va_list ap;
-
- va_start(ap, format);
- if (vasprintf(ret, format, ap) == -1) {
- va_end(ap);
- err(EX_OSERR, "vasprintf()");
- }
- va_end(ap);
-}
-
-static void
-whois(const char *query, const char *hostname, int flags)
-{
- FILE *sfi, *sfo;
- struct addrinfo *hostres, *res;
- char *buf, *host, *nhost, *p;
- int i, s;
- size_t c, len;
-
- s = -1;
- hostres = gethostinfo(hostname, 1);
- for (res = hostres; res; res = res->ai_next) {
- s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
- if (s < 0)
- continue;
- if (connect(s, res->ai_addr, res->ai_addrlen) == 0)
- break;
- close(s);
- }
- freeaddrinfo(hostres);
- if (res == NULL)
- err(EX_OSERR, "connect()");
-
- sfi = fdopen(s, "r");
- sfo = fdopen(s, "w");
- if (sfi == NULL || sfo == NULL)
- err(EX_OSERR, "fdopen()");
- if (strcmp(hostname, GERMNICHOST) == 0) {
- fprintf(sfo, "-T dn,ace -C US-ASCII %s\r\n", query);
- } else if (strcmp(hostname, "dk" QNICHOST_TAIL) == 0) {
- fprintf(sfo, "--show-handles %s\r\n", query);
- } else {
- fprintf(sfo, "%s\r\n", query);
- }
- fflush(sfo);
- nhost = NULL;
- while ((buf = fgetln(sfi, &len)) != NULL) {
- while (len > 0 && isspace((unsigned char)buf[len - 1]))
- buf[--len] = '\0';
- printf("%.*s\n", (int)len, buf);
-
- if ((flags & WHOIS_RECURSE) && nhost == NULL) {
- host = strnstr(buf, WHOIS_SERVER_ID, len);
- if (host != NULL) {
- host += sizeof(WHOIS_SERVER_ID) - 1;
- for (p = host; p < buf + len; p++) {
- if (!ishost(*p)) {
- *p = '\0';
- break;
- }
- }
- s_asprintf(&nhost, "%.*s",
- (int)(buf + len - host), host);
- } else if ((host =
- strnstr(buf, WHOIS_ORG_SERVER_ID, len)) != NULL) {
- host += sizeof(WHOIS_ORG_SERVER_ID) - 1;
- for (p = host; p < buf + len; p++) {
- if (!ishost(*p)) {
- *p = '\0';
- break;
- }
- }
- s_asprintf(&nhost, "%.*s",
- (int)(buf + len - host), host);
- } else if (strcmp(hostname, ANICHOST) == 0) {
- for (c = 0; c <= len; c++)
- buf[c] = tolower((unsigned char)buf[c]);
- for (i = 0; ip_whois[i] != NULL; i++) {
- if (strnstr(buf, ip_whois[i], len) !=
- NULL) {
- s_asprintf(&nhost, "%s",
- ip_whois[i]);
- break;
- }
- }
- }
- }
- }
- if (nhost != NULL) {
- whois(query, nhost, 0);
- free(nhost);
- }
-}
-
-static void
-usage(void)
-{
- fprintf(stderr,
- "usage: whois [-aAbdfgiIklmQrR6] [-c country-code | -h hostname] "
- "[-p port] name ...\n");
- exit(EX_USAGE);
-}
diff --git a/usr.bin/window/Makefile b/usr.bin/window/Makefile
deleted file mode 100644
index 8d0daa4..0000000
--- a/usr.bin/window/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= window
-SRCS= char.c cmd.c cmd1.c cmd2.c cmd3.c cmd4.c cmd5.c cmd6.c cmd7.c \
- context.c error.c lcmd.c lcmd1.c lcmd2.c main.c mloop.c parser1.c \
- parser2.c parser3.c parser4.c parser5.c scanner.c startup.c string.c \
- ttf100.c ttgeneric.c tth19.c tth29.c ttinit.c ttoutput.c tttermcap.c \
- tttvi925.c ttwyse60.c ttwyse75.c ttzapple.c ttzentec.c var.c win.c \
- wwadd.c wwalloc.c wwbox.c wwchild.c wwclose.c wwclreol.c wwclreos.c \
- wwcursor.c wwdata.c wwdelchar.c wwdelete.c wwdelline.c wwdump.c \
- wwend.c wwenviron.c wwerror.c wwflush.c wwframe.c wwgets.c wwinit.c \
- wwinschar.c wwinsline.c wwiomux.c wwlabel.c wwmisc.c wwmove.c \
- wwopen.c wwprintf.c wwpty.c wwputc.c wwputs.c wwredraw.c \
- wwredrawwin.c wwrint.c wwscroll.c wwsize.c wwspawn.c wwsuspend.c \
- wwterminfo.c wwtty.c wwunframe.c wwupdate.c wwwrite.c xx.c xxflush.c \
- compress.c
-DPADD= ${LIBTERMCAP} ${LIBUTIL}
-LDADD= -ltermcap -lutil
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/window/README b/usr.bin/window/README
deleted file mode 100644
index 42d45b3..0000000
--- a/usr.bin/window/README
+++ /dev/null
@@ -1,199 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)README 8.1 (Berkeley) 6/6/93
- */
-
-Compilation notes:
-
- Compiler options:
-
- BYTE_ORDER (used only in ww.h)
- It should already be defined in machine/endian.h.
- The code knows about BIG_ENDIAN, LITTLE_ENDIAN, and PDP_ENDIAN.
- It only cares about byte order in words, so PDP_ENDIAN
- is the same as LITTLE_ENDIAN.
- OLD_TTY
- If you don't have Posix termios, then define this.
- VMIN_BUG
- Even if you have Posix termios, define this if the MIN and TIME
- feature in noncanonical mode doesn't work correctly.
-
- Ok, there's another one, STR_DEBUG. It turns on consistency checks
- in the string allocator. It's been left on since performace doesn't
- seem to suffer. There's an abort() somewhere when an inconsistency
- is found. It hasn't happened in years.
-
- The file local.h contains locally tunable constants.
-
- The makefile used to be updated with mkmf; it has been changed
-at various times to use cpp -M and, currently, mkdep. The only library
-it needs is termcap.
-
- Window, as is, only runs on 4.3 (or later) machines.
-
- On 4.2 machines, at least these modifications must be done:
-
- delete uses of window size ioctls: TIOCGWINSZ, TIOCSWINSZ,
- struct winsize
- add to ww.h
- typedef int fd_set;
- #define FD_ZERO(s) (*(s) = 0)
- #define FD_SET(b, s) (*(s) |= 1 << (b))
- #define FD_ISSET(b, s) (*(s) & 1 << (b))
- add to ww.h
- #define sigmask(s) (1 << (s) - 1)
-
-
-A few notes about the internals:
-
- The window package. Windows are opened by calling wwopen().
-Wwwrite() is the primitive for writing to windows. Wwputc(), wwputs(),
-and wwprintf() are also supported. Some of the outputs to windows are
-delayed. Wwupdate() updates the terminal to match the internal screen
-buffer. Wwspawn() spawns a child process on the other end of a window,
-with its environment tailored to the window. Visible windows are
-doubly linked in the order of their overlap. Wwadd() inserts a window
-into the list at a given place. Wwdelete() deletes it. Windows not in
-the list are not visible, though wwwrite() still works. Window was
-written before the days of X and Sunview, so some of the terminology
-is not standard.
-
- Most functions return -1 on error. Wwopen() returns the null
-pointer. An error number is saved in wwerrno. Wwerror() returns an
-error string based on wwerrno suitable for printing.
-
- The terminal drivers perform all output to the physical terminal,
-including special functions like character and line insertion and
-deletion. The window package keeps a list of known terminals. At
-initialization time, the terminal type is matched against the list to
-find the right terminal driver to use. The last driver, the generic
-driver, matches all terminals and uses the termcap database. The
-interface between the window package the terminal driver is the `tt'
-structure. It contains pointers to functions to perform special
-functions and terminal output, as well as flags about the
-characteristics of the terminal. Most of these ideas are borrowed
-from the Maryland window package, which in turn is based on Goslin's
-Emacs.
-
- The IO system is semi-synchronous. Terminal input is signal
-driven, and everything else is done synchronously with a single
-select(). It is roughly event-driven, though not in a clean way.
-
- Normally, in both conversation mode and command mode, window
-sleeps in a select() in wwiomux() waiting for data from the
-pseudo-terminals. At the same time, terminal input causes SIGIO which
-is caught by wwrint(). The select() returns when at least one of the
-pseudo-terminals becomes ready for reading.
-
- Wwrint() is the interrupt handler for tty input. It reads input
-into a linear buffer accessed through four pointers:
-
- +-------+--------------+----------------+
- | empty | data | empty |
- +-------+--------------+----------------+
- ^ ^ ^ ^
- | | | |
- wwib wwibp wwibq wwibe
-
-Wwrint() appends characters at the end and increments wwibq (*wwibq++
-= c), and characters are taken off the buffer at wwibp using the
-wwgetc() and wwpeekc() macros. As is the convention in C, wwibq
-and wwibe point to one position beyond the end. In addition,
-wwrint() will do a longjmp(wwjmpbuf) if wwsetjmp is true. This is
-used by wwiomux() to interrupt the select() which would otherwise
-resume after the interrupt. (Actually, I hear this is not true,
-but the longjmp feature is used to avoid a race condition as well.
-Anyway, it means I didn't have to depend on a feature in a
-daily-changing kernel, but that's another story.) The macro
-wwinterrupt() returns true if the input buffer is non-empty.
-Wwupdate(), wwwrite(), and wwiomux() check this condition and will
-return at the first convenient opportunity when it becomes true.
-In the case of wwwrite(), the flag ww_nointr in the window structure
-overrides this. This feature allows the user to interrupt lengthy
-outputs safely. The structure of the input buffer is designed to
-avoid race conditions without blocking interrupts.
-
- Actually, wwsetjmp and wwinterrupt() are part of a software
-interrupt scheme used by the two interrupt catchers wwrint() and
-wwchild(). Asserting the interrupt lets the synchronous parts of
-the program know that there's an interesting asynchronous condition
-(i.e., got a keyboard character, or a child process died) that they
-might want to process before anything else. The synchronous routines
-can check for this condition with wwinterrupt() or by arranging
-that a longjmp() be done.
-
- Wwiomux() copies pseudo-terminal output into their corresponding
-windows. Without anything to do, it blocks in a select(), waiting for
-read ready on pseudo-terminals. Reads are done into per-window buffers
-in the window structures. When there is at least one buffer non-empty,
-wwiomux() finds the top most of these windows and writes it using
-wwwrite(). Then the process is repeated. A non-blocking select() is
-done after a wwwrite() to pick up any output that may have come in
-during the write, which may take a long time. Specifically, we use
-this to stop output or flush buffer when a pseudo-terminal tells us to
-(we use pty packet mode). The select() blocks only when all of the
-windows' buffers are empty. A wwupdate() is done prior to this, which
-is the only time the screen is guaranteed to be completely up to date.
-Wwiomux() loops until wwinterrupt() becomes true.
-
- The top level routine for all this is mloop(). In conversation
-mode, it simply calls wwiomux(), which only returns when input is
-available. The input buffer is then written to the pseudo-terminal of
-the current window. If the escape character is found in the input,
-command mode is entered. Otherwise, the process is repeated. In
-command mode, control is transferred to docmd() which returns only when
-conversation mode is reentered. Docmd() and other command processing
-routines typically wait for input in a loop:
-
- while (wwpeekc() < 0)
- wwiomux();
-
-When the loop terminates, wwgetc() is used to read the input buffer.
-
- Output to the physical terminal is handled by the lowest level
-routines of the window package, in the files ttoutput.c and tt.h. The
-standard IO package is not used, to get better control over buffering
-and to use non-blocking reads in wwrint(). The buffer size is set to
-approximately one second of output time, based on the baudrate.
-
- The result of all this complexity is faster response time,
-especially in output stopping and flushing. Wwwrite() checks
-wwinterrupt() after every line. It also calls wwupdate() for each line
-it writes. The output buffer is limited to one second of output time.
-Thus, there is usually only a delay of one to two lines plus one second
-after a ^C or ^S. Also, commands that produce lengthy output can be
-aborted without actually showing all of it on the terminal. (Try the
-'?' command followed by escape immediately.)
diff --git a/usr.bin/window/alias.h b/usr.bin/window/alias.h
deleted file mode 100644
index 8b6aba3..0000000
--- a/usr.bin/window/alias.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)alias.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#define alias var
-#define a_name r_name
-#define a_buf r_val.v_str
-#define a_flags r_val.v_type
-
- /* a_flags bits, must not interfere with v_type values */
-#define A_INUSE 0x010 /* already inuse */
-
-#define alias_set(n, s) var_setstr1(&alias_head, n, s)
-#define alias_walk(f, a) var_walk1(alias_head, f, a)
-#define alias_unset(n) var_unset1(&alias_head, n)
-#define alias_lookup(n) (*var_lookup1(&alias_head, n))
-
-struct var *alias_head;
diff --git a/usr.bin/window/char.c b/usr.bin/window/char.c
deleted file mode 100644
index cd9a6eb..0000000
--- a/usr.bin/window/char.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)char.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "char.h"
-
-char *_unctrl[] = {
- "^@", "^A", "^B", "^C", "^D", "^E", "^F", "^G",
- "^H", "^I", "^J", "^K", "^L", "^M", "^N", "^O",
- "^P", "^Q", "^R", "^S", "^T", "^U", "^V", "^W",
- "^X", "^Y", "^Z", "^[", "^\\", "^]", "^^", "^_",
- " ", "!", "\"", "#", "$", "%", "&", "'",
- "(", ")", "*", "+", ",", "-", ".", "/",
- "0", "1", "2", "3", "4", "5", "6", "7",
- "8", "9", ":", ";", "<", "=", ">", "?",
- "@", "A", "B", "C", "D", "E", "F", "G",
- "H", "I", "J", "K", "L", "M", "N", "O",
- "P", "Q", "R", "S", "T", "U", "V", "W",
- "X", "Y", "Z", "[", "\\", "]", "^", "_",
- "`", "a", "b", "c", "d", "e", "f", "g",
- "h", "i", "j", "k", "l", "m", "n", "o",
- "p", "q", "r", "s", "t", "u", "v", "w",
- "x", "y", "z", "{", "|", "}", "~", "^?",
- "\\200","\\201","\\202","\\203","\\204","\\205","\\206","\\207",
- "\\210","\\211","\\212","\\213","\\214","\\215","\\216","\\217",
- "\\220","\\221","\\222","\\223","\\224","\\225","\\226","\\227",
- "\\230","\\231","\\232","\\233","\\234","\\235","\\236","\\237",
- "\\240","\\241","\\242","\\243","\\244","\\245","\\246","\\247",
- "\\250","\\251","\\252","\\253","\\254","\\255","\\256","\\257",
- "\\260","\\261","\\262","\\263","\\264","\\265","\\266","\\267",
- "\\270","\\271","\\272","\\273","\\274","\\275","\\276","\\277",
- "\\300","\\301","\\302","\\303","\\304","\\305","\\306","\\307",
- "\\310","\\311","\\312","\\313","\\314","\\315","\\316","\\317",
- "\\320","\\321","\\322","\\323","\\324","\\325","\\326","\\327",
- "\\330","\\331","\\332","\\333","\\334","\\335","\\336","\\337",
- "\\340","\\341","\\342","\\343","\\344","\\345","\\346","\\347",
- "\\350","\\351","\\352","\\353","\\354","\\355","\\356","\\357",
- "\\360","\\361","\\362","\\363","\\364","\\365","\\366","\\367",
- "\\370","\\371","\\372","\\373","\\374","\\375","\\376","\\377"
-};
diff --git a/usr.bin/window/char.h b/usr.bin/window/char.h
deleted file mode 100644
index c4b957c..0000000
--- a/usr.bin/window/char.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)char.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-/*
- * Macros and things to deal with control characters.
- *
- * Unctrl() is just like the standard function, except we don't want
- * to include curses.
- * Isctrl() returns true for all characters less than space and
- * greater than or equal to delete.
- * Isprt() is tab and all characters not isctrl(). It's used
- * by wwwrite().
- * Isunctrl() includes all characters that should be expanded
- * using unctrl() by wwwrite() if ww_unctrl is set.
- */
-
-#include <ctype.h>
-#include <string.h>
-#include <stdlib.h>
-
-extern char *_unctrl[];
-#define ctrl(c) (c & 0x1f)
-#define unctrl(c) (_unctrl[(unsigned char) (c)])
-#define isctrl(c) iscntrl((unsigned char)(c))
-#define isprt(c) (isprint((unsigned char)(c)) || (c) == '\t')
-#define isunctrl(c) (strchr("\b\t\n\r", (c)) == NULL && isctrl(c))
diff --git a/usr.bin/window/cmd.c b/usr.bin/window/cmd.c
deleted file mode 100644
index 698930e..0000000
--- a/usr.bin/window/cmd.c
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)cmd.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "defs.h"
-#include "char.h"
-
-docmd()
-{
- register c;
- register struct ww *w;
- char out = 0;
-
- while (!out && !quit) {
- if ((c = wwgetc()) < 0) {
- if (terse)
- wwsetcursor(0, 0);
- else {
- wwputs("Command: ", cmdwin);
- wwcurtowin(cmdwin);
- }
- do
- wwiomux();
- while ((c = wwgetc()) < 0);
- }
- if (!terse)
- wwputc('\n', cmdwin);
- switch (c) {
- default:
- if (c != escapec)
- break;
- case 'h': case 'j': case 'k': case 'l':
- case 'y': case 'p':
- case ctrl('y'):
- case ctrl('e'):
- case ctrl('u'):
- case ctrl('d'):
- case ctrl('b'):
- case ctrl('f'):
- case ctrl('s'):
- case ctrl('q'):
- case ctrl('['):
- if (selwin == 0) {
- error("No window.");
- continue;
- }
- }
- switch (c) {
- case '1': case '2': case '3': case '4': case '5':
- case '6': case '7': case '8': case '9':
- if ((w = window[c - '1']) == 0) {
- error("%c: No such window.", c);
- break;
- }
- setselwin(w);
- if (checkproc(selwin) >= 0)
- out = 1;
- break;
- case '%':
- if ((w = getwin()) != 0)
- setselwin(w);
- break;
- case ctrl('^'):
- if (lastselwin != 0) {
- setselwin(lastselwin);
- if (checkproc(selwin) >= 0)
- out = 1;
- } else
- error("No previous window.");
- break;
- case 'c':
- if ((w = getwin()) != 0)
- closewin(w);
- break;
- case 'w':
- c_window();
- break;
- case 'm':
- if ((w = getwin()) != 0)
- c_move(w);
- break;
- case 'M':
- if ((w = getwin()) != 0)
- movewin(w, w->ww_alt.t, w->ww_alt.l);
- break;
- case 's':
- if ((w = getwin()) != 0)
- c_size(w);
- break;
- case 'S':
- if ((w = getwin()) != 0)
- sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
- break;
- case 'y':
- c_yank();
- break;
- case 'p':
- c_put();
- break;
- case ':':
- c_colon();
- break;
- case 'h':
- (void) wwwrite(selwin, "\b", 1);
- break;
- case 'j':
- (void) wwwrite(selwin, "\n", 1);
- break;
- case 'k':
- (void) wwwrite(selwin, "\033A", 2);
- break;
- case 'l':
- (void) wwwrite(selwin, "\033C", 2);
- break;
- case ctrl('e'):
- wwscroll(selwin, 1);
- break;
- case ctrl('y'):
- wwscroll(selwin, -1);
- break;
- case ctrl('d'):
- wwscroll(selwin, selwin->ww_w.nr / 2);
- break;
- case ctrl('u'):
- wwscroll(selwin, - selwin->ww_w.nr / 2);
- break;
- case ctrl('f'):
- wwscroll(selwin, selwin->ww_w.nr);
- break;
- case ctrl('b'):
- wwscroll(selwin, - selwin->ww_w.nr);
- break;
- case ctrl('s'):
- stopwin(selwin);
- break;
- case ctrl('q'):
- startwin(selwin);
- break;
- case ctrl('l'):
- wwredraw();
- break;
- case '?':
- c_help();
- break;
- case ctrl('['):
- if (checkproc(selwin) >= 0)
- out = 1;
- break;
- case ctrl('z'):
- wwsuspend();
- break;
- case 'q':
- c_quit();
- break;
- /* debugging stuff */
- case '&':
- if (debug) {
- c_debug();
- break;
- }
- default:
- if (c == escapec) {
- if (checkproc(selwin) >= 0) {
- (void) write(selwin->ww_pty,
- &escapec, 1);
- out = 1;
- }
- } else {
- if (!terse)
- wwbell();
- error("Type ? for help.");
- }
- }
- }
- if (!quit)
- setcmd(0);
-}
-
-struct ww *
-getwin()
-{
- register int c;
- struct ww *w = 0;
-
- if (!terse)
- wwputs("Which window? ", cmdwin);
- wwcurtowin(cmdwin);
- while ((c = wwgetc()) < 0)
- wwiomux();
- if (debug && c == 'c')
- w = cmdwin;
- else if (debug && c == 'f')
- w = framewin;
- else if (debug && c == 'b')
- w = boxwin;
- else if (c >= '1' && c < NWINDOW + '1')
- w = window[c - '1'];
- else if (c == '+')
- w = selwin;
- else if (c == '-')
- w = lastselwin;
- if (w == 0)
- wwbell();
- if (!terse)
- wwputc('\n', cmdwin);
- return w;
-}
-
-checkproc(w)
-struct ww *w;
-{
- if (w->ww_state != WWS_HASPROC) {
- error("No process in window.");
- return -1;
- }
- return 0;
-}
-
-setcmd(new)
-char new;
-{
- if (new && !incmd) {
- if (!terse)
- wwadd(cmdwin, &wwhead);
- if (selwin != 0)
- wwcursor(selwin, 1);
- wwcurwin = 0;
- } else if (!new && incmd) {
- if (!terse) {
- wwdelete(cmdwin);
- reframe();
- }
- if (selwin != 0)
- wwcursor(selwin, 0);
- wwcurwin = selwin;
- }
- incmd = new;
-}
-
-setterse(new)
-char new;
-{
- if (incmd)
- if (new && !terse) {
- wwdelete(cmdwin);
- reframe();
- } else if (!new && terse)
- wwadd(cmdwin, &wwhead);
- terse = new;
-}
-
-/*
- * Set the current window.
- */
-setselwin(w)
-struct ww *w;
-{
- if (selwin == w)
- return;
- if (selwin != 0)
- lastselwin = selwin;
- if ((selwin = w) != 0)
- front(selwin, 1);
-}
diff --git a/usr.bin/window/cmd1.c b/usr.bin/window/cmd1.c
deleted file mode 100644
index 049171d..0000000
--- a/usr.bin/window/cmd1.c
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)cmd1.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "@(#)$FreeBSD$";
-#endif /* not lint */
-
-#include "defs.h"
-#include "char.h"
-
-c_window()
-{
- int col, row, xcol, xrow;
- int id;
-
- if ((id = findid()) < 0)
- return;
- if (!terse)
- wwputs("New window (upper left corner): ", cmdwin);
- col = 0;
- row = 1;
- wwadd(boxwin, framewin->ww_back);
- for (;;) {
- wwbox(boxwin, row - 1, col - 1, 3, 3);
- wwsetcursor(row, col);
- while (wwpeekc() < 0)
- wwiomux();
- switch (getpos(&row, &col, row > 1, 0,
- wwnrow - 1, wwncol - 1)) {
- case 3:
- wwunbox(boxwin);
- wwdelete(boxwin);
- return;
- case 2:
- wwunbox(boxwin);
- break;
- case 1:
- wwunbox(boxwin);
- case 0:
- continue;
- }
- break;
- }
- if (!terse)
- wwputs("\nNew window (lower right corner): ", cmdwin);
- xcol = col;
- xrow = row;
- for (;;) {
- wwbox(boxwin, row - 1, col - 1,
- xrow - row + 3, xcol - col + 3);
- wwsetcursor(xrow, xcol);
- while (wwpeekc() < 0)
- wwiomux();
- switch (getpos(&xrow, &xcol, row, col, wwnrow - 1, wwncol - 1))
- {
- case 3:
- wwunbox(boxwin);
- wwdelete(boxwin);
- return;
- case 2:
- wwunbox(boxwin);
- break;
- case 1:
- wwunbox(boxwin);
- case 0:
- continue;
- }
- break;
- }
- wwdelete(boxwin);
- if (!terse)
- wwputc('\n', cmdwin);
- wwcurtowin(cmdwin);
- (void) openwin(id, row, col, xrow-row+1, xcol-col+1, default_nline,
- (char *) 0, 1, 1, default_shellfile, default_shell);
-}
-
-getpos(row, col, minrow, mincol, maxrow, maxcol)
-register int *row, *col;
-int minrow, mincol;
-int maxrow, maxcol;
-{
- static int scount;
- int count;
- int c;
- int oldrow = *row, oldcol = *col;
-
- while ((c = wwgetc()) >= 0) {
- switch (c) {
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- scount = scount * 10 + c - '0';
- continue;
- }
- count = scount ? scount : 1;
- scount = 0;
- switch (c) {
- case 'h':
- if ((*col -= count) < mincol)
- *col = mincol;
- break;
- case 'H':
- *col = mincol;
- break;
- case 'l':
- if ((*col += count) > maxcol)
- *col = maxcol;
- break;
- case 'L':
- *col = maxcol;
- break;
- case 'j':
- if ((*row += count) > maxrow)
- *row = maxrow;
- break;
- case 'J':
- *row = maxrow;
- break;
- case 'k':
- if ((*row -= count) < minrow)
- *row = minrow;
- break;
- case 'K':
- *row = minrow;
- break;
- case ctrl('['):
- if (!terse)
- wwputs("\nCancelled. ", cmdwin);
- return 3;
- case '\r':
- return 2;
- default:
- if (!terse)
- wwputs("\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin);
- wwbell();
- }
- }
- return oldrow != *row || oldcol != *col;
-}
diff --git a/usr.bin/window/cmd2.c b/usr.bin/window/cmd2.c
deleted file mode 100644
index 9633b73..0000000
--- a/usr.bin/window/cmd2.c
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)cmd2.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "defs.h"
-
-char *help_shortcmd[] = {
- "# Select window # and return to conversation mode",
- "%# Select window # but stay in command mode",
- "escape Return to conversation mode without changing window",
- "^^ Return to conversation mode and change to previous window",
- "c# Close window #",
- "w Open a new window",
- "m# Move window #",
- "M# Move window # to its previous position",
- "s# Change the size of window #",
- "S# Change window # to its previous size",
- "^Y Scroll up one line",
- "^E Scroll down one line",
- "^U Scroll up half a window",
- "^D Scroll down half a window",
- "^B Scroll up a full window",
- "^F Scroll down a full window",
- "h Move cursor left",
- "j Move cursor down",
- "k Move cursor up",
- "l Move cursor right",
- "y Yank",
- "p Put",
- "^S Stop output in current window",
- "^Q Restart output in current window",
- "^L Redraw screen",
- "^Z Suspend",
- "q Quit",
- ": Enter a long command",
- 0
-};
-char *help_longcmd[] = {
- ":alias name string ... Make `name' an alias for `string ...'",
- ":alias Show all aliases",
- ":close # ... Close windows",
- ":close all Close all windows",
- ":cursor modes Set the cursor modes",
- ":echo # string ... Print `string ...' in window #",
- ":escape c Set escape character to `c'",
- ":foreground # flag Make # a foreground window, if `flag' is true",
- ":label # string Set label of window # to `string'",
- ":list List all open windows",
- ":default_nline lines Set default window buffer size to `lines'",
- ":default_shell string ...",
- " Set default shell to `string ...'",
- ":default_smooth flag Set default smooth scroll flag",
- ":select # Select window #",
- ":smooth # flag Set window # to smooth scroll mode",
- ":source filename Execute commands in `filename'",
- ":terse flag Set terse mode",
- ":unalias name Undefine `name' as an alias",
- ":unset variable Deallocate `variable'",
- ":variable List all variables",
- ":window [row col nrow ncol nline label pty frame mapnl keepopen smooth shell]",
- " Open a window at `row', `col' of size `nrow', `ncol',",
- " with `nline' lines in the buffer, and `label'",
- ":write # string ... Write `string ...' to window # as input",
- 0
-};
-
-c_help()
-{
- register struct ww *w;
-
- if ((w = openiwin(wwnrow - 3, "Help")) == 0) {
- error("Can't open help window: %s.", wwerror());
- return;
- }
- wwprintf(w, "The escape character is %c.\n", escapec);
- wwprintf(w, "(# represents one of the digits from 1 to 9.)\n\n");
- if (help_print(w, "Short commands", help_shortcmd) >= 0)
- (void) help_print(w, "Long commands", help_longcmd);
- closeiwin(w);
-}
-
-help_print(w, name, list)
-register struct ww *w;
-char *name;
-register char **list;
-{
- wwprintf(w, "%s:\n\n", name);
- while (*list)
- switch (more(w, 0)) {
- case 0:
- wwputs(*list++, w);
- wwputc('\n', w);
- break;
- case 1:
- wwprintf(w, "%s: (continued)\n\n", name);
- break;
- case 2:
- return -1;
- }
- return more(w, 1) == 2 ? -1 : 0;
-}
-
-c_quit()
-{
- char oldterse = terse;
-
- setterse(0);
- wwputs("Really quit [yn]? ", cmdwin);
- wwcurtowin(cmdwin);
- while (wwpeekc() < 0)
- wwiomux();
- if (wwgetc() == 'y') {
- wwputs("Yes", cmdwin);
- quit++;
- } else
- wwputc('\n', cmdwin);
- setterse(!quit && oldterse);
-}
diff --git a/usr.bin/window/cmd3.c b/usr.bin/window/cmd3.c
deleted file mode 100644
index 27a3173..0000000
--- a/usr.bin/window/cmd3.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)cmd3.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "defs.h"
-#include "mystring.h"
-
-setescape(esc)
-register char *esc;
-{
- if (*esc == '^') {
- if (esc[1] != 0)
- escapec = esc[1] & 0x1f;
- else
- escapec = '^';
- } else
- escapec = *esc;
-}
-
-setlabel(w, label)
-register struct ww *w;
-char *label;
-{
- if (w->ww_label != 0)
- str_free(w->ww_label);
- if ((w->ww_label = str_cpy(label)) == 0)
- return -1;
- return 0;
-}
diff --git a/usr.bin/window/cmd4.c b/usr.bin/window/cmd4.c
deleted file mode 100644
index 82ed1bd..0000000
--- a/usr.bin/window/cmd4.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)cmd4.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "defs.h"
-
-c_colon()
-{
- char oldterse = terse;
- char buf[512];
-
- setterse(0);
- wwputc(':', cmdwin);
- wwgets(buf, wwncol - 3, cmdwin);
- wwputc('\n', cmdwin);
- wwcurtowin(cmdwin);
- setterse(oldterse);
- if (dolongcmd(buf, (struct value *)0, 0) < 0)
- error("Out of memory.");
-}
diff --git a/usr.bin/window/cmd5.c b/usr.bin/window/cmd5.c
deleted file mode 100644
index 60b0244..0000000
--- a/usr.bin/window/cmd5.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)cmd5.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "defs.h"
-
-/*
- * Window movement.
- */
-
-c_move(w)
-register struct ww *w;
-{
- int col, row;
- int mincol, minrow;
- int maxcol, maxrow;
- int curcol, currow;
-
- if (!terse)
- wwputs("New window position: ", cmdwin);
- col = w->ww_w.l;
- row = w->ww_w.t;
- wwadd(boxwin, framewin->ww_back);
- for (;;) {
- wwbox(boxwin, row - 1, col - 1, w->ww_w.nr + 2, w->ww_w.nc + 2);
- getminmax(row, w->ww_w.nr, 1, wwnrow,
- &currow, &minrow, &maxrow);
- getminmax(col, w->ww_w.nc, 0, wwncol,
- &curcol, &mincol, &maxcol);
- wwsetcursor(currow, curcol);
- while (wwpeekc() < 0)
- wwiomux();
- switch (getpos(&row, &col, minrow, mincol, maxrow, maxcol)) {
- case 3:
- wwunbox(boxwin);
- wwdelete(boxwin);
- return;
- case 2:
- wwunbox(boxwin);
- break;
- case 1:
- wwunbox(boxwin);
- case 0:
- continue;
- }
- break;
- }
- wwdelete(boxwin);
- if (!terse)
- wwputc('\n', cmdwin);
- wwcurtowin(cmdwin);
- movewin(w, row, col);
-}
-
-movewin(w, row, col)
-register struct ww *w;
-{
- struct ww *back = w->ww_back;
-
- w->ww_alt.t = w->ww_w.t;
- w->ww_alt.l = w->ww_w.l;
- wwdelete(w);
- wwmove(w, row, col);
- wwadd(w, back);
- reframe();
-}
-
-/*
- * Weird stufff, don't ask.
- */
-getminmax(x, n, a, b, curx, minx, maxx)
-register x, n, a, b;
-int *curx, *minx, *maxx;
-{
- if (x < 0)
- *curx = x + n - 1;
- else
- *curx = x;
-
- if (x <= a)
- *minx = 1 - n;
- else if (x <= b - n)
- *minx = a;
- else
- *minx = b - n;
-
- if (x >= b - n)
- *maxx = b - 1;
- else if (x >= a)
- *maxx = b - n;
- else
- *maxx = a;
-}
diff --git a/usr.bin/window/cmd6.c b/usr.bin/window/cmd6.c
deleted file mode 100644
index 63689aa..0000000
--- a/usr.bin/window/cmd6.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)cmd6.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "defs.h"
-#include "mystring.h"
-#include "char.h"
-
-/*
- * Debugging commands.
- */
-
-c_debug()
-{
- register struct ww *w;
-
- if (!terse)
- wwputs("[m(smap) n(ns) o(os) s(string) v(nvis) w(win)]? ", cmdwin);
- wwcurtowin(cmdwin);
- while (wwpeekc() < 0)
- wwiomux();
- if (!terse)
- wwputc('\n', cmdwin);
- switch (wwgetc()) {
- case 'm':
- wwdumpsmap();
- break;
- case 'n':
- wwdumpns();
- break;
- case 'o':
- wwdumpos();
- break;
- case 's':
- debug_str();
- break;
- case 'v':
- if ((w = getwin()) != 0)
- wwdumpnvis(w);
- break;
- case 'w':
- if ((w = getwin()) != 0)
- wwdumpwin(w);
- break;
- default:
- wwbell();
- }
-}
-
-#ifdef STR_DEBUG
-debug_str()
-{
- register struct ww *w;
- struct mystring *s;
-
- if ((w = openiwin(wwnrow - 3, "Allocated Strings")) == 0) {
- error("Can't open string window: %s.", wwerror());
- return;
- }
- for (s = str_head.s_forw; s != &str_head; s = s->s_forw) {
- if (more(w, 0) == 2)
- goto out;
- wwprintf(w, "(0x%x)\t\"%s\"\n", s->s_data, s->s_data);
- }
- waitnl(w);
-out:
- closeiwin(w);
-}
-#else
-debug_str()
-{
- error("No string debugging.");
-}
-#endif
diff --git a/usr.bin/window/cmd7.c b/usr.bin/window/cmd7.c
deleted file mode 100644
index 1039f26..0000000
--- a/usr.bin/window/cmd7.c
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)cmd7.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <stdlib.h>
-#include "defs.h"
-#include "mystring.h"
-
-/*
- * Window size.
- */
-
-c_size(w)
-register struct ww *w;
-{
- int col, row;
-
- if (!terse)
- wwputs("New window size (lower right corner): ", cmdwin);
- col = MIN(w->ww_w.r, wwncol) - 1;
- row = MIN(w->ww_w.b, wwnrow) - 1;
- wwadd(boxwin, framewin->ww_back);
- for (;;) {
- wwbox(boxwin, w->ww_w.t - 1, w->ww_w.l - 1,
- row - w->ww_w.t + 3, col - w->ww_w.l + 3);
- wwsetcursor(row, col);
- while (wwpeekc() < 0)
- wwiomux();
- switch (getpos(&row, &col, w->ww_w.t, w->ww_w.l,
- wwnrow - 1, wwncol - 1)) {
- case 3:
- wwunbox(boxwin);
- wwdelete(boxwin);
- return;
- case 2:
- wwunbox(boxwin);
- break;
- case 1:
- wwunbox(boxwin);
- case 0:
- continue;
- }
- break;
- }
- wwdelete(boxwin);
- if (!terse)
- wwputc('\n', cmdwin);
- wwcurtowin(cmdwin);
- sizewin(w, row - w->ww_w.t + 1, col - w->ww_w.l + 1);
-}
-
-/*
- * Yank and put
- */
-
-struct yb {
- char *line;
- int length;
- struct yb *link;
-};
-struct yb *yb_head, *yb_tail;
-
-c_yank()
-{
- struct ww *w = selwin;
- int col1, row1;
- int col2, row2;
- int r, c;
-
- if (!terse)
- wwputs("Yank starting position: ", cmdwin);
- wwcursor(w, 0);
- row1 = w->ww_cur.r;
- col1 = w->ww_cur.c;
- for (;;) {
- wwsetcursor(row1, col1);
- while (wwpeekc() < 0)
- wwiomux();
- switch (getpos(&row1, &col1, w->ww_i.t, w->ww_i.l,
- w->ww_i.b - 1, w->ww_i.r - 1)) {
- case 3:
- goto out;
- case 2:
- break;
- case 1:
- case 0:
- continue;
- }
- break;
- }
- if (!terse)
- wwputs("\nYank ending position: ", cmdwin);
- row2 = row1;
- col2 = col1;
- for (;;) {
- wwsetcursor(row2, col2);
- while (wwpeekc() < 0)
- wwiomux();
- r = row2;
- c = col2;
- switch (getpos(&row2, &col2, w->ww_i.t, w->ww_i.l,
- w->ww_i.b - 1, w->ww_i.r - 1)) {
- case 3:
- yank_highlight(row1, col1, r, c);
- goto out;
- case 2:
- break;
- case 1:
- yank_highlight(row1, col1, r, c);
- yank_highlight(row1, col1, row2, col2);
- case 0:
- continue;
- }
- break;
- }
- if (row2 < row1 || row2 == row1 && col2 < col1) {
- r = row1;
- c = col1;
- row1 = row2;
- col1 = col2;
- row2 = r;
- col2 = c;
- }
- unyank();
- c = col1;
- for (r = row1; r < row2; r++) {
- yank_line(r, c, w->ww_b.r);
- c = w->ww_b.l;
- }
- yank_line(r, c, col2);
- yank_highlight(row1, col1, row2, col2);
- if (!terse)
- wwputc('\n', cmdwin);
-out:
- wwcursor(w, 1);
-}
-
-yank_highlight(row1, col1, row2, col2)
-{
- struct ww *w = selwin;
- int r, c;
-
- if ((wwavailmodes & WWM_REV) == 0)
- return;
- if (row2 < row1 || row2 == row1 && col2 < col1) {
- r = row1;
- c = col1;
- row1 = row2;
- col1 = col2;
- row2 = r;
- col2 = c;
- }
- c = col1;
- for (r = row1; r < row2; r++) {
- yank_highlight_line(r, c, w->ww_b.r);
- c = w->ww_b.l;
- }
- yank_highlight_line(r, c, col2);
-}
-
-yank_highlight_line(r, c, cend)
-{
- struct ww *w = selwin;
- char *win;
-
- if (r < w->ww_i.t || r >= w->ww_i.b)
- return;
- if (c < w->ww_i.l)
- c = w->ww_i.l;
- if (cend >= w->ww_i.r)
- cend = w->ww_i.r;
- for (win = w->ww_win[r] + c; c < cend; c++, win++) {
- *win ^= WWM_REV;
- if (wwsmap[r][c] == w->ww_index) {
- if (*win == 0)
- w->ww_nvis[r]++;
- else if (*win == WWM_REV)
- w->ww_nvis[r]--;
- wwns[r][c].c_m ^= WWM_REV;
- wwtouched[r] |= WWU_TOUCHED;
- }
- }
-}
-
-unyank()
-{
- struct yb *yp, *yq;
-
- for (yp = yb_head; yp; yp = yq) {
- yq = yp->link;
- str_free(yp->line);
- free((char *) yp);
- }
- yb_head = yb_tail = 0;
-}
-
-yank_line(r, c, cend)
-{
- struct yb *yp;
- int nl = 0;
- int n;
- union ww_char *bp;
- char *cp;
-
- if (c == cend)
- return;
- if ((yp = (struct yb *) malloc(sizeof *yp)) == 0)
- return;
- yp->link = 0;
- nl = cend == selwin->ww_b.r;
- bp = selwin->ww_buf[r];
- for (cend--; cend >= c; cend--)
- if (bp[cend].c_c != ' ')
- break;
- yp->length = n = cend - c + 1;
- if (nl)
- yp->length++;
- yp->line = str_alloc(yp->length + 1);
- for (bp += c, cp = yp->line; --n >= 0;)
- *cp++ = bp++->c_c;
- if (nl)
- *cp++ = '\n';
- *cp = 0;
- if (yb_head)
- yb_tail = yb_tail->link = yp;
- else
- yb_head = yb_tail = yp;
-}
-
-c_put()
-{
- struct yb *yp;
-
- for (yp = yb_head; yp; yp = yp->link)
- (void) write(selwin->ww_pty, yp->line, yp->length);
-}
diff --git a/usr.bin/window/compress.c b/usr.bin/window/compress.c
deleted file mode 100644
index 6294b93..0000000
--- a/usr.bin/window/compress.c
+++ /dev/null
@@ -1,902 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)compress.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-
- /* special */
-#include <stdio.h>
-#include <fcntl.h>
-#include <stdlib.h>
-int cc_trace = 0;
-FILE *cc_trace_fp;
-
- /* tunable parameters */
-
-int cc_reverse = 1;
-int cc_sort = 0;
-int cc_chop = 0;
-
-int cc_token_max = 8; /* <= TOKEN_MAX */
-int cc_token_min = 2; /* > tt.tt_put_token_cost */
-int cc_npass0 = 1;
-int cc_npass1 = 1;
-
-int cc_bufsize = 1024 * 3; /* XXX, or 80 * 24 * 2 */
-
-int cc_ntoken = 8192;
-
-#define cc_weight XXX
-#ifndef cc_weight
-int cc_weight = 0;
-#endif
-
-#define TOKEN_MAX 16
-
-struct cc {
- char string[TOKEN_MAX];
- char length;
- char flag;
-#ifndef cc_weight
- short weight;
-#endif
- long time; /* time last seen */
- short bcount; /* count in this buffer */
- short ccount; /* count in compression */
- short places; /* places in the buffer */
- short code; /* token code */
- struct cc *qforw, *qback;
- struct cc *hforw, **hback;
-};
-
-short cc_thresholds[TOKEN_MAX + 1];
-#define thresh(length) (cc_thresholds[length])
-#define threshp(code, count, length) \
- ((code) >= 0 || (short) (count) >= cc_thresholds[length])
-
-#ifndef cc_weight
-short cc_wthresholds[TOKEN_MAX + 1];
-#define wthresh(length) (cc_wthresholds[length])
-#define wthreshp(weight, length) ((short) (weight) >= cc_wthresholds[length])
-#else
-#define wthreshp(weight, length) (0)
-#endif
-
-#ifndef cc_weight
-short cc_wlimits[TOKEN_MAX + 1];
-#define wlimit(length) (cc_wlimits[length])
-#endif
-
-#define put_token_score(length) ((length) - tt.tt_put_token_cost)
-
-int cc_score_adjustments[TOKEN_MAX + 1][8]; /* XXX, 8 > max of cc_thresholds */
-#define score_adjust(score, p) \
- do { \
- int length = (p)->length; \
- int ccount = (p)->ccount; \
- if (threshp((p)->code, ccount, length) || \
- wthreshp((p)->weight, length)) /* XXX */ \
- (score) -= length - tt.tt_put_token_cost; \
- else \
- (score) += cc_score_adjustments[length][ccount]; \
- } while (0)
-
-int cc_initial_scores[TOKEN_MAX + 1][8]; /* XXX, 8 > max of cc_thresholds */
-
-struct cc cc_q0a, cc_q0b, cc_q1a, cc_q1b;
-
-#define qinsert(p1, p2) \
- do { \
- register struct cc *forw = (p1)->qforw; \
- register struct cc *back = (p1)->qback; \
- back->qforw = forw; \
- forw->qback = back; \
- forw = (p2)->qforw; \
- (p1)->qforw = forw; \
- forw->qback = (p1); \
- (p2)->qforw = (p1); \
- (p1)->qback = (p2); \
- } while (0)
-
-#define qinsertq(q, p) \
- ((q)->qforw == (q) ? 0 : \
- ((q)->qback->qforw = (p)->qforw, \
- (p)->qforw->qback = (q)->qback, \
- (q)->qforw->qback = (p), \
- (p)->qforw = (q)->qforw, \
- (q)->qforw = (q), \
- (q)->qback = (q)))
-
-#define H (14)
-#define HSIZE (1 << H)
-#define hash(h, c) ((((h) >> H - 8 | (h) << 8) ^ (c)) & HSIZE - 1)
-
-char *cc_buffer;
-struct cc **cc_output; /* the output array */
-short *cc_places[TOKEN_MAX + 1];
-short *cc_hashcodes; /* for computing hashcodes */
-struct cc **cc_htab; /* the hash table */
-struct cc **cc_tokens; /* holds all the active tokens */
-struct cc_undo {
- struct cc **pos;
- struct cc *val;
-} *cc_undo;
-
-long cc_time, cc_time0;
-
-char *cc_tt_ob, *cc_tt_obe;
-
-ccinit()
-{
- register i, j;
- register struct cc *p;
-
- if (tt.tt_token_max > cc_token_max)
- tt.tt_token_max = cc_token_max;
- if (tt.tt_token_min < cc_token_min)
- tt.tt_token_min = cc_token_min;
- if (tt.tt_token_min > tt.tt_token_max) {
- tt.tt_ntoken = 0;
- return 0;
- }
- if (tt.tt_ntoken > cc_ntoken / 2) /* not likely */
- tt.tt_ntoken = cc_ntoken / 2;
-#define C(x) (sizeof (x) / sizeof *(x))
- for (i = 0; i < C(cc_thresholds); i++) {
- int h = i - tt.tt_put_token_cost;
- if (h > 0)
- cc_thresholds[i] =
- (tt.tt_set_token_cost + 1 + h - 1) / h + 1;
- else
- cc_thresholds[i] = 0;
- }
- for (i = 0; i < C(cc_score_adjustments); i++) {
- int t = cc_thresholds[i];
- for (j = 0; j < C(*cc_score_adjustments); j++) {
- if (j >= t)
- cc_score_adjustments[i][j] =
- - (i - tt.tt_put_token_cost);
- else if (j < t - 1)
- cc_score_adjustments[i][j] = 0;
- else
- /*
- * cost now is
- * length * (ccount + 1) a
- * cost before was
- * set-token-cost + length +
- * ccount * put-token-cost b
- * the score adjustment is (b - a)
- */
- cc_score_adjustments[i][j] =
- tt.tt_set_token_cost + i +
- j * tt.tt_put_token_cost -
- i * (j + 1);
- if (j >= t)
- cc_initial_scores[i][j] = 0;
- else
- /*
- * - (set-token-cost +
- * (length - put-token-cost) -
- * (length - put-token-cost) * ccount)
- */
- cc_initial_scores[i][j] =
- - (tt.tt_set_token_cost +
- (i - tt.tt_put_token_cost) -
- (i - tt.tt_put_token_cost) * j);
- }
- }
-#ifndef cc_weight
- for (i = 1; i < C(cc_wthresholds); i++) {
- cc_wthresholds[i] =
- ((tt.tt_set_token_cost + tt.tt_put_token_cost) / i +
- i / 5 + 1) *
- cc_weight + 1;
- cc_wlimits[i] = cc_wthresholds[i] + cc_weight;
- }
-#endif
-#undef C
- if ((cc_output = (struct cc **)
- malloc((unsigned) cc_bufsize * sizeof *cc_output)) == 0)
- goto nomem;
- if ((cc_hashcodes = (short *)
- malloc((unsigned) cc_bufsize * sizeof *cc_hashcodes)) == 0)
- goto nomem;
- if ((cc_htab = (struct cc **) malloc(HSIZE * sizeof *cc_htab)) == 0)
- goto nomem;
- if ((cc_tokens = (struct cc **)
- malloc((unsigned)
- (cc_ntoken + tt.tt_token_max - tt.tt_token_min + 1) *
- sizeof *cc_tokens)) == 0)
- goto nomem;
- if ((cc_undo = (struct cc_undo *)
- malloc((unsigned) cc_bufsize * sizeof *cc_undo)) == 0)
- goto nomem;
- for (i = tt.tt_token_min; i <= tt.tt_token_max; i++)
- if ((cc_places[i] = (short *)
- malloc((unsigned) cc_bufsize * sizeof **cc_places)) == 0)
- goto nomem;
- cc_q0a.qforw = cc_q0a.qback = &cc_q0a;
- cc_q0b.qforw = cc_q0b.qback = &cc_q0b;
- cc_q1a.qforw = cc_q1a.qback = &cc_q1a;
- cc_q1b.qforw = cc_q1b.qback = &cc_q1b;
- if ((p = (struct cc *) malloc((unsigned) cc_ntoken * sizeof *p)) == 0)
- goto nomem;
- for (i = 0; i < tt.tt_ntoken; i++) {
- p->code = i;
- p->time = -1;
- p->qback = cc_q0a.qback;
- p->qforw = &cc_q0a;
- p->qback->qforw = p;
- cc_q0a.qback = p;
- p++;
- }
- for (; i < cc_ntoken; i++) {
- p->code = -1;
- p->time = -1;
- p->qback = cc_q1a.qback;
- p->qforw = &cc_q1a;
- p->qback->qforw = p;
- cc_q1a.qback = p;
- p++;
- }
- cc_tt_ob = tt_ob;
- cc_tt_obe = tt_obe;
- if ((cc_buffer = malloc((unsigned) cc_bufsize)) == 0)
- goto nomem;
- return 0;
-nomem:
- wwerrno = WWE_NOMEM;
- return -1;
-}
-
-ccstart()
-{
- int ccflush();
-
- ttflush();
- tt_obp = tt_ob = cc_buffer;
- tt_obe = tt_ob + cc_bufsize;
- tt.tt_flush = ccflush;
- if (cc_trace) {
- cc_trace_fp = fopen("window-trace", "a");
- (void) fcntl(fileno(cc_trace_fp), F_SETFD, 1);
- }
- ccreset();
-}
-
-ccreset()
-{
- register struct cc *p;
-
- bzero((char *) cc_htab, HSIZE * sizeof *cc_htab);
- for (p = cc_q0a.qforw; p != &cc_q0a; p = p->qforw)
- p->hback = 0;
- for (p = cc_q1a.qforw; p != &cc_q1a; p = p->qforw)
- p->hback = 0;
-}
-
-ccend()
-{
-
- ttflush();
- tt_obp = tt_ob = cc_tt_ob;
- tt_obe = cc_tt_obe;
- tt.tt_flush = 0;
- if (cc_trace_fp != NULL) {
- (void) fclose(cc_trace_fp);
- cc_trace_fp = NULL;
- }
-}
-
-ccflush()
-{
- int bufsize = tt_obp - tt_ob;
- int n;
-
- if (tt_ob != cc_buffer)
- abort();
- if (cc_trace_fp != NULL) {
- (void) fwrite(tt_ob, 1, bufsize, cc_trace_fp);
- (void) putc(-1, cc_trace_fp);
- }
- tt.tt_flush = 0;
- (*tt.tt_compress)(1);
- if (bufsize < tt.tt_token_min) {
- ttflush();
- goto out;
- }
- tt_obp = tt_ob = cc_tt_ob;
- tt_obe = cc_tt_obe;
- cc_time0 = cc_time;
- cc_time += bufsize;
- n = cc_sweep_phase(cc_buffer, bufsize, cc_tokens);
- cc_compress_phase(cc_output, bufsize, cc_tokens, n);
- cc_output_phase(cc_buffer, cc_output, bufsize);
- ttflush();
- tt_obp = tt_ob = cc_buffer;
- tt_obe = cc_buffer + cc_bufsize;
-out:
- (*tt.tt_compress)(0);
- tt.tt_flush = ccflush;
-}
-
-cc_sweep_phase(buffer, bufsize, tokens)
- char *buffer;
- struct cc **tokens;
-{
- register struct cc **pp = tokens;
- register i, n;
-#ifdef STATS
- int nn, ii;
-#endif
-
-#ifdef STATS
- if (verbose >= 0)
- time_begin();
- if (verbose > 0)
- printf("Sweep:");
-#endif
- cc_sweep0(buffer, bufsize, tt.tt_token_min - 1);
-#ifdef STATS
- ntoken_stat = 0;
- nn = 0;
- ii = 0;
-#endif
- for (i = tt.tt_token_min; i <= tt.tt_token_max; i++) {
-#ifdef STATS
- if (verbose > 0) {
- if (ii > 7) {
- printf("\n ");
- ii = 0;
- }
- ii++;
- printf(" (%d", i);
- (void) fflush(stdout);
- }
-#endif
- n = cc_sweep(buffer, bufsize, pp, i);
- pp += n;
-#ifdef STATS
- if (verbose > 0) {
- if (--n > 0) {
- printf(" %d", n);
- nn += n;
- }
- putchar(')');
- }
-#endif
- }
- qinsertq(&cc_q1b, &cc_q1a);
-#ifdef STATS
- if (verbose > 0)
- printf("\n %d tokens, %d candidates\n",
- ntoken_stat, nn);
- if (verbose >= 0)
- time_end();
-#endif
- return pp - tokens;
-}
-
-cc_sweep0(buffer, n, length)
- char *buffer;
-{
- register char *p;
- register short *hc;
- register i;
- register short c;
- register short pc = tt.tt_padc;
-
- /* n and length are at least 1 */
- p = buffer++;
- hc = cc_hashcodes;
- i = n;
- do {
- if ((*hc++ = *p++) == pc)
- hc[-1] = -1;
- } while (--i);
- while (--length) {
- p = buffer++;
- hc = cc_hashcodes;
- for (i = n--; --i;) {
- if ((c = *p++) == pc || *hc < 0)
- c = -1;
- else
- c = hash(*hc, c);
- *hc++ = c;
- }
- }
-}
-
-cc_sweep(buffer, bufsize, tokens, length)
- char *buffer;
- struct cc **tokens;
- register length;
-{
- register struct cc *p;
- register char *cp;
- register i;
- short *hc;
- short *places = cc_places[length];
- struct cc **pp = tokens;
- short threshold = thresh(length);
-#ifndef cc_weight
- short wthreshold = wthresh(length);
- short limit = wlimit(length);
-#endif
- int time;
- short pc = tt.tt_padc;
-
- i = length - 1;
- bufsize -= i;
- cp = buffer + i;
- hc = cc_hashcodes;
- time = cc_time0;
- for (i = 0; i < bufsize; i++, time++) {
- struct cc **h;
-
- {
- register short *hc1 = hc;
- register short c = *cp++;
- register short hh;
- if ((hh = *hc1) < 0 || c == pc) {
- *hc1++ = -1;
- hc = hc1;
- continue;
- }
- h = cc_htab + (*hc1++ = hash(hh, c));
- hc = hc1;
- }
- for (p = *h; p != 0; p = p->hforw)
- if (p->length == (char) length) {
- register char *p1 = p->string;
- register char *p2 = cp - length;
- register n = length;
- do
- if (*p1++ != *p2++)
- goto fail;
- while (--n);
- break;
- fail:;
- }
- if (p == 0) {
- p = cc_q1a.qback;
- if (p == &cc_q1a ||
- p->time >= cc_time0 && p->length == (char) length)
- continue;
- if (p->hback != 0)
- if ((*p->hback = p->hforw) != 0)
- p->hforw->hback = p->hback;
- {
- register char *p1 = p->string;
- register char *p2 = cp - length;
- register n = length;
- do
- *p1++ = *p2++;
- while (--n);
- }
- p->length = length;
-#ifndef cc_weight
- p->weight = cc_weight;
-#endif
- p->time = time;
- p->bcount = 1;
- p->ccount = 0;
- p->flag = 0;
- if ((p->hforw = *h) != 0)
- p->hforw->hback = &p->hforw;
- *h = p;
- p->hback = h;
- qinsert(p, &cc_q1a);
- places[i] = -1;
- p->places = i;
-#ifdef STATS
- ntoken_stat++;
-#endif
- } else if (p->time < cc_time0) {
-#ifndef cc_weight
- if ((p->weight += p->time - time) < 0)
- p->weight = cc_weight;
- else if ((p->weight += cc_weight) > limit)
- p->weight = limit;
-#endif
- p->time = time;
- p->bcount = 1;
- p->ccount = 0;
- if (p->code >= 0) {
- p->flag = 1;
- *pp++ = p;
- } else
-#ifndef cc_weight
- if (p->weight >= wthreshold) {
- p->flag = 1;
- *pp++ = p;
- qinsert(p, &cc_q1b);
- } else
-#endif
- {
- p->flag = 0;
- qinsert(p, &cc_q1a);
- }
- places[i] = -1;
- p->places = i;
-#ifdef STATS
- ntoken_stat++;
-#endif
- } else if (p->time + length > time) {
- /*
- * overlapping token, don't count as two and
- * don't update time, but do adjust weight to offset
- * the difference
- */
-#ifndef cc_weight
- if (cc_weight != 0) { /* XXX */
- p->weight += time - p->time;
- if (!p->flag && p->weight >= wthreshold) {
- p->flag = 1;
- *pp++ = p;
- qinsert(p, &cc_q1b);
- }
- }
-#endif
- places[i] = p->places;
- p->places = i;
- } else {
-#ifndef cc_weight
- if ((p->weight += p->time - time) < 0)
- p->weight = cc_weight;
- else if ((p->weight += cc_weight) > limit)
- p->weight = limit;
-#endif
- p->time = time;
- p->bcount++;
- if (!p->flag &&
- /* code must be < 0 if flag false here */
- (p->bcount >= threshold
-#ifndef cc_weight
- || p->weight >= wthreshold
-#endif
- )) {
- p->flag = 1;
- *pp++ = p;
- qinsert(p, &cc_q1b);
- }
- places[i] = p->places;
- p->places = i;
- }
- }
- if ((i = pp - tokens) > 0) {
- *pp = 0;
- if (cc_reverse)
- cc_sweep_reverse(tokens, places);
- if (cc_sort && i > 1) {
- int cc_token_compare();
- qsort((char *) tokens, i, sizeof *tokens,
- cc_token_compare);
- }
- if (cc_chop) {
- if ((i = i * cc_chop / 100) == 0)
- i = 1;
- tokens[i] = 0;
- }
- i++;
- }
- return i;
-}
-
-cc_sweep_reverse(pp, places)
- register struct cc **pp;
- register short *places;
-{
- register struct cc *p;
- register short front, back, t;
-
- while ((p = *pp++) != 0) {
- back = -1;
- t = p->places;
- /* the list is never empty */
- do {
- front = places[t];
- places[t] = back;
- back = t;
- } while ((t = front) >= 0);
- p->places = back;
- }
-}
-
-cc_compress_phase(output, bufsize, tokens, ntoken)
- struct cc **output;
- struct cc **tokens;
-{
- register i;
-
- bzero((char *) output, bufsize * sizeof *output);
- for (i = 0; i < cc_npass0; i++)
- cc_compress_phase1(output, tokens, ntoken, 0);
- for (i = 0; i < cc_npass1; i++)
- cc_compress_phase1(output, tokens, ntoken, 1);
- cc_compress_cleanup(output, bufsize);
-}
-
-cc_compress_phase1(output, tokens, ntoken, flag)
- register struct cc **output;
- struct cc **tokens;
-{
- register struct cc **pp;
-#ifdef STATS
- register int i = 0;
- int nt = 0, cc = 0, nc = 0;
-#endif
-
-#ifdef STATS
- if (verbose >= 0)
- time_begin();
- if (verbose > 0)
- printf("Compress:");
-#endif
- pp = tokens;
- while (pp < tokens + ntoken) {
-#ifdef STATS
- if (verbose > 0) {
- ntoken_stat = 0;
- ccount_stat = 0;
- ncover_stat = 0;
- if (i > 2) {
- printf("\n ");
- i = 0;
- }
- i++;
- printf(" (%d", (*pp)->length);
- (void) fflush(stdout);
- }
-#endif
- pp += cc_compress(output, pp, flag);
-#ifdef STATS
- if (verbose > 0) {
- printf(" %dt %du %dc)", ntoken_stat, ccount_stat,
- ncover_stat);
- nt += ntoken_stat;
- cc += ccount_stat;
- nc += ncover_stat;
- }
-#endif
- }
-#ifdef STATS
- if (verbose > 0)
- printf("\n total: (%dt %du %dc)\n", nt, cc, nc);
- if (verbose >= 0)
- time_end();
-#endif
-}
-
-cc_compress_cleanup(output, bufsize)
- register struct cc **output;
-{
- register struct cc **end;
-
- /* the previous output phase may have been interrupted */
- qinsertq(&cc_q0b, &cc_q0a);
- for (end = output + bufsize; output < end;) {
- register struct cc *p;
- register length;
- if ((p = *output) == 0) {
- output++;
- continue;
- }
- length = p->length;
- if (!p->flag) {
- } else if (p->code >= 0) {
- qinsert(p, &cc_q0b);
- p->flag = 0;
- } else if (p->ccount == 0) {
- *output = 0;
- } else if (p->ccount >= thresh(length)
-#ifndef cc_weight
- || wthreshp(p->weight, length)
-#endif
- ) {
- p->flag = 0;
- } else {
- p->ccount = 0;
- *output = 0;
- }
- output += length;
- }
-}
-
-cc_compress(output, tokens, flag)
- struct cc **output;
- struct cc **tokens;
- char flag;
-{
- struct cc **pp = tokens;
- register struct cc *p = *pp++;
- int length = p->length;
- int threshold = thresh(length);
-#ifndef cc_weight
- short wthreshold = wthresh(length);
-#endif
- short *places = cc_places[length];
- int *initial_scores = cc_initial_scores[length];
- int initial_score0 = put_token_score(length);
-
- do {
- int score;
- register struct cc_undo *undop;
- int ccount;
-#ifdef STATS
- int ncover;
-#endif
- int i;
-
- ccount = p->ccount;
- if ((short) ccount >= p->bcount)
- continue;
- if (p->code >= 0 || ccount >= threshold)
- score = 0;
-#ifndef cc_weight
- else if (p->weight >= wthreshold)
- /* allow one fewer match than normal */
- /* XXX, should adjust for ccount */
- score = - tt.tt_set_token_cost;
-#endif
- else
- score = initial_scores[ccount];
- undop = cc_undo;
-#ifdef STATS
- ncover = 0;
-#endif
- for (i = p->places; i >= 0; i = places[i]) {
- register struct cc **jp;
- register struct cc *x;
- register struct cc **ip = output + i;
- register score0 = initial_score0;
- struct cc **iip = ip + length;
- struct cc_undo *undop1 = undop;
-
- if ((x = *(jp = ip)) != 0)
- goto z;
- while (--jp >= output)
- if ((x = *jp) != 0) {
- if (jp + x->length > ip)
- goto z;
- break;
- }
- jp = ip + 1;
- while (jp < iip) {
- if ((x = *jp) == 0) {
- jp++;
- continue;
- }
- z:
- if (x == p)
- goto undo;
-#ifdef STATS
- ncover++;
-#endif
- undop->pos = jp;
- undop->val = x;
- undop++;
- *jp = 0;
- x->ccount--;
- score_adjust(score0, x);
- if (score0 < 0 && flag)
- goto undo;
- jp += x->length;
- }
- undop->pos = ip;
- undop->val = 0;
- undop++;
- *ip = p;
- ccount++;
- score += score0;
- continue;
- undo:
- while (--undop >= undop1)
- if (*undop->pos = x = undop->val)
- x->ccount++;
- undop++;
- }
- if (score > 0) {
-#ifdef STATS
- ccount_stat += ccount - p->ccount;
- ntoken_stat++;
- ncover_stat += ncover;
-#endif
- p->ccount = ccount;
- } else {
- register struct cc_undo *u = cc_undo;
- while (--undop >= u) {
- register struct cc *x;
- if (*undop->pos = x = undop->val)
- x->ccount++;
- }
- }
- } while ((p = *pp++) != 0);
- return pp - tokens;
-}
-
-cc_output_phase(buffer, output, bufsize)
- register char *buffer;
- register struct cc **output;
- register bufsize;
-{
- register i;
- register struct cc *p, *p1;
-
- for (i = 0; i < bufsize;) {
- if ((p = output[i]) == 0) {
- ttputc(buffer[i]);
- i++;
- } else if (p->code >= 0) {
- if (--p->ccount == 0)
- qinsert(p, &cc_q0a);
- (*tt.tt_put_token)(p->code, p->string, p->length);
- wwntokuse++;
- wwntoksave += put_token_score(p->length);
- i += p->length;
- } else if ((p1 = cc_q0a.qback) != &cc_q0a) {
- p->code = p1->code;
- p1->code = -1;
- qinsert(p1, &cc_q1a);
- if (--p->ccount == 0)
- qinsert(p, &cc_q0a);
- else
- qinsert(p, &cc_q0b);
- (*tt.tt_set_token)(p->code, p->string, p->length);
- wwntokdef++;
- wwntoksave -= tt.tt_set_token_cost;
- i += p->length;
- } else {
- p->ccount--;
- ttwrite(p->string, p->length);
- wwntokbad++;
- i += p->length;
- }
- }
- wwntokc += bufsize;
-}
-
-cc_token_compare(p1, p2)
- struct cc **p1, **p2;
-{
- return (*p2)->bcount - (*p1)->bcount;
-}
diff --git a/usr.bin/window/context.c b/usr.bin/window/context.c
deleted file mode 100644
index 78cf892..0000000
--- a/usr.bin/window/context.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)context.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "value.h"
-#include "mystring.h"
-#include "context.h"
-#include <fcntl.h>
-
-/*
- * Context push/pop for nested command files.
- */
-
-cx_alloc()
-{
- register struct context *xp;
-
- if (cx.x_type != 0) {
- xp = (struct context *)
- malloc((unsigned) sizeof (struct context));
- if (xp == 0)
- return -1;
- *xp = cx;
- cx.x_link = xp;
- cx.x_type = 0;
- }
- cx.x_erred = 0;
- cx.x_synerred = 0;
- cx.x_abort = 0;
- return 0;
-}
-
-cx_free()
-{
- struct context *xp;
-
- if ((xp = cx.x_link) != 0) {
- cx = *xp;
- free((char *)xp);
- } else
- cx.x_type = 0;
-}
-
-cx_beginfile(filename)
-char *filename;
-{
- if (cx_alloc() < 0)
- return -1;
- cx.x_type = X_FILE;
- if ((cx.x_filename = str_cpy(filename)) == 0)
- goto bad;
- cx.x_fp = fopen(filename, "r");
- if (cx.x_fp == 0)
- goto bad;
- (void) fcntl(fileno(cx.x_fp), F_SETFD, 1);
- cx.x_bol = 1;
- cx.x_lineno = 0;
- cx.x_errwin = 0;
- cx.x_noerr = 0;
- return 0;
-bad:
- if (cx.x_filename != 0)
- str_free(cx.x_filename);
- cx_free();
- return -1;
-}
-
-cx_beginbuf(buf, arg, narg)
-char *buf;
-struct value *arg;
-int narg;
-{
- if (cx_alloc() < 0)
- return -1;
- cx.x_type = X_BUF;
- cx.x_bufp = cx.x_buf = buf;
- cx.x_arg = arg;
- cx.x_narg = narg;
- return 0;
-}
-
-cx_end()
-{
- switch (cx.x_type) {
- case X_BUF:
- break;
- case X_FILE:
- (void) fclose(cx.x_fp);
- str_free(cx.x_filename);
- break;
- }
- cx_free();
-}
diff --git a/usr.bin/window/context.h b/usr.bin/window/context.h
deleted file mode 100644
index df82b27..0000000
--- a/usr.bin/window/context.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)context.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#include <stdio.h>
-
-struct context {
- struct context *x_link; /* nested contexts */
- char x_type; /* tag for union */
- union {
- struct { /* input is a file */
- char *X_filename; /* input file name */
- FILE *X_fp; /* input stream */
- short X_lineno; /* current line number */
- char X_bol; /* at beginning of line */
- char X_noerr; /* don't report errors */
- struct ww *X_errwin; /* error window */
- } x_f;
- struct { /* input is a buffer */
- char *X_buf; /* input buffer */
- char *X_bufp; /* current position in buf */
- struct value *X_arg; /* argument for alias */
- int X_narg; /* number of arguments */
- } x_b;
- } x_un;
- /* holding place for current token */
- int x_token; /* the token */
- struct value x_val; /* values associated with token */
- /* parser error flags */
- unsigned x_erred :1; /* had an error */
- unsigned x_synerred :1; /* had syntax error */
- unsigned x_abort :1; /* fatal error */
-};
-#define x_buf x_un.x_b.X_buf
-#define x_bufp x_un.x_b.X_bufp
-#define x_arg x_un.x_b.X_arg
-#define x_narg x_un.x_b.X_narg
-#define x_filename x_un.x_f.X_filename
-#define x_fp x_un.x_f.X_fp
-#define x_lineno x_un.x_f.X_lineno
-#define x_bol x_un.x_f.X_bol
-#define x_errwin x_un.x_f.X_errwin
-#define x_noerr x_un.x_f.X_noerr
-
- /* x_type values, 0 is reserved */
-#define X_FILE 1 /* input is a file */
-#define X_BUF 2 /* input is a buffer */
-
-struct context cx; /* the current context */
diff --git a/usr.bin/window/defs.h b/usr.bin/window/defs.h
deleted file mode 100644
index 6601e5d..0000000
--- a/usr.bin/window/defs.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)defs.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#include "ww.h"
-#include <sys/time.h>
-
-#define NWINDOW 9
-
-struct timeval starttime;
-
-struct ww *window[NWINDOW]; /* the windows */
-struct ww *selwin; /* the selected window */
-struct ww *lastselwin; /* the last selected window */
-struct ww *cmdwin; /* the command window */
-struct ww *framewin; /* the window for framing */
-struct ww *boxwin; /* the window for the box */
-struct ww *fgwin; /* the last foreground window */
-
-#define isfg(w) ((w)->ww_order <= fgwin->ww_order)
-
-char *default_shell[128]; /* default shell argv */
-char *default_shellfile; /* default shell program */
-int default_nline; /* default buffer size for new windows */
-int default_smooth; /* default "smooth" parameter */
-char escapec; /* the escape character */
-
- /* flags */
-char quit; /* quit command issued */
-char terse; /* terse mode */
-char debug; /* debug mode */
-char incmd; /* in command mode */
-
-struct ww *getwin();
-struct ww *openwin();
-struct ww *vtowin();
-struct ww *openiwin();
diff --git a/usr.bin/window/error.c b/usr.bin/window/error.c
deleted file mode 100644
index 7e759c1..0000000
--- a/usr.bin/window/error.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)error.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "defs.h"
-#include "value.h"
-#include "context.h"
-#include "char.h"
-
-#define ERRLINES 10 /* number of lines for errwin */
-
-/*VARARGS1*/
-error(fmt, a, b, c, d, e, f, g, h)
-char *fmt;
-{
- register struct context *x;
- register struct ww *w;
-
- for (x = &cx; x != 0 && x->x_type != X_FILE; x = x->x_link)
- ;
- if (x == 0) {
- if (terse)
- wwbell();
- else {
- wwprintf(cmdwin, fmt, a, b, c, d, e, f, g, h);
- wwputs(" ", cmdwin);
- }
- return;
- }
- if (x->x_noerr)
- return;
- if ((w = x->x_errwin) == 0) {
- char buf[512];
-
- (void) sprintf(buf, "Errors from %s", x->x_filename);
- if ((w = x->x_errwin = openiwin(ERRLINES, buf)) == 0) {
- wwputs("Can't open error window. ", cmdwin);
- x->x_noerr = 1;
- return;
- }
- }
- if (more(w, 0) == 2) {
- x->x_noerr = 1;
- return;
- }
- wwprintf(w, "line %d: ", x->x_lineno);
- wwprintf(w, fmt, a, b, c, d, e, f, g, h);
- wwputc('\n', w);
-}
-
-err_end()
-{
- if (cx.x_type == X_FILE && cx.x_errwin != 0) {
- if (!cx.x_noerr)
- waitnl(cx.x_errwin);
- closeiwin(cx.x_errwin);
- cx.x_errwin = 0;
- }
-}
diff --git a/usr.bin/window/lcmd.c b/usr.bin/window/lcmd.c
deleted file mode 100644
index 85a5489..0000000
--- a/usr.bin/window/lcmd.c
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)lcmd.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "defs.h"
-#include "value.h"
-#include "lcmd.h"
-
-int l_alias();
-int l_close();
-int l_cursormodes();
-int l_debug();
-int l_def_nline();
-int l_def_shell();
-int l_def_smooth();
-int l_echo();
-int l_escape();
-int l_foreground();
-int l_iostat();
-int l_label();
-int l_list();
-int l_select();
-int l_smooth();
-int l_source();
-int l_terse();
-int l_time();
-int l_unalias();
-int l_unset();
-int l_variable();
-int l_window();
-int l_write();
-
-extern struct lcmd_arg arg_alias[];
-extern struct lcmd_arg arg_cursormodes[];
-extern struct lcmd_arg arg_debug[];
-extern struct lcmd_arg arg_echo[];
-extern struct lcmd_arg arg_escape[];
-extern struct lcmd_arg arg_foreground[];
-extern struct lcmd_arg arg_label[];
-extern struct lcmd_arg arg_def_nline[];
-extern struct lcmd_arg arg_def_shell[];
-extern struct lcmd_arg arg_def_smooth[];
-extern struct lcmd_arg arg_close[];
-extern struct lcmd_arg arg_select[];
-extern struct lcmd_arg arg_smooth[];
-extern struct lcmd_arg arg_source[];
-extern struct lcmd_arg arg_terse[];
-extern struct lcmd_arg arg_time[];
-extern struct lcmd_arg arg_unalias[];
-extern struct lcmd_arg arg_unset[];
-extern struct lcmd_arg arg_window[];
-extern struct lcmd_arg arg_write[];
-struct lcmd_arg arg_null[1] = { { 0 } };
-
-struct lcmd_tab lcmd_tab[] = {
- "alias", 1, l_alias, arg_alias,
- "close", 2, l_close, arg_close,
- "cursormodes", 2, l_cursormodes, arg_cursormodes,
- "debug", 1, l_debug, arg_debug,
- "default_nlines", 9, l_def_nline, arg_def_nline,
- "default_shell", 10, l_def_shell, arg_def_shell,
- "default_smooth", 10, l_def_smooth, arg_def_smooth,
- "echo", 2, l_echo, arg_echo,
- "escape", 2, l_escape, arg_escape,
- "foreground", 1, l_foreground, arg_foreground,
- "iostat", 1, l_iostat, arg_null,
- "label", 2, l_label, arg_label,
- "list", 2, l_list, arg_null,
- "nlines", 1, l_def_nline, arg_def_nline,
- "select", 2, l_select, arg_select,
- "shell", 2, l_def_shell, arg_def_shell,
- "smooth", 2, l_smooth, arg_smooth,
- "source", 2, l_source, arg_source,
- "terse", 2, l_terse, arg_terse,
- "time", 2, l_time, arg_time,
- "unalias", 3, l_unalias, arg_unalias,
- "unset", 3, l_unset, arg_unset,
- "variable", 1, l_variable, arg_null,
- "window", 2, l_window, arg_window,
- "write", 2, l_write, arg_write,
- 0
-};
-
-struct lcmd_tab *
-lcmd_lookup(name)
-char *name;
-{
- register struct lcmd_tab *p;
-
- for (p = lcmd_tab; p->lc_name != 0; p++)
- if (str_match(name, p->lc_name, p->lc_minlen))
- return p;
- return 0;
-}
-
-dosource(filename)
-char *filename;
-{
- if (cx_beginfile(filename) < 0)
- return -1;
- p_start();
- err_end();
- cx_end();
- return 0;
-}
-
-dolongcmd(buffer, arg, narg)
-char *buffer;
-struct value *arg;
-int narg;
-{
- if (cx_beginbuf(buffer, arg, narg) < 0)
- return -1;
- p_start();
- err_end();
- cx_end();
- return 0;
-}
diff --git a/usr.bin/window/lcmd.h b/usr.bin/window/lcmd.h
deleted file mode 100644
index 6c58e2d..0000000
--- a/usr.bin/window/lcmd.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)lcmd.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#define LCMD_NARG 20 /* maximum number of arguments */
-
-struct lcmd_tab {
- char *lc_name;
- int lc_minlen;
- int (*lc_func)();
- struct lcmd_arg *lc_arg;
-};
-
-struct lcmd_arg {
- char *arg_name;
- int arg_minlen;
- int arg_flags;
-};
-
- /* arg_flags bits */
-#define ARG_TYPE 0x0f /* type of arg */
-#define ARG_ANY 0x00 /* any type */
-#define ARG_NUM 0x01 /* must be a number */
-#define ARG_STR 0x02 /* must be a string */
-#define ARG_LIST 0x10 /* this arg can be a list */
-
-struct lcmd_tab *lcmd_lookup();
diff --git a/usr.bin/window/lcmd1.c b/usr.bin/window/lcmd1.c
deleted file mode 100644
index 1e072d6..0000000
--- a/usr.bin/window/lcmd1.c
+++ /dev/null
@@ -1,432 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)lcmd1.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "defs.h"
-#include <string.h> /* System string definitions. */
-#include "mystring.h" /* Local string definitions. */
-#include "value.h"
-#include "lcmd.h"
-#include "var.h"
-
-struct lcmd_arg arg_window[] = {
- { "row", 1, ARG_NUM },
- { "column", 1, ARG_NUM },
- { "nrows", 2, ARG_NUM },
- { "ncols", 2, ARG_NUM },
- { "nlines", 2, ARG_NUM },
- { "label", 1, ARG_STR },
- { "pty", 1, ARG_ANY },
- { "frame", 1, ARG_ANY },
- { "mapnl", 1, ARG_ANY },
- { "keepopen", 1, ARG_ANY },
- { "smooth", 1, ARG_ANY },
- { "shell", 1, ARG_STR|ARG_LIST },
- 0
-};
-
-l_window(v, a)
-struct value *v;
-register struct value *a;
-{
- struct ww *w;
- int col, row, ncol, nrow, id, nline;
- char *label;
- char haspty, hasframe, mapnl, keepopen, smooth;
- char *shf, **sh;
- char *argv[sizeof default_shell / sizeof *default_shell];
- register char **pp;
-
- if ((id = findid()) < 0)
- return;
- row = a->v_type == V_ERR ? 1 : a->v_num;
- a++;
- col = a->v_type == V_ERR ? 0 : a->v_num;
- a++;
- nrow = a->v_type == V_ERR ? wwnrow - row : a->v_num;
- a++;
- ncol = a->v_type == V_ERR ? wwncol - col : a->v_num;
- a++;
- nline = a->v_type == V_ERR ? default_nline : a->v_num;
- a++;
- label = a->v_type == V_ERR ? 0 : a->v_str;
- if ((haspty = vtobool(++a, 1, -1)) < 0)
- return;
- if ((hasframe = vtobool(++a, 1, -1)) < 0)
- return;
- if ((mapnl = vtobool(++a, !haspty, -1)) < 0)
- return;
- if ((keepopen = vtobool(++a, 0, -1)) < 0)
- return;
- if ((smooth = vtobool(++a, default_smooth, -1)) < 0)
- return;
- if ((++a)->v_type != V_ERR) {
- for (pp = argv; a->v_type != V_ERR &&
- pp < &argv[sizeof argv/sizeof *argv-1]; pp++, a++)
- *pp = a->v_str;
- *pp = 0;
- shf = *(sh = argv);
- if (*sh = rindex(shf, '/'))
- (*sh)++;
- else
- *sh = shf;
- } else {
- sh = default_shell;
- shf = default_shellfile;
- }
- if ((w = openwin(id, row, col, nrow, ncol, nline, label, haspty,
- hasframe, shf, sh)) == 0)
- return;
- w->ww_mapnl = mapnl;
- w->ww_keepopen = keepopen;
- w->ww_noupdate = !smooth;
- v->v_type = V_NUM;
- v->v_num = id + 1;
-}
-
-struct lcmd_arg arg_def_nline[] = {
- { "nlines", 1, ARG_NUM },
- 0
-};
-
-l_def_nline(v, a)
-register struct value *v, *a;
-{
- v->v_num = default_nline;
- v->v_type = V_NUM;
- if (a->v_type != V_ERR)
- default_nline = a->v_num;
-}
-
-struct lcmd_arg arg_smooth[] = {
- { "window", 1, ARG_NUM },
- { "flag", 1, ARG_ANY },
- 0
-};
-
-l_smooth(v, a)
-register struct value *v, *a;
-{
- struct ww *w;
-
- v->v_type = V_NUM;
- v->v_num = 0;
- if ((w = vtowin(a++, selwin)) == 0)
- return;
- v->v_num = !w->ww_noupdate;
- w->ww_noupdate = !vtobool(a, v->v_num, v->v_num);
-}
-
-struct lcmd_arg arg_def_smooth[] = {
- { "flag", 1, ARG_ANY },
- 0
-};
-
-l_def_smooth(v, a)
-register struct value *v, *a;
-{
- v->v_type = V_NUM;
- v->v_num = default_smooth;
- default_smooth = vtobool(a, v->v_num, v->v_num);
-}
-
-struct lcmd_arg arg_select[] = {
- { "window", 1, ARG_NUM },
- 0
-};
-
-l_select(v, a)
-register struct value *v, *a;
-{
- struct ww *w;
-
- v->v_type = V_NUM;
- v->v_num = selwin ? selwin->ww_id + 1 : -1;
- if (a->v_type == V_ERR)
- return;
- if ((w = vtowin(a, (struct ww *)0)) == 0)
- return;
- setselwin(w);
-}
-
-struct lcmd_arg arg_debug[] = {
- { "flag", 1, ARG_ANY },
- 0
-};
-
-l_debug(v, a)
-register struct value *v, *a;
-{
- v->v_type = V_NUM;
- v->v_num = debug;
- debug = vtobool(a, debug, debug);
-}
-
-struct lcmd_arg arg_escape[] = {
- { "escapec", 1, ARG_STR },
- 0
-};
-
-l_escape(v, a)
-register struct value *v, *a;
-{
- char buf[2];
-
- buf[0] = escapec;
- buf[1] = 0;
- if ((v->v_str = str_cpy(buf)) == 0) {
- error("Out of memory.");
- return;
- }
- v->v_type = V_STR;
- if (a->v_type != V_ERR)
- setescape(a->v_str);
-}
-
-struct lcmd_arg arg_label[] = {
- { "window", 1, ARG_NUM },
- { "label", 1, ARG_STR },
- 0
-};
-
-/*ARGSUSED*/
-l_label(v, a)
-struct value *v;
-register struct value *a;
-{
- struct ww *w;
-
- if ((w = vtowin(a, selwin)) == 0)
- return;
- if ((++a)->v_type != V_ERR && setlabel(w, a->v_str) < 0)
- error("Out of memory.");
- reframe();
-}
-
-struct lcmd_arg arg_foreground[] = {
- { "window", 1, ARG_NUM },
- { "flag", 1, ARG_ANY },
- 0
-};
-
-l_foreground(v, a)
-register struct value *v, *a;
-{
- struct ww *w;
- char flag;
-
- if ((w = vtowin(a, selwin)) == 0)
- return;
- v->v_type = V_NUM;
- v->v_num = isfg(w);
- flag = vtobool(++a, v->v_num, v->v_num);
- if (flag == v->v_num)
- return;
- deletewin(w);
- addwin(w, flag);
- reframe();
-}
-
-struct lcmd_arg arg_terse[] = {
- { "flag", 1, ARG_ANY },
- 0
-};
-
-l_terse(v, a)
-register struct value *v, *a;
-{
- v->v_type = V_NUM;
- v->v_num = terse;
- setterse(vtobool(a, terse, terse));
-}
-
-struct lcmd_arg arg_source[] = {
- { "filename", 1, ARG_STR },
- 0
-};
-
-l_source(v, a)
-register struct value *v, *a;
-{
- v->v_type = V_NUM;
- if (a->v_type != V_ERR && dosource(a->v_str) < 0) {
- error("Can't open %s.", a->v_str);
- v->v_num = -1;
- } else
- v->v_num = 0;
-}
-
-struct lcmd_arg arg_write[] = {
- { "window", 1, ARG_NUM },
- { "", 0, ARG_ANY|ARG_LIST },
- 0
-};
-
-/*ARGSUSED*/
-l_write(v, a)
-struct value *v;
-register struct value *a;
-{
- char buf[20];
- struct ww *w;
-
- if ((w = vtowin(a++, selwin)) == 0)
- return;
- while (a->v_type != V_ERR) {
- if (a->v_type == V_NUM) {
- (void) sprintf(buf, "%d", a->v_num);
- (void) write(w->ww_pty, buf, strlen(buf));
- } else
- (void) write(w->ww_pty, a->v_str, strlen(a->v_str));
- if ((++a)->v_type != V_ERR)
- (void) write(w->ww_pty, " ", 1);
- }
-}
-
-struct lcmd_arg arg_close[] = {
- { "window", 1, ARG_ANY|ARG_LIST },
- 0
-};
-
-/*ARGSUSED*/
-l_close(v, a)
-struct value *v;
-register struct value *a;
-{
- struct ww *w;
-
- if (a->v_type == V_STR && str_match(a->v_str, "all", 3))
- closewin((struct ww *)0);
- else
- for (; a->v_type != V_ERR; a++)
- if ((w = vtowin(a, (struct ww *)0)) != 0)
- closewin(w);
-}
-
-struct lcmd_arg arg_cursormodes[] = {
- { "modes", 1, ARG_NUM },
- 0
-};
-
-l_cursormodes(v, a)
-register struct value *v, *a;
-{
-
- v->v_type = V_NUM;
- v->v_num = wwcursormodes;
- if (a->v_type != V_ERR)
- wwsetcursormodes(a->v_num);
-}
-
-struct lcmd_arg arg_unset[] = {
- { "variable", 1, ARG_ANY },
- 0
-};
-
-l_unset(v, a)
-register struct value *v, *a;
-{
- v->v_type = V_NUM;
- switch (a->v_type) {
- case V_ERR:
- v->v_num = -1;
- return;
- case V_NUM:
- if ((a->v_str = str_itoa(a->v_num)) == 0) {
- error("Out of memory.");
- v->v_num = -1;
- return;
- }
- a->v_type = V_STR;
- break;
- }
- v->v_num = var_unset(a->v_str);
-}
-
-struct ww *
-vtowin(v, w)
-register struct value *v;
-struct ww *w;
-{
- switch (v->v_type) {
- case V_ERR:
- if (w != 0)
- return w;
- error("No window specified.");
- return 0;
- case V_STR:
- error("%s: No such window.", v->v_str);
- return 0;
- }
- if (v->v_num < 1 || v->v_num > NWINDOW
- || (w = window[v->v_num - 1]) == 0) {
- error("%d: No such window.", v->v_num);
- return 0;
- }
- return w;
-}
-
-vtobool(v, def, err)
-register struct value *v;
-char def, err;
-{
- switch (v->v_type) {
- case V_NUM:
- return v->v_num != 0;
- case V_STR:
- if (str_match(v->v_str, "true", 1)
- || str_match(v->v_str, "on", 2)
- || str_match(v->v_str, "yes", 1))
- return 1;
- else if (str_match(v->v_str, "false", 1)
- || str_match(v->v_str, "off", 2)
- || str_match(v->v_str, "no", 1))
- return 0;
- else {
- error("%s: Illegal boolean value.", v->v_str);
- return err;
- }
- /*NOTREACHED*/
- case V_ERR:
- return def;
- }
- /*NOTREACHED*/
-}
diff --git a/usr.bin/window/lcmd2.c b/usr.bin/window/lcmd2.c
deleted file mode 100644
index a9972a9..0000000
--- a/usr.bin/window/lcmd2.c
+++ /dev/null
@@ -1,403 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)lcmd2.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "defs.h"
-#include <string.h> /* System string definitions. */
-#include "mystring.h" /* Local string definitions. */
-#include "value.h"
-#include "var.h"
-#include "lcmd.h"
-#include "alias.h"
-#include <sys/types.h>
-#include <sys/resource.h>
-
-/*ARGSUSED*/
-l_iostat(v, a)
-struct value *v, *a;
-{
- register struct ww *w;
-
- if ((w = openiwin(16, "IO Statistics")) == 0) {
- error("Can't open statistics window: %s.", wwerror());
- return;
- }
- wwprintf(w, "ttflush\twrite\terror\tzero\tchar\n");
- wwprintf(w, "%d\t%d\t%d\t%d\t%d\n",
- wwnflush, wwnwr, wwnwre, wwnwrz, wwnwrc);
- wwprintf(w, "token\tuse\tbad\tsaving\ttotal\tbaud\n");
- wwprintf(w, "%d\t%d\t%d\t%d\t%d\t%d/%d (%.1f/%.1f)\n",
- wwntokdef, wwntokuse, wwntokbad, wwntoksave, wwntokc,
- wwntokc - wwntoksave ?
- (int) ((float) wwbaud * wwntokc /
- (wwntokc - wwntoksave)) :
- wwbaud,
- wwnwrc ? (int) ((float) wwbaud * (wwnwrc + wwntoksave) /
- wwnwrc) :
- wwbaud,
- wwntokc - wwntoksave ?
- (float) wwntokc / (wwntokc - wwntoksave) : 1.0,
- wwnwrc ? (float) (wwnwrc + wwntoksave) / wwnwrc : 1.0);
- wwprintf(w, "wwwrite\tattempt\tchar\n");
- wwprintf(w, "%d\t%d\t%d\n",
- wwnwwr, wwnwwra, wwnwwrc);
- wwprintf(w, "wwupdat\tline\tmiss\tscan\tclreol\tclreos\tmiss\tline\n");
- wwprintf(w, "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
- wwnupdate, wwnupdline, wwnupdmiss, wwnupdscan, wwnupdclreol,
- wwnupdclreos, wwnupdclreosmiss, wwnupdclreosline);
- wwprintf(w, "select\terror\tzero\n");
- wwprintf(w, "%d\t%d\t%d\n",
- wwnselect, wwnselecte, wwnselectz);
- wwprintf(w, "read\terror\tzero\tchar\tack\tnack\tstat\terrorc\n");
- wwprintf(w, "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
- wwnread, wwnreade, wwnreadz, wwnreadc, wwnreadack, wwnreadnack,
- wwnreadstat, wwnreadec);
- wwprintf(w, "ptyread\terror\tzero\tcontrol\tdata\tchar\n");
- wwprintf(w, "%d\t%d\t%d\t%d\t%d\t%d\n",
- wwnwread, wwnwreade, wwnwreadz,
- wwnwreadp, wwnwreadd, wwnwreadc);
- waitnl(w);
- closeiwin(w);
-}
-
-struct lcmd_arg arg_time[] = {
- { "who", 1, ARG_STR },
- 0
-};
-
-/*ARGSUSED*/
-l_time(v, a)
-struct value *v;
-register struct value *a;
-{
- register struct ww *w;
- struct rusage rusage;
- struct timeval timeval;
- char *strtime();
-
- if ((w = openiwin(8, "Timing and Resource Usage")) == 0) {
- error("Can't open time window: %s.", wwerror());
- return;
- }
-
- (void) gettimeofday(&timeval, (struct timezone *)0);
- timeval.tv_sec -= starttime.tv_sec;
- if ((timeval.tv_usec -= starttime.tv_usec) < 0) {
- timeval.tv_sec--;
- timeval.tv_usec += 1000000;
- }
- (void) getrusage(a->v_type == V_STR
- && str_match(a->v_str, "children", 1)
- ? RUSAGE_CHILDREN : RUSAGE_SELF, &rusage);
-
- wwprintf(w, "%-15s %-15s %-15s\n",
- "time", "utime", "stime");
- wwprintf(w, "%-15s ", strtime(&timeval));
- wwprintf(w, "%-15s ", strtime(&rusage.ru_utime));
- wwprintf(w, "%-15s\n", strtime(&rusage.ru_stime));
- wwprintf(w, "%-15s %-15s %-15s %-15s\n",
- "maxrss", "ixrss", "idrss", "isrss");
- wwprintf(w, "%-15ld %-15ld %-15ld %-15ld\n",
- rusage.ru_maxrss, rusage.ru_ixrss,
- rusage.ru_idrss, rusage.ru_isrss);
- wwprintf(w, "%-7s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-7s\n",
- "minflt", "majflt", "nswap", "inblk", "oublk",
- "msgsnd", "msgrcv", "nsigs", "nvcsw", "nivcsw");
- wwprintf(w, "%-7ld %-7ld %-7ld %-7ld %-7ld %-7ld %-7ld %-7ld %-7ld %-7ld\n",
- rusage.ru_minflt, rusage.ru_majflt, rusage.ru_nswap,
- rusage.ru_inblock, rusage.ru_oublock,
- rusage.ru_msgsnd, rusage.ru_msgrcv, rusage.ru_nsignals,
- rusage.ru_nvcsw, rusage.ru_nivcsw);
-
- waitnl(w);
- closeiwin(w);
-}
-
-char *
-strtime(t)
-register struct timeval *t;
-{
- char fill = 0;
- static char buf[20];
- register char *p = buf;
-
- if (t->tv_sec > 60*60) {
- (void) sprintf(p, "%ld:", t->tv_sec / (60*60));
- while (*p++)
- ;
- p--;
- t->tv_sec %= 60*60;
- fill++;
- }
- if (t->tv_sec > 60) {
- (void) sprintf(p, fill ? "%02ld:" : "%ld:", t->tv_sec / 60);
- while (*p++)
- ;
- p--;
- t->tv_sec %= 60;
- fill++;
- }
- (void) sprintf(p, fill ? "%02ld.%02ld" : "%ld.%02ld",
- t->tv_sec, t->tv_usec / 10000);
- return buf;
-}
-
-/*ARGSUSED*/
-l_list(v, a)
-struct value *v, *a;
-{
- register struct ww *w, *wp;
- register i;
- int n;
-
- for (n = 0, i = 0; i < NWINDOW; i++)
- if (window[i] != 0)
- n++;
- if (n == 0) {
- error("No windows.");
- return;
- }
- if ((w = openiwin(n + 2, "Windows")) == 0) {
- error("Can't open listing window: %s.", wwerror());
- return;
- }
- for (i = 0; i < NWINDOW; i++) {
- if ((wp = window[i]) == 0)
- continue;
- wwprintf(w, "%c %c %-13s %-.*s\n",
- wp == selwin ? '+' : (wp == lastselwin ? '-' : ' '),
- i + '1',
- wp->ww_state == WWS_HASPROC ? "" : "(No process)",
- wwncol - 20,
- wp->ww_label ? wp->ww_label : "(No label)");
- }
- waitnl(w);
- closeiwin(w);
-}
-
-/*ARGSUSED*/
-l_variable(v, a)
-struct value *v, *a;
-{
- register struct ww *w;
- int printvar();
-
- if ((w = openiwin(wwnrow - 3, "Variables")) == 0) {
- error("Can't open variable window: %s.", wwerror());
- return;
- }
- if (var_walk(printvar, (long)w) >= 0)
- waitnl(w);
- closeiwin(w);
-}
-
-printvar(w, r)
-register struct ww *w;
-register struct var *r;
-{
- if (more(w, 0) == 2)
- return -1;
- wwprintf(w, "%16s ", r->r_name);
- switch (r->r_val.v_type) {
- case V_STR:
- wwprintf(w, "%s\n", r->r_val.v_str);
- break;
- case V_NUM:
- wwprintf(w, "%d\n", r->r_val.v_num);
- break;
- case V_ERR:
- wwprintf(w, "ERROR\n");
- break;
- }
- return 0;
-}
-
-struct lcmd_arg arg_def_shell[] = {
- { "", 0, ARG_ANY|ARG_LIST },
- 0
-};
-
-l_def_shell(v, a)
- struct value *v, *a;
-{
- register char **pp;
- register struct value *vp;
-
- if (a->v_type == V_ERR) {
- if ((v->v_str = str_cpy(default_shellfile)) != 0)
- v->v_type = V_STR;
- return;
- }
- if (v->v_str = default_shellfile) {
- v->v_type = V_STR;
- for (pp = default_shell + 1; *pp; pp++) {
- str_free(*pp);
- *pp = 0;
- }
- }
- for (pp = default_shell, vp = a;
- vp->v_type != V_ERR &&
- pp < &default_shell[sizeof default_shell/sizeof *default_shell-1];
- pp++, vp++)
- if ((*pp = vp->v_type == V_STR ?
- str_cpy(vp->v_str) : str_itoa(vp->v_num)) == 0) {
- /* just leave default_shell[] the way it is */
- p_memerror();
- break;
- }
- if (default_shellfile = *default_shell)
- if (*default_shell = rindex(default_shellfile, '/'))
- (*default_shell)++;
- else
- *default_shell = default_shellfile;
-}
-
-struct lcmd_arg arg_alias[] = {
- { "", 0, ARG_STR },
- { "", 0, ARG_STR|ARG_LIST },
- 0
-};
-
-l_alias(v, a)
- struct value *v, *a;
-{
- if (a->v_type == V_ERR) {
- register struct ww *w;
- int printalias();
-
- if ((w = openiwin(wwnrow - 3, "Aliases")) == 0) {
- error("Can't open alias window: %s.", wwerror());
- return;
- }
- if (alias_walk(printalias, (long)w) >= 0)
- waitnl(w);
- closeiwin(w);
- } else {
- register struct alias *ap = 0;
-
- if (ap = alias_lookup(a->v_str)) {
- if ((v->v_str = str_cpy(ap->a_buf)) == 0) {
- p_memerror();
- return;
- }
- v->v_type = V_STR;
- }
- if (a[1].v_type == V_STR) {
- register struct value *vp;
- register char *p, *q;
- char *str;
- register n;
-
- for (n = 0, vp = a + 1; vp->v_type != V_ERR; vp++, n++)
- for (p = vp->v_str; *p; p++, n++)
- ;
- if ((str = str_alloc(n)) == 0) {
- p_memerror();
- return;
- }
- for (q = str, vp = a + 1; vp->v_type != V_ERR;
- vp++, q[-1] = ' ')
- for (p = vp->v_str; *q++ = *p++;)
- ;
- q[-1] = 0;
- if ((ap = alias_set(a[0].v_str, (char *)0)) == 0) {
- p_memerror();
- str_free(str);
- return;
- }
- ap->a_buf = str;
- }
- }
-}
-
-printalias(w, a)
-register struct ww *w;
-register struct alias *a;
-{
- if (more(w, 0) == 2)
- return -1;
- wwprintf(w, "%16s %s\n", a->a_name, a->a_buf);
- return 0;
-}
-
-struct lcmd_arg arg_unalias[] = {
- { "alias", 1, ARG_STR },
- 0
-};
-
-l_unalias(v, a)
-struct value *v, *a;
-{
- if (a->v_type == ARG_STR)
- v->v_num = alias_unset(a->v_str);
- v->v_type = V_NUM;
-}
-
-struct lcmd_arg arg_echo[] = {
- { "window", 1, ARG_NUM },
- { "", 0, ARG_ANY|ARG_LIST },
- 0
-};
-
-/*ARGSUSED*/
-l_echo(v, a)
-struct value *v;
-register struct value *a;
-{
- char buf[20];
- struct ww *w;
-
- if ((w = vtowin(a++, selwin)) == 0)
- return;
- while (a->v_type != V_ERR) {
- if (a->v_type == V_NUM) {
- (void) sprintf(buf, "%d", a->v_num);
- (void) wwwrite(w, buf, strlen(buf));
- } else
- (void) wwwrite(w, a->v_str, strlen(a->v_str));
- if ((++a)->v_type != V_ERR)
- (void) wwwrite(w, " ", 1);
- }
- (void) wwwrite(w, "\r\n", 2);
-}
diff --git a/usr.bin/window/local.h b/usr.bin/window/local.h
deleted file mode 100644
index 685e320..0000000
--- a/usr.bin/window/local.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)local.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-/*
- * Things of local interest.
- */
-
-#define RUNCOM ".windowrc"
-#define ESCAPEC ctrl('p')
-#define NLINE 48 /* default text buffer size */
-
-#ifdef TERMINFO
-#define _PATH_CAPTOINFO "/usr/5bin/captoinfo"
-#define _PATH_TIC "/usr/5bin/tic"
-#define _PATH_RM "/bin/rm"
-#endif
diff --git a/usr.bin/window/main.c b/usr.bin/window/main.c
deleted file mode 100644
index 844ca76..0000000
--- a/usr.bin/window/main.c
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-char copyright[] =
-"@(#) Copyright (c) 1983, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static char sccsid[] = "@(#)main.c 8.2 (Berkeley) 4/2/94";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "defs.h"
-#include <paths.h>
-#include <locale.h>
-#include <stdio.h>
-#include <string.h> /* System string definitions. */
-#include "mystring.h" /* Local string definitions. */
-#include "char.h"
-#include "local.h"
-
-#define next(a) (*++*(a) ? *(a) : (*++(a) ? *(a) : (char *)(uintptr_t)usage()))
-
-/*ARGSUSED*/
-main(argc, argv)
-char **argv;
-{
- register char *p;
- char fflag = 0;
- char dflag = 0;
- char xflag = 0;
- char *cmd = 0;
- char tflag = 0;
-
- escapec = ESCAPEC;
- if (p = rindex(*argv, '/'))
- p++;
- else
- p = *argv;
- debug = strcmp(p, "a.out") == 0;
- while (*++argv) {
- if (**argv == '-') {
- switch (*++*argv) {
- case 'f':
- fflag++;
- break;
- case 'c':
- if (cmd != 0) {
- (void) fprintf(stderr,
- "Only one -c allowed.\n");
- (void) usage();
- }
- cmd = next(argv);
- break;
- case 'e':
- setescape(next(argv));
- break;
- case 't':
- tflag++;
- break;
- case 'd':
- dflag++;
- break;
- case 'D':
- debug = !debug;
- break;
- case 'x':
- xflag++;
- break;
- default:
- (void) usage();
- }
- } else
- (void) usage();
- }
- if ((p = getenv("SHELL")) == 0)
- p = _PATH_BSHELL;
- if ((default_shellfile = str_cpy(p)) == 0) {
- (void) fprintf(stderr, "Out of memory.\n");
- exit(1);
- }
- if (p = rindex(default_shellfile, '/'))
- p++;
- else
- p = default_shellfile;
- default_shell[0] = p;
- default_shell[1] = 0;
- default_nline = NLINE;
- default_smooth = 1;
- (void) gettimeofday(&starttime, (struct timezone *)0);
- (void) setlocale(LC_CTYPE, "");
- if (wwinit() < 0) {
- (void) fprintf(stderr, "%s.\n", wwerror());
- exit(1);
- }
-
-#ifdef OLD_TTY
- if (debug)
- wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc;
- if (xflag) {
- wwnewtty.ww_tchars.t_stopc = wwoldtty.ww_tchars.t_stopc;
- wwnewtty.ww_tchars.t_startc = wwoldtty.ww_tchars.t_startc;
- }
-#else
- if (debug) {
- wwnewtty.ww_termios.c_cc[VQUIT] =
- wwoldtty.ww_termios.c_cc[VQUIT];
- wwnewtty.ww_termios.c_lflag |= ISIG;
- }
- if (xflag) {
- wwnewtty.ww_termios.c_cc[VSTOP] =
- wwoldtty.ww_termios.c_cc[VSTOP];
- wwnewtty.ww_termios.c_cc[VSTART] =
- wwoldtty.ww_termios.c_cc[VSTART];
- wwnewtty.ww_termios.c_iflag |= IXON;
- }
-#endif
- if (debug || xflag)
- (void) wwsettty(0, &wwnewtty);
-
- if ((cmdwin = wwopen(wwbaud > 2400 ? WWO_REVERSE : 0, 1, wwncol,
- 0, 0, 0)) == 0) {
- wwflush();
- (void) fprintf(stderr, "%s.\r\n", wwerror());
- goto bad;
- }
- cmdwin->ww_mapnl = 1;
- cmdwin->ww_nointr = 1;
- cmdwin->ww_noupdate = 1;
- cmdwin->ww_unctrl = 1;
- if ((framewin = wwopen(WWO_GLASS|WWO_FRAME, wwnrow, wwncol, 0, 0, 0))
- == 0) {
- wwflush();
- (void) fprintf(stderr, "%s.\r\n", wwerror());
- goto bad;
- }
- wwadd(framewin, &wwhead);
- if ((boxwin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) {
- wwflush();
- (void) fprintf(stderr, "%s.\r\n", wwerror());
- goto bad;
- }
- fgwin = framewin;
-
- wwupdate();
- wwflush();
- setvars();
-
- setterse(tflag);
- setcmd(1);
- if (cmd != 0)
- (void) dolongcmd(cmd, (struct value *)0, 0);
- if (!fflag)
- if (dflag || doconfig() < 0)
- dodefault();
- if (selwin != 0)
- setcmd(0);
-
- mloop();
-
-bad:
- wwend(1);
- return 0;
-}
-
-usage()
-{
- (void) fprintf(stderr, "usage: window [-e escape-char] [-c command] [-t] [-f] [-d]\n");
- exit(1);
- return 0; /* for lint */
-}
diff --git a/usr.bin/window/mloop.c b/usr.bin/window/mloop.c
deleted file mode 100644
index 70d41dd..0000000
--- a/usr.bin/window/mloop.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)mloop.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include "defs.h"
-
-mloop()
-{
- while (!quit) {
- if (incmd) {
- docmd();
- } else if (wwcurwin->ww_state != WWS_HASPROC) {
- if (!wwcurwin->ww_keepopen)
- closewin(wwcurwin);
- setcmd(1);
- if (wwpeekc() == escapec)
- (void) wwgetc();
- error("Process died.");
- } else {
- register struct ww *w = wwcurwin;
- register char *p;
- register n;
-
- if (wwibp >= wwibq)
- wwiomux();
- for (p = wwibp; p < wwibq && wwmaskc(*p) != escapec;
- p++)
- ;
- if ((n = p - wwibp) > 0) {
- if (!w->ww_ispty && w->ww_stopped)
- startwin(w);
-#if defined(sun) && !defined(BSD)
- /* workaround for SunOS pty bug */
- while (--n >= 0)
- (void) write(w->ww_pty, wwibp++, 1);
-#else
- (void) write(w->ww_pty, wwibp, n);
- wwibp = p;
-#endif
- }
- if (wwpeekc() == escapec) {
- (void) wwgetc();
- setcmd(1);
- }
- }
- }
-}
diff --git a/usr.bin/window/mystring.h b/usr.bin/window/mystring.h
deleted file mode 100644
index 3d14ae6..0000000
--- a/usr.bin/window/mystring.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)string.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#define STR_DEBUG
-
-char *str_cpy();
-char *str_ncpy();
-char *str_cat();
-char *str_itoa();
-
-#define str_cmp(a, b) strcmp(a, b)
-
-#ifdef STR_DEBUG
-struct mystring {
- struct mystring *s_forw;
- struct mystring *s_back;
- char s_data[1];
-};
-
-struct mystring str_head;
-
-#define str_offset ((unsigned)str_head.s_data - (unsigned)&str_head)
-#define str_stos(s) ((struct mystring *)((unsigned)(s) - str_offset))
-
-char *str_alloc();
-int str_free();
-#else
-#define str_free(s) free(s)
-#define str_alloc(s) malloc(s)
-#endif
diff --git a/usr.bin/window/parser.h b/usr.bin/window/parser.h
deleted file mode 100644
index 30a4503..0000000
--- a/usr.bin/window/parser.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)parser.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#include "value.h"
-#include "context.h"
-#include "token.h"
-#include "mystring.h"
-
-#define p_erred() (cx.x_erred)
-#define p_synerred() (cx.x_synerred)
-#define p_clearerr() (cx.x_erred = cx.x_synerred = 0)
-#define p_abort() (cx.x_abort)
diff --git a/usr.bin/window/parser1.c b/usr.bin/window/parser1.c
deleted file mode 100644
index ac9f9d3..0000000
--- a/usr.bin/window/parser1.c
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)parser1.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "parser.h"
-
-p_start()
-{
- char flag = 1;
-
- (void) s_gettok();
- for (;;) {
- p_statementlist(flag);
- if (token == T_EOF || p_abort())
- break;
- flag = 0;
- p_synerror();
- while (token != T_EOL && token != T_EOF) {
- if (token == T_STR)
- str_free(token_str);
- (void) s_gettok();
- }
- if (token == T_EOL)
- (void) s_gettok();
- p_clearerr();
- }
-}
-
-p_statementlist(flag)
-char flag;
-{
- for (; p_statement(flag) >= 0; p_clearerr())
- ;
-}
-
-p_statement(flag)
-char flag;
-{
- switch (token) {
- case T_EOL:
- (void) s_gettok();
- return 0;
- case T_IF:
- return p_if(flag);
- default:
- return p_expression(flag);
- }
-}
-
-p_if(flag)
-char flag;
-{
- struct value t;
- char true = 0;
-
-top:
- (void) s_gettok();
-
- if (p_expr(&t, flag) < 0) {
- p_synerror();
- return -1;
- }
- switch (t.v_type) {
- case V_NUM:
- true = !true && t.v_num != 0;
- break;
- case V_STR:
- p_error("if: Numeric value required.");
- str_free(t.v_str);
- case V_ERR:
- flag = 0;
- break;
- }
-
- if (token != T_THEN) {
- p_synerror();
- return -1;
- }
-
- (void) s_gettok();
- p_statementlist(flag && true);
- if (p_erred())
- return -1;
-
- if (token == T_ELSIF)
- goto top;
-
- if (token == T_ELSE) {
- (void) s_gettok();
- p_statementlist(flag && !true);
- if (p_erred())
- return -1;
- }
-
- if (token == T_ENDIF) {
- (void) s_gettok();
- return 0;
- }
-
- p_synerror();
- return -1;
-}
-
-p_expression(flag)
-char flag;
-{
- struct value t;
- char *cmd;
- int p_function(), p_assign();
-
- switch (token) {
- case T_NUM:
- t.v_type = V_NUM;
- t.v_num = token_num;
- (void) s_gettok();
- break;
- case T_STR:
- t.v_type = V_STR;
- t.v_str = token_str;
- (void) s_gettok();
- break;
- default:
- if (p_expr(&t, flag) < 0)
- return -1;
- if (token == T_EOF) {
- val_free(t);
- return 0;
- }
- }
- if (token != T_ASSIGN && p_convstr(&t) < 0)
- return -1;
- cmd = t.v_type == V_STR ? t.v_str : 0;
- if ((*(token == T_ASSIGN ? p_assign : p_function))(cmd, &t, flag) < 0) {
- if (cmd)
- str_free(cmd);
- return -1;
- }
- if (cmd)
- str_free(cmd);
- val_free(t);
- if (token == T_EOL)
- (void) s_gettok();
- else if (token != T_EOF) {
- p_synerror();
- return -1;
- }
- return 0;
-}
-
-p_convstr(v)
-register struct value *v;
-{
- if (v->v_type != V_NUM)
- return 0;
- if ((v->v_str = str_itoa(v->v_num)) == 0) {
- p_memerror();
- v->v_type = V_ERR;
- return -1;
- }
- v->v_type = V_STR;
- return 0;
-}
-
-p_synerror()
-{
- if (!cx.x_synerred) {
- cx.x_synerred = cx.x_erred = 1;
- error("Syntax error.");
- }
-}
-
-/*VARARGS1*/
-p_error(msg, a, b, c)
-char *msg;
-{
- if (!cx.x_erred) {
- cx.x_erred = 1;
- error(msg, a, b, c);
- }
-}
-
-p_memerror()
-{
- cx.x_erred = cx.x_abort = 1;
- error("Out of memory.");
-}
diff --git a/usr.bin/window/parser2.c b/usr.bin/window/parser2.c
deleted file mode 100644
index 75552de..0000000
--- a/usr.bin/window/parser2.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)parser2.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "parser.h"
-#include "var.h"
-#include "lcmd.h"
-#include "alias.h"
-
-/*
- * name == 0 means we don't have a function name but
- * want to parse the arguments anyway. flag == 0 in this case.
- */
-p_function(name, v, flag)
-char *name;
-register struct value *v;
-{
- struct value t;
- register struct lcmd_tab *c = 0;
- register struct alias *a = 0;
- register struct lcmd_arg *ap; /* this arg */
- struct lcmd_arg *lp = 0; /* list arg */
- register i;
- struct value av[LCMD_NARG + 1];
- register struct value *vp;
-
- if (name != 0)
- if (c = lcmd_lookup(name))
- name = c->lc_name;
- else if (a = alias_lookup(name))
- name = a->a_name;
- else {
- p_error("%s: No such command or alias.", name);
- flag = 0;
- }
-
- for (vp = av; vp < &av[LCMD_NARG + 1]; vp++)
- vp->v_type = V_ERR;
-
- if (token == T_LP)
- (void) s_gettok();
- i = 0;
- for (;;) {
- ap = 0;
- vp = 0;
- if (token == T_COMMA) /* null argument */
- t.v_type = V_ERR;
- else {
- if (p_expr0(&t, flag) < 0)
- break;
- if (t.v_type == V_ERR)
- flag = 0;
- }
- if (token != T_ASSIGN) {
- if (i >= LCMD_NARG ||
- c != 0 && (ap = lp) == 0 &&
- (ap = c->lc_arg + i)->arg_name == 0) {
- p_error("%s: Too many arguments.", name);
- flag = 0;
- } else
- vp = &av[i++];
- } else {
- char *tmp;
- if (p_convstr(&t) < 0)
- goto abort;
- tmp = t.v_type == V_STR ? t.v_str : 0;
- (void) s_gettok();
- if (p_expr(&t, flag) < 0) {
- if (tmp)
- str_free(tmp);
- p_synerror();
- goto abort;
- }
- if (t.v_type == V_ERR)
- flag = 0;
- if (tmp) {
- if (c == 0) {
- /* an aliase */
- p_error("%s: Bad alias syntax.", name);
- flag = 0;
- } else {
- for (ap = c->lc_arg, vp = av;
- ap != 0 && ap->arg_name != 0 &&
- (*ap->arg_name == '\0' ||
- !str_match(tmp, ap->arg_name,
- ap->arg_minlen));
- ap++, vp++)
- ;
- if (ap == 0 || ap->arg_name == 0) {
- p_error("%s: Unknown argument \"%s\".",
- name, tmp);
- flag = 0;
- ap = 0;
- vp = 0;
- }
- }
- str_free(tmp);
- }
- }
- if (ap != 0) {
- if (ap->arg_flags & ARG_LIST) {
- i = vp - av + 1;
- lp = ap;
- }
- if (vp->v_type != V_ERR) {
- if (*ap->arg_name)
- p_error("%s: Argument %d (%s) duplicated.",
- name, vp - av + 1,
- ap->arg_name);
- else
- p_error("%s: Argument %d duplicated.",
- name, vp - av + 1);
- flag = 0;
- vp = 0;
- } else if (t.v_type == V_ERR) {
- /* do nothing */
- } else if ((ap->arg_flags&ARG_TYPE) == ARG_NUM &&
- t.v_type != V_NUM ||
- (ap->arg_flags&ARG_TYPE) == ARG_STR &&
- t.v_type != V_STR) {
- if (*ap->arg_name)
- p_error("%s: Argument %d (%s) type mismatch.",
- name, vp - av + 1,
- ap->arg_name);
- else
- p_error("%s: Argument %d type mismatch.",
- name, vp - av + 1);
- flag = 0;
- vp = 0;
- }
- }
- if (vp != 0)
- *vp = t;
- else
- val_free(t);
- if (token == T_COMMA)
- (void) s_gettok();
- }
-
- if (p_erred())
- flag = 0;
- if (token == T_RP)
- (void) s_gettok();
- else if (token != T_EOL && token != T_EOF)
- flag = 0; /* look for legal follow set */
- v->v_type = V_ERR;
- if (flag)
- if (c != 0)
- (*c->lc_func)(v, av);
- else
- if (a->a_flags & A_INUSE)
- p_error("%s: Recursive alias.", a->a_name);
- else {
- a->a_flags |= A_INUSE;
- if (dolongcmd(a->a_buf, av, i) < 0)
- p_memerror();
- a->a_flags &= ~A_INUSE;
- }
- if (p_abort()) {
- val_free(*v);
- v->v_type = V_ERR;
- goto abort;
- }
- for (vp = av; vp < &av[LCMD_NARG]; vp++)
- val_free(*vp);
- return 0;
-abort:
- for (vp = av; vp < &av[LCMD_NARG]; vp++)
- val_free(*vp);
- return -1;
-}
-
-p_assign(name, v, flag)
-char *name;
-struct value *v;
-char flag;
-{
- (void) s_gettok();
-
- if (p_expr(v, flag) < 0) {
- p_synerror();
- return -1;
- }
- switch (v->v_type) {
- case V_STR:
- case V_NUM:
- if (flag && var_set(name, v) == 0) {
- p_memerror();
- val_free(*v);
- return -1;
- }
- break;
- }
- return 0;
-}
diff --git a/usr.bin/window/parser3.c b/usr.bin/window/parser3.c
deleted file mode 100644
index bd36d41..0000000
--- a/usr.bin/window/parser3.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)parser3.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "parser.h"
-
-/*
- * =
- * ? :
- * ||
- * &&
- * |
- * ^
- * &
- * == !=
- * <= >=
- * << >>
- * + -
- * * / %
- * unary - + ~ !
- */
-p_expr(v, flag)
-register struct value *v;
-char flag;
-{
- struct value t;
- int ret;
-
- if (p_expr0(&t, flag) < 0)
- return -1;
-
- if (token != T_ASSIGN) {
- *v = t;
- return 0;
- }
- switch (t.v_type) {
- case V_NUM:
- p_error("%d: Not a variable.", t.v_num);
- case V_ERR:
- t.v_str = 0;
- break;
- }
- ret = p_assign(t.v_str, v, flag);
- if (t.v_str != 0)
- str_free(t.v_str);
- return ret;
-}
-
-/*
- * ? :
- */
-p_expr0(v, flag)
-register struct value *v;
-char flag;
-{
- struct value t;
- char true;
-
- if (p_expr1(v, flag) < 0)
- return -1;
- if (token != T_QUEST)
- return 0;
- switch (v->v_type) {
- case V_NUM:
- true = v->v_num != 0;
- break;
- case V_STR:
- p_error("?: Numeric left operand required.");
- str_free(v->v_str);
- v->v_type = V_ERR;
- case V_ERR:
- flag = 0;
- break;
- }
- (void) s_gettok();
- v->v_type = V_ERR;
- if ((flag && true ? p_expr1(v, 1) : p_expr1(&t, 0)) < 0)
- return -1;
- if (token != T_COLON) {
- val_free(*v);
- p_synerror();
- return -1;
- }
- (void) s_gettok();
- return flag && !true ? p_expr1(v, 1) : p_expr1(&t, 0);
-}
-
-/*
- * ||
- */
-p_expr1(v, flag)
-register struct value *v;
-char flag;
-{
- char true = 0;
-
- if (p_expr2(v, flag) < 0)
- return -1;
- if (token != T_OROR)
- return 0;
- for (;;) {
- switch (v->v_type) {
- case V_NUM:
- v->v_num = true = true || v->v_num != 0;
- break;
- case V_STR:
- p_error("||: Numeric operands required.");
- str_free(v->v_str);
- v->v_type = V_ERR;
- case V_ERR:
- flag = 0;
- break;
- }
- if (token != T_OROR)
- return 0;
- (void) s_gettok();
- if (p_expr2(v, flag && !true) < 0)
- return -1;
- }
-}
-
-/*
- * &&
- */
-p_expr2(v, flag)
-register struct value *v;
-char flag;
-{
- char true = 1;
-
- if (p_expr3_10(3, v, flag) < 0)
- return -1;
- if (token != T_ANDAND)
- return 0;
- for (;;) {
- switch (v->v_type) {
- case V_NUM:
- v->v_num = true = true && v->v_num != 0;
- break;
- case V_STR:
- p_error("&&: Numeric operands required.");
- str_free(v->v_str);
- v->v_type = V_ERR;
- case V_ERR:
- flag = 0;
- break;
- }
- if (token != T_ANDAND)
- return 0;
- (void) s_gettok();
- if (p_expr3_10(3, v, flag && true) < 0)
- return -1;
- }
- /*NOTREACHED*/
-}
diff --git a/usr.bin/window/parser4.c b/usr.bin/window/parser4.c
deleted file mode 100644
index 338bdfb..0000000
--- a/usr.bin/window/parser4.c
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)parser4.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <string.h>
-#include "parser.h"
-
-/*
- * | 3
- * ^ 4
- * & 5
- * == != 6
- * < <= > >= 7
- * << >> 8
- * + - 9
- * * / % 10
- */
-p_expr3_10(level, v, flag)
-register struct value *v;
-char flag;
-{
- struct value l, r;
- int op;
- char *opname;
-
- if ((level == 10 ? p_expr11(v, flag)
- : p_expr3_10(level + 1, v, flag)) < 0)
- return -1;
- for (;;) {
- switch (level) {
- case 3:
- if (token != T_OR)
- return 0;
- opname = "|";
- break;
- case 4:
- if (token != T_XOR)
- return 0;
- opname = "^";
- break;
- case 5:
- if (token != T_AND)
- return 0;
- opname = "&";
- break;
- case 6:
- if (token == T_EQ)
- opname = "==";
- else if (token == T_NE)
- opname = "!=";
- else
- return 0;
- break;
- case 7:
- switch (token) {
- case T_LT:
- opname = "<";
- break;
- case T_LE:
- opname = "<=";
- break;
- case T_GT:
- opname = ">";
- break;
- case T_GE:
- opname = ">=";
- break;
- default:
- return 0;
- }
- break;
- case 8:
- if (token == T_LS)
- opname = "<<";
- else if (token == T_RS)
- opname = ">>";
- else
- return 0;
- break;
- case 9:
- if (token == T_PLUS)
- opname = "+";
- else if (token == T_MINUS)
- opname = "-";
- else
- return 0;
- break;
- case 10:
- switch (token) {
- case T_MUL:
- opname = "*";
- break;
- case T_DIV:
- opname = "/";
- break;
- case T_MOD:
- opname = "%";
- break;
- default:
- return 0;
- }
- break;
- }
- l = *v;
- if (l.v_type == V_ERR)
- flag = 0;
-
- op = token;
- (void) s_gettok();
- if ((level == 10 ? p_expr11(&r, flag)
- : p_expr3_10(level + 1, &r, flag)) < 0) {
- p_synerror();
- val_free(l);
- return -1;
- }
-
- if (r.v_type == V_ERR)
- flag = 0;
- else switch (op) {
- case T_EQ:
- case T_NE:
- case T_LT:
- case T_LE:
- case T_GT:
- case T_GE:
- case T_PLUS:
- if (l.v_type == V_STR) {
- if (r.v_type == V_NUM)
- if (p_convstr(&r) < 0)
- flag = 0;
- } else
- if (r.v_type == V_STR)
- if (p_convstr(&l) < 0)
- flag = 0;
- break;
- case T_LS:
- case T_RS:
- if (r.v_type == V_STR) {
- char *p = r.v_str;
- r.v_type = V_NUM;
- r.v_num = strlen(p);
- str_free(p);
- }
- break;
- case T_OR:
- case T_XOR:
- case T_AND:
- case T_MINUS:
- case T_MUL:
- case T_DIV:
- case T_MOD:
- default:
- if (l.v_type == V_STR || r.v_type == V_STR) {
- p_error("%s: Numeric operands required.",
- opname);
- flag = 0;
- }
- }
- if (!flag) {
- val_free(l);
- val_free(r);
- v->v_type = V_ERR;
- if (p_abort())
- return -1;
- continue;
- }
-
- v->v_type = V_NUM;
- switch (op) {
- case T_EQ:
- case T_NE:
- case T_LT:
- case T_LE:
- case T_GT:
- case T_GE:
- if (l.v_type == V_STR) {
- int tmp = strcmp(l.v_str, r.v_str);
- str_free(l.v_str);
- str_free(r.v_str);
- l.v_type = V_NUM;
- l.v_num = tmp;
- r.v_type = V_NUM;
- r.v_num = 0;
- }
- break;
- }
- switch (op) {
- case T_OR:
- v->v_num = l.v_num | r.v_num;
- break;
- case T_XOR:
- v->v_num = l.v_num ^ r.v_num;
- break;
- case T_AND:
- v->v_num = l.v_num & r.v_num;
- break;
- case T_EQ:
- v->v_num = l.v_num == r.v_num;
- break;
- case T_NE:
- v->v_num = l.v_num != r.v_num;
- break;
- case T_LT:
- v->v_num = l.v_num < r.v_num;
- break;
- case T_LE:
- v->v_num = l.v_num <= r.v_num;
- break;
- case T_GT:
- v->v_num = l.v_num > r.v_num;
- break;
- case T_GE:
- v->v_num = l.v_num >= r.v_num;
- break;
- case T_LS:
- if (l.v_type == V_STR) {
- int i;
- if ((i = strlen(l.v_str)) > r.v_num)
- i = r.v_num;
- v->v_str = str_ncpy(l.v_str, i);
- v->v_type = V_STR;
- } else
- v->v_num = l.v_num << r.v_num;
- break;
- case T_RS:
- if (l.v_type == V_STR) {
- int i;
- if ((i = strlen(l.v_str)) > r.v_num)
- i -= r.v_num;
- else
- i = 0;
- v->v_str = str_cpy(l.v_str + i);
- v->v_type = V_STR;
- } else
- v->v_num = l.v_num >> r.v_num;
- break;
- case T_PLUS:
- if (l.v_type == V_STR) {
- v->v_str = str_cat(l.v_str, r.v_str);
- v->v_type = V_STR;
- } else
- v->v_num = l.v_num + r.v_num;
- break;
- case T_MINUS:
- v->v_num = l.v_num - r.v_num;
- break;
- case T_MUL:
- v->v_num = l.v_num * r.v_num;
- break;
- case T_DIV:
- v->v_num = l.v_num / r.v_num;
- break;
- case T_MOD:
- v->v_num = l.v_num % r.v_num;
- break;
- }
- val_free(l);
- val_free(r);
- }
- /*NOTREACHED*/
-}
diff --git a/usr.bin/window/parser5.c b/usr.bin/window/parser5.c
deleted file mode 100644
index ddc8136..0000000
--- a/usr.bin/window/parser5.c
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)parser5.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "parser.h"
-#include "var.h"
-
-/*
- * unary $ $? + - ! ~
- */
-p_expr11(v, flag)
-register struct value *v;
-char flag;
-{
- int op;
- char *opname;
-
- switch (token) {
- case T_DOLLAR:
- opname = "$";
- break;
- case T_DQ:
- opname = "$?";
- break;
- case T_PLUS:
- opname = "unary +";
- break;
- case T_MINUS:
- opname = "unary -";
- break;
- case T_NOT:
- opname = "!";
- break;
- case T_COMP:
- opname = "~";
- break;
- default:
- return p_expr12(v, flag);
- }
- op = token;
- (void) s_gettok();
- if (p_expr11(v, flag) < 0)
- return -1;
- switch (v->v_type) {
- case V_NUM:
- break;
- case V_STR:
- switch (op) {
- case T_MINUS:
- case T_NOT:
- case T_COMP:
- p_error("%s: Numeric operand required.", opname);
- str_free(v->v_str);
- v->v_type = V_ERR;
- return 0;
- }
- break;
- case V_ERR:
- return 0;
- }
- switch (op) {
- case T_DOLLAR:
- case T_DQ:
- if (v->v_type == V_NUM) {
- int tmp = cx.x_type == X_BUF && cx.x_arg != 0 &&
- v->v_num > 0 && v->v_num <= cx.x_narg;
- if (op == T_DQ)
- v->v_num = tmp;
- else if (tmp)
- *v = cx.x_arg[v->v_num - 1];
- else {
- p_error("%d: No such argument.", v->v_num);
- v->v_type = V_ERR;
- }
- } else {
- char *name = v->v_str;
- struct var *r = var_lookup(name);
- if (op == T_DQ) {
- v->v_type = V_NUM;
- v->v_num = r != 0;
- } else if (r != 0)
- *v = r->r_val;
- else {
- p_error("%s: Undefined variable.", name);
- v->v_type = V_ERR;
- }
- str_free(name);
- }
- if (v->v_type == V_STR && (v->v_str = str_cpy(v->v_str)) == 0) {
- p_memerror();
- return -1;
- }
- break;
- case T_MINUS:
- v->v_num = - v->v_num;
- break;
- case T_NOT:
- v->v_num = ! v->v_num;
- break;
- case T_COMP:
- v->v_num = ~ v->v_num;
- break;
- }
- return 0;
-}
-
-/*
- * string, number, ( expr )
- * Plus function calls.
- *
- * Always return v_type == V_ERR when flag == 0.
- */
-p_expr12(v, flag)
-register struct value *v;
-char flag;
-{
- v->v_type = V_ERR;
- switch (token) {
- case T_NUM:
- if (flag) {
- v->v_type = V_NUM;
- v->v_num = token_num;
- }
- (void) s_gettok();
- break;
- case T_STR:
- if (flag) {
- v->v_type = V_STR;
- v->v_str = token_str;
- } else
- str_free(token_str);
- (void) s_gettok();
- break;
- case T_LP:
- (void) s_gettok();
- if (p_expr(v, flag) < 0) {
- p_synerror();
- return -1;
- }
- if (token != T_RP) {
- p_synerror();
- val_free(*v);
- return -1;
- }
- (void) s_gettok();
- break;
- default:
- return -1;
- }
- while (token == T_LP) {
- char *cmd;
-
- if (p_convstr(v) < 0)
- return -1;
- cmd = v->v_type == V_STR ? v->v_str : 0;
- if (p_function(cmd, v, flag) < 0) {
- if (cmd)
- str_free(cmd);
- return -1;
- }
- if (cmd)
- str_free(cmd);
- }
- return 0;
-}
diff --git a/usr.bin/window/scanner.c b/usr.bin/window/scanner.c
deleted file mode 100644
index 785d0a3..0000000
--- a/usr.bin/window/scanner.c
+++ /dev/null
@@ -1,552 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)scanner.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <ctype.h>
-#include "value.h"
-#include "token.h"
-#include "context.h"
-#include "string.h"
-#include "mystring.h"
-
-s_getc()
-{
- register c;
-
- switch (cx.x_type) {
- case X_FILE:
- c = getc(cx.x_fp);
- if (cx.x_bol && c != EOF) {
- cx.x_bol = 0;
- cx.x_lineno++;
- }
- if (c == '\n')
- cx.x_bol = 1;
- return c;
- case X_BUF:
- if (*cx.x_bufp != 0)
- return *cx.x_bufp++ & 0xff;
- else
- return EOF;
- }
- /*NOTREACHED*/
-}
-
-s_ungetc(c)
-{
- if (c == EOF)
- return EOF;
- switch (cx.x_type) {
- case X_FILE:
- cx.x_bol = 0;
- return ungetc(c, cx.x_fp);
- case X_BUF:
- if (cx.x_bufp > cx.x_buf)
- return *--cx.x_bufp = c;
- else
- return EOF;
- }
- /*NOTREACHED*/
-}
-
-s_gettok()
-{
- char buf[100];
- register char *p = buf;
- register c;
- register state = 0;
-
-loop:
- c = s_getc();
- switch (state) {
- case 0:
- switch (c) {
- case ' ':
- case '\t':
- break;
- case '\n':
- case ';':
- cx.x_token = T_EOL;
- state = -1;
- break;
- case '#':
- state = 1;
- break;
- case EOF:
- cx.x_token = T_EOF;
- state = -1;
- break;
- case '"':
- state = 3;
- break;
- case '\'':
- state = 4;
- break;
- case '\\':
- switch (c = s_gettok1()) {
- case -1:
- break;
- case -2:
- state = 0;
- break;
- default:
- *p++ = c;
- state = 2;
- }
- break;
- case '0':
- cx.x_val.v_num = 0;
- state = 10;
- break;
- case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- cx.x_val.v_num = c - '0';
- state = 11;
- break;
- case '>':
- state = 20;
- break;
- case '<':
- state = 21;
- break;
- case '=':
- state = 22;
- break;
- case '!':
- state = 23;
- break;
- case '&':
- state = 24;
- break;
- case '|':
- state = 25;
- break;
- case '$':
- state = 26;
- break;
- case '~':
- cx.x_token = T_COMP;
- state = -1;
- break;
- case '+':
- cx.x_token = T_PLUS;
- state = -1;
- break;
- case '-':
- cx.x_token = T_MINUS;
- state = -1;
- break;
- case '*':
- cx.x_token = T_MUL;
- state = -1;
- break;
- case '/':
- cx.x_token = T_DIV;
- state = -1;
- break;
- case '%':
- cx.x_token = T_MOD;
- state = -1;
- break;
- case '^':
- cx.x_token = T_XOR;
- state = -1;
- break;
- case '(':
- cx.x_token = T_LP;
- state = -1;
- break;
- case ')':
- cx.x_token = T_RP;
- state = -1;
- break;
- case ',':
- cx.x_token = T_COMMA;
- state = -1;
- break;
- case '?':
- cx.x_token = T_QUEST;
- state = -1;
- break;
- case ':':
- cx.x_token = T_COLON;
- state = -1;
- break;
- case '[':
- cx.x_token = T_LB;
- state = -1;
- break;
- case ']':
- cx.x_token = T_RB;
- state = -1;
- break;
- default:
- if (isalpha(c) || c == '_' || c == '.') {
- *p++ = c;
- state = 2;
- break;
- }
- cx.x_val.v_num = c;
- cx.x_token = T_CHAR;
- state = -1;
- break;
- }
- break;
- case 1: /* got # */
- if (c == '\n' || c == EOF) {
- (void) s_ungetc(c);
- state = 0;
- }
- break;
- case 2: /* unquoted string */
- switch (c) {
- case '"':
- state = 3;
- break;
- case '\'':
- state = 4;
- break;
- case '\\':
- switch (c = s_gettok1()) {
- case -2:
- (void) s_ungetc(' ');
- case -1:
- break;
- default:
- if (p < buf + sizeof buf - 1)
- *p++ = c;
- }
- break;
- default:
- if (isalnum(c) || c == '_' || c == '.') {
- if (p < buf + sizeof buf - 1)
- *p++ = c;
- break;
- }
- (void) s_ungetc(c);
- case EOF:
- *p = 0;
- cx.x_token = T_STR;
- switch (*buf) {
- case 'i':
- if (buf[1] == 'f' && buf[2] == 0)
- cx.x_token = T_IF;
- break;
- case 't':
- if (buf[1] == 'h' && buf[2] == 'e'
- && buf[3] == 'n' && buf[4] == 0)
- cx.x_token = T_THEN;
- break;
- case 'e':
- if (buf[1] == 'n' && buf[2] == 'd'
- && buf[3] == 'i' && buf[4] == 'f'
- && buf[5] == 0)
- cx.x_token = T_ENDIF;
- else if (buf[1] == 'l' && buf[2] == 's')
- if (buf[3] == 'i' && buf[4] == 'f'
- && buf[5] == 0)
- cx.x_token = T_ELSIF;
- else if (buf[3] == 'e' && buf[4] == 0)
- cx.x_token = T_ELSE;
- break;
- }
- if (cx.x_token == T_STR
- && (cx.x_val.v_str = str_cpy(buf)) == 0) {
- p_memerror();
- cx.x_token = T_EOF;
- }
- state = -1;
- break;
- }
- break;
- case 3: /* " quoted string */
- switch (c) {
- case '\n':
- (void) s_ungetc(c);
- case EOF:
- case '"':
- state = 2;
- break;
- case '\\':
- switch (c = s_gettok1()) {
- case -1:
- case -2: /* newlines are invisible */
- break;
- default:
- if (p < buf + sizeof buf - 1)
- *p++ = c;
- }
- break;
- default:
- if (p < buf + sizeof buf - 1)
- *p++ = c;
- break;
- }
- break;
- case 4: /* ' quoted string */
- switch (c) {
- case '\n':
- (void) s_ungetc(c);
- case EOF:
- case '\'':
- state = 2;
- break;
- case '\\':
- switch (c = s_gettok1()) {
- case -1:
- case -2: /* newlines are invisible */
- break;
- default:
- if (p < buf + sizeof buf - 1)
- *p++ = c;
- }
- break;
- default:
- if (p < buf + sizeof buf - 1)
- *p++ = c;
- break;
- }
- break;
- case 10: /* got 0 */
- switch (c) {
- case 'x':
- case 'X':
- cx.x_val.v_num = 0;
- state = 12;
- break;
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7':
- cx.x_val.v_num = c - '0';
- state = 13;
- break;
- case '8': case '9':
- cx.x_val.v_num = c - '0';
- state = 11;
- break;
- default:
- (void) s_ungetc(c);
- state = -1;
- cx.x_token = T_NUM;
- }
- break;
- case 11: /* decimal number */
- switch (c) {
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- cx.x_val.v_num = cx.x_val.v_num * 10 + c - '0';
- break;
- default:
- (void) s_ungetc(c);
- state = -1;
- cx.x_token = T_NUM;
- }
- break;
- case 12: /* hex number */
- switch (c) {
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- cx.x_val.v_num = cx.x_val.v_num * 16 + c - '0';
- break;
- case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
- cx.x_val.v_num = cx.x_val.v_num * 16 + c - 'a' + 10;
- break;
- case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
- cx.x_val.v_num = cx.x_val.v_num * 16 + c - 'A' + 10;
- break;
- default:
- (void) s_ungetc(c);
- state = -1;
- cx.x_token = T_NUM;
- }
- break;
- case 13: /* octal number */
- switch (c) {
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7':
- cx.x_val.v_num = cx.x_val.v_num * 8 + c - '0';
- break;
- default:
- (void) s_ungetc(c);
- state = -1;
- cx.x_token = T_NUM;
- }
- break;
- case 20: /* got > */
- switch (c) {
- case '=':
- cx.x_token = T_GE;
- state = -1;
- break;
- case '>':
- cx.x_token = T_RS;
- state = -1;
- break;
- default:
- (void) s_ungetc(c);
- cx.x_token = T_GT;
- state = -1;
- }
- break;
- case 21: /* got < */
- switch (c) {
- case '=':
- cx.x_token = T_LE;
- state = -1;
- break;
- case '<':
- cx.x_token = T_LS;
- state = -1;
- break;
- default:
- (void) s_ungetc(c);
- cx.x_token = T_LT;
- state = -1;
- }
- break;
- case 22: /* got = */
- switch (c) {
- case '=':
- cx.x_token = T_EQ;
- state = -1;
- break;
- default:
- (void) s_ungetc(c);
- cx.x_token = T_ASSIGN;
- state = -1;
- }
- break;
- case 23: /* got ! */
- switch (c) {
- case '=':
- cx.x_token = T_NE;
- state = -1;
- break;
- default:
- (void) s_ungetc(c);
- cx.x_token = T_NOT;
- state = -1;
- }
- break;
- case 24: /* got & */
- switch (c) {
- case '&':
- cx.x_token = T_ANDAND;
- state = -1;
- break;
- default:
- (void) s_ungetc(c);
- cx.x_token = T_AND;
- state = -1;
- }
- break;
- case 25: /* got | */
- switch (c) {
- case '|':
- cx.x_token = T_OROR;
- state = -1;
- break;
- default:
- (void) s_ungetc(c);
- cx.x_token = T_OR;
- state = -1;
- }
- break;
- case 26: /* got $ */
- switch (c) {
- case '?':
- cx.x_token = T_DQ;
- state = -1;
- break;
- default:
- (void) s_ungetc(c);
- cx.x_token = T_DOLLAR;
- state = -1;
- }
- break;
- default:
- abort();
- }
- if (state >= 0)
- goto loop;
- return cx.x_token;
-}
-
-s_gettok1()
-{
- register c;
- register n;
-
- c = s_getc(); /* got \ */
- switch (c) {
- case EOF:
- return -1;
- case '\n':
- return -2;
- case 'b':
- return '\b';
- case 'f':
- return '\f';
- case 'n':
- return '\n';
- case 'r':
- return '\r';
- case 't':
- return '\t';
- default:
- return c;
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7':
- break;
- }
- n = c - '0';
- c = s_getc(); /* got \[0-7] */
- if (c < '0' || c > '7') {
- (void) s_ungetc(c);
- return n;
- }
- n = n * 8 + c - '0';
- c = s_getc(); /* got \[0-7][0-7] */
- if (c < '0' || c > '7') {
- (void) s_ungetc(c);
- return n;
- }
- return n * 8 + c - '0';
-}
diff --git a/usr.bin/window/startup.c b/usr.bin/window/startup.c
deleted file mode 100644
index 557c0be..0000000
--- a/usr.bin/window/startup.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)startup.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "defs.h"
-#include "value.h"
-#include "var.h"
-#include "char.h"
-#include "local.h"
-
-doconfig()
-{
- char buf[100];
- char *home;
- static char runcom[] = RUNCOM;
-
- if ((home = getenv("HOME")) == 0)
- home = ".";
- (void) sprintf(buf, "%.*s/%s",
- (sizeof buf - sizeof runcom) / sizeof (char) - 1,
- home, runcom);
- return dosource(buf);
-}
-
-/*
- * The default is two windows of equal size.
- */
-dodefault()
-{
- struct ww *w;
- register r = wwnrow / 2 - 1;
-
- if (openwin(1, r + 2, 0, wwnrow - r - 2, wwncol, default_nline,
- (char *) 0, 1, 1, default_shellfile, default_shell) == 0)
- return;
- if ((w = openwin(0, 1, 0, r, wwncol, default_nline,
- (char *) 0, 1, 1, default_shellfile, default_shell)) == 0)
- return;
- wwprintf(w, "Escape character is %s.\r\n", unctrl(escapec));
-}
-
-setvars()
-{
- /* try to use a random ordering to balance the tree */
- (void) var_setnum("nrow", wwnrow);
- (void) var_setnum("ncol", wwncol);
- (void) var_setnum("baud", wwbaud);
- (void) var_setnum("m_rev", WWM_REV);
- (void) var_setnum("m_blk", WWM_BLK);
- (void) var_setnum("m_ul", WWM_UL);
- (void) var_setnum("m_grp", WWM_GRP);
- (void) var_setnum("m_dim", WWM_DIM);
- (void) var_setnum("m_usr", WWM_USR);
- (void) var_setstr("term", wwterm);
- (void) var_setnum("modes", wwavailmodes);
-}
diff --git a/usr.bin/window/string.c b/usr.bin/window/string.c
deleted file mode 100644
index 57b5fa1..0000000
--- a/usr.bin/window/string.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)string.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <string.h> /* System string definitions. */
-#include "mystring.h" /* Local string definitions. */
-
-char *
-str_cpy(s)
-register char *s;
-{
- char *str;
- register char *p;
-
- str = p = str_alloc(strlen(s) + 1);
- if (p == 0)
- return 0;
- while (*p++ = *s++)
- ;
- return str;
-}
-
-char *
-str_ncpy(s, n)
-register char *s;
-register n;
-{
- int l = strlen(s);
- char *str;
- register char *p;
-
- if (n > l)
- n = l;
- str = p = str_alloc(n + 1);
- if (p == 0)
- return 0;
- while (--n >= 0)
- *p++ = *s++;
- *p = 0;
- return str;
-}
-
-char *
-str_itoa(i)
-int i;
-{
- char buf[30];
-
- (void) sprintf(buf, "%d", i);
- return str_cpy(buf);
-}
-
-char *
-str_cat(s1, s2)
-char *s1, *s2;
-{
- char *str;
- register char *p, *q;
-
- str = p = str_alloc(strlen(s1) + strlen(s2) + 1);
- if (p == 0)
- return 0;
- for (q = s1; *p++ = *q++;)
- ;
- for (q = s2, p--; *p++ = *q++;)
- ;
- return str;
-}
-
-/*
- * match s against p.
- * s can be a prefix of p with at least min characters.
- */
-str_match(s, p, min)
-register char *s, *p;
-register min;
-{
- for (; *s && *p && *s == *p; s++, p++, min--)
- ;
- return *s == *p || *s == 0 && min <= 0;
-}
-
-#ifdef STR_DEBUG
-char *
-str_alloc(l)
-int l;
-{
- register struct mystring *s;
-
- s = (struct mystring *) malloc((unsigned)l + str_offset);
- if (s == 0)
- return 0;
- if (str_head.s_forw == 0)
- str_head.s_forw = str_head.s_back = &str_head;
- s->s_forw = str_head.s_forw;
- s->s_back = &str_head;
- str_head.s_forw = s;
- s->s_forw->s_back = s;
- return s->s_data;
-}
-
-str_free(str)
-char *str;
-{
- register struct mystring *s;
-
- for (s = str_head.s_forw; s != &str_head && s->s_data != str;
- s = s->s_forw)
- ;
- if (s == &str_head)
- abort();
- s->s_back->s_forw = s->s_forw;
- s->s_forw->s_back = s->s_back;
- free((char *)s);
-}
-#endif
diff --git a/usr.bin/window/token.h b/usr.bin/window/token.h
deleted file mode 100644
index 5e3f72c..0000000
--- a/usr.bin/window/token.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)token.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#define token (cx.x_token)
-#define token_num (cx.x_val.v_num)
-#define token_str (cx.x_val.v_str)
-
-#define T_EOL 1
-#define T_EOF 2
-#define T_COMP 3
-#define T_PLUS 4
-#define T_MINUS 5
-#define T_MUL 6
-#define T_DIV 7
-#define T_LP 8
-#define T_RP 9
-#define T_LB 10
-#define T_RB 11
-#define T_DOLLAR 12
-#define T_COMMA 13
-#define T_QUEST 14
-#define T_COLON 15
-#define T_CHAR 16
-#define T_STR 17
-#define T_NUM 18
-#define T_MOD 19
-#define T_XOR 20
-#define T_DQ 21 /* $? */
-#define T_GE 22
-#define T_RS 23
-#define T_GT 24
-#define T_LE 25
-#define T_LS 26
-#define T_LT 27
-#define T_EQ 28
-#define T_ASSIGN 29
-#define T_NE 30
-#define T_NOT 31
-#define T_ANDAND 32
-#define T_AND 33
-#define T_OROR 34
-#define T_OR 35
-
-#define T_IF 40
-#define T_THEN 41
-#define T_ELSIF 42
-#define T_ELSE 43
-#define T_ENDIF 44
diff --git a/usr.bin/window/tt.h b/usr.bin/window/tt.h
deleted file mode 100644
index 53fe7b3..0000000
--- a/usr.bin/window/tt.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)tt.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-/*
- * Interface structure for the terminal drivers.
- */
-struct tt {
- /* startup and cleanup */
- int (*tt_start)();
- int (*tt_reset)();
- int (*tt_end)();
-
- /* terminal functions */
- int (*tt_move)();
- int (*tt_insline)();
- int (*tt_delline)();
- int (*tt_inschar)();
- int (*tt_insspace)();
- int (*tt_delchar)();
- int (*tt_write)(); /* write a whole block */
- int (*tt_putc)(); /* write one character */
- int (*tt_clreol)();
- int (*tt_clreos)();
- int (*tt_clear)();
- int (*tt_scroll_down)();
- int (*tt_scroll_up)();
- int (*tt_setscroll)(); /* set scrolling region */
- int (*tt_setmodes)(); /* set display modes */
- int (*tt_set_token)(); /* define a token */
- int (*tt_put_token)(); /* refer to a defined token */
- int (*tt_compress)(); /* begin, end compression */
- int (*tt_checksum)(); /* compute checksum */
- int (*tt_checkpoint)(); /* checkpoint protocol */
- int (*tt_rint)(); /* input processing */
-
- /* internal variables */
- char tt_modes; /* the current display modes */
- char tt_nmodes; /* the new modes for next write */
- char tt_insert; /* currently in insert mode */
- int tt_row; /* cursor row */
- int tt_col; /* cursor column */
- int tt_scroll_top; /* top of scrolling region */
- int tt_scroll_bot; /* bottom of scrolling region */
-
- /* terminal info */
- int tt_nrow; /* number of display rows */
- int tt_ncol; /* number of display columns */
- char tt_availmodes; /* the display modes supported */
- char tt_wrap; /* has auto wrap around */
- char tt_retain; /* can retain below (db flag) */
- short tt_padc; /* the pad character */
- int tt_ntoken; /* number of compression tokens */
- int tt_token_min; /* minimun token size */
- int tt_token_max; /* maximum token size */
- int tt_set_token_cost; /* cost in addition to string */
- int tt_put_token_cost; /* constant cost */
- int tt_ack; /* checkpoint ack-nack flag */
-
- /* the frame characters */
- short *tt_frame;
-
- /* ttflush() hook */
- int (*tt_flush)();
-};
-struct tt tt;
-
-/*
- * tt_padc is used by the compression routine.
- * It is a short to allow the driver to indicate that there is no padding.
- */
-#define TT_PADC_NONE 0x100
-
-/*
- * List of terminal drivers.
- */
-struct tt_tab {
- char *tt_name;
- int tt_len;
- int (*tt_func)();
-};
-extern struct tt_tab tt_tab[];
-
-/*
- * Clean interface to termcap routines.
- * Too may t's.
- */
-char tt_strings[1024]; /* string buffer */
-char *tt_strp; /* pointer for it */
-
-struct tt_str {
- char *ts_str;
- int ts_n;
-};
-
-struct tt_str *tttgetstr();
-struct tt_str *ttxgetstr(); /* tgetstr() and expand delays */
-
-int tttputc();
-#define tttputs(s, n) tputs((s)->ts_str, (n), tttputc)
-#define ttxputs(s) ttwrite((s)->ts_str, (s)->ts_n)
-
-/*
- * Buffered output without stdio.
- * These variables have different meanings from the ww_ob* variables.
- * But I'm too lazy to think up different names.
- */
-char *tt_ob;
-char *tt_obp;
-char *tt_obe;
-#define ttputc(c) (tt_obp < tt_obe ? (*tt_obp++ = (c)) \
- : (ttflush(), *tt_obp++ = (c)))
-
-/*
- * Convenience macros for the drivers
- * They require char.h
- */
-#define ttctrl(c) ttputc(ctrl(c))
-#define ttesc(c) (ttctrl('['), ttputc(c))
diff --git a/usr.bin/window/ttf100.c b/usr.bin/window/ttf100.c
deleted file mode 100644
index 53f177b..0000000
--- a/usr.bin/window/ttf100.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)ttf100.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-
-/*
- * Freedom 100
- */
-
-#define G (WWM_GRP << WWC_MSHIFT)
-short f100_frame[16] = {
- ' ', 'J'|G, 'K'|G, 'A'|G,
- 'J'|G, 'J'|G, 'B'|G, 'M'|G,
- 'K'|G, 'D'|G, 'K'|G, 'O'|G,
- 'C'|G, 'L'|G, 'N'|G, 'I'|G
-};
-extern struct tt_str *gen_AE, *gen_AS;
-
-tt_f100()
-{
- static struct tt_str ae = { "\033%", 2 };
- static struct tt_str as = { "\033$", 2 };
-
- if (tt_generic() < 0)
- return -1;
- tt.tt_frame = f100_frame;
- tt.tt_availmodes |= WWM_GRP;
- gen_AS = &as;
- gen_AE = &ae;
- return 0;
-}
diff --git a/usr.bin/window/ttgeneric.c b/usr.bin/window/ttgeneric.c
deleted file mode 100644
index ba84e84..0000000
--- a/usr.bin/window/ttgeneric.c
+++ /dev/null
@@ -1,549 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)ttgeneric.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-
-char PC, *BC, *UP;
-
- /* normal frame */
-short gen_frame[16] = {
- ' ', '|', '-', '+',
- '|', '|', '+', '+',
- '-', '+', '-', '+',
- '+', '+', '+', '+'
-};
-
- /* ANSI graphics frame */
-#define G (WWM_GRP << WWC_MSHIFT)
-short ansi_frame[16] = {
- ' ', 'x'|G, 'Q'|G, 'm'|G,
- 'x'|G, 'x'|G, 'l'|G, 't'|G,
- 'q'|G, 'j'|G, 'q'|G, 'v'|G,
- 'k'|G, 'u'|G, 'w'|G, 'n'|G
-};
-struct tt_str ansi_AS = {
- "\033(0", 3
-};
-
-struct tt_str *gen_PC;
-struct tt_str *gen_CM;
-struct tt_str *gen_IM;
-struct tt_str *gen_IC;
-struct tt_str *gen_ICn;
-struct tt_str *gen_IP;
-struct tt_str *gen_EI;
-struct tt_str *gen_DC;
-struct tt_str *gen_DCn;
-struct tt_str *gen_AL;
-struct tt_str *gen_ALn;
-struct tt_str *gen_DL;
-struct tt_str *gen_DLn;
-struct tt_str *gen_CE;
-struct tt_str *gen_CD;
-struct tt_str *gen_CL;
-struct tt_str *gen_VS;
-struct tt_str *gen_VE;
-struct tt_str *gen_TI;
-struct tt_str *gen_TE;
-struct tt_str *gen_SO;
-struct tt_str *gen_SE;
-struct tt_str *gen_US;
-struct tt_str *gen_UE;
-struct tt_str *gen_LE;
-struct tt_str *gen_ND;
-struct tt_str *gen_UP;
-struct tt_str *gen_DO;
-struct tt_str *gen_BC;
-struct tt_str *gen_NL;
-struct tt_str *gen_CR;
-struct tt_str *gen_HO;
-struct tt_str *gen_AS;
-struct tt_str *gen_AE;
-struct tt_str *gen_XS;
-struct tt_str *gen_XE;
-struct tt_str *gen_SF;
-struct tt_str *gen_SFn;
-struct tt_str *gen_SR;
-struct tt_str *gen_SRn;
-struct tt_str *gen_CS;
-char gen_MI;
-char gen_MS;
-char gen_AM;
-char gen_OS;
-char gen_BS;
-char gen_DA;
-char gen_DB;
-char gen_NS;
-char gen_XN;
-int gen_CO;
-int gen_LI;
-int gen_UG;
-int gen_SG;
-
-gen_setinsert(new)
-char new;
-{
- if (new) {
- if (gen_IM)
- ttxputs(gen_IM);
- } else
- if (gen_EI)
- ttxputs(gen_EI);
- tt.tt_insert = new;
-}
-
-gen_setmodes(new)
-register new;
-{
- register diff;
-
- diff = new ^ tt.tt_modes;
- if (diff & WWM_REV) {
- if (new & WWM_REV) {
- if (gen_SO)
- ttxputs(gen_SO);
- } else
- if (gen_SE)
- ttxputs(gen_SE);
- }
- if (diff & WWM_UL) {
- if (new & WWM_UL) {
- if (gen_US)
- ttxputs(gen_US);
- } else
- if (gen_UE)
- ttxputs(gen_UE);
- }
- if (diff & WWM_GRP) {
- if (new & WWM_GRP) {
- if (gen_AS)
- ttxputs(gen_AS);
- } else
- if (gen_AE)
- ttxputs(gen_AE);
- }
- if (diff & WWM_USR) {
- if (new & WWM_USR) {
- if (gen_XS)
- ttxputs(gen_XS);
- } else
- if (gen_XE)
- ttxputs(gen_XE);
- }
- tt.tt_modes = new;
-}
-
-gen_insline(n)
-{
- if (tt.tt_modes) /* for concept 100 */
- gen_setmodes(0);
- if (gen_ALn)
- ttpgoto(gen_ALn, 0, n, gen_LI - tt.tt_row);
- else
- while (--n >= 0)
- tttputs(gen_AL, gen_LI - tt.tt_row);
-}
-
-gen_delline(n)
-{
- if (tt.tt_modes) /* for concept 100 */
- gen_setmodes(0);
- if (gen_DLn)
- ttpgoto(gen_DLn, 0, n, gen_LI - tt.tt_row);
- else
- while (--n >= 0)
- tttputs(gen_DL, gen_LI - tt.tt_row);
-}
-
-gen_putc(c)
-register char c;
-{
- if (tt.tt_insert)
- gen_setinsert(0);
- if (tt.tt_nmodes != tt.tt_modes)
- gen_setmodes(tt.tt_nmodes);
- ttputc(c);
- if (++tt.tt_col == gen_CO)
- if (gen_XN)
- tt.tt_col = tt.tt_row = -10;
- else if (gen_AM)
- tt.tt_col = 0, tt.tt_row++;
- else
- tt.tt_col--;
-}
-
-gen_write(p, n)
- register char *p;
- register n;
-{
- if (tt.tt_insert)
- gen_setinsert(0);
- if (tt.tt_nmodes != tt.tt_modes)
- gen_setmodes(tt.tt_nmodes);
- ttwrite(p, n);
- tt.tt_col += n;
- if (tt.tt_col == gen_CO)
- if (gen_XN)
- tt.tt_col = tt.tt_row = -10;
- else if (gen_AM)
- tt.tt_col = 0, tt.tt_row++;
- else
- tt.tt_col--;
-}
-
-gen_move(row, col)
-register int row, col;
-{
- if (tt.tt_row == row && tt.tt_col == col)
- return;
- if (!gen_MI && tt.tt_insert)
- gen_setinsert(0);
- if (!gen_MS && tt.tt_modes)
- gen_setmodes(0);
- if (row < tt.tt_scroll_top || row > tt.tt_scroll_bot)
- gen_setscroll(0, tt.tt_nrow - 1);
- if (tt.tt_row == row) {
- if (col == 0) {
- ttxputs(gen_CR);
- goto out;
- }
- if (tt.tt_col == col - 1) {
- if (gen_ND) {
- ttxputs(gen_ND);
- goto out;
- }
- } else if (tt.tt_col == col + 1) {
- if (gen_LE) {
- ttxputs(gen_LE);
- goto out;
- }
- }
- }
- if (tt.tt_col == col) {
- if (tt.tt_row == row + 1) {
- if (gen_UP) {
- ttxputs(gen_UP);
- goto out;
- }
- } else if (tt.tt_row == row - 1) {
- ttxputs(gen_DO);
- goto out;
- }
- }
- if (gen_HO && col == 0 && row == 0) {
- ttxputs(gen_HO);
- goto out;
- }
- tttgoto(gen_CM, col, row);
-out:
- tt.tt_col = col;
- tt.tt_row = row;
-}
-
-gen_start()
-{
- if (gen_VS)
- ttxputs(gen_VS);
- if (gen_TI)
- ttxputs(gen_TI);
- ttxputs(gen_CL);
- tt.tt_col = tt.tt_row = 0;
- tt.tt_insert = 0;
- tt.tt_nmodes = tt.tt_modes = 0;
-}
-
-gen_end()
-{
- if (tt.tt_insert)
- gen_setinsert(0);
- if (gen_TE)
- ttxputs(gen_TE);
- if (gen_VE)
- ttxputs(gen_VE);
-}
-
-gen_clreol()
-{
- if (tt.tt_modes) /* for concept 100 */
- gen_setmodes(0);
- tttputs(gen_CE, gen_CO - tt.tt_col);
-}
-
-gen_clreos()
-{
- if (tt.tt_modes) /* for concept 100 */
- gen_setmodes(0);
- tttputs(gen_CD, gen_LI - tt.tt_row);
-}
-
-gen_clear()
-{
- if (tt.tt_modes) /* for concept 100 */
- gen_setmodes(0);
- ttxputs(gen_CL);
-}
-
-gen_inschar(c)
-register char c;
-{
- if (!tt.tt_insert)
- gen_setinsert(1);
- if (tt.tt_nmodes != tt.tt_modes)
- gen_setmodes(tt.tt_nmodes);
- if (gen_IC)
- tttputs(gen_IC, gen_CO - tt.tt_col);
- ttputc(c);
- if (gen_IP)
- tttputs(gen_IP, gen_CO - tt.tt_col);
- if (++tt.tt_col == gen_CO)
- if (gen_XN)
- tt.tt_col = tt.tt_row = -10;
- else if (gen_AM)
- tt.tt_col = 0, tt.tt_row++;
- else
- tt.tt_col--;
-}
-
-gen_insspace(n)
-{
- if (gen_ICn)
- ttpgoto(gen_ICn, 0, n, gen_CO - tt.tt_col);
- else
- while (--n >= 0)
- tttputs(gen_IC, gen_CO - tt.tt_col);
-}
-
-gen_delchar(n)
-{
- if (gen_DCn)
- ttpgoto(gen_DCn, 0, n, gen_CO - tt.tt_col);
- else
- while (--n >= 0)
- tttputs(gen_DC, gen_CO - tt.tt_col);
-}
-
-gen_scroll_down(n)
-{
- gen_move(tt.tt_scroll_bot, 0);
- if (gen_SFn)
- ttpgoto(gen_SFn, 0, n, n);
- else
- while (--n >= 0)
- ttxputs(gen_SF);
-}
-
-gen_scroll_up(n)
-{
- gen_move(tt.tt_scroll_top, 0);
- if (gen_SRn)
- ttpgoto(gen_SRn, 0, n, n);
- else
- while (--n >= 0)
- ttxputs(gen_SR);
-}
-
-gen_setscroll(top, bot)
-{
- tttgoto(gen_CS, bot, top);
- tt.tt_scroll_top = top;
- tt.tt_scroll_bot = bot;
- tt.tt_row = tt.tt_col = -10;
-}
-
-tt_generic()
-{
- gen_PC = tttgetstr("pc");
- PC = gen_PC ? *gen_PC->ts_str : 0;
-
- gen_CM = ttxgetstr("cm"); /* may not work */
- gen_IM = ttxgetstr("im");
- gen_IC = tttgetstr("ic");
- gen_ICn = tttgetstr("IC");
- gen_IP = tttgetstr("ip");
- gen_EI = ttxgetstr("ei");
- gen_DC = tttgetstr("dc");
- gen_DCn = tttgetstr("DC");
- gen_AL = tttgetstr("al");
- gen_ALn = tttgetstr("AL");
- gen_DL = tttgetstr("dl");
- gen_DLn = tttgetstr("DL");
- gen_CE = tttgetstr("ce");
- gen_CD = tttgetstr("cd");
- gen_CL = ttxgetstr("cl");
- gen_VS = ttxgetstr("vs");
- gen_VE = ttxgetstr("ve");
- gen_TI = ttxgetstr("ti");
- gen_TE = ttxgetstr("te");
- gen_SO = ttxgetstr("so");
- gen_SE = ttxgetstr("se");
- gen_US = ttxgetstr("us");
- gen_UE = ttxgetstr("ue");
- gen_LE = ttxgetstr("le");
- gen_ND = ttxgetstr("nd");
- gen_UP = ttxgetstr("up");
- gen_DO = ttxgetstr("do");
- gen_BC = ttxgetstr("bc");
- gen_NL = ttxgetstr("nl");
- gen_CR = ttxgetstr("cr");
- gen_HO = ttxgetstr("ho");
- gen_AS = ttxgetstr("as");
- gen_AE = ttxgetstr("ae");
- gen_XS = ttxgetstr("XS");
- gen_XE = ttxgetstr("XE");
- gen_SF = ttxgetstr("sf");
- gen_SFn = ttxgetstr("SF");
- gen_SR = ttxgetstr("sr");
- gen_SRn = ttxgetstr("SR");
- gen_CS = ttxgetstr("cs");
- gen_MI = tgetflag("mi");
- gen_MS = tgetflag("ms");
- gen_AM = tgetflag("am");
- gen_OS = tgetflag("os");
- gen_BS = tgetflag("bs");
- gen_DA = tgetflag("da");
- gen_DB = tgetflag("db");
- gen_NS = tgetflag("ns");
- gen_XN = tgetflag("xn");
- gen_CO = tgetnum("co");
- gen_LI = tgetnum("li");
- gen_UG = tgetnum("ug");
- gen_SG = tgetnum("sg");
- if (gen_CL == 0 || gen_OS || gen_CM == 0)
- return -1;
-
- /*
- * Deal with obsolete termcap fields.
- */
- if (gen_LE == 0)
- if (gen_BC)
- gen_LE = gen_BC;
- else if (gen_BS) {
- static struct tt_str bc = { "\b", 1 };
- gen_BC = &bc;
- }
- if (gen_NL == 0) {
- static struct tt_str nl = { "\n", 1 };
- gen_NL = &nl;
- }
- if (gen_DO == 0)
- gen_DO = gen_NL;
- if (gen_CR == 0) {
- static struct tt_str cr = { "\r", 1 };
- gen_CR = &cr;
- }
- /*
- * Most terminal will scroll with "nl", but very few specify "sf".
- * We shouldn't use "do" here.
- */
- if (gen_SF == 0 && !gen_NS)
- gen_SF = gen_NL;
- BC = gen_LE ? gen_LE->ts_str : 0;
- UP = gen_UP ? gen_UP->ts_str : 0;
- /*
- * Fix up display attributes that we can't handle, or don't
- * really exist.
- */
- if (gen_SG > 0)
- gen_SO = 0;
- if (gen_UG > 0 || gen_US && gen_SO && ttstrcmp(gen_US, gen_SO) == 0)
- gen_US = 0;
-
- if (gen_IM && gen_IM->ts_n == 0) {
- free((char *) gen_IM);
- gen_IM = 0;
- }
- if (gen_EI && gen_EI->ts_n == 0) {
- free((char *) gen_EI);
- gen_EI = 0;
- }
- if (gen_IC && gen_IC->ts_n == 0) {
- free((char *) gen_IC);
- gen_IC = 0;
- }
- if (gen_IM)
- tt.tt_inschar = gen_inschar;
- else if (gen_IC)
- tt.tt_insspace = gen_insspace;
- if (gen_DC)
- tt.tt_delchar = gen_delchar;
- if (gen_AL)
- tt.tt_insline = gen_insline;
- if (gen_DL)
- tt.tt_delline = gen_delline;
- if (gen_CE)
- tt.tt_clreol = gen_clreol;
- if (gen_CD)
- tt.tt_clreos = gen_clreos;
- if (gen_SF)
- tt.tt_scroll_down = gen_scroll_down;
- /*
- * Don't allow scroll_up if da or db but not cs.
- * See comment in wwscroll.c.
- */
- if (gen_SR && (gen_CS || !gen_DA && !gen_DB))
- tt.tt_scroll_up = gen_scroll_up;
- if (gen_CS)
- tt.tt_setscroll = gen_setscroll;
- if (gen_SO)
- tt.tt_availmodes |= WWM_REV;
- if (gen_US)
- tt.tt_availmodes |= WWM_UL;
- if (gen_AS)
- tt.tt_availmodes |= WWM_GRP;
- if (gen_XS)
- tt.tt_availmodes |= WWM_USR;
- tt.tt_wrap = gen_AM;
- tt.tt_retain = gen_DB;
- tt.tt_ncol = gen_CO;
- tt.tt_nrow = gen_LI;
- tt.tt_start = gen_start;
- tt.tt_end = gen_end;
- tt.tt_write = gen_write;
- tt.tt_putc = gen_putc;
- tt.tt_move = gen_move;
- tt.tt_clear = gen_clear;
- tt.tt_setmodes = gen_setmodes;
- tt.tt_frame = gen_AS && ttstrcmp(gen_AS, &ansi_AS) == 0 ?
- ansi_frame : gen_frame;
- return 0;
-}
diff --git a/usr.bin/window/tth19.c b/usr.bin/window/tth19.c
deleted file mode 100644
index e1dab1e..0000000
--- a/usr.bin/window/tth19.c
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)tth19.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-#include "char.h"
-
-/*
-kb|h19|heath|h19-b|h19b|heathkit|heath-19|z19|zenith:
- cr=^M:nl=^J:bl=^G:al=1*\EL:am:le=^H:bs:cd=\EJ:ce=\EK:
- cl=\EE:cm=\EY%+ %+ :co#80:dc=\EN:dl=1*\EM:do=\EB:
- ei=\EO:ho=\EH:im=\E@:li#24:mi:nd=\EC:as=\EF:ae=\EG:ms:
- ta=^I:pt:sr=\EI:se=\Eq:so=\Ep:up=\EA:vs=\Ex4:ve=\Ey4:
- kb=^h:ku=\EA:kd=\EB:kl=\ED:kr=\EC:kh=\EH:
- kn#8:k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:
- l6=blue:l7=red:l8=white:k6=\EP:k7=\EQ:k8=\ER:
- es:hs:ts=\Ej\Ex5\Ex1\EY8%+ \Eo:fs=\Ek\Ey5:ds=\Ey1:
-*/
-
-#define NCOL 80
-#define NROW 24
-
-#define G (WWM_GRP << WWC_MSHIFT)
-short h19_frame[16] = {
- ' ', '`'|G, 'a'|G, 'e'|G,
- '`'|G, '`'|G, 'f'|G, 'v'|G,
- 'a'|G, 'd'|G, 'a'|G, 'u'|G,
- 'c'|G, 't'|G, 's'|G, 'b'|G
-};
-
-extern struct tt_str *gen_VS;
-extern struct tt_str *gen_VE;
-
-int h19_msp10c;
-
-#define PAD(ms10) { \
- register i; \
- for (i = ((ms10) + 5) / h19_msp10c; --i >= 0;) \
- ttputc('\0'); \
-}
-#define ICPAD() PAD((NCOL - tt.tt_col) * 1) /* 0.1 ms per char */
-#define ILPAD() PAD((NROW - tt.tt_row) * 10) /* 1 ms per char */
-
-#define H19_SETINSERT(m) ttesc((tt.tt_insert = (m)) ? '@' : 'O')
-
-h19_setmodes(new)
-register new;
-{
- register diff;
-
- diff = new ^ tt.tt_modes;
- if (diff & WWM_REV)
- ttesc(new & WWM_REV ? 'p' : 'q');
- if (diff & WWM_GRP)
- ttesc(new & WWM_REV ? 'F' : 'G');
- tt.tt_modes = new;
-}
-
-h19_insline(n)
-{
- while (--n >= 0) {
- ttesc('L');
- ILPAD();
- }
-}
-
-h19_delline(n)
-{
- while (--n >= 0) {
- ttesc('M');
- ILPAD();
- }
-}
-
-h19_putc(c)
-register char c;
-{
- if (tt.tt_nmodes != tt.tt_modes)
- (*tt.tt_setmodes)(tt.tt_nmodes);
- if (tt.tt_insert)
- H19_SETINSERT(0);
- ttputc(c);
- if (++tt.tt_col == NCOL)
- tt.tt_col = NCOL - 1;
-}
-
-h19_write(p, n)
-register char *p;
-register n;
-{
- if (tt.tt_nmodes != tt.tt_modes)
- (*tt.tt_setmodes)(tt.tt_nmodes);
- if (tt.tt_insert)
- H19_SETINSERT(0);
- ttwrite(p, n);
- tt.tt_col += n;
- if (tt.tt_col == NCOL)
- tt.tt_col = NCOL - 1;
-}
-
-h19_move(row, col)
-register char row, col;
-{
- if (tt.tt_row == row) {
- if (tt.tt_col == col)
- return;
- if (col == 0) {
- ttctrl('m');
- goto out;
- }
- if (tt.tt_col == col - 1) {
- ttesc('C');
- goto out;
- }
- if (tt.tt_col == col + 1) {
- ttctrl('h');
- goto out;
- }
- }
- if (tt.tt_col == col) {
- if (tt.tt_row == row + 1) {
- ttesc('A');
- goto out;
- }
- if (tt.tt_row == row - 1) {
- ttctrl('j');
- goto out;
- }
- }
- if (col == 0 && row == 0) {
- ttesc('H');
- goto out;
- }
- ttesc('Y');
- ttputc(' ' + row);
- ttputc(' ' + col);
-out:
- tt.tt_col = col;
- tt.tt_row = row;
-}
-
-h19_start()
-{
- if (gen_VS)
- ttxputs(gen_VS);
- ttesc('w');
- ttesc('E');
- tt.tt_col = tt.tt_row = 0;
- tt.tt_insert = 0;
- tt.tt_nmodes = tt.tt_modes = 0;
-}
-
-h19_end()
-{
- if (tt.tt_insert)
- H19_SETINSERT(0);
- if (gen_VE)
- ttxputs(gen_VE);
- ttesc('v');
-}
-
-h19_clreol()
-{
- ttesc('K');
-}
-
-h19_clreos()
-{
- ttesc('J');
-}
-
-h19_clear()
-{
- ttesc('E');
-}
-
-h19_inschar(c)
-register char c;
-{
- if (tt.tt_nmodes != tt.tt_modes)
- (*tt.tt_setmodes)(tt.tt_nmodes);
- if (!tt.tt_insert)
- H19_SETINSERT(1);
- ttputc(c);
- if (tt.tt_insert)
- ICPAD();
- if (++tt.tt_col == NCOL)
- tt.tt_col = NCOL - 1;
-}
-
-h19_delchar(n)
-{
- while (--n >= 0)
- ttesc('N');
-}
-
-h19_scroll_down(n)
-{
- h19_move(NROW - 1, 0);
- while (--n >= 0)
- ttctrl('j');
-}
-
-h19_scroll_up(n)
-{
- h19_move(0, 0);
- while (--n >= 0)
- ttesc('I');
-}
-
-tt_h19()
-{
- float cpms = (float) wwbaud / 10000; /* char per ms */
-
- h19_msp10c = 10 / cpms; /* ms per 10 char */
- gen_VS = ttxgetstr("vs");
- gen_VE = ttxgetstr("ve");
-
- tt.tt_start = h19_start;
- tt.tt_end = h19_end;
-
- tt.tt_insline = h19_insline;
- tt.tt_delline = h19_delline;
- tt.tt_inschar = h19_inschar;
- tt.tt_delchar = h19_delchar;
- tt.tt_clreol = h19_clreol;
- tt.tt_clreos = h19_clreos;
- tt.tt_clear = h19_clear;
- tt.tt_move = h19_move;
- tt.tt_write = h19_write;
- tt.tt_putc = h19_putc;
- tt.tt_scroll_down = h19_scroll_down;
- tt.tt_scroll_up = h19_scroll_up;
- tt.tt_setmodes = h19_setmodes;
-
- tt.tt_ncol = NCOL;
- tt.tt_nrow = NROW;
- tt.tt_availmodes = WWM_REV|WWM_GRP;
- tt.tt_frame = h19_frame;
- return 0;
-}
diff --git a/usr.bin/window/tth29.c b/usr.bin/window/tth29.c
deleted file mode 100644
index 54229b5..0000000
--- a/usr.bin/window/tth29.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)tth29.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-#include "char.h"
-
-/*
- * H29 Driver
- *
- * WWM_USR mode is alternate character set.
- *
-kC|h29|heath-29|z29|zenith-29:\
- :am:bc=\ED:bt=\E-:cr=^M:do=^J:nl=^J:bl=^G:\
- :al=\EL:le=^H:bs:cd=\EJ:ce=\EK:cl=\EE:cm=\EY%+ %+ :co#80:dc=\EN:\
- :dl=1*\EM:do=\EB:ei=\EO:ho=\EH:im=\E@:li#24:mi:nd=\EC:as=\EF:ae=\EG:\
- :ms:ta=^I:pt:sr=\EI:se=\Eq:so=\Ep:up=\EA:vs=\Ex4:ve=\Ey4:\
- :kb=^H:ku=\EA:kd=\EB:kl=\ED:kr=\EC:kh=\EH:kn#1:k0=\E~:l0=HOME:\
- :k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:k6=\EP:k7=\EQ:k8=\ER:k9=\E01:\
- :es:hs:ts=\Ej\Ex5\Ex1\EY8%+ \Eo:fs=\Ek\Ey5:ds=\Ey1:us=\Es8:ue=\Es0:
- *
- */
-
-h29_setmodes(new)
-register new;
-{
- register modes = '0';
-
- if (new & WWM_REV)
- modes += 0x01;
- if (new & WWM_BLK)
- modes += 0x02;
- if (new & WWM_DIM)
- modes += 0x04;
- if (new & WWM_UL)
- modes += 0x08;
- if (new & WWM_USR)
- modes += 0x10;
- ttesc('s');
- ttputc(modes);
- if (new & WWM_GRP) {
- if ((tt.tt_modes & WWM_GRP) == 0)
- ttesc('F');
- } else
- if (tt.tt_modes & WWM_GRP)
- ttesc('G');
- tt.tt_modes = new;
-}
-
-tt_h29()
-{
- if (tt_h19() < 0)
- return -1;
- tt.tt_setmodes = h29_setmodes;
- tt.tt_availmodes |= WWM_BLK|WWM_UL|WWM_DIM|WWM_USR;
- return 0;
-}
diff --git a/usr.bin/window/ttinit.c b/usr.bin/window/ttinit.c
deleted file mode 100644
index 17b5961..0000000
--- a/usr.bin/window/ttinit.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)ttinit.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-#include <stdlib.h>
-
-int tt_h19();
-int tt_h29();
-int tt_f100();
-int tt_tvi925();
-int tt_wyse75();
-int tt_wyse60();
-int tt_zapple();
-int tt_zentec();
-int tt_generic();
-struct tt_tab tt_tab[] = {
- { "h19", 3, tt_h19 },
- { "h29", 3, tt_h29 },
- { "f100", 4, tt_f100 },
- { "tvi925", 6, tt_tvi925 },
- { "wyse75", 6, tt_wyse75 },
- { "wyse60", 6, tt_wyse60 },
- { "w60", 3, tt_wyse60 },
- { "zapple", 6, tt_zapple },
- { "zentec", 6, tt_zentec },
- { "generic", 0, tt_generic },
- 0
-};
-
-ttinit()
-{
- int i;
- register struct tt_tab *tp;
- register char *p, *q;
- register char *t;
-
- tt_strp = tt_strings;
-
- /*
- * Set output buffer size to about 1 second of output time.
- */
- i = MIN(wwbaud/10, 512);
- if ((tt_ob = malloc((unsigned) i)) == 0) {
- wwerrno = WWE_NOMEM;
- return -1;
- }
- tt_obp = tt_ob;
- tt_obe = tt_ob + i;
-
- /*
- * Use the standard name of the terminal (i.e. the second
- * name in termcap).
- */
- for (p = wwtermcap; *p && *p != '|' && *p != ':'; p++)
- ;
- if (*p == '|')
- p++;
- for (q = p; *q && *q != '|' && *q != ':'; q++)
- ;
- if (q != p && (t = malloc((unsigned) (q - p + 1))) != 0) {
- wwterm = t;
- while (p < q)
- *t++ = *p++;
- *t = 0;
- }
- for (tp = tt_tab; tp->tt_name != 0; tp++)
- if (strncmp(tp->tt_name, wwterm, tp->tt_len) == 0)
- break;
- if (tp->tt_name == 0) {
- wwerrno = WWE_BADTERM;
- return -1;
- }
- if ((*tp->tt_func)() < 0) {
- wwerrno = WWE_CANTDO;
- return -1;
- }
- if (wwgetttysize(0, &tt.tt_nrow, &tt.tt_ncol) < 0)
- return -1;
- tt.tt_scroll_top = 0;
- tt.tt_scroll_bot = tt.tt_nrow - 1;
- return 0;
-}
diff --git a/usr.bin/window/ttoutput.c b/usr.bin/window/ttoutput.c
deleted file mode 100644
index 1be0fa0..0000000
--- a/usr.bin/window/ttoutput.c
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)ttoutput.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-#include <errno.h>
-#include <unistd.h>
-
-/*
- * Buffered output package.
- * We need this because stdio fails on non-blocking writes.
- */
-
-ttflush()
-{
- register char *p;
- register n = tt_obp - tt_ob;
-
- if (n == 0)
- return;
- if (tt.tt_checksum)
- (*tt.tt_checksum)(tt_ob, n);
- if (tt.tt_flush) {
- (*tt.tt_flush)();
- return;
- }
- wwnflush++;
- for (p = tt_ob; p < tt_obp;) {
- wwnwr++;
- n = write(STDOUT_FILENO, p, tt_obp - p);
- if (n < 0) {
- wwnwre++;
- if (errno != EWOULDBLOCK) {
- /* can't deal with this */
- p = tt_obp;
- }
- } else if (n == 0) {
- /* what to do? */
- wwnwrz++;
- } else {
- wwnwrc += n;
- p += n;
- }
- }
- tt_obp = tt_ob;
-}
-
-ttputs(s)
-register char *s;
-{
- while (*s)
- ttputc(*s++);
-}
-
-ttwrite(s, n)
- register char *s;
- register n;
-{
- switch (n) {
- case 0:
- break;
- case 1:
- ttputc(*s);
- break;
- case 2:
- if (tt_obe - tt_obp < 2)
- ttflush();
- *tt_obp++ = *s++;
- *tt_obp++ = *s;
- break;
- case 3:
- if (tt_obe - tt_obp < 3)
- ttflush();
- *tt_obp++ = *s++;
- *tt_obp++ = *s++;
- *tt_obp++ = *s;
- break;
- case 4:
- if (tt_obe - tt_obp < 4)
- ttflush();
- *tt_obp++ = *s++;
- *tt_obp++ = *s++;
- *tt_obp++ = *s++;
- *tt_obp++ = *s;
- break;
- case 5:
- if (tt_obe - tt_obp < 5)
- ttflush();
- *tt_obp++ = *s++;
- *tt_obp++ = *s++;
- *tt_obp++ = *s++;
- *tt_obp++ = *s++;
- *tt_obp++ = *s;
- break;
- default:
- while (n > 0) {
- register m;
-
- while ((m = tt_obe - tt_obp) == 0)
- ttflush();
- if ((m = tt_obe - tt_obp) > n)
- m = n;
- bcopy(s, tt_obp, m);
- tt_obp += m;
- s += m;
- n -= m;
- }
- }
-}
diff --git a/usr.bin/window/tttermcap.c b/usr.bin/window/tttermcap.c
deleted file mode 100644
index 5cc82e6..0000000
--- a/usr.bin/window/tttermcap.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)tttermcap.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "tt.h"
-
-char *tgetstr();
-char *tgoto();
-
-tttputc(c)
-{
- ttputc(c);
-}
-
-ttxputc(c)
-{
- *tt_strp++ = c;
-}
-
-struct tt_str *
-tttgetstr(str)
- char *str;
-{
- register struct tt_str *s;
-
- if ((str = tgetstr(str, &tt_strp)) == 0)
- return 0;
- if ((s = (struct tt_str *) malloc(sizeof *s)) == 0)
- return 0;
- s->ts_str = str;
- s->ts_n = tt_strp - s->ts_str - 1;
- return s;
-}
-
-struct tt_str *
-ttxgetstr(str)
- char *str;
-{
- register struct tt_str *s;
- char buf[100];
- char *bufp = buf;
-
- if (tgetstr(str, &bufp) == 0)
- return 0;
- if ((s = (struct tt_str *) malloc(sizeof *s)) == 0)
- return 0;
- s->ts_str = tt_strp;
- tputs(buf, 1, ttxputc);
- s->ts_n = tt_strp - s->ts_str;
- *tt_strp++ = 0;
- return s;
-}
-
-tttgoto(s, col, row)
- struct tt_str *s;
-{
- register char *p = s->ts_str;
-
- ttputs(tgoto(p, col, row));
- for (p += s->ts_n; *--p == 0;)
- ttputc(0);
-}
-
-ttpgoto(s, col, row, n)
- struct tt_str *s;
-{
-
- tputs(tgoto(s->ts_str, col, row), n, tttputc);
-}
-
-ttstrcmp(a, b)
- register struct tt_str *a, *b;
-{
- int n, r;
-
- if (r = bcmp(a->ts_str, b->ts_str,
- (n = a->ts_n - b->ts_n) < 0 ? a->ts_n : b->ts_n))
- return r;
- return n;
-}
diff --git a/usr.bin/window/tttvi925.c b/usr.bin/window/tttvi925.c
deleted file mode 100644
index 86e0d5a..0000000
--- a/usr.bin/window/tttvi925.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * David Barto at Celerity Computer Corp.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)tttvi925.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-
-/*
- * Televideo 925 as emulated by Microterm.
- */
-
-#define G (WWM_GRP << WWC_MSHIFT)
-short tvi925_frame[16] = {
- ' ', '~'|G, '|'|G, 'c'|G,
- '~'|G, '~'|G, '`'|G, 'e'|G,
- '|'|G, 'a'|G, '|'|G, 'g'|G,
- 'b'|G, 'f'|G, 'h'|G, 'd'|G
-};
-
-tt_tvi925()
-{
-
- if (tt_generic() < 0)
- return -1;
- tt.tt_availmodes |= WWM_GRP;
- tt.tt_frame = tvi925_frame;
- return 0;
-}
diff --git a/usr.bin/window/ttwyse60.c b/usr.bin/window/ttwyse60.c
deleted file mode 100644
index 5e023ba..0000000
--- a/usr.bin/window/ttwyse60.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 1987 by David C. Elliott, MIPS Computer Systems.
- *
- * Unlimited redistribution allowed as long as this notice
- * is kept intact.
- */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * David C. Elliott, of MIPS Computer Systems.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)ttwyse60.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-
-#define G (WWM_GRP << WWC_MSHIFT)
-short wyse60_frame[16] = {
- ' ', '6'|G, ':'|G, '1'|G,
- '6'|G, '6'|G, '2'|G, '4'|G,
- ':'|G, '5'|G, ':'|G, '='|G,
- '3'|G, '9'|G, '0'|G, '0'|G
-};
-
-extern struct tt_str *gen_AS;
-extern struct tt_str *gen_AE;
-
-tt_wyse60()
-{
- static struct tt_str ae = { "\033H\003", 3 };
- static struct tt_str as = { "\033H\002", 3 };
-
- if (tt_generic() < 0)
- return -1;
- tt.tt_availmodes |= WWM_GRP;
- tt.tt_frame = wyse60_frame;
- if (gen_AS == 0)
- gen_AS = &as;
- if (gen_AE == 0)
- gen_AE = &ae;
- return 0;
-}
diff --git a/usr.bin/window/ttwyse75.c b/usr.bin/window/ttwyse75.c
deleted file mode 100644
index 37e0194..0000000
--- a/usr.bin/window/ttwyse75.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 1987 by David C. Elliott, MIPS Computer Systems.
- *
- * Unlimited redistribution allowed as long as this notice
- * is kept intact.
- */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * David C. Elliott, of MIPS Computer Systems.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)ttwyse75.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-
-#define G (WWM_GRP << WWC_MSHIFT)
-short wyse75_frame[16] = {
- ' ', 'x'|G, 'q'|G, 'm'|G,
- 'x'|G, 'x'|G, 'l'|G, 't'|G,
- 'q'|G, 'j'|G, 'q'|G, 'v'|G,
- 'k'|G, 'u'|G, 'w'|G, 'v'|G
-};
-
-extern struct tt_str *gen_AS;
-extern struct tt_str *gen_AE;
-
-tt_wyse75()
-{
- static struct tt_str ae = { "\033(B", 3 };
- static struct tt_str as = { "\033(0", 3 };
-
- if (tt_generic() < 0)
- return -1;
- tt.tt_availmodes |= WWM_GRP;
- tt.tt_frame = wyse75_frame;
- if (gen_AS == 0)
- gen_AS = &as;
- if (gen_AE == 0)
- gen_AE = &ae;
- return 0;
-}
diff --git a/usr.bin/window/ttzapple.c b/usr.bin/window/ttzapple.c
deleted file mode 100644
index 2fd6fb9..0000000
--- a/usr.bin/window/ttzapple.c
+++ /dev/null
@@ -1,485 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)ttzapple.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-#include "char.h"
-
-/*
-zz|zapple|perfect apple:\
- :am:pt:co#80:li#24:le=^H:nd=^F:up=^K:do=^J:\
- :ho=\E0:ll=\E1:cm=\E=%+ %+ :ch=\E<%+ :cv=\E>%+ :\
- :cl=\E4:ce=\E2:cd=\E3:rp=\E@%.%+ :\
- :so=\E+:se=\E-:\
- :dc=\Ec:DC=\EC%+ :ic=\Ei:IC=\EI%+ :\
- :al=\Ea:AL=\EA%+ :dl=\Ed:DL=\ED%+ :\
- :sf=\Ef:SF=\EF%+ :sr=\Er:SR=\ER%+ :cs=\E?%+ %+ :\
- :is=\E-\ET :
-*/
-
-#define NCOL 80
-#define NROW 24
-#define TOKEN_MAX 32
-
-extern short gen_frame[];
-
- /* for error correction */
-int zz_ecc;
-int zz_lastc;
-
- /* for checkpointing */
-int zz_sum;
-
-zz_setmodes(new)
-{
- if (new & WWM_REV) {
- if ((tt.tt_modes & WWM_REV) == 0)
- ttesc('+');
- } else
- if (tt.tt_modes & WWM_REV)
- ttesc('-');
- tt.tt_modes = new;
-}
-
-zz_insline(n)
-{
- if (n == 1)
- ttesc('a');
- else {
- ttesc('A');
- ttputc(n + ' ');
- }
-}
-
-zz_delline(n)
-{
- if (n == 1)
- ttesc('d');
- else {
- ttesc('D');
- ttputc(n + ' ');
- }
-}
-
-zz_putc(c)
- char c;
-{
- if (tt.tt_nmodes != tt.tt_modes)
- zz_setmodes(tt.tt_nmodes);
- ttputc(c);
- if (++tt.tt_col == NCOL)
- tt.tt_col = 0, tt.tt_row++;
-}
-
-zz_write(p, n)
- register char *p;
- register n;
-{
- if (tt.tt_nmodes != tt.tt_modes)
- zz_setmodes(tt.tt_nmodes);
- ttwrite(p, n);
- tt.tt_col += n;
- if (tt.tt_col == NCOL)
- tt.tt_col = 0, tt.tt_row++;
-}
-
-zz_move(row, col)
- register row, col;
-{
- register x;
-
- if (tt.tt_row == row) {
-same_row:
- if ((x = col - tt.tt_col) == 0)
- return;
- if (col == 0) {
- ttctrl('m');
- goto out;
- }
- switch (x) {
- case 2:
- ttctrl('f');
- case 1:
- ttctrl('f');
- goto out;
- case -2:
- ttctrl('h');
- case -1:
- ttctrl('h');
- goto out;
- }
- if ((col & 7) == 0 && x > 0 && x <= 16) {
- ttctrl('i');
- if (x > 8)
- ttctrl('i');
- goto out;
- }
- ttesc('<');
- ttputc(col + ' ');
- goto out;
- }
- if (tt.tt_col == col) {
- switch (row - tt.tt_row) {
- case 2:
- ttctrl('j');
- case 1:
- ttctrl('j');
- goto out;
- case -2:
- ttctrl('k');
- case -1:
- ttctrl('k');
- goto out;
- }
- if (col == 0) {
- if (row == 0)
- goto home;
- if (row == NROW - 1)
- goto ll;
- }
- ttesc('>');
- ttputc(row + ' ');
- goto out;
- }
- if (col == 0) {
- if (row == 0) {
-home:
- ttesc('0');
- goto out;
- }
- if (row == tt.tt_row + 1) {
- /*
- * Do newline first to match the sequence
- * for scroll down and return
- */
- ttctrl('j');
- ttctrl('m');
- goto out;
- }
- if (row == NROW - 1) {
-ll:
- ttesc('1');
- goto out;
- }
- }
- /* favor local motion for better compression */
- if (row == tt.tt_row + 1) {
- ttctrl('j');
- goto same_row;
- }
- if (row == tt.tt_row - 1) {
- ttctrl('k');
- goto same_row;
- }
- ttesc('=');
- ttputc(' ' + row);
- ttputc(' ' + col);
-out:
- tt.tt_col = col;
- tt.tt_row = row;
-}
-
-zz_start()
-{
- ttesc('T');
- ttputc(TOKEN_MAX + ' ');
- ttesc('U');
- ttputc('!');
- zz_ecc = 1;
- zz_lastc = -1;
- ttesc('v');
- ttflush();
- zz_sum = 0;
- zz_setscroll(0, NROW - 1);
- zz_clear();
- zz_setmodes(0);
-}
-
-zz_reset()
-{
- zz_setscroll(0, NROW - 1);
- tt.tt_modes = WWM_REV;
- zz_setmodes(0);
- tt.tt_col = tt.tt_row = -10;
-}
-
-zz_end()
-{
- ttesc('T');
- ttputc(' ');
- ttesc('U');
- ttputc(' ');
- zz_ecc = 0;
-}
-
-zz_clreol()
-{
- ttesc('2');
-}
-
-zz_clreos()
-{
- ttesc('3');
-}
-
-zz_clear()
-{
- ttesc('4');
- tt.tt_col = tt.tt_row = 0;
-}
-
-zz_insspace(n)
-{
- if (n == 1)
- ttesc('i');
- else {
- ttesc('I');
- ttputc(n + ' ');
- }
-}
-
-zz_delchar(n)
-{
- if (n == 1)
- ttesc('c');
- else {
- ttesc('C');
- ttputc(n + ' ');
- }
-}
-
-zz_scroll_down(n)
-{
- if (n == 1)
- if (tt.tt_row == NROW - 1)
- ttctrl('j');
- else
- ttesc('f');
- else {
- ttesc('F');
- ttputc(n + ' ');
- }
-}
-
-zz_scroll_up(n)
-{
- if (n == 1)
- ttesc('r');
- else {
- ttesc('R');
- ttputc(n + ' ');
- }
-}
-
-zz_setscroll(top, bot)
-{
- ttesc('?');
- ttputc(top + ' ');
- ttputc(bot + ' ');
- tt.tt_scroll_top = top;
- tt.tt_scroll_bot = bot;
-}
-
-int zz_debug = 0;
-
-zz_set_token(t, s, n)
- char *s;
-{
- if (tt.tt_nmodes != tt.tt_modes)
- zz_setmodes(tt.tt_nmodes);
- if (zz_debug) {
- char buf[100];
- zz_setmodes(WWM_REV);
- (void) sprintf(buf, "%02x=", t);
- ttputs(buf);
- tt.tt_col += 3;
- }
- ttputc(0x80);
- ttputc(t + 1);
- s[n - 1] |= 0x80;
- ttwrite(s, n);
- s[n - 1] &= ~0x80;
-}
-
-/*ARGSUSED*/
-zz_put_token(t, s, n)
- char *s;
-{
- if (tt.tt_nmodes != tt.tt_modes)
- zz_setmodes(tt.tt_nmodes);
- if (zz_debug) {
- char buf[100];
- zz_setmodes(WWM_REV);
- (void) sprintf(buf, "%02x>", t);
- ttputs(buf);
- tt.tt_col += 3;
- }
- ttputc(t + 0x81);
-}
-
-zz_rint(p, n)
- char *p;
-{
- register i;
- register char *q;
-
- if (!zz_ecc)
- return n;
- for (i = n, q = p; --i >= 0;) {
- register c = (unsigned char) *p++;
-
- if (zz_lastc == 0) {
- switch (c) {
- case 0:
- *q++ = 0;
- zz_lastc = -1;
- break;
- case 1: /* start input ecc */
- zz_ecc = 2;
- zz_lastc = -1;
- wwnreadstat++;
- break;
- case 2: /* ack checkpoint */
- tt.tt_ack = 1;
- zz_lastc = -1;
- wwnreadack++;
- break;
- case 3: /* nack checkpoint */
- tt.tt_ack = -1;
- zz_lastc = -1;
- wwnreadnack++;
- break;
- default:
- zz_lastc = c;
- wwnreadec++;
- }
- } else if (zz_ecc == 1) {
- if (c)
- *q++ = c;
- else
- zz_lastc = 0;
- } else {
- if (zz_lastc < 0) {
- zz_lastc = c;
- } else if (zz_lastc == c) {
- *q++ = zz_lastc;
- zz_lastc = -1;
- } else {
- wwnreadec++;
- zz_lastc = c;
- }
- }
- }
- return q - (p - n);
-}
-
-zz_checksum(p, n)
- register char *p;
- register n;
-{
- while (--n >= 0) {
- register c = *p++ & 0x7f;
- c ^= zz_sum;
- zz_sum = c << 1 | c >> 11 & 1;
- }
-}
-
-zz_compress(flag)
-{
- if (flag)
- tt.tt_checksum = 0;
- else
- tt.tt_checksum = zz_checksum;
-}
-
-zz_checkpoint()
-{
- static char x[] = { ctrl('['), 'V', 0, 0 };
-
- zz_checksum(x, sizeof x);
- ttesc('V');
- ttputc(' ' + (zz_sum & 0x3f));
- ttputc(' ' + (zz_sum >> 6 & 0x3f));
- ttflush();
- zz_sum = 0;
-}
-
-tt_zapple()
-{
- tt.tt_insspace = zz_insspace;
- tt.tt_delchar = zz_delchar;
- tt.tt_insline = zz_insline;
- tt.tt_delline = zz_delline;
- tt.tt_clreol = zz_clreol;
- tt.tt_clreos = zz_clreos;
- tt.tt_scroll_down = zz_scroll_down;
- tt.tt_scroll_up = zz_scroll_up;
- tt.tt_setscroll = zz_setscroll;
- tt.tt_availmodes = WWM_REV;
- tt.tt_wrap = 1;
- tt.tt_retain = 0;
- tt.tt_ncol = NCOL;
- tt.tt_nrow = NROW;
- tt.tt_start = zz_start;
- tt.tt_reset = zz_reset;
- tt.tt_end = zz_end;
- tt.tt_write = zz_write;
- tt.tt_putc = zz_putc;
- tt.tt_move = zz_move;
- tt.tt_clear = zz_clear;
- tt.tt_setmodes = zz_setmodes;
- tt.tt_frame = gen_frame;
- tt.tt_padc = TT_PADC_NONE;
- tt.tt_ntoken = 127;
- tt.tt_set_token = zz_set_token;
- tt.tt_put_token = zz_put_token;
- tt.tt_token_min = 1;
- tt.tt_token_max = TOKEN_MAX;
- tt.tt_set_token_cost = 2;
- tt.tt_put_token_cost = 1;
- tt.tt_compress = zz_compress;
- tt.tt_checksum = zz_checksum;
- tt.tt_checkpoint = zz_checkpoint;
- tt.tt_reset = zz_reset;
- tt.tt_rint = zz_rint;
- return 0;
-}
diff --git a/usr.bin/window/ttzentec.c b/usr.bin/window/ttzentec.c
deleted file mode 100644
index 0e80711..0000000
--- a/usr.bin/window/ttzentec.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)ttzentec.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-
-/*
- * Zentec 1021
- *
- * We let the termcap entry specify how to enter and exit graphics mode,
- * since it varies with what the terminal is emulating.
- */
-
-#define G (WWM_GRP << WWC_MSHIFT)
-short zentec_frame[16] = {
- ' ', 'x'|G, 'q'|G, 'm'|G,
- 'x'|G, 'x'|G, 'l'|G, 't'|G,
- 'q'|G, 'j'|G, 'q'|G, 'v'|G,
- 'k'|G, 'u'|G, 'w'|G, 'n'|G
-};
-
-tt_zentec()
-{
- if (tt_generic() < 0)
- return -1;
- if (tt.tt_availmodes | WWM_GRP)
- tt.tt_frame = zentec_frame;
- return 0;
-}
diff --git a/usr.bin/window/value.h b/usr.bin/window/value.h
deleted file mode 100644
index b55e210..0000000
--- a/usr.bin/window/value.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)value.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-struct value {
- char v_type;
- union {
- int V_num;
- char *V_str;
- } v_un;
-};
-#define v_num v_un.V_num
-#define v_str v_un.V_str
-
-#define V_NUM 1
-#define V_STR 2
-#define V_ERR 3
-
-#define val_free(v) ((v).v_type == V_STR ? str_free((v).v_str) : 0)
diff --git a/usr.bin/window/var.c b/usr.bin/window/var.c
deleted file mode 100644
index 8ef3175..0000000
--- a/usr.bin/window/var.c
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)var.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "value.h"
-#include "var.h"
-#include "mystring.h"
-
-struct var *
-var_set1(head, name, v)
-struct var **head;
-char *name;
-struct value *v;
-{
- register struct var **p;
- register struct var *r;
- struct value val;
-
- /* do this first, easier to recover */
- val = *v;
- if (val.v_type == V_STR && val.v_str != 0 &&
- (val.v_str = str_cpy(val.v_str)) == 0)
- return 0;
- if (*(p = var_lookup1(head, name)) == 0) {
- r = (struct var *) malloc(sizeof (struct var));
- if (r == 0) {
- val_free(val);
- return 0;
- }
- if ((r->r_name = str_cpy(name)) == 0) {
- val_free(val);
- free((char *) r);
- return 0;
- }
- r->r_left = r->r_right = 0;
- *p = r;
- } else {
- r = *p;
- val_free(r->r_val);
- }
- r->r_val = val;
- return r;
-}
-
-struct var *
-var_setstr1(head, name, str)
-struct var **head;
-char *name;
-char *str;
-{
- struct value v;
-
- v.v_type = V_STR;
- v.v_str = str;
- return var_set1(head, name, &v);
-}
-
-struct var *
-var_setnum1(head, name, num)
-struct var **head;
-char *name;
-int num;
-{
- struct value v;
-
- v.v_type = V_NUM;
- v.v_num = num;
- return var_set1(head, name, &v);
-}
-
-var_unset1(head, name)
-struct var **head;
-char *name;
-{
- register struct var **p;
- register struct var *r;
-
- if (*(p = var_lookup1(head, name)) == 0)
- return -1;
- r = *p;
- *p = r->r_left;
- while (*p != 0)
- p = &(*p)->r_right;
- *p = r->r_right;
- val_free(r->r_val);
- str_free(r->r_name);
- free((char *) r);
- return 0;
-}
-
-struct var **
-var_lookup1(p, name)
-register struct var **p;
-register char *name;
-{
- register cmp;
-
- while (*p != 0) {
- if ((cmp = strcmp(name, (*p)->r_name)) < 0)
- p = &(*p)->r_left;
- else if (cmp > 0)
- p = &(*p)->r_right;
- else
- break;
- }
- return p;
-}
-
-var_walk1(r, func, a)
-register struct var *r;
-int (*func)();
-long a;
-{
- if (r == 0)
- return 0;
- if (var_walk1(r->r_left, func, a) < 0 || (*func)(a, r) < 0
- || var_walk1(r->r_right, func, a) < 0)
- return -1;
- return 0;
-}
diff --git a/usr.bin/window/var.h b/usr.bin/window/var.h
deleted file mode 100644
index 645d2da..0000000
--- a/usr.bin/window/var.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)var.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-struct var {
- struct var *r_left;
- struct var *r_right;
- char *r_name;
- struct value r_val;
-};
-
-struct var *var_set1();
-struct var *var_setstr1();
-struct var *var_setnum1();
-struct var **var_lookup1();
-
-#define var_set(n, v) var_set1(&var_head, n, v)
-#define var_setstr(n, s) var_setstr1(&var_head, n, s)
-#define var_setnum(n, i) var_setnum1(&var_head, n, i)
-#define var_unset(n) var_unset1(&var_head, n)
-#define var_lookup(n) (*var_lookup1(&var_head, n))
-#define var_walk(f, a) var_walk1(var_head, f, a)
-
-struct var *var_head; /* secret, shhh */
diff --git a/usr.bin/window/win.c b/usr.bin/window/win.c
deleted file mode 100644
index c5f0e451..0000000
--- a/usr.bin/window/win.c
+++ /dev/null
@@ -1,372 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)win.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "defs.h"
-#include "char.h"
-
-/*
- * Higher level routines for dealing with windows.
- *
- * There are two types of windows: user window, and information window.
- * User windows are the ones with a pty and shell. Information windows
- * are for displaying error messages, and other information.
- *
- * The windows are doubly linked in overlapping order and divided into
- * two groups: foreground and normal. Information
- * windows are always foreground. User windows can be either.
- * Addwin() adds a window to the list at the top of one of the two groups.
- * Deletewin() deletes a window. Front() moves a window to the front
- * of its group. Wwopen(), wwadd(), and wwdelete() should never be called
- * directly.
- */
-
-/*
- * Open a user window.
- */
-struct ww *
-openwin(id, row, col, nrow, ncol, nline, label, haspty, hasframe, shf, sh)
-char *label;
-char haspty, hasframe;
-char *shf, **sh;
-{
- register struct ww *w;
-
- if (id < 0 && (id = findid()) < 0)
- return 0;
- if (row + nrow <= 0 || row > wwnrow - 1
- || col + ncol <= 0 || col > wwncol - 1) {
- error("Illegal window position.");
- return 0;
- }
- w = wwopen(haspty ? WWO_PTY : WWO_SOCKET, nrow, ncol, row, col, nline);
- if (w == 0) {
- error("Can't open window: %s.", wwerror());
- return 0;
- }
- w->ww_id = id;
- window[id] = w;
- w->ww_hasframe = hasframe;
- w->ww_alt = w->ww_w;
- if (label != 0 && setlabel(w, label) < 0)
- error("No memory for label.");
- wwcursor(w, 1);
- /*
- * We have to do this little maneuver to make sure
- * addwin() puts w at the top, so we don't waste an
- * insert and delete operation.
- */
- setselwin((struct ww *)0);
- addwin(w, 0);
- setselwin(w);
- if (wwspawn(w, shf, sh) < 0) {
- error("Can't execute %s: %s.", shf, wwerror());
- closewin(w);
- return 0;
- }
- return w;
-}
-
-findid()
-{
- register i;
-
- for (i = 0; i < NWINDOW && window[i] != 0; i++)
- ;
- if (i >= NWINDOW) {
- error("Too many windows.");
- return -1;
- }
- return i;
-}
-
-struct ww *
-findselwin()
-{
- register struct ww *w, *s = 0;
- register i;
-
- for (i = 0; i < NWINDOW; i++)
- if ((w = window[i]) != 0 && w != selwin &&
- (s == 0 ||
- !isfg(w) && (w->ww_order < s->ww_order || isfg(s))))
- s = w;
- return s;
-}
-
-/*
- * Close a user window. Close all if w == 0.
- */
-closewin(w)
-register struct ww *w;
-{
- char didit = 0;
- register i;
-
- if (w != 0) {
- closewin1(w);
- didit++;
- } else
- for (i = 0; i < NWINDOW; i++) {
- if ((w = window[i]) == 0)
- continue;
- closewin1(w);
- didit++;
- }
- if (didit) {
- if (selwin == 0)
- if (lastselwin != 0) {
- setselwin(lastselwin);
- lastselwin = 0;
- } else if (w = findselwin())
- setselwin(w);
- if (lastselwin == 0 && selwin)
- if (w = findselwin())
- lastselwin = w;
- reframe();
- }
-}
-
-/*
- * Open an information (display) window.
- */
-struct ww *
-openiwin(nrow, label)
-char *label;
-{
- register struct ww *w;
-
- if ((w = wwopen(0, nrow, wwncol, 2, 0, 0)) == 0)
- return 0;
- w->ww_mapnl = 1;
- w->ww_hasframe = 1;
- w->ww_nointr = 1;
- w->ww_noupdate = 1;
- w->ww_unctrl = 1;
- w->ww_id = -1;
- w->ww_center = 1;
- (void) setlabel(w, label);
- addwin(w, 1);
- reframe();
- return w;
-}
-
-/*
- * Close an information window.
- */
-closeiwin(w)
-struct ww *w;
-{
- closewin1(w);
- reframe();
-}
-
-closewin1(w)
-register struct ww *w;
-{
- if (w == selwin)
- selwin = 0;
- if (w == lastselwin)
- lastselwin = 0;
- if (w->ww_id >= 0 && w->ww_id < NWINDOW)
- window[w->ww_id] = 0;
- if (w->ww_label)
- str_free(w->ww_label);
- deletewin(w);
- wwclose(w);
-}
-
-/*
- * Move the window to the top of its group.
- * Don't do it if already fully visible.
- * Wwvisible() doesn't work for tinted windows.
- * But anything to make it faster.
- * Always reframe() if doreframe is true.
- */
-front(w, doreframe)
-register struct ww *w;
-char doreframe;
-{
- if (w->ww_back != (isfg(w) ? framewin : fgwin) && !wwvisible(w)) {
- deletewin(w);
- addwin(w, isfg(w));
- doreframe = 1;
- }
- if (doreframe)
- reframe();
-}
-
-/*
- * Add a window at the top of normal windows or foreground windows.
- * For normal windows, we put it behind the current window.
- */
-addwin(w, fg)
-register struct ww *w;
-char fg;
-{
- if (fg) {
- wwadd(w, framewin);
- if (fgwin == framewin)
- fgwin = w;
- } else
- wwadd(w, selwin != 0 && selwin != w && !isfg(selwin)
- ? selwin : fgwin);
-}
-
-/*
- * Delete a window.
- */
-deletewin(w)
-register struct ww *w;
-{
- if (fgwin == w)
- fgwin = w->ww_back;
- wwdelete(w);
-}
-
-reframe()
-{
- register struct ww *w;
-
- wwunframe(framewin);
- for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back)
- if (w->ww_hasframe) {
- wwframe(w, framewin);
- labelwin(w);
- }
-}
-
-labelwin(w)
-register struct ww *w;
-{
- int mode = w == selwin ? WWM_REV : 0;
-
- if (!w->ww_hasframe)
- return;
- if (w->ww_id >= 0) {
- char buf[2];
-
- buf[0] = w->ww_id + '1';
- buf[1] = 0;
- wwlabel(w, framewin, 1, buf, mode);
- }
- if (w->ww_label) {
- int col;
-
- if (w->ww_center) {
- col = (w->ww_w.nc - strlen(w->ww_label)) / 2;
- col = MAX(3, col);
- } else
- col = 3;
- wwlabel(w, framewin, col, w->ww_label, mode);
- }
-}
-
-stopwin(w)
- register struct ww *w;
-{
- if (w->ww_pty >= 0 && w->ww_ispty && wwstoptty(w->ww_pty) < 0)
- error("Can't stop output: %s.", wwerror());
- else
- w->ww_stopped = 1;
-}
-
-startwin(w)
- register struct ww *w;
-{
- if (w->ww_pty >= 0 && w->ww_ispty && wwstarttty(w->ww_pty) < 0)
- error("Can't start output: %s.", wwerror());
- else
- w->ww_stopped = 0;
-}
-
-sizewin(w, nrow, ncol)
-register struct ww *w;
-{
- struct ww *back = w->ww_back;
-
- w->ww_alt.nr = w->ww_w.nr;
- w->ww_alt.nc = w->ww_w.nc;
- wwdelete(w);
- if (wwsize(w, nrow, ncol) < 0)
- error("Can't resize window: %s.", wwerror());
- wwadd(w, back);
- reframe();
-}
-
-waitnl(w)
-struct ww *w;
-{
- (void) waitnl1(w, "[Type any key to continue]");
-}
-
-more(w, always)
-register struct ww *w;
-char always;
-{
- int c;
- char uc = w->ww_unctrl;
-
- if (!always && w->ww_cur.r < w->ww_w.b - 2)
- return 0;
- c = waitnl1(w, "[Type escape to abort, any other key to continue]");
- w->ww_unctrl = 0;
- wwputs("\033E", w);
- w->ww_unctrl = uc;
- return c == ctrl('[') ? 2 : 1;
-}
-
-waitnl1(w, prompt)
-register struct ww *w;
-char *prompt;
-{
- char uc = w->ww_unctrl;
-
- w->ww_unctrl = 0;
- front(w, 0);
- wwprintf(w, "\033Y%c%c\033sA%s\033rA ",
- w->ww_w.nr - 1 + ' ', ' ', prompt); /* print on last line */
- wwcurtowin(w);
- while (wwpeekc() < 0)
- wwiomux();
- w->ww_unctrl = uc;
- return wwgetc();
-}
diff --git a/usr.bin/window/window.1 b/usr.bin/window/window.1
deleted file mode 100644
index 307ae2e..0000000
--- a/usr.bin/window/window.1
+++ /dev/null
@@ -1,1072 +0,0 @@
-.\" Copyright (c) 1985, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Edward Wang at The University of California, Berkeley.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)window.1 8.2 (Berkeley) 12/30/93
-.\" $FreeBSD$
-.\"
-.Dd December 30, 1993
-.Dt WINDOW 1
-.Os
-.Sh NAME
-.Nm window
-.Nd window environment
-.Sh SYNOPSIS
-.Nm
-.Op Fl t
-.Op Fl f
-.Op Fl d
-.Op Fl e Ar escape-char
-.Op Fl c Ar command
-.Sh DESCRIPTION
-The
-.Nm
-utility implements a window environment on
-.Tn ASCII
-terminals.
-.Pp
-A window is a rectangular portion of the physical terminal
-screen associated with a set of processes.
-Its size and
-position can be changed by the user at any time.
-Processes
-communicate with their window in the same way they normally
-interact with a terminal\-through their standard input, output,
-and diagnostic file descriptors.
-The window program handles the
-details of redirecting input and output to and from the
-windows.
-At any one time, only one window can receive
-input from the keyboard, but all windows can simultaneously send output
-to the display.
-.Pp
-When
-.Nm
-starts up, the commands (see long commands below)
-contained in the file
-.Pa .windowrc
-in the user's home directory are
-executed.
-If it does not exist, two equal sized windows spanning
-the terminal screen are created by default.
-.Pp
-The command line options are
-.Bl -tag -width Fl
-.It Fl t
-Turn on terse mode (see
-.Ic terse
-command below).
-.It Fl f
-Fast.
-Do not perform any startup action.
-.It Fl d
-Ignore
-.Pa .windowrc
-and create the two default
-windows instead.
-.It Fl e Ar escape-char
-Set the escape character to
-.Ar escape-char .
-.Ar Escape-char
-can be a single character, or in the form
-.Ic ^X
-where
-.Ar X
-is any character, meaning
-.No control\- Ns Ar X .
-.It Fl c Ar command
-Execute the string
-.Ar command
-as a long command (see below)
-before doing anything else.
-.El
-.Pp
-Windows can overlap and are framed as necessary.
-Each window
-is named by one of the digits ``1'' to ``9''.
-This one-character
-identifier, as well as a user definable label string, are displayed
-with the window on the top edge of its frame.
-A window can be
-designated to be in the
-.Ar foreground ,
-in which case it will always be
-on top of all normal, non-foreground windows, and can be covered
-only by other foreground windows.
-A window need not be completely
-within the edges of the terminal screen.
-Thus a large window
-(possibly larger than the screen) may be positioned to show only
-a portion of its full size.
-.Pp
-Each window has a cursor and a set of control functions.
-Most intelligent
-terminal operations such as line and
-character deletion and insertion are supported.
-Display modes
-such as underlining and reverse video are available if they are
-supported by the terminal.
-In addition,
-similar to terminals with multiple pages of memory,
-each window has a text buffer which can have more lines than the window
-itself.
-.Ss Process Environment
-With each newly created window, a shell program is spawned with its
-process environment tailored to that window.
-Its standard input,
-output, and diagnostic file descriptors are bound to one end of either
-a pseudo-terminal (see
-.Xr pty 4 )
-or a
-.Ux
-domain socket (see
-.Xr socketpair 2 ) .
-If a pseudo-terminal is used, then its special
-characters and modes (see
-.Xr stty 1 )
-are copied from the physical
-terminal.
-A
-.Xr termcap 5
-entry tailored to this window is created
-and passed as environment (see
-.Xr environ 7 )
-variable
-.Ev TERMCAP .
-The termcap entry contains the window's size and
-characteristics as well as information from the physical terminal,
-such as the existence of underline, reverse video, and other display
-modes, and the codes produced by the terminal's function keys,
-if any.
-In addition, the window size attributes of the pseudo-terminal
-are set to reflect the size of this window, and updated whenever
-it is changed by the user.
-In particular, the editor
-.Xr vi 1
-uses
-this information to redraw its display.
-.Ss Operation
-During normal execution,
-.Nm
-can be in one of two states:
-conversation mode and command mode.
-In conversation mode, the
-terminal's real cursor is placed at the cursor position of a particular
-window--called the current window--and input from the keyboard is sent
-to the process in that window.
-The current window is always
-on top of all other windows, except those in foreground.
-In addition,
-it is set apart by highlighting its identifier and label in reverse video.
-.Pp
-Typing
-.Nm Ns 's
-escape character (normally
-.Ic ^P )
-in conversation
-mode switches it into command mode.
-In command mode, the top line of
-the terminal screen becomes the command prompt window, and
-.Nm
-interprets input from the keyboard as commands to manipulate windows.
-.Pp
-There are two types of commands: short commands are usually one or two
-key strokes; long commands are strings either typed by the user in the
-command window (see the
-.Dq Ic \&:
-command below), or read from a file (see
-.Ic source
-below).
-.Ss Short Commands
-Below,
-.Ar \&#
-represents one of the digits ``1'' to ``9''
-corresponding to the windows 1 to 9.
-.Ic ^X
-means
-.No control\- Ns Ar X ,
-where
-.Ar X
-is any character.
-In particular,
-.Ic ^^
-is
-.Li control\-^ .
-.Ar Escape
-is the escape key, or
-.Ic ^\&[ .
-.Bl -tag -width Ds
-.It Ar #
-Select window
-.Ar #
-as the current window
-and return to conversation mode.
-.It Ic \&% Ns Ar #
-Select window
-.Ar #
-but stay in command mode.
-.It Ic ^^
-Select the previous window and return to conversation
-mode.
-This is useful for toggling between two windows.
-.It Ic escape
-Return to conversation mode.
-.It Ic ^P
-Return to conversation mode and write
-.Ic ^P
-to the
-current window.
-Thus, typing two
-.Ic ^P Ns 's
-in conversation
-mode sends one to the current window.
-If the
-.Nm
-escape is changed to some other character, that
-character takes the place of
-.Ic ^P
-here.
-.It Ic \&?
-List a short summary of commands.
-.It Ic ^L
-Refresh the screen.
-.It Ic q
-Exit
-.Nm .
-Confirmation is requested.
-.It Ic ^Z
-Suspend
-.Nm .
-.It Ic w
-Create a new window.
-The user is prompted for the positions
-of the upper left and lower right corners of the window.
-The cursor is placed on the screen and the keys ``h'', ``j'',
-``k'', and ``l''
-move the cursor left, down, up, and right, respectively.
-The keys ``H'', ``J'', ``K'', and ``L'' move the cursor to the respective
-limits of the screen.
-Typing a number before the movement keys
-repeats the movement that number of times.
-Return enters the cursor position
-as the upper left corner of the window.
-The lower right corner
-is entered in the same manner.
-During this process,
-the placement of the new window is indicated by a rectangular
-box drawn on the screen, corresponding to where the new window
-will be framed.
-Typing escape at any point
-cancels this command.
-.Pp
-This window becomes the current window,
-and is given the first available ID.
-The default buffer size
-is used (see
-.Ar default_nline
-command below).
-.Pp
-Only fully visible windows can be created this way.
-.It Ic c Ns Ar #
-Close window
-.Ar # .
-The process in the window is sent
-the hangup signal (see
-.Xr kill 1 ) .
-The
-.Xr csh 1
-utility should
-handle this signal correctly and cause no problems.
-.It Ic m Ns Ar #
-Move window
-.Ar #
-to another location.
-A box in the shape
-of the window is drawn on
-the screen to indicate the new position of the window, and the same keys as
-those for the
-.Ic w
-command are used to position the box.
-The
-window can be moved partially off-screen.
-.It Ic M Ns Ar #
-Move window
-.Ar #
-to its previous position.
-.It Ic s Ns Ar #
-Change the size of window
-.Ar # .
-The user is prompted
-to enter the new lower right corner of the window.
-A box
-is drawn to indicate the new window size.
-The same
-keys used in
-.Ic w
-and
-.Ic m
-are used to enter the position.
-.It Ic S Ns Ar #
-Change window
-.Ar #
-to its previous size.
-.It Ic ^Y
-Scroll the current window up by one line.
-.It Ic ^E
-Scroll the current window down by one line.
-.It Ic ^U
-Scroll the current window up by half the window size.
-.It Ic ^D
-Scroll the current window down by half the window size.
-.It Ic ^B
-Scroll the current window up by the full window size.
-.It Ic ^F
-Scroll the current window down by the full window size.
-.It Ic h
-Move the cursor of the current window left by one column.
-.It Ic j
-Move the cursor of the current window down by one line.
-.It Ic k
-Move the cursor of the current window up by one line.
-.It Ic l
-Move the cursor of the current window right by one column.
-.It Ic y
-Yank.
-The user is prompted to enter two points within the current
-window.
-Then the content of the current window between those two points
-is saved in the yank buffer.
-.It Ic p
-Put.
-The content of the yank buffer is written to the current
-window as input.
-.It Ic ^S
-Stop output in the current window.
-.It Ic ^Q
-Start output in the current window.
-.It Ic :
-Enter a line to be executed as long commands.
-Normal line
-editing characters (erase character, erase word, erase line)
-are supported.
-.El
-.Ss Long Commands
-Long commands are a sequence of statements
-parsed much like a programming language, with a syntax
-similar to that of C.
-Numeric and string expressions and variables
-are supported, as well as conditional statements.
-.Pp
-There are two data types: string and number.
-A string is a sequence
-of letters or digits beginning with a letter.
-``_'' and ``.'' are
-considered letters.
-Alternately, non-alphanumeric characters can
-be included in strings by quoting them in ``"'' or escaping them
-with ``\\''.
-In addition, the ``\\'' sequences of C are supported,
-both inside and outside quotes (e.g., ``\\n'' is a new line,
-``\\r'' a carriage return).
-For example, these are legal strings:
-abcde01234, "&#$^*&#", ab"$#"cd, ab\\$\\#cd, "/usr/ucb/window".
-.Pp
-A number is an integer value in one of three forms:
-a decimal number, an octal number preceded by ``0'',
-or a hexadecimal number preceded by ``0x'' or ``0X''.
-The natural
-machine integer size is used (i.e., the signed integer type
-of the C compiler).
-As in C, a non-zero number represents
-a boolean true.
-.Pp
-The character ``#'' begins a comment which terminates at the
-end of the line.
-.Pp
-A statement is either a conditional or an expression.
-Expression
-statements are terminated with a new line or ``;''.
-To continue
-an expression on the next line, terminate the first line with ``\\''.
-.Ss Conditional Statement
-The
-.Nm
-utility has a single control structure:
-the fully bracketed if statement in the form
-.Pp
-.Bd -literal -offset indent -compact
-if <expr> then
-\t<statement>
-\t...
-elsif <expr> then
-\t<statement>
-\t...
-else
-\t<statement>
-\t...
-endif
-.Ed
-.Pp
-The
-.Ic else
-and
-.Ic elsif
-parts are optional, and the latter can
-be repeated any number of times.
-<Expr>
-must be numeric.
-.Ss Expressions
-Expressions in
-.Nm
-are similar to those in the
-C language, with most C operators supported on numeric
-operands.
-In addition, some are overloaded to operate on strings.
-.Pp
-When an expression is used as a statement, its value is discarded
-after evaluation.
-Therefore, only expressions with side
-effects (assignments and function calls) are useful as statements.
-.Pp
-Single valued (no arrays) variables are supported, of both
-numeric and string values.
-Some variables are predefined.
-They
-are listed below.
-.Pp
-The operators in order of increasing precedence:
-.Bl -tag -width Fl
-.It Xo
-.Aq Va expr1
-.Ic =
-.Aq Va expr2
-.Xc
-Assignment.
-The variable of name
-.Aq Va expr1 ,
-which must be string valued,
-is assigned the result of
-.Aq Va expr2 .
-Returns the value of
-.Aq Va expr2 .
-.It Xo
-.Aq Va expr1
-.Ic \&?
-.Aq Va expr2
-.Ic :
-.Aq Va expr3
-.Xc
-Returns the value of
-.Aq Va expr2
-if
-.Aq Va expr1
-evaluates true
-(non-zero numeric value); returns the value of
-.Aq Va expr3
-otherwise.
-Only
-one of
-.Aq Va expr2
-and
-.Aq Va expr3
-is evaluated.
-.Aq Va Expr1
-must
-be numeric.
-.It Xo
-.Aq Va expr1
-.Ic \&|\&|
-.Aq Va expr2
-.Xc
-Logical or.
-Numeric values only.
-Short circuit evaluation is supported
-(i.e., if
-.Aq Va expr1
-evaluates true, then
-.Aq Va expr2
-is not evaluated).
-.It Xo
-.Aq Va expr1
-.Ic \&&\&&
-.Aq Va expr2
-.Xc
-Logical and with short circuit evaluation.
-Numeric values only.
-.It Xo
-.Aq Va expr1
-.Ic \&|
-.Aq Va expr2
-.Xc
-Bitwise or.
-Numeric values only.
-.It Xo
-.Aq Va expr1
-.Ic ^
-.Aq Va expr2
-.Xc
-Bitwise exclusive or.
-Numeric values only.
-.It Xo
-.Aq Va expr1
-.Ic \&&
-.Aq Va expr2
-.Xc
-Bitwise and.
-Numeric values only.
-.It Xo
-.Aq Va expr1
-.Ic ==
-.Aq Va expr2 ,
-.Aq Va expr1
-.Ic !=
-.Aq expr2
-.Xc
-Comparison (equal and not equal, respectively).
-The boolean
-result (either 1 or 0) of the comparison is returned.
-The
-operands can be numeric or string valued.
-One string operand
-forces the other to be converted to a string in necessary.
-.It Xo
-.Aq Va expr1
-.Ic <
-.Aq Va expr2 ,
-.Aq Va expr1
-.Ic >
-.Aq Va expr2 ,
-.Aq Va expr1
-.Ic <=
-.Aq Va expr2 ,
-.Xc
-Less than, greater than, less than or equal to,
-greater than or equal to.
-Both numeric and string values, with
-automatic conversion as above.
-.It Xo
-.Aq Va expr1
-.Ic <<
-.Aq Va expr2 ,
-.Aq Va expr1
-.Ic >>
-.Aq Va expr2
-.Xc
-If both operands are numbers,
-.Aq Va expr1
-is bit
-shifted left (or right) by
-.Aq Va expr2
-bits.
-If
-.Aq Va expr1
-is
-a string, then its first (or last)
-.Aq Va expr2
-characters are
-returns (if
-.Aq Va expr2
-is also a string, then its length is used
-in place of its value).
-.It Xo
-.Aq Va expr1
-.Ic +
-.Aq Va expr2 ,
-.Aq Va expr1
-.Ic -
-.Aq Va expr2
-.Xc
-Addition and subtraction on numbers.
-For ``+'', if one
-argument is a string, then the other is converted to a string,
-and the result is the concatenation of the two strings.
-.It Xo
-.Aq Va expr1
-.Ic \&*
-.Aq Va expr2 ,
-.Aq Va expr1
-.Ic \&/
-.Aq Va expr2 ,
-.Aq Va expr1
-.Ic \&%
-.Aq Va expr2
-.Xc
-Multiplication, division, modulo.
-Numbers only.
-.It Xo
-.Ic \- Ns Aq Va expr ,
-.Ic ~ Ns Aq Va expr ,
-.Ic \&! Ns Aq Va expr ,
-.Ic \&$ Ns Aq Va expr ,
-.Ic \&$? Ns Aq Va expr
-.Xc
-The first three are unary minus, bitwise complement and logical complement
-on numbers only.
-The operator, ``$'', takes
-.Aq Va expr
-and returns
-the value of the variable of that name.
-If
-.Aq Va expr
-is numeric
-with value
-.Ar n
-and it appears within an alias macro (see below),
-then it refers to the nth argument of the alias invocation.
-``$?''
-tests for the existence of the variable
-.Aq Va expr ,
-and returns 1
-if it exists or 0 otherwise.
-.It Xo
-.Ao Va expr Ac Ns Pq Aq Ar arglist
-.Xc
-Function call.
-.Aq Va Expr
-must be a string that is the unique
-prefix of the name of a builtin
-.Nm
-function
-or the full name of a user defined alias macro.
-In the case of a builtin
-function,
-.Aq Ar arglist
-can be in one of two forms:
-.Bd -literal -offset indent
-<expr1>, <expr2>, ...
-argname1 = <expr1>, argname2 = <expr2>, ...
-.Ed
-.Pp
-The two forms can in fact be intermixed, but the result is
-unpredictable.
-Most arguments can be omitted; default values will
-be supplied for them.
-The
-.Ar argnames
-can be unique prefixes
-of the argument names.
-The commas separating
-arguments are used only to disambiguate, and can usually be omitted.
-.Pp
-Only the first argument form is valid for user defined aliases.
-Aliases
-are defined using the
-.Ic alias
-builtin function (see below).
-Arguments
-are accessed via a variant of the variable mechanism (see ``$'' operator
-above).
-.Pp
-Most functions return value, but some are used for side effect
-only and so must be used as statements.
-When a function or an alias is used
-as a statement, the parentheses surrounding
-the argument list may be omitted.
-Aliases return no value.
-.El
-.Ss Builtin Functions
-The arguments are listed by name in their natural
-order.
-Optional arguments are in square brackets
-.Sq Op .
-Arguments
-that have no names are in angle brackets
-.Sq <> .
-An argument meant to be a boolean flag (often named
-.Ar flag )
-can be one of
-.Ar on ,
-.Ar off ,
-.Ar yes ,
-.Ar no ,
-.Ar true ,
-or
-.Ar false ,
-with
-obvious meanings, or it can be a numeric expression,
-in which case a non-zero value is true.
-.Bl -tag -width Fl
-.It Ic alias Ns Po
-.Bq Aq Ar string ,
-.Bq Aq Ar string\-list
-.Pc
-If no argument is given, all currently defined alias macros are
-listed.
-Otherwise,
-.Aq Ar string
-is defined as an alias,
-with expansion
-.Aq Ar string\-list > .
-The previous definition of
-.Aq Ar string ,
-if any, is returned.
-Default for
-.Aq Ar string\-list
-is no change.
-.It Ic close Ns Pq Aq Ar window\-list
-Close the windows specified in
-.Aq Ar window\-list .
-If
-.Aq Ar window\-list
-is the word
-.Ar all ,
-than all windows are closed.
-No value is returned.
-.It Ic cursormodes Ns Pq Bq Ar modes
-Set the window cursor to
-.Ar modes .
-.Ar Modes
-is the bitwise
-or of the mode bits defined as the variables
-.Ar m_ul
-(underline),
-.Ar m_rev
-(reverse video),
-.Ar m_blk
-(blinking),
-and
-.Ar m_grp
-(graphics, terminal dependent).
-Return
-value is the previous modes.
-Default is no change.
-For example,
-.Li cursor($m_rev$m_blk)
-sets the window cursors to blinking
-reverse video.
-.It Ic default_nline Ns Pq Bq Ar nline
-Set the default buffer size to
-.Ar nline .
-Initially, it is
-48 lines.
-Returns the old default buffer size.
-Default is
-no change.
-Using a very large buffer can slow the program down
-considerably.
-.It Ic default_shell Ns Pq Bq Aq Ar string\-list
-Set the default window shell program to
-.Aq Ar string\-list .
-Returns
-the first string in the old shell setting.
-Default is no change.
-Initially,
-the default shell is taken from the environment variable
-.Ev SHELL .
-.It Ic default_smooth Ns Pq Bq Ar flag
-Set the default value of the
-.Ar smooth
-argument
-to the command
-.Nm
-(see below).
-The argument
-is a boolean flag (one of
-.Ar on ,
-.Ar off ,
-.Ar yes ,
-.Ar no ,
-.Ar true ,
-.Ar false ,
-or a number,
-as described above).
-Default is no change.
-The old value (as a number) is returned.
-The initial value is 1 (true).
-.It Xo
-.Ic echo Ns ( Op Ar window ,
-.Bq Aq Ar string\-list )
-.Xc
-Write the list of strings,
-.Aq Ar string-list ,
-to
-.Nm ,
-separated
-by spaces and terminated with a new line.
-The strings are only
-displayed in the window, the processes in the window are not
-involved (see
-.Ic write
-below).
-No value is returned.
-Default
-is the current window.
-.It Ic escape Ns Pq Bq Ar escapec
-Set the escape character to
-.Ar escape-char .
-Returns the old
-escape character as a one-character string.
-Default is no
-change.
-.Ar Escapec
-can be a string of a single character, or
-in the form
-.Fl ^X ,
-meaning
-.No control\- Ns Ar X .
-.It Xo
-.Ic foreground Ns ( Bq Ar window ,
-.Bq Ar flag )
-.Xc
-Move
-.Nm
-in or out of foreground.
-.Ar Flag
-is a boolean value.
-The old foreground flag
-is returned.
-Default for
-.Nm
-is the current window,
-default for
-.Ar flag
-is no change.
-.It Xo
-.Ic label Ns ( Bq Ar window ,
-.Bq Ar label )
-.Xc
-Set the label of
-.Nm
-to
-.Ar label .
-Returns the old
-label as a string.
-Default for
-.Nm
-is the current
-window, default for
-.Ar label
-is no change.
-To turn
-off a label, set it to an empty string ("").
-.It Ic list Ns Pq
-No arguments.
-List the identifiers and labels of all windows.
-No
-value is returned.
-.It Ic select Ns Pq Bq Ar window
-Make
-.Nm
-the current window.
-The previous current window
-is returned.
-Default is no change.
-.It Ic source Ns Pq Ar filename
-Read and execute the long commands in
-.Ar filename .
-Returns \-1 if the file cannot be read, 0 otherwise.
-.It Ic terse Ns Pq Bq flag
-Set terse mode to
-.Ar flag .
-In terse mode, the command window
-stays hidden even in command mode, and errors are reported by
-sounding the terminal's bell.
-.Ar Flag
-can take on the same
-values as in
-.Ar foreground
-above.
-Returns the old terse flag.
-Default is no change.
-.It Ic unalias Ns Pq Ar alias
-Undefine
-.Ar alias .
-Returns -1 if
-.Ar alias
-does not exist,
-0 otherwise.
-.It Ic unset Ns Pq Ar variable
-Undefine
-.Ar variable .
-Returns -1 if
-.Ar variable
-does not exist,
-0 otherwise.
-.It Ic variables Ns Pq
-No arguments.
-List all variables.
-No value is returned.
-.It Xo
-.Ic window Ns ( Bq Ar row ,
-.Bq Ar column ,
-.Bq Ar nrow ,
-.Bq Ar ncol ,
-.Bq Ar nline ,
-.Bq Ar label ,
-.Bq Ar pty ,
-.Bq Ar frame ,
-.Bq Ar mapnl ,
-.Bq Ar keepopen ,
-.Bq Ar smooth ,
-.Bq Ar shell ) .
-.Xc
-Open a window with upper left corner at
-.Ar row ,
-.Ar column
-and size
-.Ar nrow ,
-.Ar ncol .
-If
-.Ar nline
-is specified,
-then that many lines are allocated for the text buffer.
-Otherwise,
-the default buffer size is used.
-Default values for
-.Ar row ,
-.Ar column ,
-.Ar nrow ,
-and
-.Ar ncol
-are, respectively,
-the upper, left-most, lower, or right-most extremes of the
-screen.
-.Ar Label
-is the label string.
-.Ar Frame ,
-.Ar pty ,
-and
-.Ar mapnl
-are flag values
-interpreted in the same way as the argument to
-.Ar foreground
-(see above);
-they mean, respectively, put a frame around this window (default true),
-allocate pseudo-terminal for this window rather than socketpair (default
-true), and map new line characters in this window to carriage return
-and line feed (default true if socketpair is used, false otherwise).
-Normally, a window is automatically closed when its process
-exits.
-Setting
-.Ar keepopen
-to true (default false) prevents this
-action.
-When
-.Ar smooth
-is true, the screen is updated more frequently
-(for this window) to produce a more terminal-like behavior.
-The default value of
-.Ar smooth
-is set by the
-.Ar default_smooth
-command (see above).
-.Ar Shell
-is a list of strings that will be used as the shell
-program to place in the window (default is the program specified
-by
-.Ar default_shell ,
-see above).
-The created window's identifier
-is returned as a number.
-.It Xo
-.Ic write Ns ( Bq Ar window ,
-.Bq Aq Ar string\-list )
-.Xc
-Send the list of strings,
-.Aq Ar string-list ,
-to
-.Nm ,
-separated
-by spaces but not terminated with a new line.
-The strings are actually
-given to the window as input.
-No value is returned.
-Default
-is the current window.
-.El
-.Ss Predefined Variables
-These variables are for information only.
-Redefining them does
-not affect the internal operation of
-.Nm .
-.Bl -tag -width modes
-.It Ar baud
-The baud rate as a number between 50 and 38400.
-.It Ar modes
-The display modes (reverse video, underline, blinking, graphics)
-supported by the physical terminal.
-The value of
-.Ar modes
-is the bitwise or of some of the one bit values,
-.Ar m_blk ,
-.Ar m_grp ,
-.Ar m_rev ,
-and
-.Ar m_ul
-(see below).
-These values are useful
-in setting the window cursors' modes (see
-.Ar cursormodes
-above).
-.It Ar m_blk
-The blinking mode bit.
-.It Ar m_grp
-The graphics mode bit (not very useful).
-.It Ar m_rev
-The reverse video mode bit.
-.It Ar m_ul
-The underline mode bit.
-.It Ar ncol
-The number of columns on the physical screen.
-.It Ar nrow
-The number of rows on the physical screen.
-.It Ar term
-The terminal type.
-The standard name, found in the second name
-field of the terminal's
-.Ev TERMCAP
-entry, is used.
-.El
-.Sh ENVIRONMENT
-The
-.Nm
-utility utilizes these environment variables:
-.Ev HOME ,
-.Ev SHELL ,
-.Ev TERM ,
-.Ev TERMCAP ,
-.Ev WINDOW_ID .
-.Sh FILES
-.Bl -tag -width /dev/[pt]ty[pq]? -compact
-.It Pa ~/.windowrc
-startup command file.
-.It Pa /dev/[pt]ty[pq]?
-pseudo-terminal devices.
-.El
-.Sh DIAGNOSTICS
-Should be self explanatory.
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 4.3 .
diff --git a/usr.bin/window/windowrc b/usr.bin/window/windowrc
deleted file mode 100644
index 57c695a..0000000
--- a/usr.bin/window/windowrc
+++ /dev/null
@@ -1,85 +0,0 @@
-# Copyright (c) 1983, 1993
-# The Regents of the University of California. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 4. Neither the name of the University nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# @(#)windowrc 8.1 (Berkeley) 6/6/93
-#
-
-# Configuration file example for window manager
-# To be installed in ~/.windowrc
-#
-# Create two unequal sized windows of full screen width,
-# and set up some useful aliases.
-#
-
-#
-# Optional settings
-#
-# terse on # set terse mode
-# escape "^A" # set escape character
-# nline 100 # set default buffer size
- # initially, this is 48
-
-#
-# Make two windows
-# The bottom one is MIN(24, total lines * 3 / 4) lines
-# The top one is the rest of the screen.
-#
-three_fourth = $nrow - ((_ = $nrow * 3 / 4) > 24 ? 24 : $_)
-unset _
-window row = 0, nrow = $three_fourth - 1, label = "Top"
-window row = $three_fourth, label = "Local"
-
-#
-# Useful aliases
-#
-#
-# Standard window
-#
-alias std "window r = $three_fourth, l = $?1 ? $1 : ''"
-#
-# Sysline, add your own options
-#
-alias sysline "_ = select();" \
- "foreground window(r = 0, nr = 1, nc = $ncol + 1, nl = 0," \
- "l = sysline, pty = no, frame = no, sh = sysline \\-w), 1;" \
- "select $_; unset _"
-#
-# Rlogin
-#
-alias rlogin "window r = $three_fourth, l = $1, pty = no, mapnl = no," \
- "sh = sh \\-c 'echo $TERMCAP | rsh ' + $1 + ' \\'cat > .TERMCAP\\' ;" \
- "exec rlogin ' + $1"
-alias rl rlogin \$1
-#
-# Two equal windows
-#
-alias two "window r = 1, nr = $nrow / 2 - 1, l = top;" \
- "window r = $nrow / 2 + 1, l = bottom"
diff --git a/usr.bin/window/ww.h b/usr.bin/window/ww.h
deleted file mode 100644
index d843ef3..0000000
--- a/usr.bin/window/ww.h
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ww.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-
-#ifdef OLD_TTY
-#include <sgtty.h>
-#else
-#include <termios.h>
-#endif
-#include <setjmp.h>
-#include <machine/endian.h>
-
-#define NWW 30 /* maximum number of windows */
-
- /* a rectangle */
-struct ww_dim {
- int nr; /* number of rows */
- int nc; /* number of columns */
- int t, b; /* top, bottom */
- int l, r; /* left, right */
-};
-
- /* a coordinate */
-struct ww_pos {
- int r; /* row */
- int c; /* column */
-};
-
- /* the window structure */
-struct ww {
- /* general flags and states */
- char ww_state; /* state of window */
- char ww_oflags; /* wwopen flags */
-
- /* information for overlap */
- struct ww *ww_forw; /* doubly linked list, for overlapping info */
- struct ww *ww_back;
- char ww_index; /* the window index, for wwindex[] */
- char ww_order; /* the overlapping order */
-
- /* sizes and positions */
- struct ww_dim ww_w; /* window size and pos */
- struct ww_dim ww_b; /* buffer size and pos */
- struct ww_dim ww_i; /* the part inside the screen */
- struct ww_pos ww_cur; /* the cursor position, relative to ww_w */
-
- /* arrays */
- char **ww_win; /* the window */
- union ww_char **ww_buf; /* the buffer */
- char **ww_fmap; /* map for frame and box windows */
- short *ww_nvis; /* how many ww_buf chars are visible per row */
-
- /* information for wwwrite() and company */
- char ww_wstate; /* state for outputting characters */
- char ww_modes; /* current display modes */
- char ww_insert; /* insert mode */
- char ww_mapnl; /* map \n to \r\n */
- char ww_noupdate; /* don't do updates in wwwrite() */
- char ww_unctrl; /* expand control characters */
- char ww_nointr; /* wwwrite() not interruptable */
- char ww_hascursor; /* has fake cursor */
-
- /* things for the window process and io */
- char ww_ispty; /* ww_pty is really a pty, not socket pair */
- char ww_stopped; /* output stopped */
- int ww_pty; /* file descriptor of pty or socket pair */
- int ww_socket; /* other end of socket pair */
- int ww_pid; /* pid of process, if WWS_HASPROC true */
- char ww_ttyname[11]; /* "/dev/ttyp?" */
- char *ww_ob; /* output buffer */
- char *ww_obe; /* end of ww_ob */
- char *ww_obp; /* current read position in ww_ob */
- char *ww_obq; /* current write position in ww_ob */
-
- /* things for the user, they really don't belong here */
- char ww_id; /* the user window id */
- char ww_center; /* center the label */
- char ww_hasframe; /* frame it */
- char ww_keepopen; /* keep it open after the process dies */
- char *ww_label; /* the user supplied label */
- struct ww_dim ww_alt; /* alternate position and size */
-};
-
- /* state of a tty */
-struct ww_tty {
-#ifdef OLD_TTY
- struct sgttyb ww_sgttyb;
- struct tchars ww_tchars;
- struct ltchars ww_ltchars;
- int ww_lmode;
- int ww_ldisc;
-#else
- struct termios ww_termios;
-#endif
- int ww_fflags;
-};
-
-union ww_char {
- short c_w; /* as a word */
- struct {
-#if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN
- char C_c; /* the character part */
- char C_m; /* the mode part */
-#endif
-#if BYTE_ORDER == BIG_ENDIAN
- char C_m; /* the mode part */
- char C_c; /* the character part */
-#endif
- } c_un;
-};
-#define c_c c_un.C_c
-#define c_m c_un.C_m
-
- /* for display update */
-struct ww_update {
- int best_gain;
- int best_col;
- int gain;
-};
-
- /* parts of ww_char */
-#define WWC_CMASK 0x00ff
-#define WWC_MMASK 0xff00
-#define WWC_MSHIFT 8
-
- /* c_m bits */
-#define WWM_REV 0x01 /* reverse video */
-#define WWM_BLK 0x02 /* blinking */
-#define WWM_UL 0x04 /* underlined */
-#define WWM_GRP 0x08 /* graphics */
-#define WWM_DIM 0x10 /* half intensity */
-#define WWM_USR 0x20 /* user specified mode */
-#define WWM_GLS 0x40 /* window only, glass, i.e., transparent */
-
- /* ww_state values */
-#define WWS_INITIAL 0 /* just opened */
-#define WWS_HASPROC 1 /* has process on pty */
-#define WWS_DEAD 3 /* child died */
-
- /* flags for ww_fmap */
-#define WWF_U 0x01
-#define WWF_R 0x02
-#define WWF_D 0x04
-#define WWF_L 0x08
-#define WWF_MASK (WWF_U|WWF_R|WWF_D|WWF_L)
-#define WWF_LABEL 0x40
-#define WWF_TOP 0x80
-
- /* flags to wwopen() */
-#define WWO_PTY 0x01 /* want pty */
-#define WWO_SOCKET 0x02 /* want socket pair */
-#define WWO_REVERSE 0x04 /* make it all reverse video */
-#define WWO_GLASS 0x08 /* make it all glass */
-#define WWO_FRAME 0x10 /* this is a frame window */
-
- /* special ww_index value */
-#define WWX_NOBODY NWW
-
- /* error codes */
-#define WWE_NOERR 0
-#define WWE_SYS 1 /* system error */
-#define WWE_NOMEM 2 /* out of memory */
-#define WWE_TOOMANY 3 /* too many windows */
-#define WWE_NOPTY 4 /* no more ptys */
-#define WWE_SIZE 5 /* bad window size */
-#define WWE_BADTERM 6 /* bad terminal type */
-#define WWE_CANTDO 7 /* dumb terminal */
-
- /* wwtouched[] bits, there used to be more than one */
-#define WWU_TOUCHED 0x01 /* touched */
-
- /* the window structures */
-struct ww wwhead;
-struct ww *wwindex[NWW + 1]; /* last location is for wwnobody */
-struct ww wwnobody;
-
- /* tty things */
-struct ww_tty wwoldtty; /* the old (saved) terminal settings */
-struct ww_tty wwnewtty; /* the new (current) terminal settings */
-struct ww_tty wwwintty; /* the terminal settings for windows */
-char *wwterm; /* the terminal name */
-char wwtermcap[1024]; /* place for the termcap */
-
- /* generally useful variables */
-int wwnrow, wwncol; /* the screen size */
-char wwavailmodes; /* actually supported modes */
-char wwcursormodes; /* the modes for the fake cursor */
-char wwwrap; /* terminal has auto wrap around */
-int wwdtablesize; /* result of getdtablesize() call */
-char **wwsmap; /* the screen map */
-union ww_char **wwos; /* the old (current) screen */
-union ww_char **wwns; /* the new (desired) screen */
-union ww_char **wwcs; /* the checkpointed screen */
-char *wwtouched; /* wwns changed flags */
-struct ww_update *wwupd; /* for display update */
-int wwospeed; /* output baud rate, copied from wwoldtty */
-int wwbaud; /* wwospeed converted into actual number */
-int wwcursorrow, wwcursorcol; /* where we want the cursor to be */
-int wwerrno; /* error number */
-
- /* statistics */
-int wwnflush, wwnwr, wwnwre, wwnwrz, wwnwrc;
-int wwnwwr, wwnwwra, wwnwwrc;
-int wwntokdef, wwntokuse, wwntokbad, wwntoksave, wwntokc;
-int wwnupdate, wwnupdline, wwnupdmiss;
-int wwnupdscan, wwnupdclreol, wwnupdclreos, wwnupdclreosmiss, wwnupdclreosline;
-int wwnread, wwnreade, wwnreadz;
-int wwnreadc, wwnreadack, wwnreadnack, wwnreadstat, wwnreadec;
-int wwnwread, wwnwreade, wwnwreadz, wwnwreadd, wwnwreadc, wwnwreadp;
-int wwnselect, wwnselecte, wwnselectz;
-
- /* quicky macros */
-#define wwsetcursor(r,c) (wwcursorrow = (r), wwcursorcol = (c))
-#define wwcurtowin(w) wwsetcursor((w)->ww_cur.r, (w)->ww_cur.c)
-#define wwunbox(w) wwunframe(w)
-#define wwclreol(w,r,c) wwclreol1((w), (r), (c), 0)
-#define wwredrawwin(w) wwredrawwin1((w), (w)->ww_i.t, (w)->ww_i.b, 0)
-#define wwupdate() wwupdate1(0, wwnrow);
-
- /* things for handling input */
-void wwrint(); /* interrupt handler */
-struct ww *wwcurwin; /* window to copy input into */
-char *wwib; /* input (keyboard) buffer */
-char *wwibe; /* wwib + sizeof buffer */
-char *wwibp; /* current read position in buffer */
-char *wwibq; /* current write position in buffer */
-#define wwmaskc(c) ((c) & 0xff)
-#define wwgetc() (wwibp < wwibq ? wwmaskc(*wwibp++) : -1)
-#define wwpeekc() (wwibp < wwibq ? wwmaskc(*wwibp) : -1)
-#define wwungetc(c) (wwibp > wwib ? *--wwibp = (c) : -1)
-
- /* things for short circuiting wwiomux() */
-char wwintr; /* interrupting */
-char wwsetjmp; /* want a longjmp() from wwrint() and wwchild() */
-jmp_buf wwjmpbuf; /* jmpbuf for above */
-#define wwinterrupt() wwintr
-#define wwsetintr() do { wwintr = 1; if (wwsetjmp) longjmp(wwjmpbuf, 1); } \
- while (0)
-#define wwclrintr() (wwintr = 0)
-
- /* checkpointing */
-int wwdocheckpoint;
-
- /* the window virtual terminal */
-#define WWT_TERM "window-v2"
-#define WWT_TERMCAP "WW|window-v2|window program version 2:\
- :am:bs:da:db:ms:pt:cr=^M:nl=^J:bl=^G:ta=^I:\
- :cm=\\EY%+ %+ :le=^H:nd=\\EC:up=\\EA:do=\\EB:ho=\\EH:\
- :cd=\\EJ:ce=\\EK:cl=\\EE:me=\\Er^?:"
-#define WWT_REV "se=\\ErA:so=\\EsA:mr=\\EsA:"
-#define WWT_BLK "BE=\\ErB:BS=\\EsB:mb=\\EsB:"
-#define WWT_UL "ue=\\ErD:us=\\EsD:"
-#define WWT_GRP "ae=\\ErH:as=\\EsH:"
-#define WWT_DIM "HE=\\ErP:HS=\\EsP:mh=\\EsP:"
-#define WWT_USR "XE=\\Er`:XS=\\Es`:"
-#define WWT_ALDL "al=\\EL:dl=\\EM:"
-#define WWT_IMEI "im=\\E@:ei=\\EO:ic=:mi:" /* XXX, ic for emacs bug */
-#define WWT_IC "ic=\\EP:"
-#define WWT_DC "dc=\\EN:"
-char wwwintermcap[1024]; /* terminal-specific but window-independent
- part of the window termcap */
-#ifdef TERMINFO
- /* where to put the temporary terminfo directory */
-char wwterminfopath[1024];
-#endif
-
- /* our functions */
-struct ww *wwopen();
-void wwchild();
-void wwalarm();
-void wwquit();
-char **wwalloc();
-char *wwerror();
-
- /* c library functions */
-char *getenv();
-char *tgetstr();
-char *rindex();
-char *strcpy();
-char *strcat();
-
-#undef MIN
-#undef MAX
-#define MIN(x, y) ((x) > (y) ? (y) : (x))
-#define MAX(x, y) ((x) > (y) ? (x) : (y))
diff --git a/usr.bin/window/wwadd.c b/usr.bin/window/wwadd.c
deleted file mode 100644
index 0a78f06..0000000
--- a/usr.bin/window/wwadd.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwadd.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-
-/*
- * Stick w1 behind w2.
- */
-wwadd(w1, w2)
-register struct ww *w1;
-struct ww *w2;
-{
- register i;
- register struct ww *w;
-
- w1->ww_order = w2->ww_order + 1;
- w1->ww_back = w2;
- w1->ww_forw = w2->ww_forw;
- w2->ww_forw->ww_back = w1;
- w2->ww_forw = w1;
-
- for (w = w1->ww_forw; w != &wwhead; w = w->ww_forw)
- w->ww_order++;
- for (i = w1->ww_i.t; i < w1->ww_i.b; i++) {
- register j;
- register char *smap = wwsmap[i];
- register char *win = w1->ww_win[i];
- union ww_char *ns = wwns[i];
- union ww_char *buf = w1->ww_buf[i];
- int nvis = 0;
- int nchanged = 0;
-
- for (j = w1->ww_i.l; j < w1->ww_i.r; j++) {
- w = wwindex[smap[j]];
- if (w1->ww_order > w->ww_order)
- continue;
- if (win[j] & WWM_GLS)
- continue;
- if (w != &wwnobody && w->ww_win[i][j] == 0)
- w->ww_nvis[i]--;
- smap[j] = w1->ww_index;
- if (win[j] == 0)
- nvis++;
- ns[j].c_w = buf[j].c_w ^ win[j] << WWC_MSHIFT;
- nchanged++;
- }
- if (nchanged > 0)
- wwtouched[i] |= WWU_TOUCHED;
- w1->ww_nvis[i] = nvis;
- }
-}
diff --git a/usr.bin/window/wwalloc.c b/usr.bin/window/wwalloc.c
deleted file mode 100644
index e02d4e5..0000000
--- a/usr.bin/window/wwalloc.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwalloc.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <stdlib.h>
-#include "ww.h"
-
-char **
-wwalloc(row, col, nrow, ncol, size)
-{
- register char *p, **pp;
- register int i;
-
- /* fast, call malloc only once */
- pp = (char **)
- malloc((unsigned) sizeof (char **) * nrow + size * nrow * ncol);
- if (pp == 0) {
- wwerrno = WWE_NOMEM;
- return 0;
- }
- p = (char *)&pp[nrow];
- col *= size;
- size /= sizeof (char); /* paranoid */
- size *= ncol;
- for (i = 0; i < nrow; i++) {
- pp[i] = p - col;
- p += size;
- }
- return pp - row;
-}
-
-wwfree(p, row)
-register char **p;
-{
- free((char *)(p + row));
-}
diff --git a/usr.bin/window/wwbox.c b/usr.bin/window/wwbox.c
deleted file mode 100644
index 2d63b17..0000000
--- a/usr.bin/window/wwbox.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwbox.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-
-wwbox(w, r, c, nr, nc)
-register struct ww *w;
-register r, c;
-int nr, nc;
-{
- register r1, c1;
- register i;
-
- r1 = r + nr - 1;
- c1 = c + nc - 1;
- wwframec(w, r, c, WWF_D|WWF_R);
- for (i = c + 1; i < c1; i++)
- wwframec(w, r, i, WWF_L|WWF_R);
- wwframec(w, r, i, WWF_L|WWF_D);
- for (i = r + 1; i < r1; i++)
- wwframec(w, i, c1, WWF_U|WWF_D);
- wwframec(w, i, c1, WWF_U|WWF_L);
- for (i = c1 - 1; i > c; i--)
- wwframec(w, r1, i, WWF_R|WWF_L);
- wwframec(w, r1, i, WWF_R|WWF_U);
- for (i = r1 - 1; i > r; i--)
- wwframec(w, i, c, WWF_D|WWF_U);
-}
diff --git a/usr.bin/window/wwchild.c b/usr.bin/window/wwchild.c
deleted file mode 100644
index 3ff46ec..0000000
--- a/usr.bin/window/wwchild.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwchild.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-
-void
-wwchild()
-{
- register struct ww **wp;
- pid_t pid;
- int olderrno, w;
- char collected = 0;
-
- olderrno = errno;
- while ((pid =
- wait3((int *)&w, WNOHANG|WUNTRACED, (struct rusage *)0)) > 0) {
- for (wp = wwindex; wp < &wwindex[NWW]; wp++) {
- if (*wp && (*wp)->ww_state == WWS_HASPROC
- && (*wp)->ww_pid == pid) {
- (*wp)->ww_state = WWS_DEAD;
- collected = 1;
- break;
- }
- }
- }
- errno = olderrno;
- /* jump out of wwiomux when somebody dies */
- if (collected)
- wwsetintr();
-}
diff --git a/usr.bin/window/wwclose.c b/usr.bin/window/wwclose.c
deleted file mode 100644
index ea58edc..0000000
--- a/usr.bin/window/wwclose.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwclose.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-
-wwclose(w)
-register struct ww *w;
-{
- wwindex[w->ww_index] = 0;
- if (w->ww_pty >= 0)
- (void) close(w->ww_pty);
- if (w->ww_socket >= 0)
- (void) close(w->ww_socket);
- wwfree((char **)w->ww_win, w->ww_w.t);
- wwfree((char **)w->ww_buf, w->ww_b.t);
- if (w->ww_fmap != 0)
- wwfree((char **)w->ww_fmap, w->ww_w.t);
- free((char *)(w->ww_nvis + w->ww_w.t));
- if (w->ww_ob != 0)
- free(w->ww_ob);
- free((char *)w);
-}
diff --git a/usr.bin/window/wwclreol.c b/usr.bin/window/wwclreol.c
deleted file mode 100644
index bc0055e..0000000
--- a/usr.bin/window/wwclreol.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwclreol.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-
-/*
- * Clear w to the end of line.
- * If cleared is true, then the screen line has already been cleared.
- */
-wwclreol1(w, row, col, cleared)
-register struct ww *w;
-int row, col;
-char cleared;
-{
- register i;
-
- /*
- * Clear the buffer right off
- */
- {
- register union ww_char *buf;
-
- buf = &w->ww_buf[row][col];
- for (i = w->ww_b.r - col; --i >= 0;)
- buf++->c_w = ' ';
- }
-
- /*
- * If can't see it, just return.
- */
- if (row < w->ww_i.t || row >= w->ww_i.b
- || w->ww_i.r <= 0 || w->ww_i.r <= col)
- return;
-
- if (col < w->ww_i.l)
- col = w->ww_i.l;
-
- /*
- * Now fix wwns.
- */
- {
- register union ww_char *s;
- register char *smap, *win;
-
- i = col;
- smap = &wwsmap[row][i];
- s = &wwns[row][i];
- win = &w->ww_win[row][i];
- for (i = w->ww_i.r - i; --i >= 0;)
- if (*smap++ == w->ww_index)
- s++->c_w = ' ' | *win++ << WWC_MSHIFT;
- else
- s++, win++;
- }
- if (!cleared)
- wwtouched[row] |= WWU_TOUCHED;
-}
diff --git a/usr.bin/window/wwclreos.c b/usr.bin/window/wwclreos.c
deleted file mode 100644
index 1b8452b..0000000
--- a/usr.bin/window/wwclreos.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwclreos.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-
-wwclreos(w, row, col)
-register struct ww *w;
-{
- register i;
-
- wwclreol(w, row, col);
- for (i = row + 1; i < w->ww_b.b; i++)
- wwclreol(w, i, w->ww_b.l);
- /* XXX */
- if (!w->ww_noupdate)
- wwupdate1(w->ww_i.t, w->ww_i.b);
-}
diff --git a/usr.bin/window/wwcursor.c b/usr.bin/window/wwcursor.c
deleted file mode 100644
index 5b804c2..0000000
--- a/usr.bin/window/wwcursor.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwcursor.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-
-wwcursor(w, on)
-register struct ww *w;
-{
- register char *win;
-
- if (on) {
- if (w->ww_hascursor)
- return;
- w->ww_hascursor = 1;
- } else {
- if (!w->ww_hascursor)
- return;
- w->ww_hascursor = 0;
- }
- if (wwcursormodes != 0) {
- win = &w->ww_win[w->ww_cur.r][w->ww_cur.c];
- *win ^= wwcursormodes;
- if (w->ww_cur.r < w->ww_i.t || w->ww_cur.r >= w->ww_i.b
- || w->ww_cur.c < w->ww_i.l || w->ww_cur.c >= w->ww_i.r)
- return;
- if (wwsmap[w->ww_cur.r][w->ww_cur.c] == w->ww_index) {
- if (*win == 0)
- w->ww_nvis[w->ww_cur.r]++;
- else if (*win == wwcursormodes)
- w->ww_nvis[w->ww_cur.r]--;
- wwns[w->ww_cur.r][w->ww_cur.c].c_m ^= wwcursormodes;
- wwtouched[w->ww_cur.r] |= WWU_TOUCHED;
- }
- }
-}
-
-wwsetcursormodes(new)
-register new;
-{
- register i;
- register struct ww *w;
- register old = wwcursormodes;
-
- new &= wwavailmodes;
- if (new == wwcursormodes)
- return;
- for (i = 0; i < NWW; i++)
- if (wwindex[i] != 0 && (w = wwindex[i])->ww_hascursor) {
- wwcursor(w, 0);
- wwcursormodes = new;
- wwcursor(w, 1);
- wwcursormodes = old;
- }
- wwcursormodes = new;
-}
diff --git a/usr.bin/window/wwdata.c b/usr.bin/window/wwdata.c
deleted file mode 100644
index 54062c2..0000000
--- a/usr.bin/window/wwdata.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwdata.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
diff --git a/usr.bin/window/wwdelchar.c b/usr.bin/window/wwdelchar.c
deleted file mode 100644
index ba25cb0..0000000
--- a/usr.bin/window/wwdelchar.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwdelchar.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-
-wwdelchar(w, row, col)
-register struct ww *w;
-{
- register i;
- int nvis;
-
- /*
- * First, shift the line.
- */
- {
- register union ww_char *p, *q;
-
- p = &w->ww_buf[row][col];
- q = p + 1;
- for (i = w->ww_b.r - col; --i > 0;)
- *p++ = *q++;
- p->c_w = ' ';
- }
-
- /*
- * If can't see it, just return.
- */
- if (row < w->ww_i.t || row >= w->ww_i.b
- || w->ww_i.r <= 0 || w->ww_i.r <= col)
- return;
-
- if (col < w->ww_i.l)
- col = w->ww_i.l;
-
- /*
- * Now find out how much is actually changed, and fix wwns.
- */
- {
- register union ww_char *buf;
- register char *win;
- register union ww_char *ns;
- register char *smap;
- char touched;
-
- nvis = 0;
- smap = &wwsmap[row][col];
- for (i = col; i < w->ww_i.r && *smap++ != w->ww_index; i++)
- ;
- if (i >= w->ww_i.r)
- return;
- col = i;
- buf = w->ww_buf[row];
- win = w->ww_win[row];
- ns = wwns[row];
- smap = &wwsmap[row][i];
- touched = wwtouched[row];
- for (; i < w->ww_i.r; i++) {
- if (*smap++ != w->ww_index)
- continue;
- touched |= WWU_TOUCHED;
- if (win[i])
- ns[i].c_w =
- buf[i].c_w ^ win[i] << WWC_MSHIFT;
- else {
- nvis++;
- ns[i] = buf[i];
- }
- }
- wwtouched[row] = touched;
- }
-
- /*
- * Can/Should we use delete character?
- */
- if (tt.tt_delchar != 0 && nvis > (wwncol - col) / 2) {
- register union ww_char *p, *q;
-
- xxdelchar(row, col);
- p = &wwos[row][col];
- q = p + 1;
- for (i = wwncol - col; --i > 0;)
- *p++ = *q++;
- p->c_w = ' ';
- }
-}
diff --git a/usr.bin/window/wwdelete.c b/usr.bin/window/wwdelete.c
deleted file mode 100644
index ef2912b..0000000
--- a/usr.bin/window/wwdelete.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwdelete.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-
-/*
- * Pull w free from the cover list.
- */
-wwdelete(w)
-register struct ww *w;
-{
- register i;
-
- for (i = w->ww_i.t; i < w->ww_i.b; i++) {
- register j;
- register char *smap = wwsmap[i];
- register union ww_char *ns = wwns[i];
- register int nchanged = 0;
-
- for (j = w->ww_i.l; j < w->ww_i.r; j++)
- if (smap[j] == w->ww_index) {
- smap[j] = WWX_NOBODY;
- ns[j].c_w = ' ';
- nchanged++;
- }
- if (nchanged > 0)
- wwtouched[i] |= WWU_TOUCHED;
- }
-
- {
- register struct ww *wp;
-
- for (wp = w->ww_forw; wp != &wwhead; wp = wp->ww_forw)
- wp->ww_order--;
- }
-
- if (w->ww_forw != &wwhead)
- wwdelete1(w->ww_forw,
- w->ww_i.t, w->ww_i.b, w->ww_i.l, w->ww_i.r);
-
- w->ww_back->ww_forw = w->ww_forw;
- w->ww_forw->ww_back = w->ww_back;
- w->ww_forw = w->ww_back = 0;
-}
-
-wwdelete1(w, t, b, l, r)
-register struct ww *w;
-{
- int i;
- int tt, bb, ll, rr;
- char hasglass;
-
-again:
- hasglass = 0;
- tt = MAX(t, w->ww_i.t);
- bb = MIN(b, w->ww_i.b);
- ll = MAX(l, w->ww_i.l);
- rr = MIN(r, w->ww_i.r);
- if (tt >= bb || ll >= rr) {
- if ((w = w->ww_forw) == &wwhead)
- return;
- goto again;
- }
- for (i = tt; i < bb; i++) {
- register j;
- register char *smap = wwsmap[i];
- register union ww_char *ns = wwns[i];
- register char *win = w->ww_win[i];
- register union ww_char *buf = w->ww_buf[i];
- int nvis = w->ww_nvis[i];
- int nchanged = 0;
-
- for (j = ll; j < rr; j++) {
- if (smap[j] != WWX_NOBODY)
- continue;
- if (win[j] & WWM_GLS) {
- hasglass = 1;
- continue;
- }
- smap[j] = w->ww_index;
- ns[j].c_w = buf[j].c_w ^ win[j] << WWC_MSHIFT;
- nchanged++;
- if (win[j] == 0)
- nvis++;
- }
- if (nchanged > 0)
- wwtouched[i] |= WWU_TOUCHED;
- w->ww_nvis[i] = nvis;
- }
- if ((w = w->ww_forw) == &wwhead)
- return;
- if (hasglass)
- goto again;
- if (tt > t)
- wwdelete1(w, t, tt, l, r);
- if (bb < b)
- wwdelete1(w, bb, b, l, r);
- if (ll > l)
- wwdelete1(w, tt, bb, l, ll);
- if (rr < r)
- wwdelete1(w, tt, bb, rr, r);
-}
diff --git a/usr.bin/window/wwdelline.c b/usr.bin/window/wwdelline.c
deleted file mode 100644
index dbeb12c..0000000
--- a/usr.bin/window/wwdelline.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwdelline.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-
-wwdelline(w, row)
-register struct ww *w;
-int row;
-{
- register i;
- register union ww_char **cpp, **cqq;
- register union ww_char *cp;
- int row1, row2;
- char deleted;
- int visible;
-
- /*
- * Scroll first.
- */
- if ((row1 = row) < w->ww_i.t) {
- row1 = w->ww_i.t;
- }
- if ((row2 = w->ww_b.b) > w->ww_i.b) {
- row2 = w->ww_i.b;
- visible = 0;
- } else
- visible = 1;
- deleted = wwscroll1(w, row1, row2, 1, visible);
-
- /*
- * Fix the buffer.
- * But leave clearing the last line for wwclreol().
- */
- cpp = &w->ww_buf[row];
- cqq = cpp + 1;
- cp = *cpp;
- for (i = w->ww_b.b - row; --i > 0;)
- *cpp++ = *cqq++;
- *cpp = cp;
-
- /*
- * Now clear the last line.
- */
- if (visible)
- wwclreol1(w, w->ww_b.b - 1, w->ww_b.l, deleted);
- else {
- cp += w->ww_b.l;
- for (i = w->ww_b.nc; --i >= 0;)
- cp++->c_w = ' ';
- }
-}
diff --git a/usr.bin/window/wwdump.c b/usr.bin/window/wwdump.c
deleted file mode 100644
index 7988492d..0000000
--- a/usr.bin/window/wwdump.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwdump.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <string.h>
-#include "ww.h"
-#include "tt.h"
-
-static char cmap[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-
-wwdumpwin(w)
-register struct ww *w;
-{
- register i, j;
-
- tt.tt_nmodes = 0;
- (*tt.tt_clear)();
- for (i = w->ww_i.t; i < w->ww_i.b; i++) {
- (*tt.tt_move)(i, w->ww_i.l);
- for (j = w->ww_i.l; j < w->ww_i.r; j++)
- (*tt.tt_putc)(w->ww_win[i][j] & WWM_GLS ? 'G' : ' ');
- }
-}
-
-wwdumpnvis(w)
-register struct ww *w;
-{
- register i;
- char buf[20];
-
- tt.tt_nmodes = 0;
- (*tt.tt_clear)();
- for (i = w->ww_i.t; i < w->ww_i.b; i++) {
- (*tt.tt_move)(i, w->ww_i.l);
- (void) sprintf(buf, "%d", w->ww_nvis[i]);
- (*tt.tt_write)(buf, strlen(buf));
- }
-}
-
-wwdumpsmap()
-{
- register i, j;
-
- tt.tt_nmodes = 0;
- (*tt.tt_clear)();
- for (i = 0; i < wwnrow; i++) {
- (*tt.tt_move)(i, 0);
- for (j = 0; j < wwncol; j++)
- (*tt.tt_putc)(cmap[wwsmap[i][j]]);
- }
-}
-
-wwdumpns()
-{
- register i, j;
-
- (*tt.tt_clear)();
- for (i = 0; i < wwnrow; i++) {
- (*tt.tt_move)(i, 0);
- for (j = 0; j < wwncol; j++) {
- tt.tt_nmodes = wwns[i][j].c_m & tt.tt_availmodes;
- (*tt.tt_putc)(wwns[i][j].c_c);
- }
- }
-}
-
-wwdumpos()
-{
- register i, j;
-
- (*tt.tt_clear)();
- for (i = 0; i < wwnrow; i++) {
- (*tt.tt_move)(i, 0);
- for (j = 0; j < wwncol; j++) {
- tt.tt_nmodes = wwos[i][j].c_m & tt.tt_availmodes;
- (*tt.tt_putc)(wwns[i][j].c_c);
- }
- }
-}
diff --git a/usr.bin/window/wwend.c b/usr.bin/window/wwend.c
deleted file mode 100644
index e8d62ab..0000000
--- a/usr.bin/window/wwend.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwend.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <signal.h>
-#include "ww.h"
-#include "tt.h"
-
-/*ARGSUSED*/
-wwend(exit)
-{
- if (tt.tt_checkpoint) {
- (void) alarm(0);
- wwdocheckpoint = 0;
- }
- xxend();
- (void) signal(SIGIO, SIG_DFL);
- (void) wwsettty(0, &wwoldtty);
-#ifdef TERMINFO
- if (exit)
- wwterminfoend();
-#endif
-}
-
-void
-wwquit()
-{
- wwend(1);
- exit(1);
-}
diff --git a/usr.bin/window/wwenviron.c b/usr.bin/window/wwenviron.c
deleted file mode 100644
index f60f7fa..0000000
--- a/usr.bin/window/wwenviron.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwenviron.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#if !defined(OLD_TTY) && !defined(TIOCSCTTY) && !defined(TIOCNOTTY)
-#include <sys/ioctl.h>
-#endif
-#include <paths.h>
-#include <signal.h>
-
-/*
- * Set up the environment of this process to run in window 'wp'.
- */
-wwenviron(wp)
-register struct ww *wp;
-{
- register i;
-#ifndef TIOCSCTTY
- int pgrp = getpid();
-#endif
- char buf[1024];
-
-#ifndef TIOCSCTTY
- if ((i = open(_PATH_TTY, 0)) < 0)
- goto bad;
- if (ioctl(i, TIOCNOTTY, (char *)0) < 0)
- goto bad;
- (void) close(i);
-#endif
- if ((i = wp->ww_socket) < 0) {
- if ((i = open(wp->ww_ttyname, 2)) < 0)
- goto bad;
- if (wwsettty(i, &wwwintty) < 0)
- goto bad;
- if (wwsetttysize(i, wp->ww_w.nr, wp->ww_w.nc) < 0)
- goto bad;
- }
- (void) dup2(i, 0);
- (void) dup2(i, 1);
- (void) dup2(i, 2);
- (void) close(i);
-#ifdef TIOCSCTTY
- (void) setsid();
- (void) ioctl(0, TIOCSCTTY, 0);
-#else
- (void) ioctl(0, TIOCSPGRP, (char *)&pgrp);
- (void) setpgrp(pgrp, pgrp);
-#endif
- /* SIGPIPE is the only one we ignore */
- (void) signal(SIGPIPE, SIG_DFL);
- (void) sigsetmask(0);
- /*
- * Two conditions that make destructive setenv ok:
- * 1. setenv() copies the string,
- * 2. we've already called tgetent which copies the termcap entry.
- */
- (void) sprintf(buf, "%sco#%d:li#%d:%s",
- WWT_TERMCAP, wp->ww_w.nc, wp->ww_w.nr, wwwintermcap);
- (void) setenv("TERMCAP", buf, 1);
- (void) sprintf(buf, "%d", wp->ww_id + 1);
- (void) setenv("WINDOW_ID", buf, 1);
- return 0;
-bad:
- wwerrno = WWE_SYS;
- return -1;
-}
diff --git a/usr.bin/window/wwerror.c b/usr.bin/window/wwerror.c
deleted file mode 100644
index 9282b87..0000000
--- a/usr.bin/window/wwerror.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwerror.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <errno.h>
-#include "ww.h"
-
-char *
-wwerror()
-{
- char *strerror();
-
- switch (wwerrno) {
- case WWE_NOERR:
- return "No error";
- case WWE_SYS:
- return strerror(errno);
- case WWE_NOMEM:
- return "Out of memory";
- case WWE_TOOMANY:
- return "Too many windows";
- case WWE_NOPTY:
- return "Out of pseudo-terminals";
- case WWE_SIZE:
- return "Bad window size";
- case WWE_BADTERM:
- return "Unknown terminal type";
- case WWE_CANTDO:
- return "Can't run window on this terminal";
- default:
- return "Unknown error";
- }
-}
diff --git a/usr.bin/window/wwflush.c b/usr.bin/window/wwflush.c
deleted file mode 100644
index 414cc4b..0000000
--- a/usr.bin/window/wwflush.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwflush.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-#include <signal.h>
-
-wwflush()
-{
- register row, col;
-
- if ((row = wwcursorrow) < 0)
- row = 0;
- else if (row >= wwnrow)
- row = wwnrow - 1;
- if ((col = wwcursorcol) < 0)
- col = 0;
- else if (col >= wwncol)
- col = wwncol - 1;
- xxmove(row, col);
- if (wwdocheckpoint) {
- xxflush(0);
- wwcheckpoint();
- } else
- xxflush(1);
-}
-
-wwcheckpoint()
-{
- int s = sigblock(sigmask(SIGALRM) | sigmask(SIGIO));
-
- tt.tt_ack = 0;
- do {
- (*tt.tt_checkpoint)();
-#ifndef OLD_TTY
- (void) tcdrain(1);
-#endif
- (void) alarm(3);
- for (wwdocheckpoint = 0; !wwdocheckpoint && tt.tt_ack == 0;)
- (void) sigpause(s);
- } while (tt.tt_ack == 0);
- (void) alarm(0);
- wwdocheckpoint = 0;
- if (tt.tt_ack < 0) {
- wwcopyscreen(wwcs, wwos);
- (void) alarm(1);
- wwreset();
- wwupdate();
- wwflush();
- } else {
- wwcopyscreen(wwos, wwcs);
- (void) alarm(3);
- }
- (void) sigsetmask(s);
-}
-
-wwcopyscreen(s1, s2)
- register union ww_char **s1, **s2;
-{
- register i;
- register s = wwncol * sizeof **s1;
-
- for (i = wwnrow; --i >= 0;)
- bcopy((char *) *s1++, (char *) *s2++, s);
-}
-
-void
-wwalarm()
-{
- wwdocheckpoint = 1;
-}
diff --git a/usr.bin/window/wwframe.c b/usr.bin/window/wwframe.c
deleted file mode 100644
index 5cdd777..0000000
--- a/usr.bin/window/wwframe.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwframe.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-
-#define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \
- w1->ww_fmap || w1->ww_order > (w)->ww_order)
-
-wwframe(w, wframe)
-register struct ww *w;
-struct ww *wframe;
-{
- register r, c;
- char a1, a2, a3;
- char b1, b2, b3;
- register char *smap;
- register code;
- register struct ww *w1;
-
- if (w->ww_w.t > 0) {
- r = w->ww_w.t - 1;
- c = w->ww_i.l - 1;
- smap = &wwsmap[r + 1][c + 1];
- a1 = 0;
- a2 = 0;
- b1 = 0;
- b2 = c < 0 || frameok(w, r, c);
-
- for (; c < w->ww_i.r; c++) {
- if (c + 1 >= wwncol) {
- a3 = 1;
- b3 = 1;
- } else {
- a3 = w->ww_index == *smap++;
- b3 = frameok(w, r, c + 1);
- }
- if (b2) {
- code = 0;
- if ((a1 || a2) && b1)
- code |= WWF_L;
- if ((a2 || a3) && b3)
- code |= WWF_R;
- if (code)
- wwframec(wframe, r, c, code|WWF_TOP);
- }
- a1 = a2;
- a2 = a3;
- b1 = b2;
- b2 = b3;
- }
- if ((a1 || a2) && b1 && b2)
- wwframec(wframe, r, c, WWF_L|WWF_TOP);
- }
-
- if (w->ww_w.b < wwnrow) {
- r = w->ww_w.b;
- c = w->ww_i.l - 1;
- smap = &wwsmap[r - 1][c + 1];
- a1 = 0;
- a2 = 0;
- b1 = 0;
- b2 = c < 0 || frameok(w, r, c);
-
- for (; c < w->ww_i.r; c++) {
- if (c + 1 >= wwncol) {
- a3 = 1;
- b3 = 1;
- } else {
- a3 = w->ww_index == *smap++;
- b3 = frameok(w, r, c + 1);
- }
- if (b2) {
- code = 0;
- if ((a1 || a2) && b1)
- code |= WWF_L;
- if ((a2 || a3) && b3)
- code |= WWF_R;
- if (code)
- wwframec(wframe, r, c, code);
- }
- a1 = a2;
- a2 = a3;
- b1 = b2;
- b2 = b3;
- }
- if ((a1 || a2) && b1 && b2)
- wwframec(wframe, r, c, WWF_L);
- }
-
- if (w->ww_w.l > 0) {
- r = w->ww_i.t - 1;
- c = w->ww_w.l - 1;
- a1 = 0;
- a2 = 0;
- b1 = 0;
- b2 = r < 0 || frameok(w, r, c);
-
- for (; r < w->ww_i.b; r++) {
- if (r + 1 >= wwnrow) {
- a3 = 1;
- b3 = 1;
- } else {
- a3 = w->ww_index == wwsmap[r + 1][c + 1];
- b3 = frameok(w, r + 1, c);
- }
- if (b2) {
- code = 0;
- if ((a1 || a2) && b1)
- code |= WWF_U;
- if ((a2 || a3) && b3)
- code |= WWF_D;
- if (code)
- wwframec(wframe, r, c, code);
- }
- a1 = a2;
- a2 = a3;
- b1 = b2;
- b2 = b3;
- }
- if ((a1 || a2) && b1 && b2)
- wwframec(wframe, r, c, WWF_U);
- }
-
- if (w->ww_w.r < wwncol) {
- r = w->ww_i.t - 1;
- c = w->ww_w.r;
- a1 = 0;
- a2 = 0;
- b1 = 0;
- b2 = r < 0 || frameok(w, r, c);
-
- for (; r < w->ww_i.b; r++) {
- if (r + 1 >= wwnrow) {
- a3 = 1;
- b3 = 1;
- } else {
- a3 = w->ww_index == wwsmap[r + 1][c - 1];
- b3 = frameok(w, r + 1, c);
- }
- if (b2) {
- code = 0;
- if ((a1 || a2) && b1)
- code |= WWF_U;
- if ((a2 || a3) && b3)
- code |= WWF_D;
- if (code)
- wwframec(wframe, r, c, code);
- }
- a1 = a2;
- a2 = a3;
- b1 = b2;
- b2 = b3;
- }
- if ((a1 || a2) && b1 && b2)
- wwframec(wframe, r, c, WWF_U);
- }
-}
-
-wwframec(f, r, c, code)
-register struct ww *f;
-register r, c;
-char code;
-{
- char oldcode;
- register char *smap;
-
- if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r)
- return;
-
- smap = &wwsmap[r][c];
-
- {
- register struct ww *w;
-
- w = wwindex[*smap];
- if (w->ww_order > f->ww_order) {
- if (w != &wwnobody && w->ww_win[r][c] == 0)
- w->ww_nvis[r]--;
- *smap = f->ww_index;
- }
- }
-
- if (f->ww_fmap != 0) {
- register char *fmap;
-
- fmap = &f->ww_fmap[r][c];
- oldcode = *fmap;
- *fmap |= code;
- if (code & WWF_TOP)
- *fmap &= ~WWF_LABEL;
- code = *fmap;
- } else
- oldcode = 0;
- {
- register char *win = &f->ww_win[r][c];
-
- if (*win == WWM_GLS && *smap == f->ww_index)
- f->ww_nvis[r]++;
- *win &= ~WWM_GLS;
- }
- if (oldcode != code && (code & WWF_LABEL) == 0) {
- register short frame;
-
- frame = tt.tt_frame[code & WWF_MASK];
- f->ww_buf[r][c].c_w = frame;
- if (wwsmap[r][c] == f->ww_index) {
- wwtouched[r] |= WWU_TOUCHED;
- wwns[r][c].c_w = frame;
- }
- }
-}
diff --git a/usr.bin/window/wwgets.c b/usr.bin/window/wwgets.c
deleted file mode 100644
index 742576c..0000000
--- a/usr.bin/window/wwgets.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwgets.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "char.h"
-
-static void
-rub(unsigned char c, struct ww *w)
-{
- int i;
-
- for (i = isctrl(c) ? strlen(unctrl(c)) : 1; --i >= 0;)
- (void) wwwrite(w, "\b \b", 3);
-}
-
-void
-wwgets(char *buf, int n, struct ww *w)
-{
- register char *p = buf;
- register int c;
- char uc = w->ww_unctrl;
-
- w->ww_unctrl = 0;
- for (;;) {
- wwcurtowin(w);
- while ((c = wwgetc()) < 0)
- wwiomux();
-#ifdef OLD_TTY
- if (c == wwoldtty.ww_sgttyb.sg_erase)
-#else
- if (c == wwoldtty.ww_termios.c_cc[VERASE])
-#endif
- {
- if (p > buf)
- rub(*--p, w);
- } else
-#ifdef OLD_TTY
- if (c == wwoldtty.ww_sgttyb.sg_kill)
-#else
- if (c == wwoldtty.ww_termios.c_cc[VKILL])
-#endif
- {
- while (p > buf)
- rub(*--p, w);
- } else
-#ifdef OLD_TTY
- if (c == wwoldtty.ww_ltchars.t_werasc)
-#else
- if (c == wwoldtty.ww_termios.c_cc[VWERASE])
-#endif
- {
- while (--p >= buf && (*p == ' ' || *p == '\t'))
- rub(*p, w);
- while (p >= buf && *p != ' ' && *p != '\t')
- rub(*p--, w);
- p++;
- } else if (c == '\r' || c == '\n') {
- break;
- } else {
- if (p >= buf + n - 1)
- wwputc(ctrl('g'), w);
- else
- if (isctrl(c))
- wwputs(unctrl(*p++ = c), w);
- else
- wwputc(*p++ = c, w);
- }
- }
- *p = 0;
- w->ww_unctrl = uc;
-}
diff --git a/usr.bin/window/wwinit.c b/usr.bin/window/wwinit.c
deleted file mode 100644
index 4803672..0000000
--- a/usr.bin/window/wwinit.c
+++ /dev/null
@@ -1,429 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwinit.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-#include <signal.h>
-#include <fcntl.h>
-#include <termcap.h>
-#include "char.h"
-
-wwinit()
-{
- register i, j;
- char *kp;
- int s;
-
- wwdtablesize = getdtablesize();
- wwhead.ww_forw = &wwhead;
- wwhead.ww_back = &wwhead;
-
- s = sigblock(sigmask(SIGIO) | sigmask(SIGCHLD) | sigmask(SIGALRM) |
- sigmask(SIGHUP) | sigmask(SIGTERM));
- if (signal(SIGIO, wwrint) == BADSIG ||
- signal(SIGCHLD, wwchild) == BADSIG ||
- signal(SIGHUP, wwquit) == BADSIG ||
- signal(SIGTERM, wwquit) == BADSIG ||
- signal(SIGPIPE, SIG_IGN) == BADSIG) {
- wwerrno = WWE_SYS;
- return -1;
- }
-
- if (wwgettty(0, &wwoldtty) < 0)
- return -1;
- wwwintty = wwoldtty;
-#ifdef OLD_TTY
- wwwintty.ww_sgttyb.sg_flags &= ~XTABS;
- wwnewtty.ww_sgttyb = wwoldtty.ww_sgttyb;
- wwnewtty.ww_sgttyb.sg_erase = -1;
- wwnewtty.ww_sgttyb.sg_kill = -1;
- wwnewtty.ww_sgttyb.sg_flags |= CBREAK;
- wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD);
- wwnewtty.ww_tchars.t_intrc = -1;
- wwnewtty.ww_tchars.t_quitc = -1;
- wwnewtty.ww_tchars.t_startc = -1;
- wwnewtty.ww_tchars.t_stopc = -1;
- wwnewtty.ww_tchars.t_eofc = -1;
- wwnewtty.ww_tchars.t_brkc = -1;
- wwnewtty.ww_ltchars.t_suspc = -1;
- wwnewtty.ww_ltchars.t_dsuspc = -1;
- wwnewtty.ww_ltchars.t_rprntc = -1;
- wwnewtty.ww_ltchars.t_flushc = -1;
- wwnewtty.ww_ltchars.t_werasc = -1;
- wwnewtty.ww_ltchars.t_lnextc = -1;
- wwnewtty.ww_lmode = wwoldtty.ww_lmode | LLITOUT;
- wwnewtty.ww_ldisc = wwoldtty.ww_ldisc;
-#else
-#ifndef OXTABS
-#define OXTABS XTABS
-#endif
-#ifndef _POSIX_VDISABLE
-#define _POSIX_VDISABLE -1
-#endif
- wwwintty.ww_termios.c_oflag &= ~OXTABS;
- wwnewtty.ww_termios = wwoldtty.ww_termios;
- wwnewtty.ww_termios.c_iflag &=
- ~(ISTRIP | INLCR | IGNCR | ICRNL | IXON | IXOFF | IMAXBEL);
- wwnewtty.ww_termios.c_oflag = 0;
- wwnewtty.ww_termios.c_cflag &= ~(CSIZE | PARENB);
- wwnewtty.ww_termios.c_cflag |= CS8;
- wwnewtty.ww_termios.c_lflag = 0;
- for (i = 0; i < NCCS; i++)
- wwnewtty.ww_termios.c_cc[i] = _POSIX_VDISABLE;
- wwnewtty.ww_termios.c_cc[VMIN] = 0;
- wwnewtty.ww_termios.c_cc[VTIME] = 0;
-#endif
- wwnewtty.ww_fflags = wwoldtty.ww_fflags | FASYNC;
- if (wwsettty(0, &wwnewtty) < 0)
- goto bad;
-
- if ((wwterm = getenv("TERM")) == 0) {
- wwerrno = WWE_BADTERM;
- goto bad;
- }
- if (tgetent(wwtermcap, wwterm) != 1) {
- wwerrno = WWE_BADTERM;
- goto bad;
- }
-#ifdef OLD_TTY
- ospeed = wwoldtty.ww_sgttyb.sg_ospeed;
- switch (ospeed) {
- default:
- case B0:
- goto bad;
- case B50:
- wwbaud = 50;
- break;
- case B75:
- wwbaud = 75;
- break;
- case B110:
- wwbaud = 110;
- break;
- case B134:
- wwbaud = 134;
- break;
- case B150:
- wwbaud = 150;
- break;
- case B200:
- wwbaud = 200;
- break;
- case B300:
- wwbaud = 300;
- break;
- case B600:
- wwbaud = 600;
- break;
- case B1200:
- wwbaud = 1200;
- break;
- case B1800:
- wwbaud = 1800;
- break;
- case B2400:
- wwbaud = 2400;
- break;
- case B4800:
- wwbaud = 4800;
- break;
- case B9600:
- wwbaud = 9600;
- break;
-#ifdef B19200
- case B19200:
-#else
- case EXTA:
-#endif
- wwbaud = 19200;
- break;
-#ifdef B38400
- case B38400:
-#else
- case EXTB:
-#endif
- wwbaud = 38400;
- break;
-#ifdef B57600
- case B57600:
- wwbaud = 57600;
- break;
-#endif
-#ifdef B115200
- case B115200:
- wwbaud = 115200;
- break;
-#endif
- }
-#else
- if ((wwbaud = cfgetospeed(&wwoldtty.ww_termios)) == B0)
- goto bad;
-#endif
- wwospeed = ospeed;
-
- if (xxinit() < 0)
- goto bad;
- wwnrow = tt.tt_nrow;
- wwncol = tt.tt_ncol;
- wwavailmodes = tt.tt_availmodes;
- wwwrap = tt.tt_wrap;
-
- if (wwavailmodes & WWM_REV)
- wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK;
- else if (wwavailmodes & WWM_UL)
- wwcursormodes = WWM_UL;
-
- if ((wwib = malloc((unsigned) 512)) == 0)
- goto bad;
- wwibe = wwib + 512;
- wwibq = wwibp = wwib;
-
- if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0)
- goto bad;
- for (i = 0; i < wwnrow; i++)
- for (j = 0; j < wwncol; j++)
- wwsmap[i][j] = WWX_NOBODY;
-
- wwos = (union ww_char **)
- wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
- if (wwos == 0)
- goto bad;
- /* wwos is cleared in wwstart1() */
- wwns = (union ww_char **)
- wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
- if (wwns == 0)
- goto bad;
- for (i = 0; i < wwnrow; i++)
- for (j = 0; j < wwncol; j++)
- wwns[i][j].c_w = ' ';
- if (tt.tt_checkpoint) {
- /* wwcs is also cleared in wwstart1() */
- wwcs = (union ww_char **)
- wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
- if (wwcs == 0)
- goto bad;
- }
-
- wwtouched = malloc((unsigned) wwnrow);
- if (wwtouched == 0) {
- wwerrno = WWE_NOMEM;
- goto bad;
- }
- for (i = 0; i < wwnrow; i++)
- wwtouched[i] = 0;
-
- wwupd = (struct ww_update *) malloc((unsigned) wwnrow * sizeof *wwupd);
- if (wwupd == 0) {
- wwerrno = WWE_NOMEM;
- goto bad;
- }
-
- wwindex[WWX_NOBODY] = &wwnobody;
- wwnobody.ww_order = NWW;
-
- kp = wwwintermcap;
- if (wwavailmodes & WWM_REV)
- wwaddcap1(WWT_REV, &kp);
- if (wwavailmodes & WWM_BLK)
- wwaddcap1(WWT_BLK, &kp);
- if (wwavailmodes & WWM_UL)
- wwaddcap1(WWT_UL, &kp);
- if (wwavailmodes & WWM_GRP)
- wwaddcap1(WWT_GRP, &kp);
- if (wwavailmodes & WWM_DIM)
- wwaddcap1(WWT_DIM, &kp);
- if (wwavailmodes & WWM_USR)
- wwaddcap1(WWT_USR, &kp);
- if (tt.tt_insline && tt.tt_delline || tt.tt_setscroll)
- wwaddcap1(WWT_ALDL, &kp);
- if (tt.tt_inschar)
- wwaddcap1(WWT_IMEI, &kp);
- if (tt.tt_insspace)
- wwaddcap1(WWT_IC, &kp);
- if (tt.tt_delchar)
- wwaddcap1(WWT_DC, &kp);
- wwaddcap("kb", &kp);
- wwaddcap2("ku", &kp);
- wwaddcap2("kd", &kp);
- wwaddcap2("kl", &kp);
- wwaddcap2("kr", &kp);
- wwaddcap("kh", &kp);
- if ((j = tgetnum("kn")) >= 0) {
- char cap[32];
-
- (void) sprintf(kp, "kn#%d:", j);
- for (; *kp; kp++)
- ;
- for (i = 1; i <= j; i++) {
- (void) sprintf(cap, "k%d", i);
- wwaddcap(cap, &kp);
- cap[0] = 'l';
- wwaddcap(cap, &kp);
- }
- }
- /*
- * It's ok to do this here even if setenv() is destructive
- * since tt_init() has already made its own copy of it and
- * wwterm now points to the copy.
- */
- (void) setenv("TERM", WWT_TERM, 1);
-#ifdef TERMINFO
- if (wwterminfoinit() < 0)
- goto bad;
-#endif
-
- if (tt.tt_checkpoint)
- if (signal(SIGALRM, wwalarm) == BADSIG) {
- wwerrno = WWE_SYS;
- goto bad;
- }
- fcntl(0, F_SETOWN, getpid());
- /* catch typeahead before ASYNC was set */
- (void) kill(getpid(), SIGIO);
- wwstart1();
- (void) sigsetmask(s);
- return 0;
-bad:
- /*
- * Don't bother to free storage. We're supposed
- * to exit when wwinit fails anyway.
- */
- (void) signal(SIGIO, SIG_DFL);
- (void) wwsettty(0, &wwoldtty);
- (void) sigsetmask(s);
- return -1;
-}
-
-wwaddcap(cap, kp)
- register char *cap;
- register char **kp;
-{
- char tbuf[512];
- char *tp = tbuf;
- register char *str, *p;
-
- if ((str = tgetstr(cap, &tp)) != 0) {
- while (*(*kp)++ = *cap++)
- ;
- (*kp)[-1] = '=';
- while (*str) {
- for (p = unctrl(*str++); *(*kp)++ = *p++;)
- ;
- (*kp)--;
- }
- *(*kp)++ = ':';
- **kp = 0;
- }
-}
-
-wwaddcap1(cap, kp)
- register char *cap;
- register char **kp;
-{
- while (*(*kp)++ = *cap++)
- ;
- (*kp)--;
-}
-
-wwaddcap2(cap, kp)
- register char *cap;
- register char **kp;
-{
- char tbuf[512];
- char *tp = tbuf;
- register char *str, *p;
-
- if ((str = tgetstr(cap, &tp)) != 0) {
- /* we don't support vt100's application key mode, remap */
- if (str[0] == ctrl('[') && str[1] == 'O')
- str[1] = '[';
- while (*(*kp)++ = *cap++)
- ;
- (*kp)[-1] = '=';
- while (*str) {
- for (p = unctrl(*str++); *(*kp)++ = *p++;)
- ;
- (*kp)--;
- }
- *(*kp)++ = ':';
- **kp = 0;
- }
-}
-
-wwstart()
-{
- register i;
-
- (void) wwsettty(0, &wwnewtty);
- signal(SIGIO, wwrint);
- for (i = 0; i < wwnrow; i++)
- wwtouched[i] = WWU_TOUCHED;
- wwstart1();
-}
-
-wwstart1()
-{
- register i, j;
-
- for (i = 0; i < wwnrow; i++)
- for (j = 0; j < wwncol; j++) {
- wwos[i][j].c_w = ' ';
- if (tt.tt_checkpoint)
- wwcs[i][j].c_w = ' ';
- }
- xxstart();
- if (tt.tt_checkpoint)
- wwdocheckpoint = 1;
-}
-
-/*
- * Reset data structures and terminal from an unknown state.
- * Restoring wwos has been taken care of elsewhere.
- */
-wwreset()
-{
- register i;
-
- xxreset();
- for (i = 0; i < wwnrow; i++)
- wwtouched[i] = WWU_TOUCHED;
-}
diff --git a/usr.bin/window/wwinschar.c b/usr.bin/window/wwinschar.c
deleted file mode 100644
index a9a8c27..0000000
--- a/usr.bin/window/wwinschar.c
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwinschar.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-
-wwinschar(w, row, col, c, m)
-register struct ww *w;
-unsigned char c, m;
-{
- register i;
- int nvis;
- short x = c | m << WWC_MSHIFT;
-
- /*
- * First, shift the line.
- */
- {
- register union ww_char *p, *q;
-
- p = &w->ww_buf[row][w->ww_b.r];
- q = p - 1;
- for (i = w->ww_b.r - col; --i > 0;)
- *--p = *--q;
- q->c_w = x;
- }
-
- /*
- * If can't see it, just return.
- */
- if (row < w->ww_i.t || row >= w->ww_i.b
- || w->ww_i.r <= 0 || w->ww_i.r <= col)
- return;
-
- if (col < w->ww_i.l)
- col = w->ww_i.l;
-
- /*
- * Now find out how much is actually changed, and fix wwns.
- */
- {
- register union ww_char *buf;
- register char *win;
- register union ww_char *ns;
- register char *smap;
- char touched;
-
- nvis = 0;
- smap = &wwsmap[row][col];
- for (i = col; i < w->ww_i.r && *smap++ != w->ww_index; i++)
- ;
- if (i >= w->ww_i.r)
- return;
- col = i;
- buf = w->ww_buf[row];
- win = w->ww_win[row];
- ns = wwns[row];
- smap = &wwsmap[row][i];
- touched = wwtouched[row];
- for (; i < w->ww_i.r; i++) {
- if (*smap++ != w->ww_index)
- continue;
- touched |= WWU_TOUCHED;
- if (win[i])
- ns[i].c_w =
- buf[i].c_w ^ win[i] << WWC_MSHIFT;
- else {
- nvis++;
- ns[i] = buf[i];
- }
- }
- wwtouched[row] = touched;
- }
-
- /*
- * Can/Should we use delete character?
- */
- if ((tt.tt_inschar || tt.tt_insspace) && nvis > (wwncol - col) / 2) {
- register union ww_char *p, *q;
-
- if (tt.tt_inschar)
- xxinschar(row, col, c, m);
- else {
- xxinsspace(row, col);
- x = ' ';
- }
- p = &wwos[row][wwncol];
- q = p - 1;
- for (i = wwncol - col; --i > 0;)
- *--p = *--q;
- q->c_w = x;
- }
-}
diff --git a/usr.bin/window/wwinsline.c b/usr.bin/window/wwinsline.c
deleted file mode 100644
index 60e8b05..0000000
--- a/usr.bin/window/wwinsline.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwinsline.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-
-wwinsline(w, row)
-register struct ww *w;
-int row;
-{
- register i;
- register union ww_char **cpp, **cqq;
- register union ww_char *cp;
- int row1, row2;
- char deleted;
- int visible;
-
- /*
- * Scroll first.
- */
- if ((row1 = row) < w->ww_i.t) {
- row1 = w->ww_i.t;
- visible = 0;
- } else
- visible = 1;
- if ((row2 = w->ww_b.b) > w->ww_i.b) {
- row2 = w->ww_i.b;
- }
- deleted = wwscroll1(w, row1, row2, -1, visible);
-
- /*
- * Fix the buffer.
- * But leave clearing the last line for wwclreol().
- */
- cpp = &w->ww_buf[w->ww_b.b];
- cqq = cpp - 1;
- cp = *cqq;
- for (i = w->ww_b.b - row; --i > 0;)
- *--cpp = *--cqq;
- *cqq = cp;
-
- /*
- * Now clear the last line.
- */
- if (visible)
- wwclreol1(w, row, w->ww_b.l, deleted);
- else {
- cp += w->ww_b.l;
- for (i = w->ww_b.nc; --i >= 0;)
- cp++->c_w = ' ';
- }
-}
diff --git a/usr.bin/window/wwiomux.c b/usr.bin/window/wwiomux.c
deleted file mode 100644
index 7803557..0000000
--- a/usr.bin/window/wwiomux.c
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwiomux.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include <sys/time.h>
-#include <sys/types.h>
-#if !defined(OLD_TTY) && !defined(TIOCPKT_DATA)
-#include <sys/ioctl.h>
-#endif
-#include <fcntl.h>
-
-/*
- * Multiple window output handler.
- * The idea is to copy window outputs to the terminal, via the
- * display package. We try to give wwcurwin highest priority.
- * The only return conditions are when there is keyboard input
- * and when a child process dies, which are serviced by signal
- * catchers (wwrint() and wwchild()).
- * When there's nothing to do, we sleep in a select().
- * This can be done better with interrupt driven io. But that's
- * not supported on ptys, yet.
- * The history of this routine is interesting.
- */
-wwiomux()
-{
- register struct ww *w;
- fd_set imask;
- register n;
- register char *p;
- char c;
- struct timeval tv;
- char noblock = 0;
-
- for (;;) {
- if (wwinterrupt()) {
- wwclrintr();
- return;
- }
-
- FD_ZERO(&imask);
- n = -1;
- for (w = wwhead.ww_forw; w != &wwhead; w = w->ww_forw) {
- if (w->ww_pty < 0)
- continue;
- if (w->ww_obq < w->ww_obe) {
- if (w->ww_pty > n)
- n = w->ww_pty;
- FD_SET(w->ww_pty, &imask);
- }
- if (w->ww_obq > w->ww_obp && !w->ww_stopped)
- noblock = 1;
- }
-
- if (!noblock) {
- if (wwcurwin != 0)
- wwcurtowin(wwcurwin);
- wwupdate();
- wwflush();
- (void) setjmp(wwjmpbuf);
- wwsetjmp = 1;
- if (wwinterrupt()) {
- wwsetjmp = 0;
- wwclrintr();
- return;
- }
- /*
- * Defensive code. If somebody else (for example,
- * wall) clears the ASYNC flag on us, we will block
- * forever. So we need a finite timeout and set
- * the flag again. Anything more clever will probably
- * need even more system calls. (This is a bug
- * in the kernel.)
- * I don't like this one bit.
- */
- (void) fcntl(0, F_SETFL, wwnewtty.ww_fflags);
- tv.tv_sec = 30;
- tv.tv_usec = 0;
- } else {
- tv.tv_sec = 0;
- tv.tv_usec = 10000;
- }
- wwnselect++;
- n = select(n + 1, &imask, (fd_set *)0, (fd_set *)0, &tv);
- wwsetjmp = 0;
- noblock = 0;
-
- if (n < 0)
- wwnselecte++;
- else if (n == 0)
- wwnselectz++;
- else
- for (w = wwhead.ww_forw; w != &wwhead; w = w->ww_forw) {
- if (w->ww_pty < 0 ||
- !FD_ISSET(w->ww_pty, &imask))
- continue;
- wwnwread++;
- p = w->ww_obq;
- if (w->ww_ispty) {
- if (p == w->ww_ob) {
- w->ww_obp++;
- w->ww_obq++;
- } else
- p--;
- c = *p;
- }
- n = read(w->ww_pty, p, w->ww_obe - p);
- if (n < 0) {
- wwnwreade++;
- (void) close(w->ww_pty);
- w->ww_pty = -1;
- } else if (n == 0) {
- wwnwreadz++;
- (void) close(w->ww_pty);
- w->ww_pty = -1;
- } else if (!w->ww_ispty) {
- wwnwreadd++;
- wwnwreadc += n;
- w->ww_obq += n;
- } else if (*p == TIOCPKT_DATA) {
- n--;
- wwnwreadd++;
- wwnwreadc += n;
- w->ww_obq += n;
- } else {
- wwnwreadp++;
- if (*p & TIOCPKT_STOP)
- w->ww_stopped = 1;
- if (*p & TIOCPKT_START)
- w->ww_stopped = 0;
- if (*p & TIOCPKT_FLUSHWRITE) {
- w->ww_stopped = 0;
- w->ww_obq = w->ww_obp =
- w->ww_ob;
- }
- }
- if (w->ww_ispty)
- *p = c;
- }
- /*
- * Try the current window first, if there is output
- * then process it and go back to the top to try again.
- * This can lead to starvation of the other windows,
- * but presumably that what we want.
- * Update will eventually happen when output from wwcurwin
- * dies down.
- */
- if ((w = wwcurwin) != 0 && w->ww_pty >= 0 &&
- w->ww_obq > w->ww_obp && !w->ww_stopped) {
- n = wwwrite(w, w->ww_obp, w->ww_obq - w->ww_obp);
- if ((w->ww_obp += n) == w->ww_obq)
- w->ww_obq = w->ww_obp = w->ww_ob;
- noblock = 1;
- continue;
- }
- for (w = wwhead.ww_forw; w != &wwhead; w = w->ww_forw)
- if (w->ww_pty >= 0 && w->ww_obq > w->ww_obp &&
- !w->ww_stopped) {
- n = wwwrite(w, w->ww_obp,
- w->ww_obq - w->ww_obp);
- if ((w->ww_obp += n) == w->ww_obq)
- w->ww_obq = w->ww_obp = w->ww_ob;
- if (wwinterrupt())
- break;
- }
- }
-}
diff --git a/usr.bin/window/wwlabel.c b/usr.bin/window/wwlabel.c
deleted file mode 100644
index 50ecf85..0000000
--- a/usr.bin/window/wwlabel.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwlabel.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "char.h"
-
-/*
- * Label window w on f,
- * at 1 line above w and 'where' columns from it's left edge.
- * Gross, but it works.
- */
-wwlabel(w, f, where, l, mode)
-struct ww *w;
-struct ww *f;
-char *l;
-{
- int row;
- register j;
- int jj;
- register char *win;
- register union ww_char *buf;
- register union ww_char *ns;
- register char *fmap;
- register char *smap;
- char touched;
- unsigned char *p;
- static unsigned char cbuf[2];
-
- if (f->ww_fmap == 0)
- return;
-
- row = w->ww_w.t - 1;
- if (row < f->ww_i.t || row >= f->ww_i.b)
- return;
- win = f->ww_win[row];
- buf = f->ww_buf[row];
- fmap = f->ww_fmap[row];
- ns = wwns[row];
- smap = wwsmap[row];
- touched = wwtouched[row];
- mode <<= WWC_MSHIFT;
-
- jj = MIN(w->ww_i.r, f->ww_i.r);
- j = w->ww_i.l + where;
- while (j < jj && *l) {
- if (isctrl(*l))
- p = unctrl(*l);
- else {
- cbuf[0] = *l;
- p = cbuf;
- }
- for (l++; j < jj && *p; j++, p++) {
- /* can't label if not already framed */
- if (win[j] & WWM_GLS)
- continue;
- if (smap[j] != f->ww_index)
- buf[j].c_w = mode | *p;
- else {
- ns[j].c_w = (buf[j].c_w = mode | *p)
- ^ win[j] << WWC_MSHIFT;
- touched |= WWU_TOUCHED;
- }
- fmap[j] |= WWF_LABEL;
- }
- }
- wwtouched[row] = touched;
-}
diff --git a/usr.bin/window/wwmisc.c b/usr.bin/window/wwmisc.c
deleted file mode 100644
index 945dca4..0000000
--- a/usr.bin/window/wwmisc.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwmisc.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-#include "char.h"
-
-/*
- * Sufficient but not necessary test for total visibility.
- */
-wwvisible(w)
-register struct ww *w;
-{
- register i;
- register nvis = 0;
-
- for (i = w->ww_i.t; i < w->ww_i.b; i++)
- nvis += w->ww_nvis[i];
- if (w->ww_hascursor
- && w->ww_cur.r >= w->ww_i.t && w->ww_cur.r < w->ww_i.b
- && w->ww_cur.c >= w->ww_i.l && w->ww_cur.c < w->ww_i.r
- && wwsmap[w->ww_cur.r][w->ww_cur.c] == w->ww_index)
- nvis++;
- return nvis == w->ww_i.nr * w->ww_i.nc;
-}
-
-wwbell()
-{
- ttputc(ctrl('g'));
-}
diff --git a/usr.bin/window/wwmove.c b/usr.bin/window/wwmove.c
deleted file mode 100644
index 5db6cae..0000000
--- a/usr.bin/window/wwmove.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwmove.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-
-/*
- * Move a window. Should be unattached.
- */
-wwmove(w, row, col)
-register struct ww *w;
-{
- register dr, dc;
- register i;
-
- dr = row - w->ww_w.t;
- dc = col - w->ww_w.l;
-
- w->ww_w.t += dr;
- w->ww_w.b += dr;
- w->ww_w.l += dc;
- w->ww_w.r += dc;
-
- w->ww_b.t += dr;
- w->ww_b.b += dr;
- w->ww_b.l += dc;
- w->ww_b.r += dc;
-
- w->ww_i.t = MAX(w->ww_w.t, 0);
- w->ww_i.b = MIN(w->ww_w.b, wwnrow);
- w->ww_i.nr = w->ww_i.b - w->ww_i.t;
- w->ww_i.l = MAX(w->ww_w.l, 0);
- w->ww_i.r = MIN(w->ww_w.r, wwncol);
- w->ww_i.nc = w->ww_i.r - w->ww_i.l;
-
- w->ww_cur.r += dr;
- w->ww_cur.c += dc;
-
- w->ww_win -= dr;
- for (i = w->ww_w.t; i < w->ww_w.b; i++)
- w->ww_win[i] -= dc;
- if (w->ww_fmap != 0) {
- w->ww_fmap -= dr;
- for (i = w->ww_w.t; i < w->ww_w.b; i++)
- w->ww_fmap[i] -= dc;
- }
- w->ww_nvis -= dr;
- for (i = w->ww_i.t; i < w->ww_i.b; i++) {
- register j = w->ww_i.l;
- register char *win = &w->ww_win[i][j];
- register char *smap = &wwsmap[i][j];
- int nvis = 0;
-
- for (; j < w->ww_i.r; j++, win++, smap++)
- if (*win == 0 && *smap == w->ww_index)
- nvis++;
- w->ww_nvis[i] = nvis;
- }
- w->ww_buf -= dr;
- for (i = w->ww_b.t; i < w->ww_b.b; i++)
- w->ww_buf[i] -= dc;
-}
diff --git a/usr.bin/window/wwopen.c b/usr.bin/window/wwopen.c
deleted file mode 100644
index c6f906d..0000000
--- a/usr.bin/window/wwopen.c
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwopen.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <fcntl.h>
-#include <stdlib.h>
-
-struct ww *
-wwopen(flags, nrow, ncol, row, col, nline)
-{
- register struct ww *w;
- register i, j;
- char m;
- short nvis;
-
- w = (struct ww *)calloc(sizeof (struct ww), 1);
- if (w == 0) {
- wwerrno = WWE_NOMEM;
- goto bad;
- }
- w->ww_pty = -1;
- w->ww_socket = -1;
-
- for (i = 0; i < NWW && wwindex[i] != 0; i++)
- ;
- if (i >= NWW) {
- wwerrno = WWE_TOOMANY;
- goto bad;
- }
- w->ww_index = i;
-
- if (nline < nrow)
- nline = nrow;
-
- w->ww_w.t = row;
- w->ww_w.b = row + nrow;
- w->ww_w.l = col;
- w->ww_w.r = col + ncol;
- w->ww_w.nr = nrow;
- w->ww_w.nc = ncol;
-
- w->ww_b.t = row;
- w->ww_b.b = row + nline;
- w->ww_b.l = col;
- w->ww_b.r = col + ncol;
- w->ww_b.nr = nline;
- w->ww_b.nc = ncol;
-
- w->ww_i.t = MAX(w->ww_w.t, 0);
- w->ww_i.b = MIN(w->ww_w.b, wwnrow);
- w->ww_i.l = MAX(w->ww_w.l, 0);
- w->ww_i.r = MIN(w->ww_w.r, wwncol);
- w->ww_i.nr = w->ww_i.b - w->ww_i.t;
- w->ww_i.nc = w->ww_i.r - w->ww_i.l;
-
- w->ww_cur.r = w->ww_w.t;
- w->ww_cur.c = w->ww_w.l;
-
- if (flags & WWO_PTY) {
- if (wwgetpty(w) < 0)
- goto bad;
- w->ww_ispty = 1;
- } else if (flags & WWO_SOCKET) {
- int d[2];
- if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, d) < 0) {
- wwerrno = WWE_SYS;
- goto bad;
- }
- (void) fcntl(d[0], F_SETFD, 1);
- (void) fcntl(d[1], F_SETFD, 1);
- w->ww_pty = d[0];
- w->ww_socket = d[1];
- }
- if (flags & (WWO_PTY|WWO_SOCKET)) {
- if ((w->ww_ob = malloc(512)) == 0) {
- wwerrno = WWE_NOMEM;
- goto bad;
- }
- w->ww_obe = w->ww_ob + 512;
- w->ww_obp = w->ww_obq = w->ww_ob;
- }
-
- w->ww_win = wwalloc(w->ww_w.t, w->ww_w.l,
- w->ww_w.nr, w->ww_w.nc, sizeof (char));
- if (w->ww_win == 0)
- goto bad;
- m = 0;
- if (flags & WWO_GLASS)
- m |= WWM_GLS;
- if (flags & WWO_REVERSE)
- if (wwavailmodes & WWM_REV)
- m |= WWM_REV;
- else
- flags &= ~WWO_REVERSE;
- for (i = w->ww_w.t; i < w->ww_w.b; i++)
- for (j = w->ww_w.l; j < w->ww_w.r; j++)
- w->ww_win[i][j] = m;
-
- if (flags & WWO_FRAME) {
- w->ww_fmap = wwalloc(w->ww_w.t, w->ww_w.l,
- w->ww_w.nr, w->ww_w.nc, sizeof (char));
- if (w->ww_fmap == 0)
- goto bad;
- for (i = w->ww_w.t; i < w->ww_w.b; i++)
- for (j = w->ww_w.l; j < w->ww_w.r; j++)
- w->ww_fmap[i][j] = 0;
- }
-
- w->ww_buf = (union ww_char **)
- wwalloc(w->ww_b.t, w->ww_b.l,
- w->ww_b.nr, w->ww_b.nc, sizeof (union ww_char));
- if (w->ww_buf == 0)
- goto bad;
- for (i = w->ww_b.t; i < w->ww_b.b; i++)
- for (j = w->ww_b.l; j < w->ww_b.r; j++)
- w->ww_buf[i][j].c_w = ' ';
-
- w->ww_nvis = (short *)malloc((unsigned) w->ww_w.nr * sizeof (short));
- if (w->ww_nvis == 0) {
- wwerrno = WWE_NOMEM;
- goto bad;
- }
- w->ww_nvis -= w->ww_w.t;
- nvis = m ? 0 : w->ww_w.nc;
- for (i = w->ww_w.t; i < w->ww_w.b; i++)
- w->ww_nvis[i] = nvis;
-
- w->ww_state = WWS_INITIAL;
- w->ww_oflags = flags;
- return wwindex[w->ww_index] = w;
-bad:
- if (w != 0) {
- if (w->ww_win != 0)
- wwfree(w->ww_win, w->ww_w.t);
- if (w->ww_fmap != 0)
- wwfree(w->ww_fmap, w->ww_w.t);
- if (w->ww_buf != 0)
- wwfree((char **)w->ww_buf, w->ww_b.t);
- if (w->ww_nvis != 0)
- free((char *)(w->ww_nvis + w->ww_w.t));
- if (w->ww_ob != 0)
- free(w->ww_ob);
- if (w->ww_pty >= 0)
- (void) close(w->ww_pty);
- if (w->ww_socket >= 0)
- (void) close(w->ww_socket);
- free((char *)w);
- }
- return 0;
-}
diff --git a/usr.bin/window/wwprintf.c b/usr.bin/window/wwprintf.c
deleted file mode 100644
index 1c74981..0000000
--- a/usr.bin/window/wwprintf.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwprintf.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include <stdarg.h>
-
-void
-wwprintf(struct ww *w, char *fmt, ...)
-{
- char buf[1024];
- va_list ap;
-
- va_start(ap, fmt);
- /* buffer can overflow */
- (void) wwwrite(w, buf, vsprintf(buf, fmt, ap));
- va_end(ap);
-}
diff --git a/usr.bin/window/wwpty.c b/usr.bin/window/wwpty.c
deleted file mode 100644
index d26280b..0000000
--- a/usr.bin/window/wwpty.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwpty.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include <fcntl.h>
-#include <stdlib.h>
-#if !defined(OLD_TTY) && !defined(TIOCPKT)
-#include <sys/ioctl.h>
-#endif
-
-wwgetpty(w)
-register struct ww *w;
-{
- char *ttyname;
- int master, slave, on;
-#define PTY "/dev/XtyXX"
-
- on = 1;
- w->ww_pty = -1;
-
- ttyname = malloc(strlen(PTY) + 1);
- if (openpty(&master, &slave, ttyname, NULL, NULL) == 0) {
- w->ww_pty = master;
- (void) strcpy(w->ww_ttyname, ttyname);
- if (ioctl(w->ww_pty, TIOCPKT, (char *)&on) < 0) {
- (void) close(w->ww_pty);
- wwerrno = WWE_SYS;
- } else {
- (void) fcntl(w->ww_pty, F_SETFD, 1);
- free(ttyname);
- return 0;
- }
- }
- free(ttyname);
-
- wwerrno = WWE_NOPTY;
- return -1;
-}
diff --git a/usr.bin/window/wwputc.c b/usr.bin/window/wwputc.c
deleted file mode 100644
index 8d0780e..0000000
--- a/usr.bin/window/wwputc.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwputc.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-
-wwputc(c, w)
-char c;
-struct ww *w;
-{
- (void) wwwrite(w, &c, sizeof c);
-}
diff --git a/usr.bin/window/wwputs.c b/usr.bin/window/wwputs.c
deleted file mode 100644
index dbc2960..0000000
--- a/usr.bin/window/wwputs.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwputs.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-
-wwputs(s, w)
-register char *s;
-struct ww *w;
-{
- register char *p = s;
-
- while (*p++)
- ;
- (void) wwwrite(w, s, p - s - 1);
-}
diff --git a/usr.bin/window/wwredraw.c b/usr.bin/window/wwredraw.c
deleted file mode 100644
index 66ac69c..0000000
--- a/usr.bin/window/wwredraw.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwredraw.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-
-wwredraw()
-{
- register i, j;
- register union ww_char *os;
-
- xxclear();
- for (i = 0; i < wwnrow; i++) {
- wwtouched[i] = WWU_TOUCHED;
- os = wwos[i];
- for (j = wwncol; --j >= 0;)
- (os++)->c_w = ' ';
- }
-}
diff --git a/usr.bin/window/wwredrawwin.c b/usr.bin/window/wwredrawwin.c
deleted file mode 100644
index bdc2f70..0000000
--- a/usr.bin/window/wwredrawwin.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwredrawwin.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-
-wwredrawwin1(w, row1, row2, offset)
-register struct ww *w;
-int row1, row2, offset;
-{
- int row;
- register col;
- register char *smap;
- register union ww_char *buf;
- register char *win;
- register union ww_char *ns;
- int x;
- int nchanged;
-
- for (row = row1; row < row2; row++) {
- col = w->ww_i.l;
- ns = wwns[row];
- smap = &wwsmap[row][col];
- buf = w->ww_buf[row + offset];
- win = w->ww_win[row];
- nchanged = 0;
- for (; col < w->ww_i.r; col++)
- if (*smap++ == w->ww_index &&
- ns[col].c_w !=
- (x = buf[col].c_w ^ win[col] << WWC_MSHIFT)) {
- nchanged++;
- ns[col].c_w = x;
- }
- if (nchanged > 0)
- wwtouched[row] |= WWU_TOUCHED;
- }
-}
diff --git a/usr.bin/window/wwrint.c b/usr.bin/window/wwrint.c
deleted file mode 100644
index 3332273..0000000
--- a/usr.bin/window/wwrint.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwrint.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-#if defined(OLD_TTY) || defined(VMIN_BUG)
-#include <fcntl.h>
-#endif
-
-#include <unistd.h>
-/*
- * Tty input interrupt handler.
- * (1) Read input into buffer (wwib*).
- * (2) Set the interrupt flag if anything is read.
- * Currently, the last is used to get out of the blocking
- * select() in wwiomux().
- * To avoid race conditions, we only modify wwibq in here, except
- * when the buffer is empty; and everywhere else, we only change wwibp.
- * It should be completely safe.
- */
-void
-wwrint()
-{
- register n;
-
- if (wwibp == wwibq)
- wwibp = wwibq = wwib;
- wwnread++;
-#if defined(OLD_TTY) || defined(VMIN_BUG)
- /* we have set c_cc[VMIN] to 0 */
- (void) fcntl(0, F_SETFL, O_NONBLOCK|wwnewtty.ww_fflags);
-#endif
- n = read(STDIN_FILENO, wwibq, wwibe - wwibq);
-#if defined(OLD_TTY) || defined(VMIN_BUG)
- (void) fcntl(0, F_SETFL, wwnewtty.ww_fflags);
-#endif
- if (n > 0) {
- if (tt.tt_rint)
- n = (*tt.tt_rint)(wwibq, n);
- if (n > 0) {
- wwibq += n;
- wwnreadc += n;
- /*
- * Hasten or delay the next checkpoint,
- * as the case may be.
- */
- if (tt.tt_checkpoint && !wwdocheckpoint)
- (void) alarm(1);
- wwsetintr();
- }
- } else if (n == 0)
- wwnreadz++;
- else
- wwnreade++;
-}
diff --git a/usr.bin/window/wwscroll.c b/usr.bin/window/wwscroll.c
deleted file mode 100644
index d0641a1..0000000
--- a/usr.bin/window/wwscroll.c
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwscroll.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-
-wwscroll(w, n)
-register struct ww *w;
-int n;
-{
- register dir;
- register top;
-
- if (n == 0)
- return;
- dir = n < 0 ? -1 : 1;
- top = w->ww_b.t - n;
- if (top > w->ww_w.t)
- top = w->ww_w.t;
- else if (top + w->ww_b.nr < w->ww_w.b)
- top = w->ww_w.b - w->ww_b.nr;
- n = abs(top - w->ww_b.t);
- if (n < w->ww_i.nr) {
- while (--n >= 0) {
- (void) wwscroll1(w, w->ww_i.t, w->ww_i.b, dir, 0);
- w->ww_buf += dir;
- w->ww_b.t -= dir;
- w->ww_b.b -= dir;
- }
- } else {
- w->ww_buf -= top - w->ww_b.t;
- w->ww_b.t = top;
- w->ww_b.b = top + w->ww_b.nr;
- wwredrawwin(w);
- }
-}
-
-/*
- * Scroll one line, between 'row1' and 'row2', in direction 'dir'.
- * Don't adjust ww_scroll.
- * And don't redraw 'leaveit' lines.
- */
-wwscroll1(w, row1, row2, dir, leaveit)
-register struct ww *w;
-int row1, row2, dir;
-int leaveit;
-{
- register i;
- int row1x, row2x;
- int nvis;
- int nvismax;
- int scrolled = 0;
-
- /*
- * See how many lines on the screen are affected.
- * And calculate row1x, row2x, and left at the same time.
- */
- for (i = row1; i < row2 && w->ww_nvis[i] == 0; i++)
- ;
- if (i >= row2) /* can't do any fancy stuff */
- goto out;
- row1x = i;
- for (i = row2 - 1; i >= row1 && w->ww_nvis[i] == 0; i--)
- ;
- if (i <= row1x)
- goto out; /* just one line is easy */
- row2x = i + 1;
-
- /*
- * See how much of this window is visible.
- */
- nvismax = wwncol * (row2x - row1x);
- nvis = 0;
- for (i = row1x; i < row2x; i++)
- nvis += w->ww_nvis[i];
-
- /*
- * If it's a good idea to scroll and the terminal can, then do it.
- */
- if (nvis < nvismax / 2)
- goto no_scroll; /* not worth it */
- if ((dir > 0 ? tt.tt_scroll_down == 0 : tt.tt_scroll_up == 0) ||
- (tt.tt_scroll_top != row1x || tt.tt_scroll_bot != row2x - 1) &&
- tt.tt_setscroll == 0)
- if (tt.tt_delline == 0 || tt.tt_insline == 0)
- goto no_scroll;
- xxscroll(dir, row1x, row2x);
- scrolled = 1;
- /*
- * Fix up the old screen.
- */
- {
- register union ww_char *tmp;
- register union ww_char **cpp, **cqq;
-
- if (dir > 0) {
- cpp = &wwos[row1x];
- cqq = cpp + 1;
- tmp = *cpp;
- for (i = row2x - row1x; --i > 0;)
- *cpp++ = *cqq++;
- *cpp = tmp;
- } else {
- cpp = &wwos[row2x];
- cqq = cpp - 1;
- tmp = *cqq;
- for (i = row2x - row1x; --i > 0;)
- *--cpp = *--cqq;
- *cqq = tmp;
- }
- for (i = wwncol; --i >= 0;)
- tmp++->c_w = ' ';
- }
-
-no_scroll:
- /*
- * Fix the new screen.
- */
- if (nvis == nvismax) {
- /*
- * Can shift whole lines.
- */
- if (dir > 0) {
- {
- register union ww_char *tmp;
- register union ww_char **cpp, **cqq;
-
- cpp = &wwns[row1x];
- cqq = cpp + 1;
- tmp = *cpp;
- for (i = row2x - row1x; --i > 0;)
- *cpp++ = *cqq++;
- *cpp = tmp;
- }
- if (scrolled) {
- register char *p, *q;
-
- p = &wwtouched[row1x];
- q = p + 1;
- for (i = row2x - row1x; --i > 0;)
- *p++ = *q++;
- *p |= WWU_TOUCHED;
- } else {
- register char *p;
-
- p = &wwtouched[row1x];
- for (i = row2x - row1x; --i >= 0;)
- *p++ |= WWU_TOUCHED;
- }
- wwredrawwin1(w, row1, row1x, dir);
- wwredrawwin1(w, row2x - 1, row2 - leaveit, dir);
- } else {
- {
- register union ww_char *tmp;
- register union ww_char **cpp, **cqq;
-
- cpp = &wwns[row2x];
- cqq = cpp - 1;
- tmp = *cqq;
- for (i = row2x - row1x; --i > 0;)
- *--cpp = *--cqq;
- *cqq = tmp;
- }
- if (scrolled) {
- register char *p, *q;
-
- p = &wwtouched[row2x];
- q = p - 1;
- for (i = row2x - row1x; --i > 0;)
- *--p = *--q;
- *q |= WWU_TOUCHED;
- } else {
- register char *p;
-
- p = &wwtouched[row1x];
- for (i = row2x - row1x; --i >= 0;)
- *p++ |= WWU_TOUCHED;
- }
- wwredrawwin1(w, row1 + leaveit, row1x + 1, dir);
- wwredrawwin1(w, row2x, row2, dir);
- }
- } else {
- if (scrolled) {
- register char *p;
-
- p = &wwtouched[row1x];
- for (i = row2x - row1x; --i >= 0;)
- *p++ |= WWU_TOUCHED;
- }
-out:
- if (dir > 0)
- wwredrawwin1(w, row1, row2 - leaveit, dir);
- else
- wwredrawwin1(w, row1 + leaveit, row2, dir);
- }
- return scrolled;
-}
diff --git a/usr.bin/window/wwsize.c b/usr.bin/window/wwsize.c
deleted file mode 100644
index 443d1f3..0000000
--- a/usr.bin/window/wwsize.c
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwsize.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include <stdlib.h>
-#include "ww.h"
-
-/*
- * Resize a window. Should be unattached.
- */
-wwsize(w, nrow, ncol)
-register struct ww *w;
-{
- register i, j;
- int nline;
- union ww_char **buf = 0;
- char **win = 0;
- short *nvis = 0;
- char **fmap = 0;
- char m;
-
- /*
- * First allocate new buffers.
- */
- win = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char));
- if (win == 0)
- goto bad;
- if (w->ww_fmap != 0) {
- fmap = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char));
- if (fmap == 0)
- goto bad;
- }
- if (nrow > w->ww_b.nr || ncol > w->ww_b.nc) {
- nline = MAX(w->ww_b.nr, nrow);
- buf = (union ww_char **) wwalloc(w->ww_b.t, w->ww_b.l,
- nline, ncol, sizeof (union ww_char));
- if (buf == 0)
- goto bad;
- }
- nvis = (short *)malloc((unsigned) nrow * sizeof (short));
- if (nvis == 0) {
- wwerrno = WWE_NOMEM;
- goto bad;
- }
- nvis -= w->ww_w.t;
- /*
- * Copy text buffer.
- */
- if (buf != 0) {
- int b, r;
-
- b = w->ww_b.t + nline;
- r = w->ww_b.l + ncol;
- if (ncol < w->ww_b.nc)
- for (i = w->ww_b.t; i < w->ww_b.b; i++)
- for (j = w->ww_b.l; j < r; j++)
- buf[i][j] = w->ww_buf[i][j];
- else
- for (i = w->ww_b.t; i < w->ww_b.b; i++) {
- for (j = w->ww_b.l; j < w->ww_b.r; j++)
- buf[i][j] = w->ww_buf[i][j];
- for (; j < r; j++)
- buf[i][j].c_w = ' ';
- }
- for (; i < b; i++)
- for (j = w->ww_b.l; j < r; j++)
- buf[i][j].c_w = ' ';
- }
- /*
- * Now free the old stuff.
- */
- wwfree((char **)w->ww_win, w->ww_w.t);
- w->ww_win = win;
- if (buf != 0) {
- wwfree((char **)w->ww_buf, w->ww_b.t);
- w->ww_buf = buf;
- }
- if (w->ww_fmap != 0) {
- wwfree((char **)w->ww_fmap, w->ww_w.t);
- w->ww_fmap = fmap;
- }
- free((char *)(w->ww_nvis + w->ww_w.t));
- w->ww_nvis = nvis;
- /*
- * Set new sizes.
- */
- /* window */
- w->ww_w.b = w->ww_w.t + nrow;
- w->ww_w.r = w->ww_w.l + ncol;
- w->ww_w.nr = nrow;
- w->ww_w.nc = ncol;
- /* text buffer */
- if (buf != 0) {
- w->ww_b.b = w->ww_b.t + nline;
- w->ww_b.r = w->ww_b.l + ncol;
- w->ww_b.nr = nline;
- w->ww_b.nc = ncol;
- }
- /* scroll */
- if ((i = w->ww_b.b - w->ww_w.b) < 0 ||
- (i = w->ww_cur.r - w->ww_w.b + 1) > 0) {
- w->ww_buf += i;
- w->ww_b.t -= i;
- w->ww_b.b -= i;
- w->ww_cur.r -= i;
- }
- /* interior */
- w->ww_i.b = MIN(w->ww_w.b, wwnrow);
- w->ww_i.r = MIN(w->ww_w.r, wwncol);
- w->ww_i.nr = w->ww_i.b - w->ww_i.t;
- w->ww_i.nc = w->ww_i.r - w->ww_i.l;
- /*
- * Initialize new buffers.
- */
- /* window */
- m = 0;
- if (w->ww_oflags & WWO_GLASS)
- m |= WWM_GLS;
- if (w->ww_oflags & WWO_REVERSE)
- m |= WWM_REV;
- for (i = w->ww_w.t; i < w->ww_w.b; i++)
- for (j = w->ww_w.l; j < w->ww_w.r; j++)
- w->ww_win[i][j] = m;
- /* frame map */
- if (fmap != 0)
- for (i = w->ww_w.t; i < w->ww_w.b; i++)
- for (j = w->ww_w.l; j < w->ww_w.r; j++)
- w->ww_fmap[i][j] = 0;
- /* visibility */
- j = m ? 0 : w->ww_w.nc;
- for (i = w->ww_w.t; i < w->ww_w.b; i++)
- w->ww_nvis[i] = j;
- /*
- * Put cursor back.
- */
- if (w->ww_hascursor) {
- w->ww_hascursor = 0;
- wwcursor(w, 1);
- }
- /*
- * Fool with pty.
- */
- if (w->ww_ispty && w->ww_pty >= 0)
- (void) wwsetttysize(w->ww_pty, nrow, ncol);
- return 0;
-bad:
- if (win != 0)
- wwfree(win, w->ww_w.t);
- if (fmap != 0)
- wwfree(fmap, w->ww_w.t);
- if (buf != 0)
- wwfree((char **)buf, w->ww_b.t);
- if (nvis != 0)
- free((char *)(nvis + w->ww_w.t));
- return -1;
-}
diff --git a/usr.bin/window/wwspawn.c b/usr.bin/window/wwspawn.c
deleted file mode 100644
index 477f920..0000000
--- a/usr.bin/window/wwspawn.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwspawn.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include <signal.h>
-
-/*
- * There is a dead lock with vfork and closing of pseudo-ports.
- * So we have to be sneaky about error reporting.
- */
-wwspawn(wp, file, argv)
-register struct ww *wp;
-char *file;
-char **argv;
-{
- int pid;
- int ret;
- char erred = 0;
- int s;
-
- s = sigblock(sigmask(SIGCHLD));
- switch (pid = vfork()) {
- case -1:
- wwerrno = WWE_SYS;
- ret = -1;
- break;
- case 0:
- if (wwenviron(wp) >= 0)
- execvp(file, argv);
- erred = 1;
- _exit(1);
- default:
- if (erred) {
- wwerrno = WWE_SYS;
- ret = -1;
- } else {
- wp->ww_pid = pid;
- wp->ww_state = WWS_HASPROC;
- ret = pid;
- }
- }
- (void) sigsetmask(s);
- if (wp->ww_socket >= 0) {
- (void) close(wp->ww_socket);
- wp->ww_socket = -1;
- }
- return ret;
-}
diff --git a/usr.bin/window/wwsuspend.c b/usr.bin/window/wwsuspend.c
deleted file mode 100644
index ad3db5a..0000000
--- a/usr.bin/window/wwsuspend.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwsuspend.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-#include <signal.h>
-
-wwsuspend()
-{
- sig_t oldsig;
-
- oldsig = signal(SIGTSTP, SIG_IGN);
- wwend(0);
- (void) signal(SIGTSTP, SIG_DFL);
- (void) kill(0, SIGTSTP);
- (void) signal(SIGTSTP, SIG_IGN);
- wwstart();
- (void) signal(SIGTSTP, oldsig);
-}
diff --git a/usr.bin/window/wwterminfo.c b/usr.bin/window/wwterminfo.c
deleted file mode 100644
index 0be6590..0000000
--- a/usr.bin/window/wwterminfo.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 1982, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwterminfo.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#ifdef TERMINFO
-
-#include "ww.h"
-#include <stdio.h>
-#include <paths.h>
-#include "local.h"
-
-/*
- * Terminfo support
- *
- * Written by Brian Buhrow
- *
- * Subsequently modified by Edward Wang
- */
-
-/*
- * Initialize the working terminfo directory
- */
-wwterminfoinit()
-{
- FILE *fp;
- char buf[2048];
-
- /* make the directory */
- (void) sprintf(wwterminfopath, "%swwinXXXXXX", _PATH_TMP);
- if (mkdtemp(wwterminfopath) < 0 ||
- chmod(wwterminfopath, 00755) < 0) {
- wwerrno = WWE_SYS;
- return -1;
- }
- (void) setenv("TERMINFO", wwterminfopath, 1);
- /* make a termcap entry and turn it into terminfo */
- (void) sprintf(buf, "%s/cap", wwterminfopath);
- if ((fp = fopen(buf, "w")) == NULL) {
- wwerrno = WWE_SYS;
- return -1;
- }
- (void) fprintf(fp, "%sco#%d:li#%d:%s\n",
- WWT_TERMCAP, wwncol, wwnrow, wwwintermcap);
- (void) fclose(fp);
- (void) sprintf(buf,
- "cd %s; %s cap >info 2>" _PATH_DEVNULL "; %s info >" _PATH_DEVNULL " 2>&1",
- wwterminfopath, _PATH_CAPTOINFO, _PATH_TIC);
- (void) system(buf);
- return 0;
-}
-
-/*
- * Delete the working terminfo directory at shutdown
- */
-wwterminfoend()
-{
- char *args[4];
- args[0] = _PATH_RM;
- args[1] = "-rf";
- args[2] = wwterminfopath;
- args[3] = NULL;
- switch (vfork()) {
- case -1:
- /* can't really do (or say) anything about errors */
- return -1;
- case 0:
- execv(args[0], args);
- _exit(0);
- default:
- wait(NULL);
- return 0;
- }
-}
-
-#endif /* TERMINFO */
diff --git a/usr.bin/window/wwtty.c b/usr.bin/window/wwtty.c
deleted file mode 100644
index 94de13c..0000000
--- a/usr.bin/window/wwtty.c
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwtty.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include <sys/types.h>
-#include <fcntl.h>
-#if !defined(OLD_TTY) && !defined(TIOCGWINSZ)
-#include <sys/ioctl.h>
-#endif
-
-wwgettty(d, t)
-register struct ww_tty *t;
-{
-#ifdef OLD_TTY
- if (ioctl(d, TIOCGETP, (char *)&t->ww_sgttyb) < 0)
- goto bad;
- if (ioctl(d, TIOCGETC, (char *)&t->ww_tchars) < 0)
- goto bad;
- if (ioctl(d, TIOCGLTC, (char *)&t->ww_ltchars) < 0)
- goto bad;
- if (ioctl(d, TIOCLGET, (char *)&t->ww_lmode) < 0)
- goto bad;
- if (ioctl(d, TIOCGETD, (char *)&t->ww_ldisc) < 0)
- goto bad;
-#else
- if (tcgetattr(d, &t->ww_termios) < 0)
- goto bad;
-#endif
- if ((t->ww_fflags = fcntl(d, F_GETFL, 0)) < 0)
- goto bad;
- return 0;
-bad:
- wwerrno = WWE_SYS;
- return -1;
-}
-
-/*
- * Set the modes of tty 'd' to 't'
- * 'o' is the current modes. We set the line discipline only if
- * it changes, to avoid unnecessary flushing of typeahead.
- */
-wwsettty(d, t)
-register struct ww_tty *t;
-{
-#ifdef OLD_TTY
- int i;
-
- /* XXX, for buggy tty drivers that don't wait for output to drain */
- while (ioctl(d, TIOCOUTQ, &i) >= 0 && i > 0)
- usleep(100000);
- if (ioctl(d, TIOCSETN, (char *)&t->ww_sgttyb) < 0)
- goto bad;
- if (ioctl(d, TIOCSETC, (char *)&t->ww_tchars) < 0)
- goto bad;
- if (ioctl(d, TIOCSLTC, (char *)&t->ww_ltchars) < 0)
- goto bad;
- if (ioctl(d, TIOCLSET, (char *)&t->ww_lmode) < 0)
- goto bad;
- if (ioctl(d, TIOCGETD, (char *)&i) < 0)
- goto bad;
- if (t->ww_ldisc != i &&
- ioctl(d, TIOCSETD, (char *)&t->ww_ldisc) < 0)
- goto bad;
-#else
-#ifdef sun
- /* XXX, for buggy tty drivers that don't wait for output to drain */
- (void) tcdrain(d);
-#endif
- if (tcsetattr(d, TCSADRAIN, &t->ww_termios) < 0)
- goto bad;
-#endif
- if (fcntl(d, F_SETFL, t->ww_fflags) < 0)
- goto bad;
- return 0;
-bad:
- wwerrno = WWE_SYS;
- return -1;
-}
-
-/*
- * The ttysize and stop-start routines must also work
- * on the control side of pseudoterminals.
- */
-
-wwgetttysize(d, r, c)
- int *r, *c;
-{
- struct winsize winsize;
-
- if (ioctl(d, TIOCGWINSZ, (char *)&winsize) < 0) {
- wwerrno = WWE_SYS;
- return -1;
- }
- if (winsize.ws_row != 0)
- *r = winsize.ws_row;
- if (winsize.ws_col != 0)
- *c = winsize.ws_col;
- return 0;
-}
-
-wwsetttysize(d, r, c)
-{
- struct winsize winsize;
-
- winsize.ws_row = r;
- winsize.ws_col = c;
- winsize.ws_xpixel = winsize.ws_ypixel = 0;
- if (ioctl(d, TIOCSWINSZ, (char *)&winsize) < 0) {
- wwerrno = WWE_SYS;
- return -1;
- }
- return 0;
-}
-
-wwstoptty(d)
-{
-#if !defined(OLD_TTY) && defined(TCOOFF)
- /* not guaranteed to work on the pty side */
- if (tcflow(d, TCOOFF) < 0)
-#else
- if (ioctl(d, TIOCSTOP, (char *)0) < 0)
-#endif
- {
- wwerrno = WWE_SYS;
- return -1;
- }
- return 0;
-}
-
-wwstarttty(d)
-{
-#if !defined(OLD_TTY) && defined(TCOON)
- /* not guaranteed to work on the pty side */
- if (tcflow(d, TCOON) < 0)
-#else
- if (ioctl(d, TIOCSTART, (char *)0) < 0)
-#endif
- {
- wwerrno = WWE_SYS;
- return -1;
- }
- return 0;
-}
diff --git a/usr.bin/window/wwunframe.c b/usr.bin/window/wwunframe.c
deleted file mode 100644
index 7fd6507..0000000
--- a/usr.bin/window/wwunframe.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwunframe.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-
-wwunframe(w)
-register struct ww *w;
-{
- int i;
-
- for (i = w->ww_i.t; i < w->ww_i.b; i++) {
- register j;
- register char *win = w->ww_win[i];
- register char *fmap = w->ww_fmap ? w->ww_fmap[i] : 0;
- register char *smap = wwsmap[i];
- register union ww_char *ns = wwns[i];
- int nchanged = 0;
-
- for (j = w->ww_i.l; j < w->ww_i.r; j++) {
- if (win[j] & WWM_GLS)
- continue;
- win[j] |= WWM_GLS;
- if (fmap != 0)
- fmap[j] = 0;
- if (smap[j] == w->ww_index) {
- smap[j] = WWX_NOBODY;
- ns[j].c_w = ' ';
- nchanged++;
- }
- }
- if (nchanged > 0)
- wwtouched[i] |= WWU_TOUCHED;
- w->ww_nvis[i] = 0;
- }
-
- if (w->ww_forw != &wwhead)
- wwdelete1(w->ww_forw,
- w->ww_i.t, w->ww_i.b, w->ww_i.l, w->ww_i.r);
-}
diff --git a/usr.bin/window/wwupdate.c b/usr.bin/window/wwupdate.c
deleted file mode 100644
index 3c1ade7..0000000
--- a/usr.bin/window/wwupdate.c
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwupdate.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-
-wwupdate1(top, bot)
-{
- int i;
- register j;
- char *touched;
- struct ww_update *upd;
- char check_clreos = 0;
- int scan_top, scan_bot;
-
- wwnupdate++;
- {
- register char *t1 = wwtouched + top, *t2 = wwtouched + bot;
- register n;
-
- while (!*t1++)
- if (t1 == t2)
- return;
- while (!*--t2)
- ;
- scan_top = top = t1 - wwtouched - 1;
- scan_bot = bot = t2 - wwtouched + 1;
- if (scan_bot - scan_top > 1 &&
- (tt.tt_clreos != 0 || tt.tt_clear != 0)) {
- int st = tt.tt_clreos != 0 ? scan_top : 0;
-
- /*
- * t1 is one past the first touched row,
- * t2 is on the last touched row.
- */
- for (t1--, n = 1; t1 < t2;)
- if (*t1++)
- n++;
- /*
- * If we can't clreos then we try for clearing
- * the whole screen.
- */
- if (check_clreos = n * 10 > (wwnrow - st) * 9) {
- scan_top = st;
- scan_bot = wwnrow;
- }
- }
- }
- if (tt.tt_clreol == 0 && !check_clreos)
- goto simple;
- for (i = scan_top, touched = &wwtouched[i], upd = &wwupd[i];
- i < scan_bot;
- i++, touched++, upd++) {
- register gain = 0;
- register best_gain = 0;
- register best_col;
- register union ww_char *ns, *os;
-
- if (wwinterrupt())
- return;
- if (!check_clreos && !*touched)
- continue;
- wwnupdscan++;
- j = wwncol;
- ns = &wwns[i][j];
- os = &wwos[i][j];
- while (--j >= 0) {
- /*
- * The cost of clearing is:
- * ncol - nblank + X
- * The cost of straight update is, more or less:
- * ncol - nsame
- * We clear if nblank - nsame > X
- * X is the clreol overhead.
- * So we make gain = nblank - nsame.
- */
- if ((--ns)->c_w == (--os)->c_w)
- gain--;
- else
- best_gain--;
- if (ns->c_w == ' ')
- gain++;
- if (gain > best_gain) {
- best_col = j;
- best_gain = gain;
- }
- }
- upd->best_gain = best_gain;
- upd->best_col = best_col;
- upd->gain = gain;
- }
- if (check_clreos) {
- register struct ww_update *u;
- register gain = 0;
- register best_gain = 0;
- int best_row;
- register simple_gain = 0;
- char didit = 0;
-
- /*
- * gain is the advantage of clearing all the lines.
- * best_gain is the advantage of clearing to eos
- * at best_row and u->best_col.
- * simple_gain is the advantage of using only clreol.
- * We use g > best_gain because u->best_col can be
- * undefined when u->best_gain is 0 so we can't use it.
- */
- for (j = scan_bot - 1, u = wwupd + j; j >= top; j--, u--) {
- register g = gain + u->best_gain;
-
- if (g > best_gain) {
- best_gain = g;
- best_row = j;
- }
- gain += u->gain;
- if (tt.tt_clreol != 0 && u->best_gain > 4)
- simple_gain += u->best_gain - 4;
- }
- if (tt.tt_clreos == 0) {
- if (gain > simple_gain && gain > 4) {
- xxclear();
- i = top = scan_top;
- bot = scan_bot;
- j = 0;
- didit = 1;
- }
- } else
- if (best_gain > simple_gain && best_gain > 4) {
- i = best_row;
- xxclreos(i, j = wwupd[i].best_col);
- bot = scan_bot;
- didit = 1;
- }
- if (didit) {
- wwnupdclreos++;
- wwnupdclreosline += wwnrow - i;
- u = wwupd + i;
- while (i < scan_bot) {
- register union ww_char *os = &wwos[i][j];
-
- for (j = wwncol - j; --j >= 0;)
- os++->c_w = ' ';
- wwtouched[i++] |= WWU_TOUCHED;
- u++->best_gain = 0;
- j = 0;
- }
- } else
- wwnupdclreosmiss++;
- }
-simple:
- for (i = top, touched = &wwtouched[i], upd = &wwupd[i]; i < bot;
- i++, touched++, upd++) {
- register union ww_char *os, *ns;
- char didit;
-
- if (!*touched)
- continue;
- *touched = 0;
- wwnupdline++;
- didit = 0;
- if (tt.tt_clreol != 0 && upd->best_gain > 4) {
- wwnupdclreol++;
- xxclreol(i, j = upd->best_col);
- for (os = &wwos[i][j], j = wwncol - j; --j >= 0;)
- os++->c_w = ' ';
- didit = 1;
- }
- ns = wwns[i];
- os = wwos[i];
- for (j = 0; j < wwncol;) {
- register char *p, *q;
- char m;
- int c;
- register n;
- char buf[512]; /* > wwncol */
- union ww_char lastc;
-
- for (; j++ < wwncol && ns++->c_w == os++->c_w;)
- ;
- if (j > wwncol)
- break;
- p = buf;
- m = ns[-1].c_m;
- c = j - 1;
- os[-1] = ns[-1];
- *p++ = ns[-1].c_c;
- n = 5;
- q = p;
- while (j < wwncol && ns->c_m == m) {
- *p++ = ns->c_c;
- if (ns->c_w == os->c_w) {
- if (--n <= 0)
- break;
- os++;
- ns++;
- } else {
- n = 5;
- q = p;
- lastc = *os;
- *os++ = *ns++;
- }
- j++;
- }
- n = q - buf;
- if (!wwwrap || i != wwnrow - 1 || c + n != wwncol)
- xxwrite(i, c, buf, n, m);
- else if (tt.tt_inschar || tt.tt_insspace) {
- if (n > 1) {
- q[-2] = q[-1];
- n--;
- } else
- c--;
- xxwrite(i, c, buf, n, m);
- c += n - 1;
- if (tt.tt_inschar)
- xxinschar(i, c, ns[-2].c_c,
- ns[-2].c_m);
- else {
- xxinsspace(i, c);
- xxwrite(i, c, &ns[-2].c_c, 1,
- ns[-2].c_m);
- }
- } else {
- if (--n)
- xxwrite(i, c, buf, n, m);
- os[-1] = lastc;
- *touched = WWU_TOUCHED;
- }
- didit = 1;
- }
- if (!didit)
- wwnupdmiss++;
- }
-}
diff --git a/usr.bin/window/wwwrite.c b/usr.bin/window/wwwrite.c
deleted file mode 100644
index 29b3b73..0000000
--- a/usr.bin/window/wwwrite.c
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)wwwrite.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "tt.h"
-#include "char.h"
-
-#define UPDATE() \
- if (!w->ww_noupdate && w->ww_cur.r >= 0 && w->ww_cur.r < wwnrow && \
- wwtouched[w->ww_cur.r]) \
- wwupdate1(w->ww_cur.r, w->ww_cur.r + 1)
-
-/*
- * To support control character expansion, we save the old
- * p and q values in r and s, and point p at the beginning
- * of the expanded string, and q at some safe place beyond it
- * (p + 10). At strategic points in the loops, we check
- * for (r && !*p) and restore the saved values back into
- * p and q. Essentially, we implement a stack of depth 2,
- * to avoid recursion, which might be a better idea.
- */
-wwwrite(w, p, n)
-register struct ww *w;
-register unsigned char *p;
-int n;
-{
- char hascursor;
- unsigned char *savep = p;
- unsigned char *q = p + n;
- char *r = 0;
- char *s;
-
-#ifdef lint
- s = 0; /* define it before possible use */
-#endif
- if (hascursor = w->ww_hascursor)
- wwcursor(w, 0);
- while (p < q && !w->ww_stopped && (!wwinterrupt() || w->ww_nointr)) {
- if (r && !*p) {
- p = r;
- q = s;
- r = 0;
- continue;
- }
- if (w->ww_wstate == 0 &&
- (isprt(*p) || w->ww_unctrl && isunctrl(*p))) {
- register i;
- register union ww_char *bp;
- int col, col1;
-
- if (w->ww_insert) { /* this is very slow */
- if (*p == '\t') {
- p++;
- w->ww_cur.c += 8 -
- (w->ww_cur.c - w->ww_w.l & 7);
- goto chklf;
- }
- if (!isprt(*p)) {
- r = p + 1;
- s = q;
- p = unctrl(*p);
- q = p + 10;
- }
- wwinschar(w, w->ww_cur.r, w->ww_cur.c,
- *p++, w->ww_modes);
- goto right;
- }
-
- bp = &w->ww_buf[w->ww_cur.r][w->ww_cur.c];
- i = w->ww_cur.c;
- while (i < w->ww_w.r && p < q)
- if (!*p && r) {
- p = r;
- q = s;
- r = 0;
- } else if (*p == '\t') {
- register tmp = 8 - (i - w->ww_w.l & 7);
- p++;
- i += tmp;
- bp += tmp;
- } else if (isprt(*p)) {
- bp++->c_w = *p++
- | w->ww_modes << WWC_MSHIFT;
- i++;
- } else if (w->ww_unctrl && isunctrl(*p)) {
- r = p + 1;
- s = q;
- p = unctrl(*p);
- q = p + 10;
- } else
- break;
- col = MAX(w->ww_cur.c, w->ww_i.l);
- col1 = MIN(i, w->ww_i.r);
- w->ww_cur.c = i;
- if (w->ww_cur.r >= w->ww_i.t
- && w->ww_cur.r < w->ww_i.b) {
- register union ww_char *ns = wwns[w->ww_cur.r];
- register char *smap = &wwsmap[w->ww_cur.r][col];
- register char *win = w->ww_win[w->ww_cur.r];
- int nchanged = 0;
-
- bp = w->ww_buf[w->ww_cur.r];
- for (i = col; i < col1; i++)
- if (*smap++ == w->ww_index) {
- nchanged++;
- ns[i].c_w = bp[i].c_w
- ^ win[i] << WWC_MSHIFT;
- }
- if (nchanged > 0)
- wwtouched[w->ww_cur.r] |= WWU_TOUCHED;
- }
- chklf:
- if (w->ww_cur.c >= w->ww_w.r)
- goto crlf;
- } else switch (w->ww_wstate) {
- case 0:
- switch (*p++) {
- case '\n':
- if (w->ww_mapnl)
- crlf:
- w->ww_cur.c = w->ww_w.l;
- lf:
- UPDATE();
- if (++w->ww_cur.r >= w->ww_w.b) {
- w->ww_cur.r = w->ww_w.b - 1;
- if (w->ww_w.b < w->ww_b.b) {
- (void) wwscroll1(w, w->ww_i.t,
- w->ww_i.b, 1, 0);
- w->ww_buf++;
- w->ww_b.t--;
- w->ww_b.b--;
- } else
- wwdelline(w, w->ww_b.t);
- }
- break;
- case '\b':
- if (--w->ww_cur.c < w->ww_w.l) {
- w->ww_cur.c = w->ww_w.r - 1;
- goto up;
- }
- break;
- case '\r':
- w->ww_cur.c = w->ww_w.l;
- break;
- case ctrl('g'):
- ttputc(ctrl('g'));
- break;
- case ctrl('['):
- w->ww_wstate = 1;
- break;
- }
- break;
- case 1:
- w->ww_wstate = 0;
- switch (*p++) {
- case '@':
- w->ww_insert = 1;
- break;
- case 'A':
- up:
- UPDATE();
- if (--w->ww_cur.r < w->ww_w.t) {
- w->ww_cur.r = w->ww_w.t;
- if (w->ww_w.t > w->ww_b.t) {
- (void) wwscroll1(w, w->ww_i.t,
- w->ww_i.b, -1, 0);
- w->ww_buf--;
- w->ww_b.t++;
- w->ww_b.b++;
- } else
- wwinsline(w, w->ww_b.t);
- }
- break;
- case 'B':
- goto lf;
- case 'C':
- right:
- w->ww_cur.c++;
- goto chklf;
- case 'E':
- w->ww_buf -= w->ww_w.t - w->ww_b.t;
- w->ww_b.t = w->ww_w.t;
- w->ww_b.b = w->ww_b.t + w->ww_b.nr;
- w->ww_cur.r = w->ww_w.t;
- w->ww_cur.c = w->ww_w.l;
- wwclreos(w, w->ww_w.t, w->ww_w.l);
- break;
- case 'H':
- UPDATE();
- w->ww_cur.r = w->ww_w.t;
- w->ww_cur.c = w->ww_w.l;
- break;
- case 'J':
- wwclreos(w, w->ww_cur.r, w->ww_cur.c);
- break;
- case 'K':
- wwclreol(w, w->ww_cur.r, w->ww_cur.c);
- break;
- case 'L':
- UPDATE();
- wwinsline(w, w->ww_cur.r);
- break;
- case 'M':
- wwdelline(w, w->ww_cur.r);
- break;
- case 'N':
- wwdelchar(w, w->ww_cur.r, w->ww_cur.c);
- break;
- case 'O':
- w->ww_insert = 0;
- break;
- case 'P':
- wwinschar(w, w->ww_cur.r, w->ww_cur.c, ' ', 0);
- break;
- case 'X':
- wwupdate();
- break;
- case 'Y':
- UPDATE();
- w->ww_wstate = 2;
- break;
- case 'Z':
- wwupdate();
- xxflush(0);
- break;
- case 's':
- w->ww_wstate = 4;
- break;
- case 'r':
- w->ww_wstate = 5;
- break;
- }
- break;
- case 2:
- w->ww_cur.r = w->ww_w.t +
- (unsigned)(*p++ - ' ') % w->ww_w.nr;
- w->ww_wstate = 3;
- break;
- case 3:
- w->ww_cur.c = w->ww_w.l +
- (unsigned)(*p++ - ' ') % w->ww_w.nc;
- w->ww_wstate = 0;
- break;
- case 4:
- w->ww_modes |= *p++ & wwavailmodes;
- w->ww_wstate = 0;
- break;
- case 5:
- w->ww_modes &= ~*p++;
- w->ww_wstate = 0;
- break;
- }
- }
- if (hascursor)
- wwcursor(w, 1);
- wwnwwr++;
- wwnwwra += n;
- n = p - savep;
- wwnwwrc += n;
- return n;
-}
diff --git a/usr.bin/window/xx.c b/usr.bin/window/xx.c
deleted file mode 100644
index 82dcb33..0000000
--- a/usr.bin/window/xx.c
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)xx.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "xx.h"
-#include "tt.h"
-#include <stdlib.h>
-
-xxinit()
-{
- if (ttinit() < 0)
- return -1;
- xxbufsize = tt.tt_nrow * tt.tt_ncol * 2;
- /* ccinit may choose to change xxbufsize */
- if (tt.tt_ntoken > 0 && ccinit() < 0)
- return -1;
- xxbuf = malloc((unsigned) xxbufsize * sizeof *xxbuf);
- if (xxbuf == 0) {
- wwerrno = WWE_NOMEM;
- return -1;
- }
- xxbufp = xxbuf;
- xxbufe = xxbuf + xxbufsize;
- return 0;
-}
-
-xxstart()
-{
- (*tt.tt_start)();
- if (tt.tt_ntoken > 0)
- ccstart();
- xxreset1(); /* might be a restart */
-}
-
-xxreset()
-{
- if (tt.tt_ntoken > 0)
- ccreset();
- xxreset1();
- (*tt.tt_reset)();
-}
-
-xxreset1()
-{
- register struct xx *xp, *xq;
-
- for (xp = xx_head; xp != 0; xp = xq) {
- xq = xp->link;
- xxfree(xp);
- }
- xx_tail = xx_head = 0;
- xxbufp = xxbuf;
-}
-
-xxend()
-{
- if (tt.tt_scroll_top != 0 || tt.tt_scroll_bot != tt.tt_nrow - 1)
- /* tt.tt_setscroll is known to be defined */
- (*tt.tt_setscroll)(0, tt.tt_nrow - 1);
- if (tt.tt_modes)
- (*tt.tt_setmodes)(0);
- if (tt.tt_scroll_down)
- (*tt.tt_scroll_down)(1);
- (*tt.tt_move)(tt.tt_nrow - 1, 0);
- if (tt.tt_ntoken > 0)
- ccend();
- (*tt.tt_end)();
- ttflush();
-}
-
-struct xx *
-xxalloc()
-{
- register struct xx *xp;
-
- if (xxbufp > xxbufe)
- abort();
- if ((xp = xx_freelist) == 0)
- /* XXX can't deal with failure */
- xp = (struct xx *) malloc((unsigned) sizeof *xp);
- else
- xx_freelist = xp->link;
- if (xx_head == 0)
- xx_head = xp;
- else
- xx_tail->link = xp;
- xx_tail = xp;
- xp->link = 0;
- return xp;
-}
-
-xxfree(xp)
- register struct xx *xp;
-{
- xp->link = xx_freelist;
- xx_freelist = xp;
-}
-
-xxmove(row, col)
-{
- register struct xx *xp = xx_tail;
-
- if (xp == 0 || xp->cmd != xc_move) {
- xp = xxalloc();
- xp->cmd = xc_move;
- }
- xp->arg0 = row;
- xp->arg1 = col;
-}
-
-xxscroll(dir, top, bot)
-{
- register struct xx *xp = xx_tail;
-
- if (xp != 0 && xp->cmd == xc_scroll &&
- xp->arg1 == top && xp->arg2 == bot &&
- (xp->arg0 < 0 && dir < 0 || xp->arg0 > 0 && dir > 0)) {
- xp->arg0 += dir;
- return;
- }
- xp = xxalloc();
- xp->cmd = xc_scroll;
- xp->arg0 = dir;
- xp->arg1 = top;
- xp->arg2 = bot;
-}
-
-xxinschar(row, col, c, m)
-{
- register struct xx *xp;
-
- xp = xxalloc();
- xp->cmd = xc_inschar;
- xp->arg0 = row;
- xp->arg1 = col;
- xp->arg2 = c;
- xp->arg3 = m;
-}
-
-xxinsspace(row, col)
-{
- register struct xx *xp = xx_tail;
-
- if (xp != 0 && xp->cmd == xc_insspace && xp->arg0 == row &&
- col >= xp->arg1 && col <= xp->arg1 + xp->arg2) {
- xp->arg2++;
- return;
- }
- xp = xxalloc();
- xp->cmd = xc_insspace;
- xp->arg0 = row;
- xp->arg1 = col;
- xp->arg2 = 1;
-}
-
-xxdelchar(row, col)
-{
- register struct xx *xp = xx_tail;
-
- if (xp != 0 && xp->cmd == xc_delchar &&
- xp->arg0 == row && xp->arg1 == col) {
- xp->arg2++;
- return;
- }
- xp = xxalloc();
- xp->cmd = xc_delchar;
- xp->arg0 = row;
- xp->arg1 = col;
- xp->arg2 = 1;
-}
-
-xxclear()
-{
- register struct xx *xp;
-
- xxreset1();
- xp = xxalloc();
- xp->cmd = xc_clear;
-}
-
-xxclreos(row, col)
-{
- register struct xx *xp = xxalloc();
-
- xp->cmd = xc_clreos;
- xp->arg0 = row;
- xp->arg1 = col;
-}
-
-xxclreol(row, col)
-{
- register struct xx *xp = xxalloc();
-
- xp->cmd = xc_clreol;
- xp->arg0 = row;
- xp->arg1 = col;
-}
-
-xxwrite(row, col, p, n, m)
- char *p;
-{
- register struct xx *xp;
-
- if (xxbufp + n + 1 > xxbufe)
- xxflush(0);
- xp = xxalloc();
- xp->cmd = xc_write;
- xp->arg0 = row;
- xp->arg1 = col;
- xp->arg2 = n;
- xp->arg3 = m;
- xp->buf = xxbufp;
- bcopy(p, xxbufp, n);
- xxbufp += n;
- *xxbufp++ = char_sep;
-}
diff --git a/usr.bin/window/xx.h b/usr.bin/window/xx.h
deleted file mode 100644
index e49b85e..0000000
--- a/usr.bin/window/xx.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)xx.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD$
- */
-
-struct xx {
- enum { xc_move, xc_scroll, xc_inschar, xc_insspace, xc_delchar,
- xc_clear, xc_clreos, xc_clreol, xc_write } cmd;
- int arg0;
- int arg1;
- int arg2;
- int arg3;
- char *buf;
- struct xx *link;
-};
-
-struct xx *xxalloc();
-
-struct xx *xx_head, *xx_tail;
-struct xx *xx_freelist;
-
-char *xxbuf, *xxbufp, *xxbufe;
-int xxbufsize;
-
-#define char_sep '\0'
diff --git a/usr.bin/window/xxflush.c b/usr.bin/window/xxflush.c
deleted file mode 100644
index a6f9bed..0000000
--- a/usr.bin/window/xxflush.c
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Edward Wang at The University of California, Berkeley.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)xxflush.c 8.1 (Berkeley) 6/6/93";
-static char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-#include "ww.h"
-#include "xx.h"
-#include "tt.h"
-
-xxflush(intr)
- register intr;
-{
- register struct xx *xp, *xq;
-
- for (xp = xx_head; xp != 0 && !(intr && wwinterrupt()); xp = xq) {
- switch (xp->cmd) {
- case xc_move:
- if (xp->link == 0)
- (*tt.tt_move)(xp->arg0, xp->arg1);
- break;
- case xc_scroll:
- xxflush_scroll(xp);
- break;
- case xc_inschar:
- (*tt.tt_move)(xp->arg0, xp->arg1);
- tt.tt_nmodes = xp->arg3;
- (*tt.tt_inschar)(xp->arg2);
- break;
- case xc_insspace:
- (*tt.tt_move)(xp->arg0, xp->arg1);
- (*tt.tt_insspace)(xp->arg2);
- break;
- case xc_delchar:
- (*tt.tt_move)(xp->arg0, xp->arg1);
- (*tt.tt_delchar)(xp->arg2);
- break;
- case xc_clear:
- (*tt.tt_clear)();
- break;
- case xc_clreos:
- (*tt.tt_move)(xp->arg0, xp->arg1);
- (*tt.tt_clreos)();
- break;
- case xc_clreol:
- (*tt.tt_move)(xp->arg0, xp->arg1);
- (*tt.tt_clreol)();
- break;
- case xc_write:
- (*tt.tt_move)(xp->arg0, xp->arg1);
- tt.tt_nmodes = xp->arg3;
- (*tt.tt_write)(xp->buf, xp->arg2);
- break;
- }
- xq = xp->link;
- xxfree(xp);
- }
- if ((xx_head = xp) == 0) {
- xx_tail = 0;
- xxbufp = xxbuf;
- }
- ttflush();
-}
-
-xxflush_scroll(xp)
- register struct xx *xp;
-{
- register struct xx *xq;
-
- top:
- if (xp->arg0 == 0)
- return;
- /*
- * We handle retain (da and db) by putting the burden on scrolling up,
- * which is the less common operation. It must ensure that
- * text is not pushed below the screen, so scrolling down doesn't
- * have to worry about it.
- *
- * Try scrolling region (or scrolling the whole screen) first.
- * Can we assume "sr" doesn't push text below the screen
- * so we don't have to worry about retain below?
- * What about scrolling down with a newline? It probably does
- * push text above (with da). Scrolling up would then have
- * to take care of that.
- * It's easy to be fool proof, but that slows things down.
- * The current solution is to disallow tt_scroll_up if da or db is true
- * but cs (scrolling region) is not. Again, we sacrifice scrolling
- * up in favor of scrolling down. The idea is having scrolling regions
- * probably means we can scroll (even the whole screen) with impunity.
- * This lets us work efficiently on simple terminals (use newline
- * on the bottom to scroll), on any terminal without retain, and
- * on vt100 style scrolling regions (I think).
- */
- if (xp->arg0 > 0) {
- if ((xq = xp->link) != 0 && xq->cmd == xc_scroll &&
- xp->arg2 == xq->arg2 && xq->arg0 < 0) {
- if (xp->arg1 < xq->arg1) {
- if (xp->arg2 - xp->arg0 <= xq->arg1) {
- xq->arg0 = xp->arg0;
- xq->arg1 = xp->arg1;
- xq->arg2 = xp->arg2;
- return;
- }
- xp->arg2 = xq->arg1 + xp->arg0;
- xq->arg0 += xp->arg0;
- xq->arg1 = xp->arg2;
- if (xq->arg0 > 0)
- xq->arg1 -= xq->arg0;
- goto top;
- } else {
- if (xp->arg1 - xq->arg0 >= xp->arg2)
- return;
- xq->arg2 = xp->arg1 - xq->arg0;
- xp->arg0 += xq->arg0;
- xp->arg1 = xq->arg2;
- if (xp->arg0 < 0)
- xp->arg1 += xp->arg0;
- goto top;
- }
- }
- if (xp->arg0 > xp->arg2 - xp->arg1)
- xp->arg0 = xp->arg2 - xp->arg1;
- if (tt.tt_scroll_down) {
- if (tt.tt_scroll_top != xp->arg1 ||
- tt.tt_scroll_bot != xp->arg2 - 1) {
- if (tt.tt_setscroll == 0)
- goto down;
- (*tt.tt_setscroll)(xp->arg1, xp->arg2 - 1);
- }
- tt.tt_scroll_down(xp->arg0);
- } else {
- down:
- (*tt.tt_move)(xp->arg1, 0);
- (*tt.tt_delline)(xp->arg0);
- if (xp->arg2 < tt.tt_nrow) {
- (*tt.tt_move)(xp->arg2 - xp->arg0, 0);
- (*tt.tt_insline)(xp->arg0);
- }
- }
- } else {
- xp->arg0 = - xp->arg0;
- if (xp->arg0 > xp->arg2 - xp->arg1)
- xp->arg0 = xp->arg2 - xp->arg1;
- if (tt.tt_scroll_up) {
- if (tt.tt_scroll_top != xp->arg1 ||
- tt.tt_scroll_bot != xp->arg2 - 1) {
- if (tt.tt_setscroll == 0)
- goto up;
- (*tt.tt_setscroll)(xp->arg1, xp->arg2 - 1);
- }
- tt.tt_scroll_up(xp->arg0);
- } else {
- up:
- if (tt.tt_retain || xp->arg2 != tt.tt_nrow) {
- (*tt.tt_move)(xp->arg2 - xp->arg0, 0);
- (*tt.tt_delline)(xp->arg0);
- }
- (*tt.tt_move)(xp->arg1, 0);
- (*tt.tt_insline)(xp->arg0);
- }
- }
-}
diff --git a/usr.bin/write/Makefile b/usr.bin/write/Makefile
deleted file mode 100644
index 8e6454b..0000000
--- a/usr.bin/write/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-
-PROG= write
-BINMODE=2555
-BINGRP= tty
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/write/write.1 b/usr.bin/write/write.1
deleted file mode 100644
index e7b24a1..0000000
--- a/usr.bin/write/write.1
+++ /dev/null
@@ -1,117 +0,0 @@
-.\" Copyright (c) 1989, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Jef Poskanzer and Craig Leres of the Lawrence Berkeley Laboratory.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)write.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd July 17, 2004
-.Dt WRITE 1
-.Os
-.Sh NAME
-.Nm write
-.Nd send a message to another user
-.Sh SYNOPSIS
-.Nm
-.Ar user
-.Op Ar tty
-.Sh DESCRIPTION
-The
-.Nm
-utility allows you to communicate with other users, by copying lines from
-your terminal to theirs.
-.Pp
-When you run the
-.Nm
-command, the user you are writing to gets a message of the form:
-.Pp
-.Dl Message from yourname@yourhost on yourtty at hh:mm ...
-.Pp
-Any further lines you enter will be copied to the specified user's
-terminal.
-If the other user wants to reply, they must run
-.Nm
-as well.
-.Pp
-When you are done, type an end-of-file or interrupt character.
-The other user will see the message
-.Ql EOF
-indicating that the
-conversation is over.
-.Pp
-You can prevent people (other than the super-user) from writing to you
-with the
-.Xr mesg 1
-command.
-.Pp
-If the user you want to write to is logged in on more than one terminal,
-you can specify which terminal to write to by specifying the terminal
-name as the second operand to the
-.Nm
-command.
-Alternatively, you can let
-.Nm
-select one of the terminals \- it will pick the one with the shortest
-idle time.
-This is so that if the user is logged in at work and also dialed up from
-home, the message will go to the right place.
-.Pp
-The traditional protocol for writing to someone is that the string
-.Ql \-o ,
-either at the end of a line or on a line by itself, means that it is the
-other person's turn to talk.
-The string
-.Ql oo
-means that the person believes the conversation to be
-over.
-.Sh SEE ALSO
-.Xr mesg 1 ,
-.Xr talk 1 ,
-.Xr wall 1 ,
-.Xr who 1
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v1 .
-.Sh BUGS
-The sender's
-.Ev LC_CTYPE
-setting is used to determine which characters are safe to write to a
-terminal, not the receiver's (which
-.Nm
-has no way of knowing).
-.Pp
-The
-.Nm
-utility does not recognize multibyte characters.
diff --git a/usr.bin/write/write.c b/usr.bin/write/write.c
deleted file mode 100644
index 878c8c1..0000000
--- a/usr.bin/write/write.c
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jef Poskanzer and Craig Leres of the Lawrence Berkeley Laboratory.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1989, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)write.c 8.1 (Berkeley) 6/6/93";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/signal.h>
-#include <sys/stat.h>
-#include <sys/file.h>
-#include <sys/time.h>
-#include <ctype.h>
-#include <err.h>
-#include <locale.h>
-#include <paths.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <utmp.h>
-
-void done(int);
-void do_write(char *, char *, uid_t);
-static void usage(void);
-int term_chk(char *, int *, time_t *, int);
-void wr_fputs(unsigned char *s);
-void search_utmp(char *, char *, char *, uid_t);
-int utmp_chk(char *, char *);
-
-int
-main(int argc, char **argv)
-{
- time_t atime;
- uid_t myuid;
- int msgsok, myttyfd;
- char tty[MAXPATHLEN], *mytty;
-
- (void)setlocale(LC_CTYPE, "");
-
- while (getopt(argc, argv, "") != -1)
- usage();
- argc -= optind;
- argv += optind;
-
- /* check that sender has write enabled */
- if (isatty(fileno(stdin)))
- myttyfd = fileno(stdin);
- else if (isatty(fileno(stdout)))
- myttyfd = fileno(stdout);
- else if (isatty(fileno(stderr)))
- myttyfd = fileno(stderr);
- else
- errx(1, "can't find your tty");
- if (!(mytty = ttyname(myttyfd)))
- errx(1, "can't find your tty's name");
- if (!strncmp(mytty, _PATH_DEV, strlen(_PATH_DEV)))
- mytty += strlen(_PATH_DEV);
- if (term_chk(mytty, &msgsok, &atime, 1))
- exit(1);
- if (!msgsok)
- errx(1, "you have write permission turned off");
-
- myuid = getuid();
-
- /* check args */
- switch (argc) {
- case 1:
- search_utmp(argv[0], tty, mytty, myuid);
- do_write(tty, mytty, myuid);
- break;
- case 2:
- if (!strncmp(argv[1], _PATH_DEV, strlen(_PATH_DEV)))
- argv[1] += strlen(_PATH_DEV);
- if (utmp_chk(argv[0], argv[1]))
- errx(1, "%s is not logged in on %s", argv[0], argv[1]);
- if (term_chk(argv[1], &msgsok, &atime, 1))
- exit(1);
- if (myuid && !msgsok)
- errx(1, "%s has messages disabled on %s", argv[0], argv[1]);
- do_write(argv[1], mytty, myuid);
- break;
- default:
- usage();
- }
- done(0);
- return (0);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "usage: write user [tty]\n");
- exit(1);
-}
-
-/*
- * utmp_chk - checks that the given user is actually logged in on
- * the given tty
- */
-int
-utmp_chk(char *user, char *tty)
-{
- struct utmp u;
- int ufd;
-
- if ((ufd = open(_PATH_UTMP, O_RDONLY)) < 0)
- return(0); /* ignore error, shouldn't happen anyway */
-
- while (read(ufd, (char *) &u, sizeof(u)) == sizeof(u))
- if (strncmp(user, u.ut_name, sizeof(u.ut_name)) == 0 &&
- strncmp(tty, u.ut_line, sizeof(u.ut_line)) == 0) {
- (void)close(ufd);
- return(0);
- }
-
- (void)close(ufd);
- return(1);
-}
-
-/*
- * search_utmp - search utmp for the "best" terminal to write to
- *
- * Ignores terminals with messages disabled, and of the rest, returns
- * the one with the most recent access time. Returns as value the number
- * of the user's terminals with messages enabled, or -1 if the user is
- * not logged in at all.
- *
- * Special case for writing to yourself - ignore the terminal you're
- * writing from, unless that's the only terminal with messages enabled.
- */
-void
-search_utmp(char *user, char *tty, char *mytty, uid_t myuid)
-{
- struct utmp u;
- time_t bestatime, atime;
- int ufd, nloggedttys, nttys, msgsok, user_is_me;
- char atty[UT_LINESIZE + 1];
-
- if ((ufd = open(_PATH_UTMP, O_RDONLY)) < 0)
- err(1, "utmp");
-
- nloggedttys = nttys = 0;
- bestatime = 0;
- user_is_me = 0;
- while (read(ufd, (char *) &u, sizeof(u)) == sizeof(u))
- if (strncmp(user, u.ut_name, sizeof(u.ut_name)) == 0) {
- ++nloggedttys;
- (void)strncpy(atty, u.ut_line, UT_LINESIZE);
- atty[UT_LINESIZE] = '\0';
- if (term_chk(atty, &msgsok, &atime, 0))
- continue; /* bad term? skip */
- if (myuid && !msgsok)
- continue; /* skip ttys with msgs off */
- if (strcmp(atty, mytty) == 0) {
- user_is_me = 1;
- continue; /* don't write to yourself */
- }
- ++nttys;
- if (atime > bestatime) {
- bestatime = atime;
- (void)strcpy(tty, atty);
- }
- }
-
- (void)close(ufd);
- if (nloggedttys == 0)
- errx(1, "%s is not logged in", user);
- if (nttys == 0) {
- if (user_is_me) { /* ok, so write to yourself! */
- (void)strcpy(tty, mytty);
- return;
- }
- errx(1, "%s has messages disabled", user);
- } else if (nttys > 1) {
- warnx("%s is logged in more than once; writing to %s", user, tty);
- }
-}
-
-/*
- * term_chk - check that a terminal exists, and get the message bit
- * and the access time
- */
-int
-term_chk(char *tty, int *msgsokP, time_t *atimeP, int showerror)
-{
- struct stat s;
- char path[MAXPATHLEN];
-
- (void)snprintf(path, sizeof(path), "%s%s", _PATH_DEV, tty);
- if (stat(path, &s) < 0) {
- if (showerror)
- warn("%s", path);
- return(1);
- }
- *msgsokP = (s.st_mode & (S_IWRITE >> 3)) != 0; /* group write bit */
- *atimeP = s.st_atime;
- return(0);
-}
-
-/*
- * do_write - actually make the connection
- */
-void
-do_write(char *tty, char *mytty, uid_t myuid)
-{
- const char *login;
- char *nows;
- struct passwd *pwd;
- time_t now;
- char path[MAXPATHLEN], host[MAXHOSTNAMELEN], line[512];
-
- /* Determine our login name before we reopen() stdout */
- if ((login = getlogin()) == NULL) {
- if ((pwd = getpwuid(myuid)))
- login = pwd->pw_name;
- else
- login = "???";
- }
-
- (void)snprintf(path, sizeof(path), "%s%s", _PATH_DEV, tty);
- if ((freopen(path, "w", stdout)) == NULL)
- err(1, "%s", path);
-
- (void)signal(SIGINT, done);
- (void)signal(SIGHUP, done);
-
- /* print greeting */
- if (gethostname(host, sizeof(host)) < 0)
- (void)strcpy(host, "???");
- now = time((time_t *)NULL);
- nows = ctime(&now);
- nows[16] = '\0';
- (void)printf("\r\n\007\007\007Message from %s@%s on %s at %s ...\r\n",
- login, host, mytty, nows + 11);
-
- while (fgets(line, sizeof(line), stdin) != NULL)
- wr_fputs(line);
-}
-
-/*
- * done - cleanup and exit
- */
-void
-done(int n __unused)
-{
- (void)printf("EOF\r\n");
- exit(0);
-}
-
-/*
- * wr_fputs - like fputs(), but makes control characters visible and
- * turns \n into \r\n
- */
-void
-wr_fputs(unsigned char *s)
-{
-
-#define PUTC(c) if (putchar(c) == EOF) err(1, NULL);
-
- for (; *s != '\0'; ++s) {
- if (*s == '\n') {
- PUTC('\r');
- } else if (((*s & 0x80) && *s < 0xA0) ||
- /* disable upper controls */
- (!isprint(*s) && !isspace(*s) &&
- *s != '\a' && *s != '\b')
- ) {
- if (*s & 0x80) {
- *s &= ~0x80;
- PUTC('M');
- PUTC('-');
- }
- if (iscntrl(*s)) {
- *s ^= 0x40;
- PUTC('^');
- }
- }
- PUTC(*s);
- }
- return;
-#undef PUTC
-}
diff --git a/usr.bin/xargs/Makefile b/usr.bin/xargs/Makefile
deleted file mode 100644
index 16162a1..0000000
--- a/usr.bin/xargs/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= xargs
-SRCS= xargs.c strnsubst.c
-WARNS?= 6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/xargs/pathnames.h b/usr.bin/xargs/pathnames.h
deleted file mode 100644
index 3f05b3d..0000000
--- a/usr.bin/xargs/pathnames.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)pathnames.h 8.1 (Berkeley) 6/6/93
- */
-
-#define _PATH_ECHO "/bin/echo"
diff --git a/usr.bin/xargs/strnsubst.c b/usr.bin/xargs/strnsubst.c
deleted file mode 100644
index 33366b6..0000000
--- a/usr.bin/xargs/strnsubst.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/* $xMach: strnsubst.c,v 1.3 2002/02/23 02:10:24 jmallett Exp $ */
-
-/*
- * Copyright (c) 2002 J. Mallett. All rights reserved.
- * You may do whatever you want with this file as long as
- * the above copyright and this notice remain intact, along
- * with the following statement:
- * For the man who taught me vi, and who got too old, too young.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-void strnsubst(char **, const char *, const char *, size_t);
-
-/*
- * Replaces str with a string consisting of str with match replaced with
- * replstr as many times as can be done before the constructed string is
- * maxsize bytes large. It does not free the string pointed to by str, it
- * is up to the calling program to be sure that the original contents of
- * str as well as the new contents are handled in an appropriate manner.
- * If replstr is NULL, then that internally is changed to a nil-string, so
- * that we can still pretend to do somewhat meaningful substitution.
- * No value is returned.
- */
-void
-strnsubst(char **str, const char *match, const char *replstr, size_t maxsize)
-{
- char *s1, *s2, *this;
-
- s1 = *str;
- if (s1 == NULL)
- return;
- /*
- * If maxsize is 0 then set it to to the length of s1, because we have
- * to duplicate s1. XXX we maybe should double-check whether the match
- * appears in s1. If it doesn't, then we also have to set the length
- * to the length of s1, to avoid modifying the argument. It may make
- * sense to check if maxsize is <= strlen(s1), because in that case we
- * want to return the unmodified string, too.
- */
- if (maxsize == 0) {
- match = NULL;
- maxsize = strlen(s1) + 1;
- }
- s2 = calloc(maxsize, 1);
- if (s2 == NULL)
- err(1, "calloc");
-
- if (replstr == NULL)
- replstr = "";
-
- if (match == NULL || replstr == NULL || maxsize == strlen(s1)) {
- strlcpy(s2, s1, maxsize);
- goto done;
- }
-
- for (;;) {
- this = strstr(s1, match);
- if (this == NULL)
- break;
- if ((strlen(s2) + strlen(s1) + strlen(replstr) -
- strlen(match) + 1) > maxsize) {
- strlcat(s2, s1, maxsize);
- goto done;
- }
- strncat(s2, s1, (uintptr_t)this - (uintptr_t)s1);
- strcat(s2, replstr);
- s1 = this + strlen(match);
- }
- strcat(s2, s1);
-done:
- *str = s2;
- return;
-}
-
-#ifdef TEST
-#include <stdio.h>
-
-int
-main(void)
-{
- char *x, *y, *z, *za;
-
- x = "{}%$";
- strnsubst(&x, "%$", "{} enpury!", 255);
- y = x;
- strnsubst(&y, "}{}", "ybir", 255);
- z = y;
- strnsubst(&z, "{", "v ", 255);
- za = z;
- strnsubst(&z, NULL, za, 255);
- if (strcmp(z, "v ybir enpury!") == 0)
- printf("strnsubst() seems to work!\n");
- else
- printf("strnsubst() is broken.\n");
- printf("%s\n", z);
- free(x);
- free(y);
- free(z);
- free(za);
- return 0;
-}
-#endif
diff --git a/usr.bin/xargs/xargs.1 b/usr.bin/xargs/xargs.1
deleted file mode 100644
index 3c2c10b..0000000
--- a/usr.bin/xargs/xargs.1
+++ /dev/null
@@ -1,365 +0,0 @@
-.\" Copyright (c) 1990, 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" John B. Roll Jr. and the Institute of Electrical and Electronics
-.\" Engineers, Inc.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)xargs.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\" $xMach: xargs.1,v 1.2 2002/02/23 05:23:37 tim Exp $
-.\"
-.Dd January 26, 2008
-.Dt XARGS 1
-.Os
-.Sh NAME
-.Nm xargs
-.Nd "construct argument list(s) and execute utility"
-.Sh SYNOPSIS
-.Nm
-.Op Fl 0oprt
-.Op Fl E Ar eofstr
-.Oo
-.Fl I Ar replstr
-.Op Fl R Ar replacements
-.Op Fl S Ar replsize
-.Oc
-.Op Fl J Ar replstr
-.Op Fl L Ar number
-.Oo
-.Fl n Ar number
-.Op Fl x
-.Oc
-.Op Fl P Ar maxprocs
-.Op Fl s Ar size
-.Op Ar utility Op Ar argument ...
-.Sh DESCRIPTION
-The
-.Nm
-utility reads space, tab, newline and end-of-file delimited strings
-from the standard input and executes
-.Ar utility
-with the strings as
-arguments.
-.Pp
-Any arguments specified on the command line are given to
-.Ar utility
-upon each invocation, followed by some number of the arguments read
-from the standard input of
-.Nm .
-This is repeated until standard input is exhausted.
-.Pp
-Spaces, tabs and newlines may be embedded in arguments using single
-(``\ '\ '')
-or double (``"'') quotes or backslashes (``\e'').
-Single quotes escape all non-single quote characters, excluding newlines,
-up to the matching single quote.
-Double quotes escape all non-double quote characters, excluding newlines,
-up to the matching double quote.
-Any single character, including newlines, may be escaped by a backslash.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl 0
-Change
-.Nm
-to expect NUL
-(``\\0'')
-characters as separators, instead of spaces and newlines.
-This is expected to be used in concert with the
-.Fl print0
-function in
-.Xr find 1 .
-.It Fl E Ar eofstr
-Use
-.Ar eofstr
-as a logical EOF marker.
-.It Fl I Ar replstr
-Execute
-.Ar utility
-for each input line, replacing one or more occurrences of
-.Ar replstr
-in up to
-.Ar replacements
-(or 5 if no
-.Fl R
-flag is specified) arguments to
-.Ar utility
-with the entire line of input.
-The resulting arguments, after replacement is done, will not be allowed to grow
-beyond
-.Ar replsize
-(or 255 if no
-.Fl S
-flag is specified)
-bytes; this is implemented by concatenating as much of the argument
-containing
-.Ar replstr
-as possible, to the constructed arguments to
-.Ar utility ,
-up to
-.Ar replsize
-bytes.
-The size limit does not apply to arguments to
-.Ar utility
-which do not contain
-.Ar replstr ,
-and furthermore, no replacement will be done on
-.Ar utility
-itself.
-Implies
-.Fl x .
-.It Fl J Ar replstr
-If this option is specified,
-.Nm
-will use the data read from standard input to replace the first occurrence of
-.Ar replstr
-instead of appending that data after all other arguments.
-This option will not affect how many arguments will be read from input
-.Pq Fl n ,
-or the size of the command(s)
-.Nm
-will generate
-.Pq Fl s .
-The option just moves where those arguments will be placed in the command(s)
-that are executed.
-The
-.Ar replstr
-must show up as a distinct
-.Ar argument
-to
-.Nm .
-It will not be recognized if, for instance, it is in the middle of a
-quoted string.
-Furthermore, only the first occurrence of the
-.Ar replstr
-will be replaced.
-For example, the following command will copy the list of files and
-directories which start with an uppercase letter in the current
-directory to
-.Pa destdir :
-.Pp
-.Dl /bin/ls -1d [A-Z]* | xargs -J % cp -rp % destdir
-.Pp
-.It Fl L Ar number
-Call
-.Ar utility
-for every
-.Ar number
-lines read.
-If EOF is reached and fewer lines have been read than
-.Ar number
-then
-.Ar utility
-will be called with the available lines.
-.It Fl n Ar number
-Set the maximum number of arguments taken from standard input for each
-invocation of
-.Ar utility .
-An invocation of
-.Ar utility
-will use less than
-.Ar number
-standard input arguments if the number of bytes accumulated (see the
-.Fl s
-option) exceeds the specified
-.Ar size
-or there are fewer than
-.Ar number
-arguments remaining for the last invocation of
-.Ar utility .
-The current default value for
-.Ar number
-is 5000.
-.It Fl o
-Reopen stdin as
-.Pa /dev/tty
-in the child process before executing the command.
-This is useful if you want
-.Nm
-to run an interactive application.
-.It Fl P Ar maxprocs
-Parallel mode: run at most
-.Ar maxprocs
-invocations of
-.Ar utility
-at once.
-.It Fl p
-Echo each command to be executed and ask the user whether it should be
-executed.
-An affirmative response,
-.Ql y
-in the POSIX locale,
-causes the command to be executed, any other response causes it to be
-skipped.
-No commands are executed if the process is not attached to a terminal.
-.It Fl r
-Compatibility with GNU
-.Nm .
-The GNU version of
-.Nm
-runs the
-.Ar utility
-argument at least once, even if
-.Nm
-input is empty, and it supports a
-.Fl r
-option to inhibit this behavior.
-The
-.Fx
-version of
-.Nm
-does not run the
-.Ar utility
-argument on empty input, but it supports the
-.Fl r
-option for command-line compatibility with GNU
-.Nm ,
-but the
-.Fl r
-option does nothing in the
-.Fx
-version of
-.Nm .
-.It Fl R Ar replacements
-Specify the maximum number of arguments that
-.Fl I
-will do replacement in.
-If
-.Ar replacements
-is negative, the number of arguments in which to replace is unbounded.
-.It Fl S Ar replsize
-Specify the amount of space (in bytes) that
-.Fl I
-can use for replacements.
-The default for
-.Ar replsize
-is 255.
-.It Fl s Ar size
-Set the maximum number of bytes for the command line length provided to
-.Ar utility .
-The sum of the length of the utility name, the arguments passed to
-.Ar utility
-(including
-.Dv NULL
-terminators) and the current environment will be less than or equal to
-this number.
-The current default value for
-.Ar size
-is
-.Dv ARG_MAX
-- 4096.
-.It Fl t
-Echo the command to be executed to standard error immediately before it
-is executed.
-.It Fl x
-Force
-.Nm
-to terminate immediately if a command line containing
-.Ar number
-arguments will not fit in the specified (or default) command line length.
-.El
-.Pp
-If
-.Ar utility
-is omitted,
-.Xr echo 1
-is used.
-.Pp
-Undefined behavior may occur if
-.Ar utility
-reads from the standard input.
-.Pp
-The
-.Nm
-utility exits immediately (without processing any further input) if a
-command line cannot be assembled,
-.Ar utility
-cannot be invoked, an invocation of
-.Ar utility
-is terminated by a signal,
-or an invocation of
-.Ar utility
-exits with a value of 255.
-.Sh EXIT STATUS
-The
-.Nm
-utility exits with a value of 0 if no error occurs.
-If
-.Ar utility
-cannot be found,
-.Nm
-exits with a value of 127, otherwise if
-.Ar utility
-cannot be executed,
-.Nm
-exits with a value of 126.
-If any other error occurs,
-.Nm
-exits with a value of 1.
-.Sh SEE ALSO
-.Xr echo 1 ,
-.Xr find 1 ,
-.Xr execvp 3
-.Sh STANDARDS
-The
-.Nm
-utility is expected to be
-.St -p1003.2
-compliant.
-The
-.Fl J , o , P, R
-and
-.Fl S
-options are non-standard
-.Fx
-extensions which may not be available on other operating systems.
-.Sh HISTORY
-The
-.Nm
-utility appeared in PWB UNIX.
-.Sh BUGS
-If
-.Ar utility
-attempts to invoke another command such that the number of arguments or the
-size of the environment is increased, it risks
-.Xr execvp 3
-failing with
-.Er E2BIG .
-.Pp
-The
-.Nm
-utility does not take multibyte characters into account when performing
-string comparisons for the
-.Fl I
-and
-.Fl J
-options, which may lead to incorrect results in some locales.
diff --git a/usr.bin/xargs/xargs.c b/usr.bin/xargs/xargs.c
deleted file mode 100644
index 27f7cd3..0000000
--- a/usr.bin/xargs/xargs.c
+++ /dev/null
@@ -1,626 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * John B. Roll Jr.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $xMach: xargs.c,v 1.6 2002/02/23 05:27:47 tim Exp $
- */
-
-#if 0
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1990, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static char sccsid[] = "@(#)xargs.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/wait.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <langinfo.h>
-#include <locale.h>
-#include <paths.h>
-#include <regex.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "pathnames.h"
-
-static void parse_input(int, char *[]);
-static void prerun(int, char *[]);
-static int prompt(void);
-static void run(char **);
-static void usage(void);
-void strnsubst(char **, const char *, const char *, size_t);
-static void waitchildren(const char *, int);
-
-static char echo[] = _PATH_ECHO;
-static char **av, **bxp, **ep, **endxp, **xp;
-static char *argp, *bbp, *ebp, *inpline, *p, *replstr;
-static const char *eofstr;
-static int count, insingle, indouble, oflag, pflag, tflag, Rflag, rval, zflag;
-static int cnt, Iflag, jfound, Lflag, Sflag, wasquoted, xflag;
-static int curprocs, maxprocs;
-
-static volatile int childerr;
-
-extern char **environ;
-
-int
-main(int argc, char *argv[])
-{
- long arg_max;
- int ch, Jflag, nargs, nflag, nline;
- size_t linelen;
- char *endptr;
-
- inpline = replstr = NULL;
- ep = environ;
- eofstr = "";
- Jflag = nflag = 0;
-
- (void)setlocale(LC_ALL, "");
-
- /*
- * POSIX.2 limits the exec line length to ARG_MAX - 2K. Running that
- * caused some E2BIG errors, so it was changed to ARG_MAX - 4K. Given
- * that the smallest argument is 2 bytes in length, this means that
- * the number of arguments is limited to:
- *
- * (ARG_MAX - 4K - LENGTH(utility + arguments)) / 2.
- *
- * We arbitrarily limit the number of arguments to 5000. This is
- * allowed by POSIX.2 as long as the resulting minimum exec line is
- * at least LINE_MAX. Realloc'ing as necessary is possible, but
- * probably not worthwhile.
- */
- nargs = 5000;
- if ((arg_max = sysconf(_SC_ARG_MAX)) == -1)
- errx(1, "sysconf(_SC_ARG_MAX) failed");
- nline = arg_max - 4 * 1024;
- while (*ep != NULL) {
- /* 1 byte for each '\0' */
- nline -= strlen(*ep++) + 1 + sizeof(*ep);
- }
- maxprocs = 1;
- while ((ch = getopt(argc, argv, "0E:I:J:L:n:oP:pR:S:s:rtx")) != -1)
- switch (ch) {
- case 'E':
- eofstr = optarg;
- break;
- case 'I':
- Jflag = 0;
- Iflag = 1;
- Lflag = 1;
- replstr = optarg;
- break;
- case 'J':
- Iflag = 0;
- Jflag = 1;
- replstr = optarg;
- break;
- case 'L':
- Lflag = atoi(optarg);
- break;
- case 'n':
- nflag = 1;
- if ((nargs = atoi(optarg)) <= 0)
- errx(1, "illegal argument count");
- break;
- case 'o':
- oflag = 1;
- break;
- case 'P':
- if ((maxprocs = atoi(optarg)) <= 0)
- errx(1, "max. processes must be >0");
- break;
- case 'p':
- pflag = 1;
- break;
- case 'R':
- Rflag = strtol(optarg, &endptr, 10);
- if (*endptr != '\0')
- errx(1, "replacements must be a number");
- break;
- case 'r':
- /* GNU compatibility */
- break;
- case 'S':
- Sflag = strtoul(optarg, &endptr, 10);
- if (*endptr != '\0')
- errx(1, "replsize must be a number");
- break;
- case 's':
- nline = atoi(optarg);
- break;
- case 't':
- tflag = 1;
- break;
- case 'x':
- xflag = 1;
- break;
- case '0':
- zflag = 1;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (!Iflag && Rflag)
- usage();
- if (!Iflag && Sflag)
- usage();
- if (Iflag && !Rflag)
- Rflag = 5;
- if (Iflag && !Sflag)
- Sflag = 255;
- if (xflag && !nflag)
- usage();
- if (Iflag || Lflag)
- xflag = 1;
- if (replstr != NULL && *replstr == '\0')
- errx(1, "replstr may not be empty");
-
- /*
- * Allocate pointers for the utility name, the utility arguments,
- * the maximum arguments to be read from stdin and the trailing
- * NULL.
- */
- linelen = 1 + argc + nargs + 1;
- if ((av = bxp = malloc(linelen * sizeof(char **))) == NULL)
- errx(1, "malloc failed");
-
- /*
- * Use the user's name for the utility as argv[0], just like the
- * shell. Echo is the default. Set up pointers for the user's
- * arguments.
- */
- if (*argv == NULL)
- cnt = strlen(*bxp++ = echo);
- else {
- do {
- if (Jflag && strcmp(*argv, replstr) == 0) {
- char **avj;
- jfound = 1;
- argv++;
- for (avj = argv; *avj; avj++)
- cnt += strlen(*avj) + 1;
- break;
- }
- cnt += strlen(*bxp++ = *argv) + 1;
- } while (*++argv != NULL);
- }
-
- /*
- * Set up begin/end/traversing pointers into the array. The -n
- * count doesn't include the trailing NULL pointer, so the malloc
- * added in an extra slot.
- */
- endxp = (xp = bxp) + nargs;
-
- /*
- * Allocate buffer space for the arguments read from stdin and the
- * trailing NULL. Buffer space is defined as the default or specified
- * space, minus the length of the utility name and arguments. Set up
- * begin/end/traversing pointers into the array. The -s count does
- * include the trailing NULL, so the malloc didn't add in an extra
- * slot.
- */
- nline -= cnt;
- if (nline <= 0)
- errx(1, "insufficient space for command");
-
- if ((bbp = malloc((size_t)(nline + 1))) == NULL)
- errx(1, "malloc failed");
- ebp = (argp = p = bbp) + nline - 1;
- for (;;)
- parse_input(argc, argv);
-}
-
-static void
-parse_input(int argc, char *argv[])
-{
- int ch, foundeof;
- char **avj;
-
- foundeof = 0;
-
- switch (ch = getchar()) {
- case EOF:
- /* No arguments since last exec. */
- if (p == bbp) {
- waitchildren(*argv, 1);
- exit(rval);
- }
- goto arg1;
- case ' ':
- case '\t':
- /* Quotes escape tabs and spaces. */
- if (insingle || indouble || zflag)
- goto addch;
- goto arg2;
- case '\0':
- if (zflag) {
- /*
- * Increment 'count', so that nulls will be treated
- * as end-of-line, as well as end-of-argument. This
- * is needed so -0 works properly with -I and -L.
- */
- count++;
- goto arg2;
- }
- goto addch;
- case '\n':
- if (zflag)
- goto addch;
- count++; /* Indicate end-of-line (used by -L) */
-
- /* Quotes do not escape newlines. */
-arg1: if (insingle || indouble)
- errx(1, "unterminated quote");
-arg2:
- foundeof = *eofstr != '\0' &&
- strncmp(argp, eofstr, p - argp) == 0;
-
- /* Do not make empty args unless they are quoted */
- if ((argp != p || wasquoted) && !foundeof) {
- *p++ = '\0';
- *xp++ = argp;
- if (Iflag) {
- size_t curlen;
-
- if (inpline == NULL)
- curlen = 0;
- else {
- /*
- * If this string is not zero
- * length, append a space for
- * separation before the next
- * argument.
- */
- if ((curlen = strlen(inpline)))
- strcat(inpline, " ");
- }
- curlen++;
- /*
- * Allocate enough to hold what we will
- * be holding in a second, and to append
- * a space next time through, if we have
- * to.
- */
- inpline = realloc(inpline, curlen + 2 +
- strlen(argp));
- if (inpline == NULL)
- errx(1, "realloc failed");
- if (curlen == 1)
- strcpy(inpline, argp);
- else
- strcat(inpline, argp);
- }
- }
-
- /*
- * If max'd out on args or buffer, or reached EOF,
- * run the command. If xflag and max'd out on buffer
- * but not on args, object. Having reached the limit
- * of input lines, as specified by -L is the same as
- * maxing out on arguments.
- */
- if (xp == endxp || p > ebp || ch == EOF ||
- (Lflag <= count && xflag) || foundeof) {
- if (xflag && xp != endxp && p > ebp)
- errx(1, "insufficient space for arguments");
- if (jfound) {
- for (avj = argv; *avj; avj++)
- *xp++ = *avj;
- }
- prerun(argc, av);
- if (ch == EOF || foundeof) {
- waitchildren(*argv, 1);
- exit(rval);
- }
- p = bbp;
- xp = bxp;
- count = 0;
- }
- argp = p;
- wasquoted = 0;
- break;
- case '\'':
- if (indouble || zflag)
- goto addch;
- insingle = !insingle;
- wasquoted = 1;
- break;
- case '"':
- if (insingle || zflag)
- goto addch;
- indouble = !indouble;
- wasquoted = 1;
- break;
- case '\\':
- if (zflag)
- goto addch;
- /* Backslash escapes anything, is escaped by quotes. */
- if (!insingle && !indouble && (ch = getchar()) == EOF)
- errx(1, "backslash at EOF");
- /* FALLTHROUGH */
- default:
-addch: if (p < ebp) {
- *p++ = ch;
- break;
- }
-
- /* If only one argument, not enough buffer space. */
- if (bxp == xp)
- errx(1, "insufficient space for argument");
- /* Didn't hit argument limit, so if xflag object. */
- if (xflag)
- errx(1, "insufficient space for arguments");
-
- if (jfound) {
- for (avj = argv; *avj; avj++)
- *xp++ = *avj;
- }
- prerun(argc, av);
- xp = bxp;
- cnt = ebp - argp;
- memcpy(bbp, argp, (size_t)cnt);
- p = (argp = bbp) + cnt;
- *p++ = ch;
- break;
- }
-}
-
-/*
- * Do things necessary before run()'ing, such as -I substitution,
- * and then call run().
- */
-static void
-prerun(int argc, char *argv[])
-{
- char **tmp, **tmp2, **avj;
- int repls;
-
- repls = Rflag;
-
- if (argc == 0 || repls == 0) {
- *xp = NULL;
- run(argv);
- return;
- }
-
- avj = argv;
-
- /*
- * Allocate memory to hold the argument list, and
- * a NULL at the tail.
- */
- tmp = malloc((argc + 1) * sizeof(char**));
- if (tmp == NULL)
- errx(1, "malloc failed");
- tmp2 = tmp;
-
- /*
- * Save the first argument and iterate over it, we
- * cannot do strnsubst() to it.
- */
- if ((*tmp++ = strdup(*avj++)) == NULL)
- errx(1, "strdup failed");
-
- /*
- * For each argument to utility, if we have not used up
- * the number of replacements we are allowed to do, and
- * if the argument contains at least one occurrence of
- * replstr, call strnsubst(), else just save the string.
- * Iterations over elements of avj and tmp are done
- * where appropriate.
- */
- while (--argc) {
- *tmp = *avj++;
- if (repls && strstr(*tmp, replstr) != NULL) {
- strnsubst(tmp++, replstr, inpline, (size_t)Sflag);
- if (repls > 0)
- repls--;
- } else {
- if ((*tmp = strdup(*tmp)) == NULL)
- errx(1, "strdup failed");
- tmp++;
- }
- }
-
- /*
- * Run it.
- */
- *tmp = NULL;
- run(tmp2);
-
- /*
- * Walk from the tail to the head, free along the way.
- */
- for (; tmp2 != tmp; tmp--)
- free(*tmp);
- /*
- * Now free the list itself.
- */
- free(tmp2);
-
- /*
- * Free the input line buffer, if we have one.
- */
- if (inpline != NULL) {
- free(inpline);
- inpline = NULL;
- }
-}
-
-static void
-run(char **argv)
-{
- pid_t pid;
- int fd;
- char **avec;
-
- /*
- * If the user wants to be notified of each command before it is
- * executed, notify them. If they want the notification to be
- * followed by a prompt, then prompt them.
- */
- if (tflag || pflag) {
- (void)fprintf(stderr, "%s", *argv);
- for (avec = argv + 1; *avec != NULL; ++avec)
- (void)fprintf(stderr, " %s", *avec);
- /*
- * If the user has asked to be prompted, do so.
- */
- if (pflag)
- /*
- * If they asked not to exec, return without execution
- * but if they asked to, go to the execution. If we
- * could not open their tty, break the switch and drop
- * back to -t behaviour.
- */
- switch (prompt()) {
- case 0:
- return;
- case 1:
- goto exec;
- case 2:
- break;
- }
- (void)fprintf(stderr, "\n");
- (void)fflush(stderr);
- }
-exec:
- childerr = 0;
- switch (pid = vfork()) {
- case -1:
- err(1, "vfork");
- case 0:
- if (oflag) {
- if ((fd = open(_PATH_TTY, O_RDONLY)) == -1)
- err(1, "can't open /dev/tty");
- } else {
- fd = open(_PATH_DEVNULL, O_RDONLY);
- }
- if (fd > STDIN_FILENO) {
- if (dup2(fd, STDIN_FILENO) != 0)
- err(1, "can't dup2 to stdin");
- close(fd);
- }
- execvp(argv[0], argv);
- childerr = errno;
- _exit(1);
- }
- curprocs++;
- waitchildren(*argv, 0);
-}
-
-static void
-waitchildren(const char *name, int waitall)
-{
- pid_t pid;
- int status;
-
- while ((pid = waitpid(-1, &status, !waitall && curprocs < maxprocs ?
- WNOHANG : 0)) > 0) {
- curprocs--;
- /* If we couldn't invoke the utility, exit. */
- if (childerr != 0) {
- errno = childerr;
- err(errno == ENOENT ? 127 : 126, "%s", name);
- }
- /*
- * If utility signaled or exited with a value of 255,
- * exit 1-125.
- */
- if (WIFSIGNALED(status) || WEXITSTATUS(status) == 255)
- exit(1);
- if (WEXITSTATUS(status))
- rval = 1;
- }
- if (pid == -1 && errno != ECHILD)
- err(1, "wait3");
-}
-
-/*
- * Prompt the user about running a command.
- */
-static int
-prompt(void)
-{
- regex_t cre;
- size_t rsize;
- int match;
- char *response;
- FILE *ttyfp;
-
- if ((ttyfp = fopen(_PATH_TTY, "r")) == NULL)
- return (2); /* Indicate that the TTY failed to open. */
- (void)fprintf(stderr, "?...");
- (void)fflush(stderr);
- if ((response = fgetln(ttyfp, &rsize)) == NULL ||
- regcomp(&cre, nl_langinfo(YESEXPR), REG_BASIC) != 0) {
- (void)fclose(ttyfp);
- return (0);
- }
- response[rsize - 1] = '\0';
- match = regexec(&cre, response, 0, NULL, 0);
- (void)fclose(ttyfp);
- regfree(&cre);
- return (match == 0);
-}
-
-static void
-usage(void)
-{
- fprintf(stderr,
-"usage: xargs [-0opt] [-E eofstr] [-I replstr [-R replacements] [-S replsize]]\n"
-" [-J replstr] [-L number] [-n number [-x]] [-P maxprocs]\n"
-" [-s size] [utility [argument ...]]\n");
- exit(1);
-}
diff --git a/usr.bin/xinstall/Makefile b/usr.bin/xinstall/Makefile
deleted file mode 100644
index 594f1dc..0000000
--- a/usr.bin/xinstall/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= xinstall
-PROGNAME= install
-MAN= install.1
-WARNS?= 6
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/xinstall/install.1 b/usr.bin/xinstall/install.1
deleted file mode 100644
index 31ce10a..0000000
--- a/usr.bin/xinstall/install.1
+++ /dev/null
@@ -1,264 +0,0 @@
-.\" Copyright (c) 1987, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" From: @(#)install.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd March 6, 2006
-.Dt INSTALL 1
-.Os
-.Sh NAME
-.Nm install
-.Nd install binaries
-.Sh SYNOPSIS
-.Nm
-.Op Fl bCcMpSsv
-.Op Fl B Ar suffix
-.Op Fl f Ar flags
-.Op Fl g Ar group
-.Op Fl m Ar mode
-.Op Fl o Ar owner
-.Ar file1 file2
-.Nm
-.Op Fl bCcMpSsv
-.Op Fl B Ar suffix
-.Op Fl f Ar flags
-.Op Fl g Ar group
-.Op Fl m Ar mode
-.Op Fl o Ar owner
-.Ar file1 ... fileN directory
-.Nm
-.Fl d
-.Op Fl v
-.Op Fl g Ar group
-.Op Fl m Ar mode
-.Op Fl o Ar owner
-.Ar directory ...
-.Sh DESCRIPTION
-The file(s) are copied
-to the target file or directory.
-If the destination is a directory, then the
-.Ar file
-is copied into
-.Ar directory
-with its original filename.
-If the target file already exists, it is
-either renamed to
-.Ar file Ns Pa .old
-if the
-.Fl b
-option is given
-or overwritten
-if permissions allow.
-An alternate backup suffix may be specified via the
-.Fl B
-option's argument.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl b
-Back up any existing files before overwriting them by renaming
-them to
-.Ar file Ns Pa .old .
-See
-.Fl B
-for specifying a different backup suffix.
-.It Fl B Ar suffix
-Use
-.Ar suffix
-as the backup suffix if
-.Fl b
-is given.
-.It Fl C
-Copy the file.
-If the target file already exists and the files are the same,
-then do not change the modification time of the target.
-If the target's file flags and mode need not to be changed,
-the target's inode change time is also unchanged.
-.It Fl c
-Copy the file.
-This is actually the default.
-The
-.Fl c
-option is only included for backwards compatibility.
-.It Fl d
-Create directories.
-Missing parent directories are created as required.
-.It Fl f
-Specify the target's file flags; see
-.Xr chflags 1
-for a list of possible flags and their meanings.
-.It Fl g
-Specify a group.
-A numeric GID is allowed.
-.It Fl M
-Disable all use of
-.Xr mmap 2 .
-.It Fl m
-Specify an alternate mode.
-The default mode is set to rwxr-xr-x (0755).
-The specified mode may be either an octal or symbolic value; see
-.Xr chmod 1
-for a description of possible mode values.
-.It Fl o
-Specify an owner.
-A numeric UID is allowed.
-.It Fl p
-Preserve the access and modification times.
-Copy the file, as if the
-.Fl C
-(compare and copy) option is specified,
-except if the target file does not already exist or is different,
-then preserve the access and modification times of the source file.
-.It Fl S
-Safe copy.
-Normally,
-.Nm
-unlinks an existing target before installing the new file.
-With the
-.Fl S
-flag a temporary file is used and then renamed to be
-the target.
-The reason this is safer is that if the copy or
-rename fails, the existing target is left untouched.
-.It Fl s
-.Nm
-exec's the command
-.Xr strip 1
-to strip binaries so that
-.Nm
-can be portable over a large
-number of systems and binary types.
-See below for how
-.Nm
-can be instructed to use another program to strip binaries.
-.It Fl v
-Cause
-.Nm
-to be verbose,
-showing files as they are installed or backed up.
-.El
-.Pp
-By default,
-.Nm
-preserves all file flags, with the exception of the
-.Dq nodump
-flag.
-.Pp
-The
-.Nm
-utility attempts to prevent moving a file onto itself.
-.Pp
-Installing
-.Pa /dev/null
-creates an empty file.
-.Sh ENVIRONMENT
-The
-.Nm
-utility checks for the presence of the
-.Ev STRIPBIN
-environment variable and if present,
-uses the assigned value as the program to run if and when the
-.Fl s
-option has been specified.
-.Pp
-If the
-.Ev DONTSTRIP
-environment variable is present,
-.Nm
-will ignore any specification of the
-.Fl s
-option.
-This is mainly for use in debugging the
-.Fx
-Ports Collection.
-.Sh FILES
-.Bl -tag -width ".Pa INS@XXXX" -compact
-.It Pa INS@XXXX
-If either
-.Fl S
-option is specified, or the
-.Fl C
-or
-.Fl p
-option is used in conjunction with the
-.Fl s
-option, temporary files named
-.Pa INS@XXXX ,
-where
-.Pa XXXX
-is decided by
-.Xr mkstemp 3 ,
-are created in the target directory.
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh COMPATIBILITY
-Historically
-.Nm
-moved files by default.
-The default was changed to copy in
-.Fx 4.4 .
-.Sh SEE ALSO
-.Xr chflags 1 ,
-.Xr chgrp 1 ,
-.Xr chmod 1 ,
-.Xr cp 1 ,
-.Xr mv 1 ,
-.Xr strip 1 ,
-.Xr mmap 2 ,
-.Xr chown 8
-.Sh HISTORY
-The
-.Nm
-utility appeared in
-.Bx 4.2 .
-.Sh BUGS
-Temporary files may be left in the target directory if
-.Nm
-exits abnormally.
-.Pp
-File flags cannot be set by
-.Xr fchflags 2
-over a NFS file system.
-Other file systems do not have a concept of flags.
-The
-.Nm
-utility will only warn when flags could not be set on a file system
-that does not support them.
-.Pp
-The
-.Nm
-utility with
-.Fl v
-falsely says a file is copied when
-.Fl C
-snaps hard links.
diff --git a/usr.bin/xinstall/xinstall.c b/usr.bin/xinstall/xinstall.c
deleted file mode 100644
index 49e47c6..0000000
--- a/usr.bin/xinstall/xinstall.c
+++ /dev/null
@@ -1,807 +0,0 @@
-/*
- * Copyright (c) 1987, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1987, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)xinstall.c 8.1 (Berkeley) 7/21/93";
-#endif /* not lint */
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/mman.h>
-#include <sys/mount.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/wait.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <grp.h>
-#include <paths.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysexits.h>
-#include <unistd.h>
-
-/* Bootstrap aid - this doesn't exist in most older releases */
-#ifndef MAP_FAILED
-#define MAP_FAILED ((void *)-1) /* from <sys/mman.h> */
-#endif
-
-#define MAX_CMP_SIZE (16 * 1024 * 1024)
-
-#define DIRECTORY 0x01 /* Tell install it's a directory. */
-#define SETFLAGS 0x02 /* Tell install to set flags. */
-#define NOCHANGEBITS (UF_IMMUTABLE | UF_APPEND | SF_IMMUTABLE | SF_APPEND)
-#define BACKUP_SUFFIX ".old"
-
-struct passwd *pp;
-struct group *gp;
-gid_t gid;
-uid_t uid;
-int dobackup, docompare, dodir, dopreserve, dostrip, nommap, safecopy, verbose;
-mode_t mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
-const char *suffix = BACKUP_SUFFIX;
-
-void copy(int, const char *, int, const char *, off_t);
-int compare(int, const char *, size_t, int, const char *, size_t);
-int create_newfile(const char *, int, struct stat *);
-int create_tempfile(const char *, char *, size_t);
-void install(const char *, const char *, u_long, u_int);
-void install_dir(char *);
-u_long numeric_id(const char *, const char *);
-void strip(const char *);
-int trymmap(int);
-void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- struct stat from_sb, to_sb;
- mode_t *set;
- u_long fset;
- int ch, no_target;
- u_int iflags;
- char *flags;
- const char *group, *owner, *to_name;
-
- iflags = 0;
- group = owner = NULL;
- while ((ch = getopt(argc, argv, "B:bCcdf:g:Mm:o:pSsv")) != -1)
- switch((char)ch) {
- case 'B':
- suffix = optarg;
- /* FALLTHROUGH */
- case 'b':
- dobackup = 1;
- break;
- case 'C':
- docompare = 1;
- break;
- case 'c':
- /* For backwards compatibility. */
- break;
- case 'd':
- dodir = 1;
- break;
- case 'f':
- flags = optarg;
- if (strtofflags(&flags, &fset, NULL))
- errx(EX_USAGE, "%s: invalid flag", flags);
- iflags |= SETFLAGS;
- break;
- case 'g':
- group = optarg;
- break;
- case 'M':
- nommap = 1;
- break;
- case 'm':
- if (!(set = setmode(optarg)))
- errx(EX_USAGE, "invalid file mode: %s",
- optarg);
- mode = getmode(set, 0);
- free(set);
- break;
- case 'o':
- owner = optarg;
- break;
- case 'p':
- docompare = dopreserve = 1;
- break;
- case 'S':
- safecopy = 1;
- break;
- case 's':
- dostrip = 1;
- break;
- case 'v':
- verbose = 1;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- /* some options make no sense when creating directories */
- if (dostrip && dodir) {
- warnx("-d and -s may not be specified together");
- usage();
- }
-
- if (getenv("DONTSTRIP") != NULL) {
- warnx("DONTSTRIP set - will not strip installed binaries");
- dostrip = 0;
- }
-
- /* must have at least two arguments, except when creating directories */
- if (argc == 0 || (argc == 1 && !dodir))
- usage();
-
- /* need to make a temp copy so we can compare stripped version */
- if (docompare && dostrip)
- safecopy = 1;
-
- /* get group and owner id's */
- if (group != NULL) {
- if ((gp = getgrnam(group)) != NULL)
- gid = gp->gr_gid;
- else
- gid = (gid_t)numeric_id(group, "group");
- } else
- gid = (gid_t)-1;
-
- if (owner != NULL) {
- if ((pp = getpwnam(owner)) != NULL)
- uid = pp->pw_uid;
- else
- uid = (uid_t)numeric_id(owner, "user");
- } else
- uid = (uid_t)-1;
-
- if (dodir) {
- for (; *argv != NULL; ++argv)
- install_dir(*argv);
- exit(EX_OK);
- /* NOTREACHED */
- }
-
- no_target = stat(to_name = argv[argc - 1], &to_sb);
- if (!no_target && S_ISDIR(to_sb.st_mode)) {
- for (; *argv != to_name; ++argv)
- install(*argv, to_name, fset, iflags | DIRECTORY);
- exit(EX_OK);
- /* NOTREACHED */
- }
-
- /* can't do file1 file2 directory/file */
- if (argc != 2) {
- if (no_target)
- warnx("target directory `%s' does not exist",
- argv[argc - 1]);
- else
- warnx("target `%s' is not a directory",
- argv[argc - 1]);
- usage();
- }
-
- if (!no_target) {
- if (stat(*argv, &from_sb))
- err(EX_OSERR, "%s", *argv);
- if (!S_ISREG(to_sb.st_mode)) {
- errno = EFTYPE;
- err(EX_OSERR, "%s", to_name);
- }
- if (to_sb.st_dev == from_sb.st_dev &&
- to_sb.st_ino == from_sb.st_ino)
- errx(EX_USAGE,
- "%s and %s are the same file", *argv, to_name);
- }
- install(*argv, to_name, fset, iflags);
- exit(EX_OK);
- /* NOTREACHED */
-}
-
-u_long
-numeric_id(const char *name, const char *type)
-{
- u_long val;
- char *ep;
-
- /*
- * XXX
- * We know that uid_t's and gid_t's are unsigned longs.
- */
- errno = 0;
- val = strtoul(name, &ep, 10);
- if (errno)
- err(EX_NOUSER, "%s", name);
- if (*ep != '\0')
- errx(EX_NOUSER, "unknown %s %s", type, name);
- return (val);
-}
-
-/*
- * install --
- * build a path name and install the file
- */
-void
-install(const char *from_name, const char *to_name, u_long fset, u_int flags)
-{
- struct stat from_sb, temp_sb, to_sb;
- struct timeval tvb[2];
- int devnull, files_match, from_fd, serrno, target;
- int tempcopy, temp_fd, to_fd;
- char backup[MAXPATHLEN], *p, pathbuf[MAXPATHLEN], tempfile[MAXPATHLEN];
-
- files_match = 0;
- from_fd = -1;
- to_fd = -1;
-
- /* If try to install NULL file to a directory, fails. */
- if (flags & DIRECTORY || strcmp(from_name, _PATH_DEVNULL)) {
- if (stat(from_name, &from_sb))
- err(EX_OSERR, "%s", from_name);
- if (!S_ISREG(from_sb.st_mode)) {
- errno = EFTYPE;
- err(EX_OSERR, "%s", from_name);
- }
- /* Build the target path. */
- if (flags & DIRECTORY) {
- (void)snprintf(pathbuf, sizeof(pathbuf), "%s/%s",
- to_name,
- (p = strrchr(from_name, '/')) ? ++p : from_name);
- to_name = pathbuf;
- }
- devnull = 0;
- } else {
- devnull = 1;
- }
-
- target = stat(to_name, &to_sb) == 0;
-
- /* Only install to regular files. */
- if (target && !S_ISREG(to_sb.st_mode)) {
- errno = EFTYPE;
- warn("%s", to_name);
- return;
- }
-
- /* Only copy safe if the target exists. */
- tempcopy = safecopy && target;
-
- if (!devnull && (from_fd = open(from_name, O_RDONLY, 0)) < 0)
- err(EX_OSERR, "%s", from_name);
-
- /* If we don't strip, we can compare first. */
- if (docompare && !dostrip && target) {
- if ((to_fd = open(to_name, O_RDONLY, 0)) < 0)
- err(EX_OSERR, "%s", to_name);
- if (devnull)
- files_match = to_sb.st_size == 0;
- else
- files_match = !(compare(from_fd, from_name,
- (size_t)from_sb.st_size, to_fd,
- to_name, (size_t)to_sb.st_size));
-
- /* Close "to" file unless we match. */
- if (!files_match)
- (void)close(to_fd);
- }
-
- if (!files_match) {
- if (tempcopy) {
- to_fd = create_tempfile(to_name, tempfile,
- sizeof(tempfile));
- if (to_fd < 0)
- err(EX_OSERR, "%s", tempfile);
- } else {
- if ((to_fd = create_newfile(to_name, target,
- &to_sb)) < 0)
- err(EX_OSERR, "%s", to_name);
- if (verbose)
- (void)printf("install: %s -> %s\n",
- from_name, to_name);
- }
- if (!devnull)
- copy(from_fd, from_name, to_fd,
- tempcopy ? tempfile : to_name, from_sb.st_size);
- }
-
- if (dostrip) {
- strip(tempcopy ? tempfile : to_name);
-
- /*
- * Re-open our fd on the target, in case we used a strip
- * that does not work in-place -- like GNU binutils strip.
- */
- close(to_fd);
- to_fd = open(tempcopy ? tempfile : to_name, O_RDONLY, 0);
- if (to_fd < 0)
- err(EX_OSERR, "stripping %s", to_name);
- }
-
- /*
- * Compare the stripped temp file with the target.
- */
- if (docompare && dostrip && target) {
- temp_fd = to_fd;
-
- /* Re-open to_fd using the real target name. */
- if ((to_fd = open(to_name, O_RDONLY, 0)) < 0)
- err(EX_OSERR, "%s", to_name);
-
- if (fstat(temp_fd, &temp_sb)) {
- serrno = errno;
- (void)unlink(tempfile);
- errno = serrno;
- err(EX_OSERR, "%s", tempfile);
- }
-
- if (compare(temp_fd, tempfile, (size_t)temp_sb.st_size, to_fd,
- to_name, (size_t)to_sb.st_size) == 0) {
- /*
- * If target has more than one link we need to
- * replace it in order to snap the extra links.
- * Need to preserve target file times, though.
- */
- if (to_sb.st_nlink != 1) {
- tvb[0].tv_sec = to_sb.st_atime;
- tvb[0].tv_usec = 0;
- tvb[1].tv_sec = to_sb.st_mtime;
- tvb[1].tv_usec = 0;
- (void)utimes(tempfile, tvb);
- } else {
- files_match = 1;
- (void)unlink(tempfile);
- }
- (void) close(temp_fd);
- }
- }
-
- /*
- * Move the new file into place if doing a safe copy
- * and the files are different (or just not compared).
- */
- if (tempcopy && !files_match) {
- /* Try to turn off the immutable bits. */
- if (to_sb.st_flags & NOCHANGEBITS)
- (void)chflags(to_name, to_sb.st_flags & ~NOCHANGEBITS);
- if (dobackup) {
- if ((size_t)snprintf(backup, MAXPATHLEN, "%s%s", to_name,
- suffix) != strlen(to_name) + strlen(suffix)) {
- unlink(tempfile);
- errx(EX_OSERR, "%s: backup filename too long",
- to_name);
- }
- if (verbose)
- (void)printf("install: %s -> %s\n", to_name, backup);
- if (rename(to_name, backup) < 0) {
- serrno = errno;
- unlink(tempfile);
- errno = serrno;
- err(EX_OSERR, "rename: %s to %s", to_name,
- backup);
- }
- }
- if (verbose)
- (void)printf("install: %s -> %s\n", from_name, to_name);
- if (rename(tempfile, to_name) < 0) {
- serrno = errno;
- unlink(tempfile);
- errno = serrno;
- err(EX_OSERR, "rename: %s to %s",
- tempfile, to_name);
- }
-
- /* Re-open to_fd so we aren't hosed by the rename(2). */
- (void) close(to_fd);
- if ((to_fd = open(to_name, O_RDONLY, 0)) < 0)
- err(EX_OSERR, "%s", to_name);
- }
-
- /*
- * Preserve the timestamp of the source file if necessary.
- */
- if (dopreserve && !files_match && !devnull) {
- tvb[0].tv_sec = from_sb.st_atime;
- tvb[0].tv_usec = 0;
- tvb[1].tv_sec = from_sb.st_mtime;
- tvb[1].tv_usec = 0;
- (void)utimes(to_name, tvb);
- }
-
- if (fstat(to_fd, &to_sb) == -1) {
- serrno = errno;
- (void)unlink(to_name);
- errno = serrno;
- err(EX_OSERR, "%s", to_name);
- }
-
- /*
- * Set owner, group, mode for target; do the chown first,
- * chown may lose the setuid bits.
- */
- if ((gid != (gid_t)-1 && gid != to_sb.st_gid) ||
- (uid != (uid_t)-1 && uid != to_sb.st_uid) ||
- (mode != (to_sb.st_mode & ALLPERMS))) {
- /* Try to turn off the immutable bits. */
- if (to_sb.st_flags & NOCHANGEBITS)
- (void)fchflags(to_fd, to_sb.st_flags & ~NOCHANGEBITS);
- }
-
- if ((gid != (gid_t)-1 && gid != to_sb.st_gid) ||
- (uid != (uid_t)-1 && uid != to_sb.st_uid))
- if (fchown(to_fd, uid, gid) == -1) {
- serrno = errno;
- (void)unlink(to_name);
- errno = serrno;
- err(EX_OSERR,"%s: chown/chgrp", to_name);
- }
-
- if (mode != (to_sb.st_mode & ALLPERMS))
- if (fchmod(to_fd, mode)) {
- serrno = errno;
- (void)unlink(to_name);
- errno = serrno;
- err(EX_OSERR, "%s: chmod", to_name);
- }
-
- /*
- * If provided a set of flags, set them, otherwise, preserve the
- * flags, except for the dump flag.
- * NFS does not support flags. Ignore EOPNOTSUPP flags if we're just
- * trying to turn off UF_NODUMP. If we're trying to set real flags,
- * then warn if the the fs doesn't support it, otherwise fail.
- */
- if (!devnull && (flags & SETFLAGS ||
- (from_sb.st_flags & ~UF_NODUMP) != to_sb.st_flags) &&
- fchflags(to_fd,
- flags & SETFLAGS ? fset : from_sb.st_flags & ~UF_NODUMP)) {
- if (flags & SETFLAGS) {
- if (errno == EOPNOTSUPP)
- warn("%s: chflags", to_name);
- else {
- serrno = errno;
- (void)unlink(to_name);
- errno = serrno;
- err(EX_OSERR, "%s: chflags", to_name);
- }
- }
- }
-
- (void)close(to_fd);
- if (!devnull)
- (void)close(from_fd);
-}
-
-/*
- * compare --
- * compare two files; non-zero means files differ
- */
-int
-compare(int from_fd, const char *from_name __unused, size_t from_len,
- int to_fd, const char *to_name __unused, size_t to_len)
-{
- char *p, *q;
- int rv;
- int done_compare;
-
- rv = 0;
- if (from_len != to_len)
- return 1;
-
- if (from_len <= MAX_CMP_SIZE) {
- done_compare = 0;
- if (trymmap(from_fd) && trymmap(to_fd)) {
- p = mmap(NULL, from_len, PROT_READ, MAP_SHARED, from_fd, (off_t)0);
- if (p == (char *)MAP_FAILED)
- goto out;
- q = mmap(NULL, from_len, PROT_READ, MAP_SHARED, to_fd, (off_t)0);
- if (q == (char *)MAP_FAILED) {
- munmap(p, from_len);
- goto out;
- }
-
- rv = memcmp(p, q, from_len);
- munmap(p, from_len);
- munmap(q, from_len);
- done_compare = 1;
- }
- out:
- if (!done_compare) {
- char buf1[MAXBSIZE];
- char buf2[MAXBSIZE];
- int n1, n2;
-
- rv = 0;
- lseek(from_fd, 0, SEEK_SET);
- lseek(to_fd, 0, SEEK_SET);
- while (rv == 0) {
- n1 = read(from_fd, buf1, sizeof(buf1));
- if (n1 == 0)
- break; /* EOF */
- else if (n1 > 0) {
- n2 = read(to_fd, buf2, n1);
- if (n2 == n1)
- rv = memcmp(buf1, buf2, n1);
- else
- rv = 1; /* out of sync */
- } else
- rv = 1; /* read failure */
- }
- lseek(from_fd, 0, SEEK_SET);
- lseek(to_fd, 0, SEEK_SET);
- }
- } else
- rv = 1; /* don't bother in this case */
-
- return rv;
-}
-
-/*
- * create_tempfile --
- * create a temporary file based on path and open it
- */
-int
-create_tempfile(const char *path, char *temp, size_t tsize)
-{
- char *p;
-
- (void)strncpy(temp, path, tsize);
- temp[tsize - 1] = '\0';
- if ((p = strrchr(temp, '/')) != NULL)
- p++;
- else
- p = temp;
- (void)strncpy(p, "INS@XXXX", &temp[tsize - 1] - p);
- temp[tsize - 1] = '\0';
- return (mkstemp(temp));
-}
-
-/*
- * create_newfile --
- * create a new file, overwriting an existing one if necessary
- */
-int
-create_newfile(const char *path, int target, struct stat *sbp)
-{
- char backup[MAXPATHLEN];
- int saved_errno = 0;
- int newfd;
-
- if (target) {
- /*
- * Unlink now... avoid ETXTBSY errors later. Try to turn
- * off the append/immutable bits -- if we fail, go ahead,
- * it might work.
- */
- if (sbp->st_flags & NOCHANGEBITS)
- (void)chflags(path, sbp->st_flags & ~NOCHANGEBITS);
-
- if (dobackup) {
- if ((size_t)snprintf(backup, MAXPATHLEN, "%s%s",
- path, suffix) != strlen(path) + strlen(suffix))
- errx(EX_OSERR, "%s: backup filename too long",
- path);
- (void)snprintf(backup, MAXPATHLEN, "%s%s",
- path, suffix);
- if (verbose)
- (void)printf("install: %s -> %s\n",
- path, backup);
- if (rename(path, backup) < 0)
- err(EX_OSERR, "rename: %s to %s", path, backup);
- } else
- if (unlink(path) < 0)
- saved_errno = errno;
- }
-
- newfd = open(path, O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
- if (newfd < 0 && saved_errno != 0)
- errno = saved_errno;
- return newfd;
-}
-
-/*
- * copy --
- * copy from one file to another
- */
-void
-copy(int from_fd, const char *from_name, int to_fd, const char *to_name,
- off_t size)
-{
- int nr, nw;
- int serrno;
- char *p, buf[MAXBSIZE];
- int done_copy;
-
- /* Rewind file descriptors. */
- if (lseek(from_fd, (off_t)0, SEEK_SET) == (off_t)-1)
- err(EX_OSERR, "lseek: %s", from_name);
- if (lseek(to_fd, (off_t)0, SEEK_SET) == (off_t)-1)
- err(EX_OSERR, "lseek: %s", to_name);
-
- /*
- * Mmap and write if less than 8M (the limit is so we don't totally
- * trash memory on big files. This is really a minor hack, but it
- * wins some CPU back.
- */
- done_copy = 0;
- if (size <= 8 * 1048576 && trymmap(from_fd) &&
- (p = mmap(NULL, (size_t)size, PROT_READ, MAP_SHARED,
- from_fd, (off_t)0)) != (char *)MAP_FAILED) {
- if ((nw = write(to_fd, p, size)) != size) {
- serrno = errno;
- (void)unlink(to_name);
- errno = nw > 0 ? EIO : serrno;
- err(EX_OSERR, "%s", to_name);
- }
- done_copy = 1;
- }
- if (!done_copy) {
- while ((nr = read(from_fd, buf, sizeof(buf))) > 0)
- if ((nw = write(to_fd, buf, nr)) != nr) {
- serrno = errno;
- (void)unlink(to_name);
- errno = nw > 0 ? EIO : serrno;
- err(EX_OSERR, "%s", to_name);
- }
- if (nr != 0) {
- serrno = errno;
- (void)unlink(to_name);
- errno = serrno;
- err(EX_OSERR, "%s", from_name);
- }
- }
-}
-
-/*
- * strip --
- * use strip(1) to strip the target file
- */
-void
-strip(const char *to_name)
-{
- const char *stripbin;
- int serrno, status;
-
- switch (fork()) {
- case -1:
- serrno = errno;
- (void)unlink(to_name);
- errno = serrno;
- err(EX_TEMPFAIL, "fork");
- case 0:
- stripbin = getenv("STRIPBIN");
- if (stripbin == NULL)
- stripbin = "strip";
- execlp(stripbin, stripbin, to_name, (char *)NULL);
- err(EX_OSERR, "exec(%s)", stripbin);
- default:
- if (wait(&status) == -1 || status) {
- serrno = errno;
- (void)unlink(to_name);
- errc(EX_SOFTWARE, serrno, "wait");
- /* NOTREACHED */
- }
- }
-}
-
-/*
- * install_dir --
- * build directory heirarchy
- */
-void
-install_dir(char *path)
-{
- char *p;
- struct stat sb;
- int ch;
-
- for (p = path;; ++p)
- if (!*p || (p != path && *p == '/')) {
- ch = *p;
- *p = '\0';
- if (stat(path, &sb)) {
- if (errno != ENOENT || mkdir(path, 0755) < 0) {
- err(EX_OSERR, "mkdir %s", path);
- /* NOTREACHED */
- } else if (verbose)
- (void)printf("install: mkdir %s\n",
- path);
- } else if (!S_ISDIR(sb.st_mode))
- errx(EX_OSERR, "%s exists but is not a directory", path);
- if (!(*p = ch))
- break;
- }
-
- if ((gid != (gid_t)-1 || uid != (uid_t)-1) && chown(path, uid, gid))
- warn("chown %u:%u %s", uid, gid, path);
- if (chmod(path, mode))
- warn("chmod %o %s", mode, path);
-}
-
-/*
- * usage --
- * print a usage message and die
- */
-void
-usage()
-{
- (void)fprintf(stderr,
-"usage: install [-bCcpSsv] [-B suffix] [-f flags] [-g group] [-m mode]\n"
-" [-o owner] file1 file2\n"
-" install [-bCcpSsv] [-B suffix] [-f flags] [-g group] [-m mode]\n"
-" [-o owner] file1 ... fileN directory\n"
-" install -d [-v] [-g group] [-m mode] [-o owner] directory ...\n");
- exit(EX_USAGE);
- /* NOTREACHED */
-}
-
-/*
- * trymmap --
- * return true (1) if mmap should be tried, false (0) if not.
- */
-int
-trymmap(int fd)
-{
-/*
- * The ifdef is for bootstrapping - f_fstypename doesn't exist in
- * pre-Lite2-merge systems.
- */
-#ifdef MFSNAMELEN
- struct statfs stfs;
-
- if (nommap || fstatfs(fd, &stfs) != 0)
- return (0);
- if (strcmp(stfs.f_fstypename, "ufs") == 0 ||
- strcmp(stfs.f_fstypename, "cd9660") == 0)
- return (1);
-#endif
- return (0);
-}
diff --git a/usr.bin/xlint/Makefile b/usr.bin/xlint/Makefile
deleted file mode 100644
index 68264f4..0000000
--- a/usr.bin/xlint/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-# $NetBSD: Makefile,v 1.2 1995/07/03 21:23:45 cgd Exp $
-# $FreeBSD$
-
-.if ${LINT} == "lint"
-_llib= llib
-.else
-_llib=
-.endif
-
-SUBDIR= lint1 lint2 xlint ${_llib}
-
-.include <bsd.subdir.mk>
diff --git a/usr.bin/xlint/Makefile.inc b/usr.bin/xlint/Makefile.inc
deleted file mode 100644
index 0c1b97a..0000000
--- a/usr.bin/xlint/Makefile.inc
+++ /dev/null
@@ -1,12 +0,0 @@
-# $NetBSD: Makefile.inc,v 1.8 2002/02/04 00:18:32 thorpej Exp $
-# $FreeBSD$
-
-WARNS?= 0
-
-.PATH: ${.CURDIR}/../common
-
-TARGET_ARCH?= ${MACHINE_ARCH}
-CFLAGS+= -I${.CURDIR}/../arch/${TARGET_ARCH}
-CFLAGS+= -I${.CURDIR}/../common
-
-OBJECT_FMT= ELF
diff --git a/usr.bin/xlint/arch/amd64/targparam.h b/usr.bin/xlint/arch/amd64/targparam.h
deleted file mode 100644
index 8d57fbd..0000000
--- a/usr.bin/xlint/arch/amd64/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.2 2002/01/30 06:55:00 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "lp64.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (16 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
diff --git a/usr.bin/xlint/arch/arm/targparam.h b/usr.bin/xlint/arch/arm/targparam.h
deleted file mode 100644
index d1d6f94..0000000
--- a/usr.bin/xlint/arch/arm/targparam.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:19 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#if defined(TARGET_OBJFMT_ELF)
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-#else
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-#endif
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (8 * CHAR_BIT)
-
-#if defined(TARGET_OBJFMT_ELF)
-/* XXX ARM ELF ABI says packed enums -- variable size! */
-#define ENUM_SIZE (4 * CHAR_BIT)
-#else
-#define ENUM_SIZE (4 * CHAR_BIT)
-#endif
diff --git a/usr.bin/xlint/arch/i386/targparam.h b/usr.bin/xlint/arch/i386/targparam.h
deleted file mode 100644
index 86dfb19..0000000
--- a/usr.bin/xlint/arch/i386/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:19 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (12 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
diff --git a/usr.bin/xlint/arch/ia64/targparam.h b/usr.bin/xlint/arch/ia64/targparam.h
deleted file mode 100644
index 7ec1038..0000000
--- a/usr.bin/xlint/arch/ia64/targparam.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* $FreeBSD$ */
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:18 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "lp64.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (16 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
diff --git a/usr.bin/xlint/arch/m68000/targparam.h b/usr.bin/xlint/arch/m68000/targparam.h
deleted file mode 100644
index f79777d..0000000
--- a/usr.bin/xlint/arch/m68000/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD$ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (8 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
diff --git a/usr.bin/xlint/arch/m68k/targparam.h b/usr.bin/xlint/arch/m68k/targparam.h
deleted file mode 100644
index 86dfb19..0000000
--- a/usr.bin/xlint/arch/m68k/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:19 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (12 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
diff --git a/usr.bin/xlint/arch/mips/targparam.h b/usr.bin/xlint/arch/mips/targparam.h
deleted file mode 100644
index 7b6e056..0000000
--- a/usr.bin/xlint/arch/mips/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:19 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (8 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
diff --git a/usr.bin/xlint/arch/ns32k/targparam.h b/usr.bin/xlint/arch/ns32k/targparam.h
deleted file mode 100644
index f6b3308..0000000
--- a/usr.bin/xlint/arch/ns32k/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:20 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (12 * CHAR_BIT) /* XXX double-check */
-
-#define ENUM_SIZE (4 * CHAR_BIT)
diff --git a/usr.bin/xlint/arch/powerpc/targparam.h b/usr.bin/xlint/arch/powerpc/targparam.h
deleted file mode 100644
index d49eb76..0000000
--- a/usr.bin/xlint/arch/powerpc/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:20 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (8 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
diff --git a/usr.bin/xlint/arch/sh3/targparam.h b/usr.bin/xlint/arch/sh3/targparam.h
deleted file mode 100644
index d49eb76..0000000
--- a/usr.bin/xlint/arch/sh3/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:20 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (8 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
diff --git a/usr.bin/xlint/arch/sparc/targparam.h b/usr.bin/xlint/arch/sparc/targparam.h
deleted file mode 100644
index c0eabbd..0000000
--- a/usr.bin/xlint/arch/sparc/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:21 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (8 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
diff --git a/usr.bin/xlint/arch/sparc64/targparam.h b/usr.bin/xlint/arch/sparc64/targparam.h
deleted file mode 100644
index 8d57fbd..0000000
--- a/usr.bin/xlint/arch/sparc64/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.2 2002/01/30 06:55:00 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "lp64.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (16 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
diff --git a/usr.bin/xlint/arch/vax/targparam.h b/usr.bin/xlint/arch/vax/targparam.h
deleted file mode 100644
index 261369d..0000000
--- a/usr.bin/xlint/arch/vax/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:22 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (8 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
diff --git a/usr.bin/xlint/arch/x86_64/targparam.h b/usr.bin/xlint/arch/x86_64/targparam.h
deleted file mode 100644
index 6cfedcb..0000000
--- a/usr.bin/xlint/arch/x86_64/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:22 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "lp64.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (16 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
diff --git a/usr.bin/xlint/common/emit.c b/usr.bin/xlint/common/emit.c
deleted file mode 100644
index 9413433..0000000
--- a/usr.bin/xlint/common/emit.c
+++ /dev/null
@@ -1,234 +0,0 @@
-/* $NetBSD: emit.c,v 1.2 2002/01/21 19:49:51 tv Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: emit.c,v 1.2 2002/01/21 19:49:51 tv Exp $");
-#endif
-
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "lint.h"
-
-/* name and handle of output file */
-static const char *loname;
-static FILE *lout;
-
-/* output buffer data */
-ob_t ob;
-
-static void outxbuf(void);
-
-
-/*
- * initialize output
- */
-void
-outopen(const char *name)
-{
-
- loname = name;
-
- /* Open output file */
- if ((lout = fopen(name, "w")) == NULL)
- err(1, "cannot open '%s'", name);
-
- /* Create output buffer */
- ob.o_len = 1024;
- ob.o_end = (ob.o_buf = ob.o_nxt = xmalloc(ob.o_len)) + ob.o_len;
-}
-
-/*
- * flush output buffer and close file
- */
-void
-outclose(void)
-{
-
- outclr();
- if (fclose(lout) == EOF)
- err(1, "cannot close '%s'", loname);
-}
-
-/*
- * resize output buffer
- */
-static void
-outxbuf(void)
-{
- ptrdiff_t coffs;
-
- coffs = ob.o_nxt - ob.o_buf;
- ob.o_len *= 2;
- ob.o_end = (ob.o_buf = xrealloc(ob.o_buf, ob.o_len)) + ob.o_len;
- ob.o_nxt = ob.o_buf + coffs;
-}
-
-/*
- * reset output buffer
- * if it is not empty, it is flushed
- */
-void
-outclr(void)
-{
- size_t sz;
-
- if (ob.o_buf != ob.o_nxt) {
- outchar('\n');
- sz = ob.o_nxt - ob.o_buf;
- if (sz > ob.o_len)
- errx(1, "internal error: outclr() 1");
- if (fwrite(ob.o_buf, sz, 1, lout) != 1)
- err(1, "cannot write to %s", loname);
- ob.o_nxt = ob.o_buf;
- }
-}
-
-/*
- * write a character to the output buffer
- */
-void
-outchar(int c)
-{
-
- if (ob.o_nxt == ob.o_end)
- outxbuf();
- *ob.o_nxt++ = (char)c;
-}
-
-/*
- * write a character to the output buffer, qouted if necessary
- */
-void
-outqchar(int c)
-{
-
- if (isprint(c) && c != '\\' && c != '"' && c != '\'') {
- outchar(c);
- } else {
- outchar('\\');
- switch (c) {
- case '\\':
- outchar('\\');
- break;
- case '"':
- outchar('"');
- break;
- case '\'':
- outchar('\'');
- break;
- case '\b':
- outchar('b');
- break;
- case '\t':
- outchar('t');
- break;
- case '\n':
- outchar('n');
- break;
- case '\f':
- outchar('f');
- break;
- case '\r':
- outchar('r');
- break;
- case '\v':
- outchar('v');
- break;
- case '\a':
- outchar('a');
- break;
- default:
- outchar((((u_int)c >> 6) & 07) + '0');
- outchar((((u_int)c >> 3) & 07) + '0');
- outchar((c & 07) + '0');
- break;
- }
- }
-}
-
-/*
- * write a strint to the output buffer
- * the string must not contain any characters which
- * should be quoted
- */
-void
-outstrg(const char *s)
-{
-
- while (*s != '\0') {
- if (ob.o_nxt == ob.o_end)
- outxbuf();
- *ob.o_nxt++ = *s++;
- }
-}
-
-/*
- * write an integer value to toe output buffer
- */
-void
-outint(int i)
-{
-
- if ((ob.o_end - ob.o_nxt) < 3 * sizeof (int))
- outxbuf();
- ob.o_nxt += sprintf(ob.o_nxt, "%d", i);
-}
-
-/*
- * write the name of a symbol to the output buffer
- * the name is preceded by its length
- */
-void
-outname(const char *name)
-{
-
- if (name == NULL)
- errx(1, "internal error: outname() 1");
- outint((int)strlen(name));
- outstrg(name);
-}
-
-/*
- * write the name of the .c source
- */
-void
-outsrc(const char *name)
-{
-
- outclr();
- outchar('S');
- outstrg(name);
-}
diff --git a/usr.bin/xlint/common/externs.h b/usr.bin/xlint/common/externs.h
deleted file mode 100644
index 8c454b4..0000000
--- a/usr.bin/xlint/common/externs.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* $NetBSD: externs.h,v 1.1 2002/01/18 20:39:23 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * main[12].c
- */
-extern int pflag;
-
-/*
- * inittyp.c
- */
-extern void inittyp(void);
-
-/*
- * mem.c
- */
-extern void *xmalloc(size_t);
-extern void *xcalloc(size_t, size_t);
-extern void *xrealloc(void *, size_t);
-extern char *xstrdup(const char *);
-extern void nomem(void);
-
-/*
- * emit.c
- */
-extern ob_t ob;
-
-extern void outopen(const char *);
-extern void outclose(void);
-extern void outclr(void);
-extern void outchar(int);
-extern void outqchar(int);
-extern void outstrg(const char *);
-extern void outint(int);
-extern void outname(const char *);
-extern void outsrc(const char *);
diff --git a/usr.bin/xlint/common/ilp32.h b/usr.bin/xlint/common/ilp32.h
deleted file mode 100644
index 5eb5f03..0000000
--- a/usr.bin/xlint/common/ilp32.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* $NetBSD: ilp32.h,v 1.1 2002/01/18 20:39:23 thorpej Exp $ */
-
-/*
- * Copyright (c) 2001 Wasabi Systems, Inc.
- * All rights reserved.
- *
- * Written by Jason R. Thorpe for Wasabi Systems, Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed for the NetBSD Project by
- * Wasabi Systems, Inc.
- * 4. The name of Wasabi Systems, Inc. may not be used to endorse
- * or promote products derived from this software without specific prior
- * written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Type sizes for IPL32 platforms (int, long, pointer: 32-bit)
- */
-
-#define CHAR_SIZE (CHAR_BIT)
-#define SHORT_SIZE (2 * CHAR_BIT)
-#define INT_SIZE (4 * CHAR_BIT)
-#define LONG_SIZE (4 * CHAR_BIT)
-#define QUAD_SIZE (8 * CHAR_BIT)
-#define PTR_SIZE (4 * CHAR_BIT)
-
-#define TARG_INT_MAX ((int32_t) (((uint32_t) -1) >> 1))
-#define TARG_INT_MIN ((-TARG_INT_MAX) - 1)
-#define TARG_UINT_MAX ((uint32_t) -1)
-
-#define TARG_LONG_MAX TARG_INT_MAX
-#define TARG_LONG_MIN TARG_INT_MIN
-#define TARG_ULONG_MAX TARG_UINT_MAX
-
-#define TARG_QUAD_MAX ((int64_t) (((uint64_t) -1) >> 1))
-#define TARG_QUAD_MIN ((-TARG_QUAD_MAX) - 1)
-#define TARG_UQUAD_MAX ((uint64_t) -1)
diff --git a/usr.bin/xlint/common/inittyp.c b/usr.bin/xlint/common/inittyp.c
deleted file mode 100644
index b0958bf..0000000
--- a/usr.bin/xlint/common/inittyp.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/* $NetBSD: inittyp.c,v 1.3 2002/01/30 06:55:02 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: inittyp.c,v 1.3 2002/01/30 06:55:02 thorpej Exp $");
-#endif
-
-#include <ctype.h>
-#include <limits.h>
-#include <stdlib.h>
-
-#include "lint.h"
-
-/* various type information */
-ttab_t ttab[NTSPEC];
-
-void
-inittyp(void)
-{
- int i;
- static const struct {
- tspec_t it_tspec;
- ttab_t it_ttab;
- } ittab[NTSPEC] = {
- { SIGNED, { 0, 0,
- SIGNED, UNSIGN,
- 0, 0, 0, 0, 0, "signed" } },
- { UNSIGN, { 0, 0,
- SIGNED, UNSIGN,
- 0, 0, 0, 0, 0, "unsigned" } },
- { CHAR, { CHAR_SIZE, CHAR_BIT,
- SCHAR, UCHAR,
- 1, 0, 0, 1, 1, "char" } },
- { SCHAR, { CHAR_SIZE, CHAR_BIT,
- SCHAR, UCHAR,
- 1, 0, 0, 1, 1, "signed char" } },
- { UCHAR, { CHAR_SIZE, CHAR_BIT,
- SCHAR, UCHAR,
- 1, 1, 0, 1, 1, "unsigned char" } },
- { SHORT, { SHORT_SIZE, 2 * CHAR_BIT,
- SHORT, USHORT,
- 1, 0, 0, 1, 1, "short" } },
- { USHORT, { SHORT_SIZE, 2 * CHAR_BIT,
- SHORT, USHORT,
- 1, 1, 0, 1, 1, "unsigned short" } },
- { INT, { INT_SIZE, 3 * CHAR_BIT,
- INT, UINT,
- 1, 0, 0, 1, 1, "int" } },
- { UINT, { INT_SIZE, 3 * CHAR_BIT,
- INT, UINT,
- 1, 1, 0, 1, 1, "unsigned int" } },
- { LONG, { LONG_SIZE, 4 * CHAR_BIT,
- LONG, ULONG,
- 1, 0, 0, 1, 1, "long" } },
- { ULONG, { LONG_SIZE, 4 * CHAR_BIT,
- LONG, ULONG,
- 1, 1, 0, 1, 1, "unsigned long" } },
- { QUAD, { QUAD_SIZE, 8 * CHAR_BIT,
- QUAD, UQUAD,
- 1, 0, 0, 1, 1, "long long" } },
- { UQUAD, { QUAD_SIZE, 8 * CHAR_BIT,
- QUAD, UQUAD,
- 1, 1, 0, 1, 1, "unsigned long long" } },
- { FLOAT, { FLOAT_SIZE, 4 * CHAR_BIT,
- FLOAT, FLOAT,
- 0, 0, 1, 1, 1, "float" } },
- { DOUBLE, { DOUBLE_SIZE, 8 * CHAR_BIT,
- DOUBLE, DOUBLE,
- 0, 0, 1, 1, 1, "double" } },
- { LDOUBLE, { LDOUBLE_SIZE, 10 * CHAR_BIT,
- LDOUBLE, LDOUBLE,
- 0, 0, 1, 1, 1, "long double" } },
- { VOID, { -1, -1,
- VOID, VOID,
- 0, 0, 0, 0, 0, "void" } },
- { STRUCT, { -1, -1,
- STRUCT, STRUCT,
- 0, 0, 0, 0, 0, "struct" } },
- { UNION, { -1, -1,
- UNION, UNION,
- 0, 0, 0, 0, 0, "union" } },
- { ENUM, { ENUM_SIZE, 3 * CHAR_BIT,
- ENUM, ENUM,
- 1, 0, 0, 1, 1, "enum" } },
- { PTR, { PTR_SIZE, 4 * CHAR_BIT,
- PTR, PTR,
- 0, 1, 0, 0, 1, "pointer" } },
- { ARRAY, { -1, -1,
- ARRAY, ARRAY,
- 0, 0, 0, 0, 0, "array" } },
- { FUNC, { -1, -1,
- FUNC, FUNC,
- 0, 0, 0, 0, 0, "function" } },
- };
-
- for (i = 0; i < sizeof (ittab) / sizeof (ittab[0]); i++)
- STRUCT_ASSIGN(ttab[ittab[i].it_tspec], ittab[i].it_ttab);
- if (!pflag) {
- for (i = 0; i < NTSPEC; i++)
- ttab[i].tt_psz = ttab[i].tt_sz;
- }
-}
diff --git a/usr.bin/xlint/common/lint.h b/usr.bin/xlint/common/lint.h
deleted file mode 100644
index c50d28d..0000000
--- a/usr.bin/xlint/common/lint.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/* $NetBSD: lint.h,v 1.5 2002/03/07 18:29:56 tv Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#else
-#define HAVE_DECL_SYS_SIGNAME 1
-#endif
-
-#include <sys/types.h>
-#include <stddef.h>
-#include <err.h>
-#include <inttypes.h>
-#include <stdio.h>
-
-#include "param.h"
-
-/*
- * Type specifiers, used in type structures (type_t) and otherwere.
- */
-typedef enum {
- NOTSPEC = 0,
- SIGNED, /* keyword "signed", only used in the parser */
- UNSIGN, /* keyword "unsigned", only used in the parser */
- CHAR, /* char */
- SCHAR, /* signed char */
- UCHAR, /* unsigned char */
- SHORT, /* (signed) short */
- USHORT, /* unsigned short */
- INT, /* (signed) int */
- UINT, /* unsigned int */
- LONG, /* (signed) long */
- ULONG, /* unsigned long */
- QUAD, /* (signed) long long */
- UQUAD, /* unsigned long long */
- FLOAT, /* float */
- DOUBLE, /* double or, with tflag, long float */
- LDOUBLE, /* long double */
- VOID, /* void */
- STRUCT, /* structure tag */
- UNION, /* union tag */
- ENUM, /* enum tag */
- PTR, /* pointer */
- ARRAY, /* array */
- FUNC, /* function */
- NTSPEC
-} tspec_t;
-
-/*
- * size of types, name and classification
- */
-typedef struct {
- int tt_sz; /* size in bits */
- int tt_psz; /* size, different from tt_sz
- if pflag is set */
- tspec_t tt_styp; /* signed counterpart */
- tspec_t tt_utyp; /* unsigned counterpart */
- u_int tt_isityp : 1; /* 1 if integer type */
- u_int tt_isutyp : 1; /* 1 if unsigned integer type */
- u_int tt_isftyp : 1; /* 1 if floating point type */
- u_int tt_isatyp : 1; /* 1 if arithmetic type */
- u_int tt_issclt : 1; /* 1 if scalar type */
- char *tt_name; /* Bezeichnung des Typs */
-} ttab_t;
-
-#define size(t) (ttab[t].tt_sz)
-#define psize(t) (ttab[t].tt_psz)
-#define styp(t) (ttab[t].tt_styp)
-#define utyp(t) (ttab[t].tt_utyp)
-#define isityp(t) (ttab[t].tt_isityp)
-#define isutyp(t) (ttab[t].tt_isutyp)
-#define isftyp(t) (ttab[t].tt_isftyp)
-#define isatyp(t) (ttab[t].tt_isatyp)
-#define issclt(t) (ttab[t].tt_issclt)
-
-extern ttab_t ttab[];
-
-
-typedef enum {
- NODECL, /* until now not declared */
- DECL, /* declared */
- TDEF, /* tentative defined */
- DEF /* defined */
-} def_t;
-
-/*
- * Following structure contains some data used for the output buffer.
- */
-typedef struct ob {
- char *o_buf; /* buffer */
- char *o_end; /* first byte after buffer */
- size_t o_len; /* length of buffer */
- char *o_nxt; /* next free byte in buffer */
-} ob_t;
-
-#include "externs.h"
diff --git a/usr.bin/xlint/common/lp64.h b/usr.bin/xlint/common/lp64.h
deleted file mode 100644
index cd88700..0000000
--- a/usr.bin/xlint/common/lp64.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* $NetBSD: lp64.h,v 1.1 2002/01/18 20:39:23 thorpej Exp $ */
-
-/*
- * Copyright (c) 2001 Wasabi Systems, Inc.
- * All rights reserved.
- *
- * Written by Jason R. Thorpe for Wasabi Systems, Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed for the NetBSD Project by
- * Wasabi Systems, Inc.
- * 4. The name of Wasabi Systems, Inc. may not be used to endorse
- * or promote products derived from this software without specific prior
- * written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Type sizes for LP64 platforms (long, pointer: 64-bit)
- */
-
-#define CHAR_SIZE (CHAR_BIT)
-#define SHORT_SIZE (2 * CHAR_BIT)
-#define INT_SIZE (4 * CHAR_BIT)
-#define LONG_SIZE (8 * CHAR_BIT)
-#define QUAD_SIZE (8 * CHAR_BIT)
-#define PTR_SIZE (8 * CHAR_BIT)
-
-#define TARG_INT_MAX ((int32_t) (((uint32_t) -1) >> 1))
-#define TARG_INT_MIN ((-TARG_INT_MAX) - 1)
-#define TARG_UINT_MAX ((uint32_t) -1)
-
-#define TARG_QUAD_MAX ((int64_t) (((uint64_t) -1) >> 1))
-#define TARG_QUAD_MIN ((-TARG_QUAD_MAX) - 1)
-#define TARG_UQUAD_MAX ((uint64_t) -1)
-
-#define TARG_LONG_MAX TARG_QUAD_MAX
-#define TARG_LONG_MIN TARG_QUAD_MIN
-#define TARG_ULONG_MAX TARG_UQUAD_MAX
diff --git a/usr.bin/xlint/common/mem.c b/usr.bin/xlint/common/mem.c
deleted file mode 100644
index 2621081..0000000
--- a/usr.bin/xlint/common/mem.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/* $NetBSD: mem.c,v 1.2 2002/01/21 19:49:51 tv Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: mem.c,v 1.2 2002/01/21 19:49:51 tv Exp $");
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "lint.h"
-
-void *
-xmalloc(size_t s)
-{
- void *p;
-
- if ((p = malloc(s)) == NULL)
- nomem();
- return (p);
-}
-
-void *
-xcalloc(size_t n, size_t s)
-{
- void *p;
-
- if ((p = calloc(n, s)) == NULL)
- nomem();
- return (p);
-}
-
-void *
-xrealloc(void *p, size_t s)
-{
-
- if ((p = realloc(p, s)) == NULL)
- nomem();
- return (p);
-}
-
-char *
-xstrdup(const char *s)
-{
- char *s2;
-
- if ((s2 = strdup(s)) == NULL)
- nomem();
- return (s2);
-}
-
-void
-nomem(void)
-{
-
- errx(1, "virtual memory exhausted");
-}
diff --git a/usr.bin/xlint/common/param.h b/usr.bin/xlint/common/param.h
deleted file mode 100644
index 5a28ce4..0000000
--- a/usr.bin/xlint/common/param.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* $NetBSD: param.h,v 1.2 2002/02/05 03:04:26 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Minimun size of string buffer. If this is not enough, the buffer
- * is enlarged in steps of STRBLEN bytes.
- */
-#define STRBLEN 256
-
-/*
- * This defines the size of memory blocks which are used to allocate
- * memory in larger chunks.
- */
-#define MBLKSIZ ((size_t)0x4000)
-
-/*
- * Sizes of hash tables
- * Should be a prime. Possible primes are
- * 307, 401, 503, 601, 701, 809, 907, 1009, 1103, 1201, 1301, 1409, 1511.
- *
- * HSHSIZ1 symbol table 1st pass
- * HSHSIZ2 symbol table 2nd pass
- * THSHSIZ2 type table 2nd pass
- */
-#define HSHSIZ1 503
-#define HSHSIZ2 1009
-#define THSHSIZ2 1009
-
-/*
- * Pull in target-specific parameters.
- */
-#include "targparam.h"
-
-/*
- * Make sure this matches wchar_t.
- */
-#define WCHAR INT
-
-/*
- * And the sparc64 long double code generation is broken.
- */
-#if !defined(__sparc64__)
-typedef long double ldbl_t;
-#else
-typedef double ldbl_t;
-#endif
-
-/*
- * Some traditional compilers are not able to assign structures.
- */
-#define STRUCT_ASSIGN(dest, src) (dest) = (src)
diff --git a/usr.bin/xlint/lint1/Makefile b/usr.bin/xlint/lint1/Makefile
deleted file mode 100644
index b7f78c5..0000000
--- a/usr.bin/xlint/lint1/Makefile
+++ /dev/null
@@ -1,22 +0,0 @@
-# $NetBSD: Makefile,v 1.3 1995/07/04 01:53:05 cgd Exp $
-# $FreeBSD$
-
-PROG= lint1
-SRCS= cgram.y scan.l mem1.c mem.c err.c main1.c decl.c tree.c func.c \
- init.c emit.c emit1.c inittyp.c
-MAN= lint.7
-CLEANFILES= lint.7
-
-LDADD= -ll -lm
-DPADD= ${LIBL} ${LIBM}
-CFLAGS+= -I. -I${.CURDIR}
-LINTFLAGS=-aehpz
-
-BINDIR= /usr/libexec
-
-.PATH: ${.CURDIR}/../common
-
-lint.7: makeman
- sh ${.CURDIR}/makeman ${DESTDIR}${BINDIR}/${PROG} -m >${.TARGET}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/xlint/lint1/cgram.y b/usr.bin/xlint/lint1/cgram.y
deleted file mode 100644
index 8791a2d..0000000
--- a/usr.bin/xlint/lint1/cgram.y
+++ /dev/null
@@ -1,1783 +0,0 @@
-%{
-/* $NetBSD: cgram.y,v 1.23 2002/01/31 19:36:53 tv Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: cgram.y,v 1.23 2002/01/31 19:36:53 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-
-#include "lint1.h"
-
-/*
- * Contains the level of current declaration. 0 is extern.
- * Used for symbol table entries.
- */
-int blklev;
-
-/*
- * level for memory allocation. Normaly the same as blklev.
- * An exeption is the declaration of arguments in prototypes. Memory
- * for these can't be freed after the declaration, but symbols must
- * be removed from the symbol table after the declaration.
- */
-int mblklev;
-
-/*
- * Save the no-warns state and restore it to avoid the problem where
- * if (expr) { stmt } / * NOLINT * / stmt;
- */
-static int onowarn = -1;
-
-static int toicon(tnode_t *);
-static void idecl(sym_t *, int, sbuf_t *);
-static void ignuptorp(void);
-
-#ifdef DEBUG
-static __inline void CLRWFLGS(void);
-static __inline void CLRWFLGS(void)
-{
- printf("%s, %d: clear flags %s %d\n", curr_pos.p_file,
- curr_pos.p_line, __FILE__, __LINE__);
- clrwflgs();
- onowarn = -1;
-}
-
-static __inline void SAVE(void);
-static __inline void SAVE(void)
-{
- if (onowarn != -1)
- abort();
- printf("%s, %d: save flags %s %d = %d\n", curr_pos.p_file,
- curr_pos.p_line, __FILE__, __LINE__, nowarn);
- onowarn = nowarn;
-}
-
-static __inline void RESTORE(void);
-static __inline void RESTORE(void)
-{
- if (onowarn != -1) {
- nowarn = onowarn;
- printf("%s, %d: restore flags %s %d = %d\n", curr_pos.p_file,
- curr_pos.p_line, __FILE__, __LINE__, nowarn);
- onowarn = -1;
- } else
- CLRWFLGS();
-}
-#else
-#define CLRWFLGS() clrwflgs(), onowarn = -1
-#define SAVE() onowarn = nowarn
-#define RESTORE() (void)(onowarn == -1 ? (clrwflgs(), 0) : (nowarn = onowarn))
-#endif
-%}
-
-%union {
- int y_int;
- val_t *y_val;
- sbuf_t *y_sb;
- sym_t *y_sym;
- op_t y_op;
- scl_t y_scl;
- tspec_t y_tspec;
- tqual_t y_tqual;
- type_t *y_type;
- tnode_t *y_tnode;
- strg_t *y_strg;
- pqinf_t *y_pqinf;
-};
-
-%token T_LBRACE T_RBRACE T_LBRACK T_RBRACK T_LPARN T_RPARN
-%token <y_op> T_STROP
-%token <y_op> T_UNOP
-%token <y_op> T_INCDEC
-%token T_SIZEOF
-%token <y_op> T_MULT
-%token <y_op> T_DIVOP
-%token <y_op> T_ADDOP
-%token <y_op> T_SHFTOP
-%token <y_op> T_RELOP
-%token <y_op> T_EQOP
-%token <y_op> T_AND
-%token <y_op> T_XOR
-%token <y_op> T_OR
-%token <y_op> T_LOGAND
-%token <y_op> T_LOGOR
-%token T_QUEST
-%token T_COLON
-%token <y_op> T_ASSIGN
-%token <y_op> T_OPASS
-%token T_COMMA
-%token T_SEMI
-%token T_ELLIPSE
-
-/* storage classes (extern, static, auto, register and typedef) */
-%token <y_scl> T_SCLASS
-
-/* types (char, int, short, long, unsigned, signed, float, double, void) */
-%token <y_tspec> T_TYPE
-
-/* qualifiers (const, volatile) */
-%token <y_tqual> T_QUAL
-
-/* struct or union */
-%token <y_tspec> T_SOU
-
-/* enum */
-%token T_ENUM
-
-/* remaining keywords */
-%token T_CASE
-%token T_DEFAULT
-%token T_IF
-%token T_ELSE
-%token T_SWITCH
-%token T_DO
-%token T_WHILE
-%token T_FOR
-%token T_GOTO
-%token T_CONTINUE
-%token T_BREAK
-%token T_RETURN
-%token T_ASM
-%token T_SYMBOLRENAME
-
-%left T_COMMA
-%right T_ASSIGN T_OPASS
-%right T_QUEST T_COLON
-%left T_LOGOR
-%left T_LOGAND
-%left T_OR
-%left T_XOR
-%left T_AND
-%left T_EQOP
-%left T_RELOP
-%left T_SHFTOP
-%left T_ADDOP
-%left T_MULT T_DIVOP
-%right T_UNOP T_INCDEC T_SIZEOF
-%left T_LPARN T_LBRACK T_STROP
-
-%token <y_sb> T_NAME
-%token <y_sb> T_TYPENAME
-%token <y_val> T_CON
-%token <y_strg> T_STRING
-
-%type <y_sym> func_decl
-%type <y_sym> notype_decl
-%type <y_sym> type_decl
-%type <y_type> typespec
-%type <y_type> clrtyp_typespec
-%type <y_type> notype_typespec
-%type <y_type> struct_spec
-%type <y_type> enum_spec
-%type <y_sym> struct_tag
-%type <y_sym> enum_tag
-%type <y_tspec> struct
-%type <y_sym> struct_declaration
-%type <y_sb> identifier
-%type <y_sym> member_declaration_list_with_rbrace
-%type <y_sym> member_declaration_list
-%type <y_sym> member_declaration
-%type <y_sym> notype_member_decls
-%type <y_sym> type_member_decls
-%type <y_sym> notype_member_decl
-%type <y_sym> type_member_decl
-%type <y_tnode> constant
-%type <y_sym> enum_declaration
-%type <y_sym> enums_with_opt_comma
-%type <y_sym> enums
-%type <y_sym> enumerator
-%type <y_sym> ename
-%type <y_sym> notype_direct_decl
-%type <y_sym> type_direct_decl
-%type <y_pqinf> pointer
-%type <y_pqinf> asterisk
-%type <y_sym> param_decl
-%type <y_sym> param_list
-%type <y_sym> abs_decl_param_list
-%type <y_sym> direct_param_decl
-%type <y_sym> notype_param_decl
-%type <y_sym> direct_notype_param_decl
-%type <y_pqinf> type_qualifier_list
-%type <y_pqinf> type_qualifier
-%type <y_sym> identifier_list
-%type <y_sym> abs_decl
-%type <y_sym> direct_abs_decl
-%type <y_sym> vararg_parameter_type_list
-%type <y_sym> parameter_type_list
-%type <y_sym> parameter_declaration
-%type <y_tnode> expr
-%type <y_tnode> term
-%type <y_tnode> func_arg_list
-%type <y_op> point_or_arrow
-%type <y_type> type_name
-%type <y_sym> abstract_declaration
-%type <y_tnode> do_while_expr
-%type <y_tnode> opt_expr
-%type <y_strg> string
-%type <y_strg> string2
-%type <y_sb> opt_asm_or_symbolrename
-
-
-%%
-
-program:
- /* empty */ {
- if (sflag) {
- /* empty translation unit */
- error(272);
- } else if (!tflag) {
- /* empty translation unit */
- warning(272);
- }
- }
- | translation_unit
- ;
-
-translation_unit:
- ext_decl
- | translation_unit ext_decl
- ;
-
-ext_decl:
- asm_stmnt
- | func_def {
- glclup(0);
- CLRWFLGS();
- }
- | data_def {
- glclup(0);
- CLRWFLGS();
- }
- ;
-
-data_def:
- T_SEMI {
- if (sflag) {
- /* syntax error: empty declaration */
- error(0);
- } else if (!tflag) {
- /* syntax error: empty declaration */
- warning(0);
- }
- }
- | clrtyp deftyp notype_init_decls T_SEMI {
- if (sflag) {
- /* old style declaration; add "int" */
- error(1);
- } else if (!tflag) {
- /* old style declaration; add "int" */
- warning(1);
- }
- }
- | declmods deftyp T_SEMI {
- if (dcs->d_scl == TYPEDEF) {
- /* typedef declares no type name */
- warning(72);
- } else {
- /* empty declaration */
- warning(2);
- }
- }
- | declmods deftyp notype_init_decls T_SEMI
- | declspecs deftyp T_SEMI {
- if (dcs->d_scl == TYPEDEF) {
- /* typedef declares no type name */
- warning(72);
- } else if (!dcs->d_nedecl) {
- /* empty declaration */
- warning(2);
- }
- }
- | declspecs deftyp type_init_decls T_SEMI
- | error T_SEMI {
- globclup();
- }
- | error T_RBRACE {
- globclup();
- }
- ;
-
-func_def:
- func_decl {
- if ($1->s_type->t_tspec != FUNC) {
- /* syntax error */
- error(249);
- YYERROR;
- }
- if ($1->s_type->t_typedef) {
- /* ()-less function definition */
- error(64);
- YYERROR;
- }
- funcdef($1);
- blklev++;
- pushdecl(ARG);
- } opt_arg_declaration_list {
- popdecl();
- blklev--;
- cluparg();
- pushctrl(0);
- } comp_stmnt {
- funcend();
- popctrl(0);
- }
- ;
-
-func_decl:
- clrtyp deftyp notype_decl {
- $$ = $3;
- }
- | declmods deftyp notype_decl {
- $$ = $3;
- }
- | declspecs deftyp type_decl {
- $$ = $3;
- }
- ;
-
-opt_arg_declaration_list:
- /* empty */
- | arg_declaration_list
- ;
-
-arg_declaration_list:
- arg_declaration
- | arg_declaration_list arg_declaration
- /* XXX or better "arg_declaration error" ? */
- | error
- ;
-
-/*
- * "arg_declaration" is separated from "declaration" because it
- * needs other error handling.
- */
-
-arg_declaration:
- declmods deftyp T_SEMI {
- /* empty declaration */
- warning(2);
- }
- | declmods deftyp notype_init_decls T_SEMI
- | declspecs deftyp T_SEMI {
- if (!dcs->d_nedecl) {
- /* empty declaration */
- warning(2);
- } else {
- tspec_t ts = dcs->d_type->t_tspec;
- /* %s declared in argument declaration list */
- warning(3, ts == STRUCT ? "struct" :
- (ts == UNION ? "union" : "enum"));
- }
- }
- | declspecs deftyp type_init_decls T_SEMI {
- if (dcs->d_nedecl) {
- tspec_t ts = dcs->d_type->t_tspec;
- /* %s declared in argument declaration list */
- warning(3, ts == STRUCT ? "struct" :
- (ts == UNION ? "union" : "enum"));
- }
- }
- | declmods error
- | declspecs error
- ;
-
-declaration:
- declmods deftyp T_SEMI {
- if (dcs->d_scl == TYPEDEF) {
- /* typedef declares no type name */
- warning(72);
- } else {
- /* empty declaration */
- warning(2);
- }
- }
- | declmods deftyp notype_init_decls T_SEMI
- | declspecs deftyp T_SEMI {
- if (dcs->d_scl == TYPEDEF) {
- /* typedef declares no type name */
- warning(72);
- } else if (!dcs->d_nedecl) {
- /* empty declaration */
- warning(2);
- }
- }
- | declspecs deftyp type_init_decls T_SEMI
- | error T_SEMI
- ;
-
-clrtyp:
- {
- clrtyp();
- }
- ;
-
-deftyp:
- /* empty */ {
- deftyp();
- }
- ;
-
-declspecs:
- clrtyp_typespec {
- addtype($1);
- }
- | declmods typespec {
- addtype($2);
- }
- | declspecs declmod
- | declspecs notype_typespec {
- addtype($2);
- }
- ;
-
-declmods:
- clrtyp T_QUAL {
- addqual($2);
- }
- | clrtyp T_SCLASS {
- addscl($2);
- }
- | declmods declmod
- ;
-
-declmod:
- T_QUAL {
- addqual($1);
- }
- | T_SCLASS {
- addscl($1);
- }
- ;
-
-clrtyp_typespec:
- clrtyp notype_typespec {
- $$ = $2;
- }
- | T_TYPENAME clrtyp {
- $$ = getsym($1)->s_type;
- }
- ;
-
-typespec:
- notype_typespec {
- $$ = $1;
- }
- | T_TYPENAME {
- $$ = getsym($1)->s_type;
- }
- ;
-
-notype_typespec:
- T_TYPE {
- $$ = gettyp($1);
- }
- | struct_spec {
- popdecl();
- $$ = $1;
- }
- | enum_spec {
- popdecl();
- $$ = $1;
- }
- ;
-
-struct_spec:
- struct struct_tag {
- /*
- * STDC requires that "struct a;" always introduces
- * a new tag if "a" is not declared at current level
- *
- * yychar is valid because otherwise the parser would
- * not been able to deceide if he must shift or reduce
- */
- $$ = mktag($2, $1, 0, yychar == T_SEMI);
- }
- | struct struct_tag {
- dcs->d_tagtyp = mktag($2, $1, 1, 0);
- } struct_declaration {
- $$ = compltag(dcs->d_tagtyp, $4);
- }
- | struct {
- dcs->d_tagtyp = mktag(NULL, $1, 1, 0);
- } struct_declaration {
- $$ = compltag(dcs->d_tagtyp, $3);
- }
- | struct error {
- symtyp = FVFT;
- $$ = gettyp(INT);
- }
- ;
-
-struct:
- T_SOU {
- symtyp = FTAG;
- pushdecl($1 == STRUCT ? MOS : MOU);
- dcs->d_offset = 0;
- dcs->d_stralign = CHAR_BIT;
- $$ = $1;
- }
- ;
-
-struct_tag:
- identifier {
- $$ = getsym($1);
- }
- ;
-
-struct_declaration:
- struct_decl_lbrace member_declaration_list_with_rbrace {
- $$ = $2;
- }
- ;
-
-struct_decl_lbrace:
- T_LBRACE {
- symtyp = FVFT;
- }
- ;
-
-member_declaration_list_with_rbrace:
- member_declaration_list T_SEMI T_RBRACE {
- $$ = $1;
- }
- | member_declaration_list T_RBRACE {
- if (sflag) {
- /* syntax req. ";" after last struct/union member */
- error(66);
- } else {
- /* syntax req. ";" after last struct/union member */
- warning(66);
- }
- $$ = $1;
- }
- | T_RBRACE {
- $$ = NULL;
- }
- ;
-
-member_declaration_list:
- member_declaration {
- $$ = $1;
- }
- | member_declaration_list T_SEMI member_declaration {
- $$ = lnklst($1, $3);
- }
- ;
-
-member_declaration:
- noclass_declmods deftyp {
- /* too late, i know, but getsym() compensates it */
- symtyp = FMOS;
- } notype_member_decls {
- symtyp = FVFT;
- $$ = $4;
- }
- | noclass_declspecs deftyp {
- symtyp = FMOS;
- } type_member_decls {
- symtyp = FVFT;
- $$ = $4;
- }
- | noclass_declmods deftyp {
- /* struct or union member must be named */
- warning(49);
- $$ = NULL;
- }
- | noclass_declspecs deftyp {
- /* struct or union member must be named */
- warning(49);
- $$ = NULL;
- }
- | error {
- symtyp = FVFT;
- $$ = NULL;
- }
- ;
-
-noclass_declspecs:
- clrtyp_typespec {
- addtype($1);
- }
- | noclass_declmods typespec {
- addtype($2);
- }
- | noclass_declspecs T_QUAL {
- addqual($2);
- }
- | noclass_declspecs notype_typespec {
- addtype($2);
- }
- ;
-
-noclass_declmods:
- clrtyp T_QUAL {
- addqual($2);
- }
- | noclass_declmods T_QUAL {
- addqual($2);
- }
- ;
-
-notype_member_decls:
- notype_member_decl {
- $$ = decl1str($1);
- }
- | notype_member_decls {
- symtyp = FMOS;
- } T_COMMA type_member_decl {
- $$ = lnklst($1, decl1str($4));
- }
- ;
-
-type_member_decls:
- type_member_decl {
- $$ = decl1str($1);
- }
- | type_member_decls {
- symtyp = FMOS;
- } T_COMMA type_member_decl {
- $$ = lnklst($1, decl1str($4));
- }
- ;
-
-notype_member_decl:
- notype_decl {
- $$ = $1;
- }
- | notype_decl T_COLON constant {
- $$ = bitfield($1, toicon($3));
- }
- | {
- symtyp = FVFT;
- } T_COLON constant {
- $$ = bitfield(NULL, toicon($3));
- }
- ;
-
-type_member_decl:
- type_decl {
- $$ = $1;
- }
- | type_decl T_COLON constant {
- $$ = bitfield($1, toicon($3));
- }
- | {
- symtyp = FVFT;
- } T_COLON constant {
- $$ = bitfield(NULL, toicon($3));
- }
- ;
-
-enum_spec:
- enum enum_tag {
- $$ = mktag($2, ENUM, 0, 0);
- }
- | enum enum_tag {
- dcs->d_tagtyp = mktag($2, ENUM, 1, 0);
- } enum_declaration {
- $$ = compltag(dcs->d_tagtyp, $4);
- }
- | enum {
- dcs->d_tagtyp = mktag(NULL, ENUM, 1, 0);
- } enum_declaration {
- $$ = compltag(dcs->d_tagtyp, $3);
- }
- | enum error {
- symtyp = FVFT;
- $$ = gettyp(INT);
- }
- ;
-
-enum:
- T_ENUM {
- symtyp = FTAG;
- pushdecl(ENUMCON);
- }
- ;
-
-enum_tag:
- identifier {
- $$ = getsym($1);
- }
- ;
-
-enum_declaration:
- enum_decl_lbrace enums_with_opt_comma T_RBRACE {
- $$ = $2;
- }
- ;
-
-enum_decl_lbrace:
- T_LBRACE {
- symtyp = FVFT;
- enumval = 0;
- }
- ;
-
-enums_with_opt_comma:
- enums {
- $$ = $1;
- }
- | enums T_COMMA {
- if (sflag) {
- /* trailing "," prohibited in enum declaration */
- error(54);
- } else {
- /* trailing "," prohibited in enum declaration */
- (void)gnuism(54);
- }
- $$ = $1;
- }
- ;
-
-enums:
- enumerator {
- $$ = $1;
- }
- | enums T_COMMA enumerator {
- $$ = lnklst($1, $3);
- }
- | error {
- $$ = NULL;
- }
- ;
-
-enumerator:
- ename {
- $$ = ename($1, enumval, 1);
- }
- | ename T_ASSIGN constant {
- $$ = ename($1, toicon($3), 0);
- }
- ;
-
-ename:
- identifier {
- $$ = getsym($1);
- }
- ;
-
-
-notype_init_decls:
- notype_init_decl
- | notype_init_decls T_COMMA type_init_decl
- ;
-
-type_init_decls:
- type_init_decl
- | type_init_decls T_COMMA type_init_decl
- ;
-
-notype_init_decl:
- notype_decl opt_asm_or_symbolrename {
- idecl($1, 0, $2);
- chksz($1);
- }
- | notype_decl opt_asm_or_symbolrename {
- idecl($1, 1, $2);
- } T_ASSIGN initializer {
- chksz($1);
- }
- ;
-
-type_init_decl:
- type_decl opt_asm_or_symbolrename {
- idecl($1, 0, $2);
- chksz($1);
- }
- | type_decl opt_asm_or_symbolrename {
- idecl($1, 1, $2);
- } T_ASSIGN initializer {
- chksz($1);
- }
- ;
-
-notype_decl:
- notype_direct_decl {
- $$ = $1;
- }
- | pointer notype_direct_decl {
- $$ = addptr($2, $1);
- }
- ;
-
-notype_direct_decl:
- T_NAME {
- $$ = dname(getsym($1));
- }
- | T_LPARN type_decl T_RPARN {
- $$ = $2;
- }
- | notype_direct_decl T_LBRACK T_RBRACK {
- $$ = addarray($1, 0, 0);
- }
- | notype_direct_decl T_LBRACK constant T_RBRACK {
- $$ = addarray($1, 1, toicon($3));
- }
- | notype_direct_decl param_list {
- $$ = addfunc($1, $2);
- popdecl();
- blklev--;
- }
- ;
-
-type_decl:
- type_direct_decl {
- $$ = $1;
- }
- | pointer type_direct_decl {
- $$ = addptr($2, $1);
- }
- ;
-
-type_direct_decl:
- identifier {
- $$ = dname(getsym($1));
- }
- | T_LPARN type_decl T_RPARN {
- $$ = $2;
- }
- | type_direct_decl T_LBRACK T_RBRACK {
- $$ = addarray($1, 0, 0);
- }
- | type_direct_decl T_LBRACK constant T_RBRACK {
- $$ = addarray($1, 1, toicon($3));
- }
- | type_direct_decl param_list {
- $$ = addfunc($1, $2);
- popdecl();
- blklev--;
- }
- ;
-
-/*
- * param_decl and notype_param_decl exist to avoid a conflict in
- * argument lists. A typename enclosed in parens should always be
- * treated as a typename, not an argument.
- * "typedef int a; f(int (a));" is "typedef int a; f(int foo(a));"
- * not "typedef int a; f(int a);"
- */
-param_decl:
- direct_param_decl {
- $$ = $1;
- }
- | pointer direct_param_decl {
- $$ = addptr($2, $1);
- }
- ;
-
-direct_param_decl:
- identifier {
- $$ = dname(getsym($1));
- }
- | T_LPARN notype_param_decl T_RPARN {
- $$ = $2;
- }
- | direct_param_decl T_LBRACK T_RBRACK {
- $$ = addarray($1, 0, 0);
- }
- | direct_param_decl T_LBRACK constant T_RBRACK {
- $$ = addarray($1, 1, toicon($3));
- }
- | direct_param_decl param_list {
- $$ = addfunc($1, $2);
- popdecl();
- blklev--;
- }
- ;
-
-notype_param_decl:
- direct_notype_param_decl {
- $$ = $1;
- }
- | pointer direct_notype_param_decl {
- $$ = addptr($2, $1);
- }
- ;
-
-direct_notype_param_decl:
- T_NAME {
- $$ = dname(getsym($1));
- }
- | T_LPARN notype_param_decl T_RPARN {
- $$ = $2;
- }
- | direct_notype_param_decl T_LBRACK T_RBRACK {
- $$ = addarray($1, 0, 0);
- }
- | direct_notype_param_decl T_LBRACK constant T_RBRACK {
- $$ = addarray($1, 1, toicon($3));
- }
- | direct_notype_param_decl param_list {
- $$ = addfunc($1, $2);
- popdecl();
- blklev--;
- }
- ;
-
-pointer:
- asterisk {
- $$ = $1;
- }
- | asterisk type_qualifier_list {
- $$ = mergepq($1, $2);
- }
- | asterisk pointer {
- $$ = mergepq($1, $2);
- }
- | asterisk type_qualifier_list pointer {
- $$ = mergepq(mergepq($1, $2), $3);
- }
- ;
-
-asterisk:
- T_MULT {
- $$ = xcalloc(1, sizeof (pqinf_t));
- $$->p_pcnt = 1;
- }
- ;
-
-type_qualifier_list:
- type_qualifier {
- $$ = $1;
- }
- | type_qualifier_list type_qualifier {
- $$ = mergepq($1, $2);
- }
- ;
-
-type_qualifier:
- T_QUAL {
- $$ = xcalloc(1, sizeof (pqinf_t));
- if ($1 == CONST) {
- $$->p_const = 1;
- } else {
- $$->p_volatile = 1;
- }
- }
- ;
-
-param_list:
- id_list_lparn identifier_list T_RPARN {
- $$ = $2;
- }
- | abs_decl_param_list {
- $$ = $1;
- }
- ;
-
-id_list_lparn:
- T_LPARN {
- blklev++;
- pushdecl(PARG);
- }
- ;
-
-identifier_list:
- T_NAME {
- $$ = iname(getsym($1));
- }
- | identifier_list T_COMMA T_NAME {
- $$ = lnklst($1, iname(getsym($3)));
- }
- | identifier_list error {
- $$ = $1;
- }
- ;
-
-abs_decl_param_list:
- abs_decl_lparn T_RPARN {
- $$ = NULL;
- }
- | abs_decl_lparn vararg_parameter_type_list T_RPARN {
- dcs->d_proto = 1;
- $$ = $2;
- }
- | abs_decl_lparn error T_RPARN {
- $$ = NULL;
- }
- ;
-
-abs_decl_lparn:
- T_LPARN {
- blklev++;
- pushdecl(PARG);
- }
- ;
-
-vararg_parameter_type_list:
- parameter_type_list {
- $$ = $1;
- }
- | parameter_type_list T_COMMA T_ELLIPSE {
- dcs->d_vararg = 1;
- $$ = $1;
- }
- | T_ELLIPSE {
- if (sflag) {
- /* ANSI C requires formal parameter before "..." */
- error(84);
- } else if (!tflag) {
- /* ANSI C requires formal parameter before "..." */
- warning(84);
- }
- dcs->d_vararg = 1;
- $$ = NULL;
- }
- ;
-
-parameter_type_list:
- parameter_declaration {
- $$ = $1;
- }
- | parameter_type_list T_COMMA parameter_declaration {
- $$ = lnklst($1, $3);
- }
- ;
-
-parameter_declaration:
- declmods deftyp {
- $$ = decl1arg(aname(), 0);
- }
- | declspecs deftyp {
- $$ = decl1arg(aname(), 0);
- }
- | declmods deftyp notype_param_decl {
- $$ = decl1arg($3, 0);
- }
- /*
- * param_decl is needed because of following conflict:
- * "typedef int a; f(int (a));" could be parsed as
- * "function with argument a of type int", or
- * "function with an abstract argument of type function".
- * This grammar realizes the second case.
- */
- | declspecs deftyp param_decl {
- $$ = decl1arg($3, 0);
- }
- | declmods deftyp abs_decl {
- $$ = decl1arg($3, 0);
- }
- | declspecs deftyp abs_decl {
- $$ = decl1arg($3, 0);
- }
- ;
-
-opt_asm_or_symbolrename: /* expect only one */
- /* empty */ {
- $$ = NULL;
- }
- | T_ASM T_LPARN T_STRING T_RPARN {
- freeyyv(&$3, T_STRING);
- $$ = NULL;
- }
- | T_SYMBOLRENAME T_LPARN T_NAME T_RPARN {
- $$ = $3;
- }
- ;
-
-initializer:
- init_expr
- ;
-
-init_expr:
- expr %prec T_COMMA {
- mkinit($1);
- }
- | init_lbrace init_expr_list init_rbrace
- | init_lbrace init_expr_list T_COMMA init_rbrace
- | error
- ;
-
-init_expr_list:
- init_expr %prec T_COMMA
- | init_expr_list T_COMMA init_expr
- ;
-
-init_lbrace:
- T_LBRACE {
- initlbr();
- }
- ;
-
-init_rbrace:
- T_RBRACE {
- initrbr();
- }
- ;
-
-type_name:
- {
- pushdecl(ABSTRACT);
- } abstract_declaration {
- popdecl();
- $$ = $2->s_type;
- }
- ;
-
-abstract_declaration:
- noclass_declmods deftyp {
- $$ = decl1abs(aname());
- }
- | noclass_declspecs deftyp {
- $$ = decl1abs(aname());
- }
- | noclass_declmods deftyp abs_decl {
- $$ = decl1abs($3);
- }
- | noclass_declspecs deftyp abs_decl {
- $$ = decl1abs($3);
- }
- ;
-
-abs_decl:
- pointer {
- $$ = addptr(aname(), $1);
- }
- | direct_abs_decl {
- $$ = $1;
- }
- | pointer direct_abs_decl {
- $$ = addptr($2, $1);
- }
- ;
-
-direct_abs_decl:
- T_LPARN abs_decl T_RPARN {
- $$ = $2;
- }
- | T_LBRACK T_RBRACK {
- $$ = addarray(aname(), 0, 0);
- }
- | T_LBRACK constant T_RBRACK {
- $$ = addarray(aname(), 1, toicon($2));
- }
- | direct_abs_decl T_LBRACK T_RBRACK {
- $$ = addarray($1, 0, 0);
- }
- | direct_abs_decl T_LBRACK constant T_RBRACK {
- $$ = addarray($1, 1, toicon($3));
- }
- | abs_decl_param_list {
- $$ = addfunc(aname(), $1);
- popdecl();
- blklev--;
- }
- | direct_abs_decl abs_decl_param_list {
- $$ = addfunc($1, $2);
- popdecl();
- blklev--;
- }
- ;
-
-stmnt:
- labeled_stmnt
- | expr_stmnt
- | comp_stmnt
- | selection_stmnt
- | iteration_stmnt
- | jump_stmnt {
- ftflg = 0;
- }
- | asm_stmnt
- ;
-
-labeled_stmnt:
- label stmnt
- ;
-
-label:
- identifier T_COLON {
- symtyp = FLAB;
- label(T_NAME, getsym($1), NULL);
- }
- | T_CASE constant T_COLON {
- label(T_CASE, NULL, $2);
- ftflg = 1;
- }
- | T_DEFAULT T_COLON {
- label(T_DEFAULT, NULL, NULL);
- ftflg = 1;
- }
- ;
-
-comp_stmnt:
- compstmnt_lbrace declaration_list opt_stmnt_list compstmnt_rbrace
- | compstmnt_lbrace opt_stmnt_list compstmnt_rbrace
- ;
-
-compstmnt_lbrace:
- T_LBRACE {
- blklev++;
- mblklev++;
- pushdecl(AUTO);
- }
- ;
-
-compstmnt_rbrace:
- T_RBRACE {
- popdecl();
- freeblk();
- mblklev--;
- blklev--;
- ftflg = 0;
- }
- ;
-
-opt_stmnt_list:
- /* empty */
- | stmnt_list
- ;
-
-stmnt_list:
- stmnt
- | stmnt_list stmnt {
- RESTORE();
- }
- | stmnt_list error T_SEMI
- ;
-
-expr_stmnt:
- expr T_SEMI {
- expr($1, 0, 0);
- ftflg = 0;
- }
- | T_SEMI {
- ftflg = 0;
- }
- ;
-
-selection_stmnt:
- if_without_else {
- SAVE();
- if2();
- if3(0);
- }
- | if_without_else T_ELSE {
- SAVE();
- if2();
- } stmnt {
- CLRWFLGS();
- if3(1);
- }
- | if_without_else T_ELSE error {
- CLRWFLGS();
- if3(0);
- }
- | switch_expr stmnt {
- CLRWFLGS();
- switch2();
- }
- | switch_expr error {
- CLRWFLGS();
- switch2();
- }
- ;
-
-if_without_else:
- if_expr stmnt
- | if_expr error
- ;
-
-if_expr:
- T_IF T_LPARN expr T_RPARN {
- if1($3);
- CLRWFLGS();
- }
- ;
-
-switch_expr:
- T_SWITCH T_LPARN expr T_RPARN {
- switch1($3);
- CLRWFLGS();
- }
- ;
-
-do_stmnt:
- do stmnt {
- CLRWFLGS();
- }
- ;
-
-iteration_stmnt:
- while_expr stmnt {
- CLRWFLGS();
- while2();
- }
- | while_expr error {
- CLRWFLGS();
- while2();
- }
- | do_stmnt do_while_expr {
- do2($2);
- ftflg = 0;
- }
- | do error {
- CLRWFLGS();
- do2(NULL);
- }
- | for_exprs stmnt {
- CLRWFLGS();
- for2();
- }
- | for_exprs error {
- CLRWFLGS();
- for2();
- }
- ;
-
-while_expr:
- T_WHILE T_LPARN expr T_RPARN {
- while1($3);
- CLRWFLGS();
- }
- ;
-
-do:
- T_DO {
- do1();
- }
- ;
-
-do_while_expr:
- T_WHILE T_LPARN expr T_RPARN T_SEMI {
- $$ = $3;
- }
- ;
-
-for_exprs:
- T_FOR T_LPARN opt_expr T_SEMI opt_expr T_SEMI opt_expr T_RPARN {
- for1($3, $5, $7);
- CLRWFLGS();
- }
- ;
-
-opt_expr:
- /* empty */ {
- $$ = NULL;
- }
- | expr {
- $$ = $1;
- }
- ;
-
-jump_stmnt:
- goto identifier T_SEMI {
- dogoto(getsym($2));
- }
- | goto error T_SEMI {
- symtyp = FVFT;
- }
- | T_CONTINUE T_SEMI {
- docont();
- }
- | T_BREAK T_SEMI {
- dobreak();
- }
- | T_RETURN T_SEMI {
- doreturn(NULL);
- }
- | T_RETURN expr T_SEMI {
- doreturn($2);
- }
- ;
-
-goto:
- T_GOTO {
- symtyp = FLAB;
- }
- ;
-
-asm_stmnt:
- T_ASM T_LPARN read_until_rparn T_SEMI {
- setasm();
- }
- | T_ASM T_QUAL T_LPARN read_until_rparn T_SEMI {
- setasm();
- }
- | T_ASM error
- ;
-
-read_until_rparn:
- /* empty */ {
- ignuptorp();
- }
- ;
-
-declaration_list:
- declaration {
- CLRWFLGS();
- }
- | declaration_list declaration {
- CLRWFLGS();
- }
- ;
-
-constant:
- expr %prec T_COMMA {
- $$ = $1;
- }
- ;
-
-expr:
- expr T_MULT expr {
- $$ = build(MULT, $1, $3);
- }
- | expr T_DIVOP expr {
- $$ = build($2, $1, $3);
- }
- | expr T_ADDOP expr {
- $$ = build($2, $1, $3);
- }
- | expr T_SHFTOP expr {
- $$ = build($2, $1, $3);
- }
- | expr T_RELOP expr {
- $$ = build($2, $1, $3);
- }
- | expr T_EQOP expr {
- $$ = build($2, $1, $3);
- }
- | expr T_AND expr {
- $$ = build(AND, $1, $3);
- }
- | expr T_XOR expr {
- $$ = build(XOR, $1, $3);
- }
- | expr T_OR expr {
- $$ = build(OR, $1, $3);
- }
- | expr T_LOGAND expr {
- $$ = build(LOGAND, $1, $3);
- }
- | expr T_LOGOR expr {
- $$ = build(LOGOR, $1, $3);
- }
- | expr T_QUEST expr T_COLON expr {
- $$ = build(QUEST, $1, build(COLON, $3, $5));
- }
- | expr T_ASSIGN expr {
- $$ = build(ASSIGN, $1, $3);
- }
- | expr T_OPASS expr {
- $$ = build($2, $1, $3);
- }
- | expr T_COMMA expr {
- $$ = build(COMMA, $1, $3);
- }
- | term {
- $$ = $1;
- }
- ;
-
-term:
- T_NAME {
- /* XXX really necessary? */
- if (yychar < 0)
- yychar = yylex();
- $$ = getnnode(getsym($1), yychar);
- }
- | string {
- $$ = getsnode($1);
- }
- | T_CON {
- $$ = getcnode(gettyp($1->v_tspec), $1);
- }
- | T_LPARN expr T_RPARN {
- if ($2 != NULL)
- $2->tn_parn = 1;
- $$ = $2;
- }
- | term T_INCDEC {
- $$ = build($2 == INC ? INCAFT : DECAFT, $1, NULL);
- }
- | T_INCDEC term {
- $$ = build($1 == INC ? INCBEF : DECBEF, $2, NULL);
- }
- | T_MULT term {
- $$ = build(STAR, $2, NULL);
- }
- | T_AND term {
- $$ = build(AMPER, $2, NULL);
- }
- | T_UNOP term {
- $$ = build($1, $2, NULL);
- }
- | T_ADDOP term {
- if (tflag && $1 == PLUS) {
- /* unary + is illegal in traditional C */
- warning(100);
- }
- $$ = build($1 == PLUS ? UPLUS : UMINUS, $2, NULL);
- }
- | term T_LBRACK expr T_RBRACK {
- $$ = build(STAR, build(PLUS, $1, $3), NULL);
- }
- | term T_LPARN T_RPARN {
- $$ = funccall($1, NULL);
- }
- | term T_LPARN func_arg_list T_RPARN {
- $$ = funccall($1, $3);
- }
- | term point_or_arrow T_NAME {
- if ($1 != NULL) {
- sym_t *msym;
- /* XXX strmemb should be integrated in build() */
- if ($2 == ARROW) {
- /* must to this before strmemb is called */
- $1 = cconv($1);
- }
- msym = strmemb($1, $2, getsym($3));
- $$ = build($2, $1, getnnode(msym, 0));
- } else {
- $$ = NULL;
- }
- }
- | T_SIZEOF term %prec T_SIZEOF {
- if (($$ = $2 == NULL ? NULL : bldszof($2->tn_type)) != NULL)
- chkmisc($2, 0, 0, 0, 0, 0, 1);
- }
- | T_SIZEOF T_LPARN type_name T_RPARN %prec T_SIZEOF {
- $$ = bldszof($3);
- }
- | T_LPARN type_name T_RPARN term %prec T_UNOP {
- $$ = cast($4, $2);
- }
- ;
-
-string:
- T_STRING {
- $$ = $1;
- }
- | T_STRING string2 {
- $$ = catstrg($1, $2);
- }
- ;
-
-string2:
- T_STRING {
- if (tflag) {
- /* concatenated strings are illegal in traditional C */
- warning(219);
- }
- $$ = $1;
- }
- | string2 T_STRING {
- $$ = catstrg($1, $2);
- }
- ;
-
-func_arg_list:
- expr %prec T_COMMA {
- $$ = funcarg(NULL, $1);
- }
- | func_arg_list T_COMMA expr {
- $$ = funcarg($1, $3);
- }
- ;
-
-point_or_arrow:
- T_STROP {
- symtyp = FMOS;
- $$ = $1;
- }
- ;
-
-identifier:
- T_NAME {
- $$ = $1;
- }
- | T_TYPENAME {
- $$ = $1;
- }
- ;
-
-%%
-
-/* ARGSUSED */
-int
-yyerror(char *msg)
-{
-
- error(249);
- if (++sytxerr >= 5)
- norecover();
- return (0);
-}
-
-static __inline int uq_gt(uint64_t, uint64_t);
-static __inline int
-uq_gt(uint64_t a, uint64_t b)
-{
-
- return (a > b);
-}
-
-static __inline int q_gt(int64_t, int64_t);
-static __inline int
-q_gt(int64_t a, int64_t b)
-{
-
- return (a > b);
-}
-
-#define q_lt(a, b) q_gt(b, a)
-
-/*
- * Gets a node for a constant and returns the value of this constant
- * as integer.
- * Is the node not constant or too large for int or of type float,
- * a warning will be printed.
- *
- * toicon() should be used only inside declarations. If it is used in
- * expressions, it frees the memory used for the expression.
- */
-static int
-toicon(tnode_t *tn)
-{
- int i;
- tspec_t t;
- val_t *v;
-
- v = constant(tn);
-
- /*
- * Abstract declarations are used inside expression. To free
- * the memory would be a fatal error.
- */
- if (dcs->d_ctx != ABSTRACT)
- tfreeblk();
-
- if ((t = v->v_tspec) == FLOAT || t == DOUBLE || t == LDOUBLE) {
- i = (int)v->v_ldbl;
- /* integral constant expression expected */
- error(55);
- } else {
- i = (int)v->v_quad;
- if (isutyp(t)) {
- if (uq_gt((uint64_t)v->v_quad,
- (uint64_t)INT_MAX)) {
- /* integral constant too large */
- warning(56);
- }
- } else {
- if (q_gt(v->v_quad, (int64_t)INT_MAX) ||
- q_lt(v->v_quad, (int64_t)INT_MIN)) {
- /* integral constant too large */
- warning(56);
- }
- }
- }
- free(v);
- return (i);
-}
-
-static void
-idecl(sym_t *decl, int initflg, sbuf_t *rename)
-{
- char *s;
-
- initerr = 0;
- initsym = decl;
-
- switch (dcs->d_ctx) {
- case EXTERN:
- if (rename != NULL) {
- if (decl->s_rename != NULL)
- lerror("idecl() 1");
-
- s = getlblk(1, rename->sb_len + 1);
- (void)memcpy(s, rename->sb_name, rename->sb_len + 1);
- decl->s_rename = s;
- freeyyv(&rename, T_NAME);
- }
- decl1ext(decl, initflg);
- break;
- case ARG:
- if (rename != NULL) {
- /* symbol renaming can't be used on function arguments */
- error(310);
- freeyyv(&rename, T_NAME);
- break;
- }
- (void)decl1arg(decl, initflg);
- break;
- case AUTO:
- if (rename != NULL) {
- /* symbol renaming can't be used on automatic variables */
- error(311);
- freeyyv(&rename, T_NAME);
- break;
- }
- decl1loc(decl, initflg);
- break;
- default:
- lerror("idecl() 2");
- }
-
- if (initflg && !initerr)
- prepinit();
-}
-
-/*
- * Discard all input tokens up to and including the next
- * unmatched right paren
- */
-static void
-ignuptorp(void)
-{
- int level;
-
- if (yychar < 0)
- yychar = yylex();
- freeyyv(&yylval, yychar);
-
- level = 1;
- while (yychar != T_RPARN || --level > 0) {
- if (yychar == T_LPARN) {
- level++;
- } else if (yychar <= 0) {
- break;
- }
- freeyyv(&yylval, yychar = yylex());
- }
-
- yyclearin;
-}
diff --git a/usr.bin/xlint/lint1/decl.c b/usr.bin/xlint/lint1/decl.c
deleted file mode 100644
index 69c7cda..0000000
--- a/usr.bin/xlint/lint1/decl.c
+++ /dev/null
@@ -1,3053 +0,0 @@
-/* $NetBSD: decl.c,v 1.29 2002/01/18 21:01:39 thorpej Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: decl.c,v 1.29 2002/01/18 21:01:39 thorpej Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "lint1.h"
-
-const char *unnamed = "<unnamed>";
-
-/* shared type structures for arithmtic types and void */
-static type_t *typetab;
-
-/* value of next enumerator during declaration of enum types */
-int enumval;
-
-/*
- * pointer to top element of a stack which contains informations local
- * to nested declarations
- */
-dinfo_t *dcs;
-
-static type_t *tdeferr(type_t *, tspec_t);
-static void settdsym(type_t *, sym_t *);
-static tspec_t mrgtspec(tspec_t, tspec_t);
-static void align(int, int);
-static sym_t *newtag(sym_t *, scl_t, int, int);
-static int eqargs(type_t *, type_t *, int *);
-static int mnoarg(type_t *, int *);
-static int chkosdef(sym_t *, sym_t *);
-static int chkptdecl(sym_t *, sym_t *);
-static sym_t *nsfunc(sym_t *, sym_t *);
-static void osfunc(sym_t *, sym_t *);
-static void ledecl(sym_t *);
-static int chkinit(sym_t *);
-static void chkausg(int, sym_t *);
-static void chkvusg(int, sym_t *);
-static void chklusg(sym_t *);
-static void chktusg(sym_t *);
-static void chkglvar(sym_t *);
-static void glchksz(sym_t *);
-
-/*
- * initializes all global vars used in declarations
- */
-void
-initdecl(void)
-{
- int i;
-
- /* declaration stack */
- if ((dcs = calloc(1, sizeof (dinfo_t))) == NULL)
- nomem();
- dcs->d_ctx = EXTERN;
- dcs->d_ldlsym = &dcs->d_dlsyms;
-
- /* type information and classification */
- inittyp();
-
- /* shared type structures */
- if ((typetab = calloc(NTSPEC, sizeof (type_t))) == NULL)
- nomem();
- for (i = 0; i < NTSPEC; i++)
- typetab[i].t_tspec = NOTSPEC;
- typetab[CHAR].t_tspec = CHAR;
- typetab[SCHAR].t_tspec = SCHAR;
- typetab[UCHAR].t_tspec = UCHAR;
- typetab[SHORT].t_tspec = SHORT;
- typetab[USHORT].t_tspec = USHORT;
- typetab[INT].t_tspec = INT;
- typetab[UINT].t_tspec = UINT;
- typetab[LONG].t_tspec = LONG;
- typetab[ULONG].t_tspec = ULONG;
- typetab[QUAD].t_tspec = QUAD;
- typetab[UQUAD].t_tspec = UQUAD;
- typetab[FLOAT].t_tspec = FLOAT;
- typetab[DOUBLE].t_tspec = DOUBLE;
- typetab[LDOUBLE].t_tspec = LDOUBLE;
- typetab[VOID].t_tspec = VOID;
- /*
- * Next two are not real types. They are only used by the parser
- * to return keywords "signed" and "unsigned"
- */
- typetab[SIGNED].t_tspec = SIGNED;
- typetab[UNSIGN].t_tspec = UNSIGN;
-}
-
-/*
- * Returns a shared type structure vor arithmetic types and void.
- *
- * It's important do duplicate this structure (using duptyp() or tdupdyp())
- * if it is to be modified (adding qualifiers or anything else).
- */
-type_t *
-gettyp(tspec_t t)
-{
-
- return (&typetab[t]);
-}
-
-type_t *
-duptyp(const type_t *tp)
-{
- type_t *ntp;
-
- ntp = getblk(sizeof (type_t));
- STRUCT_ASSIGN(*ntp, *tp);
- return (ntp);
-}
-
-/*
- * Use tduptyp() instead of duptyp() inside expressions (if the
- * allocated memory should be freed after the expr).
- */
-type_t *
-tduptyp(const type_t *tp)
-{
- type_t *ntp;
-
- ntp = tgetblk(sizeof (type_t));
- STRUCT_ASSIGN(*ntp, *tp);
- return (ntp);
-}
-
-/*
- * Returns 1 if the argument is void or an incomplete array,
- * struct, union or enum type.
- */
-int
-incompl(type_t *tp)
-{
- tspec_t t;
-
- if ((t = tp->t_tspec) == VOID) {
- return (1);
- } else if (t == ARRAY) {
- return (tp->t_aincompl);
- } else if (t == STRUCT || t == UNION) {
- return (tp->t_str->sincompl);
- } else if (t == ENUM) {
- return (tp->t_enum->eincompl);
- }
- return (0);
-}
-
-/*
- * Set the flag for (in)complete array, struct, union or enum
- * types.
- */
-void
-setcompl(type_t *tp, int ic)
-{
- tspec_t t;
-
- if ((t = tp->t_tspec) == ARRAY) {
- tp->t_aincompl = ic;
- } else if (t == STRUCT || t == UNION) {
- tp->t_str->sincompl = ic;
- } else {
- if (t != ENUM)
- lerror("setcompl() 1");
- tp->t_enum->eincompl = ic;
- }
-}
-
-/*
- * Remember the storage class of the current declaration in dcs->d_scl
- * (the top element of the declaration stack) and detect multiple
- * storage classes.
- */
-void
-addscl(scl_t sc)
-{
-
- if (sc == INLINE) {
- if (dcs->d_inline)
- /* duplicate '%s' */
- warning(10, "inline");
- dcs->d_inline = 1;
- return;
- }
- if (dcs->d_type != NULL || dcs->d_atyp != NOTSPEC ||
- dcs->d_smod != NOTSPEC || dcs->d_lmod != NOTSPEC) {
- /* storage class after type is obsolescent */
- warning(83);
- }
- if (dcs->d_scl == NOSCL) {
- dcs->d_scl = sc;
- } else {
- /*
- * multiple storage classes. An error will be reported in
- * deftyp().
- */
- dcs->d_mscl = 1;
- }
-}
-
-/*
- * Remember the type, modifier or typedef name returned by the parser
- * in *dcs (top element of decl stack). This information is used in
- * deftyp() to build the type used for all declarators in this
- * declaration.
- *
- * Is tp->t_typedef 1, the type comes from a previously defined typename.
- * Otherwise it comes from a type specifier (int, long, ...) or a
- * struct/union/enum tag.
- */
-void
-addtype(type_t *tp)
-{
- tspec_t t;
-
- if (tp->t_typedef) {
- if (dcs->d_type != NULL || dcs->d_atyp != NOTSPEC ||
- dcs->d_lmod != NOTSPEC || dcs->d_smod != NOTSPEC) {
- /*
- * something like "typedef int a; int a b;"
- * This should not happen with current grammar.
- */
- lerror("addtype()");
- }
- dcs->d_type = tp;
- return;
- }
-
- t = tp->t_tspec;
-
- if (t == STRUCT || t == UNION || t == ENUM) {
- /*
- * something like "int struct a ..."
- * struct/union/enum with anything else is not allowed
- */
- if (dcs->d_type != NULL || dcs->d_atyp != NOTSPEC ||
- dcs->d_lmod != NOTSPEC || dcs->d_smod != NOTSPEC) {
- /*
- * remember that an error must be reported in
- * deftyp().
- */
- dcs->d_terr = 1;
- dcs->d_atyp = dcs->d_lmod = dcs->d_smod = NOTSPEC;
- }
- dcs->d_type = tp;
- return;
- }
-
- if (dcs->d_type != NULL && !dcs->d_type->t_typedef) {
- /*
- * something like "struct a int"
- * struct/union/enum with anything else is not allowed
- */
- dcs->d_terr = 1;
- return;
- }
-
- if (t == LONG && dcs->d_lmod == LONG) {
- /* "long long" or "long ... long" */
- t = QUAD;
- dcs->d_lmod = NOTSPEC;
- if (!quadflg)
- /* %s C does not support 'long long' */
- (void)gnuism(265, tflag ? "traditional" : "ANSI");
- }
-
- if (dcs->d_type != NULL && dcs->d_type->t_typedef) {
- /* something like "typedef int a; a long ..." */
- dcs->d_type = tdeferr(dcs->d_type, t);
- return;
- }
-
- /* now it can be only a combination of arithmetic types and void */
- if (t == SIGNED || t == UNSIGN) {
- /* remeber specifiers "signed" and "unsigned" in dcs->d_smod */
- if (dcs->d_smod != NOTSPEC)
- /*
- * more than one "signed" and/or "unsigned"; print
- * an error in deftyp()
- */
- dcs->d_terr = 1;
- dcs->d_smod = t;
- } else if (t == SHORT || t == LONG || t == QUAD) {
- /*
- * remember specifiers "short", "long" and "long long" in
- * dcs->d_lmod
- */
- if (dcs->d_lmod != NOTSPEC)
- /* more than one, print error in deftyp() */
- dcs->d_terr = 1;
- dcs->d_lmod = t;
- } else {
- /*
- * remember specifiers "void", "char", "int", "float" or
- * "double" int dcs->d_atyp
- */
- if (dcs->d_atyp != NOTSPEC)
- /* more than one, print error in deftyp() */
- dcs->d_terr = 1;
- dcs->d_atyp = t;
- }
-}
-
-/*
- * called if a list of declaration specifiers contains a typedef name
- * and other specifiers (except struct, union, enum, typedef name)
- */
-static type_t *
-tdeferr(type_t *td, tspec_t t)
-{
- tspec_t t2;
-
- t2 = td->t_tspec;
-
- switch (t) {
- case SIGNED:
- case UNSIGN:
- if (t2 == CHAR || t2 == SHORT || t2 == INT || t2 == LONG ||
- t2 == QUAD) {
- if (!tflag)
- /* modifying typedef with ... */
- warning(5, ttab[t].tt_name);
- td = duptyp(gettyp(mrgtspec(t2, t)));
- td->t_typedef = 1;
- return (td);
- }
- break;
- case SHORT:
- if (t2 == INT || t2 == UINT) {
- /* modifying typedef with ... */
- warning(5, "short");
- td = duptyp(gettyp(t2 == INT ? SHORT : USHORT));
- td->t_typedef = 1;
- return (td);
- }
- break;
- case LONG:
- if (t2 == INT || t2 == UINT || t2 == LONG || t2 == ULONG ||
- t2 == FLOAT || t2 == DOUBLE) {
- /* modifying typedef with ... */
- warning(5, "long");
- if (t2 == INT) {
- td = gettyp(LONG);
- } else if (t2 == UINT) {
- td = gettyp(ULONG);
- } else if (t2 == LONG) {
- td = gettyp(QUAD);
- } else if (t2 == ULONG) {
- td = gettyp(UQUAD);
- } else if (t2 == FLOAT) {
- td = gettyp(DOUBLE);
- } else if (t2 == DOUBLE) {
- td = gettyp(LDOUBLE);
- }
- td = duptyp(td);
- td->t_typedef = 1;
- return (td);
- }
- break;
- /* LINTED (enumeration values not handled in switch) */
- case NOTSPEC:
- case USHORT:
- case UCHAR:
- case SCHAR:
- case CHAR:
- case FUNC:
- case ARRAY:
- case PTR:
- case ENUM:
- case UNION:
- case STRUCT:
- case VOID:
- case LDOUBLE:
- case DOUBLE:
- case FLOAT:
- case UQUAD:
- case QUAD:
- case ULONG:
- case UINT:
- case INT:
- break;
-
- case NTSPEC: /* this value unused */
- break;
- }
-
- /* Anything other is not accepted. */
-
- dcs->d_terr = 1;
- return (td);
-}
-
-/*
- * Remember the symbol of a typedef name (2nd arg) in a struct, union
- * or enum tag if the typedef name is the first defined for this tag.
- *
- * If the tag is unnamed, the typdef name is used for identification
- * of this tag in lint2. Although its possible that more than one typedef
- * name is defined for one tag, the first name defined should be unique
- * if the tag is unnamed.
- */
-static void
-settdsym(type_t *tp, sym_t *sym)
-{
- tspec_t t;
-
- if ((t = tp->t_tspec) == STRUCT || t == UNION) {
- if (tp->t_str->stdef == NULL)
- tp->t_str->stdef = sym;
- } else if (t == ENUM) {
- if (tp->t_enum->etdef == NULL)
- tp->t_enum->etdef = sym;
- }
-}
-
-/*
- * Remember a qualifier which is part of the declaration specifiers
- * (and not the declarator) in the top element of the declaration stack.
- * Also detect multiple qualifiers of the same kind.
-
- * The remembered qualifier is used by deftyp() to construct the type
- * for all declarators.
- */
-void
-addqual(tqual_t q)
-{
-
- if (q == CONST) {
- if (dcs->d_const) {
- /* duplicate "%s" */
- warning(10, "const");
- }
- dcs->d_const = 1;
- } else {
- if (q != VOLATILE)
- lerror("addqual() 1");
- if (dcs->d_volatile) {
- /* duplicate "%s" */
- warning(10, "volatile");
- }
- dcs->d_volatile = 1;
- }
-}
-
-/*
- * Go to the next declaration level (structs, nested structs, blocks,
- * argument declaration lists ...)
- */
-void
-pushdecl(scl_t sc)
-{
- dinfo_t *di;
-
- if (dflag)
- (void)printf("pushdecl(%d)\n", (int)sc);
-
- /* put a new element on the declaration stack */
- if ((di = calloc(1, sizeof (dinfo_t))) == NULL)
- nomem();
- di->d_nxt = dcs;
- dcs = di;
- di->d_ctx = sc;
- di->d_ldlsym = &di->d_dlsyms;
-}
-
-/*
- * Go back to previous declaration level
- */
-void
-popdecl(void)
-{
- dinfo_t *di;
-
- if (dflag)
- (void)printf("popdecl(%d)\n", (int)dcs->d_ctx);
-
- if (dcs->d_nxt == NULL)
- lerror("popdecl() 1");
- di = dcs;
- dcs = di->d_nxt;
- switch (di->d_ctx) {
- case EXTERN:
- /* there is nothing after external declarations */
- lerror("popdecl() 2");
- /* NOTREACHED */
- case MOS:
- case MOU:
- case ENUMCON:
- /*
- * Symbols declared in (nested) structs or enums are
- * part of the next level (they are removed from the
- * symbol table if the symbols of the outher level are
- * removed)
- */
- if ((*dcs->d_ldlsym = di->d_dlsyms) != NULL)
- dcs->d_ldlsym = di->d_ldlsym;
- break;
- case ARG:
- /*
- * All symbols in dcs->d_dlsyms are introduced in old style
- * argument declarations (it's not clean, but possible).
- * They are appended to the list of symbols declared in
- * an old style argument identifier list or a new style
- * parameter type list.
- */
- if (di->d_dlsyms != NULL) {
- *di->d_ldlsym = dcs->d_fpsyms;
- dcs->d_fpsyms = di->d_dlsyms;
- }
- break;
- case ABSTRACT:
- /*
- * casts and sizeof
- * Append all symbols declared in the abstract declaration
- * to the list of symbols declared in the surounding decl.
- * or block.
- * XXX I'm not sure whether they should be removed from the
- * symbol table now or later.
- */
- if ((*dcs->d_ldlsym = di->d_dlsyms) != NULL)
- dcs->d_ldlsym = di->d_ldlsym;
- break;
- case AUTO:
- /* check usage of local vars */
- chkusage(di);
- /* FALLTHROUGH */
- case PARG:
- /* usage of arguments will be checked by funcend() */
- rmsyms(di->d_dlsyms);
- break;
- default:
- lerror("popdecl() 3");
- }
- free(di);
-}
-
-/*
- * Set flag d_asm in all declaration stack elements up to the
- * outermost one.
- *
- * This is used to mark compound statements which have, possibly in
- * nested compound statements, asm statements. For these compound
- * statements no warnings about unused or unitialized variables are
- * printed.
- *
- * There is no need to clear d_asm in dinfo structs with context AUTO,
- * because these structs are freed at the end of the compound statement.
- * But it must be cleard in the outermost dinfo struct, which has
- * context EXTERN. This could be done in clrtyp() and would work for
- * C, but not for C++ (due to mixed statements and declarations). Thus
- * we clear it in glclup(), which is used to do some cleanup after
- * global declarations/definitions.
- */
-void
-setasm(void)
-{
- dinfo_t *di;
-
- for (di = dcs; di != NULL; di = di->d_nxt)
- di->d_asm = 1;
-}
-
-/*
- * Clean all elements of the top element of declaration stack which
- * will be used by the next declaration
- */
-void
-clrtyp(void)
-{
-
- dcs->d_atyp = dcs->d_smod = dcs->d_lmod = NOTSPEC;
- dcs->d_scl = NOSCL;
- dcs->d_type = NULL;
- dcs->d_const = dcs->d_volatile = 0;
- dcs->d_inline = 0;
- dcs->d_mscl = dcs->d_terr = 0;
- dcs->d_nedecl = 0;
- dcs->d_notyp = 0;
-}
-
-/*
- * Create a type structure from the informations gathered in
- * the declaration stack.
- * Complain about storage classes which are not possible in current
- * context.
- */
-void
-deftyp(void)
-{
- tspec_t t, s, l;
- type_t *tp;
- scl_t scl;
-
- t = dcs->d_atyp; /* CHAR, INT, FLOAT, DOUBLE, VOID */
- s = dcs->d_smod; /* SIGNED, UNSIGNED */
- l = dcs->d_lmod; /* SHORT, LONG, QUAD */
- tp = dcs->d_type;
- scl = dcs->d_scl;
-
- if (t == NOTSPEC && s == NOTSPEC && l == NOTSPEC && tp == NULL)
- dcs->d_notyp = 1;
-
- if (tp != NULL && (t != NOTSPEC || s != NOTSPEC || l != NOTSPEC)) {
- /* should never happen */
- lerror("deftyp() 1");
- }
-
- if (tp == NULL) {
- switch (t) {
- case NOTSPEC:
- t = INT;
- /* FALLTHROUGH */
- case INT:
- if (s == NOTSPEC)
- s = SIGNED;
- break;
- case CHAR:
- if (l != NOTSPEC) {
- dcs->d_terr = 1;
- l = NOTSPEC;
- }
- break;
- case FLOAT:
- if (l == LONG) {
- l = NOTSPEC;
- t = DOUBLE;
- if (!tflag)
- /* use 'double' instead of ... */
- warning(6);
- }
- break;
- case DOUBLE:
- if (l == LONG) {
- l = NOTSPEC;
- t = LDOUBLE;
- if (tflag)
- /* 'long double' is illegal in ... */
- warning(266);
- }
- break;
- case VOID:
- break;
- default:
- lerror("deftyp() 2");
- }
- if (t != INT && t != CHAR && (s != NOTSPEC || l != NOTSPEC)) {
- dcs->d_terr = 1;
- l = s = NOTSPEC;
- }
- if (l != NOTSPEC)
- t = l;
- dcs->d_type = gettyp(mrgtspec(t, s));
- }
-
- if (dcs->d_mscl) {
- /* only one storage class allowed */
- error(7);
- }
- if (dcs->d_terr) {
- /* illegal type combination */
- error(4);
- }
-
- if (dcs->d_ctx == EXTERN) {
- if (scl == REG || scl == AUTO) {
- /* illegal storage class */
- error(8);
- scl = NOSCL;
- }
- } else if (dcs->d_ctx == ARG || dcs->d_ctx == PARG) {
- if (scl != NOSCL && scl != REG) {
- /* only "register" valid ... */
- error(9);
- scl = NOSCL;
- }
- }
-
- dcs->d_scl = scl;
-
- if (dcs->d_const && dcs->d_type->t_const) {
- if (!dcs->d_type->t_typedef)
- lerror("deftyp() 3");
- /* typedef already qualified with "%s" */
- warning(68, "const");
- }
- if (dcs->d_volatile && dcs->d_type->t_volatile) {
- if (!dcs->d_type->t_typedef)
- lerror("deftyp() 4");
- /* typedef already qualified with "%s" */
- warning(68, "volatile");
- }
-
- if (dcs->d_const || dcs->d_volatile) {
- dcs->d_type = duptyp(dcs->d_type);
- dcs->d_type->t_const |= dcs->d_const;
- dcs->d_type->t_volatile |= dcs->d_volatile;
- }
-}
-
-/*
- * Merge type specifiers (char, ..., long long, signed, unsigned).
- */
-static tspec_t
-mrgtspec(tspec_t t, tspec_t s)
-{
-
- if (s == SIGNED || s == UNSIGN) {
- if (t == CHAR) {
- t = s == SIGNED ? SCHAR : UCHAR;
- } else if (t == SHORT) {
- t = s == SIGNED ? SHORT : USHORT;
- } else if (t == INT) {
- t = s == SIGNED ? INT : UINT;
- } else if (t == LONG) {
- t = s == SIGNED ? LONG : ULONG;
- } else if (t == QUAD) {
- t = s == SIGNED ? QUAD : UQUAD;
- }
- }
-
- return (t);
-}
-
-/*
- * Return the length of a type in bit.
- *
- * Printing a message if the outhermost dimension of an array is 0 must
- * be done by the caller. All other problems are reported by length()
- * if name is not NULL.
- */
-int
-length(type_t *tp, const char *name)
-{
- int elem, elsz;
-
- elem = 1;
- while (tp && tp->t_tspec == ARRAY) {
- elem *= tp->t_dim;
- tp = tp->t_subt;
- }
- if (tp == NULL)
- return -1;
-
- switch (tp->t_tspec) {
- case FUNC:
- /* compiler takes size of function */
- lerror("%s", msgs[12]);
- /* NOTREACHED */
- case STRUCT:
- case UNION:
- if (incompl(tp) && name != NULL) {
- /* incomplete structure or union %s: %s */
- error(31, tp->t_str->stag->s_name, name);
- }
- elsz = tp->t_str->size;
- break;
- case ENUM:
- if (incompl(tp) && name != NULL) {
- /* incomplete enum type: %s */
- warning(13, name);
- }
- /* FALLTHROUGH */
- default:
- elsz = size(tp->t_tspec);
- if (elsz <= 0)
- lerror("length()");
- break;
- }
- return (elem * elsz);
-}
-
-/*
- * Get the alignment of the given Type in bits.
- */
-int
-getbound(type_t *tp)
-{
- int a;
- tspec_t t;
-
- while (tp && tp->t_tspec == ARRAY)
- tp = tp->t_subt;
-
- if (tp == NULL)
- return -1;
-
- if ((t = tp->t_tspec) == STRUCT || t == UNION) {
- a = tp->t_str->align;
- } else if (t == FUNC) {
- /* compiler takes alignment of function */
- error(14);
- a = ALIGN(1) * CHAR_BIT;
- } else {
- if ((a = size(t)) == 0) {
- a = CHAR_BIT;
- } else if (a > ALIGN(1) * CHAR_BIT) {
- a = ALIGN(1) * CHAR_BIT;
- }
- }
- if (a < CHAR_BIT || a > ALIGN(1) * CHAR_BIT)
- lerror("getbound() 1");
- return (a);
-}
-
-/*
- * Concatenate two lists of symbols by s_nxt. Used by declarations of
- * struct/union/enum elements and parameters.
- */
-sym_t *
-lnklst(sym_t *l1, sym_t *l2)
-{
- sym_t *l;
-
- if ((l = l1) == NULL)
- return (l2);
- while (l1->s_nxt != NULL)
- l1 = l1->s_nxt;
- l1->s_nxt = l2;
- return (l);
-}
-
-/*
- * Check if the type of the given symbol is valid and print an error
- * message if it is not.
- *
- * Invalid types are:
- * - arrays of incomlete types or functions
- * - functions returning arrays or functions
- * - void types other than type of function or pointer
- */
-void
-chktyp(sym_t *sym)
-{
- tspec_t to, t;
- type_t **tpp, *tp;
-
- tpp = &sym->s_type;
- to = NOTSPEC;
- while ((tp = *tpp) != NULL) {
- t = tp->t_tspec;
- /*
- * If this is the type of an old style function definition,
- * a better warning is printed in funcdef().
- */
- if (t == FUNC && !tp->t_proto &&
- !(to == NOTSPEC && sym->s_osdef)) {
- if (sflag && hflag)
- /* function declaration is not a prototype */
- warning(287);
- }
- if (to == FUNC) {
- if (t == FUNC || t == ARRAY) {
- /* function returns illegal type */
- error(15);
- if (t == FUNC) {
- *tpp = incref(*tpp, PTR);
- } else {
- *tpp = incref((*tpp)->t_subt, PTR);
- }
- return;
- } else if (tp->t_const || tp->t_volatile) {
- if (sflag) { /* XXX oder better !tflag ? */
- /* function cannot return const... */
- warning(228);
- }
- }
- } if (to == ARRAY) {
- if (t == FUNC) {
- /* array of function is illegal */
- error(16);
- *tpp = gettyp(INT);
- return;
- } else if (t == ARRAY && tp->t_dim == 0) {
- /* null dimension */
- error(17);
- return;
- } else if (t == VOID) {
- /* illegal use of void */
- error(18);
- *tpp = gettyp(INT);
-#if 0 /* errors are produced by length() */
- } else if (incompl(tp)) {
- /* array of incomplete type */
- if (sflag) {
- error(301);
- } else {
- warning(301);
- }
-#endif
- }
- } else if (to == NOTSPEC && t == VOID) {
- if (dcs->d_ctx == PARG) {
- if (sym->s_scl != ABSTRACT) {
- if (sym->s_name == unnamed)
- lerror("chktyp()");
- /* void param cannot have name: %s */
- error(61, sym->s_name);
- *tpp = gettyp(INT);
- }
- } else if (dcs->d_ctx == ABSTRACT) {
- /* ok */
- } else if (sym->s_scl != TYPEDEF) {
- /* void type for %s */
- error(19, sym->s_name);
- *tpp = gettyp(INT);
- }
- }
- if (t == VOID && to != PTR) {
- if (tp->t_const || tp->t_volatile) {
- /* inappropriate qualifiers with "void" */
- warning(69);
- tp->t_const = tp->t_volatile = 0;
- }
- }
- tpp = &tp->t_subt;
- to = t;
- }
-}
-
-/*
- * Process the declarator of a struct/union element.
- */
-sym_t *
-decl1str(sym_t *dsym)
-{
- type_t *tp;
- tspec_t t;
- int sz, len;
- int o = 0; /* Appease gcc */
- scl_t sc;
-
- if ((sc = dsym->s_scl) != MOS && sc != MOU)
- lerror("decl1str() 1");
-
- if (dcs->d_rdcsym != NULL) {
- if ((sc = dcs->d_rdcsym->s_scl) != MOS && sc != MOU)
- /* should be ensured by storesym() */
- lerror("decl1str() 2");
- if (dsym->s_styp == dcs->d_rdcsym->s_styp) {
- /* duplicate member name: %s */
- error(33, dsym->s_name);
- rmsym(dcs->d_rdcsym);
- }
- }
-
- chktyp(dsym);
-
- t = (tp = dsym->s_type)->t_tspec;
-
- if (dsym->s_field) {
- /*
- * bit field
- *
- * only unsigned und signed int are protable bit-field types
- *(at least in ANSI C, in traditional C only unsigned int)
- */
- if (t == CHAR || t == UCHAR || t == SCHAR ||
- t == SHORT || t == USHORT || t == ENUM) {
- if (bitfieldtype_ok == 0) {
- if (sflag) {
- /*
- * bit-field type '%s' invalid in
- * ANSI C
- */
- warning(273, tyname(tp));
- } else if (pflag) {
- /* nonportable bit-field type */
- warning(34);
- }
- }
- } else if (t == INT && dcs->d_smod == NOTSPEC) {
- if (pflag && bitfieldtype_ok == 0) {
- /* nonportable bit-field type */
- warning(34);
- }
- } else if (t != INT && t != UINT) {
- /*
- * Non-integer types are always illegal for
- * bitfields, regardless of BITFIELDTYPE.
- * Integer types not dealt with above are
- * okay only if BITFIELDTYPE is in effect.
- */
- if (bitfieldtype_ok == 0 || isityp(t) == 0) {
- /* illegal bit-field type */
- error(35);
- sz = tp->t_flen;
- dsym->s_type = tp = duptyp(gettyp(t = INT));
- if ((tp->t_flen = sz) > size(t))
- tp->t_flen = size(t);
- }
- }
- if ((len = tp->t_flen) < 0 || len > size(t)) {
- /* illegal bit-field size */
- error(36);
- tp->t_flen = size(t);
- } else if (len == 0 && dsym->s_name != unnamed) {
- /* zero size bit-field */
- error(37);
- tp->t_flen = size(t);
- }
- if (dsym->s_scl == MOU) {
- /* illegal use of bit-field */
- error(41);
- dsym->s_type->t_isfield = 0;
- dsym->s_field = 0;
- }
- } else if (t == FUNC) {
- /* function illegal in structure or union */
- error(38);
- dsym->s_type = tp = incref(tp, t = PTR);
- }
-
- /*
- * bit-fields of length 0 are not warned about because length()
- * does not return the length of the bit-field but the length
- * of the type the bit-field is packed in (its ok)
- */
- if ((sz = length(dsym->s_type, dsym->s_name)) == 0) {
- if (t == ARRAY && dsym->s_type->t_dim == 0) {
- /* illegal zero sized structure member: %s */
- warning(39, dsym->s_name);
- }
- }
-
- if (dcs->d_ctx == MOU) {
- o = dcs->d_offset;
- dcs->d_offset = 0;
- }
- if (dsym->s_field) {
- align(getbound(tp), tp->t_flen);
- dsym->s_value.v_quad = (dcs->d_offset / size(t)) * size(t);
- tp->t_foffs = dcs->d_offset - (int)dsym->s_value.v_quad;
- dcs->d_offset += tp->t_flen;
- } else {
- align(getbound(tp), 0);
- dsym->s_value.v_quad = dcs->d_offset;
- dcs->d_offset += sz;
- }
- if (dcs->d_ctx == MOU) {
- if (o > dcs->d_offset)
- dcs->d_offset = o;
- }
-
- chkfdef(dsym, 0);
-
- /*
- * Clear the BITFIELDTYPE indicator after processing each
- * structure element.
- */
- bitfieldtype_ok = 0;
-
- return (dsym);
-}
-
-/*
- * Aligns next structure element as required.
- *
- * al contains the required alignment, len the length of a bit-field.
- */
-static void
-align(int al, int len)
-{
- int no;
-
- /*
- * The alignment of the current element becomes the alignment of
- * the struct/union if it is larger than the current alignment
- * of the struct/union.
- */
- if (al > dcs->d_stralign)
- dcs->d_stralign = al;
-
- no = (dcs->d_offset + (al - 1)) & ~(al - 1);
- if (len == 0 || dcs->d_offset + len > no)
- dcs->d_offset = no;
-}
-
-/*
- * Remember the width of the field in its type structure.
- */
-sym_t *
-bitfield(sym_t *dsym, int len)
-{
-
- if (dsym == NULL) {
- dsym = getblk(sizeof (sym_t));
- dsym->s_name = unnamed;
- dsym->s_kind = FMOS;
- dsym->s_scl = MOS;
- dsym->s_type = gettyp(UINT);
- dsym->s_blklev = -1;
- }
- dsym->s_type = duptyp(dsym->s_type);
- dsym->s_type->t_isfield = 1;
- dsym->s_type->t_flen = len;
- dsym->s_field = 1;
- return (dsym);
-}
-
-/*
- * Collect informations about a sequence of asterisks and qualifiers
- * in a list of type pqinf_t.
- * Qualifiers refer always to the left asterisk. The rightmost asterisk
- * will be at the top of the list.
- */
-pqinf_t *
-mergepq(pqinf_t *p1, pqinf_t *p2)
-{
- pqinf_t *p;
-
- if (p2->p_pcnt != 0) {
- /* left '*' at the end of the list */
- for (p = p2; p->p_nxt != NULL; p = p->p_nxt)
- continue;
- p->p_nxt = p1;
- return (p2);
- } else {
- if (p2->p_const) {
- if (p1->p_const) {
- /* duplicate %s */
- warning(10, "const");
- }
- p1->p_const = 1;
- }
- if (p2->p_volatile) {
- if (p1->p_volatile) {
- /* duplicate %s */
- warning(10, "volatile");
- }
- p1->p_volatile = 1;
- }
- free(p2);
- return (p1);
- }
-}
-
-/*
- * Followint 3 functions extend the type of a declarator with
- * pointer, function and array types.
- *
- * The current type is the Type built by deftyp() (dcs->d_type) and
- * pointer, function and array types already added for this
- * declarator. The new type extension is inserted between both.
- */
-sym_t *
-addptr(sym_t *decl, pqinf_t *pi)
-{
- type_t **tpp, *tp;
- pqinf_t *npi;
-
- tpp = &decl->s_type;
- while (*tpp && *tpp != dcs->d_type)
- tpp = &(*tpp)->t_subt;
- if (*tpp == NULL)
- return decl;
-
- while (pi != NULL) {
- *tpp = tp = getblk(sizeof (type_t));
- tp->t_tspec = PTR;
- tp->t_const = pi->p_const;
- tp->t_volatile = pi->p_volatile;
- *(tpp = &tp->t_subt) = dcs->d_type;
- npi = pi->p_nxt;
- free(pi);
- pi = npi;
- }
- return (decl);
-}
-
-/*
- * If a dimension was specified, dim is 1, otherwise 0
- * n is the specified dimension
- */
-sym_t *
-addarray(sym_t *decl, int dim, int n)
-{
- type_t **tpp, *tp;
-
- tpp = &decl->s_type;
- while (*tpp && *tpp != dcs->d_type)
- tpp = &(*tpp)->t_subt;
- if (*tpp == NULL)
- return decl;
-
- *tpp = tp = getblk(sizeof (type_t));
- tp->t_tspec = ARRAY;
- tp->t_subt = dcs->d_type;
- tp->t_dim = n;
-
- if (n < 0) {
- /* zero or negative array dimension */
- error(20);
- n = 0;
- } else if (n == 0 && dim) {
- /* zero or negative array dimension */
- warning(20);
- } else if (n == 0 && !dim) {
- /* is incomplete type */
- setcompl(tp, 1);
- }
-
- return (decl);
-}
-
-sym_t *
-addfunc(sym_t *decl, sym_t *args)
-{
- type_t **tpp, *tp;
-
- if (dcs->d_proto) {
- if (tflag)
- /* function prototypes are illegal in traditional C */
- warning(270);
- args = nsfunc(decl, args);
- } else {
- osfunc(decl, args);
- }
-
- /*
- * The symbols are removed from the symbol table by popdecl() after
- * addfunc(). To be able to restore them if this is a function
- * definition, a pointer to the list of all symbols is stored in
- * dcs->d_nxt->d_fpsyms. Also a list of the arguments (concatenated
- * by s_nxt) is stored in dcs->d_nxt->d_fargs.
- * (dcs->d_nxt must be used because *dcs is the declaration stack
- * element created for the list of params and is removed after
- * addfunc())
- */
- if (dcs->d_nxt->d_ctx == EXTERN &&
- decl->s_type == dcs->d_nxt->d_type) {
- dcs->d_nxt->d_fpsyms = dcs->d_dlsyms;
- dcs->d_nxt->d_fargs = args;
- }
-
- tpp = &decl->s_type;
- while (*tpp && *tpp != dcs->d_nxt->d_type)
- tpp = &(*tpp)->t_subt;
- if (*tpp == NULL)
- return decl;
-
- *tpp = tp = getblk(sizeof (type_t));
- tp->t_tspec = FUNC;
- tp->t_subt = dcs->d_nxt->d_type;
- if ((tp->t_proto = dcs->d_proto) != 0)
- tp->t_args = args;
- tp->t_vararg = dcs->d_vararg;
-
- return (decl);
-}
-
-/*
- * Called for new style function declarations.
- */
-/* ARGSUSED */
-static sym_t *
-nsfunc(sym_t *decl, sym_t *args)
-{
- sym_t *arg, *sym;
- scl_t sc;
- int n;
-
- /*
- * Declarations of structs/unions/enums in param lists are legal,
- * but senseless.
- */
- for (sym = dcs->d_dlsyms; sym != NULL; sym = sym->s_dlnxt) {
- sc = sym->s_scl;
- if (sc == STRTAG || sc == UNIONTAG || sc == ENUMTAG) {
- /* dubious tag declaration: %s %s */
- warning(85, scltoa(sc), sym->s_name);
- }
- }
-
- n = 1;
- for (arg = args; arg != NULL; arg = arg->s_nxt) {
- if (arg->s_type->t_tspec == VOID) {
- if (n > 1 || arg->s_nxt != NULL) {
- /* "void" must be sole parameter */
- error(60);
- arg->s_type = gettyp(INT);
- }
- }
- n++;
- }
-
- /* return NULL if first param is VOID */
- return (args != NULL && args->s_type->t_tspec != VOID ? args : NULL);
-}
-
-/*
- * Called for old style function declarations.
- */
-static void
-osfunc(sym_t *decl, sym_t *args)
-{
-
- /*
- * Remember list of params only if this is really seams to be
- * a function definition.
- */
- if (dcs->d_nxt->d_ctx == EXTERN &&
- decl->s_type == dcs->d_nxt->d_type) {
- /*
- * We assume that this becomes a function definition. If
- * we are wrong, its corrected in chkfdef().
- */
- if (args != NULL) {
- decl->s_osdef = 1;
- decl->s_args = args;
- }
- } else {
- if (args != NULL)
- /* function prototype parameters must have types */
- warning(62);
- }
-}
-
-/*
- * Lists of Identifiers in functions declarations are allowed only if
- * its also a function definition. If this is not the case, print a
- * error message.
- */
-void
-chkfdef(sym_t *sym, int msg)
-{
-
- if (sym->s_osdef) {
- if (msg) {
- /* incomplete or misplaced function definition */
- error(22);
- }
- sym->s_osdef = 0;
- sym->s_args = NULL;
- }
-}
-
-/*
- * Process the name in a declarator.
- * If the symbol does already exists, a new one is created.
- * The symbol becomes one of the storage classes EXTERN, STATIC, AUTO or
- * TYPEDEF.
- * s_def and s_reg are valid after dname().
- */
-sym_t *
-dname(sym_t *sym)
-{
- scl_t sc = NOSCL;
-
- if (sym->s_scl == NOSCL) {
- dcs->d_rdcsym = NULL;
- } else if (sym->s_defarg) {
- sym->s_defarg = 0;
- dcs->d_rdcsym = NULL;
- } else {
- dcs->d_rdcsym = sym;
- sym = pushdown(sym);
- }
-
- switch (dcs->d_ctx) {
- case MOS:
- case MOU:
- /* Parent setzen */
- sym->s_styp = dcs->d_tagtyp->t_str;
- sym->s_def = DEF;
- sym->s_value.v_tspec = INT;
- sc = dcs->d_ctx;
- break;
- case EXTERN:
- /*
- * static and external symbols without "extern" are
- * considered to be tentative defined, external
- * symbols with "extern" are declared, and typedef names
- * are defined. Tentative defined and declared symbols
- * may become defined if an initializer is present or
- * this is a function definition.
- */
- if ((sc = dcs->d_scl) == NOSCL) {
- sc = EXTERN;
- sym->s_def = TDEF;
- } else if (sc == STATIC) {
- sym->s_def = TDEF;
- } else if (sc == TYPEDEF) {
- sym->s_def = DEF;
- } else if (sc == EXTERN) {
- sym->s_def = DECL;
- } else {
- lerror("dname() 1");
- }
- break;
- case PARG:
- sym->s_arg = 1;
- /* FALLTHROUGH */
- case ARG:
- if ((sc = dcs->d_scl) == NOSCL) {
- sc = AUTO;
- } else if (sc == REG) {
- sym->s_reg = 1;
- sc = AUTO;
- } else {
- lerror("dname() 2");
- }
- sym->s_def = DEF;
- break;
- case AUTO:
- if ((sc = dcs->d_scl) == NOSCL) {
- /*
- * XXX somewhat ugly because we dont know whether
- * this is AUTO or EXTERN (functions). If we are
- * wrong it must be corrected in decl1loc(), where
- * we have the necessary type information.
- */
- sc = AUTO;
- sym->s_def = DEF;
- } else if (sc == AUTO || sc == STATIC || sc == TYPEDEF) {
- sym->s_def = DEF;
- } else if (sc == REG) {
- sym->s_reg = 1;
- sc = AUTO;
- sym->s_def = DEF;
- } else if (sc == EXTERN) {
- sym->s_def = DECL;
- } else {
- lerror("dname() 3");
- }
- break;
- default:
- lerror("dname() 4");
- }
- sym->s_scl = sc;
-
- sym->s_type = dcs->d_type;
-
- dcs->d_fpsyms = NULL;
-
- return (sym);
-}
-
-/*
- * Process a name in the list of formal params in an old style function
- * definition.
- */
-sym_t *
-iname(sym_t *sym)
-{
-
- if (sym->s_scl != NOSCL) {
- if (blklev == sym->s_blklev) {
- /* redeclaration of formal parameter %s */
- error(21, sym->s_name);
- if (!sym->s_defarg)
- lerror("iname()");
- }
- sym = pushdown(sym);
- }
- sym->s_type = gettyp(INT);
- sym->s_scl = AUTO;
- sym->s_def = DEF;
- sym->s_defarg = sym->s_arg = 1;
- return (sym);
-}
-
-/*
- * Create the type of a tag.
- *
- * tag points to the symbol table entry of the tag
- * kind is the kind of the tag (STRUCT/UNION/ENUM)
- * decl is 1 if the type of the tag will be completed in this declaration
- * (the following token is T_LBRACE)
- * semi is 1 if the following token is T_SEMI
- */
-type_t *
-mktag(sym_t *tag, tspec_t kind, int decl, int semi)
-{
- scl_t scl = NOSCL;
- type_t *tp;
-
- if (kind == STRUCT) {
- scl = STRTAG;
- } else if (kind == UNION) {
- scl = UNIONTAG;
- } else if (kind == ENUM) {
- scl = ENUMTAG;
- } else {
- lerror("mktag()");
- }
-
- if (tag != NULL) {
- if (tag->s_scl != NOSCL) {
- tag = newtag(tag, scl, decl, semi);
- } else {
- /* a new tag, no empty declaration */
- dcs->d_nxt->d_nedecl = 1;
- if (scl == ENUMTAG && !decl) {
- if (!tflag && (sflag || pflag))
- /* forward reference to enum type */
- warning(42);
- }
- }
- if (tag->s_scl == NOSCL) {
- tag->s_scl = scl;
- tag->s_type = tp = getblk(sizeof (type_t));
- } else {
- tp = tag->s_type;
- }
- } else {
- tag = getblk(sizeof (sym_t));
- tag->s_name = unnamed;
- UNIQUE_CURR_POS(tag->s_dpos);
- tag->s_kind = FTAG;
- tag->s_scl = scl;
- tag->s_blklev = -1;
- tag->s_type = tp = getblk(sizeof (type_t));
- dcs->d_nxt->d_nedecl = 1;
- }
-
- if (tp->t_tspec == NOTSPEC) {
- tp->t_tspec = kind;
- if (kind != ENUM) {
- tp->t_str = getblk(sizeof (str_t));
- tp->t_str->align = CHAR_BIT;
- tp->t_str->stag = tag;
- } else {
- tp->t_isenum = 1;
- tp->t_enum = getblk(sizeof (enum_t));
- tp->t_enum->etag = tag;
- }
- /* ist unvollstaendiger Typ */
- setcompl(tp, 1);
- }
-
- return (tp);
-}
-
-/*
- * Checks all possible cases of tag redeclarations.
- * decl is 1 if T_LBRACE follows
- * semi is 1 if T_SEMI follows
- */
-static sym_t *
-newtag(sym_t *tag, scl_t scl, int decl, int semi)
-{
-
- if (tag->s_blklev < blklev) {
- if (semi) {
- /* "struct a;" */
- if (!tflag) {
- if (!sflag)
- /* decl. introduces new type ... */
- warning(44, scltoa(scl), tag->s_name);
- tag = pushdown(tag);
- } else if (tag->s_scl != scl) {
- /* base type is really "%s %s" */
- warning(45, scltoa(tag->s_scl), tag->s_name);
- }
- dcs->d_nxt->d_nedecl = 1;
- } else if (decl) {
- /* "struct a { ... } " */
- if (hflag)
- /* redefinition hides earlier one: %s */
- warning(43, tag->s_name);
- tag = pushdown(tag);
- dcs->d_nxt->d_nedecl = 1;
- } else if (tag->s_scl != scl) {
- /* base type is really "%s %s" */
- warning(45, scltoa(tag->s_scl), tag->s_name);
- /* declaration introduces new type in ANSI C: %s %s */
- if (!sflag)
- warning(44, scltoa(scl), tag->s_name);
- tag = pushdown(tag);
- dcs->d_nxt->d_nedecl = 1;
- }
- } else {
- if (tag->s_scl != scl) {
- /* (%s) tag redeclared */
- error(46, scltoa(tag->s_scl));
- prevdecl(-1, tag);
- tag = pushdown(tag);
- dcs->d_nxt->d_nedecl = 1;
- } else if (decl && !incompl(tag->s_type)) {
- /* (%s) tag redeclared */
- error(46, scltoa(tag->s_scl));
- prevdecl(-1, tag);
- tag = pushdown(tag);
- dcs->d_nxt->d_nedecl = 1;
- } else if (semi || decl) {
- dcs->d_nxt->d_nedecl = 1;
- }
- }
- return (tag);
-}
-
-const char *
-scltoa(scl_t sc)
-{
- const char *s;
-
- switch (sc) {
- case EXTERN: s = "extern"; break;
- case STATIC: s = "static"; break;
- case AUTO: s = "auto"; break;
- case REG: s = "register"; break;
- case TYPEDEF: s = "typedef"; break;
- case STRTAG: s = "struct"; break;
- case UNIONTAG: s = "union"; break;
- case ENUMTAG: s = "enum"; break;
- default: lerror("tagttoa()");
- }
- return (s);
-}
-
-/*
- * Completes the type of a tag in a struct/union/enum declaration.
- * tp points to the type of the, tag, fmem to the list of members/enums.
- */
-type_t *
-compltag(type_t *tp, sym_t *fmem)
-{
- tspec_t t;
- str_t *sp;
- int n;
- sym_t *mem;
-
- /* from now a complete type */
- setcompl(tp, 0);
-
- if ((t = tp->t_tspec) != ENUM) {
- align(dcs->d_stralign, 0);
- sp = tp->t_str;
- sp->align = dcs->d_stralign;
- sp->size = dcs->d_offset;
- sp->memb = fmem;
- if (sp->size == 0) {
- /* zero sized %s */
- (void)gnuism(47, ttab[t].tt_name);
- } else {
- n = 0;
- for (mem = fmem; mem != NULL; mem = mem->s_nxt) {
- if (mem->s_name != unnamed)
- n++;
- }
- if (n == 0) {
- /* %s has no named members */
- warning(65,
- t == STRUCT ? "structure" : "union");
- }
- }
- } else {
- tp->t_enum->elem = fmem;
- }
- return (tp);
-}
-
-/*
- * Processes the name of an enumerator in en enum declaration.
- *
- * sym points to the enumerator
- * val is the value of the enumerator
- * impl is 1 if the value of the enumerator was not explicit specified.
- */
-sym_t *
-ename(sym_t *sym, int val, int impl)
-{
-
- if (sym->s_scl) {
- if (sym->s_blklev == blklev) {
- /* no hflag, because this is illegal!!! */
- if (sym->s_arg) {
- /* enumeration constant hides parameter: %s */
- warning(57, sym->s_name);
- } else {
- /* redeclaration of %s */
- error(27, sym->s_name);
- /*
- * inside blocks it should not too complicated
- * to find the position of the previous
- * declaration
- */
- if (blklev == 0)
- prevdecl(-1, sym);
- }
- } else {
- if (hflag)
- /* redefinition hides earlier one: %s */
- warning(43, sym->s_name);
- }
- sym = pushdown(sym);
- }
- sym->s_scl = ENUMCON;
- sym->s_type = dcs->d_tagtyp;
- sym->s_value.v_tspec = INT;
- sym->s_value.v_quad = val;
- if (impl && val - 1 == INT_MAX) {
- /* overflow in enumeration values: %s */
- warning(48, sym->s_name);
- }
- enumval = val + 1;
- return (sym);
-}
-
-/*
- * Process a single external declarator.
- */
-void
-decl1ext(sym_t *dsym, int initflg)
-{
- int warn, rval, redec;
- sym_t *rdsym;
-
- chkfdef(dsym, 1);
-
- chktyp(dsym);
-
- if (initflg && !(initerr = chkinit(dsym)))
- dsym->s_def = DEF;
-
- /*
- * Declarations of functions are marked as "tentative" in dname().
- * This is wrong because there are no tentative function
- * definitions.
- */
- if (dsym->s_type->t_tspec == FUNC && dsym->s_def == TDEF)
- dsym->s_def = DECL;
-
- if (dcs->d_inline) {
- if (dsym->s_type->t_tspec == FUNC) {
- dsym->s_inline = 1;
- } else {
- /* variable declared inline: %s */
- warning(268, dsym->s_name);
- }
- }
-
- /* Write the declaration into the output file */
- if (plibflg && llibflg &&
- dsym->s_type->t_tspec == FUNC && dsym->s_type->t_proto) {
- /*
- * With both LINTLIBRARY and PROTOLIB the prototyp is
- * written as a function definition to the output file.
- */
- rval = dsym->s_type->t_subt->t_tspec != VOID;
- outfdef(dsym, &dsym->s_dpos, rval, 0, NULL);
- } else {
- outsym(dsym, dsym->s_scl, dsym->s_def);
- }
-
- if ((rdsym = dcs->d_rdcsym) != NULL) {
-
- /*
- * If the old symbol stems from an old style function definition
- * we have remembered the params in rdsmy->s_args and compare
- * them with the params of the prototype.
- */
- if (rdsym->s_osdef && dsym->s_type->t_proto) {
- redec = chkosdef(rdsym, dsym);
- } else {
- redec = 0;
- }
-
- if (!redec && !isredec(dsym, (warn = 0, &warn))) {
-
- if (warn) {
- /* redeclaration of %s */
- (*(sflag ? error : warning))(27, dsym->s_name);
- prevdecl(-1, rdsym);
- }
-
- /*
- * Overtake the rememberd params if the new symbol
- * is not a prototype.
- */
- if (rdsym->s_osdef && !dsym->s_type->t_proto) {
- dsym->s_osdef = rdsym->s_osdef;
- dsym->s_args = rdsym->s_args;
- STRUCT_ASSIGN(dsym->s_dpos, rdsym->s_dpos);
- }
-
- /*
- * Remember the position of the declaration if the
- * old symbol was a prototype and the new is not.
- * Also remember the position if the old symbol
- * was defined and the new is not.
- */
- if (rdsym->s_type->t_proto && !dsym->s_type->t_proto) {
- STRUCT_ASSIGN(dsym->s_dpos, rdsym->s_dpos);
- } else if (rdsym->s_def == DEF && dsym->s_def != DEF) {
- STRUCT_ASSIGN(dsym->s_dpos, rdsym->s_dpos);
- }
-
- /*
- * Copy informations about usage of the name into
- * the new symbol.
- */
- cpuinfo(dsym, rdsym);
-
- /* Once a name is defined, it remains defined. */
- if (rdsym->s_def == DEF)
- dsym->s_def = DEF;
-
- /* once a function is inline, it remains inline */
- if (rdsym->s_inline)
- dsym->s_inline = 1;
-
- compltyp(dsym, rdsym);
-
- }
-
- rmsym(rdsym);
- }
-
- if (dsym->s_scl == TYPEDEF) {
- dsym->s_type = duptyp(dsym->s_type);
- dsym->s_type->t_typedef = 1;
- settdsym(dsym->s_type, dsym);
- }
-
-}
-
-/*
- * Copies informations about usage into a new symbol table entry of
- * the same symbol.
- */
-void
-cpuinfo(sym_t *sym, sym_t *rdsym)
-{
-
- sym->s_spos = rdsym->s_spos;
- sym->s_upos = rdsym->s_upos;
- sym->s_set = rdsym->s_set;
- sym->s_used = rdsym->s_used;
-}
-
-/*
- * Prints an error and returns 1 if a symbol is redeclared/redefined.
- * Otherwise returns 0 and, in some cases of minor problems, prints
- * a warning.
- */
-int
-isredec(sym_t *dsym, int *warn)
-{
- sym_t *rsym;
-
- if ((rsym = dcs->d_rdcsym)->s_scl == ENUMCON) {
- /* redeclaration of %s */
- error(27, dsym->s_name);
- prevdecl(-1, rsym);
- return (1);
- }
- if (rsym->s_scl == TYPEDEF) {
- /* typedef redeclared: %s */
- error(89, dsym->s_name);
- prevdecl(-1, rsym);
- return (1);
- }
- if (dsym->s_scl == TYPEDEF) {
- /* redeclaration of %s */
- error(27, dsym->s_name);
- prevdecl(-1, rsym);
- return (1);
- }
- if (rsym->s_def == DEF && dsym->s_def == DEF) {
- /* redefinition of %s */
- error(28, dsym->s_name);
- prevdecl(-1, rsym);
- return(1);
- }
- if (!eqtype(rsym->s_type, dsym->s_type, 0, 0, warn)) {
- /* redeclaration of %s */
- error(27, dsym->s_name);
- prevdecl(-1, rsym);
- return(1);
- }
- if (rsym->s_scl == EXTERN && dsym->s_scl == EXTERN)
- return(0);
- if (rsym->s_scl == STATIC && dsym->s_scl == STATIC)
- return(0);
- if (rsym->s_scl == STATIC && dsym->s_def == DECL)
- return(0);
- if (rsym->s_scl == EXTERN && rsym->s_def == DEF) {
- /*
- * All cases except "int a = 1; static int a;" are catched
- * above with or without a warning
- */
- /* redeclaration of %s */
- error(27, dsym->s_name);
- prevdecl(-1, rsym);
- return(1);
- }
- if (rsym->s_scl == EXTERN) {
- /* previously declared extern, becomes static: %s */
- warning(29, dsym->s_name);
- prevdecl(-1, rsym);
- return(0);
- }
- /*
- * Now its on of:
- * "static a; int a;", "static a; int a = 1;", "static a = 1; int a;"
- */
- /* redeclaration of %s; ANSI C requires "static" */
- if (sflag) {
- warning(30, dsym->s_name);
- prevdecl(-1, rsym);
- }
- dsym->s_scl = STATIC;
- return (0);
-}
-
-/*
- * Checks if two types are compatible. Returns 0 if not, otherwise 1.
- *
- * ignqual ignore qualifiers of type; used for function params
- * promot promote left type; used for comparison of params of
- * old style function definitions with params of prototypes.
- * *warn set to 1 if an old style function declaration is not
- * compatible with a prototype
- */
-int
-eqtype(type_t *tp1, type_t *tp2, int ignqual, int promot, int *warn)
-{
- tspec_t t;
-
- while (tp1 != NULL && tp2 != NULL) {
-
- t = tp1->t_tspec;
- if (promot) {
- if (t == FLOAT) {
- t = DOUBLE;
- } else if (t == CHAR || t == SCHAR) {
- t = INT;
- } else if (t == UCHAR) {
- t = tflag ? UINT : INT;
- } else if (t == SHORT) {
- t = INT;
- } else if (t == USHORT) {
- /* CONSTCOND */
- t = INT_MAX < USHRT_MAX || tflag ? UINT : INT;
- }
- }
-
- if (t != tp2->t_tspec)
- return (0);
-
- if (tp1->t_const != tp2->t_const && !ignqual && !tflag)
- return (0);
-
- if (tp1->t_volatile != tp2->t_volatile && !ignqual && !tflag)
- return (0);
-
- if (t == STRUCT || t == UNION)
- return (tp1->t_str == tp2->t_str);
-
- if (t == ARRAY && tp1->t_dim != tp2->t_dim) {
- if (tp1->t_dim != 0 && tp2->t_dim != 0)
- return (0);
- }
-
- /* dont check prototypes for traditional */
- if (t == FUNC && !tflag) {
- if (tp1->t_proto && tp2->t_proto) {
- if (!eqargs(tp1, tp2, warn))
- return (0);
- } else if (tp1->t_proto) {
- if (!mnoarg(tp1, warn))
- return (0);
- } else if (tp2->t_proto) {
- if (!mnoarg(tp2, warn))
- return (0);
- }
- }
-
- tp1 = tp1->t_subt;
- tp2 = tp2->t_subt;
- ignqual = promot = 0;
-
- }
-
- return (tp1 == tp2);
-}
-
-/*
- * Compares the parameter types of two prototypes.
- */
-static int
-eqargs(type_t *tp1, type_t *tp2, int *warn)
-{
- sym_t *a1, *a2;
-
- if (tp1->t_vararg != tp2->t_vararg)
- return (0);
-
- a1 = tp1->t_args;
- a2 = tp2->t_args;
-
- while (a1 != NULL && a2 != NULL) {
-
- if (eqtype(a1->s_type, a2->s_type, 1, 0, warn) == 0)
- return (0);
-
- a1 = a1->s_nxt;
- a2 = a2->s_nxt;
-
- }
-
- return (a1 == a2);
-}
-
-/*
- * mnoarg() (matches functions with no argument type information)
- * returns 1 if all parameters of a prototype are compatible with
- * and old style function declaration.
- * This is the case if following conditions are met:
- * 1. the prototype must have a fixed number of parameters
- * 2. no parameter is of type float
- * 3. no parameter is converted to another type if integer promotion
- * is applied on it
- */
-static int
-mnoarg(type_t *tp, int *warn)
-{
- sym_t *arg;
- tspec_t t;
-
- if (tp->t_vararg) {
- if (warn != NULL)
- *warn = 1;
- }
- for (arg = tp->t_args; arg != NULL; arg = arg->s_nxt) {
- if ((t = arg->s_type->t_tspec) == FLOAT ||
- t == CHAR || t == SCHAR || t == UCHAR ||
- t == SHORT || t == USHORT) {
- if (warn != NULL)
- *warn = 1;
- }
- }
- return (1);
-}
-
-/*
- * Compares a prototype declaration with the remembered arguments of
- * a previous old style function definition.
- */
-static int
-chkosdef(sym_t *rdsym, sym_t *dsym)
-{
- sym_t *args, *pargs, *arg, *parg;
- int narg, nparg, n;
- int warn, msg;
-
- args = rdsym->s_args;
- pargs = dsym->s_type->t_args;
-
- msg = 0;
-
- narg = nparg = 0;
- for (arg = args; arg != NULL; arg = arg->s_nxt)
- narg++;
- for (parg = pargs; parg != NULL; parg = parg->s_nxt)
- nparg++;
- if (narg != nparg) {
- /* prototype does not match old-style definition */
- error(63);
- msg = 1;
- goto end;
- }
-
- arg = args;
- parg = pargs;
- n = 1;
- while (narg--) {
- warn = 0;
- /*
- * If it does not match due to promotion and sflag is
- * not set we print only a warning.
- */
- if (!eqtype(arg->s_type, parg->s_type, 1, 1, &warn) || warn) {
- /* prototype does not match old-style def., arg #%d */
- error(299, n);
- msg = 1;
- }
- arg = arg->s_nxt;
- parg = parg->s_nxt;
- n++;
- }
-
- end:
- if (msg)
- /* old style definition */
- prevdecl(300, rdsym);
-
- return (msg);
-}
-
-/*
- * Complets a type by copying the dimension and prototype information
- * from a second compatible type.
- *
- * Following lines are legal:
- * "typedef a[]; a b; a b[10]; a c; a c[20];"
- * "typedef ft(); ft f; f(int); ft g; g(long);"
- * This means that, if a type is completed, the type structure must
- * be duplicated.
- */
-void
-compltyp(sym_t *dsym, sym_t *ssym)
-{
- type_t **dstp, *src;
- type_t *dst;
-
- dstp = &dsym->s_type;
- src = ssym->s_type;
-
- while ((dst = *dstp) != NULL) {
- if (src == NULL || dst->t_tspec != src->t_tspec)
- lerror("compltyp() 1");
- if (dst->t_tspec == ARRAY) {
- if (dst->t_dim == 0 && src->t_dim != 0) {
- *dstp = dst = duptyp(dst);
- dst->t_dim = src->t_dim;
- /* now a complete Typ */
- setcompl(dst, 0);
- }
- } else if (dst->t_tspec == FUNC) {
- if (!dst->t_proto && src->t_proto) {
- *dstp = dst = duptyp(dst);
- dst->t_proto = 1;
- dst->t_args = src->t_args;
- }
- }
- dstp = &dst->t_subt;
- src = src->t_subt;
- }
-}
-
-/*
- * Completes the declaration of a single argument.
- */
-sym_t *
-decl1arg(sym_t *sym, int initflg)
-{
- tspec_t t;
-
- chkfdef(sym, 1);
-
- chktyp(sym);
-
- if (dcs->d_rdcsym != NULL && dcs->d_rdcsym->s_blklev == blklev) {
- /* redeclaration of formal parameter %s */
- error(237, sym->s_name);
- rmsym(dcs->d_rdcsym);
- sym->s_arg = 1;
- }
-
- if (!sym->s_arg) {
- /* declared argument %s is missing */
- error(53, sym->s_name);
- sym->s_arg = 1;
- }
-
- if (initflg) {
- /* cannot initialize parameter: %s */
- error(52, sym->s_name);
- initerr = 1;
- }
-
- if ((t = sym->s_type->t_tspec) == ARRAY) {
- sym->s_type = incref(sym->s_type->t_subt, PTR);
- } else if (t == FUNC) {
- if (tflag)
- /* a function is declared as an argument: %s */
- warning(50, sym->s_name);
- sym->s_type = incref(sym->s_type, PTR);
- } else if (t == FLOAT) {
- if (tflag)
- sym->s_type = gettyp(DOUBLE);
- }
-
- if (dcs->d_inline)
- /* argument declared inline: %s */
- warning(269, sym->s_name);
-
- /*
- * Arguments must have complete types. lengths() prints the needed
- * error messages (null dimension is impossible because arrays are
- * converted to pointers).
- */
- if (sym->s_type->t_tspec != VOID)
- (void)length(sym->s_type, sym->s_name);
-
- setsflg(sym);
-
- return (sym);
-}
-
-/*
- * Does some checks for lint directives which apply to functions.
- * Processes arguments in old style function definitions which default
- * to int.
- * Checks compatiblility of old style function definition with previous
- * prototype.
- */
-void
-cluparg(void)
-{
- sym_t *args, *arg, *pargs, *parg;
- int narg, nparg, n, msg;
- tspec_t t;
-
- args = funcsym->s_args;
- pargs = funcsym->s_type->t_args;
-
- /* check for illegal combinations of lint directives */
- if (prflstrg != -1 && scflstrg != -1) {
- /* can't be used together: ** PRINTFLIKE ** ** SCANFLIKE ** */
- warning(289);
- prflstrg = scflstrg = -1;
- }
- if (nvararg != -1 && (prflstrg != -1 || scflstrg != -1)) {
- /* dubious use of ** VARARGS ** with ** %s ** */
- warning(288, prflstrg != -1 ? "PRINTFLIKE" : "SCANFLIKE");
- nvararg = -1;
- }
-
- /*
- * check if the argument of a lint directive is compatible with the
- * number of arguments.
- */
- narg = 0;
- for (arg = dcs->d_fargs; arg != NULL; arg = arg->s_nxt)
- narg++;
- if (nargusg > narg) {
- /* argument number mismatch with directive: ** %s ** */
- warning(283, "ARGSUSED");
- nargusg = 0;
- }
- if (nvararg > narg) {
- /* argument number mismatch with directive: ** %s ** */
- warning(283, "VARARGS");
- nvararg = 0;
- }
- if (prflstrg > narg) {
- /* argument number mismatch with directive: ** %s ** */
- warning(283, "PRINTFLIKE");
- prflstrg = -1;
- } else if (prflstrg == 0) {
- prflstrg = -1;
- }
- if (scflstrg > narg) {
- /* argument number mismatch with directive: ** %s ** */
- warning(283, "SCANFLIKE");
- scflstrg = -1;
- } else if (scflstrg == 0) {
- scflstrg = -1;
- }
- if (prflstrg != -1 || scflstrg != -1) {
- narg = prflstrg != -1 ? prflstrg : scflstrg;
- arg = dcs->d_fargs;
- for (n = 1; n < narg; n++)
- arg = arg->s_nxt;
- if (arg->s_type->t_tspec != PTR ||
- ((t = arg->s_type->t_subt->t_tspec) != CHAR &&
- t != UCHAR && t != SCHAR)) {
- /* arg. %d must be 'char *' for PRINTFLIKE/SCANFLIKE */
- warning(293, narg);
- prflstrg = scflstrg = -1;
- }
- }
-
- /*
- * print a warning for each argument off an old style function
- * definition which defaults to int
- */
- for (arg = args; arg != NULL; arg = arg->s_nxt) {
- if (arg->s_defarg) {
- /* argument type defaults to int: %s */
- warning(32, arg->s_name);
- arg->s_defarg = 0;
- setsflg(arg);
- }
- }
-
- /*
- * If this is an old style function definition and a prototyp
- * exists, compare the types of arguments.
- */
- if (funcsym->s_osdef && funcsym->s_type->t_proto) {
- /*
- * If the number of arguments does not macht, we need not
- * continue.
- */
- narg = nparg = 0;
- msg = 0;
- for (parg = pargs; parg != NULL; parg = parg->s_nxt)
- nparg++;
- for (arg = args; arg != NULL; arg = arg->s_nxt)
- narg++;
- if (narg != nparg) {
- /* parameter mismatch: %d declared, %d defined */
- error(51, nparg, narg);
- msg = 1;
- } else {
- parg = pargs;
- arg = args;
- while (narg--) {
- msg |= chkptdecl(arg, parg);
- parg = parg->s_nxt;
- arg = arg->s_nxt;
- }
- }
- if (msg)
- /* prototype declaration */
- prevdecl(285, dcs->d_rdcsym);
-
- /* from now the prototype is valid */
- funcsym->s_osdef = 0;
- funcsym->s_args = NULL;
-
- }
-
-}
-
-/*
- * Checks compatibility of an old style function definition with a previous
- * prototype declaration.
- * Returns 1 if the position of the previous declaration should be reported.
- */
-static int
-chkptdecl(sym_t *arg, sym_t *parg)
-{
- type_t *tp, *ptp;
- int warn, msg;
-
- tp = arg->s_type;
- ptp = parg->s_type;
-
- msg = 0;
- warn = 0;
-
- if (!eqtype(tp, ptp, 1, 1, &warn)) {
- if (eqtype(tp, ptp, 1, 0, &warn)) {
- /* type does not match prototype: %s */
- msg = gnuism(58, arg->s_name);
- } else {
- /* type does not match prototype: %s */
- error(58, arg->s_name);
- msg = 1;
- }
- } else if (warn) {
- /* type does not match prototype: %s */
- (*(sflag ? error : warning))(58, arg->s_name);
- msg = 1;
- }
-
- return (msg);
-}
-
-/*
- * Completes a single local declaration/definition.
- */
-void
-decl1loc(sym_t *dsym, int initflg)
-{
-
- /* Correct a mistake done in dname(). */
- if (dsym->s_type->t_tspec == FUNC) {
- dsym->s_def = DECL;
- if (dcs->d_scl == NOSCL)
- dsym->s_scl = EXTERN;
- }
-
- if (dsym->s_type->t_tspec == FUNC) {
- if (dsym->s_scl == STATIC) {
- /* dubious static function at block level: %s */
- warning(93, dsym->s_name);
- dsym->s_scl = EXTERN;
- } else if (dsym->s_scl != EXTERN && dsym->s_scl != TYPEDEF) {
- /* function has illegal storage class: %s */
- error(94, dsym->s_name);
- dsym->s_scl = EXTERN;
- }
- }
-
- /*
- * functions may be declared inline at local scope, although
- * this has no effect for a later definition of the same
- * function.
- * XXX it should have an effect if tflag is set. this would
- * also be the way gcc behaves.
- */
- if (dcs->d_inline) {
- if (dsym->s_type->t_tspec == FUNC) {
- dsym->s_inline = 1;
- } else {
- /* variable declared inline: %s */
- warning(268, dsym->s_name);
- }
- }
-
- chkfdef(dsym, 1);
-
- chktyp(dsym);
-
- if (dcs->d_rdcsym != NULL && dsym->s_scl == EXTERN)
- ledecl(dsym);
-
- if (dsym->s_scl == EXTERN) {
- /*
- * XXX wenn die statische Variable auf Ebene 0 erst
- * spaeter definiert wird, haben wir die Brille auf.
- */
- if (dsym->s_xsym == NULL) {
- outsym(dsym, EXTERN, dsym->s_def);
- } else {
- outsym(dsym, dsym->s_xsym->s_scl, dsym->s_def);
- }
- }
-
- if (dcs->d_rdcsym != NULL) {
-
- if (dcs->d_rdcsym->s_blklev == 0) {
-
- switch (dsym->s_scl) {
- case AUTO:
- /* automatic hides external declaration: %s */
- if (hflag)
- warning(86, dsym->s_name);
- break;
- case STATIC:
- /* static hides external declaration: %s */
- if (hflag)
- warning(87, dsym->s_name);
- break;
- case TYPEDEF:
- /* typedef hides external declaration: %s */
- if (hflag)
- warning(88, dsym->s_name);
- break;
- case EXTERN:
- /*
- * Warnings and errors are printed in ledecl()
- */
- break;
- default:
- lerror("decl1loc() 1");
- }
-
- } else if (dcs->d_rdcsym->s_blklev == blklev) {
-
- /* no hflag, because its illegal! */
- if (dcs->d_rdcsym->s_arg) {
- /*
- * if !tflag, a "redeclaration of %s" error
- * is produced below
- */
- if (tflag) {
- if (hflag)
- /* decl. hides parameter: %s */
- warning(91, dsym->s_name);
- rmsym(dcs->d_rdcsym);
- }
- }
-
- } else if (dcs->d_rdcsym->s_blklev < blklev) {
-
- if (hflag)
- /* declaration hides earlier one: %s */
- warning(95, dsym->s_name);
-
- }
-
- if (dcs->d_rdcsym->s_blklev == blklev) {
-
- /* redeclaration of %s */
- error(27, dsym->s_name);
- rmsym(dcs->d_rdcsym);
-
- }
-
- }
-
- if (initflg && !(initerr = chkinit(dsym))) {
- dsym->s_def = DEF;
- setsflg(dsym);
- }
-
- if (dsym->s_scl == TYPEDEF) {
- dsym->s_type = duptyp(dsym->s_type);
- dsym->s_type->t_typedef = 1;
- settdsym(dsym->s_type, dsym);
- }
-
- /*
- * Before we can check the size we must wait for an initialisation
- * which may follow.
- */
-}
-
-/*
- * Processes (re)declarations of external Symbols inside blocks.
- */
-static void
-ledecl(sym_t *dsym)
-{
- int eqt, warn;
- sym_t *esym;
-
- /* look for a symbol with the same name */
- esym = dcs->d_rdcsym;
- while (esym != NULL && esym->s_blklev != 0) {
- while ((esym = esym->s_link) != NULL) {
- if (esym->s_kind != FVFT)
- continue;
- if (strcmp(dsym->s_name, esym->s_name) == 0)
- break;
- }
- }
- if (esym == NULL)
- return;
- if (esym->s_scl != EXTERN && esym->s_scl != STATIC) {
- /* gcc accepts this without a warning, pcc prints an error. */
- /* redeclaration of %s */
- warning(27, dsym->s_name);
- prevdecl(-1, esym);
- return;
- }
-
- warn = 0;
- eqt = eqtype(esym->s_type, dsym->s_type, 0, 0, &warn);
-
- if (!eqt || warn) {
- if (esym->s_scl == EXTERN) {
- /* inconsistent redeclaration of extern: %s */
- warning(90, dsym->s_name);
- prevdecl(-1, esym);
- } else {
- /* inconsistent redeclaration of static: %s */
- warning(92, dsym->s_name);
- prevdecl(-1, esym);
- }
- }
-
- if (eqt) {
- /*
- * Remember the external symbol so we can update usage
- * information at the end of the block.
- */
- dsym->s_xsym = esym;
- }
-}
-
-/*
- * Print an error or a warning if the symbol cant be initialized due
- * to type/storage class. Returnvalue is 1 if an error has been
- * detected.
- */
-static int
-chkinit(sym_t *sym)
-{
- int err;
-
- err = 0;
-
- if (sym->s_type->t_tspec == FUNC) {
- /* cannot initialize function: %s */
- error(24, sym->s_name);
- err = 1;
- } else if (sym->s_scl == TYPEDEF) {
- /* cannot initialize typedef: %s */
- error(25, sym->s_name);
- err = 1;
- } else if (sym->s_scl == EXTERN && sym->s_def == DECL) {
- /* cannot initialize "extern" declaration: %s */
- if (dcs->d_ctx == EXTERN) {
- warning(26, sym->s_name);
- } else {
- error(26, sym->s_name);
- err = 1;
- }
- }
-
- return (err);
-}
-
-/*
- * Create a symbole for an abstract declaration.
- */
-sym_t *
-aname(void)
-{
- sym_t *sym;
-
- if (dcs->d_ctx != ABSTRACT && dcs->d_ctx != PARG)
- lerror("aname()");
-
- sym = getblk(sizeof (sym_t));
-
- sym->s_name = unnamed;
- sym->s_def = DEF;
- sym->s_scl = ABSTRACT;
- sym->s_blklev = -1;
-
- if (dcs->d_ctx == PARG)
- sym->s_arg = 1;
-
- sym->s_type = dcs->d_type;
- dcs->d_rdcsym = NULL;
- dcs->d_vararg = 0;
-
- return (sym);
-}
-
-/*
- * Removes anything which has nothing to do on global level.
- */
-void
-globclup(void)
-{
-
- while (dcs->d_nxt != NULL)
- popdecl();
-
- cleanup();
- blklev = 0;
- mblklev = 0;
-
- /*
- * remove all informations about pending lint directives without
- * warnings.
- */
- glclup(1);
-}
-
-/*
- * Process an abstract type declaration
- */
-sym_t *
-decl1abs(sym_t *sym)
-{
-
- chkfdef(sym, 1);
- chktyp(sym);
- return (sym);
-}
-
-/*
- * Checks size after declarations of variables and their initialisation.
- */
-void
-chksz(sym_t *dsym)
-{
-
- /*
- * check size only for symbols which are defined and no function and
- * not typedef name
- */
- if (dsym->s_def != DEF)
- return;
- if (dsym->s_scl == TYPEDEF)
- return;
- if (dsym->s_type->t_tspec == FUNC)
- return;
-
- if (length(dsym->s_type, dsym->s_name) == 0 &&
- dsym->s_type->t_tspec == ARRAY && dsym->s_type->t_dim == 0) {
- /* empty array declaration: %s */
- if (tflag) {
- warning(190, dsym->s_name);
- } else {
- error(190, dsym->s_name);
- }
- }
-}
-
-/*
- * Mark an object as set if it is not already
- */
-void
-setsflg(sym_t *sym)
-{
-
- if (!sym->s_set) {
- sym->s_set = 1;
- UNIQUE_CURR_POS(sym->s_spos);
- }
-}
-
-/*
- * Mark an object as used if it is not already
- */
-void
-setuflg(sym_t *sym, int fcall, int szof)
-{
-
- if (!sym->s_used) {
- sym->s_used = 1;
- UNIQUE_CURR_POS(sym->s_upos);
- }
- /*
- * for function calls another record is written
- *
- * XXX Should symbols used in sizeof() treated as used or not?
- * Probably not, because there is no sense to declare an
- * external variable only to get their size.
- */
- if (!fcall && !szof && sym->s_kind == FVFT && sym->s_scl == EXTERN)
- outusg(sym);
-}
-
-/*
- * Prints warnings for a list of variables and labels (concatenated
- * with s_dlnxt) if these are not used or only set.
- */
-void
-chkusage(dinfo_t *di)
-{
- sym_t *sym;
- int mknowarn;
-
- /* for this warnings LINTED has no effect */
- mknowarn = nowarn;
- nowarn = 0;
-
- for (sym = di->d_dlsyms; sym != NULL; sym = sym->s_dlnxt)
- chkusg1(di->d_asm, sym);
-
- nowarn = mknowarn;
-}
-
-/*
- * Prints a warning for a single variable or label if it is not used or
- * only set.
- */
-void
-chkusg1(int novar, sym_t *sym)
-{
- pos_t cpos;
-
- if (sym->s_blklev == -1)
- return;
-
- STRUCT_ASSIGN(cpos, curr_pos);
-
- if (sym->s_kind == FVFT) {
- if (sym->s_arg) {
- chkausg(novar, sym);
- } else {
- chkvusg(novar, sym);
- }
- } else if (sym->s_kind == FLAB) {
- chklusg(sym);
- } else if (sym->s_kind == FTAG) {
- chktusg(sym);
- }
-
- STRUCT_ASSIGN(curr_pos, cpos);
-}
-
-static void
-chkausg(int novar, sym_t *arg)
-{
-
- if (!arg->s_set)
- lerror("chkausg() 1");
-
- if (novar)
- return;
-
- if (!arg->s_used && vflag) {
- STRUCT_ASSIGN(curr_pos, arg->s_dpos);
- /* argument %s unused in function %s */
- warning(231, arg->s_name, funcsym->s_name);
- }
-}
-
-static void
-chkvusg(int novar, sym_t *sym)
-{
- scl_t sc;
- sym_t *xsym;
-
- if (blklev == 0 || sym->s_blklev == 0)
- lerror("chkvusg() 1");
-
- /* errors in expressions easily cause lots of these warnings */
- if (nerr != 0)
- return;
-
- /*
- * XXX Only variables are checkd, although types should
- * probably also be checked
- */
- if ((sc = sym->s_scl) != EXTERN && sc != STATIC &&
- sc != AUTO && sc != REG) {
- return;
- }
-
- if (novar)
- return;
-
- if (sc == EXTERN) {
- if (!sym->s_used && !sym->s_set) {
- STRUCT_ASSIGN(curr_pos, sym->s_dpos);
- /* %s unused in function %s */
- warning(192, sym->s_name, funcsym->s_name);
- }
- } else {
- if (sym->s_set && !sym->s_used) {
- STRUCT_ASSIGN(curr_pos, sym->s_spos);
- /* %s set but not used in function %s */
- warning(191, sym->s_name, funcsym->s_name);
- } else if (!sym->s_used) {
- STRUCT_ASSIGN(curr_pos, sym->s_dpos);
- /* %s unused in function %s */
- warning(192, sym->s_name, funcsym->s_name);
- }
- }
-
- if (sc == EXTERN) {
- /*
- * information about usage is taken over into the symbol
- * tabel entry at level 0 if the symbol was locally declared
- * as an external symbol.
- *
- * XXX This is wrong for symbols declared static at level 0
- * if the usage information stems from sizeof(). This is
- * because symbols at level 0 only used in sizeof() are
- * considered to not be used.
- */
- if ((xsym = sym->s_xsym) != NULL) {
- if (sym->s_used && !xsym->s_used) {
- xsym->s_used = 1;
- STRUCT_ASSIGN(xsym->s_upos, sym->s_upos);
- }
- if (sym->s_set && !xsym->s_set) {
- xsym->s_set = 1;
- STRUCT_ASSIGN(xsym->s_spos, sym->s_spos);
- }
- }
- }
-}
-
-static void
-chklusg(sym_t *lab)
-{
-
- if (blklev != 1 || lab->s_blklev != 1)
- lerror("chklusg() 1");
-
- if (lab->s_set && !lab->s_used) {
- STRUCT_ASSIGN(curr_pos, lab->s_spos);
- /* label %s unused in function %s */
- warning(192, lab->s_name, funcsym->s_name);
- } else if (!lab->s_set) {
- STRUCT_ASSIGN(curr_pos, lab->s_upos);
- /* undefined label %s */
- warning(23, lab->s_name);
- }
-}
-
-static void
-chktusg(sym_t *sym)
-{
-
- if (!incompl(sym->s_type))
- return;
-
- /* complain alwasy about incomplet tags declared inside blocks */
- if (!zflag || dcs->d_ctx != EXTERN)
- return;
-
- STRUCT_ASSIGN(curr_pos, sym->s_dpos);
- switch (sym->s_type->t_tspec) {
- case STRUCT:
- /* struct %s never defined */
- warning(233, sym->s_name);
- break;
- case UNION:
- /* union %s never defined */
- warning(234, sym->s_name);
- break;
- case ENUM:
- /* enum %s never defined */
- warning(235, sym->s_name);
- break;
- default:
- lerror("chktusg() 1");
- }
-}
-
-/*
- * Called after the entire translation unit has been parsed.
- * Changes tentative definitions in definitions.
- * Performs some tests on global Symbols. Detected Problems are:
- * - defined variables of incomplete type
- * - constant variables which are not initialized
- * - static symbols which are never used
- */
-void
-chkglsyms(void)
-{
- sym_t *sym;
- pos_t cpos;
-
- if (blklev != 0 || dcs->d_nxt != NULL)
- norecover();
-
- STRUCT_ASSIGN(cpos, curr_pos);
-
- for (sym = dcs->d_dlsyms; sym != NULL; sym = sym->s_dlnxt) {
- if (sym->s_blklev == -1)
- continue;
- if (sym->s_kind == FVFT) {
- chkglvar(sym);
- } else if (sym->s_kind == FTAG) {
- chktusg(sym);
- } else {
- if (sym->s_kind != FMOS)
- lerror("chkglsyms() 1");
- }
- }
-
- STRUCT_ASSIGN(curr_pos, cpos);
-}
-
-static void
-chkglvar(sym_t *sym)
-{
-
- if (sym->s_scl == TYPEDEF || sym->s_scl == ENUMCON)
- return;
-
- if (sym->s_scl != EXTERN && sym->s_scl != STATIC)
- lerror("chkglvar() 1");
-
- glchksz(sym);
-
- if (sym->s_scl == STATIC) {
- if (sym->s_type->t_tspec == FUNC) {
- if (sym->s_used && sym->s_def != DEF) {
- STRUCT_ASSIGN(curr_pos, sym->s_upos);
- /* static func. called but not def.. */
- error(225, sym->s_name);
- }
- }
- if (!sym->s_used) {
- STRUCT_ASSIGN(curr_pos, sym->s_dpos);
- if (sym->s_type->t_tspec == FUNC) {
- if (sym->s_def == DEF) {
- if (!sym->s_inline)
- /* static function %s unused */
- warning(236, sym->s_name);
- } else {
- /* static function %s decl. but ... */
- warning(290, sym->s_name);
- }
- } else if (!sym->s_set) {
- /* static variable %s unused */
- warning(226, sym->s_name);
- } else {
- /* static variable %s set but not used */
- warning(307, sym->s_name);
- }
- }
- if (!tflag && sym->s_def == TDEF && sym->s_type->t_const) {
- STRUCT_ASSIGN(curr_pos, sym->s_dpos);
- /* const object %s should have initializer */
- warning(227, sym->s_name);
- }
- }
-}
-
-static void
-glchksz(sym_t *sym)
-{
-
- if (sym->s_def == TDEF) {
- if (sym->s_type->t_tspec == FUNC)
- /*
- * this can happen if a syntax error occurred
- * after a function declaration
- */
- return;
- STRUCT_ASSIGN(curr_pos, sym->s_dpos);
- if (length(sym->s_type, sym->s_name) == 0 &&
- sym->s_type->t_tspec == ARRAY && sym->s_type->t_dim == 0) {
- /* empty array declaration: %s */
- if (tflag || (sym->s_scl == EXTERN && !sflag)) {
- warning(190, sym->s_name);
- } else {
- error(190, sym->s_name);
- }
- }
- }
-}
-
-/*
- * Prints information about location of previous definition/declaration.
- */
-void
-prevdecl(int msg, sym_t *psym)
-{
- pos_t cpos;
-
- if (!rflag)
- return;
-
- STRUCT_ASSIGN(cpos, curr_pos);
- STRUCT_ASSIGN(curr_pos, psym->s_dpos);
- if (msg != -1) {
- message(msg, psym->s_name);
- } else if (psym->s_def == DEF || psym->s_def == TDEF) {
- /* previous definition of %s */
- message(261, psym->s_name);
- } else {
- /* previous declaration of %s */
- message(260, psym->s_name);
- }
- STRUCT_ASSIGN(curr_pos, cpos);
-}
diff --git a/usr.bin/xlint/lint1/emit.c b/usr.bin/xlint/lint1/emit.c
deleted file mode 100644
index a770e5a..0000000
--- a/usr.bin/xlint/lint1/emit.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/* $NetBSD: emit.c,v 1.2 1995/07/03 21:24:00 cgd Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef lint
-static char rcsid[] = "$NetBSD: emit.c,v 1.2 1995/07/03 21:24:00 cgd Exp $";
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <err.h>
-
-#include "lint.h"
-
-/* name and handle of output file */
-static const char *loname;
-static FILE *lout;
-
-/* output buffer data */
-ob_t ob;
-
-static void outxbuf(void);
-
-
-/*
- * initialize output
- */
-void
-outopen(name)
- const char *name;
-{
- loname = name;
-
- /* Ausgabedatei oeffnen */
- if ((lout = fopen(name, "w")) == NULL)
- err(1, "cannot open '%s'", name);
-
- /* Ausgabepuffer anlegen */
- ob.o_len = 1024;
- ob.o_end = (ob.o_buf = ob.o_nxt = xmalloc(ob.o_len)) + ob.o_len;
-}
-
-/*
- * flush output buffer and close file
- */
-void
-outclose()
-{
- outclr();
- if (fclose(lout) == EOF)
- err(1, "cannot close '%s'", loname);
-}
-
-/*
- * resize output buffer
- */
-static void
-outxbuf()
-{
- ptrdiff_t coffs;
-
- coffs = ob.o_nxt - ob.o_buf;
- ob.o_len *= 2;
- ob.o_end = (ob.o_buf = xrealloc(ob.o_buf, ob.o_len)) + ob.o_len;
- ob.o_nxt = ob.o_buf + coffs;
-}
-
-/*
- * reset output buffer
- * if it is not empty, it is flushed
- */
-void
-outclr()
-{
- size_t sz;
-
- if (ob.o_buf != ob.o_nxt) {
- outchar('\n');
- sz = ob.o_nxt - ob.o_buf;
- if (sz > ob.o_len)
- errx(1, "internal error: outclr() 1");
- if (fwrite(ob.o_buf, sz, 1, lout) != 1)
- err(1, "cannot write to %s", loname);
- ob.o_nxt = ob.o_buf;
- }
-}
-
-/*
- * write a character to the output buffer
- */
-void
-outchar(c)
- int c;
-{
- if (ob.o_nxt == ob.o_end)
- outxbuf();
- *ob.o_nxt++ = (char)c;
-}
-
-/*
- * write a character to the output buffer, qouted if necessary
- */
-void
-outqchar(c)
- int c;
-{
- if (isprint(c) && c != '\\' && c != '"' && c != '\'') {
- outchar(c);
- } else {
- outchar('\\');
- switch (c) {
- case '\\':
- outchar('\\');
- break;
- case '"':
- outchar('"');
- break;
- case '\'':
- outchar('\'');
- break;
- case '\b':
- outchar('b');
- break;
- case '\t':
- outchar('t');
- break;
- case '\n':
- outchar('n');
- break;
- case '\f':
- outchar('f');
- break;
- case '\r':
- outchar('r');
- break;
-#ifdef __STDC__
- case '\v':
-#else
- case '\013':
-#endif
- outchar('v');
- break;
-#ifdef __STDC__
- case '\a':
-#else
- case '\007':
-#endif
- outchar('a');
- break;
- default:
- outchar((((u_int)c >> 6) & 07) + '0');
- outchar((((u_int)c >> 3) & 07) + '0');
- outchar((c & 07) + '0');
- break;
- }
- }
-}
-
-/*
- * write a strint to the output buffer
- * the string must not contain any characters which
- * should be quoted
- */
-void
-outstrg(s)
- const char *s;
-{
- while (*s != '\0') {
- if (ob.o_nxt == ob.o_end)
- outxbuf();
- *ob.o_nxt++ = *s++;
- }
-}
-
-/*
- * write an integer value to toe output buffer
- */
-void
-outint(i)
- int i;
-{
- if ((ob.o_end - ob.o_nxt) < 3 * sizeof (int))
- outxbuf();
- ob.o_nxt += sprintf(ob.o_nxt, "%d", i);
-}
-
-/*
- * write the name of a symbol to the output buffer
- * the name is preceded by its length
- */
-void
-outname(name)
- const char *name;
-{
- if (name == NULL)
- errx(1, "internal error: outname() 1");
- outint((int)strlen(name));
- outstrg(name);
-}
-
-/*
- * write the name of the .c source
- */
-void
-outsrc(name)
- const char *name;
-{
- outclr();
- outchar('S');
- outstrg(name);
-}
diff --git a/usr.bin/xlint/lint1/emit1.c b/usr.bin/xlint/lint1/emit1.c
deleted file mode 100644
index e62549c..0000000
--- a/usr.bin/xlint/lint1/emit1.c
+++ /dev/null
@@ -1,601 +0,0 @@
-/* $NetBSD: emit1.c,v 1.11 2002/01/31 19:36:54 tv Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: emit1.c,v 1.11 2002/01/31 19:36:54 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <ctype.h>
-
-#include "lint1.h"
-
-static void outtt(sym_t *, sym_t *);
-static void outfstrg(strg_t *);
-
-/*
- * Write type into the output buffer.
- * The type is written as a sequence of substrings, each of which describes a
- * node of type type_t
- * a node is coded as follows:
- * char C
- * signed char s C
- * unsigned char u C
- * short S
- * unsigned short u S
- * int I
- * unsigned int u I
- * long L
- * unsigned long u L
- * long long Q
- * unsigned long long u Q
- * float s D
- * double D
- * long double l D
- * void V
- * * P
- * [n] A n
- * () F
- * (void) F 0
- * (n arguments) F n arg1 arg2 ... argn
- * (n arguments, ...) F n arg1 arg2 ... argn-1 E
- * (a, b, c, ...) f n arg1 arg2 ...
- * enum tag e T tag_or_typename
- * struct tag s T tag_or_typename
- * union tag u T tag_or_typename
- *
- * tag_or_typename 0 no tag or type name
- * 1 n tag Tag
- * 2 n typename only type name
- *
- * spaces are only for better readability
- * additionaly it is possible to prepend the characters 'c' (for const)
- * and 'v' (for volatile)
- */
-void
-outtype(type_t *tp)
-{
- int t, s, na;
- sym_t *arg;
- tspec_t ts;
-
- while (tp != NULL) {
- if ((ts = tp->t_tspec) == INT && tp->t_isenum)
- ts = ENUM;
- switch (ts) {
- case CHAR: t = 'C'; s = '\0'; break;
- case SCHAR: t = 'C'; s = 's'; break;
- case UCHAR: t = 'C'; s = 'u'; break;
- case SHORT: t = 'S'; s = '\0'; break;
- case USHORT: t = 'S'; s = 'u'; break;
- case INT: t = 'I'; s = '\0'; break;
- case UINT: t = 'I'; s = 'u'; break;
- case LONG: t = 'L'; s = '\0'; break;
- case ULONG: t = 'L'; s = 'u'; break;
- case QUAD: t = 'Q'; s = '\0'; break;
- case UQUAD: t = 'Q'; s = 'u'; break;
- case FLOAT: t = 'D'; s = 's'; break;
- case DOUBLE: t = 'D'; s = '\0'; break;
- case LDOUBLE: t = 'D'; s = 'l'; break;
- case VOID: t = 'V'; s = '\0'; break;
- case PTR: t = 'P'; s = '\0'; break;
- case ARRAY: t = 'A'; s = '\0'; break;
- case FUNC: t = 'F'; s = '\0'; break;
- case ENUM: t = 'T'; s = 'e'; break;
- case STRUCT: t = 'T'; s = 's'; break;
- case UNION: t = 'T'; s = 'u'; break;
- default:
- lerror("outtyp() 1");
- }
- if (tp->t_const)
- outchar('c');
- if (tp->t_volatile)
- outchar('v');
- if (s != '\0')
- outchar(s);
- outchar(t);
- if (ts == ARRAY) {
- outint(tp->t_dim);
- } else if (ts == ENUM) {
- outtt(tp->t_enum->etag, tp->t_enum->etdef);
- } else if (ts == STRUCT || ts == UNION) {
- outtt(tp->t_str->stag, tp->t_str->stdef);
- } else if (ts == FUNC && tp->t_proto) {
- na = 0;
- for (arg = tp->t_args; arg != NULL; arg = arg->s_nxt)
- na++;
- if (tp->t_vararg)
- na++;
- outint(na);
- for (arg = tp->t_args; arg != NULL; arg = arg->s_nxt)
- outtype(arg->s_type);
- if (tp->t_vararg)
- outchar('E');
- }
- tp = tp->t_subt;
- }
-}
-
-/*
- * type to string
- * used for debugging output
- *
- * it uses its own output buffer for conversion
- */
-const char *
-ttos(type_t *tp)
-{
- static ob_t tob;
- ob_t tmp;
-
- if (tob.o_buf == NULL) {
- tob.o_len = 64;
- tob.o_buf = tob.o_nxt = xmalloc(tob.o_len);
- tob.o_end = tob.o_buf + tob.o_len;
- }
-
- tmp = ob;
- ob = tob;
- ob.o_nxt = ob.o_buf;
- outtype(tp);
- outchar('\0');
- tob = ob;
- ob = tmp;
-
- return (tob.o_buf);
-}
-
-/*
- * write the name of a tag or typename
- *
- * if the tag is named, the name of the
- * tag is written, otherwise, if a typename exists which
- * refers to this tag, this typename is written
- */
-static void
-outtt(sym_t *tag, sym_t *tdef)
-{
-
- /*
- * 0 is no longer used.
- */
- if (tag->s_name != unnamed) {
- outint(1);
- outname(tag->s_name);
- } else if (tdef != NULL) {
- outint(2);
- outname(tdef->s_name);
- } else {
- outint(3);
- outint(tag->s_dpos.p_line);
- outchar('.');
- outint(getfnid(tag->s_dpos.p_file));
- outchar('.');
- outint(tag->s_dpos.p_uniq);
- }
-}
-
-/*
- * write information about a global declared/defined symbol
- * with storage class extern
- *
- * informations about function definitions are written in outfdef(),
- * not here
- */
-void
-outsym(sym_t *sym, scl_t sc, def_t def)
-{
-
- /*
- * Static function declarations must also be written to the output
- * file. Compatibility of function declarations (for both static
- * and extern functions) must be checked in lint2. Lint1 can't do
- * this, especially not, if functions are declared at block level
- * before their first declaration at level 0.
- */
- if (sc != EXTERN && !(sc == STATIC && sym->s_type->t_tspec == FUNC))
- return;
-
- /* reset buffer */
- outclr();
-
- /*
- * line number of .c source, 'd' for declaration, Id of current
- * source (.c or .h), and line in current source.
- */
- outint(csrc_pos.p_line);
- outchar('d');
- outint(getfnid(sym->s_dpos.p_file));
- outchar('.');
- outint(sym->s_dpos.p_line);
-
- /* flags */
-
- switch (def) {
- case DEF:
- /* defined */
- outchar('d');
- break;
- case TDEF:
- /* tentative defined */
- outchar('t');
- break;
- case DECL:
- /* declared */
- outchar('e');
- break;
- default:
- lerror("outsym() 2");
- }
- if (llibflg && def != DECL) {
- /*
- * mark it as used so we get no warnings from lint2 about
- * unused symbols in libraries.
- */
- outchar('u');
- }
-
- if (sc == STATIC)
- outchar('s');
-
- /* name of the symbol */
- outname(sym->s_name);
-
- /* renamed name of symbol, if necessary */
- if (sym->s_rename) {
- outchar('r');
- outname(sym->s_rename);
- }
-
- /* type of the symbol */
- outtype(sym->s_type);
-}
-
-/*
- * write information about function definition
- *
- * this is also done for static functions so we are able to check if
- * they are called with proper argument types
- */
-void
-outfdef(sym_t *fsym, pos_t *posp, int rval, int osdef, sym_t *args)
-{
- int narg;
- sym_t *arg;
-
- /* reset the buffer */
- outclr();
-
- /*
- * line number of .c source, 'd' for declaration, Id of current
- * source (.c or .h), and line in current source
- *
- * we are already at the end of the function. If we are in the
- * .c source, posp->p_line is correct, otherwise csrc_pos.p_line
- * (for functions defined in header files).
- */
- if (posp->p_file == csrc_pos.p_file) {
- outint(posp->p_line);
- } else {
- outint(csrc_pos.p_line);
- }
- outchar('d');
- outint(getfnid(posp->p_file));
- outchar('.');
- outint(posp->p_line);
-
- /* flags */
-
- /* both SCANFLIKE and PRINTFLIKE imply VARARGS */
- if (prflstrg != -1) {
- nvararg = prflstrg;
- } else if (scflstrg != -1) {
- nvararg = scflstrg;
- }
-
- if (nvararg != -1) {
- outchar('v');
- outint(nvararg);
- }
- if (scflstrg != -1) {
- outchar('S');
- outint(scflstrg);
- }
- if (prflstrg != -1) {
- outchar('P');
- outint(prflstrg);
- }
- nvararg = prflstrg = scflstrg = -1;
-
- outchar('d');
-
- if (rval)
- /* has return value */
- outchar('r');
-
- if (llibflg)
- /*
- * mark it as used so lint2 does not complain about
- * unused symbols in libraries
- */
- outchar('u');
-
- if (osdef)
- /* old style function definition */
- outchar('o');
-
- if (fsym->s_scl == STATIC)
- outchar('s');
-
- /* name of function */
- outname(fsym->s_name);
-
- /* renamed name of function, if necessary */
- if (fsym->s_rename) {
- outchar('r');
- outname(fsym->s_rename);
- }
-
- /* argument types and return value */
- if (osdef) {
- narg = 0;
- for (arg = args; arg != NULL; arg = arg->s_nxt)
- narg++;
- outchar('f');
- outint(narg);
- for (arg = args; arg != NULL; arg = arg->s_nxt)
- outtype(arg->s_type);
- outtype(fsym->s_type->t_subt);
- } else {
- outtype(fsym->s_type);
- }
-}
-
-/*
- * write out all information necessary for lint2 to check function
- * calls
- *
- * rvused is set if the return value is used (asigned to a variable)
- * rvdisc is set if the return value is not used and not ignored
- * (casted to void)
- */
-void
-outcall(tnode_t *tn, int rvused, int rvdisc)
-{
- tnode_t *args, *arg;
- int narg, n, i;
- int64_t q;
- tspec_t t;
-
- /* reset buffer */
- outclr();
-
- /*
- * line number of .c source, 'c' for function call, Id of current
- * source (.c or .h), and line in current source
- */
- outint(csrc_pos.p_line);
- outchar('c');
- outint(getfnid(curr_pos.p_file));
- outchar('.');
- outint(curr_pos.p_line);
-
- /*
- * flags; 'u' and 'i' must be last to make sure a letter
- * is between the numeric argument of a flag and the name of
- * the function
- */
- narg = 0;
- args = tn->tn_right;
- for (arg = args; arg != NULL; arg = arg->tn_right)
- narg++;
- /* informations about arguments */
- for (n = 1; n <= narg; n++) {
- /* the last argument is the top one in the tree */
- for (i = narg, arg = args; i > n; i--, arg = arg->tn_right)
- continue;
- arg = arg->tn_left;
- if (arg->tn_op == CON) {
- if (isityp(t = arg->tn_type->t_tspec)) {
- /*
- * XXX it would probably be better to
- * explizitly test the sign
- */
- if ((q = arg->tn_val->v_quad) == 0) {
- /* zero constant */
- outchar('z');
- } else if (msb(q, t, 0) == 0) {
- /* positive if casted to signed */
- outchar('p');
- } else {
- /* negative if casted to signed */
- outchar('n');
- }
- outint(n);
- }
- } else if (arg->tn_op == AMPER &&
- arg->tn_left->tn_op == STRING &&
- arg->tn_left->tn_strg->st_tspec == CHAR) {
- /* constant string, write all format specifiers */
- outchar('s');
- outint(n);
- outfstrg(arg->tn_left->tn_strg);
- }
-
- }
- /* return value discarded/used/ignored */
- outchar(rvdisc ? 'd' : (rvused ? 'u' : 'i'));
-
- /* name of the called function */
- outname(tn->tn_left->tn_left->tn_sym->s_name);
-
- /* types of arguments */
- outchar('f');
- outint(narg);
- for (n = 1; n <= narg; n++) {
- /* the last argument is the top one in the tree */
- for (i = narg, arg = args; i > n; i--, arg = arg->tn_right)
- continue;
- outtype(arg->tn_left->tn_type);
- }
- /* expected type of return value */
- outtype(tn->tn_type);
-}
-
-/*
- * extracts potential format specifiers for printf() and scanf() and
- * writes them, enclosed in "" and qouted if necessary, to the output buffer
- */
-static void
-outfstrg(strg_t *strg)
-{
- int c, oc, first;
- u_char *cp;
-
- if (strg->st_tspec != CHAR)
- lerror("outfstrg() 1");
-
- cp = strg->st_cp;
-
- outchar('"');
-
- c = *cp++;
-
- while (c != '\0') {
-
- if (c != '%') {
- c = *cp++;
- continue;
- }
-
- outqchar('%');
- c = *cp++;
-
- /* flags for printf and scanf and *-fieldwidth for printf */
- while (c != '\0' && (c == '-' || c == '+' || c == ' ' ||
- c == '#' || c == '0' || c == '*')) {
- outqchar(c);
- c = *cp++;
- }
-
- /* numeric field width */
- while (c != '\0' && isdigit(c)) {
- outqchar(c);
- c = *cp++;
- }
-
- /* precision for printf */
- if (c == '.') {
- outqchar(c);
- if ((c = *cp++) == '*') {
- outqchar(c);
- c = *cp++;
- } else {
- while (c != '\0' && isdigit(c)) {
- outqchar(c);
- c = *cp++;
- }
- }
- }
-
- /* h, l, L and q flags fpr printf and scanf */
- if (c == 'h' || c == 'l' || c == 'L' || c == 'q') {
- outqchar(c);
- c = *cp++;
- }
-
- /*
- * The last character. It is always written so we can detect
- * invalid format specifiers.
- */
- if (c != '\0') {
- outqchar(c);
- oc = c;
- c = *cp++;
- /*
- * handle [ for scanf. [-] means that a minus sign
- * was found at an undefined position.
- */
- if (oc == '[') {
- if (c == '^')
- c = *cp++;
- if (c == ']')
- c = *cp++;
- first = 1;
- while (c != '\0' && c != ']') {
- if (c == '-') {
- if (!first && *cp != ']')
- outqchar(c);
- }
- first = 0;
- c = *cp++;
- }
- if (c == ']') {
- outqchar(c);
- c = *cp++;
- }
- }
- }
-
- }
-
- outchar('"');
-}
-
-/*
- * writes a record if sym was used
- */
-void
-outusg(sym_t *sym)
-{
- /* reset buffer */
- outclr();
-
- /*
- * line number of .c source, 'u' for used, Id of current
- * source (.c or .h), and line in current source
- */
- outint(csrc_pos.p_line);
- outchar('u');
- outint(getfnid(curr_pos.p_file));
- outchar('.');
- outint(curr_pos.p_line);
-
- /* necessary to delimit both numbers */
- outchar('x');
-
- /* Den Namen des Symbols ausgeben */
- outname(sym->s_name);
-}
diff --git a/usr.bin/xlint/lint1/err.c b/usr.bin/xlint/lint1/err.c
deleted file mode 100644
index 5c56638..0000000
--- a/usr.bin/xlint/lint1/err.c
+++ /dev/null
@@ -1,514 +0,0 @@
-/* $NetBSD: err.c,v 1.17 2002/01/31 19:36:54 tv Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: err.c,v 1.17 2002/01/31 19:36:54 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <stdlib.h>
-#include <stdarg.h>
-
-#include "lint1.h"
-
-/* number of errors found */
-int nerr;
-
-/* number of syntax errors */
-int sytxerr;
-
-
-static const char *lbasename(const char *);
-static void verror(int, va_list);
-static void vwarning(int, va_list);
-
-
-const char *msgs[] = {
- "syntax error: empty declaration", /* 0 */
- "old style declaration; add int", /* 1 */
- "empty declaration", /* 2 */
- "%s declared in argument declaration list", /* 3 */
- "illegal type combination", /* 4 */
- "modifying typedef with '%s'; only qualifiers allowed", /* 5 */
- "use 'double' instead of 'long float'", /* 6 */
- "only one storage class allowed", /* 7 */
- "illegal storage class", /* 8 */
- "only register valid as formal parameter storage class", /* 9 */
- "duplicate '%s'", /* 10 */
- "bit-field initializer out of range", /* 11 */
- "compiler takes size of function", /* 12 */
- "incomplete enum type: %s", /* 13 */
- "compiler takes alignment of function", /* 14 */
- "function returns illegal type", /* 15 */
- "array of function is illegal", /* 16 */
- "null dimension", /* 17 */
- "illegal use of 'void'", /* 18 */
- "void type for %s", /* 19 */
- "zero or negative array dimension", /* 20 */
- "redeclaration of formal parameter %s", /* 21 */
- "incomplete or misplaced function definition", /* 22 */
- "undefined label %s", /* 23 */
- "cannot initialize function: %s", /* 24 */
- "cannot initialize typedef: %s", /* 25 */
- "cannot initialize extern declaration: %s", /* 26 */
- "redeclaration of %s", /* 27 */
- "redefinition of %s", /* 28 */
- "previously declared extern, becomes static: %s", /* 29 */
- "redeclaration of %s; ANSI C requires static", /* 30 */
- "incomplete structure or union %s: %s", /* 31 */
- "argument type defaults to 'int': %s", /* 32 */
- "duplicate member name: %s", /* 33 */
- "nonportable bit-field type", /* 34 */
- "illegal bit-field type", /* 35 */
- "illegal bit-field size", /* 36 */
- "zero size bit-field", /* 37 */
- "function illegal in structure or union", /* 38 */
- "illegal zero sized structure member: %s", /* 39 */
- "unknown size: %s", /* 40 */
- "illegal use of bit-field", /* 41 */
- "forward reference to enum type", /* 42 */
- "redefinition hides earlier one: %s", /* 43 */
- "declaration introduces new type in ANSI C: %s %s", /* 44 */
- "base type is really '%s %s'", /* 45 */
- "(%s) tag redeclared", /* 46 */
- "zero sized %s", /* 47 */
- "overflow in enumeration values: %s", /* 48 */
- "struct or union member must be named", /* 49 */
- "a function is declared as an argument: %s", /* 50 */
- "parameter mismatch: %d declared, %d defined", /* 51 */
- "cannot initialize parameter: %s", /* 52 */
- "declared argument %s is missing", /* 53 */
- "trailing ',' prohibited in enum declaration", /* 54 */
- "integral constant expression expected", /* 55 */
- "integral constant too large", /* 56 */
- "enumeration constant hides parameter: %s", /* 57 */
- "type does not match prototype: %s", /* 58 */
- "formal parameter lacks name: param #%d", /* 59 */
- "void must be sole parameter", /* 60 */
- "void parameter cannot have name: %s", /* 61 */
- "function prototype parameters must have types", /* 62 */
- "prototype does not match old-style definition", /* 63 */
- "()-less function definition", /* 64 */
- "%s has no named members", /* 65 */
- "syntax requires ';' after last struct/union member", /* 66 */
- "cannot return incomplete type", /* 67 */
- "typedef already qualified with '%s'", /* 68 */
- "inappropriate qualifiers with 'void'", /* 69 */
- "%soperand of '%s' is unsigned in ANSI C", /* 70 */
- "too many characters in character constant", /* 71 */
- "typedef declares no type name", /* 72 */
- "empty character constant", /* 73 */
- "no hex digits follow \\x", /* 74 */
- "overflow in hex escape", /* 75 */
- "character escape does not fit in character", /* 76 */
- "bad octal digit %c", /* 77 */
- "nonportable character escape", /* 78 */
- "dubious escape \\%c", /* 79 */
- "dubious escape \\%o", /* 80 */
- "\\a undefined in traditional C", /* 81 */
- "\\x undefined in traditional C", /* 82 */
- "storage class after type is obsolescent", /* 83 */
- "ANSI C requires formal parameter before '...'", /* 84 */
- "dubious tag declaration: %s %s", /* 85 */
- "automatic hides external declaration: %s", /* 86 */
- "static hides external declaration: %s", /* 87 */
- "typedef hides external declaration: %s", /* 88 */
- "typedef redeclared: %s", /* 89 */
- "inconsistent redeclaration of extern: %s", /* 90 */
- "declaration hides parameter: %s", /* 91 */
- "inconsistent redeclaration of static: %s", /* 92 */
- "dubious static function at block level: %s", /* 93 */
- "function has illegal storage class: %s", /* 94 */
- "declaration hides earlier one: %s", /* 95 */
- "cannot dereference non-pointer type", /* 96 */
- "suffix U is illegal in traditional C", /* 97 */
- "suffixes F and L are illegal in traditional C", /* 98 */
- "%s undefined", /* 99 */
- "unary + is illegal in traditional C", /* 100 */
- "undefined struct/union member: %s", /* 101 */
- "illegal member use: %s", /* 102 */
- "left operand of '.' must be struct/union object", /* 103 */
- "left operand of '->' must be pointer to struct/union", /* 104 */
- "non-unique member requires struct/union %s", /* 105 */
- "left operand of '->' must be pointer", /* 106 */
- "operands of '%s' have incompatible types", /* 107 */
- "operand of '%s' has incompatible type", /* 108 */
- "void type illegal in expression", /* 109 */
- "pointer to function is not allowed here", /* 110 */
- "unacceptable operand of '%s'", /* 111 */
- "cannot take address of bit-field", /* 112 */
- "cannot take address of register %s", /* 113 */
- "%soperand of '%s' must be lvalue", /* 114 */
- "%soperand of '%s' must be modifiable lvalue", /* 115 */
- "illegal pointer subtraction", /* 116 */
- "bitwise operation on signed value possibly nonportable", /* 117 */
- "semantics of '%s' change in ANSI C; use explicit cast", /* 118 */
- "conversion of '%s' to '%s' is out of range", /* 119 */
- "bitwise operation on signed value nonportable", /* 120 */
- "negative shift", /* 121 */
- "shift greater than size of object", /* 122 */
- "illegal combination of pointer and integer, op %s", /* 123 */
- "illegal pointer combination, op %s", /* 124 */
- "ANSI C forbids ordered comparisons of pointers to functions",/* 125 */
- "incompatible types in conditional", /* 126 */
- "'&' before array or function: ignored", /* 127 */
- "operands have incompatible pointer types, op %s", /* 128 */
- "expression has null effect", /* 129 */
- "enum type mismatch, op %s", /* 130 */
- "conversion to '%s' may sign-extend incorrectly", /* 131 */
- "conversion from '%s' may lose accuracy", /* 132 */
- "conversion of pointer to '%s' loses bits", /* 133 */
- "conversion of pointer to '%s' may lose bits", /* 134 */
- "possible pointer alignment problem", /* 135 */
- "cannot do pointer arithmetic on operand of unknown size", /* 136 */
- "use of incomplete enum type, op %s", /* 137 */
- "unknown operand size, op %s", /* 138 */
- "division by 0", /* 139 */
- "modulus by 0", /* 140 */
- "integer overflow detected, op %s", /* 141 */
- "floating point overflow detected, op %s", /* 142 */
- "cannot take size of incomplete type", /* 143 */
- "cannot take size of function", /* 144 */
- "cannot take size of bit-field", /* 145 */
- "cannot take size of void", /* 146 */
- "invalid cast expression", /* 147 */
- "improper cast of void expression", /* 148 */
- "illegal function", /* 149 */
- "argument mismatch: %d arg%s passed, %d expected", /* 150 */
- "void expressions may not be arguments, arg #%d", /* 151 */
- "argument cannot have unknown size, arg #%d", /* 152 */
- "argument has incompatible pointer type, arg #%d", /* 153 */
- "illegal combination of pointer and integer, arg #%d", /* 154 */
- "argument is incompatible with prototype, arg #%d", /* 155 */
- "enum type mismatch, arg #%d", /* 156 */
- "ANSI C treats constant as unsigned", /* 157 */
- "%s may be used before set", /* 158 */
- "assignment in conditional context", /* 159 */
- "operator '==' found where '=' was expected", /* 160 */
- "constant in conditional context", /* 161 */
- "comparison of %s with %s, op %s", /* 162 */
- "a cast does not yield an lvalue", /* 163 */
- "assignment of negative constant to unsigned type", /* 164 */
- "constant truncated by assignment", /* 165 */
- "precision lost in bit-field assignment", /* 166 */
- "array subscript cannot be negative: %ld", /* 167 */
- "array subscript cannot be > %d: %ld", /* 168 */
- "precedence confusion possible: parenthesize!", /* 169 */
- "first operand must have scalar type, op ? :", /* 170 */
- "assignment type mismatch", /* 171 */
- "too many struct/union initializers", /* 172 */
- "too many array initializers", /* 173 */
- "too many initializers", /* 174 */
- "initialisation of an incomplete type", /* 175 */
- "invalid initializer", /* 176 */
- "non-constant initializer", /* 177 */
- "initializer does not fit", /* 178 */
- "cannot initialize struct/union with no named member", /* 179 */
- "bit-field initializer does not fit", /* 180 */
- "{}-enclosed initializer required", /* 181 */
- "incompatible pointer types", /* 182 */
- "illegal combination of pointer and integer", /* 183 */
- "illegal pointer combination", /* 184 */
- "initialisation type mismatch", /* 185 */
- "bit-field initialisation is illegal in traditional C", /* 186 */
- "non-null byte ignored in string initializer", /* 187 */
- "no automatic aggregate initialization in traditional C", /* 188 */
- "assignment of struct/union illegal in traditional C", /* 189 */
- "empty array declaration: %s", /* 190 */
- "%s set but not used in function %s", /* 191 */
- "%s unused in function %s", /* 192 */
- "statement not reached", /* 193 */
- "label %s redefined", /* 194 */
- "case not in switch", /* 195 */
- "case label affected by conversion", /* 196 */
- "non-constant case expression", /* 197 */
- "non-integral case expression", /* 198 */
- "duplicate case in switch: %ld", /* 199 */
- "duplicate case in switch: %lu", /* 200 */
- "default outside switch", /* 201 */
- "duplicate default in switch", /* 202 */
- "case label must be of type `int' in traditional C", /* 203 */
- "controlling expressions must have scalar type", /* 204 */
- "switch expression must have integral type", /* 205 */
- "enumeration value(s) not handled in switch", /* 206 */
- "loop not entered at top", /* 207 */
- "break outside loop or switch", /* 208 */
- "continue outside loop", /* 209 */
- "enum type mismatch in initialisation", /* 210 */
- "return value type mismatch", /* 211 */
- "cannot return incomplete type", /* 212 */
- "void function %s cannot return value", /* 213 */
- "function %s expects to return value", /* 214 */
- "function implicitly declared to return int", /* 215 */
- "function %s has return (e); and return;", /* 216 */
- "function %s falls off bottom without returning value", /* 217 */
- "ANSI C treats constant as unsigned, op %s", /* 218 */
- "concatenated strings are illegal in traditional C", /* 219 */
- "fallthrough on case statement", /* 220 */
- "initialisation of unsigned with negative constant", /* 221 */
- "conversion of negative constant to unsigned type", /* 222 */
- "end-of-loop code not reached", /* 223 */
- "cannot recover from previous errors", /* 224 */
- "static function called but not defined: %s()", /* 225 */
- "static variable %s unused", /* 226 */
- "const object %s should have initializer", /* 227 */
- "function cannot return const or volatile object", /* 228 */
- "questionable conversion of function pointer", /* 229 */
- "nonportable character comparison, op %s", /* 230 */
- "argument %s unused in function %s", /* 231 */
- "label %s unused in function %s", /* 232 */
- "struct %s never defined", /* 233 */
- "union %s never defined", /* 234 */
- "enum %s never defined", /* 235 */
- "static function %s unused", /* 236 */
- "redeclaration of formal parameter %s", /* 237 */
- "initialisation of union is illegal in traditional C", /* 238 */
- "constant argument to NOT", /* 239 */
- "assignment of different structures", /* 240 */
- "dubious operation on enum, op %s", /* 241 */
- "combination of '%s' and '%s', op %s", /* 242 */
- "dubious comparison of enums, op %s", /* 243 */
- "illegal structure pointer combination", /* 244 */
- "illegal structure pointer combination, op %s", /* 245 */
- "dubious conversion of enum to '%s'", /* 246 */
- "pointer casts may be troublesome", /* 247 */
- "floating-point constant out of range", /* 248 */
- "syntax error", /* 249 */
- "unknown character \\%o", /* 250 */
- "malformed integer constant", /* 251 */
- "integer constant out of range", /* 252 */
- "unterminated character constant", /* 253 */
- "newline in string or char constant", /* 254 */
- "undefined or invalid # directive", /* 255 */
- "unterminated comment", /* 256 */
- "extra characters in lint comment", /* 257 */
- "unterminated string constant", /* 258 */
- "conversion to '%s' due to prototype, arg #%d", /* 259 */
- "previous declaration of %s", /* 260 */
- "previous definition of %s", /* 261 */
- "\\\" inside character constants undefined in traditional C", /* 262 */
- "\\? undefined in traditional C", /* 263 */
- "\\v undefined in traditional C", /* 264 */
- "%s C does not support 'long long'", /* 265 */
- "'long double' is illegal in traditional C", /* 266 */
- "shift equal to size of object", /* 267 */
- "variable declared inline: %s", /* 268 */
- "argument declared inline: %s", /* 269 */
- "function prototypes are illegal in traditional C", /* 270 */
- "switch expression must be of type `int' in traditional C", /* 271 */
- "empty translation unit", /* 272 */
- "bit-field type '%s' invalid in ANSI C", /* 273 */
- "ANSI C forbids comparison of %s with %s", /* 274 */
- "cast discards 'const' from pointer target type", /* 275 */
- "", /* 276 */
- "initialisation of '%s' with '%s'", /* 277 */
- "combination of '%s' and '%s', arg #%d", /* 278 */
- "combination of '%s' and '%s' in return", /* 279 */
- "must be outside function: /* %s */", /* 280 */
- "duplicate use of /* %s */", /* 281 */
- "must precede function definition: /* %s */", /* 282 */
- "argument number mismatch with directive: /* %s */", /* 283 */
- "fallthrough on default statement", /* 284 */
- "prototype declaration", /* 285 */
- "function definition is not a prototype", /* 286 */
- "function declaration is not a prototype", /* 287 */
- "dubious use of /* VARARGS */ with /* %s */", /* 288 */
- "can't be used together: /* PRINTFLIKE */ /* SCANFLIKE */", /* 289 */
- "static function %s declared but not defined", /* 290 */
- "invalid multibyte character", /* 291 */
- "cannot concatenate wide and regular string literals", /* 292 */
- "argument %d must be 'char *' for PRINTFLIKE/SCANFLIKE", /* 293 */
- "multi-character character constant", /* 294 */
- "conversion of '%s' to '%s' is out of range, arg #%d", /* 295 */
- "conversion of negative constant to unsigned type, arg #%d", /* 296 */
- "conversion to '%s' may sign-extend incorrectly, arg #%d", /* 297 */
- "conversion from '%s' may lose accuracy, arg #%d", /* 298 */
- "prototype does not match old style definition, arg #%d", /* 299 */
- "old style definition", /* 300 */
- "array of incomplete type", /* 301 */
- "%s returns pointer to automatic object", /* 302 */
- "ANSI C forbids conversion of %s to %s", /* 303 */
- "ANSI C forbids conversion of %s to %s, arg #%d", /* 304 */
- "ANSI C forbids conversion of %s to %s, op %s", /* 305 */
- "constant truncated by conversion, op %s", /* 306 */
- "static variable %s set but not used", /* 307 */
- "", /* 308 */
- "extra bits set to 0 in conversion of '%s' to '%s', op %s", /* 309 */
- "symbol renaming can't be used on function arguments", /* 310 */
- "symbol renaming can't be used on automatic variables", /* 311 */
- "%s C does not support // comments", /* 312 */
-};
-
-/*
- * print a list of the messages with their ids
- */
-void
-msglist(void)
-{
- int i;
-
- for (i = 0; i < sizeof(msgs) / sizeof(msgs[0]); i++)
- printf("%d\t%s\n", i, msgs[i]);
-}
-
-/*
- * If Fflag is not set lbasename() returns a pointer to the last
- * component of the path, otherwise it returns the argument.
- */
-static const char *
-lbasename(const char *path)
-{
- const char *cp, *cp1, *cp2;
-
- if (Fflag)
- return (path);
-
- cp = cp1 = cp2 = path;
- while (*cp != '\0') {
- if (*cp++ == '/') {
- cp2 = cp1;
- cp1 = cp;
- }
- }
- return (*cp1 == '\0' ? cp2 : cp1);
-}
-
-static void
-verror( int n, va_list ap)
-{
- const char *fn;
-
- if (ERR_ISSET(n, &msgset))
- return;
-
- fn = lbasename(curr_pos.p_file);
- (void)printf("%s(%d): ", fn, curr_pos.p_line);
- (void)vprintf(msgs[n], ap);
- (void)printf(" [%d]\n", n);
- nerr++;
-}
-
-static void
-vwarning( int n, va_list ap)
-{
- const char *fn;
-
- if (ERR_ISSET(n, &msgset))
- return;
-
- if (nowarn)
- /* this warning is suppressed by a LINTED comment */
- return;
-
- fn = lbasename(curr_pos.p_file);
- (void)printf("%s(%d): warning: ", fn, curr_pos.p_line);
- (void)vprintf(msgs[n], ap);
- (void)printf(" [%d]\n", n);
- if (wflag)
- nerr++;
-}
-
-void
-error(int n, ...)
-{
- va_list ap;
-
- va_start(ap, n);
- verror(n, ap);
- va_end(ap);
-}
-
-void
-lerror(const char *msg, ...)
-{
- va_list ap;
- const char *fn;
-
- va_start(ap, msg);
- fn = lbasename(curr_pos.p_file);
- (void)fprintf(stderr, "%s(%d): lint error: ", fn, curr_pos.p_line);
- (void)vfprintf(stderr, msg, ap);
- (void)fprintf(stderr, "\n");
- va_end(ap);
- exit(1);
-}
-
-void
-warning(int n, ...)
-{
- va_list ap;
-
- va_start(ap, n);
- vwarning(n, ap);
- va_end(ap);
-}
-
-void
-message(int n, ...)
-{
- va_list ap;
- const char *fn;
-
- if (ERR_ISSET(n, &msgset))
- return;
-
- va_start(ap, n);
- fn = lbasename(curr_pos.p_file);
- (void)printf("%s(%d): ", fn, curr_pos.p_line);
- (void)vprintf(msgs[n], ap);
- (void)printf(" [%d]\n", n);
- va_end(ap);
-}
-
-int
-gnuism(int n, ...)
-{
- va_list ap;
- int msg;
-
- va_start(ap, n);
- if (sflag && !gflag) {
- verror(n, ap);
- msg = 1;
- } else if (!sflag && gflag) {
- msg = 0;
- } else {
- vwarning(n, ap);
- msg = 1;
- }
- va_end(ap);
-
- return (msg);
-}
diff --git a/usr.bin/xlint/lint1/externs1.h b/usr.bin/xlint/lint1/externs1.h
deleted file mode 100644
index 765c1ef..0000000
--- a/usr.bin/xlint/lint1/externs1.h
+++ /dev/null
@@ -1,285 +0,0 @@
-/* $NetBSD: externs1.h,v 1.13 2002/01/18 21:01:39 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * main.c
- */
-extern int aflag;
-extern int bflag;
-extern int cflag;
-extern int dflag;
-extern int eflag;
-extern int Fflag;
-extern int gflag;
-extern int hflag;
-extern int rflag;
-extern int sflag;
-extern int tflag;
-extern int uflag;
-extern int vflag;
-extern int yflag;
-extern int wflag;
-extern int zflag;
-
-extern void norecover(void);
-
-/*
- * cgram.y
- */
-extern int blklev;
-extern int mblklev;
-extern int yydebug;
-
-extern int yyerror(char *);
-extern int yyparse(void);
-
-/*
- * scan.l
- */
-extern pos_t curr_pos;
-extern pos_t csrc_pos;
-extern symt_t symtyp;
-extern FILE *yyin;
-extern uint64_t qbmasks[], qlmasks[], qumasks[];
-
-extern void initscan(void);
-extern int sign(int64_t, tspec_t, int);
-extern int msb(int64_t, tspec_t, int);
-extern int64_t xsign(int64_t, tspec_t, int);
-extern void clrwflgs(void);
-extern sym_t *getsym(sbuf_t *);
-extern void cleanup(void);
-extern sym_t *pushdown(sym_t *);
-extern void rmsym(sym_t *);
-extern void rmsyms(sym_t *);
-extern void inssym(int, sym_t *);
-extern void freeyyv(void *, int);
-extern int yylex(void);
-
-/*
- * mem1.c
- */
-extern const char *fnalloc(const char *);
-extern const char *fnnalloc(const char *, size_t);
-extern int getfnid(const char *);
-
-extern void initmem(void);
-
-extern void *getblk(size_t);
-extern void *getlblk(int, size_t);
-extern void freeblk(void);
-extern void freelblk(int);
-
-extern void *tgetblk(size_t);
-extern tnode_t *getnode(void);
-extern void tfreeblk(void);
-extern struct mbl *tsave(void);
-extern void trestor(struct mbl *);
-
-/*
- * err.c
- */
-extern int nerr;
-extern int sytxerr;
-extern const char *msgs[];
-
-extern void msglist(void);
-extern void error(int, ...);
-extern void warning(int, ...);
-extern void message(int, ...);
-extern int gnuism(int, ...);
-extern void lerror(const char *, ...)
- __attribute__((__noreturn__,__format__(__printf__, 1, 2)));
-
-/*
- * decl.c
- */
-extern dinfo_t *dcs;
-extern const char *unnamed;
-extern int enumval;
-
-extern void initdecl(void);
-extern type_t *gettyp(tspec_t);
-extern type_t *duptyp(const type_t *);
-extern type_t *tduptyp(const type_t *);
-extern int incompl(type_t *);
-extern void setcompl(type_t *, int);
-extern void addscl(scl_t);
-extern void addtype(type_t *);
-extern void addqual(tqual_t);
-extern void pushdecl(scl_t);
-extern void popdecl(void);
-extern void setasm(void);
-extern void clrtyp(void);
-extern void deftyp(void);
-extern int length(type_t *, const char *);
-extern int getbound(type_t *);
-extern sym_t *lnklst(sym_t *, sym_t *);
-extern void chktyp(sym_t *);
-extern sym_t *decl1str(sym_t *);
-extern sym_t *bitfield(sym_t *, int);
-extern pqinf_t *mergepq(pqinf_t *, pqinf_t *);
-extern sym_t *addptr(sym_t *, pqinf_t *);
-extern sym_t *addarray(sym_t *, int, int);
-extern sym_t *addfunc(sym_t *, sym_t *);
-extern void chkfdef(sym_t *, int);
-extern sym_t *dname(sym_t *);
-extern sym_t *iname(sym_t *);
-extern type_t *mktag(sym_t *, tspec_t, int, int);
-extern const char *scltoa(scl_t);
-extern type_t *compltag(type_t *, sym_t *);
-extern sym_t *ename(sym_t *, int, int);
-extern void decl1ext(sym_t *, int);
-extern void cpuinfo(sym_t *, sym_t *);
-extern int isredec(sym_t *, int *);
-extern int eqtype(type_t *, type_t *, int, int, int *);
-extern void compltyp(sym_t *, sym_t *);
-extern sym_t *decl1arg(sym_t *, int);
-extern void cluparg(void);
-extern void decl1loc(sym_t *, int);
-extern sym_t *aname(void);
-extern void globclup(void);
-extern sym_t *decl1abs(sym_t *);
-extern void chksz(sym_t *);
-extern void setsflg(sym_t *);
-extern void setuflg(sym_t *, int, int);
-extern void chkusage(dinfo_t *);
-extern void chkusg1(int, sym_t *);
-extern void chkglsyms(void);
-extern void prevdecl(int, sym_t *);
-
-/*
- * tree.c
- */
-extern void initmtab(void);
-extern type_t *incref(type_t *, tspec_t);
-extern type_t *tincref(type_t *, tspec_t);
-extern tnode_t *getcnode(type_t *, val_t *);
-extern tnode_t *getnnode(sym_t *, int);
-extern tnode_t *getsnode(strg_t *);
-extern sym_t *strmemb(tnode_t *, op_t, sym_t *);
-extern tnode_t *build(op_t, tnode_t *, tnode_t *);
-extern tnode_t *cconv(tnode_t *);
-extern int typeok(op_t, int, tnode_t *, tnode_t *);
-extern tnode_t *promote(op_t, int, tnode_t *);
-extern tnode_t *convert(op_t, int, type_t *, tnode_t *);
-extern void cvtcon(op_t, int, type_t *, val_t *, val_t *);
-extern const char *tyname(type_t *);
-extern tnode_t *bldszof(type_t *);
-extern tnode_t *cast(tnode_t *, type_t *);
-extern tnode_t *funcarg(tnode_t *, tnode_t *);
-extern tnode_t *funccall(tnode_t *, tnode_t *);
-extern val_t *constant(tnode_t *);
-extern void expr(tnode_t *, int, int);
-extern void chkmisc(tnode_t *, int, int, int, int, int, int);
-extern int conaddr(tnode_t *, sym_t **, ptrdiff_t *);
-extern strg_t *catstrg(strg_t *, strg_t *);
-
-/*
- * func.c
- */
-extern sym_t *funcsym;
-extern int reached;
-extern int rchflg;
-extern int ftflg;
-extern int nargusg;
-extern pos_t aupos;
-extern int nvararg;
-extern pos_t vapos;
-extern int prflstrg;
-extern pos_t prflpos;
-extern int scflstrg;
-extern pos_t scflpos;
-extern int ccflg;
-extern int llibflg;
-extern int nowarn;
-extern int bitfieldtype_ok;
-extern int plibflg;
-extern int quadflg;
-
-extern void pushctrl(int);
-extern void popctrl(int);
-extern void chkreach(void);
-extern void funcdef(sym_t *);
-extern void funcend(void);
-extern void label(int, sym_t *, tnode_t *);
-extern void if1(tnode_t *);
-extern void if2(void);
-extern void if3(int);
-extern void switch1(tnode_t *);
-extern void switch2(void);
-extern void while1(tnode_t *);
-extern void while2(void);
-extern void do1(void);
-extern void do2(tnode_t *);
-extern void for1(tnode_t *, tnode_t *, tnode_t *);
-extern void for2(void);
-extern void dogoto(sym_t *);
-extern void docont(void);
-extern void dobreak(void);
-extern void doreturn(tnode_t *);
-extern void glclup(int);
-extern void argsused(int);
-extern void constcond(int);
-extern void fallthru(int);
-extern void notreach(int);
-extern void lintlib(int);
-extern void linted(int);
-extern void varargs(int);
-extern void printflike(int);
-extern void scanflike(int);
-extern void protolib(int);
-extern void longlong(int);
-extern void bitfieldtype(int);
-
-/*
- * init.c
- */
-extern int initerr;
-extern sym_t *initsym;
-extern int startinit;
-
-extern void prepinit(void);
-extern void initrbr(void);
-extern void initlbr(void);
-extern void mkinit(tnode_t *);
-
-/*
- * emit.c
- */
-extern void outtype(type_t *);
-extern const char *ttos(type_t *);
-extern void outsym(sym_t *, scl_t, def_t);
-extern void outfdef(sym_t *, pos_t *, int, int, sym_t *);
-extern void outcall(tnode_t *, int, int);
-extern void outusg(sym_t *);
diff --git a/usr.bin/xlint/lint1/func.c b/usr.bin/xlint/lint1/func.c
deleted file mode 100644
index 68ade02..0000000
--- a/usr.bin/xlint/lint1/func.c
+++ /dev/null
@@ -1,1288 +0,0 @@
-/* $NetBSD: func.c,v 1.16 2002/01/03 04:25:15 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: func.c,v 1.16 2002/01/03 04:25:15 thorpej Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "lint1.h"
-#include "cgram.h"
-
-/*
- * Contains a pointer to the symbol table entry of the current function
- * definition.
- */
-sym_t *funcsym;
-
-/* Is set as long as a statement can be reached. Must be set at level 0. */
-int reached = 1;
-
-/*
- * Is set as long as NOTREACHED is in effect.
- * Is reset everywhere where reached can become 0.
- */
-int rchflg;
-
-/*
- * In conjunction with reached ontrols printing of "fallthrough on ..."
- * warnings.
- * Reset by each statement and set by FALLTHROUGH, switch (switch1())
- * and case (label()).
- *
- * Control statements if, for, while and switch do not reset ftflg because
- * this must be done by the controled statement. At least for if this is
- * important because ** FALLTHROUGH ** after "if (expr) stmnt" is evaluated
- * befor the following token, wich causes reduction of above, is read.
- * This means that ** FALLTHROUGH ** after "if ..." would always be ignored.
- */
-int ftflg;
-
-/* Top element of stack for control statements */
-cstk_t *cstk;
-
-/*
- * Number of arguments which will be checked for usage in following
- * function definition. -1 stands for all arguments.
- *
- * The position of the last ARGSUSED comment is stored in aupos.
- */
-int nargusg = -1;
-pos_t aupos;
-
-/*
- * Number of arguments of the following function definition whose types
- * shall be checked by lint2. -1 stands for all arguments.
- *
- * The position of the last VARARGS comment is stored in vapos.
- */
-int nvararg = -1;
-pos_t vapos;
-
-/*
- * Both prflstr and scflstrg contain the number of the argument which
- * shall be used to check the types of remaining arguments (for PRINTFLIKE
- * and SCANFLIKE).
- *
- * prflpos and scflpos are the positions of the last PRINTFLIKE or
- * SCANFLIKE comment.
- */
-int prflstrg = -1;
-int scflstrg = -1;
-pos_t prflpos;
-pos_t scflpos;
-
-/*
- * Are both plibflg and llibflg set, prototypes are writen as function
- * definitions to the output file.
- */
-int plibflg;
-
-/*
- * Nonzero means that no warnings about constands in conditional
- * context are printed.
- */
-int ccflg;
-
-/*
- * llibflg is set if a lint library shall be created. The effect of
- * llibflg is that all defined symbols are treated as used.
- * (The LINTLIBRARY comment also resets vflag.)
- */
-int llibflg;
-
-/*
- * Nonzero if warnings are suppressed by a LINTED directive
- */
-int nowarn;
-
-/*
- * Nonzero if bitfield type errors are suppressed by a BITFIELDTYPE
- * directive.
- */
-int bitfieldtype_ok;
-
-/*
- * Nonzero if complaints about use of "long long" are suppressed in
- * the next statement or declaration.
- */
-int quadflg;
-
-/*
- * Puts a new element at the top of the stack used for control statements.
- */
-void
-pushctrl(int env)
-{
- cstk_t *ci;
-
- if ((ci = calloc(1, sizeof (cstk_t))) == NULL)
- nomem();
- ci->c_env = env;
- ci->c_nxt = cstk;
- cstk = ci;
-}
-
-/*
- * Removes the top element of the stack used for control statements.
- */
-void
-popctrl(int env)
-{
- cstk_t *ci;
- clst_t *cl;
-
- if (cstk == NULL || cstk->c_env != env)
- lerror("popctrl() 1");
-
- cstk = (ci = cstk)->c_nxt;
-
- while ((cl = ci->c_clst) != NULL) {
- ci->c_clst = cl->cl_nxt;
- free(cl);
- }
-
- if (ci->c_swtype != NULL)
- free(ci->c_swtype);
-
- free(ci);
-}
-
-/*
- * Prints a warning if a statement cannot be reached.
- */
-void
-chkreach(void)
-{
- if (!reached && !rchflg) {
- /* statement not reached */
- warning(193);
- reached = 1;
- }
-}
-
-/*
- * Called after a function declaration which introduces a function definition
- * and before an (optional) old style argument declaration list.
- *
- * Puts all symbols declared in the Prototype or in an old style argument
- * list back to the symbol table.
- *
- * Does the usual checking of storage class, type (return value),
- * redeclaration etc..
- */
-void
-funcdef(sym_t *fsym)
-{
- int n, warn;
- sym_t *arg, *sym, *rdsym;
-
- funcsym = fsym;
-
- /*
- * Put all symbols declared in the argument list back to the
- * symbol table.
- */
- for (sym = dcs->d_fpsyms; sym != NULL; sym = sym->s_dlnxt) {
- if (sym->s_blklev != -1) {
- if (sym->s_blklev != 1)
- lerror("funcdef() 1");
- inssym(1, sym);
- }
- }
-
- /*
- * In osfunc() we did not know whether it is an old style function
- * definition or only an old style declaration, if there are no
- * arguments inside the argument list ("f()").
- */
- if (!fsym->s_type->t_proto && fsym->s_args == NULL)
- fsym->s_osdef = 1;
-
- chktyp(fsym);
-
- /*
- * chktyp() checks for almost all possible errors, but not for
- * incomplete return values (these are allowed in declarations)
- */
- if (fsym->s_type->t_subt->t_tspec != VOID &&
- incompl(fsym->s_type->t_subt)) {
- /* cannot return incomplete type */
- error(67);
- }
-
- fsym->s_def = DEF;
-
- if (fsym->s_scl == TYPEDEF) {
- fsym->s_scl = EXTERN;
- /* illegal storage class */
- error(8);
- }
-
- if (dcs->d_inline)
- fsym->s_inline = 1;
-
- /*
- * Arguments in new style function declarations need a name.
- * (void is already removed from the list of arguments)
- */
- n = 1;
- for (arg = fsym->s_type->t_args; arg != NULL; arg = arg->s_nxt) {
- if (arg->s_scl == ABSTRACT) {
- if (arg->s_name != unnamed)
- lerror("funcdef() 2");
- /* formal parameter lacks name: param #%d */
- error(59, n);
- } else {
- if (arg->s_name == unnamed)
- lerror("funcdef() 3");
- }
- n++;
- }
-
- /*
- * We must also remember the position. s_dpos is overwritten
- * if this is an old style definition and we had already a
- * prototype.
- */
- STRUCT_ASSIGN(dcs->d_fdpos, fsym->s_dpos);
-
- if ((rdsym = dcs->d_rdcsym) != NULL) {
-
- if (!isredec(fsym, (warn = 0, &warn))) {
-
- /*
- * Print nothing if the newly defined function
- * is defined in old style. A better warning will
- * be printed in cluparg().
- */
- if (warn && !fsym->s_osdef) {
- /* redeclaration of %s */
- (*(sflag ? error : warning))(27, fsym->s_name);
- prevdecl(-1, rdsym);
- }
-
- /* copy usage information */
- cpuinfo(fsym, rdsym);
-
- /*
- * If the old symbol was a prototype and the new
- * one is none, overtake the position of the
- * declaration of the prototype.
- */
- if (fsym->s_osdef && rdsym->s_type->t_proto)
- STRUCT_ASSIGN(fsym->s_dpos, rdsym->s_dpos);
-
- /* complete the type */
- compltyp(fsym, rdsym);
-
- /* once a function is inline it remains inline */
- if (rdsym->s_inline)
- fsym->s_inline = 1;
-
- }
-
- /* remove the old symbol from the symbol table */
- rmsym(rdsym);
-
- }
-
- if (fsym->s_osdef && !fsym->s_type->t_proto) {
- if (sflag && hflag && strcmp(fsym->s_name, "main") != 0)
- /* function definition is not a prototyp */
- warning(286);
- }
-
- if (dcs->d_notyp)
- /* return value is implicitly declared to be int */
- fsym->s_rimpl = 1;
-
- reached = 1;
-}
-
-/*
- * Called at the end of a function definition.
- */
-void
-funcend(void)
-{
- sym_t *arg;
- int n;
-
- if (reached) {
- cstk->c_noretval = 1;
- if (funcsym->s_type->t_subt->t_tspec != VOID &&
- !funcsym->s_rimpl) {
- /* func. %s falls off bottom without returning value */
- warning(217, funcsym->s_name);
- }
- }
-
- /*
- * This warning is printed only if the return value was implizitly
- * declared to be int. Otherwise the wrong return statement
- * has already printed a warning.
- */
- if (cstk->c_noretval && cstk->c_retval && funcsym->s_rimpl)
- /* function %s has return (e); and return; */
- warning(216, funcsym->s_name);
-
- /* Print warnings for unused arguments */
- arg = dcs->d_fargs;
- n = 0;
- while (arg != NULL && (nargusg == -1 || n < nargusg)) {
- chkusg1(dcs->d_asm, arg);
- arg = arg->s_nxt;
- n++;
- }
- nargusg = -1;
-
- /*
- * write the information about the function definition to the
- * output file
- * inline functions explicitly declared extern are written as
- * declarations only.
- */
- if (dcs->d_scl == EXTERN && funcsym->s_inline) {
- outsym(funcsym, funcsym->s_scl, DECL);
- } else {
- outfdef(funcsym, &dcs->d_fdpos, cstk->c_retval,
- funcsym->s_osdef, dcs->d_fargs);
- }
-
- /*
- * remove all symbols declared during argument declaration from
- * the symbol table
- */
- if (dcs->d_nxt != NULL || dcs->d_ctx != EXTERN)
- lerror("funcend() 1");
- rmsyms(dcs->d_fpsyms);
-
- /* must be set on level 0 */
- reached = 1;
-}
-
-/*
- * Process a label.
- *
- * typ type of the label (T_NAME, T_DEFAULT or T_CASE).
- * sym symbol table entry of label if typ == T_NAME
- * tn expression if typ == T_CASE
- */
-void
-label(int typ, sym_t *sym, tnode_t *tn)
-{
- cstk_t *ci;
- clst_t *cl;
- val_t *v;
- val_t nv;
- tspec_t t;
-
- switch (typ) {
-
- case T_NAME:
- if (sym->s_set) {
- /* label %s redefined */
- error(194, sym->s_name);
- } else {
- setsflg(sym);
- }
- break;
-
- case T_CASE:
-
- /* find the stack entry for the innermost switch statement */
- for (ci = cstk; ci != NULL && !ci->c_switch; ci = ci->c_nxt)
- continue;
-
- if (ci == NULL) {
- /* case not in switch */
- error(195);
- tn = NULL;
- } else if (tn != NULL && tn->tn_op != CON) {
- /* non-constant case expression */
- error(197);
- tn = NULL;
- } else if (tn != NULL && !isityp(tn->tn_type->t_tspec)) {
- /* non-integral case expression */
- error(198);
- tn = NULL;
- }
-
- if (tn != NULL) {
-
- if (ci->c_swtype == NULL)
- lerror("label() 1");
-
- if (reached && !ftflg) {
- if (hflag)
- /* fallthrough on case statement */
- warning(220);
- }
-
- t = tn->tn_type->t_tspec;
- if (t == LONG || t == ULONG ||
- t == QUAD || t == UQUAD) {
- if (tflag)
- /* case label must be of type ... */
- warning(203);
- }
-
- /*
- * get the value of the expression and convert it
- * to the type of the switch expression
- */
- v = constant(tn);
- (void) memset(&nv, 0, sizeof nv);
- cvtcon(CASE, 0, ci->c_swtype, &nv, v);
- free(v);
-
- /* look if we had this value already */
- for (cl = ci->c_clst; cl != NULL; cl = cl->cl_nxt) {
- if (cl->cl_val.v_quad == nv.v_quad)
- break;
- }
- if (cl != NULL && isutyp(nv.v_tspec)) {
- /* duplicate case in switch, %lu */
- error(200, (u_long)nv.v_quad);
- } else if (cl != NULL) {
- /* duplicate case in switch, %ld */
- error(199, (long)nv.v_quad);
- } else {
- /*
- * append the value to the list of
- * case values
- */
- cl = xcalloc(1, sizeof (clst_t));
- STRUCT_ASSIGN(cl->cl_val, nv);
- cl->cl_nxt = ci->c_clst;
- ci->c_clst = cl;
- }
- }
- tfreeblk();
- break;
-
- case T_DEFAULT:
-
- /* find the stack entry for the innermost switch statement */
- for (ci = cstk; ci != NULL && !ci->c_switch; ci = ci->c_nxt)
- continue;
-
- if (ci == NULL) {
- /* default outside switch */
- error(201);
- } else if (ci->c_default) {
- /* duplicate default in switch */
- error(202);
- } else {
- if (reached && !ftflg) {
- if (hflag)
- /* fallthrough on default statement */
- warning(284);
- }
- ci->c_default = 1;
- }
- break;
- };
- reached = 1;
-}
-
-/*
- * T_IF T_LPARN expr T_RPARN
- */
-void
-if1(tnode_t *tn)
-{
-
- if (tn != NULL)
- tn = cconv(tn);
- if (tn != NULL)
- tn = promote(NOOP, 0, tn);
- expr(tn, 0, 1);
- pushctrl(T_IF);
-}
-
-/*
- * if_without_else
- * if_without_else T_ELSE
- */
-void
-if2(void)
-{
-
- cstk->c_rchif = reached ? 1 : 0;
- reached = 1;
-}
-
-/*
- * if_without_else
- * if_without_else T_ELSE stmnt
- */
-void
-if3(int els)
-{
-
- if (els) {
- reached |= cstk->c_rchif;
- } else {
- reached = 1;
- }
- popctrl(T_IF);
-}
-
-/*
- * T_SWITCH T_LPARN expr T_RPARN
- */
-void
-switch1(tnode_t *tn)
-{
- tspec_t t;
- type_t *tp;
-
- if (tn != NULL)
- tn = cconv(tn);
- if (tn != NULL)
- tn = promote(NOOP, 0, tn);
- if (tn != NULL && !isityp(tn->tn_type->t_tspec)) {
- /* switch expression must have integral type */
- error(205);
- tn = NULL;
- }
- if (tn != NULL && tflag) {
- t = tn->tn_type->t_tspec;
- if (t == LONG || t == ULONG || t == QUAD || t == UQUAD) {
- /* switch expr. must be of type `int' in trad. C */
- warning(271);
- }
- }
-
- /*
- * Remember the type of the expression. Because its possible
- * that (*tp) is allocated on tree memory the type must be
- * duplicated. This is not too complicated because it is
- * only an integer type.
- */
- if ((tp = calloc(1, sizeof (type_t))) == NULL)
- nomem();
- if (tn != NULL) {
- tp->t_tspec = tn->tn_type->t_tspec;
- if ((tp->t_isenum = tn->tn_type->t_isenum) != 0)
- tp->t_enum = tn->tn_type->t_enum;
- } else {
- tp->t_tspec = INT;
- }
-
- expr(tn, 1, 0);
-
- pushctrl(T_SWITCH);
- cstk->c_switch = 1;
- cstk->c_swtype = tp;
-
- reached = rchflg = 0;
- ftflg = 1;
-}
-
-/*
- * switch_expr stmnt
- */
-void
-switch2(void)
-{
- int nenum = 0, nclab = 0;
- sym_t *esym;
- clst_t *cl;
-
- if (cstk->c_swtype == NULL)
- lerror("switch2() 1");
-
- /*
- * If the switch expression was of type enumeration, count the case
- * labels and the number of enumerators. If both counts are not
- * equal print a warning.
- */
- if (cstk->c_swtype->t_isenum) {
- nenum = nclab = 0;
- if (cstk->c_swtype->t_enum == NULL)
- lerror("switch2() 2");
- for (esym = cstk->c_swtype->t_enum->elem;
- esym != NULL; esym = esym->s_nxt) {
- nenum++;
- }
- for (cl = cstk->c_clst; cl != NULL; cl = cl->cl_nxt)
- nclab++;
- if (hflag && eflag && nenum != nclab && !cstk->c_default) {
- /* enumeration value(s) not handled in switch */
- warning(206);
- }
- }
-
- if (cstk->c_break) {
- /*
- * end of switch alway reached (c_break is only set if the
- * break statement can be reached).
- */
- reached = 1;
- } else if (!cstk->c_default &&
- (!hflag || !cstk->c_swtype->t_isenum || nenum != nclab)) {
- /*
- * there are possible values which are not handled in
- * switch
- */
- reached = 1;
- } /*
- * otherwise the end of the switch expression is reached
- * if the end of the last statement inside it is reached.
- */
-
- popctrl(T_SWITCH);
-}
-
-/*
- * T_WHILE T_LPARN expr T_RPARN
- */
-void
-while1(tnode_t *tn)
-{
-
- if (!reached) {
- /* loop not entered at top */
- warning(207);
- reached = 1;
- }
-
- if (tn != NULL)
- tn = cconv(tn);
- if (tn != NULL)
- tn = promote(NOOP, 0, tn);
- if (tn != NULL && !issclt(tn->tn_type->t_tspec)) {
- /* controlling expressions must have scalar type */
- error(204);
- tn = NULL;
- }
-
- pushctrl(T_WHILE);
- cstk->c_loop = 1;
- if (tn != NULL && tn->tn_op == CON) {
- if (isityp(tn->tn_type->t_tspec)) {
- cstk->c_infinite = tn->tn_val->v_quad != 0;
- } else {
- cstk->c_infinite = tn->tn_val->v_ldbl != 0.0;
- }
- }
-
- expr(tn, 0, 1);
-}
-
-/*
- * while_expr stmnt
- * while_expr error
- */
-void
-while2(void)
-{
-
- /*
- * The end of the loop can be reached if it is no endless loop
- * or there was a break statement which was reached.
- */
- reached = !cstk->c_infinite || cstk->c_break;
- rchflg = 0;
-
- popctrl(T_WHILE);
-}
-
-/*
- * T_DO
- */
-void
-do1(void)
-{
-
- if (!reached) {
- /* loop not entered at top */
- warning(207);
- reached = 1;
- }
-
- pushctrl(T_DO);
- cstk->c_loop = 1;
-}
-
-/*
- * do stmnt do_while_expr
- * do error
- */
-void
-do2(tnode_t *tn)
-{
-
- /*
- * If there was a continue statement the expression controlling the
- * loop is reached.
- */
- if (cstk->c_cont)
- reached = 1;
-
- if (tn != NULL)
- tn = cconv(tn);
- if (tn != NULL)
- tn = promote(NOOP, 0, tn);
- if (tn != NULL && !issclt(tn->tn_type->t_tspec)) {
- /* controlling expressions must have scalar type */
- error(204);
- tn = NULL;
- }
-
- if (tn != NULL && tn->tn_op == CON) {
- if (isityp(tn->tn_type->t_tspec)) {
- cstk->c_infinite = tn->tn_val->v_quad != 0;
- } else {
- cstk->c_infinite = tn->tn_val->v_ldbl != 0.0;
- }
- }
-
- expr(tn, 0, 1);
-
- /*
- * The end of the loop is only reached if it is no endless loop
- * or there was a break statement which could be reached.
- */
- reached = !cstk->c_infinite || cstk->c_break;
- rchflg = 0;
-
- popctrl(T_DO);
-}
-
-/*
- * T_FOR T_LPARN opt_expr T_SEMI opt_expr T_SEMI opt_expr T_RPARN
- */
-void
-for1(tnode_t *tn1, tnode_t *tn2, tnode_t *tn3)
-{
-
- /*
- * If there is no initialisation expression it is possible that
- * it is intended not to enter the loop at top.
- */
- if (tn1 != NULL && !reached) {
- /* loop not entered at top */
- warning(207);
- reached = 1;
- }
-
- pushctrl(T_FOR);
- cstk->c_loop = 1;
-
- /*
- * Store the tree memory for the reinitialisation expression.
- * Also remember this expression itself. We must check it at
- * the end of the loop to get "used but not set" warnings correct.
- */
- cstk->c_fexprm = tsave();
- cstk->c_f3expr = tn3;
- STRUCT_ASSIGN(cstk->c_fpos, curr_pos);
- STRUCT_ASSIGN(cstk->c_cfpos, csrc_pos);
-
- if (tn1 != NULL)
- expr(tn1, 0, 0);
-
- if (tn2 != NULL)
- tn2 = cconv(tn2);
- if (tn2 != NULL)
- tn2 = promote(NOOP, 0, tn2);
- if (tn2 != NULL && !issclt(tn2->tn_type->t_tspec)) {
- /* controlling expressions must have scalar type */
- error(204);
- tn2 = NULL;
- }
- if (tn2 != NULL)
- expr(tn2, 0, 1);
-
- if (tn2 == NULL) {
- cstk->c_infinite = 1;
- } else if (tn2->tn_op == CON) {
- if (isityp(tn2->tn_type->t_tspec)) {
- cstk->c_infinite = tn2->tn_val->v_quad != 0;
- } else {
- cstk->c_infinite = tn2->tn_val->v_ldbl != 0.0;
- }
- }
-
- /* Checking the reinitialisation expression is done in for2() */
-
- reached = 1;
-}
-
-/*
- * for_exprs stmnt
- * for_exprs error
- */
-void
-for2(void)
-{
- pos_t cpos, cspos;
- tnode_t *tn3;
-
- if (cstk->c_cont)
- reached = 1;
-
- STRUCT_ASSIGN(cpos, curr_pos);
- STRUCT_ASSIGN(cspos, csrc_pos);
-
- /* Restore the tree memory for the reinitialisation expression */
- trestor(cstk->c_fexprm);
- tn3 = cstk->c_f3expr;
- STRUCT_ASSIGN(curr_pos, cstk->c_fpos);
- STRUCT_ASSIGN(csrc_pos, cstk->c_cfpos);
-
- /* simply "statement not reached" would be confusing */
- if (!reached && !rchflg) {
- /* end-of-loop code not reached */
- warning(223);
- reached = 1;
- }
-
- if (tn3 != NULL) {
- expr(tn3, 0, 0);
- } else {
- tfreeblk();
- }
-
- STRUCT_ASSIGN(curr_pos, cpos);
- STRUCT_ASSIGN(csrc_pos, cspos);
-
- /* An endless loop without break will never terminate */
- reached = cstk->c_break || !cstk->c_infinite;
- rchflg = 0;
-
- popctrl(T_FOR);
-}
-
-/*
- * T_GOTO identifier T_SEMI
- * T_GOTO error T_SEMI
- */
-void
-dogoto(sym_t *lab)
-{
-
- setuflg(lab, 0, 0);
-
- chkreach();
-
- reached = rchflg = 0;
-}
-
-/*
- * T_BREAK T_SEMI
- */
-void
-dobreak(void)
-{
- cstk_t *ci;
-
- ci = cstk;
- while (ci != NULL && !ci->c_loop && !ci->c_switch)
- ci = ci->c_nxt;
-
- if (ci == NULL) {
- /* break outside loop or switch */
- error(208);
- } else {
- if (reached)
- ci->c_break = 1;
- }
-
- if (bflag)
- chkreach();
-
- reached = rchflg = 0;
-}
-
-/*
- * T_CONTINUE T_SEMI
- */
-void
-docont(void)
-{
- cstk_t *ci;
-
- for (ci = cstk; ci != NULL && !ci->c_loop; ci = ci->c_nxt)
- continue;
-
- if (ci == NULL) {
- /* continue outside loop */
- error(209);
- } else {
- ci->c_cont = 1;
- }
-
- chkreach();
-
- reached = rchflg = 0;
-}
-
-/*
- * T_RETURN T_SEMI
- * T_RETURN expr T_SEMI
- */
-void
-doreturn(tnode_t *tn)
-{
- tnode_t *ln, *rn;
- cstk_t *ci;
- op_t op;
-
- for (ci = cstk; ci->c_nxt != NULL; ci = ci->c_nxt)
- continue;
-
- if (tn != NULL) {
- ci->c_retval = 1;
- } else {
- ci->c_noretval = 1;
- }
-
- if (tn != NULL && funcsym->s_type->t_subt->t_tspec == VOID) {
- /* void function %s cannot return value */
- error(213, funcsym->s_name);
- tfreeblk();
- tn = NULL;
- } else if (tn == NULL && funcsym->s_type->t_subt->t_tspec != VOID) {
- /*
- * Assume that the function has a return value only if it
- * is explicitly declared.
- */
- if (!funcsym->s_rimpl)
- /* function %s expects to return value */
- warning(214, funcsym->s_name);
- }
-
- if (tn != NULL) {
-
- /* Create a temporary node for the left side */
- ln = tgetblk(sizeof (tnode_t));
- ln->tn_op = NAME;
- ln->tn_type = tduptyp(funcsym->s_type->t_subt);
- ln->tn_type->t_const = 0;
- ln->tn_lvalue = 1;
- ln->tn_sym = funcsym; /* better than nothing */
-
- tn = build(RETURN, ln, tn);
-
- if (tn != NULL) {
- rn = tn->tn_right;
- while ((op = rn->tn_op) == CVT || op == PLUS)
- rn = rn->tn_left;
- if (rn->tn_op == AMPER && rn->tn_left->tn_op == NAME &&
- rn->tn_left->tn_sym->s_scl == AUTO) {
- /* %s returns pointer to automatic object */
- warning(302, funcsym->s_name);
- }
- }
-
- expr(tn, 1, 0);
-
- } else {
-
- chkreach();
-
- }
-
- reached = rchflg = 0;
-}
-
-/*
- * Do some cleanup after a global declaration or definition.
- * Especially remove informations about unused lint comments.
- */
-void
-glclup(int silent)
-{
- pos_t cpos;
-
- STRUCT_ASSIGN(cpos, curr_pos);
-
- if (nargusg != -1) {
- if (!silent) {
- STRUCT_ASSIGN(curr_pos, aupos);
- /* must precede function definition: %s */
- warning(282, "ARGSUSED");
- }
- nargusg = -1;
- }
- if (nvararg != -1) {
- if (!silent) {
- STRUCT_ASSIGN(curr_pos, vapos);
- /* must precede function definition: %s */
- warning(282, "VARARGS");
- }
- nvararg = -1;
- }
- if (prflstrg != -1) {
- if (!silent) {
- STRUCT_ASSIGN(curr_pos, prflpos);
- /* must precede function definition: %s */
- warning(282, "PRINTFLIKE");
- }
- prflstrg = -1;
- }
- if (scflstrg != -1) {
- if (!silent) {
- STRUCT_ASSIGN(curr_pos, scflpos);
- /* must precede function definition: %s */
- warning(282, "SCANFLIKE");
- }
- scflstrg = -1;
- }
-
- STRUCT_ASSIGN(curr_pos, cpos);
-
- dcs->d_asm = 0;
-}
-
-/*
- * ARGSUSED comment
- *
- * Only the first n arguments of the following function are checked
- * for usage. A missing argument is taken to be 0.
- */
-void
-argsused(int n)
-{
-
- if (n == -1)
- n = 0;
-
- if (dcs->d_ctx != EXTERN) {
- /* must be outside function: ** %s ** */
- warning(280, "ARGSUSED");
- return;
- }
- if (nargusg != -1) {
- /* duplicate use of ** %s ** */
- warning(281, "ARGSUSED");
- }
- nargusg = n;
- STRUCT_ASSIGN(aupos, curr_pos);
-}
-
-/*
- * VARARGS comment
- *
- * Makes that lint2 checks only the first n arguments for compatibility
- * to the function definition. A missing argument is taken to be 0.
- */
-void
-varargs(int n)
-{
-
- if (n == -1)
- n = 0;
-
- if (dcs->d_ctx != EXTERN) {
- /* must be outside function: ** %s ** */
- warning(280, "VARARGS");
- return;
- }
- if (nvararg != -1) {
- /* duplicate use of ** %s ** */
- warning(281, "VARARGS");
- }
- nvararg = n;
- STRUCT_ASSIGN(vapos, curr_pos);
-}
-
-/*
- * PRINTFLIKE comment
- *
- * Check all arguments until the (n-1)-th as usual. The n-th argument is
- * used the check the types of remaining arguments.
- */
-void
-printflike(int n)
-{
-
- if (n == -1)
- n = 0;
-
- if (dcs->d_ctx != EXTERN) {
- /* must be outside function: ** %s ** */
- warning(280, "PRINTFLIKE");
- return;
- }
- if (prflstrg != -1) {
- /* duplicate use of ** %s ** */
- warning(281, "PRINTFLIKE");
- }
- prflstrg = n;
- STRUCT_ASSIGN(prflpos, curr_pos);
-}
-
-/*
- * SCANFLIKE comment
- *
- * Check all arguments until the (n-1)-th as usual. The n-th argument is
- * used the check the types of remaining arguments.
- */
-void
-scanflike(int n)
-{
-
- if (n == -1)
- n = 0;
-
- if (dcs->d_ctx != EXTERN) {
- /* must be outside function: ** %s ** */
- warning(280, "SCANFLIKE");
- return;
- }
- if (scflstrg != -1) {
- /* duplicate use of ** %s ** */
- warning(281, "SCANFLIKE");
- }
- scflstrg = n;
- STRUCT_ASSIGN(scflpos, curr_pos);
-}
-
-/*
- * Set the linenumber for a CONSTCOND comment. At this and the following
- * line no warnings about constants in conditional contexts are printed.
- */
-/* ARGSUSED */
-void
-constcond(int n)
-{
-
- ccflg = 1;
-}
-
-/*
- * Suppress printing of "fallthrough on ..." warnings until next
- * statement.
- */
-/* ARGSUSED */
-void
-fallthru(int n)
-{
-
- ftflg = 1;
-}
-
-/*
- * Stop warnings about statements which cannot be reached. Also tells lint
- * that the following statements cannot be reached (e.g. after exit()).
- */
-/* ARGSUSED */
-void
-notreach(int n)
-{
-
- reached = 0;
- rchflg = 1;
-}
-
-/* ARGSUSED */
-void
-lintlib(int n)
-{
-
- if (dcs->d_ctx != EXTERN) {
- /* must be outside function: ** %s ** */
- warning(280, "LINTLIBRARY");
- return;
- }
- llibflg = 1;
- vflag = 0;
-}
-
-/*
- * Suppress most warnings at the current and the following line.
- */
-/* ARGSUSED */
-void
-linted(int n)
-{
-
-#ifdef DEBUG
- printf("%s, %d: nowarn = 1\n", curr_pos.p_file, curr_pos.p_line);
-#endif
- nowarn = 1;
-}
-
-/*
- * Suppress bitfield type errors on the current line.
- */
-/* ARGSUSED */
-void
-bitfieldtype(int n)
-{
-
-#ifdef DEBUG
- printf("%s, %d: bitfieldtype_ok = 1\n", curr_pos.p_file,
- curr_pos.p_line);
-#endif
- bitfieldtype_ok = 1;
-}
-
-/*
- * PROTOTLIB in conjunction with LINTLIBRARY can be used to handle
- * prototypes like function definitions. This is done if the argument
- * to PROTOLIB is nonzero. Otherwise prototypes are handled normaly.
- */
-void
-protolib(int n)
-{
-
- if (dcs->d_ctx != EXTERN) {
- /* must be outside function: ** %s ** */
- warning(280, "PROTOLIB");
- return;
- }
- plibflg = n == 0 ? 0 : 1;
-}
-
-/*
- * Set quadflg to nonzero which means that the next statement/declaration
- * may use "long long" without an error or warning.
- */
-/* ARGSUSED */
-void
-longlong(int n)
-{
-
- quadflg = 1;
-}
diff --git a/usr.bin/xlint/lint1/init.c b/usr.bin/xlint/lint1/init.c
deleted file mode 100644
index cf4cbdd..0000000
--- a/usr.bin/xlint/lint1/init.c
+++ /dev/null
@@ -1,515 +0,0 @@
-/* $NetBSD: init.c,v 1.9 2001/09/18 18:15:54 wiz Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: init.c,v 1.9 2001/09/18 18:15:54 wiz Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-
-#include "lint1.h"
-
-/*
- * initerr is set as soon as a fatal error occurred in an initialisation.
- * The effect is that the rest of the initialisation is ignored (parsed
- * by yacc, expression trees built, but no initialisation takes place).
- */
-int initerr;
-
-/* Pointer to the symbol which is to be initialized. */
-sym_t *initsym;
-
-/* Points to the top element of the initialisation stack. */
-istk_t *initstk;
-
-
-static void popi2(void);
-static void popinit(int);
-static void pushinit(void);
-static void testinit(void);
-static void nextinit(int);
-static int strginit(tnode_t *);
-
-
-/*
- * Initialize the initialisation stack by putting an entry for the variable
- * which is to be initialized on it.
- */
-void
-prepinit(void)
-{
- istk_t *istk;
-
- if (initerr)
- return;
-
- /* free memory used in last initialisation */
- while ((istk = initstk) != NULL) {
- initstk = istk->i_nxt;
- free(istk);
- }
-
- /*
- * If the type which is to be initialized is an incomplete type,
- * it must be duplicated.
- */
- if (initsym->s_type->t_tspec == ARRAY && incompl(initsym->s_type))
- initsym->s_type = duptyp(initsym->s_type);
-
- istk = initstk = xcalloc(1, sizeof (istk_t));
- istk->i_subt = initsym->s_type;
- istk->i_cnt = 1;
-
-}
-
-static void
-popi2(void)
-{
- istk_t *istk;
- sym_t *m;
-
- initstk = (istk = initstk)->i_nxt;
- if (initstk == NULL)
- lerror("popi2() 1");
- free(istk);
-
- istk = initstk;
-
- istk->i_cnt--;
- if (istk->i_cnt < 0)
- lerror("popi2() 3");
-
- /*
- * If the removed element was a structure member, we must go
- * to the next structure member.
- */
- if (istk->i_cnt > 0 && istk->i_type->t_tspec == STRUCT) {
- do {
- m = istk->i_mem = istk->i_mem->s_nxt;
- if (m == NULL)
- lerror("popi2() 2");
- } while (m->s_field && m->s_name == unnamed);
- istk->i_subt = m->s_type;
- }
-}
-
-static void
-popinit(int brace)
-{
-
- if (brace) {
- /*
- * Take all entries, including the first which requires
- * a closing brace, from the stack.
- */
- do {
- brace = initstk->i_brace;
- popi2();
- } while (!brace);
- } else {
- /*
- * Take all entries which cannot be used for further
- * initializers from the stack, but do this only if
- * they do not require a closing brace.
- */
- while (!initstk->i_brace &&
- initstk->i_cnt == 0 && !initstk->i_nolimit) {
- popi2();
- }
- }
-}
-
-static void
-pushinit(void)
-{
- istk_t *istk;
- int cnt;
- sym_t *m;
-
- istk = initstk;
-
- /* Extend an incomplete array type by one element */
- if (istk->i_cnt == 0) {
- /*
- * Inside of other aggregate types must not be an incomplete
- * type.
- */
- if (istk->i_nxt->i_nxt != NULL)
- lerror("pushinit() 1");
- istk->i_cnt = 1;
- if (istk->i_type->t_tspec != ARRAY)
- lerror("pushinit() 2");
- istk->i_type->t_dim++;
- /* from now its a complete type */
- setcompl(istk->i_type, 0);
- }
-
- if (istk->i_cnt <= 0)
- lerror("pushinit() 3");
- if (istk->i_type != NULL && issclt(istk->i_type->t_tspec))
- lerror("pushinit() 4");
-
- initstk = xcalloc(1, sizeof (istk_t));
- initstk->i_nxt = istk;
- initstk->i_type = istk->i_subt;
- if (initstk->i_type->t_tspec == FUNC)
- lerror("pushinit() 5");
-
- istk = initstk;
-
- switch (istk->i_type->t_tspec) {
- case ARRAY:
- if (incompl(istk->i_type) && istk->i_nxt->i_nxt != NULL) {
- /* initialisation of an incomplete type */
- error(175);
- initerr = 1;
- return;
- }
- istk->i_subt = istk->i_type->t_subt;
- istk->i_nolimit = incompl(istk->i_type);
- istk->i_cnt = istk->i_type->t_dim;
- break;
- case UNION:
- if (tflag)
- /* initialisation of union is illegal in trad. C */
- warning(238);
- /* FALLTHROUGH */
- case STRUCT:
- if (incompl(istk->i_type)) {
- /* initialisation of an incomplete type */
- error(175);
- initerr = 1;
- return;
- }
- cnt = 0;
- for (m = istk->i_type->t_str->memb; m != NULL; m = m->s_nxt) {
- if (m->s_field && m->s_name == unnamed)
- continue;
- if (++cnt == 1) {
- istk->i_mem = m;
- istk->i_subt = m->s_type;
- }
- }
- if (cnt == 0) {
- /* cannot init. struct/union with no named member */
- error(179);
- initerr = 1;
- return;
- }
- istk->i_cnt = istk->i_type->t_tspec == STRUCT ? cnt : 1;
- break;
- default:
- istk->i_cnt = 1;
- break;
- }
-}
-
-static void
-testinit(void)
-{
- istk_t *istk;
-
- istk = initstk;
-
- /*
- * If a closing brace is expected we have at least one initializer
- * too much.
- */
- if (istk->i_cnt == 0 && !istk->i_nolimit) {
- switch (istk->i_type->t_tspec) {
- case ARRAY:
- /* too many array initializers */
- error(173);
- break;
- case STRUCT:
- case UNION:
- /* too many struct/union initializers */
- error(172);
- break;
- default:
- /* too many initializers */
- error(174);
- break;
- }
- initerr = 1;
- }
-}
-
-static void
-nextinit(int brace)
-{
-
- if (!brace) {
- if (initstk->i_type == NULL &&
- !issclt(initstk->i_subt->t_tspec)) {
- /* {}-enclosed initializer required */
- error(181);
- }
- /*
- * Make sure an entry with a scalar type is at the top
- * of the stack.
- */
- if (!initerr)
- testinit();
- while (!initerr && (initstk->i_type == NULL ||
- !issclt(initstk->i_type->t_tspec))) {
- if (!initerr)
- pushinit();
- }
- } else {
- if (initstk->i_type != NULL &&
- issclt(initstk->i_type->t_tspec)) {
- /* invalid initializer */
- error(176);
- initerr = 1;
- }
- if (!initerr)
- testinit();
- if (!initerr)
- pushinit();
- if (!initerr)
- initstk->i_brace = 1;
- }
-}
-
-void
-initlbr(void)
-{
-
- if (initerr)
- return;
-
- if ((initsym->s_scl == AUTO || initsym->s_scl == REG) &&
- initstk->i_nxt == NULL) {
- if (tflag && !issclt(initstk->i_subt->t_tspec))
- /* no automatic aggregate initialization in trad. C*/
- warning(188);
- }
-
- /*
- * Remove all entries which cannot be used for further initializers
- * and do not expect a closing brace.
- */
- popinit(0);
-
- nextinit(1);
-}
-
-void
-initrbr(void)
-{
-
- if (initerr)
- return;
-
- popinit(1);
-}
-
-void
-mkinit(tnode_t *tn)
-{
- ptrdiff_t offs;
- sym_t *sym;
- tspec_t lt, rt;
- tnode_t *ln;
- struct mbl *tmem;
- scl_t sc;
-
- if (initerr || tn == NULL)
- goto end;
-
- sc = initsym->s_scl;
-
- /*
- * Do not test for automatic aggregat initialisation. If the
- * initializer starts with a brace we have the warning already.
- * If not, an error will be printed that the initializer must
- * be enclosed by braces.
- */
-
- /*
- * Local initialisation of non-array-types with only one expression
- * without braces is done by ASSIGN
- */
- if ((sc == AUTO || sc == REG) &&
- initsym->s_type->t_tspec != ARRAY && initstk->i_nxt == NULL) {
- ln = getnnode(initsym, 0);
- ln->tn_type = tduptyp(ln->tn_type);
- ln->tn_type->t_const = 0;
- tn = build(ASSIGN, ln, tn);
- expr(tn, 0, 0);
- goto end;
- }
-
- /*
- * Remove all entries which cannot be used for further initializers
- * and do not require a closing brace.
- */
- popinit(0);
-
- /* Initialisations by strings are done in strginit(). */
- if (strginit(tn))
- goto end;
-
- nextinit(0);
- if (initerr || tn == NULL)
- goto end;
-
- initstk->i_cnt--;
-
- /* Create a temporary node for the left side. */
- ln = tgetblk(sizeof (tnode_t));
- ln->tn_op = NAME;
- ln->tn_type = tduptyp(initstk->i_type);
- ln->tn_type->t_const = 0;
- ln->tn_lvalue = 1;
- ln->tn_sym = initsym; /* better than nothing */
-
- tn = cconv(tn);
-
- lt = ln->tn_type->t_tspec;
- rt = tn->tn_type->t_tspec;
-
- if (!issclt(lt))
- lerror("mkinit() 1");
-
- if (!typeok(INIT, 0, ln, tn))
- goto end;
-
- /*
- * Store the tree memory. This is nessesary because otherwise
- * expr() would free it.
- */
- tmem = tsave();
- expr(tn, 1, 0);
- trestor(tmem);
-
- if (isityp(lt) && ln->tn_type->t_isfield && !isityp(rt)) {
- /*
- * Bit-fields can be initialized in trad. C only by integer
- * constants.
- */
- if (tflag)
- /* bit-field initialisation is illegal in trad. C */
- warning(186);
- }
-
- if (lt != rt || (initstk->i_type->t_isfield && tn->tn_op == CON))
- tn = convert(INIT, 0, initstk->i_type, tn);
-
- if (tn != NULL && tn->tn_op != CON) {
- sym = NULL;
- offs = 0;
- if (conaddr(tn, &sym, &offs) == -1) {
- if (sc == AUTO || sc == REG) {
- /* non-constant initializer */
- (void)gnuism(177);
- } else {
- /* non-constant initializer */
- error(177);
- }
- }
- }
-
- end:
- tfreeblk();
-}
-
-
-static int
-strginit(tnode_t *tn)
-{
- tspec_t t;
- istk_t *istk;
- int len;
- strg_t *strg;
-
- if (tn->tn_op != STRING)
- return (0);
-
- istk = initstk;
- strg = tn->tn_strg;
-
- /*
- * Check if we have an array type which can be initialized by
- * the string.
- */
- if (istk->i_subt->t_tspec == ARRAY) {
- t = istk->i_subt->t_subt->t_tspec;
- if (!((strg->st_tspec == CHAR &&
- (t == CHAR || t == UCHAR || t == SCHAR)) ||
- (strg->st_tspec == WCHAR && t == WCHAR))) {
- return (0);
- }
- /* Put the array at top of stack */
- pushinit();
- istk = initstk;
- } else if (istk->i_type != NULL && istk->i_type->t_tspec == ARRAY) {
- t = istk->i_type->t_subt->t_tspec;
- if (!((strg->st_tspec == CHAR &&
- (t == CHAR || t == UCHAR || t == SCHAR)) ||
- (strg->st_tspec == WCHAR && t == WCHAR))) {
- return (0);
- }
- /*
- * If the array is already partly initialized, we are
- * wrong here.
- */
- if (istk->i_cnt != istk->i_type->t_dim)
- return (0);
- } else {
- return (0);
- }
-
- /* Get length without trailing NUL character. */
- len = strg->st_len;
-
- if (istk->i_nolimit) {
- istk->i_nolimit = 0;
- istk->i_type->t_dim = len + 1;
- /* from now complete type */
- setcompl(istk->i_type, 0);
- } else {
- if (istk->i_type->t_dim < len) {
- /* non-null byte ignored in string initializer */
- warning(187);
- }
- }
-
- /* In every case the array is initialized completely. */
- istk->i_cnt = 0;
-
- return (1);
-}
diff --git a/usr.bin/xlint/lint1/lint.h b/usr.bin/xlint/lint1/lint.h
deleted file mode 100644
index cadcd7a..0000000
--- a/usr.bin/xlint/lint1/lint.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/* $NetBSD: lint.h,v 1.2 1995/07/03 21:24:18 cgd Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/types.h>
-#include <stdio.h>
-#include <stddef.h>
-
-#include "param.h"
-
-/*
- * Type specifiers, used in type structures (type_t) and otherwere.
- */
-typedef enum {
- NOTSPEC,
- SIGNED, /* keyword "signed", only used in the parser */
- UNSIGN, /* keyword "unsigned", only used in the parser */
- CHAR, /* char */
- SCHAR, /* signed char */
- UCHAR, /* unsigned char */
- SHORT, /* (signed) short */
- USHORT, /* unsigned short */
- INT, /* (signed) int */
- UINT, /* unsigned int */
- LONG, /* (signed) long */
- ULONG, /* unsigned long */
- QUAD, /* (signed) long long */
- UQUAD, /* unsigned long long */
- FLOAT, /* float */
- DOUBLE, /* double or, with tflag, long float */
- LDOUBLE, /* long double */
- VOID, /* void */
- STRUCT, /* structure tag */
- UNION, /* union tag */
- ENUM, /* enum tag */
- PTR, /* pointer */
- ARRAY, /* array */
- FUNC /* function */
-#define NTSPEC ((int)FUNC + 1)
-} tspec_t;
-
-/*
- * size of types, name and classification
- */
-typedef struct {
- int tt_sz; /* size in bits */
- int tt_psz; /* size, different from tt_sz
- if pflag is set */
- tspec_t tt_styp; /* signed counterpart */
- tspec_t tt_utyp; /* unsigned counterpart */
- u_int tt_isityp : 1; /* 1 if integer type */
- u_int tt_isutyp : 1; /* 1 if unsigned integer type */
- u_int tt_isftyp : 1; /* 1 if floating point type */
- u_int tt_isatyp : 1; /* 1 if arithmetic type */
- u_int tt_issclt : 1; /* 1 if scalar type */
- char *tt_name; /* Bezeichnung des Typs */
-} ttab_t;
-
-#define size(t) (ttab[t].tt_sz)
-#define psize(t) (ttab[t].tt_psz)
-#define styp(t) (ttab[t].tt_styp)
-#define utyp(t) (ttab[t].tt_utyp)
-#define isityp(t) (ttab[t].tt_isityp)
-#define isutyp(t) (ttab[t].tt_isutyp)
-#define isftyp(t) (ttab[t].tt_isftyp)
-#define isatyp(t) (ttab[t].tt_isatyp)
-#define issclt(t) (ttab[t].tt_issclt)
-
-extern ttab_t ttab[];
-
-
-typedef enum {
- NODECL, /* until now not declared */
- DECL, /* declared */
- TDEF, /* tentative defined */
- DEF /* defined */
-} def_t;
-
-/*
- * Following structure contains some data used for the output buffer.
- */
-typedef struct ob {
- char *o_buf; /* buffer */
- char *o_end; /* first byte after buffer */
- size_t o_len; /* length of buffer */
- char *o_nxt; /* next free byte in buffer */
-} ob_t;
-
-#include "externs.h"
diff --git a/usr.bin/xlint/lint1/lint1.h b/usr.bin/xlint/lint1/lint1.h
deleted file mode 100644
index fe1a524..0000000
--- a/usr.bin/xlint/lint1/lint1.h
+++ /dev/null
@@ -1,416 +0,0 @@
-/* $NetBSD: lint1.h,v 1.12 2002/01/31 19:33:27 tv Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "lint.h"
-#include "op.h"
-
-/* XXX - works for most systems, but the whole ALIGN thing needs to go away */
-#ifndef ALIGN
-#define ALIGN(x) (((x) + 7) & ~7)
-#endif
-
-/*
- * Describes the position of a declaration or anything else.
- */
-typedef struct {
- int p_line;
- const char *p_file;
- int p_uniq; /* uniquifier */
-} pos_t;
-
-/* Copies curr_pos, keeping things unique. */
-#define UNIQUE_CURR_POS(pos) \
- do { \
- STRUCT_ASSIGN((pos), curr_pos); \
- curr_pos.p_uniq++; \
- if (curr_pos.p_file == csrc_pos.p_file) \
- csrc_pos.p_uniq++; \
- } while (0)
-
-/*
- * Strings cannot be referenced to simply by a pointer to its first
- * char. This is because strings can contain NUL characters other than the
- * trailing NUL.
- *
- * Strings are stored with a trailing NUL.
- */
-typedef struct strg {
- tspec_t st_tspec; /* CHAR or WCHAR */
- size_t st_len; /* length without trailing NUL */
- union {
- u_char *_st_cp;
- wchar_t *_st_wcp;
- } st_u;
-} strg_t;
-
-#define st_cp st_u._st_cp
-#define st_wcp st_u._st_wcp
-
-/*
- * qualifiers (only for lex/yacc interface)
- */
-typedef enum {
- CONST, VOLATILE
-} tqual_t;
-
-/*
- * Integer and floating point values are stored in this structure
- */
-typedef struct {
- tspec_t v_tspec;
- int v_ansiu; /* set if an integer constant is
- unsigned in ANSI C */
- union {
- int64_t _v_quad; /* integers */
- ldbl_t _v_ldbl; /* floats */
- } v_u;
-} val_t;
-
-#define v_quad v_u._v_quad
-#define v_ldbl v_u._v_ldbl
-
-/*
- * Structures of type str_t uniqely identify structures. This can't
- * be done in structures of type type_t, because these are copied
- * if they must be modified. So it would not be possible to check
- * if to structures are identical by comparing the pointers to
- * the type structures.
- *
- * The typename is used if the structure is unnamed to identify
- * the structure type in pass 2.
- */
-typedef struct {
- u_int size; /* size in bit */
- u_int align : 15; /* alignment in bit */
- u_int sincompl : 1; /* set if incomplete type */
- struct sym *memb; /* list of members */
- struct sym *stag; /* symbol table entry of tag */
- struct sym *stdef; /* symbol table entry of first typename */
-} str_t;
-
-/*
- * same as above for enums
- */
-typedef struct {
- u_int eincompl : 1; /* incomplete enum type */
- struct sym *elem; /* list of enumerators */
- struct sym *etag; /* symbol table entry of tag */
- struct sym *etdef; /* symbol table entry of first typename */
-} enum_t;
-
-/*
- * Types are represented by concatenation of structures of type type_t
- * via t_subt.
- */
-typedef struct type {
- tspec_t t_tspec; /* type specifier */
- u_int t_aincompl : 1; /* incomplete array type */
- u_int t_const : 1; /* const modifier */
- u_int t_volatile : 1; /* volatile modifier */
- u_int t_proto : 1; /* function prototype (t_args valid) */
- u_int t_vararg : 1; /* protoype with ... */
- u_int t_typedef : 1; /* type defined with typedef */
- u_int t_isfield : 1; /* type is bitfield */
- u_int t_isenum : 1; /* type is (or was) enum (t_enum valid) */
- union {
- int _t_dim; /* dimension */
- str_t *_t_str; /* struct/union tag */
- enum_t *_t_enum; /* enum tag */
- struct sym *_t_args; /* arguments (if t_proto) */
- } t_u;
- struct {
- u_int _t_flen : 8; /* length of bit-field */
- u_int _t_foffs : 24; /* offset of bit-field */
- } t_b;
- struct type *t_subt; /* element type (arrays), return value
- (functions), or type pointer points to */
-} type_t;
-
-#define t_dim t_u._t_dim
-#define t_str t_u._t_str
-#define t_field t_u._t_field
-#define t_enum t_u._t_enum
-#define t_args t_u._t_args
-#define t_flen t_b._t_flen
-#define t_foffs t_b._t_foffs
-
-/*
- * types of symbols
- */
-typedef enum {
- FVFT, /* variables, functions, type names, enums */
- FMOS, /* members of structs or unions */
- FTAG, /* tags */
- FLAB /* labels */
-} symt_t;
-
-/*
- * storage classes
- */
-typedef enum {
- NOSCL,
- EXTERN, /* external symbols (indep. of decl_t) */
- STATIC, /* static symbols (local and global) */
- AUTO, /* automatic symbols (except register) */
- REG, /* register */
- TYPEDEF, /* typedef */
- STRTAG,
- UNIONTAG,
- ENUMTAG,
- MOS, /* member of struct */
- MOU, /* member of union */
- ENUMCON, /* enumerator */
- ABSTRACT, /* abstract symbol (sizeof, casts, unnamed argument) */
- ARG, /* argument */
- PARG, /* used in declaration stack during prototype
- declaration */
- INLINE /* only used by the parser */
-} scl_t;
-
-/*
- * symbol table entry
- */
-typedef struct sym {
- const char *s_name; /* name */
- const char *s_rename; /* renamed symbol's given name */
- pos_t s_dpos; /* position of last (prototype)definition,
- prototypedeclaration, no-prototype-def.,
- tentative definition or declaration,
- in this order */
- pos_t s_spos; /* position of first initialisation */
- pos_t s_upos; /* position of first use */
- symt_t s_kind; /* type of symbol */
- u_int s_keyw : 1; /* keyword */
- u_int s_field : 1; /* bit-field */
- u_int s_set : 1; /* variable set, label defined */
- u_int s_used : 1; /* variable/label used */
- u_int s_arg : 1; /* symbol is function argument */
- u_int s_reg : 1; /* symbol is register variable */
- u_int s_defarg : 1; /* undefined symbol in old style function
- definition */
- u_int s_rimpl : 1; /* return value of function implizit decl. */
- u_int s_osdef : 1; /* symbol stems from old style function def. */
- u_int s_inline : 1; /* true if this is an inline function */
- struct sym *s_xsym; /* for local declared external symbols pointer
- to external symbol with same name */
- def_t s_def; /* declared, tentative defined, defined */
- scl_t s_scl; /* storage class */
- int s_blklev; /* level of declaration, -1 if not in symbol
- table */
- type_t *s_type; /* type */
- val_t s_value; /* value (if enumcon) */
- union {
- str_t *_s_st; /* tag, if it is a struct/union member */
- enum_t *_s_et; /* tag, if it is an enumerator */
- tspec_t _s_tsp; /* type (only for keywords) */
- tqual_t _s_tqu; /* qualifier (only for keywords) */
- struct sym *_s_args; /* arguments in old style function
- definitions */
- } u;
- struct sym *s_link; /* next symbol with same hash value */
- struct sym **s_rlink; /* pointer to s_link of prev. symbol */
- struct sym *s_nxt; /* next struct/union member, enumerator,
- argument */
- struct sym *s_dlnxt; /* next symbol declared on same level */
-} sym_t;
-
-#define s_styp u._s_st
-#define s_etyp u._s_et
-#define s_tspec u._s_tsp
-#define s_tqual u._s_tqu
-#define s_args u._s_args
-
-/*
- * Used to keep some informations about symbols before they are entered
- * into the symbol table.
- */
-typedef struct sbuf {
- const char *sb_name; /* name of symbol */
- size_t sb_len; /* length (without '\0') */
- int sb_hash; /* hash value */
- sym_t *sb_sym; /* symbol table entry */
- struct sbuf *sb_nxt; /* for freelist */
-} sbuf_t;
-
-
-/*
- * tree node
- */
-typedef struct tnode {
- op_t tn_op; /* operator */
- type_t *tn_type; /* type */
- u_int tn_lvalue : 1; /* node is lvalue */
- u_int tn_cast : 1; /* if tn_op == CVT its an explizit cast */
- u_int tn_parn : 1; /* node parenthesized */
- union {
- struct {
- struct tnode *_tn_left; /* (left) operand */
- struct tnode *_tn_right; /* right operand */
- } tn_s;
- sym_t *_tn_sym; /* symbol if op == NAME */
- val_t *_tn_val; /* value if op == CON */
- strg_t *_tn_strg; /* string if op == STRING */
- } tn_u;
-} tnode_t;
-
-#define tn_left tn_u.tn_s._tn_left
-#define tn_right tn_u.tn_s._tn_right
-#define tn_sym tn_u._tn_sym
-#define tn_val tn_u._tn_val
-#define tn_strg tn_u._tn_strg
-
-/*
- * For nested declarations a stack exists, which holds all information
- * needed for the current level. dcs points to the top element of this
- * stack.
- *
- * ctx describes the context of the current declaration. Its value is
- * one of
- * EXTERN global declarations
- * MOS oder MOU declarations of struct or union members
- * ENUMCON declarations of enums
- * ARG declaration of arguments in old style function definitions
- * PARG declaration of arguments in function prototypes
- * AUTO declaration of local symbols
- * ABSTRACT abstract declarations (sizeof, casts)
- *
- */
-typedef struct dinfo {
- tspec_t d_atyp; /* VOID, CHAR, INT, FLOAT or DOUBLE */
- tspec_t d_smod; /* SIGNED or UNSIGN */
- tspec_t d_lmod; /* SHORT, LONG or QUAD */
- scl_t d_scl; /* storage class */
- type_t *d_type; /* after deftyp() pointer to the type used
- for all declarators */
- sym_t *d_rdcsym; /* redeclared symbol */
- int d_offset; /* offset of next structure member */
- int d_stralign; /* alignment required for current structure */
- scl_t d_ctx; /* context of declaration */
- u_int d_const : 1; /* const in declaration specifiers */
- u_int d_volatile : 1; /* volatile in declaration specifiers */
- u_int d_inline : 1; /* inline in declaration specifiers */
- u_int d_mscl : 1; /* multiple storage classes */
- u_int d_terr : 1; /* invalid type combination */
- u_int d_nedecl : 1; /* 1 if at least a tag is declared */
- u_int d_vararg : 1; /* ... in current function decl. */
- u_int d_proto : 1; /* current funct. decl. is prototype */
- u_int d_notyp : 1; /* set if no type specifier was present */
- u_int d_asm : 1; /* set if d_ctx == AUTO and asm() present */
- type_t *d_tagtyp; /* tag during member declaration */
- sym_t *d_fargs; /* list of arguments during function def. */
- pos_t d_fdpos; /* position of function definition */
- sym_t *d_dlsyms; /* first symbol declared at this level */
- sym_t **d_ldlsym; /* points to s_dlnxt in last symbol decl.
- at this level */
- sym_t *d_fpsyms; /* symbols defined in prototype */
- struct dinfo *d_nxt; /* next level */
-} dinfo_t;
-
-/*
- * Type of stack which is used for initialisation of aggregate types.
- */
-typedef struct istk {
- type_t *i_type; /* type of initialisation */
- type_t *i_subt; /* type of next level */
- u_int i_brace : 1; /* need } for pop */
- u_int i_nolimit : 1; /* incomplete array type */
- sym_t *i_mem; /* next structure member */
- int i_cnt; /* # of remaining elements */
- struct istk *i_nxt; /* previous level */
-} istk_t;
-
-/*
- * Used to collect information about pointers and qualifiers in
- * declarators.
- */
-typedef struct pqinf {
- int p_pcnt; /* number of asterisks */
- u_int p_const : 1;
- u_int p_volatile : 1;
- struct pqinf *p_nxt;
-} pqinf_t;
-
-/*
- * Case values are stored in a list of type clst_t.
- */
-typedef struct clst {
- val_t cl_val;
- struct clst *cl_nxt;
-} clst_t;
-
-/*
- * Used to keep informations about nested control statements.
- */
-typedef struct cstk {
- int c_env; /* type of statement (T_IF, ...) */
- u_int c_loop : 1; /* continue && break are valid */
- u_int c_switch : 1; /* case && break are valid */
- u_int c_break : 1; /* loop/switch has break */
- u_int c_cont : 1; /* loop has continue */
- u_int c_default : 1; /* switch has default */
- u_int c_infinite : 1; /* break condition always false
- (for (;;), while (1)) */
- u_int c_rchif : 1; /* end of if-branch reached */
- u_int c_noretval : 1; /* had "return;" */
- u_int c_retval : 1; /* had "return (e);" */
- type_t *c_swtype; /* type of switch expression */
- clst_t *c_clst; /* list of case values */
- struct mbl *c_fexprm; /* saved memory for end of loop
- expression in for() */
- tnode_t *c_f3expr; /* end of loop expr in for() */
- pos_t c_fpos; /* position of end of loop expr */
- pos_t c_cfpos; /* same for csrc_pos */
- struct cstk *c_nxt; /* outer control statement */
-} cstk_t;
-
-#include "externs1.h"
-
-#define ERR_SETSIZE 1024
-#define __NERRBITS (sizeof(unsigned int))
-
-typedef struct err_set {
- unsigned int errs_bits[(ERR_SETSIZE + __NERRBITS-1) / __NERRBITS];
-} err_set;
-
-#define ERR_SET(n, p) \
- ((p)->errs_bits[(n)/__NERRBITS] |= (1 << ((n) % __NERRBITS)))
-#define ERR_CLR(n, p) \
- ((p)->errs_bits[(n)/__NERRBITS] &= ~(1 << ((n) % __NERRBITS)))
-#define ERR_ISSET(n, p) \
- ((p)->errs_bits[(n)/__NERRBITS] & (1 << ((n) % __NERRBITS)))
-#define ERR_ZERO(p) (void)memset((p), 0, sizeof(*(p)))
-
-extern err_set msgset;
diff --git a/usr.bin/xlint/lint1/main1.c b/usr.bin/xlint/lint1/main1.c
deleted file mode 100644
index 29c872f..0000000
--- a/usr.bin/xlint/lint1/main1.c
+++ /dev/null
@@ -1,222 +0,0 @@
-/* $NetBSD: main1.c,v 1.11 2002/01/29 02:43:38 tv Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: main1.c,v 1.11 2002/01/29 02:43:38 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <err.h>
-#include <errno.h>
-#include <limits.h>
-
-#include "lint1.h"
-
-/* set yydebug to 1*/
-int yflag;
-
-/*
- * Print warnings if an assignment of an integertype to another integertype
- * causes an implizit narrowing conversion. If aflag is 1, these warnings
- * are printed only if the source type is at least as wide as long. If aflag
- * is greater than 1, they are always printed.
- */
-int aflag;
-
-/* Print a warning if a break statement cannot be reached. */
-int bflag;
-
-/* Print warnings for pointer casts. */
-int cflag;
-
-/* Print various debug information. */
-int dflag;
-
-/* Perform stricter checking of enum types and operations on enum types. */
-int eflag;
-
-/* Print complete pathnames, not only the basename. */
-int Fflag;
-
-/* Enable some extensions of gcc */
-int gflag;
-
-/* Treat warnings as errors */
-int wflag;
-
-/*
- * Apply a number of heuristic tests to attempt to intuit bugs, improve
- * style, and reduce waste.
- */
-int hflag;
-
-/* Attempt to check portability to other dialects of C. */
-int pflag;
-
-/*
- * In case of redeclarations/redefinitions print the location of the
- * previous declaration/definition.
- */
-int rflag;
-
-/* Strict ANSI C mode. */
-int sflag;
-
-/* Traditional C mode. */
-int tflag;
-
-/*
- * Complain about functions and external variables used and not defined,
- * or defined and not used.
- */
-int uflag = 1;
-
-/* Complain about unused function arguments. */
-int vflag = 1;
-
-/* Complain about structures which are never defined. */
-int zflag = 1;
-
-err_set msgset;
-
-static void usage(void);
-
-int main(int, char *[]);
-
-int
-main(int argc, char *argv[])
-{
- int c;
- char *ptr;
-
- ERR_ZERO(&msgset);
- while ((c = getopt(argc, argv, "abcdeghmprstuvwyzFX:")) != -1) {
- switch (c) {
- case 'a': aflag++; break;
- case 'b': bflag = 1; break;
- case 'c': cflag = 1; break;
- case 'd': dflag = 1; break;
- case 'e': eflag = 1; break;
- case 'F': Fflag = 1; break;
- case 'g': gflag = 1; break;
- case 'h': hflag = 1; break;
- case 'p': pflag = 1; break;
- case 'r': rflag = 1; break;
- case 's': sflag = 1; break;
- case 't': tflag = 1; break;
- case 'u': uflag = 0; break;
- case 'w': wflag = 1; break;
- case 'v': vflag = 0; break;
- case 'y': yflag = 1; break;
- case 'z': zflag = 0; break;
-
- case 'm':
- msglist();
- return(0);
-
- case 'X':
- for (ptr = strtok(optarg, ","); ptr;
- ptr = strtok(NULL, ",")) {
- char *eptr;
- long msg = strtol(ptr, &eptr, 0);
- if ((msg == LONG_MIN || msg == LONG_MAX) &&
- errno == ERANGE)
- err(1, "invalid error message id '%s'",
- ptr);
- if (*eptr || ptr == eptr || msg < 0 ||
- msg >= ERR_SETSIZE)
- errx(1, "invalid error message id '%s'",
- ptr);
- ERR_SET(msg, &msgset);
- }
- break;
- case '?':
- default:
- usage();
- break;
- }
- }
- argc -= optind;
- argv += optind;
-
- if (argc != 2)
- usage();
-
- /* open the input file */
- if ((yyin = fopen(argv[0], "r")) == NULL)
- err(1, "cannot open '%s'", argv[0]);
-
- /* initialize output */
- outopen(argv[1]);
-
- if (yflag)
- yydebug = 1;
-
- initmem();
- initdecl();
- initscan();
- initmtab();
-
- yyparse();
-
- /* Following warnings cannot be suppressed by LINTED */
- nowarn = 0;
-
- chkglsyms();
-
- outclose();
-
- return (nerr != 0);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr,
- "usage: lint1 [-abcdeghmprstuvwyzF] [-X <id>[,<id>]... src dest\n");
- exit(1);
-}
-
-void
-norecover(void)
-{
- /* cannot recover from previous errors */
- error(224);
- exit(1);
-}
diff --git a/usr.bin/xlint/lint1/makeman b/usr.bin/xlint/lint1/makeman
deleted file mode 100644
index 9c25846..0000000
--- a/usr.bin/xlint/lint1/makeman
+++ /dev/null
@@ -1,94 +0,0 @@
-#!/bin/sh
-# $NetBSD$
-#
-# Copyright (c) 2000 The NetBSD Foundation, Inc.
-# All rights reserved.
-#
-# This code is derived from software contributed to The NetBSD Foundation
-# by Christos Zoulas.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the NetBSD
-# Foundation, Inc. and its contributors.
-# 4. Neither the name of The NetBSD Foundation nor the names of its
-# contributors may be used to endorse or promote products derived
-# from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-
-
-cat << \__EOF
-.\" $NetBSD$
-.\"
-.\" Copyright (c) 2000 The NetBSD Foundation, Inc.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to The NetBSD Foundation
-.\" by Christos Zoulas.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the NetBSD
-.\" Foundation, Inc. and its contributors.
-.\" 4. Neither the name of The NetBSD Foundation nor the names of its
-.\" contributors may be used to endorse or promote products derived
-.\" from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-.\" POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd July 5, 2000
-.Dt LINT 7
-.Os
-.Sh NAME
-.Nm lint
-.Nd Lint error message list
-.Sh DESCRIPTION
-The following is a list of message IDs and messages produced by
-.Xr lint 1 .
-It is intended to be used with
-.Fl X
-flag of
-.Xr lint 1 .
-.Bl -column -offset indent "Id#" "Message"
-__EOF
-"$@" | sed -e 's/\\/\\e/g' -e "s/'/\\'/"
-echo ".El"
diff --git a/usr.bin/xlint/lint1/mem1.c b/usr.bin/xlint/lint1/mem1.c
deleted file mode 100644
index 24e911e..0000000
--- a/usr.bin/xlint/lint1/mem1.c
+++ /dev/null
@@ -1,365 +0,0 @@
-/* $NetBSD: mem1.c,v 1.7 2002/01/31 19:36:54 tv Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: mem1.c,v 1.7 2002/01/31 19:36:54 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <err.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "lint1.h"
-
-/*
- * Filenames allocated by fnalloc() and fnnalloc() are shared.
- */
-typedef struct fn {
- char *fn_name;
- size_t fn_len;
- int fn_id;
- struct fn *fn_nxt;
-} fn_t;
-
-static fn_t *fnames;
-
-static fn_t *srchfn(const char *, size_t);
-
-/*
- * Look for a Filename of length l.
- */
-static fn_t *
-srchfn(const char *s, size_t len)
-{
- fn_t *fn;
-
- for (fn = fnames; fn != NULL; fn = fn->fn_nxt) {
- if (fn->fn_len == len && memcmp(fn->fn_name, s, len) == 0)
- break;
- }
- return (fn);
-}
-
-/*
- * Return a shared string for filename s.
- */
-const char *
-fnalloc(const char *s)
-{
-
- return (s != NULL ? fnnalloc(s, strlen(s)) : NULL);
-}
-
-const char *
-fnnalloc(const char *s, size_t len)
-{
- fn_t *fn;
-
- static int nxt_id = 0;
-
- if (s == NULL)
- return (NULL);
-
- if ((fn = srchfn(s, len)) == NULL) {
- if ((fn = malloc(sizeof (fn_t))) == NULL)
- nomem();
- /* Do not used strdup() because string is not NUL-terminated.*/
- if ((fn->fn_name = malloc(len + 1)) == NULL)
- nomem();
- (void)memcpy(fn->fn_name, s, len);
- fn->fn_name[len] = '\0';
- fn->fn_len = len;
- fn->fn_id = nxt_id++;
- fn->fn_nxt = fnames;
- fnames = fn;
- /* Write id of this filename to the output file. */
- outclr();
- outint(fn->fn_id);
- outchar('s');
- outstrg(fn->fn_name);
- }
- return (fn->fn_name);
-}
-
-/*
- * Get id of a filename.
- */
-int
-getfnid(const char *s)
-{
- fn_t *fn;
-
- if (s == NULL || (fn = srchfn(s, strlen(s))) == NULL)
- return (-1);
- return (fn->fn_id);
-}
-
-/*
- * Memory for declarations and other things which must be available
- * until the end of a block (or the end of the translation unit)
- * are assoziated with the level (mblklev) of the block (or wiht 0).
- * Because these memory is allocated in large blocks associated with
- * a given level it can be freed easily at the end of a block.
- */
-#define ML_INC ((size_t)32) /* Increment for length of *mblks */
-
-typedef struct mbl {
- void *blk; /* beginning of memory block */
- void *ffree; /* first free byte */
- size_t nfree; /* # of free bytes */
- size_t size; /* total size of memory block */
- struct mbl *nxt; /* next block */
-} mbl_t;
-
-/*
- * Array of pointers to lists of memory blocks. mblklev is used as
- * index into this array.
- */
-static mbl_t **mblks;
-
-/* number of elements in *mblks */
-static size_t nmblks;
-
-/* free list for memory blocks */
-static mbl_t *frmblks;
-
-/* length of new allocated memory blocks */
-static size_t mblklen;
-
-static void *xgetblk(mbl_t **, size_t);
-static void xfreeblk(mbl_t **);
-static mbl_t *xnewblk(void);
-
-static mbl_t *
-xnewblk(void)
-{
- mbl_t *mb;
- int prot, flags;
-
- if ((mb = malloc(sizeof (mbl_t))) == NULL)
- nomem();
-
- /* use mmap instead of malloc to avoid malloc's size overhead */
-
- prot = PROT_READ | PROT_WRITE;
- flags = MAP_ANON | MAP_PRIVATE;
- mb->blk = mmap(NULL, mblklen, prot, flags, -1, (off_t)0);
- if (mb->blk == (void *)MAP_FAILED)
- err(1, "can't map memory");
-
- mb->size = mblklen;
-
- return (mb);
-}
-
-/*
- * Allocate new memory. If the first block of the list has not enough
- * free space, or there is no first block, get a new block. The new
- * block is taken from the free list or, if there is no block on the
- * free list, is allocated using xnewblk(). If a new block is allocated
- * it is initialized with zero. Blocks taken from the free list are
- * zero'd in xfreeblk().
- */
-static void *
-xgetblk(mbl_t **mbp, size_t s)
-{
- mbl_t *mb;
- void *p;
- size_t t = 0;
-
- s = ALIGN(s);
- if ((mb = *mbp) == NULL || mb->nfree < s) {
- if ((mb = frmblks) == NULL) {
- if (s > mblklen) {
- t = mblklen;
- mblklen = s;
- }
- mb = xnewblk();
- if (t)
- mblklen = t;
- (void)memset(mb->blk, 0, mb->size);
- } else {
- frmblks = mb->nxt;
- }
- mb->ffree = mb->blk;
- mb->nfree = mb->size;;
- mb->nxt = *mbp;
- *mbp = mb;
- }
- p = mb->ffree;
- mb->ffree = (char *)mb->ffree + s;
- mb->nfree -= s;
- return (p);
-}
-
-/*
- * Move all blocks from list *fmbp to free list. For each block, set all
- * used memory to zero.
- */
-static void
-xfreeblk(mbl_t **fmbp)
-{
- mbl_t *mb;
-
- while ((mb = *fmbp) != NULL) {
- *fmbp = mb->nxt;
- mb->nxt = frmblks;
- frmblks = mb;
- (void)memset(mb->blk, 0, mb->size - mb->nfree);
- }
-}
-
-void
-initmem(void)
-{
- int pgsz;
-
- pgsz = getpagesize();
- mblklen = ((MBLKSIZ + pgsz - 1) / pgsz) * pgsz;
-
- if ((mblks = calloc(nmblks = ML_INC, sizeof (mbl_t *))) == NULL)
- nomem();
-}
-
-
-/*
- * Allocate memory associated with level l.
- */
-void *
-getlblk(int l, size_t s)
-{
-
- while (l >= nmblks) {
- if ((mblks = realloc(mblks, (nmblks + ML_INC) *
- sizeof (mbl_t *))) == NULL)
- nomem();
- (void)memset(&mblks[nmblks], 0, ML_INC * sizeof (mbl_t *));
- nmblks += ML_INC;
- }
- return (xgetblk(&mblks[l], s));
-}
-
-void *
-getblk(size_t s)
-{
-
- return (getlblk(mblklev, s));
-}
-
-/*
- * Free all memory associated with level l.
- */
-void
-freelblk(int l)
-{
-
- xfreeblk(&mblks[l]);
-}
-
-void
-freeblk(void)
-{
-
- freelblk(mblklev);
-}
-
-/*
- * tgetblk() returns memory which is associated with the current
- * expression.
- */
-static mbl_t *tmblk;
-
-void *
-tgetblk(size_t s)
-{
-
- return (xgetblk(&tmblk, s));
-}
-
-/*
- * Get memory for a new tree node.
- */
-tnode_t *
-getnode(void)
-{
-
- return (tgetblk(sizeof (tnode_t)));
-}
-
-/*
- * Free all memory which is allocated by the current expression.
- */
-void
-tfreeblk(void)
-{
-
- xfreeblk(&tmblk);
-}
-
-/*
- * Save the memory which is used by the current expression. This memory
- * is not freed by the next tfreeblk() call. The pointer returned can be
- * used to restore the memory.
- */
-mbl_t *
-tsave(void)
-{
- mbl_t *tmem;
-
- tmem = tmblk;
- tmblk = NULL;
- return (tmem);
-}
-
-/*
- * Free all memory used for the current expression and the memory used
- * be a previous expression and saved by tsave(). The next call to
- * tfreeblk() frees the restored memory.
- */
-void
-trestor(mbl_t *tmem)
-{
-
- tfreeblk();
- if (tmblk != NULL) {
- free(tmblk->blk);
- free(tmblk);
- }
- tmblk = tmem;
-}
diff --git a/usr.bin/xlint/lint1/op.h b/usr.bin/xlint/lint1/op.h
deleted file mode 100644
index 042195a..0000000
--- a/usr.bin/xlint/lint1/op.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/* $NetBSD: op.h,v 1.2 1995/07/03 21:24:27 cgd Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Various information about operators
- */
-typedef struct {
- u_int m_binary : 1; /* binary op. */
- u_int m_logop : 1; /* logical op., result is int */
- u_int m_rqint : 1; /* operands must have integer type */
- u_int m_rqsclt : 1; /* operands must have scalar type */
- u_int m_rqatyp : 1; /* operands must have arithmetic type */
- u_int m_fold : 1; /* operands should be folded */
- u_int m_vctx : 1; /* value context for left operand */
- u_int m_tctx : 1; /* test context for left operand */
- u_int m_balance : 1; /* op. requires balancing */
- u_int m_sideeff : 1; /* op. has side effect */
- u_int m_tlansiu : 1; /* warning if left op. is unsign. in ANSI C */
- u_int m_transiu : 1; /* warning if right op. is unsign. in ANSI C */
- u_int m_tpconf : 1; /* test possible precedence confusion */
- u_int m_comp : 1; /* op. performs comparison */
- u_int m_enumop : 1; /* valid operation on enums */
- u_int m_badeop : 1; /* dubious operation on enums */
- u_int m_eqwarn : 1; /* warning if on operand stems from == */
- const char *m_name; /* name of op. */
-} mod_t;
-
-typedef enum {
- NOOP = 0,
- ARROW,
- POINT,
- NOT,
- COMPL,
- INC,
- DEC,
- INCBEF,
- DECBEF,
- INCAFT,
- DECAFT,
- UPLUS,
- UMINUS,
- STAR,
- AMPER,
- MULT,
- DIV,
- MOD,
- PLUS,
- MINUS,
- SHL,
- SHR,
- LT,
- LE,
- GT,
- GE,
- EQ,
- NE,
- AND,
- XOR,
- OR,
- LOGAND,
- LOGOR,
- QUEST,
- COLON,
- ASSIGN,
- MULASS,
- DIVASS,
- MODASS,
- ADDASS,
- SUBASS,
- SHLASS,
- SHRASS,
- ANDASS,
- XORASS,
- ORASS,
- NAME,
- CON,
- STRING,
- FSEL,
- CALL,
- COMMA,
- CVT,
- ICALL,
- LOAD,
- PUSH,
- RETURN,
- INIT, /* pseudo op, not used in trees */
- CASE, /* pseudo op, not used in trees */
- FARG /* pseudo op, not used in trees */
-#define NOPS ((int)FARG + 1)
-} op_t;
diff --git a/usr.bin/xlint/lint1/param.h b/usr.bin/xlint/lint1/param.h
deleted file mode 100644
index 27de692..0000000
--- a/usr.bin/xlint/lint1/param.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/* $NetBSD: param.h,v 1.4 1995/07/23 18:14:41 ragge Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/*
- * Minimun size of string buffer. If this is not enough, the buffer
- * is enlarged in steps of STRBLEN bytes.
- */
-#define STRBLEN 256
-
-/*
- * This defines the size of memory blocks which are used to allocate
- * memory in larger chunks.
- */
-#define MBLKSIZ ((size_t)0x4000)
-
-/*
- * Sizes of hash tables
- * Should be a prime. Possible primes are
- * 307, 401, 503, 601, 701, 809, 907, 1009, 1103, 1201, 1301, 1409, 1511.
- *
- * HSHSIZ1 symbol table 1st pass
- * HSHSIZ2 symbol table 2nd pass
- * THSHSIZ2 type table 2nd pass
- */
-#define HSHSIZ1 503
-#define HSHSIZ2 1009
-#define THSHSIZ2 1009
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long.
- */
-#ifdef __ia64__
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-#elif __amd64__
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-#elif __alpha__
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-#elif __i386__
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-#elif __m68k__
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-#elif __ns32k__
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-#elif __powerpc__
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-#elif __sparc__
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-#elif __sparc64__
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-#elif __vax__
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-#elif __arm__
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-#elif __mips__
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-#else
-#error unknown machine type
-#endif
-
-/*
- * Make sure this matches wchar_t.
- */
-#define WCHAR SHORT
-
-#ifndef __GNUC__
-#ifndef lint
-#ifndef QUAD_MAX /* necessary for mkdep */
-#define QUAD_MAX LONG_MAX
-#define QUAD_MIN LONG_MIN
-#define UQUAD_MAX ULONG_MAX
-#endif
-typedef long quad_t;
-typedef u_long u_quad_t;
-#endif
-#endif
-
-
-/*
- * long double only in ANSI C.
- */
-#ifdef __STDC__
-typedef long double ldbl_t;
-#else
-typedef double ldbl_t;
-#endif
-
-/*
- * Some traditional compilers are not able to assign structures.
- */
-#ifdef __STDC__
-#define STRUCT_ASSIGN(dest, src) (dest) = (src)
-#else
-#define STRUCT_ASSIGN(dest, src) (void)memcpy(&(dest), &(src), \
- sizeof (dest));
-#endif
diff --git a/usr.bin/xlint/lint1/scan.l b/usr.bin/xlint/lint1/scan.l
deleted file mode 100644
index ea5a2c5..0000000
--- a/usr.bin/xlint/lint1/scan.l
+++ /dev/null
@@ -1,1478 +0,0 @@
-%{
-/* $NetBSD: scan.l,v 1.26 2002/01/31 22:30:21 tv Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: scan.l,v 1.26 2002/01/31 22:30:21 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-#include <float.h>
-#include <ctype.h>
-#include <errno.h>
-#include <err.h>
-#include <math.h>
-
-#include "lint1.h"
-#include "cgram.h"
-
-#define CHAR_MASK (~(~0 << CHAR_BIT))
-#define YY_NO_UNPUT
-
-/* Current position (its also updated when an included file is parsed) */
-pos_t curr_pos = { 1, "", 0 };
-
-/*
- * Current position in C source (not updated when an included file is
- * parsed).
- */
-pos_t csrc_pos = { 1, "", 0 };
-
-static void incline(void);
-static void badchar(int);
-static sbuf_t *allocsb(void);
-static void freesb(sbuf_t *);
-static int inpc(void);
-static int hash(const char *);
-static sym_t *search(sbuf_t *);
-static int name(void);
-static int keyw(sym_t *);
-static int icon(int);
-static int fcon(void);
-static int operator(int, op_t);
-static int ccon(void);
-static int wccon(void);
-static int getescc(int);
-static void directive(void);
-static void comment(void);
-static void slashslashcomment(void);
-static int string(void);
-static int wcstrg(void);
-
-%}
-
-L [_A-Za-z]
-D [0-9]
-NZD [1-9]
-OD [0-7]
-HD [0-9A-Fa-f]
-EX ([eE][+-]?[0-9]+)
-
-%%
-
-{L}({L}|{D})* return (name());
-0{OD}*[lLuU]* return (icon(8));
-{NZD}{D}*[lLuU]* return (icon(10));
-0[xX]{HD}+[lLuU]* return (icon(16));
-{D}+\.{D}*{EX}?[fFlL]? |
-{D}+{EX}[fFlL]? |
-\.{D}+{EX}?[fFlL]? return (fcon());
-"=" return (operator(T_ASSIGN, ASSIGN));
-"*=" return (operator(T_OPASS, MULASS));
-"/=" return (operator(T_OPASS, DIVASS));
-"%=" return (operator(T_OPASS, MODASS));
-"+=" return (operator(T_OPASS, ADDASS));
-"-=" return (operator(T_OPASS, SUBASS));
-"<<=" return (operator(T_OPASS, SHLASS));
-">>=" return (operator(T_OPASS, SHRASS));
-"&=" return (operator(T_OPASS, ANDASS));
-"^=" return (operator(T_OPASS, XORASS));
-"|=" return (operator(T_OPASS, ORASS));
-"||" return (operator(T_LOGOR, LOGOR));
-"&&" return (operator(T_LOGAND, LOGAND));
-"|" return (operator(T_OR, OR));
-"&" return (operator(T_AND, AND));
-"^" return (operator(T_XOR, XOR));
-"==" return (operator(T_EQOP, EQ));
-"!=" return (operator(T_EQOP, NE));
-"<" return (operator(T_RELOP, LT));
-">" return (operator(T_RELOP, GT));
-"<=" return (operator(T_RELOP, LE));
-">=" return (operator(T_RELOP, GE));
-"<<" return (operator(T_SHFTOP, SHL));
-">>" return (operator(T_SHFTOP, SHR));
-"++" return (operator(T_INCDEC, INC));
-"--" return (operator(T_INCDEC, DEC));
-"->" return (operator(T_STROP, ARROW));
-"." return (operator(T_STROP, POINT));
-"+" return (operator(T_ADDOP, PLUS));
-"-" return (operator(T_ADDOP, MINUS));
-"*" return (operator(T_MULT, MULT));
-"/" return (operator(T_DIVOP, DIV));
-"%" return (operator(T_DIVOP, MOD));
-"!" return (operator(T_UNOP, NOT));
-"~" return (operator(T_UNOP, COMPL));
-"\"" return (string());
-"L\"" return (wcstrg());
-";" return (T_SEMI);
-"{" return (T_LBRACE);
-"}" return (T_RBRACE);
-"," return (T_COMMA);
-":" return (T_COLON);
-"?" return (T_QUEST);
-"[" return (T_LBRACK);
-"]" return (T_RBRACK);
-"(" return (T_LPARN);
-")" return (T_RPARN);
-"..." return (T_ELLIPSE);
-"'" return (ccon());
-"L'" return (wccon());
-^#.*$ directive();
-\n incline();
-\t|" "|\f|\v ;
-"/*" comment();
-"//" slashslashcomment();
-. badchar(yytext[0]);
-
-%%
-
-static void
-incline(void)
-{
- curr_pos.p_line++;
- curr_pos.p_uniq = 0;
- if (curr_pos.p_file == csrc_pos.p_file) {
- csrc_pos.p_line++;
- csrc_pos.p_uniq = 0;
- }
-}
-
-static void
-badchar(int c)
-{
-
- /* unknown character \%o */
- error(250, c);
-}
-
-/*
- * Keywords.
- * During initialisation they are written to the symbol table.
- */
-static struct kwtab {
- const char *kw_name; /* keyword */
- int kw_token; /* token returned by yylex() */
- scl_t kw_scl; /* storage class if kw_token T_SCLASS */
- tspec_t kw_tspec; /* type spec. if kw_token T_TYPE or T_SOU */
- tqual_t kw_tqual; /* type qual. fi kw_token T_QUAL */
- u_int kw_stdc : 1; /* STDC keyword */
- u_int kw_gcc : 1; /* GCC keyword */
-} kwtab[] = {
- { "asm", T_ASM, 0, 0, 0, 0, 1 },
- { "__asm", T_ASM, 0, 0, 0, 0, 0 },
- { "__asm__", T_ASM, 0, 0, 0, 0, 0 },
- { "auto", T_SCLASS, AUTO, 0, 0, 0, 0 },
- { "break", T_BREAK, 0, 0, 0, 0, 0 },
- { "case", T_CASE, 0, 0, 0, 0, 0 },
- { "char", T_TYPE, 0, CHAR, 0, 0, 0 },
- { "const", T_QUAL, 0, 0, CONST, 1, 0 },
- { "__const__", T_QUAL, 0, 0, CONST, 0, 0 },
- { "__const", T_QUAL, 0, 0, CONST, 0, 0 },
- { "continue", T_CONTINUE, 0, 0, 0, 0, 0 },
- { "default", T_DEFAULT, 0, 0, 0, 0, 0 },
- { "do", T_DO, 0, 0, 0, 0, 0 },
- { "double", T_TYPE, 0, DOUBLE, 0, 0, 0 },
- { "else", T_ELSE, 0, 0, 0, 0, 0 },
- { "enum", T_ENUM, 0, 0, 0, 0, 0 },
- { "extern", T_SCLASS, EXTERN, 0, 0, 0, 0 },
- { "float", T_TYPE, 0, FLOAT, 0, 0, 0 },
- { "for", T_FOR, 0, 0, 0, 0, 0 },
- { "goto", T_GOTO, 0, 0, 0, 0, 0 },
- { "if", T_IF, 0, 0, 0, 0, 0 },
- { "inline", T_SCLASS, INLINE, 0, 0, 0, 1 },
- { "__inline__", T_SCLASS, INLINE, 0, 0, 0, 0 },
- { "__inline", T_SCLASS, INLINE, 0, 0, 0, 0 },
- { "int", T_TYPE, 0, INT, 0, 0, 0 },
- { "__symbolrename", T_SYMBOLRENAME, 0, 0, 0, 0, 0 },
- { "long", T_TYPE, 0, LONG, 0, 0, 0 },
- { "register", T_SCLASS, REG, 0, 0, 0, 0 },
- { "return", T_RETURN, 0, 0, 0, 0, 0 },
- { "short", T_TYPE, 0, SHORT, 0, 0, 0 },
- { "signed", T_TYPE, 0, SIGNED, 0, 1, 0 },
- { "__signed__", T_TYPE, 0, SIGNED, 0, 0, 0 },
- { "__signed", T_TYPE, 0, SIGNED, 0, 0, 0 },
- { "sizeof", T_SIZEOF, 0, 0, 0, 0, 0 },
- { "static", T_SCLASS, STATIC, 0, 0, 0, 0 },
- { "struct", T_SOU, 0, STRUCT, 0, 0, 0 },
- { "switch", T_SWITCH, 0, 0, 0, 0, 0 },
- { "typedef", T_SCLASS, TYPEDEF, 0, 0, 0, 0 },
- { "union", T_SOU, 0, UNION, 0, 0, 0 },
- { "unsigned", T_TYPE, 0, UNSIGN, 0, 0, 0 },
- { "void", T_TYPE, 0, VOID, 0, 0, 0 },
- { "volatile", T_QUAL, 0, 0, VOLATILE, 1, 0 },
- { "__volatile__", T_QUAL, 0, 0, VOLATILE, 0, 0 },
- { "__volatile", T_QUAL, 0, 0, VOLATILE, 0, 0 },
- { "while", T_WHILE, 0, 0, 0, 0, 0 },
- { NULL, 0, 0, 0, 0, 0, 0 }
-};
-
-/* Symbol table */
-static sym_t *symtab[HSHSIZ1];
-
-/* bit i of the entry with index i is set */
-uint64_t qbmasks[sizeof(uint64_t) * CHAR_BIT];
-
-/* least significant i bits are set in the entry with index i */
-uint64_t qlmasks[sizeof(uint64_t) * CHAR_BIT + 1];
-
-/* least significant i bits are not set in the entry with index i */
-uint64_t qumasks[sizeof(uint64_t) * CHAR_BIT + 1];
-
-/* free list for sbuf structures */
-static sbuf_t *sbfrlst;
-
-/* Typ of next expected symbol */
-symt_t symtyp;
-
-
-/*
- * All keywords are written to the symbol table. This saves us looking
- * in an extra table for each name we found.
- */
-void
-initscan(void)
-{
- struct kwtab *kw;
- sym_t *sym;
- int h, i;
- uint64_t uq;
-
- for (kw = kwtab; kw->kw_name != NULL; kw++) {
- if (kw->kw_stdc && tflag)
- continue;
- if (kw->kw_gcc && !gflag)
- continue;
- sym = getblk(sizeof (sym_t));
- sym->s_name = kw->kw_name;
- sym->s_keyw = 1;
- sym->s_value.v_quad = kw->kw_token;
- if (kw->kw_token == T_TYPE || kw->kw_token == T_SOU) {
- sym->s_tspec = kw->kw_tspec;
- } else if (kw->kw_token == T_SCLASS) {
- sym->s_scl = kw->kw_scl;
- } else if (kw->kw_token == T_QUAL) {
- sym->s_tqual = kw->kw_tqual;
- }
- h = hash(sym->s_name);
- if ((sym->s_link = symtab[h]) != NULL)
- symtab[h]->s_rlink = &sym->s_link;
- (symtab[h] = sym)->s_rlink = &symtab[h];
- }
-
- /* initialize bit-masks for quads */
- for (i = 0; i < sizeof (uint64_t) * CHAR_BIT; i++) {
- qbmasks[i] = (uint64_t)1 << i;
- uq = ~(uint64_t)0 << i;
- qumasks[i] = uq;
- qlmasks[i] = ~uq;
- }
- qumasks[i] = 0;
- qlmasks[i] = ~(uint64_t)0;
-}
-
-/*
- * Get a free sbuf structure, if possible from the free list
- */
-static sbuf_t *
-allocsb(void)
-{
- sbuf_t *sb;
-
- if ((sb = sbfrlst) != NULL) {
- sbfrlst = sb->sb_nxt;
- } else {
- if ((sb = malloc(sizeof (sbuf_t))) == NULL)
- nomem();
- }
- (void)memset(sb, 0, sizeof (sb));
- return (sb);
-}
-
-/*
- * Put a sbuf structure to the free list
- */
-static void
-freesb(sbuf_t *sb)
-{
-
- sb->sb_nxt = sbfrlst;
- sbfrlst = sb;
-}
-
-/*
- * Read a character and ensure that it is positive (except EOF).
- * Increment line count(s) if necessary.
- */
-static int
-inpc(void)
-{
- int c;
-
- if ((c = input()) != EOF && (c &= CHAR_MASK) == '\n')
- incline();
- return (c);
-}
-
-static int
-hash(const char *s)
-{
- u_int v;
- const u_char *us;
-
- v = 0;
- for (us = (const u_char *)s; *us != '\0'; us++) {
- v = (v << sizeof (v)) + *us;
- v ^= v >> (sizeof (v) * CHAR_BIT - sizeof (v));
- }
- return (v % HSHSIZ1);
-}
-
-/*
- * Lex has found a letter followed by zero or more letters or digits.
- * It looks for a symbol in the symbol table with the same name. This
- * symbol must either be a keyword or a symbol of the type required by
- * symtyp (label, member, tag, ...).
- *
- * If it is a keyword, the token is returned. In some cases it is described
- * more deeply by data written to yylval.
- *
- * If it is a symbol, T_NAME is returned and the pointer to a sbuf struct
- * is stored in yylval. This struct contains the name of the symbol, it's
- * length and hash value. If there is already a symbol of the same name
- * and type in the symbol table, the sbuf struct also contains a pointer
- * to the symbol table entry.
- */
-static int
-name(void)
-{
- char *s;
- sbuf_t *sb;
- sym_t *sym;
- int tok;
-
- sb = allocsb();
- sb->sb_name = yytext;
- sb->sb_len = yyleng;
- sb->sb_hash = hash(yytext);
-
- if ((sym = search(sb)) != NULL && sym->s_keyw) {
- freesb(sb);
- return (keyw(sym));
- }
-
- sb->sb_sym = sym;
-
- if (sym != NULL) {
- if (blklev < sym->s_blklev)
- lerror("name() 1");
- sb->sb_name = sym->s_name;
- sb->sb_len = strlen(sym->s_name);
- tok = sym->s_scl == TYPEDEF ? T_TYPENAME : T_NAME;
- } else {
- s = getblk(yyleng + 1);
- (void)memcpy(s, yytext, yyleng + 1);
- sb->sb_name = s;
- sb->sb_len = yyleng;
- tok = T_NAME;
- }
-
- yylval.y_sb = sb;
- return (tok);
-}
-
-static sym_t *
-search(sbuf_t *sb)
-{
- sym_t *sym;
-
- for (sym = symtab[sb->sb_hash]; sym != NULL; sym = sym->s_link) {
- if (strcmp(sym->s_name, sb->sb_name) == 0) {
- if (sym->s_keyw || sym->s_kind == symtyp)
- return (sym);
- }
- }
-
- return (NULL);
-}
-
-static int
-keyw(sym_t *sym)
-{
- int t;
-
- if ((t = (int)sym->s_value.v_quad) == T_SCLASS) {
- yylval.y_scl = sym->s_scl;
- } else if (t == T_TYPE || t == T_SOU) {
- yylval.y_tspec = sym->s_tspec;
- } else if (t == T_QUAL) {
- yylval.y_tqual = sym->s_tqual;
- }
- return (t);
-}
-
-/*
- * Convert a string representing an integer into internal representation.
- * The value is returned in yylval. icon() (and yylex()) returns T_CON.
- */
-static int
-icon(int base)
-{
- int l_suffix, u_suffix;
- int len;
- const char *cp;
- char c, *eptr;
- tspec_t typ;
- u_long ul = 0;
- uint64_t uq = 0;
- int ansiu;
- static tspec_t contypes[2][3] = {
- { INT, LONG, QUAD },
- { UINT, ULONG, UQUAD }
- };
-
- cp = yytext;
- len = yyleng;
-
- /* skip 0x */
- if (base == 16) {
- cp += 2;
- len -= 2;
- }
-
- /* read suffixes */
- l_suffix = u_suffix = 0;
- for ( ; ; ) {
- if ((c = cp[len - 1]) == 'l' || c == 'L') {
- l_suffix++;
- } else if (c == 'u' || c == 'U') {
- u_suffix++;
- } else {
- break;
- }
- len--;
- }
- if (l_suffix > 2 || u_suffix > 1) {
- /* malformed integer constant */
- warning(251);
- if (l_suffix > 2)
- l_suffix = 2;
- if (u_suffix > 1)
- u_suffix = 1;
- }
- if (tflag && u_suffix != 0) {
- /* suffix U is illegal in traditional C */
- warning(97);
- }
- typ = contypes[u_suffix][l_suffix];
-
- errno = 0;
- if (l_suffix < 2) {
- ul = strtoul(cp, &eptr, base);
- } else {
- uq = strtouq(cp, &eptr, base);
- }
- if (eptr != cp + len)
- lerror("icon() 1");
- if (errno != 0)
- /* integer constant out of range */
- warning(252);
-
- /*
- * If the value is to big for the current type, we must choose
- * another type.
- */
- ansiu = 0;
- switch (typ) {
- case INT:
- if (ul <= INT_MAX) {
- /* ok */
- } else if (ul <= (unsigned)UINT_MAX && base != 10) {
- typ = UINT;
- } else if (ul <= LONG_MAX) {
- typ = LONG;
- } else {
- typ = ULONG;
- }
- if (typ == UINT || typ == ULONG) {
- if (tflag) {
- typ = LONG;
- } else if (!sflag) {
- /*
- * Remember that the constant is unsigned
- * only in ANSI C
- */
- ansiu = 1;
- }
- }
- break;
- case UINT:
- if (ul > (u_int)UINT_MAX)
- typ = ULONG;
- break;
- case LONG:
- if (ul > LONG_MAX && !tflag) {
- typ = ULONG;
- if (!sflag)
- ansiu = 1;
- }
- break;
- case QUAD:
- if (uq > QUAD_MAX && !tflag) {
- typ = UQUAD;
- if (!sflag)
- ansiu = 1;
- }
- break;
- /* LINTED (enumeration values not handled in switch) */
- case STRUCT:
- case VOID:
- case LDOUBLE:
- case FUNC:
- case ARRAY:
- case PTR:
- case ENUM:
- case UNION:
- case SIGNED:
- case NOTSPEC:
- case DOUBLE:
- case FLOAT:
- case UQUAD:
- case ULONG:
- case USHORT:
- case SHORT:
- case UCHAR:
- case SCHAR:
- case CHAR:
- case UNSIGN:
- break;
-
- case NTSPEC: /* this value unused */
- break;
- }
-
- if (typ != QUAD && typ != UQUAD) {
- if (isutyp(typ)) {
- uq = ul;
- } else {
- uq = (int64_t)(long)ul;
- }
- }
-
- uq = (uint64_t)xsign((int64_t)uq, typ, -1);
-
- if ((yylval.y_val = calloc(1, sizeof(val_t))) == NULL)
- nomem();
- yylval.y_val->v_tspec = typ;
- yylval.y_val->v_ansiu = ansiu;
- yylval.y_val->v_quad = (int64_t)uq;
-
- return (T_CON);
-}
-
-/*
- * Returns 1 if t is a signed type and the value is negative.
- *
- * len is the number of significant bits. If len is -1, len is set
- * to the width of type t.
- */
-int
-sign(int64_t q, tspec_t t, int len)
-{
-
- if (t == PTR || isutyp(t))
- return (0);
- return (msb(q, t, len));
-}
-
-int
-msb(int64_t q, tspec_t t, int len)
-{
-
- if (len <= 0)
- len = size(t);
- return ((q & qbmasks[len - 1]) != 0);
-}
-
-/*
- * Extends the sign of q.
- */
-int64_t
-xsign(int64_t q, tspec_t t, int len)
-{
-
- if (len <= 0)
- len = size(t);
-
- if (t == PTR || isutyp(t) || !sign(q, t, len)) {
- q &= qlmasks[len];
- } else {
- q |= qumasks[len];
- }
- return (q);
-}
-
-/*
- * Convert a string representing a floating point value into its interal
- * representation. Type and value are returned in yylval. fcon()
- * (and yylex()) returns T_CON.
- * XXX Currently it is not possible to convert constants of type
- * long double which are greater than DBL_MAX.
- */
-static int
-fcon(void)
-{
- const char *cp;
- int len;
- tspec_t typ;
- char c, *eptr;
- double d;
- float f = 0;
-
- cp = yytext;
- len = yyleng;
-
- if ((c = cp[len - 1]) == 'f' || c == 'F') {
- typ = FLOAT;
- len--;
- } else if (c == 'l' || c == 'L') {
- typ = LDOUBLE;
- len--;
- } else {
- typ = DOUBLE;
- }
-
- if (tflag && typ != DOUBLE) {
- /* suffixes F and L are illegal in traditional C */
- warning(98);
- }
-
- errno = 0;
- d = strtod(cp, &eptr);
- if (eptr != cp + len)
- lerror("fcon() 1");
- if (errno != 0)
- /* floating-point constant out of range */
- warning(248);
-
- if (typ == FLOAT) {
- f = (float)d;
- if (!finite(f)) {
- /* floating-point constant out of range */
- warning(248);
- f = f > 0 ? FLT_MAX : -FLT_MAX;
- }
- }
-
- if ((yylval.y_val = calloc(1, sizeof (val_t))) == NULL)
- nomem();
- yylval.y_val->v_tspec = typ;
- if (typ == FLOAT) {
- yylval.y_val->v_ldbl = f;
- } else {
- yylval.y_val->v_ldbl = d;
- }
-
- return (T_CON);
-}
-
-static int
-operator(int t, op_t o)
-{
-
- yylval.y_op = o;
- return (t);
-}
-
-/*
- * Called if lex found a leading \'.
- */
-static int
-ccon(void)
-{
- int n, val, c;
- char cv;
-
- n = 0;
- val = 0;
- while ((c = getescc('\'')) >= 0) {
- val = (val << CHAR_BIT) + c;
- n++;
- }
- if (c == -2) {
- /* unterminated character constant */
- error(253);
- } else {
- if (n > sizeof (int) || (n > 1 && (pflag || hflag))) {
- /* too many characters in character constant */
- error(71);
- } else if (n > 1) {
- /* multi-character character constant */
- warning(294);
- } else if (n == 0) {
- /* empty character constant */
- error(73);
- }
- }
- if (n == 1) {
- cv = (char)val;
- val = cv;
- }
-
- yylval.y_val = xcalloc(1, sizeof (val_t));
- yylval.y_val->v_tspec = INT;
- yylval.y_val->v_quad = val;
-
- return (T_CON);
-}
-
-/*
- * Called if lex found a leading L\'
- */
-static int
-wccon(void)
-{
- static char buf[MB_LEN_MAX + 1];
- int i, c;
- wchar_t wc;
-
- i = 0;
- while ((c = getescc('\'')) >= 0) {
- if (i < MB_CUR_MAX)
- buf[i] = (char)c;
- i++;
- }
-
- wc = 0;
-
- if (c == -2) {
- /* unterminated character constant */
- error(253);
- } else if (c == 0) {
- /* empty character constant */
- error(73);
- } else {
- if (i > MB_CUR_MAX) {
- i = MB_CUR_MAX;
- /* too many characters in character constant */
- error(71);
- } else {
- buf[i] = '\0';
- (void)mbtowc(NULL, NULL, 0);
- if (mbtowc(&wc, buf, MB_CUR_MAX) < 0)
- /* invalid multibyte character */
- error(291);
- }
- }
-
- if ((yylval.y_val = calloc(1, sizeof (val_t))) == NULL)
- nomem();
- yylval.y_val->v_tspec = WCHAR;
- yylval.y_val->v_quad = wc;
-
- return (T_CON);
-}
-
-/*
- * Read a character which is part of a character constant or of a string
- * and handle escapes.
- *
- * The Argument is the character which delimits the character constant or
- * string.
- *
- * Returns -1 if the end of the character constant or string is reached,
- * -2 if the EOF is reached, and the character otherwise.
- */
-static int
-getescc(int d)
-{
- static int pbc = -1;
- int n, c, v;
-
- if (pbc == -1) {
- c = inpc();
- } else {
- c = pbc;
- pbc = -1;
- }
- if (c == d)
- return (-1);
- switch (c) {
- case '\n':
- if (tflag) {
- /* newline in string or char constant */
- error(254);
- return (-2);
- }
- return (c);
- case EOF:
- return (-2);
- case '\\':
- switch (c = inpc()) {
- case '"':
- if (tflag && d == '\'')
- /* \" inside character constant undef. ... */
- warning(262);
- return ('"');
- case '\'':
- return ('\'');
- case '?':
- if (tflag)
- /* \? undefined in traditional C */
- warning(263);
- return ('?');
- case '\\':
- return ('\\');
- case 'a':
- if (tflag)
- /* \a undefined in traditional C */
- warning(81);
- return ('\a');
- case 'b':
- return ('\b');
- case 'f':
- return ('\f');
- case 'n':
- return ('\n');
- case 'r':
- return ('\r');
- case 't':
- return ('\t');
- case 'v':
- if (tflag)
- /* \v undefined in traditional C */
- warning(264);
- return ('\v');
- case '8': case '9':
- /* bad octal digit %c */
- warning(77, c);
- /* FALLTHROUGH */
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- n = 3;
- v = 0;
- do {
- v = (v << 3) + (c - '0');
- c = inpc();
- } while (--n && isdigit(c) && (tflag || c <= '7'));
- if (tflag && n > 0 && isdigit(c))
- /* bad octal digit %c */
- warning(77, c);
- pbc = c;
- if (v > UCHAR_MAX) {
- /* character escape does not fit in char. */
- warning(76);
- v &= CHAR_MASK;
- }
- return (v);
- case 'x':
- if (tflag)
- /* \x undefined in traditional C */
- warning(82);
- v = 0;
- n = 0;
- while ((c = inpc()) >= 0 && isxdigit(c)) {
- c = isdigit(c) ?
- c - '0' : toupper(c) - 'A' + 10;
- v = (v << 4) + c;
- if (n >= 0) {
- if ((v & ~CHAR_MASK) != 0) {
- /* overflow in hex escape */
- warning(75);
- n = -1;
- } else {
- n++;
- }
- }
- }
- pbc = c;
- if (n == 0) {
- /* no hex digits follow \x */
- error(74);
- } if (n == -1) {
- v &= CHAR_MASK;
- }
- return (v);
- case '\n':
- return (getescc(d));
- case EOF:
- return (-2);
- default:
- if (isprint(c)) {
- /* dubious escape \%c */
- warning(79, c);
- } else {
- /* dubious escape \%o */
- warning(80, c);
- }
- }
- }
- return (c);
-}
-
-/*
- * Called for preprocessor directives. Currently implemented are:
- * # lineno
- * # lineno "filename"
- */
-static void
-directive(void)
-{
- const char *cp, *fn;
- char c, *eptr;
- size_t fnl;
- long ln;
- static int first = 1;
-
- /* Go to first non-whitespace after # */
- for (cp = yytext + 1; (c = *cp) == ' ' || c == '\t'; cp++)
- continue;
-
- if (!isdigit((unsigned char)c)) {
- error:
- /* undefined or invalid # directive */
- warning(255);
- return;
- }
- ln = strtol(--cp, &eptr, 10);
- if (cp == eptr)
- goto error;
- if ((c = *(cp = eptr)) != ' ' && c != '\t' && c != '\0')
- goto error;
- while ((c = *cp++) == ' ' || c == '\t')
- continue;
- if (c != '\0') {
- if (c != '"')
- goto error;
- fn = cp;
- while ((c = *cp) != '"' && c != '\0')
- cp++;
- if (c != '"')
- goto error;
- if ((fnl = cp++ - fn) > PATH_MAX)
- goto error;
- while ((c = *cp++) == ' ' || c == '\t')
- continue;
-#if 0
- if (c != '\0')
- warning("extra character(s) after directive");
-#endif
-
- /* empty string means stdin */
- if (fnl == 0) {
- fn = "{standard input}";
- fnl = 16; /* strlen (fn) */
- }
- curr_pos.p_file = fnnalloc(fn, fnl);
- /*
- * If this is the first directive, the name is the name
- * of the C source file as specified at the command line.
- * It is written to the output file.
- */
- if (first) {
- csrc_pos.p_file = curr_pos.p_file;
- outsrc(curr_pos.p_file);
- first = 0;
- }
- }
- curr_pos.p_line = (int)ln - 1;
- curr_pos.p_uniq = 0;
- if (curr_pos.p_file == csrc_pos.p_file) {
- csrc_pos.p_line = (int)ln - 1;
- csrc_pos.p_uniq = 0;
- }
-}
-
-/*
- * Handle lint comments. Following comments are currently understood:
- * ARGSUSEDn
- * BITFIELDTYPE
- * CONSTCOND CONSTANTCOND CONSTANTCONDITION
- * FALLTHRU FALLTHROUGH
- * LINTLIBRARY
- * LINTED NOSTRICT
- * LONGLONG
- * NOTREACHED
- * PRINTFLIKEn
- * PROTOLIB
- * SCANFLIKEn
- * VARARGSn
- * If one of this comments is recognized, the arguments, if any, are
- * parsed and a function which handles this comment is called.
- */
-static void
-comment(void)
-{
- int c, lc;
- static struct {
- const char *keywd;
- int arg;
- void (*func)(int);
- } keywtab[] = {
- { "ARGSUSED", 1, argsused },
- { "BITFIELDTYPE", 0, bitfieldtype },
- { "CONSTCOND", 0, constcond },
- { "CONSTANTCOND", 0, constcond },
- { "CONSTANTCONDITION", 0, constcond },
- { "FALLTHRU", 0, fallthru },
- { "FALLTHROUGH", 0, fallthru },
- { "LINTLIBRARY", 0, lintlib },
- { "LINTED", 0, linted },
- { "LONGLONG", 0, longlong },
- { "NOSTRICT", 0, linted },
- { "NOTREACHED", 0, notreach },
- { "PRINTFLIKE", 1, printflike },
- { "PROTOLIB", 1, protolib },
- { "SCANFLIKE", 1, scanflike },
- { "VARARGS", 1, varargs },
- };
- char keywd[32];
- char arg[32];
- int l, i, a;
- int eoc;
-
- eoc = 0;
-
- /* Skip white spaces after the start of the comment */
- while ((c = inpc()) != EOF && isspace(c))
- continue;
-
- /* Read the potential keyword to keywd */
- l = 0;
- while (c != EOF && isupper(c) && l < sizeof (keywd) - 1) {
- keywd[l++] = (char)c;
- c = inpc();
- }
- keywd[l] = '\0';
-
- /* look for the keyword */
- for (i = 0; i < sizeof (keywtab) / sizeof (keywtab[0]); i++) {
- if (strcmp(keywtab[i].keywd, keywd) == 0)
- break;
- }
- if (i == sizeof (keywtab) / sizeof (keywtab[0]))
- goto skip_rest;
-
- /* skip white spaces after the keyword */
- while (c != EOF && isspace(c))
- c = inpc();
-
- /* read the argument, if the keyword accepts one and there is one */
- l = 0;
- if (keywtab[i].arg) {
- while (c != EOF && isdigit(c) && l < sizeof (arg) - 1) {
- arg[l++] = (char)c;
- c = inpc();
- }
- }
- arg[l] = '\0';
- a = l != 0 ? atoi(arg) : -1;
-
- /* skip white spaces after the argument */
- while (c != EOF && isspace(c))
- c = inpc();
-
- if (c != '*' || (c = inpc()) != '/') {
- if (keywtab[i].func != linted)
- /* extra characters in lint comment */
- warning(257);
- } else {
- /*
- * remember that we have already found the end of the
- * comment
- */
- eoc = 1;
- }
-
- if (keywtab[i].func != NULL)
- (*keywtab[i].func)(a);
-
- skip_rest:
- while (!eoc) {
- lc = c;
- if ((c = inpc()) == EOF) {
- /* unterminated comment */
- error(256);
- break;
- }
- if (lc == '*' && c == '/')
- eoc = 1;
- }
-}
-
-/*
- * Handle // style comments
- */
-static void
-slashslashcomment(void)
-{
- int c;
-
- if (sflag < 2 && !gflag)
- /* // comments only supported in C99 */
- (void)gnuism(312, tflag ? "traditional" : "ANSI");
-
- while ((c = inpc()) != EOF && c != '\n')
- continue;
-}
-
-/*
- * Clear flags for lint comments LINTED, LONGLONG and CONSTCOND.
- * clrwflgs() is called after function definitions and global and
- * local declarations and definitions. It is also called between
- * the controlling expression and the body of control statements
- * (if, switch, for, while).
- */
-void
-clrwflgs(void)
-{
-
- nowarn = 0;
- quadflg = 0;
- ccflg = 0;
-}
-
-/*
- * Strings are stored in a dynamically alloceted buffer and passed
- * in yylval.y_xstrg to the parser. The parser or the routines called
- * by the parser are responsible for freeing this buffer.
- */
-static int
-string(void)
-{
- u_char *s;
- int c;
- size_t len, max;
- strg_t *strg;
-
- if ((s = malloc(max = 64)) == NULL)
- nomem();
-
- len = 0;
- while ((c = getescc('"')) >= 0) {
- /* +1 to reserve space for a trailing NUL character */
- if (len + 1 == max)
- if ((s = realloc(s, max *= 2)) == NULL)
- nomem();
- s[len++] = (char)c;
- }
- s[len] = '\0';
- if (c == -2)
- /* unterminated string constant */
- error(258);
-
- if ((strg = calloc(1, sizeof (strg_t))) == NULL)
- nomem();
- strg->st_tspec = CHAR;
- strg->st_len = len;
- strg->st_cp = s;
-
- yylval.y_strg = strg;
- return (T_STRING);
-}
-
-static int
-wcstrg(void)
-{
- char *s;
- int c, i, n, wi;
- size_t len, max, wlen;
- wchar_t *ws;
- strg_t *strg;
-
- if ((s = malloc(max = 64)) == NULL)
- nomem();
- len = 0;
- while ((c = getescc('"')) >= 0) {
- /* +1 to save space for a trailing NUL character */
- if (len + 1 >= max)
- if ((s = realloc(s, max *= 2)) == NULL)
- nomem();
- s[len++] = (char)c;
- }
- s[len] = '\0';
- if (c == -2)
- /* unterminated string constant */
- error(258);
-
- /* get length of wide character string */
- (void)mblen(NULL, 0);
- for (i = 0, wlen = 0; i < len; i += n, wlen++) {
- if ((n = mblen(&s[i], MB_CUR_MAX)) == -1) {
- /* invalid multibyte character */
- error(291);
- break;
- }
- if (n == 0)
- n = 1;
- }
-
- if ((ws = malloc((wlen + 1) * sizeof (wchar_t))) == NULL)
- nomem();
-
- /* convert from multibyte to wide char */
- (void)mbtowc(NULL, NULL, 0);
- for (i = 0, wi = 0; i < len; i += n, wi++) {
- if ((n = mbtowc(&ws[wi], &s[i], MB_CUR_MAX)) == -1)
- break;
- if (n == 0)
- n = 1;
- }
- ws[wi] = 0;
- free(s);
-
- if ((strg = calloc(1, sizeof (strg_t))) == NULL)
- nomem();
- strg->st_tspec = WCHAR;
- strg->st_len = wlen;
- strg->st_wcp = ws;
-
- yylval.y_strg = strg;
- return (T_STRING);
-}
-
-/*
- * As noted above the scanner does not create new symbol table entries
- * for symbols it cannot find in the symbol table. This is to avoid
- * putting undeclared symbols into the symbol table if a syntax error
- * occurs.
- *
- * getsym() is called as soon as it is probably ok to put the symbol to
- * the symbol table. This does not mean that it is not possible that
- * symbols are put to the symbol table which are than not completely
- * declared due to syntax errors. To avoid too many problems in this
- * case symbols get type int in getsym().
- *
- * XXX calls to getsym() should be delayed until decl1*() is called
- */
-sym_t *
-getsym(sbuf_t *sb)
-{
- dinfo_t *di;
- char *s;
- sym_t *sym;
-
- sym = sb->sb_sym;
-
- /*
- * During member declaration it is possible that name() looked
- * for symbols of type FVFT, although it should have looked for
- * symbols of type FTAG. Same can happen for labels. Both cases
- * are compensated here.
- */
- if (symtyp == FMOS || symtyp == FLAB) {
- if (sym == NULL || sym->s_kind == FVFT)
- sym = search(sb);
- }
-
- if (sym != NULL) {
- if (sym->s_kind != symtyp)
- lerror("storesym() 1");
- symtyp = FVFT;
- freesb(sb);
- return (sym);
- }
-
- /* create a new symbol table entry */
-
- /* labels must always be allocated at level 1 (outhermost block) */
- if (symtyp == FLAB) {
- sym = getlblk(1, sizeof (sym_t));
- s = getlblk(1, sb->sb_len + 1);
- (void)memcpy(s, sb->sb_name, sb->sb_len + 1);
- sym->s_name = s;
- sym->s_blklev = 1;
- di = dcs;
- while (di->d_nxt != NULL && di->d_nxt->d_nxt != NULL)
- di = di->d_nxt;
- if (di->d_ctx != AUTO)
- lerror("storesym() 2");
- } else {
- sym = getblk(sizeof (sym_t));
- sym->s_name = sb->sb_name;
- sym->s_blklev = blklev;
- di = dcs;
- }
-
- UNIQUE_CURR_POS(sym->s_dpos);
- if ((sym->s_kind = symtyp) != FLAB)
- sym->s_type = gettyp(INT);
-
- symtyp = FVFT;
-
- if ((sym->s_link = symtab[sb->sb_hash]) != NULL)
- symtab[sb->sb_hash]->s_rlink = &sym->s_link;
- (symtab[sb->sb_hash] = sym)->s_rlink = &symtab[sb->sb_hash];
-
- *di->d_ldlsym = sym;
- di->d_ldlsym = &sym->s_dlnxt;
-
- freesb(sb);
- return (sym);
-}
-
-/*
- * Remove a symbol forever from the symbol table. s_blklev
- * is set to -1 to avoid that the symbol will later be put
- * back to the symbol table.
- */
-void
-rmsym(sym_t *sym)
-{
-
- if ((*sym->s_rlink = sym->s_link) != NULL)
- sym->s_link->s_rlink = sym->s_rlink;
- sym->s_blklev = -1;
- sym->s_link = NULL;
-}
-
-/*
- * Remove a list of symbols declared at one level from the symbol
- * table.
- */
-void
-rmsyms(sym_t *syms)
-{
- sym_t *sym;
-
- for (sym = syms; sym != NULL; sym = sym->s_dlnxt) {
- if (sym->s_blklev != -1) {
- if ((*sym->s_rlink = sym->s_link) != NULL)
- sym->s_link->s_rlink = sym->s_rlink;
- sym->s_link = NULL;
- sym->s_rlink = NULL;
- }
- }
-}
-
-/*
- * Put a symbol into the symbol table
- */
-void
-inssym(int bl, sym_t *sym)
-{
- int h;
-
- h = hash(sym->s_name);
- if ((sym->s_link = symtab[h]) != NULL)
- symtab[h]->s_rlink = &sym->s_link;
- (symtab[h] = sym)->s_rlink = &symtab[h];
- sym->s_blklev = bl;
- if (sym->s_link != NULL && sym->s_blklev < sym->s_link->s_blklev)
- lerror("inssym()");
-}
-
-/*
- * Called at level 0 after syntax errors
- * Removes all symbols which are not declared at level 0 from the
- * symbol table. Also frees all memory which is not associated with
- * level 0.
- */
-void
-cleanup(void)
-{
- sym_t *sym, *nsym;
- int i;
-
- for (i = 0; i < HSHSIZ1; i++) {
- for (sym = symtab[i]; sym != NULL; sym = nsym) {
- nsym = sym->s_link;
- if (sym->s_blklev >= 1) {
- if ((*sym->s_rlink = nsym) != NULL)
- nsym->s_rlink = sym->s_rlink;
- }
- }
- }
-
- for (i = mblklev; i > 0; i--)
- freelblk(i);
-}
-
-/*
- * Create a new symbol with the name of an existing symbol.
- */
-sym_t *
-pushdown(sym_t *sym)
-{
- int h;
- sym_t *nsym;
-
- h = hash(sym->s_name);
- nsym = getblk(sizeof (sym_t));
- if (sym->s_blklev > blklev)
- lerror("pushdown()");
- nsym->s_name = sym->s_name;
- UNIQUE_CURR_POS(nsym->s_dpos);
- nsym->s_kind = sym->s_kind;
- nsym->s_blklev = blklev;
-
- if ((nsym->s_link = symtab[h]) != NULL)
- symtab[h]->s_rlink = &nsym->s_link;
- (symtab[h] = nsym)->s_rlink = &symtab[h];
-
- *dcs->d_ldlsym = nsym;
- dcs->d_ldlsym = &nsym->s_dlnxt;
-
- return (nsym);
-}
-
-/*
- * Free any dynamically allocated memory referenced by
- * the value stack or yylval.
- * The type of information in yylval is described by tok.
- */
-void
-freeyyv(void *sp, int tok)
-{
- if (tok == T_NAME || tok == T_TYPENAME) {
- sbuf_t *sb = *(sbuf_t **)sp;
- freesb(sb);
- } else if (tok == T_CON) {
- val_t *val = *(val_t **)sp;
- free(val);
- } else if (tok == T_STRING) {
- strg_t *strg = *(strg_t **)sp;
- if (strg->st_tspec == CHAR) {
- free(strg->st_cp);
- } else if (strg->st_tspec == WCHAR) {
- free(strg->st_wcp);
- } else {
- lerror("fryylv() 1");
- }
- free(strg);
- }
-}
diff --git a/usr.bin/xlint/lint1/tree.c b/usr.bin/xlint/lint1/tree.c
deleted file mode 100644
index 2a65d80..0000000
--- a/usr.bin/xlint/lint1/tree.c
+++ /dev/null
@@ -1,3928 +0,0 @@
-/* $NetBSD: tree.c,v 1.24 2002/01/31 22:30:20 tv Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: tree.c,v 1.24 2002/01/31 22:30:20 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-#include <string.h>
-#include <float.h>
-#include <limits.h>
-#include <math.h>
-
-#include "lint1.h"
-#include "cgram.h"
-
-/* Various flags for each operator. */
-static mod_t modtab[NOPS];
-
-static tnode_t *getinode(tspec_t, int64_t);
-static void ptrcmpok(op_t, tnode_t *, tnode_t *);
-static int asgntypok(op_t, int, tnode_t *, tnode_t *);
-static void chkbeop(op_t, tnode_t *, tnode_t *);
-static void chkeop2(op_t, int, tnode_t *, tnode_t *);
-static void chkeop1(op_t, int, tnode_t *, tnode_t *);
-static tnode_t *mktnode(op_t, type_t *, tnode_t *, tnode_t *);
-static void balance(op_t, tnode_t **, tnode_t **);
-static void incompat(op_t, tspec_t, tspec_t);
-static void illptrc(mod_t *, type_t *, type_t *);
-static void mrgqual(type_t **, type_t *, type_t *);
-static int conmemb(type_t *);
-static void ptconv(int, tspec_t, tspec_t, type_t *, tnode_t *);
-static void iiconv(op_t, int, tspec_t, tspec_t, type_t *, tnode_t *);
-static void piconv(op_t, tspec_t, type_t *, tnode_t *);
-static void ppconv(op_t, tnode_t *, type_t *);
-static tnode_t *bldstr(op_t, tnode_t *, tnode_t *);
-static tnode_t *bldincdec(op_t, tnode_t *);
-static tnode_t *bldamper(tnode_t *, int);
-static tnode_t *bldplmi(op_t, tnode_t *, tnode_t *);
-static tnode_t *bldshft(op_t, tnode_t *, tnode_t *);
-static tnode_t *bldcol(tnode_t *, tnode_t *);
-static tnode_t *bldasgn(op_t, tnode_t *, tnode_t *);
-static tnode_t *plength(type_t *);
-static tnode_t *fold(tnode_t *);
-static tnode_t *foldtst(tnode_t *);
-static tnode_t *foldflt(tnode_t *);
-static tnode_t *chkfarg(type_t *, tnode_t *);
-static tnode_t *parg(int, type_t *, tnode_t *);
-static void nulleff(tnode_t *);
-static void displexpr(tnode_t *, int);
-static void chkaidx(tnode_t *, int);
-static void chkcomp(op_t, tnode_t *, tnode_t *);
-static void precconf(tnode_t *);
-
-/*
- * Initialize mods of operators.
- */
-void
-initmtab(void)
-{
- static struct {
- op_t op;
- mod_t m;
- } imods[] = {
- { ARROW, { 1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
- "->" } },
- { POINT, { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- "." } },
- { NOT, { 0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,1,0,
- "!" } },
- { COMPL, { 0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,1,1,
- "~" } },
- { INCBEF, { 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "prefix++" } },
- { DECBEF, { 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "prefix--" } },
- { INCAFT, { 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "postfix++" } },
- { DECAFT, { 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "postfix--" } },
- { UPLUS, { 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,
- "unary +" } },
- { UMINUS, { 0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,1,1,
- "unary -" } },
- { STAR, { 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
- "unary *" } },
- { AMPER, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- "unary &" } },
- { MULT, { 1,0,0,0,1,1,1,0,1,0,0,1,0,0,0,1,1,
- "*" } },
- { DIV, { 1,0,0,0,1,1,1,0,1,0,1,1,0,0,0,1,1,
- "/" } },
- { MOD, { 1,0,1,0,0,1,1,0,1,0,1,1,0,0,0,1,1,
- "%" } },
- { PLUS, { 1,0,0,1,0,1,1,0,1,0,0,0,0,0,0,1,0,
- "+" } },
- { MINUS, { 1,0,0,1,0,1,1,0,1,0,0,0,0,0,0,1,0,
- "-" } },
- { SHL, { 1,0,1,0,0,1,1,0,0,0,0,0,1,0,0,1,1,
- "<<" } },
- { SHR, { 1,0,1,0,0,1,1,0,0,0,1,0,1,0,0,1,1,
- ">>" } },
- { LT, { 1,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,
- "<" } },
- { LE, { 1,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,
- "<=" } },
- { GT, { 1,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,
- ">" } },
- { GE, { 1,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,
- ">=" } },
- { EQ, { 1,1,0,1,0,1,1,0,1,0,0,0,0,1,1,0,1,
- "==" } },
- { NE, { 1,1,0,1,0,1,1,0,1,0,0,0,0,1,1,0,1,
- "!=" } },
- { AND, { 1,0,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,
- "&" } },
- { XOR, { 1,0,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,
- "^" } },
- { OR, { 1,0,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,
- "|" } },
- { LOGAND, { 1,1,0,1,0,1,0,1,0,0,0,0,0,0,0,1,0,
- "&&" } },
- { LOGOR, { 1,1,0,1,0,1,0,1,0,0,0,0,1,0,0,1,0,
- "||" } },
- { QUEST, { 1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,
- "?" } },
- { COLON, { 1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,
- ":" } },
- { ASSIGN, { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,
- "=" } },
- { MULASS, { 1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,
- "*=" } },
- { DIVASS, { 1,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,
- "/=" } },
- { MODASS, { 1,0,1,0,0,0,0,0,0,1,0,1,0,0,0,1,0,
- "%=" } },
- { ADDASS, { 1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "+=" } },
- { SUBASS, { 1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "-=" } },
- { SHLASS, { 1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "<<=" } },
- { SHRASS, { 1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
- ">>=" } },
- { ANDASS, { 1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "&=" } },
- { XORASS, { 1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "^=" } },
- { ORASS, { 1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "|=" } },
- { NAME, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- "NAME" } },
- { CON, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- "CON" } },
- { STRING, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- "STRING" } },
- { FSEL, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- "FSEL" } },
- { CALL, { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
- "CALL" } },
- { COMMA, { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
- "," } },
- { CVT, { 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
- "CVT" } },
- { ICALL, { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
- "ICALL" } },
- { LOAD, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- "LOAD" } },
- { PUSH, { 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
- "PUSH" } },
- { RETURN, { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,
- "RETURN" } },
- { INIT, { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
- "INIT" } },
- { FARG, { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
- "FARG" } },
- { NOOP }
- };
- int i;
-
- for (i = 0; imods[i].op != NOOP; i++)
- STRUCT_ASSIGN(modtab[imods[i].op], imods[i].m);
-}
-
-/*
- * Increase degree of reference.
- * This is most often used to change type "T" in type "pointer to T".
- */
-type_t *
-incref(type_t *tp, tspec_t t)
-{
- type_t *tp2;
-
- tp2 = getblk(sizeof (type_t));
- tp2->t_tspec = t;
- tp2->t_subt = tp;
- return (tp2);
-}
-
-/*
- * same for use in expressions
- */
-type_t *
-tincref(type_t *tp, tspec_t t)
-{
- type_t *tp2;
-
- tp2 = tgetblk(sizeof (type_t));
- tp2->t_tspec = t;
- tp2->t_subt = tp;
- return (tp2);
-}
-
-/*
- * Create a node for a constant.
- */
-tnode_t *
-getcnode(type_t *tp, val_t *v)
-{
- tnode_t *n;
-
- n = getnode();
- n->tn_op = CON;
- n->tn_type = tp;
- n->tn_val = tgetblk(sizeof (val_t));
- n->tn_val->v_tspec = tp->t_tspec;
- n->tn_val->v_ansiu = v->v_ansiu;
- n->tn_val->v_u = v->v_u;
- free(v);
- return (n);
-}
-
-/*
- * Create a node for an integer constant.
- */
-static tnode_t *
-getinode(tspec_t t, int64_t q)
-{
- tnode_t *n;
-
- n = getnode();
- n->tn_op = CON;
- n->tn_type = gettyp(t);
- n->tn_val = tgetblk(sizeof (val_t));
- n->tn_val->v_tspec = t;
- n->tn_val->v_quad = q;
- return (n);
-}
-
-/*
- * Create a node for a name (symbol table entry).
- * ntok is the token which follows the name.
- */
-tnode_t *
-getnnode(sym_t *sym, int ntok)
-{
- tnode_t *n;
-
- if (sym->s_scl == NOSCL) {
- sym->s_scl = EXTERN;
- sym->s_def = DECL;
- if (ntok == T_LPARN) {
- if (sflag) {
- /* function implicitly declared to ... */
- warning(215);
- }
- /*
- * XXX if tflag is set the symbol should be
- * exported to level 0
- */
- sym->s_type = incref(sym->s_type, FUNC);
- } else {
- /* %s undefined */
- error(99, sym->s_name);
- }
- }
-
- if (sym->s_kind != FVFT && sym->s_kind != FMOS)
- lerror("getnnode() 1");
-
- n = getnode();
- n->tn_type = sym->s_type;
- if (sym->s_scl != ENUMCON) {
- n->tn_op = NAME;
- n->tn_sym = sym;
- if (sym->s_kind == FVFT && sym->s_type->t_tspec != FUNC)
- n->tn_lvalue = 1;
- } else {
- n->tn_op = CON;
- n->tn_val = tgetblk(sizeof (val_t));
- *n->tn_val = sym->s_value;
- }
-
- return (n);
-}
-
-/*
- * Create a node for a string.
- */
-tnode_t *
-getsnode(strg_t *strg)
-{
- size_t len;
- tnode_t *n;
-
- len = strg->st_len;
-
- n = getnode();
-
- n->tn_op = STRING;
- n->tn_type = tincref(gettyp(strg->st_tspec), ARRAY);
- n->tn_type->t_dim = len + 1;
- n->tn_lvalue = 1;
-
- n->tn_strg = tgetblk(sizeof (strg_t));
- n->tn_strg->st_tspec = strg->st_tspec;
- n->tn_strg->st_len = len;
-
- if (strg->st_tspec == CHAR) {
- n->tn_strg->st_cp = tgetblk(len + 1);
- (void)memcpy(n->tn_strg->st_cp, strg->st_cp, len + 1);
- free(strg->st_cp);
- } else {
- n->tn_strg->st_wcp = tgetblk((len + 1) * sizeof (wchar_t));
- (void)memcpy(n->tn_strg->st_wcp, strg->st_wcp,
- (len + 1) * sizeof (wchar_t));
- free(strg->st_wcp);
- }
- free(strg);
-
- return (n);
-}
-
-/*
- * Returns a symbol which has the same name as the msym argument and is a
- * member of the struct or union specified by the tn argument.
- */
-sym_t *
-strmemb(tnode_t *tn, op_t op, sym_t *msym)
-{
- str_t *str;
- type_t *tp;
- sym_t *sym, *csym;
- int eq;
- tspec_t t;
-
- /*
- * Remove the member if it was unknown until now (Which means
- * that no defined struct or union has a member with the same name).
- */
- if (msym->s_scl == NOSCL) {
- /* undefined struct/union member: %s */
- error(101, msym->s_name);
- rmsym(msym);
- msym->s_kind = FMOS;
- msym->s_scl = MOS;
- msym->s_styp = tgetblk(sizeof (str_t));
- msym->s_styp->stag = tgetblk(sizeof (sym_t));
- msym->s_styp->stag->s_name = unnamed;
- msym->s_value.v_tspec = INT;
- return (msym);
- }
-
- /* Set str to the tag of which msym is expected to be a member. */
- str = NULL;
- t = (tp = tn->tn_type)->t_tspec;
- if (op == POINT) {
- if (t == STRUCT || t == UNION)
- str = tp->t_str;
- } else if (op == ARROW && t == PTR) {
- t = (tp = tp->t_subt)->t_tspec;
- if (t == STRUCT || t == UNION)
- str = tp->t_str;
- }
-
- /*
- * If this struct/union has a member with the name of msym, return
- * return this it.
- */
- if (str != NULL) {
- for (sym = msym; sym != NULL; sym = sym->s_link) {
- if (sym->s_scl != MOS && sym->s_scl != MOU)
- continue;
- if (sym->s_styp != str)
- continue;
- if (strcmp(sym->s_name, msym->s_name) != 0)
- continue;
- return (sym);
- }
- }
-
- /*
- * Set eq to 0 if there are struct/union members with the same name
- * and different types and/or offsets.
- */
- eq = 1;
- for (csym = msym; csym != NULL; csym = csym->s_link) {
- if (csym->s_scl != MOS && csym->s_scl != MOU)
- continue;
- if (strcmp(msym->s_name, csym->s_name) != 0)
- continue;
- for (sym = csym->s_link ; sym != NULL; sym = sym->s_link) {
- int w;
-
- if (sym->s_scl != MOS && sym->s_scl != MOU)
- continue;
- if (strcmp(csym->s_name, sym->s_name) != 0)
- continue;
- if (csym->s_value.v_quad != sym->s_value.v_quad) {
- eq = 0;
- break;
- }
- w = 0;
- eq = eqtype(csym->s_type, sym->s_type, 0, 0, &w) && !w;
- if (!eq)
- break;
- if (csym->s_field != sym->s_field) {
- eq = 0;
- break;
- }
- if (csym->s_field) {
- type_t *tp1, *tp2;
-
- tp1 = csym->s_type;
- tp2 = sym->s_type;
- if (tp1->t_flen != tp2->t_flen) {
- eq = 0;
- break;
- }
- if (tp1->t_foffs != tp2->t_foffs) {
- eq = 0;
- break;
- }
- }
- }
- if (!eq)
- break;
- }
-
- /*
- * Now handle the case in which the left operand refers really
- * to a struct/union, but the right operand is not member of it.
- */
- if (str != NULL) {
- /* illegal member use: %s */
- if (eq && tflag) {
- warning(102, msym->s_name);
- } else {
- error(102, msym->s_name);
- }
- return (msym);
- }
-
- /*
- * Now the left operand of ARROW does not point to a struct/union
- * or the left operand of POINT is no struct/union.
- */
- if (eq) {
- if (op == POINT) {
- /* left operand of "." must be struct/union object */
- if (tflag) {
- warning(103);
- } else {
- error(103);
- }
- } else {
- /* left operand of "->" must be pointer to ... */
- if (tflag && tn->tn_type->t_tspec == PTR) {
- warning(104);
- } else {
- error(104);
- }
- }
- } else {
- if (tflag) {
- /* non-unique member requires struct/union %s */
- error(105, op == POINT ? "object" : "pointer");
- } else {
- /* unacceptable operand of %s */
- error(111, modtab[op].m_name);
- }
- }
-
- return (msym);
-}
-
-/*
- * Create a tree node. Called for most operands except function calls,
- * sizeof and casts.
- *
- * op operator
- * ln left operand
- * rn if not NULL, right operand
- */
-tnode_t *
-build(op_t op, tnode_t *ln, tnode_t *rn)
-{
- mod_t *mp;
- tnode_t *ntn;
- type_t *rtp;
-
- mp = &modtab[op];
-
- /* If there was an error in one of the operands, return. */
- if (ln == NULL || (mp->m_binary && rn == NULL))
- return (NULL);
-
- /*
- * Apply class conversions to the left operand, but only if its
- * value is needed or it is compaired with null.
- */
- if (mp->m_vctx || mp->m_tctx)
- ln = cconv(ln);
- /*
- * The right operand is almost always in a test or value context,
- * except if it is a struct or union member.
- */
- if (mp->m_binary && op != ARROW && op != POINT)
- rn = cconv(rn);
-
- /*
- * Print some warnings for comparisons of unsigned values with
- * constants lower than or equal to null. This must be done
- * before promote() because otherwise unsigned char and unsigned
- * short would be promoted to int. Also types are tested to be
- * CHAR, which would also become int.
- */
- if (mp->m_comp)
- chkcomp(op, ln, rn);
-
- /*
- * Promote the left operand if it is in a test or value context
- */
- if (mp->m_vctx || mp->m_tctx)
- ln = promote(op, 0, ln);
- /*
- * Promote the right operand, but only if it is no struct or
- * union member, or if it is not to be assigned to the left operand
- */
- if (mp->m_binary && op != ARROW && op != POINT &&
- op != ASSIGN && op != RETURN) {
- rn = promote(op, 0, rn);
- }
-
- /*
- * If the result of the operation is different for signed or
- * unsigned operands and one of the operands is signed only in
- * ANSI C, print a warning.
- */
- if (mp->m_tlansiu && ln->tn_op == CON && ln->tn_val->v_ansiu) {
- /* ANSI C treats constant as unsigned, op %s */
- warning(218, mp->m_name);
- ln->tn_val->v_ansiu = 0;
- }
- if (mp->m_transiu && rn->tn_op == CON && rn->tn_val->v_ansiu) {
- /* ANSI C treats constant as unsigned, op %s */
- warning(218, mp->m_name);
- rn->tn_val->v_ansiu = 0;
- }
-
- /* Make sure both operands are of the same type */
- if (mp->m_balance || (tflag && (op == SHL || op == SHR)))
- balance(op, &ln, &rn);
-
- /*
- * Check types for compatibility with the operation and mutual
- * compatibility. Return if there are serios problems.
- */
- if (!typeok(op, 0, ln, rn))
- return (NULL);
-
- /* And now create the node. */
- switch (op) {
- case POINT:
- case ARROW:
- ntn = bldstr(op, ln, rn);
- break;
- case INCAFT:
- case DECAFT:
- case INCBEF:
- case DECBEF:
- ntn = bldincdec(op, ln);
- break;
- case AMPER:
- ntn = bldamper(ln, 0);
- break;
- case STAR:
- ntn = mktnode(STAR, ln->tn_type->t_subt, ln, NULL);
- break;
- case PLUS:
- case MINUS:
- ntn = bldplmi(op, ln, rn);
- break;
- case SHL:
- case SHR:
- ntn = bldshft(op, ln, rn);
- break;
- case COLON:
- ntn = bldcol(ln, rn);
- break;
- case ASSIGN:
- case MULASS:
- case DIVASS:
- case MODASS:
- case ADDASS:
- case SUBASS:
- case SHLASS:
- case SHRASS:
- case ANDASS:
- case XORASS:
- case ORASS:
- case RETURN:
- ntn = bldasgn(op, ln, rn);
- break;
- case COMMA:
- case QUEST:
- ntn = mktnode(op, rn->tn_type, ln, rn);
- break;
- default:
- rtp = mp->m_logop ? gettyp(INT) : ln->tn_type;
- if (!mp->m_binary && rn != NULL)
- lerror("build() 1");
- ntn = mktnode(op, rtp, ln, rn);
- break;
- }
-
- /* Return if an error occurred. */
- if (ntn == NULL)
- return (NULL);
-
- /* Print a warning if precedence confusion is possible */
- if (mp->m_tpconf)
- precconf(ntn);
-
- /*
- * Print a warning if one of the operands is in a context where
- * it is compared with null and if this operand is a constant.
- */
- if (mp->m_tctx) {
- if (ln->tn_op == CON ||
- ((mp->m_binary && op != QUEST) && rn->tn_op == CON)) {
- if (hflag && !ccflg)
- /* constant in conditional context */
- warning(161);
- }
- }
-
- /* Fold if the operator requires it */
- if (mp->m_fold) {
- if (ln->tn_op == CON && (!mp->m_binary || rn->tn_op == CON)) {
- if (mp->m_tctx) {
- ntn = foldtst(ntn);
- } else if (isftyp(ntn->tn_type->t_tspec)) {
- ntn = foldflt(ntn);
- } else {
- ntn = fold(ntn);
- }
- } else if (op == QUEST && ln->tn_op == CON) {
- ntn = ln->tn_val->v_quad ? rn->tn_left : rn->tn_right;
- }
- }
-
- return (ntn);
-}
-
-/*
- * Perform class conversions.
- *
- * Arrays of type T are converted into pointers to type T.
- * Functions are converted to pointers to functions.
- * Lvalues are converted to rvalues.
- */
-tnode_t *
-cconv(tnode_t *tn)
-{
- type_t *tp;
-
- /*
- * Array-lvalue (array of type T) is converted into rvalue
- * (pointer to type T)
- */
- if (tn->tn_type->t_tspec == ARRAY) {
- if (!tn->tn_lvalue) {
- /* %soperand of '%s' must be lvalue */
- /* XXX print correct operator */
- (void)gnuism(114, "", modtab[AMPER].m_name);
- }
- tn = mktnode(AMPER, tincref(tn->tn_type->t_subt, PTR),
- tn, NULL);
- }
-
- /*
- * Expression of type function (function with return value of type T)
- * in rvalue-expression (pointer to function with return value
- * of type T)
- */
- if (tn->tn_type->t_tspec == FUNC)
- tn = bldamper(tn, 1);
-
- /* lvalue to rvalue */
- if (tn->tn_lvalue) {
- tp = tduptyp(tn->tn_type);
- tp->t_const = tp->t_volatile = 0;
- tn = mktnode(LOAD, tp, tn, NULL);
- }
-
- return (tn);
-}
-
-/*
- * Perform most type checks. First the types are checked using
- * informations from modtab[]. After that it is done by hand for
- * more complicated operators and type combinations.
- *
- * If the types are ok, typeok() returns 1, otherwise 0.
- */
-int
-typeok(op_t op, int arg, tnode_t *ln, tnode_t *rn)
-{
- mod_t *mp;
- tspec_t lt, rt = NOTSPEC, lst = NOTSPEC, rst = NOTSPEC, olt = NOTSPEC,
- ort = NOTSPEC;
- type_t *ltp, *rtp = NULL, *lstp = NULL, *rstp = NULL;
- tnode_t *tn;
-
- mp = &modtab[op];
-
- if ((lt = (ltp = ln->tn_type)->t_tspec) == PTR)
- lst = (lstp = ltp->t_subt)->t_tspec;
- if (mp->m_binary) {
- if ((rt = (rtp = rn->tn_type)->t_tspec) == PTR)
- rst = (rstp = rtp->t_subt)->t_tspec;
- }
-
- if (mp->m_rqint) {
- /* integertypes required */
- if (!isityp(lt) || (mp->m_binary && !isityp(rt))) {
- incompat(op, lt, rt);
- return (0);
- }
- } else if (mp->m_rqsclt) {
- /* scalar types required */
- if (!issclt(lt) || (mp->m_binary && !issclt(rt))) {
- incompat(op, lt, rt);
- return (0);
- }
- } else if (mp->m_rqatyp) {
- /* arithmetic types required */
- if (!isatyp(lt) || (mp->m_binary && !isatyp(rt))) {
- incompat(op, lt, rt);
- return (0);
- }
- }
-
- if (op == SHL || op == SHR || op == SHLASS || op == SHRASS) {
- /*
- * For these operations we need the types before promotion
- * and balancing.
- */
- for (tn=ln; tn->tn_op==CVT && !tn->tn_cast; tn=tn->tn_left)
- continue;
- olt = tn->tn_type->t_tspec;
- for (tn=rn; tn->tn_op==CVT && !tn->tn_cast; tn=tn->tn_left)
- continue;
- ort = tn->tn_type->t_tspec;
- }
-
- switch (op) {
- case POINT:
- /*
- * Most errors required by ANSI C are reported in strmemb().
- * Here we only must check for totaly wrong things.
- */
- if (lt == FUNC || lt == VOID || ltp->t_isfield ||
- ((lt != STRUCT && lt != UNION) && !ln->tn_lvalue)) {
- /* Without tflag we got already an error */
- if (tflag)
- /* unacceptable operand of %s */
- error(111, mp->m_name);
- return (0);
- }
- /* Now we have an object we can create a pointer to */
- break;
- case ARROW:
- if (lt != PTR && !(tflag && isityp(lt))) {
- /* Without tflag we got already an error */
- if (tflag)
- /* unacceptabel operand of %s */
- error(111, mp->m_name);
- return (0);
- }
- break;
- case INCAFT:
- case DECAFT:
- case INCBEF:
- case DECBEF:
- /* operands have scalar types (checked above) */
- if (!ln->tn_lvalue) {
- if (ln->tn_op == CVT && ln->tn_cast &&
- ln->tn_left->tn_op == LOAD) {
- /* a cast does not yield an lvalue */
- error(163);
- }
- /* %soperand of %s must be lvalue */
- error(114, "", mp->m_name);
- return (0);
- } else if (ltp->t_const) {
- /* %soperand of %s must be modifiable lvalue */
- if (!tflag)
- warning(115, "", mp->m_name);
- }
- break;
- case AMPER:
- if (lt == ARRAY || lt == FUNC) {
- /* ok, a warning comes later (in bldamper()) */
- } else if (!ln->tn_lvalue) {
- if (ln->tn_op == CVT && ln->tn_cast &&
- ln->tn_left->tn_op == LOAD) {
- /* a cast does not yield an lvalue */
- error(163);
- }
- /* %soperand of %s must be lvalue */
- error(114, "", mp->m_name);
- return (0);
- } else if (issclt(lt)) {
- if (ltp->t_isfield) {
- /* cannot take address of bit-field */
- error(112);
- return (0);
- }
- } else if (lt != STRUCT && lt != UNION) {
- /* unacceptable operand of %s */
- error(111, mp->m_name);
- return (0);
- }
- if (ln->tn_op == NAME && ln->tn_sym->s_reg) {
- /* cannot take address of register %s */
- error(113, ln->tn_sym->s_name);
- return (0);
- }
- break;
- case STAR:
- /* until now there were no type checks for this operator */
- if (lt != PTR) {
- /* cannot dereference non-pointer type */
- error(96);
- return (0);
- }
- break;
- case PLUS:
- /* operands have scalar types (checked above) */
- if ((lt == PTR && !isityp(rt)) || (rt == PTR && !isityp(lt))) {
- incompat(op, lt, rt);
- return (0);
- }
- break;
- case MINUS:
- /* operands have scalar types (checked above) */
- if (lt == PTR && (!isityp(rt) && rt != PTR)) {
- incompat(op, lt, rt);
- return (0);
- } else if (rt == PTR && lt != PTR) {
- incompat(op, lt, rt);
- return (0);
- }
- if (lt == PTR && rt == PTR) {
- if (!eqtype(lstp, rstp, 1, 0, NULL)) {
- /* illegal pointer subtraction */
- error(116);
- }
- }
- break;
- case SHR:
- /* operands have integer types (checked above) */
- if (pflag && !isutyp(lt)) {
- /*
- * The left operand is signed. This means that
- * the operation is (possibly) nonportable.
- */
- /* bitwise operation on signed value nonportable */
- if (ln->tn_op != CON) {
- /* possibly nonportable */
- warning(117);
- } else if (ln->tn_val->v_quad < 0) {
- warning(120);
- }
- } else if (!tflag && !sflag && !isutyp(olt) && isutyp(ort)) {
- /*
- * The left operand would become unsigned in
- * traditional C.
- */
- if (hflag &&
- (ln->tn_op != CON || ln->tn_val->v_quad < 0)) {
- /* semantics of %s change in ANSI C; use ... */
- warning(118, mp->m_name);
- }
- } else if (!tflag && !sflag && !isutyp(olt) && !isutyp(ort) &&
- psize(lt) < psize(rt)) {
- /*
- * In traditional C the left operand would be extended,
- * possibly with 1, and then shifted.
- */
- if (hflag &&
- (ln->tn_op != CON || ln->tn_val->v_quad < 0)) {
- /* semantics of %s change in ANSI C; use ... */
- warning(118, mp->m_name);
- }
- }
- goto shift;
- case SHL:
- /*
- * ANSI C does not perform balancing for shift operations,
- * but traditional C does. If the width of the right operand
- * is greather than the width of the left operand, than in
- * traditional C the left operand would be extendet to the
- * width of the right operand. For SHL this may result in
- * different results.
- */
- if (psize(lt) < psize(rt)) {
- /*
- * XXX If both operands are constant make sure
- * that there is really a differencs between
- * ANSI C and traditional C.
- */
- if (hflag)
- /* semantics of %s change in ANSI C; use ... */
- warning(118, mp->m_name);
- }
- shift:
- if (rn->tn_op == CON) {
- if (!isutyp(rt) && rn->tn_val->v_quad < 0) {
- /* negative shift */
- warning(121);
- } else if ((uint64_t)rn->tn_val->v_quad == size(lt)) {
- /* shift equal to size fo object */
- warning(267);
- } else if ((uint64_t)rn->tn_val->v_quad > size(lt)) {
- /* shift greater than size of object */
- warning(122);
- }
- }
- break;
- case EQ:
- case NE:
- /*
- * Accept some things which are allowed with EQ and NE,
- * but not with ordered comparisons.
- */
- if (lt == PTR && ((rt == PTR && rst == VOID) || isityp(rt))) {
- if (rn->tn_op == CON && rn->tn_val->v_quad == 0)
- break;
- }
- if (rt == PTR && ((lt == PTR && lst == VOID) || isityp(lt))) {
- if (ln->tn_op == CON && ln->tn_val->v_quad == 0)
- break;
- }
- /* FALLTHROUGH */
- case LT:
- case GT:
- case LE:
- case GE:
- if ((lt == PTR || rt == PTR) && lt != rt) {
- if (isityp(lt) || isityp(rt)) {
- /* illegal comb. of pointer and int., op %s */
- warning(123, mp->m_name);
- } else {
- incompat(op, lt, rt);
- return (0);
- }
- } else if (lt == PTR && rt == PTR) {
- ptrcmpok(op, ln, rn);
- }
- break;
- case QUEST:
- if (!issclt(lt)) {
- /* first operand must have scalar type, op ? : */
- error(170);
- return (0);
- }
- if (rn->tn_op != COLON)
- lerror("typeok() 2");
- break;
- case COLON:
-
- if (isatyp(lt) && isatyp(rt))
- break;
-
- if (lt == STRUCT && rt == STRUCT && ltp->t_str == rtp->t_str)
- break;
- if (lt == UNION && rt == UNION && ltp->t_str == rtp->t_str)
- break;
-
- /* combination of any pointer and 0, 0L or (void *)0 is ok */
- if (lt == PTR && ((rt == PTR && rst == VOID) || isityp(rt))) {
- if (rn->tn_op == CON && rn->tn_val->v_quad == 0)
- break;
- }
- if (rt == PTR && ((lt == PTR && lst == VOID) || isityp(lt))) {
- if (ln->tn_op == CON && ln->tn_val->v_quad == 0)
- break;
- }
-
- if ((lt == PTR && isityp(rt)) || (isityp(lt) && rt == PTR)) {
- /* illegal comb. of ptr. and int., op %s */
- warning(123, mp->m_name);
- break;
- }
-
- if (lt == VOID || rt == VOID) {
- if (lt != VOID || rt != VOID)
- /* incompatible types in conditional */
- warning(126);
- break;
- }
-
- if (lt == PTR && rt == PTR && ((lst == VOID && rst == FUNC) ||
- (lst == FUNC && rst == VOID))) {
- /* (void *)0 handled above */
- if (sflag)
- /* ANSI C forbids conv. of %s to %s, op %s */
- warning(305, "function pointer", "'void *'",
- mp->m_name);
- break;
- }
-
- if (rt == PTR && lt == PTR) {
- if (!eqtype(lstp, rstp, 1, 0, NULL))
- illptrc(mp, ltp, rtp);
- break;
- }
-
- /* incompatible types in conditional */
- error(126);
- return (0);
-
- case ASSIGN:
- case INIT:
- case FARG:
- case RETURN:
- if (!asgntypok(op, arg, ln, rn))
- return (0);
- goto assign;
- case MULASS:
- case DIVASS:
- case MODASS:
- goto assign;
- case ADDASS:
- case SUBASS:
- /* operands have scalar types (checked above) */
- if ((lt == PTR && !isityp(rt)) || rt == PTR) {
- incompat(op, lt, rt);
- return (0);
- }
- goto assign;
- case SHLASS:
- goto assign;
- case SHRASS:
- if (pflag && !isutyp(lt) && !(tflag && isutyp(rt))) {
- /* bitwise operation on s.v. possibly nonportabel */
- warning(117);
- }
- goto assign;
- case ANDASS:
- case XORASS:
- case ORASS:
- goto assign;
- assign:
- if (!ln->tn_lvalue) {
- if (ln->tn_op == CVT && ln->tn_cast &&
- ln->tn_left->tn_op == LOAD) {
- /* a cast does not yield an lvalue */
- error(163);
- }
- /* %soperand of %s must be lvalue */
- error(114, "left ", mp->m_name);
- return (0);
- } else if (ltp->t_const || ((lt == STRUCT || lt == UNION) &&
- conmemb(ltp))) {
- /* %soperand of %s must be modifiable lvalue */
- if (!tflag)
- warning(115, "left ", mp->m_name);
- }
- break;
- case COMMA:
- if (!modtab[ln->tn_op].m_sideeff)
- nulleff(ln);
- break;
- /* LINTED (enumeration values not handled in switch) */
- case CON:
- case CASE:
- case PUSH:
- case LOAD:
- case ICALL:
- case CVT:
- case CALL:
- case FSEL:
- case STRING:
- case NAME:
- case LOGOR:
- case LOGAND:
- case OR:
- case XOR:
- case AND:
- case MOD:
- case DIV:
- case MULT:
- case UMINUS:
- case UPLUS:
- case DEC:
- case INC:
- case COMPL:
- case NOT:
- case NOOP:
- break;
- }
-
- if (mp->m_badeop &&
- (ltp->t_isenum || (mp->m_binary && rtp->t_isenum))) {
- chkbeop(op, ln, rn);
- } else if (mp->m_enumop && (ltp->t_isenum && rtp->t_isenum)) {
- chkeop2(op, arg, ln, rn);
- } else if (mp->m_enumop && (ltp->t_isenum || rtp->t_isenum)) {
- chkeop1(op, arg, ln, rn);
- }
-
- return (1);
-}
-
-static void
-ptrcmpok(op_t op, tnode_t *ln, tnode_t *rn)
-{
- type_t *ltp, *rtp;
- tspec_t lt, rt;
- const char *lts, *rts;
-
- lt = (ltp = ln->tn_type)->t_subt->t_tspec;
- rt = (rtp = rn->tn_type)->t_subt->t_tspec;
-
- if (lt == VOID || rt == VOID) {
- if (sflag && (lt == FUNC || rt == FUNC)) {
- /* (void *)0 already handled in typeok() */
- *(lt == FUNC ? &lts : &rts) = "function pointer";
- *(lt == VOID ? &lts : &rts) = "'void *'";
- /* ANSI C forbids comparison of %s with %s */
- warning(274, lts, rts);
- }
- return;
- }
-
- if (!eqtype(ltp->t_subt, rtp->t_subt, 1, 0, NULL)) {
- illptrc(&modtab[op], ltp, rtp);
- return;
- }
-
- if (lt == FUNC && rt == FUNC) {
- if (sflag && op != EQ && op != NE)
- /* ANSI C forbids ordered comp. of func ptr */
- warning(125);
- }
-}
-
-/*
- * Checks type compatibility for ASSIGN, INIT, FARG and RETURN
- * and prints warnings/errors if necessary.
- * If the types are (almost) compatible, 1 is returned, otherwise 0.
- */
-static int
-asgntypok(op_t op, int arg, tnode_t *ln, tnode_t *rn)
-{
- tspec_t lt, rt, lst = NOTSPEC, rst = NOTSPEC;
- type_t *ltp, *rtp, *lstp = NULL, *rstp = NULL;
- mod_t *mp;
- const char *lts, *rts;
-
- if ((lt = (ltp = ln->tn_type)->t_tspec) == PTR)
- lst = (lstp = ltp->t_subt)->t_tspec;
- if ((rt = (rtp = rn->tn_type)->t_tspec) == PTR)
- rst = (rstp = rtp->t_subt)->t_tspec;
- mp = &modtab[op];
-
- if (isatyp(lt) && isatyp(rt))
- return (1);
-
- if ((lt == STRUCT || lt == UNION) && (rt == STRUCT || rt == UNION))
- /* both are struct or union */
- return (ltp->t_str == rtp->t_str);
-
- /* 0, 0L and (void *)0 may be assigned to any pointer */
- if (lt == PTR && ((rt == PTR && rst == VOID) || isityp(rt))) {
- if (rn->tn_op == CON && rn->tn_val->v_quad == 0)
- return (1);
- }
-
- if (lt == PTR && rt == PTR && (lst == VOID || rst == VOID)) {
- /* two pointers, at least one pointer to void */
- if (sflag && (lst == FUNC || rst == FUNC)) {
- /* comb. of ptr to func and ptr to void */
- *(lst == FUNC ? &lts : &rts) = "function pointer";
- *(lst == VOID ? &lts : &rts) = "'void *'";
- switch (op) {
- case INIT:
- case RETURN:
- /* ANSI C forbids conversion of %s to %s */
- warning(303, rts, lts);
- break;
- case FARG:
- /* ANSI C forbids conv. of %s to %s, arg #%d */
- warning(304, rts, lts, arg);
- break;
- default:
- /* ANSI C forbids conv. of %s to %s, op %s */
- warning(305, rts, lts, mp->m_name);
- break;
- }
- }
- }
-
- if (lt == PTR && rt == PTR && (lst == VOID || rst == VOID ||
- eqtype(lstp, rstp, 1, 0, NULL))) {
- /* compatible pointer types (qualifiers ignored) */
- if (!tflag &&
- ((!lstp->t_const && rstp->t_const) ||
- (!lstp->t_volatile && rstp->t_volatile))) {
- /* left side has not all qualifiers of right */
- switch (op) {
- case INIT:
- case RETURN:
- /* incompatible pointer types */
- warning(182);
- break;
- case FARG:
- /* argument has incompat. ptr. type, arg #%d */
- warning(153, arg);
- break;
- default:
- /* operands have incompat. ptr. types, op %s */
- warning(128, mp->m_name);
- break;
- }
- }
- return (1);
- }
-
- if ((lt == PTR && isityp(rt)) || (isityp(lt) && rt == PTR)) {
- switch (op) {
- case INIT:
- case RETURN:
- /* illegal combination of pointer and integer */
- warning(183);
- break;
- case FARG:
- /* illegal comb. of ptr. and int., arg #%d */
- warning(154, arg);
- break;
- default:
- /* illegal comb. of ptr. and int., op %s */
- warning(123, mp->m_name);
- break;
- }
- return (1);
- }
-
- if (lt == PTR && rt == PTR) {
- switch (op) {
- case INIT:
- case RETURN:
- illptrc(NULL, ltp, rtp);
- break;
- case FARG:
- /* argument has incompatible pointer type, arg #%d */
- warning(153, arg);
- break;
- default:
- illptrc(mp, ltp, rtp);
- break;
- }
- return (1);
- }
-
- switch (op) {
- case INIT:
- /* initialisation type mismatch */
- error(185);
- break;
- case RETURN:
- /* return value type mismatch */
- error(211);
- break;
- case FARG:
- /* argument is incompatible with prototype, arg #%d */
- warning(155, arg);
- break;
- default:
- incompat(op, lt, rt);
- break;
- }
-
- return (0);
-}
-
-/*
- * Prints a warning if an operator, which should be senseless for an
- * enum type, is applied to an enum type.
- */
-static void
-chkbeop(op_t op, tnode_t *ln, tnode_t *rn)
-{
- mod_t *mp;
-
- if (!eflag)
- return;
-
- mp = &modtab[op];
-
- if (!(ln->tn_type->t_isenum ||
- (mp->m_binary && rn->tn_type->t_isenum))) {
- return;
- }
-
- /*
- * Enum as offset to a pointer is an exception (otherwise enums
- * could not be used as array indizes).
- */
- if (op == PLUS &&
- ((ln->tn_type->t_isenum && rn->tn_type->t_tspec == PTR) ||
- (rn->tn_type->t_isenum && ln->tn_type->t_tspec == PTR))) {
- return;
- }
-
- /* dubious operation on enum, op %s */
- warning(241, mp->m_name);
-
-}
-
-/*
- * Prints a warning if an operator is applied to two different enum types.
- */
-static void
-chkeop2(op_t op, int arg, tnode_t *ln, tnode_t *rn)
-{
- mod_t *mp;
-
- mp = &modtab[op];
-
- if (ln->tn_type->t_enum != rn->tn_type->t_enum) {
- switch (op) {
- case INIT:
- /* enum type mismatch in initialisation */
- warning(210);
- break;
- case FARG:
- /* enum type mismatch, arg #%d */
- warning(156, arg);
- break;
- case RETURN:
- /* return value type mismatch */
- warning(211);
- break;
- default:
- /* enum type mismatch, op %s */
- warning(130, mp->m_name);
- break;
- }
-#if 0
- } else if (mp->m_comp && op != EQ && op != NE) {
- if (eflag)
- /* dubious comparisons of enums */
- warning(243, mp->m_name);
-#endif
- }
-}
-
-/*
- * Prints a warning if an operator has both enum end other integer
- * types.
- */
-static void
-chkeop1(op_t op, int arg, tnode_t *ln, tnode_t *rn)
-{
-
- if (!eflag)
- return;
-
- switch (op) {
- case INIT:
- /*
- * Initializations with 0 should be allowed. Otherwise,
- * we should complain about all uninitialized enums,
- * consequently.
- */
- if (!rn->tn_type->t_isenum && rn->tn_op == CON &&
- isityp(rn->tn_type->t_tspec) && rn->tn_val->v_quad == 0) {
- return;
- }
- /* initialisation of '%s' with '%s' */
- warning(277, tyname(ln->tn_type), tyname(rn->tn_type));
- break;
- case FARG:
- /* combination of '%s' and '%s', arg #%d */
- warning(278, tyname(ln->tn_type), tyname(rn->tn_type), arg);
- break;
- case RETURN:
- /* combination of '%s' and '%s' in return */
- warning(279, tyname(ln->tn_type), tyname(rn->tn_type));
- break;
- default:
- /* combination of '%s' and %s, op %s */
- warning(242, tyname(ln->tn_type), tyname(rn->tn_type),
- modtab[op].m_name);
- break;
- }
-}
-
-/*
- * Build and initialize a new node.
- */
-static tnode_t *
-mktnode(op_t op, type_t *type, tnode_t *ln, tnode_t *rn)
-{
- tnode_t *ntn;
- tspec_t t;
-
- ntn = getnode();
-
- ntn->tn_op = op;
- ntn->tn_type = type;
- ntn->tn_left = ln;
- ntn->tn_right = rn;
-
- if (op == STAR || op == FSEL) {
- if (ln->tn_type->t_tspec == PTR) {
- t = ln->tn_type->t_subt->t_tspec;
- if (t != FUNC && t != VOID)
- ntn->tn_lvalue = 1;
- } else {
- lerror("mktnode() 2");
- }
- }
-
- return (ntn);
-}
-
-/*
- * Performs usual conversion of operands to (unsigned) int.
- *
- * If tflag is set or the operand is a function argument with no
- * type information (no prototype or variable # of args), convert
- * float to double.
- */
-tnode_t *
-promote(op_t op, int farg, tnode_t *tn)
-{
- tspec_t t;
- type_t *ntp;
- int len;
-
- t = tn->tn_type->t_tspec;
-
- if (!isatyp(t))
- return (tn);
-
- if (!tflag) {
- /*
- * ANSI C requires that the result is always of type INT
- * if INT can represent all possible values of the previous
- * type.
- */
- if (tn->tn_type->t_isfield) {
- len = tn->tn_type->t_flen;
- if (size(INT) > len) {
- t = INT;
- } else {
- if (size(INT) != len)
- lerror("promote() 1");
- if (isutyp(t)) {
- t = UINT;
- } else {
- t = INT;
- }
- }
- } else if (t == CHAR || t == UCHAR || t == SCHAR) {
- t = (size(CHAR) < size(INT) || t != UCHAR) ?
- INT : UINT;
- } else if (t == SHORT || t == USHORT) {
- t = (size(SHORT) < size(INT) || t == SHORT) ?
- INT : UINT;
- } else if (t == ENUM) {
- t = INT;
- } else if (farg && t == FLOAT) {
- t = DOUBLE;
- }
- } else {
- /*
- * In traditional C, keep unsigned and promote FLOAT
- * to DOUBLE.
- */
- if (t == UCHAR || t == USHORT) {
- t = UINT;
- } else if (t == CHAR || t == SCHAR || t == SHORT) {
- t = INT;
- } else if (t == FLOAT) {
- t = DOUBLE;
- } else if (t == ENUM) {
- t = INT;
- }
- }
-
- if (t != tn->tn_type->t_tspec) {
- ntp = tduptyp(tn->tn_type);
- ntp->t_tspec = t;
- /*
- * Keep t_isenum so we are later able to check compatibility
- * of enum types.
- */
- tn = convert(op, 0, ntp, tn);
- }
-
- return (tn);
-}
-
-/*
- * Insert conversions which are necessary to give both operands the same
- * type. This is done in different ways for traditional C and ANIS C.
- */
-static void
-balance(op_t op, tnode_t **lnp, tnode_t **rnp)
-{
- tspec_t lt, rt, t;
- int i, u;
- type_t *ntp;
- static tspec_t tl[] = {
- LDOUBLE, DOUBLE, FLOAT, UQUAD, QUAD, ULONG, LONG, UINT, INT,
- };
-
- lt = (*lnp)->tn_type->t_tspec;
- rt = (*rnp)->tn_type->t_tspec;
-
- if (!isatyp(lt) || !isatyp(rt))
- return;
-
- if (!tflag) {
- if (lt == rt) {
- t = lt;
- } else if (lt == LDOUBLE || rt == LDOUBLE) {
- t = LDOUBLE;
- } else if (lt == DOUBLE || rt == DOUBLE) {
- t = DOUBLE;
- } else if (lt == FLOAT || rt == FLOAT) {
- t = FLOAT;
- } else {
- /*
- * If type A has more bits than type B it should
- * be able to hold all possible values of type B.
- */
- if (size(lt) > size(rt)) {
- t = lt;
- } else if (size(lt) < size(rt)) {
- t = rt;
- } else {
- for (i = 3; tl[i] != INT; i++) {
- if (tl[i] == lt || tl[i] == rt)
- break;
- }
- if ((isutyp(lt) || isutyp(rt)) &&
- !isutyp(tl[i])) {
- i--;
- }
- t = tl[i];
- }
- }
- } else {
- /* Keep unsigned in traditional C */
- u = isutyp(lt) || isutyp(rt);
- for (i = 0; tl[i] != INT; i++) {
- if (lt == tl[i] || rt == tl[i])
- break;
- }
- t = tl[i];
- if (u && isityp(t) && !isutyp(t))
- t = utyp(t);
- }
-
- if (t != lt) {
- ntp = tduptyp((*lnp)->tn_type);
- ntp->t_tspec = t;
- *lnp = convert(op, 0, ntp, *lnp);
- }
- if (t != rt) {
- ntp = tduptyp((*rnp)->tn_type);
- ntp->t_tspec = t;
- *rnp = convert(op, 0, ntp, *rnp);
- }
-}
-
-/*
- * Insert a conversion operator, which converts the type of the node
- * to another given type.
- * If op is FARG, arg is the number of the argument (used for warnings).
- */
-tnode_t *
-convert(op_t op, int arg, type_t *tp, tnode_t *tn)
-{
- tnode_t *ntn;
- tspec_t nt, ot, ost = NOTSPEC;
-
- if (tn->tn_lvalue)
- lerror("convert() 1");
-
- nt = tp->t_tspec;
- if ((ot = tn->tn_type->t_tspec) == PTR)
- ost = tn->tn_type->t_subt->t_tspec;
-
- if (!tflag && !sflag && op == FARG)
- ptconv(arg, nt, ot, tp, tn);
- if (isityp(nt) && isityp(ot)) {
- iiconv(op, arg, nt, ot, tp, tn);
- } else if (nt == PTR && ((ot == PTR && ost == VOID) || isityp(ot)) &&
- tn->tn_op == CON && tn->tn_val->v_quad == 0) {
- /* 0, 0L and (void *)0 may be assigned to any pointer. */
- } else if (isityp(nt) && ot == PTR) {
- piconv(op, nt, tp, tn);
- } else if (nt == PTR && ot == PTR) {
- ppconv(op, tn, tp);
- }
-
- ntn = getnode();
- ntn->tn_op = CVT;
- ntn->tn_type = tp;
- ntn->tn_cast = op == CVT;
- if (tn->tn_op != CON || nt == VOID) {
- ntn->tn_left = tn;
- } else {
- ntn->tn_op = CON;
- ntn->tn_val = tgetblk(sizeof (val_t));
- cvtcon(op, arg, ntn->tn_type, ntn->tn_val, tn->tn_val);
- }
-
- return (ntn);
-}
-
-/*
- * Print a warning if a prototype causes a type conversion that is
- * different from what would happen to the same argument in the
- * absence of a prototype.
- *
- * Errors/Warnings about illegal type combinations are already printed
- * in asgntypok().
- */
-static void
-ptconv(int arg, tspec_t nt, tspec_t ot, type_t *tp, tnode_t *tn)
-{
- tnode_t *ptn;
-
- if (!isatyp(nt) || !isatyp(ot))
- return;
-
- /*
- * If the type of the formal parameter is char/short, a warning
- * would be useless, because functions declared the old style
- * can't expect char/short arguments.
- */
- if (nt == CHAR || nt == UCHAR || nt == SHORT || nt == USHORT)
- return;
-
- /* get default promotion */
- ptn = promote(NOOP, 1, tn);
- ot = ptn->tn_type->t_tspec;
-
- /* return if types are the same with and without prototype */
- if (nt == ot || (nt == ENUM && ot == INT))
- return;
-
- if (isftyp(nt) != isftyp(ot) || psize(nt) != psize(ot)) {
- /* representation and/or width change */
- if (styp(nt) != SHORT || !isityp(ot) || psize(ot) > psize(INT))
- /* conversion to '%s' due to prototype, arg #%d */
- warning(259, tyname(tp), arg);
- } else if (hflag) {
- /*
- * they differ in sign or base type (char, short, int,
- * long, long long, float, double, long double)
- *
- * if they differ only in sign and the argument is a constant
- * and the msb of the argument is not set, print no warning
- */
- if (ptn->tn_op == CON && isityp(nt) && styp(nt) == styp(ot) &&
- msb(ptn->tn_val->v_quad, ot, -1) == 0) {
- /* ok */
- } else {
- /* conversion to '%s' due to prototype, arg #%d */
- warning(259, tyname(tp), arg);
- }
- }
-}
-
-/*
- * Print warnings for conversions of integer types which my cause
- * problems.
- */
-/* ARGSUSED */
-static void
-iiconv(op_t op, int arg, tspec_t nt, tspec_t ot, type_t *tp, tnode_t *tn)
-{
- if (tn->tn_op == CON)
- return;
-
- if (op == CVT)
- return;
-
-#if 0
- if (psize(nt) > psize(ot) && isutyp(nt) != isutyp(ot)) {
- /* conversion to %s may sign-extend incorrectly (, arg #%d) */
- if (aflag && pflag) {
- if (op == FARG) {
- warning(297, tyname(tp), arg);
- } else {
- warning(131, tyname(tp));
- }
- }
- }
-#endif
-
- if (psize(nt) < psize(ot) &&
- (ot == LONG || ot == ULONG || ot == QUAD || ot == UQUAD ||
- aflag > 1)) {
- /* conversion from '%s' may lose accuracy */
- if (aflag) {
- if (op == FARG) {
- warning(298, tyname(tn->tn_type), arg);
- } else {
- warning(132, tyname(tn->tn_type));
- }
- }
- }
-}
-
-/*
- * Print warnings for dubious conversions of pointer to integer.
- */
-static void
-piconv(op_t op, tspec_t nt, type_t *tp, tnode_t *tn)
-{
-
- if (tn->tn_op == CON)
- return;
-
- if (op != CVT) {
- /* We got already an error. */
- return;
- }
-
- if (psize(nt) < psize(PTR)) {
- if (pflag && size(nt) >= size(PTR)) {
- /* conv. of pointer to %s may lose bits */
- warning(134, tyname(tp));
- } else {
- /* conv. of pointer to %s loses bits */
- warning(133, tyname(tp));
- }
- }
-}
-
-/*
- * Print warnings for questionable pointer conversions.
- */
-static void
-ppconv(op_t op, tnode_t *tn, type_t *tp)
-{
- tspec_t nt, ot;
- const char *nts, *ots;
-
- /*
- * We got already an error (pointers of different types
- * without a cast) or we will not get a warning.
- */
- if (op != CVT)
- return;
-
- nt = tp->t_subt->t_tspec;
- ot = tn->tn_type->t_subt->t_tspec;
-
- if (nt == VOID || ot == VOID) {
- if (sflag && (nt == FUNC || ot == FUNC)) {
- /* (void *)0 already handled in convert() */
- *(nt == FUNC ? &nts : &ots) = "function pointer";
- *(nt == VOID ? &nts : &ots) = "'void *'";
- /* ANSI C forbids conversion of %s to %s */
- warning(303, ots, nts);
- }
- return;
- } else if (nt == FUNC && ot == FUNC) {
- return;
- } else if (nt == FUNC || ot == FUNC) {
- /* questionable conversion of function pointer */
- warning(229);
- return;
- }
-
- if (getbound(tp->t_subt) > getbound(tn->tn_type->t_subt)) {
- if (hflag)
- /* possible pointer alignment problem */
- warning(135);
- }
- if (((nt == STRUCT || nt == UNION) &&
- tp->t_subt->t_str != tn->tn_type->t_subt->t_str) ||
- psize(nt) != psize(ot)) {
- if (cflag) {
- /* pointer casts may be troublesome */
- warning(247);
- }
- }
-}
-
-/*
- * Converts a typed constant in a constant of another type.
- *
- * op operator which requires conversion
- * arg if op is FARG, # of argument
- * tp type in which to convert the constant
- * nv new constant
- * v old constant
- */
-void
-cvtcon(op_t op, int arg, type_t *tp, val_t *nv, val_t *v)
-{
- tspec_t ot, nt;
- ldbl_t max = 0.0, min = 0.0;
- int sz, rchk;
- int64_t xmask, xmsk1;
- int osz, nsz;
-
- ot = v->v_tspec;
- nt = nv->v_tspec = tp->t_tspec;
- rchk = 0;
-
- if (ot == FLOAT || ot == DOUBLE || ot == LDOUBLE) {
- switch (nt) {
- case CHAR:
- max = CHAR_MAX; min = CHAR_MIN; break;
- case UCHAR:
- max = UCHAR_MAX; min = 0; break;
- case SCHAR:
- max = SCHAR_MAX; min = SCHAR_MIN; break;
- case SHORT:
- max = SHRT_MAX; min = SHRT_MIN; break;
- case USHORT:
- max = USHRT_MAX; min = 0; break;
- case ENUM:
- case INT:
- max = INT_MAX; min = INT_MIN; break;
- case UINT:
- max = (u_int)UINT_MAX; min = 0; break;
- case LONG:
- max = LONG_MAX; min = LONG_MIN; break;
- case ULONG:
- max = (u_long)ULONG_MAX; min = 0; break;
- case QUAD:
- max = QUAD_MAX; min = QUAD_MIN; break;
- case UQUAD:
- max = (uint64_t)UQUAD_MAX; min = 0; break;
- case FLOAT:
- max = FLT_MAX; min = -FLT_MAX; break;
- case DOUBLE:
- max = DBL_MAX; min = -DBL_MAX; break;
- case PTR:
- /* Got already an error because of float --> ptr */
- case LDOUBLE:
- max = LDBL_MAX; min = -LDBL_MAX; break;
- default:
- lerror("cvtcon() 1");
- }
- if (v->v_ldbl > max || v->v_ldbl < min) {
- if (nt == LDOUBLE)
- lerror("cvtcon() 2");
- if (op == FARG) {
- /* conv. of %s to %s is out of rng., arg #%d */
- warning(295, tyname(gettyp(ot)), tyname(tp),
- arg);
- } else {
- /* conversion of %s to %s is out of range */
- warning(119, tyname(gettyp(ot)), tyname(tp));
- }
- v->v_ldbl = v->v_ldbl > 0 ? max : min;
- }
- if (nt == FLOAT) {
- nv->v_ldbl = (float)v->v_ldbl;
- } else if (nt == DOUBLE) {
- nv->v_ldbl = (double)v->v_ldbl;
- } else if (nt == LDOUBLE) {
- nv->v_ldbl = v->v_ldbl;
- } else {
- nv->v_quad = (nt == PTR || isutyp(nt)) ?
- (uint64_t)v->v_ldbl : (int64_t)v->v_ldbl;
- }
- } else {
- if (nt == FLOAT) {
- nv->v_ldbl = (ot == PTR || isutyp(ot)) ?
- (float)(uint64_t)v->v_quad : (float)v->v_quad;
- } else if (nt == DOUBLE) {
- nv->v_ldbl = (ot == PTR || isutyp(ot)) ?
- (double)(uint64_t)v->v_quad : (double)v->v_quad;
- } else if (nt == LDOUBLE) {
- nv->v_ldbl = (ot == PTR || isutyp(ot)) ?
- (ldbl_t)(uint64_t)v->v_quad : (ldbl_t)v->v_quad;
- } else {
- rchk = 1; /* Check for lost precision. */
- nv->v_quad = v->v_quad;
- }
- }
-
- if (v->v_ansiu && isftyp(nt)) {
- /* ANSI C treats constant as unsigned */
- warning(157);
- v->v_ansiu = 0;
- } else if (v->v_ansiu && (isityp(nt) && !isutyp(nt) &&
- psize(nt) > psize(ot))) {
- /* ANSI C treats constant as unsigned */
- warning(157);
- v->v_ansiu = 0;
- }
-
- if (nt != FLOAT && nt != DOUBLE && nt != LDOUBLE) {
- sz = tp->t_isfield ? tp->t_flen : size(nt);
- nv->v_quad = xsign(nv->v_quad, nt, sz);
- }
-
- if (rchk && op != CVT) {
- osz = size(ot);
- nsz = tp->t_isfield ? tp->t_flen : size(nt);
- xmask = qlmasks[nsz] ^ qlmasks[osz];
- xmsk1 = qlmasks[nsz] ^ qlmasks[osz - 1];
- /*
- * For bitwise operations we are not interested in the
- * value, but in the bits itself.
- */
- if (op == ORASS || op == OR || op == XOR) {
- /*
- * Print a warning if bits which were set are
- * lost due to the conversion.
- * This can happen with operator ORASS only.
- */
- if (nsz < osz && (v->v_quad & xmask) != 0) {
- /* constant truncated by conv., op %s */
- warning(306, modtab[op].m_name);
- }
- } else if (op == ANDASS || op == AND) {
- /*
- * Print a warning if additional bits are not all 1
- * and the most significant bit of the old value is 1,
- * or if at least one (but not all) removed bit was 0.
- */
- if (nsz > osz &&
- (nv->v_quad & qbmasks[osz - 1]) != 0 &&
- (nv->v_quad & xmask) != xmask) {
- /*
- * extra bits set to 0 in conversion
- * of '%s' to '%s', op %s
- */
- warning(309, tyname(gettyp(ot)),
- tyname(tp), modtab[op].m_name);
- } else if (nsz < osz &&
- (v->v_quad & xmask) != xmask &&
- (v->v_quad & xmask) != 0) {
- /* const. truncated by conv., op %s */
- warning(306, modtab[op].m_name);
- }
- } else if ((nt != PTR && isutyp(nt)) &&
- (ot != PTR && !isutyp(ot)) && v->v_quad < 0) {
- if (op == ASSIGN) {
- /* assignment of negative constant to ... */
- warning(164);
- } else if (op == INIT) {
- /* initialisation of unsigned with neg. ... */
- warning(221);
- } else if (op == FARG) {
- /* conversion of neg. const. to ..., arg #%d */
- warning(296, arg);
- } else if (modtab[op].m_comp) {
- /* we get this warning already in chkcomp() */
- } else {
- /* conversion of negative constant to ... */
- warning(222);
- }
- } else if (nv->v_quad != v->v_quad && nsz <= osz &&
- (v->v_quad & xmask) != 0 &&
- (isutyp(ot) || (v->v_quad & xmsk1) != xmsk1)) {
- /*
- * Loss of significant bit(s). All truncated bits
- * of unsigned types or all truncated bits plus the
- * msb of the target for signed types are considered
- * to be significant bits. Loss of significant bits
- * means that at least on of the bits was set in an
- * unsigned type or that at least one, but not all of
- * the bits was set in a signed type.
- * Loss of significant bits means that it is not
- * possible, also not with necessary casts, to convert
- * back to the original type. An example for a
- * necessary cast is:
- * char c; int i; c = 128;
- * i = c; ** yields -128 **
- * i = (unsigned char)c; ** yields 128 **
- */
- if (op == ASSIGN && tp->t_isfield) {
- /* precision lost in bit-field assignment */
- warning(166);
- } else if (op == ASSIGN) {
- /* constant truncated by assignment */
- warning(165);
- } else if (op == INIT && tp->t_isfield) {
- /* bit-field initializer does not fit */
- warning(180);
- } else if (op == INIT) {
- /* initializer does not fit */
- warning(178);
- } else if (op == CASE) {
- /* case label affected by conversion */
- warning(196);
- } else if (op == FARG) {
- /* conv. of %s to %s is out of rng., arg #%d */
- warning(295, tyname(gettyp(ot)), tyname(tp),
- arg);
- } else {
- /* conversion of %s to %s is out of range */
- warning(119, tyname(gettyp(ot)), tyname(tp));
- }
- } else if (nv->v_quad != v->v_quad) {
- if (op == ASSIGN && tp->t_isfield) {
- /* precision lost in bit-field assignment */
- warning(166);
- } else if (op == INIT && tp->t_isfield) {
- /* bit-field initializer out of range */
- warning(11);
- } else if (op == CASE) {
- /* case label affected by conversion */
- warning(196);
- } else if (op == FARG) {
- /* conv. of %s to %s is out of rng., arg #%d */
- warning(295, tyname(gettyp(ot)), tyname(tp),
- arg);
- } else {
- /* conversion of %s to %s is out of range */
- warning(119, tyname(gettyp(ot)), tyname(tp));
- }
- }
- }
-}
-
-/*
- * Called if incompatible types were detected.
- * Prints an appropriate warning.
- */
-static void
-incompat(op_t op, tspec_t lt, tspec_t rt)
-{
- mod_t *mp;
-
- mp = &modtab[op];
-
- if (lt == VOID || (mp->m_binary && rt == VOID)) {
- /* void type illegal in expression */
- error(109);
- } else if (op == ASSIGN) {
- if ((lt == STRUCT || lt == UNION) &&
- (rt == STRUCT || rt == UNION)) {
- /* assignment of different structures */
- error(240);
- } else {
- /* assignment type mismatch */
- error(171);
- }
- } else if (mp->m_binary) {
- /* operands of %s have incompatible types */
- error(107, mp->m_name);
- } else {
- /* operand of %s has incompatible type */
- error(108, mp->m_name);
- }
-}
-
-/*
- * Called if incompatible pointer types are detected.
- * Print an appropriate warning.
- */
-static void
-illptrc(mod_t *mp, type_t *ltp, type_t *rtp)
-{
- tspec_t lt, rt;
-
- if (ltp->t_tspec != PTR || rtp->t_tspec != PTR)
- lerror("illptrc() 1");
-
- lt = ltp->t_subt->t_tspec;
- rt = rtp->t_subt->t_tspec;
-
- if ((lt == STRUCT || lt == UNION) && (rt == STRUCT || rt == UNION)) {
- if (mp == NULL) {
- /* illegal structure pointer combination */
- warning(244);
- } else {
- /* illegal structure pointer combination, op %s */
- warning(245, mp->m_name);
- }
- } else {
- if (mp == NULL) {
- /* illegal pointer combination */
- warning(184);
- } else {
- /* illegal pointer combination, op %s */
- warning(124, mp->m_name);
- }
- }
-}
-
-/*
- * Make sure type (*tpp)->t_subt has at least the qualifiers
- * of tp1->t_subt and tp2->t_subt.
- */
-static void
-mrgqual(type_t **tpp, type_t *tp1, type_t *tp2)
-{
-
- if ((*tpp)->t_tspec != PTR ||
- tp1->t_tspec != PTR || tp2->t_tspec != PTR) {
- lerror("mrgqual()");
- }
-
- if ((*tpp)->t_subt->t_const ==
- (tp1->t_subt->t_const | tp2->t_subt->t_const) &&
- (*tpp)->t_subt->t_volatile ==
- (tp1->t_subt->t_volatile | tp2->t_subt->t_volatile)) {
- return;
- }
-
- *tpp = tduptyp(*tpp);
- (*tpp)->t_subt = tduptyp((*tpp)->t_subt);
- (*tpp)->t_subt->t_const =
- tp1->t_subt->t_const | tp2->t_subt->t_const;
- (*tpp)->t_subt->t_volatile =
- tp1->t_subt->t_volatile | tp2->t_subt->t_volatile;
-}
-
-/*
- * Returns 1 if the given structure or union has a constant member
- * (maybe recursively).
- */
-static int
-conmemb(type_t *tp)
-{
- sym_t *m;
- tspec_t t;
-
- if ((t = tp->t_tspec) != STRUCT && t != UNION)
- lerror("conmemb()");
- for (m = tp->t_str->memb; m != NULL; m = m->s_nxt) {
- tp = m->s_type;
- if (tp->t_const)
- return (1);
- if ((t = tp->t_tspec) == STRUCT || t == UNION) {
- if (conmemb(m->s_type))
- return (1);
- }
- }
- return (0);
-}
-
-const char *
-tyname(type_t *tp)
-{
- tspec_t t;
- const char *s;
-
- if ((t = tp->t_tspec) == INT && tp->t_isenum)
- t = ENUM;
-
- switch (t) {
- case CHAR: s = "char"; break;
- case UCHAR: s = "unsigned char"; break;
- case SCHAR: s = "signed char"; break;
- case SHORT: s = "short"; break;
- case USHORT: s = "unsigned short"; break;
- case INT: s = "int"; break;
- case UINT: s = "unsigned int"; break;
- case LONG: s = "long"; break;
- case ULONG: s = "unsigned long"; break;
- case QUAD: s = "long long"; break;
- case UQUAD: s = "unsigned long long"; break;
- case FLOAT: s = "float"; break;
- case DOUBLE: s = "double"; break;
- case LDOUBLE: s = "long double"; break;
- case PTR: s = "pointer"; break;
- case ENUM: s = "enum"; break;
- case STRUCT: s = "struct"; break;
- case UNION: s = "union"; break;
- case FUNC: s = "function"; break;
- case ARRAY: s = "array"; break;
- default:
- lerror("tyname()");
- }
- return (s);
-}
-
-/*
- * Create a new node for one of the operators POINT and ARROW.
- */
-static tnode_t *
-bldstr(op_t op, tnode_t *ln, tnode_t *rn)
-{
- tnode_t *ntn, *ctn;
- int nolval;
-
- if (rn->tn_op != NAME)
- lerror("bldstr() 1");
- if (rn->tn_sym->s_value.v_tspec != INT)
- lerror("bldstr() 2");
- if (rn->tn_sym->s_scl != MOS && rn->tn_sym->s_scl != MOU)
- lerror("bldstr() 3");
-
- /*
- * Remember if the left operand is an lvalue (structure members
- * are lvalues if and only if the structure itself is an lvalue).
- */
- nolval = op == POINT && !ln->tn_lvalue;
-
- if (op == POINT) {
- ln = bldamper(ln, 1);
- } else if (ln->tn_type->t_tspec != PTR) {
- if (!tflag || !isityp(ln->tn_type->t_tspec))
- lerror("bldstr() 4");
- ln = convert(NOOP, 0, tincref(gettyp(VOID), PTR), ln);
- }
-
-#if PTRDIFF_IS_LONG
- ctn = getinode(LONG, rn->tn_sym->s_value.v_quad / CHAR_BIT);
-#else
- ctn = getinode(INT, rn->tn_sym->s_value.v_quad / CHAR_BIT);
-#endif
-
- ntn = mktnode(PLUS, tincref(rn->tn_type, PTR), ln, ctn);
- if (ln->tn_op == CON)
- ntn = fold(ntn);
-
- if (rn->tn_type->t_isfield) {
- ntn = mktnode(FSEL, ntn->tn_type->t_subt, ntn, NULL);
- } else {
- ntn = mktnode(STAR, ntn->tn_type->t_subt, ntn, NULL);
- }
-
- if (nolval)
- ntn->tn_lvalue = 0;
-
- return (ntn);
-}
-
-/*
- * Create a node for INCAFT, INCBEF, DECAFT and DECBEF.
- */
-static tnode_t *
-bldincdec(op_t op, tnode_t *ln)
-{
- tnode_t *cn, *ntn;
-
- if (ln == NULL)
- lerror("bldincdec() 1");
-
- if (ln->tn_type->t_tspec == PTR) {
- cn = plength(ln->tn_type);
- } else {
- cn = getinode(INT, (int64_t)1);
- }
- ntn = mktnode(op, ln->tn_type, ln, cn);
-
- return (ntn);
-}
-
-/*
- * Create a tree node for the & operator
- */
-static tnode_t *
-bldamper(tnode_t *tn, int noign)
-{
- tnode_t *ntn;
- tspec_t t;
-
- if (!noign && ((t = tn->tn_type->t_tspec) == ARRAY || t == FUNC)) {
- /* & before array or function: ignored */
- if (tflag)
- warning(127);
- return (tn);
- }
-
- /* eliminate &* */
- if (tn->tn_op == STAR &&
- tn->tn_left->tn_type->t_tspec == PTR &&
- tn->tn_left->tn_type->t_subt == tn->tn_type) {
- return (tn->tn_left);
- }
-
- ntn = mktnode(AMPER, tincref(tn->tn_type, PTR), tn, NULL);
-
- return (ntn);
-}
-
-/*
- * Create a node for operators PLUS and MINUS.
- */
-static tnode_t *
-bldplmi(op_t op, tnode_t *ln, tnode_t *rn)
-{
- tnode_t *ntn, *ctn;
- type_t *tp;
-
- /* If pointer and integer, then pointer to the lhs. */
- if (rn->tn_type->t_tspec == PTR && isityp(ln->tn_type->t_tspec)) {
- ntn = ln;
- ln = rn;
- rn = ntn;
- }
-
- if (ln->tn_type->t_tspec == PTR && rn->tn_type->t_tspec != PTR) {
-
- if (!isityp(rn->tn_type->t_tspec))
- lerror("bldplmi() 1");
-
- ctn = plength(ln->tn_type);
- if (rn->tn_type->t_tspec != ctn->tn_type->t_tspec)
- rn = convert(NOOP, 0, ctn->tn_type, rn);
- rn = mktnode(MULT, rn->tn_type, rn, ctn);
- if (rn->tn_left->tn_op == CON)
- rn = fold(rn);
- ntn = mktnode(op, ln->tn_type, ln, rn);
-
- } else if (rn->tn_type->t_tspec == PTR) {
-
- if (ln->tn_type->t_tspec != PTR || op != MINUS)
- lerror("bldplmi() 2");
-#if PTRDIFF_IS_LONG
- tp = gettyp(LONG);
-#else
- tp = gettyp(INT);
-#endif
- ntn = mktnode(op, tp, ln, rn);
- if (ln->tn_op == CON && rn->tn_op == CON)
- ntn = fold(ntn);
- ctn = plength(ln->tn_type);
- balance(NOOP, &ntn, &ctn);
- ntn = mktnode(DIV, tp, ntn, ctn);
-
- } else {
-
- ntn = mktnode(op, ln->tn_type, ln, rn);
-
- }
- return (ntn);
-}
-
-/*
- * Create a node for operators SHL and SHR.
- */
-static tnode_t *
-bldshft(op_t op, tnode_t *ln, tnode_t *rn)
-{
- tspec_t t;
- tnode_t *ntn;
-
- if ((t = rn->tn_type->t_tspec) != INT && t != UINT)
- rn = convert(CVT, 0, gettyp(INT), rn);
- ntn = mktnode(op, ln->tn_type, ln, rn);
- return (ntn);
-}
-
-/*
- * Create a node for COLON.
- */
-static tnode_t *
-bldcol(tnode_t *ln, tnode_t *rn)
-{
- tspec_t lt, rt, pdt;
- type_t *rtp;
- tnode_t *ntn;
-
- lt = ln->tn_type->t_tspec;
- rt = rn->tn_type->t_tspec;
-#if PTRDIFF_IS_LONG
- pdt = LONG;
-#else
- pdt = INT;
-#endif
-
- /*
- * Arithmetic types are balanced, all other type combinations
- * still need to be handled.
- */
- if (isatyp(lt) && isatyp(rt)) {
- rtp = ln->tn_type;
- } else if (lt == VOID || rt == VOID) {
- rtp = gettyp(VOID);
- } else if (lt == STRUCT || lt == UNION) {
- /* Both types must be identical. */
- if (rt != STRUCT && rt != UNION)
- lerror("bldcol() 1");
- if (ln->tn_type->t_str != rn->tn_type->t_str)
- lerror("bldcol() 2");
- if (incompl(ln->tn_type)) {
- /* unknown operand size, op %s */
- error(138, modtab[COLON].m_name);
- return (NULL);
- }
- rtp = ln->tn_type;
- } else if (lt == PTR && isityp(rt)) {
- if (rt != pdt) {
- rn = convert(NOOP, 0, gettyp(pdt), rn);
- rt = pdt;
- }
- rtp = ln->tn_type;
- } else if (rt == PTR && isityp(lt)) {
- if (lt != pdt) {
- ln = convert(NOOP, 0, gettyp(pdt), ln);
- lt = pdt;
- }
- rtp = rn->tn_type;
- } else if (lt == PTR && ln->tn_type->t_subt->t_tspec == VOID) {
- if (rt != PTR)
- lerror("bldcol() 4");
- rtp = ln->tn_type;
- mrgqual(&rtp, ln->tn_type, rn->tn_type);
- } else if (rt == PTR && rn->tn_type->t_subt->t_tspec == VOID) {
- if (lt != PTR)
- lerror("bldcol() 5");
- rtp = rn->tn_type;
- mrgqual(&rtp, ln->tn_type, rn->tn_type);
- } else {
- if (lt != PTR || rt != PTR)
- lerror("bldcol() 6");
- /*
- * XXX For now we simply take the left type. This is
- * probably wrong, if one type contains a functionprototype
- * and the other one, at the same place, only an old style
- * declaration.
- */
- rtp = ln->tn_type;
- mrgqual(&rtp, ln->tn_type, rn->tn_type);
- }
-
- ntn = mktnode(COLON, rtp, ln, rn);
-
- return (ntn);
-}
-
-/*
- * Create a node for an assignment operator (both = and op= ).
- */
-static tnode_t *
-bldasgn(op_t op, tnode_t *ln, tnode_t *rn)
-{
- tspec_t lt, rt;
- tnode_t *ntn, *ctn;
-
- if (ln == NULL || rn == NULL)
- lerror("bldasgn() 1");
-
- lt = ln->tn_type->t_tspec;
- rt = rn->tn_type->t_tspec;
-
- if ((op == ADDASS || op == SUBASS) && lt == PTR) {
- if (!isityp(rt))
- lerror("bldasgn() 2");
- ctn = plength(ln->tn_type);
- if (rn->tn_type->t_tspec != ctn->tn_type->t_tspec)
- rn = convert(NOOP, 0, ctn->tn_type, rn);
- rn = mktnode(MULT, rn->tn_type, rn, ctn);
- if (rn->tn_left->tn_op == CON)
- rn = fold(rn);
- }
-
- if ((op == ASSIGN || op == RETURN) && (lt == STRUCT || rt == STRUCT)) {
- if (rt != lt || ln->tn_type->t_str != rn->tn_type->t_str)
- lerror("bldasgn() 3");
- if (incompl(ln->tn_type)) {
- if (op == RETURN) {
- /* cannot return incomplete type */
- error(212);
- } else {
- /* unknown operand size, op %s */
- error(138, modtab[op].m_name);
- }
- return (NULL);
- }
- }
-
- if (op == SHLASS || op == SHRASS) {
- if (rt != INT) {
- rn = convert(NOOP, 0, gettyp(INT), rn);
- rt = INT;
- }
- } else {
- if (op == ASSIGN || lt != PTR) {
- if (lt != rt ||
- (ln->tn_type->t_isfield && rn->tn_op == CON)) {
- rn = convert(op, 0, ln->tn_type, rn);
- rt = lt;
- }
- }
- }
-
- ntn = mktnode(op, ln->tn_type, ln, rn);
-
- return (ntn);
-}
-
-/*
- * Get length of type tp->t_subt.
- */
-static tnode_t *
-plength(type_t *tp)
-{
- int elem, elsz;
- tspec_t st;
-
- if (tp->t_tspec != PTR)
- lerror("plength() 1");
- tp = tp->t_subt;
-
- elem = 1;
- elsz = 0;
-
- while (tp->t_tspec == ARRAY) {
- elem *= tp->t_dim;
- tp = tp->t_subt;
- }
-
- switch (tp->t_tspec) {
- case FUNC:
- /* pointer to function is not allowed here */
- error(110);
- break;
- case VOID:
- /* cannot do pointer arithmetic on operand of ... */
- (void)gnuism(136);
- break;
- case STRUCT:
- case UNION:
- if ((elsz = tp->t_str->size) == 0)
- /* cannot do pointer arithmetic on operand of ... */
- error(136);
- break;
- case ENUM:
- if (incompl(tp)) {
- /* cannot do pointer arithmetic on operand of ... */
- warning(136);
- }
- /* FALLTHROUGH */
- default:
- if ((elsz = size(tp->t_tspec)) == 0) {
- /* cannot do pointer arithmetic on operand of ... */
- error(136);
- } else if (elsz == -1) {
- lerror("plength() 2");
- }
- break;
- }
-
- if (elem == 0 && elsz != 0) {
- /* cannot do pointer arithmetic on operand of ... */
- error(136);
- }
-
- if (elsz == 0)
- elsz = CHAR_BIT;
-
-#if PTRDIFF_IS_LONG
- st = LONG;
-#else
- st = INT;
-#endif
-
- return (getinode(st, (int64_t)(elem * elsz / CHAR_BIT)));
-}
-
-/*
- * XXX
- * Note: There appear to be a number of bugs in detecting overflow in
- * this function. An audit and a set of proper regression tests are needed.
- * --Perry Metzger, Nov. 16, 2001
- */
-/*
- * Do only as much as necessary to compute constant expressions.
- * Called only if the operator allows folding and (both) operands
- * are constants.
- */
-static tnode_t *
-fold(tnode_t *tn)
-{
- val_t *v;
- tspec_t t;
- int utyp, ovfl;
- int64_t sl, sr = 0, q = 0, mask;
- uint64_t ul, ur = 0;
- tnode_t *cn;
-
- if ((v = calloc(1, sizeof (val_t))) == NULL)
- nomem();
- v->v_tspec = t = tn->tn_type->t_tspec;
-
- utyp = t == PTR || isutyp(t);
- ul = sl = tn->tn_left->tn_val->v_quad;
- if (modtab[tn->tn_op].m_binary)
- ur = sr = tn->tn_right->tn_val->v_quad;
-
- mask = qlmasks[size(t)];
- ovfl = 0;
-
- switch (tn->tn_op) {
- case UPLUS:
- q = sl;
- break;
- case UMINUS:
- q = -sl;
- if (msb(q, t, -1) == msb(sl, t, -1))
- ovfl = 1;
- break;
- case COMPL:
- q = ~sl;
- break;
- case MULT:
- if (utyp) {
- q = ul * ur;
- if (q != (q & mask))
- ovfl = 1;
- else if ((ul != 0) && ((q / ul) != ur))
- ovfl = 1;
- } else {
- q = sl * sr;
- if (msb(q, t, -1) != (msb(sl, t, -1) ^ msb(sr, t, -1)))
- ovfl = 1;
- }
- break;
- case DIV:
- if (sr == 0) {
- /* division by 0 */
- error(139);
- q = utyp ? UQUAD_MAX : QUAD_MAX;
- } else {
- q = utyp ? ul / ur : sl / sr;
- }
- break;
- case MOD:
- if (sr == 0) {
- /* modulus by 0 */
- error(140);
- q = 0;
- } else {
- q = utyp ? ul % ur : sl % sr;
- }
- break;
- case PLUS:
- q = utyp ? ul + ur : sl + sr;
- if (msb(sl, t, -1) != 0 && msb(sr, t, -1) != 0) {
- if (msb(q, t, -1) == 0)
- ovfl = 1;
- } else if (msb(sl, t, -1) == 0 && msb(sr, t, -1) == 0) {
- if (msb(q, t, -1) != 0)
- ovfl = 1;
- }
- break;
- case MINUS:
- q = utyp ? ul - ur : sl - sr;
- if (msb(sl, t, -1) != 0 && msb(sr, t, -1) == 0) {
- if (msb(q, t, -1) == 0)
- ovfl = 1;
- } else if (msb(sl, t, -1) == 0 && msb(sr, t, -1) != 0) {
- if (msb(q, t, -1) != 0)
- ovfl = 1;
- }
- break;
- case SHL:
- q = utyp ? ul << sr : sl << sr;
- break;
- case SHR:
- /*
- * The sign must be explicitly extended because
- * shifts of signed values are implementation dependent.
- */
- q = ul >> sr;
- q = xsign(q, t, size(t) - (int)sr);
- break;
- case LT:
- q = utyp ? ul < ur : sl < sr;
- break;
- case LE:
- q = utyp ? ul <= ur : sl <= sr;
- break;
- case GE:
- q = utyp ? ul >= ur : sl >= sr;
- break;
- case GT:
- q = utyp ? ul > ur : sl > sr;
- break;
- case EQ:
- q = utyp ? ul == ur : sl == sr;
- break;
- case NE:
- q = utyp ? ul != ur : sl != sr;
- break;
- case AND:
- q = utyp ? ul & ur : sl & sr;
- break;
- case XOR:
- q = utyp ? ul ^ ur : sl ^ sr;
- break;
- case OR:
- q = utyp ? ul | ur : sl | sr;
- break;
- default:
- lerror("fold() 5");
- }
-
- /* XXX does not work for quads. */
- if (ovfl || ((q | mask) != ~(uint64_t)0 && (q & ~mask) != 0)) {
- if (hflag)
- /* integer overflow detected, op %s */
- warning(141, modtab[tn->tn_op].m_name);
- }
-
- v->v_quad = xsign(q, t, -1);
-
- cn = getcnode(tn->tn_type, v);
-
- return (cn);
-}
-
-/*
- * Same for operators whose operands are compared with 0 (test context).
- */
-static tnode_t *
-foldtst(tnode_t *tn)
-{
- int l, r = 0;
- val_t *v;
-
- if ((v = calloc(1, sizeof (val_t))) == NULL)
- nomem();
- v->v_tspec = tn->tn_type->t_tspec;
- if (tn->tn_type->t_tspec != INT)
- lerror("foldtst() 1");
-
- if (isftyp(tn->tn_left->tn_type->t_tspec)) {
- l = tn->tn_left->tn_val->v_ldbl != 0.0;
- } else {
- l = tn->tn_left->tn_val->v_quad != 0;
- }
-
- if (modtab[tn->tn_op].m_binary) {
- if (isftyp(tn->tn_right->tn_type->t_tspec)) {
- r = tn->tn_right->tn_val->v_ldbl != 0.0;
- } else {
- r = tn->tn_right->tn_val->v_quad != 0;
- }
- }
-
- switch (tn->tn_op) {
- case NOT:
- if (hflag)
- /* constant argument to NOT */
- warning(239);
- v->v_quad = !l;
- break;
- case LOGAND:
- v->v_quad = l && r;
- break;
- case LOGOR:
- v->v_quad = l || r;
- break;
- default:
- lerror("foldtst() 1");
- }
-
- return (getcnode(tn->tn_type, v));
-}
-
-/*
- * Same for operands with floating point type.
- */
-static tnode_t *
-foldflt(tnode_t *tn)
-{
- val_t *v;
- tspec_t t;
- ldbl_t l, r = 0;
-
- if ((v = calloc(1, sizeof (val_t))) == NULL)
- nomem();
- v->v_tspec = t = tn->tn_type->t_tspec;
-
- if (!isftyp(t))
- lerror("foldflt() 1");
-
- if (t != tn->tn_left->tn_type->t_tspec)
- lerror("foldflt() 2");
- if (modtab[tn->tn_op].m_binary && t != tn->tn_right->tn_type->t_tspec)
- lerror("foldflt() 3");
-
- l = tn->tn_left->tn_val->v_ldbl;
- if (modtab[tn->tn_op].m_binary)
- r = tn->tn_right->tn_val->v_ldbl;
-
- switch (tn->tn_op) {
- case UPLUS:
- v->v_ldbl = l;
- break;
- case UMINUS:
- v->v_ldbl = -l;
- break;
- case MULT:
- v->v_ldbl = l * r;
- break;
- case DIV:
- if (r == 0.0) {
- /* division by 0 */
- error(139);
- if (t == FLOAT) {
- v->v_ldbl = l < 0 ? -FLT_MAX : FLT_MAX;
- } else if (t == DOUBLE) {
- v->v_ldbl = l < 0 ? -DBL_MAX : DBL_MAX;
- } else {
- v->v_ldbl = l < 0 ? -LDBL_MAX : LDBL_MAX;
- }
- } else {
- v->v_ldbl = l / r;
- }
- break;
- case PLUS:
- v->v_ldbl = l + r;
- break;
- case MINUS:
- v->v_ldbl = l - r;
- break;
- case LT:
- v->v_quad = l < r;
- break;
- case LE:
- v->v_quad = l <= r;
- break;
- case GE:
- v->v_quad = l >= r;
- break;
- case GT:
- v->v_quad = l > r;
- break;
- case EQ:
- v->v_quad = l == r;
- break;
- case NE:
- v->v_quad = l != r;
- break;
- default:
- lerror("foldflt() 4");
- }
-
- if (isnan((double)v->v_ldbl))
- lerror("foldflt() 5");
- if (!finite((double)v->v_ldbl) ||
- (t == FLOAT &&
- (v->v_ldbl > FLT_MAX || v->v_ldbl < -FLT_MAX)) ||
- (t == DOUBLE &&
- (v->v_ldbl > DBL_MAX || v->v_ldbl < -DBL_MAX))) {
- /* floating point overflow detected, op %s */
- warning(142, modtab[tn->tn_op].m_name);
- if (t == FLOAT) {
- v->v_ldbl = v->v_ldbl < 0 ? -FLT_MAX : FLT_MAX;
- } else if (t == DOUBLE) {
- v->v_ldbl = v->v_ldbl < 0 ? -DBL_MAX : DBL_MAX;
- } else {
- v->v_ldbl = v->v_ldbl < 0 ? -LDBL_MAX: LDBL_MAX;
- }
- }
-
- return (getcnode(tn->tn_type, v));
-}
-
-/*
- * Create a constant node for sizeof.
- */
-tnode_t *
-bldszof(type_t *tp)
-{
- int elem, elsz;
- tspec_t st;
-
- elem = 1;
- while (tp->t_tspec == ARRAY) {
- elem *= tp->t_dim;
- tp = tp->t_subt;
- }
- if (elem == 0) {
- /* cannot take size of incomplete type */
- error(143);
- elem = 1;
- }
- switch (tp->t_tspec) {
- case FUNC:
- /* cannot take size of function */
- error(144);
- elsz = 1;
- break;
- case STRUCT:
- case UNION:
- if (incompl(tp)) {
- /* cannot take size of incomplete type */
- error(143);
- elsz = 1;
- } else {
- elsz = tp->t_str->size;
- }
- break;
- case ENUM:
- if (incompl(tp)) {
- /* cannot take size of incomplete type */
- warning(143);
- }
- /* FALLTHROUGH */
- default:
- if (tp->t_isfield) {
- /* cannot take size of bit-field */
- error(145);
- }
- if (tp->t_tspec == VOID) {
- /* cannot take size of void */
- error(146);
- elsz = 1;
- } else {
- elsz = size(tp->t_tspec);
- if (elsz <= 0)
- lerror("bldszof() 1");
- }
- break;
- }
-
-#if SIZEOF_IS_ULONG
- st = ULONG;
-#else
- st = UINT;
-#endif
-
- return (getinode(st, (int64_t)(elem * elsz / CHAR_BIT)));
-}
-
-/*
- * Type casts.
- */
-tnode_t *
-cast(tnode_t *tn, type_t *tp)
-{
- tspec_t nt, ot;
-
- if (tn == NULL)
- return (NULL);
-
- tn = cconv(tn);
-
- nt = tp->t_tspec;
- ot = tn->tn_type->t_tspec;
-
- if (nt == VOID) {
- /*
- * XXX ANSI C requires scalar types or void (Plauger&Brodie).
- * But this seams really questionable.
- */
- } else if (nt == STRUCT || nt == UNION || nt == ARRAY || nt == FUNC) {
- /* invalid cast expression */
- error(147);
- return (NULL);
- } else if (ot == STRUCT || ot == UNION) {
- /* invalid cast expression */
- error(147);
- return (NULL);
- } else if (ot == VOID) {
- /* improper cast of void expression */
- error(148);
- return (NULL);
- } else if (isityp(nt) && issclt(ot)) {
- /* ok */
- } else if (isftyp(nt) && isatyp(ot)) {
- /* ok */
- } else if (nt == PTR && isityp(ot)) {
- /* ok */
- } else if (nt == PTR && ot == PTR) {
- if (!tp->t_subt->t_const && tn->tn_type->t_subt->t_const) {
- if (hflag)
- /* cast discards 'const' from ... */
- warning(275);
- }
- } else {
- /* invalid cast expression */
- error(147);
- return (NULL);
- }
-
- tn = convert(CVT, 0, tp, tn);
- tn->tn_cast = 1;
-
- return (tn);
-}
-
-/*
- * Create the node for a function argument.
- * All necessary conversions and type checks are done in funccall(), because
- * in funcarg() we have no information about expected argument types.
- */
-tnode_t *
-funcarg(tnode_t *args, tnode_t *arg)
-{
- tnode_t *ntn;
-
- /*
- * If there was a serious error in the expression for the argument,
- * create a dummy argument so the positions of the remaining arguments
- * will not change.
- */
- if (arg == NULL)
- arg = getinode(INT, (int64_t)0);
-
- ntn = mktnode(PUSH, arg->tn_type, arg, args);
-
- return (ntn);
-}
-
-/*
- * Create the node for a function call. Also check types of
- * function arguments and insert conversions, if necessary.
- */
-tnode_t *
-funccall(tnode_t *func, tnode_t *args)
-{
- tnode_t *ntn;
- op_t fcop;
-
- if (func == NULL)
- return (NULL);
-
- if (func->tn_op == NAME && func->tn_type->t_tspec == FUNC) {
- fcop = CALL;
- } else {
- fcop = ICALL;
- }
-
- /*
- * after cconv() func will always be a pointer to a function
- * if it is a valid function designator.
- */
- func = cconv(func);
-
- if (func->tn_type->t_tspec != PTR ||
- func->tn_type->t_subt->t_tspec != FUNC) {
- /* illegal function */
- error(149);
- return (NULL);
- }
-
- args = chkfarg(func->tn_type->t_subt, args);
-
- ntn = mktnode(fcop, func->tn_type->t_subt->t_subt, func, args);
-
- return (ntn);
-}
-
-/*
- * Check types of all function arguments and insert conversions,
- * if necessary.
- */
-static tnode_t *
-chkfarg(type_t *ftp, tnode_t *args)
-{
- tnode_t *arg;
- sym_t *asym;
- tspec_t at;
- int narg, npar, n, i;
-
- /* get # of args in the prototype */
- npar = 0;
- for (asym = ftp->t_args; asym != NULL; asym = asym->s_nxt)
- npar++;
-
- /* get # of args in function call */
- narg = 0;
- for (arg = args; arg != NULL; arg = arg->tn_right)
- narg++;
-
- asym = ftp->t_args;
- if (ftp->t_proto && npar != narg && !(ftp->t_vararg && npar < narg)) {
- /* argument mismatch: %d arg%s passed, %d expected */
- error(150, narg, narg > 1 ? "s" : "", npar);
- asym = NULL;
- }
-
- for (n = 1; n <= narg; n++) {
-
- /*
- * The rightmost argument is at the top of the argument
- * subtree.
- */
- for (i = narg, arg = args; i > n; i--, arg = arg->tn_right)
- continue;
-
- /* some things which are always not allowd */
- if ((at = arg->tn_left->tn_type->t_tspec) == VOID) {
- /* void expressions may not be arguments, arg #%d */
- error(151, n);
- return (NULL);
- } else if ((at == STRUCT || at == UNION) &&
- incompl(arg->tn_left->tn_type)) {
- /* argument cannot have unknown size, arg #%d */
- error(152, n);
- return (NULL);
- } else if (isityp(at) && arg->tn_left->tn_type->t_isenum &&
- incompl(arg->tn_left->tn_type)) {
- /* argument cannot have unknown size, arg #%d */
- warning(152, n);
- }
-
- /* class conversions (arg in value context) */
- arg->tn_left = cconv(arg->tn_left);
-
- if (asym != NULL) {
- arg->tn_left = parg(n, asym->s_type, arg->tn_left);
- } else {
- arg->tn_left = promote(NOOP, 1, arg->tn_left);
- }
- arg->tn_type = arg->tn_left->tn_type;
-
- if (asym != NULL)
- asym = asym->s_nxt;
- }
-
- return (args);
-}
-
-/*
- * Compare the type of an argument with the corresponding type of a
- * prototype parameter. If it is a valid combination, but both types
- * are not the same, insert a conversion to convert the argument into
- * the type of the parameter.
- */
-static tnode_t *
-parg( int n, /* pos of arg */
- type_t *tp, /* expected type (from prototype) */
- tnode_t *tn) /* argument */
-{
- tnode_t *ln;
- int warn;
-
- if ((ln = calloc(1, sizeof (tnode_t))) == NULL)
- nomem();
- ln->tn_type = tduptyp(tp);
- ln->tn_type->t_const = 0;
- ln->tn_lvalue = 1;
- if (typeok(FARG, n, ln, tn)) {
- if (!eqtype(tp, tn->tn_type, 1, 0, (warn = 0, &warn)) || warn)
- tn = convert(FARG, n, tp, tn);
- }
- free(ln);
- return (tn);
-}
-
-/*
- * Return the value of an integral constant expression.
- * If the expression is not constant or its type is not an integer
- * type, an error message is printed.
- */
-val_t *
-constant(tnode_t *tn)
-{
- val_t *v;
-
- if (tn != NULL)
- tn = cconv(tn);
- if (tn != NULL)
- tn = promote(NOOP, 0, tn);
-
- if ((v = calloc(1, sizeof (val_t))) == NULL)
- nomem();
-
- if (tn == NULL) {
- if (nerr == 0)
- lerror("constant() 1");
- v->v_tspec = INT;
- v->v_quad = 1;
- return (v);
- }
-
- v->v_tspec = tn->tn_type->t_tspec;
-
- if (tn->tn_op == CON) {
- if (tn->tn_type->t_tspec != tn->tn_val->v_tspec)
- lerror("constant() 2");
- if (isityp(tn->tn_val->v_tspec)) {
- v->v_ansiu = tn->tn_val->v_ansiu;
- v->v_quad = tn->tn_val->v_quad;
- return (v);
- }
- v->v_quad = tn->tn_val->v_ldbl;
- } else {
- v->v_quad = 1;
- }
-
- /* integral constant expression expected */
- error(55);
-
- if (!isityp(v->v_tspec))
- v->v_tspec = INT;
-
- return (v);
-}
-
-/*
- * Perform some tests on expressions which can't be done in build() and
- * functions called by build(). These tests must be done here because
- * we need some information about the context in which the operations
- * are performed.
- * After all tests are performed, expr() frees the memory which is used
- * for the expression.
- */
-void
-expr(tnode_t *tn, int vctx, int tctx)
-{
-
- if (tn == NULL && nerr == 0)
- lerror("expr() 1");
-
- if (tn == NULL) {
- tfreeblk();
- return;
- }
-
- /* expr() is also called in global initialisations */
- if (dcs->d_ctx != EXTERN)
- chkreach();
-
- chkmisc(tn, vctx, tctx, !tctx, 0, 0, 0);
- if (tn->tn_op == ASSIGN) {
- if (hflag && tctx)
- /* assignment in conditional context */
- warning(159);
- } else if (tn->tn_op == CON) {
- if (hflag && tctx && !ccflg)
- /* constant in conditional context */
- warning(161);
- }
- if (!modtab[tn->tn_op].m_sideeff) {
- /*
- * for left operands of COMMA this warning is already
- * printed
- */
- if (tn->tn_op != COMMA && !vctx && !tctx)
- nulleff(tn);
- }
- if (dflag)
- displexpr(tn, 0);
-
- /* free the tree memory */
- tfreeblk();
-}
-
-static void
-nulleff(tnode_t *tn)
-{
-
- if (!hflag)
- return;
-
- while (!modtab[tn->tn_op].m_sideeff) {
- if (tn->tn_op == CVT && tn->tn_type->t_tspec == VOID) {
- tn = tn->tn_left;
- } else if (tn->tn_op == LOGAND || tn->tn_op == LOGOR) {
- /*
- * && and || have a side effect if the right operand
- * has a side effect.
- */
- tn = tn->tn_right;
- } else if (tn->tn_op == QUEST) {
- /*
- * ? has a side effect if at least one of its right
- * operands has a side effect
- */
- tn = tn->tn_right;
- } else if (tn->tn_op == COLON || tn->tn_op == COMMA) {
- /*
- * : has a side effect if at least one of its operands
- * has a side effect
- */
- if (modtab[tn->tn_left->tn_op].m_sideeff) {
- tn = tn->tn_left;
- } else if (modtab[tn->tn_right->tn_op].m_sideeff) {
- tn = tn->tn_right;
- } else {
- break;
- }
- } else {
- break;
- }
- }
- if (!modtab[tn->tn_op].m_sideeff)
- /* expression has null effect */
- warning(129);
-}
-
-/*
- * Dump an expression to stdout
- * only used for debugging
- */
-static void
-displexpr(tnode_t *tn, int offs)
-{
- uint64_t uq;
-
- if (tn == NULL) {
- (void)printf("%*s%s\n", offs, "", "NULL");
- return;
- }
- (void)printf("%*sop %s ", offs, "", modtab[tn->tn_op].m_name);
-
- if (tn->tn_op == NAME) {
- (void)printf("%s: %s ",
- tn->tn_sym->s_name, scltoa(tn->tn_sym->s_scl));
- } else if (tn->tn_op == CON && isftyp(tn->tn_type->t_tspec)) {
- (void)printf("%#g ", (double)tn->tn_val->v_ldbl);
- } else if (tn->tn_op == CON && isityp(tn->tn_type->t_tspec)) {
- uq = tn->tn_val->v_quad;
- (void)printf("0x %08lx %08lx ", (long)(uq >> 32) & 0xffffffffl,
- (long)uq & 0xffffffffl);
- } else if (tn->tn_op == CON) {
- if (tn->tn_type->t_tspec != PTR)
- lerror("displexpr() 1");
- (void)printf("0x%0*lx ", (int)(sizeof (void *) * CHAR_BIT / 4),
- (u_long)tn->tn_val->v_quad);
- } else if (tn->tn_op == STRING) {
- if (tn->tn_strg->st_tspec == CHAR) {
- (void)printf("\"%s\"", tn->tn_strg->st_cp);
- } else {
- char *s;
- size_t n;
- n = MB_CUR_MAX * (tn->tn_strg->st_len + 1);
- if ((s = malloc(n)) == NULL)
- nomem();
- (void)wcstombs(s, tn->tn_strg->st_wcp, n);
- (void)printf("L\"%s\"", s);
- free(s);
- }
- (void)printf(" ");
- } else if (tn->tn_op == FSEL) {
- (void)printf("o=%d, l=%d ", tn->tn_type->t_foffs,
- tn->tn_type->t_flen);
- }
- (void)printf("%s\n", ttos(tn->tn_type));
- if (tn->tn_op == NAME || tn->tn_op == CON || tn->tn_op == STRING)
- return;
- displexpr(tn->tn_left, offs + 2);
- if (modtab[tn->tn_op].m_binary ||
- (tn->tn_op == PUSH && tn->tn_right != NULL)) {
- displexpr(tn->tn_right, offs + 2);
- }
-}
-
-/*
- * Called by expr() to recursively perform some tests.
- */
-/* ARGSUSED */
-void
-chkmisc(tnode_t *tn, int vctx, int tctx, int eqwarn, int fcall, int rvdisc,
- int szof)
-{
- tnode_t *ln, *rn;
- mod_t *mp;
- int nrvdisc, cvctx, ctctx;
- op_t op;
- scl_t sc;
- dinfo_t *di;
-
- if (tn == NULL)
- return;
-
- ln = tn->tn_left;
- rn = tn->tn_right;
- mp = &modtab[op = tn->tn_op];
-
- switch (op) {
- case AMPER:
- if (ln->tn_op == NAME && (reached || rchflg)) {
- if (!szof)
- setsflg(ln->tn_sym);
- setuflg(ln->tn_sym, fcall, szof);
- }
- if (ln->tn_op == STAR && ln->tn_left->tn_op == PLUS)
- /* check the range of array indices */
- chkaidx(ln->tn_left, 1);
- break;
- case LOAD:
- if (ln->tn_op == STAR && ln->tn_left->tn_op == PLUS)
- /* check the range of array indices */
- chkaidx(ln->tn_left, 0);
- /* FALLTHROUGH */
- case PUSH:
- case INCBEF:
- case DECBEF:
- case INCAFT:
- case DECAFT:
- case ADDASS:
- case SUBASS:
- case MULASS:
- case DIVASS:
- case MODASS:
- case ANDASS:
- case ORASS:
- case XORASS:
- case SHLASS:
- case SHRASS:
- if (ln->tn_op == NAME && (reached || rchflg)) {
- sc = ln->tn_sym->s_scl;
- /*
- * Look if there was an asm statement in one of the
- * compound statements we are in. If not, we don't
- * print a warning.
- */
- for (di = dcs; di != NULL; di = di->d_nxt) {
- if (di->d_asm)
- break;
- }
- if (sc != EXTERN && sc != STATIC &&
- !ln->tn_sym->s_set && !szof && di == NULL) {
- /* %s may be used before set */
- warning(158, ln->tn_sym->s_name);
- setsflg(ln->tn_sym);
- }
- setuflg(ln->tn_sym, 0, 0);
- }
- break;
- case ASSIGN:
- if (ln->tn_op == NAME && !szof && (reached || rchflg)) {
- setsflg(ln->tn_sym);
- if (ln->tn_sym->s_scl == EXTERN)
- outusg(ln->tn_sym);
- }
- if (ln->tn_op == STAR && ln->tn_left->tn_op == PLUS)
- /* check the range of array indices */
- chkaidx(ln->tn_left, 0);
- break;
- case CALL:
- if (ln->tn_op != AMPER || ln->tn_left->tn_op != NAME)
- lerror("chkmisc() 1");
- if (!szof)
- outcall(tn, vctx || tctx, rvdisc);
- break;
- case EQ:
- /* equality operator "==" found where "=" was exp. */
- if (hflag && eqwarn)
- warning(160);
- break;
- case CON:
- case NAME:
- case STRING:
- return;
- /* LINTED (enumeration values not handled in switch) */
- case OR:
- case XOR:
- case NE:
- case GE:
- case GT:
- case LE:
- case LT:
- case SHR:
- case SHL:
- case MINUS:
- case PLUS:
- case MOD:
- case DIV:
- case MULT:
- case STAR:
- case UMINUS:
- case UPLUS:
- case DEC:
- case INC:
- case COMPL:
- case NOT:
- case POINT:
- case ARROW:
- case NOOP:
- case AND:
- case FARG:
- case CASE:
- case INIT:
- case RETURN:
- case ICALL:
- case CVT:
- case COMMA:
- case FSEL:
- case COLON:
- case QUEST:
- case LOGOR:
- case LOGAND:
- break;
- }
-
- cvctx = mp->m_vctx;
- ctctx = mp->m_tctx;
- /*
- * values of operands of ':' are not used if the type of at least
- * one of the operands (for gcc compatibility) is void
- * XXX test/value context of QUEST should probably be used as
- * context for both operands of COLON
- */
- if (op == COLON && tn->tn_type->t_tspec == VOID)
- cvctx = ctctx = 0;
- nrvdisc = op == CVT && tn->tn_type->t_tspec == VOID;
- chkmisc(ln, cvctx, ctctx, mp->m_eqwarn, op == CALL, nrvdisc, szof);
-
- switch (op) {
- case PUSH:
- if (rn != NULL)
- chkmisc(rn, 0, 0, mp->m_eqwarn, 0, 0, szof);
- break;
- case LOGAND:
- case LOGOR:
- chkmisc(rn, 0, 1, mp->m_eqwarn, 0, 0, szof);
- break;
- case COLON:
- chkmisc(rn, cvctx, ctctx, mp->m_eqwarn, 0, 0, szof);
- break;
- case COMMA:
- chkmisc(rn, vctx, tctx, mp->m_eqwarn, 0, 0, szof);
- break;
- default:
- if (mp->m_binary)
- chkmisc(rn, 1, 0, mp->m_eqwarn, 0, 0, szof);
- break;
- }
-
-}
-
-/*
- * Checks the range of array indices, if possible.
- * amper is set if only the address of the element is used. This
- * means that the index is allowd to refere to the first element
- * after the array.
- */
-static void
-chkaidx(tnode_t *tn, int amper)
-{
- int dim;
- tnode_t *ln, *rn;
- int elsz;
- int64_t con;
-
- ln = tn->tn_left;
- rn = tn->tn_right;
-
- /* We can only check constant indices. */
- if (rn->tn_op != CON)
- return;
-
- /* Return if the left node does not stem from an array. */
- if (ln->tn_op != AMPER)
- return;
- if (ln->tn_left->tn_op != STRING && ln->tn_left->tn_op != NAME)
- return;
- if (ln->tn_left->tn_type->t_tspec != ARRAY)
- return;
-
- /*
- * For incomplete array types, we can print a warning only if
- * the index is negative.
- */
- if (incompl(ln->tn_left->tn_type) && rn->tn_val->v_quad >= 0)
- return;
-
- /* Get the size of one array element */
- if ((elsz = length(ln->tn_type->t_subt, NULL)) == 0)
- return;
- elsz /= CHAR_BIT;
-
- /* Change the unit of the index from bytes to element size. */
- if (isutyp(rn->tn_type->t_tspec)) {
- con = (uint64_t)rn->tn_val->v_quad / elsz;
- } else {
- con = rn->tn_val->v_quad / elsz;
- }
-
- dim = ln->tn_left->tn_type->t_dim + (amper ? 1 : 0);
-
- if (!isutyp(rn->tn_type->t_tspec) && con < 0) {
- /* array subscript cannot be negative: %ld */
- warning(167, (long)con);
- } else if (dim > 0 && (uint64_t)con >= dim) {
- /* array subscript cannot be > %d: %ld */
- warning(168, dim - 1, (long)con);
- }
-}
-
-/*
- * Check for ordered comparisons of unsigned values with 0.
- */
-static void
-chkcomp(op_t op, tnode_t *ln, tnode_t *rn)
-{
- tspec_t lt, rt;
- mod_t *mp;
-
- lt = ln->tn_type->t_tspec;
- rt = rn->tn_type->t_tspec;
- mp = &modtab[op];
-
- if (ln->tn_op != CON && rn->tn_op != CON)
- return;
-
- if (!isityp(lt) || !isityp(rt))
- return;
-
- if ((hflag || pflag) && lt == CHAR && rn->tn_op == CON &&
- (rn->tn_val->v_quad < 0 ||
- rn->tn_val->v_quad > ~(~0 << (CHAR_BIT - 1)))) {
- /* nonportable character comparison, op %s */
- warning(230, mp->m_name);
- return;
- }
- if ((hflag || pflag) && rt == CHAR && ln->tn_op == CON &&
- (ln->tn_val->v_quad < 0 ||
- ln->tn_val->v_quad > ~(~0 << (CHAR_BIT - 1)))) {
- /* nonportable character comparison, op %s */
- warning(230, mp->m_name);
- return;
- }
- if (isutyp(lt) && !isutyp(rt) &&
- rn->tn_op == CON && rn->tn_val->v_quad <= 0) {
- if (rn->tn_val->v_quad < 0) {
- /* comparison of %s with %s, op %s */
- warning(162, tyname(ln->tn_type), "negative constant",
- mp->m_name);
- } else if (op == LT || op == GE || (hflag && op == LE)) {
- /* comparison of %s with %s, op %s */
- warning(162, tyname(ln->tn_type), "0", mp->m_name);
- }
- return;
- }
- if (isutyp(rt) && !isutyp(lt) &&
- ln->tn_op == CON && ln->tn_val->v_quad <= 0) {
- if (ln->tn_val->v_quad < 0) {
- /* comparison of %s with %s, op %s */
- warning(162, "negative constant", tyname(rn->tn_type),
- mp->m_name);
- } else if (op == GT || op == LE || (hflag && op == GE)) {
- /* comparison of %s with %s, op %s */
- warning(162, "0", tyname(rn->tn_type), mp->m_name);
- }
- return;
- }
-}
-
-/*
- * Takes an expression an returns 0 if this expression can be used
- * for static initialisation, otherwise -1.
- *
- * Constant initialisation expressions must be costant or an address
- * of a static object with an optional offset. In the first case,
- * the result is returned in *offsp. In the second case, the static
- * object is returned in *symp and the offset in *offsp.
- *
- * The expression can consist of PLUS, MINUS, AMPER, NAME, STRING and
- * CON. Type conversions are allowed if they do not change binary
- * representation (including width).
- */
-int
-conaddr(tnode_t *tn, sym_t **symp, ptrdiff_t *offsp)
-{
- sym_t *sym;
- ptrdiff_t offs1, offs2;
- tspec_t t, ot;
-
- switch (tn->tn_op) {
- case MINUS:
- if (tn->tn_right->tn_op != CON)
- return (-1);
- /* FALLTHROUGH */
- case PLUS:
- offs1 = offs2 = 0;
- if (tn->tn_left->tn_op == CON) {
- offs1 = (ptrdiff_t)tn->tn_left->tn_val->v_quad;
- if (conaddr(tn->tn_right, &sym, &offs2) == -1)
- return (-1);
- } else if (tn->tn_right->tn_op == CON) {
- offs2 = (ptrdiff_t)tn->tn_right->tn_val->v_quad;
- if (tn->tn_op == MINUS)
- offs2 = -offs2;
- if (conaddr(tn->tn_left, &sym, &offs1) == -1)
- return (-1);
- } else {
- return (-1);
- }
- *symp = sym;
- *offsp = offs1 + offs2;
- break;
- case AMPER:
- if (tn->tn_left->tn_op == NAME) {
- *symp = tn->tn_left->tn_sym;
- *offsp = 0;
- } else if (tn->tn_left->tn_op == STRING) {
- /*
- * If this would be the front end of a compiler we
- * would return a label instead of 0.
- */
- *offsp = 0;
- }
- break;
- case CVT:
- t = tn->tn_type->t_tspec;
- ot = tn->tn_left->tn_type->t_tspec;
- if ((!isityp(t) && t != PTR) || (!isityp(ot) && ot != PTR)) {
- return (-1);
- } else if (psize(t) != psize(ot)) {
- return (-1);
- }
- if (conaddr(tn->tn_left, symp, offsp) == -1)
- return (-1);
- break;
- default:
- return (-1);
- }
- return (0);
-}
-
-/*
- * Concatenate two string constants.
- */
-strg_t *
-catstrg(strg_t *strg1, strg_t *strg2)
-{
- size_t len1, len2, len;
-
- if (strg1->st_tspec != strg2->st_tspec) {
- /* cannot concatenate wide and regular string literals */
- error(292);
- return (strg1);
- }
-
- len = (len1 = strg1->st_len) + (len2 = strg2->st_len);
-
- if (strg1->st_tspec == CHAR) {
- if ((strg1->st_cp = realloc(strg1->st_cp, len + 1)) == NULL)
- nomem();
- (void)memcpy(strg1->st_cp + len1, strg2->st_cp, len2 + 1);
- free(strg2->st_cp);
- } else {
- if ((strg1->st_wcp = realloc(strg1->st_wcp, (len + 1) *
- sizeof (wchar_t))) == NULL)
- nomem();
- (void)memcpy(strg1->st_wcp + len1, strg2->st_wcp,
- (len2 + 1) * sizeof (wchar_t));
- free(strg2->st_wcp);
- }
- free(strg2);
-
- return (strg1);
-}
-
-/*
- * Print a warning if the given node has operands which should be
- * parenthesized.
- *
- * XXX Does not work if an operand is a constant expression. Constant
- * expressions are already folded.
- */
-static void
-precconf(tnode_t *tn)
-{
- tnode_t *ln, *rn;
- op_t lop, rop = NOOP;
- int lparn, rparn = 0;
- mod_t *mp;
- int warn;
-
- if (!hflag)
- return;
-
- mp = &modtab[tn->tn_op];
-
- lparn = 0;
- for (ln = tn->tn_left; ln->tn_op == CVT; ln = ln->tn_left)
- lparn |= ln->tn_parn;
- lparn |= ln->tn_parn;
- lop = ln->tn_op;
-
- if (mp->m_binary) {
- rparn = 0;
- for (rn = tn->tn_right; tn->tn_op == CVT; rn = rn->tn_left)
- rparn |= rn->tn_parn;
- rparn |= rn->tn_parn;
- rop = rn->tn_op;
- }
-
- warn = 0;
-
- switch (tn->tn_op) {
- case SHL:
- case SHR:
- if (!lparn && (lop == PLUS || lop == MINUS)) {
- warn = 1;
- } else if (!rparn && (rop == PLUS || rop == MINUS)) {
- warn = 1;
- }
- break;
- case LOGOR:
- if (!lparn && lop == LOGAND) {
- warn = 1;
- } else if (!rparn && rop == LOGAND) {
- warn = 1;
- }
- break;
- case AND:
- case XOR:
- case OR:
- if (!lparn && lop != tn->tn_op) {
- if (lop == PLUS || lop == MINUS) {
- warn = 1;
- } else if (lop == AND || lop == XOR) {
- warn = 1;
- }
- }
- if (!warn && !rparn && rop != tn->tn_op) {
- if (rop == PLUS || rop == MINUS) {
- warn = 1;
- } else if (rop == AND || rop == XOR) {
- warn = 1;
- }
- }
- break;
- /* LINTED (enumeration values not handled in switch) */
- case DECAFT:
- case XORASS:
- case SHLASS:
- case NOOP:
- case ARROW:
- case ORASS:
- case POINT:
- case NAME:
- case NOT:
- case COMPL:
- case CON:
- case INC:
- case STRING:
- case DEC:
- case INCBEF:
- case DECBEF:
- case INCAFT:
- case FSEL:
- case CALL:
- case COMMA:
- case CVT:
- case ICALL:
- case LOAD:
- case PUSH:
- case RETURN:
- case INIT:
- case CASE:
- case FARG:
- case SUBASS:
- case ADDASS:
- case MODASS:
- case DIVASS:
- case MULASS:
- case ASSIGN:
- case COLON:
- case QUEST:
- case LOGAND:
- case NE:
- case EQ:
- case GE:
- case GT:
- case LE:
- case LT:
- case MINUS:
- case PLUS:
- case MOD:
- case DIV:
- case MULT:
- case AMPER:
- case STAR:
- case UMINUS:
- case SHRASS:
- case UPLUS:
- case ANDASS:
- break;
- }
-
- if (warn) {
- /* precedence confusion possible: parenthesize! */
- warning(169);
- }
-
-}
diff --git a/usr.bin/xlint/lint2/Makefile b/usr.bin/xlint/lint2/Makefile
deleted file mode 100644
index eaee124..0000000
--- a/usr.bin/xlint/lint2/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-# $NetBSD: Makefile,v 1.2 1995/07/03 21:24:39 cgd Exp $
-# $FreeBSD$
-
-.PATH: ${.CURDIR}/../lint1
-
-PROG= lint2
-SRCS= main2.c hash.c read.c mem.c mem2.c chk.c msg.c emit.c emit2.c inittyp.c
-NO_MAN=
-CFLAGS+=-I${.CURDIR}/../lint1
-LINTFLAGS=-abehrz
-
-BINDIR= /usr/libexec
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/xlint/lint2/chk.c b/usr.bin/xlint/lint2/chk.c
deleted file mode 100644
index ddb9df6..0000000
--- a/usr.bin/xlint/lint2/chk.c
+++ /dev/null
@@ -1,1350 +0,0 @@
-/* $NetBSD: chk.c,v 1.15 2002/01/21 19:49:52 tv Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: chk.c,v 1.15 2002/01/21 19:49:52 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <ctype.h>
-#include <err.h>
-#include <limits.h>
-#include <stdlib.h>
-
-#include "lint2.h"
-
-static void chkund(hte_t *);
-static void chkdnu(hte_t *);
-static void chkdnud(hte_t *);
-static void chkmd(hte_t *);
-static void chkvtui(hte_t *, sym_t *, sym_t *);
-static void chkvtdi(hte_t *, sym_t *, sym_t *);
-static void chkfaui(hte_t *, sym_t *, sym_t *);
-static void chkau(hte_t *, int, sym_t *, sym_t *, pos_t *,
- fcall_t *, fcall_t *, type_t *, type_t *);
-static void chkrvu(hte_t *, sym_t *);
-static void chkadecl(hte_t *, sym_t *, sym_t *);
-static void printflike(hte_t *,fcall_t *, int, const char *, type_t **);
-static void scanflike(hte_t *, fcall_t *, int, const char *, type_t **);
-static void badfmt(hte_t *, fcall_t *);
-static void inconarg(hte_t *, fcall_t *, int);
-static void tofewarg(hte_t *, fcall_t *);
-static void tomanyarg(hte_t *, fcall_t *);
-static int eqtype(type_t *, type_t *, int, int, int, int *);
-static int eqargs(type_t *, type_t *, int *);
-static int mnoarg(type_t *, int *);
-
-
-/*
- * If there is a symbol named "main", mark it as used.
- */
-void
-mainused(void)
-{
- hte_t *hte;
-
- if ((hte = hsearch("main", 0)) != NULL)
- hte->h_used = 1;
-}
-
-/*
- * Performs all tests for a single name
- */
-void
-chkname(hte_t *hte)
-{
- sym_t *sym, *def, *pdecl, *decl;
-
- if (uflag) {
- chkund(hte);
- chkdnu(hte);
- if (xflag)
- chkdnud(hte);
- }
- chkmd(hte);
-
- /* Get definition, prototype declaration and declaration */
- def = pdecl = decl = NULL;
- for (sym = hte->h_syms; sym != NULL; sym = sym->s_nxt) {
- if (def == NULL && (sym->s_def == DEF || sym->s_def == TDEF))
- def = sym;
- if (pdecl == NULL && sym->s_def == DECL &&
- TP(sym->s_type)->t_tspec == FUNC &&
- TP(sym->s_type)->t_proto) {
- pdecl = sym;
- }
- if (decl == NULL && sym->s_def == DECL)
- decl = sym;
- }
-
- /* A prototype is better than an old style declaration. */
- if (pdecl != NULL)
- decl = pdecl;
-
- chkvtui(hte, def, decl);
-
- chkvtdi(hte, def, decl);
-
- chkfaui(hte, def, decl);
-
- chkrvu(hte, def);
-
- chkadecl(hte, def, decl);
-}
-
-/*
- * Print a warning if the name has been used, but not defined.
- */
-static void
-chkund(hte_t *hte)
-{
- fcall_t *fcall;
- usym_t *usym;
-
- if (!hte->h_used || hte->h_def)
- return;
-
- if ((fcall = hte->h_calls) != NULL) {
- /* %s used( %s ), but not defined */
- msg(0, hte->h_name, mkpos(&fcall->f_pos));
- } else if ((usym = hte->h_usyms) != NULL) {
- /* %s used( %s ), but not defined */
- msg(0, hte->h_name, mkpos(&usym->u_pos));
- }
-}
-
-/*
- * Print a warning if the name has been defined, but never used.
- */
-static void
-chkdnu(hte_t *hte)
-{
- sym_t *sym;
-
- if (!hte->h_def || hte->h_used)
- return;
-
- for (sym = hte->h_syms; sym != NULL; sym = sym->s_nxt) {
- if (sym->s_def == DEF || sym->s_def == TDEF) {
- /* %s defined( %s ), but never used */
- msg(1, hte->h_name, mkpos(&sym->s_pos));
- break;
- }
- }
-}
-
-/*
- * Print a warning if the variable has been declared, but is not used
- * or defined.
- */
-static void
-chkdnud(hte_t *hte)
-{
- sym_t *sym;
-
- if (hte->h_syms == NULL || hte->h_used || hte->h_def)
- return;
-
- sym = hte->h_syms;
- if (TP(sym->s_type)->t_tspec == FUNC)
- return;
-
- if (sym->s_def != DECL)
- errx(1, "internal error: chkdnud() 1");
- /* %s declared( %s ), but never used or defined */
- msg(2, hte->h_name, mkpos(&sym->s_pos));
-}
-
-/*
- * Print a warning if there is more than one definition for
- * this name.
- */
-static void
-chkmd(hte_t *hte)
-{
- sym_t *sym, *def1;
- char *pos1;
-
- if (!hte->h_def)
- return;
-
- def1 = NULL;
- for (sym = hte->h_syms; sym != NULL; sym = sym->s_nxt) {
- /*
- * ANSI C allows tentative definitions of the same name in
- * only one compilation unit.
- */
- if (sym->s_def != DEF && (!sflag || sym->s_def != TDEF))
- continue;
- if (def1 == NULL) {
- def1 = sym;
- continue;
- }
- pos1 = xstrdup(mkpos(&def1->s_pos));
- /* %s multiply defined\t%s :: %s */
- msg(3, hte->h_name, pos1, mkpos(&sym->s_pos));
- free(pos1);
- }
-}
-
-/*
- * Print a warning if the return value assumed for a function call
- * differs from the return value of the function definition or
- * function declaration.
- *
- * If no definition/declaration can be found, the assumed return values
- * are always int. So there is no need to compare with another function
- * call as it's done for function arguments.
- */
-static void
-chkvtui(hte_t *hte, sym_t *def, sym_t *decl)
-{
- fcall_t *call;
- char *pos1;
- type_t *tp1, *tp2;
- /* LINTED (automatic hides external declaration: warn) */
- int warn, eq;
- tspec_t t1;
-
- if (hte->h_calls == NULL)
- return;
-
- if (def == NULL)
- def = decl;
- if (def == NULL)
- return;
-
- t1 = (tp1 = TP(def->s_type)->t_subt)->t_tspec;
- for (call = hte->h_calls; call != NULL; call = call->f_nxt) {
- tp2 = TP(call->f_type)->t_subt;
- eq = eqtype(tp1, tp2, 1, 0, 0, (warn = 0, &warn));
- if (!call->f_rused) {
- /* no return value used */
- if ((t1 == STRUCT || t1 == UNION) && !eq) {
- /*
- * If a function returns a struct or union it
- * must be declared to return a struct or
- * union, also if the return value is ignored.
- * This is necessary because the caller must
- * allocate stack space for the return value.
- * If it does not, the return value would over-
- * write other data.
- * XXX Following massage may be confusing
- * because it appears also if the return value
- * was declared inconsistently. But this
- * behaviour matches pcc based lint, so it is
- * accepted for now.
- */
- pos1 = xstrdup(mkpos(&def->s_pos));
- /* %s value must be decl. before use %s :: %s */
- msg(17, hte->h_name,
- pos1, mkpos(&call->f_pos));
- free(pos1);
- }
- continue;
- }
- if (!eq || (sflag && warn)) {
- pos1 = xstrdup(mkpos(&def->s_pos));
- /* %s value used inconsistenty\t%s :: %s */
- msg(4, hte->h_name, pos1, mkpos(&call->f_pos));
- free(pos1);
- }
- }
-}
-
-/*
- * Print a warning if a definition/declaration does not match another
- * definition/declaration of the same name. For functions, only the
- * types of return values are tested.
- */
-static void
-chkvtdi(hte_t *hte, sym_t *def, sym_t *decl)
-{
- sym_t *sym;
- type_t *tp1, *tp2;
- /* LINTED (automatic hides external declaration: warn) */
- int eq, warn;
- char *pos1;
-
- if (def == NULL)
- def = decl;
- if (def == NULL)
- return;
-
- tp1 = TP(def->s_type);
- for (sym = hte->h_syms; sym != NULL; sym = sym->s_nxt) {
- if (sym == def)
- continue;
- tp2 = TP(sym->s_type);
- warn = 0;
- if (tp1->t_tspec == FUNC && tp2->t_tspec == FUNC) {
- eq = eqtype(tp1->t_subt, tp2->t_subt, 1, 0, 0, &warn);
- } else {
- eq = eqtype(tp1, tp2, 0, 0, 0, &warn);
- }
- if (!eq || (sflag && warn)) {
- pos1 = xstrdup(mkpos(&def->s_pos));
- /* %s value declared inconsistently\t%s :: %s */
- msg(5, hte->h_name, pos1, mkpos(&sym->s_pos));
- free(pos1);
- }
- }
-}
-
-/*
- * Print a warning if a function is called with arguments which does
- * not match the function definition, declaration or another call
- * of the same function.
- */
-static void
-chkfaui(hte_t *hte, sym_t *def, sym_t *decl)
-{
- type_t *tp1, *tp2, **ap1, **ap2;
- pos_t *pos1p = NULL;
- fcall_t *calls, *call, *call1;
- int n, as;
- char *pos1;
- arginf_t *ai;
-
- if ((calls = hte->h_calls) == NULL)
- return;
-
- /*
- * If we find a function definition, we use this for comparison,
- * otherwise the first prototype we can find. If there is no
- * definition or prototype declaration, the first function call
- * is used.
- */
- tp1 = NULL;
- call1 = NULL;
- if (def != NULL) {
- if ((tp1 = TP(def->s_type))->t_tspec != FUNC)
- return;
- pos1p = &def->s_pos;
- } else if (decl != NULL && TP(decl->s_type)->t_proto) {
- if ((tp1 = TP(decl->s_type))->t_tspec != FUNC)
- return;
- pos1p = &decl->s_pos;
- }
- if (tp1 == NULL) {
- call1 = calls;
- calls = calls->f_nxt;
- if ((tp1 = TP(call1->f_type))->t_tspec != FUNC)
- return;
- pos1p = &call1->f_pos;
- }
-
- n = 1;
- for (call = calls; call != NULL; call = call->f_nxt) {
- if ((tp2 = TP(call->f_type))->t_tspec != FUNC)
- continue;
- ap1 = tp1->t_args;
- ap2 = tp2->t_args;
- n = 0;
- while (*ap1 != NULL && *ap2 != NULL) {
- if (def != NULL && def->s_va && n >= def->s_nva)
- break;
- n++;
- chkau(hte, n, def, decl, pos1p, call1, call,
- *ap1, *ap2);
- ap1++;
- ap2++;
- }
- if (*ap1 == *ap2) {
- /* equal # of arguments */
- } else if (def != NULL && def->s_va && n >= def->s_nva) {
- /*
- * function definition with VARARGS; The # of
- * arguments of the call must be at least as large
- * as the parameter of VARARGS.
- */
- } else if (*ap2 != NULL && tp1->t_proto && tp1->t_vararg) {
- /*
- * prototype with ... and function call with
- * at least the same # of arguments as declared
- * in the prototype.
- */
- } else {
- pos1 = xstrdup(mkpos(pos1p));
- /* %s: variable # of args\t%s :: %s */
- msg(7, hte->h_name, pos1, mkpos(&call->f_pos));
- free(pos1);
- continue;
- }
-
- /* perform SCANFLIKE/PRINTFLIKE tests */
- if (def == NULL || (!def->s_prfl && !def->s_scfl))
- continue;
- as = def->s_prfl ? def->s_nprfl : def->s_nscfl;
- for (ai = call->f_args; ai != NULL; ai = ai->a_nxt) {
- if (ai->a_num == as)
- break;
- }
- if (ai == NULL || !ai->a_fmt)
- continue;
- if (def->s_prfl) {
- printflike(hte, call, n, ai->a_fstrg, ap2);
- } else {
- scanflike(hte, call, n, ai->a_fstrg, ap2);
- }
- }
-}
-
-/*
- * Check a single argument in a function call.
- *
- * hte a pointer to the hash table entry of the function
- * n the number of the argument (1..)
- * def the function definition or NULL
- * decl prototype declaration, old style declaration or NULL
- * pos1p position of definition, declaration of first call
- * call1 first call, if both def and decl are old style def/decl
- * call checked call
- * arg1 currently checked argument of def/decl/call1
- * arg2 currently checked argument of call
- *
- */
-static void
-chkau(hte_t *hte, int n, sym_t *def, sym_t *decl, pos_t *pos1p,
- fcall_t *call1, fcall_t *call, type_t *arg1, type_t *arg2)
-{
- /* LINTED (automatic hides external declaration: warn) */
- int promote, asgn, warn;
- tspec_t t1, t2;
- arginf_t *ai, *ai1;
- char *pos1;
-
- /*
- * If a function definition is available (def != NULL), we compair the
- * function call (call) with the definition. Otherwise, if a function
- * definition is available and it is not an old style definition
- * (decl != NULL && TP(decl->s_type)->t_proto), we compair the call
- * with this declaration. Otherwise we compair it with the first
- * call we have found (call1).
- */
-
- /* arg1 must be promoted if it stems from an old style definition */
- promote = def != NULL && def->s_osdef;
-
- /*
- * If we compair with a definition or declaration, we must perform
- * the same checks for qualifiers in indirected types as in
- * assignments.
- */
- asgn = def != NULL || (decl != NULL && TP(decl->s_type)->t_proto);
-
- warn = 0;
- if (eqtype(arg1, arg2, 1, promote, asgn, &warn) && (!sflag || !warn))
- return;
-
- /*
- * Other lint implementations print warnings as soon as the type
- * of an argument does not match exactly the expected type. The
- * result are lots of warnings which are really not necessary.
- * We print a warning only if
- * (0) at least one type is not an interger type and types differ
- * (1) hflag is set and types differ
- * (2) types differ, except in signedness
- * If the argument is an integer constant whose msb is not set,
- * signedness is ignored (e.g. 0 matches both signed and unsigned
- * int). This is with and without hflag.
- * If the argument is an integer constant with value 0 and the
- * expected argument is of type pointer and the width of the
- * interger constant is the same as the width of the pointer,
- * no warning is printed.
- */
- t1 = arg1->t_tspec;
- t2 = arg2->t_tspec;
- if (isityp(t1) && isityp(t2) && !arg1->t_isenum && !arg2->t_isenum) {
- if (promote) {
- /*
- * XXX Here is a problem: Althrough it is possible to
- * pass an int where a char/short it expected, there
- * may be loss in significant digits. We should first
- * check for const arguments if they can be converted
- * into the original parameter type.
- */
- if (t1 == FLOAT) {
- t1 = DOUBLE;
- } else if (t1 == CHAR || t1 == SCHAR) {
- t1 = INT;
- } else if (t1 == UCHAR) {
- t1 = tflag ? UINT : INT;
- } else if (t1 == SHORT) {
- t1 = INT;
- } else if (t1 == USHORT) {
- /* CONSTCOND */
- t1 = INT_MAX < USHRT_MAX || tflag ? UINT : INT;
- }
- }
-
- if (styp(t1) == styp(t2)) {
-
- /*
- * types differ only in signedness; get information
- * about arguments
- */
-
- /*
- * treat a definition like a call with variable
- * arguments
- */
- ai1 = call1 != NULL ? call1->f_args : NULL;
-
- /*
- * if two calls are compared, ai1 is set to the
- * information for the n-th argument, if this was
- * a constant, otherwise to NULL
- */
- for ( ; ai1 != NULL; ai1 = ai1->a_nxt) {
- if (ai1->a_num == n)
- break;
- }
- /*
- * ai is set to the information of the n-th arg
- * of the (second) call, if this was a constant,
- * otherwise to NULL
- */
- for (ai = call->f_args; ai != NULL; ai = ai->a_nxt) {
- if (ai->a_num == n)
- break;
- }
-
- if (ai1 == NULL && ai == NULL) {
- /* no constant at all */
- if (!hflag)
- return;
- } else if (ai1 == NULL || ai == NULL) {
- /* one constant */
- if (ai == NULL)
- ai = ai1;
- if (ai->a_zero || ai->a_pcon)
- /* same value in signed and unsigned */
- return;
- /* value (not representation) differently */
- } else {
- /*
- * two constants, one signed, one unsigned;
- * if the msb of one of the constants is set,
- * the argument is used inconsistently.
- */
- if (!ai1->a_ncon && !ai->a_ncon)
- return;
- }
- }
-
- } else if (t1 == PTR && isityp(t2)) {
- for (ai = call->f_args; ai != NULL; ai = ai->a_nxt) {
- if (ai->a_num == n)
- break;
- }
- /*
- * Vendor implementations of lint (e.g. HP-UX, Digital UNIX)
- * don't care about the size of the integer argument,
- * only whether or not it is zero. We do the same.
- */
- if (ai != NULL && ai->a_zero)
- return;
- }
-
- pos1 = xstrdup(mkpos(pos1p));
- /* %s, arg %d used inconsistently\t%s :: %s */
- msg(6, hte->h_name, n, pos1, mkpos(&call->f_pos));
- free(pos1);
-}
-
-/*
- * Compare the types in the NULL-terminated array ap with the format
- * string fmt.
- */
-static void
-printflike(hte_t *hte, fcall_t *call, int n, const char *fmt, type_t **ap)
-{
- const char *fp;
- int fc;
- int fwidth, prec, left, sign, space, alt, zero;
- tspec_t sz, t1, t2 = NOTSPEC;
- type_t *tp;
-
- fp = fmt;
- fc = *fp++;
-
- for ( ; ; ) {
- if (fc == '\0') {
- if (*ap != NULL)
- tomanyarg(hte, call);
- break;
- }
- if (fc != '%') {
- badfmt(hte, call);
- break;
- }
- fc = *fp++;
- fwidth = prec = left = sign = space = alt = zero = 0;
- sz = NOTSPEC;
-
- /* Flags */
- for ( ; ; ) {
- if (fc == '-') {
- if (left)
- break;
- left = 1;
- } else if (fc == '+') {
- if (sign)
- break;
- sign = 1;
- } else if (fc == ' ') {
- if (space)
- break;
- space = 1;
- } else if (fc == '#') {
- if (alt)
- break;
- alt = 1;
- } else if (fc == '0') {
- if (zero)
- break;
- zero = 1;
- } else {
- break;
- }
- fc = *fp++;
- }
-
- /* field width */
- if (isdigit(fc)) {
- fwidth = 1;
- do { fc = *fp++; } while (isdigit(fc)) ;
- } else if (fc == '*') {
- fwidth = 1;
- fc = *fp++;
- if ((tp = *ap++) == NULL) {
- tofewarg(hte, call);
- break;
- }
- n++;
- if ((t1 = tp->t_tspec) != INT && (hflag || t1 != UINT))
- inconarg(hte, call, n);
- }
-
- /* precision */
- if (fc == '.') {
- fc = *fp++;
- prec = 1;
- if (isdigit(fc)) {
- do { fc = *fp++; } while (isdigit(fc));
- } else if (fc == '*') {
- fc = *fp++;
- if ((tp = *ap++) == NULL) {
- tofewarg(hte, call);
- break;
- }
- n++;
- if (tp->t_tspec != INT)
- inconarg(hte, call, n);
- } else {
- badfmt(hte, call);
- break;
- }
- }
-
- if (fc == 'h') {
- sz = SHORT;
- } else if (fc == 'l') {
- sz = LONG;
- } else if (fc == 'q') {
- sz = QUAD;
- } else if (fc == 'L') {
- sz = LDOUBLE;
- }
- if (sz != NOTSPEC)
- fc = *fp++;
-
- if (fc == '%') {
- if (sz != NOTSPEC || left || sign || space ||
- alt || zero || prec || fwidth) {
- badfmt(hte, call);
- }
- fc = *fp++;
- continue;
- }
-
- if (fc == '\0') {
- badfmt(hte, call);
- break;
- }
-
- if ((tp = *ap++) == NULL) {
- tofewarg(hte, call);
- break;
- }
- n++;
- if ((t1 = tp->t_tspec) == PTR)
- t2 = tp->t_subt->t_tspec;
-
- if (fc == 'd' || fc == 'i') {
- if (alt || sz == LDOUBLE) {
- badfmt(hte, call);
- break;
- }
- int_conv:
- if (sz == LONG) {
- if (t1 != LONG && (hflag || t1 != ULONG))
- inconarg(hte, call, n);
- } else if (sz == QUAD) {
- if (t1 != QUAD && (hflag || t1 != UQUAD))
- inconarg(hte, call, n);
- } else {
- /*
- * SHORT is always promoted to INT, USHORT
- * to INT or UINT.
- */
- if (t1 != INT && (hflag || t1 != UINT))
- inconarg(hte, call, n);
- }
- } else if (fc == 'o' || fc == 'u' || fc == 'x' || fc == 'X') {
- if ((alt && fc == 'u') || sz == LDOUBLE)
- badfmt(hte, call);
- uint_conv:
- if (sz == LONG) {
- if (t1 != ULONG && (hflag || t1 != LONG))
- inconarg(hte, call, n);
- } else if (sz == QUAD) {
- if (t1 != UQUAD && (hflag || t1 != QUAD))
- inconarg(hte, call, n);
- } else if (sz == SHORT) {
- /* USHORT was promoted to INT or UINT */
- if (t1 != UINT && t1 != INT)
- inconarg(hte, call, n);
- } else {
- if (t1 != UINT && (hflag || t1 != INT))
- inconarg(hte, call, n);
- }
- } else if (fc == 'D' || fc == 'O' || fc == 'U') {
- if ((alt && fc != 'O') || sz != NOTSPEC || !tflag)
- badfmt(hte, call);
- sz = LONG;
- if (fc == 'D') {
- goto int_conv;
- } else {
- goto uint_conv;
- }
- } else if (fc == 'f' || fc == 'e' || fc == 'E' ||
- fc == 'g' || fc == 'G') {
- if (sz == NOTSPEC)
- sz = DOUBLE;
- if (sz != DOUBLE && sz != LDOUBLE)
- badfmt(hte, call);
- if (t1 != sz)
- inconarg(hte, call, n);
- } else if (fc == 'c') {
- if (sz != NOTSPEC || alt || zero)
- badfmt(hte, call);
- if (t1 != INT)
- inconarg(hte, call, n);
- } else if (fc == 's') {
- if (sz != NOTSPEC || alt || zero)
- badfmt(hte, call);
- if (t1 != PTR ||
- (t2 != CHAR && t2 != UCHAR && t2 != SCHAR)) {
- inconarg(hte, call, n);
- }
- } else if (fc == 'p') {
- if (fwidth || prec || sz != NOTSPEC || alt || zero)
- badfmt(hte, call);
- if (t1 != PTR || (hflag && t2 != VOID))
- inconarg(hte, call, n);
- } else if (fc == 'n') {
- if (fwidth || prec || alt || zero || sz == LDOUBLE)
- badfmt(hte, call);
- if (t1 != PTR) {
- inconarg(hte, call, n);
- } else if (sz == LONG) {
- if (t2 != LONG && t2 != ULONG)
- inconarg(hte, call, n);
- } else if (sz == SHORT) {
- if (t2 != SHORT && t2 != USHORT)
- inconarg(hte, call, n);
- } else {
- if (t2 != INT && t2 != UINT)
- inconarg(hte, call, n);
- }
- } else {
- badfmt(hte, call);
- break;
- }
-
- fc = *fp++;
- }
-}
-
-/*
- * Compare the types in the NULL-terminated array ap with the format
- * string fmt.
- */
-static void
-scanflike(hte_t *hte, fcall_t *call, int n, const char *fmt, type_t **ap)
-{
- const char *fp;
- int fc;
- int noasgn, fwidth;
- tspec_t sz, t1 = NOTSPEC, t2 = NOTSPEC;
- type_t *tp = NULL;
-
- fp = fmt;
- fc = *fp++;
-
- for ( ; ; ) {
- if (fc == '\0') {
- if (*ap != NULL)
- tomanyarg(hte, call);
- break;
- }
- if (fc != '%') {
- badfmt(hte, call);
- break;
- }
- fc = *fp++;
-
- noasgn = fwidth = 0;
- sz = NOTSPEC;
-
- if (fc == '*') {
- noasgn = 1;
- fc = *fp++;
- }
-
- if (isdigit(fc)) {
- fwidth = 1;
- do { fc = *fp++; } while (isdigit(fc));
- }
-
- if (fc == 'h') {
- sz = SHORT;
- } else if (fc == 'l') {
- sz = LONG;
- } else if (fc == 'q') {
- sz = QUAD;
- } else if (fc == 'L') {
- sz = LDOUBLE;
- }
- if (sz != NOTSPEC)
- fc = *fp++;
-
- if (fc == '%') {
- if (sz != NOTSPEC || noasgn || fwidth)
- badfmt(hte, call);
- fc = *fp++;
- continue;
- }
-
- if (!noasgn) {
- if ((tp = *ap++) == NULL) {
- tofewarg(hte, call);
- break;
- }
- n++;
- if ((t1 = tp->t_tspec) == PTR)
- t2 = tp->t_subt->t_tspec;
- }
-
- if (fc == 'd' || fc == 'i' || fc == 'n') {
- if (sz == LDOUBLE)
- badfmt(hte, call);
- if (sz != SHORT && sz != LONG && sz != QUAD)
- sz = INT;
- conv:
- if (!noasgn) {
- if (t1 != PTR) {
- inconarg(hte, call, n);
- } else if (t2 != styp(sz)) {
- inconarg(hte, call, n);
- } else if (hflag && t2 != sz) {
- inconarg(hte, call, n);
- } else if (tp->t_subt->t_const) {
- inconarg(hte, call, n);
- }
- }
- } else if (fc == 'o' || fc == 'u' || fc == 'x') {
- if (sz == LDOUBLE)
- badfmt(hte, call);
- if (sz == SHORT) {
- sz = USHORT;
- } else if (sz == LONG) {
- sz = ULONG;
- } else if (sz == QUAD) {
- sz = UQUAD;
- } else {
- sz = UINT;
- }
- goto conv;
- } else if (fc == 'D') {
- if (sz != NOTSPEC || !tflag)
- badfmt(hte, call);
- sz = LONG;
- goto conv;
- } else if (fc == 'O') {
- if (sz != NOTSPEC || !tflag)
- badfmt(hte, call);
- sz = ULONG;
- goto conv;
- } else if (fc == 'X') {
- /*
- * XXX valid in ANSI C, but in NetBSD's libc imple-
- * mented as "lx". Thats why it should be avoided.
- */
- if (sz != NOTSPEC || !tflag)
- badfmt(hte, call);
- sz = ULONG;
- goto conv;
- } else if (fc == 'E') {
- /*
- * XXX valid in ANSI C, but in NetBSD's libc imple-
- * mented as "lf". Thats why it should be avoided.
- */
- if (sz != NOTSPEC || !tflag)
- badfmt(hte, call);
- sz = DOUBLE;
- goto conv;
- } else if (fc == 'F') {
- /* XXX only for backward compatibility */
- if (sz != NOTSPEC || !tflag)
- badfmt(hte, call);
- sz = DOUBLE;
- goto conv;
- } else if (fc == 'G') {
- /*
- * XXX valid in ANSI C, but in NetBSD's libc not
- * implemented
- */
- if (sz != NOTSPEC && sz != LONG && sz != LDOUBLE)
- badfmt(hte, call);
- goto fconv;
- } else if (fc == 'e' || fc == 'f' || fc == 'g') {
- fconv:
- if (sz == NOTSPEC) {
- sz = FLOAT;
- } else if (sz == LONG) {
- sz = DOUBLE;
- } else if (sz != LDOUBLE) {
- badfmt(hte, call);
- sz = FLOAT;
- }
- goto conv;
- } else if (fc == 's' || fc == '[' || fc == 'c') {
- if (sz != NOTSPEC)
- badfmt(hte, call);
- if (fc == '[') {
- if ((fc = *fp++) == '-') {
- badfmt(hte, call);
- fc = *fp++;
- }
- if (fc != ']') {
- badfmt(hte, call);
- if (fc == '\0')
- break;
- }
- }
- if (!noasgn) {
- if (t1 != PTR) {
- inconarg(hte, call, n);
- } else if (t2 != CHAR && t2 != UCHAR &&
- t2 != SCHAR) {
- inconarg(hte, call, n);
- }
- }
- } else if (fc == 'p') {
- if (sz != NOTSPEC)
- badfmt(hte, call);
- if (!noasgn) {
- if (t1 != PTR || t2 != PTR) {
- inconarg(hte, call, n);
- } else if (tp->t_subt->t_subt->t_tspec!=VOID) {
- if (hflag)
- inconarg(hte, call, n);
- }
- }
- } else {
- badfmt(hte, call);
- break;
- }
-
- fc = *fp++;
- }
-}
-
-static void
-badfmt(hte_t *hte, fcall_t *call)
-{
-
- /* %s: malformed format string\t%s */
- msg(13, hte->h_name, mkpos(&call->f_pos));
-}
-
-static void
-inconarg(hte_t *hte, fcall_t *call, int n)
-{
-
- /* %s, arg %d inconsistent with format\t%s(%d) */
- msg(14, hte->h_name, n, mkpos(&call->f_pos));
-}
-
-static void
-tofewarg(hte_t *hte, fcall_t *call)
-{
-
- /* %s: too few args for format \t%s */
- msg(15, hte->h_name, mkpos(&call->f_pos));
-}
-
-static void
-tomanyarg(hte_t *hte, fcall_t *call)
-{
-
- /* %s: too many args for format \t%s */
- msg(16, hte->h_name, mkpos(&call->f_pos));
-}
-
-
-/*
- * Print warnings for return values which are used, but not returned,
- * or return values which are always or sometimes ignored.
- */
-static void
-chkrvu(hte_t *hte, sym_t *def)
-{
- fcall_t *call;
- int used, ignored;
-
- if (def == NULL)
- /* don't know wheter or not the functions returns a value */
- return;
-
- if (hte->h_calls == NULL)
- return;
-
- if (def->s_rval) {
- /* function has return value */
- used = ignored = 0;
- for (call = hte->h_calls; call != NULL; call = call->f_nxt) {
- used |= call->f_rused || call->f_rdisc;
- ignored |= !call->f_rused && !call->f_rdisc;
- }
- /*
- * XXX as soon as we are able to disable single warnings
- * the following dependencies from hflag should be removed.
- * but for now I do'nt want to be botherd by this warnings
- * which are almost always useless.
- */
- if (!used && ignored) {
- if (hflag)
- /* %s returns value which is always ignored */
- msg(8, hte->h_name);
- } else if (used && ignored) {
- if (hflag)
- /* %s returns value which is sometimes ign. */
- msg(9, hte->h_name);
- }
- } else {
- /* function has no return value */
- for (call = hte->h_calls; call != NULL; call = call->f_nxt) {
- if (call->f_rused)
- /* %s value is used( %s ), but none ret. */
- msg(10, hte->h_name, mkpos(&call->f_pos));
- }
- }
-}
-
-/*
- * Print warnings for inconsistent argument declarations.
- */
-static void
-chkadecl(hte_t *hte, sym_t *def, sym_t *decl)
-{
- /* LINTED (automatic hides external declaration: warn) */
- int osdef, eq, warn, n;
- sym_t *sym1, *sym;
- type_t **ap1, **ap2, *tp1, *tp2;
- char *pos1;
- const char *pos2;
-
- osdef = 0;
- if (def != NULL) {
- osdef = def->s_osdef;
- sym1 = def;
- } else if (decl != NULL && TP(decl->s_type)->t_proto) {
- sym1 = decl;
- } else {
- return;
- }
- if (TP(sym1->s_type)->t_tspec != FUNC)
- return;
-
- /*
- * XXX Prototypes should also be compared with old style function
- * declarations.
- */
-
- for (sym = hte->h_syms; sym != NULL; sym = sym->s_nxt) {
- if (sym == sym1 || !TP(sym->s_type)->t_proto)
- continue;
- ap1 = TP(sym1->s_type)->t_args;
- ap2 = TP(sym->s_type)->t_args;
- n = 0;
- while (*ap1 != NULL && *ap2 != NULL) {
- warn = 0;
- eq = eqtype(*ap1, *ap2, 1, osdef, 0, &warn);
- if (!eq || warn) {
- pos1 = xstrdup(mkpos(&sym1->s_pos));
- pos2 = mkpos(&sym->s_pos);
- /* %s, arg %d declared inconsistently ... */
- msg(11, hte->h_name, n + 1, pos1, pos2);
- free(pos1);
- }
- n++;
- ap1++;
- ap2++;
- }
- if (*ap1 == *ap2) {
- tp1 = TP(sym1->s_type);
- tp2 = TP(sym->s_type);
- if (tp1->t_vararg == tp2->t_vararg)
- continue;
- if (tp2->t_vararg &&
- sym1->s_va && sym1->s_nva == n && !sflag) {
- continue;
- }
- }
- /* %s: variable # of args declared\t%s :: %s */
- pos1 = xstrdup(mkpos(&sym1->s_pos));
- msg(12, hte->h_name, pos1, mkpos(&sym->s_pos));
- free(pos1);
- }
-}
-
-
-/*
- * Check compatibility of two types. Returns 1 if types are compatible,
- * otherwise 0.
- *
- * ignqual if set, ignore qualifiers of outhermost type; used for
- * function arguments
- * promote if set, promote left type before comparison; used for
- * comparisons of arguments with parameters of old style
- * definitions
- * asgn left indirected type must have at least the same qualifiers
- * like right indirected type (for assignments and function
- * arguments)
- * *warn set to 1 if an old style declaration was compared with
- * an incompatible prototype declaration
- */
-static int
-eqtype(type_t *tp1, type_t *tp2, int ignqual, int promot, int asgn, int *warn)
-{
- tspec_t t, to;
- int indir;
-
- to = NOTSPEC;
- indir = 0;
-
- while (tp1 != NULL && tp2 != NULL) {
-
- t = tp1->t_tspec;
- if (promot) {
- if (t == FLOAT) {
- t = DOUBLE;
- } else if (t == CHAR || t == SCHAR) {
- t = INT;
- } else if (t == UCHAR) {
- t = tflag ? UINT : INT;
- } else if (t == SHORT) {
- t = INT;
- } else if (t == USHORT) {
- /* CONSTCOND */
- t = INT_MAX < USHRT_MAX || tflag ? UINT : INT;
- }
- }
-
- if (asgn && to == PTR) {
- if (indir == 1 && (t == VOID || tp2->t_tspec == VOID))
- return (1);
- }
-
- if (t != tp2->t_tspec) {
- /*
- * Give pointer to types which differ only in
- * signedness a chance if not sflag and not hflag.
- */
- if (sflag || hflag || to != PTR)
- return (0);
- if (styp(t) != styp(tp2->t_tspec))
- return (0);
- }
-
- if (tp1->t_isenum && tp2->t_isenum) {
- if (tp1->t_istag && tp2->t_istag) {
- return (tp1->t_tag == tp2->t_tag);
- } else if (tp1->t_istynam && tp2->t_istynam) {
- return (tp1->t_tynam == tp2->t_tynam);
- } else if (tp1->t_isuniqpos && tp2->t_isuniqpos) {
- return (tp1->t_uniqpos.p_line ==
- tp2->t_uniqpos.p_line &&
- tp1->t_uniqpos.p_file ==
- tp2->t_uniqpos.p_file &&
- tp1->t_uniqpos.p_uniq ==
- tp2->t_uniqpos.p_uniq);
- } else {
- return (0);
- }
- }
-
- /*
- * XXX Handle combinations of enum and int if eflag is set.
- * But note: enum and 0 should be allowed.
- */
-
- if (asgn && indir == 1) {
- if (!tp1->t_const && tp2->t_const)
- return (0);
- if (!tp1->t_volatile && tp2->t_volatile)
- return (0);
- } else if (!ignqual && !tflag) {
- if (tp1->t_const != tp2->t_const)
- return (0);
- if (tp1->t_const != tp2->t_const)
- return (0);
- }
-
- if (t == STRUCT || t == UNION) {
- if (tp1->t_istag && tp2->t_istag) {
- return (tp1->t_tag == tp2->t_tag);
- } else if (tp1->t_istynam && tp2->t_istynam) {
- return (tp1->t_tynam == tp2->t_tynam);
- } else if (tp1->t_isuniqpos && tp2->t_isuniqpos) {
- return (tp1->t_uniqpos.p_line ==
- tp2->t_uniqpos.p_line &&
- tp1->t_uniqpos.p_file ==
- tp2->t_uniqpos.p_file &&
- tp1->t_uniqpos.p_uniq ==
- tp2->t_uniqpos.p_uniq);
- } else {
- return (0);
- }
- }
-
- if (t == ARRAY && tp1->t_dim != tp2->t_dim) {
- if (tp1->t_dim != 0 && tp2->t_dim != 0)
- return (0);
- }
-
- if (t == FUNC) {
- if (tp1->t_proto && tp2->t_proto) {
- if (!eqargs(tp1, tp2, warn))
- return (0);
- } else if (tp1->t_proto) {
- if (!mnoarg(tp1, warn))
- return (0);
- } else if (tp2->t_proto) {
- if (!mnoarg(tp2, warn))
- return (0);
- }
- }
-
- tp1 = tp1->t_subt;
- tp2 = tp2->t_subt;
- ignqual = promot = 0;
- to = t;
- indir++;
-
- }
-
- return (tp1 == tp2);
-}
-
-/*
- * Compares arguments of two prototypes
- */
-static int
-eqargs(type_t *tp1, type_t *tp2, int *warn)
-{
- type_t **a1, **a2;
-
- if (tp1->t_vararg != tp2->t_vararg)
- return (0);
-
- a1 = tp1->t_args;
- a2 = tp2->t_args;
-
- while (*a1 != NULL && *a2 != NULL) {
-
- if (eqtype(*a1, *a2, 1, 0, 0, warn) == 0)
- return (0);
-
- a1++;
- a2++;
-
- }
-
- return (*a1 == *a2);
-}
-
-/*
- * mnoarg() (matches functions with no argument type information)
- * returns 1 if all parameters of a prototype are compatible with
- * and old style function declaration.
- * This is the case if following conditions are met:
- * 1. the prototype must have a fixed number of parameters
- * 2. no parameter is of type float
- * 3. no parameter is converted to another type if integer promotion
- * is applied on it
- */
-static int
-mnoarg(type_t *tp, int *warn)
-{
- type_t **arg;
- tspec_t t;
-
- if (tp->t_vararg && warn != NULL)
- *warn = 1;
- for (arg = tp->t_args; *arg != NULL; arg++) {
- if ((t = (*arg)->t_tspec) == FLOAT)
- return (0);
- if (t == CHAR || t == SCHAR || t == UCHAR)
- return (0);
- if (t == SHORT || t == USHORT)
- return (0);
- }
- return (1);
-}
diff --git a/usr.bin/xlint/lint2/emit2.c b/usr.bin/xlint/lint2/emit2.c
deleted file mode 100644
index 16c9632..0000000
--- a/usr.bin/xlint/lint2/emit2.c
+++ /dev/null
@@ -1,300 +0,0 @@
-/* $NetBSD: emit2.c,v 1.8 2002/01/21 19:49:52 tv Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: emit2.c,v 1.8 2002/01/21 19:49:52 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-
-#include "lint2.h"
-
-static void outtype(type_t *);
-static void outdef(hte_t *, sym_t *);
-static void dumpname(hte_t *);
-static void outfiles(void);
-
-/*
- * Write type into the output buffer.
- */
-static void
-outtype(type_t *tp)
-{
- int t, s, na;
- tspec_t ts;
- type_t **ap;
-
- while (tp != NULL) {
- if ((ts = tp->t_tspec) == INT && tp->t_isenum)
- ts = ENUM;
- switch (ts) {
- case CHAR: t = 'C'; s = '\0'; break;
- case SCHAR: t = 'C'; s = 's'; break;
- case UCHAR: t = 'C'; s = 'u'; break;
- case SHORT: t = 'S'; s = '\0'; break;
- case USHORT: t = 'S'; s = 'u'; break;
- case INT: t = 'I'; s = '\0'; break;
- case UINT: t = 'I'; s = 'u'; break;
- case LONG: t = 'L'; s = '\0'; break;
- case ULONG: t = 'L'; s = 'u'; break;
- case QUAD: t = 'Q'; s = '\0'; break;
- case UQUAD: t = 'Q'; s = 'u'; break;
- case FLOAT: t = 'D'; s = 's'; break;
- case DOUBLE: t = 'D'; s = '\0'; break;
- case LDOUBLE: t = 'D'; s = 'l'; break;
- case VOID: t = 'V'; s = '\0'; break;
- case PTR: t = 'P'; s = '\0'; break;
- case ARRAY: t = 'A'; s = '\0'; break;
- case ENUM: t = 'T'; s = 'e'; break;
- case STRUCT: t = 'T'; s = 's'; break;
- case UNION: t = 'T'; s = 'u'; break;
- case FUNC:
- if (tp->t_args != NULL && !tp->t_proto) {
- t = 'f';
- } else {
- t = 'F';
- }
- s = '\0';
- break;
- default:
- errx(1, "internal error: outtype() 1");
- }
- if (tp->t_const)
- outchar('c');
- if (tp->t_volatile)
- outchar('v');
- if (s != '\0')
- outchar(s);
- outchar(t);
- if (ts == ARRAY) {
- outint(tp->t_dim);
- } else if (ts == ENUM || ts == STRUCT || ts == UNION) {
- if (tp->t_istag) {
- outint(1);
- outname(tp->t_tag->h_name);
- } else if (tp->t_istynam) {
- outint(2);
- outname(tp->t_tynam->h_name);
- } else if (tp->t_isuniqpos) {
- outint(3);
- outint(tp->t_uniqpos.p_line);
- outchar('.');
- outint(tp->t_uniqpos.p_file);
- outchar('.');
- outint(tp->t_uniqpos.p_uniq);
- } else
- errx(1, "internal error: outtype() 2");
- } else if (ts == FUNC && tp->t_args != NULL) {
- na = 0;
- for (ap = tp->t_args; *ap != NULL; ap++)
- na++;
- if (tp->t_vararg)
- na++;
- outint(na);
- for (ap = tp->t_args; *ap != NULL; ap++)
- outtype(*ap);
- if (tp->t_vararg)
- outchar('E');
- }
- tp = tp->t_subt;
- }
-}
-
-/*
- * Write a definition.
- */
-static void
-outdef(hte_t *hte, sym_t *sym)
-{
-
- /* reset output buffer */
- outclr();
-
- /* line number in C source file */
- outint(0);
-
- /* this is a definition */
- outchar('d');
-
- /* index of file where symbol was defined and line number of def. */
- outint(0);
- outchar('.');
- outint(0);
-
- /* flags */
- if (sym->s_va) {
- outchar('v'); /* varargs */
- outint(sym->s_nva);
- }
- if (sym->s_scfl) {
- outchar('S'); /* scanflike */
- outint(sym->s_nscfl);
- }
- if (sym->s_prfl) {
- outchar('P'); /* printflike */
- outint(sym->s_nprfl);
- }
- /* definition or tentative definition */
- outchar(sym->s_def == DEF ? 'd' : 't');
- if (TP(sym->s_type)->t_tspec == FUNC) {
- if (sym->s_rval)
- outchar('r'); /* fkt. has return value */
- if (sym->s_osdef)
- outchar('o'); /* old style definition */
- }
- outchar('u'); /* used (no warning if not used) */
-
- /* name */
- outname(hte->h_name);
-
- /* type */
- outtype(TP(sym->s_type));
-}
-
-/*
- * Write the first definition of a name into the lint library.
- */
-static void
-dumpname(hte_t *hte)
-{
- sym_t *sym, *def;
-
- /* static and undefined symbols are not written */
- if (hte->h_static || !hte->h_def)
- return;
-
- /*
- * If there is a definition, write it. Otherwise write a tentative
- * definition. This is necessary because more than one tentative
- * definition is allowed (except with sflag).
- */
- def = NULL;
- for (sym = hte->h_syms; sym != NULL; sym = sym->s_nxt) {
- if (sym->s_def == DEF) {
- def = sym;
- break;
- }
- if (sym->s_def == TDEF && def == NULL)
- def = sym;
- }
- if (def == NULL)
- errx(1, "internal error: dumpname() %s", hte->h_name);
-
- outdef(hte, def);
-}
-
-/*
- * Write a new lint library.
- */
-void
-outlib(const char *name)
-{
- /* Open of output file and initialisation of the output buffer */
- outopen(name);
-
- /* write name of lint library */
- outsrc(name);
-
- /* name of lint lib has index 0 */
- outclr();
- outint(0);
- outchar('s');
- outstrg(name);
-
- /*
- * print the names of all files references by unnamed
- * struct/union/enum declarations.
- */
- outfiles();
-
- /* write all definitions with external linkage */
- forall(dumpname);
-
- /* close the output */
- outclose();
-}
-
-/*
- * Write out the name of a file referenced by a type.
- */
-struct outflist {
- short ofl_num;
- struct outflist *ofl_next;
-};
-static struct outflist *outflist;
-
-int
-addoutfile(short num)
-{
- struct outflist *ofl, **pofl;
- int i;
-
- ofl = outflist;
- pofl = &outflist;
- i = 1; /* library is 0 */
-
- while (ofl != NULL) {
- if (ofl->ofl_num == num)
- break;
-
- pofl = &ofl->ofl_next;
- ofl = ofl->ofl_next;
- i++;
- }
-
- if (ofl == NULL) {
- ofl = *pofl = xmalloc(sizeof (struct outflist));
- ofl->ofl_num = num;
- ofl->ofl_next = NULL;
- }
- return (i);
-}
-
-static void
-outfiles(void)
-{
- struct outflist *ofl;
- int i;
-
- for (ofl = outflist, i = 1; ofl != NULL; ofl = ofl->ofl_next, i++) {
- /* reset output buffer */
- outclr();
-
- outint(i);
- outchar('s');
- outstrg(fnames[ofl->ofl_num]);
- }
-}
diff --git a/usr.bin/xlint/lint2/externs2.h b/usr.bin/xlint/lint2/externs2.h
deleted file mode 100644
index 3b6f03a..0000000
--- a/usr.bin/xlint/lint2/externs2.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/* $NetBSD: externs2.h,v 1.7 2001/05/28 12:40:38 lukem Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * main.c
- */
-extern int xflag;
-extern int uflag;
-extern int Cflag;
-extern const char *libname;
-extern int sflag;
-extern int tflag;
-extern int Hflag;
-extern int hflag;
-extern int Fflag;
-
-
-/*
- * hash.c
- */
-extern void _inithash(hte_t ***);
-extern hte_t *_hsearch(hte_t **, const char *, int);
-extern void _forall(hte_t **, void (*)(hte_t *));
-extern void _destroyhash(hte_t **);
-
-#define inithash() _inithash(NULL);
-#define hsearch(a, b) _hsearch(NULL, (a), (b))
-#define forall(a) _forall(NULL, (a))
-
-/*
- * read.c
- */
-extern const char **fnames;
-extern type_t **tlst;
-
-extern void readfile(const char *);
-extern void mkstatic(hte_t *);
-
-/*
- * mem2.c
- */
-extern void initmem(void);
-extern void *xalloc(size_t);
-
-/*
- * chk.c
- */
-extern void inittyp(void);
-extern void mainused(void);
-extern void chkname(hte_t *);
-
-/*
- * msg.c
- */
-extern void msg(int, ...);
-extern const char *mkpos(pos_t *);
-
-/*
- * emit2.c
- */
-extern void outlib(const char *);
-extern int addoutfile(short);
diff --git a/usr.bin/xlint/lint2/hash.c b/usr.bin/xlint/lint2/hash.c
deleted file mode 100644
index a215aba..0000000
--- a/usr.bin/xlint/lint2/hash.c
+++ /dev/null
@@ -1,166 +0,0 @@
-/* $NetBSD: hash.c,v 1.7 2002/01/21 19:49:52 tv Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: hash.c,v 1.7 2002/01/21 19:49:52 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-/*
- * XXX Really need a generalized hash table package
- */
-
-#include <err.h>
-#include <limits.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "lint2.h"
-
-/* pointer to hash table, initialized in inithash() */
-static hte_t **htab;
-
-static int hash(const char *);
-
-/*
- * Initialize hash table.
- */
-void
-_inithash(hte_t ***tablep)
-{
-
- if (tablep == NULL)
- tablep = &htab;
-
- *tablep = xcalloc(HSHSIZ2, sizeof (hte_t *));
-}
-
-/*
- * Compute hash value from a string.
- */
-static int
-hash(const char *s)
-{
- u_int v;
- const u_char *us;
-
- v = 0;
- for (us = (const u_char *)s; *us != '\0'; us++) {
- v = (v << sizeof (v)) + *us;
- v ^= v >> (sizeof (v) * CHAR_BIT - sizeof (v));
- }
- return (v % HSHSIZ2);
-}
-
-/*
- * Look for a hash table entry. If no hash table entry for the
- * given name exists and mknew is set, create a new one.
- */
-hte_t *
-_hsearch(hte_t **table, const char *s, int mknew)
-{
- int h;
- hte_t *hte;
-
- if (table == NULL)
- table = htab;
-
- h = hash(s);
- for (hte = table[h]; hte != NULL; hte = hte->h_link) {
- if (strcmp(hte->h_name, s) == 0)
- break;
- }
-
- if (hte != NULL || !mknew)
- return (hte);
-
- /* create a new hte */
- hte = xmalloc(sizeof (hte_t));
- hte->h_name = xstrdup(s);
- hte->h_used = 0;
- hte->h_def = 0;
- hte->h_static = 0;
- hte->h_syms = NULL;
- hte->h_lsym = &hte->h_syms;
- hte->h_calls = NULL;
- hte->h_lcall = &hte->h_calls;
- hte->h_usyms = NULL;
- hte->h_lusym = &hte->h_usyms;
- hte->h_link = table[h];
- hte->h_hte = NULL;
- table[h] = hte;
-
- return (hte);
-}
-
-/*
- * Call function f for each name in the hash table.
- */
-void
-_forall(hte_t **table, void (*f)(hte_t *))
-{
- int i;
- hte_t *hte;
-
- if (table == NULL)
- table = htab;
-
- for (i = 0; i < HSHSIZ2; i++) {
- for (hte = table[i]; hte != NULL; hte = hte->h_link)
- (*f)(hte);
- }
-}
-
-/*
- * Free all contents of the hash table that this module allocated.
- */
-void
-_destroyhash(hte_t **table)
-{
- int i;
- hte_t *hte, *nexthte;
-
- if (table == NULL)
- err(1, "_destroyhash called on main hash table");
-
- for (i = 0; i < HSHSIZ2; i++) {
- for (hte = table[i]; hte != NULL; hte = nexthte) {
- free((void *)hte->h_name);
- nexthte = hte->h_link;
- free(hte);
- }
- }
- free(table);
-}
diff --git a/usr.bin/xlint/lint2/lint2.h b/usr.bin/xlint/lint2/lint2.h
deleted file mode 100644
index 75f9dc9..0000000
--- a/usr.bin/xlint/lint2/lint2.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/* $NetBSD: lint2.h,v 1.5 2000/06/14 06:49:23 cgd Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "lint.h"
-
-/*
- * Types are described by structures of type type_t.
- */
-typedef struct type {
- tspec_t t_tspec; /* type specifier */
- u_int t_const : 1; /* constant */
- u_int t_volatile : 1; /* volatile */
- u_int t_vararg : 1; /* function has variable number of arguments */
- u_int t_isenum : 1; /* enum type */
- u_int t_proto : 1; /* this is a prototype */
- u_int t_istag : 1; /* tag with _t_tag valid */
- u_int t_istynam : 1; /* tag with _t_tynam valid */
- u_int t_isuniqpos : 1; /* tag with _t_uniqpos valid */
- union {
- int _t_dim; /* if the type is an ARRAY than this
- is the dimension of the array. */
- struct hte *_t_tag; /* hash table entry of tag if
- t_isenum, STRUCT or UNION */
- struct hte *_t_tynam; /* hash table entry of typename if
- t_isenum, STRUCT or UNION */
- struct {
- int p_line;
- short p_file;
- int p_uniq;
- } _t_uniqpos; /* unique position, for untagged
- untyped STRUCTs, UNIONS, and ENUMs,
- if t_isuniqpos */
- struct type **_t_args; /* list of argument types if this
- is a prototype */
- } t_u;
- struct type *t_subt; /* indirected type (array element, pointed to
- type, type of return value) */
-} type_t;
-
-#define t_dim t_u._t_dim
-#define t_tag t_u._t_tag
-#define t_tynam t_u._t_tynam
-#define t_uniqpos t_u._t_uniqpos
-#define t_args t_u._t_args
-
-/*
- * argument information
- *
- * Such a structure is created for each argument of a function call
- * which is an integer constant or a constant string.
- */
-typedef struct arginf {
- int a_num; /* # of argument (1..) */
- u_int a_zero : 1; /* argument is 0 */
- u_int a_pcon : 1; /* msb of argument is not set */
- u_int a_ncon : 1; /* msb of argument is set */
- u_int a_fmt : 1; /* a_fstrg points to format string */
- char *a_fstrg; /* format string */
- struct arginf *a_nxt; /* information for next const. argument */
-} arginf_t;
-
-/*
- * Keeps information about position in source file.
- */
-typedef struct {
- u_short p_src; /* index of name of translation unit
- (the name which was specified at the
- command line) */
- u_short p_line; /* line number in p_src */
- u_short p_isrc; /* index of (included) file */
- u_short p_iline; /* line number in p_iline */
-} pos_t;
-
-/*
- * Used for definitions and declarations
- *
- * To save memory, variable sized structures are used. If
- * all s_va, s_prfl and s_scfl are not set, the memory allocated
- * for a symbol is only large enough to keep the first member of
- * struct sym, s_s.
- */
-typedef struct sym {
- struct {
- pos_t s_pos; /* pos of def./decl. */
-#ifndef lint
- u_int s_def : 3; /* DECL, TDEF or DEF */
-#else
- def_t s_def;
-#endif
- u_int s_rval : 1; /* function has return value */
- u_int s_osdef : 1; /* old style function definition */
- u_int s_static : 1; /* symbol is static */
- u_int s_va : 1; /* check only first s_nva arguments */
- u_int s_prfl : 1; /* printflike */
- u_int s_scfl : 1; /* scanflike */
- u_short s_type; /* type */
- struct sym *s_nxt; /* next symbol with same name */
- } s_s;
- short s_nva;
- short s_nprfl;
- short s_nscfl;
-} sym_t;
-
-#define s_pos s_s.s_pos
-#define s_rval s_s.s_rval
-#define s_osdef s_s.s_osdef
-#define s_static s_s.s_static
-#define s_def s_s.s_def
-#define s_va s_s.s_va
-#define s_prfl s_s.s_prfl
-#define s_scfl s_s.s_scfl
-#define s_type s_s.s_type
-#define s_nxt s_s.s_nxt
-
-/*
- * Used to store informations about function calls.
- */
-typedef struct fcall {
- pos_t f_pos; /* position of call */
- u_int f_rused : 1; /* return value used */
- u_int f_rdisc : 1; /* return value discarded (casted to void) */
- u_short f_type; /* types of expected return value and args */
- arginf_t *f_args; /* information about constant arguments */
- struct fcall *f_nxt; /* next call of same function */
-} fcall_t;
-
-/*
- * Used to store information about usage of symbols other
- * than for function calls.
- */
-typedef struct usym {
- pos_t u_pos; /* position */
- struct usym *u_nxt; /* next usage */
-} usym_t;
-
-/*
- * hash table entry
- */
-typedef struct hte {
- const char *h_name; /* name */
- u_int h_used : 1; /* symbol is used */
- u_int h_def : 1; /* symbol is defined */
- u_int h_static : 1; /* static symbol */
- sym_t *h_syms; /* declarations and definitions */
- sym_t **h_lsym; /* points to s_nxt of last decl./def. */
- fcall_t *h_calls; /* function calls */
- fcall_t **h_lcall; /* points to f_nxt of last call */
- usym_t *h_usyms; /* usage info */
- usym_t **h_lusym; /* points to u_nxt of last usage info */
- struct hte *h_link; /* next hte with same hash function */
- struct hte *h_hte; /* pointer to other htes (for renames */
-} hte_t;
-
-/* maps type indices into pointers to type structs */
-#define TP(idx) (tlst[idx])
-
-#include "externs2.h"
diff --git a/usr.bin/xlint/lint2/main2.c b/usr.bin/xlint/lint2/main2.c
deleted file mode 100644
index a05ddf4..0000000
--- a/usr.bin/xlint/lint2/main2.c
+++ /dev/null
@@ -1,191 +0,0 @@
-/* $NetBSD: main2.c,v 1.5 2001/11/21 19:14:26 wiz Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: main2.c,v 1.5 2001/11/21 19:14:26 wiz Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "lint2.h"
-
-/* warnings for symbols which are declared but not defined or used */
-int xflag;
-
-/*
- * warnings for symbols which are used and not defined or defined
- * and not used
- */
-int uflag = 1;
-
-/* Create a lint library in the current directory with name libname. */
-int Cflag;
-const char *libname;
-
-int pflag;
-
-/*
- * warnings for (tentative) definitions of the same name in more than
- * one translation unit
- */
-int sflag;
-
-int tflag;
-
-/*
- * If a complaint stems from an included file, print the name of the included
- * file instead of the name spezified at the command line followed by '?'
- */
-int Hflag;
-
-int hflag;
-
-/* Print full path names, not only the last component */
-int Fflag;
-
-/*
- * List of libraries (from -l flag). These libraries are read after all
- * other input files has been read and, for Cflag, after the new lint library
- * has been written.
- */
-const char **libs;
-
-static void usage(void);
-
-int main(int, char *[]);
-
-int
-main(int argc, char *argv[])
-{
- int c, i;
- size_t len;
- char *lname;
-
- libs = xcalloc(1, sizeof (char *));
-
- opterr = 0;
- while ((c = getopt(argc, argv, "hpstxuC:HFl:")) != -1) {
- switch (c) {
- case 's':
- sflag = 1;
- break;
- case 't':
- tflag = 1;
- break;
- case 'u':
- uflag = 0;
- break;
- case 'x':
- xflag = 1;
- break;
- case 'p':
- pflag = 1;
- break;
- case 'C':
- len = strlen(optarg);
- lname = xmalloc(len + 10);
- (void)sprintf(lname, "llib-l%s.ln", optarg);
- libname = lname;
- Cflag = 1;
- uflag = 0;
- break;
- case 'H':
- Hflag = 1;
- break;
- case 'h':
- hflag = 1;
- break;
- case 'F':
- Fflag = 1;
- break;
- case 'l':
- for (i = 0; libs[i] != NULL; i++)
- continue;
- libs = xrealloc(libs, (i + 2) * sizeof (char *));
- libs[i] = xstrdup(optarg);
- libs[i + 1] = NULL;
- break;
- case '?':
- usage();
- }
- }
-
- argc -= optind;
- argv += optind;
-
- if (argc == 0)
- usage();
-
- initmem();
-
- /* initialize hash table */
- inithash();
-
- inittyp();
-
- for (i = 0; i < argc; i++)
- readfile(argv[i]);
-
- /* write the lint library */
- if (Cflag) {
- forall(mkstatic);
- outlib(libname);
- }
-
- /* read additional libraries */
- for (i = 0; libs[i] != NULL; i++)
- readfile(libs[i]);
-
- forall(mkstatic);
-
- mainused();
-
- /* perform all tests */
- forall(chkname);
-
- exit(0);
- /* NOTREACHED */
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr,
- "usage: lint2 -hpstxuHF -Clib -l lib ... src1 ...\n");
- exit(1);
-}
diff --git a/usr.bin/xlint/lint2/mem2.c b/usr.bin/xlint/lint2/mem2.c
deleted file mode 100644
index 48e759e..0000000
--- a/usr.bin/xlint/lint2/mem2.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/* $NetBSD: mem2.c,v 1.6 2002/01/21 19:49:52 tv Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: mem2.c,v 1.6 2002/01/21 19:49:52 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <err.h>
-#include <unistd.h>
-#include <string.h>
-
-#include "lint2.h"
-
-/* length of new allocated memory blocks */
-static size_t mblklen;
-
-/* offset of next free byte in mbuf */
-static size_t nxtfree;
-
-/* current buffer to server memory requests from */
-static void *mbuf;
-
-void
-initmem(void)
-{
- int pgsz;
-
- pgsz = getpagesize();
- mblklen = ((MBLKSIZ + pgsz - 1) / pgsz) * pgsz;
-
- nxtfree = mblklen;
-}
-
-/*
- * Allocate memory in large chunks to avoid space and time overhead of
- * malloc(). This is possible because memory allocated by xalloc()
- * need never to be freed.
- */
-void *
-xalloc(size_t sz)
-{
- void *ptr;
- int prot, flags;
-
- /* Align to at least 8 bytes. */
- sz = (sz + 7) & ~7L;
- if (nxtfree + sz > mblklen) {
- /* use mmap() instead of malloc() to avoid malloc overhead. */
- prot = PROT_READ | PROT_WRITE;
- flags = MAP_ANON | MAP_PRIVATE;
- mbuf = mmap(NULL, mblklen, prot, flags, -1, (off_t)0);
- if (mbuf == (void *)MAP_FAILED)
- err(1, "can't map memory");
- (void)memset(mbuf, 0, mblklen);
- nxtfree = 0;
- }
-
- ptr = (char *)mbuf + nxtfree;
- nxtfree += sz;
-
- return (ptr);
-}
diff --git a/usr.bin/xlint/lint2/msg.c b/usr.bin/xlint/lint2/msg.c
deleted file mode 100644
index b4a6a31..0000000
--- a/usr.bin/xlint/lint2/msg.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/* $NetBSD: msg.c,v 1.6 2002/01/21 19:49:52 tv Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: msg.c,v 1.6 2002/01/21 19:49:52 tv Exp $");
-#endif
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-
-#include "lint2.h"
-
-static const char *msgs[] = {
- "%s used( %s ), but not defined", /* 0 */
- "%s defined( %s ), but never used", /* 1 */
- "%s declared( %s ), but never used or defined", /* 2 */
- "%s multiply defined \t%s :: %s", /* 3 */
- "%s value used inconsistently \t%s :: %s", /* 4 */
- "%s value declared inconsistently \t%s :: %s", /* 5 */
- "%s, arg %d used inconsistently \t%s :: %s", /* 6 */
- "%s: variable # of args \t%s :: %s", /* 7 */
- "%s returns value which is always ignored", /* 8 */
- "%s returns value which is sometimes ignored", /* 9 */
- "%s value is used( %s ), but none returned", /* 10 */
- "%s, arg %d declared inconsistently \t%s :: %s", /* 11 */
- "%s: variable # of args declared \t%s :: %s", /* 12 */
- "%s: malformed format string \t%s", /* 13 */
- "%s, arg %d inconsistent with format \t%s", /* 14 */
- "%s: too few args for format \t%s", /* 15 */
- "%s: too many args for format \t%s", /* 16 */
- "%s function value must be declared before use \t%s :: %s",/* 17 */
- "%s renamed multiple times \t%s :: %s", /* 18 */
-};
-
-static const char *lbasename(const char *);
-
-void
-msg(int n, ...)
-{
- va_list ap;
-
- va_start(ap, n);
-
- (void)vprintf(msgs[n], ap);
- (void)printf("\n");
-
- va_end(ap);
-}
-
-/*
- * Return a pointer to the last component of a path.
- */
-static const char *
-lbasename(const char *path)
-{
- const char *cp, *cp1, *cp2;
-
- if (Fflag)
- return (path);
-
- cp = cp1 = cp2 = path;
- while (*cp != '\0') {
- if (*cp++ == '/') {
- cp2 = cp1;
- cp1 = cp;
- }
- }
- return (*cp1 == '\0' ? cp2 : cp1);
-}
-
-/*
- * Create a string which describes a position in a source file.
- */
-const char *
-mkpos(pos_t *posp)
-{
- size_t len;
- const char *fn;
- static char *buf;
- static size_t blen = 0;
- int qm, src, line;
-
- if (Hflag && posp->p_src != posp->p_isrc) {
- src = posp->p_isrc;
- line = posp->p_iline;
- } else {
- src = posp->p_src;
- line = posp->p_line;
- }
- qm = !Hflag && posp->p_src != posp->p_isrc;
-
- len = strlen(fn = lbasename(fnames[src]));
- len += 3 * sizeof (u_short) + 4;
-
- if (len > blen)
- buf = xrealloc(buf, blen = len);
- if (line != 0) {
- (void)sprintf(buf, "%s%s(%hu)",
- fn, qm ? "?" : "", line);
- } else {
- (void)sprintf(buf, "%s", fn);
- }
-
- return (buf);
-}
diff --git a/usr.bin/xlint/lint2/read.c b/usr.bin/xlint/lint2/read.c
deleted file mode 100644
index 6288cc1..0000000
--- a/usr.bin/xlint/lint2/read.c
+++ /dev/null
@@ -1,1246 +0,0 @@
-/* $NetBSD: read.c,v 1.12 2002/01/21 19:49:52 tv Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: read.c,v 1.12 2002/01/21 19:49:52 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <ctype.h>
-#include <err.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "lint2.h"
-
-
-/* index of current (included) source file */
-static int srcfile;
-
-/*
- * The array pointed to by inpfns maps the file name indices of input files
- * to the file name indices used in lint2
- */
-static short *inpfns;
-static size_t ninpfns;
-
-/*
- * The array pointed to by *fnames maps file name indizes to file names.
- * Indices of type short are used instead of pointers to save memory.
- */
-const char **fnames;
-static size_t nfnames;
-
-/*
- * Types are shared (to save memory for the types itself) and accessed
- * via indices (to save memory for references to types (indices are short)).
- * To share types, an equal type must be located fast. This is done by a
- * hash table. Access by indices is done via an array of pointers to the
- * types.
- */
-typedef struct thtab {
- const char *th_name;
- u_short th_idx;
- struct thtab *th_nxt;
-} thtab_t;
-static thtab_t **thtab; /* hash table */
-type_t **tlst; /* array for indexed access */
-static size_t tlstlen; /* length of tlst */
-
-static hte_t **renametab;
-
-/* index of current C source file (as spezified at the command line) */
-static int csrcfile;
-
-
-static void inperr(void);
-static void setsrc(const char *);
-static void setfnid(int, const char *);
-static void funccall(pos_t *, const char *);
-static void decldef(pos_t *, const char *);
-static void usedsym(pos_t *, const char *);
-static u_short inptype(const char *, const char **);
-static int gettlen(const char *, const char **);
-static u_short findtype(const char *, size_t, int);
-static u_short storetyp(type_t *, const char *, size_t, int);
-static int thash(const char *, size_t);
-static char *inpqstrg(const char *, const char **);
-static const char *inpname(const char *, const char **);
-static int getfnidx(const char *);
-
-void
-readfile(const char *name)
-{
- FILE *inp;
- size_t len;
- const char *cp;
- char *line, *eptr, rt = '\0';
- int cline, isrc, iline;
- pos_t pos;
-
- if (inpfns == NULL)
- if ((inpfns = calloc(ninpfns = 128, sizeof (short))) == NULL)
- nomem();
- if (fnames == NULL)
- if ((fnames = calloc(nfnames = 256, sizeof (char *))) == NULL)
- nomem();
- if (tlstlen == 0)
- if ((tlst = calloc(tlstlen = 256, sizeof (type_t *))) == NULL)
- nomem();
- if (thtab == NULL)
- if ((thtab = calloc(THSHSIZ2, sizeof (thtab_t))) == NULL)
- nomem();
-
- _inithash(&renametab);
-
- srcfile = getfnidx(name);
-
- if ((inp = fopen(name, "r")) == NULL)
- err(1, "cannot open %s", name);
-
- while ((line = fgetln(inp, &len)) != NULL) {
-
- if (len == 0 || line[len - 1] != '\n')
- inperr();
- line[len - 1] = '\0';
- cp = line;
-
- /* line number in csrcfile */
- cline = (int)strtol(cp, &eptr, 10);
- if (cp == eptr) {
- cline = -1;
- } else {
- cp = eptr;
- }
-
- /* record type */
- if (*cp != '\0') {
- rt = *cp++;
- } else {
- inperr();
- }
-
- if (rt == 'S') {
- setsrc(cp);
- continue;
- } else if (rt == 's') {
- setfnid(cline, cp);
- continue;
- }
-
- /*
- * Index of (included) source file. If this index is
- * different from csrcfile, it refers to an included
- * file.
- */
- isrc = (int)strtol(cp, &eptr, 10);
- if (cp == eptr)
- inperr();
- cp = eptr;
- isrc = inpfns[isrc];
-
- /* line number in isrc */
- if (*cp++ != '.')
- inperr();
- iline = (int)strtol(cp, &eptr, 10);
- if (cp == eptr)
- inperr();
- cp = eptr;
-
- pos.p_src = (u_short)csrcfile;
- pos.p_line = (u_short)cline;
- pos.p_isrc = (u_short)isrc;
- pos.p_iline = (u_short)iline;
-
- /* process rest of this record */
- switch (rt) {
- case 'c':
- funccall(&pos, cp);
- break;
- case 'd':
- decldef(&pos, cp);
- break;
- case 'u':
- usedsym(&pos, cp);
- break;
- default:
- inperr();
- }
-
- }
-
- _destroyhash(renametab);
-
- if (ferror(inp))
- err(1, "read error on %s", name);
-
- (void)fclose(inp);
-}
-
-
-static void
-inperr(void)
-{
-
- errx(1, "input file error: %s", fnames[srcfile]);
-}
-
-/*
- * Set the name of the C source file of the .ln file which is
- * currently read.
- */
-static void
-setsrc(const char *cp)
-{
-
- csrcfile = getfnidx(cp);
-}
-
-/*
- * setfnid() gets as input an index as used in an input file and the
- * associated file name. If necessary, it creates a new lint2 file
- * name index for this file name and creates the mapping of the index
- * as used in the input file to the index used in lint2.
- */
-static void
-setfnid(int fid, const char *cp)
-{
-
- if (fid == -1)
- inperr();
-
- if (fid >= ninpfns) {
- if ((inpfns = realloc(inpfns, (ninpfns * 2) * sizeof (short)))
- == NULL)
- nomem();
- (void)memset(inpfns + ninpfns, 0, ninpfns * sizeof (short));
- ninpfns *= 2;
- }
- /*
- * Should always be true because indices written in the output
- * file by lint1 are always the previous index + 1.
- */
- if (fid >= ninpfns)
- errx(1, "internal error: setfnid()");
- inpfns[fid] = (u_short)getfnidx(cp);
-}
-
-/*
- * Process a function call record (c-record).
- */
-static void
-funccall(pos_t *posp, const char *cp)
-{
- arginf_t *ai, **lai;
- char c, *eptr;
- int rused, rdisc;
- hte_t *hte;
- fcall_t *fcall;
- const char *name;
-
- fcall = xalloc(sizeof (fcall_t));
- STRUCT_ASSIGN(fcall->f_pos, *posp);
-
- /* read flags */
- rused = rdisc = 0;
- lai = &fcall->f_args;
- while ((c = *cp) == 'u' || c == 'i' || c == 'd' ||
- c == 'z' || c == 'p' || c == 'n' || c == 's') {
- cp++;
- switch (c) {
- case 'u':
- if (rused || rdisc)
- inperr();
- rused = 1;
- break;
- case 'i':
- if (rused || rdisc)
- inperr();
- break;
- case 'd':
- if (rused || rdisc)
- inperr();
- rdisc = 1;
- break;
- case 'z':
- case 'p':
- case 'n':
- case 's':
- ai = xalloc(sizeof (arginf_t));
- ai->a_num = (int)strtol(cp, &eptr, 10);
- if (cp == eptr)
- inperr();
- cp = eptr;
- if (c == 'z') {
- ai->a_pcon = ai->a_zero = 1;
- } else if (c == 'p') {
- ai->a_pcon = 1;
- } else if (c == 'n') {
- ai->a_ncon = 1;
- } else {
- ai->a_fmt = 1;
- ai->a_fstrg = inpqstrg(cp, &cp);
- }
- *lai = ai;
- lai = &ai->a_nxt;
- break;
- }
- }
- fcall->f_rused = rused;
- fcall->f_rdisc = rdisc;
-
- /* read name of function */
- name = inpname(cp, &cp);
-
- /* first look it up in the renaming table, then in the normal table */
- hte = _hsearch(renametab, name, 0);
- if (hte != NULL)
- hte = hte->h_hte;
- else
- hte = hsearch(name, 1);
- hte->h_used = 1;
-
- fcall->f_type = inptype(cp, &cp);
-
- *hte->h_lcall = fcall;
- hte->h_lcall = &fcall->f_nxt;
-
- if (*cp != '\0')
- inperr();
-}
-
-/*
- * Process a declaration or definition (d-record).
- */
-static void
-decldef(pos_t *posp, const char *cp)
-{
- sym_t *symp, sym;
- char c, *ep, *pos1;
- int used, renamed;
- hte_t *hte, *renamehte = NULL;
- const char *name, *rename;
-
- (void)memset(&sym, 0, sizeof (sym));
- STRUCT_ASSIGN(sym.s_pos, *posp);
- sym.s_def = NODECL;
-
- used = 0;
-
- while ((c = *cp) == 't' || c == 'd' || c == 'e' || c == 'u' ||
- c == 'r' || c == 'o' || c == 's' || c == 'v' ||
- c == 'P' || c == 'S') {
- cp++;
- switch (c) {
- case 't':
- if (sym.s_def != NODECL)
- inperr();
- sym.s_def = TDEF;
- break;
- case 'd':
- if (sym.s_def != NODECL)
- inperr();
- sym.s_def = DEF;
- break;
- case 'e':
- if (sym.s_def != NODECL)
- inperr();
- sym.s_def = DECL;
- break;
- case 'u':
- if (used)
- inperr();
- used = 1;
- break;
- case 'r':
- if (sym.s_rval)
- inperr();
- sym.s_rval = 1;
- break;
- case 'o':
- if (sym.s_osdef)
- inperr();
- sym.s_osdef = 1;
- break;
- case 's':
- if (sym.s_static)
- inperr();
- sym.s_static = 1;
- break;
- case 'v':
- if (sym.s_va)
- inperr();
- sym.s_va = 1;
- sym.s_nva = (short)strtol(cp, &ep, 10);
- if (cp == ep)
- inperr();
- cp = ep;
- break;
- case 'P':
- if (sym.s_prfl)
- inperr();
- sym.s_prfl = 1;
- sym.s_nprfl = (short)strtol(cp, &ep, 10);
- if (cp == ep)
- inperr();
- cp = ep;
- break;
- case 'S':
- if (sym.s_scfl)
- inperr();
- sym.s_scfl = 1;
- sym.s_nscfl = (short)strtol(cp, &ep, 10);
- if (cp == ep)
- inperr();
- cp = ep;
- break;
- }
- }
-
- /* read symbol name, doing renaming if necessary */
- name = inpname(cp, &cp);
- renamed = 0;
- if (*cp == 'r') {
- cp++;
- name = xstrdup(name);
- rename = inpname(cp, &cp);
-
- /* enter it and see if it's already been renamed */
- renamehte = _hsearch(renametab, name, 1);
- if (renamehte->h_hte == NULL) {
- hte = hsearch(rename, 1);
- renamehte->h_hte = hte;
- renamed = 1;
- } else if (strcmp((hte = renamehte->h_hte)->h_name, rename)) {
- pos1 = xstrdup(mkpos(&renamehte->h_syms->s_pos));
- /* %s renamed multiple times\t%s :: %s */
- msg(18, name, pos1, mkpos(&sym.s_pos));
- free(pos1);
- }
- free((char *)name);
- } else {
- /* it might be a previously-done rename */
- hte = _hsearch(renametab, name, 0);
- if (hte != NULL)
- hte = hte->h_hte;
- else
- hte = hsearch(name, 1);
- }
- hte->h_used |= used;
- if (sym.s_def == DEF || sym.s_def == TDEF)
- hte->h_def = 1;
-
- sym.s_type = inptype(cp, &cp);
-
- /*
- * Allocate memory for this symbol only if it was not already
- * declared or tentatively defined at the same location with
- * the same type. Works only for symbols with external linkage,
- * because static symbols, tentatively defined at the same location
- * but in different translation units are really different symbols.
- */
- for (symp = hte->h_syms; symp != NULL; symp = symp->s_nxt) {
- if (symp->s_pos.p_isrc == sym.s_pos.p_isrc &&
- symp->s_pos.p_iline == sym.s_pos.p_iline &&
- symp->s_type == sym.s_type &&
- ((symp->s_def == DECL && sym.s_def == DECL) ||
- (!sflag && symp->s_def == TDEF && sym.s_def == TDEF)) &&
- !symp->s_static && !sym.s_static) {
- break;
- }
- }
-
- if (symp == NULL) {
- /* allocsym reserviert keinen Platz fuer s_nva */
- if (sym.s_va || sym.s_prfl || sym.s_scfl) {
- symp = xalloc(sizeof (sym_t));
- STRUCT_ASSIGN(*symp, sym);
- } else {
- symp = xalloc(sizeof (symp->s_s));
- STRUCT_ASSIGN(symp->s_s, sym.s_s);
- }
- *hte->h_lsym = symp;
- hte->h_lsym = &symp->s_nxt;
-
- /* XXX hack so we can remember where a symbol was renamed */
- if (renamed)
- renamehte->h_syms = symp;
- }
-
- if (*cp != '\0')
- inperr();
-}
-
-/*
- * Read an u-record (emited by lint1 if a symbol was used).
- */
-static void
-usedsym(pos_t *posp, const char *cp)
-{
- usym_t *usym;
- hte_t *hte;
- const char *name;
-
- usym = xalloc(sizeof (usym_t));
- STRUCT_ASSIGN(usym->u_pos, *posp);
-
- /* needed as delimiter between two numbers */
- if (*cp++ != 'x')
- inperr();
-
- name = inpname(cp, &cp);
- hte = _hsearch(renametab, name, 0);
- if (hte != NULL)
- hte = hte->h_hte;
- else
- hte = hsearch(name, 1);
- hte->h_used = 1;
-
- *hte->h_lusym = usym;
- hte->h_lusym = &usym->u_nxt;
-}
-
-/*
- * Read a type and return the index of this type.
- */
-static u_short
-inptype(const char *cp, const char **epp)
-{
- char c, s, *eptr;
- const char *ep;
- type_t *tp;
- int narg, i, osdef = 0;
- size_t tlen;
- u_short tidx;
- int h;
-
- /* If we have this type already, return it's index. */
- tlen = gettlen(cp, &ep);
- h = thash(cp, tlen);
- if ((tidx = findtype(cp, tlen, h)) != 0) {
- *epp = ep;
- return (tidx);
- }
-
- /* No, we must create a new type. */
- tp = xalloc(sizeof (type_t));
-
- tidx = storetyp(tp, cp, tlen, h);
-
- c = *cp++;
-
- while (c == 'c' || c == 'v') {
- if (c == 'c') {
- tp->t_const = 1;
- } else {
- tp->t_volatile = 1;
- }
- c = *cp++;
- }
-
- if (c == 's' || c == 'u' || c == 'l' || c == 'e') {
- s = c;
- c = *cp++;
- } else {
- s = '\0';
- }
-
- switch (c) {
- case 'C':
- tp->t_tspec = s == 's' ? SCHAR : (s == 'u' ? UCHAR : CHAR);
- break;
- case 'S':
- tp->t_tspec = s == 'u' ? USHORT : SHORT;
- break;
- case 'I':
- tp->t_tspec = s == 'u' ? UINT : INT;
- break;
- case 'L':
- tp->t_tspec = s == 'u' ? ULONG : LONG;
- break;
- case 'Q':
- tp->t_tspec = s == 'u' ? UQUAD : QUAD;
- break;
- case 'D':
- tp->t_tspec = s == 's' ? FLOAT : (s == 'l' ? LDOUBLE : DOUBLE);
- break;
- case 'V':
- tp->t_tspec = VOID;
- break;
- case 'P':
- tp->t_tspec = PTR;
- break;
- case 'A':
- tp->t_tspec = ARRAY;
- break;
- case 'F':
- case 'f':
- osdef = c == 'f';
- tp->t_tspec = FUNC;
- break;
- case 'T':
- tp->t_tspec = s == 'e' ? ENUM : (s == 's' ? STRUCT : UNION);
- break;
- }
-
- switch (tp->t_tspec) {
- case ARRAY:
- tp->t_dim = (int)strtol(cp, &eptr, 10);
- cp = eptr;
- tp->t_subt = TP(inptype(cp, &cp));
- break;
- case PTR:
- tp->t_subt = TP(inptype(cp, &cp));
- break;
- case FUNC:
- c = *cp;
- if (isdigit((u_char)c)) {
- if (!osdef)
- tp->t_proto = 1;
- narg = (int)strtol(cp, &eptr, 10);
- cp = eptr;
- if ((tp->t_args = calloc((size_t)(narg + 1),
- sizeof (type_t *))) == NULL)
- nomem();
- for (i = 0; i < narg; i++) {
- if (i == narg - 1 && *cp == 'E') {
- tp->t_vararg = 1;
- cp++;
- } else {
- tp->t_args[i] = TP(inptype(cp, &cp));
- }
- }
- }
- tp->t_subt = TP(inptype(cp, &cp));
- break;
- case ENUM:
- tp->t_tspec = INT;
- tp->t_isenum = 1;
- /* FALLTHROUGH */
- case STRUCT:
- case UNION:
- switch (*cp++) {
- case '1':
- tp->t_istag = 1;
- tp->t_tag = hsearch(inpname(cp, &cp), 1);
- break;
- case '2':
- tp->t_istynam = 1;
- tp->t_tynam = hsearch(inpname(cp, &cp), 1);
- break;
- case '3':
- tp->t_isuniqpos = 1;
- tp->t_uniqpos.p_line = strtol(cp, &eptr, 10);
- cp = eptr;
- cp++;
- /* xlate to 'global' file name. */
- tp->t_uniqpos.p_file =
- addoutfile(inpfns[strtol(cp, &eptr, 10)]);
- cp = eptr;
- cp++;
- tp->t_uniqpos.p_uniq = strtol(cp, &eptr, 10);
- cp = eptr;
- break;
- }
- break;
- case LONG:
- case VOID:
- case LDOUBLE:
- case DOUBLE:
- case FLOAT:
- case UQUAD:
- case QUAD:
- case ULONG:
- case UINT:
- case INT:
- case USHORT:
- case SHORT:
- case UCHAR:
- case SCHAR:
- case CHAR:
- case UNSIGN:
- case SIGNED:
- case NOTSPEC:
- break;
- case NTSPEC:
- abort();
- }
-
- *epp = cp;
- return (tidx);
-}
-
-/*
- * Get the length of a type string.
- */
-static int
-gettlen(const char *cp, const char **epp)
-{
- const char *cp1;
- char c, s, *eptr;
- tspec_t t;
- int narg, i, cm, vm;
-
- cp1 = cp;
-
- c = *cp++;
-
- cm = vm = 0;
-
- while (c == 'c' || c == 'v') {
- if (c == 'c') {
- if (cm)
- inperr();
- cm = 1;
- } else {
- if (vm)
- inperr();
- vm = 1;
- }
- c = *cp++;
- }
-
- if (c == 's' || c == 'u' || c == 'l' || c == 'e') {
- s = c;
- c = *cp++;
- } else {
- s = '\0';
- }
-
- t = NOTSPEC;
-
- switch (c) {
- case 'C':
- if (s == 's') {
- t = SCHAR;
- } else if (s == 'u') {
- t = UCHAR;
- } else if (s == '\0') {
- t = CHAR;
- }
- break;
- case 'S':
- if (s == 'u') {
- t = USHORT;
- } else if (s == '\0') {
- t = SHORT;
- }
- break;
- case 'I':
- if (s == 'u') {
- t = UINT;
- } else if (s == '\0') {
- t = INT;
- }
- break;
- case 'L':
- if (s == 'u') {
- t = ULONG;
- } else if (s == '\0') {
- t = LONG;
- }
- break;
- case 'Q':
- if (s == 'u') {
- t = UQUAD;
- } else if (s == '\0') {
- t = QUAD;
- }
- break;
- case 'D':
- if (s == 's') {
- t = FLOAT;
- } else if (s == 'l') {
- t = LDOUBLE;
- } else if (s == '\0') {
- t = DOUBLE;
- }
- break;
- case 'V':
- if (s == '\0')
- t = VOID;
- break;
- case 'P':
- if (s == '\0')
- t = PTR;
- break;
- case 'A':
- if (s == '\0')
- t = ARRAY;
- break;
- case 'F':
- case 'f':
- if (s == '\0')
- t = FUNC;
- break;
- case 'T':
- if (s == 'e') {
- t = ENUM;
- } else if (s == 's') {
- t = STRUCT;
- } else if (s == 'u') {
- t = UNION;
- }
- break;
- default:
- inperr();
- }
-
- if (t == NOTSPEC)
- inperr();
-
- switch (t) {
- case ARRAY:
- (void)strtol(cp, &eptr, 10);
- if (cp == eptr)
- inperr();
- cp = eptr;
- (void)gettlen(cp, &cp);
- break;
- case PTR:
- (void)gettlen(cp, &cp);
- break;
- case FUNC:
- c = *cp;
- if (isdigit((u_char)c)) {
- narg = (int)strtol(cp, &eptr, 10);
- cp = eptr;
- for (i = 0; i < narg; i++) {
- if (i == narg - 1 && *cp == 'E') {
- cp++;
- } else {
- (void)gettlen(cp, &cp);
- }
- }
- }
- (void)gettlen(cp, &cp);
- break;
- case ENUM:
- case STRUCT:
- case UNION:
- switch (*cp++) {
- case '1':
- (void)inpname(cp, &cp);
- break;
- case '2':
- (void)inpname(cp, &cp);
- break;
- case '3':
- /* unique position: line.file.uniquifier */
- (void)strtol(cp, &eptr, 10);
- if (cp == eptr)
- inperr();
- cp = eptr;
- if (*cp++ != '.')
- inperr();
- (void)strtol(cp, &eptr, 10);
- if (cp == eptr)
- inperr();
- cp = eptr;
- if (*cp++ != '.')
- inperr();
- (void)strtol(cp, &eptr, 10);
- if (cp == eptr)
- inperr();
- cp = eptr;
- break;
- default:
- inperr();
- }
- break;
- case FLOAT:
- case USHORT:
- case SHORT:
- case UCHAR:
- case SCHAR:
- case CHAR:
- case UNSIGN:
- case SIGNED:
- case NOTSPEC:
- case INT:
- case UINT:
- case DOUBLE:
- case LDOUBLE:
- case VOID:
- case ULONG:
- case QUAD:
- case UQUAD:
- case LONG:
- break;
- case NTSPEC:
- abort();
- }
-
- *epp = cp;
- return (cp - cp1);
-}
-
-/*
- * Search a type by it's type string.
- */
-static u_short
-findtype(const char *cp, size_t len, int h)
-{
- thtab_t *thte;
-
- for (thte = thtab[h]; thte != NULL; thte = thte->th_nxt) {
- if (strncmp(thte->th_name, cp, len) != 0)
- continue;
- if (thte->th_name[len] == '\0')
- return (thte->th_idx);
- }
-
- return (0);
-}
-
-/*
- * Store a type and it's type string so we can later share this type
- * if we read the same type string from the input file.
- */
-static u_short
-storetyp(type_t *tp, const char *cp, size_t len, int h)
-{
- static u_int tidx = 1; /* 0 is reserved */
- thtab_t *thte;
- char *name;
-
- if (tidx >= USHRT_MAX)
- errx(1, "sorry, too many types");
-
- if (tidx == tlstlen - 1) {
- if ((tlst = realloc(tlst, (tlstlen * 2) * sizeof (type_t *)))
- == NULL)
- nomem();
- (void)memset(tlst + tlstlen, 0, tlstlen * sizeof (type_t *));
- tlstlen *= 2;
- }
-
- tlst[tidx] = tp;
-
- /* create a hash table entry */
- name = xalloc(len + 1);
- (void)memcpy(name, cp, len);
- name[len] = '\0';
-
- thte = xalloc(sizeof (thtab_t));
- thte->th_name = name;
- thte->th_idx = tidx;
- thte->th_nxt = thtab[h];
- thtab[h] = thte;
-
- return ((u_short)tidx++);
-}
-
-/*
- * Hash function for types
- */
-static int
-thash(const char *s, size_t len)
-{
- u_int v;
-
- v = 0;
- while (len-- != 0) {
- v = (v << sizeof (v)) + (u_char)*s++;
- v ^= v >> (sizeof (v) * CHAR_BIT - sizeof (v));
- }
- return (v % THSHSIZ2);
-}
-
-/*
- * Read a string enclosed by "". This string may contain quoted chars.
- */
-static char *
-inpqstrg(const char *src, const char **epp)
-{
- char *strg, *dst;
- size_t slen;
- int c;
- int v;
-
- if ((dst = strg = malloc(slen = 32)) == NULL)
- nomem();
-
- if ((c = *src++) != '"')
- inperr();
- if ((c = *src++) == '\0')
- inperr();
-
- while (c != '"') {
- if (c == '\\') {
- if ((c = *src++) == '\0')
- inperr();
- switch (c) {
- case 'n':
- c = '\n';
- break;
- case 't':
- c = '\t';
- break;
- case 'v':
- c = '\v';
- break;
- case 'b':
- c = '\b';
- break;
- case 'r':
- c = '\r';
- break;
- case 'f':
- c = '\f';
- break;
- case 'a':
- c = '\a';
- break;
- case '\\':
- c = '\\';
- break;
- case '"':
- c = '"';
- break;
- case '\'':
- c = '\'';
- break;
- case '0': case '1': case '2': case '3':
- v = (c - '0') << 6;
- if ((c = *src++) < '0' || c > '7')
- inperr();
- v |= (c - '0') << 3;
- if ((c = *src++) < '0' || c > '7')
- inperr();
- v |= c - '0';
- c = (u_char)v;
- break;
- default:
- inperr();
- }
- }
- /* keep space for trailing '\0' */
- if (dst - strg == slen - 1) {
- if ((strg = realloc(strg, slen * 2)) == NULL)
- nomem();
- dst = strg + (slen - 1);
- slen *= 2;
- }
- *dst++ = (char)c;
- if ((c = *src++) == '\0')
- inperr();
- }
- *dst = '\0';
-
- *epp = src;
- return (strg);
-}
-
-/*
- * Read the name of a symbol in static memory.
- */
-static const char *
-inpname(const char *cp, const char **epp)
-{
- static char *buf;
- static size_t blen = 0;
- size_t len, i;
- char *eptr, c;
-
- len = (int)strtol(cp, &eptr, 10);
- if (cp == eptr)
- inperr();
- cp = eptr;
- if (len + 1 > blen)
- if ((buf = realloc(buf, blen = len + 1)) == NULL)
- nomem();
- for (i = 0; i < len; i++) {
- c = *cp++;
- if (!isalnum((unsigned char)c) && c != '_')
- inperr();
- buf[i] = c;
- }
- buf[i] = '\0';
-
- *epp = cp;
- return (buf);
-}
-
-/*
- * Return the index of a file name. If the name cannot be found, create
- * a new entry and return the index of the newly created entry.
- */
-static int
-getfnidx(const char *fn)
-{
- int i;
-
- /* 0 ist reserved */
- for (i = 1; fnames[i] != NULL; i++) {
- if (strcmp(fnames[i], fn) == 0)
- break;
- }
- if (fnames[i] != NULL)
- return (i);
-
- if (i == nfnames - 1) {
- if ((fnames = realloc(fnames, (nfnames * 2) * sizeof (char *)))
- == NULL)
- nomem();
- (void)memset(fnames + nfnames, 0, nfnames * sizeof (char *));
- nfnames *= 2;
- }
-
- if ((fnames[i] = strdup(fn)) == NULL)
- nomem();
- return (i);
-}
-
-/*
- * Separate symbols with static and external linkage.
- */
-void
-mkstatic(hte_t *hte)
-{
- sym_t *sym1, **symp, *sym;
- fcall_t **callp, *call;
- usym_t **usymp, *usym;
- hte_t *nhte;
- int ofnd;
-
- /* Look for first static definition */
- for (sym1 = hte->h_syms; sym1 != NULL; sym1 = sym1->s_nxt) {
- if (sym1->s_static)
- break;
- }
- if (sym1 == NULL)
- return;
-
- /* Do nothing if this name is used only in one translation unit. */
- ofnd = 0;
- for (sym = hte->h_syms; sym != NULL && !ofnd; sym = sym->s_nxt) {
- if (sym->s_pos.p_src != sym1->s_pos.p_src)
- ofnd = 1;
- }
- for (call = hte->h_calls; call != NULL && !ofnd; call = call->f_nxt) {
- if (call->f_pos.p_src != sym1->s_pos.p_src)
- ofnd = 1;
- }
- for (usym = hte->h_usyms; usym != NULL && !ofnd; usym = usym->u_nxt) {
- if (usym->u_pos.p_src != sym1->s_pos.p_src)
- ofnd = 1;
- }
- if (!ofnd) {
- hte->h_used = 1;
- /* errors about undef. static symbols are printed in lint1 */
- hte->h_def = 1;
- hte->h_static = 1;
- return;
- }
-
- /*
- * Create a new hash table entry
- *
- * XXX this entry should be put at the beginning of the list to
- * avoid to process the same symbol twice.
- */
- for (nhte = hte; nhte->h_link != NULL; nhte = nhte->h_link)
- continue;
- nhte->h_link = xmalloc(sizeof (hte_t));
- nhte = nhte->h_link;
- nhte->h_name = hte->h_name;
- nhte->h_used = 1;
- nhte->h_def = 1; /* error in lint1 */
- nhte->h_static = 1;
- nhte->h_syms = NULL;
- nhte->h_lsym = &nhte->h_syms;
- nhte->h_calls = NULL;
- nhte->h_lcall = &nhte->h_calls;
- nhte->h_usyms = NULL;
- nhte->h_lusym = &nhte->h_usyms;
- nhte->h_link = NULL;
- nhte->h_hte = NULL;
-
- /*
- * move all symbols used in this translation unit into the new
- * hash table entry.
- */
- for (symp = &hte->h_syms; (sym = *symp) != NULL; ) {
- if (sym->s_pos.p_src == sym1->s_pos.p_src) {
- sym->s_static = 1;
- (*symp) = sym->s_nxt;
- if (hte->h_lsym == &sym->s_nxt)
- hte->h_lsym = symp;
- sym->s_nxt = NULL;
- *nhte->h_lsym = sym;
- nhte->h_lsym = &sym->s_nxt;
- } else {
- symp = &sym->s_nxt;
- }
- }
- for (callp = &hte->h_calls; (call = *callp) != NULL; ) {
- if (call->f_pos.p_src == sym1->s_pos.p_src) {
- (*callp) = call->f_nxt;
- if (hte->h_lcall == &call->f_nxt)
- hte->h_lcall = callp;
- call->f_nxt = NULL;
- *nhte->h_lcall = call;
- nhte->h_lcall = &call->f_nxt;
- } else {
- callp = &call->f_nxt;
- }
- }
- for (usymp = &hte->h_usyms; (usym = *usymp) != NULL; ) {
- if (usym->u_pos.p_src == sym1->s_pos.p_src) {
- (*usymp) = usym->u_nxt;
- if (hte->h_lusym == &usym->u_nxt)
- hte->h_lusym = usymp;
- usym->u_nxt = NULL;
- *nhte->h_lusym = usym;
- nhte->h_lusym = &usym->u_nxt;
- } else {
- usymp = &usym->u_nxt;
- }
- }
-
- /* h_def must be recalculated for old hte */
- hte->h_def = nhte->h_def = 0;
- for (sym = hte->h_syms; sym != NULL; sym = sym->s_nxt) {
- if (sym->s_def == DEF || sym->s_def == TDEF) {
- hte->h_def = 1;
- break;
- }
- }
-
- mkstatic(hte);
-}
diff --git a/usr.bin/xlint/llib/Makefile b/usr.bin/xlint/llib/Makefile
deleted file mode 100644
index 9f1e3c1..0000000
--- a/usr.bin/xlint/llib/Makefile
+++ /dev/null
@@ -1,17 +0,0 @@
-# $NetBSD: Makefile,v 1.7 2000/06/14 20:22:19 matt Exp $
-# $FreeBSD$
-
-LIBS= llib-lposix.ln llib-lstdc.ln
-
-FILES= ${LIBS}
-FILESDIR= ${LINTLIBDIR}
-
-CLEANFILES+= ${LIBS}
-
-llib-lposix.ln: llib-lposix
- ${LINT} ${LINTFLAGS} -Cposix ${.ALLSRC}
-
-llib-lstdc.ln: llib-lstdc
- ${LINT} ${LINTFLAGS} -Cstdc ${.ALLSRC}
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/xlint/llib/llib-lposix b/usr.bin/xlint/llib/llib-lposix
deleted file mode 100644
index b3f9ca9..0000000
--- a/usr.bin/xlint/llib/llib-lposix
+++ /dev/null
@@ -1,314 +0,0 @@
-/* $NetBSD: llib-lposix,v 1.2 1995/07/03 21:25:09 cgd Exp $ */
-/* $FreeBSD$ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/* LINTLIBRARY */
-
-#define _POSIX_SOURCE
-
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <sys/utsname.h>
-#include <sys/times.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <math.h>
-#include <time.h>
-#include <assert.h>
-#include <termios.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <grp.h>
-#include <pwd.h>
-#include <ctype.h>
-#include <signal.h>
-#include <locale.h>
-#include <setjmp.h>
-#include <string.h>
-#include <utime.h>
-
-
-/* PROTOLIB1 */
-
-
-void (abort)(void);
-int (abs)(int j);
-int (access)(const char *path, int amode);
-double (acos)(double x);
-unsigned (alarm)(unsigned seconds);
-char *(asctime)(const struct tm *timeptr);
-double (asin)(double x);
-void (__assert)(const char *expression, const char *func, int line,
- const char *file);
-double (atan)(double x);
-double (atan2)(double y, double x);
-int (atexit)(void (*func)(void));
-double (atof)(const char *nptr);
-int (atoi)(const char *nptr);
-long (atol)(const char *nptr);
-void *(bsearch)(const void *key, const void *base, size_t nmemb,
- size_t size, int (*compar)(const void *, const void *));
-void *(calloc)(size_t nmemb, size_t size);
-double (ceil)(double x);
-speed_t (cfgetispeed)(const struct termios *p);
-speed_t (cfgetospeed)(const struct termios *p);
-int (cfsetispeed)(struct termios *p, speed_t speed);
-int (cfsetospeed)(struct termios *p, speed_t speed);
-int (chdir)(const char *path);
-int (chmod)(const char *path, mode_t mode);
-int (chown)(const char *path, uid_t owner, gid_t group);
-void (clearerr)(FILE *stream);
-clock_t (clock)(void);
-int (close)(int fildes);
-int (closedir)(DIR *dirp);
-double (cos)(double x);
-double (cosh)(double x);
-int (creat)(const char *path, mode_t mode);
-char *(ctermid)(char *s);
-char *(ctime)(const time_t *timer);
-char *(cuserid)(char *s);
-double (difftime)(time_t time1, time_t time0);
-div_t (div)(int numer, int denom);
-int (dup)(int fildes);
-int (dup2)(int fildes, int fildes2);
-int (errno);
-int (execl)(const char *path, const char *arg, ...);
-int (execle)(const char *path, const char *arg, ...);
-int (execlp)(const char *file, const char *arg, ...);
-int (execv)(const char *path, char *const argv[]);
-int (execve)(const char *path, char *const argv[], char *const *envp);
-int (execvp)(const char *file, char *const argv[]);
-void (exit)(int status);
-void (_exit)(int status);
-double (exp)(double x);
-double (fabs)(double x);
-int (fclose)(FILE *stream);
-int (fcntl)(int fildes, int cmd, ...);
-FILE *(fdopen)(int fildes, const char *type);
-int (feof)(FILE *stream);
-int (ferror)(FILE *stream);
-int (fflush)(FILE *stream);
-int (fgetc)(FILE *stream);
-int (fgetpos)(FILE *stream, fpos_t *pos);
-char *(fgets)(char *s, int n, FILE *stream);
-int (fileno)(FILE *stream);
-double (floor)(double x);
-double (fmod)(double x, double y);
-FILE *(fopen)(const char *filename, const char *mode);
-pid_t (fork)(void);
-long (fpathconf)(int fildes, int name);
-/* PRINTFLIKE2 */
-int (fprintf)(FILE *stream, const char *format, ...);
-int (fputc)(int c, FILE *stream);
-int (fputs)(const char *s, FILE *stream);
-size_t (fread)(void *ptr, size_t size, size_t nmemb, FILE *stream);
-void (free)(void *ptr);
-FILE *(freopen)(const char *filename, const char *mode, FILE *stream);
-double (frepx)(double value, int *exp);
-/* SCANFLIKE2 */
-int (fscanf)(FILE *stream, const char *format, ...);
-int (fseek)(FILE *stream, long int offset, int whence);
-int (fsetpos)(FILE *stream, const fpos_t *pos);
-int (fstat)(int fildes, struct stat *buf);
-long (ftell)(FILE *stream);
-size_t (fwrite)(const void *ptr, size_t size, size_t nmemb, FILE *stream);
-int (getc)(FILE *stream);
-int (getchar)(void);
-char *(getcwd)(char *buf, size_t size);
-gid_t (getegid)(void);
-char *(getenv)(const char *name);
-uid_t (geteuid)(void);
-gid_t (getgid)(void);
-struct group *(getgrgid)(gid_t gid);
-struct group *(getgrnam)(const char *name);
-int (getgroups)(int gidsetsize, gid_t grouplist[]);
-char *(getlogin)(void);
-pid_t (getpgrp)(void);
-pid_t (getpid)(void);
-pid_t (getppid)(void);
-struct passwd *(getpwnam)(const char *name);
-struct passwd *(getpwuid)(uid_t uid);
-char *(gets)(char *s);
-uid_t (getuid)(void);
-struct tm *(gmtime)(const time_t *timer);
-int (isalnum)(int c);
-int (isalpha)(int c);
-int (isatty)(int fildes);
-int (iscntrl)(int c);
-int (isdigit)(int c);
-int (isgraph)(int c);
-int (islower)(int c);
-int (isprint)(int c);
-int (ispunct)(int c);
-int (isspace)(int c);
-int (isupper)(int c);
-int (isxdigit)(int c);
-int (kill)(pid_t pid, int sig);
-long (labs)(long j);
-double (ldexp)(double x, int exp);
-ldiv_t (ldiv)(long numer, long denom);
-int (link)(const char *existing, const char *new);
-struct lconv *(localeconv)(void);
-struct tm *(localtime)(const time_t *timer);
-double (log)(double x);
-double (log10)(double x);
-void (longjmp)(jmp_buf env, int val);
-off_t (lseek)(int fildes, off_t offset, int whence);
-void *(malloc)(size_t size);
-int (mblen)(const char *s, size_t n);
-size_t (mbstowcs)(wchar_t *pwcs, const char *s, size_t n);
-int (mbtowc)(wchar_t *pwc, const char *s, size_t n);
-void *(memchr)(const void *s, int c, size_t n);
-int (memcmp)(const void *s1, const void *s2, size_t n);
-void *(memcpy)(void *s1, const void *s2, size_t n);
-void *(memmove)(void *s1, const void *s2, size_t n);
-void *(memset)(void *s, int c, size_t n);
-int (mkdir)(const char *path, mode_t mode);
-int (mkfifo)(const char *path, mode_t mode);
-time_t (mktime)(struct tm *timeptr);
-double (modf)(double value, double *iptr);
-int (open)(const char *path, int oflag, ...);
-DIR *(opendir)(const char *dirname);
-long (pathconf)(const char *path, int name);
-int (pause)(void);
-void (perror)(const char *s);
-int (pipe)(int fildes[2]);
-double (pow)(double x, double y);
-/* PRINTFLIKE1 */
-int (printf)(const char *format, ...);
-int (putc)(int c, FILE *stream);
-int (putchar)(int c);
-int (puts)(const char *s);
-void (qsort)(void *base, size_t nmemb, size_t size,
- int (*compar)(const void *, const void *));
-int (raise)(int sig);
-int (rand)(void);
-ssize_t (read)(int fildes, void *buf, size_t nbyte);
-struct dirent *(readdir)(DIR *dirp);
-void *(realloc)(void *ptr, size_t size);
-int (remove)(const char *filename);
-int (rename)(const char *old, const char *new);
-void (rewind)(FILE *stream);
-void (rewinddir)(DIR *dirp);
-int (rmdir)(const char *path);
-/* SCANFLIKE1 */
-int (scanf)(const char *format, ...);
-void (setbuf)(FILE *stream, char *buf);
-int (setgid)(gid_t gid);
-int (setjmp)(jmp_buf env);
-char *(setlocale)(int category, const char *locale);
-int (setpgid)(pid_t pid, pid_t pgid);
-pid_t (setsid)(void);
-int (setuid)(uid_t uid);
-int (setvbuf)(FILE *stream, char *buf, int mode, size_t size);
-int (sigaction)(int sig, const struct sigaction *act,
- struct sigaction *oact);
-int (sigaddset)(sigset_t *set, int signo);
-int (sigdelset)(sigset_t *set, int signo);
-int (sigemptyset)(sigset_t *set);
-int (sigfillset)(sigset_t *set);
-int (sigismember)(const sigset_t *set, int signo);
-void (siglongjmp)(sigjmp_buf env, int val);
-void (*(signal)(int sig, void (*func)(int)))(int);
-int (sigpending)(sigset_t *set);
-int (sigprocmask)(int how, const sigset_t *set, sigset_t *oset);
-int (sigsetjmp)(sigjmp_buf env, int savemask);
-int (sigsuspend)(const sigset_t *sigmask);
-double (sin)(double x);
-double (sinh)(double x);
-unsigned (sleep)(unsigned seconds);
-/* PRINTFLIKE2 */
-int (sprintf)(char *s, const char *format, ...);
-double (sqrt)(double x);
-void (srand)(unsigned seed);
-/* SCANFLIKE2 */
-int (sscanf)(const char *s, const char *format, ...);
-int (stat)(const char *path, struct stat *buf);
-char *(strcat)(char *s1, const char *s2);
-char *(strchr)(const char *s, int c);
-int (strcmp)(const char *s1, const char *s2);
-int (strcoll)(const char *s1, const char *s2);
-char *(strcpy)(char *s1, const char *s2);
-size_t (strcspn)(const char *s1, const char *s2);
-char *(strerror)(int errnum);
-size_t (strftime)(char *s, size_t maxsize, const char *format,
- const struct tm *timeptr);
-size_t (strlen)(const char *s);
-char *(strncat)(char *s1, const char *s2, size_t n);
-int (strncmp)(const char *s1, const char *s2, size_t n);
-char *(strncpy)(char *s1, const char *s2, size_t n);
-char *(strpbrk)(const char *s1, const char *s2);
-char *(strrchr)(const char *s, int c);
-size_t (strspn)(const char *s1, const char *s2);
-char *(strstr)(const char *s1, const char *s2);
-double (strtod)(const char *nptr, char **endptr);
-char *(strtok)(char *s1, const char *s2);
-long (strtol)(const char *nptr, char **endptr, int base);
-unsigned long (strtoul)(const char *nptr, char **endptr, int base);
-size_t (strxfrm)(char *s1, const char *s2, size_t n);
-long (sysconf)(int name);
-int (system)(const char *string);
-double (tan)(double x);
-double (tanh)(double x);
-int (tcdrain)(int fildes);
-int (tcflow)(int fildes, int action);
-int (tcflush)(int fildes, int queue_selector);
-int (tcgetattr)(int fildes, struct termios *tp);
-pid_t (tcgetpgrp)(int fildes);
-int (tcsendbreak)(int fildes, int duration);
-int (tcsetattr)(int fildes, int options, const struct termios *tp);
-int (tcsetpgrp)(int fildes, pid_t pgrpid);
-time_t (time)(time_t *timer);
-clock_t (times)(struct tms *buffer);
-FILE *(tmpfile)(void);
-char *(tmpnam)(char *s);
-int (tolower)(int c);
-int (toupper)(int c);
-char *(ttyname)(int filedes);
-void (tzset)(void);
-mode_t (umask)(mode_t cmask);
-int (uname)(struct utsname *name);
-int (ungetc)(int c, FILE *stream);
-int (unlink)(const char *path);
-int (utime)(const char *path, const struct utimbuf *times);
-int (vfprintf)(FILE *stream, const char *format, va_list arg);
-int (vprintf)(const char *format, va_list arg);
-int (vsprintf)(char *s, const char *format, va_list arg);
-pid_t (wait)(int *statloc);
-pid_t (waitpid)(pid_t pid, int *stat_loc, int options);
-size_t (wcstombs)(char *s, const wchar_t *pwcs, size_t n);
-int (wctomb)(char *s, wchar_t wchar);
-ssize_t (write)(int fildes, const void *buf, size_t nbyte);
diff --git a/usr.bin/xlint/llib/llib-lstdc b/usr.bin/xlint/llib/llib-lstdc
deleted file mode 100644
index 83b44f2..0000000
--- a/usr.bin/xlint/llib/llib-lstdc
+++ /dev/null
@@ -1,254 +0,0 @@
-/* $NetBSD: llib-lstdc,v 1.2 1995/07/03 21:25:11 cgd Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/* LINTLIBRARY */
-
-#define _ANSI_SOURCE
-
-#include <assert.h>
-#include <ctype.h>
-#include <errno.h>
-#include <locale.h>
-#include <math.h>
-#include <setjmp.h>
-#include <signal.h>
-#include <stdarg.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-/* PROTOLIB1 */
-
-/*
- * assert.h
- */
-#ifdef __NetBSD__
-void (__assert)(const char *expression, int line, const char *file);
-#else
-void (assert)(int expression);
-#endif
-
-/*
- * ctype.h
- */
-int (isalnum)(int c);
-int (isalpha)(int c);
-int (iscntrl)(int c);
-int (isdigit)(int c);
-int (isgraph)(int c);
-int (islower)(int c);
-int (isprint)(int c);
-int (ispunct)(int c);
-int (isspace)(int c);
-int (isupper)(int c);
-int (isxdigit)(int c);
-int (tolower)(int c);
-int (toupper)(int c);
-
-/*
- * errno.h
- */
-int (errno);
-
-/*
- * locale.h
- */
-char *(setlocale)(int category, const char *locale);
-struct lconv *(localeconv)(void);
-
-/*
- * math.h
- */
-double (acos)(double x);
-double (asin)(double x);
-double (atan)(double x);
-double (atan2)(double y, double x);
-double (cos)(double x);
-double (sin)(double x);
-double (tan)(double x);
-double (cosh)(double x);
-double (sinh)(double x);
-double (tanh)(double x);
-double (exp)(double x);
-double (frexp)(double value, int *exp);
-double (ldexp)(double x, int exp);
-double (log)(double x);
-double (log10)(double x);
-double (modf)(double value, double *iptr);
-double (pow)(double x, double y);
-double (sqrt)(double x);
-double (ceil)(double x);
-double (fabs)(double x);
-double (floor)(double x);
-double (fmod)(double x, double y);
-
-/*
- * setjmp.h
- */
-int (setjmp)(jmp_buf env);
-void (longjmp)(jmp_buf env, int val);
-
-/*
- * signal.h
- */
-void (*(signal)(int sig, void (*func)(int)))(int);
-int (raise)(int sig);
-
-/*
- * stdio.h
- */
-int (remove)(const char *filename);
-int (rename)(const char *old, const char *new);
-FILE *(tmpfile)(void);
-char *(tmpnam)(char *s);
-int (fclose)(FILE *stream);
-int (fflush)(FILE *stream);
-FILE *(fopen)(const char *filename, const char *mode);
-FILE *(freopen)(const char *filename, const char *mode, FILE *stream);
-void (setbuf)(FILE *stream, char *buf);
-int (setvbuf)(FILE *stream, char *buf, int mode, size_t size);
-/* PRINTFLIKE2 */
-int (fprintf)(FILE *stream, const char *format, ...);
-/* SCANFLIKE2 */
-int (fscanf)(FILE *stream, const char *format, ...);
-/* PRINTFLIKE1 */
-int (printf)(const char *format, ...);
-/* SCANFLIKE1 */
-int (scanf)(const char *format, ...);
-/* PRINTFLIKE2 */
-int (sprintf)(char *s, const char *format, ...);
-/* SCANFLIKE2 */
-int (sscanf)(const char *s, const char *format, ...);
-int (vfprintf)(FILE *stream, const char *format, va_list arg);
-int (vprintf)(const char *format, va_list arg);
-int (vsprintf)(char *s, const char *format, va_list arg);
-int (fgetc)(FILE *stream);
-char *(fgets)(char *s, int n, FILE *stream);
-int (fputc)(int c, FILE *stream);
-int (fputs)(const char *s, FILE *stream);
-int (getc)(FILE *stream);
-int (getchar)(void);
-char *(gets)(char *s);
-int (putc)(int c, FILE *stream);
-int (putchar)(int c);
-int (puts)(const char *s);
-int (ungetc)(int c, FILE *stream);
-size_t (fread)(void *ptr, size_t size, size_t nmemb, FILE *stream);
-size_t (fwrite)(const void *ptr, size_t size, size_t nmemb, FILE *stream);
-int (fgetpos)(FILE *stream, fpos_t *pos);
-int (fseek)(FILE *stream, long offset, int whence);
-int (fsetpos)(FILE *stream, const fpos_t *pos);
-long (ftell)(FILE *stream);
-void (rewind)(FILE *stream);
-void (clearerr)(FILE *stream);
-int (feof)(FILE *stream);
-int (ferror)(FILE *stream);
-void (perror)(const char *s);
-
-/*
- * stdlib.h
- */
-double (atof)(const char *nptr);
-int (atoi)(const char *nptr);
-long (atol)(const char *nptr);
-double (strtod)(const char *nptr, char **endptr);
-long (strtol)(const char *nptr, char **endptr, int base);
-unsigned long (strtoul)(const char *nptr, char **endptr, int base);
-int (rand)(void);
-void (srand)(unsigned seed);
-void *(calloc)(size_t nmemb, size_t size);
-void (free)(void *ptr);
-void *(malloc)(size_t size);
-void *(realloc)(void *ptr, size_t size);
-void (abort)(void);
-int (atexit)(void (*func)(void));
-void (exit)(int status);
-char *(getenv)(const char *name);
-int (system)(const char *string);
-void *(bsearch)(const void *key, const void *base, size_t nmemb,
- size_t size, int (*compar)(const void *, const void *));
-void (qsort)(void *base, size_t nmemb, size_t size,
- int (*compar)(const void *, const void *));
-int (abs)(int j);
-div_t (div)(int numer, int denom);
-long (labs)(long j);
-ldiv_t (ldiv)(long numer, long denom);
-int (mblen)(const char *s, size_t n);
-int (mbtowc)(wchar_t *PWC, const char *s, size_t n);
-int (wctomb)(char *s, wchar_t wchar);
-size_t (mbstowcs)(wchar_t *pwcs, const char *s, size_t n);
-size_t (wcstombs)(char *s, const wchar_t *pwcs, size_t n);
-
-/*
- * string.h
- */
-void *(memcpy)(void *s1, const void *s2, size_t n);
-void *(memmove)(void *s1, const void *s2, size_t n);
-char *(strcpy)(char *s1, const char *s2);
-char *(strncpy)(char *s1, const char *s2, size_t n);
-char *(strcat)(char *s1, const char *s2);
-char *(strncat)(char *s1, const char *s2, size_t n);
-int (memcmp)(const void *s1, const void *s2, size_t n);
-int (strcmp)(const char *s1, const char *s2);
-int (strcoll)(const char *s1, const char *s2);
-int (strncmp)(const char *s1, const char *s2, size_t n);
-size_t (strxfrm)(char *s1, const char *s2, size_t n);
-void *(memchr)(const void *s, int c, size_t n);
-char *(strchr)(const char *s, int c);
-size_t (strcspn)(const char *s1, const char *s2);
-char *(strpbrk)(const char *s1, const char *s2);
-char *(strrchr)(const char *s1, int c);
-size_t (strspn)(const char *s1, const char *s2);
-char *(strstr)(const char *s1, const char *s2);
-char *(strtok)(char *s1, const char *s2);
-void *(memset)(void *s, int c, size_t n);
-char *(strerror)(int errnom);
-size_t (strlen)(const char *s);
-
-/*
- * time.h
- */
-clock_t (clock)(void);
-double (difftime)(time_t time1, time_t time2);
-time_t (mktime)(struct tm *timeptr);
-time_t (time)(time_t *timer);
-char *(asctime)(const struct tm *timeptr);
-char *(ctime)(const time_t *timer);
-struct tm *(gmtime)(const time_t *timer);
-struct tm *(localtime)(const time_t *timer);
-size_t (strftime)(char *s, size_t maxsize, const char *format,
- const struct tm *timeptr);
diff --git a/usr.bin/xlint/xlint/Makefile b/usr.bin/xlint/xlint/Makefile
deleted file mode 100644
index 5dfdfb3..0000000
--- a/usr.bin/xlint/xlint/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-# $NetBSD: Makefile,v 1.2 1995/07/03 21:25:14 cgd Exp $
-# $FreeBSD$
-
-.PATH: ${.CURDIR}/../lint1
-
-PROG= xlint
-PROGNAME= lint
-SRCS= xlint.c mem.c
-MAN= lint.1
-
-CFLAGS+=-I${.CURDIR}/../lint1
-CFLAGS+= -DPREFIX=\"${TOOLS_PREFIX}\"
-
-.include "${.CURDIR}/../../Makefile.inc"
-.include <bsd.prog.mk>
diff --git a/usr.bin/xlint/xlint/lint.1 b/usr.bin/xlint/xlint/lint.1
deleted file mode 100644
index 13ffce1..0000000
--- a/usr.bin/xlint/xlint/lint.1
+++ /dev/null
@@ -1,617 +0,0 @@
-.\" $NetBSD: lint.1,v 1.21 2002/01/03 04:25:18 thorpej Exp $
-.\"
-.\" Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
-.\" Copyright (c) 1994, 1995 Jochen Pohl
-.\" All Rights Reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by Jochen Pohl for
-.\" The NetBSD Project.
-.\" 4. The name of the author may not be used to endorse or promote products
-.\" derived from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd May 24, 2001
-.Dt LINT 1
-.Os
-.Sh NAME
-.Nm lint
-.Nd a C program verifier
-.Sh SYNOPSIS
-.Bk -words
-.Nm
-.Op Fl abceghprvwxzHFV
-.Op Fl s | t
-.Op Fl i | nu
-.Op Fl D Ar name Ns Op = Ns Ar def
-.Op Fl U Ar name
-.Op Fl I Ar directory
-.Op Fl d Ar directory
-.Op Fl L Ar directory
-.Op Fl l Ar library
-.Op Fl o Ar outputfile
-.Op Fl B Ar directory
-.Op Fl X Ar id Ns Op , Ns Ar id ...
-.Ar
-.Nm
-.Op Fl abceghprvwzHFV
-.Op Fl s | t
-.Fl C Ar library
-.Op Fl D Ar name Ns Op = Ns Ar def
-.Op Fl U Ar name
-.Op Fl I Ar directory
-.Op Fl d Ar directory
-.Op Fl B Ar directory
-.Op Fl X Ar id Ns Op , Ns Ar id ...
-.Ar
-.Ek
-.Sh DESCRIPTION
-The
-.Nm
-utility attempts to detect features of the named C program files
-that are likely to be bugs, to be non-portable, or to be
-wasteful.
-It also performs stricter type checking than does
-the C compiler.
-The
-.Nm
-utility runs the C preprocessor as its first phase, with the
-preprocessor symbol
-.Dq Dv lint
-defined to allow certain questionable code to be altered
-or skipped by
-.Nm .
-Therefore, this symbol should be thought of as a reserved
-word for all code that is to be checked by
-.Nm .
-.Pp
-Among the possible problems that are currently noted are
-unreachable statements, loops not entered at the top,
-variables declared and not used, and logical expressions
-with constant values.
-Function calls are checked for
-inconsistencies, such as calls to functions that return
-values in some places and not in others, functions called
-with varying numbers of arguments, function calls that
-pass arguments of a type other than the type the function
-expects to receive, functions whose values are not used,
-and calls to functions not returning values that use
-the non-existent return value of the function.
-.Pp
-Filename arguments ending with
-.Pa .c
-are taken to be C source files.
-Filename arguments with
-names ending with
-.Pa .ln
-are taken to be the result of an earlier invocation of
-.Nm ,
-with either the
-.Fl i , o ,
-or
-.Fl C
-option in effect.
-The
-.Pa .ln
-files are analogous to the
-.Pa .o
-(object) files produced by
-.Xr cc 1
-from
-.Pa .c
-files.
-The
-.Nm
-utility also accepts special libraries specified with the
-.Fl l
-option, which contain definitions of library routines and
-variables.
-.Pp
-The
-.Nm
-utility takes all the
-.Pa .c , .ln ,
-and
-.Pa llib-l Ns Ar library Ns Pa .ln
-(lint library) files and processes them in command-line order.
-By default,
-.Nm
-appends the standard C lint library
-.Pq Pa llib-lc.ln
-to the end of the list of files.
-When the
-.Fl i
-option is used, the
-.Pa .ln
-files are ignored.
-Also, when the
-.Fl o
-or
-.Fl i
-options are used, the
-.Pa llib-l Ns Ar library Ns Pa .ln
-files are ignored.
-When the
-.Fl i
-option is
-.Em omitted
-the second pass of
-.Nm
-checks this list of files for mutual compatibility.
-At this point,
-if a complaint stems not from a given source file, but from one of
-its included files, the source filename will be printed followed by
-a question mark.
-.Pp
-The special input file name
-.Dq Pa -
-causes
-.Nm
-to take input from standard input (until end of file) and process
-it as if it were a
-.Pa .c
-file.
-If the
-.Fl i
-flag is given and
-.Dq Pa -
-is named as one of the input files, the
-.Fl o
-flag must also be specified to provide an output file name.
-The options are as follows:
-.Bl -tag -width indent
-.It Fl a
-Report assignments of
-.Vt long
-values to variables that are not
-.Vt long .
-.It Fl aa
-Additional to
-.Fl a ,
-report
-.Em all
-assignments of integer values to other integer values which
-cause implicit narrowing conversion.
-.It Fl b
-Report
-.Ic break
-statements that cannot be reached.
-This is not the default
-because, unfortunately, most
-.Xr lex 1
-and many
-.Xr yacc 1
-outputs produce many such complaints.
-.It Fl c
-Complain about casts which have questionable portability.
-.It Fl e
-Complain about unusual operations on
-.Vt enum Ns -Types
-and combinations of
-.Vt enum Ns -
-and
-.Sy integer Ns -Types .
-.It Fl g
-Do not print warnings for some extensions of
-.Xr gcc 1
-to the C language.
-Currently these are nonconstant initializers in
-automatic aggregate initializations, arithmetic on pointer to void,
-trailing commas in
-.Vt enum
-declarations, C++ -style
-.Dq Li //
-comments,
-zero sized structures, subscripting of non-lvalue arrays, prototypes
-overriding old style function declarations and long long
-integer types.
-The
-.Fl g
-flag also turns on the keywords
-.Ic asm
-and
-.Ic inline
-(alternative keywords with leading underscores for both
-.Ic asm
-and
-.Ic inline
-are always available).
-.It Fl h
-Apply a number of heuristic tests to attempt to intuit
-bugs, improve style, and reduce waste.
-.It Fl i
-Produce a
-.Pa .ln
-file for every
-.Pa .c
-file on the command line.
-These
-.Pa .ln
-files are the product of
-.Nm Ns 's
-first pass only, and are not checked for compatibility
-between functions.
-.It Fl n
-Do not check compatibility against the standard library.
-.It Fl p
-Attempt to check portability of code to other dialects of C.
-.It Fl r
-In case of redeclarations report the position of the
-previous declaration.
-.It Fl s
-Strict ANSI C mode.
-Issue warnings and errors required by ANSI C.
-Also do not produce warnings for constructs which behave
-differently in traditional C and ANSI C.
-With the
-.Fl s
-flag,
-.Dv __STRICT_ANSI__
-is a predefined preprocessor macro.
-.It Fl t
-Traditional C mode.
-.Dv __STDC__
-is not predefined in this mode.
-Warnings are printed for constructs
-not allowed in traditional C.
-Warnings for constructs which behave
-differently in traditional C and ANSI C are suppressed.
-Preprocessor
-macros describing the machine type (e.g.,
-.Dv sun3 )
-and machine architecture (e.g.,
-.Dv m68k )
-are defined without leading and trailing underscores.
-The keywords
-.Ic const , volatile
-and
-.Ic signed
-are not available in traditional C mode (although the alternative
-keywords with leading underscores still are).
-.It Fl u
-Do not complain about functions and external variables used
-and not defined, or defined and not used (this is suitable
-for running
-.Nm
-on a subset of files comprising part of a larger program).
-.It Fl v
-Suppress complaints about unused arguments in functions.
-.It Fl x
-Report variables referred to by
-.Ic extern
-declarations, but never used.
-.It Fl z
-Do not complain about structures that are never defined
-(for example, using a structure pointer without knowing
-its contents).
-.It Fl B Ar path
-Path to use when looking for the
-.Pa lint1
-and
-.Pa lint2
-binaries.
-Defaults to
-.Pa /usr/libexec .
-.It Fl C Ar library
-Create a
-.Nm
-library with the name
-.Pa llib-l Ns Ar library Ns Pa .ln .
-This library is built from all
-.Pa .c
-and
-.Pa .ln
-input files.
-After all global definitions of functions and
-variables in these files are written to the newly created library,
-.Nm
-checks all input files, including libraries specified with the
-.Fl l
-option, for mutual compatibility.
-.It Fl D Ar name Ns Op = Ns Ar def
-Define
-.Ar name
-for
-.Xr cpp 1 ,
-as if by a
-.Ic #define
-directive.
-If no definition is given,
-.Ar name
-is defined as 1.
-.It Fl I Ar directory
-Add
-.Ar directory
-to the list of directories in which to search for include files.
-.It Fl d Ar directory
-Use
-.Ar directory
-instead of
-.Pa /usr/include
-as the default place to find include files.
-.It Fl l Ar library
-Include the lint library
-.Pa llib-l Ns Ar library Ns Pa .ln .
-.It Fl L Ar directory
-Search for lint libraries in
-.Ar directory
-and
-.Ar directory Ns Pa /lint
-before searching the standard place.
-.It Fl F
-Print pathnames of files.
-The
-.Nm
-utility normally prints the filename without the path.
-.It Fl H
-If a complaint stems from an included file
-.Nm
-prints the name of the included file instead of the source file name
-followed by a question mark.
-.It Fl o Ar outputfile
-Name the output file
-.Ar outputfile .
-The output file produced is the input that is given to
-.Nm Ns 's
-second pass.
-The
-.Fl o
-option simply saves this file in the named output file.
-If the
-.Fl i
-option is also used the files are not checked for compatibility.
-To produce a
-.Pa llib-l Ns Ar library Ns Pa .ln
-without extraneous messages, use of the
-.Fl u
-option is suggested.
-The
-.Fl v
-option is useful if the source file(s) for the lint library
-are just external interfaces.
-.It Fl U Ar name
-Remove any initial definition of
-.Ar name
-for the preprocessor.
-.It Fl V
-Print the command lines constructed by the controller program to
-run the C preprocessor and
-.Nm Ns 's
-first and second pass.
-.It Fl w
-Treat warnings as errors.
-.It Fl X Ar id Ns Op , Ns Ar id ...
-Suppress error messages identified by the list of ids.
-A list of messages
-and ids can be found in
-.Xr lint 7 .
-.El
-.Ss Input Grammar
-.Nm Ns 's
-first pass reads standard C source files.
-The
-.Nm
-utility recognizes the following C comments as commands.
-.Bl -tag -width indent
-.It Li /* ARGSUSED Ns Ar n Li */
-makes
-.Nm
-check only the first
-.Ar n
-arguments for usage; a missing
-.Ar n
-is taken to be 0 (this option acts like the
-.Fl v
-option for the next function).
-.It Li /* BITFIELDTYPE */
-Suppress error messages about illegal bitfield types if the type
-is an integer type, and suppress non-portable bitfield type warnings.
-.It Xo
-.Li /* CONSTCOND */
-or
-.Li /* CONSTANTCOND */
-or
-.Li /* CONSTANTCONDITION */
-.Xc
-suppress complaints about constant operands for the next expression.
-.It Xo
-.Li /* FALLTHRU */
-or
-.Li /* FALLTHROUGH */
-.Xc
-suppress complaints about fall through to a
-.Ic case
-or
-.Ic default
-labelled statement.
-This directive should be placed immediately
-preceding the label.
-.It Li /* LINTLIBRARY */
-At the beginning of a file, mark all functions and variables defined
-in this file as
-.Em used .
-Also shut off complaints about unused function arguments.
-.It Xo
-.Li /* LINTED Oo Ar comment Oc Li */
-or
-.Li /* NOSTRICT Oo Ar comment Oc Li */
-.Xc
-Suppresses any intra-file warning except those dealing with
-unused variables or functions.
-This directive should be placed
-on the line immediately preceding where the
-.Nm
-warning occurred.
-.It Li /* LONGLONG */
-Suppress complaints about use of long long integer types.
-.It Li /* NOTREACHED */
-At appropriate points, inhibit complaints about unreachable code.
-(This comment is typically placed just after calls to functions
-like
-.Xr exit 3 ) .
-.It Li /* PRINTFLIKE Ns Ar n Li */
-makes
-.Nm
-check the first
-.Pq Ar n Ns -1
-arguments as usual.
-The
-.Ar n Ns -th
-argument is interpreted as a
-.Xr printf 3
-format string that is used to check the remaining arguments.
-.It Li /* PROTOLIB Ns Ar n Li */
-causes
-.Nm
-to treat function declaration prototypes as function definitions
-if
-.Ar n
-is non-zero.
-This directive can only be used in conjunction with
-the
-.Li /* LINTLIBRARY */
-directive.
-If
-.Ar n
-is zero, function prototypes will be treated normally.
-.It Li /* SCANFLIKE Ns Ar n Li */
-makes
-.Nm
-check the first
-.Pq Ar n Ns -1
-arguments as usual.
-The
-.Ar n Ns -th
-argument is interpreted as a
-.Xr scanf 3
-format string that is used to check the remaining arguments.
-.It Li /* VARARGS Ns Ar n Li */
-Suppress the usual checking for variable numbers of arguments in
-the following function declaration.
-The data types of the first
-.Ar n
-arguments are checked; a missing
-.Ar n
-is taken to be 0.
-.El
-.Pp
-The behavior of the
-.Fl i
-and the
-.Fl o
-options allows for incremental use of
-.Nm
-on a set of C source files.
-Generally, one invokes
-.Nm
-once for each source file with the
-.Fl i
-option.
-Each of these invocations produces a
-.Pa .ln
-file that corresponds to the
-.Pa .c
-file, and prints all messages that are about just that
-source file.
-After all the source files have been separately
-run through
-.Nm ,
-it is invoked once more (without the
-.Fl i
-option), listing all the
-.Pa .ln
-files with the needed
-.Fl l Ar library
-options.
-This will print all the inter-file inconsistencies.
-This
-scheme works well with
-.Xr make 1 ;
-it allows
-.Xr make 1
-to be used to
-.Nm
-only the source files that have been modified since the last
-time the set of source files were
-.Nm Ns ed .
-.Sh ENVIRONMENT
-.Bl -tag -width LIBDIR
-.It Ev LIBDIR
-the directory where the lint libraries specified by the
-.Bk -words
-.Fl l Ar library
-.Ek
-option must exist.
-If this environment variable is undefined,
-then the default path
-.Pa /usr/libdata/lint
-will be used to search for the libraries.
-.It Ev TMPDIR
-usually the path for temporary files can be redefined by setting
-this environment variable.
-.It Ev CC
-Location of the C compiler program.
-Defaults to
-.Pa /usr/bin/cc .
-.El
-.Sh FILES
-.Bl -tag -width /usr/libdata/lint/llib-lc.ln -compact
-.It Pa /usr/libexec/lint Ns Bq Pa 12
-programs
-.It Pa /usr/libdata/lint/llib-l*.ln
-various prebuilt lint libraries
-.It Pa /tmp/lint*
-temporaries
-.El
-.Sh SEE ALSO
-.Xr cc 1 ,
-.Xr cpp 1 ,
-.Xr make 1
-.Sh AUTHORS
-.An Jochen Pohl
-.Sh BUGS
-.Bl -item
-.It
-The routines
-.Xr exit 3 ,
-.Xr longjmp 3
-and other functions that do not return are not understood; this
-causes various incorrect diagnostics.
-.It
-Static functions which are used only before their first
-extern declaration are reported as unused.
-.It
-Libraries created by the
-.Fl o
-option will, when used in later
-.Nm
-runs, cause certain errors that were reported when the libraries
-were created to be reported again, and cause line numbers and file
-names from the original source used to create those libraries
-to be reported in error messages.
-For these reasons, it is recommended
-to use the
-.Fl C
-option to create lint libraries.
-.El
diff --git a/usr.bin/xlint/xlint/pathnames.h b/usr.bin/xlint/xlint/pathnames.h
deleted file mode 100644
index 3f7d210..0000000
--- a/usr.bin/xlint/xlint/pathnames.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $NetBSD: pathnames.h,v 1.3 1999/04/22 04:40:58 mrg Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/* directory where lint1 and lint2 reside */
-#ifndef PATH_LIBEXEC
-#define PATH_LIBEXEC PREFIX"/usr/libexec"
-#endif
-
-/* directory where cc(1) resides */
-#define PATH_USRBIN PREFIX"/usr/bin"
-
-/* default library search path */
-#define PATH_LINTLIB PREFIX"/usr/libdata/lint"
diff --git a/usr.bin/xlint/xlint/xlint.c b/usr.bin/xlint/xlint/xlint.c
deleted file mode 100644
index 82a118e..0000000
--- a/usr.bin/xlint/xlint/xlint.c
+++ /dev/null
@@ -1,872 +0,0 @@
-/* $NetBSD: xlint.c,v 1.27 2002/01/31 19:09:33 tv Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: xlint.c,v 1.27 2002/01/31 19:09:33 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/wait.h>
-#include <sys/stat.h>
-#include <sys/utsname.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <paths.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "lint.h"
-#include "pathnames.h"
-
-#define DEFAULT_PATH _PATH_DEFPATH
-
-int main(int, char *[]);
-
-/* directory for temporary files */
-static const char *tmpdir;
-
-/* path name for cpp output */
-static char *cppout;
-
-/* file descriptor for cpp output */
-static int cppoutfd = -1;
-
-/* files created by 1st pass */
-static char **p1out;
-
-/* input files for 2nd pass (without libraries) */
-static char **p2in;
-
-/* library which will be created by 2nd pass */
-static char *p2out;
-
-/* flags always passed to cc(1) */
-static char **cflags;
-
-/* flags for cc(1), controled by sflag/tflag */
-static char **lcflags;
-
-/* flags for lint1 */
-static char **l1flags;
-
-/* flags for lint2 */
-static char **l2flags;
-
-/* libraries for lint2 */
-static char **l2libs;
-
-/* default libraries */
-static char **deflibs;
-
-/* additional libraries */
-static char **libs;
-
-/* search path for libraries */
-static char **libsrchpath;
-
-static char *libexec_path;
-
-/* flags */
-static int iflag, oflag, Cflag, sflag, tflag, Fflag, dflag, Bflag;
-
-/* print the commands executed to run the stages of compilation */
-static int Vflag;
-
-/* filename for oflag */
-static char *outputfn;
-
-/* reset after first .c source has been processed */
-static int first = 1;
-
-/*
- * name of a file which is currently written by a child and should
- * be removed after abnormal termination of the child
- */
-static const char *currfn;
-
-#if !defined(TARGET_PREFIX)
-#define TARGET_PREFIX ""
-#endif
-static const char target_prefix[] = TARGET_PREFIX;
-
-static void appstrg(char ***, char *);
-static void appcstrg(char ***, const char *);
-static void applst(char ***, char *const *);
-static void freelst(char ***);
-static char *concat2(const char *, const char *);
-static char *concat3(const char *, const char *, const char *);
-static void terminate(int) __attribute__((__noreturn__));
-static const char *lbasename(const char *, int);
-static void appdef(char ***, const char *);
-static void usage(void);
-static void fname(const char *);
-static void runchild(const char *, char *const *, const char *, int);
-static void findlibs(char *const *);
-static int rdok(const char *);
-static void lint2(void);
-static void cat(char *const *, const char *);
-
-/*
- * Some functions to deal with lists of strings.
- * Take care that we get no surprises in case of asyncron signals.
- */
-static void
-appstrg(char ***lstp, char *s)
-{
- char **lst, **olst;
- int i;
-
- olst = *lstp;
- for (i = 0; olst[i] != NULL; i++)
- continue;
- lst = xrealloc(olst, (i + 2) * sizeof (char *));
- lst[i] = s;
- lst[i + 1] = NULL;
- *lstp = lst;
-}
-
-static void
-appcstrg(char ***lstp, const char *s)
-{
-
- appstrg(lstp, xstrdup(s));
-}
-
-static void
-applst(char ***destp, char *const *src)
-{
- int i, k;
- char **dest, **odest;
-
- odest = *destp;
- for (i = 0; odest[i] != NULL; i++)
- continue;
- for (k = 0; src[k] != NULL; k++)
- continue;
- dest = xrealloc(odest, (i + k + 1) * sizeof (char *));
- for (k = 0; src[k] != NULL; k++)
- dest[i + k] = xstrdup(src[k]);
- dest[i + k] = NULL;
- *destp = dest;
-}
-
-static void
-freelst(char ***lstp)
-{
- char *s;
- int i;
-
- for (i = 0; (*lstp)[i] != NULL; i++)
- continue;
- while (i-- > 0) {
- s = (*lstp)[i];
- (*lstp)[i] = NULL;
- free(s);
- }
-}
-
-static char *
-concat2(const char *s1, const char *s2)
-{
- char *s;
-
- s = xmalloc(strlen(s1) + strlen(s2) + 1);
- (void)strcpy(s, s1);
- (void)strcat(s, s2);
-
- return (s);
-}
-
-static char *
-concat3(const char *s1, const char *s2, const char *s3)
-{
- char *s;
-
- s = xmalloc(strlen(s1) + strlen(s2) + strlen(s3) + 1);
- (void)strcpy(s, s1);
- (void)strcat(s, s2);
- (void)strcat(s, s3);
-
- return (s);
-}
-
-/*
- * Clean up after a signal.
- */
-static void
-terminate(int signo)
-{
- int i;
-
- if (cppoutfd != -1)
- (void)close(cppoutfd);
- if (cppout != NULL)
- (void)remove(cppout);
-
- if (p1out != NULL) {
- for (i = 0; p1out[i] != NULL; i++)
- (void)remove(p1out[i]);
- }
-
- if (p2out != NULL)
- (void)remove(p2out);
-
- if (currfn != NULL)
- (void)remove(currfn);
-
- exit(signo != 0 ? 1 : 0);
-}
-
-/*
- * Returns a pointer to the last component of strg after delim.
- * Returns strg if the string does not contain delim.
- */
-static const char *
-lbasename(const char *strg, int delim)
-{
- const char *cp, *cp1, *cp2;
-
- cp = cp1 = cp2 = strg;
- while (*cp != '\0') {
- if (*cp++ == delim) {
- cp2 = cp1;
- cp1 = cp;
- }
- }
- return (*cp1 == '\0' ? cp2 : cp1);
-}
-
-static void
-appdef(char ***lstp, const char *def)
-{
-
- appstrg(lstp, concat2("-D__", def));
- appstrg(lstp, concat3("-D__", def, "__"));
-}
-
-static void
-usage(void)
-{
-
- (void)fprintf(stderr,
- "usage: lint [-abceghprvwxzHF] [-s|-t] [-i|-nu] [-Dname[=def]]"
- " [-Uname] [-X <id>[,<id>]...\n");
- (void)fprintf(stderr,
- "\t[-Idirectory] [-Ldirectory] [-llibrary] [-ooutputfile]"
- " file...\n");
- (void)fprintf(stderr,
- " lint [-abceghprvwzHF] [-s|-t] -Clibrary [-Dname[=def]]\n"
- " [-X <id>[,<id>]...\n");
- (void)fprintf(stderr, "\t[-Idirectory] [-Uname] [-Bpath] file"
- " ...\n");
- terminate(-1);
-}
-
-
-int
-main(int argc, char *argv[])
-{
- int c;
- char flgbuf[3], *tmp, *s;
- size_t len;
-
- if ((tmp = getenv("TMPDIR")) == NULL || (len = strlen(tmp)) == 0) {
- tmpdir = xstrdup(_PATH_TMP);
- } else {
- s = xmalloc(len + 2);
- (void)sprintf(s, "%s%s", tmp, tmp[len - 1] == '/' ? "" : "/");
- tmpdir = s;
- }
-
- cppout = xmalloc(strlen(tmpdir) + sizeof ("lint0.XXXXXX"));
- (void)sprintf(cppout, "%slint0.XXXXXX", tmpdir);
- cppoutfd = mkstemp(cppout);
- if (cppoutfd == -1) {
- warn("can't make temp");
- terminate(-1);
- }
-
- p1out = xcalloc(1, sizeof (char *));
- p2in = xcalloc(1, sizeof (char *));
- cflags = xcalloc(1, sizeof (char *));
- lcflags = xcalloc(1, sizeof (char *));
- l1flags = xcalloc(1, sizeof (char *));
- l2flags = xcalloc(1, sizeof (char *));
- l2libs = xcalloc(1, sizeof (char *));
- deflibs = xcalloc(1, sizeof (char *));
- libs = xcalloc(1, sizeof (char *));
- libsrchpath = xcalloc(1, sizeof (char *));
-
- appcstrg(&cflags, "-E");
- appcstrg(&cflags, "-x");
- appcstrg(&cflags, "c");
-#if 0
- appcstrg(&cflags, "-D__attribute__(x)=");
- appcstrg(&cflags, "-D__extension__(x)=/*NOSTRICT*/0");
-#else
- appcstrg(&cflags, "-U__GNUC__");
- appcstrg(&cflags, "-undef");
-#endif
- appcstrg(&cflags, "-Wp,-C");
- appcstrg(&cflags, "-Wcomment");
- appcstrg(&cflags, "-D__LINT__");
- appcstrg(&cflags, "-Dlint"); /* XXX don't def. with -s */
-
- appdef(&cflags, "lint");
-
- appcstrg(&deflibs, "c");
-
- if (signal(SIGHUP, terminate) == SIG_IGN)
- (void)signal(SIGHUP, SIG_IGN);
- (void)signal(SIGINT, terminate);
- (void)signal(SIGQUIT, terminate);
- (void)signal(SIGTERM, terminate);
-
- while ((c = getopt(argc, argv, "abcd:eghil:no:prstuvwxzB:C:D:FHI:L:U:VX:")) != -1) {
- switch (c) {
-
- case 'a':
- case 'b':
- case 'c':
- case 'e':
- case 'g':
- case 'r':
- case 'v':
- case 'w':
- case 'z':
- (void)sprintf(flgbuf, "-%c", c);
- appcstrg(&l1flags, flgbuf);
- break;
-
- case 'F':
- Fflag = 1;
- /* FALLTHROUGH */
- case 'u':
- case 'h':
- (void)sprintf(flgbuf, "-%c", c);
- appcstrg(&l1flags, flgbuf);
- appcstrg(&l2flags, flgbuf);
- break;
-
- case 'X':
- (void)sprintf(flgbuf, "-%c", c);
- appcstrg(&l1flags, flgbuf);
- appcstrg(&l1flags, optarg);
- break;
-
- case 'i':
- if (Cflag)
- usage();
- iflag = 1;
- break;
-
- case 'n':
- freelst(&deflibs);
- break;
-
- case 'p':
- appcstrg(&lcflags, "-Wtraditional");
- appcstrg(&lcflags, "-Wno-system-headers");
- appcstrg(&l1flags, "-p");
- appcstrg(&l2flags, "-p");
- if (*deflibs != NULL) {
- freelst(&deflibs);
- appcstrg(&deflibs, "c");
- }
- break;
-
- case 's':
- if (tflag)
- usage();
- freelst(&lcflags);
- appcstrg(&lcflags, "-trigraphs");
- appcstrg(&lcflags, "-Wtrigraphs");
- appcstrg(&lcflags, "-pedantic");
- appcstrg(&lcflags, "-D__STRICT_ANSI__");
- appcstrg(&l1flags, "-s");
- appcstrg(&l2flags, "-s");
- sflag = 1;
- break;
-
-#if !HAVE_CONFIG_H
- case 't':
- if (sflag)
- usage();
- freelst(&lcflags);
- appcstrg(&lcflags, "-traditional");
- appstrg(&lcflags, concat2("-D", MACHINE));
- appstrg(&lcflags, concat2("-D", MACHINE_ARCH));
- appcstrg(&l1flags, "-t");
- appcstrg(&l2flags, "-t");
- tflag = 1;
- break;
-#endif
-
- case 'x':
- appcstrg(&l2flags, "-x");
- break;
-
- case 'C':
- if (Cflag || oflag || iflag)
- usage();
- Cflag = 1;
- appstrg(&l2flags, concat2("-C", optarg));
- p2out = xmalloc(sizeof ("llib-l.ln") + strlen(optarg));
- (void)sprintf(p2out, "llib-l%s.ln", optarg);
- freelst(&deflibs);
- break;
-
- case 'd':
- if (dflag)
- usage();
- dflag = 1;
- appcstrg(&cflags, "-nostdinc");
- appcstrg(&cflags, "-idirafter");
- appcstrg(&cflags, optarg);
- break;
-
- case 'D':
- case 'I':
- case 'U':
- (void)sprintf(flgbuf, "-%c", c);
- appstrg(&cflags, concat2(flgbuf, optarg));
- break;
-
- case 'l':
- appcstrg(&libs, optarg);
- break;
-
- case 'o':
- if (Cflag || oflag)
- usage();
- oflag = 1;
- outputfn = xstrdup(optarg);
- break;
-
- case 'L':
- appcstrg(&libsrchpath, optarg);
- break;
-
- case 'H':
- appcstrg(&l2flags, "-H");
- break;
-
- case 'B':
- Bflag = 1;
- libexec_path = xstrdup(optarg);
- break;
-
- case 'V':
- Vflag = 1;
- break;
-
- default:
- usage();
- /* NOTREACHED */
- }
- }
- argc -= optind;
- argv += optind;
-
- /*
- * To avoid modifying getopt(3)'s state engine midstream, we
- * explicitly accept just a few options after the first source file.
- *
- * In particular, only -l<lib> and -L<libdir> (and these with a space
- * after -l or -L) are allowed.
- */
- while (argc > 0) {
- const char *arg = argv[0];
-
- if (arg[0] == '-') {
- char ***list;
-
- /* option */
- switch (arg[1]) {
- case 'l':
- list = &libs;
- break;
-
- case 'L':
- list = &libsrchpath;
- break;
-
- default:
- usage();
- /* NOTREACHED */
- }
- if (arg[2])
- appcstrg(list, arg + 2);
- else if (argc > 1) {
- argc--;
- appcstrg(list, *++argv);
- } else
- usage();
- } else {
- /* filename */
- fname(arg);
- first = 0;
- }
- argc--;
- argv++;
- }
-
- if (first)
- usage();
-
- if (iflag)
- terminate(0);
-
- if (!oflag) {
- if ((s = getenv("LIBDIR")) == NULL || strlen(s) == 0)
- s = PATH_LINTLIB;
- appcstrg(&libsrchpath, s);
- findlibs(libs);
- findlibs(deflibs);
- }
-
- (void)printf("Lint pass2:\n");
- lint2();
-
- if (oflag)
- cat(p2in, outputfn);
-
- if (Cflag)
- p2out = NULL;
-
- terminate(0);
- /* NOTREACHED */
-}
-
-/*
- * Read a file name from the command line
- * and pass it through lint1 if it is a C source.
- */
-static void
-fname(const char *name)
-{
- const char *bn, *suff;
- char **args, *ofn, *p, *pathname;
- size_t len;
- int is_stdin;
- int fd;
-
- is_stdin = (strcmp(name, "-") == 0);
- bn = lbasename(name, '/');
- suff = lbasename(bn, '.');
-
- if (strcmp(suff, "ln") == 0) {
- /* only for lint2 */
- if (!iflag)
- appcstrg(&p2in, name);
- return;
- }
-
- if (!is_stdin && strcmp(suff, "c") != 0 &&
- (strncmp(bn, "llib-l", 6) != 0 || bn != suff)) {
- warnx("unknown file type: %s\n", name);
- return;
- }
-
- if (!iflag || !first)
- (void)printf("%s:\n",
- is_stdin ? "{standard input}" : Fflag ? name : bn);
-
- /* build the name of the output file of lint1 */
- if (oflag) {
- ofn = outputfn;
- outputfn = NULL;
- oflag = 0;
- } else if (iflag) {
- if (is_stdin) {
- warnx("-i not supported without -o for standard input");
- return;
- }
- ofn = xmalloc(strlen(bn) + (bn == suff ? 4 : 2));
- len = bn == suff ? strlen(bn) : (suff - 1) - bn;
- (void)sprintf(ofn, "%.*s", (int)len, bn);
- (void)strcat(ofn, ".ln");
- } else {
- ofn = xmalloc(strlen(tmpdir) + sizeof ("lint1.XXXXXX"));
- (void)sprintf(ofn, "%slint1.XXXXXX", tmpdir);
- fd = mkstemp(ofn);
- if (fd == -1) {
- warn("can't make temp");
- terminate(-1);
- }
- close(fd);
- }
- if (!iflag)
- appcstrg(&p1out, ofn);
-
- args = xcalloc(1, sizeof (char *));
-
- /* run cc */
-
- if (getenv("CC") == NULL) {
- pathname = xmalloc(strlen(PATH_USRBIN) + sizeof ("/cc"));
- (void)sprintf(pathname, "%s/cc", PATH_USRBIN);
- appcstrg(&args, pathname);
- } else {
- pathname = strdup(getenv("CC"));
- for (p = strtok(pathname, " \t"); p; p = strtok(NULL, " \t"))
- appcstrg(&args, p);
- }
-
- applst(&args, cflags);
- applst(&args, lcflags);
- appcstrg(&args, name);
-
- /* we reuse the same tmp file for cpp output, so rewind and truncate */
- if (lseek(cppoutfd, SEEK_SET, (off_t)0) != 0) {
- warn("lseek");
- terminate(-1);
- }
- if (ftruncate(cppoutfd, (off_t)0) != 0) {
- warn("ftruncate");
- terminate(-1);
- }
-
- runchild(pathname, args, cppout, cppoutfd);
- free(pathname);
- freelst(&args);
-
- /* run lint1 */
-
- if (!Bflag) {
- pathname = xmalloc(strlen(PATH_LIBEXEC) + sizeof ("/lint1") +
- strlen(target_prefix));
- (void)sprintf(pathname, "%s/%slint1", PATH_LIBEXEC,
- target_prefix);
- } else {
- /*
- * XXX Unclear whether we should be using target_prefix
- * XXX here. --thorpej@wasabisystems.com
- */
- pathname = xmalloc(strlen(libexec_path) + sizeof ("/lint1"));
- (void)sprintf(pathname, "%s/lint1", libexec_path);
- }
-
- appcstrg(&args, pathname);
- applst(&args, l1flags);
- appcstrg(&args, cppout);
- appcstrg(&args, ofn);
-
- runchild(pathname, args, ofn, -1);
- free(pathname);
- freelst(&args);
-
- appcstrg(&p2in, ofn);
- free(ofn);
-
- free(args);
-}
-
-static void
-runchild(const char *path, char *const *args, const char *crfn, int fdout)
-{
- int status, rv, signo, i;
-
- if (Vflag) {
- for (i = 0; args[i] != NULL; i++)
- (void)printf("%s ", args[i]);
- (void)printf("\n");
- }
-
- currfn = crfn;
-
- (void)fflush(stdout);
-
- switch (vfork()) {
- case -1:
- warn("cannot fork");
- terminate(-1);
- /* NOTREACHED */
- default:
- /* parent */
- break;
- case 0:
- /* child */
-
- /* setup the standard output if necessary */
- if (fdout != -1) {
- dup2(fdout, STDOUT_FILENO);
- close(fdout);
- }
- (void)execvp(path, args);
- warn("cannot exec %s", path);
- _exit(1);
- /* NOTREACHED */
- }
-
- while ((rv = wait(&status)) == -1 && errno == EINTR) ;
- if (rv == -1) {
- warn("wait");
- terminate(-1);
- }
- if (WIFSIGNALED(status)) {
- signo = WTERMSIG(status);
-#if HAVE_DECL_SYS_SIGNAME
- warnx("%s got SIG%s", path, sys_signame[signo]);
-#else
- warnx("%s got signal %d", path, signo);
-#endif
- terminate(-1);
- }
- if (WEXITSTATUS(status) != 0)
- terminate(-1);
- currfn = NULL;
-}
-
-static void
-findlibs(char *const *liblst)
-{
- int i, k;
- const char *lib, *path;
- char *lfn;
- size_t len;
-
- lfn = NULL;
-
- for (i = 0; (lib = liblst[i]) != NULL; i++) {
- for (k = 0; (path = libsrchpath[k]) != NULL; k++) {
- len = strlen(path) + strlen(lib);
- lfn = xrealloc(lfn, len + sizeof ("/llib-l.ln"));
- (void)sprintf(lfn, "%s/llib-l%s.ln", path, lib);
- if (rdok(lfn))
- break;
- lfn = xrealloc(lfn, len + sizeof ("/lint/llib-l.ln"));
- (void)sprintf(lfn, "%s/lint/llib-l%s.ln", path, lib);
- if (rdok(lfn))
- break;
- }
- if (path != NULL) {
- appstrg(&l2libs, concat2("-l", lfn));
- } else {
- warnx("cannot find llib-l%s.ln", lib);
- }
- }
-
- free(lfn);
-}
-
-static int
-rdok(const char *path)
-{
- struct stat sbuf;
-
- if (stat(path, &sbuf) == -1)
- return (0);
- if (!S_ISREG(sbuf.st_mode))
- return (0);
- if (access(path, R_OK) == -1)
- return (0);
- return (1);
-}
-
-static void
-lint2(void)
-{
- char *path, **args;
-
- args = xcalloc(1, sizeof (char *));
-
- if (!Bflag) {
- path = xmalloc(strlen(PATH_LIBEXEC) + sizeof ("/lint2") +
- strlen(target_prefix));
- (void)sprintf(path, "%s/%slint2", PATH_LIBEXEC,
- target_prefix);
- } else {
- /*
- * XXX Unclear whether we should be using target_prefix
- * XXX here. --thorpej@wasabisystems.com
- */
- path = xmalloc(strlen(libexec_path) + sizeof ("/lint2"));
- (void)sprintf(path, "%s/lint2", libexec_path);
- }
-
- appcstrg(&args, path);
- applst(&args, l2flags);
- applst(&args, l2libs);
- applst(&args, p2in);
-
- runchild(path, args, p2out, -1);
- free(path);
- freelst(&args);
- free(args);
-}
-
-static void
-cat(char *const *srcs, const char *dest)
-{
- int ifd, ofd, i;
- char *src, *buf;
- ssize_t rlen;
-
- if ((ofd = open(dest, O_WRONLY | O_CREAT | O_TRUNC, 0666)) == -1) {
- warn("cannot open %s", dest);
- terminate(-1);
- }
-
- buf = xmalloc(MBLKSIZ);
-
- for (i = 0; (src = srcs[i]) != NULL; i++) {
- if ((ifd = open(src, O_RDONLY)) == -1) {
- free(buf);
- warn("cannot open %s", src);
- terminate(-1);
- }
- do {
- if ((rlen = read(ifd, buf, MBLKSIZ)) == -1) {
- free(buf);
- warn("read error on %s", src);
- terminate(-1);
- }
- if (write(ofd, buf, (size_t)rlen) == -1) {
- free(buf);
- warn("write error on %s", dest);
- terminate(-1);
- }
- } while (rlen == MBLKSIZ);
- (void)close(ifd);
- }
- (void)close(ofd);
- free(buf);
-}
diff --git a/usr.bin/xstr/Makefile b/usr.bin/xstr/Makefile
deleted file mode 100644
index 620a3ba..0000000
--- a/usr.bin/xstr/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/9/93
-
-PROG= xstr
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/xstr/pathnames.h b/usr.bin/xstr/pathnames.h
deleted file mode 100644
index 08a63dd..0000000
--- a/usr.bin/xstr/pathnames.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)pathnames.h 8.1 (Berkeley) 6/9/93
- */
-
-#define _PATH_TMP "/tmp/xstrXXXXXX"
diff --git a/usr.bin/xstr/xstr.1 b/usr.bin/xstr/xstr.1
deleted file mode 100644
index 22c46d1..0000000
--- a/usr.bin/xstr/xstr.1
+++ /dev/null
@@ -1,167 +0,0 @@
-.\" Copyright (c) 1980, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)xstr.1 8.2 (Berkeley) 12/30/93
-.\" $FreeBSD$
-.\"
-.Dd December 30, 1993
-.Dt XSTR 1
-.Os
-.Sh NAME
-.Nm xstr
-.Nd "extract strings from C programs to implement shared strings"
-.Sh SYNOPSIS
-.Nm
-.Op Fl cv
-.Op Fl
-.Op Ar
-.Sh DESCRIPTION
-The
-.Nm
-utility maintains a file
-.Pa strings
-into which strings in component parts of a large program are hashed.
-These strings are replaced with references to this common area.
-This serves to implement shared constant strings, most useful if they
-are also read-only.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl
-Read from the standard input.
-.It Fl c
-Extract the strings from the C source
-.Ar file
-or the standard input
-.Pq Fl ,
-replacing
-string references by expressions of the form
-.Li (&xstr[number])
-for some
-.Ar number .
-An appropriate declaration of
-.Va xstr
-is prepended to the file.
-The resulting C text is placed in the file
-.Pa x.c ,
-to then be compiled.
-The strings from this file are placed in the
-.Pa strings
-data base if they are not there already.
-Repeated strings and strings which are suffixes of existing strings
-do not cause changes to the data base.
-.It Fl v
-Verbose mode.
-.El
-.Pp
-After all components of a large program have been compiled a file
-.Pa xs.c
-declaring the common
-.Va xstr
-space can be created by a command of the form
-.Pp
-.Dl xstr
-.Pp
-The file
-.Pa xs.c
-should then be compiled and loaded with the rest
-of the program.
-If possible, the array can be made read-only (shared) saving
-space and swap overhead.
-.Pp
-The
-.Nm
-utility can also be used on a single file.
-A command
-.Bd -literal -offset indent
-xstr name
-.Ed
-.Pp
-creates files
-.Pa x.c
-and
-.Pa xs.c
-as before, without using or affecting any
-.Pa strings
-file in the same directory.
-.Pp
-It may be useful to run
-.Nm
-after the C preprocessor if any macro definitions yield strings
-or if there is conditional code which contains strings
-which may not, in fact, be needed.
-An appropriate command sequence for running
-.Nm
-after the C preprocessor is:
-.Pp
-.Bd -literal -offset indent -compact
-cc -E name.c | xstr -c -
-cc -c x.c
-mv x.o name.o
-.Ed
-.Pp
-The
-.Nm
-utility does not touch the file
-.Pa strings
-unless new items are added, thus
-.Xr make 1
-can avoid remaking
-.Pa xs.o
-unless truly necessary.
-.Sh FILES
-.Bl -tag -width ".Pa /tmp/xs*" -compact
-.It Pa strings
-data base of strings
-.It Pa x.c
-massaged C source
-.It Pa xs.c
-C source for definition of array
-.Va xstr
-.It Pa /tmp/xs*
-temporary file when
-.Dq Li "xstr name"
-does not touch
-.Pa strings
-.El
-.Sh SEE ALSO
-.Xr mkstr 1
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.Bx 3.0 .
-.Sh BUGS
-If a string is a suffix of another string in the data base,
-but the shorter string is seen first by
-.Nm
-both strings will be placed in the data base, when just
-placing the longer one there will do.
diff --git a/usr.bin/xstr/xstr.c b/usr.bin/xstr/xstr.c
deleted file mode 100644
index c5fcef1..0000000
--- a/usr.bin/xstr/xstr.c
+++ /dev/null
@@ -1,495 +0,0 @@
-/*
- * Copyright (c) 1980, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1980, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif
-
-#ifndef lint
-static const char sccsid[] = "@(#)xstr.c 8.1 (Berkeley) 6/9/93";
-#endif
-
-#include <sys/types.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "pathnames.h"
-
-/*
- * xstr - extract and hash strings in a C program
- *
- * Bill Joy UCB
- * November, 1978
- */
-
-#define ignore(a) ((void) a)
-
-off_t tellpt;
-
-off_t mesgpt;
-char cstrings[] = "strings";
-char *strings = cstrings;
-
-int cflg;
-int vflg;
-int readstd;
-
-char lastchr(char *);
-
-int fgetNUL(char *, int, FILE *);
-int istail(char *, char *);
-int octdigit(char);
-int xgetc(FILE *);
-
-off_t hashit(char *, int);
-off_t yankstr(char **);
-
-static void usage(void);
-
-void flushsh(void);
-void found(int, off_t, char *);
-void inithash(void);
-void onintr(int);
-void process(const char *);
-void prstr(char *);
-void xsdotc(void);
-
-int
-main(int argc, char *argv[])
-{
- int c;
- int fdesc;
-
- while ((c = getopt(argc, argv, "-cv")) != -1)
- switch (c) {
- case '-':
- readstd++;
- break;
- case 'c':
- cflg++;
- break;
- case 'v':
- vflg++;
- break;
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (signal(SIGINT, SIG_IGN) == SIG_DFL)
- signal(SIGINT, onintr);
- if (cflg || (argc == 0 && !readstd))
- inithash();
- else {
- strings = strdup(_PATH_TMP);
- if (strings == NULL)
- err(1, "strdup() failed");
- fdesc = mkstemp(strings);
- if (fdesc == -1)
- err(1, "Unable to create temporary file");
- close(fdesc);
- }
-
- while (readstd || argc > 0) {
- if (freopen("x.c", "w", stdout) == NULL)
- err(1, "x.c");
- if (!readstd && freopen(argv[0], "r", stdin) == NULL)
- err(2, "%s", argv[0]);
- process("x.c");
- if (readstd == 0)
- argc--, argv++;
- else
- readstd = 0;
- };
- flushsh();
- if (cflg == 0)
- xsdotc();
- if (strings[0] == '/')
- ignore(unlink(strings));
- exit(0);
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: xstr [-cv] [-] [file ...]\n");
- exit (1);
-}
-
-char linebuf[BUFSIZ];
-
-void
-process(const char *name)
-{
- char *cp;
- int c;
- int incomm = 0;
- int ret;
-
- printf("extern char\txstr[];\n");
- for (;;) {
- if (fgets(linebuf, sizeof linebuf, stdin) == NULL) {
- if (ferror(stdin))
- err(3, "%s", name);
- break;
- }
- if (linebuf[0] == '#') {
- if (linebuf[1] == ' ' && isdigit(linebuf[2]))
- printf("#line%s", &linebuf[1]);
- else
- printf("%s", linebuf);
- continue;
- }
- for (cp = linebuf; (c = *cp++);) switch (c) {
-
- case '"':
- if (incomm)
- goto def;
- if ((ret = (int) yankstr(&cp)) == -1)
- goto out;
- printf("(&xstr[%d])", ret);
- break;
-
- case '\'':
- if (incomm)
- goto def;
- putchar(c);
- if (*cp)
- putchar(*cp++);
- break;
-
- case '/':
- if (incomm || *cp != '*')
- goto def;
- incomm = 1;
- cp++;
- printf("/*");
- continue;
-
- case '*':
- if (incomm && *cp == '/') {
- incomm = 0;
- cp++;
- printf("*/");
- continue;
- }
- goto def;
-
-def:
- default:
- putchar(c);
- break;
- }
- }
-out:
- if (ferror(stdout))
- warn("x.c"), onintr(0);
-}
-
-off_t
-yankstr(char **cpp)
-{
- char *cp = *cpp;
- int c, ch;
- char dbuf[BUFSIZ];
- char *dp = dbuf;
- char *tp;
- static char tmp[] = "b\bt\tr\rn\nf\f\\\\\"\"";
-
- while ((c = *cp++)) {
- if (dp == dbuf + sizeof(dbuf) - 3)
- errx(1, "message too long");
- switch (c) {
-
- case '"':
- cp++;
- goto out;
-
- case '\\':
- c = *cp++;
- if (c == 0)
- break;
- if (c == '\n') {
- if (fgets(linebuf, sizeof linebuf, stdin)
- == NULL) {
- if (ferror(stdin))
- err(3, "x.c");
- return(-1);
- }
- cp = linebuf;
- continue;
- }
- for (tp = tmp; (ch = *tp++); tp++)
- if (c == ch) {
- c = *tp;
- goto gotc;
- }
- if (!octdigit(c)) {
- *dp++ = '\\';
- break;
- }
- c -= '0';
- if (!octdigit(*cp))
- break;
- c <<= 3, c += *cp++ - '0';
- if (!octdigit(*cp))
- break;
- c <<= 3, c += *cp++ - '0';
- break;
- }
-gotc:
- *dp++ = c;
- }
-out:
- *cpp = --cp;
- *dp = 0;
- return (hashit(dbuf, 1));
-}
-
-int
-octdigit(char c)
-{
- return (isdigit(c) && c != '8' && c != '9');
-}
-
-void
-inithash(void)
-{
- char buf[BUFSIZ];
- FILE *mesgread = fopen(strings, "r");
-
- if (mesgread == NULL)
- return;
- for (;;) {
- mesgpt = tellpt;
- if (fgetNUL(buf, sizeof buf, mesgread) == 0)
- break;
- ignore(hashit(buf, 0));
- }
- ignore(fclose(mesgread));
-}
-
-int
-fgetNUL(char *obuf, int rmdr, FILE *file)
-{
- int c;
- char *buf = obuf;
-
- while (--rmdr > 0 && (c = xgetc(file)) != 0 && c != EOF)
- *buf++ = c;
- *buf++ = 0;
- return ((feof(file) || ferror(file)) ? 0 : 1);
-}
-
-int
-xgetc(FILE *file)
-{
-
- tellpt++;
- return (getc(file));
-}
-
-#define BUCKETS 128
-
-struct hash {
- off_t hpt;
- char *hstr;
- struct hash *hnext;
- short hnew;
-} bucket[BUCKETS];
-
-off_t
-hashit(char *str, int new)
-{
- int i;
- struct hash *hp, *hp0;
-
- hp = hp0 = &bucket[lastchr(str) & 0177];
- while (hp->hnext) {
- hp = hp->hnext;
- i = istail(str, hp->hstr);
- if (i >= 0)
- return (hp->hpt + i);
- }
- if ((hp = (struct hash *) calloc(1, sizeof (*hp))) == NULL)
- errx(8, "calloc");
- hp->hpt = mesgpt;
- if (!(hp->hstr = strdup(str)))
- err(1, NULL);
- mesgpt += strlen(hp->hstr) + 1;
- hp->hnext = hp0->hnext;
- hp->hnew = new;
- hp0->hnext = hp;
- return (hp->hpt);
-}
-
-void
-flushsh(void)
-{
- int i;
- struct hash *hp;
- FILE *mesgwrit;
- int old = 0, new = 0;
-
- for (i = 0; i < BUCKETS; i++)
- for (hp = bucket[i].hnext; hp != NULL; hp = hp->hnext)
- if (hp->hnew)
- new++;
- else
- old++;
- if (new == 0 && old != 0)
- return;
- mesgwrit = fopen(strings, old ? "r+" : "w");
- if (mesgwrit == NULL)
- err(4, "%s", strings);
- for (i = 0; i < BUCKETS; i++)
- for (hp = bucket[i].hnext; hp != NULL; hp = hp->hnext) {
- found(hp->hnew, hp->hpt, hp->hstr);
- if (hp->hnew) {
- fseek(mesgwrit, hp->hpt, 0);
- ignore(fwrite(hp->hstr, strlen(hp->hstr) + 1, 1, mesgwrit));
- if (ferror(mesgwrit))
- err(4, "%s", strings);
- }
- }
- if (fclose(mesgwrit) == EOF)
- err(4, "%s", strings);
-}
-
-void
-found(int new, off_t off, char *str)
-{
- if (vflg == 0)
- return;
- if (!new)
- fprintf(stderr, "found at %d:", (int) off);
- else
- fprintf(stderr, "new at %d:", (int) off);
- prstr(str);
- fprintf(stderr, "\n");
-}
-
-void
-prstr(char *cp)
-{
- int c;
-
- while ((c = (*cp++ & 0377)))
- if (c < ' ')
- fprintf(stderr, "^%c", c + '`');
- else if (c == 0177)
- fprintf(stderr, "^?");
- else if (c > 0200)
- fprintf(stderr, "\\%03o", c);
- else
- fprintf(stderr, "%c", c);
-}
-
-void
-xsdotc(void)
-{
- FILE *strf = fopen(strings, "r");
- FILE *xdotcf;
-
- if (strf == NULL)
- err(5, "%s", strings);
- xdotcf = fopen("xs.c", "w");
- if (xdotcf == NULL)
- err(6, "xs.c");
- fprintf(xdotcf, "char\txstr[] = {\n");
- for (;;) {
- int i, c;
-
- for (i = 0; i < 8; i++) {
- c = getc(strf);
- if (ferror(strf)) {
- warn("%s", strings);
- onintr(0);
- }
- if (feof(strf)) {
- fprintf(xdotcf, "\n");
- goto out;
- }
- fprintf(xdotcf, "0x%02x,", c);
- }
- fprintf(xdotcf, "\n");
- }
-out:
- fprintf(xdotcf, "};\n");
- ignore(fclose(xdotcf));
- ignore(fclose(strf));
-}
-
-char
-lastchr(char *cp)
-{
-
- while (cp[0] && cp[1])
- cp++;
- return (*cp);
-}
-
-int
-istail(char *str, char *of)
-{
- int d = strlen(of) - strlen(str);
-
- if (d < 0 || strcmp(&of[d], str) != 0)
- return (-1);
- return (d);
-}
-
-void
-onintr(int dummy __unused)
-{
-
- ignore(signal(SIGINT, SIG_IGN));
- if (strings[0] == '/')
- ignore(unlink(strings));
- ignore(unlink("x.c"));
- ignore(unlink("xs.c"));
- exit(7);
-}
diff --git a/usr.bin/yacc/ACKNOWLEDGEMENTS b/usr.bin/yacc/ACKNOWLEDGEMENTS
deleted file mode 100644
index b66bb25..0000000
--- a/usr.bin/yacc/ACKNOWLEDGEMENTS
+++ /dev/null
@@ -1,25 +0,0 @@
- Berkeley Yacc owes much to the unflagging efforts of Keith Bostic.
-His badgering kept me working on it long after I was ready to quit.
-
- Berkeley Yacc is based on the excellent algorithm for computing LALR(1)
-lookaheads developed by Tom Pennello and Frank DeRemer. The algorithm is
-described in their almost impenetrable article in TOPLAS 4,4.
-
- Finally, much of the credit for the latest version must go to those
-who pointed out deficiencies of my earlier releases. Among the most
-prolific contributors were
-
- Benson I. Margulies
- Dave Gentzel
- Antoine Verheijen
- Peter S. Housel
- Dale Smith
- Ozan Yigit
- John Campbell
- Bill Sommerfeld
- Paul Hilfinger
- Gary Bridgewater
- Dave Bakken
- Dan Lanciani
- Richard Sargent
- Parag Patel
diff --git a/usr.bin/yacc/Makefile b/usr.bin/yacc/Makefile
deleted file mode 100644
index e8b1024..0000000
--- a/usr.bin/yacc/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-# @(#)Makefile 5.3 (Berkeley) 5/12/90
-# $FreeBSD$
-
-PROG= yacc
-SRCS= closure.c error.c lalr.c lr0.c main.c mkpar.c output.c reader.c \
- skeleton.c symtab.c verbose.c warshall.c
-SCRIPTS=yyfix.sh
-MAN= yacc.1 yyfix.1
-LINKS= ${BINDIR}/yacc ${BINDIR}/byacc
-MLINKS= yacc.1 byacc.1
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/yacc/NEW_FEATURES b/usr.bin/yacc/NEW_FEATURES
deleted file mode 100644
index b030c62..0000000
--- a/usr.bin/yacc/NEW_FEATURES
+++ /dev/null
@@ -1,46 +0,0 @@
- The -r option has been implemented. The -r option tells Yacc to
-put the read-only tables in y.tab.c and the code and variables in
-y.code.c. Keith Bostic asked for this option so that :yyfix could be
-eliminated.
-
- The -l and -t options have been implemented. The -l option tells
-Yacc not to include #line directives in the code it produces. The -t
-option causes debugging code to be included in the compiled parser.
-
- The code for error recovery has been changed to implement the same
-algorithm as AT&T Yacc. There will still be differences in the way
-error recovery works because AT&T Yacc uses more default reductions
-than Berkeley Yacc.
-
- The environment variable TMPDIR determines the directory where
-temporary files will be created. If TMPDIR is defined, temporary files
-will be created in the directory whose pathname is the value of TMPDIR.
-By default, temporary files are created in /tmp.
-
- The keywords are now case-insensitive. For example, %nonassoc,
-%NONASSOC, %NonAssoc, and %nOnAsSoC are all equivalent.
-
- Commas and semicolons that are not part of C code are treated as
-commentary.
-
- Line-end comments, as in BCPL, are permitted. Line-end comments
-begin with // and end at the next end-of-line. Line-end comments are
-permitted in C code; they are converted to C comments on output.
-
- The form of y.output files has been changed to look more like
-those produced by AT&T Yacc.
-
- A new kind of declaration has been added. The form of the declaration
-is
-
- %ident string
-
-where string is a sequence of characters begining with a double quote
-and ending with either a double quote or the next end-of-line, whichever
-comes first. The declaration will cause a #ident directive to be written
-near the start of the output file.
-
- If a parser has been compiled with debugging code, that code can be
-enabled by setting an environment variable. If the environment variable
-YYDEBUG is set to 0, debugging output is suppressed. If it is set to 1,
-debugging output is written to standard output.
diff --git a/usr.bin/yacc/NOTES b/usr.bin/yacc/NOTES
deleted file mode 100644
index 9db3c96..0000000
--- a/usr.bin/yacc/NOTES
+++ /dev/null
@@ -1,9 +0,0 @@
-Berkeley Yacc reflects its origins. The reason so many routines
-use exactly six register variables is that Berkeley Yacc was
-developed on a VAX using PCC. PCC placed at most six variables
-in registers. I went to considerable effort to find which six
-variables most belonged in registers. Changes in machines and
-compilers make that effort worthless, perhaps even harmful.
-
-The code contains many instances where address calculations are
-performed in particular ways to optimize the code for the VAX.
diff --git a/usr.bin/yacc/README b/usr.bin/yacc/README
deleted file mode 100644
index 091f233..0000000
--- a/usr.bin/yacc/README
+++ /dev/null
@@ -1,23 +0,0 @@
- Berkeley Yacc is an LALR(1) parser generator. Berkeley Yacc has been made
-as compatible as possible with AT&T Yacc. Berkeley Yacc can accept any input
-specification that conforms to the AT&T Yacc documentation. Specifications
-that take advantage of undocumented features of AT&T Yacc will probably be
-rejected.
-
- Berkeley Yacc is distributed with no warranty whatever. The code is certain
-to contain errors. Neither the author nor any contributor takes responsibility
-for any consequences of its use.
-
- Berkeley Yacc is in the public domain. The data structures and algorithms
-used in Berkeley Yacc are all either taken from documents available to the
-general public or are inventions of the author. Anyone may freely distribute
-source or binary forms of Berkeley Yacc whether unchanged or modified.
-Distributers may charge whatever fees they can obtain for Berkeley Yacc.
-Programs generated by Berkeley Yacc may be distributed freely.
-
- Please report bugs to
-
- robert.corbett@eng.Sun.COM
-
-Include a small example if possible. Please include the banner string from
-skeleton.c with the bug report. Do not expect rapid responses.
diff --git a/usr.bin/yacc/closure.c b/usr.bin/yacc/closure.c
deleted file mode 100644
index 2124417..0000000
--- a/usr.bin/yacc/closure.c
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)closure.c 5.3 (Berkeley) 5/24/93";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-#include "defs.h"
-
-short *itemset;
-short *itemsetend;
-unsigned *ruleset;
-
-static void set_EFF(void);
-#ifdef DEBUG
-static void print_closure(int);
-static void print_EFF();
-static void print_first_derives();
-#endif
-
-static unsigned *first_derives;
-static unsigned *EFF;
-
-
-static void
-set_EFF()
-{
- unsigned *row;
- int symbol;
- short *sp;
- int rowsize;
- int i;
- int rule;
-
- rowsize = WORDSIZE(nvars);
- EFF = NEW2(nvars * rowsize, unsigned);
-
- row = EFF;
- for (i = start_symbol; i < nsyms; i++)
- {
- sp = derives[i];
- for (rule = *sp; rule > 0; rule = *++sp)
- {
- symbol = ritem[rrhs[rule]];
- if (ISVAR(symbol))
- {
- symbol -= start_symbol;
- SETBIT(row, symbol);
- }
- }
- row += rowsize;
- }
-
- reflexive_transitive_closure(EFF, nvars);
-
-#ifdef DEBUG
- print_EFF();
-#endif
-}
-
-
-void
-set_first_derives()
-{
- unsigned *rrow;
- unsigned *vrow;
- int j;
- unsigned k;
- unsigned cword = 0;
- short *rp;
-
- int rule;
- int i;
- int rulesetsize;
- int varsetsize;
-
- rulesetsize = WORDSIZE(nrules);
- varsetsize = WORDSIZE(nvars);
- first_derives = NEW2(nvars * rulesetsize, unsigned) - ntokens * rulesetsize;
-
- set_EFF();
-
- rrow = first_derives + ntokens * rulesetsize;
- for (i = start_symbol; i < nsyms; i++)
- {
- vrow = EFF + ((i - ntokens) * varsetsize);
- k = BITS_PER_WORD;
- for (j = start_symbol; j < nsyms; k++, j++)
- {
- if (k >= BITS_PER_WORD)
- {
- cword = *vrow++;
- k = 0;
- }
-
- if (cword & (1 << k))
- {
- rp = derives[j];
- while ((rule = *rp++) >= 0)
- {
- SETBIT(rrow, rule);
- }
- }
- }
-
- rrow += rulesetsize;
- }
-
-#ifdef DEBUG
- print_first_derives();
-#endif
-
- FREE(EFF);
-}
-
-
-void
-closure(nucleus, n)
-short *nucleus;
-int n;
-{
- int ruleno;
- unsigned word;
- unsigned i;
- short *csp;
- unsigned *dsp;
- unsigned *rsp;
- int rulesetsize;
-
- short *csend;
- unsigned *rsend;
- int symbol;
- int itemno;
-
- rulesetsize = WORDSIZE(nrules);
- rsend = ruleset + rulesetsize;
- for (rsp = ruleset; rsp < rsend; rsp++)
- *rsp = 0;
-
- csend = nucleus + n;
- for (csp = nucleus; csp < csend; ++csp)
- {
- symbol = ritem[*csp];
- if (ISVAR(symbol))
- {
- dsp = first_derives + symbol * rulesetsize;
- rsp = ruleset;
- while (rsp < rsend)
- *rsp++ |= *dsp++;
- }
- }
-
- ruleno = 0;
- itemsetend = itemset;
- csp = nucleus;
- for (rsp = ruleset; rsp < rsend; ++rsp)
- {
- word = *rsp;
- if (word)
- {
- for (i = 0; i < BITS_PER_WORD; ++i)
- {
- if (word & (1 << i))
- {
- itemno = rrhs[ruleno+i];
- while (csp < csend && *csp < itemno)
- *itemsetend++ = *csp++;
- *itemsetend++ = itemno;
- while (csp < csend && *csp == itemno)
- ++csp;
- }
- }
- }
- ruleno += BITS_PER_WORD;
- }
-
- while (csp < csend)
- *itemsetend++ = *csp++;
-
-#ifdef DEBUG
- print_closure(n);
-#endif
-}
-
-
-
-void
-finalize_closure()
-{
- FREE(itemset);
- FREE(ruleset);
- FREE(first_derives + ntokens * WORDSIZE(nrules));
-}
-
-
-#ifdef DEBUG
-
-static void
-print_closure(n)
-int n;
-{
- short *isp;
-
- printf("\n\nn = %d\n\n", n);
- for (isp = itemset; isp < itemsetend; isp++)
- printf(" %d\n", *isp);
-}
-
-
-static void
-print_EFF()
-{
- int i, j;
- unsigned *rowp;
- unsigned word;
- unsigned k;
-
- printf("\n\nEpsilon Free Firsts\n");
-
- for (i = start_symbol; i < nsyms; i++)
- {
- printf("\n%s", symbol_name[i]);
- rowp = EFF + ((i - start_symbol) * WORDSIZE(nvars));
- word = *rowp++;
-
- k = BITS_PER_WORD;
- for (j = 0; j < nvars; k++, j++)
- {
- if (k >= BITS_PER_WORD)
- {
- word = *rowp++;
- k = 0;
- }
-
- if (word & (1 << k))
- printf(" %s", symbol_name[start_symbol + j]);
- }
- }
-}
-
-
-static void
-print_first_derives()
-{
- int i;
- int j;
- unsigned *rp;
- unsigned cword;
- unsigned k;
-
- printf("\n\n\nFirst Derives\n");
-
- for (i = start_symbol; i < nsyms; i++)
- {
- printf("\n%s derives\n", symbol_name[i]);
- rp = first_derives + i * WORDSIZE(nrules);
- k = BITS_PER_WORD;
- for (j = 0; j <= nrules; k++, j++)
- {
- if (k >= BITS_PER_WORD)
- {
- cword = *rp++;
- k = 0;
- }
-
- if (cword & (1 << k))
- printf(" %d\n", j);
- }
- }
-
- fflush(stdout);
-}
-
-#endif
diff --git a/usr.bin/yacc/defs.h b/usr.bin/yacc/defs.h
deleted file mode 100644
index 5219e1b..0000000
--- a/usr.bin/yacc/defs.h
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)defs.h 5.6 (Berkeley) 5/24/93
- * $FreeBSD$
- */
-
-#include <assert.h>
-#include <ctype.h>
-#include <err.h>
-#include <stdio.h>
-
-
-/* machine-dependent definitions */
-/* the following definitions are for the Tahoe */
-/* they might have to be changed for other machines */
-
-/* MAXTABLE is the maximum table size */
-/* BITS_PER_WORD is the number of bits in a C unsigned */
-/* WORDSIZE computes the number of words needed to */
-/* store n bits */
-/* BIT returns the value of the n-th bit starting */
-/* from r (0-indexed) */
-/* SETBIT sets the n-th bit starting from r */
-
-#define MAXTABLE 32500
-#define BITS_PER_WORD 32
-#define WORDSIZE(n) (((n)+(BITS_PER_WORD-1))/BITS_PER_WORD)
-#define BIT(r, n) ((((r)[(n)>>5])>>((n)&31))&1)
-#define SETBIT(r, n) ((r)[(n)>>5]|=((unsigned)1<<((n)&31)))
-
-
-/* character names */
-
-#define NUL '\0' /* the null character */
-#define NEWLINE '\n' /* line feed */
-#define SP ' ' /* space */
-#define BS '\b' /* backspace */
-#define HT '\t' /* horizontal tab */
-#define VT '\013' /* vertical tab */
-#define CR '\r' /* carriage return */
-#define FF '\f' /* form feed */
-#define QUOTE '\'' /* single quote */
-#define DOUBLE_QUOTE '\"' /* double quote */
-#define BACKSLASH '\\' /* backslash */
-
-
-/* defines for constructing filenames */
-
-#define CODE_SUFFIX ".code.c"
-#define DEFINES_SUFFIX ".tab.h"
-#define OUTPUT_SUFFIX ".tab.c"
-#define VERBOSE_SUFFIX ".output"
-
-
-/* keyword codes */
-
-#define TOKEN 0
-#define LEFT 1
-#define RIGHT 2
-#define NONASSOC 3
-#define MARK 4
-#define TEXT 5
-#define TYPE 6
-#define START 7
-#define UNION 8
-#define IDENT 9
-#define EXPECT 10
-
-
-/* symbol classes */
-
-#define UNKNOWN 0
-#define TERM 1
-#define NONTERM 2
-
-
-/* the undefined value */
-
-#define UNDEFINED (-1)
-
-
-/* action codes */
-
-#define SHIFT 1
-#define REDUCE 2
-
-
-/* character macros */
-
-#define IS_IDENT(c) (isalnum(c) || (c) == '_' || (c) == '.' || (c) == '$')
-#define IS_OCTAL(c) ((c) >= '0' && (c) <= '7')
-#define NUMERIC_VALUE(c) ((c) - '0')
-
-
-/* symbol macros */
-
-#define ISTOKEN(s) ((s) < start_symbol)
-#define ISVAR(s) ((s) >= start_symbol)
-
-
-/* storage allocation macros */
-
-#define CALLOC(k,n) (calloc((unsigned)(k),(unsigned)(n)))
-#define FREE(x) (free((char*)(x)))
-#define MALLOC(n) (malloc((unsigned)(n)))
-#define NEW(t) ((t*)allocate(sizeof(t)))
-#define NEW2(n,t) ((t*)allocate((unsigned)((n)*sizeof(t))))
-#define REALLOC(p,n) (realloc((char*)(p),(unsigned)(n)))
-
-
-/* the structure of a symbol table entry */
-
-typedef struct bucket bucket;
-struct bucket
-{
- struct bucket *link;
- struct bucket *next;
- char *name;
- char *tag;
- short value;
- short index;
- short prec;
- char class;
- char assoc;
-};
-
-
-/* the structure of the LR(0) state machine */
-
-typedef struct core core;
-struct core
-{
- struct core *next;
- struct core *link;
- short number;
- short accessing_symbol;
- short nitems;
- short items[1];
-};
-
-
-/* the structure used to record shifts */
-
-typedef struct shifts shifts;
-struct shifts
-{
- struct shifts *next;
- short number;
- short nshifts;
- short shift[1];
-};
-
-
-/* the structure used to store reductions */
-
-typedef struct reductions reductions;
-struct reductions
-{
- struct reductions *next;
- short number;
- short nreds;
- short rules[1];
-};
-
-
-/* the structure used to represent parser actions */
-
-typedef struct action action;
-struct action
-{
- struct action *next;
- short symbol;
- short number;
- short prec;
- char action_code;
- char assoc;
- char suppressed;
-};
-
-
-/* global variables */
-
-extern char dflag;
-extern char lflag;
-extern char rflag;
-extern char tflag;
-extern char vflag;
-extern const char *symbol_prefix;
-
-extern char *myname;
-extern char *cptr;
-extern char *line;
-extern int lineno;
-extern int outline;
-
-extern const char *banner[];
-extern const char *tables[];
-extern const char *header[];
-extern const char *body[];
-extern const char *trailer[];
-
-extern char *action_file_name;
-extern char *code_file_name;
-extern char *defines_file_name;
-extern const char *input_file_name;
-extern char *output_file_name;
-extern char *text_file_name;
-extern char *union_file_name;
-extern char *verbose_file_name;
-
-extern FILE *action_file;
-extern FILE *code_file;
-extern FILE *defines_file;
-extern FILE *input_file;
-extern FILE *output_file;
-extern FILE *text_file;
-extern FILE *union_file;
-extern FILE *verbose_file;
-
-extern int nitems;
-extern int nrules;
-extern int nsyms;
-extern int ntokens;
-extern int nvars;
-extern int ntags;
-
-extern char unionized;
-
-extern int start_symbol;
-extern char **symbol_name;
-extern short *symbol_value;
-extern short *symbol_prec;
-extern char *symbol_assoc;
-
-extern short *ritem;
-extern short *rlhs;
-extern short *rrhs;
-extern short *rprec;
-extern char *rassoc;
-
-extern short **derives;
-extern char *nullable;
-
-extern bucket *first_symbol;
-extern bucket *last_symbol;
-
-extern int nstates;
-extern core *first_state;
-extern shifts *first_shift;
-extern reductions *first_reduction;
-extern short *accessing_symbol;
-extern core **state_table;
-extern shifts **shift_table;
-extern reductions **reduction_table;
-extern unsigned *LA;
-extern short *LAruleno;
-extern short *lookaheads;
-extern short *goto_map;
-extern short *from_state;
-extern short *to_state;
-
-extern action **parser;
-extern int SRexpect;
-extern int SRtotal;
-extern int RRtotal;
-extern short *SRconflicts;
-extern short *RRconflicts;
-extern short *defred;
-extern short *rules_used;
-extern short nunused;
-extern short final_state;
-
-/* global functions */
-
-char *allocate(unsigned);
-void closure(short *, int);
-void create_symbol_table(void);
-void default_action_warning(void);
-void dollar_error(int, char *, char *) __dead2;
-void dollar_warning(int, int);
-void done(int) __dead2;
-void fatal(const char *msg) __dead2;
-void finalize_closure(void);
-void free_parser(void);
-void free_symbols(void);
-void free_symbol_table(void);
-void illegal_character(char *) __dead2;
-void illegal_tag(int, char *, char *) __dead2;
-void lalr(void);
-bucket *lookup(char *);
-void lr0(void);
-bucket *make_bucket(const char *);
-void make_parser(void);
-void no_grammar(void) __dead2;
-void no_space(void) __dead2;
-void open_error(const char *) __dead2;
-void output(void);
-void over_unionized(char *) __dead2;
-void prec_redeclared(void);
-void reader(void);
-void reflexive_transitive_closure(unsigned *, int);
-void reprec_warning(char *);
-void restarted_warning(void);
-void retyped_warning(char *);
-void revalued_warning(char *);
-void set_first_derives(void);
-void syntax_error(int, char *, char *) __dead2;
-void terminal_lhs(int) __dead2;
-void terminal_start(char *) __dead2;
-void tokenized_start(char *) __dead2;
-void undefined_goal(char *) __dead2;
-void undefined_symbol_warning(char *);
-void unexpected_EOF(void) __dead2;
-void unknown_rhs(int) __dead2;
-void unterminated_action(int, char *, char *) __dead2;
-void unterminated_comment(int, char *, char *) __dead2;
-void unterminated_string(int, char *, char *) __dead2;
-void unterminated_text(int, char *, char *) __dead2;
-void unterminated_union(int, char *, char *) __dead2;
-void untyped_lhs(void) __dead2;
-void untyped_rhs(int, char *) __dead2;
-void used_reserved(char *) __dead2;
-void verbose(void);
-void write_section(const char **);
diff --git a/usr.bin/yacc/error.c b/usr.bin/yacc/error.c
deleted file mode 100644
index 9940dbc..0000000
--- a/usr.bin/yacc/error.c
+++ /dev/null
@@ -1,389 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)error.c 5.3 (Berkeley) 6/1/90";
-#endif
-#endif
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/* routines for printing error messages */
-
-#include "defs.h"
-
-static void print_pos(char *, char *);
-
-void
-fatal(msg)
-const char *msg;
-{
- warnx("f - %s", msg);
- done(2);
-}
-
-
-void
-no_space()
-{
- warnx("f - out of space");
- done(2);
-}
-
-
-void
-open_error(filename)
-const char *filename;
-{
- warnx("f - cannot open \"%s\"", filename);
- done(2);
-}
-
-
-void
-unexpected_EOF()
-{
- warnx("e - line %d of \"%s\", unexpected end-of-file",
- lineno, input_file_name);
- done(1);
-}
-
-
-static void
-print_pos(st_line, st_cptr)
-char *st_line;
-char *st_cptr;
-{
- char *s;
-
- if (st_line == 0) return;
- for (s = st_line; *s != '\n'; ++s)
- {
- if (isprint(*s) || *s == '\t')
- putc(*s, stderr);
- else
- putc('?', stderr);
- }
- putc('\n', stderr);
- for (s = st_line; s < st_cptr; ++s)
- {
- if (*s == '\t')
- putc('\t', stderr);
- else
- putc(' ', stderr);
- }
- putc('^', stderr);
- putc('\n', stderr);
-}
-
-
-void
-syntax_error(st_lineno, st_line, st_cptr)
-int st_lineno;
-char *st_line;
-char *st_cptr;
-{
- warnx("e - line %d of \"%s\", syntax error",
- st_lineno, input_file_name);
- print_pos(st_line, st_cptr);
- done(1);
-}
-
-
-void
-unterminated_comment(c_lineno, c_line, c_cptr)
-int c_lineno;
-char *c_line;
-char *c_cptr;
-{
- warnx("e - line %d of \"%s\", unmatched /*",
- c_lineno, input_file_name);
- print_pos(c_line, c_cptr);
- done(1);
-}
-
-
-void
-unterminated_string(s_lineno, s_line, s_cptr)
-int s_lineno;
-char *s_line;
-char *s_cptr;
-{
- warnx("e - line %d of \"%s\", unterminated string",
- s_lineno, input_file_name);
- print_pos(s_line, s_cptr);
- done(1);
-}
-
-
-void
-unterminated_text(t_lineno, t_line, t_cptr)
-int t_lineno;
-char *t_line;
-char *t_cptr;
-{
- warnx("e - line %d of \"%s\", unmatched %%{",
- t_lineno, input_file_name);
- print_pos(t_line, t_cptr);
- done(1);
-}
-
-
-void
-unterminated_union(u_lineno, u_line, u_cptr)
-int u_lineno;
-char *u_line;
-char *u_cptr;
-{
- warnx("e - line %d of \"%s\", unterminated %%union declaration",
- u_lineno, input_file_name);
- print_pos(u_line, u_cptr);
- done(1);
-}
-
-
-void
-over_unionized(u_cptr)
-char *u_cptr;
-{
- warnx("e - line %d of \"%s\", too many %%union declarations",
- lineno, input_file_name);
- print_pos(line, u_cptr);
- done(1);
-}
-
-
-void
-illegal_tag(t_lineno, t_line, t_cptr)
-int t_lineno;
-char *t_line;
-char *t_cptr;
-{
- warnx("e - line %d of \"%s\", illegal tag", t_lineno, input_file_name);
- print_pos(t_line, t_cptr);
- done(1);
-}
-
-
-void
-illegal_character(c_cptr)
-char *c_cptr;
-{
- warnx("e - line %d of \"%s\", illegal character", lineno, input_file_name);
- print_pos(line, c_cptr);
- done(1);
-}
-
-
-void
-used_reserved(s)
-char *s;
-{
- warnx("e - line %d of \"%s\", illegal use of reserved symbol %s",
- lineno, input_file_name, s);
- done(1);
-}
-
-
-void
-tokenized_start(s)
-char *s;
-{
- warnx("e - line %d of \"%s\", the start symbol %s cannot be \
-declared to be a token", lineno, input_file_name, s);
- done(1);
-}
-
-
-void
-retyped_warning(s)
-char *s;
-{
- warnx("w - line %d of \"%s\", the type of %s has been redeclared",
- lineno, input_file_name, s);
-}
-
-
-void
-reprec_warning(s)
-char *s;
-{
- warnx("w - line %d of \"%s\", the precedence of %s has been redeclared",
- lineno, input_file_name, s);
-}
-
-
-void
-revalued_warning(s)
-char *s;
-{
- warnx("w - line %d of \"%s\", the value of %s has been redeclared",
- lineno, input_file_name, s);
-}
-
-
-void
-terminal_start(s)
-char *s;
-{
- warnx("e - line %d of \"%s\", the start symbol %s is a token",
- lineno, input_file_name, s);
- done(1);
-}
-
-
-void
-restarted_warning()
-{
- warnx("w - line %d of \"%s\", the start symbol has been redeclared",
- lineno, input_file_name);
-}
-
-
-void
-no_grammar()
-{
- warnx("e - line %d of \"%s\", no grammar has been specified",
- lineno, input_file_name);
- done(1);
-}
-
-
-void
-terminal_lhs(s_lineno)
-int s_lineno;
-{
- warnx("e - line %d of \"%s\", a token appears on the lhs of a production",
- s_lineno, input_file_name);
- done(1);
-}
-
-
-void
-prec_redeclared()
-{
- warnx("w - line %d of \"%s\", conflicting %%prec specifiers",
- lineno, input_file_name);
-}
-
-
-void
-unterminated_action(a_lineno, a_line, a_cptr)
-int a_lineno;
-char *a_line;
-char *a_cptr;
-{
- warnx("e - line %d of \"%s\", unterminated action",
- a_lineno, input_file_name);
- print_pos(a_line, a_cptr);
- done(1);
-}
-
-
-void
-dollar_warning(a_lineno, i)
-int a_lineno;
-int i;
-{
- warnx("w - line %d of \"%s\", $%d references beyond the \
-end of the current rule", a_lineno, input_file_name, i);
-}
-
-
-void
-dollar_error(a_lineno, a_line, a_cptr)
-int a_lineno;
-char *a_line;
-char *a_cptr;
-{
- warnx("e - line %d of \"%s\", illegal $-name", a_lineno, input_file_name);
- print_pos(a_line, a_cptr);
- done(1);
-}
-
-
-void
-untyped_lhs()
-{
- warnx("e - line %d of \"%s\", $$ is untyped", lineno, input_file_name);
- done(1);
-}
-
-
-void
-untyped_rhs(i, s)
-int i;
-char *s;
-{
- warnx("e - line %d of \"%s\", $%d (%s) is untyped",
- lineno, input_file_name, i, s);
- done(1);
-}
-
-
-void
-unknown_rhs(i)
-int i;
-{
- warnx("e - line %d of \"%s\", $%d is untyped", lineno, input_file_name, i);
- done(1);
-}
-
-
-void
-default_action_warning()
-{
- warnx("w - line %d of \"%s\", the default action assigns an \
-undefined value to $$", lineno, input_file_name);
-}
-
-
-void
-undefined_goal(s)
-char *s;
-{
- warnx("e - the start symbol %s is undefined", s);
- done(1);
-}
-
-
-void
-undefined_symbol_warning(s)
-char *s;
-{
- warnx("w - the symbol %s is undefined", s);
-}
diff --git a/usr.bin/yacc/lalr.c b/usr.bin/yacc/lalr.c
deleted file mode 100644
index 95d87de..0000000
--- a/usr.bin/yacc/lalr.c
+++ /dev/null
@@ -1,713 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)lalr.c 5.3 (Berkeley) 6/1/90";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <limits.h>
-#include <stdlib.h>
-#include "defs.h"
-
-typedef
- struct shorts
- {
- struct shorts *next;
- short value;
- }
- shorts;
-
-int tokensetsize;
-short *lookaheads;
-short *LAruleno;
-unsigned *LA;
-short *accessing_symbol;
-core **state_table;
-shifts **shift_table;
-reductions **reduction_table;
-short *goto_map;
-short *from_state;
-short *to_state;
-
-static void add_lookback_edge(int, int, int);
-static void build_relations(void);
-static void compute_FOLLOWS(void);
-static void compute_lookaheads(void);
-static void digraph(short **);
-static void initialize_F(void);
-static void initialize_LA(void);
-static int map_goto(int, int);
-static void set_accessing_symbol(void);
-static void set_goto_map(void);
-static void set_maxrhs(void);
-static void set_reduction_table(void);
-static void set_shift_table(void);
-static void set_state_table(void);
-static short **transpose(short **, int);
-static void traverse(int, short **);
-
-static int infinity;
-static int maxrhs;
-static int ngotos;
-static unsigned *F;
-static short **includes;
-static shorts **lookback;
-static short *INDEX;
-static short *VERTICES;
-static int top;
-
-
-void
-lalr()
-{
- tokensetsize = WORDSIZE(ntokens);
-
- set_state_table();
- set_accessing_symbol();
- set_shift_table();
- set_reduction_table();
- set_maxrhs();
- initialize_LA();
- set_goto_map();
- initialize_F();
- build_relations();
- compute_FOLLOWS();
- compute_lookaheads();
-}
-
-
-
-static void
-set_state_table()
-{
- core *sp;
-
- state_table = NEW2(nstates, core *);
- for (sp = first_state; sp; sp = sp->next)
- state_table[sp->number] = sp;
-}
-
-
-
-static void
-set_accessing_symbol()
-{
- core *sp;
-
- accessing_symbol = NEW2(nstates, short);
- for (sp = first_state; sp; sp = sp->next)
- accessing_symbol[sp->number] = sp->accessing_symbol;
-}
-
-
-
-static void
-set_shift_table()
-{
- shifts *sp;
-
- shift_table = NEW2(nstates, shifts *);
- for (sp = first_shift; sp; sp = sp->next)
- shift_table[sp->number] = sp;
-}
-
-
-
-static void
-set_reduction_table()
-{
- reductions *rp;
-
- reduction_table = NEW2(nstates, reductions *);
- for (rp = first_reduction; rp; rp = rp->next)
- reduction_table[rp->number] = rp;
-}
-
-
-
-static void
-set_maxrhs()
-{
- short *itemp;
- short *item_end;
- int length;
- int max;
-
- length = 0;
- max = 0;
- item_end = ritem + nitems;
- for (itemp = ritem; itemp < item_end; itemp++)
- {
- if (*itemp >= 0)
- {
- length++;
- }
- else
- {
- if (length > max) max = length;
- length = 0;
- }
- }
-
- maxrhs = max;
-}
-
-
-
-static void
-initialize_LA()
-{
- int i, j, k;
- reductions *rp;
-
- lookaheads = NEW2(nstates + 1, short);
-
- k = 0;
- for (i = 0; i < nstates; i++)
- {
- lookaheads[i] = k;
- rp = reduction_table[i];
- if (rp)
- k += rp->nreds;
- }
- lookaheads[nstates] = k;
-
- LA = NEW2(k * tokensetsize, unsigned);
- LAruleno = NEW2(k, short);
- lookback = NEW2(k, shorts *);
-
- k = 0;
- for (i = 0; i < nstates; i++)
- {
- rp = reduction_table[i];
- if (rp)
- {
- for (j = 0; j < rp->nreds; j++)
- {
- LAruleno[k] = rp->rules[j];
- k++;
- }
- }
- }
-}
-
-
-static void
-set_goto_map()
-{
- shifts *sp;
- int i;
- int symbol;
- int k;
- short *temp_map;
- int state2;
- int state1;
-
- goto_map = NEW2(nvars + 1, short) - ntokens;
- temp_map = NEW2(nvars + 1, short) - ntokens;
-
- ngotos = 0;
- for (sp = first_shift; sp; sp = sp->next)
- {
- for (i = sp->nshifts - 1; i >= 0; i--)
- {
- symbol = accessing_symbol[sp->shift[i]];
-
- if (ISTOKEN(symbol)) break;
-
- if (ngotos == SHRT_MAX)
- fatal("too many gotos");
-
- ngotos++;
- goto_map[symbol]++;
- }
- }
-
- k = 0;
- for (i = ntokens; i < nsyms; i++)
- {
- temp_map[i] = k;
- k += goto_map[i];
- }
-
- for (i = ntokens; i < nsyms; i++)
- goto_map[i] = temp_map[i];
-
- goto_map[nsyms] = ngotos;
- temp_map[nsyms] = ngotos;
-
- from_state = NEW2(ngotos, short);
- to_state = NEW2(ngotos, short);
-
- for (sp = first_shift; sp; sp = sp->next)
- {
- state1 = sp->number;
- for (i = sp->nshifts - 1; i >= 0; i--)
- {
- state2 = sp->shift[i];
- symbol = accessing_symbol[state2];
-
- if (ISTOKEN(symbol)) break;
-
- k = temp_map[symbol]++;
- from_state[k] = state1;
- to_state[k] = state2;
- }
- }
-
- FREE(temp_map + ntokens);
-}
-
-
-
-/* Map_goto maps a state/symbol pair into its numeric representation. */
-
-static int
-map_goto(state, symbol)
-int state;
-int symbol;
-{
- int high;
- int low;
- int middle;
- int s;
-
- low = goto_map[symbol];
- high = goto_map[symbol + 1];
-
- for (;;)
- {
- assert(low <= high);
- middle = (low + high) >> 1;
- s = from_state[middle];
- if (s == state)
- return (middle);
- else if (s < state)
- low = middle + 1;
- else
- high = middle - 1;
- }
-}
-
-
-
-static void
-initialize_F()
-{
- int i;
- int j;
- int k;
- shifts *sp;
- short *edge;
- unsigned *rowp;
- short *rp;
- short **reads;
- int nedges;
- int stateno;
- int symbol;
- int nwords;
-
- nwords = ngotos * tokensetsize;
- F = NEW2(nwords, unsigned);
-
- reads = NEW2(ngotos, short *);
- edge = NEW2(ngotos + 1, short);
- nedges = 0;
-
- rowp = F;
- for (i = 0; i < ngotos; i++)
- {
- stateno = to_state[i];
- sp = shift_table[stateno];
-
- if (sp)
- {
- k = sp->nshifts;
-
- for (j = 0; j < k; j++)
- {
- symbol = accessing_symbol[sp->shift[j]];
- if (ISVAR(symbol))
- break;
- SETBIT(rowp, symbol);
- }
-
- for (; j < k; j++)
- {
- symbol = accessing_symbol[sp->shift[j]];
- if (nullable[symbol])
- edge[nedges++] = map_goto(stateno, symbol);
- }
-
- if (nedges)
- {
- reads[i] = rp = NEW2(nedges + 1, short);
-
- for (j = 0; j < nedges; j++)
- rp[j] = edge[j];
-
- rp[nedges] = -1;
- nedges = 0;
- }
- }
-
- rowp += tokensetsize;
- }
-
- SETBIT(F, 0);
- digraph(reads);
-
- for (i = 0; i < ngotos; i++)
- {
- if (reads[i])
- FREE(reads[i]);
- }
-
- FREE(reads);
- FREE(edge);
-}
-
-
-
-static void
-build_relations()
-{
- int i;
- int j;
- int k;
- short *rulep;
- short *rp;
- shifts *sp;
- int length;
- int nedges;
- int done1;
- int state1;
- int stateno;
- int symbol1;
- int symbol2;
- short *shortp;
- short *edge;
- short *states;
- short **new_includes;
-
- includes = NEW2(ngotos, short *);
- edge = NEW2(ngotos + 1, short);
- states = NEW2(maxrhs + 1, short);
-
- for (i = 0; i < ngotos; i++)
- {
- nedges = 0;
- state1 = from_state[i];
- symbol1 = accessing_symbol[to_state[i]];
-
- for (rulep = derives[symbol1]; *rulep >= 0; rulep++)
- {
- length = 1;
- states[0] = state1;
- stateno = state1;
-
- for (rp = ritem + rrhs[*rulep]; *rp >= 0; rp++)
- {
- symbol2 = *rp;
- sp = shift_table[stateno];
- k = sp->nshifts;
-
- for (j = 0; j < k; j++)
- {
- stateno = sp->shift[j];
- if (accessing_symbol[stateno] == symbol2) break;
- }
-
- states[length++] = stateno;
- }
-
- add_lookback_edge(stateno, *rulep, i);
-
- length--;
- done1 = 0;
- while (!done1)
- {
- done1 = 1;
- rp--;
- if (ISVAR(*rp))
- {
- stateno = states[--length];
- edge[nedges++] = map_goto(stateno, *rp);
- if (nullable[*rp] && length > 0) done1 = 0;
- }
- }
- }
-
- if (nedges)
- {
- includes[i] = shortp = NEW2(nedges + 1, short);
- for (j = 0; j < nedges; j++)
- shortp[j] = edge[j];
- shortp[nedges] = -1;
- }
- }
-
- new_includes = transpose(includes, ngotos);
-
- for (i = 0; i < ngotos; i++)
- if (includes[i])
- FREE(includes[i]);
-
- FREE(includes);
-
- includes = new_includes;
-
- FREE(edge);
- FREE(states);
-}
-
-
-static void
-add_lookback_edge(stateno, ruleno, gotono)
-int stateno, ruleno, gotono;
-{
- int i, k;
- int found;
- shorts *sp;
-
- i = lookaheads[stateno];
- k = lookaheads[stateno + 1];
- found = 0;
- while (!found && i < k)
- {
- if (LAruleno[i] == ruleno)
- found = 1;
- else
- ++i;
- }
- assert(found);
-
- sp = NEW(shorts);
- sp->next = lookback[i];
- sp->value = gotono;
- lookback[i] = sp;
-}
-
-
-
-static short **
-transpose(R, n)
-short **R;
-int n;
-{
- short **new_R;
- short **temp_R;
- short *nedges;
- short *sp;
- int i;
- int k;
-
- nedges = NEW2(n, short);
-
- for (i = 0; i < n; i++)
- {
- sp = R[i];
- if (sp)
- {
- while (*sp >= 0)
- nedges[*sp++]++;
- }
- }
-
- new_R = NEW2(n, short *);
- temp_R = NEW2(n, short *);
-
- for (i = 0; i < n; i++)
- {
- k = nedges[i];
- if (k > 0)
- {
- sp = NEW2(k + 1, short);
- new_R[i] = sp;
- temp_R[i] = sp;
- sp[k] = -1;
- }
- }
-
- FREE(nedges);
-
- for (i = 0; i < n; i++)
- {
- sp = R[i];
- if (sp)
- {
- while (*sp >= 0)
- *temp_R[*sp++]++ = i;
- }
- }
-
- FREE(temp_R);
-
- return (new_R);
-}
-
-
-
-static void
-compute_FOLLOWS()
-{
- digraph(includes);
-}
-
-
-static void
-compute_lookaheads()
-{
- int i, n;
- unsigned *fp1, *fp2, *fp3;
- shorts *sp, *next;
- unsigned *rowp;
-
- rowp = LA;
- n = lookaheads[nstates];
- for (i = 0; i < n; i++)
- {
- fp3 = rowp + tokensetsize;
- for (sp = lookback[i]; sp; sp = sp->next)
- {
- fp1 = rowp;
- fp2 = F + tokensetsize * sp->value;
- while (fp1 < fp3)
- *fp1++ |= *fp2++;
- }
- rowp = fp3;
- }
-
- for (i = 0; i < n; i++)
- for (sp = lookback[i]; sp; sp = next)
- {
- next = sp->next;
- FREE(sp);
- }
-
- FREE(lookback);
- FREE(F);
-}
-
-
-static void
-digraph(relation)
-short **relation;
-{
- int i;
-
- infinity = ngotos + 2;
- INDEX = NEW2(ngotos + 1, short);
- VERTICES = NEW2(ngotos + 1, short);
- top = 0;
-
- for (i = 0; i < ngotos; i++)
- INDEX[i] = 0;
-
- for (i = 0; i < ngotos; i++)
- {
- if (INDEX[i] == 0 && relation[i])
- traverse(i, relation);
- }
-
- FREE(INDEX);
- FREE(VERTICES);
-}
-
-
-
-static void
-traverse(i, R)
-int i;
-short **R;
-{
- unsigned *fp1;
- unsigned *fp2;
- unsigned *fp3;
- int j;
- short *rp;
-
- int height;
- unsigned *base;
-
- VERTICES[++top] = i;
- INDEX[i] = height = top;
-
- base = F + i * tokensetsize;
- fp3 = base + tokensetsize;
-
- rp = R[i];
- if (rp)
- {
- while ((j = *rp++) >= 0)
- {
- if (INDEX[j] == 0)
- traverse(j, R);
-
- if (INDEX[i] > INDEX[j])
- INDEX[i] = INDEX[j];
-
- fp1 = base;
- fp2 = F + j * tokensetsize;
-
- while (fp1 < fp3)
- *fp1++ |= *fp2++;
- }
- }
-
- if (INDEX[i] == height)
- {
- for (;;)
- {
- j = VERTICES[top--];
- INDEX[j] = infinity;
-
- if (i == j)
- break;
-
- fp1 = base;
- fp2 = F + j * tokensetsize;
-
- while (fp1 < fp3)
- *fp2++ = *fp1++;
- }
- }
-}
diff --git a/usr.bin/yacc/lr0.c b/usr.bin/yacc/lr0.c
deleted file mode 100644
index cd8d1a1..0000000
--- a/usr.bin/yacc/lr0.c
+++ /dev/null
@@ -1,677 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)lr0.c 5.3 (Berkeley) 1/20/91";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <limits.h>
-#include <stdlib.h>
-#include "defs.h"
-
-extern short *itemset;
-extern short *itemsetend;
-extern unsigned *ruleset;
-
-int nstates;
-core *first_state;
-shifts *first_shift;
-reductions *first_reduction;
-
-static void allocate_itemsets(void);
-static void allocate_storage(void);
-static void append_states(void);
-static void free_storage(void);
-static void generate_states(void);
-static int get_state(int);
-static void initialize_states(void);
-static void new_itemsets(void);
-static core *new_state(int);
-#ifdef DEBUG
-static void print_derives(void);
-#endif
-static void save_reductions(void);
-static void save_shifts(void);
-static void set_derives(void);
-static void set_nullable(void);
-
-static core **state_set;
-static core *this_state;
-static core *last_state;
-static shifts *last_shift;
-static reductions *last_reduction;
-
-static int nshifts;
-static short *shift_symbol;
-
-static short *redset;
-static short *shiftset;
-
-static short **kernel_base;
-static short **kernel_end;
-static short *kernel_items;
-
-
-static void
-allocate_itemsets()
-{
- short *itemp;
- short *item_end;
- int symbol;
- int i;
- int count;
- int max;
- short *symbol_count;
-
- count = 0;
- symbol_count = NEW2(nsyms, short);
-
- item_end = ritem + nitems;
- for (itemp = ritem; itemp < item_end; itemp++)
- {
- symbol = *itemp;
- if (symbol >= 0)
- {
- count++;
- symbol_count[symbol]++;
- }
- }
-
- kernel_base = NEW2(nsyms, short *);
- kernel_items = NEW2(count, short);
-
- count = 0;
- max = 0;
- for (i = 0; i < nsyms; i++)
- {
- kernel_base[i] = kernel_items + count;
- count += symbol_count[i];
- if (max < symbol_count[i])
- max = symbol_count[i];
- }
-
- shift_symbol = symbol_count;
- kernel_end = NEW2(nsyms, short *);
-}
-
-
-static void
-allocate_storage()
-{
- allocate_itemsets();
- shiftset = NEW2(nsyms, short);
- redset = NEW2(nrules + 1, short);
- state_set = NEW2(nitems, core *);
-}
-
-
-static void
-append_states()
-{
- int i;
- int j;
- int symbol;
-
-#ifdef TRACE
- fprintf(stderr, "Entering append_states()\n");
-#endif
- for (i = 1; i < nshifts; i++)
- {
- symbol = shift_symbol[i];
- j = i;
- while (j > 0 && shift_symbol[j - 1] > symbol)
- {
- shift_symbol[j] = shift_symbol[j - 1];
- j--;
- }
- shift_symbol[j] = symbol;
- }
-
- for (i = 0; i < nshifts; i++)
- {
- symbol = shift_symbol[i];
- shiftset[i] = get_state(symbol);
- }
-}
-
-
-static void
-free_storage()
-{
- FREE(shift_symbol);
- FREE(redset);
- FREE(shiftset);
- FREE(kernel_base);
- FREE(kernel_end);
- FREE(kernel_items);
- FREE(state_set);
-}
-
-
-
-static void
-generate_states()
-{
- allocate_storage();
- itemset = NEW2(nitems, short);
- ruleset = NEW2(WORDSIZE(nrules), unsigned);
- set_first_derives();
- initialize_states();
-
- while (this_state)
- {
- closure(this_state->items, this_state->nitems);
- save_reductions();
- new_itemsets();
- append_states();
-
- if (nshifts > 0)
- save_shifts();
-
- this_state = this_state->next;
- }
-
- finalize_closure();
- free_storage();
-}
-
-
-
-static int
-get_state(symbol)
-int symbol;
-{
- int key;
- short *isp1;
- short *isp2;
- short *iend;
- core *sp;
- int found;
- int n;
-
-#ifdef TRACE
- fprintf(stderr, "Entering get_state(%d)\n", symbol);
-#endif
-
- isp1 = kernel_base[symbol];
- iend = kernel_end[symbol];
- n = iend - isp1;
-
- key = *isp1;
- assert(0 <= key && key < nitems);
- sp = state_set[key];
- if (sp)
- {
- found = 0;
- while (!found)
- {
- if (sp->nitems == n)
- {
- found = 1;
- isp1 = kernel_base[symbol];
- isp2 = sp->items;
-
- while (found && isp1 < iend)
- {
- if (*isp1++ != *isp2++)
- found = 0;
- }
- }
-
- if (!found)
- {
- if (sp->link)
- {
- sp = sp->link;
- }
- else
- {
- sp = sp->link = new_state(symbol);
- found = 1;
- }
- }
- }
- }
- else
- {
- state_set[key] = sp = new_state(symbol);
- }
-
- return (sp->number);
-}
-
-
-
-static void
-initialize_states()
-{
- int i;
- short *start_derives;
- core *p;
-
- start_derives = derives[start_symbol];
- for (i = 0; start_derives[i] >= 0; ++i)
- continue;
-
- p = (core *) MALLOC(sizeof(core) + i*sizeof(short));
- if (p == 0) no_space();
-
- p->next = 0;
- p->link = 0;
- p->number = 0;
- p->accessing_symbol = 0;
- p->nitems = i;
-
- for (i = 0; start_derives[i] >= 0; ++i)
- p->items[i] = rrhs[start_derives[i]];
-
- first_state = last_state = this_state = p;
- nstates = 1;
-}
-
-
-static void
-new_itemsets()
-{
- int i;
- int shiftcount;
- short *isp;
- short *ksp;
- int symbol;
-
- for (i = 0; i < nsyms; i++)
- kernel_end[i] = 0;
-
- shiftcount = 0;
- isp = itemset;
- while (isp < itemsetend)
- {
- i = *isp++;
- symbol = ritem[i];
- if (symbol > 0)
- {
- ksp = kernel_end[symbol];
- if (!ksp)
- {
- shift_symbol[shiftcount++] = symbol;
- ksp = kernel_base[symbol];
- }
-
- *ksp++ = i + 1;
- kernel_end[symbol] = ksp;
- }
- }
-
- nshifts = shiftcount;
-}
-
-
-
-static core *
-new_state(symbol)
-int symbol;
-{
- int n;
- core *p;
- short *isp1;
- short *isp2;
- short *iend;
-
-#ifdef TRACE
- fprintf(stderr, "Entering new_state(%d)\n", symbol);
-#endif
-
- if (nstates >= SHRT_MAX)
- fatal("too many states");
-
- isp1 = kernel_base[symbol];
- iend = kernel_end[symbol];
- n = iend - isp1;
-
- p = (core *) allocate((unsigned) (sizeof(core) + (n - 1) * sizeof(short)));
- p->accessing_symbol = symbol;
- p->number = nstates;
- p->nitems = n;
-
- isp2 = p->items;
- while (isp1 < iend)
- *isp2++ = *isp1++;
-
- last_state->next = p;
- last_state = p;
-
- nstates++;
-
- return (p);
-}
-
-
-#if 0
-/* show_cores is used for debugging */
-
-show_cores()
-{
- core *p;
- int i, j, k, n;
- int itemno;
-
- k = 0;
- for (p = first_state; p; ++k, p = p->next)
- {
- if (k) printf("\n");
- printf("state %d, number = %d, accessing symbol = %s\n",
- k, p->number, symbol_name[p->accessing_symbol]);
- n = p->nitems;
- for (i = 0; i < n; ++i)
- {
- itemno = p->items[i];
- printf("%4d ", itemno);
- j = itemno;
- while (ritem[j] >= 0) ++j;
- printf("%s :", symbol_name[rlhs[-ritem[j]]]);
- j = rrhs[-ritem[j]];
- while (j < itemno)
- printf(" %s", symbol_name[ritem[j++]]);
- printf(" .");
- while (ritem[j] >= 0)
- printf(" %s", symbol_name[ritem[j++]]);
- printf("\n");
- fflush(stdout);
- }
- }
-}
-
-
-/* show_ritems is used for debugging */
-
-show_ritems()
-{
- int i;
-
- for (i = 0; i < nitems; ++i)
- printf("ritem[%d] = %d\n", i, ritem[i]);
-}
-
-
-/* show_rrhs is used for debugging */
-show_rrhs()
-{
- int i;
-
- for (i = 0; i < nrules; ++i)
- printf("rrhs[%d] = %d\n", i, rrhs[i]);
-}
-
-
-/* show_shifts is used for debugging */
-
-show_shifts()
-{
- shifts *p;
- int i, j, k;
-
- k = 0;
- for (p = first_shift; p; ++k, p = p->next)
- {
- if (k) printf("\n");
- printf("shift %d, number = %d, nshifts = %d\n", k, p->number,
- p->nshifts);
- j = p->nshifts;
- for (i = 0; i < j; ++i)
- printf("\t%d\n", p->shift[i]);
- }
-}
-#endif
-
-
-static void
-save_shifts()
-{
- shifts *p;
- short *sp1;
- short *sp2;
- short *send;
-
- p = (shifts *) allocate((unsigned) (sizeof(shifts) +
- (nshifts - 1) * sizeof(short)));
-
- p->number = this_state->number;
- p->nshifts = nshifts;
-
- sp1 = shiftset;
- sp2 = p->shift;
- send = shiftset + nshifts;
-
- while (sp1 < send)
- *sp2++ = *sp1++;
-
- if (last_shift)
- {
- last_shift->next = p;
- last_shift = p;
- }
- else
- {
- first_shift = p;
- last_shift = p;
- }
-}
-
-
-
-static void
-save_reductions()
-{
- short *isp;
- short *rp1;
- short *rp2;
- int item;
- int count;
- reductions *p;
- short *rend;
-
- count = 0;
- for (isp = itemset; isp < itemsetend; isp++)
- {
- item = ritem[*isp];
- if (item < 0)
- {
- redset[count++] = -item;
- }
- }
-
- if (count)
- {
- p = (reductions *) allocate((unsigned) (sizeof(reductions) +
- (count - 1) * sizeof(short)));
-
- p->number = this_state->number;
- p->nreds = count;
-
- rp1 = redset;
- rp2 = p->rules;
- rend = rp1 + count;
-
- while (rp1 < rend)
- *rp2++ = *rp1++;
-
- if (last_reduction)
- {
- last_reduction->next = p;
- last_reduction = p;
- }
- else
- {
- first_reduction = p;
- last_reduction = p;
- }
- }
-}
-
-
-static void
-set_derives()
-{
- int i, k;
- int lhs;
- short *rules;
-
- derives = NEW2(nsyms, short *);
- rules = NEW2(nvars + nrules, short);
-
- k = 0;
- for (lhs = start_symbol; lhs < nsyms; lhs++)
- {
- derives[lhs] = rules + k;
- for (i = 0; i < nrules; i++)
- {
- if (rlhs[i] == lhs)
- {
- rules[k] = i;
- k++;
- }
- }
- rules[k] = -1;
- k++;
- }
-
-#ifdef DEBUG
- print_derives();
-#endif
-}
-
-#if 0
-free_derives()
-{
- FREE(derives[start_symbol]);
- FREE(derives);
-}
-#endif
-
-#ifdef DEBUG
-static void
-print_derives()
-{
- int i;
- short *sp;
-
- printf("\nDERIVES\n\n");
-
- for (i = start_symbol; i < nsyms; i++)
- {
- printf("%s derives ", symbol_name[i]);
- for (sp = derives[i]; *sp >= 0; sp++)
- {
- printf(" %d", *sp);
- }
- putchar('\n');
- }
-
- putchar('\n');
-}
-#endif
-
-
-static void
-set_nullable()
-{
- int i, j;
- int empty;
- int done1;
-
- nullable = MALLOC(nsyms);
- if (nullable == 0) no_space();
-
- for (i = 0; i < nsyms; ++i)
- nullable[i] = 0;
-
- done1 = 0;
- while (!done1)
- {
- done1 = 1;
- for (i = 1; i < nitems; i++)
- {
- empty = 1;
- while ((j = ritem[i]) >= 0)
- {
- if (!nullable[j])
- empty = 0;
- ++i;
- }
- if (empty)
- {
- j = rlhs[-j];
- if (!nullable[j])
- {
- nullable[j] = 1;
- done1 = 0;
- }
- }
- }
- }
-
-#ifdef DEBUG
- for (i = 0; i < nsyms; i++)
- {
- if (nullable[i])
- printf("%s is nullable\n", symbol_name[i]);
- else
- printf("%s is not nullable\n", symbol_name[i]);
- }
-#endif
-}
-
-
-#if 0
-free_nullable()
-{
- FREE(nullable);
-}
-#endif
-
-
-void
-lr0()
-{
- set_derives();
- set_nullable();
- generate_states();
-}
diff --git a/usr.bin/yacc/main.c b/usr.bin/yacc/main.c
deleted file mode 100644
index 474de0b..0000000
--- a/usr.bin/yacc/main.c
+++ /dev/null
@@ -1,443 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)main.c 5.5 (Berkeley) 5/24/93";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <paths.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "defs.h"
-
-char dflag;
-char lflag;
-char rflag;
-char tflag;
-char vflag;
-
-const char *symbol_prefix;
-const char *file_prefix = "y";
-char temp_form[] = "yacc.XXXXXXXXXXX";
-
-int lineno;
-int outline;
-
-char *action_file_name;
-char *code_file_name;
-char *defines_file_name;
-const char *input_file_name = "";
-char *output_file_name;
-char *text_file_name;
-char *union_file_name;
-char *verbose_file_name;
-
-FILE *action_file; /* a temp file, used to save actions associated */
- /* with rules until the parser is written */
-FILE *code_file; /* y.code.c (used when the -r option is specified) */
-FILE *defines_file; /* y.tab.h */
-FILE *input_file; /* the input file */
-FILE *output_file; /* y.tab.c */
-FILE *text_file; /* a temp file, used to save text until all */
- /* symbols have been defined */
-FILE *union_file; /* a temp file, used to save the union */
- /* definition until all symbol have been */
- /* defined */
-FILE *verbose_file; /* y.output */
-
-int nitems;
-int nrules;
-int nsyms;
-int ntokens;
-int nvars;
-
-int start_symbol;
-char **symbol_name;
-short *symbol_value;
-short *symbol_prec;
-char *symbol_assoc;
-
-short *ritem;
-short *rlhs;
-short *rrhs;
-short *rprec;
-char *rassoc;
-short **derives;
-char *nullable;
-
-static void create_file_names(void);
-static void getargs(int, char **);
-static void onintr(int);
-static void open_files(void);
-static void set_signals(void);
-static void usage(void);
-
-volatile sig_atomic_t sigdie;
-
-__dead2 void
-done(k)
-int k;
-{
- if (action_file) { fclose(action_file); unlink(action_file_name); }
- if (text_file) { fclose(text_file); unlink(text_file_name); }
- if (union_file) { fclose(union_file); unlink(union_file_name); }
- if (sigdie) { _exit(k); }
- exit(k);
-}
-
-
-static void
-onintr(signo)
- int signo __unused;
-{
- sigdie = 1;
- done(1);
-}
-
-
-static void
-set_signals()
-{
-#ifdef SIGINT
- if (signal(SIGINT, SIG_IGN) != SIG_IGN)
- signal(SIGINT, onintr);
-#endif
-#ifdef SIGTERM
- if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
- signal(SIGTERM, onintr);
-#endif
-#ifdef SIGHUP
- if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
- signal(SIGHUP, onintr);
-#endif
-}
-
-
-static void
-usage()
-{
- fprintf(stderr, "%s\n%s\n",
- "usage: yacc [-dlrtv] [-b file_prefix] [-o output_filename]",
- " [-p symbol_prefix] filename");
- exit(1);
-}
-
-
-static void
-getargs(argc, argv)
-int argc;
-char *argv[];
-{
- int ch;
-
- while ((ch = getopt(argc, argv, "b:dlo:p:rtv")) != -1)
- {
- switch (ch)
- {
- case 'b':
- file_prefix = optarg;
- break;
-
- case 'd':
- dflag = 1;
- break;
-
- case 'l':
- lflag = 1;
- break;
-
- case 'o':
- output_file_name = optarg;
- break;
-
- case 'p':
- symbol_prefix = optarg;
- break;
-
- case 'r':
- rflag = 1;
- break;
-
- case 't':
- tflag = 1;
- break;
-
- case 'v':
- vflag = 1;
- break;
-
- default:
- usage();
- }
- }
-
- if (optind + 1 != argc)
- usage();
- if (strcmp(argv[optind], "-") == 0)
- input_file = stdin;
- else
- input_file_name = argv[optind];
-}
-
-
-char *
-allocate(n)
-unsigned n;
-{
- char *p;
-
- p = NULL;
- if (n)
- {
- p = CALLOC(1, n);
- if (!p) no_space();
- }
- return (p);
-}
-
-
-static void
-create_file_names()
-{
- int i, len;
- const char *tmpdir;
-
- if (!(tmpdir = getenv("TMPDIR")))
- tmpdir = _PATH_TMP;
-
- len = strlen(tmpdir);
- i = len + strlen(temp_form) + 1;
- if (len && tmpdir[len-1] != '/')
- ++i;
-
- action_file_name = MALLOC(i);
- if (action_file_name == 0) no_space();
- text_file_name = MALLOC(i);
- if (text_file_name == 0) no_space();
- union_file_name = MALLOC(i);
- if (union_file_name == 0) no_space();
-
- strcpy(action_file_name, tmpdir);
- strcpy(text_file_name, tmpdir);
- strcpy(union_file_name, tmpdir);
-
- if (len && tmpdir[len - 1] != '/')
- {
- action_file_name[len] = '/';
- text_file_name[len] = '/';
- union_file_name[len] = '/';
- ++len;
- }
-
- strcpy(action_file_name + len, temp_form);
- strcpy(text_file_name + len, temp_form);
- strcpy(union_file_name + len, temp_form);
-
- action_file_name[len + 5] = 'a';
- text_file_name[len + 5] = 't';
- union_file_name[len + 5] = 'u';
-
- if (output_file_name != 0)
- {
- file_prefix = output_file_name;
- len = strlen(file_prefix);
- }
- else
- {
- len = strlen(file_prefix);
- output_file_name = MALLOC(len + 7);
- if (output_file_name == 0)
- no_space();
- strcpy(output_file_name, file_prefix);
- strcpy(output_file_name + len, OUTPUT_SUFFIX);
- }
-
- if (rflag)
- {
- code_file_name = MALLOC(len + 8);
- if (code_file_name == 0)
- no_space();
- strcpy(code_file_name, file_prefix);
- if (file_prefix == output_file_name)
- {
- /*
- * XXX ".tab.c" here is OUTPUT_SUFFIX, but since its length is
- * in various magic numbers, don't bother using the macro.
- */
- if (len >= 6 && strcmp(code_file_name + len - 6, ".tab.c") == 0)
- strcpy(code_file_name + len - 6, CODE_SUFFIX);
- else if (len >= 2 && strcmp(code_file_name + len - 2, ".c") == 0)
- strcpy(code_file_name + len - 2, CODE_SUFFIX);
- else
- strcpy(code_file_name + len, CODE_SUFFIX);
- }
- else
- strcpy(code_file_name + len, CODE_SUFFIX);
- }
- else
- code_file_name = output_file_name;
-
- if (dflag)
- {
- defines_file_name = MALLOC(len + 7);
- if (defines_file_name == 0)
- no_space();
- strcpy(defines_file_name, file_prefix);
- if (file_prefix == output_file_name)
- {
-#define BISON_DEFINES_SUFFIX ".h"
- if (len >= 2 && strcmp(defines_file_name + len - 2, ".c") == 0)
- strcpy(defines_file_name + len - 2, BISON_DEFINES_SUFFIX);
- else
- strcpy(defines_file_name + len, BISON_DEFINES_SUFFIX);
- }
- else
- strcpy(defines_file_name + len, DEFINES_SUFFIX);
- }
-
- if (vflag)
- {
- verbose_file_name = MALLOC(len + 8);
- if (verbose_file_name == 0)
- no_space();
- strcpy(verbose_file_name, file_prefix);
- if (file_prefix == output_file_name)
- {
- if (len >= 6 && strcmp(verbose_file_name + len - 6, ".tab.c") == 0)
- strcpy(verbose_file_name + len - 6, VERBOSE_SUFFIX);
- else if (len >= 2 && strcmp(verbose_file_name + len - 2, ".c") == 0)
- strcpy(verbose_file_name + len - 2, VERBOSE_SUFFIX);
- else
- strcpy(verbose_file_name + len, VERBOSE_SUFFIX);
- }
- else
- strcpy(verbose_file_name + len, VERBOSE_SUFFIX);
- }
-}
-
-
-static void
-open_files()
-{
- int fd;
-
- create_file_names();
-
- if (input_file == 0)
- {
- input_file = fopen(input_file_name, "r");
- if (input_file == 0)
- open_error(input_file_name);
- }
-
- fd = mkstemp(action_file_name);
- if (fd < 0 || (action_file = fdopen(fd, "w")) == NULL) {
- if (fd >= 0)
- close(fd);
- open_error(action_file_name);
- }
- fd = mkstemp(text_file_name);
- if (fd < 0 || (text_file = fdopen(fd, "w")) == NULL) {
- if (fd >= 0)
- close(fd);
- open_error(text_file_name);
- }
- fd = mkstemp(union_file_name);
- if (fd < 0 || (union_file = fdopen(fd, "w")) == NULL) {
- if (fd >= 0)
- close(fd);
- open_error(union_file_name);
- }
-
- text_file = fopen(text_file_name, "w");
- if (text_file == 0)
- open_error(text_file_name);
-
- if (vflag)
- {
- verbose_file = fopen(verbose_file_name, "w");
- if (verbose_file == 0)
- open_error(verbose_file_name);
- }
-
- if (dflag)
- {
- defines_file = fopen(defines_file_name, "w");
- if (defines_file == 0)
- open_error(defines_file_name);
- union_file = fopen(union_file_name, "w");
- if (union_file == 0)
- open_error(union_file_name);
- }
-
- output_file = fopen(output_file_name, "w");
- if (output_file == 0)
- open_error(output_file_name);
-
- if (rflag)
- {
- code_file = fopen(code_file_name, "w");
- if (code_file == 0)
- open_error(code_file_name);
- }
- else
- code_file = output_file;
-}
-
-
-int
-main(int argc, char *argv[])
-{
- set_signals();
- getargs(argc, argv);
- open_files();
- reader();
- lr0();
- lalr();
- make_parser();
- verbose();
- output();
- done(0);
- /*NOTREACHED*/
- return (0);
-}
diff --git a/usr.bin/yacc/mkpar.c b/usr.bin/yacc/mkpar.c
deleted file mode 100644
index 1dde4dd..0000000
--- a/usr.bin/yacc/mkpar.c
+++ /dev/null
@@ -1,416 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)mkpar.c 5.3 (Berkeley) 1/20/91";
-#endif
-#endif
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-#include "defs.h"
-
-action **parser;
-int SRexpect;
-int SRtotal;
-int RRtotal;
-short *SRconflicts;
-short *RRconflicts;
-short *defred;
-short *rules_used;
-short nunused;
-short final_state;
-
-static int SRcount;
-static int RRcount;
-
-static action *add_reduce(action *, int, int);
-static action *add_reductions(int, action *);
-static void defreds(void);
-static void find_final_state(void);
-static void free_action_row(action *);
-static action *get_shifts(int);
-static action *parse_actions(int);
-static void remove_conflicts(void);
-static int sole_reduction(int);
-static void total_conflicts(void);
-static void unused_rules(void);
-
-
-void
-make_parser()
-{
- int i;
-
- parser = NEW2(nstates, action *);
- for (i = 0; i < nstates; i++)
- parser[i] = parse_actions(i);
-
- find_final_state();
- remove_conflicts();
- unused_rules();
- if (SRtotal + RRtotal > 0) total_conflicts();
- defreds();
-}
-
-
-static action *
-parse_actions(stateno)
-int stateno;
-{
- action *actions;
-
- actions = get_shifts(stateno);
- actions = add_reductions(stateno, actions);
- return (actions);
-}
-
-
-static action *
-get_shifts(stateno)
-int stateno;
-{
- action *actions, *temp;
- shifts *sp;
- short *tostate;
- int i, k;
- int symbol;
-
- actions = 0;
- sp = shift_table[stateno];
- if (sp)
- {
- tostate = sp->shift;
- for (i = sp->nshifts - 1; i >= 0; i--)
- {
- k = tostate[i];
- symbol = accessing_symbol[k];
- if (ISTOKEN(symbol))
- {
- temp = NEW(action);
- temp->next = actions;
- temp->symbol = symbol;
- temp->number = k;
- temp->prec = symbol_prec[symbol];
- temp->action_code = SHIFT;
- temp->assoc = symbol_assoc[symbol];
- actions = temp;
- }
- }
- }
- return (actions);
-}
-
-static action *
-add_reductions(stateno, actions)
-int stateno;
-action *actions;
-{
- int i, j, m, n;
- int ruleno, tokensetsize;
- unsigned *rowp;
-
- tokensetsize = WORDSIZE(ntokens);
- m = lookaheads[stateno];
- n = lookaheads[stateno + 1];
- for (i = m; i < n; i++)
- {
- ruleno = LAruleno[i];
- rowp = LA + i * tokensetsize;
- for (j = ntokens - 1; j >= 0; j--)
- {
- if (BIT(rowp, j))
- actions = add_reduce(actions, ruleno, j);
- }
- }
- return (actions);
-}
-
-
-static action *
-add_reduce(actions, ruleno, symbol)
-action *actions;
-int ruleno, symbol;
-{
- action *temp, *prev, *next;
-
- prev = 0;
- for (next = actions; next && next->symbol < symbol; next = next->next)
- prev = next;
-
- while (next && next->symbol == symbol && next->action_code == SHIFT)
- {
- prev = next;
- next = next->next;
- }
-
- while (next && next->symbol == symbol &&
- next->action_code == REDUCE && next->number < ruleno)
- {
- prev = next;
- next = next->next;
- }
-
- temp = NEW(action);
- temp->next = next;
- temp->symbol = symbol;
- temp->number = ruleno;
- temp->prec = rprec[ruleno];
- temp->action_code = REDUCE;
- temp->assoc = rassoc[ruleno];
-
- if (prev)
- prev->next = temp;
- else
- actions = temp;
-
- return (actions);
-}
-
-
-static void
-find_final_state()
-{
- int goal, i;
- short *tostate;
- shifts *p;
-
- p = shift_table[0];
- tostate = p->shift;
- goal = ritem[1];
- for (i = p->nshifts - 1; i >= 0; --i)
- {
- final_state = tostate[i];
- if (accessing_symbol[final_state] == goal) break;
- }
-}
-
-
-static void
-unused_rules()
-{
- int i;
- action *p;
-
- rules_used = (short *) MALLOC(nrules*sizeof(short));
- if (rules_used == 0) no_space();
-
- for (i = 0; i < nrules; ++i)
- rules_used[i] = 0;
-
- for (i = 0; i < nstates; ++i)
- {
- for (p = parser[i]; p; p = p->next)
- {
- if (p->action_code == REDUCE && p->suppressed == 0)
- rules_used[p->number] = 1;
- }
- }
-
- nunused = 0;
- for (i = 3; i < nrules; ++i)
- if (!rules_used[i]) ++nunused;
-
- if (nunused) {
- if (nunused == 1)
- warnx("1 rule never reduced");
- else
- warnx("%d rules never reduced", nunused);
- }
-}
-
-
-static void
-remove_conflicts()
-{
- int i;
- int symbol;
- action *p, *pref;
-
- pref = NULL;
- SRtotal = 0;
- RRtotal = 0;
- SRconflicts = NEW2(nstates, short);
- RRconflicts = NEW2(nstates, short);
- for (i = 0; i < nstates; i++)
- {
- SRcount = 0;
- RRcount = 0;
- symbol = -1;
- for (p = parser[i]; p; p = p->next)
- {
- if (p->symbol != symbol)
- {
- pref = p;
- symbol = p->symbol;
- }
- else if (i == final_state && symbol == 0)
- {
- SRcount++;
- p->suppressed = 1;
- }
- else if (pref->action_code == SHIFT)
- {
- if (pref->prec > 0 && p->prec > 0)
- {
- if (pref->prec < p->prec)
- {
- pref->suppressed = 2;
- pref = p;
- }
- else if (pref->prec > p->prec)
- {
- p->suppressed = 2;
- }
- else if (pref->assoc == LEFT)
- {
- pref->suppressed = 2;
- pref = p;
- }
- else if (pref->assoc == RIGHT)
- {
- p->suppressed = 2;
- }
- else
- {
- pref->suppressed = 2;
- p->suppressed = 2;
- }
- }
- else
- {
- SRcount++;
- p->suppressed = 1;
- }
- }
- else
- {
- RRcount++;
- p->suppressed = 1;
- }
- }
- SRtotal += SRcount;
- RRtotal += RRcount;
- SRconflicts[i] = SRcount;
- RRconflicts[i] = RRcount;
- }
-}
-
-
-static void
-total_conflicts()
-{
- /* Warn if s/r != expect or if any r/r */
- if ((SRtotal != SRexpect) || RRtotal)
- {
- if (SRtotal == 1)
- warnx("1 shift/reduce conflict");
- else if (SRtotal > 1)
- warnx("%d shift/reduce conflicts", SRtotal);
- }
-
- if (RRtotal == 1)
- warnx("1 reduce/reduce conflict");
- else if (RRtotal > 1)
- warnx("%d reduce/reduce conflicts", RRtotal);
-}
-
-
-static int
-sole_reduction(stateno)
-int stateno;
-{
- int count, ruleno;
- action *p;
-
- count = 0;
- ruleno = 0;
- for (p = parser[stateno]; p; p = p->next)
- {
- if (p->action_code == SHIFT && p->suppressed == 0)
- return (0);
- else if (p->action_code == REDUCE && p->suppressed == 0)
- {
- if (ruleno > 0 && p->number != ruleno)
- return (0);
- if (p->symbol != 1)
- ++count;
- ruleno = p->number;
- }
- }
-
- if (count == 0)
- return (0);
- return (ruleno);
-}
-
-
-static void
-defreds()
-{
- int i;
-
- defred = NEW2(nstates, short);
- for (i = 0; i < nstates; i++)
- defred[i] = sole_reduction(i);
-}
-
-static void
-free_action_row(p)
-action *p;
-{
- action *q;
-
- while (p)
- {
- q = p->next;
- FREE(p);
- p = q;
- }
-}
-
-void
-free_parser()
-{
- int i;
-
- for (i = 0; i < nstates; i++)
- free_action_row(parser[i]);
-
- FREE(parser);
-}
diff --git a/usr.bin/yacc/output.c b/usr.bin/yacc/output.c
deleted file mode 100644
index b0b520a..0000000
--- a/usr.bin/yacc/output.c
+++ /dev/null
@@ -1,1352 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)output.c 5.7 (Berkeley) 5/24/93";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-#include "defs.h"
-
-static int nvectors;
-static int nentries;
-static short **froms;
-static short **tos;
-static short *tally;
-static short *width;
-static short *state_count;
-static short *order;
-static short *base;
-static short *pos;
-static int maxtable;
-static short *table;
-static short *check;
-static int lowzero;
-static int high;
-
-static int default_goto(int);
-static void free_itemsets(void);
-static void free_reductions(void);
-static void free_shifts(void);
-static void goto_actions(void);
-static int is_C_identifier(char *);
-static int matching_vector(int);
-static void output_actions(void);
-static void output_base(void);
-static void output_check(void);
-static void output_debug(void);
-static void output_defines(void);
-static void output_prefix(void);
-static void output_rule_data(void);
-static void output_semantic_actions(void);
-static void output_stored_text(void);
-static void output_stype(void);
-static void output_table(void);
-static void output_trailing_text(void);
-static void output_yydefred(void);
-static void pack_table(void);
-static int pack_vector(int);
-static void save_column(int, int);
-static void sort_actions(void);
-static void token_actions(void);
-static int increase_maxtable(int);
-
-static const char line_format[] = "#line %d \"%s\"\n";
-
-
-void
-output()
-{
- free_itemsets();
- free_shifts();
- free_reductions();
- output_prefix();
- output_stored_text();
- output_defines();
- output_rule_data();
- output_yydefred();
- output_actions();
- free_parser();
- output_debug();
- output_stype();
- if (rflag) write_section(tables);
- write_section(header);
- output_trailing_text();
- write_section(body);
- output_semantic_actions();
- write_section(trailer);
-}
-
-
-static void
-output_prefix()
-{
- if (symbol_prefix == NULL)
- symbol_prefix = "yy";
- else
- {
- ++outline;
- fprintf(code_file, "#define yyparse %sparse\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yylex %slex\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyerror %serror\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yychar %schar\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyval %sval\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yylval %slval\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yydebug %sdebug\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yynerrs %snerrs\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyerrflag %serrflag\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyss %sss\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyssp %sssp\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyvs %svs\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyvsp %svsp\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yylhs %slhs\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yylen %slen\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yydefred %sdefred\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yydgoto %sdgoto\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yysindex %ssindex\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyrindex %srindex\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yygindex %sgindex\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yytable %stable\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yycheck %scheck\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyname %sname\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yyrule %srule\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yysslim %ssslim\n", symbol_prefix);
- ++outline;
- fprintf(code_file, "#define yystacksize %sstacksize\n", symbol_prefix);
- }
- ++outline;
- fprintf(code_file, "#define YYPREFIX \"%s\"\n", symbol_prefix);
-}
-
-
-static void
-output_rule_data()
-{
- int i;
- int j;
-
-
- fprintf(output_file, "const short %slhs[] = {%42d,", symbol_prefix,
- symbol_value[start_symbol]);
-
- j = 10;
- for (i = 3; i < nrules; i++)
- {
- if (j >= 10)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 1;
- }
- else
- ++j;
-
- fprintf(output_file, "%5d,", symbol_value[rlhs[i]]);
- }
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\n");
-
- fprintf(output_file, "const short %slen[] = {%42d,", symbol_prefix, 2);
-
- j = 10;
- for (i = 3; i < nrules; i++)
- {
- if (j >= 10)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 1;
- }
- else
- j++;
-
- fprintf(output_file, "%5d,", rrhs[i + 1] - rrhs[i] - 1);
- }
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\n");
-}
-
-
-static void
-output_yydefred()
-{
- int i, j;
-
- fprintf(output_file, "const short %sdefred[] = {%39d,", symbol_prefix,
- (defred[0] ? defred[0] - 2 : 0));
-
- j = 10;
- for (i = 1; i < nstates; i++)
- {
- if (j < 10)
- ++j;
- else
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 1;
- }
-
- fprintf(output_file, "%5d,", (defred[i] ? defred[i] - 2 : 0));
- }
-
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\n");
-}
-
-
-static void
-output_actions()
-{
- nvectors = 2*nstates + nvars;
-
- froms = NEW2(nvectors, short *);
- tos = NEW2(nvectors, short *);
- tally = NEW2(nvectors, short);
- width = NEW2(nvectors, short);
-
- token_actions();
- FREE(lookaheads);
- FREE(LA);
- FREE(LAruleno);
- FREE(accessing_symbol);
-
- goto_actions();
- FREE(goto_map + ntokens);
- FREE(from_state);
- FREE(to_state);
-
- sort_actions();
- pack_table();
- output_base();
- output_table();
- output_check();
-}
-
-
-static void
-token_actions()
-{
- int i, j;
- int shiftcount, reducecount;
- int max, min;
- short *actionrow, *r, *s;
- action *p;
-
- actionrow = NEW2(2*ntokens, short);
- for (i = 0; i < nstates; ++i)
- {
- if (parser[i])
- {
- for (j = 0; j < 2*ntokens; ++j)
- actionrow[j] = 0;
-
- shiftcount = 0;
- reducecount = 0;
- for (p = parser[i]; p; p = p->next)
- {
- if (p->suppressed == 0)
- {
- if (p->action_code == SHIFT)
- {
- ++shiftcount;
- actionrow[p->symbol] = p->number;
- }
- else if (p->action_code == REDUCE && p->number != defred[i])
- {
- ++reducecount;
- actionrow[p->symbol + ntokens] = p->number;
- }
- }
- }
-
- tally[i] = shiftcount;
- tally[nstates+i] = reducecount;
- width[i] = 0;
- width[nstates+i] = 0;
- if (shiftcount > 0)
- {
- froms[i] = r = NEW2(shiftcount, short);
- tos[i] = s = NEW2(shiftcount, short);
- min = SHRT_MAX;
- max = 0;
- for (j = 0; j < ntokens; ++j)
- {
- if (actionrow[j])
- {
- if (min > symbol_value[j])
- min = symbol_value[j];
- if (max < symbol_value[j])
- max = symbol_value[j];
- *r++ = symbol_value[j];
- *s++ = actionrow[j];
- }
- }
- width[i] = max - min + 1;
- }
- if (reducecount > 0)
- {
- froms[nstates+i] = r = NEW2(reducecount, short);
- tos[nstates+i] = s = NEW2(reducecount, short);
- min = SHRT_MAX;
- max = 0;
- for (j = 0; j < ntokens; ++j)
- {
- if (actionrow[ntokens+j])
- {
- if (min > symbol_value[j])
- min = symbol_value[j];
- if (max < symbol_value[j])
- max = symbol_value[j];
- *r++ = symbol_value[j];
- *s++ = actionrow[ntokens+j] - 2;
- }
- }
- width[nstates+i] = max - min + 1;
- }
- }
- }
- FREE(actionrow);
-}
-
-static void
-goto_actions()
-{
- int i, j, k;
-
- state_count = NEW2(nstates, short);
-
- k = default_goto(start_symbol + 1);
- fprintf(output_file, "const short %sdgoto[] = {%40d,", symbol_prefix, k);
- save_column(start_symbol + 1, k);
-
- j = 10;
- for (i = start_symbol + 2; i < nsyms; i++)
- {
- if (j >= 10)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 1;
- }
- else
- ++j;
-
- k = default_goto(i);
- fprintf(output_file, "%5d,", k);
- save_column(i, k);
- }
-
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\n");
- FREE(state_count);
-}
-
-static int
-default_goto(symbol)
-int symbol;
-{
- int i;
- int m;
- int n;
- int default_state;
- int max;
-
- m = goto_map[symbol];
- n = goto_map[symbol + 1];
-
- if (m == n) return (0);
-
- for (i = 0; i < nstates; i++)
- state_count[i] = 0;
-
- for (i = m; i < n; i++)
- state_count[to_state[i]]++;
-
- max = 0;
- default_state = 0;
- for (i = 0; i < nstates; i++)
- {
- if (state_count[i] > max)
- {
- max = state_count[i];
- default_state = i;
- }
- }
-
- return (default_state);
-}
-
-
-
-static void
-save_column(symbol, default_state)
-int symbol;
-int default_state;
-{
- int i;
- int m;
- int n;
- short *sp;
- short *sp1;
- short *sp2;
- int count;
- int symno;
-
- m = goto_map[symbol];
- n = goto_map[symbol + 1];
-
- count = 0;
- for (i = m; i < n; i++)
- {
- if (to_state[i] != default_state)
- ++count;
- }
- if (count == 0) return;
-
- symno = symbol_value[symbol] + 2*nstates;
-
- froms[symno] = sp1 = sp = NEW2(count, short);
- tos[symno] = sp2 = NEW2(count, short);
-
- for (i = m; i < n; i++)
- {
- if (to_state[i] != default_state)
- {
- *sp1++ = from_state[i];
- *sp2++ = to_state[i];
- }
- }
-
- tally[symno] = count;
- width[symno] = sp1[-1] - sp[0] + 1;
-}
-
-static void
-sort_actions()
-{
- int i;
- int j;
- int k;
- int t;
- int w;
-
- order = NEW2(nvectors, short);
- nentries = 0;
-
- for (i = 0; i < nvectors; i++)
- {
- if (tally[i] > 0)
- {
- t = tally[i];
- w = width[i];
- j = nentries - 1;
-
- while (j >= 0 && (width[order[j]] < w))
- j--;
-
- while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
- j--;
-
- for (k = nentries - 1; k > j; k--)
- order[k + 1] = order[k];
-
- order[j + 1] = i;
- nentries++;
- }
- }
-}
-
-
-static void
-pack_table()
-{
- int i;
- int place;
- int state;
-
- base = NEW2(nvectors, short);
- pos = NEW2(nentries, short);
-
- maxtable = 10000;
- table = NEW2(maxtable, short);
- check = NEW2(maxtable, short);
-
- lowzero = 0;
- high = 0;
-
- for (i = 0; i < maxtable; i++)
- check[i] = -1;
-
- for (i = 0; i < nentries; i++)
- {
- state = matching_vector(i);
-
- if (state < 0)
- place = pack_vector(i);
- else
- place = base[state];
-
- pos[i] = place;
- base[order[i]] = place;
- }
-
- for (i = 0; i < nvectors; i++)
- {
- if (froms[i])
- FREE(froms[i]);
- if (tos[i])
- FREE(tos[i]);
- }
-
- FREE(froms);
- FREE(tos);
- FREE(pos);
-}
-
-
-/* The function matching_vector determines if the vector specified by */
-/* the input parameter matches a previously considered vector. The */
-/* test at the start of the function checks if the vector represents */
-/* a row of shifts over terminal symbols or a row of reductions, or a */
-/* column of shifts over a nonterminal symbol. Berkeley Yacc does not */
-/* check if a column of shifts over a nonterminal symbols matches a */
-/* previously considered vector. Because of the nature of LR parsing */
-/* tables, no two columns can match. Therefore, the only possible */
-/* match would be between a row and a column. Such matches are */
-/* unlikely. Therefore, to save time, no attempt is made to see if a */
-/* column matches a previously considered vector. */
-/* */
-/* Matching_vector is poorly designed. The test could easily be made */
-/* faster. Also, it depends on the vectors being in a specific */
-/* order. */
-
-static int
-matching_vector(vector)
-int vector;
-{
- int i;
- int j;
- int k;
- int t;
- int w;
- int match;
- int prev;
-
- i = order[vector];
- if (i >= 2*nstates)
- return (-1);
-
- t = tally[i];
- w = width[i];
-
- for (prev = vector - 1; prev >= 0; prev--)
- {
- j = order[prev];
- if (width[j] != w || tally[j] != t)
- return (-1);
-
- match = 1;
- for (k = 0; match && k < t; k++)
- {
- if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
- match = 0;
- }
-
- if (match)
- return (j);
- }
-
- return (-1);
-}
-
-
-
-static int
-pack_vector(vector)
-int vector;
-{
- int i, j, k;
- int t;
- int loc;
- int ok;
- short *from;
- short *to;
-
- loc = 0;
- i = order[vector];
- t = tally[i];
- assert(t);
-
- from = froms[i];
- to = tos[i];
-
- j = lowzero - from[0];
- for (k = 1; k < t; ++k)
- if (lowzero - from[k] > j)
- j = lowzero - from[k];
- for (;; ++j)
- {
- if (j == 0)
- continue;
- ok = 1;
- for (k = 0; ok && k < t; k++)
- {
- loc = j + from[k];
- if (loc >= maxtable)
- {
- if (loc >= MAXTABLE)
- fatal("maximum table size exceeded");
- maxtable = increase_maxtable(loc);
- }
-
- if (check[loc] != -1)
- ok = 0;
- }
- for (k = 0; ok && k < vector; k++)
- {
- if (pos[k] == j)
- ok = 0;
- }
- if (ok)
- {
- for (k = 0; k < t; k++)
- {
- loc = j + from[k];
- table[loc] = to[k];
- check[loc] = from[k];
- if (loc > high) high = loc;
- }
-
- while (check[lowzero] != -1)
- {
- if (lowzero >= maxtable)
- {
- if (lowzero >= MAXTABLE)
- {
- fatal("maximum table size exceeded in check\n");
- }
-
- maxtable = increase_maxtable(loc);
- }
-
- ++lowzero;
- }
-
- return (j);
- }
- }
-}
-
-
-
-static void
-output_base()
-{
- int i, j;
-
- fprintf(output_file, "const short %ssindex[] = {%39d,", symbol_prefix,
- base[0]);
-
- j = 10;
- for (i = 1; i < nstates; i++)
- {
- if (j >= 10)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 1;
- }
- else
- ++j;
-
- fprintf(output_file, "%5d,", base[i]);
- }
-
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\nconst short %srindex[] = {%39d,", symbol_prefix,
- base[nstates]);
-
- j = 10;
- for (i = nstates + 1; i < 2*nstates; i++)
- {
- if (j >= 10)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 1;
- }
- else
- ++j;
-
- fprintf(output_file, "%5d,", base[i]);
- }
-
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\nconst short %sgindex[] = {%39d,", symbol_prefix,
- base[2*nstates]);
-
- j = 10;
- for (i = 2*nstates + 1; i < nvectors - 1; i++)
- {
- if (j >= 10)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 1;
- }
- else
- ++j;
-
- fprintf(output_file, "%5d,", base[i]);
- }
-
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\n");
- FREE(base);
-}
-
-
-
-static void
-output_table()
-{
- int i;
- int j;
-
- ++outline;
- fprintf(code_file, "#define YYTABLESIZE %d\n", high);
- fprintf(output_file, "const short %stable[] = {%40d,", symbol_prefix,
- table[0]);
-
- j = 10;
- for (i = 1; i <= high; i++)
- {
- if (j >= 10)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 1;
- }
- else
- ++j;
-
- fprintf(output_file, "%5d,", table[i]);
- }
-
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\n");
- FREE(table);
-}
-
-
-
-static void
-output_check()
-{
- int i;
- int j;
-
- fprintf(output_file, "const short %scheck[] = {%40d,", symbol_prefix,
- check[0]);
-
- j = 10;
- for (i = 1; i <= high; i++)
- {
- if (j >= 10)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 1;
- }
- else
- ++j;
-
- fprintf(output_file, "%5d,", check[i]);
- }
-
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\n");
- FREE(check);
-}
-
-
-static int
-is_C_identifier(name)
-char *name;
-{
- char *s;
- int c;
-
- s = name;
- c = *s;
- if (c == '"')
- {
- c = *++s;
- if (!isalpha(c) && c != '_' && c != '$')
- return (0);
- while ((c = *++s) != '"')
- {
- if (!isalnum(c) && c != '_' && c != '$')
- return (0);
- }
- return (1);
- }
-
- if (!isalpha(c) && c != '_' && c != '$')
- return (0);
- while ((c = *++s))
- {
- if (!isalnum(c) && c != '_' && c != '$')
- return (0);
- }
- return (1);
-}
-
-
-static void
-output_defines()
-{
- int c, i;
- char *s;
-
- ++outline;
- fprintf(code_file, "#define YYERRCODE %d\n", symbol_value[1]);
-
- if(dflag)
- {
- fprintf(defines_file, "#ifndef YYERRCODE\n");
- fprintf(defines_file, "#define YYERRCODE %d\n", symbol_value[1]);
- fprintf(defines_file, "#endif\n\n");
- }
- for (i = 2; i < ntokens; ++i)
- {
- s = symbol_name[i];
- if (is_C_identifier(s))
- {
- fprintf(code_file, "#define ");
- if (dflag) fprintf(defines_file, "#define ");
- c = *s;
- if (c == '"')
- {
- while ((c = *++s) != '"')
- {
- putc(c, code_file);
- if (dflag) putc(c, defines_file);
- }
- }
- else
- {
- do
- {
- putc(c, code_file);
- if (dflag) putc(c, defines_file);
- }
- while ((c = *++s));
- }
- ++outline;
- fprintf(code_file, " %d\n", symbol_value[i]);
- if (dflag) fprintf(defines_file, " %d\n", symbol_value[i]);
- }
- }
-
- if (dflag && unionized)
- {
- fclose(union_file);
- union_file = fopen(union_file_name, "r");
- if (union_file == NULL) open_error(union_file_name);
- while ((c = getc(union_file)) != EOF)
- putc(c, defines_file);
- fprintf(defines_file, " YYSTYPE;\nextern YYSTYPE %slval;\n",
- symbol_prefix);
- }
-}
-
-
-static void
-output_stored_text()
-{
- int c;
- FILE *in, *out;
-
- fclose(text_file);
- text_file = fopen(text_file_name, "r");
- if (text_file == NULL)
- open_error(text_file_name);
- in = text_file;
- if ((c = getc(in)) == EOF)
- return;
- out = code_file;
- if (c == '\n')
- ++outline;
- putc(c, out);
- while ((c = getc(in)) != EOF)
- {
- if (c == '\n')
- ++outline;
- putc(c, out);
- }
- if (!lflag)
- fprintf(out, line_format, ++outline + 1, code_file_name);
-}
-
-
-static void
-output_debug()
-{
- int i, j, k, max;
- char **symnam, *s;
- static char eof[] = "end-of-file";
-
- ++outline;
- fprintf(code_file, "#define YYFINAL %d\n", final_state);
- outline += 3;
- fprintf(code_file, "#ifndef YYDEBUG\n#define YYDEBUG %d\n#endif\n",
- tflag);
- if (rflag)
- fprintf(output_file, "#ifndef YYDEBUG\n#define YYDEBUG %d\n#endif\n",
- tflag);
-
- max = 0;
- for (i = 2; i < ntokens; ++i)
- if (symbol_value[i] > max)
- max = symbol_value[i];
- ++outline;
- fprintf(code_file, "#define YYMAXTOKEN %d\n", max);
-
- symnam = (char **) MALLOC((max+1)*sizeof(char *));
- if (symnam == 0) no_space();
-
- /* Note that it is not necessary to initialize the element */
- /* symnam[max]. */
- for (i = 0; i < max; ++i)
- symnam[i] = 0;
- for (i = ntokens - 1; i >= 2; --i)
- symnam[symbol_value[i]] = symbol_name[i];
- symnam[0] = eof;
-
- if (!rflag) ++outline;
- fprintf(output_file, "#if YYDEBUG\n");
- fprintf(output_file, "const char * const %sname[] = {", symbol_prefix);
- j = 80;
- for (i = 0; i <= max; ++i)
- {
- if ((s = symnam[i]))
- {
- if (s[0] == '"')
- {
- k = 7;
- while (*++s != '"')
- {
- ++k;
- if (*s == '\\')
- {
- k += 2;
- if (*++s == '\\')
- ++k;
- }
- }
- j += k;
- if (j > 80)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = k;
- }
- fprintf(output_file, "\"\\\"");
- s = symnam[i];
- while (*++s != '"')
- {
- if (*s == '\\')
- {
- fprintf(output_file, "\\\\");
- if (*++s == '\\')
- fprintf(output_file, "\\\\");
- else
- putc(*s, output_file);
- }
- else
- putc(*s, output_file);
- }
- fprintf(output_file, "\\\"\",");
- }
- else if (s[0] == '\'')
- {
- if (s[1] == '"')
- {
- j += 7;
- if (j > 80)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 7;
- }
- fprintf(output_file, "\"'\\\"'\",");
- }
- else
- {
- k = 5;
- while (*++s != '\'')
- {
- ++k;
- if (*s == '\\')
- {
- k += 2;
- if (*++s == '\\')
- ++k;
- }
- }
- j += k;
- if (j > 80)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = k;
- }
- fprintf(output_file, "\"'");
- s = symnam[i];
- while (*++s != '\'')
- {
- if (*s == '\\')
- {
- fprintf(output_file, "\\\\");
- if (*++s == '\\')
- fprintf(output_file, "\\\\");
- else
- putc(*s, output_file);
- }
- else
- putc(*s, output_file);
- }
- fprintf(output_file, "'\",");
- }
- }
- else
- {
- k = strlen(s) + 3;
- j += k;
- if (j > 80)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = k;
- }
- putc('"', output_file);
- do { putc(*s, output_file); } while (*++s);
- fprintf(output_file, "\",");
- }
- }
- else
- {
- j += 2;
- if (j > 80)
- {
- if (!rflag) ++outline;
- putc('\n', output_file);
- j = 2;
- }
- fprintf(output_file, "0,");
- }
- }
- if (!rflag) outline += 2;
- fprintf(output_file, "\n};\n");
- FREE(symnam);
-
- if (!rflag) ++outline;
- fprintf(output_file, "const char * const %srule[] = {\n", symbol_prefix);
- for (i = 2; i < nrules; ++i)
- {
- fprintf(output_file, "\"%s :", symbol_name[rlhs[i]]);
- for (j = rrhs[i]; ritem[j] > 0; ++j)
- {
- s = symbol_name[ritem[j]];
- if (s[0] == '"')
- {
- fprintf(output_file, " \\\"");
- while (*++s != '"')
- {
- if (*s == '\\')
- {
- if (s[1] == '\\')
- fprintf(output_file, "\\\\\\\\");
- else
- fprintf(output_file, "\\\\%c", s[1]);
- ++s;
- }
- else
- putc(*s, output_file);
- }
- fprintf(output_file, "\\\"");
- }
- else if (s[0] == '\'')
- {
- if (s[1] == '"')
- fprintf(output_file, " '\\\"'");
- else if (s[1] == '\\')
- {
- if (s[2] == '\\')
- fprintf(output_file, " '\\\\\\\\");
- else
- fprintf(output_file, " '\\\\%c", s[2]);
- s += 2;
- while (*++s != '\'')
- putc(*s, output_file);
- putc('\'', output_file);
- }
- else
- fprintf(output_file, " '%c'", s[1]);
- }
- else
- fprintf(output_file, " %s", s);
- }
- if (!rflag) ++outline;
- fprintf(output_file, "\",\n");
- }
-
- if (!rflag) outline += 2;
- fprintf(output_file, "};\n#endif\n");
-}
-
-
-static void
-output_stype()
-{
- if (!unionized && ntags == 0)
- {
- outline += 3;
- fprintf(code_file, "#ifndef YYSTYPE\ntypedef int YYSTYPE;\n#endif\n");
- }
-}
-
-
-static void
-output_trailing_text()
-{
- int c, last;
- FILE *in, *out;
-
- if (line == 0)
- return;
-
- in = input_file;
- out = code_file;
- c = *cptr;
- if (c == '\n')
- {
- ++lineno;
- if ((c = getc(in)) == EOF)
- return;
- if (!lflag)
- {
- ++outline;
- fprintf(out, line_format, lineno, input_file_name);
- }
- if (c == '\n')
- ++outline;
- putc(c, out);
- last = c;
- }
- else
- {
- if (!lflag)
- {
- ++outline;
- fprintf(out, line_format, lineno, input_file_name);
- }
- do { putc(c, out); } while ((c = *++cptr) != '\n');
- ++outline;
- putc('\n', out);
- last = '\n';
- }
-
- while ((c = getc(in)) != EOF)
- {
- if (c == '\n')
- ++outline;
- putc(c, out);
- last = c;
- }
-
- if (last != '\n')
- {
- ++outline;
- putc('\n', out);
- }
- if (!lflag)
- fprintf(out, line_format, ++outline + 1, code_file_name);
-}
-
-
-static void
-output_semantic_actions()
-{
- int c, last;
- FILE *out;
-
- fclose(action_file);
- action_file = fopen(action_file_name, "r");
- if (action_file == NULL)
- open_error(action_file_name);
-
- if ((c = getc(action_file)) == EOF)
- return;
-
- out = code_file;
- last = c;
- if (c == '\n')
- ++outline;
- putc(c, out);
- while ((c = getc(action_file)) != EOF)
- {
- if (c == '\n')
- ++outline;
- putc(c, out);
- last = c;
- }
-
- if (last != '\n')
- {
- ++outline;
- putc('\n', out);
- }
-
- if (!lflag)
- fprintf(out, line_format, ++outline + 1, code_file_name);
-}
-
-
-static void
-free_itemsets()
-{
- core *cp, *next;
-
- FREE(state_table);
- for (cp = first_state; cp; cp = next)
- {
- next = cp->next;
- FREE(cp);
- }
-}
-
-
-static void
-free_shifts()
-{
- shifts *sp, *next;
-
- FREE(shift_table);
- for (sp = first_shift; sp; sp = next)
- {
- next = sp->next;
- FREE(sp);
- }
-}
-
-
-
-static void
-free_reductions()
-{
- reductions *rp, *next;
-
- FREE(reduction_table);
- for (rp = first_reduction; rp; rp = next)
- {
- next = rp->next;
- FREE(rp);
- }
-}
-
-/*
- * increase_maxtable
- *
- * inputs - loc location in table
- * output - size increased to
- * side effects - table is increase by at least 200 short words
- */
-
-static int
-increase_maxtable(int loc)
-{
- int newmax;
- int l;
-
- newmax = maxtable;
-
- do { newmax += 200; } while (newmax <= loc);
- table = (short *) REALLOC(table, newmax*sizeof(short));
- if (table == 0) no_space();
- check = (short *) REALLOC(check, newmax*sizeof(short));
- if (check == 0) no_space();
- for (l = maxtable; l < newmax; ++l)
- {
- table[l] = 0;
- check[l] = -1;
- }
-
- return(newmax);
-}
diff --git a/usr.bin/yacc/reader.c b/usr.bin/yacc/reader.c
deleted file mode 100644
index 7c1132d..0000000
--- a/usr.bin/yacc/reader.c
+++ /dev/null
@@ -1,1935 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)reader.c 5.7 (Berkeley) 1/20/91";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-#include "defs.h"
-
-/* The line size must be a positive integer. One hundred was chosen */
-/* because few lines in Yacc input grammars exceed 100 characters. */
-/* Note that if a line exceeds LINESIZE characters, the line buffer */
-/* will be expanded to accomodate it. */
-
-#define LINESIZE 100
-
-char *cache;
-int cinc, cache_size;
-
-int ntags, tagmax;
-char **tag_table;
-
-char saw_eof, unionized;
-char *cptr, *line;
-int linesize;
-
-bucket *goal;
-int prec;
-int gensym;
-char last_was_action;
-
-int maxitems;
-bucket **pitem;
-
-int maxrules;
-bucket **plhs;
-
-int name_pool_size;
-char *name_pool;
-
-static const char line_format[] = "#line %d \"%s\"\n";
-
-static void add_symbol(void);
-static void advance_to_start(void);
-static void cachec(int);
-static void check_symbols(void);
-static void copy_action(void);
-static void copy_ident(void);
-static void copy_text(void);
-static void copy_union(void);
-static void declare_expect(int);
-static void declare_start(void);
-static void declare_tokens(int);
-static void declare_types(void);
-static char *dup_line(void);
-static void end_rule(void);
-static void expand_items(void);
-static void expand_rules(void);
-static void free_tags(void);
-static void get_line(void);
-static bucket *get_literal(void);
-static bucket *get_name(void);
-static int get_number(void);
-static char *get_tag(void);
-static int hexval(int);
-static void initialize_grammar(void);
-static void insert_empty_rule(void);
-static int is_reserved(char *);
-static int keyword(void);
-static int mark_symbol(void);
-static int nextc(void);
-static void pack_grammar(void);
-static void pack_names(void);
-static void pack_symbols(void);
-static void print_grammar(void);
-static void read_declarations(void);
-static void read_grammar(void);
-static void skip_comment(void);
-static void start_rule(bucket *, int);
-
-static void
-cachec(c)
-int c;
-{
- assert(cinc >= 0);
- if (cinc >= cache_size)
- {
- cache_size += 256;
- cache = REALLOC(cache, cache_size);
- if (cache == 0) no_space();
- }
- cache[cinc] = c;
- ++cinc;
-}
-
-
-static void
-get_line()
-{
- FILE *f = input_file;
- int c;
- int i;
-
- if (saw_eof || (c = getc(f)) == EOF)
- {
- if (line) { FREE(line); line = 0; }
- cptr = 0;
- saw_eof = 1;
- return;
- }
-
- if (line == 0 || linesize != (LINESIZE + 1))
- {
- if (line) FREE(line);
- linesize = LINESIZE + 1;
- line = MALLOC(linesize);
- if (line == 0) no_space();
- }
-
- i = 0;
- ++lineno;
- for (;;)
- {
- line[i] = c;
- if (c == '\n') { cptr = line; return; }
- if (++i >= linesize)
- {
- linesize += LINESIZE;
- line = REALLOC(line, linesize);
- if (line == 0) no_space();
- }
- c = getc(f);
- if (c == EOF)
- {
- line[i] = '\n';
- saw_eof = 1;
- cptr = line;
- return;
- }
- }
-}
-
-
-static char *
-dup_line()
-{
- char *p, *s, *t;
-
- if (line == 0) return (0);
- s = line;
- while (*s != '\n') ++s;
- p = MALLOC(s - line + 1);
- if (p == 0) no_space();
-
- s = line;
- t = p;
- while ((*t++ = *s++) != '\n') continue;
- return (p);
-}
-
-
-static void
-skip_comment()
-{
- char *s;
-
- int st_lineno = lineno;
- char *st_line = dup_line();
- char *st_cptr = st_line + (cptr - line);
-
- s = cptr + 2;
- for (;;)
- {
- if (*s == '*' && s[1] == '/')
- {
- cptr = s + 2;
- FREE(st_line);
- return;
- }
- if (*s == '\n')
- {
- get_line();
- if (line == 0)
- unterminated_comment(st_lineno, st_line, st_cptr);
- s = cptr;
- }
- else
- ++s;
- }
-}
-
-
-static int
-nextc()
-{
- char *s;
-
- if (line == 0)
- {
- get_line();
- if (line == 0)
- return (EOF);
- }
-
- s = cptr;
- for (;;)
- {
- switch (*s)
- {
- case '\n':
- get_line();
- if (line == 0) return (EOF);
- s = cptr;
- break;
-
- case ' ':
- case '\t':
- case '\f':
- case '\r':
- case '\v':
- case ',':
- case ';':
- ++s;
- break;
-
- case '\\':
- cptr = s;
- return ('%');
-
- case '/':
- if (s[1] == '*')
- {
- cptr = s;
- skip_comment();
- s = cptr;
- break;
- }
- else if (s[1] == '/')
- {
- get_line();
- if (line == 0) return (EOF);
- s = cptr;
- break;
- }
- /* FALLTHROUGH */
-
- default:
- cptr = s;
- return (*s);
- }
- }
-}
-
-
-static int
-keyword()
-{
- int c;
- char *t_cptr = cptr;
-
- c = *++cptr;
- if (isalpha(c))
- {
- cinc = 0;
- for (;;)
- {
- if (isalpha(c))
- {
- if (isupper(c)) c = tolower(c);
- cachec(c);
- }
- else if (isdigit(c) || c == '_' || c == '.' || c == '$')
- cachec(c);
- else
- break;
- c = *++cptr;
- }
- cachec(NUL);
-
- if (strcmp(cache, "token") == 0 || strcmp(cache, "term") == 0)
- return (TOKEN);
- if (strcmp(cache, "type") == 0)
- return (TYPE);
- if (strcmp(cache, "left") == 0)
- return (LEFT);
- if (strcmp(cache, "right") == 0)
- return (RIGHT);
- if (strcmp(cache, "nonassoc") == 0 || strcmp(cache, "binary") == 0)
- return (NONASSOC);
- if (strcmp(cache, "start") == 0)
- return (START);
- if (strcmp(cache, "union") == 0)
- return (UNION);
- if (strcmp(cache, "ident") == 0)
- return (IDENT);
- if (strcmp(cache, "expect") == 0)
- return (EXPECT);
- }
- else
- {
- ++cptr;
- if (c == '{')
- return (TEXT);
- if (c == '%' || c == '\\')
- return (MARK);
- if (c == '<')
- return (LEFT);
- if (c == '>')
- return (RIGHT);
- if (c == '0')
- return (TOKEN);
- if (c == '2')
- return (NONASSOC);
- }
- syntax_error(lineno, line, t_cptr);
- /*NOTREACHED*/
- return (0);
-}
-
-
-static void
-copy_ident()
-{
- int c;
- FILE *f = output_file;
-
- c = nextc();
- if (c == EOF) unexpected_EOF();
- if (c != '"') syntax_error(lineno, line, cptr);
- ++outline;
- fprintf(f, "#ident \"");
- for (;;)
- {
- c = *++cptr;
- if (c == '\n')
- {
- fprintf(f, "\"\n");
- return;
- }
- putc(c, f);
- if (c == '"')
- {
- putc('\n', f);
- ++cptr;
- return;
- }
- }
-}
-
-
-static void
-copy_text()
-{
- int c;
- int quote;
- FILE *f = text_file;
- int need_newline = 0;
- int t_lineno = lineno;
- char *t_line = dup_line();
- char *t_cptr = t_line + (cptr - line - 2);
-
- if (*cptr == '\n')
- {
- get_line();
- if (line == 0)
- unterminated_text(t_lineno, t_line, t_cptr);
- }
- if (!lflag) fprintf(f, line_format, lineno, input_file_name);
-
-loop:
- c = *cptr++;
- switch (c)
- {
- case '\n':
- next_line:
- putc('\n', f);
- need_newline = 0;
- get_line();
- if (line) goto loop;
- unterminated_text(t_lineno, t_line, t_cptr);
-
- case '\'':
- case '"':
- {
- int s_lineno = lineno;
- char *s_line = dup_line();
- char *s_cptr = s_line + (cptr - line - 1);
-
- quote = c;
- putc(c, f);
- for (;;)
- {
- c = *cptr++;
- putc(c, f);
- if (c == quote)
- {
- need_newline = 1;
- FREE(s_line);
- goto loop;
- }
- if (c == '\n')
- unterminated_string(s_lineno, s_line, s_cptr);
- if (c == '\\')
- {
- c = *cptr++;
- putc(c, f);
- if (c == '\n')
- {
- get_line();
- if (line == 0)
- unterminated_string(s_lineno, s_line, s_cptr);
- }
- }
- }
- }
-
- case '/':
- putc(c, f);
- need_newline = 1;
- c = *cptr;
- if (c == '/')
- {
- putc('*', f);
- while ((c = *++cptr) != '\n')
- {
- if (c == '*' && cptr[1] == '/')
- fprintf(f, "* ");
- else
- putc(c, f);
- }
- fprintf(f, "*/");
- goto next_line;
- }
- if (c == '*')
- {
- int c_lineno = lineno;
- char *c_line = dup_line();
- char *c_cptr = c_line + (cptr - line - 1);
-
- putc('*', f);
- ++cptr;
- for (;;)
- {
- c = *cptr++;
- putc(c, f);
- if (c == '*' && *cptr == '/')
- {
- putc('/', f);
- ++cptr;
- FREE(c_line);
- goto loop;
- }
- if (c == '\n')
- {
- get_line();
- if (line == 0)
- unterminated_comment(c_lineno, c_line, c_cptr);
- }
- }
- }
- need_newline = 1;
- goto loop;
-
- case '%':
- case '\\':
- if (*cptr == '}')
- {
- if (need_newline) putc('\n', f);
- ++cptr;
- FREE(t_line);
- return;
- }
- /* FALLTHROUGH */
-
- default:
- putc(c, f);
- need_newline = 1;
- goto loop;
- }
-}
-
-
-static void
-copy_union()
-{
- int c;
- int quote;
- int depth;
- int u_lineno = lineno;
- char *u_line = dup_line();
- char *u_cptr = u_line + (cptr - line - 6);
-
- if (unionized) over_unionized(cptr - 6);
- unionized = 1;
-
- if (!lflag)
- fprintf(text_file, line_format, lineno, input_file_name);
-
- fprintf(text_file, "typedef union");
- if (dflag) fprintf(union_file, "typedef union");
-
- depth = 0;
-loop:
- c = *cptr++;
- putc(c, text_file);
- if (dflag) putc(c, union_file);
- switch (c)
- {
- case '\n':
- next_line:
- get_line();
- if (line == 0) unterminated_union(u_lineno, u_line, u_cptr);
- goto loop;
-
- case '{':
- ++depth;
- goto loop;
-
- case '}':
- if (--depth == 0)
- {
- fprintf(text_file, " YYSTYPE;\n");
- FREE(u_line);
- return;
- }
- goto loop;
-
- case '\'':
- case '"':
- {
- int s_lineno = lineno;
- char *s_line = dup_line();
- char *s_cptr = s_line + (cptr - line - 1);
-
- quote = c;
- for (;;)
- {
- c = *cptr++;
- putc(c, text_file);
- if (dflag) putc(c, union_file);
- if (c == quote)
- {
- FREE(s_line);
- goto loop;
- }
- if (c == '\n')
- unterminated_string(s_lineno, s_line, s_cptr);
- if (c == '\\')
- {
- c = *cptr++;
- putc(c, text_file);
- if (dflag) putc(c, union_file);
- if (c == '\n')
- {
- get_line();
- if (line == 0)
- unterminated_string(s_lineno, s_line, s_cptr);
- }
- }
- }
- }
-
- case '/':
- c = *cptr;
- if (c == '/')
- {
- putc('*', text_file);
- if (dflag) putc('*', union_file);
- while ((c = *++cptr) != '\n')
- {
- if (c == '*' && cptr[1] == '/')
- {
- fprintf(text_file, "* ");
- if (dflag) fprintf(union_file, "* ");
- }
- else
- {
- putc(c, text_file);
- if (dflag) putc(c, union_file);
- }
- }
- fprintf(text_file, "*/\n");
- if (dflag) fprintf(union_file, "*/\n");
- goto next_line;
- }
- if (c == '*')
- {
- int c_lineno = lineno;
- char *c_line = dup_line();
- char *c_cptr = c_line + (cptr - line - 1);
-
- putc('*', text_file);
- if (dflag) putc('*', union_file);
- ++cptr;
- for (;;)
- {
- c = *cptr++;
- putc(c, text_file);
- if (dflag) putc(c, union_file);
- if (c == '*' && *cptr == '/')
- {
- putc('/', text_file);
- if (dflag) putc('/', union_file);
- ++cptr;
- FREE(c_line);
- goto loop;
- }
- if (c == '\n')
- {
- get_line();
- if (line == 0)
- unterminated_comment(c_lineno, c_line, c_cptr);
- }
- }
- }
- goto loop;
-
- default:
- goto loop;
- }
-}
-
-
-static int
-hexval(c)
-int c;
-{
- if (c >= '0' && c <= '9')
- return (c - '0');
- if (c >= 'A' && c <= 'F')
- return (c - 'A' + 10);
- if (c >= 'a' && c <= 'f')
- return (c - 'a' + 10);
- return (-1);
-}
-
-
-static bucket *
-get_literal()
-{
- int c, quote;
- int i;
- int n;
- char *s;
- bucket *bp;
- int s_lineno = lineno;
- char *s_line = dup_line();
- char *s_cptr = s_line + (cptr - line);
-
- quote = *cptr++;
- cinc = 0;
- for (;;)
- {
- c = *cptr++;
- if (c == quote) break;
- if (c == '\n') unterminated_string(s_lineno, s_line, s_cptr);
- if (c == '\\')
- {
- char *c_cptr = cptr - 1;
-
- c = *cptr++;
- switch (c)
- {
- case '\n':
- get_line();
- if (line == 0) unterminated_string(s_lineno, s_line, s_cptr);
- continue;
-
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- n = c - '0';
- c = *cptr;
- if (IS_OCTAL(c))
- {
- n = (n << 3) + (c - '0');
- c = *++cptr;
- if (IS_OCTAL(c))
- {
- n = (n << 3) + (c - '0');
- ++cptr;
- }
- }
- if (n > UCHAR_MAX) illegal_character(c_cptr);
- c = n;
- break;
-
- case 'x':
- c = *cptr++;
- n = hexval(c);
- if (n < 0 || n >= 16)
- illegal_character(c_cptr);
- for (;;)
- {
- c = *cptr;
- i = hexval(c);
- if (i < 0 || i >= 16) break;
- ++cptr;
- n = (n << 4) + i;
- if (n > UCHAR_MAX) illegal_character(c_cptr);
- }
- c = n;
- break;
-
- case 'a': c = 7; break;
- case 'b': c = '\b'; break;
- case 'f': c = '\f'; break;
- case 'n': c = '\n'; break;
- case 'r': c = '\r'; break;
- case 't': c = '\t'; break;
- case 'v': c = '\v'; break;
- }
- }
- cachec(c);
- }
- FREE(s_line);
-
- n = cinc;
- s = MALLOC(n);
- if (s == 0) no_space();
-
- for (i = 0; i < n; ++i)
- s[i] = cache[i];
-
- cinc = 0;
- if (n == 1)
- cachec('\'');
- else
- cachec('"');
-
- for (i = 0; i < n; ++i)
- {
- c = ((unsigned char *)s)[i];
- if (c == '\\' || c == cache[0])
- {
- cachec('\\');
- cachec(c);
- }
- else if (isprint(c))
- cachec(c);
- else
- {
- cachec('\\');
- switch (c)
- {
- case 7: cachec('a'); break;
- case '\b': cachec('b'); break;
- case '\f': cachec('f'); break;
- case '\n': cachec('n'); break;
- case '\r': cachec('r'); break;
- case '\t': cachec('t'); break;
- case '\v': cachec('v'); break;
- default:
- cachec(((c >> 6) & 7) + '0');
- cachec(((c >> 3) & 7) + '0');
- cachec((c & 7) + '0');
- break;
- }
- }
- }
-
- if (n == 1)
- cachec('\'');
- else
- cachec('"');
-
- cachec(NUL);
- bp = lookup(cache);
- bp->class = TERM;
- if (n == 1 && bp->value == UNDEFINED)
- bp->value = *(unsigned char *)s;
- FREE(s);
-
- return (bp);
-}
-
-
-static int
-is_reserved(name)
-char *name;
-{
- char *s;
-
- if (strcmp(name, ".") == 0 ||
- strcmp(name, "$accept") == 0 ||
- strcmp(name, "$end") == 0)
- return (1);
-
- if (name[0] == '$' && name[1] == '$' && isdigit(name[2]))
- {
- s = name + 3;
- while (isdigit(*s)) ++s;
- if (*s == NUL) return (1);
- }
-
- return (0);
-}
-
-
-static bucket *
-get_name()
-{
- int c;
-
- cinc = 0;
- for (c = *cptr; IS_IDENT(c); c = *++cptr)
- cachec(c);
- cachec(NUL);
-
- if (is_reserved(cache)) used_reserved(cache);
-
- return (lookup(cache));
-}
-
-
-static int
-get_number()
-{
- int c;
- int n;
-
- n = 0;
- for (c = *cptr; isdigit(c); c = *++cptr)
- n = 10*n + (c - '0');
-
- return (n);
-}
-
-
-static char *
-get_tag()
-{
- int c;
- int i;
- char *s;
- int t_lineno = lineno;
- char *t_line = dup_line();
- char *t_cptr = t_line + (cptr - line);
-
- ++cptr;
- c = nextc();
- if (c == EOF) unexpected_EOF();
- if (!isalpha(c) && c != '_' && c != '$')
- illegal_tag(t_lineno, t_line, t_cptr);
-
- cinc = 0;
- do { cachec(c); c = *++cptr; } while (IS_IDENT(c));
- cachec(NUL);
-
- c = nextc();
- if (c == EOF) unexpected_EOF();
- if (c != '>')
- illegal_tag(t_lineno, t_line, t_cptr);
- ++cptr;
-
- for (i = 0; i < ntags; ++i)
- {
- if (strcmp(cache, tag_table[i]) == 0)
- return (tag_table[i]);
- }
-
- if (ntags >= tagmax)
- {
- tagmax += 16;
- tag_table = (char **)
- (tag_table ? REALLOC(tag_table, tagmax*sizeof(char *))
- : MALLOC(tagmax*sizeof(char *)));
- if (tag_table == 0) no_space();
- }
-
- s = MALLOC(cinc);
- if (s == 0) no_space();
- strcpy(s, cache);
- tag_table[ntags] = s;
- ++ntags;
- FREE(t_line);
- return (s);
-}
-
-
-static void
-declare_tokens(assoc)
-int assoc;
-{
- int c;
- bucket *bp;
- int value;
- char *tag = 0;
-
- if (assoc != TOKEN) ++prec;
-
- c = nextc();
- if (c == EOF) unexpected_EOF();
- if (c == '<')
- {
- tag = get_tag();
- c = nextc();
- if (c == EOF) unexpected_EOF();
- }
-
- for (;;)
- {
- if (isalpha(c) || c == '_' || c == '.' || c == '$')
- bp = get_name();
- else if (c == '\'' || c == '"')
- bp = get_literal();
- else
- return;
-
- if (bp == goal) tokenized_start(bp->name);
- bp->class = TERM;
-
- if (tag)
- {
- if (bp->tag && tag != bp->tag)
- retyped_warning(bp->name);
- bp->tag = tag;
- }
-
- if (assoc != TOKEN)
- {
- if (bp->prec && prec != bp->prec)
- reprec_warning(bp->name);
- bp->assoc = assoc;
- bp->prec = prec;
- }
-
- c = nextc();
- if (c == EOF) unexpected_EOF();
- value = UNDEFINED;
- if (isdigit(c))
- {
- value = get_number();
- if (bp->value != UNDEFINED && value != bp->value)
- revalued_warning(bp->name);
- bp->value = value;
- c = nextc();
- if (c == EOF) unexpected_EOF();
- }
- }
-}
-
-
-/*
- * %expect requires special handling
- * as it really isn't part of the yacc
- * grammar only a flag for yacc proper.
- */
-static void
-declare_expect(assoc)
-int assoc;
-{
- int c;
-
- if (assoc != EXPECT) ++prec;
-
- /*
- * Stay away from nextc - doesn't
- * detect EOL and will read to EOF.
- */
- c = *++cptr;
- if (c == EOF) unexpected_EOF();
-
- for(;;)
- {
- if (isdigit(c))
- {
- SRexpect = get_number();
- break;
- }
- /*
- * Looking for number before EOL.
- * Spaces, tabs, and numbers are ok,
- * words, punc., etc. are syntax errors.
- */
- else if (c == '\n' || isalpha(c) || !isspace(c))
- {
- syntax_error(lineno, line, cptr);
- }
- else
- {
- c = *++cptr;
- if (c == EOF) unexpected_EOF();
- }
- }
-}
-
-
-static void
-declare_types()
-{
- int c;
- bucket *bp;
- char *tag;
-
- c = nextc();
- if (c == EOF) unexpected_EOF();
- if (c != '<') syntax_error(lineno, line, cptr);
- tag = get_tag();
-
- for (;;)
- {
- c = nextc();
- if (isalpha(c) || c == '_' || c == '.' || c == '$')
- bp = get_name();
- else if (c == '\'' || c == '"')
- bp = get_literal();
- else
- return;
-
- if (bp->tag && tag != bp->tag)
- retyped_warning(bp->name);
- bp->tag = tag;
- }
-}
-
-
-static void
-declare_start()
-{
- int c;
- bucket *bp;
-
- c = nextc();
- if (c == EOF) unexpected_EOF();
- if (!isalpha(c) && c != '_' && c != '.' && c != '$')
- syntax_error(lineno, line, cptr);
- bp = get_name();
- if (bp->class == TERM)
- terminal_start(bp->name);
- if (goal && goal != bp)
- restarted_warning();
- goal = bp;
-}
-
-
-static void
-read_declarations()
-{
- int c, k;
-
- cache_size = 256;
- cache = MALLOC(cache_size);
- if (cache == 0) no_space();
-
- for (;;)
- {
- c = nextc();
- if (c == EOF) unexpected_EOF();
- if (c != '%') syntax_error(lineno, line, cptr);
- switch (k = keyword())
- {
- case MARK:
- return;
-
- case IDENT:
- copy_ident();
- break;
-
- case TEXT:
- copy_text();
- break;
-
- case UNION:
- copy_union();
- break;
-
- case TOKEN:
- case LEFT:
- case RIGHT:
- case NONASSOC:
- declare_tokens(k);
- break;
-
- case EXPECT:
- declare_expect(k);
- break;
-
- case TYPE:
- declare_types();
- break;
-
- case START:
- declare_start();
- break;
- }
- }
-}
-
-
-static void
-initialize_grammar()
-{
- nitems = 4;
- maxitems = 300;
- pitem = (bucket **) MALLOC(maxitems*sizeof(bucket *));
- if (pitem == 0) no_space();
- pitem[0] = 0;
- pitem[1] = 0;
- pitem[2] = 0;
- pitem[3] = 0;
-
- nrules = 3;
- maxrules = 100;
- plhs = (bucket **) MALLOC(maxrules*sizeof(bucket *));
- if (plhs == 0) no_space();
- plhs[0] = 0;
- plhs[1] = 0;
- plhs[2] = 0;
- rprec = (short *) MALLOC(maxrules*sizeof(short));
- if (rprec == 0) no_space();
- rprec[0] = 0;
- rprec[1] = 0;
- rprec[2] = 0;
- rassoc = (char *) MALLOC(maxrules*sizeof(char));
- if (rassoc == 0) no_space();
- rassoc[0] = TOKEN;
- rassoc[1] = TOKEN;
- rassoc[2] = TOKEN;
-}
-
-
-static void
-expand_items()
-{
- maxitems += 300;
- pitem = (bucket **) REALLOC(pitem, maxitems*sizeof(bucket *));
- if (pitem == 0) no_space();
-}
-
-
-static void
-expand_rules()
-{
- maxrules += 100;
- plhs = (bucket **) REALLOC(plhs, maxrules*sizeof(bucket *));
- if (plhs == 0) no_space();
- rprec = (short *) REALLOC(rprec, maxrules*sizeof(short));
- if (rprec == 0) no_space();
- rassoc = (char *) REALLOC(rassoc, maxrules*sizeof(char));
- if (rassoc == 0) no_space();
-}
-
-
-static void
-advance_to_start()
-{
- int c;
- bucket *bp;
- char *s_cptr;
- int s_lineno;
-
- for (;;)
- {
- c = nextc();
- if (c != '%') break;
- s_cptr = cptr;
- switch (keyword())
- {
- case MARK:
- no_grammar();
-
- case TEXT:
- copy_text();
- break;
-
- case START:
- declare_start();
- break;
-
- default:
- syntax_error(lineno, line, s_cptr);
- }
- }
-
- c = nextc();
- if (!isalpha(c) && c != '_' && c != '.' && c != '_')
- syntax_error(lineno, line, cptr);
- bp = get_name();
- if (goal == 0)
- {
- if (bp->class == TERM)
- terminal_start(bp->name);
- goal = bp;
- }
-
- s_lineno = lineno;
- c = nextc();
- if (c == EOF) unexpected_EOF();
- if (c != ':') syntax_error(lineno, line, cptr);
- start_rule(bp, s_lineno);
- ++cptr;
-}
-
-
-static void
-start_rule(bp, s_lineno)
-bucket *bp;
-int s_lineno;
-{
- if (bp->class == TERM)
- terminal_lhs(s_lineno);
- bp->class = NONTERM;
- if (nrules >= maxrules)
- expand_rules();
- plhs[nrules] = bp;
- rprec[nrules] = UNDEFINED;
- rassoc[nrules] = TOKEN;
-}
-
-
-static void
-end_rule()
-{
- int i;
-
- if (!last_was_action && plhs[nrules]->tag)
- {
- for (i = nitems - 1; pitem[i]; --i) continue;
- if (pitem[i+1] == 0 || pitem[i+1]->tag != plhs[nrules]->tag)
- default_action_warning();
- }
-
- last_was_action = 0;
- if (nitems >= maxitems) expand_items();
- pitem[nitems] = 0;
- ++nitems;
- ++nrules;
-}
-
-
-static void
-insert_empty_rule()
-{
- bucket *bp, **bpp;
-
- assert(cache);
- sprintf(cache, "$$%d", ++gensym);
- bp = make_bucket(cache);
- last_symbol->next = bp;
- last_symbol = bp;
- bp->tag = plhs[nrules]->tag;
- bp->class = NONTERM;
-
- if ((nitems += 2) > maxitems)
- expand_items();
- bpp = pitem + nitems - 1;
- *bpp-- = bp;
- while ((bpp[0] = bpp[-1])) --bpp;
-
- if (++nrules >= maxrules)
- expand_rules();
- plhs[nrules] = plhs[nrules-1];
- plhs[nrules-1] = bp;
- rprec[nrules] = rprec[nrules-1];
- rprec[nrules-1] = 0;
- rassoc[nrules] = rassoc[nrules-1];
- rassoc[nrules-1] = TOKEN;
-}
-
-
-static void
-add_symbol()
-{
- int c;
- bucket *bp;
- int s_lineno = lineno;
-
- c = *cptr;
- if (c == '\'' || c == '"')
- bp = get_literal();
- else
- bp = get_name();
-
- c = nextc();
- if (c == ':')
- {
- end_rule();
- start_rule(bp, s_lineno);
- ++cptr;
- return;
- }
-
- if (last_was_action)
- insert_empty_rule();
- last_was_action = 0;
-
- if (++nitems > maxitems)
- expand_items();
- pitem[nitems-1] = bp;
-}
-
-
-static void
-copy_action()
-{
- int c;
- int i, n;
- int depth;
- int quote;
- char *tag;
- FILE *f = action_file;
- int a_lineno = lineno;
- char *a_line = dup_line();
- char *a_cptr = a_line + (cptr - line);
-
- if (last_was_action)
- insert_empty_rule();
- last_was_action = 1;
-
- fprintf(f, "case %d:\n", nrules - 2);
- if (!lflag)
- fprintf(f, line_format, lineno, input_file_name);
- if (*cptr == '=') ++cptr;
-
- n = 0;
- for (i = nitems - 1; pitem[i]; --i) ++n;
-
- depth = 0;
-loop:
- c = *cptr;
- if (c == '$')
- {
- if (cptr[1] == '<')
- {
- int d_lineno = lineno;
- char *d_line = dup_line();
- char *d_cptr = d_line + (cptr - line);
-
- ++cptr;
- tag = get_tag();
- c = *cptr;
- if (c == '$')
- {
- fprintf(f, "yyval.%s", tag);
- ++cptr;
- FREE(d_line);
- goto loop;
- }
- else if (isdigit(c))
- {
- i = get_number();
- if (i > n) dollar_warning(d_lineno, i);
- fprintf(f, "yyvsp[%d].%s", i - n, tag);
- FREE(d_line);
- goto loop;
- }
- else if (c == '-' && isdigit(cptr[1]))
- {
- ++cptr;
- i = -get_number() - n;
- fprintf(f, "yyvsp[%d].%s", i, tag);
- FREE(d_line);
- goto loop;
- }
- else
- dollar_error(d_lineno, d_line, d_cptr);
- }
- else if (cptr[1] == '$')
- {
- if (ntags)
- {
- tag = plhs[nrules]->tag;
- if (tag == 0) untyped_lhs();
- fprintf(f, "yyval.%s", tag);
- }
- else
- fprintf(f, "yyval");
- cptr += 2;
- goto loop;
- }
- else if (isdigit(cptr[1]))
- {
- ++cptr;
- i = get_number();
- if (ntags)
- {
- if (i <= 0 || i > n)
- unknown_rhs(i);
- tag = pitem[nitems + i - n - 1]->tag;
- if (tag == 0) untyped_rhs(i, pitem[nitems + i - n - 1]->name);
- fprintf(f, "yyvsp[%d].%s", i - n, tag);
- }
- else
- {
- if (i > n)
- dollar_warning(lineno, i);
- fprintf(f, "yyvsp[%d]", i - n);
- }
- goto loop;
- }
- else if (cptr[1] == '-')
- {
- cptr += 2;
- i = get_number();
- if (ntags)
- unknown_rhs(-i);
- fprintf(f, "yyvsp[%d]", -i - n);
- goto loop;
- }
- }
- if (isalpha(c) || c == '_' || c == '$')
- {
- do
- {
- putc(c, f);
- c = *++cptr;
- } while (isalnum(c) || c == '_' || c == '$');
- goto loop;
- }
- putc(c, f);
- ++cptr;
- switch (c)
- {
- case '\n':
- next_line:
- get_line();
- if (line) goto loop;
- unterminated_action(a_lineno, a_line, a_cptr);
-
- case ';':
- if (depth > 0) goto loop;
- fprintf(f, "\nbreak;\n");
- return;
-
- case '{':
- ++depth;
- goto loop;
-
- case '}':
- if (--depth > 0) goto loop;
- fprintf(f, "\nbreak;\n");
- return;
-
- case '\'':
- case '"':
- {
- int s_lineno = lineno;
- char *s_line = dup_line();
- char *s_cptr = s_line + (cptr - line - 1);
-
- quote = c;
- for (;;)
- {
- c = *cptr++;
- putc(c, f);
- if (c == quote)
- {
- FREE(s_line);
- goto loop;
- }
- if (c == '\n')
- unterminated_string(s_lineno, s_line, s_cptr);
- if (c == '\\')
- {
- c = *cptr++;
- putc(c, f);
- if (c == '\n')
- {
- get_line();
- if (line == 0)
- unterminated_string(s_lineno, s_line, s_cptr);
- }
- }
- }
- }
-
- case '/':
- c = *cptr;
- if (c == '/')
- {
- putc('*', f);
- while ((c = *++cptr) != '\n')
- {
- if (c == '*' && cptr[1] == '/')
- fprintf(f, "* ");
- else
- putc(c, f);
- }
- fprintf(f, "*/\n");
- goto next_line;
- }
- if (c == '*')
- {
- int c_lineno = lineno;
- char *c_line = dup_line();
- char *c_cptr = c_line + (cptr - line - 1);
-
- putc('*', f);
- ++cptr;
- for (;;)
- {
- c = *cptr++;
- putc(c, f);
- if (c == '*' && *cptr == '/')
- {
- putc('/', f);
- ++cptr;
- FREE(c_line);
- goto loop;
- }
- if (c == '\n')
- {
- get_line();
- if (line == 0)
- unterminated_comment(c_lineno, c_line, c_cptr);
- }
- }
- }
- goto loop;
-
- default:
- goto loop;
- }
-}
-
-
-static int
-mark_symbol()
-{
- int c;
- bucket *bp = NULL;
-
- c = cptr[1];
- if (c == '%' || c == '\\')
- {
- cptr += 2;
- return (1);
- }
-
- if (c == '=')
- cptr += 2;
- else if ((c == 'p' || c == 'P') &&
- ((c = cptr[2]) == 'r' || c == 'R') &&
- ((c = cptr[3]) == 'e' || c == 'E') &&
- ((c = cptr[4]) == 'c' || c == 'C') &&
- ((c = cptr[5], !IS_IDENT(c))))
- cptr += 5;
- else
- syntax_error(lineno, line, cptr);
-
- c = nextc();
- if (isalpha(c) || c == '_' || c == '.' || c == '$')
- bp = get_name();
- else if (c == '\'' || c == '"')
- bp = get_literal();
- else
- {
- syntax_error(lineno, line, cptr);
- /*NOTREACHED*/
- }
-
- if (rprec[nrules] != UNDEFINED && bp->prec != rprec[nrules])
- prec_redeclared();
-
- rprec[nrules] = bp->prec;
- rassoc[nrules] = bp->assoc;
- return (0);
-}
-
-
-static void
-read_grammar()
-{
- int c;
-
- initialize_grammar();
- advance_to_start();
-
- for (;;)
- {
- c = nextc();
- if (c == EOF) break;
- if (isalpha(c) || c == '_' || c == '.' || c == '$' || c == '\'' ||
- c == '"')
- add_symbol();
- else if (c == '{' || c == '=')
- copy_action();
- else if (c == '|')
- {
- end_rule();
- start_rule(plhs[nrules-1], 0);
- ++cptr;
- }
- else if (c == '%')
- {
- if (mark_symbol()) break;
- }
- else
- syntax_error(lineno, line, cptr);
- }
- end_rule();
-}
-
-
-static void
-free_tags()
-{
- int i;
-
- if (tag_table == 0) return;
-
- for (i = 0; i < ntags; ++i)
- {
- assert(tag_table[i]);
- FREE(tag_table[i]);
- }
- FREE(tag_table);
-}
-
-
-static void
-pack_names()
-{
- bucket *bp;
- char *p, *s, *t;
-
- name_pool_size = 13; /* 13 == sizeof("$end") + sizeof("$accept") */
- for (bp = first_symbol; bp; bp = bp->next)
- name_pool_size += strlen(bp->name) + 1;
- name_pool = MALLOC(name_pool_size);
- if (name_pool == 0) no_space();
-
- strcpy(name_pool, "$accept");
- strcpy(name_pool+8, "$end");
- t = name_pool + 13;
- for (bp = first_symbol; bp; bp = bp->next)
- {
- p = t;
- s = bp->name;
- while ((*t++ = *s++)) continue;
- FREE(bp->name);
- bp->name = p;
- }
-}
-
-
-static void
-check_symbols()
-{
- bucket *bp;
-
- if (goal->class == UNKNOWN)
- undefined_goal(goal->name);
-
- for (bp = first_symbol; bp; bp = bp->next)
- {
- if (bp->class == UNKNOWN)
- {
- undefined_symbol_warning(bp->name);
- bp->class = TERM;
- }
- }
-}
-
-
-static void
-pack_symbols()
-{
- bucket *bp;
- bucket **v;
- int i, j, k, n;
-
- nsyms = 2;
- ntokens = 1;
- for (bp = first_symbol; bp; bp = bp->next)
- {
- ++nsyms;
- if (bp->class == TERM) ++ntokens;
- }
- start_symbol = ntokens;
- nvars = nsyms - ntokens;
-
- symbol_name = (char **) MALLOC(nsyms*sizeof(char *));
- if (symbol_name == 0) no_space();
- symbol_value = (short *) MALLOC(nsyms*sizeof(short));
- if (symbol_value == 0) no_space();
- symbol_prec = (short *) MALLOC(nsyms*sizeof(short));
- if (symbol_prec == 0) no_space();
- symbol_assoc = MALLOC(nsyms);
- if (symbol_assoc == 0) no_space();
-
- v = (bucket **) MALLOC(nsyms*sizeof(bucket *));
- if (v == 0) no_space();
-
- v[0] = 0;
- v[start_symbol] = 0;
-
- i = 1;
- j = start_symbol + 1;
- for (bp = first_symbol; bp; bp = bp->next)
- {
- if (bp->class == TERM)
- v[i++] = bp;
- else
- v[j++] = bp;
- }
- assert(i == ntokens && j == nsyms);
-
- for (i = 1; i < ntokens; ++i)
- v[i]->index = i;
-
- goal->index = start_symbol + 1;
- k = start_symbol + 2;
- while (++i < nsyms)
- if (v[i] != goal)
- {
- v[i]->index = k;
- ++k;
- }
-
- goal->value = 0;
- k = 1;
- for (i = start_symbol + 1; i < nsyms; ++i)
- {
- if (v[i] != goal)
- {
- v[i]->value = k;
- ++k;
- }
- }
-
- k = 0;
- for (i = 1; i < ntokens; ++i)
- {
- n = v[i]->value;
- if (n > 256)
- {
- for (j = k++; j > 0 && symbol_value[j-1] > n; --j)
- symbol_value[j] = symbol_value[j-1];
- symbol_value[j] = n;
- }
- }
-
- if (v[1]->value == UNDEFINED)
- v[1]->value = 256;
-
- j = 0;
- n = 257;
- for (i = 2; i < ntokens; ++i)
- {
- if (v[i]->value == UNDEFINED)
- {
- while (j < k && n == symbol_value[j])
- {
- while (++j < k && n == symbol_value[j]) continue;
- ++n;
- }
- v[i]->value = n;
- ++n;
- }
- }
-
- symbol_name[0] = name_pool + 8;
- symbol_value[0] = 0;
- symbol_prec[0] = 0;
- symbol_assoc[0] = TOKEN;
- for (i = 1; i < ntokens; ++i)
- {
- symbol_name[i] = v[i]->name;
- symbol_value[i] = v[i]->value;
- symbol_prec[i] = v[i]->prec;
- symbol_assoc[i] = v[i]->assoc;
- }
- symbol_name[start_symbol] = name_pool;
- symbol_value[start_symbol] = -1;
- symbol_prec[start_symbol] = 0;
- symbol_assoc[start_symbol] = TOKEN;
- for (++i; i < nsyms; ++i)
- {
- k = v[i]->index;
- symbol_name[k] = v[i]->name;
- symbol_value[k] = v[i]->value;
- symbol_prec[k] = v[i]->prec;
- symbol_assoc[k] = v[i]->assoc;
- }
-
- FREE(v);
-}
-
-
-static void
-pack_grammar()
-{
- int i, j;
- int assoc, preced;
-
- ritem = (short *) MALLOC(nitems*sizeof(short));
- if (ritem == 0) no_space();
- rlhs = (short *) MALLOC(nrules*sizeof(short));
- if (rlhs == 0) no_space();
- rrhs = (short *) MALLOC((nrules+1)*sizeof(short));
- if (rrhs == 0) no_space();
- rprec = (short *) REALLOC(rprec, nrules*sizeof(short));
- if (rprec == 0) no_space();
- rassoc = REALLOC(rassoc, nrules);
- if (rassoc == 0) no_space();
-
- ritem[0] = -1;
- ritem[1] = goal->index;
- ritem[2] = 0;
- ritem[3] = -2;
- rlhs[0] = 0;
- rlhs[1] = 0;
- rlhs[2] = start_symbol;
- rrhs[0] = 0;
- rrhs[1] = 0;
- rrhs[2] = 1;
-
- j = 4;
- for (i = 3; i < nrules; ++i)
- {
- rlhs[i] = plhs[i]->index;
- rrhs[i] = j;
- assoc = TOKEN;
- preced = 0;
- while (pitem[j])
- {
- ritem[j] = pitem[j]->index;
- if (pitem[j]->class == TERM)
- {
- preced = pitem[j]->prec;
- assoc = pitem[j]->assoc;
- }
- ++j;
- }
- ritem[j] = -i;
- ++j;
- if (rprec[i] == UNDEFINED)
- {
- rprec[i] = preced;
- rassoc[i] = assoc;
- }
- }
- rrhs[i] = j;
-
- FREE(plhs);
- FREE(pitem);
-}
-
-
-static void
-print_grammar()
-{
- int i, j, k;
- int spacing;
- FILE *f = verbose_file;
-
- if (!vflag) return;
-
- k = 1;
- spacing = 0;
- for (i = 2; i < nrules; ++i)
- {
- if (rlhs[i] != rlhs[i-1])
- {
- if (i != 2) fprintf(f, "\n");
- fprintf(f, "%4d %s :", i - 2, symbol_name[rlhs[i]]);
- spacing = strlen(symbol_name[rlhs[i]]) + 1;
- }
- else
- {
- fprintf(f, "%4d ", i - 2);
- j = spacing;
- while (--j >= 0) putc(' ', f);
- putc('|', f);
- }
-
- while (ritem[k] >= 0)
- {
- fprintf(f, " %s", symbol_name[ritem[k]]);
- ++k;
- }
- ++k;
- putc('\n', f);
- }
-}
-
-
-void
-reader()
-{
- write_section(banner);
- create_symbol_table();
- read_declarations();
- read_grammar();
- free_symbol_table();
- free_tags();
- pack_names();
- check_symbols();
- pack_symbols();
- pack_grammar();
- free_symbols();
- print_grammar();
-}
diff --git a/usr.bin/yacc/skeleton.c b/usr.bin/yacc/skeleton.c
deleted file mode 100644
index 8ff7c8a..0000000
--- a/usr.bin/yacc/skeleton.c
+++ /dev/null
@@ -1,427 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)skeleton.c 5.8 (Berkeley) 4/29/95";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "defs.h"
-
-/* The definition of yysccsid in the banner should be replaced with */
-/* a #pragma ident directive if the target C compiler supports */
-/* #pragma ident directives. */
-/* */
-/* If the skeleton is changed, the banner should be changed so that */
-/* the altered version can be easily distinguished from the original. */
-/* */
-/* The #defines included with the banner are there because they are */
-/* useful in subsequent code. The macros #defined in the header or */
-/* the body either are not useful outside of semantic actions or */
-/* are conditional. */
-
-const char *banner[] =
-{
- "#include <stdlib.h>",
- "#include <string.h>",
- "#ifndef lint",
- "#ifdef __unused",
- "__unused",
- "#endif",
- "static char const ",
- "yyrcsid[] = \"$FreeBSD$\";",
- "#endif",
- "#define YYBYACC 1",
- "#define YYMAJOR 1",
- "#define YYMINOR 9",
- "#define YYLEX yylex()",
- "#define YYEMPTY -1",
- "#define yyclearin (yychar=(YYEMPTY))",
- "#define yyerrok (yyerrflag=0)",
- "#define YYRECOVERING() (yyerrflag!=0)",
- "#if defined(__cplusplus) || __STDC__",
- "static int yygrowstack(void);",
- "#else",
- "static int yygrowstack();",
- "#endif",
- 0
-};
-
-
-const char *tables[] =
-{
- "extern const short yylhs[];",
- "extern const short yylen[];",
- "extern const short yydefred[];",
- "extern const short yydgoto[];",
- "extern const short yysindex[];",
- "extern const short yyrindex[];",
- "extern const short yygindex[];",
- "extern const short yytable[];",
- "extern const short yycheck[];",
- "#if YYDEBUG",
- "extern char *yyname[];",
- "extern char *yyrule[];",
- "#endif",
- 0
-};
-
-
-const char *header[] =
-{
- "#if YYDEBUG",
- "#include <stdio.h>",
- "#endif",
- "#ifdef YYSTACKSIZE",
- "#undef YYMAXDEPTH",
- "#define YYMAXDEPTH YYSTACKSIZE",
- "#else",
- "#ifdef YYMAXDEPTH",
- "#define YYSTACKSIZE YYMAXDEPTH",
- "#else",
- "#define YYSTACKSIZE 10000",
- "#define YYMAXDEPTH 10000",
- "#endif",
- "#endif",
- "#define YYINITSTACKSIZE 200",
- "int yydebug;",
- "int yynerrs;",
- "int yyerrflag;",
- "int yychar;",
- "short *yyssp;",
- "YYSTYPE *yyvsp;",
- "YYSTYPE yyval;",
- "YYSTYPE yylval;",
- "short *yyss;",
- "short *yysslim;",
- "YYSTYPE *yyvs;",
- "int yystacksize;",
- 0
-};
-
-
-const char *body[] =
-{
- "/* allocate initial stack or double stack size, up to YYMAXDEPTH */",
- "static int yygrowstack()",
- "{",
- " int newsize, i;",
- " short *newss;",
- " YYSTYPE *newvs;",
- "",
- " if ((newsize = yystacksize) == 0)",
- " newsize = YYINITSTACKSIZE;",
- " else if (newsize >= YYMAXDEPTH)",
- " return -1;",
- " else if ((newsize *= 2) > YYMAXDEPTH)",
- " newsize = YYMAXDEPTH;",
- " i = yyssp - yyss;",
- " newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) :",
- " (short *)malloc(newsize * sizeof *newss);",
- " if (newss == NULL)",
- " return -1;",
- " yyss = newss;",
- " yyssp = newss + i;",
- " newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) :",
- " (YYSTYPE *)malloc(newsize * sizeof *newvs);",
- " if (newvs == NULL)",
- " return -1;",
- " yyvs = newvs;",
- " yyvsp = newvs + i;",
- " yystacksize = newsize;",
- " yysslim = yyss + newsize - 1;",
- " return 0;",
- "}",
- "",
- "#define YYABORT goto yyabort",
- "#define YYREJECT goto yyabort",
- "#define YYACCEPT goto yyaccept",
- "#define YYERROR goto yyerrlab",
- "",
- "#ifndef YYPARSE_PARAM",
- "#if defined(__cplusplus) || __STDC__",
- "#define YYPARSE_PARAM_ARG void",
- "#define YYPARSE_PARAM_DECL",
- "#else /* ! ANSI-C/C++ */",
- "#define YYPARSE_PARAM_ARG",
- "#define YYPARSE_PARAM_DECL",
- "#endif /* ANSI-C/C++ */",
- "#else /* YYPARSE_PARAM */",
- "#ifndef YYPARSE_PARAM_TYPE",
- "#define YYPARSE_PARAM_TYPE void *",
- "#endif",
- "#if defined(__cplusplus) || __STDC__",
- "#define YYPARSE_PARAM_ARG YYPARSE_PARAM_TYPE YYPARSE_PARAM",
- "#define YYPARSE_PARAM_DECL",
- "#else /* ! ANSI-C/C++ */",
- "#define YYPARSE_PARAM_ARG YYPARSE_PARAM",
- "#define YYPARSE_PARAM_DECL YYPARSE_PARAM_TYPE YYPARSE_PARAM;",
- "#endif /* ANSI-C/C++ */",
- "#endif /* ! YYPARSE_PARAM */",
- "",
- "int",
- "yyparse (YYPARSE_PARAM_ARG)",
- " YYPARSE_PARAM_DECL",
- "{",
- " int yym, yyn, yystate;",
- "#if YYDEBUG",
- " const char *yys;",
- "",
- " if ((yys = getenv(\"YYDEBUG\")))",
- " {",
- " yyn = *yys;",
- " if (yyn >= '0' && yyn <= '9')",
- " yydebug = yyn - '0';",
- " }",
- "#endif",
- "",
- " yynerrs = 0;",
- " yyerrflag = 0;",
- " yychar = (-1);",
- "",
- " if (yyss == NULL && yygrowstack()) goto yyoverflow;",
- " yyssp = yyss;",
- " yyvsp = yyvs;",
- " *yyssp = yystate = 0;",
- "",
- "yyloop:",
- " if ((yyn = yydefred[yystate])) goto yyreduce;",
- " if (yychar < 0)",
- " {",
- " if ((yychar = yylex()) < 0) yychar = 0;",
- "#if YYDEBUG",
- " if (yydebug)",
- " {",
- " yys = 0;",
- " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
- " if (!yys) yys = \"illegal-symbol\";",
- " printf(\"%sdebug: state %d, reading %d (%s)\\n\",",
- " YYPREFIX, yystate, yychar, yys);",
- " }",
- "#endif",
- " }",
- " if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&",
- " yyn <= YYTABLESIZE && yycheck[yyn] == yychar)",
- " {",
- "#if YYDEBUG",
- " if (yydebug)",
- " printf(\"%sdebug: state %d, shifting to state %d\\n\",",
- " YYPREFIX, yystate, yytable[yyn]);",
- "#endif",
- " if (yyssp >= yysslim && yygrowstack())",
- " {",
- " goto yyoverflow;",
- " }",
- " *++yyssp = yystate = yytable[yyn];",
- " *++yyvsp = yylval;",
- " yychar = (-1);",
- " if (yyerrflag > 0) --yyerrflag;",
- " goto yyloop;",
- " }",
- " if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&",
- " yyn <= YYTABLESIZE && yycheck[yyn] == yychar)",
- " {",
- " yyn = yytable[yyn];",
- " goto yyreduce;",
- " }",
- " if (yyerrflag) goto yyinrecovery;",
- "#if defined(lint) || defined(__GNUC__)",
- " goto yynewerror;",
- "#endif",
- "yynewerror:",
- " yyerror(\"syntax error\");",
- "#if defined(lint) || defined(__GNUC__)",
- " goto yyerrlab;",
- "#endif",
- "yyerrlab:",
- " ++yynerrs;",
- "yyinrecovery:",
- " if (yyerrflag < 3)",
- " {",
- " yyerrflag = 3;",
- " for (;;)",
- " {",
- " if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&",
- " yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)",
- " {",
- "#if YYDEBUG",
- " if (yydebug)",
- " printf(\"%sdebug: state %d, error recovery shifting\\",
- " to state %d\\n\", YYPREFIX, *yyssp, yytable[yyn]);",
- "#endif",
- " if (yyssp >= yysslim && yygrowstack())",
- " {",
- " goto yyoverflow;",
- " }",
- " *++yyssp = yystate = yytable[yyn];",
- " *++yyvsp = yylval;",
- " goto yyloop;",
- " }",
- " else",
- " {",
- "#if YYDEBUG",
- " if (yydebug)",
- " printf(\"%sdebug: error recovery discarding state %d\
-\\n\",",
- " YYPREFIX, *yyssp);",
- "#endif",
- " if (yyssp <= yyss) goto yyabort;",
- " --yyssp;",
- " --yyvsp;",
- " }",
- " }",
- " }",
- " else",
- " {",
- " if (yychar == 0) goto yyabort;",
- "#if YYDEBUG",
- " if (yydebug)",
- " {",
- " yys = 0;",
- " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
- " if (!yys) yys = \"illegal-symbol\";",
- " printf(\"%sdebug: state %d, error recovery discards token %d\
- (%s)\\n\",",
- " YYPREFIX, yystate, yychar, yys);",
- " }",
- "#endif",
- " yychar = (-1);",
- " goto yyloop;",
- " }",
- "yyreduce:",
- "#if YYDEBUG",
- " if (yydebug)",
- " printf(\"%sdebug: state %d, reducing by rule %d (%s)\\n\",",
- " YYPREFIX, yystate, yyn, yyrule[yyn]);",
- "#endif",
- " yym = yylen[yyn];",
- " if (yym)",
- " yyval = yyvsp[1-yym];",
- " else",
- " memset(&yyval, 0, sizeof yyval);",
- " switch (yyn)",
- " {",
- 0
-};
-
-
-const char *trailer[] =
-{
- " }",
- " yyssp -= yym;",
- " yystate = *yyssp;",
- " yyvsp -= yym;",
- " yym = yylhs[yyn];",
- " if (yystate == 0 && yym == 0)",
- " {",
- "#if YYDEBUG",
- " if (yydebug)",
- " printf(\"%sdebug: after reduction, shifting from state 0 to\\",
- " state %d\\n\", YYPREFIX, YYFINAL);",
- "#endif",
- " yystate = YYFINAL;",
- " *++yyssp = YYFINAL;",
- " *++yyvsp = yyval;",
- " if (yychar < 0)",
- " {",
- " if ((yychar = yylex()) < 0) yychar = 0;",
- "#if YYDEBUG",
- " if (yydebug)",
- " {",
- " yys = 0;",
- " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
- " if (!yys) yys = \"illegal-symbol\";",
- " printf(\"%sdebug: state %d, reading %d (%s)\\n\",",
- " YYPREFIX, YYFINAL, yychar, yys);",
- " }",
- "#endif",
- " }",
- " if (yychar == 0) goto yyaccept;",
- " goto yyloop;",
- " }",
- " if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&",
- " yyn <= YYTABLESIZE && yycheck[yyn] == yystate)",
- " yystate = yytable[yyn];",
- " else",
- " yystate = yydgoto[yym];",
- "#if YYDEBUG",
- " if (yydebug)",
- " printf(\"%sdebug: after reduction, shifting from state %d \\",
- "to state %d\\n\", YYPREFIX, *yyssp, yystate);",
- "#endif",
- " if (yyssp >= yysslim && yygrowstack())",
- " {",
- " goto yyoverflow;",
- " }",
- " *++yyssp = yystate;",
- " *++yyvsp = yyval;",
- " goto yyloop;",
- "yyoverflow:",
- " yyerror(\"yacc stack overflow\");",
- "yyabort:",
- " return (1);",
- "yyaccept:",
- " return (0);",
- "}",
- 0
-};
-
-
-void
-write_section(section)
-const char *section[];
-{
- int c;
- int i;
- const char *s;
- FILE *f;
-
- f = code_file;
- for (i = 0; (s = section[i]); ++i)
- {
- ++outline;
- while ((c = *s))
- {
- putc(c, f);
- ++s;
- }
- putc('\n', f);
- }
-}
diff --git a/usr.bin/yacc/symtab.c b/usr.bin/yacc/symtab.c
deleted file mode 100644
index cb7b0bd..0000000
--- a/usr.bin/yacc/symtab.c
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)symtab.c 5.3 (Berkeley) 6/1/90";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-#include <string.h>
-#include "defs.h"
-
-/* TABLE_SIZE is the number of entries in the symbol table. */
-/* TABLE_SIZE must be a power of two. */
-
-#define TABLE_SIZE 1024
-
-static int hash(const char *);
-
-bucket **symbol_table;
-bucket *first_symbol;
-bucket *last_symbol;
-
-
-static int
-hash(name)
-const char *name;
-{
- const char *s;
- int c, k;
-
- assert(name && *name);
- s = name;
- k = *s;
- while ((c = *++s))
- k = (31*k + c) & (TABLE_SIZE - 1);
-
- return (k);
-}
-
-
-bucket *
-make_bucket(name)
-const char *name;
-{
- bucket *bp;
-
- assert(name);
- bp = (bucket *) MALLOC(sizeof(bucket));
- if (bp == 0) no_space();
- bp->link = 0;
- bp->next = 0;
- bp->name = MALLOC(strlen(name) + 1);
- if (bp->name == 0) no_space();
- bp->tag = 0;
- bp->value = UNDEFINED;
- bp->index = 0;
- bp->prec = 0;
- bp-> class = UNKNOWN;
- bp->assoc = TOKEN;
-
- if (bp->name == 0) no_space();
- strcpy(bp->name, name);
-
- return (bp);
-}
-
-
-bucket *
-lookup(name)
-char *name;
-{
- bucket *bp, **bpp;
-
- bpp = symbol_table + hash(name);
- bp = *bpp;
-
- while (bp)
- {
- if (strcmp(name, bp->name) == 0) return (bp);
- bpp = &bp->link;
- bp = *bpp;
- }
-
- *bpp = bp = make_bucket(name);
- last_symbol->next = bp;
- last_symbol = bp;
-
- return (bp);
-}
-
-
-void
-create_symbol_table()
-{
- int i;
- bucket *bp;
-
- symbol_table = (bucket **) MALLOC(TABLE_SIZE*sizeof(bucket *));
- if (symbol_table == 0) no_space();
- for (i = 0; i < TABLE_SIZE; i++)
- symbol_table[i] = 0;
-
- bp = make_bucket("error");
- bp->index = 1;
- bp->class = TERM;
-
- first_symbol = bp;
- last_symbol = bp;
- symbol_table[hash("error")] = bp;
-}
-
-
-void
-free_symbol_table()
-{
- FREE(symbol_table);
- symbol_table = 0;
-}
-
-
-void
-free_symbols()
-{
- bucket *p, *q;
-
- for (p = first_symbol; p; p = q)
- {
- q = p->next;
- FREE(p);
- }
-}
diff --git a/usr.bin/yacc/test/error.output b/usr.bin/yacc/test/error.output
deleted file mode 100644
index 0c4db62..0000000
--- a/usr.bin/yacc/test/error.output
+++ /dev/null
@@ -1,27 +0,0 @@
- 0 $accept : S $end
-
- 1 S : error
-
-state 0
- $accept : . S $end (0)
-
- error shift 1
- . error
-
- S goto 2
-
-
-state 1
- S : error . (1)
-
- . reduce 1
-
-
-state 2
- $accept : S . $end (0)
-
- $end accept
-
-
-2 terminals, 2 nonterminals
-2 grammar rules, 3 states
diff --git a/usr.bin/yacc/test/error.tab.c b/usr.bin/yacc/test/error.tab.c
deleted file mode 100644
index 2e309b8..0000000
--- a/usr.bin/yacc/test/error.tab.c
+++ /dev/null
@@ -1,317 +0,0 @@
-#ifndef lint
-static char const yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93";
-#endif
-#include <stdlib.h>
-#define YYBYACC 1
-#define YYMAJOR 1
-#define YYMINOR 9
-#define YYLEX yylex()
-#define YYEMPTY -1
-#define yyclearin (yychar=(YYEMPTY))
-#define yyerrok (yyerrflag=0)
-#define YYRECOVERING (yyerrflag!=0)
-#if defined(c_plusplus) || defined(__cplusplus)
-#include <stdlib.h>
-#else
-extern char *getenv();
-extern void *realloc();
-#endif
-static int yygrowstack();
-#define YYPREFIX "yy"
-#define YYERRCODE 256
-const short yylhs[] = { -1,
- 0,
-};
-const short yylen[] = { 2,
- 1,
-};
-const short yydefred[] = { 0,
- 1, 0,
-};
-const short yydgoto[] = { 2,
-};
-const short yysindex[] = { -256,
- 0, 0,
-};
-const short yyrindex[] = { 0,
- 0, 0,
-};
-const short yygindex[] = { 0,
-};
-#define YYTABLESIZE 0
-const short yytable[] = { 1,
-};
-const short yycheck[] = { 256,
-};
-#define YYFINAL 2
-#ifndef YYDEBUG
-#define YYDEBUG 0
-#elif YYDEBUG
-#include <stdio.h>
-#endif
-#define YYMAXTOKEN 0
-#if YYDEBUG
-const char * const yyname[] = {
-"end-of-file",
-};
-const char * const yyrule[] = {
-"$accept : S",
-"S : error",
-};
-#endif
-#ifndef YYSTYPE
-typedef int YYSTYPE;
-#endif
-#ifdef YYSTACKSIZE
-#undef YYMAXDEPTH
-#define YYMAXDEPTH YYSTACKSIZE
-#else
-#ifdef YYMAXDEPTH
-#define YYSTACKSIZE YYMAXDEPTH
-#else
-#define YYSTACKSIZE 10000
-#define YYMAXDEPTH 10000
-#endif
-#endif
-#define YYINITSTACKSIZE 200
-int yydebug;
-int yynerrs;
-int yyerrflag;
-int yychar;
-short *yyssp;
-YYSTYPE *yyvsp;
-YYSTYPE yyval;
-YYSTYPE yylval;
-short *yyss;
-short *yysslim;
-YYSTYPE *yyvs;
-int yystacksize;
-#line 4 "error.y"
-main(){printf("yyparse() = %d\n",yyparse());}
-yylex(){return-1;}
-yyerror(s)char*s;{printf("%s\n",s);}
-#line 92 "error.tab.c"
-/* allocate initial stack or double stack size, up to YYMAXDEPTH */
-static int yygrowstack()
-{
- int newsize, i;
- short *newss;
- YYSTYPE *newvs;
-
- if ((newsize = yystacksize) == 0)
- newsize = YYINITSTACKSIZE;
- else if (newsize >= YYMAXDEPTH)
- return -1;
- else if ((newsize *= 2) > YYMAXDEPTH)
- newsize = YYMAXDEPTH;
- i = yyssp - yyss;
- if ((newss = (short *)realloc(yyss, newsize * sizeof *newss)) == NULL)
- return -1;
- yyss = newss;
- yyssp = newss + i;
- if ((newvs = (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs)) == NULL)
- return -1;
- yyvs = newvs;
- yyvsp = newvs + i;
- yystacksize = newsize;
- yysslim = yyss + newsize - 1;
- return 0;
-}
-
-#define YYABORT goto yyabort
-#define YYREJECT goto yyabort
-#define YYACCEPT goto yyaccept
-#define YYERROR goto yyerrlab
-
-int
-yyparse()
-{
- register int yym, yyn, yystate;
-#if YYDEBUG
- register const char *yys;
-
- if ((yys = getenv("YYDEBUG")))
- {
- yyn = *yys;
- if (yyn >= '0' && yyn <= '9')
- yydebug = yyn - '0';
- }
-#endif
-
- yynerrs = 0;
- yyerrflag = 0;
- yychar = (-1);
-
- if (yyss == NULL && yygrowstack()) goto yyoverflow;
- yyssp = yyss;
- yyvsp = yyvs;
- *yyssp = yystate = 0;
-
-yyloop:
- if ((yyn = yydefred[yystate])) goto yyreduce;
- if (yychar < 0)
- {
- if ((yychar = yylex()) < 0) yychar = 0;
-#if YYDEBUG
- if (yydebug)
- {
- yys = 0;
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
- printf("%sdebug: state %d, reading %d (%s)\n",
- YYPREFIX, yystate, yychar, yys);
- }
-#endif
- }
- if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: state %d, shifting to state %d\n",
- YYPREFIX, yystate, yytable[yyn]);
-#endif
- if (yyssp >= yysslim && yygrowstack())
- {
- goto yyoverflow;
- }
- *++yyssp = yystate = yytable[yyn];
- *++yyvsp = yylval;
- yychar = (-1);
- if (yyerrflag > 0) --yyerrflag;
- goto yyloop;
- }
- if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
- {
- yyn = yytable[yyn];
- goto yyreduce;
- }
- if (yyerrflag) goto yyinrecovery;
-#if defined(lint) || defined(__GNUC__)
- goto yynewerror;
-#endif
-yynewerror:
- yyerror("syntax error");
-#if defined(lint) || defined(__GNUC__)
- goto yyerrlab;
-#endif
-yyerrlab:
- ++yynerrs;
-yyinrecovery:
- if (yyerrflag < 3)
- {
- yyerrflag = 3;
- for (;;)
- {
- if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: state %d, error recovery shifting\
- to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
-#endif
- if (yyssp >= yysslim && yygrowstack())
- {
- goto yyoverflow;
- }
- *++yyssp = yystate = yytable[yyn];
- *++yyvsp = yylval;
- goto yyloop;
- }
- else
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: error recovery discarding state %d\n",
- YYPREFIX, *yyssp);
-#endif
- if (yyssp <= yyss) goto yyabort;
- --yyssp;
- --yyvsp;
- }
- }
- }
- else
- {
- if (yychar == 0) goto yyabort;
-#if YYDEBUG
- if (yydebug)
- {
- yys = 0;
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
- printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
- YYPREFIX, yystate, yychar, yys);
- }
-#endif
- yychar = (-1);
- goto yyloop;
- }
-yyreduce:
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: state %d, reducing by rule %d (%s)\n",
- YYPREFIX, yystate, yyn, yyrule[yyn]);
-#endif
- yym = yylen[yyn];
- yyval = yyvsp[1-yym];
- switch (yyn)
- {
- }
- yyssp -= yym;
- yystate = *yyssp;
- yyvsp -= yym;
- yym = yylhs[yyn];
- if (yystate == 0 && yym == 0)
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: after reduction, shifting from state 0 to\
- state %d\n", YYPREFIX, YYFINAL);
-#endif
- yystate = YYFINAL;
- *++yyssp = YYFINAL;
- *++yyvsp = yyval;
- if (yychar < 0)
- {
- if ((yychar = yylex()) < 0) yychar = 0;
-#if YYDEBUG
- if (yydebug)
- {
- yys = 0;
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
- printf("%sdebug: state %d, reading %d (%s)\n",
- YYPREFIX, YYFINAL, yychar, yys);
- }
-#endif
- }
- if (yychar == 0) goto yyaccept;
- goto yyloop;
- }
- if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
- yystate = yytable[yyn];
- else
- yystate = yydgoto[yym];
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: after reduction, shifting from state %d \
-to state %d\n", YYPREFIX, *yyssp, yystate);
-#endif
- if (yyssp >= yysslim && yygrowstack())
- {
- goto yyoverflow;
- }
- *++yyssp = yystate;
- *++yyvsp = yyval;
- goto yyloop;
-yyoverflow:
- yyerror("yacc stack overflow");
-yyabort:
- return (1);
-yyaccept:
- return (0);
-}
diff --git a/usr.bin/yacc/test/error.tab.h b/usr.bin/yacc/test/error.tab.h
deleted file mode 100644
index e69de29..0000000
--- a/usr.bin/yacc/test/error.tab.h
+++ /dev/null
diff --git a/usr.bin/yacc/test/error.y b/usr.bin/yacc/test/error.y
deleted file mode 100644
index 41148ea..0000000
--- a/usr.bin/yacc/test/error.y
+++ /dev/null
@@ -1,6 +0,0 @@
-%%
-S: error
-%%
-main(){printf("yyparse() = %d\n",yyparse());}
-yylex(){return-1;}
-yyerror(s)char*s;{printf("%s\n",s);}
diff --git a/usr.bin/yacc/test/ftp.output b/usr.bin/yacc/test/ftp.output
deleted file mode 100644
index f1ab4b2..0000000
--- a/usr.bin/yacc/test/ftp.output
+++ /dev/null
@@ -1,1625 +0,0 @@
- 0 $accept : cmd_list $end
-
- 1 cmd_list :
- 2 | cmd_list cmd
- 3 | cmd_list rcmd
-
- 4 cmd : USER SP username CRLF
- 5 | PASS SP password CRLF
- 6 | PORT SP host_port CRLF
- 7 | PASV CRLF
- 8 | TYPE SP type_code CRLF
- 9 | STRU SP struct_code CRLF
- 10 | MODE SP mode_code CRLF
- 11 | ALLO SP NUMBER CRLF
- 12 | ALLO SP NUMBER SP R SP NUMBER CRLF
- 13 | RETR check_login SP pathname CRLF
- 14 | STOR check_login SP pathname CRLF
- 15 | APPE check_login SP pathname CRLF
- 16 | NLST check_login CRLF
- 17 | NLST check_login SP STRING CRLF
- 18 | LIST check_login CRLF
- 19 | LIST check_login SP pathname CRLF
- 20 | STAT check_login SP pathname CRLF
- 21 | STAT CRLF
- 22 | DELE check_login SP pathname CRLF
- 23 | RNTO SP pathname CRLF
- 24 | ABOR CRLF
- 25 | CWD check_login CRLF
- 26 | CWD check_login SP pathname CRLF
- 27 | HELP CRLF
- 28 | HELP SP STRING CRLF
- 29 | NOOP CRLF
- 30 | MKD check_login SP pathname CRLF
- 31 | RMD check_login SP pathname CRLF
- 32 | PWD check_login CRLF
- 33 | CDUP check_login CRLF
- 34 | SITE SP HELP CRLF
- 35 | SITE SP HELP SP STRING CRLF
- 36 | SITE SP UMASK check_login CRLF
- 37 | SITE SP UMASK check_login SP octal_number CRLF
- 38 | SITE SP CHMOD check_login SP octal_number SP pathname CRLF
- 39 | SITE SP IDLE CRLF
- 40 | SITE SP IDLE SP NUMBER CRLF
- 41 | STOU check_login SP pathname CRLF
- 42 | SYST CRLF
- 43 | SIZE check_login SP pathname CRLF
- 44 | MDTM check_login SP pathname CRLF
- 45 | QUIT CRLF
- 46 | error CRLF
-
- 47 rcmd : RNFR check_login SP pathname CRLF
-
- 48 username : STRING
-
- 49 password :
- 50 | STRING
-
- 51 byte_size : NUMBER
-
- 52 host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER
-
- 53 form_code : N
- 54 | T
- 55 | C
-
- 56 type_code : A
- 57 | A SP form_code
- 58 | E
- 59 | E SP form_code
- 60 | I
- 61 | L
- 62 | L SP byte_size
- 63 | L byte_size
-
- 64 struct_code : F
- 65 | R
- 66 | P
-
- 67 mode_code : S
- 68 | B
- 69 | C
-
- 70 pathname : pathstring
-
- 71 pathstring : STRING
-
- 72 octal_number : NUMBER
-
- 73 check_login :
-
-state 0
- $accept : . cmd_list $end (0)
- cmd_list : . (1)
-
- . reduce 1
-
- cmd_list goto 1
-
-
-state 1
- $accept : cmd_list . $end (0)
- cmd_list : cmd_list . cmd (2)
- cmd_list : cmd_list . rcmd (3)
-
- $end accept
- error shift 2
- USER shift 3
- PASS shift 4
- QUIT shift 5
- PORT shift 6
- PASV shift 7
- TYPE shift 8
- STRU shift 9
- MODE shift 10
- RETR shift 11
- STOR shift 12
- APPE shift 13
- ALLO shift 14
- RNFR shift 15
- RNTO shift 16
- ABOR shift 17
- DELE shift 18
- CWD shift 19
- LIST shift 20
- NLST shift 21
- SITE shift 22
- STAT shift 23
- HELP shift 24
- NOOP shift 25
- MKD shift 26
- RMD shift 27
- PWD shift 28
- CDUP shift 29
- STOU shift 30
- SYST shift 31
- SIZE shift 32
- MDTM shift 33
- . error
-
- cmd goto 34
- rcmd goto 35
-
-
-state 2
- cmd : error . CRLF (46)
-
- CRLF shift 36
- . error
-
-
-state 3
- cmd : USER . SP username CRLF (4)
-
- SP shift 37
- . error
-
-
-state 4
- cmd : PASS . SP password CRLF (5)
-
- SP shift 38
- . error
-
-
-state 5
- cmd : QUIT . CRLF (45)
-
- CRLF shift 39
- . error
-
-
-state 6
- cmd : PORT . SP host_port CRLF (6)
-
- SP shift 40
- . error
-
-
-state 7
- cmd : PASV . CRLF (7)
-
- CRLF shift 41
- . error
-
-
-state 8
- cmd : TYPE . SP type_code CRLF (8)
-
- SP shift 42
- . error
-
-
-state 9
- cmd : STRU . SP struct_code CRLF (9)
-
- SP shift 43
- . error
-
-
-state 10
- cmd : MODE . SP mode_code CRLF (10)
-
- SP shift 44
- . error
-
-
-state 11
- cmd : RETR . check_login SP pathname CRLF (13)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 45
-
-
-state 12
- cmd : STOR . check_login SP pathname CRLF (14)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 46
-
-
-state 13
- cmd : APPE . check_login SP pathname CRLF (15)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 47
-
-
-state 14
- cmd : ALLO . SP NUMBER CRLF (11)
- cmd : ALLO . SP NUMBER SP R SP NUMBER CRLF (12)
-
- SP shift 48
- . error
-
-
-state 15
- rcmd : RNFR . check_login SP pathname CRLF (47)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 49
-
-
-state 16
- cmd : RNTO . SP pathname CRLF (23)
-
- SP shift 50
- . error
-
-
-state 17
- cmd : ABOR . CRLF (24)
-
- CRLF shift 51
- . error
-
-
-state 18
- cmd : DELE . check_login SP pathname CRLF (22)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 52
-
-
-state 19
- cmd : CWD . check_login CRLF (25)
- cmd : CWD . check_login SP pathname CRLF (26)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 53
-
-
-state 20
- cmd : LIST . check_login CRLF (18)
- cmd : LIST . check_login SP pathname CRLF (19)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 54
-
-
-state 21
- cmd : NLST . check_login CRLF (16)
- cmd : NLST . check_login SP STRING CRLF (17)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 55
-
-
-state 22
- cmd : SITE . SP HELP CRLF (34)
- cmd : SITE . SP HELP SP STRING CRLF (35)
- cmd : SITE . SP UMASK check_login CRLF (36)
- cmd : SITE . SP UMASK check_login SP octal_number CRLF (37)
- cmd : SITE . SP CHMOD check_login SP octal_number SP pathname CRLF (38)
- cmd : SITE . SP IDLE CRLF (39)
- cmd : SITE . SP IDLE SP NUMBER CRLF (40)
-
- SP shift 56
- . error
-
-
-state 23
- cmd : STAT . check_login SP pathname CRLF (20)
- cmd : STAT . CRLF (21)
- check_login : . (73)
-
- CRLF shift 57
- SP reduce 73
-
- check_login goto 58
-
-
-state 24
- cmd : HELP . CRLF (27)
- cmd : HELP . SP STRING CRLF (28)
-
- SP shift 59
- CRLF shift 60
- . error
-
-
-state 25
- cmd : NOOP . CRLF (29)
-
- CRLF shift 61
- . error
-
-
-state 26
- cmd : MKD . check_login SP pathname CRLF (30)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 62
-
-
-state 27
- cmd : RMD . check_login SP pathname CRLF (31)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 63
-
-
-state 28
- cmd : PWD . check_login CRLF (32)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 64
-
-
-state 29
- cmd : CDUP . check_login CRLF (33)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 65
-
-
-state 30
- cmd : STOU . check_login SP pathname CRLF (41)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 66
-
-
-state 31
- cmd : SYST . CRLF (42)
-
- CRLF shift 67
- . error
-
-
-state 32
- cmd : SIZE . check_login SP pathname CRLF (43)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 68
-
-
-state 33
- cmd : MDTM . check_login SP pathname CRLF (44)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 69
-
-
-state 34
- cmd_list : cmd_list cmd . (2)
-
- . reduce 2
-
-
-state 35
- cmd_list : cmd_list rcmd . (3)
-
- . reduce 3
-
-
-state 36
- cmd : error CRLF . (46)
-
- . reduce 46
-
-
-state 37
- cmd : USER SP . username CRLF (4)
-
- STRING shift 70
- . error
-
- username goto 71
-
-
-state 38
- cmd : PASS SP . password CRLF (5)
- password : . (49)
-
- STRING shift 72
- CRLF reduce 49
-
- password goto 73
-
-
-state 39
- cmd : QUIT CRLF . (45)
-
- . reduce 45
-
-
-state 40
- cmd : PORT SP . host_port CRLF (6)
-
- NUMBER shift 74
- . error
-
- host_port goto 75
-
-
-state 41
- cmd : PASV CRLF . (7)
-
- . reduce 7
-
-
-state 42
- cmd : TYPE SP . type_code CRLF (8)
-
- A shift 76
- E shift 77
- I shift 78
- L shift 79
- . error
-
- type_code goto 80
-
-
-state 43
- cmd : STRU SP . struct_code CRLF (9)
-
- F shift 81
- P shift 82
- R shift 83
- . error
-
- struct_code goto 84
-
-
-state 44
- cmd : MODE SP . mode_code CRLF (10)
-
- B shift 85
- C shift 86
- S shift 87
- . error
-
- mode_code goto 88
-
-
-state 45
- cmd : RETR check_login . SP pathname CRLF (13)
-
- SP shift 89
- . error
-
-
-state 46
- cmd : STOR check_login . SP pathname CRLF (14)
-
- SP shift 90
- . error
-
-
-state 47
- cmd : APPE check_login . SP pathname CRLF (15)
-
- SP shift 91
- . error
-
-
-state 48
- cmd : ALLO SP . NUMBER CRLF (11)
- cmd : ALLO SP . NUMBER SP R SP NUMBER CRLF (12)
-
- NUMBER shift 92
- . error
-
-
-state 49
- rcmd : RNFR check_login . SP pathname CRLF (47)
-
- SP shift 93
- . error
-
-
-state 50
- cmd : RNTO SP . pathname CRLF (23)
-
- STRING shift 94
- . error
-
- pathname goto 95
- pathstring goto 96
-
-
-state 51
- cmd : ABOR CRLF . (24)
-
- . reduce 24
-
-
-state 52
- cmd : DELE check_login . SP pathname CRLF (22)
-
- SP shift 97
- . error
-
-
-state 53
- cmd : CWD check_login . CRLF (25)
- cmd : CWD check_login . SP pathname CRLF (26)
-
- SP shift 98
- CRLF shift 99
- . error
-
-
-state 54
- cmd : LIST check_login . CRLF (18)
- cmd : LIST check_login . SP pathname CRLF (19)
-
- SP shift 100
- CRLF shift 101
- . error
-
-
-state 55
- cmd : NLST check_login . CRLF (16)
- cmd : NLST check_login . SP STRING CRLF (17)
-
- SP shift 102
- CRLF shift 103
- . error
-
-
-state 56
- cmd : SITE SP . HELP CRLF (34)
- cmd : SITE SP . HELP SP STRING CRLF (35)
- cmd : SITE SP . UMASK check_login CRLF (36)
- cmd : SITE SP . UMASK check_login SP octal_number CRLF (37)
- cmd : SITE SP . CHMOD check_login SP octal_number SP pathname CRLF (38)
- cmd : SITE SP . IDLE CRLF (39)
- cmd : SITE SP . IDLE SP NUMBER CRLF (40)
-
- HELP shift 104
- UMASK shift 105
- IDLE shift 106
- CHMOD shift 107
- . error
-
-
-state 57
- cmd : STAT CRLF . (21)
-
- . reduce 21
-
-
-state 58
- cmd : STAT check_login . SP pathname CRLF (20)
-
- SP shift 108
- . error
-
-
-state 59
- cmd : HELP SP . STRING CRLF (28)
-
- STRING shift 109
- . error
-
-
-state 60
- cmd : HELP CRLF . (27)
-
- . reduce 27
-
-
-state 61
- cmd : NOOP CRLF . (29)
-
- . reduce 29
-
-
-state 62
- cmd : MKD check_login . SP pathname CRLF (30)
-
- SP shift 110
- . error
-
-
-state 63
- cmd : RMD check_login . SP pathname CRLF (31)
-
- SP shift 111
- . error
-
-
-state 64
- cmd : PWD check_login . CRLF (32)
-
- CRLF shift 112
- . error
-
-
-state 65
- cmd : CDUP check_login . CRLF (33)
-
- CRLF shift 113
- . error
-
-
-state 66
- cmd : STOU check_login . SP pathname CRLF (41)
-
- SP shift 114
- . error
-
-
-state 67
- cmd : SYST CRLF . (42)
-
- . reduce 42
-
-
-state 68
- cmd : SIZE check_login . SP pathname CRLF (43)
-
- SP shift 115
- . error
-
-
-state 69
- cmd : MDTM check_login . SP pathname CRLF (44)
-
- SP shift 116
- . error
-
-
-state 70
- username : STRING . (48)
-
- . reduce 48
-
-
-state 71
- cmd : USER SP username . CRLF (4)
-
- CRLF shift 117
- . error
-
-
-state 72
- password : STRING . (50)
-
- . reduce 50
-
-
-state 73
- cmd : PASS SP password . CRLF (5)
-
- CRLF shift 118
- . error
-
-
-state 74
- host_port : NUMBER . COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER (52)
-
- COMMA shift 119
- . error
-
-
-state 75
- cmd : PORT SP host_port . CRLF (6)
-
- CRLF shift 120
- . error
-
-
-state 76
- type_code : A . (56)
- type_code : A . SP form_code (57)
-
- SP shift 121
- CRLF reduce 56
-
-
-state 77
- type_code : E . (58)
- type_code : E . SP form_code (59)
-
- SP shift 122
- CRLF reduce 58
-
-
-state 78
- type_code : I . (60)
-
- . reduce 60
-
-
-state 79
- type_code : L . (61)
- type_code : L . SP byte_size (62)
- type_code : L . byte_size (63)
-
- SP shift 123
- NUMBER shift 124
- CRLF reduce 61
-
- byte_size goto 125
-
-
-state 80
- cmd : TYPE SP type_code . CRLF (8)
-
- CRLF shift 126
- . error
-
-
-state 81
- struct_code : F . (64)
-
- . reduce 64
-
-
-state 82
- struct_code : P . (66)
-
- . reduce 66
-
-
-state 83
- struct_code : R . (65)
-
- . reduce 65
-
-
-state 84
- cmd : STRU SP struct_code . CRLF (9)
-
- CRLF shift 127
- . error
-
-
-state 85
- mode_code : B . (68)
-
- . reduce 68
-
-
-state 86
- mode_code : C . (69)
-
- . reduce 69
-
-
-state 87
- mode_code : S . (67)
-
- . reduce 67
-
-
-state 88
- cmd : MODE SP mode_code . CRLF (10)
-
- CRLF shift 128
- . error
-
-
-state 89
- cmd : RETR check_login SP . pathname CRLF (13)
-
- STRING shift 94
- . error
-
- pathname goto 129
- pathstring goto 96
-
-
-state 90
- cmd : STOR check_login SP . pathname CRLF (14)
-
- STRING shift 94
- . error
-
- pathname goto 130
- pathstring goto 96
-
-
-state 91
- cmd : APPE check_login SP . pathname CRLF (15)
-
- STRING shift 94
- . error
-
- pathname goto 131
- pathstring goto 96
-
-
-state 92
- cmd : ALLO SP NUMBER . CRLF (11)
- cmd : ALLO SP NUMBER . SP R SP NUMBER CRLF (12)
-
- SP shift 132
- CRLF shift 133
- . error
-
-
-state 93
- rcmd : RNFR check_login SP . pathname CRLF (47)
-
- STRING shift 94
- . error
-
- pathname goto 134
- pathstring goto 96
-
-
-state 94
- pathstring : STRING . (71)
-
- . reduce 71
-
-
-state 95
- cmd : RNTO SP pathname . CRLF (23)
-
- CRLF shift 135
- . error
-
-
-state 96
- pathname : pathstring . (70)
-
- . reduce 70
-
-
-state 97
- cmd : DELE check_login SP . pathname CRLF (22)
-
- STRING shift 94
- . error
-
- pathname goto 136
- pathstring goto 96
-
-
-state 98
- cmd : CWD check_login SP . pathname CRLF (26)
-
- STRING shift 94
- . error
-
- pathname goto 137
- pathstring goto 96
-
-
-state 99
- cmd : CWD check_login CRLF . (25)
-
- . reduce 25
-
-
-state 100
- cmd : LIST check_login SP . pathname CRLF (19)
-
- STRING shift 94
- . error
-
- pathname goto 138
- pathstring goto 96
-
-
-state 101
- cmd : LIST check_login CRLF . (18)
-
- . reduce 18
-
-
-state 102
- cmd : NLST check_login SP . STRING CRLF (17)
-
- STRING shift 139
- . error
-
-
-state 103
- cmd : NLST check_login CRLF . (16)
-
- . reduce 16
-
-
-state 104
- cmd : SITE SP HELP . CRLF (34)
- cmd : SITE SP HELP . SP STRING CRLF (35)
-
- SP shift 140
- CRLF shift 141
- . error
-
-
-state 105
- cmd : SITE SP UMASK . check_login CRLF (36)
- cmd : SITE SP UMASK . check_login SP octal_number CRLF (37)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 142
-
-
-state 106
- cmd : SITE SP IDLE . CRLF (39)
- cmd : SITE SP IDLE . SP NUMBER CRLF (40)
-
- SP shift 143
- CRLF shift 144
- . error
-
-
-state 107
- cmd : SITE SP CHMOD . check_login SP octal_number SP pathname CRLF (38)
- check_login : . (73)
-
- . reduce 73
-
- check_login goto 145
-
-
-state 108
- cmd : STAT check_login SP . pathname CRLF (20)
-
- STRING shift 94
- . error
-
- pathname goto 146
- pathstring goto 96
-
-
-state 109
- cmd : HELP SP STRING . CRLF (28)
-
- CRLF shift 147
- . error
-
-
-state 110
- cmd : MKD check_login SP . pathname CRLF (30)
-
- STRING shift 94
- . error
-
- pathname goto 148
- pathstring goto 96
-
-
-state 111
- cmd : RMD check_login SP . pathname CRLF (31)
-
- STRING shift 94
- . error
-
- pathname goto 149
- pathstring goto 96
-
-
-state 112
- cmd : PWD check_login CRLF . (32)
-
- . reduce 32
-
-
-state 113
- cmd : CDUP check_login CRLF . (33)
-
- . reduce 33
-
-
-state 114
- cmd : STOU check_login SP . pathname CRLF (41)
-
- STRING shift 94
- . error
-
- pathname goto 150
- pathstring goto 96
-
-
-state 115
- cmd : SIZE check_login SP . pathname CRLF (43)
-
- STRING shift 94
- . error
-
- pathname goto 151
- pathstring goto 96
-
-
-state 116
- cmd : MDTM check_login SP . pathname CRLF (44)
-
- STRING shift 94
- . error
-
- pathname goto 152
- pathstring goto 96
-
-
-state 117
- cmd : USER SP username CRLF . (4)
-
- . reduce 4
-
-
-state 118
- cmd : PASS SP password CRLF . (5)
-
- . reduce 5
-
-
-state 119
- host_port : NUMBER COMMA . NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER (52)
-
- NUMBER shift 153
- . error
-
-
-state 120
- cmd : PORT SP host_port CRLF . (6)
-
- . reduce 6
-
-
-state 121
- type_code : A SP . form_code (57)
-
- C shift 154
- N shift 155
- T shift 156
- . error
-
- form_code goto 157
-
-
-state 122
- type_code : E SP . form_code (59)
-
- C shift 154
- N shift 155
- T shift 156
- . error
-
- form_code goto 158
-
-
-state 123
- type_code : L SP . byte_size (62)
-
- NUMBER shift 124
- . error
-
- byte_size goto 159
-
-
-state 124
- byte_size : NUMBER . (51)
-
- . reduce 51
-
-
-state 125
- type_code : L byte_size . (63)
-
- . reduce 63
-
-
-state 126
- cmd : TYPE SP type_code CRLF . (8)
-
- . reduce 8
-
-
-state 127
- cmd : STRU SP struct_code CRLF . (9)
-
- . reduce 9
-
-
-state 128
- cmd : MODE SP mode_code CRLF . (10)
-
- . reduce 10
-
-
-state 129
- cmd : RETR check_login SP pathname . CRLF (13)
-
- CRLF shift 160
- . error
-
-
-state 130
- cmd : STOR check_login SP pathname . CRLF (14)
-
- CRLF shift 161
- . error
-
-
-state 131
- cmd : APPE check_login SP pathname . CRLF (15)
-
- CRLF shift 162
- . error
-
-
-state 132
- cmd : ALLO SP NUMBER SP . R SP NUMBER CRLF (12)
-
- R shift 163
- . error
-
-
-state 133
- cmd : ALLO SP NUMBER CRLF . (11)
-
- . reduce 11
-
-
-state 134
- rcmd : RNFR check_login SP pathname . CRLF (47)
-
- CRLF shift 164
- . error
-
-
-state 135
- cmd : RNTO SP pathname CRLF . (23)
-
- . reduce 23
-
-
-state 136
- cmd : DELE check_login SP pathname . CRLF (22)
-
- CRLF shift 165
- . error
-
-
-state 137
- cmd : CWD check_login SP pathname . CRLF (26)
-
- CRLF shift 166
- . error
-
-
-state 138
- cmd : LIST check_login SP pathname . CRLF (19)
-
- CRLF shift 167
- . error
-
-
-state 139
- cmd : NLST check_login SP STRING . CRLF (17)
-
- CRLF shift 168
- . error
-
-
-state 140
- cmd : SITE SP HELP SP . STRING CRLF (35)
-
- STRING shift 169
- . error
-
-
-state 141
- cmd : SITE SP HELP CRLF . (34)
-
- . reduce 34
-
-
-state 142
- cmd : SITE SP UMASK check_login . CRLF (36)
- cmd : SITE SP UMASK check_login . SP octal_number CRLF (37)
-
- SP shift 170
- CRLF shift 171
- . error
-
-
-state 143
- cmd : SITE SP IDLE SP . NUMBER CRLF (40)
-
- NUMBER shift 172
- . error
-
-
-state 144
- cmd : SITE SP IDLE CRLF . (39)
-
- . reduce 39
-
-
-state 145
- cmd : SITE SP CHMOD check_login . SP octal_number SP pathname CRLF (38)
-
- SP shift 173
- . error
-
-
-state 146
- cmd : STAT check_login SP pathname . CRLF (20)
-
- CRLF shift 174
- . error
-
-
-state 147
- cmd : HELP SP STRING CRLF . (28)
-
- . reduce 28
-
-
-state 148
- cmd : MKD check_login SP pathname . CRLF (30)
-
- CRLF shift 175
- . error
-
-
-state 149
- cmd : RMD check_login SP pathname . CRLF (31)
-
- CRLF shift 176
- . error
-
-
-state 150
- cmd : STOU check_login SP pathname . CRLF (41)
-
- CRLF shift 177
- . error
-
-
-state 151
- cmd : SIZE check_login SP pathname . CRLF (43)
-
- CRLF shift 178
- . error
-
-
-state 152
- cmd : MDTM check_login SP pathname . CRLF (44)
-
- CRLF shift 179
- . error
-
-
-state 153
- host_port : NUMBER COMMA NUMBER . COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER (52)
-
- COMMA shift 180
- . error
-
-
-state 154
- form_code : C . (55)
-
- . reduce 55
-
-
-state 155
- form_code : N . (53)
-
- . reduce 53
-
-
-state 156
- form_code : T . (54)
-
- . reduce 54
-
-
-state 157
- type_code : A SP form_code . (57)
-
- . reduce 57
-
-
-state 158
- type_code : E SP form_code . (59)
-
- . reduce 59
-
-
-state 159
- type_code : L SP byte_size . (62)
-
- . reduce 62
-
-
-state 160
- cmd : RETR check_login SP pathname CRLF . (13)
-
- . reduce 13
-
-
-state 161
- cmd : STOR check_login SP pathname CRLF . (14)
-
- . reduce 14
-
-
-state 162
- cmd : APPE check_login SP pathname CRLF . (15)
-
- . reduce 15
-
-
-state 163
- cmd : ALLO SP NUMBER SP R . SP NUMBER CRLF (12)
-
- SP shift 181
- . error
-
-
-state 164
- rcmd : RNFR check_login SP pathname CRLF . (47)
-
- . reduce 47
-
-
-state 165
- cmd : DELE check_login SP pathname CRLF . (22)
-
- . reduce 22
-
-
-state 166
- cmd : CWD check_login SP pathname CRLF . (26)
-
- . reduce 26
-
-
-state 167
- cmd : LIST check_login SP pathname CRLF . (19)
-
- . reduce 19
-
-
-state 168
- cmd : NLST check_login SP STRING CRLF . (17)
-
- . reduce 17
-
-
-state 169
- cmd : SITE SP HELP SP STRING . CRLF (35)
-
- CRLF shift 182
- . error
-
-
-state 170
- cmd : SITE SP UMASK check_login SP . octal_number CRLF (37)
-
- NUMBER shift 183
- . error
-
- octal_number goto 184
-
-
-state 171
- cmd : SITE SP UMASK check_login CRLF . (36)
-
- . reduce 36
-
-
-state 172
- cmd : SITE SP IDLE SP NUMBER . CRLF (40)
-
- CRLF shift 185
- . error
-
-
-state 173
- cmd : SITE SP CHMOD check_login SP . octal_number SP pathname CRLF (38)
-
- NUMBER shift 183
- . error
-
- octal_number goto 186
-
-
-state 174
- cmd : STAT check_login SP pathname CRLF . (20)
-
- . reduce 20
-
-
-state 175
- cmd : MKD check_login SP pathname CRLF . (30)
-
- . reduce 30
-
-
-state 176
- cmd : RMD check_login SP pathname CRLF . (31)
-
- . reduce 31
-
-
-state 177
- cmd : STOU check_login SP pathname CRLF . (41)
-
- . reduce 41
-
-
-state 178
- cmd : SIZE check_login SP pathname CRLF . (43)
-
- . reduce 43
-
-
-state 179
- cmd : MDTM check_login SP pathname CRLF . (44)
-
- . reduce 44
-
-
-state 180
- host_port : NUMBER COMMA NUMBER COMMA . NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER (52)
-
- NUMBER shift 187
- . error
-
-
-state 181
- cmd : ALLO SP NUMBER SP R SP . NUMBER CRLF (12)
-
- NUMBER shift 188
- . error
-
-
-state 182
- cmd : SITE SP HELP SP STRING CRLF . (35)
-
- . reduce 35
-
-
-state 183
- octal_number : NUMBER . (72)
-
- . reduce 72
-
-
-state 184
- cmd : SITE SP UMASK check_login SP octal_number . CRLF (37)
-
- CRLF shift 189
- . error
-
-
-state 185
- cmd : SITE SP IDLE SP NUMBER CRLF . (40)
-
- . reduce 40
-
-
-state 186
- cmd : SITE SP CHMOD check_login SP octal_number . SP pathname CRLF (38)
-
- SP shift 190
- . error
-
-
-state 187
- host_port : NUMBER COMMA NUMBER COMMA NUMBER . COMMA NUMBER COMMA NUMBER COMMA NUMBER (52)
-
- COMMA shift 191
- . error
-
-
-state 188
- cmd : ALLO SP NUMBER SP R SP NUMBER . CRLF (12)
-
- CRLF shift 192
- . error
-
-
-state 189
- cmd : SITE SP UMASK check_login SP octal_number CRLF . (37)
-
- . reduce 37
-
-
-state 190
- cmd : SITE SP CHMOD check_login SP octal_number SP . pathname CRLF (38)
-
- STRING shift 94
- . error
-
- pathname goto 193
- pathstring goto 96
-
-
-state 191
- host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA . NUMBER COMMA NUMBER COMMA NUMBER (52)
-
- NUMBER shift 194
- . error
-
-
-state 192
- cmd : ALLO SP NUMBER SP R SP NUMBER CRLF . (12)
-
- . reduce 12
-
-
-state 193
- cmd : SITE SP CHMOD check_login SP octal_number SP pathname . CRLF (38)
-
- CRLF shift 195
- . error
-
-
-state 194
- host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER . COMMA NUMBER COMMA NUMBER (52)
-
- COMMA shift 196
- . error
-
-
-state 195
- cmd : SITE SP CHMOD check_login SP octal_number SP pathname CRLF . (38)
-
- . reduce 38
-
-
-state 196
- host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA . NUMBER COMMA NUMBER (52)
-
- NUMBER shift 197
- . error
-
-
-state 197
- host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER . COMMA NUMBER (52)
-
- COMMA shift 198
- . error
-
-
-state 198
- host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA . NUMBER (52)
-
- NUMBER shift 199
- . error
-
-
-state 199
- host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER . (52)
-
- . reduce 52
-
-
-65 terminals, 16 nonterminals
-74 grammar rules, 200 states
diff --git a/usr.bin/yacc/test/ftp.tab.c b/usr.bin/yacc/test/ftp.tab.c
deleted file mode 100644
index b975860..0000000
--- a/usr.bin/yacc/test/ftp.tab.c
+++ /dev/null
@@ -1,1785 +0,0 @@
-#ifndef lint
-static char const yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93";
-#endif
-#include <stdlib.h>
-#define YYBYACC 1
-#define YYMAJOR 1
-#define YYMINOR 9
-#define YYLEX yylex()
-#define YYEMPTY -1
-#define yyclearin (yychar=(YYEMPTY))
-#define yyerrok (yyerrflag=0)
-#define YYRECOVERING (yyerrflag!=0)
-#if defined(c_plusplus) || defined(__cplusplus)
-#include <stdlib.h>
-#else
-extern char *getenv();
-extern void *realloc();
-#endif
-static int yygrowstack();
-#define YYPREFIX "yy"
-#line 26 "ftp.y"
-
-#ifndef lint
-static char sccsid[] = "@(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-
-#include <arpa/ftp.h>
-
-#include <stdio.h>
-#include <signal.h>
-#include <ctype.h>
-#include <pwd.h>
-#include <setjmp.h>
-#include <syslog.h>
-#include <sys/stat.h>
-#include <time.h>
-
-extern struct sockaddr_in data_dest;
-extern int logged_in;
-extern struct passwd *pw;
-extern int guest;
-extern int logging;
-extern int type;
-extern int form;
-extern int debug;
-extern int timeout;
-extern int maxtimeout;
-extern int pdata;
-extern char hostname[], remotehost[];
-extern char proctitle[];
-extern char *globerr;
-extern int usedefault;
-extern int transflag;
-extern char tmpline[];
-char **glob();
-
-static int cmd_type;
-static int cmd_form;
-static int cmd_bytesz;
-char cbuf[512];
-char *fromname;
-
-char *index();
-#line 70 "ftp.tab.c"
-#define A 257
-#define B 258
-#define C 259
-#define E 260
-#define F 261
-#define I 262
-#define L 263
-#define N 264
-#define P 265
-#define R 266
-#define S 267
-#define T 268
-#define SP 269
-#define CRLF 270
-#define COMMA 271
-#define STRING 272
-#define NUMBER 273
-#define USER 274
-#define PASS 275
-#define ACCT 276
-#define REIN 277
-#define QUIT 278
-#define PORT 279
-#define PASV 280
-#define TYPE 281
-#define STRU 282
-#define MODE 283
-#define RETR 284
-#define STOR 285
-#define APPE 286
-#define MLFL 287
-#define MAIL 288
-#define MSND 289
-#define MSOM 290
-#define MSAM 291
-#define MRSQ 292
-#define MRCP 293
-#define ALLO 294
-#define REST 295
-#define RNFR 296
-#define RNTO 297
-#define ABOR 298
-#define DELE 299
-#define CWD 300
-#define LIST 301
-#define NLST 302
-#define SITE 303
-#define STAT 304
-#define HELP 305
-#define NOOP 306
-#define MKD 307
-#define RMD 308
-#define PWD 309
-#define CDUP 310
-#define STOU 311
-#define SMNT 312
-#define SYST 313
-#define SIZE 314
-#define MDTM 315
-#define UMASK 316
-#define IDLE 317
-#define CHMOD 318
-#define LEXERR 319
-#define YYERRCODE 256
-const short yylhs[] = { -1,
- 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 2, 3, 4, 4,
- 12, 5, 13, 13, 13, 6, 6, 6, 6, 6,
- 6, 6, 6, 7, 7, 7, 8, 8, 8, 10,
- 14, 11, 9,
-};
-const short yylen[] = { 2,
- 0, 2, 2, 4, 4, 4, 2, 4, 4, 4,
- 4, 8, 5, 5, 5, 3, 5, 3, 5, 5,
- 2, 5, 4, 2, 3, 5, 2, 4, 2, 5,
- 5, 3, 3, 4, 6, 5, 7, 9, 4, 6,
- 5, 2, 5, 5, 2, 2, 5, 1, 0, 1,
- 1, 11, 1, 1, 1, 1, 3, 1, 3, 1,
- 1, 3, 2, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 0,
-};
-const short yydefred[] = { 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 73, 73, 73, 0, 73, 0, 0, 73, 73, 73,
- 73, 0, 0, 0, 0, 73, 73, 73, 73, 73,
- 0, 73, 73, 2, 3, 46, 0, 0, 45, 0,
- 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 24, 0, 0, 0, 0, 0, 21, 0, 0, 27,
- 29, 0, 0, 0, 0, 0, 42, 0, 0, 48,
- 0, 50, 0, 0, 0, 0, 0, 60, 0, 0,
- 64, 66, 65, 0, 68, 69, 67, 0, 0, 0,
- 0, 0, 0, 71, 0, 70, 0, 0, 25, 0,
- 18, 0, 16, 0, 73, 0, 73, 0, 0, 0,
- 0, 32, 33, 0, 0, 0, 4, 5, 0, 6,
- 0, 0, 0, 51, 63, 8, 9, 10, 0, 0,
- 0, 0, 11, 0, 23, 0, 0, 0, 0, 0,
- 34, 0, 0, 39, 0, 0, 28, 0, 0, 0,
- 0, 0, 0, 55, 53, 54, 57, 59, 62, 13,
- 14, 15, 0, 47, 22, 26, 19, 17, 0, 0,
- 36, 0, 0, 20, 30, 31, 41, 43, 44, 0,
- 0, 35, 72, 0, 40, 0, 0, 0, 37, 0,
- 0, 12, 0, 0, 38, 0, 0, 0, 52,
-};
-const short yydgoto[] = { 1,
- 34, 35, 71, 73, 75, 80, 84, 88, 45, 95,
- 184, 125, 157, 96,
-};
-const short yysindex[] = { 0,
- -224, -247, -239, -236, -232, -222, -204, -200, -181, -177,
- 0, 0, 0, -166, 0, -161, -199, 0, 0, 0,
- 0, -160, -159, -264, -158, 0, 0, 0, 0, 0,
- -157, 0, 0, 0, 0, 0, -167, -162, 0, -156,
- 0, -250, -198, -165, -155, -154, -153, -151, -150, -152,
- 0, -145, -252, -229, -217, -302, 0, -144, -146, 0,
- 0, -142, -141, -140, -139, -137, 0, -136, -135, 0,
- -134, 0, -133, -132, -130, -131, -128, 0, -249, -127,
- 0, 0, 0, -126, 0, 0, 0, -125, -152, -152,
- -152, -205, -152, 0, -124, 0, -152, -152, 0, -152,
- 0, -143, 0, -173, 0, -171, 0, -152, -123, -152,
- -152, 0, 0, -152, -152, -152, 0, 0, -138, 0,
- -164, -164, -122, 0, 0, 0, 0, 0, -121, -120,
- -118, -148, 0, -117, 0, -116, -115, -114, -113, -112,
- 0, -163, -111, 0, -110, -109, 0, -107, -106, -105,
- -104, -103, -129, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, -101, 0, 0, 0, 0, 0, -100, -102,
- 0, -98, -102, 0, 0, 0, 0, 0, 0, -99,
- -97, 0, 0, -95, 0, -96, -94, -92, 0, -152,
- -93, 0, -91, -90, 0, -88, -87, -86, 0,
-};
-const short yyrindex[] = { 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, -83, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, -82, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, -81, -80, 0, -158, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-const short yygindex[] = { 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 16, -89,
- -25, 35, 47, 0,
-};
-#define YYTABLESIZE 190
-const short yytable[] = { 129,
- 130, 131, 104, 134, 59, 60, 76, 136, 137, 77,
- 138, 78, 79, 105, 106, 107, 98, 99, 146, 123,
- 148, 149, 36, 124, 150, 151, 152, 46, 47, 37,
- 49, 2, 38, 52, 53, 54, 55, 39, 58, 100,
- 101, 62, 63, 64, 65, 66, 40, 68, 69, 3,
- 4, 102, 103, 5, 6, 7, 8, 9, 10, 11,
- 12, 13, 81, 132, 133, 41, 82, 83, 42, 14,
- 51, 15, 16, 17, 18, 19, 20, 21, 22, 23,
- 24, 25, 26, 27, 28, 29, 30, 43, 31, 32,
- 33, 44, 85, 86, 154, 140, 141, 143, 144, 155,
- 193, 87, 48, 156, 70, 170, 171, 50, 56, 72,
- 57, 61, 67, 89, 90, 91, 74, 163, 93, 94,
- 142, 92, 145, 97, 108, 109, 110, 111, 139, 112,
- 113, 114, 115, 116, 153, 117, 118, 121, 119, 120,
- 122, 180, 126, 127, 128, 135, 147, 186, 160, 161,
- 124, 162, 164, 165, 166, 167, 168, 159, 173, 169,
- 174, 172, 175, 176, 177, 178, 179, 181, 158, 182,
- 183, 185, 190, 187, 189, 188, 191, 192, 195, 194,
- 196, 0, 0, 198, 197, 73, 199, 49, 56, 58,
-};
-const short yycheck[] = { 89,
- 90, 91, 305, 93, 269, 270, 257, 97, 98, 260,
- 100, 262, 263, 316, 317, 318, 269, 270, 108, 269,
- 110, 111, 270, 273, 114, 115, 116, 12, 13, 269,
- 15, 256, 269, 18, 19, 20, 21, 270, 23, 269,
- 270, 26, 27, 28, 29, 30, 269, 32, 33, 274,
- 275, 269, 270, 278, 279, 280, 281, 282, 283, 284,
- 285, 286, 261, 269, 270, 270, 265, 266, 269, 294,
- 270, 296, 297, 298, 299, 300, 301, 302, 303, 304,
- 305, 306, 307, 308, 309, 310, 311, 269, 313, 314,
- 315, 269, 258, 259, 259, 269, 270, 269, 270, 264,
- 190, 267, 269, 268, 272, 269, 270, 269, 269, 272,
- 270, 270, 270, 269, 269, 269, 273, 266, 269, 272,
- 105, 273, 107, 269, 269, 272, 269, 269, 272, 270,
- 270, 269, 269, 269, 273, 270, 270, 269, 271, 270,
- 269, 271, 270, 270, 270, 270, 270, 173, 270, 270,
- 273, 270, 270, 270, 270, 270, 270, 123, 269, 272,
- 270, 273, 270, 270, 270, 270, 270, 269, 122, 270,
- 273, 270, 269, 273, 270, 273, 271, 270, 270, 273,
- 271, -1, -1, 271, 273, 269, 273, 270, 270, 270,
-};
-#define YYFINAL 1
-#ifndef YYDEBUG
-#define YYDEBUG 0
-#elif YYDEBUG
-#include <stdio.h>
-#endif
-#define YYMAXTOKEN 319
-#if YYDEBUG
-const char * const yyname[] = {
-"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A","B","C","E","F","I","L","N",
-"P","R","S","T","SP","CRLF","COMMA","STRING","NUMBER","USER","PASS","ACCT",
-"REIN","QUIT","PORT","PASV","TYPE","STRU","MODE","RETR","STOR","APPE","MLFL",
-"MAIL","MSND","MSOM","MSAM","MRSQ","MRCP","ALLO","REST","RNFR","RNTO","ABOR",
-"DELE","CWD","LIST","NLST","SITE","STAT","HELP","NOOP","MKD","RMD","PWD","CDUP",
-"STOU","SMNT","SYST","SIZE","MDTM","UMASK","IDLE","CHMOD","LEXERR",
-};
-const char * const yyrule[] = {
-"$accept : cmd_list",
-"cmd_list :",
-"cmd_list : cmd_list cmd",
-"cmd_list : cmd_list rcmd",
-"cmd : USER SP username CRLF",
-"cmd : PASS SP password CRLF",
-"cmd : PORT SP host_port CRLF",
-"cmd : PASV CRLF",
-"cmd : TYPE SP type_code CRLF",
-"cmd : STRU SP struct_code CRLF",
-"cmd : MODE SP mode_code CRLF",
-"cmd : ALLO SP NUMBER CRLF",
-"cmd : ALLO SP NUMBER SP R SP NUMBER CRLF",
-"cmd : RETR check_login SP pathname CRLF",
-"cmd : STOR check_login SP pathname CRLF",
-"cmd : APPE check_login SP pathname CRLF",
-"cmd : NLST check_login CRLF",
-"cmd : NLST check_login SP STRING CRLF",
-"cmd : LIST check_login CRLF",
-"cmd : LIST check_login SP pathname CRLF",
-"cmd : STAT check_login SP pathname CRLF",
-"cmd : STAT CRLF",
-"cmd : DELE check_login SP pathname CRLF",
-"cmd : RNTO SP pathname CRLF",
-"cmd : ABOR CRLF",
-"cmd : CWD check_login CRLF",
-"cmd : CWD check_login SP pathname CRLF",
-"cmd : HELP CRLF",
-"cmd : HELP SP STRING CRLF",
-"cmd : NOOP CRLF",
-"cmd : MKD check_login SP pathname CRLF",
-"cmd : RMD check_login SP pathname CRLF",
-"cmd : PWD check_login CRLF",
-"cmd : CDUP check_login CRLF",
-"cmd : SITE SP HELP CRLF",
-"cmd : SITE SP HELP SP STRING CRLF",
-"cmd : SITE SP UMASK check_login CRLF",
-"cmd : SITE SP UMASK check_login SP octal_number CRLF",
-"cmd : SITE SP CHMOD check_login SP octal_number SP pathname CRLF",
-"cmd : SITE SP IDLE CRLF",
-"cmd : SITE SP IDLE SP NUMBER CRLF",
-"cmd : STOU check_login SP pathname CRLF",
-"cmd : SYST CRLF",
-"cmd : SIZE check_login SP pathname CRLF",
-"cmd : MDTM check_login SP pathname CRLF",
-"cmd : QUIT CRLF",
-"cmd : error CRLF",
-"rcmd : RNFR check_login SP pathname CRLF",
-"username : STRING",
-"password :",
-"password : STRING",
-"byte_size : NUMBER",
-"host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER",
-"form_code : N",
-"form_code : T",
-"form_code : C",
-"type_code : A",
-"type_code : A SP form_code",
-"type_code : E",
-"type_code : E SP form_code",
-"type_code : I",
-"type_code : L",
-"type_code : L SP byte_size",
-"type_code : L byte_size",
-"struct_code : F",
-"struct_code : R",
-"struct_code : P",
-"mode_code : S",
-"mode_code : B",
-"mode_code : C",
-"pathname : pathstring",
-"pathstring : STRING",
-"octal_number : NUMBER",
-"check_login :",
-};
-#endif
-#ifndef YYSTYPE
-typedef int YYSTYPE;
-#endif
-#ifdef YYSTACKSIZE
-#undef YYMAXDEPTH
-#define YYMAXDEPTH YYSTACKSIZE
-#else
-#ifdef YYMAXDEPTH
-#define YYSTACKSIZE YYMAXDEPTH
-#else
-#define YYSTACKSIZE 10000
-#define YYMAXDEPTH 10000
-#endif
-#endif
-#define YYINITSTACKSIZE 200
-int yydebug;
-int yynerrs;
-int yyerrflag;
-int yychar;
-short *yyssp;
-YYSTYPE *yyvsp;
-YYSTYPE yyval;
-YYSTYPE yylval;
-short *yyss;
-short *yysslim;
-YYSTYPE *yyvs;
-int yystacksize;
-#line 658 "ftp.y"
-
-extern jmp_buf errcatch;
-
-#define CMD 0 /* beginning of command */
-#define ARGS 1 /* expect miscellaneous arguments */
-#define STR1 2 /* expect SP followed by STRING */
-#define STR2 3 /* expect STRING */
-#define OSTR 4 /* optional SP then STRING */
-#define ZSTR1 5 /* SP then optional STRING */
-#define ZSTR2 6 /* optional STRING after SP */
-#define SITECMD 7 /* SITE command */
-#define NSTR 8 /* Number followed by a string */
-
-struct tab {
- char *name;
- short token;
- short state;
- short implemented; /* 1 if command is implemented */
- char *help;
-};
-
-struct tab cmdtab[] = { /* In order defined in RFC 765 */
- { "USER", USER, STR1, 1, "<sp> username" },
- { "PASS", PASS, ZSTR1, 1, "<sp> password" },
- { "ACCT", ACCT, STR1, 0, "(specify account)" },
- { "SMNT", SMNT, ARGS, 0, "(structure mount)" },
- { "REIN", REIN, ARGS, 0, "(reinitialize server state)" },
- { "QUIT", QUIT, ARGS, 1, "(terminate service)", },
- { "PORT", PORT, ARGS, 1, "<sp> b0, b1, b2, b3, b4" },
- { "PASV", PASV, ARGS, 1, "(set server in passive mode)" },
- { "TYPE", TYPE, ARGS, 1, "<sp> [ A | E | I | L ]" },
- { "STRU", STRU, ARGS, 1, "(specify file structure)" },
- { "MODE", MODE, ARGS, 1, "(specify transfer mode)" },
- { "RETR", RETR, STR1, 1, "<sp> file-name" },
- { "STOR", STOR, STR1, 1, "<sp> file-name" },
- { "APPE", APPE, STR1, 1, "<sp> file-name" },
- { "MLFL", MLFL, OSTR, 0, "(mail file)" },
- { "MAIL", MAIL, OSTR, 0, "(mail to user)" },
- { "MSND", MSND, OSTR, 0, "(mail send to terminal)" },
- { "MSOM", MSOM, OSTR, 0, "(mail send to terminal or mailbox)" },
- { "MSAM", MSAM, OSTR, 0, "(mail send to terminal and mailbox)" },
- { "MRSQ", MRSQ, OSTR, 0, "(mail recipient scheme question)" },
- { "MRCP", MRCP, STR1, 0, "(mail recipient)" },
- { "ALLO", ALLO, ARGS, 1, "allocate storage (vacuously)" },
- { "REST", REST, ARGS, 0, "(restart command)" },
- { "RNFR", RNFR, STR1, 1, "<sp> file-name" },
- { "RNTO", RNTO, STR1, 1, "<sp> file-name" },
- { "ABOR", ABOR, ARGS, 1, "(abort operation)" },
- { "DELE", DELE, STR1, 1, "<sp> file-name" },
- { "CWD", CWD, OSTR, 1, "[ <sp> directory-name ]" },
- { "XCWD", CWD, OSTR, 1, "[ <sp> directory-name ]" },
- { "LIST", LIST, OSTR, 1, "[ <sp> path-name ]" },
- { "NLST", NLST, OSTR, 1, "[ <sp> path-name ]" },
- { "SITE", SITE, SITECMD, 1, "site-cmd [ <sp> arguments ]" },
- { "SYST", SYST, ARGS, 1, "(get type of operating system)" },
- { "STAT", STAT, OSTR, 1, "[ <sp> path-name ]" },
- { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" },
- { "NOOP", NOOP, ARGS, 1, "" },
- { "MKD", MKD, STR1, 1, "<sp> path-name" },
- { "XMKD", MKD, STR1, 1, "<sp> path-name" },
- { "RMD", RMD, STR1, 1, "<sp> path-name" },
- { "XRMD", RMD, STR1, 1, "<sp> path-name" },
- { "PWD", PWD, ARGS, 1, "(return current directory)" },
- { "XPWD", PWD, ARGS, 1, "(return current directory)" },
- { "CDUP", CDUP, ARGS, 1, "(change to parent directory)" },
- { "XCUP", CDUP, ARGS, 1, "(change to parent directory)" },
- { "STOU", STOU, STR1, 1, "<sp> file-name" },
- { "SIZE", SIZE, OSTR, 1, "<sp> path-name" },
- { "MDTM", MDTM, OSTR, 1, "<sp> path-name" },
- { NULL, 0, 0, 0, 0 }
-};
-
-struct tab sitetab[] = {
- { "UMASK", UMASK, ARGS, 1, "[ <sp> umask ]" },
- { "IDLE", IDLE, ARGS, 1, "[ <sp> maximum-idle-time ]" },
- { "CHMOD", CHMOD, NSTR, 1, "<sp> mode <sp> file-name" },
- { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" },
- { NULL, 0, 0, 0, 0 }
-};
-
-struct tab *
-lookup(p, cmd)
- register struct tab *p;
- char *cmd;
-{
-
- for (; p->name != NULL; p++)
- if (strcmp(cmd, p->name) == 0)
- return (p);
- return (0);
-}
-
-#include <arpa/telnet.h>
-
-/*
- * getline - a hacked up version of fgets to ignore TELNET escape codes.
- */
-char *
-getline(s, n, iop)
- char *s;
- register FILE *iop;
-{
- register c;
- register char *cs;
-
- cs = s;
-/* tmpline may contain saved command from urgent mode interruption */
- for (c = 0; tmpline[c] != '\0' && --n > 0; ++c) {
- *cs++ = tmpline[c];
- if (tmpline[c] == '\n') {
- *cs++ = '\0';
- if (debug)
- syslog(LOG_DEBUG, "command: %s", s);
- tmpline[0] = '\0';
- return(s);
- }
- if (c == 0)
- tmpline[0] = '\0';
- }
- while ((c = getc(iop)) != EOF) {
- c &= 0377;
- if (c == IAC) {
- if ((c = getc(iop)) != EOF) {
- c &= 0377;
- switch (c) {
- case WILL:
- case WONT:
- c = getc(iop);
- printf("%c%c%c", IAC, DONT, 0377&c);
- (void) fflush(stdout);
- continue;
- case DO:
- case DONT:
- c = getc(iop);
- printf("%c%c%c", IAC, WONT, 0377&c);
- (void) fflush(stdout);
- continue;
- case IAC:
- break;
- default:
- continue; /* ignore command */
- }
- }
- }
- *cs++ = c;
- if (--n <= 0 || c == '\n')
- break;
- }
- if (c == EOF && cs == s)
- return (NULL);
- *cs++ = '\0';
- if (debug)
- syslog(LOG_DEBUG, "command: %s", s);
- return (s);
-}
-
-static int
-toolong()
-{
- time_t now;
- extern char *ctime();
- extern time_t time();
-
- reply(421,
- "Timeout (%d seconds): closing control connection.", timeout);
- (void) time(&now);
- if (logging) {
- syslog(LOG_INFO,
- "User %s timed out after %d seconds at %s",
- (pw ? pw -> pw_name : "unknown"), timeout, ctime(&now));
- }
- dologout(1);
-}
-
-yylex()
-{
- static int cpos, state;
- register char *cp, *cp2;
- register struct tab *p;
- int n;
- char c, *strpbrk();
- char *copy();
-
- for (;;) {
- switch (state) {
-
- case CMD:
- (void) signal(SIGALRM, toolong);
- (void) alarm((unsigned) timeout);
- if (getline(cbuf, sizeof(cbuf)-1, stdin) == NULL) {
- reply(221, "You could at least say goodbye.");
- dologout(0);
- }
- (void) alarm(0);
-#ifdef SETPROCTITLE
- if (strncasecmp(cbuf, "PASS", 4) != NULL)
- setproctitle("%s: %s", proctitle, cbuf);
-#endif /* SETPROCTITLE */
- if ((cp = index(cbuf, '\r'))) {
- *cp++ = '\n';
- *cp = '\0';
- }
- if ((cp = strpbrk(cbuf, " \n")))
- cpos = cp - cbuf;
- if (cpos == 0)
- cpos = 4;
- c = cbuf[cpos];
- cbuf[cpos] = '\0';
- upper(cbuf);
- p = lookup(cmdtab, cbuf);
- cbuf[cpos] = c;
- if (p != 0) {
- if (p->implemented == 0) {
- nack(p->name);
- longjmp(errcatch,0);
- /* NOTREACHED */
- }
- state = p->state;
- *(char **)&yylval = p->name;
- return (p->token);
- }
- break;
-
- case SITECMD:
- if (cbuf[cpos] == ' ') {
- cpos++;
- return (SP);
- }
- cp = &cbuf[cpos];
- if ((cp2 = strpbrk(cp, " \n")))
- cpos = cp2 - cbuf;
- c = cbuf[cpos];
- cbuf[cpos] = '\0';
- upper(cp);
- p = lookup(sitetab, cp);
- cbuf[cpos] = c;
- if (p != 0) {
- if (p->implemented == 0) {
- state = CMD;
- nack(p->name);
- longjmp(errcatch,0);
- /* NOTREACHED */
- }
- state = p->state;
- *(char **)&yylval = p->name;
- return (p->token);
- }
- state = CMD;
- break;
-
- case OSTR:
- if (cbuf[cpos] == '\n') {
- state = CMD;
- return (CRLF);
- }
- /* FALLTHROUGH */
-
- case STR1:
- case ZSTR1:
- dostr1:
- if (cbuf[cpos] == ' ') {
- cpos++;
- state = state == OSTR ? STR2 : ++state;
- return (SP);
- }
- break;
-
- case ZSTR2:
- if (cbuf[cpos] == '\n') {
- state = CMD;
- return (CRLF);
- }
- /* FALLTHROUGH */
-
- case STR2:
- cp = &cbuf[cpos];
- n = strlen(cp);
- cpos += n - 1;
- /*
- * Make sure the string is nonempty and \n terminated.
- */
- if (n > 1 && cbuf[cpos] == '\n') {
- cbuf[cpos] = '\0';
- *(char **)&yylval = copy(cp);
- cbuf[cpos] = '\n';
- state = ARGS;
- return (STRING);
- }
- break;
-
- case NSTR:
- if (cbuf[cpos] == ' ') {
- cpos++;
- return (SP);
- }
- if (isdigit(cbuf[cpos])) {
- cp = &cbuf[cpos];
- while (isdigit(cbuf[++cpos]))
- ;
- c = cbuf[cpos];
- cbuf[cpos] = '\0';
- yylval = atoi(cp);
- cbuf[cpos] = c;
- state = STR1;
- return (NUMBER);
- }
- state = STR1;
- goto dostr1;
-
- case ARGS:
- if (isdigit(cbuf[cpos])) {
- cp = &cbuf[cpos];
- while (isdigit(cbuf[++cpos]))
- ;
- c = cbuf[cpos];
- cbuf[cpos] = '\0';
- yylval = atoi(cp);
- cbuf[cpos] = c;
- return (NUMBER);
- }
- switch (cbuf[cpos++]) {
-
- case '\n':
- state = CMD;
- return (CRLF);
-
- case ' ':
- return (SP);
-
- case ',':
- return (COMMA);
-
- case 'A':
- case 'a':
- return (A);
-
- case 'B':
- case 'b':
- return (B);
-
- case 'C':
- case 'c':
- return (C);
-
- case 'E':
- case 'e':
- return (E);
-
- case 'F':
- case 'f':
- return (F);
-
- case 'I':
- case 'i':
- return (I);
-
- case 'L':
- case 'l':
- return (L);
-
- case 'N':
- case 'n':
- return (N);
-
- case 'P':
- case 'p':
- return (P);
-
- case 'R':
- case 'r':
- return (R);
-
- case 'S':
- case 's':
- return (S);
-
- case 'T':
- case 't':
- return (T);
-
- }
- break;
-
- default:
- fatal("Unknown state in scanner.");
- }
- yyerror((char *) 0);
- state = CMD;
- longjmp(errcatch,0);
- }
-}
-
-upper(s)
- register char *s;
-{
- while (*s != '\0') {
- if (islower(*s))
- *s = toupper(*s);
- s++;
- }
-}
-
-char *
-copy(s)
- char *s;
-{
- char *p;
- extern char *malloc(), *strcpy();
-
- p = malloc((unsigned) strlen(s) + 1);
- if (p == NULL)
- fatal("Ran out of memory.");
- (void) strcpy(p, s);
- return (p);
-}
-
-help(ctab, s)
- struct tab *ctab;
- char *s;
-{
- register struct tab *c;
- register int width, NCMDS;
- char *type;
-
- if (ctab == sitetab)
- type = "SITE ";
- else
- type = "";
- width = 0, NCMDS = 0;
- for (c = ctab; c->name != NULL; c++) {
- int len = strlen(c->name);
-
- if (len > width)
- width = len;
- NCMDS++;
- }
- width = (width + 8) &~ 7;
- if (s == 0) {
- register int i, j, w;
- int columns, lines;
-
- lreply(214, "The following %scommands are recognized %s.",
- type, "(* =>'s unimplemented)");
- columns = 76 / width;
- if (columns == 0)
- columns = 1;
- lines = (NCMDS + columns - 1) / columns;
- for (i = 0; i < lines; i++) {
- printf(" ");
- for (j = 0; j < columns; j++) {
- c = ctab + j * lines + i;
- printf("%s%c", c->name,
- c->implemented ? ' ' : '*');
- if (c + lines >= &ctab[NCMDS])
- break;
- w = strlen(c->name) + 1;
- while (w < width) {
- putchar(' ');
- w++;
- }
- }
- printf("\r\n");
- }
- (void) fflush(stdout);
- reply(214, "Direct comments to ftp-bugs@%s.", hostname);
- return;
- }
- upper(s);
- c = lookup(ctab, s);
- if (c == (struct tab *)0) {
- reply(502, "Unknown command %s.", s);
- return;
- }
- if (c->implemented)
- reply(214, "Syntax: %s%s %s", type, c->name, c->help);
- else
- reply(214, "%s%-*s\t%s; unimplemented.", type, width,
- c->name, c->help);
-}
-
-sizecmd(filename)
-char *filename;
-{
- switch (type) {
- case TYPE_L:
- case TYPE_I: {
- struct stat stbuf;
- if (stat(filename, &stbuf) < 0 ||
- (stbuf.st_mode&S_IFMT) != S_IFREG)
- reply(550, "%s: not a plain file.", filename);
- else
- reply(213, "%lu", stbuf.st_size);
- break;}
- case TYPE_A: {
- FILE *fin;
- register int c, count;
- struct stat stbuf;
- fin = fopen(filename, "r");
- if (fin == NULL) {
- perror_reply(550, filename);
- return;
- }
- if (fstat(fileno(fin), &stbuf) < 0 ||
- (stbuf.st_mode&S_IFMT) != S_IFREG) {
- reply(550, "%s: not a plain file.", filename);
- (void) fclose(fin);
- return;
- }
-
- count = 0;
- while((c=getc(fin)) != EOF) {
- if (c == '\n') /* will get expanded to \r\n */
- count++;
- count++;
- }
- (void) fclose(fin);
-
- reply(213, "%ld", count);
- break;}
- default:
- reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]);
- }
-}
-#line 920 "ftp.tab.c"
-/* allocate initial stack or double stack size, up to YYMAXDEPTH */
-static int yygrowstack()
-{
- int newsize, i;
- short *newss;
- YYSTYPE *newvs;
-
- if ((newsize = yystacksize) == 0)
- newsize = YYINITSTACKSIZE;
- else if (newsize >= YYMAXDEPTH)
- return -1;
- else if ((newsize *= 2) > YYMAXDEPTH)
- newsize = YYMAXDEPTH;
- i = yyssp - yyss;
- if ((newss = (short *)realloc(yyss, newsize * sizeof *newss)) == NULL)
- return -1;
- yyss = newss;
- yyssp = newss + i;
- if ((newvs = (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs)) == NULL)
- return -1;
- yyvs = newvs;
- yyvsp = newvs + i;
- yystacksize = newsize;
- yysslim = yyss + newsize - 1;
- return 0;
-}
-
-#define YYABORT goto yyabort
-#define YYREJECT goto yyabort
-#define YYACCEPT goto yyaccept
-#define YYERROR goto yyerrlab
-
-int
-yyparse()
-{
- register int yym, yyn, yystate;
-#if YYDEBUG
- register const char *yys;
-
- if ((yys = getenv("YYDEBUG")))
- {
- yyn = *yys;
- if (yyn >= '0' && yyn <= '9')
- yydebug = yyn - '0';
- }
-#endif
-
- yynerrs = 0;
- yyerrflag = 0;
- yychar = (-1);
-
- if (yyss == NULL && yygrowstack()) goto yyoverflow;
- yyssp = yyss;
- yyvsp = yyvs;
- *yyssp = yystate = 0;
-
-yyloop:
- if ((yyn = yydefred[yystate])) goto yyreduce;
- if (yychar < 0)
- {
- if ((yychar = yylex()) < 0) yychar = 0;
-#if YYDEBUG
- if (yydebug)
- {
- yys = 0;
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
- printf("%sdebug: state %d, reading %d (%s)\n",
- YYPREFIX, yystate, yychar, yys);
- }
-#endif
- }
- if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: state %d, shifting to state %d\n",
- YYPREFIX, yystate, yytable[yyn]);
-#endif
- if (yyssp >= yysslim && yygrowstack())
- {
- goto yyoverflow;
- }
- *++yyssp = yystate = yytable[yyn];
- *++yyvsp = yylval;
- yychar = (-1);
- if (yyerrflag > 0) --yyerrflag;
- goto yyloop;
- }
- if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
- {
- yyn = yytable[yyn];
- goto yyreduce;
- }
- if (yyerrflag) goto yyinrecovery;
-#if defined(lint) || defined(__GNUC__)
- goto yynewerror;
-#endif
-yynewerror:
- yyerror("syntax error");
-#if defined(lint) || defined(__GNUC__)
- goto yyerrlab;
-#endif
-yyerrlab:
- ++yynerrs;
-yyinrecovery:
- if (yyerrflag < 3)
- {
- yyerrflag = 3;
- for (;;)
- {
- if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: state %d, error recovery shifting\
- to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
-#endif
- if (yyssp >= yysslim && yygrowstack())
- {
- goto yyoverflow;
- }
- *++yyssp = yystate = yytable[yyn];
- *++yyvsp = yylval;
- goto yyloop;
- }
- else
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: error recovery discarding state %d\n",
- YYPREFIX, *yyssp);
-#endif
- if (yyssp <= yyss) goto yyabort;
- --yyssp;
- --yyvsp;
- }
- }
- }
- else
- {
- if (yychar == 0) goto yyabort;
-#if YYDEBUG
- if (yydebug)
- {
- yys = 0;
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
- printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
- YYPREFIX, yystate, yychar, yys);
- }
-#endif
- yychar = (-1);
- goto yyloop;
- }
-yyreduce:
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: state %d, reducing by rule %d (%s)\n",
- YYPREFIX, yystate, yyn, yyrule[yyn]);
-#endif
- yym = yylen[yyn];
- yyval = yyvsp[1-yym];
- switch (yyn)
- {
-case 2:
-#line 99 "ftp.y"
- {
- fromname = (char *) 0;
- }
-break;
-case 4:
-#line 106 "ftp.y"
- {
- user((char *) yyvsp[-1]);
- free((char *) yyvsp[-1]);
- }
-break;
-case 5:
-#line 111 "ftp.y"
- {
- pass((char *) yyvsp[-1]);
- free((char *) yyvsp[-1]);
- }
-break;
-case 6:
-#line 116 "ftp.y"
- {
- usedefault = 0;
- if (pdata >= 0) {
- (void) close(pdata);
- pdata = -1;
- }
- reply(200, "PORT command successful.");
- }
-break;
-case 7:
-#line 125 "ftp.y"
- {
- passive();
- }
-break;
-case 8:
-#line 129 "ftp.y"
- {
- switch (cmd_type) {
-
- case TYPE_A:
- if (cmd_form == FORM_N) {
- reply(200, "Type set to A.");
- type = cmd_type;
- form = cmd_form;
- } else
- reply(504, "Form must be N.");
- break;
-
- case TYPE_E:
- reply(504, "Type E not implemented.");
- break;
-
- case TYPE_I:
- reply(200, "Type set to I.");
- type = cmd_type;
- break;
-
- case TYPE_L:
-#if NBBY == 8
- if (cmd_bytesz == 8) {
- reply(200,
- "Type set to L (byte size 8).");
- type = cmd_type;
- } else
- reply(504, "Byte size must be 8.");
-#else /* NBBY == 8 */
- UNIMPLEMENTED for NBBY != 8
-#endif /* NBBY == 8 */
- }
- }
-break;
-case 9:
-#line 164 "ftp.y"
- {
- switch (yyvsp[-1]) {
-
- case STRU_F:
- reply(200, "STRU F ok.");
- break;
-
- default:
- reply(504, "Unimplemented STRU type.");
- }
- }
-break;
-case 10:
-#line 176 "ftp.y"
- {
- switch (yyvsp[-1]) {
-
- case MODE_S:
- reply(200, "MODE S ok.");
- break;
-
- default:
- reply(502, "Unimplemented MODE type.");
- }
- }
-break;
-case 11:
-#line 188 "ftp.y"
- {
- reply(202, "ALLO command ignored.");
- }
-break;
-case 12:
-#line 192 "ftp.y"
- {
- reply(202, "ALLO command ignored.");
- }
-break;
-case 13:
-#line 196 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- retrieve((char *) 0, (char *) yyvsp[-1]);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 14:
-#line 203 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- store((char *) yyvsp[-1], "w", 0);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 15:
-#line 210 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- store((char *) yyvsp[-1], "a", 0);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 16:
-#line 217 "ftp.y"
- {
- if (yyvsp[-1])
- send_file_list(".");
- }
-break;
-case 17:
-#line 222 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- send_file_list((char *) yyvsp[-1]);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 18:
-#line 229 "ftp.y"
- {
- if (yyvsp[-1])
- retrieve("/bin/ls -lgA", "");
- }
-break;
-case 19:
-#line 234 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- retrieve("/bin/ls -lgA %s", (char *) yyvsp[-1]);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 20:
-#line 241 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- statfilecmd((char *) yyvsp[-1]);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 21:
-#line 248 "ftp.y"
- {
- statcmd();
- }
-break;
-case 22:
-#line 252 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- delete((char *) yyvsp[-1]);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 23:
-#line 259 "ftp.y"
- {
- if (fromname) {
- renamecmd(fromname, (char *) yyvsp[-1]);
- free(fromname);
- fromname = (char *) 0;
- } else {
- reply(503, "Bad sequence of commands.");
- }
- free((char *) yyvsp[-1]);
- }
-break;
-case 24:
-#line 270 "ftp.y"
- {
- reply(225, "ABOR command successful.");
- }
-break;
-case 25:
-#line 274 "ftp.y"
- {
- if (yyvsp[-1])
- cwd(pw->pw_dir);
- }
-break;
-case 26:
-#line 279 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- cwd((char *) yyvsp[-1]);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 27:
-#line 286 "ftp.y"
- {
- help(cmdtab, (char *) 0);
- }
-break;
-case 28:
-#line 290 "ftp.y"
- {
- register char *cp = (char *)yyvsp[-1];
-
- if (strncasecmp(cp, "SITE", 4) == 0) {
- cp = (char *)yyvsp[-1] + 4;
- if (*cp == ' ')
- cp++;
- if (*cp)
- help(sitetab, cp);
- else
- help(sitetab, (char *) 0);
- } else
- help(cmdtab, (char *) yyvsp[-1]);
- }
-break;
-case 29:
-#line 305 "ftp.y"
- {
- reply(200, "NOOP command successful.");
- }
-break;
-case 30:
-#line 309 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- makedir((char *) yyvsp[-1]);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 31:
-#line 316 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- removedir((char *) yyvsp[-1]);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 32:
-#line 323 "ftp.y"
- {
- if (yyvsp[-1])
- pwd();
- }
-break;
-case 33:
-#line 328 "ftp.y"
- {
- if (yyvsp[-1])
- cwd("..");
- }
-break;
-case 34:
-#line 333 "ftp.y"
- {
- help(sitetab, (char *) 0);
- }
-break;
-case 35:
-#line 337 "ftp.y"
- {
- help(sitetab, (char *) yyvsp[-1]);
- }
-break;
-case 36:
-#line 341 "ftp.y"
- {
- int oldmask;
-
- if (yyvsp[-1]) {
- oldmask = umask(0);
- (void) umask(oldmask);
- reply(200, "Current UMASK is %03o", oldmask);
- }
- }
-break;
-case 37:
-#line 351 "ftp.y"
- {
- int oldmask;
-
- if (yyvsp[-3]) {
- if ((yyvsp[-1] == -1) || (yyvsp[-1] > 0777)) {
- reply(501, "Bad UMASK value");
- } else {
- oldmask = umask(yyvsp[-1]);
- reply(200,
- "UMASK set to %03o (was %03o)",
- yyvsp[-1], oldmask);
- }
- }
- }
-break;
-case 38:
-#line 366 "ftp.y"
- {
- if (yyvsp[-5] && (yyvsp[-1] != NULL)) {
- if (yyvsp[-3] > 0777)
- reply(501,
- "CHMOD: Mode value must be between 0 and 0777");
- else if (chmod((char *) yyvsp[-1], yyvsp[-3]) < 0)
- perror_reply(550, (char *) yyvsp[-1]);
- else
- reply(200, "CHMOD command successful.");
- }
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 39:
-#line 380 "ftp.y"
- {
- reply(200,
- "Current IDLE time limit is %d seconds; max %d",
- timeout, maxtimeout);
- }
-break;
-case 40:
-#line 386 "ftp.y"
- {
- if (yyvsp[-1] < 30 || yyvsp[-1] > maxtimeout) {
- reply(501,
- "Maximum IDLE time must be between 30 and %d seconds",
- maxtimeout);
- } else {
- timeout = yyvsp[-1];
- (void) alarm((unsigned) timeout);
- reply(200,
- "Maximum IDLE time set to %d seconds",
- timeout);
- }
- }
-break;
-case 41:
-#line 400 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- store((char *) yyvsp[-1], "w", 1);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 42:
-#line 407 "ftp.y"
- {
-#ifdef unix
-#ifdef BSD
- reply(215, "UNIX Type: L%d Version: BSD-%d",
- NBBY, BSD);
-#else /* BSD */
- reply(215, "UNIX Type: L%d", NBBY);
-#endif /* BSD */
-#else /* unix */
- reply(215, "UNKNOWN Type: L%d", NBBY);
-#endif /* unix */
- }
-break;
-case 43:
-#line 428 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL)
- sizecmd((char *) yyvsp[-1]);
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 44:
-#line 445 "ftp.y"
- {
- if (yyvsp[-3] && yyvsp[-1] != NULL) {
- struct stat stbuf;
- if (stat((char *) yyvsp[-1], &stbuf) < 0)
- perror_reply(550, "%s", (char *) yyvsp[-1]);
- else if ((stbuf.st_mode&S_IFMT) != S_IFREG) {
- reply(550, "%s: not a plain file.",
- (char *) yyvsp[-1]);
- } else {
- register struct tm *t;
- struct tm *gmtime();
- t = gmtime(&stbuf.st_mtime);
- reply(213,
- "%d%02d%02d%02d%02d%02d",
- t->tm_year+1900, t->tm_mon+1, t->tm_mday,
- t->tm_hour, t->tm_min, t->tm_sec);
- }
- }
- if (yyvsp[-1] != NULL)
- free((char *) yyvsp[-1]);
- }
-break;
-case 45:
-#line 467 "ftp.y"
- {
- reply(221, "Goodbye.");
- dologout(0);
- }
-break;
-case 46:
-#line 472 "ftp.y"
- {
- yyerrok;
- }
-break;
-case 47:
-#line 477 "ftp.y"
- {
- char *renamefrom();
-
- if (yyvsp[-3] && yyvsp[-1]) {
- fromname = renamefrom((char *) yyvsp[-1]);
- if (fromname == (char *) 0 && yyvsp[-1]) {
- free((char *) yyvsp[-1]);
- }
- }
- }
-break;
-case 49:
-#line 493 "ftp.y"
- {
- *(char **)&(yyval) = "";
- }
-break;
-case 52:
-#line 504 "ftp.y"
- {
- register char *a, *p;
-
- a = (char *)&data_dest.sin_addr;
- a[0] = yyvsp[-10]; a[1] = yyvsp[-8]; a[2] = yyvsp[-6]; a[3] = yyvsp[-4];
- p = (char *)&data_dest.sin_port;
- p[0] = yyvsp[-2]; p[1] = yyvsp[0];
- data_dest.sin_family = AF_INET;
- }
-break;
-case 53:
-#line 516 "ftp.y"
- {
- yyval = FORM_N;
- }
-break;
-case 54:
-#line 520 "ftp.y"
- {
- yyval = FORM_T;
- }
-break;
-case 55:
-#line 524 "ftp.y"
- {
- yyval = FORM_C;
- }
-break;
-case 56:
-#line 530 "ftp.y"
- {
- cmd_type = TYPE_A;
- cmd_form = FORM_N;
- }
-break;
-case 57:
-#line 535 "ftp.y"
- {
- cmd_type = TYPE_A;
- cmd_form = yyvsp[0];
- }
-break;
-case 58:
-#line 540 "ftp.y"
- {
- cmd_type = TYPE_E;
- cmd_form = FORM_N;
- }
-break;
-case 59:
-#line 545 "ftp.y"
- {
- cmd_type = TYPE_E;
- cmd_form = yyvsp[0];
- }
-break;
-case 60:
-#line 550 "ftp.y"
- {
- cmd_type = TYPE_I;
- }
-break;
-case 61:
-#line 554 "ftp.y"
- {
- cmd_type = TYPE_L;
- cmd_bytesz = NBBY;
- }
-break;
-case 62:
-#line 559 "ftp.y"
- {
- cmd_type = TYPE_L;
- cmd_bytesz = yyvsp[0];
- }
-break;
-case 63:
-#line 565 "ftp.y"
- {
- cmd_type = TYPE_L;
- cmd_bytesz = yyvsp[0];
- }
-break;
-case 64:
-#line 572 "ftp.y"
- {
- yyval = STRU_F;
- }
-break;
-case 65:
-#line 576 "ftp.y"
- {
- yyval = STRU_R;
- }
-break;
-case 66:
-#line 580 "ftp.y"
- {
- yyval = STRU_P;
- }
-break;
-case 67:
-#line 586 "ftp.y"
- {
- yyval = MODE_S;
- }
-break;
-case 68:
-#line 590 "ftp.y"
- {
- yyval = MODE_B;
- }
-break;
-case 69:
-#line 594 "ftp.y"
- {
- yyval = MODE_C;
- }
-break;
-case 70:
-#line 600 "ftp.y"
- {
- /*
- * Problem: this production is used for all pathname
- * processing, but only gives a 550 error reply.
- * This is a valid reply in some cases but not in others.
- */
- if (logged_in && yyvsp[0] && strncmp((char *) yyvsp[0], "~", 1) == 0) {
- *(char **)&(yyval) = *glob((char *) yyvsp[0]);
- if (globerr != NULL) {
- reply(550, globerr);
- yyval = NULL;
- }
- free((char *) yyvsp[0]);
- } else
- yyval = yyvsp[0];
- }
-break;
-case 72:
-#line 622 "ftp.y"
- {
- register int ret, dec, multby, digit;
-
- /*
- * Convert a number that was read as decimal number
- * to what it would be if it had been read as octal.
- */
- dec = yyvsp[0];
- multby = 1;
- ret = 0;
- while (dec) {
- digit = dec%10;
- if (digit > 7) {
- ret = -1;
- break;
- }
- ret += digit * multby;
- multby *= 8;
- dec /= 10;
- }
- yyval = ret;
- }
-break;
-case 73:
-#line 647 "ftp.y"
- {
- if (logged_in)
- yyval = 1;
- else {
- reply(530, "Please login with USER and PASS.");
- yyval = 0;
- }
- }
-break;
-#line 1728 "ftp.tab.c"
- }
- yyssp -= yym;
- yystate = *yyssp;
- yyvsp -= yym;
- yym = yylhs[yyn];
- if (yystate == 0 && yym == 0)
- {
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: after reduction, shifting from state 0 to\
- state %d\n", YYPREFIX, YYFINAL);
-#endif
- yystate = YYFINAL;
- *++yyssp = YYFINAL;
- *++yyvsp = yyval;
- if (yychar < 0)
- {
- if ((yychar = yylex()) < 0) yychar = 0;
-#if YYDEBUG
- if (yydebug)
- {
- yys = 0;
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
- printf("%sdebug: state %d, reading %d (%s)\n",
- YYPREFIX, YYFINAL, yychar, yys);
- }
-#endif
- }
- if (yychar == 0) goto yyaccept;
- goto yyloop;
- }
- if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
- yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
- yystate = yytable[yyn];
- else
- yystate = yydgoto[yym];
-#if YYDEBUG
- if (yydebug)
- printf("%sdebug: after reduction, shifting from state %d \
-to state %d\n", YYPREFIX, *yyssp, yystate);
-#endif
- if (yyssp >= yysslim && yygrowstack())
- {
- goto yyoverflow;
- }
- *++yyssp = yystate;
- *++yyvsp = yyval;
- goto yyloop;
-yyoverflow:
- yyerror("yacc stack overflow");
-yyabort:
- return (1);
-yyaccept:
- return (0);
-}
diff --git a/usr.bin/yacc/test/ftp.tab.h b/usr.bin/yacc/test/ftp.tab.h
deleted file mode 100644
index 24f0791..0000000
--- a/usr.bin/yacc/test/ftp.tab.h
+++ /dev/null
@@ -1,63 +0,0 @@
-#define A 257
-#define B 258
-#define C 259
-#define E 260
-#define F 261
-#define I 262
-#define L 263
-#define N 264
-#define P 265
-#define R 266
-#define S 267
-#define T 268
-#define SP 269
-#define CRLF 270
-#define COMMA 271
-#define STRING 272
-#define NUMBER 273
-#define USER 274
-#define PASS 275
-#define ACCT 276
-#define REIN 277
-#define QUIT 278
-#define PORT 279
-#define PASV 280
-#define TYPE 281
-#define STRU 282
-#define MODE 283
-#define RETR 284
-#define STOR 285
-#define APPE 286
-#define MLFL 287
-#define MAIL 288
-#define MSND 289
-#define MSOM 290
-#define MSAM 291
-#define MRSQ 292
-#define MRCP 293
-#define ALLO 294
-#define REST 295
-#define RNFR 296
-#define RNTO 297
-#define ABOR 298
-#define DELE 299
-#define CWD 300
-#define LIST 301
-#define NLST 302
-#define SITE 303
-#define STAT 304
-#define HELP 305
-#define NOOP 306
-#define MKD 307
-#define RMD 308
-#define PWD 309
-#define CDUP 310
-#define STOU 311
-#define SMNT 312
-#define SYST 313
-#define SIZE 314
-#define MDTM 315
-#define UMASK 316
-#define IDLE 317
-#define CHMOD 318
-#define LEXERR 319
diff --git a/usr.bin/yacc/test/ftp.y b/usr.bin/yacc/test/ftp.y
deleted file mode 100644
index 9a1e525..0000000
--- a/usr.bin/yacc/test/ftp.y
+++ /dev/null
@@ -1,1180 +0,0 @@
-/*
- * Copyright (c) 1985, 1988 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * @(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89
- */
-
-/*
- * Grammar for FTP commands.
- * See RFC 959.
- */
-
-%{
-
-#ifndef lint
-static char sccsid[] = "@(#)ftpcmd.y 5.20.1.1 (Berkeley) 3/2/89";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-
-#include <arpa/ftp.h>
-
-#include <stdio.h>
-#include <signal.h>
-#include <ctype.h>
-#include <pwd.h>
-#include <setjmp.h>
-#include <syslog.h>
-#include <sys/stat.h>
-#include <time.h>
-
-extern struct sockaddr_in data_dest;
-extern int logged_in;
-extern struct passwd *pw;
-extern int guest;
-extern int logging;
-extern int type;
-extern int form;
-extern int debug;
-extern int timeout;
-extern int maxtimeout;
-extern int pdata;
-extern char hostname[], remotehost[];
-extern char proctitle[];
-extern char *globerr;
-extern int usedefault;
-extern int transflag;
-extern char tmpline[];
-char **glob();
-
-static int cmd_type;
-static int cmd_form;
-static int cmd_bytesz;
-char cbuf[512];
-char *fromname;
-
-char *index();
-%}
-
-%token
- A B C E F I
- L N P R S T
-
- SP CRLF COMMA STRING NUMBER
-
- USER PASS ACCT REIN QUIT PORT
- PASV TYPE STRU MODE RETR STOR
- APPE MLFL MAIL MSND MSOM MSAM
- MRSQ MRCP ALLO REST RNFR RNTO
- ABOR DELE CWD LIST NLST SITE
- STAT HELP NOOP MKD RMD PWD
- CDUP STOU SMNT SYST SIZE MDTM
-
- UMASK IDLE CHMOD
-
- LEXERR
-
-%start cmd_list
-
-%%
-
-cmd_list: /* empty */
- | cmd_list cmd
- = {
- fromname = (char *) 0;
- }
- | cmd_list rcmd
- ;
-
-cmd: USER SP username CRLF
- = {
- user((char *) $3);
- free((char *) $3);
- }
- | PASS SP password CRLF
- = {
- pass((char *) $3);
- free((char *) $3);
- }
- | PORT SP host_port CRLF
- = {
- usedefault = 0;
- if (pdata >= 0) {
- (void) close(pdata);
- pdata = -1;
- }
- reply(200, "PORT command successful.");
- }
- | PASV CRLF
- = {
- passive();
- }
- | TYPE SP type_code CRLF
- = {
- switch (cmd_type) {
-
- case TYPE_A:
- if (cmd_form == FORM_N) {
- reply(200, "Type set to A.");
- type = cmd_type;
- form = cmd_form;
- } else
- reply(504, "Form must be N.");
- break;
-
- case TYPE_E:
- reply(504, "Type E not implemented.");
- break;
-
- case TYPE_I:
- reply(200, "Type set to I.");
- type = cmd_type;
- break;
-
- case TYPE_L:
-#if NBBY == 8
- if (cmd_bytesz == 8) {
- reply(200,
- "Type set to L (byte size 8).");
- type = cmd_type;
- } else
- reply(504, "Byte size must be 8.");
-#else /* NBBY == 8 */
- UNIMPLEMENTED for NBBY != 8
-#endif /* NBBY == 8 */
- }
- }
- | STRU SP struct_code CRLF
- = {
- switch ($3) {
-
- case STRU_F:
- reply(200, "STRU F ok.");
- break;
-
- default:
- reply(504, "Unimplemented STRU type.");
- }
- }
- | MODE SP mode_code CRLF
- = {
- switch ($3) {
-
- case MODE_S:
- reply(200, "MODE S ok.");
- break;
-
- default:
- reply(502, "Unimplemented MODE type.");
- }
- }
- | ALLO SP NUMBER CRLF
- = {
- reply(202, "ALLO command ignored.");
- }
- | ALLO SP NUMBER SP R SP NUMBER CRLF
- = {
- reply(202, "ALLO command ignored.");
- }
- | RETR check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- retrieve((char *) 0, (char *) $4);
- if ($4 != NULL)
- free((char *) $4);
- }
- | STOR check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- store((char *) $4, "w", 0);
- if ($4 != NULL)
- free((char *) $4);
- }
- | APPE check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- store((char *) $4, "a", 0);
- if ($4 != NULL)
- free((char *) $4);
- }
- | NLST check_login CRLF
- = {
- if ($2)
- send_file_list(".");
- }
- | NLST check_login SP STRING CRLF
- = {
- if ($2 && $4 != NULL)
- send_file_list((char *) $4);
- if ($4 != NULL)
- free((char *) $4);
- }
- | LIST check_login CRLF
- = {
- if ($2)
- retrieve("/bin/ls -lgA", "");
- }
- | LIST check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- retrieve("/bin/ls -lgA %s", (char *) $4);
- if ($4 != NULL)
- free((char *) $4);
- }
- | STAT check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- statfilecmd((char *) $4);
- if ($4 != NULL)
- free((char *) $4);
- }
- | STAT CRLF
- = {
- statcmd();
- }
- | DELE check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- delete((char *) $4);
- if ($4 != NULL)
- free((char *) $4);
- }
- | RNTO SP pathname CRLF
- = {
- if (fromname) {
- renamecmd(fromname, (char *) $3);
- free(fromname);
- fromname = (char *) 0;
- } else {
- reply(503, "Bad sequence of commands.");
- }
- free((char *) $3);
- }
- | ABOR CRLF
- = {
- reply(225, "ABOR command successful.");
- }
- | CWD check_login CRLF
- = {
- if ($2)
- cwd(pw->pw_dir);
- }
- | CWD check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- cwd((char *) $4);
- if ($4 != NULL)
- free((char *) $4);
- }
- | HELP CRLF
- = {
- help(cmdtab, (char *) 0);
- }
- | HELP SP STRING CRLF
- = {
- register char *cp = (char *)$3;
-
- if (strncasecmp(cp, "SITE", 4) == 0) {
- cp = (char *)$3 + 4;
- if (*cp == ' ')
- cp++;
- if (*cp)
- help(sitetab, cp);
- else
- help(sitetab, (char *) 0);
- } else
- help(cmdtab, (char *) $3);
- }
- | NOOP CRLF
- = {
- reply(200, "NOOP command successful.");
- }
- | MKD check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- makedir((char *) $4);
- if ($4 != NULL)
- free((char *) $4);
- }
- | RMD check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- removedir((char *) $4);
- if ($4 != NULL)
- free((char *) $4);
- }
- | PWD check_login CRLF
- = {
- if ($2)
- pwd();
- }
- | CDUP check_login CRLF
- = {
- if ($2)
- cwd("..");
- }
- | SITE SP HELP CRLF
- = {
- help(sitetab, (char *) 0);
- }
- | SITE SP HELP SP STRING CRLF
- = {
- help(sitetab, (char *) $5);
- }
- | SITE SP UMASK check_login CRLF
- = {
- int oldmask;
-
- if ($4) {
- oldmask = umask(0);
- (void) umask(oldmask);
- reply(200, "Current UMASK is %03o", oldmask);
- }
- }
- | SITE SP UMASK check_login SP octal_number CRLF
- = {
- int oldmask;
-
- if ($4) {
- if (($6 == -1) || ($6 > 0777)) {
- reply(501, "Bad UMASK value");
- } else {
- oldmask = umask($6);
- reply(200,
- "UMASK set to %03o (was %03o)",
- $6, oldmask);
- }
- }
- }
- | SITE SP CHMOD check_login SP octal_number SP pathname CRLF
- = {
- if ($4 && ($8 != NULL)) {
- if ($6 > 0777)
- reply(501,
- "CHMOD: Mode value must be between 0 and 0777");
- else if (chmod((char *) $8, $6) < 0)
- perror_reply(550, (char *) $8);
- else
- reply(200, "CHMOD command successful.");
- }
- if ($8 != NULL)
- free((char *) $8);
- }
- | SITE SP IDLE CRLF
- = {
- reply(200,
- "Current IDLE time limit is %d seconds; max %d",
- timeout, maxtimeout);
- }
- | SITE SP IDLE SP NUMBER CRLF
- = {
- if ($5 < 30 || $5 > maxtimeout) {
- reply(501,
- "Maximum IDLE time must be between 30 and %d seconds",
- maxtimeout);
- } else {
- timeout = $5;
- (void) alarm((unsigned) timeout);
- reply(200,
- "Maximum IDLE time set to %d seconds",
- timeout);
- }
- }
- | STOU check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- store((char *) $4, "w", 1);
- if ($4 != NULL)
- free((char *) $4);
- }
- | SYST CRLF
- = {
-#ifdef unix
-#ifdef BSD
- reply(215, "UNIX Type: L%d Version: BSD-%d",
- NBBY, BSD);
-#else /* BSD */
- reply(215, "UNIX Type: L%d", NBBY);
-#endif /* BSD */
-#else /* unix */
- reply(215, "UNKNOWN Type: L%d", NBBY);
-#endif /* unix */
- }
-
- /*
- * SIZE is not in RFC959, but Postel has blessed it and
- * it will be in the updated RFC.
- *
- * Return size of file in a format suitable for
- * using with RESTART (we just count bytes).
- */
- | SIZE check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL)
- sizecmd((char *) $4);
- if ($4 != NULL)
- free((char *) $4);
- }
-
- /*
- * MDTM is not in RFC959, but Postel has blessed it and
- * it will be in the updated RFC.
- *
- * Return modification time of file as an ISO 3307
- * style time. E.g. YYYYMMDDHHMMSS or YYYYMMDDHHMMSS.xxx
- * where xxx is the fractional second (of any precision,
- * not necessarily 3 digits)
- */
- | MDTM check_login SP pathname CRLF
- = {
- if ($2 && $4 != NULL) {
- struct stat stbuf;
- if (stat((char *) $4, &stbuf) < 0)
- perror_reply(550, "%s", (char *) $4);
- else if ((stbuf.st_mode&S_IFMT) != S_IFREG) {
- reply(550, "%s: not a plain file.",
- (char *) $4);
- } else {
- register struct tm *t;
- struct tm *gmtime();
- t = gmtime(&stbuf.st_mtime);
- reply(213,
- "%d%02d%02d%02d%02d%02d",
- t->tm_year+1900, t->tm_mon+1, t->tm_mday,
- t->tm_hour, t->tm_min, t->tm_sec);
- }
- }
- if ($4 != NULL)
- free((char *) $4);
- }
- | QUIT CRLF
- = {
- reply(221, "Goodbye.");
- dologout(0);
- }
- | error CRLF
- = {
- yyerrok;
- }
- ;
-rcmd: RNFR check_login SP pathname CRLF
- = {
- char *renamefrom();
-
- if ($2 && $4) {
- fromname = renamefrom((char *) $4);
- if (fromname == (char *) 0 && $4) {
- free((char *) $4);
- }
- }
- }
- ;
-
-username: STRING
- ;
-
-password: /* empty */
- = {
- *(char **)&($$) = "";
- }
- | STRING
- ;
-
-byte_size: NUMBER
- ;
-
-host_port: NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA
- NUMBER COMMA NUMBER
- = {
- register char *a, *p;
-
- a = (char *)&data_dest.sin_addr;
- a[0] = $1; a[1] = $3; a[2] = $5; a[3] = $7;
- p = (char *)&data_dest.sin_port;
- p[0] = $9; p[1] = $11;
- data_dest.sin_family = AF_INET;
- }
- ;
-
-form_code: N
- = {
- $$ = FORM_N;
- }
- | T
- = {
- $$ = FORM_T;
- }
- | C
- = {
- $$ = FORM_C;
- }
- ;
-
-type_code: A
- = {
- cmd_type = TYPE_A;
- cmd_form = FORM_N;
- }
- | A SP form_code
- = {
- cmd_type = TYPE_A;
- cmd_form = $3;
- }
- | E
- = {
- cmd_type = TYPE_E;
- cmd_form = FORM_N;
- }
- | E SP form_code
- = {
- cmd_type = TYPE_E;
- cmd_form = $3;
- }
- | I
- = {
- cmd_type = TYPE_I;
- }
- | L
- = {
- cmd_type = TYPE_L;
- cmd_bytesz = NBBY;
- }
- | L SP byte_size
- = {
- cmd_type = TYPE_L;
- cmd_bytesz = $3;
- }
- /* this is for a bug in the BBN ftp */
- | L byte_size
- = {
- cmd_type = TYPE_L;
- cmd_bytesz = $2;
- }
- ;
-
-struct_code: F
- = {
- $$ = STRU_F;
- }
- | R
- = {
- $$ = STRU_R;
- }
- | P
- = {
- $$ = STRU_P;
- }
- ;
-
-mode_code: S
- = {
- $$ = MODE_S;
- }
- | B
- = {
- $$ = MODE_B;
- }
- | C
- = {
- $$ = MODE_C;
- }
- ;
-
-pathname: pathstring
- = {
- /*
- * Problem: this production is used for all pathname
- * processing, but only gives a 550 error reply.
- * This is a valid reply in some cases but not in others.
- */
- if (logged_in && $1 && strncmp((char *) $1, "~", 1) == 0) {
- *(char **)&($$) = *glob((char *) $1);
- if (globerr != NULL) {
- reply(550, globerr);
- $$ = NULL;
- }
- free((char *) $1);
- } else
- $$ = $1;
- }
- ;
-
-pathstring: STRING
- ;
-
-octal_number: NUMBER
- = {
- register int ret, dec, multby, digit;
-
- /*
- * Convert a number that was read as decimal number
- * to what it would be if it had been read as octal.
- */
- dec = $1;
- multby = 1;
- ret = 0;
- while (dec) {
- digit = dec%10;
- if (digit > 7) {
- ret = -1;
- break;
- }
- ret += digit * multby;
- multby *= 8;
- dec /= 10;
- }
- $$ = ret;
- }
- ;
-
-check_login: /* empty */
- = {
- if (logged_in)
- $$ = 1;
- else {
- reply(530, "Please login with USER and PASS.");
- $$ = 0;
- }
- }
- ;
-
-%%
-
-extern jmp_buf errcatch;
-
-#define CMD 0 /* beginning of command */
-#define ARGS 1 /* expect miscellaneous arguments */
-#define STR1 2 /* expect SP followed by STRING */
-#define STR2 3 /* expect STRING */
-#define OSTR 4 /* optional SP then STRING */
-#define ZSTR1 5 /* SP then optional STRING */
-#define ZSTR2 6 /* optional STRING after SP */
-#define SITECMD 7 /* SITE command */
-#define NSTR 8 /* Number followed by a string */
-
-struct tab {
- char *name;
- short token;
- short state;
- short implemented; /* 1 if command is implemented */
- char *help;
-};
-
-struct tab cmdtab[] = { /* In order defined in RFC 765 */
- { "USER", USER, STR1, 1, "<sp> username" },
- { "PASS", PASS, ZSTR1, 1, "<sp> password" },
- { "ACCT", ACCT, STR1, 0, "(specify account)" },
- { "SMNT", SMNT, ARGS, 0, "(structure mount)" },
- { "REIN", REIN, ARGS, 0, "(reinitialize server state)" },
- { "QUIT", QUIT, ARGS, 1, "(terminate service)", },
- { "PORT", PORT, ARGS, 1, "<sp> b0, b1, b2, b3, b4" },
- { "PASV", PASV, ARGS, 1, "(set server in passive mode)" },
- { "TYPE", TYPE, ARGS, 1, "<sp> [ A | E | I | L ]" },
- { "STRU", STRU, ARGS, 1, "(specify file structure)" },
- { "MODE", MODE, ARGS, 1, "(specify transfer mode)" },
- { "RETR", RETR, STR1, 1, "<sp> file-name" },
- { "STOR", STOR, STR1, 1, "<sp> file-name" },
- { "APPE", APPE, STR1, 1, "<sp> file-name" },
- { "MLFL", MLFL, OSTR, 0, "(mail file)" },
- { "MAIL", MAIL, OSTR, 0, "(mail to user)" },
- { "MSND", MSND, OSTR, 0, "(mail send to terminal)" },
- { "MSOM", MSOM, OSTR, 0, "(mail send to terminal or mailbox)" },
- { "MSAM", MSAM, OSTR, 0, "(mail send to terminal and mailbox)" },
- { "MRSQ", MRSQ, OSTR, 0, "(mail recipient scheme question)" },
- { "MRCP", MRCP, STR1, 0, "(mail recipient)" },
- { "ALLO", ALLO, ARGS, 1, "allocate storage (vacuously)" },
- { "REST", REST, ARGS, 0, "(restart command)" },
- { "RNFR", RNFR, STR1, 1, "<sp> file-name" },
- { "RNTO", RNTO, STR1, 1, "<sp> file-name" },
- { "ABOR", ABOR, ARGS, 1, "(abort operation)" },
- { "DELE", DELE, STR1, 1, "<sp> file-name" },
- { "CWD", CWD, OSTR, 1, "[ <sp> directory-name ]" },
- { "XCWD", CWD, OSTR, 1, "[ <sp> directory-name ]" },
- { "LIST", LIST, OSTR, 1, "[ <sp> path-name ]" },
- { "NLST", NLST, OSTR, 1, "[ <sp> path-name ]" },
- { "SITE", SITE, SITECMD, 1, "site-cmd [ <sp> arguments ]" },
- { "SYST", SYST, ARGS, 1, "(get type of operating system)" },
- { "STAT", STAT, OSTR, 1, "[ <sp> path-name ]" },
- { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" },
- { "NOOP", NOOP, ARGS, 1, "" },
- { "MKD", MKD, STR1, 1, "<sp> path-name" },
- { "XMKD", MKD, STR1, 1, "<sp> path-name" },
- { "RMD", RMD, STR1, 1, "<sp> path-name" },
- { "XRMD", RMD, STR1, 1, "<sp> path-name" },
- { "PWD", PWD, ARGS, 1, "(return current directory)" },
- { "XPWD", PWD, ARGS, 1, "(return current directory)" },
- { "CDUP", CDUP, ARGS, 1, "(change to parent directory)" },
- { "XCUP", CDUP, ARGS, 1, "(change to parent directory)" },
- { "STOU", STOU, STR1, 1, "<sp> file-name" },
- { "SIZE", SIZE, OSTR, 1, "<sp> path-name" },
- { "MDTM", MDTM, OSTR, 1, "<sp> path-name" },
- { NULL, 0, 0, 0, 0 }
-};
-
-struct tab sitetab[] = {
- { "UMASK", UMASK, ARGS, 1, "[ <sp> umask ]" },
- { "IDLE", IDLE, ARGS, 1, "[ <sp> maximum-idle-time ]" },
- { "CHMOD", CHMOD, NSTR, 1, "<sp> mode <sp> file-name" },
- { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" },
- { NULL, 0, 0, 0, 0 }
-};
-
-struct tab *
-lookup(p, cmd)
- register struct tab *p;
- char *cmd;
-{
-
- for (; p->name != NULL; p++)
- if (strcmp(cmd, p->name) == 0)
- return (p);
- return (0);
-}
-
-#include <arpa/telnet.h>
-
-/*
- * getline - a hacked up version of fgets to ignore TELNET escape codes.
- */
-char *
-getline(s, n, iop)
- char *s;
- register FILE *iop;
-{
- register c;
- register char *cs;
-
- cs = s;
-/* tmpline may contain saved command from urgent mode interruption */
- for (c = 0; tmpline[c] != '\0' && --n > 0; ++c) {
- *cs++ = tmpline[c];
- if (tmpline[c] == '\n') {
- *cs++ = '\0';
- if (debug)
- syslog(LOG_DEBUG, "command: %s", s);
- tmpline[0] = '\0';
- return(s);
- }
- if (c == 0)
- tmpline[0] = '\0';
- }
- while ((c = getc(iop)) != EOF) {
- c &= 0377;
- if (c == IAC) {
- if ((c = getc(iop)) != EOF) {
- c &= 0377;
- switch (c) {
- case WILL:
- case WONT:
- c = getc(iop);
- printf("%c%c%c", IAC, DONT, 0377&c);
- (void) fflush(stdout);
- continue;
- case DO:
- case DONT:
- c = getc(iop);
- printf("%c%c%c", IAC, WONT, 0377&c);
- (void) fflush(stdout);
- continue;
- case IAC:
- break;
- default:
- continue; /* ignore command */
- }
- }
- }
- *cs++ = c;
- if (--n <= 0 || c == '\n')
- break;
- }
- if (c == EOF && cs == s)
- return (NULL);
- *cs++ = '\0';
- if (debug)
- syslog(LOG_DEBUG, "command: %s", s);
- return (s);
-}
-
-static int
-toolong()
-{
- time_t now;
- extern char *ctime();
- extern time_t time();
-
- reply(421,
- "Timeout (%d seconds): closing control connection.", timeout);
- (void) time(&now);
- if (logging) {
- syslog(LOG_INFO,
- "User %s timed out after %d seconds at %s",
- (pw ? pw -> pw_name : "unknown"), timeout, ctime(&now));
- }
- dologout(1);
-}
-
-yylex()
-{
- static int cpos, state;
- register char *cp, *cp2;
- register struct tab *p;
- int n;
- char c, *strpbrk();
- char *copy();
-
- for (;;) {
- switch (state) {
-
- case CMD:
- (void) signal(SIGALRM, toolong);
- (void) alarm((unsigned) timeout);
- if (getline(cbuf, sizeof(cbuf)-1, stdin) == NULL) {
- reply(221, "You could at least say goodbye.");
- dologout(0);
- }
- (void) alarm(0);
-#ifdef SETPROCTITLE
- if (strncasecmp(cbuf, "PASS", 4) != NULL)
- setproctitle("%s: %s", proctitle, cbuf);
-#endif /* SETPROCTITLE */
- if ((cp = index(cbuf, '\r'))) {
- *cp++ = '\n';
- *cp = '\0';
- }
- if ((cp = strpbrk(cbuf, " \n")))
- cpos = cp - cbuf;
- if (cpos == 0)
- cpos = 4;
- c = cbuf[cpos];
- cbuf[cpos] = '\0';
- upper(cbuf);
- p = lookup(cmdtab, cbuf);
- cbuf[cpos] = c;
- if (p != 0) {
- if (p->implemented == 0) {
- nack(p->name);
- longjmp(errcatch,0);
- /* NOTREACHED */
- }
- state = p->state;
- *(char **)&yylval = p->name;
- return (p->token);
- }
- break;
-
- case SITECMD:
- if (cbuf[cpos] == ' ') {
- cpos++;
- return (SP);
- }
- cp = &cbuf[cpos];
- if ((cp2 = strpbrk(cp, " \n")))
- cpos = cp2 - cbuf;
- c = cbuf[cpos];
- cbuf[cpos] = '\0';
- upper(cp);
- p = lookup(sitetab, cp);
- cbuf[cpos] = c;
- if (p != 0) {
- if (p->implemented == 0) {
- state = CMD;
- nack(p->name);
- longjmp(errcatch,0);
- /* NOTREACHED */
- }
- state = p->state;
- *(char **)&yylval = p->name;
- return (p->token);
- }
- state = CMD;
- break;
-
- case OSTR:
- if (cbuf[cpos] == '\n') {
- state = CMD;
- return (CRLF);
- }
- /* FALLTHROUGH */
-
- case STR1:
- case ZSTR1:
- dostr1:
- if (cbuf[cpos] == ' ') {
- cpos++;
- state = state == OSTR ? STR2 : ++state;
- return (SP);
- }
- break;
-
- case ZSTR2:
- if (cbuf[cpos] == '\n') {
- state = CMD;
- return (CRLF);
- }
- /* FALLTHROUGH */
-
- case STR2:
- cp = &cbuf[cpos];
- n = strlen(cp);
- cpos += n - 1;
- /*
- * Make sure the string is nonempty and \n terminated.
- */
- if (n > 1 && cbuf[cpos] == '\n') {
- cbuf[cpos] = '\0';
- *(char **)&yylval = copy(cp);
- cbuf[cpos] = '\n';
- state = ARGS;
- return (STRING);
- }
- break;
-
- case NSTR:
- if (cbuf[cpos] == ' ') {
- cpos++;
- return (SP);
- }
- if (isdigit(cbuf[cpos])) {
- cp = &cbuf[cpos];
- while (isdigit(cbuf[++cpos]))
- ;
- c = cbuf[cpos];
- cbuf[cpos] = '\0';
- yylval = atoi(cp);
- cbuf[cpos] = c;
- state = STR1;
- return (NUMBER);
- }
- state = STR1;
- goto dostr1;
-
- case ARGS:
- if (isdigit(cbuf[cpos])) {
- cp = &cbuf[cpos];
- while (isdigit(cbuf[++cpos]))
- ;
- c = cbuf[cpos];
- cbuf[cpos] = '\0';
- yylval = atoi(cp);
- cbuf[cpos] = c;
- return (NUMBER);
- }
- switch (cbuf[cpos++]) {
-
- case '\n':
- state = CMD;
- return (CRLF);
-
- case ' ':
- return (SP);
-
- case ',':
- return (COMMA);
-
- case 'A':
- case 'a':
- return (A);
-
- case 'B':
- case 'b':
- return (B);
-
- case 'C':
- case 'c':
- return (C);
-
- case 'E':
- case 'e':
- return (E);
-
- case 'F':
- case 'f':
- return (F);
-
- case 'I':
- case 'i':
- return (I);
-
- case 'L':
- case 'l':
- return (L);
-
- case 'N':
- case 'n':
- return (N);
-
- case 'P':
- case 'p':
- return (P);
-
- case 'R':
- case 'r':
- return (R);
-
- case 'S':
- case 's':
- return (S);
-
- case 'T':
- case 't':
- return (T);
-
- }
- break;
-
- default:
- fatal("Unknown state in scanner.");
- }
- yyerror((char *) 0);
- state = CMD;
- longjmp(errcatch,0);
- }
-}
-
-upper(s)
- register char *s;
-{
- while (*s != '\0') {
- if (islower(*s))
- *s = toupper(*s);
- s++;
- }
-}
-
-char *
-copy(s)
- char *s;
-{
- char *p;
- extern char *malloc(), *strcpy();
-
- p = malloc((unsigned) strlen(s) + 1);
- if (p == NULL)
- fatal("Ran out of memory.");
- (void) strcpy(p, s);
- return (p);
-}
-
-help(ctab, s)
- struct tab *ctab;
- char *s;
-{
- register struct tab *c;
- register int width, NCMDS;
- char *type;
-
- if (ctab == sitetab)
- type = "SITE ";
- else
- type = "";
- width = 0, NCMDS = 0;
- for (c = ctab; c->name != NULL; c++) {
- int len = strlen(c->name);
-
- if (len > width)
- width = len;
- NCMDS++;
- }
- width = (width + 8) &~ 7;
- if (s == 0) {
- register int i, j, w;
- int columns, lines;
-
- lreply(214, "The following %scommands are recognized %s.",
- type, "(* =>'s unimplemented)");
- columns = 76 / width;
- if (columns == 0)
- columns = 1;
- lines = (NCMDS + columns - 1) / columns;
- for (i = 0; i < lines; i++) {
- printf(" ");
- for (j = 0; j < columns; j++) {
- c = ctab + j * lines + i;
- printf("%s%c", c->name,
- c->implemented ? ' ' : '*');
- if (c + lines >= &ctab[NCMDS])
- break;
- w = strlen(c->name) + 1;
- while (w < width) {
- putchar(' ');
- w++;
- }
- }
- printf("\r\n");
- }
- (void) fflush(stdout);
- reply(214, "Direct comments to ftp-bugs@%s.", hostname);
- return;
- }
- upper(s);
- c = lookup(ctab, s);
- if (c == (struct tab *)0) {
- reply(502, "Unknown command %s.", s);
- return;
- }
- if (c->implemented)
- reply(214, "Syntax: %s%s %s", type, c->name, c->help);
- else
- reply(214, "%s%-*s\t%s; unimplemented.", type, width,
- c->name, c->help);
-}
-
-sizecmd(filename)
-char *filename;
-{
- switch (type) {
- case TYPE_L:
- case TYPE_I: {
- struct stat stbuf;
- if (stat(filename, &stbuf) < 0 ||
- (stbuf.st_mode&S_IFMT) != S_IFREG)
- reply(550, "%s: not a plain file.", filename);
- else
- reply(213, "%lu", stbuf.st_size);
- break;}
- case TYPE_A: {
- FILE *fin;
- register int c, count;
- struct stat stbuf;
- fin = fopen(filename, "r");
- if (fin == NULL) {
- perror_reply(550, filename);
- return;
- }
- if (fstat(fileno(fin), &stbuf) < 0 ||
- (stbuf.st_mode&S_IFMT) != S_IFREG) {
- reply(550, "%s: not a plain file.", filename);
- (void) fclose(fin);
- return;
- }
-
- count = 0;
- while((c=getc(fin)) != EOF) {
- if (c == '\n') /* will get expanded to \r\n */
- count++;
- count++;
- }
- (void) fclose(fin);
-
- reply(213, "%ld", count);
- break;}
- default:
- reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]);
- }
-}
diff --git a/usr.bin/yacc/verbose.c b/usr.bin/yacc/verbose.c
deleted file mode 100644
index 282eaa3..0000000
--- a/usr.bin/yacc/verbose.c
+++ /dev/null
@@ -1,394 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)verbose.c 5.3 (Berkeley) 1/20/91";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-#include "defs.h"
-
-static short *null_rules;
-
-static void log_unused(void);
-static void log_conflicts(void);
-static void print_actions(int);
-static void print_conflicts(int);
-static void print_core(int);
-static void print_gotos(int);
-static void print_nulls(int);
-static void print_reductions(action *, register int);
-static void print_shifts(action *);
-static void print_state(int);
-
-void
-verbose()
-{
- int i;
-
- if (!vflag) return;
-
- null_rules = (short *) MALLOC(nrules*sizeof(short));
- if (null_rules == 0) no_space();
- fprintf(verbose_file, "\f\n");
- for (i = 0; i < nstates; i++)
- print_state(i);
- FREE(null_rules);
-
- if (nunused)
- log_unused();
- if (SRtotal || RRtotal)
- log_conflicts();
-
- fprintf(verbose_file, "\n\n%d terminals, %d nonterminals\n", ntokens,
- nvars);
- fprintf(verbose_file, "%d grammar rules, %d states\n", nrules - 2, nstates);
-}
-
-
-static void
-log_unused()
-{
- int i;
- short *p;
-
- fprintf(verbose_file, "\n\nRules never reduced:\n");
- for (i = 3; i < nrules; ++i)
- {
- if (!rules_used[i])
- {
- fprintf(verbose_file, "\t%s :", symbol_name[rlhs[i]]);
- for (p = ritem + rrhs[i]; *p >= 0; ++p)
- fprintf(verbose_file, " %s", symbol_name[*p]);
- fprintf(verbose_file, " (%d)\n", i - 2);
- }
- }
-}
-
-
-static void
-log_conflicts()
-{
- int i;
-
- fprintf(verbose_file, "\n\n");
- for (i = 0; i < nstates; i++)
- {
- if (SRconflicts[i] || RRconflicts[i])
- {
- fprintf(verbose_file, "State %d contains ", i);
- if (SRconflicts[i] == 1)
- fprintf(verbose_file, "1 shift/reduce conflict");
- else if (SRconflicts[i] > 1)
- fprintf(verbose_file, "%d shift/reduce conflicts",
- SRconflicts[i]);
- if (SRconflicts[i] && RRconflicts[i])
- fprintf(verbose_file, ", ");
- if (RRconflicts[i] == 1)
- fprintf(verbose_file, "1 reduce/reduce conflict");
- else if (RRconflicts[i] > 1)
- fprintf(verbose_file, "%d reduce/reduce conflicts",
- RRconflicts[i]);
- fprintf(verbose_file, ".\n");
- }
- }
-}
-
-
-static void
-print_state(state)
-int state;
-{
- if (state)
- fprintf(verbose_file, "\n\n");
- if (SRconflicts[state] || RRconflicts[state])
- print_conflicts(state);
- fprintf(verbose_file, "state %d\n", state);
- print_core(state);
- print_nulls(state);
- print_actions(state);
-}
-
-
-static void
-print_conflicts(state)
-int state;
-{
- int symbol, act = 0, number = 0;
- action *p;
-
- symbol = -1;
- for (p = parser[state]; p; p = p->next)
- {
- if (p->suppressed == 2)
- continue;
-
- if (p->symbol != symbol)
- {
- symbol = p->symbol;
- number = p->number;
- if (p->action_code == SHIFT)
- act = SHIFT;
- else
- act = REDUCE;
- }
- else if (p->suppressed == 1)
- {
- if (state == final_state && symbol == 0)
- {
- fprintf(verbose_file, "%d: shift/reduce conflict \
-(accept, reduce %d) on $end\n", state, p->number - 2);
- }
- else
- {
- if (act == SHIFT)
- {
- fprintf(verbose_file, "%d: shift/reduce conflict \
-(shift %d, reduce %d) on %s\n", state, number, p->number - 2,
- symbol_name[symbol]);
- }
- else
- {
- fprintf(verbose_file, "%d: reduce/reduce conflict \
-(reduce %d, reduce %d) on %s\n", state, number - 2, p->number - 2,
- symbol_name[symbol]);
- }
- }
- }
- }
-}
-
-
-static void
-print_core(state)
-int state;
-{
- int i;
- int k;
- int rule;
- core *statep;
- short *sp;
- short *sp1;
-
- statep = state_table[state];
- k = statep->nitems;
-
- for (i = 0; i < k; i++)
- {
- sp1 = sp = ritem + statep->items[i];
-
- while (*sp >= 0) ++sp;
- rule = -(*sp);
- fprintf(verbose_file, "\t%s : ", symbol_name[rlhs[rule]]);
-
- for (sp = ritem + rrhs[rule]; sp < sp1; sp++)
- fprintf(verbose_file, "%s ", symbol_name[*sp]);
-
- putc('.', verbose_file);
-
- while (*sp >= 0)
- {
- fprintf(verbose_file, " %s", symbol_name[*sp]);
- sp++;
- }
- fprintf(verbose_file, " (%d)\n", -2 - *sp);
- }
-}
-
-
-static void
-print_nulls(state)
-int state;
-{
- action *p;
- int i, j, k, nnulls;
-
- nnulls = 0;
- for (p = parser[state]; p; p = p->next)
- {
- if (p->action_code == REDUCE &&
- (p->suppressed == 0 || p->suppressed == 1))
- {
- i = p->number;
- if (rrhs[i] + 1 == rrhs[i+1])
- {
- for (j = 0; j < nnulls && i > null_rules[j]; ++j)
- continue;
-
- if (j == nnulls)
- {
- ++nnulls;
- null_rules[j] = i;
- }
- else if (i != null_rules[j])
- {
- ++nnulls;
- for (k = nnulls - 1; k > j; --k)
- null_rules[k] = null_rules[k-1];
- null_rules[j] = i;
- }
- }
- }
- }
-
- for (i = 0; i < nnulls; ++i)
- {
- j = null_rules[i];
- fprintf(verbose_file, "\t%s : . (%d)\n", symbol_name[rlhs[j]],
- j - 2);
- }
- fprintf(verbose_file, "\n");
-}
-
-
-static void
-print_actions(stateno)
-int stateno;
-{
- action *p;
- shifts *sp;
- int as;
-
- if (stateno == final_state)
- fprintf(verbose_file, "\t$end accept\n");
-
- p = parser[stateno];
- if (p)
- {
- print_shifts(p);
- print_reductions(p, defred[stateno]);
- }
-
- sp = shift_table[stateno];
- if (sp && sp->nshifts > 0)
- {
- as = accessing_symbol[sp->shift[sp->nshifts - 1]];
- if (ISVAR(as))
- print_gotos(stateno);
- }
-}
-
-
-static void
-print_shifts(p)
-action *p;
-{
- int count;
- action *q;
-
- count = 0;
- for (q = p; q; q = q->next)
- {
- if (q->suppressed < 2 && q->action_code == SHIFT)
- ++count;
- }
-
- if (count > 0)
- {
- for (; p; p = p->next)
- {
- if (p->action_code == SHIFT && p->suppressed == 0)
- fprintf(verbose_file, "\t%s shift %d\n",
- symbol_name[p->symbol], p->number);
- }
- }
-}
-
-
-static void
-print_reductions(p, defreduct)
-action *p;
-int defreduct;
-{
- int k, anyreds;
- action *q;
-
- anyreds = 0;
- for (q = p; q ; q = q->next)
- {
- if (q->action_code == REDUCE && q->suppressed < 2)
- {
- anyreds = 1;
- break;
- }
- }
-
- if (anyreds == 0)
- fprintf(verbose_file, "\t. error\n");
- else
- {
- for (; p; p = p->next)
- {
- if (p->action_code == REDUCE && p->number != defreduct)
- {
- k = p->number - 2;
- if (p->suppressed == 0)
- fprintf(verbose_file, "\t%s reduce %d\n",
- symbol_name[p->symbol], k);
- }
- }
-
- if (defreduct > 0)
- fprintf(verbose_file, "\t. reduce %d\n", defreduct - 2);
- }
-}
-
-
-static void
-print_gotos(stateno)
-int stateno;
-{
- int i, k;
- int as;
- short *tostate;
- shifts *sp;
-
- putc('\n', verbose_file);
- sp = shift_table[stateno];
- tostate = sp->shift;
- for (i = 0; i < sp->nshifts; ++i)
- {
- k = tostate[i];
- as = accessing_symbol[k];
- if (ISVAR(as))
- fprintf(verbose_file, "\t%s goto %d\n", symbol_name[as], k);
- }
-}
diff --git a/usr.bin/yacc/warshall.c b/usr.bin/yacc/warshall.c
deleted file mode 100644
index 46d934d..0000000
--- a/usr.bin/yacc/warshall.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Robert Paul Corbett.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)warshall.c 5.4 (Berkeley) 5/24/93";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "defs.h"
-
-static void transitive_closure(unsigned *, int);
-
-static void
-transitive_closure(R, n)
-unsigned *R;
-int n;
-{
- int rowsize;
- unsigned i;
- unsigned *rowj;
- unsigned *rp;
- unsigned *rend;
- unsigned *ccol;
- unsigned *relend;
- unsigned *cword;
- unsigned *rowi;
-
- rowsize = WORDSIZE(n);
- relend = R + n*rowsize;
-
- cword = R;
- i = 0;
- rowi = R;
- while (rowi < relend)
- {
- ccol = cword;
- rowj = R;
-
- while (rowj < relend)
- {
- if (*ccol & (1 << i))
- {
- rp = rowi;
- rend = rowj + rowsize;
- while (rowj < rend)
- *rowj++ |= *rp++;
- }
- else
- {
- rowj += rowsize;
- }
-
- ccol += rowsize;
- }
-
- if (++i >= BITS_PER_WORD)
- {
- i = 0;
- cword++;
- }
-
- rowi += rowsize;
- }
-}
-
-void
-reflexive_transitive_closure(R, n)
-unsigned *R;
-int n;
-{
- int rowsize;
- unsigned i;
- unsigned *rp;
- unsigned *relend;
-
- transitive_closure(R, n);
-
- rowsize = WORDSIZE(n);
- relend = R + n*rowsize;
-
- i = 0;
- rp = R;
- while (rp < relend)
- {
- *rp |= (1 << i);
- if (++i >= BITS_PER_WORD)
- {
- i = 0;
- rp++;
- }
-
- rp += rowsize;
- }
-}
diff --git a/usr.bin/yacc/yacc.1 b/usr.bin/yacc/yacc.1
deleted file mode 100644
index 56bacbb..0000000
--- a/usr.bin/yacc/yacc.1
+++ /dev/null
@@ -1,169 +0,0 @@
-.\" Copyright (c) 1989, 1990 The Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" Robert Paul Corbett.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)yacc.1 5.8 (Berkeley) 5/24/93
-.\" $FreeBSD$
-.\" $OpenBSD: yacc.1,v 1.14 2001/05/01 17:58:05 aaron Exp $
-.\"
-.Dd May 24, 1993
-.Dt YACC 1
-.Os
-.Sh NAME
-.Nm yacc
-.Nd an LALR(1) parser generator
-.Sh SYNOPSIS
-.Nm
-.Op Fl dlrtv
-.Op Fl b Ar file_prefix
-.Op Fl o Ar output_filename
-.Op Fl p Ar symbol_prefix
-.Ar filename
-.Sh DESCRIPTION
-The
-.Nm
-utility reads the grammar specification in the file
-.Ar filename
-and generates an LR(1) parser for it.
-The parsers consist of a set of LALR(1) parsing tables and a driver routine
-written in the C programming language.
-The
-.Nm
-utility normally writes the parse tables and the driver routine to the file
-.Pa y.tab.c .
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl b Ar file_prefix
-Change the prefix prepended to the output file names to
-the string denoted by
-.Ar file_prefix .
-The default prefix is the character
-.Pa y .
-.It Fl d
-Cause the header file
-.Pa y.tab.h
-to be written.
-.It Fl l
-If the
-.Fl l
-option is not specified,
-.Nm
-will insert #line directives in the generated code.
-The #line directives let the C compiler relate errors in the
-generated code to the user's original code.
-If the
-.Fl l
-option is specified,
-.Nm
-will not insert the #line directives.
-Any #line directives specified by the user will be retained.
-.It Fl o Ar output_filename
-Cause
-.Nm
-to write the generated code to
-.Ar output_filename
-instead of the default file,
-.Pa y.tab.c .
-.It Fl p Ar symbol_prefix
-Change the prefix prepended to yacc-generated symbols to
-the string denoted by
-.Ar symbol_prefix .
-The default prefix is the string
-.Pa yy .
-.It Fl r
-Cause
-.Nm
-to produce separate files for code and tables.
-The code file
-is named
-.Pa y.code.c ,
-and the tables file is named
-.Pa y.tab.c .
-.It Fl t
-Change the preprocessor directives generated by
-.Nm
-so that debugging statements will be incorporated in the compiled code.
-.It Fl v
-Cause a human-readable description of the generated parser to
-be written to the file
-.Pa y.output .
-.El
-.Sh ENVIRONMENT
-.Bl -tag -width ".Ev TMPDIR"
-.It Ev TMPDIR
-Name of directory where temporary files are to be created.
-.El
-.Sh TABLES
-The names of the tables generated by this version of
-.Nm
-are
-.Va yylhs , yylen , yydefred , yydgoto , yysindex ,
-.Va yyrindex , yygindex , yytable ,
-and
-.Va yycheck .
-Two additional tables,
-.Va yyname
-and
-.Va yyrule ,
-are created if
-.Dv YYDEBUG
-is defined and non-zero.
-.Sh FILES
-.Bl -tag -width "Pa /tmp/yacc.aXXXXXXXXXX" -compact
-.It Pa y.code.c
-.It Pa y.tab.c
-.It Pa y.tab.h
-.It Pa y.output
-.It Pa /tmp/yacc.aXXXXXXXXXX
-.It Pa /tmp/yacc.tXXXXXXXXXX
-.It Pa /tmp/yacc.uXXXXXXXXXX
-.El
-.Sh DIAGNOSTICS
-If there are rules that are never reduced,
-the number of such rules is reported on standard error.
-If there are any
-.Tn LALR(1)
-conflicts,
-the number of conflicts is reported on standard error.
-.Sh SEE ALSO
-.Xr yyfix 1
-.Sh STANDARDS
-The
-.Nm
-utility conforms to
-.St -p1003.2 .
-.Sh HISTORY
-A
-.Nm
-command appeared in PWB UNIX.
diff --git a/usr.bin/yacc/yyfix.1 b/usr.bin/yacc/yyfix.1
deleted file mode 100644
index a4d9a31..0000000
--- a/usr.bin/yacc/yyfix.1
+++ /dev/null
@@ -1,114 +0,0 @@
-.\" Copyright (c) 1990, 1991 The Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)yyfix.1 5.4 (Berkeley) 3/23/93
-.\" $FreeBSD$
-.\"
-.Dd March 23, 1993
-.Dt YYFIX 1
-.Os
-.Sh NAME
-.Nm yyfix
-.Nd extract tables from y.tab.c
-.Sh SYNOPSIS
-.Nm
-.Ar file
-.Op Ar tables
-.Sh DESCRIPTION
-Programs have historically used a script (often named
-.Dq :yyfix )
-to extract tables from the
-.Xr yacc 1
-generated file
-.Pa y.tab.c .
-As the names of the tables generated by the current version of
-.Xr yacc 1
-are different from those of historical versions of
-.Xr yacc 1 ,
-the shell script
-.Nm
-is provided to simplify the transition.
-.Pp
-The first (and required) argument to
-.Nm
-is the name of the file where the extracted tables should be stored.
-.Pp
-If further command line arguments are specified, they are taken as
-the list of tables to be extracted.
-Otherwise,
-.Nm
-attempts to determine if the
-.Pa y.tab.c
-file is from an old or new
-.Xr yacc 1 ,
-and extracts the appropriate tables.
-.Pp
-The tables
-.Dq yyexca ,
-.Dq yyact ,
-.Dq yypact ,
-.Dq yypgo ,
-.Dq yyr1 ,
-.Dq yyr2 ,
-.Dq yychk ,
-and
-.Dq yydef
-are extracted
-from historical versions of
-.Xr yacc 1 .
-.Pp
-The tables
-.Dq yylhs ,
-.Dq yylen ,
-.Dq yydefred ,
-.Dq yydgoto ,
-.Dq yysindex ,
-.Dq yyrindex ,
-.Dq yygindex ,
-.Dq yytable ,
-.Dq yyname ,
-.Dq yyrule ,
-and
-.Dq yycheck ,
-are extracted from the current version of
-.Xr yacc 1 .
-.Sh FILES
-.Bl -tag -width y.tab.c
-.It Pa y.tab.c
-File from which tables are extracted.
-.El
-.Sh SEE ALSO
-.Xr yacc 1
-.Sh HISTORY
-The
-.Nm
-command first appeared in
-.Bx 4.4 .
diff --git a/usr.bin/yacc/yyfix.sh b/usr.bin/yacc/yyfix.sh
deleted file mode 100644
index d983df6..0000000
--- a/usr.bin/yacc/yyfix.sh
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/bin/sh -
-#
-# Copyright (c) 1990 The Regents of the University of California.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the University of
-# California, Berkeley and its contributors.
-# 4. Neither the name of the University nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# @(#)yyfix.sh 5.2 (Berkeley) 5/12/90
-#
-OLDYACC="yyexca yyact yypact yypgo yyr1 yyr2 yychk yydef"
-NEWYACC="yylhs yylen yydefred yydgoto yysindex yyrindex yygindex \
- yytable yycheck"
-
-if [ $# -eq 0 ]; then
- echo "usage: $0 file [tables]" >&2
- exit 1
-fi
-
-file=$1
->$file
-shift
-
-if [ $# -eq 0 ] ; then
- if grep yylhs y.tab.c > /dev/null ; then
- if grep yyname y.tab.c > /dev/null ; then
- NEWYACC="$NEWYACC yyname"
- fi
- if grep yyrule y.tab.c > /dev/null ; then
- NEWYACC="$NEWYACC yyrule"
- fi
- set $NEWYACC
- else
- set $OLDYACC
- fi
-fi
-
-for i
-do
-ed - y.tab.c << END
-/^\(.*\)$i[ ]*\[]/s//extern \1 $i[];\\
-\1 $i []/
-.ka
-/}/kb
-'br $file
-'a,.w $file
-'a,.d
-w
-q
-END
-done
diff --git a/usr.bin/yes/Makefile b/usr.bin/yes/Makefile
deleted file mode 100644
index e3e98da..0000000
--- a/usr.bin/yes/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-# $FreeBSD$
-
-PROG= yes
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/yes/yes.1 b/usr.bin/yes/yes.1
deleted file mode 100644
index 9b4b377..0000000
--- a/usr.bin/yes/yes.1
+++ /dev/null
@@ -1,56 +0,0 @@
-.\" Copyright (c) 1980, 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)yes.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD$
-.\"
-.Dd June 6, 1993
-.Dt YES 1
-.Os
-.Sh NAME
-.Nm yes
-.Nd be repetitively affirmative
-.Sh SYNOPSIS
-.Nm
-.Op Ar expletive
-.Sh DESCRIPTION
-The
-.Nm
-utility outputs
-.Ar expletive ,
-or, by default,
-.Dq y ,
-forever.
-.Sh HISTORY
-The
-.Nm
-command appeared in
-.At 32v .
diff --git a/usr.bin/yes/yes.c b/usr.bin/yes/yes.c
deleted file mode 100644
index aae13b9..0000000
--- a/usr.bin/yes/yes.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 1987, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static const char copyright[] =
-"@(#) Copyright (c) 1987, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)yes.c 8.1 (Berkeley) 6/6/93";
-#else
-static const char rcsid[] = "$FreeBSD$";
-#endif
-#endif /* not lint */
-
-#include <err.h>
-#include <stdio.h>
-
-int
-main(int argc, char **argv)
-{
- if (argc > 1)
- while (puts(argv[1]) != EOF)
- ;
- else
- while (puts("y") != EOF)
- ;
- err(1, "stdout");
- /*NOTREACHED*/
-}
diff --git a/usr.bin/ypcat/Makefile b/usr.bin/ypcat/Makefile
deleted file mode 100644
index 58ee690..0000000
--- a/usr.bin/ypcat/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# from: @(#)Makefile 5.8 (Berkeley) 7/28/90
-# $FreeBSD$
-
-PROG= ypcat
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ypcat/ypcat.1 b/usr.bin/ypcat/ypcat.1
deleted file mode 100644
index 8a25652..0000000
--- a/usr.bin/ypcat/ypcat.1
+++ /dev/null
@@ -1,74 +0,0 @@
-.\" Copyright (c) 1993 Winning Strategies, Inc.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by Winning Strategies, Inc.
-.\" 4. The name of the author may not be used to endorse or promote products
-.\" derived from this software without specific prior written permission
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd December 3, 1993
-.Dt YPCAT 1
-.Os
-.Sh NAME
-.Nm ypcat
-.Nd "print the values of all keys in a YP database"
-.Sh SYNOPSIS
-.Nm
-.Op Fl kt
-.Op Fl d Ar domainname
-.Ar mapname
-.Nm
-.Fl x
-.Sh DESCRIPTION
-The
-.Nm
-utility prints out the values of all keys from the
-.Tn YP
-database specified by
-.Ar mapname ,
-which may be a map name or a map nickname.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl d Ar domainname
-Specify a domain other than the default domain.
-.It Fl k
-Display map keys.
-This option is useful with maps in which the values are null or the key
-is not part of the value.
-.It Fl t
-Inhibit translation of map nicknames
-to their corresponding map names.
-.It Fl x
-Display the map nickname table.
-.El
-.Sh SEE ALSO
-.Xr domainname 1 ,
-.Xr ypmatch 1 ,
-.Xr yp 8 ,
-.Xr ypbind 8 ,
-.Xr ypset 8
-.Sh AUTHORS
-.An Theo De Raadt Aq deraadt@theos.com .
diff --git a/usr.bin/ypcat/ypcat.c b/usr.bin/ypcat/ypcat.c
deleted file mode 100644
index 5539043..0000000
--- a/usr.bin/ypcat/ypcat.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (c) 1992/3 Theo de Raadt <deraadt@fsa.ca>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <rpc/rpc.h>
-#include <rpc/xdr.h>
-#include <rpcsvc/yp_prot.h>
-#include <rpcsvc/ypclnt.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-struct ypalias {
- char *alias, *name;
-} ypaliases[] = {
- { "passwd", "passwd.byname" },
- { "master.passwd", "master.passwd.byname" },
- { "group", "group.byname" },
- { "networks", "networks.byaddr" },
- { "hosts", "hosts.byaddr" },
- { "protocols", "protocols.bynumber" },
- { "services", "services.byname" },
- { "aliases", "mail.aliases" },
- { "ethers", "ethers.byname" },
-};
-
-int key;
-
-static void
-usage(void)
-{
- fprintf(stderr, "%s\n%s\n",
- "usage: ypcat [-kt] [-d domainname] mapname",
- " ypcat -x");
- exit(1);
-}
-
-static int
-printit(unsigned long instatus, char *inkey, int inkeylen, char *inval, int invallen, void *dummy __unused)
-{
- if (instatus != YP_TRUE)
- return (instatus);
- if (key)
- printf("%*.*s ", inkeylen, inkeylen, inkey);
- printf("%*.*s\n", invallen, invallen, inval);
- return (0);
-}
-
-int
-main(int argc, char *argv[])
-{
- char *domainname = NULL;
- struct ypall_callback ypcb;
- char *inmap;
- int notrans;
- int c, r;
- u_int i;
-
- notrans = key = 0;
-
- while ((c = getopt(argc, argv, "xd:kt")) != -1)
- switch (c) {
- case 'x':
- for (i = 0; i<sizeof ypaliases/sizeof ypaliases[0]; i++)
- printf("Use \"%s\" for \"%s\"\n",
- ypaliases[i].alias,
- ypaliases[i].name);
- exit(0);
- case 'd':
- domainname = optarg;
- break;
- case 't':
- notrans++;
- break;
- case 'k':
- key++;
- break;
- default:
- usage();
- }
-
- if (optind + 1 != argc)
- usage();
-
- if (!domainname)
- yp_get_default_domain(&domainname);
-
- inmap = argv[optind];
- for (i = 0; (!notrans) && i<sizeof ypaliases/sizeof ypaliases[0]; i++)
- if (strcmp(inmap, ypaliases[i].alias) == 0)
- inmap = ypaliases[i].name;
- ypcb.foreach = printit;
- ypcb.data = NULL;
-
- r = yp_all(domainname, inmap, &ypcb);
- switch (r) {
- case 0:
- break;
- case YPERR_YPBIND:
- errx(1, "not running ypbind");
- default:
- errx(1, "no such map %s. reason: %s", inmap, yperr_string(r));
- }
- exit(0);
-}
diff --git a/usr.bin/ypmatch/Makefile b/usr.bin/ypmatch/Makefile
deleted file mode 100644
index 22e6299..0000000
--- a/usr.bin/ypmatch/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# from: @(#)Makefile 5.8 (Berkeley) 7/28/90
-# $FreeBSD$
-
-PROG= ypmatch
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ypmatch/ypmatch.1 b/usr.bin/ypmatch/ypmatch.1
deleted file mode 100644
index 5f4a4ca..0000000
--- a/usr.bin/ypmatch/ypmatch.1
+++ /dev/null
@@ -1,75 +0,0 @@
-.\" Copyright (c) 1993 Winning Strategies, Inc.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by Winning Strategies, Inc.
-.\" 4. The name of the author may not be used to endorse or promote products
-.\" derived from this software without specific prior written permission
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd December 3, 1993
-.Dt YPMATCH 1
-.Os
-.Sh NAME
-.Nm ypmatch
-.Nd "print the values of one or more keys in a YP database"
-.Sh SYNOPSIS
-.Nm
-.Op Fl kt
-.Op Fl d Ar domainname
-.Ar key ...
-.Ar mapname
-.Nm
-.Fl x
-.Sh DESCRIPTION
-The
-.Nm
-utility prints out the values of one or more keys from the
-.Tn YP
-database specified by
-.Ar mapname ,
-which may be a map name or a map nickname.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl d Ar domainname
-Specify a domain other than the default domain.
-.It Fl k
-Display map keys.
-This option is useful with maps in which the values are null or the key
-is not part of the value.
-.It Fl t
-Inhibit translation of map nicknames
-to their corresponding map names.
-.It Fl x
-Display the map nickname table.
-.El
-.Sh SEE ALSO
-.Xr domainname 1 ,
-.Xr ypcat 1 ,
-.Xr yp 8 ,
-.Xr ypbind 8 ,
-.Xr ypset 8
-.Sh AUTHORS
-.An Theo De Raadt Aq deraadt@theos.com .
diff --git a/usr.bin/ypmatch/ypmatch.c b/usr.bin/ypmatch/ypmatch.c
deleted file mode 100644
index d0904c5..0000000
--- a/usr.bin/ypmatch/ypmatch.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (c) 1992/3 Theo de Raadt <deraadt@fsa.ca>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <rpc/rpc.h>
-#include <rpc/xdr.h>
-#include <rpcsvc/yp_prot.h>
-#include <rpcsvc/ypclnt.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-struct ypalias {
- char *alias, *name;
-} ypaliases[] = {
- { "passwd", "passwd.byname" },
- { "master.passwd", "master.passwd.byname" },
- { "group", "group.byname" },
- { "networks", "networks.byaddr" },
- { "hosts", "hosts.byname" },
- { "protocols", "protocols.bynumber" },
- { "services", "services.byname" },
- { "aliases", "mail.aliases" },
- { "ethers", "ethers.byname" },
-};
-
-static void
-usage(void)
-{
- fprintf(stderr, "%s\n%s\n",
- "usage: ypmatch [-kt] [-d domainname] key ... mapname",
- " ypmatch -x");
- exit(1);
-}
-
-int
-main(int argc, char *argv[])
-{
- char *domainname = NULL;
- char *inkey, *inmap, *outbuf;
- int outbuflen, key, notrans;
- int c, r;
- u_int i;
-
- notrans = key = 0;
-
- while ((c = getopt(argc, argv, "xd:kt")) != -1)
- switch (c) {
- case 'x':
- for (i = 0; i<sizeof ypaliases/sizeof ypaliases[0]; i++)
- printf("Use \"%s\" for \"%s\"\n",
- ypaliases[i].alias,
- ypaliases[i].name);
- exit(0);
- case 'd':
- domainname = optarg;
- break;
- case 't':
- notrans++;
- break;
- case 'k':
- key++;
- break;
- default:
- usage();
- }
-
- if ((argc-optind) < 2)
- usage();
-
- if (!domainname)
- yp_get_default_domain(&domainname);
-
- inmap = argv[argc-1];
- for (i = 0; (!notrans) && i<sizeof ypaliases/sizeof ypaliases[0]; i++)
- if (strcmp(inmap, ypaliases[i].alias) == 0)
- inmap = ypaliases[i].name;
- for (; optind < argc-1; optind++) {
- inkey = argv[optind];
-
- r = yp_match(domainname, inmap, inkey,
- strlen(inkey), &outbuf, &outbuflen);
- switch (r) {
- case 0:
- if (key)
- printf("%s ", inkey);
- printf("%*.*s\n", outbuflen, outbuflen, outbuf);
- break;
- case YPERR_YPBIND:
- errx(1, "not running ypbind");
- default:
- errx(1, "can't match key %s in map %s. reason: %s",
- inkey, inmap, yperr_string(r));
- }
- }
- exit(0);
-}
diff --git a/usr.bin/ypwhich/Makefile b/usr.bin/ypwhich/Makefile
deleted file mode 100644
index f28f864..0000000
--- a/usr.bin/ypwhich/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# from: @(#)Makefile 5.8 (Berkeley) 7/28/90
-# $FreeBSD$
-
-PROG= ypwhich
-
-.include <bsd.prog.mk>
diff --git a/usr.bin/ypwhich/ypwhich.1 b/usr.bin/ypwhich/ypwhich.1
deleted file mode 100644
index fb2891e..0000000
--- a/usr.bin/ypwhich/ypwhich.1
+++ /dev/null
@@ -1,103 +0,0 @@
-.\" $NetBSD: ypwhich.1,v 1.3 1996/05/13 02:43:46 thorpej Exp $
-.\"
-.\" Copyright (c) 1994 Christopher G. Demetriou
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by Christopher G. Demetriou.
-.\" 3. The name of the author may not be used to endorse or promote products
-.\" derived from this software without specific prior written permission
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd February 23, 1994
-.Dt YPWHICH 1
-.Os
-.Sh NAME
-.Nm ypwhich
-.Nd return hostname of YP server of map master
-.Sh SYNOPSIS
-.Nm
-.Op Fl d Ar domain
-.Oo
-.Op Fl t
-.Fl m Oo Ar mname Oc | Ar host
-.Oc
-.Nm
-.Fl x
-.Sh DESCRIPTION
-The
-.Nm
-utility tells which
-.Tn YP
-server supplies
-.Tn YP
-services to a client, or which is the master for a map.
-If invoked without arguments, it gives the
-.Tn YP
-server for the local machine.
-If
-.Ar host
-is specified, that machine is queried to find out
-which
-.Tn YP
-server it is using.
-.Pp
-The options are as follows:
-.Bl -tag -width indent
-.It Fl d Ar domain
-Specify a domain other than the default domain.
-.It Fl t
-Inhibit translation of map nicknames
-to their corresponding map names.
-.It Fl m Op Ar mname
-Find the master
-.Tn YP
-server for the named map.
-No
-.Ar host
-may be specified with the
-.Fl m
-option.
-The
-.Ar mname
-argument
-can be a map name or nickname.
-If
-.Ar mname
-is omitted,
-.Nm
-will produce a list of available maps.
-.It Fl x
-Display the map nickname table.
-.El
-.Sh SEE ALSO
-.Xr domainname 1 ,
-.Xr ypcat 1 ,
-.Xr ypmatch 1 ,
-.Xr yp 8 ,
-.Xr ypbind 8 ,
-.Xr yppoll 8 ,
-.Xr ypset 8
-.Sh AUTHORS
-.An Theo De Raadt
diff --git a/usr.bin/ypwhich/ypwhich.c b/usr.bin/ypwhich/ypwhich.c
deleted file mode 100644
index 8bfca24..0000000
--- a/usr.bin/ypwhich/ypwhich.c
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Copyright (c) 1992/3 Theo de Raadt <deraadt@fsa.ca>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <rpc/rpc.h>
-#include <rpc/xdr.h>
-#include <rpcsvc/yp_prot.h>
-#include <rpcsvc/ypclnt.h>
-
-#include <netinet/in.h>
-
-#include <arpa/inet.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#define ERR_USAGE 1 /* bad arguments - display 'usage' message */
-#define ERR_NOSUCHHOST 2 /* no such host */
-#define ERR_NOBINDING 3 /* error from ypbind -- domain not bound */
-#define ERR_NOYPBIND 4 /* ypbind not running */
-#define ERR_NOMASTER 5 /* could not find master server */
-
-extern bool_t xdr_domainname();
-
-struct ypalias {
- char *alias, *name;
-} ypaliases[] = {
- { "passwd", "passwd.byname" },
- { "master.passwd", "master.passwd.byname" },
- { "group", "group.byname" },
- { "networks", "networks.byaddr" },
- { "hosts", "hosts.byaddr" },
- { "protocols", "protocols.bynumber" },
- { "services", "services.byname" },
- { "aliases", "mail.aliases" },
- { "ethers", "ethers.byname" },
-};
-
-static void
-usage(void)
-{
- fprintf(stderr, "%s\n%s\n",
- "usage: ypwhich [-d domain] [[-t] -m [mname] | host]",
- " ypwhich -x");
- exit(ERR_USAGE);
-}
-
-
-/*
- * Like yp_bind except can query a specific host
- */
-static int
-bind_host(char *dom, struct sockaddr_in *lsin)
-{
- struct hostent *hent = NULL;
- struct ypbind_resp ypbr;
- struct timeval tv;
- CLIENT *client;
- int sock, r;
- struct in_addr ss_addr;
-
- sock = RPC_ANYSOCK;
- tv.tv_sec = 15;
- tv.tv_usec = 0;
- client = clntudp_create(lsin, YPBINDPROG, YPBINDVERS, tv, &sock);
- if (client == NULL) {
- warnx("can't clntudp_create: %s", yperr_string(YPERR_YPBIND));
- return (YPERR_YPBIND);
- }
-
- tv.tv_sec = 5;
- tv.tv_usec = 0;
- r = clnt_call(client, YPBINDPROC_DOMAIN,
- (xdrproc_t)xdr_domainname, &dom,
- (xdrproc_t)xdr_ypbind_resp, &ypbr, tv);
- if (r != RPC_SUCCESS) {
- warnx("can't clnt_call: %s", yperr_string(YPERR_YPBIND));
- clnt_destroy(client);
- return (YPERR_YPBIND);
- } else {
- if (ypbr.ypbind_status != YPBIND_SUCC_VAL) {
- warnx("can't yp_bind: reason: %s",
- ypbinderr_string(ypbr.ypbind_respbody.ypbind_error));
- clnt_destroy(client);
- return (r);
- }
- }
- clnt_destroy(client);
-
- ss_addr = ypbr.ypbind_respbody.ypbind_bindinfo.ypbind_binding_addr;
- /*printf("%08x\n", ss_addr);*/
- hent = gethostbyaddr((char *)&ss_addr, sizeof(ss_addr), AF_INET);
- if (hent)
- printf("%s\n", hent->h_name);
- else
- printf("%s\n", inet_ntoa(ss_addr));
- return (0);
-}
-
-int
-main(int argc, char *argv[])
-{
- char *domnam = NULL, *master;
- char *map = NULL;
- struct ypmaplist *ypml, *y;
- struct hostent *hent;
- struct sockaddr_in lsin;
- int notrans, mode, getmap;
- int c, r;
- u_int i;
-
- getmap = notrans = mode = 0;
- while ((c = getopt(argc, argv, "xd:mt")) != -1)
- switch (c) {
- case 'x':
- for (i = 0; i<sizeof ypaliases/sizeof ypaliases[0]; i++)
- printf("\"%s\" is an alias for \"%s\"\n",
- ypaliases[i].alias,
- ypaliases[i].name);
- exit(0);
- case 'd':
- domnam = optarg;
- break;
- case 't':
- notrans++;
- break;
- case 'm':
- mode++;
- break;
- default:
- usage();
- }
-
- if (!domnam)
- yp_get_default_domain(&domnam);
-
- if (mode == 0) {
- switch (argc-optind) {
- case 0:
- bzero(&lsin, sizeof lsin);
- lsin.sin_family = AF_INET;
- lsin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
-
- if (bind_host(domnam, &lsin))
- exit(ERR_NOBINDING);
- break;
- case 1:
- bzero(&lsin, sizeof lsin);
- lsin.sin_family = AF_INET;
- if ((lsin.sin_addr.s_addr = inet_addr(argv[optind])) == INADDR_NONE) {
- hent = gethostbyname(argv[optind]);
- if (!hent)
- errx(ERR_NOSUCHHOST, "host %s unknown", argv[optind]);
- bcopy((char *)hent->h_addr_list[0],
- (char *)&lsin.sin_addr, sizeof lsin.sin_addr);
- }
- if (bind_host(domnam, &lsin))
- exit(ERR_NOBINDING);
- break;
- default:
- usage();
- }
- exit(0);
- }
-
- if (argc-optind > 1)
- usage();
-
- if (argv[optind]) {
- map = argv[optind];
- for (i = 0; (!notrans) && i<sizeof ypaliases/sizeof ypaliases[0]; i++)
- if (strcmp(map, ypaliases[i].alias) == 0)
- map = ypaliases[i].name;
- r = yp_master(domnam, map, &master);
- switch (r) {
- case 0:
- printf("%s\n", master);
- free(master);
- break;
- case YPERR_YPBIND:
- errx(ERR_NOYPBIND, "not running ypbind");
- default:
- errx(ERR_NOMASTER, "can't find master for map %s: reason: %s",
- map, yperr_string(r));
- }
- exit(0);
- }
-
- ypml = NULL;
- r = yp_maplist(domnam, &ypml);
- switch (r) {
- case 0:
- for (y = ypml; y;) {
- ypml = y;
- r = yp_master(domnam, ypml->ypml_name, &master);
- switch (r) {
- case 0:
- printf("%s %s\n", ypml->ypml_name, master);
- free(master);
- break;
- default:
- warnx("can't find the master of %s: reason: %s",
- ypml->ypml_name, yperr_string(r));
- break;
- }
- y = ypml->ypml_next;
- free(ypml);
- }
- break;
- case YPERR_YPBIND:
- errx(ERR_NOYPBIND, "not running ypbind");
- default:
- errx(ERR_NOMASTER, "can't get map list for domain %s: reason: %s",
- domnam, yperr_string(r));
- }
- exit(0);
-}
OpenPOWER on IntegriCloud